Merge branch 'master' into master-android

This commit is contained in:
Evgeny Poberezkin
2024-05-29 08:34:51 +01:00
162 changed files with 9341 additions and 1934 deletions
@@ -34,8 +34,7 @@ struct GroupPreferencesView: View {
featureSection(.reactions, $preferences.reactions.enable)
featureSection(.voice, $preferences.voice.enable, $preferences.voice.role)
featureSection(.files, $preferences.files.enable, $preferences.files.role)
// TODO enable simplexLinks preference in 5.8
// featureSection(.simplexLinks, $preferences.simplexLinks.enable, $preferences.simplexLinks.role)
featureSection(.simplexLinks, $preferences.simplexLinks.enable, $preferences.simplexLinks.role)
featureSection(.history, $preferences.history.enable)
if groupInfo.canEdit {
@@ -102,8 +101,6 @@ struct GroupPreferencesView: View {
}
}
.frame(height: 36)
// remove in v5.8
.disabled(true)
}
} else {
settingsRow(icon, color: color) {
@@ -82,29 +82,29 @@ struct NetworkAndServers: View {
Text("Using .onion hosts requires compatible VPN provider.")
}
// Section {
// Picker("Private routing", selection: $proxyMode) {
// ForEach(SMPProxyMode.values, id: \.self) { Text($0.text) }
// }
// .frame(height: 36)
//
// Picker("Allow downgrade", selection: $proxyFallback) {
// ForEach(SMPProxyFallback.values, id: \.self) { Text($0.text) }
// }
// .disabled(proxyMode == .never)
// .frame(height: 36)
//
// Toggle("Show message status", isOn: $showSentViaProxy)
// } header: {
// Text("Private message routing")
// } footer: {
// VStack(alignment: .leading) {
// Text("To protect your IP address, private routing uses your SMP servers to deliver messages.")
// if showSentViaProxy {
// Text("Show on messages sent via private routing.")
// }
// }
// }
Section {
Picker("Private routing", selection: $proxyMode) {
ForEach(SMPProxyMode.values, id: \.self) { Text($0.text) }
}
.frame(height: 36)
Picker("Allow downgrade", selection: $proxyFallback) {
ForEach(SMPProxyFallback.values, id: \.self) { Text($0.text) }
}
.disabled(proxyMode == .never)
.frame(height: 36)
Toggle("Show message status", isOn: $showSentViaProxy)
} header: {
Text("Private message routing")
} footer: {
VStack(alignment: .leading) {
Text("To protect your IP address, private routing uses your SMP servers to deliver messages.")
if showSentViaProxy {
Text("Show → on messages sent via private routing.")
}
}
}
Section("Calls") {
NavigationLink {
@@ -713,6 +713,10 @@
<target>Позволи изчезващи съобщения само ако вашият контакт ги разрешава.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Позволи необратимо изтриване на съобщение само ако вашият контакт го рарешава. (24 часа)</target>
@@ -808,6 +812,10 @@
<target>Вече се присъединихте към групата!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Винаги използвай реле</target>
@@ -1088,6 +1096,10 @@
<target>Файлът не може да бъде получен</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Мобилна мрежа</target>
@@ -1948,6 +1960,10 @@ This cannot be undone!</source>
<target>Настолни устройства</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Разработване</target>
@@ -2053,11 +2069,19 @@ This cannot be undone!</source>
<target>Откриване през локалната мрежа</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>НЕ използвайте SimpleX за спешни повиквания.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Отложи</target>
@@ -2621,7 +2645,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Грешка: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ This cannot be undone!</source>
<target>Файл: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Файлове и медия</target>
@@ -2818,6 +2846,16 @@ This cannot be undone!</source>
<target>Препратено от</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Намерено настолно устройство</target>
@@ -3633,6 +3671,10 @@ This is your link for group %@!</source>
<target>Потвърждениe за доставка на съобщения!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Чернова на съобщение</target>
@@ -3653,6 +3695,14 @@ This is your link for group %@!</source>
<target>Реакциите на съобщения са забранени в тази група.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Източникът на съобщението остава скрит.</target>
@@ -3783,11 +3833,6 @@ This is your link for group %@!</source>
<target>Най-вероятно тази връзка е изтрита.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Най-вероятно този контакт е изтрил връзката с вас.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Множество профили за чат</target>
@@ -3818,6 +3863,10 @@ This is your link for group %@!</source>
<target>Мрежова връзка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Управление на мрежата</target>
@@ -4359,11 +4408,19 @@ Error: %@</source>
<target>Поверителни имена на файлове</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Лични бележки</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Профилни и сървърни връзки</target>
@@ -4444,6 +4501,10 @@ Error: %@</source>
<target>Забрани изпращането на гласови съобщения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Защити екрана на приложението</target>
@@ -4554,11 +4615,6 @@ Error: %@</source>
<target>Получаващият адрес ще бъде променен към друг сървър. Промяната на адреса ще завърши, след като подателят е онлайн.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Паралелност на получаване</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Получаващият се файл ще бъде спрян.</target>
@@ -5019,6 +5075,14 @@ Error: %@</source>
<target>Изпрати съобщение на живо</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Изпращай известия</target>
@@ -5124,6 +5188,10 @@ Error: %@</source>
<target>Изпратените съобщения ще бъдат изтрити след зададеното време.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Сървърът изисква оторизация за създаване на опашки, проверете паролата</target>
@@ -5139,6 +5207,10 @@ Error: %@</source>
<target>Тестът на сървъра е неуспешен!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Сървъри</target>
@@ -5259,11 +5331,19 @@ Error: %@</source>
<target>Показване на последните съобщения в листа с чатовете</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Показване на визуализация</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Покажи:</target>
@@ -5586,6 +5666,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Приложението може да ви уведоми, когато получите съобщения или заявки за контакт - моля, отворете настройките, за да активирате.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Опитът за промяна на паролата на базата данни не беше завършен.</target>
@@ -5771,6 +5855,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>За да не се разкрива часовата зона, файловете с изображения/глас използват UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Отблокирай член?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Неочаквана грешка: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Неочаквано състояние на миграция</target>
@@ -5913,6 +5996,10 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Непозната грешка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Освен ако не използвате интерфейса за повикване на iOS, активирайте режима "Не безпокой", за да избегнете прекъсвания.</target>
@@ -6060,6 +6147,14 @@ To connect, please ask your contact to create another connection link and check
<target>Използвай само локални известия?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Използвай сървър</target>
@@ -6295,11 +6390,23 @@ To connect, please ask your contact to create another connection link and check
<target>С намален разход на батерията.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Грешна парола за базата данни</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Грешна парола!</target>
@@ -7455,11 +7562,19 @@ SimpleX сървърите не могат да видят вашия профи
<target>неизвестен</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>неизвестен статус</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>актуализиран профил на групата</target>
@@ -7525,6 +7640,10 @@ SimpleX сървърите не могат да видят вашия профи
<target>седмици</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>да</target>
@@ -690,6 +690,10 @@
<target>Povolte mizící zprávy, pouze pokud vám to váš kontakt dovolí.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Povolte nevratné smazání zprávy pouze v případě, že vám to váš kontakt dovolí. (24 hodin)</target>
@@ -782,6 +786,10 @@
<source>Already joining the group!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Spojení přes relé</target>
@@ -1047,6 +1055,10 @@
<target>Nelze přijmout soubor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
@@ -1870,6 +1882,10 @@ This cannot be undone!</source>
<source>Desktop devices</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Vyvinout</target>
@@ -1973,11 +1989,19 @@ This cannot be undone!</source>
<source>Discover via local network</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NEpoužívejte SimpleX pro tísňová volání.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Udělat později</target>
@@ -2519,7 +2543,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Chyba: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2608,6 +2632,10 @@ This cannot be undone!</source>
<target>Soubor: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Soubory a média</target>
@@ -2706,6 +2734,16 @@ This cannot be undone!</source>
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -3490,6 +3528,10 @@ This is your link for group %@!</source>
<target>Potvrzení o doručení zprávy!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Návrh zprávy</target>
@@ -3510,6 +3552,14 @@ This is your link for group %@!</source>
<target>Reakce na zprávy jsou v této skupině zakázány.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<note>No comment provided by engineer.</note>
@@ -3627,11 +3677,6 @@ This is your link for group %@!</source>
<target>Pravděpodobně je toto spojení smazáno.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Tento kontakt s největší pravděpodobností smazal spojení s vámi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Více chatovacích profilů</target>
@@ -3661,6 +3706,10 @@ This is your link for group %@!</source>
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<note>No comment provided by engineer.</note>
@@ -4181,10 +4230,18 @@ Error: %@</source>
<target>Soukromé názvy souborů</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil a připojení k serveru</target>
@@ -4261,6 +4318,10 @@ Error: %@</source>
<target>Zakázat odesílání hlasových zpráv.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Ochrana obrazovky aplikace</target>
@@ -4368,10 +4429,6 @@ Error: %@</source>
<target>Přijímací adresa bude změněna na jiný server. Změna adresy bude dokončena po připojení odesílatele.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Příjem souboru bude zastaven.</target>
@@ -4817,6 +4874,14 @@ Error: %@</source>
<target>Odeslat živou zprávu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Odeslat oznámení</target>
@@ -4921,6 +4986,10 @@ Error: %@</source>
<target>Odeslané zprávy se po uplynutí nastavené doby odstraní.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Server vyžaduje autorizaci pro vytváření front, zkontrolujte heslo</target>
@@ -4936,6 +5005,10 @@ Error: %@</source>
<target>Test serveru se nezdařil!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servery</target>
@@ -5051,11 +5124,19 @@ Error: %@</source>
<target>Zobrazit poslední zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Zobrazení náhledu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Zobrazit:</target>
@@ -5369,6 +5450,10 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<target>Aplikace vás může upozornit na přijaté zprávy nebo žádosti o kontakt - povolte to v nastavení.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Pokus o změnu přístupové fráze databáze nebyl dokončen.</target>
@@ -5545,6 +5630,10 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<target>K ochraně časového pásma používají obrazové/hlasové soubory UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5631,11 +5720,6 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
<source>Unblock member?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Neočekávaná chyba: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Neočekávaný stav přenášení</target>
@@ -5681,6 +5765,10 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
<target>Neznámá chyba</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Při nepoužívání rozhraní volání iOS, povolte režim Nerušit, abyste se vyhnuli vyrušování.</target>
@@ -5821,6 +5909,14 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<source>Use only local notifications?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Použít server</target>
@@ -6038,11 +6134,23 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<source>With reduced battery usage.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Špatná přístupová fráze k databázi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Špatná přístupová fráze!</target>
@@ -7158,10 +7266,18 @@ Servery SimpleX nevidí váš profil.</target>
<target>neznámý</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>aktualizoval profil skupiny</target>
@@ -7225,6 +7341,10 @@ Servery SimpleX nevidí váš profil.</target>
<target>týdnů</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>ano</target>
@@ -695,7 +695,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Server hochgeladen.</target>
<target>Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Relais hochgeladen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -713,6 +713,10 @@
<target>Erlauben Sie verschwindende Nachrichten nur dann, wenn es Ihr Kontakt ebenfalls erlaubt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Erlauben Sie das unwiederbringliche Löschen von Nachrichten nur dann, wenn es Ihnen Ihr Kontakt ebenfalls erlaubt. (24 Stunden)</target>
@@ -808,6 +812,10 @@
<target>Sie sind bereits Mitglied der Gruppe!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Über ein Relais verbinden</target>
@@ -1088,6 +1096,10 @@
<target>Datei kann nicht empfangen werden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Zellulär</target>
@@ -1948,6 +1960,10 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Desktop-Geräte</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Entwicklung</target>
@@ -2053,11 +2069,19 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Lokales Netzwerk durchsuchen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Nutzen Sie SimpleX nicht für Notrufe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Später wiederholen</target>
@@ -2621,7 +2645,7 @@ Das kann nicht rückgängig gemacht werden!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Fehler: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Datei: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Dateien &amp; Medien</target>
@@ -2818,6 +2846,16 @@ Das kann nicht rückgängig gemacht werden!</target>
<target>Weitergeleitet aus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Gefundener Desktop</target>
@@ -3633,6 +3671,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Empfangsbestätigungen für Nachrichten!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Nachrichtenentwurf</target>
@@ -3653,6 +3695,14 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>In dieser Gruppe sind Reaktionen auf Nachrichten nicht erlaubt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Die Nachrichtenquelle bleibt privat.</target>
@@ -3783,11 +3833,6 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Wahrscheinlich ist diese Verbindung gelöscht worden.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Dieser Kontakt hat sehr wahrscheinlich die Verbindung mit Ihnen gelöscht.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Mehrere Chat-Profile</target>
@@ -3818,6 +3863,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
<target>Netzwerkverbindung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Netzwerk-Verwaltung</target>
@@ -4004,12 +4053,12 @@ Das ist Ihr Link für die Gruppe %@!</target>
</trans-unit>
<trans-unit id="Onion hosts will be required for connection. Requires enabling VPN." xml:space="preserve">
<source>Onion hosts will be required for connection. Requires enabling VPN.</source>
<target>Für die Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs.</target>
<target>Für diese Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Onion hosts will be used when available. Requires enabling VPN." xml:space="preserve">
<source>Onion hosts will be used when available. Requires enabling VPN.</source>
<target>Onion-Hosts werden verwendet, sobald sie verfügbar sind. Dies erfordert die Aktivierung eines VPNs.</target>
<target>Wenn Onion-Hosts verfügbar sind, werden sie verwendet. Dies erfordert die Aktivierung eines VPNs.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Onion hosts will not be used." xml:space="preserve">
@@ -4359,11 +4408,19 @@ Fehler: %@</target>
<target>Neutrale Dateinamen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Private Notizen</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil und Serververbindungen</target>
@@ -4444,6 +4501,10 @@ Fehler: %@</target>
<target>Das Senden von Sprachnachrichten nicht erlauben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>App-Bildschirm schützen</target>
@@ -4554,11 +4615,6 @@ Fehler: %@</target>
<target>Die Empfängeradresse wird auf einen anderen Server geändert. Der Adresswechsel wird abgeschlossen, wenn der Absender wieder online ist.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Gleichzeitiger Empfang</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Der Empfang der Datei wird beendet.</target>
@@ -5019,6 +5075,14 @@ Fehler: %@</target>
<target>Live Nachricht senden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Benachrichtigungen senden</target>
@@ -5124,6 +5188,10 @@ Fehler: %@</target>
<target>Gesendete Nachrichten werden nach der eingestellten Zeit gelöscht.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Um Warteschlangen zu erzeugen benötigt der Server eine Authentifizierung. Bitte überprüfen Sie das Passwort</target>
@@ -5139,6 +5207,10 @@ Fehler: %@</target>
<target>Server Test ist fehlgeschlagen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Server</target>
@@ -5259,11 +5331,19 @@ Fehler: %@</target>
<target>Letzte Nachrichten anzeigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Vorschau anzeigen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Anzeigen:</target>
@@ -5586,6 +5666,10 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Wenn sie Nachrichten oder Kontaktanfragen empfangen, kann Sie die App benachrichtigen - Um dies zu aktivieren, öffnen Sie bitte die Einstellungen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Die Änderung des Datenbank-Passworts konnte nicht abgeschlossen werden.</target>
@@ -5771,6 +5855,10 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Bild- und Sprachdateinamen enthalten UTC, um Informationen zur Zeitzone zu schützen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
<target>Mitglied freigeben?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Unerwarteter Fehler: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Unerwarteter Migrationsstatus</target>
@@ -5913,6 +5996,10 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
<target>Unbekannter Fehler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Aktivieren Sie den Modus "Bitte nicht stören", um Unterbrechungen zu vermeiden, es sei denn, Sie verwenden die iOS Anrufschnittstelle.</target>
@@ -6060,6 +6147,14 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<target>Nur lokale Benachrichtigungen nutzen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Server nutzen</target>
@@ -6295,11 +6390,23 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<target>Mit reduziertem Akkuverbrauch.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Falsches Datenbank-Passwort</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Falsches Passwort!</target>
@@ -7455,11 +7562,19 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Unbekannt</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>unbekannter Gruppenmitglieds-Status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>Aktualisiertes Gruppenprofil</target>
@@ -7525,6 +7640,10 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Wochen</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>Ja</target>
@@ -713,6 +713,11 @@
<target>Allow disappearing messages only if your contact allows it to you.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<target>Allow downgrade</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</target>
@@ -808,6 +813,11 @@
<target>Already joining the group!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<target>Always use private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Always use relay</target>
@@ -1088,6 +1098,11 @@
<target>Cannot receive file</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<target>Capacity exceeded - recipient did not receive previously sent messages.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Cellular</target>
@@ -1948,6 +1963,11 @@ This cannot be undone!</target>
<target>Desktop devices</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<target>Destination server error: %@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Develop</target>
@@ -2053,11 +2073,21 @@ This cannot be undone!</target>
<target>Discover via local network</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<target>Do NOT send messages directly, even if your or destination server does not support private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Do NOT use SimpleX for emergency calls.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<target>Do NOT use private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Do it later</target>
@@ -2621,7 +2651,7 @@ This cannot be undone!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Error: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2743,11 @@ This cannot be undone!</target>
<target>File: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<target>Files</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Files &amp; media</target>
@@ -2818,6 +2853,20 @@ This cannot be undone!</target>
<target>Forwarded from</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<target>Forwarding server: %1$@
Destination server error: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<target>Forwarding server: %1$@
Error: %2$@</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Found desktop</target>
@@ -3633,6 +3682,11 @@ This is your link for group %@!</target>
<target>Message delivery receipts!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<target>Message delivery warning</target>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Message draft</target>
@@ -3653,6 +3707,16 @@ This is your link for group %@!</target>
<target>Message reactions are prohibited in this group.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<target>Message routing fallback</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<target>Message routing mode</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Message source remains private.</target>
@@ -3783,11 +3847,6 @@ This is your link for group %@!</target>
<target>Most likely this connection is deleted.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Most likely this contact has deleted the connection with you.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Multiple chat profiles</target>
@@ -3818,6 +3877,11 @@ This is your link for group %@!</target>
<target>Network connection</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<target>Network issues - message expired after many attempts to send it.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Network management</target>
@@ -4359,11 +4423,21 @@ Error: %@</target>
<target>Private filenames</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<target>Private message routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Private notes</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<target>Private routing</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profile and server connections</target>
@@ -4444,6 +4518,11 @@ Error: %@</target>
<target>Prohibit sending voice messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<target>Protect IP address</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Protect app screen</target>
@@ -4554,11 +4633,6 @@ Error: %@</target>
<target>Receiving address will be changed to a different server. Address change will complete after sender comes online.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Receiving concurrency</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Receiving file will be stopped.</target>
@@ -5019,6 +5093,16 @@ Error: %@</target>
<target>Send live message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<target>Send messages directly when IP address is protected and your or destination server does not support private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<target>Send messages directly when your or destination server does not support private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Send notifications</target>
@@ -5124,6 +5208,11 @@ Error: %@</target>
<target>Sent messages will be deleted after set time.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<target>Server address is incompatible with network settings.</target>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Server requires authorization to create queues, check password</target>
@@ -5139,6 +5228,11 @@ Error: %@</target>
<target>Server test failed!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<target>Server version is incompatible with network settings.</target>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servers</target>
@@ -5259,11 +5353,21 @@ Error: %@</target>
<target>Show last messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<target>Show message status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Show preview</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<target>Show → on messages sent via private routing.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Show:</target>
@@ -5586,6 +5690,11 @@ It can happen because of some bug or when the connection is compromised.</target
<target>The app can notify you when you receive messages or contact requests - please open settings to enable.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<target>The app will ask to confirm downloads from unknown file servers (except .onion).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>The attempt to change database passphrase was not completed.</target>
@@ -5771,6 +5880,11 @@ It can happen because of some bug or when the connection is compromised.</target
<target>To protect timezone, image/voice files use UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<target>To protect your IP address, private routing uses your SMP servers to deliver messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5977,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Unblock member?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Unexpected error: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Unexpected migration state</target>
@@ -5913,6 +6022,11 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Unknown error</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<target>Unknown servers!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</target>
@@ -6060,6 +6174,16 @@ To connect, please ask your contact to create another connection link and check
<target>Use only local notifications?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<target>Use private routing with unknown servers when IP address is not protected.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<target>Use private routing with unknown servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Use server</target>
@@ -6295,11 +6419,26 @@ To connect, please ask your contact to create another connection link and check
<target>With reduced battery usage.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<target>Without Tor or VPN, your IP address will be visible to file servers.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<target>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Wrong database passphrase</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<target>Wrong key or unknown connection - most likely this connection is deleted.</target>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Wrong passphrase!</target>
@@ -7455,11 +7594,21 @@ SimpleX servers cannot see your profile.</target>
<target>unknown</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<target>unknown relays</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>unknown status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<target>unprotected</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>updated group profile</target>
@@ -7525,6 +7674,11 @@ SimpleX servers cannot see your profile.</target>
<target>weeks</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<target>when IP hidden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>yes</target>
@@ -713,6 +713,10 @@
<target>Se permiten los mensajes temporales pero sólo si tu contacto también los permite para tí.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Se permite la eliminación irreversible de mensajes pero sólo si tu contacto también la permite para tí. (24 horas)</target>
@@ -808,6 +812,10 @@
<target>¡Ya en proceso de unirte al grupo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Usar siempre retransmisor</target>
@@ -1040,7 +1048,7 @@
</trans-unit>
<trans-unit id="By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." xml:space="preserve">
<source>By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</source>
<target>Mediante perfil (por defecto) o [por conexión](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</target>
<target>Mediante perfil (predeterminado) o [por conexión](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Call already ended!" xml:space="preserve">
@@ -1088,6 +1096,10 @@
<target>No se puede recibir el archivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Móvil</target>
@@ -1948,6 +1960,10 @@ This cannot be undone!</source>
<target>Ordenadores</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Desarrollo</target>
@@ -2053,11 +2069,19 @@ This cannot be undone!</source>
<target>Descubrir en red local</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NO uses SimpleX para llamadas de emergencia.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Hacer más tarde</target>
@@ -2205,7 +2229,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<target>Activar para</target>
<target>Activado para</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
@@ -2621,7 +2645,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Error: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ This cannot be undone!</source>
<target>Archivo: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Archivos y multimedia</target>
@@ -2818,6 +2846,16 @@ This cannot be undone!</source>
<target>Reenviado por</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Ordenador encontrado</target>
@@ -3633,6 +3671,10 @@ This is your link for group %@!</source>
<target>¡Confirmación de entrega de mensajes!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Borrador de mensaje</target>
@@ -3653,6 +3695,14 @@ This is your link for group %@!</source>
<target>Las reacciones a los mensajes no están permitidas en este grupo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>El autor del mensaje se mantiene privado.</target>
@@ -3783,11 +3833,6 @@ This is your link for group %@!</source>
<target>Probablemente la conexión ha sido eliminada.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Lo más probable es que este contacto haya eliminado la conexión contigo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Múltiples perfiles</target>
@@ -3818,6 +3863,10 @@ This is your link for group %@!</source>
<target>Conexión de red</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Gestión de la red</target>
@@ -4359,11 +4408,19 @@ Error: %@</target>
<target>Nombres de archivos privados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Notas privadas</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Datos del perfil y conexiones</target>
@@ -4376,7 +4433,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Profile images" xml:space="preserve">
<source>Profile images</source>
<target>Imágenes del perfil</target>
<target>Forma de los perfiles</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
@@ -4444,6 +4501,10 @@ Error: %@</target>
<target>No se permiten mensajes de voz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Proteger la pantalla de la aplicación</target>
@@ -4554,11 +4615,6 @@ Error: %@</target>
<target>La dirección de recepción pasará a otro servidor. El cambio se completará cuando el remitente esté en línea.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Concurrencia en la recepción</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Se detendrá la recepción del archivo.</target>
@@ -4716,7 +4772,7 @@ Error: %@</target>
</trans-unit>
<trans-unit id="Reset to defaults" xml:space="preserve">
<source>Reset to defaults</source>
<target>Restablecer valores por defecto</target>
<target>Restablecer valores predetarminados</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Restart the app to create a new chat profile" xml:space="preserve">
@@ -5019,6 +5075,14 @@ Error: %@</target>
<target>Mensaje en vivo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Enviar notificaciones</target>
@@ -5124,6 +5188,10 @@ Error: %@</target>
<target>Los mensajes enviados se eliminarán una vez transcurrido el tiempo establecido.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>El servidor requiere autorización para crear colas, comprueba la contraseña</target>
@@ -5139,6 +5207,10 @@ Error: %@</target>
<target>¡Error en prueba del servidor!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servidores</target>
@@ -5259,11 +5331,19 @@ Error: %@</target>
<target>Mostrar último mensaje</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Mostrar vista previa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Mostrar:</target>
@@ -5586,6 +5666,10 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
<target>La aplicación puede notificarte cuando recibas mensajes o solicitudes de contacto: por favor, abre la configuración para activarlo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>El intento de cambiar la contraseña de la base de datos no se ha completado.</target>
@@ -5771,6 +5855,10 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
<target>Para proteger la zona horaria, los archivos de imagen/voz usan la hora UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
<target>¿Desbloquear miembro?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Error inesperado: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Estado de migración inesperado</target>
@@ -5913,6 +5996,10 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
<target>Error desconocido</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>A menos que utilices la interfaz de llamadas de iOS, activa el modo No molestar para evitar interrupciones.</target>
@@ -6061,6 +6148,14 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
<target>¿Usar sólo notificaciones locales?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Usar servidor</target>
@@ -6296,11 +6391,23 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
<target>Con uso reducido de batería.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Contraseña de base de datos incorrecta</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>¡Contraseña incorrecta!</target>
@@ -6986,17 +7093,17 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
</trans-unit>
<trans-unit id="default (%@)" xml:space="preserve">
<source>default (%@)</source>
<target>por defecto (%@)</target>
<target>predeterminado (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<target>por defecto (no)</target>
<target>predeterminado (no)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<target>por defecto (sí)</target>
<target>predeterminado (sí)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
@@ -7456,11 +7563,19 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>desconocido</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>estado desconocido</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>ha actualizado el perfil del grupo</target>
@@ -7526,6 +7641,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
<target>semanas</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>sí</target>
@@ -685,6 +685,10 @@
<target>Salli katoavat viestit vain, jos kontaktisi sallii sen sinulle.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Salli peruuttamaton viestien poisto vain, jos kontaktisi sallii ne sinulle. (24 tuntia)</target>
@@ -777,6 +781,10 @@
<source>Already joining the group!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Käytä aina relettä</target>
@@ -1040,6 +1048,10 @@
<target>Tiedostoa ei voi vastaanottaa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
@@ -1863,6 +1875,10 @@ This cannot be undone!</source>
<source>Desktop devices</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Kehitä</target>
@@ -1966,11 +1982,19 @@ This cannot be undone!</source>
<source>Discover via local network</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Älä käytä SimpleX-sovellusta hätäpuheluihin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Tee myöhemmin</target>
@@ -2509,7 +2533,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Virhe: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2598,6 +2622,10 @@ This cannot be undone!</source>
<target>Tiedosto: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Tiedostot &amp; media</target>
@@ -2696,6 +2724,16 @@ This cannot be undone!</source>
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -3480,6 +3518,10 @@ This is your link for group %@!</source>
<target>Viestien toimituskuittaukset!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Viestiluonnos</target>
@@ -3500,6 +3542,14 @@ This is your link for group %@!</source>
<target>Viestireaktiot ovat kiellettyjä tässä ryhmässä.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<note>No comment provided by engineer.</note>
@@ -3617,11 +3667,6 @@ This is your link for group %@!</source>
<target>Todennäköisesti tämä yhteys on poistettu.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Todennäköisesti tämä kontakti on poistanut yhteyden sinuun.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Useita keskusteluprofiileja</target>
@@ -3651,6 +3696,10 @@ This is your link for group %@!</source>
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<note>No comment provided by engineer.</note>
@@ -4169,10 +4218,18 @@ Error: %@</source>
<target>Yksityiset tiedostonimet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profiili- ja palvelinyhteydet</target>
@@ -4249,6 +4306,10 @@ Error: %@</source>
<target>Estä ääniviestien lähettäminen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Suojaa sovellusnäyttö</target>
@@ -4356,10 +4417,6 @@ Error: %@</source>
<target>Vastaanotto-osoite vaihdetaan toiseen palvelimeen. Osoitteenmuutos tehdään sen jälkeen, kun lähettäjä tulee verkkoon.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Tiedoston vastaanotto pysäytetään.</target>
@@ -4804,6 +4861,14 @@ Error: %@</source>
<target>Lähetä live-viesti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Lähetys ilmoitukset</target>
@@ -4908,6 +4973,10 @@ Error: %@</source>
<target>Lähetetyt viestit poistetaan asetetun ajan kuluttua.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Palvelin vaatii valtuutuksen jonojen luomiseen, tarkista salasana</target>
@@ -4923,6 +4992,10 @@ Error: %@</source>
<target>Palvelintesti epäonnistui!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Palvelimet</target>
@@ -5038,11 +5111,19 @@ Error: %@</source>
<target>Näytä viimeiset viestit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Näytä esikatselu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Näytä:</target>
@@ -5355,6 +5436,10 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
<target>Sovellus voi ilmoittaa sinulle, kun saat viestejä tai yhteydenottopyyntöjä - avaa asetukset ottaaksesi ne käyttöön.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Tietokannan tunnuslauseen muuttamista ei suoritettu loppuun.</target>
@@ -5531,6 +5616,10 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
<target>Aikavyöhykkeen suojaamiseksi kuva-/äänitiedostot käyttävät UTC:tä.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5616,11 +5705,6 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote
<source>Unblock member?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Odottamaton virhe: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Odottamaton siirtotila</target>
@@ -5666,6 +5750,10 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote
<target>Tuntematon virhe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Ellet käytä iOS:n puhelinkäyttöliittymää, ota Älä häiritse -tila käyttöön keskeytysten välttämiseksi.</target>
@@ -5806,6 +5894,14 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
<source>Use only local notifications?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Käytä palvelinta</target>
@@ -6023,11 +6119,23 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
<source>With reduced battery usage.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Väärä tietokannan tunnuslause</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Väärä tunnuslause!</target>
@@ -7142,10 +7250,18 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>tuntematon</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>päivitetty ryhmäprofiili</target>
@@ -7209,6 +7325,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
<target>viikkoa</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>kyllä</target>
@@ -713,6 +713,10 @@
<target>Autorise les messages éphémères seulement si votre contact vous lautorise.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Autoriser la suppression irréversible des messages uniquement si votre contact vous l'autorise. (24 heures)</target>
@@ -808,6 +812,10 @@
<target>Groupe déjà rejoint !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Se connecter via relais</target>
@@ -1088,6 +1096,10 @@
<target>Impossible de recevoir le fichier</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Cellulaire</target>
@@ -1925,7 +1937,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Justificatifs de réception!</target>
<target>Justificatifs de réception!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
@@ -1948,6 +1960,10 @@ Cette opération ne peut être annulée !</target>
<target>Appareils de bureau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Développer</target>
@@ -2053,11 +2069,19 @@ Cette opération ne peut être annulée !</target>
<target>Rechercher sur le réseau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>N'utilisez PAS SimpleX pour les appels d'urgence.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Faites-le plus tard</target>
@@ -2621,7 +2645,7 @@ Cette opération ne peut être annulée !</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Erreur: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ Cette opération ne peut être annulée !</target>
<target>Fichier: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Fichiers &amp; médias</target>
@@ -2775,7 +2803,7 @@ Cette opération ne peut être annulée !</target>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Réparer la connexion?</target>
<target>Réparer la connexion?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
@@ -2818,6 +2846,16 @@ Cette opération ne peut être annulée !</target>
<target>Transféré depuis</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Bureau trouvé</target>
@@ -3633,6 +3671,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Accusés de réception des messages !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Brouillon de message</target>
@@ -3653,6 +3695,14 @@ Voici votre lien pour le groupe %@ !</target>
<target>Les réactions aux messages sont interdites dans ce groupe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>La source du message reste privée.</target>
@@ -3783,11 +3833,6 @@ Voici votre lien pour le groupe %@ !</target>
<target>Connexion probablement supprimée.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Il est fort probable que ce contact ait supprimé la connexion avec vous.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Différents profils de chat</target>
@@ -3818,6 +3863,10 @@ Voici votre lien pour le groupe %@ !</target>
<target>Connexion au réseau</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Gestion du réseau</target>
@@ -4359,11 +4408,19 @@ Erreur: %@</target>
<target>Noms de fichiers privés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Notes privées</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil et connexions au serveur</target>
@@ -4444,6 +4501,10 @@ Erreur: %@</target>
<target>Interdire l'envoi de messages vocaux.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Protéger l'écran de l'app</target>
@@ -4554,11 +4615,6 @@ Erreur: %@</target>
<target>L'adresse de réception sera changée pour un autre serveur. Le changement d'adresse sera terminé lorsque l'expéditeur sera en ligne.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Réception simultanée</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>La réception du fichier sera interrompue.</target>
@@ -4591,7 +4647,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<target>Reconnecter les serveurs?</target>
<target>Reconnecter les serveurs?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
@@ -4666,7 +4722,7 @@ Erreur: %@</target>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Renégocier le chiffrement?</target>
<target>Renégocier le chiffrement?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat connection request?" xml:space="preserve">
@@ -5019,6 +5075,14 @@ Erreur: %@</target>
<target>Envoyer un message dynamique</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Envoi de notifications</target>
@@ -5124,6 +5188,10 @@ Erreur: %@</target>
<target>Les messages envoyés seront supprimés après une durée déterminée.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Le serveur requiert une autorisation pour créer des files d'attente, vérifiez le mot de passe</target>
@@ -5139,6 +5207,10 @@ Erreur: %@</target>
<target>Échec du test du serveur !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Serveurs</target>
@@ -5259,11 +5331,19 @@ Erreur: %@</target>
<target>Voir les derniers messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Afficher l'aperçu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Afficher :</target>
@@ -5586,6 +5666,10 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>L'application peut vous avertir lorsque vous recevez des messages ou des demandes de contact - veuillez ouvrir les paramètres pour les activer.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>La tentative de modification de la phrase secrète de la base de données n'a pas abouti.</target>
@@ -5771,6 +5855,10 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>Pour préserver le fuseau horaire, les fichiers image/voix utilisent le système UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
<target>Débloquer ce membre ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Erreur inattendue: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>État de la migration inattendu</target>
@@ -5913,6 +5996,10 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
<target>Erreur inconnue</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>À moins que vous utilisiez l'interface d'appel d'iOS, activez le mode "Ne pas déranger" pour éviter les interruptions.</target>
@@ -6060,6 +6147,14 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<target>Utilisation de notifications locales uniquement?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Utiliser ce serveur</target>
@@ -6212,7 +6307,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages</target>
<target>Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6295,11 +6390,23 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<target>Consommation réduite de la batterie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Mauvaise phrase secrète pour la base de données</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Mauvaise phrase secrète !</target>
@@ -7455,11 +7562,19 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>inconnu</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>statut inconnu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>mise à jour du profil de groupe</target>
@@ -7525,6 +7640,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>semaines</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>oui</target>
@@ -570,7 +570,7 @@
</trans-unit>
<trans-unit id="Accept connection request?" xml:space="preserve">
<source>Accept connection request?</source>
<target>Kapcsolatfelvétel elfogadása?</target>
<target>Kapcsolódási kérelem elfogadása?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Accept contact request from %@?" xml:space="preserve">
@@ -705,22 +705,26 @@
</trans-unit>
<trans-unit id="Allow calls only if your contact allows them." xml:space="preserve">
<source>Allow calls only if your contact allows them.</source>
<target>Hívások engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.</target>
<target>A hívások kezdeményezése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow disappearing messages only if your contact allows it to you." xml:space="preserve">
<source>Allow disappearing messages only if your contact allows it to you.</source>
<target>Eltűnő üzenetek engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi az ön számára.</target>
<target>Az eltűnő üzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az ön számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Üzenet végleges törlésének engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi. (24 óra)</target>
<target>Az üzenetek végleges törlése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi. (24 óra)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow message reactions only if your contact allows them." xml:space="preserve">
<source>Allow message reactions only if your contact allows them.</source>
<target>Üzenetreakciók engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.</target>
<target>Az üzenetreakciók küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow message reactions." xml:space="preserve">
@@ -735,7 +739,7 @@
</trans-unit>
<trans-unit id="Allow sending disappearing messages." xml:space="preserve">
<source>Allow sending disappearing messages.</source>
<target>Eltűnő üzenetek küldésének engedélyezése.</target>
<target>Az eltűnő üzenetek küldése engedélyezve van.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to irreversibly delete sent messages. (24 hours)" xml:space="preserve">
@@ -760,7 +764,7 @@
</trans-unit>
<trans-unit id="Allow voice messages only if your contact allows them." xml:space="preserve">
<source>Allow voice messages only if your contact allows them.</source>
<target>Hangüzenetek küldésének engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.</target>
<target>A hangüzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow voice messages?" xml:space="preserve">
@@ -770,27 +774,27 @@
</trans-unit>
<trans-unit id="Allow your contacts adding message reactions." xml:space="preserve">
<source>Allow your contacts adding message reactions.</source>
<target>Ismerősök általi üzenetreakciók hozzáadásának engedélyezése.</target>
<target>Az üzenetreakciók küldése engedélyezve van az ismerősei számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to call you." xml:space="preserve">
<source>Allow your contacts to call you.</source>
<target>Hívások engedélyezése ismerősök számára.</target>
<target>A hívások kezdeményezése engedélyezve van az ismerősei számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to irreversibly delete sent messages. (24 hours)" xml:space="preserve">
<source>Allow your contacts to irreversibly delete sent messages. (24 hours)</source>
<target>Elküldött üzenetek végleges törlésének engedélyezése az ismerősök számára. (24 óra)</target>
<target>Az elküldött üzenetek végleges törlése engedélyezve van az ismerősei számára. (24 óra)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to send disappearing messages." xml:space="preserve">
<source>Allow your contacts to send disappearing messages.</source>
<target>Eltűnő üzenetek engedélyezése ismerősök számára.</target>
<target>Az eltűnő üzenetek küldésének engedélyezése az ismerősei számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve">
<source>Allow your contacts to send voice messages.</source>
<target>Hangüzenetek küldésének engedélyezése ismerősök számára.</target>
<target>A hangüzenetek küldése engedélyezve van az ismerősei számára.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Already connected?" xml:space="preserve">
@@ -808,6 +812,10 @@
<target>A csatlakozás folyamatban van a csoporthoz!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Mindig használjon átjátszó kiszolgálót</target>
@@ -905,12 +913,12 @@
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<target>A hang- és videóhívások le vannak tiltva.</target>
<target>A hívások kezdeményezése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
<source>Authentication cancelled</source>
<target>Hitelesítés megszakítva</target>
<target>Hitelesítés visszavonva</target>
<note>PIN entry</note>
</trans-unit>
<trans-unit id="Authentication failed" xml:space="preserve">
@@ -935,7 +943,7 @@
</trans-unit>
<trans-unit id="Auto-accept contact requests" xml:space="preserve">
<source>Auto-accept contact requests</source>
<target>Ismerős jelölések automatikus elfogadása</target>
<target>Kapcsolódási kérelmek automatikus elfogadása</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Auto-accept images" xml:space="preserve">
@@ -995,7 +1003,7 @@
</trans-unit>
<trans-unit id="Block member for all?" xml:space="preserve">
<source>Block member for all?</source>
<target>Tag letiltása mindenki számára?</target>
<target>Mindenki számára letiltja ezt a tagot?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Block member?" xml:space="preserve">
@@ -1020,7 +1028,7 @@
</trans-unit>
<trans-unit id="Both you and your contact can make calls." xml:space="preserve">
<source>Both you and your contact can make calls.</source>
<target>Mindkét fél tud hívásokat indítani.</target>
<target>Mindkét fél tud hívásokat kezdeményezni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Both you and your contact can send disappearing messages." xml:space="preserve">
@@ -1088,6 +1096,10 @@
<target>Nem lehet fogadni a fájlt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Mobilhálózat</target>
@@ -1465,7 +1477,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Contacts can mark messages for deletion; you will be able to view them." xml:space="preserve">
<source>Contacts can mark messages for deletion; you will be able to view them.</source>
<target>Az ismerősök törlésre jelölhetnek üzeneteket ; megtekintheti őket.</target>
<target>Az ismerősei törlésre jelölhetnek üzeneteket; ön majd meg tudja nézni azokat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Continue" xml:space="preserve">
@@ -1738,7 +1750,7 @@ Ez az egyszer használatos hivatkozása!</target>
</trans-unit>
<trans-unit id="Delete after" xml:space="preserve">
<source>Delete after</source>
<target>Törlés miután</target>
<target>Törlés ennyi idő után</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete all files" xml:space="preserve">
@@ -1865,7 +1877,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Delete messages after" xml:space="preserve">
<source>Delete messages after</source>
<target>Üzenetek törlése miután</target>
<target>Üzenetek törlése ennyi idő után</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete old database" xml:space="preserve">
@@ -1948,6 +1960,10 @@ Ez a művelet nem vonható vissza!</target>
<target>Számítógépek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Fejlesztés</target>
@@ -1985,7 +2001,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Direct messages between members are prohibited in this group." xml:space="preserve">
<source>Direct messages between members are prohibited in this group.</source>
<target>Ebben a csoportban tiltott a tagok közötti közvetlen üzenetek küldése.</target>
<target>A közvetlen üzenetek küldése a tagok között le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
@@ -2015,7 +2031,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Disappearing messages are prohibited in this chat." xml:space="preserve">
<source>Disappearing messages are prohibited in this chat.</source>
<target>Az eltűnő üzenetek le vannak tiltva ebben a csevegésben.</target>
<target>Az eltűnő üzenetek küldése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing messages are prohibited in this group." xml:space="preserve">
@@ -2053,11 +2069,19 @@ Ez a művelet nem vonható vissza!</target>
<target>Felfedezés helyi hálózaton keresztül</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NE használja a SimpleX-et segélyhívásokhoz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Későbbre halaszt</target>
@@ -2621,7 +2645,7 @@ Ez a művelet nem vonható vissza!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Hiba: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ Ez a művelet nem vonható vissza!</target>
<target>Fájl: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Fájlok és média</target>
@@ -2818,6 +2846,16 @@ Ez a művelet nem vonható vissza!</target>
<target>Továbbítva innen:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Megtalált számítógép</target>
@@ -3090,7 +3128,7 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="If you enter your self-destruct passcode while opening the app:" xml:space="preserve">
<source>If you enter your self-destruct passcode while opening the app:</source>
<target>Ha az alkalmazás megnyitásakor az önmegsemmisítő jelkódot megadásra kerül:</target>
<target>Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő jelkódot:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." xml:space="preserve">
@@ -3337,12 +3375,12 @@ Ez a művelet nem vonható vissza!</target>
</trans-unit>
<trans-unit id="Irreversible message deletion is prohibited in this chat." xml:space="preserve">
<source>Irreversible message deletion is prohibited in this chat.</source>
<target>Ebben a csevegésben az üzenetek végleges törlése le van tiltva.</target>
<target>Az üzenetek végleges törlése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Irreversible message deletion is prohibited in this group." xml:space="preserve">
<source>Irreversible message deletion is prohibited in this group.</source>
<target>Ebben a csoportban az üzenetek végleges törlése le van tiltva.</target>
<target>Az üzenetek végleges törlése le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="It allows having many anonymous connections without any shared data between them in a single chat profile." xml:space="preserve">
@@ -3470,7 +3508,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Leave" xml:space="preserve">
<source>Leave</source>
<target>Elhagy</target>
<target>Elhagyás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Leave group" xml:space="preserve">
@@ -3585,12 +3623,12 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Mark read" xml:space="preserve">
<source>Mark read</source>
<target>Megjelölés olvasottként</target>
<target>Olvasottként jelölés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Mark verified" xml:space="preserve">
<source>Mark verified</source>
<target>Ellenőrzöttként jelölve</target>
<target>Hitelesítés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Markdown in messages" xml:space="preserve">
@@ -3633,6 +3671,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Üzenetkézbesítési bizonylatok!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Üzenetvázlat</target>
@@ -3645,12 +3687,20 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Message reactions are prohibited in this chat." xml:space="preserve">
<source>Message reactions are prohibited in this chat.</source>
<target>Az üzenetreakciók ebben a csevegésben le vannak tiltva.</target>
<target>Az üzenetreakciók küldése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message reactions are prohibited in this group." xml:space="preserve">
<source>Message reactions are prohibited in this group.</source>
<target>Ebben a csoportban az üzenetreakciók le vannak tiltva.</target>
<target>Az üzenetreakciók küldése le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
@@ -3783,11 +3833,6 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Valószínűleg ez a kapcsolat törlésre került.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Valószínűleg ez az ismerős törölte önnel a kapcsolatot.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Több csevegőprofil</target>
@@ -3818,6 +3863,10 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
<target>Internetkapcsolat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Hálózatkezelés</target>
@@ -4079,7 +4128,7 @@ Ez az ön hivatkozása a(z) %@ csoporthoz!</target>
</trans-unit>
<trans-unit id="Only your contact can send disappearing messages." xml:space="preserve">
<source>Only your contact can send disappearing messages.</source>
<target>Csak az ismerős tud eltűnő üzeneteket küldeni.</target>
<target>Csak az ismerőse tud eltűnő üzeneteket küldeni.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only your contact can send voice messages." xml:space="preserve">
@@ -4359,11 +4408,19 @@ Hiba: %@</target>
<target>Privát fájl nevek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Privát jegyzetek</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil és kiszolgálókapcsolatok</target>
@@ -4401,7 +4458,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Prohibit audio/video calls." xml:space="preserve">
<source>Prohibit audio/video calls.</source>
<target>Hang- és videóhívások tiltása.</target>
<target>A hívások kezdeményezése le van tiltva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit irreversible message deletion." xml:space="preserve">
@@ -4411,7 +4468,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Prohibit message reactions." xml:space="preserve">
<source>Prohibit message reactions.</source>
<target>Üzenetreakciók tiltása.</target>
<target>Az üzenetreakciók küldése le van tiltva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit messages reactions." xml:space="preserve">
@@ -4426,12 +4483,12 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
<source>Prohibit sending direct messages to members.</source>
<target>Közvetlen üzenetek küldésének letiltása a tagok számára.</target>
<target>A közvetlen üzenetek küldése le van tiltva a tagok között.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending disappearing messages." xml:space="preserve">
<source>Prohibit sending disappearing messages.</source>
<target>Eltűnő üzenetek küldésének letiltása.</target>
<target>Az eltűnő üzenetek küldése le van tiltva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
@@ -4441,7 +4498,11 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Hangüzenetek küldésének letiltása.</target>
<target>A hangüzenetek küldése le van tiltva.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
@@ -4554,11 +4615,6 @@ Hiba: %@</target>
<target>A fogadó cím egy másik kiszolgálóra változik. A címváltoztatás a feladó online állapotba kerülése után fejeződik be.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Egyidejű fogadás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>A fájl fogadása leállt.</target>
@@ -4641,12 +4697,12 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Remove member" xml:space="preserve">
<source>Remove member</source>
<target>Tag eltávolítása</target>
<target>Eltávolítás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove member?" xml:space="preserve">
<source>Remove member?</source>
<target>Tag eltávolítása?</target>
<target>Biztosan eltávolítja?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Remove passphrase from keychain?" xml:space="preserve">
@@ -4911,7 +4967,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Scan code" xml:space="preserve">
<source>Scan code</source>
<target>Kód beolvasása</target>
<target>Beolvasás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Scan security code from your contact's app." xml:space="preserve">
@@ -5019,6 +5075,14 @@ Hiba: %@</target>
<target>Élő üzenet küldése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Értesítések küldése</target>
@@ -5051,7 +5115,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
<source>Sender cancelled file transfer.</source>
<target>A küldő megszakította a fájl átvitelt.</target>
<target>A fájl küldője visszavonta az átvitelt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
@@ -5124,6 +5188,10 @@ Hiba: %@</target>
<target>Az elküldött üzenetek törlésre kerülnek a beállított idő után.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>A kiszolgálónak engedélyre van szüksége a várólisták létrehozásához, ellenőrizze jelszavát</target>
@@ -5139,6 +5207,10 @@ Hiba: %@</target>
<target>Sikertelen kiszolgáló-teszt!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Kiszolgálók</target>
@@ -5259,11 +5331,19 @@ Hiba: %@</target>
<target>Utolsó üzenetek megjelenítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Előnézet megjelenítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Megjelenítés:</target>
@@ -5326,7 +5406,7 @@ Hiba: %@</target>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<target>A SimpleX hivatkozások küldése ebben a csoportban le van tiltva.</target>
<target>A SimpleX hivatkozások küldése le van tiltva ebben a csoportban.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
@@ -5586,6 +5666,10 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
<target>Az alkalmazás értesíteni fogja, amikor üzeneteket vagy kapcsolatfelvételi kéréseket kap beállítások megnyitása az engedélyezéshez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Az adatbázis jelmondatának megváltoztatására tett kísérlet nem fejeződött be.</target>
@@ -5598,7 +5682,7 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
</trans-unit>
<trans-unit id="The connection you accepted will be cancelled!" xml:space="preserve">
<source>The connection you accepted will be cancelled!</source>
<target>Az ön által elfogadott kapcsolat megszakad!</target>
<target>Az ön által elfogadott kapcsolat vissza lesz vonva!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The contact you shared this link with will NOT be able to connect!" xml:space="preserve">
@@ -5771,6 +5855,10 @@ Ez valamilyen hiba, vagy sérült kapcsolat esetén fordulhat elő.</target>
<target>Az időzóna védelme érdekében a kép-/hangfájlok UTC-t használnak.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ A funkció engedélyezése előtt a rendszer felszólítja a hitelesítés befej
<target>Tag feloldása?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Váratlan hiba: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Váratlan átköltöztetési állapot</target>
@@ -5913,6 +5996,10 @@ A funkció engedélyezése előtt a rendszer felszólítja a hitelesítés befej
<target>Ismeretlen hiba</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Hacsak nem az iOS hívási felületét használja, engedélyezze a Ne zavarjanak módot a megszakítások elkerülése érdekében.</target>
@@ -6060,6 +6147,14 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol
<target>Csak helyi értesítések használata?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Kiszolgáló használata</target>
@@ -6167,7 +6262,7 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol
</trans-unit>
<trans-unit id="Voice messages are prohibited in this chat." xml:space="preserve">
<source>Voice messages are prohibited in this chat.</source>
<target>A hangüzenetek le vannak tiltva ebben a csevegésben.</target>
<target>A hangüzenetek küldése le van tiltva ebben a csevegésben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages are prohibited in this group." xml:space="preserve">
@@ -6295,11 +6390,23 @@ A kapcsolódáshoz kérje meg ismerősét, hogy hozzon létre egy másik kapcsol
<target>Csökkentett akkumulátorhasználattal.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Téves adatbázis jelmondat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Téves jelmondat!</target>
@@ -6642,8 +6749,8 @@ Kapcsolódási kérés megismétlése?</target>
<trans-unit id="Your contact needs to be online for the connection to complete.&#10;You can cancel this connection and remove the contact (and try later with a new link)." xml:space="preserve">
<source>Your contact needs to be online for the connection to complete.
You can cancel this connection and remove the contact (and try later with a new link).</source>
<target>Az ismerősnek online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.
Megszakíthatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).</target>
<target>Az ismerősének online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.
Visszavonhatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
@@ -6850,7 +6957,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="cancelled %@" xml:space="preserve">
<source>cancelled %@</source>
<target>%@ törölve</target>
<target>%@ visszavonva</target>
<note>feature offered item</note>
</trans-unit>
<trans-unit id="changed address for you" xml:space="preserve">
@@ -6965,7 +7072,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="creator" xml:space="preserve">
<source>creator</source>
<target>szerző</target>
<target>készítő</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="custom" xml:space="preserve">
@@ -7185,12 +7292,12 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="invited" xml:space="preserve">
<source>invited</source>
<target>meghívta</target>
<target>meghíva</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="invited %@" xml:space="preserve">
<source>invited %@</source>
<target>meghívta %@-t</target>
<target>meghívta őt: %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="invited to connect" xml:space="preserve">
@@ -7200,7 +7307,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="invited via your group link" xml:space="preserve">
<source>invited via your group link</source>
<target>meghívta a csoport hivatkozásán keresztül</target>
<target>meghíva az ön csoport hivatkozásán keresztül</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="italic" xml:space="preserve">
@@ -7455,14 +7562,22 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>ismeretlen</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>ismeretlen státusz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>módosított csoport profil</target>
<target>frissítette a csoport profilját</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="updated profile" xml:space="preserve">
@@ -7507,7 +7622,7 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
</trans-unit>
<trans-unit id="waiting for answer…" xml:space="preserve">
<source>waiting for answer…</source>
<target>várakozás válaszra…</target>
<target>várakozás a válaszra…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="waiting for confirmation…" xml:space="preserve">
@@ -7525,6 +7640,10 @@ A SimpleX kiszolgálók nem látjhatják profilját.</target>
<target>hét</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>igen</target>
@@ -713,6 +713,10 @@
<target>Consenti i messaggi a tempo solo se il contatto li consente a te.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Consenti l'eliminazione irreversibile dei messaggi solo se il contatto la consente a te. (24 ore)</target>
@@ -808,6 +812,10 @@
<target>Già in ingresso nel gruppo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Connetti via relay</target>
@@ -1088,6 +1096,10 @@
<target>Impossibile ricevere il file</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Mobile</target>
@@ -1948,6 +1960,10 @@ Non è reversibile!</target>
<target>Dispositivi desktop</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Sviluppa</target>
@@ -2053,11 +2069,19 @@ Non è reversibile!</target>
<target>Individua via rete locale</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NON usare SimpleX per chiamate di emergenza.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Fallo dopo</target>
@@ -2621,7 +2645,7 @@ Non è reversibile!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Errore: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ Non è reversibile!</target>
<target>File: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>File e multimediali</target>
@@ -2818,6 +2846,16 @@ Non è reversibile!</target>
<target>Inoltrato da</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Desktop trovato</target>
@@ -3633,6 +3671,10 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Ricevute di consegna dei messaggi!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Bozza dei messaggi</target>
@@ -3653,6 +3695,14 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Le reazioni ai messaggi sono vietate in questo gruppo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>La fonte del messaggio resta privata.</target>
@@ -3783,11 +3833,6 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Probabilmente questa connessione è stata eliminata.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Probabilmente questo contatto ha eliminato la connessione con te.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Profili di chat multipli</target>
@@ -3818,6 +3863,10 @@ Questo è il tuo link per il gruppo %@!</target>
<target>Connessione di rete</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Gestione della rete</target>
@@ -4359,11 +4408,19 @@ Errore: %@</target>
<target>Nomi di file privati</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Note private</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profilo e connessioni al server</target>
@@ -4444,6 +4501,10 @@ Errore: %@</target>
<target>Proibisci l'invio di messaggi vocali.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Proteggi la schermata dell'app</target>
@@ -4554,11 +4615,6 @@ Errore: %@</target>
<target>L'indirizzo di ricezione verrà cambiato in un server diverso. La modifica dell'indirizzo verrà completata dopo che il mittente sarà in linea.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Ricezione concomitanza</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>La ricezione del file verrà interrotta.</target>
@@ -5019,6 +5075,14 @@ Errore: %@</target>
<target>Invia messaggio in diretta</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Invia notifiche</target>
@@ -5124,6 +5188,10 @@ Errore: %@</target>
<target>I messaggi inviati verranno eliminati dopo il tempo impostato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Il server richiede l'autorizzazione di creare code, controlla la password</target>
@@ -5139,6 +5207,10 @@ Errore: %@</target>
<target>Test del server fallito!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Server</target>
@@ -5259,11 +5331,19 @@ Errore: %@</target>
<target>Mostra ultimi messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Mostra anteprima</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Mostra:</target>
@@ -5586,6 +5666,10 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>L'app può avvisarti quando ricevi messaggi o richieste di contatto: apri le impostazioni per attivare.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Il tentativo di cambiare la password del database non è stato completato.</target>
@@ -5771,6 +5855,10 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>Per proteggere il fuso orario, i file immagine/vocali usano UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
<target>Sbloccare il membro?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Errore imprevisto: % @</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Stato di migrazione imprevisto</target>
@@ -5913,6 +5996,10 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
<target>Errore sconosciuto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>A meno che non utilizzi l'interfaccia di chiamata iOS, attiva la modalità Non disturbare per evitare interruzioni.</target>
@@ -6060,6 +6147,14 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<target>Usare solo notifiche locali?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Usa il server</target>
@@ -6295,11 +6390,23 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<target>Con consumo di batteria ridotto.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Password del database sbagliata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Password sbagliata!</target>
@@ -7455,11 +7562,19 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>sconosciuto</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>stato sconosciuto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>ha aggiornato il profilo del gruppo</target>
@@ -7525,6 +7640,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>settimane</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>sì</target>
@@ -703,6 +703,10 @@
<target>連絡先が許可している場合のみ消えるメッセージを許可する。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>送信相手も永久メッセージ削除を許可する時のみに許可する。</target>
@@ -798,6 +802,10 @@
<target>すでにグループに参加しています!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>常にリレーを経由する</target>
@@ -1064,6 +1072,10 @@
<target>ファイル受信ができません</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
@@ -1887,6 +1899,10 @@ This cannot be undone!</source>
<source>Desktop devices</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>開発</target>
@@ -1990,11 +2006,19 @@ This cannot be undone!</source>
<source>Discover via local network</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>緊急通報にSimpleXを使用しないでください。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>後で行う</target>
@@ -2534,7 +2558,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>エラー : %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2623,6 +2647,10 @@ This cannot be undone!</source>
<target>ファイル: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>ファイルとメディア</target>
@@ -2721,6 +2749,16 @@ This cannot be undone!</source>
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -3504,6 +3542,10 @@ This is your link for group %@!</source>
<source>Message delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>メッセージの下書き</target>
@@ -3524,6 +3566,14 @@ This is your link for group %@!</source>
<target>このグループではメッセージへのリアクションは禁止されています。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<note>No comment provided by engineer.</note>
@@ -3641,11 +3691,6 @@ This is your link for group %@!</source>
<target>おそらく、この接続は削除されています。</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>恐らくこの連絡先があなたとの接続を削除しました。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>複数チャットのプロフィール</target>
@@ -3675,6 +3720,10 @@ This is your link for group %@!</source>
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<note>No comment provided by engineer.</note>
@@ -4195,10 +4244,18 @@ Error: %@</source>
<target>プライベートなファイル名</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>プロフィールとサーバ接続</target>
@@ -4275,6 +4332,10 @@ Error: %@</source>
<target>音声メッセージを使用禁止にする。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>アプリ画面を守る</target>
@@ -4381,10 +4442,6 @@ Error: %@</source>
<target>開発中の機能です!相手のクライアントが4.2でなければ機能しません。アドレス変更が完了すると、会話にメッセージが出ます。連絡相手 (またはグループのメンバー) からメッセージを受信できないかをご確認ください。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>ファイルの受信を停止します。</target>
@@ -4829,6 +4886,14 @@ Error: %@</source>
<target>ライブメッセージを送信</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>通知を送信する</target>
@@ -4926,6 +4991,10 @@ Error: %@</source>
<target>一定時間が経ったら送信されたメッセージが削除されます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>キューを作成するにはサーバーの認証が必要です。パスワードを確認してください</target>
@@ -4941,6 +5010,10 @@ Error: %@</source>
<target>サーバテスト失敗!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>サーバ</target>
@@ -5056,11 +5129,19 @@ Error: %@</source>
<target>最新のメッセージを表示</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>プレビューを表示</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>表示する:</target>
@@ -5374,6 +5455,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>アプリは、メッセージや連絡先のリクエストを受信したときに通知することができます - 設定を開いて有効にしてください。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>データベースのパスフレーズ変更が完了してません。</target>
@@ -5549,6 +5634,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>時間帯を漏らさないために、画像と音声ファイルはUTCを使います。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5634,11 +5723,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<source>Unblock member?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>予期しないエラー: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>予期しない移行状態</target>
@@ -5684,6 +5768,10 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>不明なエラー</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>iOS 通話インターフェイスを使用しない場合は、中断を避けるために「おやすみモード」を有効にしてください。</target>
@@ -5824,6 +5912,14 @@ To connect, please ask your contact to create another connection link and check
<source>Use only local notifications?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>サーバを使う</target>
@@ -6041,11 +6137,23 @@ To connect, please ask your contact to create another connection link and check
<source>With reduced battery usage.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>データベースのパスフレーズが違います</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>パスフレーズが違います!</target>
@@ -7160,10 +7268,18 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>不明</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>グループプロフィールを更新しました</target>
@@ -7227,6 +7343,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>週</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>はい</target>
@@ -713,6 +713,10 @@
<target>Sta verdwijnende berichten alleen toe als uw contact dit toestaat.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Sta het onomkeerbaar verwijderen van berichten alleen toe als uw contact dit toestaat. (24 uur)</target>
@@ -808,6 +812,10 @@
<target>Al lid van de groep!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Altijd relay gebruiken</target>
@@ -1088,6 +1096,10 @@
<target>Kan bestand niet ontvangen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Mobiel</target>
@@ -1948,6 +1960,10 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Desktop apparaten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Ontwikkelen</target>
@@ -2053,11 +2069,19 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Ontdek via het lokale netwerk</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Gebruik SimpleX NIET voor noodoproepen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Doe het later</target>
@@ -2621,7 +2645,7 @@ Dit kan niet ongedaan gemaakt worden!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Fout: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Bestand: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Bestanden en media</target>
@@ -2818,6 +2846,16 @@ Dit kan niet ongedaan gemaakt worden!</target>
<target>Doorgestuurd vanuit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Desktop gevonden</target>
@@ -3633,6 +3671,10 @@ Dit is jouw link voor groep %@!</target>
<target>Ontvangst bevestiging voor berichten!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Concept bericht</target>
@@ -3653,6 +3695,14 @@ Dit is jouw link voor groep %@!</target>
<target>Reacties op berichten zijn verboden in deze groep.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Berichtbron blijft privé.</target>
@@ -3783,11 +3833,6 @@ Dit is jouw link voor groep %@!</target>
<target>Hoogstwaarschijnlijk is deze verbinding verwijderd.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Hoogstwaarschijnlijk heeft dit contact de verbinding met jou verwijderd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Meerdere chat profielen</target>
@@ -3818,6 +3863,10 @@ Dit is jouw link voor groep %@!</target>
<target>Netwerkverbinding</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Netwerkbeheer</target>
@@ -4359,11 +4408,19 @@ Fout: %@</target>
<target>Privé bestandsnamen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Privé notities</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profiel- en serververbindingen</target>
@@ -4444,6 +4501,10 @@ Fout: %@</target>
<target>Verbieden het verzenden van spraak berichten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>App scherm verbergen</target>
@@ -4554,11 +4615,6 @@ Fout: %@</target>
<target>Het ontvangstadres wordt gewijzigd naar een andere server. Adres wijziging wordt voltooid nadat de afzender online is.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Gelijktijdig ontvangen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Het ontvangen van het bestand wordt gestopt.</target>
@@ -5019,6 +5075,14 @@ Fout: %@</target>
<target>Stuur een livebericht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Meldingen verzenden</target>
@@ -5124,6 +5188,10 @@ Fout: %@</target>
<target>Verzonden berichten worden na ingestelde tijd verwijderd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Server vereist autorisatie om wachtrijen te maken, controleer wachtwoord</target>
@@ -5139,6 +5207,10 @@ Fout: %@</target>
<target>Servertest mislukt!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Servers</target>
@@ -5259,11 +5331,19 @@ Fout: %@</target>
<target>Laat laatste berichten zien</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Toon voorbeeld</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Toon:</target>
@@ -5586,6 +5666,10 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>De app kan u op de hoogte stellen wanneer u berichten of contact verzoeken ontvangt - open de instellingen om dit in te schakelen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>De poging om het wachtwoord van de database te wijzigen is niet voltooid.</target>
@@ -5771,6 +5855,10 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>Om de tijdzone te beschermen, gebruiken afbeeldings-/spraakbestanden UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
<target>Lid deblokkeren?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Onverwachte fout: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Onverwachte migratiestatus</target>
@@ -5913,6 +5996,10 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
<target>Onbekende fout</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Schakel de modus Niet storen in om onderbrekingen te voorkomen, tenzij u de iOS-oproepinterface gebruikt.</target>
@@ -6060,6 +6147,14 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<target>Alleen lokale meldingen gebruiken?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Gebruik server</target>
@@ -6295,11 +6390,23 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
<target>Met verminderd batterijgebruik.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Verkeerd wachtwoord voor de database</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Verkeerd wachtwoord!</target>
@@ -7455,11 +7562,19 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>onbekend</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>onbekende status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>bijgewerkt groep profiel</target>
@@ -7525,6 +7640,10 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>weken</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>Ja</target>
@@ -713,6 +713,10 @@
<target>Zezwól na znikające wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Zezwalaj na nieodwracalne usuwanie wiadomości tylko wtedy, gdy Twój kontakt Ci na to pozwoli. (24 godziny)</target>
@@ -808,6 +812,10 @@
<target>Już dołączono do grupy!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Zawsze używaj przekaźnika</target>
@@ -1088,6 +1096,10 @@
<target>Nie można odebrać pliku</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Sieć komórkowa</target>
@@ -1948,6 +1960,10 @@ To nie może być cofnięte!</target>
<target>Urządzenia komputerowe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Deweloperskie</target>
@@ -2053,11 +2069,19 @@ To nie może być cofnięte!</target>
<target>Odkryj przez sieć lokalną</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>NIE używaj SimpleX do połączeń alarmowych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Zrób to później</target>
@@ -2621,7 +2645,7 @@ To nie może być cofnięte!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Błąd: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ To nie może być cofnięte!</target>
<target>Plik: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Pliki i media</target>
@@ -2818,6 +2846,16 @@ To nie może być cofnięte!</target>
<target>Przekazane dalej od</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Znaleziono komputer</target>
@@ -3633,6 +3671,10 @@ To jest twój link do grupy %@!</target>
<target>Potwierdzenia dostarczenia wiadomości!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Wersja robocza wiadomości</target>
@@ -3653,6 +3695,14 @@ To jest twój link do grupy %@!</target>
<target>Reakcje wiadomości są zabronione w tej grupie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Źródło wiadomości pozostaje prywatne.</target>
@@ -3783,11 +3833,6 @@ To jest twój link do grupy %@!</target>
<target>Najprawdopodobniej to połączenie jest usunięte.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Najprawdopodobniej ten kontakt usunął połączenie z Tobą.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Wiele profili czatu</target>
@@ -3818,6 +3863,10 @@ To jest twój link do grupy %@!</target>
<target>Połączenie z siecią</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Zarządzenie sieciowe</target>
@@ -4359,11 +4408,19 @@ Błąd: %@</target>
<target>Prywatne nazwy plików</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Prywatne notatki</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil i połączenia z serwerem</target>
@@ -4444,6 +4501,10 @@ Błąd: %@</target>
<target>Zabroń wysyłania wiadomości głosowych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Chroń ekran aplikacji</target>
@@ -4554,11 +4615,6 @@ Błąd: %@</target>
<target>Adres odbiorczy zostanie zmieniony na inny serwer. Zmiana adresu zostanie zakończona gdy nadawca będzie online.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Konkurencyjne odbieranie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Odbieranie pliku zostanie przerwane.</target>
@@ -5019,6 +5075,14 @@ Błąd: %@</target>
<target>Wyślij wiadomość na żywo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Wyślij powiadomienia</target>
@@ -5124,6 +5188,10 @@ Błąd: %@</target>
<target>Wysłane wiadomości zostaną usunięte po ustawionym czasie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Serwer wymaga autoryzacji do tworzenia kolejek, sprawdź hasło</target>
@@ -5139,6 +5207,10 @@ Błąd: %@</target>
<target>Test serwera nie powiódł się!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Serwery</target>
@@ -5259,11 +5331,19 @@ Błąd: %@</target>
<target>Pokaż ostatnie wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Pokaż podgląd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Pokaż:</target>
@@ -5586,6 +5666,10 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Aplikacja może powiadamiać Cię, gdy otrzymujesz wiadomości lub prośby o kontakt — otwórz ustawienia, aby włączyć.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Próba zmiany hasła bazy danych nie została zakończona.</target>
@@ -5771,6 +5855,10 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Aby chronić strefę czasową, pliki obrazów/głosów używają UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</ta
<target>Odblokować członka?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Nieoczekiwany błąd: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Nieoczekiwany stan migracji</target>
@@ -5913,6 +5996,10 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</ta
<target>Nieznany błąd</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>O ile nie korzystasz z interfejsu połączeń systemu iOS, włącz tryb Nie przeszkadzać, aby uniknąć przerywania.</target>
@@ -6060,6 +6147,14 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<target>Używać tylko lokalnych powiadomień?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Użyj serwera</target>
@@ -6295,11 +6390,23 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<target>Ze zmniejszonym zużyciem baterii.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Nieprawidłowe hasło bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Nieprawidłowe hasło!</target>
@@ -7455,11 +7562,19 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>nieznany</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>nieznany status</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>zaktualizowano profil grupy</target>
@@ -7525,6 +7640,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>tygodnie</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>tak</target>
@@ -713,6 +713,10 @@
<target>Разрешить исчезающие сообщения, только если Ваш контакт разрешает их Вам.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Разрешить необратимое удаление сообщений, только если Ваш контакт разрешает это Вам. (24 часа)</target>
@@ -808,6 +812,10 @@
<target>Вступление в группу уже начато!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Всегда соединяться через relay</target>
@@ -1088,6 +1096,10 @@
<target>Невозможно получить файл</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Мобильная сеть</target>
@@ -1948,6 +1960,10 @@ This cannot be undone!</source>
<target>Компьютеры</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Для разработчиков</target>
@@ -2053,11 +2069,19 @@ This cannot be undone!</source>
<target>Обнаружение по локальной сети</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Не используйте SimpleX для экстренных звонков.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Отложить</target>
@@ -2621,7 +2645,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Ошибка: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ This cannot be undone!</source>
<target>Файл: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Файлы и медиа</target>
@@ -2818,6 +2846,16 @@ This cannot be undone!</source>
<target>Переслано из</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Компьютер найден</target>
@@ -3633,6 +3671,10 @@ This is your link for group %@!</source>
<target>Отчеты о доставке сообщений!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Черновик сообщения</target>
@@ -3653,6 +3695,14 @@ This is your link for group %@!</source>
<target>Реакции на сообщения запрещены в этой группе.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Источник сообщения остаётся конфиденциальным.</target>
@@ -3783,11 +3833,6 @@ This is your link for group %@!</source>
<target>Скорее всего, соединение удалено.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Скорее всего, этот контакт удалил соединение с Вами.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Много профилей чата</target>
@@ -3818,6 +3863,10 @@ This is your link for group %@!</source>
<target>Интернет-соединение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Статус сети</target>
@@ -4359,11 +4408,19 @@ Error: %@</source>
<target>Защищенные имена файлов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Личные заметки</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Профиль и соединения на сервере</target>
@@ -4444,6 +4501,10 @@ Error: %@</source>
<target>Запретить отправлять голосовые сообщений.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Защитить экран приложения</target>
@@ -4554,11 +4615,6 @@ Error: %@</source>
<target>Адрес получения сообщений будет перемещён на другой сервер. Изменение адреса завершится после того как отправитель будет онлайн.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Одновременный приём</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Приём файла будет прекращён.</target>
@@ -5019,6 +5075,14 @@ Error: %@</source>
<target>Отправить живое сообщение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Отправлять уведомления</target>
@@ -5124,6 +5188,10 @@ Error: %@</source>
<target>Отправленные сообщения будут удалены через заданное время.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Сервер требует авторизации для создания очередей, проверьте пароль</target>
@@ -5139,6 +5207,10 @@ Error: %@</source>
<target>Ошибка теста сервера!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Серверы</target>
@@ -5259,11 +5331,19 @@ Error: %@</source>
<target>Показывать последние сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Показывать уведомления</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Показать:</target>
@@ -5586,6 +5666,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Приложение может посылать Вам уведомления о сообщениях и запросах на соединение - уведомления можно включить в Настройках.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Попытка поменять пароль базы данных не была завершена.</target>
@@ -5771,6 +5855,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Чтобы защитить Ваш часовой пояс, файлы картинок и голосовых сообщений используют UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Разблокировать члена группы?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Неожиданная ошибка: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Неожиданная ошибка при перемещении данных чата</target>
@@ -5913,6 +5996,10 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Неизвестная ошибка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Если Вы не используете интерфейс iOS, включите режим Не отвлекать, чтобы звонок не прерывался.</target>
@@ -6060,6 +6147,14 @@ To connect, please ask your contact to create another connection link and check
<target>Использовать только локальные нотификации?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Использовать сервер</target>
@@ -6295,11 +6390,23 @@ To connect, please ask your contact to create another connection link and check
<target>С уменьшенным потреблением батареи.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Неправильный пароль базы данных</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Неправильный пароль!</target>
@@ -7455,11 +7562,19 @@ SimpleX серверы не могут получить доступ к Ваше
<target>неизвестно</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>неизвестный статус</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>обновил(а) профиль группы</target>
@@ -7525,6 +7640,10 @@ SimpleX серверы не могут получить доступ к Ваше
<target>недель</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>да</target>
@@ -677,6 +677,10 @@
<target>อนุญาตให้ข้อความที่หายไปเฉพาะในกรณีที่ผู้ติดต่อของคุณอนุญาตเท่านั้น.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>อนุญาตให้ลบข้อความแบบถาวรเฉพาะในกรณีที่ผู้ติดต่อของคุณอนุญาตให้คุณเท่านั้น</target>
@@ -769,6 +773,10 @@
<source>Already joining the group!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>ใช้รีเลย์เสมอ</target>
@@ -1032,6 +1040,10 @@
<target>ไม่สามารถรับไฟล์ได้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
@@ -1851,6 +1863,10 @@ This cannot be undone!</source>
<source>Desktop devices</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>พัฒนา</target>
@@ -1953,11 +1969,19 @@ This cannot be undone!</source>
<source>Discover via local network</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>อย่าใช้ SimpleX สําหรับการโทรฉุกเฉิน</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>ทำในภายหลัง</target>
@@ -2494,7 +2518,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>ข้อผิดพลาด: % @</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2583,6 +2607,10 @@ This cannot be undone!</source>
<target>ไฟล์: % @</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>ไฟล์และสื่อ</target>
@@ -2681,6 +2709,16 @@ This cannot be undone!</source>
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<note>No comment provided by engineer.</note>
@@ -3463,6 +3501,10 @@ This is your link for group %@!</source>
<target>ใบเสร็จการส่งข้อความ!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>ร่างข้อความ</target>
@@ -3483,6 +3525,14 @@ This is your link for group %@!</source>
<target>ปฏิกิริยาบนข้อความเป็นสิ่งต้องห้ามในกลุ่มนี้</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<note>No comment provided by engineer.</note>
@@ -3599,11 +3649,6 @@ This is your link for group %@!</source>
<source>Most likely this connection is deleted.</source>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>เป็นไปได้มากว่าผู้ติดต่อนี้ได้ลบการเชื่อมต่อกับคุณ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>โปรไฟล์การแชทหลายรายการ</target>
@@ -3633,6 +3678,10 @@ This is your link for group %@!</source>
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<note>No comment provided by engineer.</note>
@@ -4150,10 +4199,18 @@ Error: %@</source>
<target>ชื่อไฟล์ส่วนตัว</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>การเชื่อมต่อโปรไฟล์และเซิร์ฟเวอร์</target>
@@ -4230,6 +4287,10 @@ Error: %@</source>
<target>ห้ามส่งข้อความเสียง</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>ปกป้องหน้าจอแอป</target>
@@ -4336,10 +4397,6 @@ Error: %@</source>
<target>ที่อยู่ผู้รับจะถูกเปลี่ยนเป็นเซิร์ฟเวอร์อื่น การเปลี่ยนแปลงที่อยู่จะเสร็จสมบูรณ์หลังจากที่ผู้ส่งออนไลน์</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>การรับไฟล์จะหยุดลง</target>
@@ -4783,6 +4840,14 @@ Error: %@</source>
<target>ส่งข้อความสด</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>ส่งการแจ้งเตือน</target>
@@ -4885,6 +4950,10 @@ Error: %@</source>
<target>ข้อความที่ส่งจะถูกลบหลังเกินเวลาที่กําหนด</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>เซิร์ฟเวอร์ต้องการการอนุญาตในการสร้างคิว โปรดตรวจสอบรหัสผ่าน</target>
@@ -4900,6 +4969,10 @@ Error: %@</source>
<target>การทดสอบเซิร์ฟเวอร์ล้มเหลว!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>เซิร์ฟเวอร์</target>
@@ -5014,11 +5087,19 @@ Error: %@</source>
<source>Show last messages</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>แสดงตัวอย่าง</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>แสดง:</target>
@@ -5331,6 +5412,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>แอปสามารถแจ้งให้คุณทราบเมื่อคุณได้รับข้อความหรือคำขอติดต่อ - โปรดเปิดการตั้งค่าเพื่อเปิดใช้งาน</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>ความพยายามในการเปลี่ยนรหัสผ่านของฐานข้อมูลไม่เสร็จสมบูรณ์</target>
@@ -5505,6 +5590,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>ไฟล์ภาพ/เสียงใช้ UTC เพื่อป้องกันเขตเวลา</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5590,11 +5679,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<source>Unblock member?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>ข้อผิดพลาดที่ไม่คาดคิด: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>สถานะการย้ายข้อมูลที่ไม่คาดคิด</target>
@@ -5640,6 +5724,10 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>ข้อผิดพลาดที่ไม่รู้จัก</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>ยกเว้นกรณีที่คุณใช้อินเทอร์เฟซการโทรของ iOS ให้เปิดใช้งานโหมดห้ามรบกวนเพื่อหลีกเลี่ยงการรบกวน</target>
@@ -5778,6 +5866,14 @@ To connect, please ask your contact to create another connection link and check
<source>Use only local notifications?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>ใช้เซิร์ฟเวอร์</target>
@@ -5995,11 +6091,23 @@ To connect, please ask your contact to create another connection link and check
<source>With reduced battery usage.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>รหัสผ่านฐานข้อมูลไม่ถูกต้อง</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>รหัสผ่านผิด!</target>
@@ -7110,10 +7218,18 @@ SimpleX servers cannot see your profile.</source>
<target>ไม่ทราบ</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>อัปเดตโปรไฟล์กลุ่มแล้ว</target>
@@ -7177,6 +7293,10 @@ SimpleX servers cannot see your profile.</source>
<target>สัปดาห์</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>ใช่</target>
@@ -713,6 +713,10 @@
<target>Eğer kişide izin verirse kaybolan mesajlara izin ver.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Konuştuğun kişi, kalıcı olarak silinebilen mesajlara izin veriyorsa sen de ver. (24 saat içinde)</target>
@@ -808,6 +812,10 @@
<target>Zaten gruba bağlanılıyor!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Her zaman yönlendirici kullan</target>
@@ -1088,6 +1096,10 @@
<target>Dosya alınamıyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>Hücresel Veri</target>
@@ -1948,6 +1960,10 @@ Bu geri alınamaz!</target>
<target>Bilgisayar cihazları</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Geliştir</target>
@@ -2053,11 +2069,19 @@ Bu geri alınamaz!</target>
<target>Yerel ağ aracılığıyla keşfet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>Acil aramalar için SimpleX'i KULLANMAYIN.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Sonra yap</target>
@@ -2621,7 +2645,7 @@ Bu geri alınamaz!</target>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Hata: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2713,6 +2737,10 @@ Bu geri alınamaz!</target>
<target>Dosya: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Dosyalar &amp; medya</target>
@@ -2818,6 +2846,16 @@ Bu geri alınamaz!</target>
<target>Şuradan iletildi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Bilgisayar bulundu</target>
@@ -3633,6 +3671,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Mesaj alındı bilgisi!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Mesaj taslağı</target>
@@ -3653,6 +3695,14 @@ Bu senin grup için bağlantın %@!</target>
<target>Mesaj tepkileri bu grupta yasaklandı.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>Mesaj kaynağı gizli kalır.</target>
@@ -3783,11 +3833,6 @@ Bu senin grup için bağlantın %@!</target>
<target>Büyük ihtimalle bu bağlantı silinmiş.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Büyük ihtimalle bu kişi seninle bağlantını sildi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Çoklu sohbet profili</target>
@@ -3818,6 +3863,10 @@ Bu senin grup için bağlantın %@!</target>
<target>Ağ bağlantısı</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>Ağ yönetimi</target>
@@ -4359,11 +4408,19 @@ Hata: %@</target>
<target>Gizli dosya adları</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Gizli notlar</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>Profil ve sunucu bağlantıları</target>
@@ -4444,6 +4501,10 @@ Hata: %@</target>
<target>Sesli mesajların gönderimini yasakla.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Uygulama ekranını koru</target>
@@ -4554,11 +4615,6 @@ Hata: %@</target>
<target>Alıcı adresi farklı bir sunucuya değiştirilecektir. Gönderici çevrimiçi olduktan sonra adres değişikliği tamamlanacaktır.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<target>Eşzamanlılık alınıyor</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Dosya alımı durdurulacaktır.</target>
@@ -5019,6 +5075,14 @@ Hata: %@</target>
<target>Canlı mesaj gönder</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Bildirimler gönder</target>
@@ -5124,6 +5188,10 @@ Hata: %@</target>
<target>Gönderilen mesajlar ayarlanan süreden sonra silinecektir.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Sunucunun sıra oluşturması için yetki gereklidir, şifreyi kontrol edin</target>
@@ -5139,6 +5207,10 @@ Hata: %@</target>
<target>Sunucu testinde hata oluştu!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Sunucular</target>
@@ -5259,11 +5331,19 @@ Hata: %@</target>
<target>Son mesajları göster</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Ön gösterimi göser</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Göster:</target>
@@ -5586,6 +5666,10 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
<target>Uygulama, mesaj veya iletişim isteği aldığınızda sizi bilgilendirebilir - etkinleştirmek için lütfen ayarları açın.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Veritabanı parolasını değiştirme girişimi tamamlanmadı.</target>
@@ -5771,6 +5855,10 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
<target>Zaman bölgesini korumak için,fotoğraf/ses dosyaları UTC kullanır.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5863,11 +5951,6 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec
<target>Üyenin engeli kaldırılsın mı?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Beklenmeyen hata: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Beklenmeyen geçiş durumu</target>
@@ -5913,6 +5996,10 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec
<target>Bilinmeyen hata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>iOS arama arayüzünü kullanmadığınız sürece, kesintileri önlemek için Rahatsız Etmeyin modunu etkinleştirin.</target>
@@ -6060,6 +6147,14 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<target>Sadece yerel bildirimler kullanılsın mı?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Sunucu kullan</target>
@@ -6295,11 +6390,23 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
<target>Azaltılmış pil kullanımı ile birlikte.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Yanlış veritabanı parolası</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Yanlış parola!</target>
@@ -7455,11 +7562,19 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>bilinmeyen</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>bilinmeyen durum</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>grup profili güncellendi</target>
@@ -7525,6 +7640,10 @@ SimpleX sunucuları profilinizi göremez.</target>
<target>haftalar</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>evet</target>
@@ -713,6 +713,10 @@
<target>Дозволяйте зникати повідомленням, тільки якщо контакт дозволяє вам це робити.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>Дозволяйте безповоротне видалення повідомлень, тільки якщо контакт дозволяє вам це зробити. (24 години)</target>
@@ -807,6 +811,10 @@
<target>Вже приєднуємося до групи!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>Завжди використовуйте реле</target>
@@ -1087,6 +1095,10 @@
<target>Не вдається отримати файл</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<note>No comment provided by engineer.</note>
@@ -1946,6 +1958,10 @@ This cannot be undone!</source>
<target>Настільні пристрої</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>Розробник</target>
@@ -2051,11 +2067,19 @@ This cannot be undone!</source>
<target>Відкриття через локальну мережу</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>НЕ використовуйте SimpleX для екстрених викликів.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>Зробіть це пізніше</target>
@@ -2617,7 +2641,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>Помилка: %@</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2709,6 +2733,10 @@ This cannot be undone!</source>
<target>Файл: %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>Файли та медіа</target>
@@ -2809,6 +2837,16 @@ This cannot be undone!</source>
<source>Forwarded from</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>Знайдено робочий стіл</target>
@@ -3622,6 +3660,10 @@ This is your link for group %@!</source>
<target>Підтвердження доставки повідомлення!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Чернетка повідомлення</target>
@@ -3642,6 +3684,14 @@ This is your link for group %@!</source>
<target>Реакції на повідомлення в цій групі заборонені.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<note>No comment provided by engineer.</note>
@@ -3770,11 +3820,6 @@ This is your link for group %@!</source>
<target>Швидше за все, це з'єднання видалено.</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>Швидше за все, цей контакт видалив зв'язок з вами.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>Кілька профілів чату</target>
@@ -3804,6 +3849,10 @@ This is your link for group %@!</source>
<source>Network connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<note>No comment provided by engineer.</note>
@@ -4342,11 +4391,19 @@ Error: %@</source>
<target>Приватні імена файлів</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>Приватні нотатки</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>З'єднання профілю та сервера</target>
@@ -4425,6 +4482,10 @@ Error: %@</source>
<target>Заборонити надсилання голосових повідомлень.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>Захистіть екран програми</target>
@@ -4535,10 +4596,6 @@ Error: %@</source>
<target>Адреса отримувача буде змінена на інший сервер. Зміна адреси завершиться після того, як відправник з'явиться в мережі.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>Отримання файлу буде зупинено.</target>
@@ -4996,6 +5053,14 @@ Error: %@</source>
<target>Надіслати живе повідомлення</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>Надсилати сповіщення</target>
@@ -5101,6 +5166,10 @@ Error: %@</source>
<target>Надіслані повідомлення будуть видалені через встановлений час.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>Сервер вимагає авторизації для створення черг, перевірте пароль</target>
@@ -5116,6 +5185,10 @@ Error: %@</source>
<target>Тест сервера завершився невдало!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>Сервери</target>
@@ -5235,11 +5308,19 @@ Error: %@</source>
<target>Показати останні повідомлення</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>Показати попередній перегляд</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>Показати:</target>
@@ -5559,6 +5640,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Додаток може сповіщати вас, коли ви отримуєте повідомлення або запити на контакт - будь ласка, відкрийте налаштування, щоб увімкнути цю функцію.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>Спроба змінити пароль до бази даних не була завершена.</target>
@@ -5744,6 +5829,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Для захисту часового поясу у файлах зображень/голосу використовується UTC.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5836,11 +5925,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Розблокувати учасника?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>Неочікувана помилка: %@</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>Неочікуваний стан міграції</target>
@@ -5886,6 +5970,10 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>Невідома помилка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>Якщо ви не користуєтеся інтерфейсом виклику iOS, увімкніть режим "Не турбувати", щоб уникнути переривань.</target>
@@ -6033,6 +6121,14 @@ To connect, please ask your contact to create another connection link and check
<target>Використовувати лише локальні сповіщення?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>Використовувати сервер</target>
@@ -6263,11 +6359,23 @@ To connect, please ask your contact to create another connection link and check
<target>З меншим споживанням заряду акумулятора.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>Неправильний пароль до бази даних</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>Неправильний пароль!</target>
@@ -7417,11 +7525,19 @@ SimpleX servers cannot see your profile.</source>
<target>невідомий</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>невідомий статус</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>оновлений профіль групи</target>
@@ -7487,6 +7603,10 @@ SimpleX servers cannot see your profile.</source>
<target>тижнів</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>так</target>
@@ -623,6 +623,7 @@
</trans-unit>
<trans-unit id="Admins can block a member for all." xml:space="preserve">
<source>Admins can block a member for all.</source>
<target>管理员可以为所有人封禁一名成员。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -681,6 +682,7 @@
</trans-unit>
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve">
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
<target>你的所有联系人、对话和文件将被安全加密并分块上传到配置的 XFTP 中继。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow" xml:space="preserve">
@@ -698,6 +700,10 @@
<target>仅当您的联系人允许时才允许限时消息。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow downgrade" xml:space="preserve">
<source>Allow downgrade</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve">
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
<target>仅有您的联系人许可后才允许不可撤回消息移除。</target>
@@ -730,6 +736,7 @@
</trans-unit>
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
<source>Allow to send SimpleX links.</source>
<target>允许发送 SimpleX 链接。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
@@ -792,6 +799,10 @@
<target>已经加入了该群组!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use private routing." xml:space="preserve">
<source>Always use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Always use relay" xml:space="preserve">
<source>Always use relay</source>
<target>一直使用中继</target>
@@ -814,6 +825,7 @@
</trans-unit>
<trans-unit id="App data migration" xml:space="preserve">
<source>App data migration</source>
<target>应用数据迁移</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
@@ -853,14 +865,17 @@
</trans-unit>
<trans-unit id="Apply" xml:space="preserve">
<source>Apply</source>
<target>应用</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archive and upload" xml:space="preserve">
<source>Archive and upload</source>
<target>存档和上传</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Archiving database" xml:space="preserve">
<source>Archiving database</source>
<target>正在存档数据库</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Attach" xml:space="preserve">
@@ -1055,6 +1070,7 @@
</trans-unit>
<trans-unit id="Cancel migration" xml:space="preserve">
<source>Cancel migration</source>
<target>取消迁移</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Cannot access keychain to save database password" xml:space="preserve">
@@ -1067,8 +1083,13 @@
<target>无法接收文件</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Cellular" xml:space="preserve">
<source>Cellular</source>
<target>移动网络</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Change" xml:space="preserve">
@@ -1164,6 +1185,7 @@
</trans-unit>
<trans-unit id="Chat migrated!" xml:space="preserve">
<source>Chat migrated!</source>
<target>已迁移聊天!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Chat preferences" xml:space="preserve">
@@ -1262,6 +1284,7 @@
</trans-unit>
<trans-unit id="Confirm network settings" xml:space="preserve">
<source>Confirm network settings</source>
<target>确认网络设置</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm new passphrase…" xml:space="preserve">
@@ -1276,10 +1299,12 @@
</trans-unit>
<trans-unit id="Confirm that you remember database passphrase to migrate it." xml:space="preserve">
<source>Confirm that you remember database passphrase to migrate it.</source>
<target>请在迁移前确认你记得数据库的密码短语。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Confirm upload" xml:space="preserve">
<source>Confirm upload</source>
<target>确认上传</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Connect" xml:space="preserve">
@@ -1535,6 +1560,7 @@ This is your own one-time link!</source>
</trans-unit>
<trans-unit id="Creating archive link" xml:space="preserve">
<source>Creating archive link</source>
<target>正在创建存档链接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Creating link…" xml:space="preserve">
@@ -1756,6 +1782,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Delete database from this device" xml:space="preserve">
<source>Delete database from this device</source>
<target>从这部设备上删除数据库</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete file" xml:space="preserve">
@@ -1907,6 +1934,10 @@ This cannot be undone!</source>
<target>桌面设备</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Destination server error: %@" xml:space="preserve">
<source>Destination server error: %@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Develop" xml:space="preserve">
<source>Develop</source>
<target>开发</target>
@@ -2012,11 +2043,19 @@ This cannot be undone!</source>
<target>通过本地网络发现</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT send messages directly, even if your or destination server does not support private routing." xml:space="preserve">
<source>Do NOT send messages directly, even if your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
<source>Do NOT use SimpleX for emergency calls.</source>
<target>请勿使用 SimpleX 进行紧急通话。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do NOT use private routing." xml:space="preserve">
<source>Do NOT use private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Do it later" xml:space="preserve">
<source>Do it later</source>
<target>稍后再做</target>
@@ -2049,10 +2088,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Download" xml:space="preserve">
<source>Download</source>
<target>下载</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Download failed" xml:space="preserve">
<source>Download failed</source>
<target>下载失败了</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Download file" xml:space="preserve">
@@ -2062,10 +2103,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Downloading archive" xml:space="preserve">
<source>Downloading archive</source>
<target>正在下载存档</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Downloading link details" xml:space="preserve">
<source>Downloading link details</source>
<target>正在下载链接详情</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Duplicate display name!" xml:space="preserve">
@@ -2125,6 +2168,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enable in direct chats (BETA)!" xml:space="preserve">
<source>Enable in direct chats (BETA)!</source>
<target>在私聊中开启(公测)!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
@@ -2159,6 +2203,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enabled for" xml:space="preserve">
<source>Enabled for</source>
<target>启用对象</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Encrypt" xml:space="preserve">
@@ -2246,6 +2291,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Enter passphrase" xml:space="preserve">
<source>Enter passphrase</source>
<target>输入密码短语</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enter passphrase…" xml:space="preserve">
@@ -2399,6 +2445,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error downloading the archive" xml:space="preserve">
<source>Error downloading the archive</source>
<target>下载存档出错</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
@@ -2477,6 +2524,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error saving settings" xml:space="preserve">
<source>Error saving settings</source>
<target>保存设置出错</target>
<note>when migrating</note>
</trans-unit>
<trans-unit id="Error saving user password" xml:space="preserve">
@@ -2550,10 +2598,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Error uploading the archive" xml:space="preserve">
<source>Error uploading the archive</source>
<target>上传存档出错</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error verifying passphrase:" xml:space="preserve">
<source>Error verifying passphrase:</source>
<target>验证密码短语出错:</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error: " xml:space="preserve">
@@ -2564,7 +2614,7 @@ This cannot be undone!</source>
<trans-unit id="Error: %@" xml:space="preserve">
<source>Error: %@</source>
<target>错误: @</target>
<note>No comment provided by engineer.</note>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Error: URL is invalid" xml:space="preserve">
<source>Error: URL is invalid</source>
@@ -2608,6 +2658,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Exported file doesn't exist" xml:space="preserve">
<source>Exported file doesn't exist</source>
<target>导出的文件不存在</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive…" xml:space="preserve">
@@ -2655,6 +2706,10 @@ This cannot be undone!</source>
<target>文件:%@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files" xml:space="preserve">
<source>Files</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files &amp; media" xml:space="preserve">
<source>Files &amp; media</source>
<target>文件和媒体</target>
@@ -2672,6 +2727,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Files and media not allowed" xml:space="preserve">
<source>Files and media not allowed</source>
<target>不允许文件和媒体</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
@@ -2686,10 +2742,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Finalize migration" xml:space="preserve">
<source>Finalize migration</source>
<target>完成迁移</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finalize migration on another device." xml:space="preserve">
<source>Finalize migration on another device.</source>
<target>在另一部设备上完成迁移</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
@@ -2739,20 +2797,34 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Forward" xml:space="preserve">
<source>Forward</source>
<target>转发</target>
<note>chat item action</note>
</trans-unit>
<trans-unit id="Forward and save messages" xml:space="preserve">
<source>Forward and save messages</source>
<target>转发并保存消息</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded" xml:space="preserve">
<source>Forwarded</source>
<target>已转发</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarded from" xml:space="preserve">
<source>Forwarded from</source>
<target>转发自</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Destination server error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Destination server error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Forwarding server: %@&#10;Error: %@" xml:space="preserve">
<source>Forwarding server: %1$@
Error: %2$@</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Found desktop" xml:space="preserve">
<source>Found desktop</source>
<target>找到了桌面</target>
@@ -2864,6 +2936,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Group members can send SimpleX links." xml:space="preserve">
<source>Group members can send SimpleX links.</source>
<target>群成员可发送 SimpleX 链接。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send direct messages." xml:space="preserve">
@@ -3072,10 +3145,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Import failed" xml:space="preserve">
<source>Import failed</source>
<target>导入失败了</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Importing archive" xml:space="preserve">
<source>Importing archive</source>
<target>正在导入存档</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Improved message delivery" xml:space="preserve">
@@ -3095,6 +3170,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="In order to continue, chat should be stopped." xml:space="preserve">
<source>In order to continue, chat should be stopped.</source>
<target>必须停止聊天才能继续。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
@@ -3104,6 +3180,7 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="In-call sounds" xml:space="preserve">
<source>In-call sounds</source>
<target>通话声音</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
@@ -3210,10 +3287,12 @@ This cannot be undone!</source>
</trans-unit>
<trans-unit id="Invalid link" xml:space="preserve">
<source>Invalid link</source>
<target>无效链接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid migration confirmation" xml:space="preserve">
<source>Invalid migration confirmation</source>
<target>迁移确认无效</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Invalid name!" xml:space="preserve">
@@ -3554,6 +3633,10 @@ This is your link for group %@!</source>
<target>消息送达回执!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery warning" xml:space="preserve">
<source>Message delivery warning</source>
<note>item status text</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>消息草稿</target>
@@ -3574,8 +3657,17 @@ This is your link for group %@!</source>
<target>该群组禁用了消息回应。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing fallback" xml:space="preserve">
<source>Message routing fallback</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message routing mode" xml:space="preserve">
<source>Message routing mode</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message source remains private." xml:space="preserve">
<source>Message source remains private.</source>
<target>消息来源保持私密。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message text" xml:space="preserve">
@@ -3585,6 +3677,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Message too large" xml:space="preserve">
<source>Message too large</source>
<target>消息太大了</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Messages" xml:space="preserve">
@@ -3611,26 +3704,32 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Migrate device" xml:space="preserve">
<source>Migrate device</source>
<target>迁移设备</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate from another device" xml:space="preserve">
<source>Migrate from another device</source>
<target>从另一台设备迁移</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate here" xml:space="preserve">
<source>Migrate here</source>
<target>迁移到此处</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device" xml:space="preserve">
<source>Migrate to another device</source>
<target>迁移到另一部设备</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrate to another device via QR code." xml:space="preserve">
<source>Migrate to another device via QR code.</source>
<target>通过二维码迁移到另一部设备。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating" xml:space="preserve">
<source>Migrating</source>
<target>迁移中</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive…" xml:space="preserve">
@@ -3640,6 +3739,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Migration complete" xml:space="preserve">
<source>Migration complete</source>
<target>迁移完毕</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3684,6 +3784,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="More reliable network connection." xml:space="preserve">
<source>More reliable network connection.</source>
<target>更可靠的网络连接。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Most likely this connection is deleted." xml:space="preserve">
@@ -3691,11 +3792,6 @@ This is your link for group %@!</source>
<target>此连接很可能已被删除。</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Most likely this contact has deleted the connection with you." xml:space="preserve">
<source>Most likely this contact has deleted the connection with you.</source>
<target>很可能此联系人已经删除了与您的联系。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Multiple chat profiles" xml:space="preserve">
<source>Multiple chat profiles</source>
<target>多个聊天资料</target>
@@ -3723,10 +3819,16 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Network connection" xml:space="preserve">
<source>Network connection</source>
<target>网络连接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network issues - message expired after many attempts to send it." xml:space="preserve">
<source>Network issues - message expired after many attempts to send it.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Network management" xml:space="preserve">
<source>Network management</source>
<target>网络管理</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Network settings" xml:space="preserve">
@@ -3841,6 +3943,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="No network connection" xml:space="preserve">
<source>No network connection</source>
<target>无网络连接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No permission to record voice message" xml:space="preserve">
@@ -4037,6 +4140,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or paste archive link" xml:space="preserve">
<source>Or paste archive link</source>
<target>或粘贴存档链接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or scan QR code" xml:space="preserve">
@@ -4046,6 +4150,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Or securely share this file link" xml:space="preserve">
<source>Or securely share this file link</source>
<target>或安全地分享此文件链接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Or show this code" xml:space="preserve">
@@ -4055,6 +4160,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Other" xml:space="preserve">
<source>Other</source>
<target>其他</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="PING count" xml:space="preserve">
@@ -4138,6 +4244,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Picture-in-picture calls" xml:space="preserve">
<source>Picture-in-picture calls</source>
<target>画中画通话</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please ask your contact to enable sending voice messages." xml:space="preserve">
@@ -4162,6 +4269,7 @@ This is your link for group %@!</source>
</trans-unit>
<trans-unit id="Please confirm that network settings are correct for this device." xml:space="preserve">
<source>Please confirm that network settings are correct for this device.</source>
<target>请确认网络设置对此这台设备正确无误。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Please contact developers.&#10;Error: %@" xml:space="preserve">
@@ -4254,11 +4362,19 @@ Error: %@</source>
<target>私密文件名</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private message routing" xml:space="preserve">
<source>Private message routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Private notes" xml:space="preserve">
<source>Private notes</source>
<target>私密笔记</target>
<note>name of notes to self</note>
</trans-unit>
<trans-unit id="Private routing" xml:space="preserve">
<source>Private routing</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile and server connections" xml:space="preserve">
<source>Profile and server connections</source>
<target>资料和服务器连接</target>
@@ -4271,6 +4387,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Profile images" xml:space="preserve">
<source>Profile images</source>
<target>个人资料图</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Profile name" xml:space="preserve">
@@ -4336,6 +4453,10 @@ Error: %@</source>
<target>禁止发送语音消息。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect IP address" xml:space="preserve">
<source>Protect IP address</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protect app screen" xml:space="preserve">
<source>Protect app screen</source>
<target>保护应用程序屏幕</target>
@@ -4367,6 +4488,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Quantum resistant encryption" xml:space="preserve">
<source>Quantum resistant encryption</source>
<target>抗量子加密</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Rate the app" xml:space="preserve">
@@ -4444,10 +4566,6 @@ Error: %@</source>
<target>接收地址将变更到不同的服务器。地址更改将在发件人上线后完成。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving concurrency" xml:space="preserve">
<source>Receiving concurrency</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
<source>Receiving file will be stopped.</source>
<target>即将停止接收文件。</target>
@@ -4464,6 +4582,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Recipient(s) can't see who this message is from." xml:space="preserve">
<source>Recipient(s) can't see who this message is from.</source>
<target>收件人看不到这条消息来自何人。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
@@ -4563,10 +4682,12 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Repeat download" xml:space="preserve">
<source>Repeat download</source>
<target>重复下载</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat import" xml:space="preserve">
<source>Repeat import</source>
<target>重复导入</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Repeat join request?" xml:space="preserve">
@@ -4576,6 +4697,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Repeat upload" xml:space="preserve">
<source>Repeat upload</source>
<target>重复上传</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
@@ -4680,6 +4802,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Safer groups" xml:space="preserve">
<source>Safer groups</source>
<target>更安全的群组</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Save" xml:space="preserve">
@@ -4764,6 +4887,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Saved" xml:space="preserve">
<source>Saved</source>
<target>已保存</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved WebRTC ICE servers will be removed" xml:space="preserve">
@@ -4773,6 +4897,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Saved from" xml:space="preserve">
<source>Saved from</source>
<target>保存自</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Saved message" xml:space="preserve">
@@ -4900,6 +5025,14 @@ Error: %@</source>
<target>发送实时消息</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when IP address is protected and your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when IP address is protected and your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send messages directly when your or destination server does not support private routing." xml:space="preserve">
<source>Send messages directly when your or destination server does not support private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send notifications" xml:space="preserve">
<source>Send notifications</source>
<target>发送通知</target>
@@ -5005,6 +5138,10 @@ Error: %@</source>
<target>已发送的消息将在设定的时间后被删除。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server address is incompatible with network settings." xml:space="preserve">
<source>Server address is incompatible with network settings.</source>
<note>srv error text.</note>
</trans-unit>
<trans-unit id="Server requires authorization to create queues, check password" xml:space="preserve">
<source>Server requires authorization to create queues, check password</source>
<target>服务器需要授权才能创建队列,检查密码</target>
@@ -5020,6 +5157,10 @@ Error: %@</source>
<target>服务器测试失败!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Server version is incompatible with network settings." xml:space="preserve">
<source>Server version is incompatible with network settings.</source>
<note>srv error text</note>
</trans-unit>
<trans-unit id="Servers" xml:space="preserve">
<source>Servers</source>
<target>服务器</target>
@@ -5057,6 +5198,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Set passphrase" xml:space="preserve">
<source>Set passphrase</source>
<target>设置密码短语</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Set passphrase to export" xml:space="preserve">
@@ -5081,6 +5223,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Shape profile images" xml:space="preserve">
<source>Shape profile images</source>
<target>改变个人资料图形状</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Share" xml:space="preserve">
@@ -5120,6 +5263,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Show QR code" xml:space="preserve">
<source>Show QR code</source>
<target>显示二维码</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show calls in phone history" xml:space="preserve">
@@ -5137,11 +5281,19 @@ Error: %@</source>
<target>显示最近的消息</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show message status" xml:space="preserve">
<source>Show message status</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show preview" xml:space="preserve">
<source>Show preview</source>
<target>显示预览</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show → on messages sent via private routing." xml:space="preserve">
<source>Show → on messages sent via private routing.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Show:" xml:space="preserve">
<source>Show:</source>
<target>显示:</target>
@@ -5204,10 +5356,12 @@ Error: %@</source>
</trans-unit>
<trans-unit id="SimpleX links are prohibited in this group." xml:space="preserve">
<source>SimpleX links are prohibited in this group.</source>
<target>此群禁止 SimpleX 链接。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX links not allowed" xml:space="preserve">
<source>SimpleX links not allowed</source>
<target>不允许SimpleX 链接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="SimpleX one-time invitation" xml:space="preserve">
@@ -5247,6 +5401,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Square, circle, or anything in between." xml:space="preserve">
<source>Square, circle, or anything in between.</source>
<target>方形、圆形、或两者之间的任意形状</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Start chat" xml:space="preserve">
@@ -5276,6 +5431,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Stop chat" xml:space="preserve">
<source>Stop chat</source>
<target>停止聊天程序</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Stop chat to enable database actions" xml:space="preserve">
@@ -5320,6 +5476,7 @@ Error: %@</source>
</trans-unit>
<trans-unit id="Stopping chat" xml:space="preserve">
<source>Stopping chat</source>
<target>正在停止聊天</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Submit" xml:space="preserve">
@@ -5459,6 +5616,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>该应用可以在您收到消息或联系人请求时通知您——请打开设置以启用通知。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The app will ask to confirm downloads from unknown file servers (except .onion)." xml:space="preserve">
<source>The app will ask to confirm downloads from unknown file servers (except .onion).</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The attempt to change database passphrase was not completed." xml:space="preserve">
<source>The attempt to change database passphrase was not completed.</source>
<target>更改数据库密码的尝试未完成。</target>
@@ -5571,10 +5732,12 @@ It can happen because of some bug or when the connection is compromised.</source
</trans-unit>
<trans-unit id="This chat is protected by end-to-end encryption." xml:space="preserve">
<source>This chat is protected by end-to-end encryption.</source>
<target>此聊天受端到端加密保护。</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This chat is protected by quantum resistant end-to-end encryption." xml:space="preserve">
<source>This chat is protected by quantum resistant end-to-end encryption.</source>
<target>此聊天受抗量子的端到端加密保护。</target>
<note>E2EE info chat item</note>
</trans-unit>
<trans-unit id="This device name" xml:space="preserve">
@@ -5642,6 +5805,10 @@ It can happen because of some bug or when the connection is compromised.</source
<target>为了保护时区,图像/语音文件使用 UTC。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your IP address, private routing uses your SMP servers to deliver messages." xml:space="preserve">
<source>To protect your IP address, private routing uses your SMP servers to deliver messages.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="To protect your information, turn on SimpleX Lock.&#10;You will be prompted to complete authentication before this feature is enabled." xml:space="preserve">
<source>To protect your information, turn on SimpleX Lock.
You will be prompted to complete authentication before this feature is enabled.</source>
@@ -5733,11 +5900,6 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>解封成员吗?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unexpected error: %@" xml:space="preserve">
<source>Unexpected error: %@</source>
<target>意外错误: @</target>
<note>item status description</note>
</trans-unit>
<trans-unit id="Unexpected migration state" xml:space="preserve">
<source>Unexpected migration state</source>
<target>未预料的迁移状态</target>
@@ -5783,6 +5945,10 @@ You will be prompted to complete authentication before this feature is enabled.<
<target>未知错误</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unknown servers!" xml:space="preserve">
<source>Unknown servers!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
<target>除非您使用 iOS 通话界面,否则请启用请勿打扰模式以避免打扰。</target>
@@ -5872,6 +6038,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Upload failed" xml:space="preserve">
<source>Upload failed</source>
<target>上传失败了</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Upload file" xml:space="preserve">
@@ -5881,6 +6048,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Uploading archive" xml:space="preserve">
<source>Uploading archive</source>
<target>正在上传存档</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use .onion hosts" xml:space="preserve">
@@ -5927,6 +6095,14 @@ To connect, please ask your contact to create another connection link and check
<source>Use only local notifications?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers when IP address is not protected." xml:space="preserve">
<source>Use private routing with unknown servers when IP address is not protected.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use private routing with unknown servers." xml:space="preserve">
<source>Use private routing with unknown servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Use server" xml:space="preserve">
<source>Use server</source>
<target>使用服务器</target>
@@ -5934,6 +6110,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Use the app while in the call." xml:space="preserve">
<source>Use the app while in the call.</source>
<target>通话时使用本应用</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="User profile" xml:space="preserve">
@@ -5973,10 +6150,12 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Verify database passphrase" xml:space="preserve">
<source>Verify database passphrase</source>
<target>验证数据库密码短语</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify passphrase" xml:space="preserve">
<source>Verify passphrase</source>
<target>验证密码短语</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Verify security code" xml:space="preserve">
@@ -6041,6 +6220,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Voice messages not allowed" xml:space="preserve">
<source>Voice messages not allowed</source>
<target>不允许语音消息</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Voice messages prohibited!" xml:space="preserve">
@@ -6074,6 +6254,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Warning: starting chat on multiple devices is not supported and will cause message delivery failures" xml:space="preserve">
<source>Warning: starting chat on multiple devices is not supported and will cause message delivery failures</source>
<target>警告:不支持在多部设备上启动聊天,这么做会导致消息传送失败。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Warning: you may lose some data!" xml:space="preserve">
@@ -6098,6 +6279,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="Welcome message is too long" xml:space="preserve">
<source>Welcome message is too long</source>
<target>欢迎消息太大了</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="What's new" xml:space="preserve">
@@ -6112,6 +6294,7 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="When connecting audio and video calls." xml:space="preserve">
<source>When connecting audio and video calls.</source>
<target>连接音频和视频通话时。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="When people request to connect, you can accept or reject it." xml:space="preserve">
@@ -6126,14 +6309,17 @@ To connect, please ask your contact to create another connection link and check
</trans-unit>
<trans-unit id="WiFi" xml:space="preserve">
<source>WiFi</source>
<target>WiFi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Will be enabled in direct chats!" xml:space="preserve">
<source>Will be enabled in direct chats!</source>
<target>将在私聊中启用!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wired ethernet" xml:space="preserve">
<source>Wired ethernet</source>
<target>有线以太网</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="With encrypted files and media." xml:space="preserve">
@@ -6151,11 +6337,23 @@ To connect, please ask your contact to create another connection link and check
<target>降低了电量使用。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to file servers." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to file servers.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong database passphrase" xml:space="preserve">
<source>Wrong database passphrase</source>
<target>数据库密码错误</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Wrong key or unknown connection - most likely this connection is deleted." xml:space="preserve">
<source>Wrong key or unknown connection - most likely this connection is deleted.</source>
<note>snd error text</note>
</trans-unit>
<trans-unit id="Wrong passphrase!" xml:space="preserve">
<source>Wrong passphrase!</source>
<target>密码错误!</target>
@@ -6258,6 +6456,7 @@ Repeat join request?</source>
</trans-unit>
<trans-unit id="You can give another try." xml:space="preserve">
<source>You can give another try.</source>
<target>你可以再试一次。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
@@ -6609,6 +6808,7 @@ SimpleX 服务器无法看到您的资料。</target>
</trans-unit>
<trans-unit id="admins" xml:space="preserve">
<source>admins</source>
<target>管理员</target>
<note>feature role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
@@ -6623,6 +6823,7 @@ SimpleX 服务器无法看到您的资料。</target>
</trans-unit>
<trans-unit id="all members" xml:space="preserve">
<source>all members</source>
<target>所有成员</target>
<note>feature role</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
@@ -6955,6 +7156,7 @@ SimpleX 服务器无法看到您的资料。</target>
</trans-unit>
<trans-unit id="forwarded" xml:space="preserve">
<source>forwarded</source>
<target>已转发</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="group deleted" xml:space="preserve">
@@ -7165,6 +7367,7 @@ SimpleX 服务器无法看到您的资料。</target>
</trans-unit>
<trans-unit id="owners" xml:space="preserve">
<source>owners</source>
<target>所有者</target>
<note>feature role</note>
</trans-unit>
<trans-unit id="peer-to-peer" xml:space="preserve">
@@ -7174,6 +7377,7 @@ SimpleX 服务器无法看到您的资料。</target>
</trans-unit>
<trans-unit id="quantum resistant e2e encryption" xml:space="preserve">
<source>quantum resistant e2e encryption</source>
<target>抗量子端到端加密</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="received answer…" xml:space="preserve">
@@ -7218,6 +7422,7 @@ SimpleX 服务器无法看到您的资料。</target>
</trans-unit>
<trans-unit id="saved" xml:space="preserve">
<source>saved</source>
<target>已保存</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="saved from %@" xml:space="preserve">
@@ -7261,6 +7466,7 @@ SimpleX 服务器无法看到您的资料。</target>
</trans-unit>
<trans-unit id="standard end-to-end encryption" xml:space="preserve">
<source>standard end-to-end encryption</source>
<target>标准端到端加密</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
@@ -7287,11 +7493,19 @@ SimpleX 服务器无法看到您的资料。</target>
<target>未知</target>
<note>connection info</note>
</trans-unit>
<trans-unit id="unknown relays" xml:space="preserve">
<source>unknown relays</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unknown status" xml:space="preserve">
<source>unknown status</source>
<target>未知状态</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="unprotected" xml:space="preserve">
<source>unprotected</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="updated group profile" xml:space="preserve">
<source>updated group profile</source>
<target>已更新的群组资料</target>
@@ -7356,6 +7570,10 @@ SimpleX 服务器无法看到您的资料。</target>
<target>周</target>
<note>time unit</note>
</trans-unit>
<trans-unit id="when IP hidden" xml:space="preserve">
<source>when IP hidden</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="yes" xml:space="preserve">
<source>yes</source>
<target>是</target>
@@ -7363,6 +7581,7 @@ SimpleX 服务器无法看到您的资料。</target>
</trans-unit>
<trans-unit id="you" xml:space="preserve">
<source>you</source>
<target>您</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="you are invited to group" xml:space="preserve">
+26 -26
View File
@@ -76,11 +76,6 @@
5C9CC7AD28C55D7800BEF955 /* DatabaseEncryptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9CC7AC28C55D7800BEF955 /* DatabaseEncryptionView.swift */; };
5C9D13A3282187BB00AB8B43 /* WebRTC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9D13A2282187BB00AB8B43 /* WebRTC.swift */; };
5C9D811A2AA8727A001D49FD /* CryptoFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9D81182AA7A4F1001D49FD /* CryptoFile.swift */; };
5C9F3DD62BFBCDD90003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C9F3DD12BFBCDD80003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf-ghc9.6.3.a */; };
5C9F3DD72BFBCDD90003B86B /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C9F3DD22BFBCDD80003B86B /* libffi.a */; };
5C9F3DD82BFBCDD90003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C9F3DD32BFBCDD80003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf.a */; };
5C9F3DD92BFBCDD90003B86B /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C9F3DD42BFBCDD90003B86B /* libgmpxx.a */; };
5C9F3DDA2BFBCDD90003B86B /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C9F3DD52BFBCDD90003B86B /* libgmp.a */; };
5C9FD96E27A5D6ED0075386C /* SendMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C9FD96D27A5D6ED0075386C /* SendMessageView.swift */; };
5CA059DC279559F40002BEB4 /* Tests_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059DB279559F40002BEB4 /* Tests_iOS.swift */; };
5CA059DE279559F40002BEB4 /* Tests_iOSLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA059DD279559F40002BEB4 /* Tests_iOSLaunchTests.swift */; };
@@ -144,6 +139,11 @@
5CEACCED27DEA495000BD591 /* MsgContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCEC27DEA495000BD591 /* MsgContentView.swift */; };
5CEBD7462A5C0A8F00665FE2 /* KeyboardPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */; };
5CEBD7482A5F115D00665FE2 /* SetDeliveryReceiptsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */; };
5CEE87942C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CEE878F2C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G-ghc9.6.3.a */; };
5CEE87952C024F4F00583B8A /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CEE87902C024F4F00583B8A /* libgmp.a */; };
5CEE87962C024F4F00583B8A /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CEE87912C024F4F00583B8A /* libgmpxx.a */; };
5CEE87972C024F4F00583B8A /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CEE87922C024F4F00583B8A /* libffi.a */; };
5CEE87982C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CEE87932C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G.a */; };
5CF937202B24DE8C00E1D781 /* SharedFileSubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF9371F2B24DE8C00E1D781 /* SharedFileSubscriber.swift */; };
5CF937232B2503D000E1D781 /* NSESubscriber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF937212B25034A00E1D781 /* NSESubscriber.swift */; };
5CFA59C42860BC6200863A68 /* MigrateToAppGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */; };
@@ -359,11 +359,6 @@
5C9CC7AC28C55D7800BEF955 /* DatabaseEncryptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseEncryptionView.swift; sourceTree = "<group>"; };
5C9D13A2282187BB00AB8B43 /* WebRTC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebRTC.swift; sourceTree = "<group>"; };
5C9D81182AA7A4F1001D49FD /* CryptoFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoFile.swift; sourceTree = "<group>"; };
5C9F3DD12BFBCDD80003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf-ghc9.6.3.a"; sourceTree = "<group>"; };
5C9F3DD22BFBCDD80003B86B /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5C9F3DD32BFBCDD80003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf.a"; sourceTree = "<group>"; };
5C9F3DD42BFBCDD90003B86B /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5C9F3DD52BFBCDD90003B86B /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5C9FD96A27A56D4D0075386C /* JSON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = "<group>"; };
5C9FD96D27A5D6ED0075386C /* SendMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendMessageView.swift; sourceTree = "<group>"; };
5CA059C3279559F40002BEB4 /* SimpleXApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleXApp.swift; sourceTree = "<group>"; };
@@ -445,6 +440,11 @@
5CEACCEC27DEA495000BD591 /* MsgContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MsgContentView.swift; sourceTree = "<group>"; };
5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardPadding.swift; sourceTree = "<group>"; };
5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetDeliveryReceiptsView.swift; sourceTree = "<group>"; };
5CEE878F2C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G-ghc9.6.3.a"; sourceTree = "<group>"; };
5CEE87902C024F4F00583B8A /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5CEE87912C024F4F00583B8A /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5CEE87922C024F4F00583B8A /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5CEE87932C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G.a"; sourceTree = "<group>"; };
5CF9371F2B24DE8C00E1D781 /* SharedFileSubscriber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedFileSubscriber.swift; sourceTree = "<group>"; };
5CF937212B25034A00E1D781 /* NSESubscriber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSESubscriber.swift; sourceTree = "<group>"; };
5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrateToAppGroupView.swift; sourceTree = "<group>"; };
@@ -539,13 +539,13 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5C9F3DD92BFBCDD90003B86B /* libgmpxx.a in Frameworks */,
5C9F3DDA2BFBCDD90003B86B /* libgmp.a in Frameworks */,
5C9F3DD82BFBCDD90003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf.a in Frameworks */,
5CEE87942C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G-ghc9.6.3.a in Frameworks */,
5CEE87972C024F4F00583B8A /* libffi.a in Frameworks */,
5CEE87962C024F4F00583B8A /* libgmpxx.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
5C9F3DD62BFBCDD90003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf-ghc9.6.3.a in Frameworks */,
5CEE87952C024F4F00583B8A /* libgmp.a in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
5C9F3DD72BFBCDD90003B86B /* libffi.a in Frameworks */,
5CEE87982C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -611,11 +611,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
5C9F3DD22BFBCDD80003B86B /* libffi.a */,
5C9F3DD52BFBCDD90003B86B /* libgmp.a */,
5C9F3DD42BFBCDD90003B86B /* libgmpxx.a */,
5C9F3DD12BFBCDD80003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf-ghc9.6.3.a */,
5C9F3DD32BFBCDD80003B86B /* libHSsimplex-chat-5.8.0.2-8RkLdmy05dJBsgWrGV50Uf.a */,
5CEE87922C024F4F00583B8A /* libffi.a */,
5CEE87902C024F4F00583B8A /* libgmp.a */,
5CEE87912C024F4F00583B8A /* libgmpxx.a */,
5CEE878F2C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G-ghc9.6.3.a */,
5CEE87932C024F4F00583B8A /* libHSsimplex-chat-5.8.0.3-3OkzEeUKATkEGDdUZR1g6G.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -1562,7 +1562,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 218;
CURRENT_PROJECT_VERSION = 220;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1611,7 +1611,7 @@
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 218;
CURRENT_PROJECT_VERSION = 220;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
@@ -1697,7 +1697,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 218;
CURRENT_PROJECT_VERSION = 220;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GCC_OPTIMIZATION_LEVEL = s;
@@ -1734,7 +1734,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 218;
CURRENT_PROJECT_VERSION = 220;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_CODE_COVERAGE = NO;
@@ -1771,7 +1771,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 218;
CURRENT_PROJECT_VERSION = 220;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1822,7 +1822,7 @@
CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES;
CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 218;
CURRENT_PROJECT_VERSION = 220;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
-1
View File
@@ -1743,7 +1743,6 @@ public enum ChatErrorType: Decodable {
case groupMemberNotActive
case groupMemberUserRemoved
case groupMemberNotFound
case groupMemberIntroNotFound(contactName: ContactName)
case groupCantResendInvitation(groupInfo: GroupInfo, contactName: ContactName)
case groupInternal(message: String)
case fileNotFound(message: String)
+1 -10
View File
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Грешка: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Грешка: %@";
/* No comment provided by engineer. */
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Най-вероятно тази връзка е изтрита.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Най-вероятно този контакт е изтрил връзката с вас.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Множество профили за чат";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Получаващият адрес ще бъде променен към друг сървър. Промяната на адреса ще завърши, след като подателят е онлайн.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Паралелност на получаване";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Получаващият се файл ще бъде спрян.";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "отблокиран %@";
/* item status description */
"Unexpected error: %@" = "Неочаквана грешка: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Неочаквано състояние на миграция";
+1 -7
View File
@@ -1461,7 +1461,7 @@
/* No comment provided by engineer. */
"Error: " = "Chyba: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Chyba: %@";
/* No comment provided by engineer. */
@@ -2082,9 +2082,6 @@
/* item status description */
"Most likely this connection is deleted." = "Pravděpodobně je toto spojení smazáno.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Tento kontakt s největší pravděpodobností smazal spojení s vámi.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Více chatovacích profilů";
@@ -3179,9 +3176,6 @@
/* No comment provided by engineer. */
"Unable to record voice message" = "Nelze nahrát hlasovou zprávu";
/* item status description */
"Unexpected error: %@" = "Neočekávaná chyba: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Neočekávaný stav přenášení";
+4 -13
View File
@@ -438,7 +438,7 @@
"All your contacts will remain connected. Profile update will be sent to your contacts." = "Alle Ihre Kontakte bleiben verbunden. Es wird eine Profilaktualisierung an Ihre Kontakte gesendet.";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Server hochgeladen.";
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Relais hochgeladen.";
/* No comment provided by engineer. */
"Allow" = "Erlauben";
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Fehler: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Fehler: %@";
/* No comment provided by engineer. */
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Wahrscheinlich ist diese Verbindung gelöscht worden.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Dieser Kontakt hat sehr wahrscheinlich die Verbindung mit Ihnen gelöscht.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Mehrere Chat-Profile";
@@ -2730,10 +2727,10 @@
"One-time invitation link" = "Einmal-Einladungslink";
/* No comment provided by engineer. */
"Onion hosts will be required for connection. Requires enabling VPN." = "Für die Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs.";
"Onion hosts will be required for connection. Requires enabling VPN." = "Für diese Verbindung werden Onion-Hosts benötigt. Dies erfordert die Aktivierung eines VPNs.";
/* No comment provided by engineer. */
"Onion hosts will be used when available. Requires enabling VPN." = "Onion-Hosts werden verwendet, sobald sie verfügbar sind. Dies erfordert die Aktivierung eines VPNs.";
"Onion hosts will be used when available. Requires enabling VPN." = "Wenn Onion-Hosts verfügbar sind, werden sie verwendet. Dies erfordert die Aktivierung eines VPNs.";
/* No comment provided by engineer. */
"Onion hosts will not be used." = "Onion-Hosts werden nicht verwendet.";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Die Empfängeradresse wird auf einen anderen Server geändert. Der Adresswechsel wird abgeschlossen, wenn der Absender wieder online ist.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Gleichzeitiger Empfang";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Der Empfang der Datei wird beendet.";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "%@ wurde freigegeben";
/* item status description */
"Unexpected error: %@" = "Unerwarteter Fehler: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Unerwarteter Migrationsstatus";
+8 -17
View File
@@ -675,7 +675,7 @@
"Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" = "Búlgaro, Finlandés, Tailandés y Ucraniano - gracias a los usuarios y [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!";
/* No comment provided by engineer. */
"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Mediante perfil (por defecto) o [por conexión](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).";
"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Mediante perfil (predeterminado) o [por conexión](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).";
/* No comment provided by engineer. */
"Call already ended!" = "¡La llamada ha terminado!";
@@ -1162,13 +1162,13 @@
"Decryption error" = "Error descifrado";
/* pref value */
"default (%@)" = "por defecto (%@)";
"default (%@)" = "predeterminado (%@)";
/* No comment provided by engineer. */
"default (no)" = "por defecto (no)";
"default (no)" = "predeterminado (no)";
/* No comment provided by engineer. */
"default (yes)" = "por defecto (sí)";
"default (yes)" = "predeterminado (sí)";
/* chat item action */
"Delete" = "Eliminar";
@@ -1492,7 +1492,7 @@
"enabled" = "activado";
/* No comment provided by engineer. */
"Enabled for" = "Activar para";
"Enabled for" = "Activado para";
/* enabled status */
"enabled for contact" = "activado para el contacto";
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Error: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Error: %@";
/* No comment provided by engineer. */
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Probablemente la conexión ha sido eliminada.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Lo más probable es que este contacto haya eliminado la conexión contigo.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Múltiples perfiles";
@@ -2961,7 +2958,7 @@
"Profile image" = "Imagen del perfil";
/* No comment provided by engineer. */
"Profile images" = "Imágenes del perfil";
"Profile images" = "Forma de los perfiles";
/* No comment provided by engineer. */
"Profile name" = "Nombre del perfil";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "La dirección de recepción pasará a otro servidor. El cambio se completará cuando el remitente esté en línea.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Concurrencia en la recepción";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Se detendrá la recepción del archivo.";
@@ -3192,7 +3186,7 @@
"Reset colors" = "Restablecer colores";
/* No comment provided by engineer. */
"Reset to defaults" = "Restablecer valores por defecto";
"Reset to defaults" = "Restablecer valores predetarminados";
/* No comment provided by engineer. */
"Restart the app to create a new chat profile" = "Reinicia la aplicación para crear un perfil nuevo";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "ha desbloqueado a %@";
/* item status description */
"Unexpected error: %@" = "Error inesperado: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Estado de migración inesperado";
+1 -7
View File
@@ -1434,7 +1434,7 @@
/* No comment provided by engineer. */
"Error: " = "Virhe: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Virhe: %@";
/* No comment provided by engineer. */
@@ -2058,9 +2058,6 @@
/* item status description */
"Most likely this connection is deleted." = "Todennäköisesti tämä yhteys on poistettu.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Todennäköisesti tämä kontakti on poistanut yhteyden sinuun.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Useita keskusteluprofiileja";
@@ -3137,9 +3134,6 @@
/* No comment provided by engineer. */
"Unable to record voice message" = "Ääniviestiä ei voi tallentaa";
/* item status description */
"Unexpected error: %@" = "Odottamaton virhe: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Odottamaton siirtotila";
+6 -15
View File
@@ -1306,7 +1306,7 @@
"Delivery receipts are disabled!" = "Les accusés de réception sont désactivés !";
/* No comment provided by engineer. */
"Delivery receipts!" = "Justificatifs de réception!";
"Delivery receipts!" = "Justificatifs de réception!";
/* No comment provided by engineer. */
"Description" = "Description";
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Erreur : ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Erreur: %@";
/* No comment provided by engineer. */
@@ -1876,7 +1876,7 @@
"Fix connection" = "Réparer la connexion";
/* No comment provided by engineer. */
"Fix connection?" = "Réparer la connexion?";
"Fix connection?" = "Réparer la connexion?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Réparer le chiffrement après la restauration des sauvegardes.";
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Connexion probablement supprimée.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Il est fort probable que ce contact ait supprimé la connexion avec vous.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Différents profils de chat";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "L'adresse de réception sera changée pour un autre serveur. Le changement d'adresse sera terminé lorsque l'expéditeur sera en ligne.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Réception simultanée";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "La réception du fichier sera interrompue.";
@@ -3099,7 +3093,7 @@
"Reconnect all connected servers to force message delivery. It uses additional traffic." = "Reconnecter tous les serveurs connectés pour forcer la livraison des messages. Cette méthode utilise du trafic supplémentaire.";
/* No comment provided by engineer. */
"Reconnect servers?" = "Reconnecter les serveurs?";
"Reconnect servers?" = "Reconnecter les serveurs?";
/* No comment provided by engineer. */
"Record updated at" = "Enregistrement mis à jour le";
@@ -3162,7 +3156,7 @@
"Renegotiate encryption" = "Renégocier le chiffrement";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Renégocier le chiffrement?";
"Renegotiate encryption?" = "Renégocier le chiffrement?";
/* No comment provided by engineer. */
"Repeat connection request?" = "Répéter la demande de connexion ?";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "%@ débloqué";
/* item status description */
"Unexpected error: %@" = "Erreur inattendue: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "État de la migration inattendu";
@@ -4170,7 +4161,7 @@
"wants to connect to you!" = "veut établir une connexion !";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages";
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "Attention: démarrer une session de chat sur plusieurs appareils n'est pas pris en charge et entraînera des dysfonctionnements au niveau de la transmission des messages";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "Attention : vous risquez de perdre des données !";
+52 -61
View File
@@ -345,7 +345,7 @@
"Accept" = "Elfogadás";
/* No comment provided by engineer. */
"Accept connection request?" = "Kapcsolatfelvétel elfogadása?";
"Accept connection request?" = "Kapcsolódási kérelem elfogadása?";
/* notification body */
"Accept contact request from %@?" = "Elfogadja %@ kapcsolat kérését?";
@@ -444,16 +444,16 @@
"Allow" = "Engedélyezés";
/* No comment provided by engineer. */
"Allow calls only if your contact allows them." = "Hívások engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.";
"Allow calls only if your contact allows them." = "A hívások kezdeményezése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.";
/* No comment provided by engineer. */
"Allow disappearing messages only if your contact allows it to you." = "Eltűnő üzenetek engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi az ön számára.";
"Allow disappearing messages only if your contact allows it to you." = "Az eltűnő üzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi az ön számára.";
/* No comment provided by engineer. */
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Üzenet végleges törlésének engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi. (24 óra)";
"Allow irreversible message deletion only if your contact allows it to you. (24 hours)" = "Az üzenetek végleges törlése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi. (24 óra)";
/* No comment provided by engineer. */
"Allow message reactions only if your contact allows them." = "Üzenetreakciók engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.";
"Allow message reactions only if your contact allows them." = "Az üzenetreakciók küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.";
/* No comment provided by engineer. */
"Allow message reactions." = "Üzenetreakciók engedélyezése.";
@@ -462,7 +462,7 @@
"Allow sending direct messages to members." = "Közvetlen üzenetek küldésének engedélyezése a tagok számára.";
/* No comment provided by engineer. */
"Allow sending disappearing messages." = "Eltűnő üzenetek küldésének engedélyezése.";
"Allow sending disappearing messages." = "Az eltűnő üzenetek küldése engedélyezve van.";
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages. (24 hours)" = "Elküldött üzenetek végleges törlésének engedélyezése. (24 óra)";
@@ -477,25 +477,25 @@
"Allow to send voice messages." = "Hangüzenetek küldésének engedélyezése.";
/* No comment provided by engineer. */
"Allow voice messages only if your contact allows them." = "Hangüzenetek küldésének engedélyezése kizárólag abban az esetben, ha ismerőse is engedélyezi.";
"Allow voice messages only if your contact allows them." = "A hangüzenetek küldése kizárólag abban az esetben van engedélyezve, ha az ismerőse is engedélyezi.";
/* No comment provided by engineer. */
"Allow voice messages?" = "Hangüzenetek engedélyezése?";
/* No comment provided by engineer. */
"Allow your contacts adding message reactions." = "Ismerősök általi üzenetreakciók hozzáadásának engedélyezése.";
"Allow your contacts adding message reactions." = "Az üzenetreakciók küldése engedélyezve van az ismerősei számára.";
/* No comment provided by engineer. */
"Allow your contacts to call you." = "Hívások engedélyezése ismerősök számára.";
"Allow your contacts to call you." = "A hívások kezdeményezése engedélyezve van az ismerősei számára.";
/* No comment provided by engineer. */
"Allow your contacts to irreversibly delete sent messages. (24 hours)" = "Elküldött üzenetek végleges törlésének engedélyezése az ismerősök számára. (24 óra)";
"Allow your contacts to irreversibly delete sent messages. (24 hours)" = "Az elküldött üzenetek végleges törlése engedélyezve van az ismerősei számára. (24 óra)";
/* No comment provided by engineer. */
"Allow your contacts to send disappearing messages." = "Eltűnő üzenetek engedélyezése ismerősök számára.";
"Allow your contacts to send disappearing messages." = "Az eltűnő üzenetek küldésének engedélyezése az ismerősei számára.";
/* No comment provided by engineer. */
"Allow your contacts to send voice messages." = "Hangüzenetek küldésének engedélyezése ismerősök számára.";
"Allow your contacts to send voice messages." = "A hangüzenetek küldése engedélyezve van az ismerősei számára.";
/* No comment provided by engineer. */
"Already connected?" = "Már kapcsolódott?";
@@ -573,10 +573,10 @@
"Audio/video calls" = "Hang-/videóhívások";
/* No comment provided by engineer. */
"Audio/video calls are prohibited." = "A hang- és videóhívások le vannak tiltva.";
"Audio/video calls are prohibited." = "A hívások kezdeményezése le van tiltva ebben a csevegésben.";
/* PIN entry */
"Authentication cancelled" = "Hitelesítés megszakítva";
"Authentication cancelled" = "Hitelesítés visszavonva";
/* No comment provided by engineer. */
"Authentication failed" = "Sikertelen hitelesítés";
@@ -594,7 +594,7 @@
"Auto-accept" = "Automatikus elfogadás";
/* No comment provided by engineer. */
"Auto-accept contact requests" = "Ismerős jelölések automatikus elfogadása";
"Auto-accept contact requests" = "Kapcsolódási kérelmek automatikus elfogadása";
/* No comment provided by engineer. */
"Auto-accept images" = "Fotók automatikus elfogadása";
@@ -636,7 +636,7 @@
"Block member" = "Tag blokkolása";
/* No comment provided by engineer. */
"Block member for all?" = "Tag letiltása mindenki számára?";
"Block member for all?" = "Mindenki számára letiltja ezt a tagot?";
/* No comment provided by engineer. */
"Block member?" = "Tag blokkolása?";
@@ -663,7 +663,7 @@
"Both you and your contact can irreversibly delete sent messages. (24 hours)" = "Mindkét fél törölheti véglegesen az elküldött üzeneteket. (24 óra)";
/* No comment provided by engineer. */
"Both you and your contact can make calls." = "Mindkét fél tud hívásokat indítani.";
"Both you and your contact can make calls." = "Mindkét fél tud hívásokat kezdeményezni.";
/* No comment provided by engineer. */
"Both you and your contact can send disappearing messages." = "Mindkét fél küldhet eltűnő üzeneteket.";
@@ -708,7 +708,7 @@
"Cancel migration" = "Átköltöztetés visszavonása";
/* feature offered item */
"cancelled %@" = "%@ törölve";
"cancelled %@" = "%@ visszavonva";
/* No comment provided by engineer. */
"Cannot access keychain to save database password" = "Nem lehet hozzáférni a kulcstartóhoz az adatbázis jelszavának mentéséhez";
@@ -1006,7 +1006,7 @@
"Contacts" = "Ismerősök";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Az ismerősök törlésre jelölhetnek üzeneteket ; megtekintheti őket.";
"Contacts can mark messages for deletion; you will be able to view them." = "Az ismerősei törlésre jelölhetnek üzeneteket; ön majd meg tudja nézni azokat.";
/* No comment provided by engineer. */
"Continue" = "Folytatás";
@@ -1075,7 +1075,7 @@
"Creating link…" = "Hivatkozás létrehozása…";
/* No comment provided by engineer. */
"creator" = "szerző";
"creator" = "készítő";
/* No comment provided by engineer. */
"Current Passcode" = "Jelenlegi jelkód";
@@ -1183,7 +1183,7 @@
"Delete address?" = "Azonosító törlése?";
/* No comment provided by engineer. */
"Delete after" = "Törlés miután";
"Delete after" = "Törlés ennyi idő után";
/* No comment provided by engineer. */
"Delete all files" = "Minden fájl törlése";
@@ -1261,7 +1261,7 @@
"Delete messages" = "Üzenetek törlése";
/* No comment provided by engineer. */
"Delete messages after" = "Üzenetek törlése miután";
"Delete messages after" = "Üzenetek törlése ennyi idő után";
/* No comment provided by engineer. */
"Delete old database" = "Régi adatbázis törlése";
@@ -1348,7 +1348,7 @@
"Direct messages" = "Közvetlen üzenetek";
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "Ebben a csoportban tiltott a tagok közötti közvetlen üzenetek küldése.";
"Direct messages between members are prohibited in this group." = "A közvetlen üzenetek küldése a tagok között le van tiltva ebben a csoportban.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Letiltás (felülírások megtartásával)";
@@ -1369,7 +1369,7 @@
"Disappearing messages" = "Eltűnő üzenetek";
/* No comment provided by engineer. */
"Disappearing messages are prohibited in this chat." = "Az eltűnő üzenetek le vannak tiltva ebben a csevegésben.";
"Disappearing messages are prohibited in this chat." = "Az eltűnő üzenetek küldése le van tiltva ebben a csevegésben.";
/* No comment provided by engineer. */
"Disappearing messages are prohibited in this group." = "Az eltűnő üzenetek küldése le van tiltva ebben a csoportban.";
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Hiba: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Hiba: %@";
/* No comment provided by engineer. */
@@ -2077,7 +2077,7 @@
"If you enter this passcode when opening the app, all app data will be irreversibly removed!" = "Ha az alkalmazás megnyitásakor megadja ezt a jelkódot, az összes alkalmazásadat véglegesen törlődik!";
/* No comment provided by engineer. */
"If you enter your self-destruct passcode while opening the app:" = "Ha az alkalmazás megnyitásakor az önmegsemmisítő jelkódot megadásra kerül:";
"If you enter your self-destruct passcode while opening the app:" = "Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő jelkódot:";
/* No comment provided by engineer. */
"If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." = "Ha most kell használnia a csevegést, koppintson a ** Csináld később** elemre (az alkalmazás újraindításakor felajánlásra kerül az adatbázis áttelepítése).";
@@ -2245,16 +2245,16 @@
"Invite to group" = "Meghívás a csoportba";
/* No comment provided by engineer. */
"invited" = "meghívta";
"invited" = "meghíva";
/* rcv group event chat item */
"invited %@" = "meghívta %@-t";
"invited %@" = "meghívta őt: %@";
/* chat list item title */
"invited to connect" = "meghívta, hogy csatlakozzon";
/* rcv group event chat item */
"invited via your group link" = "meghívta a csoport hivatkozásán keresztül";
"invited via your group link" = "meghíva az ön csoport hivatkozásán keresztül";
/* No comment provided by engineer. */
"iOS Keychain is used to securely store passphrase - it allows receiving push notifications." = "Az iOS kulcstár a jelmondat biztonságos tárolására szolgál - lehetővé teszi a push-értesítések fogadását.";
@@ -2266,10 +2266,10 @@
"Irreversible message deletion" = "Végleges üzenettörlés";
/* No comment provided by engineer. */
"Irreversible message deletion is prohibited in this chat." = "Ebben a csevegésben az üzenetek végleges törlése le van tiltva.";
"Irreversible message deletion is prohibited in this chat." = "Az üzenetek végleges törlése le van tiltva ebben a csevegésben.";
/* No comment provided by engineer. */
"Irreversible message deletion is prohibited in this group." = "Ebben a csoportban az üzenetek végleges törlése le van tiltva.";
"Irreversible message deletion is prohibited in this group." = "Az üzenetek végleges törlése le van tiltva ebben a csoportban.";
/* No comment provided by engineer. */
"It allows having many anonymous connections without any shared data between them in a single chat profile." = "Lehetővé teszi, hogy egyetlen csevegőprofilon belül több anonim kapcsolat legyen, anélkül, hogy megosztott adatok lennének közöttük.";
@@ -2344,7 +2344,7 @@
"Learn more" = "Tudjon meg többet";
/* No comment provided by engineer. */
"Leave" = "Elhagy";
"Leave" = "Elhagyás";
/* No comment provided by engineer. */
"Leave group" = "Csoport elhagyása";
@@ -2419,10 +2419,10 @@
"Mark deleted for everyone" = "Jelölje meg mindenki számára töröltként";
/* No comment provided by engineer. */
"Mark read" = "Megjelölés olvasottként";
"Mark read" = "Olvasottként jelölés";
/* No comment provided by engineer. */
"Mark verified" = "Ellenőrzöttként jelölve";
"Mark verified" = "Hitelesítés";
/* No comment provided by engineer. */
"Markdown in messages" = "Markdown az üzenetekben";
@@ -2467,10 +2467,10 @@
"Message reactions" = "Üzenetreakciók";
/* No comment provided by engineer. */
"Message reactions are prohibited in this chat." = "Az üzenetreakciók ebben a csevegésben le vannak tiltva.";
"Message reactions are prohibited in this chat." = "Az üzenetreakciók küldése le van tiltva ebben a csevegésben.";
/* No comment provided by engineer. */
"Message reactions are prohibited in this group." = "Ebben a csoportban az üzenetreakciók le vannak tiltva.";
"Message reactions are prohibited in this group." = "Az üzenetreakciók küldése le van tiltva ebben a csoportban.";
/* notification */
"message received" = "üzenet érkezett";
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Valószínűleg ez a kapcsolat törlésre került.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Valószínűleg ez az ismerős törölte önnel a kapcsolatot.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Több csevegőprofil";
@@ -2775,7 +2772,7 @@
"Only your contact can make calls." = "Csak az ismerős tud hívást indítani.";
/* No comment provided by engineer. */
"Only your contact can send disappearing messages." = "Csak az ismerős tud eltűnő üzeneteket küldeni.";
"Only your contact can send disappearing messages." = "Csak az ismerőse tud eltűnő üzeneteket küldeni.";
/* No comment provided by engineer. */
"Only your contact can send voice messages." = "Csak az ismerős tud hangüzeneteket küldeni.";
@@ -2976,22 +2973,22 @@
"Profile update will be sent to your contacts." = "A profilfrissítés elküldésre került az ismerősök számára.";
/* No comment provided by engineer. */
"Prohibit audio/video calls." = "Hang- és videóhívások tiltása.";
"Prohibit audio/video calls." = "A hívások kezdeményezése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit irreversible message deletion." = "Az üzenetek véglegesen való törlése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit message reactions." = "Üzenetreakciók tiltása.";
"Prohibit message reactions." = "Az üzenetreakciók küldése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit messages reactions." = "Az üzenetreakciók tiltása.";
/* No comment provided by engineer. */
"Prohibit sending direct messages to members." = "Közvetlen üzenetek küldésének letiltása a tagok számára.";
"Prohibit sending direct messages to members." = "A közvetlen üzenetek küldése le van tiltva a tagok között.";
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Eltűnő üzenetek küldésének letiltása.";
"Prohibit sending disappearing messages." = "Az eltűnő üzenetek küldése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Fájlok- és a médiatartalom küldés letiltása.";
@@ -3000,7 +2997,7 @@
"Prohibit sending SimpleX links." = "A SimpleX hivatkozások küldése le van tiltva.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Hangüzenetek küldésének letiltása.";
"Prohibit sending voice messages." = "A hangüzenetek küldése le van tiltva.";
/* No comment provided by engineer. */
"Protect app screen" = "Alkalmazás képernyőjének védelme";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "A fogadó cím egy másik kiszolgálóra változik. A címváltoztatás a feladó online állapotba kerülése után fejeződik be.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Egyidejű fogadás";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "A fájl fogadása leállt.";
@@ -3132,10 +3126,10 @@
"Remove" = "Eltávolítás";
/* No comment provided by engineer. */
"Remove member" = "Tag eltávolítása";
"Remove member" = "Eltávolítás";
/* No comment provided by engineer. */
"Remove member?" = "Tag eltávolítása?";
"Remove member?" = "Biztosan eltávolítja?";
/* No comment provided by engineer. */
"Remove passphrase from keychain?" = "Jelmondat eltávolítása a kulcstárolóból?";
@@ -3306,7 +3300,7 @@
"Saved WebRTC ICE servers will be removed" = "A mentett WebRTC ICE kiszolgálók eltávolításra kerülnek";
/* No comment provided by engineer. */
"Scan code" = "Kód beolvasása";
"Scan code" = "Beolvasás";
/* No comment provided by engineer. */
"Scan QR code" = "QR-kód beolvasása";
@@ -3411,7 +3405,7 @@
"Send up to 100 last messages to new members." = "Az utolsó 100 üzenet elküldése az új tagoknak.";
/* No comment provided by engineer. */
"Sender cancelled file transfer." = "A küldő megszakította a fájl átvitelt.";
"Sender cancelled file transfer." = "A fájl küldője visszavonta az átvitelt.";
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "A küldő törölhette a kapcsolódási kérelmet.";
@@ -3570,7 +3564,7 @@
"SimpleX links" = "SimpleX hivatkozások";
/* No comment provided by engineer. */
"SimpleX links are prohibited in this group." = "A SimpleX hivatkozások küldése ebben a csoportban le van tiltva.";
"SimpleX links are prohibited in this group." = "A SimpleX hivatkozások küldése le van tiltva ebben a csoportban.";
/* No comment provided by engineer. */
"SimpleX links not allowed" = "A SimpleX hivatkozások küldése le van tiltva";
@@ -3753,7 +3747,7 @@
"The code you scanned is not a SimpleX link QR code." = "A beolvasott kód nem egy SimpleX hivatkozás QR-kód.";
/* No comment provided by engineer. */
"The connection you accepted will be cancelled!" = "Az ön által elfogadott kapcsolat megszakad!";
"The connection you accepted will be cancelled!" = "Az ön által elfogadott kapcsolat vissza lesz vonva!";
/* No comment provided by engineer. */
"The contact you shared this link with will NOT be able to connect!" = "Ismerőse, akivel megosztotta ezt a hivatkozást, NEM fog tudni kapcsolódni!";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "%@ feloldva";
/* item status description */
"Unexpected error: %@" = "Váratlan hiba: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Váratlan átköltöztetési állapot";
@@ -3999,7 +3990,7 @@
"Update transport isolation mode?" = "Kapcsolat izolációs mód frissítése?";
/* rcv group event chat item */
"updated group profile" = "módosított csoport profil";
"updated group profile" = "frissítette a csoport profilját";
/* profile update event chat item */
"updated profile" = "frissített profil";
@@ -4137,7 +4128,7 @@
"Voice messages" = "Hangüzenetek";
/* No comment provided by engineer. */
"Voice messages are prohibited in this chat." = "A hangüzenetek le vannak tiltva ebben a csevegésben.";
"Voice messages are prohibited in this chat." = "A hangüzenetek küldése le van tiltva ebben a csevegésben.";
/* No comment provided by engineer. */
"Voice messages are prohibited in this group." = "A hangüzenetek küldése le van tiltva ebben a csoportban.";
@@ -4149,7 +4140,7 @@
"Voice messages prohibited!" = "A hangüzenetek le vannak tilva!";
/* No comment provided by engineer. */
"waiting for answer…" = "várakozás válaszra…";
"waiting for answer…" = "várakozás a válaszra…";
/* No comment provided by engineer. */
"waiting for confirmation…" = "várakozás a visszaigazolásra…";
@@ -4461,7 +4452,7 @@
"Your chat profiles" = "Csevegési profiljai";
/* No comment provided by engineer. */
"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Az ismerősnek online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.\nMegszakíthatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).";
"Your contact needs to be online for the connection to complete.\nYou can cancel this connection and remove the contact (and try later with a new link)." = "Az ismerősének online kell lennie ahhoz, hogy a kapcsolat létrejöjjön.\nVisszavonhatja ezt a kapcsolatfelvételt és törölheti az ismerőst (ezt később ismét megpróbálhatja egy új hivatkozással).";
/* No comment provided by engineer. */
"Your contact sent a file that is larger than currently supported maximum size (%@)." = "Ismerőse olyan fájlt küldött, amely meghaladja a jelenleg támogatott maximális méretet (%@).";
+1 -10
View File
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Errore: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Errore: %@";
/* No comment provided by engineer. */
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Probabilmente questa connessione è stata eliminata.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Probabilmente questo contatto ha eliminato la connessione con te.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Profili di chat multipli";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "L'indirizzo di ricezione verrà cambiato in un server diverso. La modifica dell'indirizzo verrà completata dopo che il mittente sarà in linea.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Ricezione concomitanza";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "La ricezione del file verrà interrotta.";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "ha sbloccato %@";
/* item status description */
"Unexpected error: %@" = "Errore imprevisto: % @";
/* No comment provided by engineer. */
"Unexpected migration state" = "Stato di migrazione imprevisto";
+1 -7
View File
@@ -1509,7 +1509,7 @@
/* No comment provided by engineer. */
"Error: " = "エラー : ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "エラー : %@";
/* No comment provided by engineer. */
@@ -2130,9 +2130,6 @@
/* item status description */
"Most likely this connection is deleted." = "おそらく、この接続は削除されています。";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "恐らくこの連絡先があなたとの接続を削除しました。";
/* No comment provided by engineer. */
"Multiple chat profiles" = "複数チャットのプロフィール";
@@ -3191,9 +3188,6 @@
/* No comment provided by engineer. */
"Unable to record voice message" = "音声メッセージを録音できません";
/* item status description */
"Unexpected error: %@" = "予期しないエラー: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "予期しない移行状態";
+1 -10
View File
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Fout: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Fout: %@";
/* No comment provided by engineer. */
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Hoogstwaarschijnlijk is deze verbinding verwijderd.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Hoogstwaarschijnlijk heeft dit contact de verbinding met jou verwijderd.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Meerdere chat profielen";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Het ontvangstadres wordt gewijzigd naar een andere server. Adres wijziging wordt voltooid nadat de afzender online is.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Gelijktijdig ontvangen";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Het ontvangen van het bestand wordt gestopt.";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "gedeblokkeerd %@";
/* item status description */
"Unexpected error: %@" = "Onverwachte fout: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Onverwachte migratiestatus";
+1 -10
View File
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Błąd: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Błąd: %@";
/* No comment provided by engineer. */
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Najprawdopodobniej to połączenie jest usunięte.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Najprawdopodobniej ten kontakt usunął połączenie z Tobą.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Wiele profili czatu";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Adres odbiorczy zostanie zmieniony na inny serwer. Zmiana adresu zostanie zakończona gdy nadawca będzie online.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Konkurencyjne odbieranie";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Odbieranie pliku zostanie przerwane.";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "odblokowano %@";
/* item status description */
"Unexpected error: %@" = "Nieoczekiwany błąd: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Nieoczekiwany stan migracji";
+1 -10
View File
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Ошибка: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Ошибка: %@";
/* No comment provided by engineer. */
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Скорее всего, соединение удалено.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Скорее всего, этот контакт удалил соединение с Вами.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Много профилей чата";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Адрес получения сообщений будет перемещён на другой сервер. Изменение адреса завершится после того как отправитель будет онлайн.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Одновременный приём";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Приём файла будет прекращён.";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "%@ разблокирован";
/* item status description */
"Unexpected error: %@" = "Неожиданная ошибка: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Неожиданная ошибка при перемещении данных чата";
+1 -7
View File
@@ -1386,7 +1386,7 @@
/* No comment provided by engineer. */
"Error: " = "ผิดพลาด: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "ข้อผิดพลาด: % @";
/* No comment provided by engineer. */
@@ -1998,9 +1998,6 @@
/* No comment provided by engineer. */
"More improvements are coming soon!" = "การปรับปรุงเพิ่มเติมกำลังจะมาเร็ว ๆ นี้!";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "เป็นไปได้มากว่าผู้ติดต่อนี้ได้ลบการเชื่อมต่อกับคุณ";
/* No comment provided by engineer. */
"Multiple chat profiles" = "โปรไฟล์การแชทหลายรายการ";
@@ -3050,9 +3047,6 @@
/* No comment provided by engineer. */
"Unable to record voice message" = "ไม่สามารถบันทึกข้อความเสียง";
/* item status description */
"Unexpected error: %@" = "ข้อผิดพลาดที่ไม่คาดคิด: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "สถานะการย้ายข้อมูลที่ไม่คาดคิด";
+1 -10
View File
@@ -1779,7 +1779,7 @@
/* No comment provided by engineer. */
"Error: " = "Hata: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Hata: %@";
/* No comment provided by engineer. */
@@ -2568,9 +2568,6 @@
/* item status description */
"Most likely this connection is deleted." = "Büyük ihtimalle bu bağlantı silinmiş.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Büyük ihtimalle bu kişi seninle bağlantını sildi.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Çoklu sohbet profili";
@@ -3077,9 +3074,6 @@
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Alıcı adresi farklı bir sunucuya değiştirilecektir. Gönderici çevrimiçi olduktan sonra adres değişikliği tamamlanacaktır.";
/* No comment provided by engineer. */
"Receiving concurrency" = "Eşzamanlılık alınıyor";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Dosya alımı durdurulacaktır.";
@@ -3920,9 +3914,6 @@
/* rcv group event chat item */
"unblocked %@" = "engeli kaldırıldı %@";
/* item status description */
"Unexpected error: %@" = "Beklenmeyen hata: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Beklenmeyen geçiş durumu";
+1 -7
View File
@@ -1761,7 +1761,7 @@
/* No comment provided by engineer. */
"Error: " = "Помилка: ";
/* No comment provided by engineer. */
/* snd error text */
"Error: %@" = "Помилка: %@";
/* No comment provided by engineer. */
@@ -2520,9 +2520,6 @@
/* item status description */
"Most likely this connection is deleted." = "Швидше за все, це з'єднання видалено.";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "Швидше за все, цей контакт видалив зв'язок з вами.";
/* No comment provided by engineer. */
"Multiple chat profiles" = "Кілька профілів чату";
@@ -3821,9 +3818,6 @@
/* rcv group event chat item */
"unblocked %@" = "розблоковано %@";
/* item status description */
"Unexpected error: %@" = "Неочікувана помилка: %@";
/* No comment provided by engineer. */
"Unexpected migration state" = "Неочікуваний стан міграції";
+298 -7
View File
@@ -353,6 +353,12 @@
/* member role */
"admin" = "管理员";
/* feature role */
"admins" = "管理员";
/* No comment provided by engineer. */
"Admins can block a member for all." = "管理员可以为所有人封禁一名成员。";
/* No comment provided by engineer. */
"Admins can create the links to join groups." = "管理员可以创建链接以加入群组。";
@@ -377,6 +383,9 @@
/* No comment provided by engineer. */
"All group members will remain connected." = "所有群组成员将保持连接。";
/* feature role */
"all members" = "所有成员";
/* No comment provided by engineer. */
"All messages will be deleted - this cannot be undone!" = "所有消息都将被删除 - 这无法被撤销!";
@@ -389,6 +398,9 @@
/* No comment provided by engineer. */
"All your contacts will remain connected. Profile update will be sent to your contacts." = "您的所有联系人将保持连接。个人资料更新将发送给您的联系人。";
/* No comment provided by engineer. */
"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "你的所有联系人、对话和文件将被安全加密并分块上传到配置的 XFTP 中继。";
/* No comment provided by engineer. */
"Allow" = "允许";
@@ -419,6 +431,9 @@
/* No comment provided by engineer. */
"Allow to send files and media." = "允许发送文件和媒体。";
/* No comment provided by engineer. */
"Allow to send SimpleX links." = "允许发送 SimpleX 链接。";
/* No comment provided by engineer. */
"Allow to send voice messages." = "允许发送语音消息。";
@@ -467,6 +482,9 @@
/* No comment provided by engineer. */
"App build: %@" = "应用程序构建:%@";
/* No comment provided by engineer. */
"App data migration" = "应用数据迁移";
/* No comment provided by engineer. */
"App encrypts new local files (except videos)." = "应用程序为新的本地文件(视频除外)加密。";
@@ -488,6 +506,15 @@
/* No comment provided by engineer. */
"Appearance" = "外观";
/* No comment provided by engineer. */
"Apply" = "应用";
/* No comment provided by engineer. */
"Archive and upload" = "存档和上传";
/* No comment provided by engineer. */
"Archiving database" = "正在存档数据库";
/* No comment provided by engineer. */
"Attach" = "附件";
@@ -635,6 +662,9 @@
/* No comment provided by engineer. */
"Cancel" = "取消";
/* No comment provided by engineer. */
"Cancel migration" = "取消迁移";
/* feature offered item */
"cancelled %@" = "已取消 %@";
@@ -644,6 +674,9 @@
/* No comment provided by engineer. */
"Cannot receive file" = "无法接收文件";
/* No comment provided by engineer. */
"Cellular" = "移动网络";
/* No comment provided by engineer. */
"Change" = "更改";
@@ -714,6 +747,9 @@
/* No comment provided by engineer. */
"Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat." = "聊天已停止。如果你已经在另一台设备商使用过此数据库,你应该在启动聊天前将数据库传输回来。";
/* No comment provided by engineer. */
"Chat migrated!" = "已迁移聊天!";
/* No comment provided by engineer. */
"Chat preferences" = "聊天偏好设置";
@@ -771,6 +807,9 @@
/* No comment provided by engineer. */
"Confirm database upgrades" = "确认数据库升级";
/* No comment provided by engineer. */
"Confirm network settings" = "确认网络设置";
/* No comment provided by engineer. */
"Confirm new passphrase…" = "确认新密码……";
@@ -780,6 +819,12 @@
/* No comment provided by engineer. */
"Confirm password" = "确认密码";
/* No comment provided by engineer. */
"Confirm that you remember database passphrase to migrate it." = "请在迁移前确认你记得数据库的密码短语。";
/* No comment provided by engineer. */
"Confirm upload" = "确认上传";
/* server test step */
"Connect" = "连接";
@@ -957,6 +1002,9 @@
/* No comment provided by engineer. */
"Created on %@" = "创建于 %@";
/* No comment provided by engineer. */
"Creating archive link" = "正在创建存档链接";
/* No comment provided by engineer. */
"Creating link…" = "创建链接中…";
@@ -1098,6 +1146,9 @@
/* No comment provided by engineer. */
"Delete database" = "删除数据库";
/* No comment provided by engineer. */
"Delete database from this device" = "从这部设备上删除数据库";
/* server test step */
"Delete file" = "删除文件";
@@ -1287,9 +1338,21 @@
/* No comment provided by engineer. */
"Downgrade and open chat" = "降级并打开聊天";
/* chat item action */
"Download" = "下载";
/* No comment provided by engineer. */
"Download failed" = "下载失败了";
/* server test step */
"Download file" = "下载文件";
/* No comment provided by engineer. */
"Downloading archive" = "正在下载存档";
/* No comment provided by engineer. */
"Downloading link details" = "正在下载链接详情";
/* No comment provided by engineer. */
"Duplicate display name!" = "重复的显示名!";
@@ -1323,6 +1386,9 @@
/* No comment provided by engineer. */
"Enable for all" = "全部启用";
/* No comment provided by engineer. */
"Enable in direct chats (BETA)!" = "在私聊中开启(公测)!";
/* No comment provided by engineer. */
"Enable instant notifications?" = "启用即时通知?";
@@ -1350,6 +1416,9 @@
/* enabled status */
"enabled" = "已启用";
/* No comment provided by engineer. */
"Enabled for" = "启用对象";
/* enabled status */
"enabled for contact" = "已为联系人启用";
@@ -1431,6 +1500,9 @@
/* No comment provided by engineer. */
"Enter Passcode" = "输入密码";
/* No comment provided by engineer. */
"Enter passphrase" = "输入密码短语";
/* No comment provided by engineer. */
"Enter passphrase…" = "输入密码……";
@@ -1521,6 +1593,9 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "删除用户资料错误";
/* No comment provided by engineer. */
"Error downloading the archive" = "下载存档出错";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "启用送达回执出错!";
@@ -1563,6 +1638,9 @@
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "保存密码到钥匙串错误";
/* when migrating */
"Error saving settings" = "保存设置出错";
/* No comment provided by engineer. */
"Error saving user password" = "保存用户密码时出错";
@@ -1603,9 +1681,15 @@
"Error updating user privacy" = "更新用户隐私时出错";
/* No comment provided by engineer. */
"Error: " = "错误: ";
"Error uploading the archive" = "上传存档出错";
/* No comment provided by engineer. */
"Error verifying passphrase:" = "验证密码短语出错:";
/* No comment provided by engineer. */
"Error: " = "错误: ";
/* snd error text */
"Error: %@" = "错误: @";
/* No comment provided by engineer. */
@@ -1635,6 +1719,9 @@
/* No comment provided by engineer. */
"Exported database archive." = "导出数据库归档。";
/* No comment provided by engineer. */
"Exported file doesn't exist" = "导出的文件不存在";
/* No comment provided by engineer. */
"Exporting database archive…" = "导出数据库档案中…";
@@ -1671,12 +1758,21 @@
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "此群组中禁止文件和媒体。";
/* No comment provided by engineer. */
"Files and media not allowed" = "不允许文件和媒体";
/* No comment provided by engineer. */
"Files and media prohibited!" = "禁止文件和媒体!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "过滤未读和收藏的聊天记录。";
/* No comment provided by engineer. */
"Finalize migration" = "完成迁移";
/* No comment provided by engineer. */
"Finalize migration on another device." = "在另一部设备上完成迁移";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "终于我们有它们了! 🚀";
@@ -1704,6 +1800,21 @@
/* No comment provided by engineer. */
"For console" = "用于控制台";
/* chat item action */
"Forward" = "转发";
/* No comment provided by engineer. */
"Forward and save messages" = "转发并保存消息";
/* No comment provided by engineer. */
"forwarded" = "已转发";
/* No comment provided by engineer. */
"Forwarded" = "已转发";
/* No comment provided by engineer. */
"Forwarded from" = "转发自";
/* No comment provided by engineer. */
"Found desktop" = "找到了桌面";
@@ -1779,6 +1890,9 @@
/* No comment provided by engineer. */
"Group members can send files and media." = "群组成员可以发送文件和媒体。";
/* No comment provided by engineer. */
"Group members can send SimpleX links." = "群成员可发送 SimpleX 链接。";
/* No comment provided by engineer. */
"Group members can send voice messages." = "群组成员可以发送语音消息。";
@@ -1896,6 +2010,12 @@
/* No comment provided by engineer. */
"Import database" = "导入数据库";
/* No comment provided by engineer. */
"Import failed" = "导入失败了";
/* No comment provided by engineer. */
"Importing archive" = "正在导入存档";
/* No comment provided by engineer. */
"Improved message delivery" = "改进了消息传递";
@@ -1905,9 +2025,15 @@
/* No comment provided by engineer. */
"Improved server configuration" = "改进的服务器配置";
/* No comment provided by engineer. */
"In order to continue, chat should be stopped." = "必须停止聊天才能继续。";
/* No comment provided by engineer. */
"In reply to" = "答复";
/* No comment provided by engineer. */
"In-call sounds" = "通话声音";
/* No comment provided by engineer. */
"Incognito" = "隐身聊天";
@@ -1986,6 +2112,12 @@
/* No comment provided by engineer. */
"Invalid display name!" = "无效的显示名!";
/* No comment provided by engineer. */
"Invalid link" = "无效链接";
/* No comment provided by engineer. */
"Invalid migration confirmation" = "迁移确认无效";
/* No comment provided by engineer. */
"Invalid name!" = "无效名称!";
@@ -2232,18 +2364,45 @@
/* notification */
"message received" = "消息已收到";
/* No comment provided by engineer. */
"Message source remains private." = "消息来源保持私密。";
/* No comment provided by engineer. */
"Message text" = "消息正文";
/* No comment provided by engineer. */
"Message too large" = "消息太大了";
/* No comment provided by engineer. */
"Messages" = "消息";
/* No comment provided by engineer. */
"Messages & files" = "消息";
/* No comment provided by engineer. */
"Migrate device" = "迁移设备";
/* No comment provided by engineer. */
"Migrate from another device" = "从另一台设备迁移";
/* No comment provided by engineer. */
"Migrate here" = "迁移到此处";
/* No comment provided by engineer. */
"Migrate to another device" = "迁移到另一部设备";
/* No comment provided by engineer. */
"Migrate to another device via QR code." = "通过二维码迁移到另一部设备。";
/* No comment provided by engineer. */
"Migrating" = "迁移中";
/* No comment provided by engineer. */
"Migrating database archive…" = "迁移数据库档案中…";
/* No comment provided by engineer. */
"Migration complete" = "迁移完毕";
/* No comment provided by engineer. */
"Migration error:" = "迁移错误:";
@@ -2283,12 +2442,12 @@
/* No comment provided by engineer. */
"More improvements are coming soon!" = "更多改进即将推出!";
/* No comment provided by engineer. */
"More reliable network connection." = "更可靠的网络连接。";
/* item status description */
"Most likely this connection is deleted." = "此连接很可能已被删除。";
/* No comment provided by engineer. */
"Most likely this contact has deleted the connection with you." = "很可能此联系人已经删除了与您的联系。";
/* No comment provided by engineer. */
"Multiple chat profiles" = "多个聊天资料";
@@ -2304,6 +2463,12 @@
/* No comment provided by engineer. */
"Network & servers" = "网络和服务器";
/* No comment provided by engineer. */
"Network connection" = "网络连接";
/* No comment provided by engineer. */
"Network management" = "网络管理";
/* No comment provided by engineer. */
"Network settings" = "网络设置";
@@ -2382,6 +2547,9 @@
/* No comment provided by engineer. */
"No history" = "无历史记录";
/* No comment provided by engineer. */
"No network connection" = "无网络连接";
/* No comment provided by engineer. */
"No permission to record voice message" = "没有录制语音消息的权限";
@@ -2510,15 +2678,27 @@
/* No comment provided by engineer. */
"Open-source protocol and code anybody can run the servers." = "开源协议和代码——任何人都可以运行服务器。";
/* No comment provided by engineer. */
"Or paste archive link" = "或粘贴存档链接";
/* No comment provided by engineer. */
"Or scan QR code" = "或者扫描二维码";
/* No comment provided by engineer. */
"Or securely share this file link" = "或安全地分享此文件链接";
/* No comment provided by engineer. */
"Or show this code" = "或者显示此码";
/* No comment provided by engineer. */
"Other" = "其他";
/* member role */
"owner" = "群主";
/* feature role */
"owners" = "所有者";
/* No comment provided by engineer. */
"Passcode" = "密码";
@@ -2561,6 +2741,9 @@
/* message decrypt error item */
"Permanent decryption error" = "解密错误";
/* No comment provided by engineer. */
"Picture-in-picture calls" = "画中画通话";
/* No comment provided by engineer. */
"PING count" = "PING 次数";
@@ -2579,6 +2762,9 @@
/* No comment provided by engineer. */
"Please check yours and your contact preferences." = "请检查您和您的联系人偏好设置。";
/* No comment provided by engineer. */
"Please confirm that network settings are correct for this device." = "请确认网络设置对此这台设备正确无误。";
/* No comment provided by engineer. */
"Please contact group admin." = "请联系群组管理员。";
@@ -2639,6 +2825,9 @@
/* No comment provided by engineer. */
"Profile image" = "资料图片";
/* No comment provided by engineer. */
"Profile images" = "个人资料图";
/* No comment provided by engineer. */
"Profile name:" = "显示名:";
@@ -2687,6 +2876,12 @@
/* No comment provided by engineer. */
"Push notifications" = "推送通知";
/* chat item text */
"quantum resistant e2e encryption" = "抗量子端到端加密";
/* No comment provided by engineer. */
"Quantum resistant encryption" = "抗量子加密";
/* No comment provided by engineer. */
"Rate the app" = "评价此应用程序";
@@ -2744,6 +2939,9 @@
/* No comment provided by engineer. */
"Receiving via" = "接收通过";
/* No comment provided by engineer. */
"Recipient(s) can't see who this message is from." = "收件人看不到这条消息来自何人。";
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "对方会在您键入时看到更新。";
@@ -2819,9 +3017,18 @@
/* No comment provided by engineer. */
"Repeat connection request?" = "重复连接请求吗?";
/* No comment provided by engineer. */
"Repeat download" = "重复下载";
/* No comment provided by engineer. */
"Repeat import" = "重复导入";
/* No comment provided by engineer. */
"Repeat join request?" = "重复加入请求吗?";
/* No comment provided by engineer. */
"Repeat upload" = "重复上传";
/* chat item action */
"Reply" = "回复";
@@ -2879,6 +3086,9 @@
/* No comment provided by engineer. */
"Run chat" = "运行聊天程序";
/* No comment provided by engineer. */
"Safer groups" = "更安全的群组";
/* chat item action */
"Save" = "保存";
@@ -2927,6 +3137,15 @@
/* No comment provided by engineer. */
"Save welcome message?" = "保存欢迎信息?";
/* No comment provided by engineer. */
"saved" = "已保存";
/* No comment provided by engineer. */
"Saved" = "已保存";
/* No comment provided by engineer. */
"Saved from" = "保存自";
/* message info title */
"Saved message" = "已保存的消息";
@@ -3119,6 +3338,9 @@
/* No comment provided by engineer. */
"Set passcode" = "设置密码";
/* No comment provided by engineer. */
"Set passphrase" = "设置密码短语";
/* No comment provided by engineer. */
"Set passphrase to export" = "设置密码来导出";
@@ -3131,6 +3353,9 @@
/* No comment provided by engineer. */
"Settings" = "设置";
/* No comment provided by engineer. */
"Shape profile images" = "改变个人资料图形状";
/* chat item action */
"Share" = "分享";
@@ -3164,6 +3389,9 @@
/* No comment provided by engineer. */
"Show preview" = "显示预览";
/* No comment provided by engineer. */
"Show QR code" = "显示二维码";
/* No comment provided by engineer. */
"Show:" = "显示:";
@@ -3188,6 +3416,12 @@
/* chat feature */
"SimpleX links" = "SimpleX 链接";
/* No comment provided by engineer. */
"SimpleX links are prohibited in this group." = "此群禁止 SimpleX 链接。";
/* No comment provided by engineer. */
"SimpleX links not allowed" = "不允许SimpleX 链接";
/* No comment provided by engineer. */
"SimpleX Lock" = "SimpleX 锁定";
@@ -3224,6 +3458,12 @@
/* notification title */
"Somebody" = "某人";
/* No comment provided by engineer. */
"Square, circle, or anything in between." = "方形、圆形、或两者之间的任意形状";
/* chat item text */
"standard end-to-end encryption" = "标准端到端加密";
/* No comment provided by engineer. */
"Start chat" = "开始聊天";
@@ -3239,6 +3479,9 @@
/* No comment provided by engineer. */
"Stop" = "停止";
/* No comment provided by engineer. */
"Stop chat" = "停止聊天程序";
/* No comment provided by engineer. */
"Stop chat to enable database actions" = "停止聊天以启用数据库操作";
@@ -3266,6 +3509,9 @@
/* authentication reason */
"Stop SimpleX" = "停止 SimpleX";
/* No comment provided by engineer. */
"Stopping chat" = "正在停止聊天";
/* No comment provided by engineer. */
"strike" = "删去";
@@ -3416,6 +3662,12 @@
/* No comment provided by engineer. */
"This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost." = "此操作无法撤消——您的个人资料、联系人、消息和文件将不可撤回地丢失。";
/* E2EE info chat item */
"This chat is protected by end-to-end encryption." = "此聊天受端到端加密保护。";
/* E2EE info chat item */
"This chat is protected by quantum resistant end-to-end encryption." = "此聊天受抗量子的端到端加密保护。";
/* notification title */
"this contact" = "这个联系人";
@@ -3509,9 +3761,6 @@
/* No comment provided by engineer. */
"Unblock member?" = "解封成员吗?";
/* item status description */
"Unexpected error: %@" = "意外错误: @";
/* No comment provided by engineer. */
"Unexpected migration state" = "未预料的迁移状态";
@@ -3602,9 +3851,15 @@
/* No comment provided by engineer. */
"Upgrade and open chat" = "升级并打开聊天";
/* No comment provided by engineer. */
"Upload failed" = "上传失败了";
/* server test step */
"Upload file" = "上传文件";
/* No comment provided by engineer. */
"Uploading archive" = "正在上传存档";
/* No comment provided by engineer. */
"Use .onion hosts" = "使用 .onion 主机";
@@ -3632,6 +3887,9 @@
/* No comment provided by engineer. */
"Use SimpleX Chat servers?" = "使用 SimpleX Chat 服务器?";
/* No comment provided by engineer. */
"Use the app while in the call." = "通话时使用本应用";
/* No comment provided by engineer. */
"User profile" = "用户资料";
@@ -3656,6 +3914,12 @@
/* No comment provided by engineer. */
"Verify connections" = "验证连接";
/* No comment provided by engineer. */
"Verify database passphrase" = "验证数据库密码短语";
/* No comment provided by engineer. */
"Verify passphrase" = "验证密码短语";
/* No comment provided by engineer. */
"Verify security code" = "验证安全码";
@@ -3710,6 +3974,9 @@
/* No comment provided by engineer. */
"Voice messages are prohibited in this group." = "语音信息在该群组中被禁用。";
/* No comment provided by engineer. */
"Voice messages not allowed" = "不允许语音消息";
/* No comment provided by engineer. */
"Voice messages prohibited!" = "语音消息禁止发送!";
@@ -3731,6 +3998,9 @@
/* No comment provided by engineer. */
"wants to connect to you!" = "想要与您连接!";
/* No comment provided by engineer. */
"Warning: starting chat on multiple devices is not supported and will cause message delivery failures" = "警告:不支持在多部设备上启动聊天,这么做会导致消息传送失败。";
/* No comment provided by engineer. */
"Warning: you may lose some data!" = "警告:您可能会丢失部分数据!";
@@ -3746,18 +4016,33 @@
/* No comment provided by engineer. */
"Welcome message" = "欢迎消息";
/* No comment provided by engineer. */
"Welcome message is too long" = "欢迎消息太大了";
/* No comment provided by engineer. */
"What's new" = "更新内容";
/* No comment provided by engineer. */
"When available" = "当可用时";
/* No comment provided by engineer. */
"When connecting audio and video calls." = "连接音频和视频通话时。";
/* No comment provided by engineer. */
"When people request to connect, you can accept or reject it." = "当人们请求连接时,您可以接受或拒绝它。";
/* No comment provided by engineer. */
"When you share an incognito profile with somebody, this profile will be used for the groups they invite you to." = "当您与某人共享隐身聊天资料时,该资料将用于他们邀请您加入的群组。";
/* No comment provided by engineer. */
"WiFi" = "WiFi";
/* No comment provided by engineer. */
"Will be enabled in direct chats!" = "将在私聊中启用!";
/* No comment provided by engineer. */
"Wired ethernet" = "有线以太网";
/* No comment provided by engineer. */
"With encrypted files and media." = "加密的文件和媒体。";
@@ -3779,6 +4064,9 @@
/* pref value */
"yes" = "是";
/* No comment provided by engineer. */
"you" = "您";
/* No comment provided by engineer. */
"You" = "您";
@@ -3824,6 +4112,9 @@
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "您可以稍后通过应用程序的 \"隐私与安全 \"设置启用它们。";
/* No comment provided by engineer. */
"You can give another try." = "你可以再试一次。";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "您可以隐藏或静音用户个人资料——只需向右滑动。";
@@ -7,7 +7,7 @@ import chat.simplex.app.SimplexService.Companion.showPassphraseNotification
import chat.simplex.common.model.ChatController
import chat.simplex.common.views.helpers.DBMigrationResult
import chat.simplex.common.platform.chatModel
import chat.simplex.common.platform.initChatControllerAndRunMigrations
import chat.simplex.common.platform.initChatControllerOnStart
import chat.simplex.common.views.helpers.DatabaseUtils
import kotlinx.coroutines.*
import java.util.Date
@@ -60,7 +60,7 @@ class MessagesFetcherWork(
try {
// In case of self-destruct is enabled the initialization process will not start in SimplexApp, Let's start it here
if (DatabaseUtils.ksSelfDestructPassword.get() != null && chatModel.chatDbStatus.value == null) {
initChatControllerAndRunMigrations()
initChatControllerOnStart()
}
withTimeout(durationSeconds * 1000L) {
val chatController = ChatController
@@ -6,7 +6,6 @@ import android.content.Context
import chat.simplex.common.platform.Log
import android.content.Intent
import android.content.pm.ActivityInfo
import android.media.AudioManager
import android.os.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
@@ -66,6 +65,7 @@ class SimplexApp: Application(), LifecycleEventObserver {
context = this
initHaskell()
initMultiplatform()
runMigrations()
tmpDir.deleteRecursively()
tmpDir.mkdir()
@@ -74,7 +74,7 @@ class SimplexApp: Application(), LifecycleEventObserver {
// It's important, otherwise, user may be locked in undefined state
appPrefs.onboardingStage.set(OnboardingStage.Step1_SimpleXInfo)
} else if (DatabaseUtils.ksAppPassword.get() == null || DatabaseUtils.ksSelfDestructPassword.get() == null) {
initChatControllerAndRunMigrations()
initChatControllerOnStart()
}
ProcessLifecycleOwner.get().lifecycle.addObserver(this@SimplexApp)
}
@@ -254,7 +254,7 @@ class SimplexApp: Application(), LifecycleEventObserver {
override fun androidSetNightModeIfSupported() {
if (Build.VERSION.SDK_INT < 31) return
val light = if (CurrentColors.value.name == DefaultTheme.SYSTEM.name) {
val light = if (CurrentColors.value.name == DefaultTheme.SYSTEM_THEME_NAME) {
null
} else {
CurrentColors.value.colors.isLight
@@ -77,7 +77,7 @@ class SimplexService: Service() {
isServiceStarted = true
// In case of self-destruct is enabled the initialization process will not start in SimplexApp, Let's start it here
if (DatabaseUtils.ksSelfDestructPassword.get() != null && chatModel.chatDbStatus.value == null) {
initChatControllerAndRunMigrations()
initChatControllerOnStart()
}
}
}
@@ -77,7 +77,7 @@ object NtfManager {
val msgNtfs = manager.activeNotifications.filter { ntf ->
ntf.notification.channelId == MessageChannel
}
if (msgNtfs.count() == 1) {
if (msgNtfs.size <= 1) {
// Have a group notification with no children so cancel it
manager.cancel(0)
}
+4 -1
View File
@@ -37,7 +37,7 @@ kotlin {
api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
api("org.jetbrains.kotlinx:kotlinx-datetime:0.5.0")
api("com.russhwolf:multiplatform-settings:1.1.1")
api("com.charleskorn.kaml:kaml:0.58.0")
api("com.charleskorn.kaml:kaml:0.59.0")
api("org.jetbrains.compose.ui:ui-text:${rootProject.extra["compose.version"] as String}")
implementation("org.jetbrains.compose.components:components-animatedimage:${rootProject.extra["compose.version"] as String}")
//Barcode
@@ -53,6 +53,9 @@ kotlin {
val commonTest by getting {
dependencies {
implementation(kotlin("test"))
implementation(kotlin("test-junit"))
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
@@ -17,6 +17,6 @@ val NotificationsMode.requiresIgnoringBattery
lateinit var APPLICATION_ID: String
fun Uri.toURI(): URI = URI(toString())
fun Uri.toURI(): URI = URI(toString().replace("\n", ""))
fun URI.toUri(): Uri = Uri.parse(toString())
@@ -15,8 +15,10 @@ actual val dataDir: File = androidAppContext.dataDir
actual val tmpDir: File = androidAppContext.getDir("temp", Application.MODE_PRIVATE)
actual val filesDir: File = File(dataDir.absolutePath + File.separator + "files")
actual val appFilesDir: File = File(filesDir.absolutePath + File.separator + "app_files")
actual val wallpapersDir: File = File(filesDir.absolutePath + File.separator + "assets" + File.separator + "wallpapers").also { it.mkdirs() }
actual val coreTmpDir: File = File(filesDir.absolutePath + File.separator + "temp_files")
actual val dbAbsolutePrefixPath: String = dataDir.absolutePath + File.separator + "files"
actual val preferencesDir = File(dataDir.absolutePath + File.separator + "shared_prefs")
actual val chatDatabaseFileName: String = "files_chat.db"
actual val agentDatabaseFileName: String = "files_agent.db"
@@ -7,6 +7,8 @@ import android.content.SharedPreferences
import android.content.res.Configuration
import android.text.BidiFormatter
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.Font
@@ -14,9 +16,11 @@ import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.core.graphics.drawable.toBitmap
import chat.simplex.common.model.AppPreferences
import com.russhwolf.settings.Settings
import com.russhwolf.settings.SharedPreferencesSettings
import dev.icerock.moko.resources.ImageResource
import dev.icerock.moko.resources.StringResource
import dev.icerock.moko.resources.desc.desc
@@ -51,3 +55,6 @@ actual fun windowWidth(): Dp = LocalConfiguration.current.screenWidthDp.dp
actual fun desktopExpandWindowToWidth(width: Dp) {}
actual fun isRtl(text: CharSequence): Boolean = BidiFormatter.getInstance().isRtl(text)
actual fun ImageResource.toComposeImageBitmap(): ImageBitmap? =
getDrawable(androidAppContext)?.toBitmap()?.asImageBitmap()
@@ -11,6 +11,7 @@ import android.media.*
import android.os.Build
import android.os.PowerManager
import android.os.PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK
import android.view.View
import android.view.ViewGroup
import android.webkit.*
import androidx.compose.desktop.ui.tooling.preview.Preview
@@ -670,37 +671,43 @@ fun WebRTCView(callCommand: SnapshotStateList<WCallCommand>, onResponse: (WVAPIM
Box(Modifier.fillMaxSize()) {
AndroidView(
factory = { AndroidViewContext ->
(staticWebView ?: WebView(androidAppContext)).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
)
this.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (request.origin.toString().startsWith("file:/")) {
request.grant(request.resources)
} else {
Log.d(TAG, "Permission request from webview denied.")
request.deny()
try {
(staticWebView ?: WebView(androidAppContext)).apply {
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT,
)
this.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest) {
if (request.origin.toString().startsWith("file:/")) {
request.grant(request.resources)
} else {
Log.d(TAG, "Permission request from webview denied.")
request.deny()
}
}
}
this.webViewClient = LocalContentWebViewClient(webView, assetLoader)
this.clearHistory()
this.clearCache(true)
this.addJavascriptInterface(WebRTCInterface(onResponse), "WebRTCInterface")
this.setBackgroundColor(android.graphics.Color.BLACK)
val webViewSettings = this.settings
webViewSettings.allowFileAccess = true
webViewSettings.allowContentAccess = true
webViewSettings.javaScriptEnabled = true
webViewSettings.mediaPlaybackRequiresUserGesture = false
webViewSettings.cacheMode = WebSettings.LOAD_NO_CACHE
if (staticWebView == null) {
this.loadUrl("file:android_asset/www/android/call.html")
} else {
webView.value = this
}
}
this.webViewClient = LocalContentWebViewClient(webView, assetLoader)
this.clearHistory()
this.clearCache(true)
this.addJavascriptInterface(WebRTCInterface(onResponse), "WebRTCInterface")
this.setBackgroundColor(android.graphics.Color.BLACK)
val webViewSettings = this.settings
webViewSettings.allowFileAccess = true
webViewSettings.allowContentAccess = true
webViewSettings.javaScriptEnabled = true
webViewSettings.mediaPlaybackRequiresUserGesture = false
webViewSettings.cacheMode = WebSettings.LOAD_NO_CACHE
if (staticWebView == null) {
this.loadUrl("file:android_asset/www/android/call.html")
} else {
webView.value = this
}
} catch (e: Exception) {
Log.e(TAG, "Error initializing WebView: ${e.stackTraceToString()}")
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error), generalGetString(MR.strings.error_initializing_web_view).format(e.stackTraceToString()))
return@AndroidView View(androidAppContext)
}
}
) { /* WebView */ }
@@ -19,14 +19,10 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.*
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap
import chat.simplex.common.R
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.*
@@ -34,7 +30,6 @@ import chat.simplex.common.model.ChatModel
import chat.simplex.common.platform.*
import chat.simplex.common.helpers.APPLICATION_ID
import chat.simplex.common.helpers.saveAppLocale
import chat.simplex.common.views.usersettings.AppearanceScope.ColorEditor
import chat.simplex.res.MR
import dev.icerock.moko.resources.ImageResource
import dev.icerock.moko.resources.compose.painterResource
@@ -46,9 +41,8 @@ enum class AppIcon(val image: ImageResource) {
}
@Composable
actual fun AppearanceView(m: ChatModel, showSettingsModal: (@Composable (ChatModel) -> Unit) -> (() -> Unit)) {
actual fun AppearanceView(m: ChatModel) {
val appIcon = remember { mutableStateOf(findEnabledIcon()) }
fun setAppIcon(newIcon: AppIcon) {
if (appIcon.value == newIcon) return
val newComponent = ComponentName(APPLICATION_ID, "chat.simplex.app.MainActivity_${newIcon.name.lowercase()}")
@@ -65,18 +59,11 @@ actual fun AppearanceView(m: ChatModel, showSettingsModal: (@Composable (ChatMod
appIcon.value = newIcon
}
AppearanceScope.AppearanceLayout(
appIcon,
m.controller.appPrefs.appLanguage,
m.controller.appPrefs.systemDarkTheme,
changeIcon = ::setAppIcon,
showSettingsModal = showSettingsModal,
editColor = { name, initialColor ->
ModalManager.start.showModalCloseable { close ->
ColorEditor(name, initialColor, close)
}
},
)
}
@@ -86,8 +73,6 @@ fun AppearanceScope.AppearanceLayout(
languagePref: SharedPreference<String?>,
systemDarkTheme: SharedPreference<String?>,
changeIcon: (AppIcon) -> Unit,
showSettingsModal: (@Composable (ChatModel) -> Unit) -> (() -> Unit),
editColor: (ThemeColor, Color) -> Unit,
) {
ColumnWithScrollBar(
Modifier.fillMaxWidth(),
@@ -120,6 +105,13 @@ fun AppearanceScope.AppearanceLayout(
}
// }
}
SectionDividerSpaced(maxTopPadding = true)
ThemesSection(systemDarkTheme)
SectionDividerSpaced(maxTopPadding = true)
ProfileImageSection()
SectionDividerSpaced()
SectionView(stringResource(MR.strings.settings_section_title_icon), padding = PaddingValues(horizontal = DEFAULT_PADDING_HALF)) {
@@ -145,11 +137,6 @@ fun AppearanceScope.AppearanceLayout(
}
}
SectionDividerSpaced(maxTopPadding = true)
ProfileImageSection()
SectionDividerSpaced(maxTopPadding = true)
ThemesSection(systemDarkTheme, showSettingsModal, editColor)
SectionBottomSpacer()
}
}
@@ -169,8 +156,6 @@ fun PreviewAppearanceSettings() {
languagePref = SharedPreference({ null }, {}),
systemDarkTheme = SharedPreference({ null }, {}),
changeIcon = {},
showSettingsModal = { {} },
editColor = { _, _ -> },
)
}
}
@@ -4,7 +4,7 @@ import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.runtime.snapshots.SnapshotStateMap
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.*
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.font.*
import androidx.compose.ui.text.style.TextDecoration
@@ -399,6 +399,18 @@ object ChatModel {
currentUser.value = updated
}
fun updateCurrentUserUiThemes(rhId: Long?, uiThemes: ThemeModeOverrides?) {
val current = currentUser.value ?: return
val updated = current.copy(
uiThemes = uiThemes
)
val i = users.indexOfFirst { it.user.userId == current.userId && it.user.remoteHostId == rhId }
if (i != -1) {
users[i] = users[i].copy(user = updated)
}
currentUser.value = updated
}
suspend fun addLiveDummy(chatInfo: ChatInfo): ChatItem {
val cItem = ChatItem.liveDummy(chatInfo is ChatInfo.Direct)
withContext(Dispatchers.Main) {
@@ -682,7 +694,8 @@ data class User(
override val showNtfs: Boolean,
val sendRcptsContacts: Boolean,
val sendRcptsSmallGroups: Boolean,
val viewPwdHash: UserPwdHash?
val viewPwdHash: UserPwdHash?,
val uiThemes: ThemeModeOverrides? = null,
): NamedChat, UserLike {
override val displayName: String get() = profile.displayName
override val fullName: String get() = profile.fullName
@@ -709,6 +722,7 @@ data class User(
sendRcptsContacts = true,
sendRcptsSmallGroups = false,
viewPwdHash = null,
uiThemes = null,
)
}
}
@@ -1041,7 +1055,8 @@ data class Contact(
override val updatedAt: Instant,
val chatTs: Instant?,
val contactGroupMemberId: Long? = null,
val contactGrpInvSent: Boolean
val contactGrpInvSent: Boolean,
val uiThemes: ThemeModeOverrides? = null,
): SomeChat, NamedChat {
override val chatType get() = ChatType.Direct
override val id get() = "@$contactId"
@@ -1113,7 +1128,8 @@ data class Contact(
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
chatTs = Clock.System.now(),
contactGrpInvSent = false
contactGrpInvSent = false,
uiThemes = null,
)
}
}
@@ -1253,7 +1269,8 @@ data class GroupInfo (
val chatSettings: ChatSettings,
override val createdAt: Instant,
override val updatedAt: Instant,
val chatTs: Instant?
val chatTs: Instant?,
val uiThemes: ThemeModeOverrides? = null,
): SomeChat, NamedChat {
override val chatType get() = ChatType.Group
override val id get() = "#$groupId"
@@ -1295,7 +1312,8 @@ data class GroupInfo (
chatSettings = ChatSettings(enableNtfs = MsgFilter.All, sendRcpts = null, favorite = false),
createdAt = Clock.System.now(),
updatedAt = Clock.System.now(),
chatTs = Clock.System.now()
chatTs = Clock.System.now(),
uiThemes = null,
)
}
}
@@ -1915,12 +1933,13 @@ data class ChatItem (
itemDeleted: CIDeleted? = null,
itemEdited: Boolean = false,
itemTimed: CITimed? = null,
itemLive: Boolean = false,
deletable: Boolean = true,
editable: Boolean = true
) =
ChatItem(
chatDir = dir,
meta = CIMeta.getSample(id, ts, text, status, sentViaProxy, itemForwarded, itemDeleted, itemEdited, itemTimed, deletable, editable),
meta = CIMeta.getSample(id, ts, text, status, sentViaProxy, itemForwarded, itemDeleted, itemEdited, itemTimed, itemLive, deletable, editable),
content = CIContent.SndMsgContent(msgContent = MsgContent.MCText(text)),
quotedItem = quotedItem,
reactions = listOf(),
@@ -26,8 +26,7 @@ import kotlinx.coroutines.sync.withLock
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.*
import kotlinx.serialization.builtins.MapSerializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.builtins.*
import kotlinx.serialization.json.*
import java.util.Date
@@ -168,13 +167,20 @@ class AppPreferences {
val selfDestruct = mkBoolPreference(SHARED_PREFS_SELF_DESTRUCT, false)
val selfDestructDisplayName = mkStrPreference(SHARED_PREFS_SELF_DESTRUCT_DISPLAY_NAME, null)
val currentTheme = mkStrPreference(SHARED_PREFS_CURRENT_THEME, DefaultTheme.SYSTEM.name)
val systemDarkTheme = mkStrPreference(SHARED_PREFS_SYSTEM_DARK_THEME, DefaultTheme.SIMPLEX.name)
val themeOverrides = mkMapPreference(SHARED_PREFS_THEMES, mapOf(), encode = {
val currentTheme = mkStrPreference(SHARED_PREFS_CURRENT_THEME, DefaultTheme.SYSTEM_THEME_NAME)
val systemDarkTheme = mkStrPreference(SHARED_PREFS_SYSTEM_DARK_THEME, DefaultTheme.SIMPLEX.themeName)
val currentThemeIds = mkMapPreference(SHARED_PREFS_CURRENT_THEME_IDs, mapOf(), encode = {
json.encodeToString(MapSerializer(String.serializer(), String.serializer()), it)
}, decode = {
json.decodeFromString(MapSerializer(String.serializer(), String.serializer()), it)
})
// Deprecated. Remove key from preferences in 2025
val themeOverridesOld = mkMapPreference(SHARED_PREFS_THEMES_OLD, mapOf(), encode = {
json.encodeToString(MapSerializer(String.serializer(), ThemeOverrides.serializer()), it)
}, decode = {
json.decodeFromString(MapSerializer(String.serializer(), ThemeOverrides.serializer()), it)
jsonCoerceInputValues.decodeFromString(MapSerializer(String.serializer(), ThemeOverrides.serializer()), it)
}, settingsThemes)
val themeOverrides = mkThemeOverridesPreference()
val profileImageCornerRadius = mkFloatPreference(SHARED_PREFS_PROFILE_IMAGE_CORNER_RADIUS, 22.5f)
val whatsNewVersion = mkStrPreference(SHARED_PREFS_WHATS_NEW_VERSION, null)
@@ -269,6 +275,12 @@ class AppPreferences {
set = fun(value) = prefs.putString(prefName, encode(value))
)
private fun mkThemeOverridesPreference(): SharedPreference<List<ThemeOverrides>> =
SharedPreference(
get = fun() = themeOverridesStore ?: (readThemeOverrides()).also { themeOverridesStore = it },
set = fun(value) { if (writeThemeOverrides(value)) { themeOverridesStore = value } }
)
companion object {
const val SHARED_PREFS_ID = "chat.simplex.app.SIMPLEX_APP_PREFS"
internal const val SHARED_PREFS_THEMES_ID = "chat.simplex.app.THEMES"
@@ -345,8 +357,10 @@ class AppPreferences {
private const val SHARED_PREFS_SELF_DESTRUCT_DISPLAY_NAME = "LocalAuthenticationSelfDestructDisplayName"
private const val SHARED_PREFS_PQ_EXPERIMENTAL_ENABLED = "PQExperimentalEnabled" // no longer used
private const val SHARED_PREFS_CURRENT_THEME = "CurrentTheme"
private const val SHARED_PREFS_CURRENT_THEME_IDs = "CurrentThemeIds"
private const val SHARED_PREFS_SYSTEM_DARK_THEME = "SystemDarkTheme"
private const val SHARED_PREFS_THEMES = "Themes"
private const val SHARED_PREFS_THEMES_OLD = "Themes"
private const val SHARED_PREFS_THEME_OVERRIDES = "ThemeOverrides"
private const val SHARED_PREFS_PROFILE_IMAGE_CORNER_RADIUS = "ProfileImageCornerRadius"
private const val SHARED_PREFS_WHATS_NEW_VERSION = "WhatsNewVersion"
private const val SHARED_PREFS_LAST_MIGRATED_VERSION_CODE = "LastMigratedVersionCode"
@@ -361,6 +375,8 @@ class AppPreferences {
private const val SHARED_PREFS_IOS_CALL_KIT_ENABLED = "iOSCallKitEnabled"
private const val SHARED_PREFS_IOS_CALL_KIT_CALLS_IN_RECENTS = "iOSCallKitCallsInRecents"
private var themeOverridesStore: List<ThemeOverrides>? = null
}
}
@@ -445,8 +461,13 @@ object ChatController {
Log.d(TAG, "startChatWithTemporaryDatabase")
val migrationActiveUser = apiGetActiveUser(null, ctrl) ?: apiCreateActiveUser(null, Profile(displayName = "Temp", fullName = ""), ctrl = ctrl)
apiSetNetworkConfig(netCfg, ctrl)
apiSetTempFolder(getMigrationTempFilesDirectory().absolutePath, ctrl)
apiSetFilesFolder(getMigrationTempFilesDirectory().absolutePath, ctrl)
apiSetAppFilePaths(
getMigrationTempFilesDirectory().absolutePath,
getMigrationTempFilesDirectory().absolutePath,
wallpapersDir.parentFile.absolutePath,
remoteHostsDir.absolutePath,
ctrl
)
apiStartChat(ctrl)
return migrationActiveUser
}
@@ -665,22 +686,10 @@ object ChatController {
}
}
suspend fun apiSetTempFolder(tempFolder: String, ctrl: ChatCtrl? = null) {
val r = sendCmd(null, CC.SetTempFolder(tempFolder), ctrl)
suspend fun apiSetAppFilePaths(filesFolder: String, tempFolder: String, assetsFolder: String, remoteHostsFolder: String, ctrl: ChatCtrl? = null) {
val r = sendCmd(null, CC.ApiSetAppFilePaths(filesFolder, tempFolder, assetsFolder, remoteHostsFolder), ctrl)
if (r is CR.CmdOk) return
throw Exception("failed to set temp folder: ${r.responseType} ${r.details}")
}
suspend fun apiSetFilesFolder(filesFolder: String, ctrl: ChatCtrl? = null) {
val r = sendCmd(null, CC.SetFilesFolder(filesFolder), ctrl)
if (r is CR.CmdOk) return
throw Exception("failed to set files folder: ${r.responseType} ${r.details}")
}
suspend fun apiSetRemoteHostsFolder(remoteHostsFolder: String) {
val r = sendCmd(null, CC.SetRemoteHostsFolder(remoteHostsFolder))
if (r is CR.CmdOk) return
throw Exception("failed to set remote hosts folder: ${r.responseType} ${r.details}")
throw Exception("failed to set app file paths: ${r.responseType} ${r.details}")
}
suspend fun apiSetEncryptLocalFiles(enable: Boolean) = sendCommandOkResp(null, CC.ApiSetEncryptLocalFiles(enable))
@@ -1166,6 +1175,20 @@ object ChatController {
return null
}
suspend fun apiSetUserUIThemes(rh: Long?, userId: Long, themes: ThemeModeOverrides?): Boolean {
val r = sendCmd(rh, CC.ApiSetUserUIThemes(userId, themes))
if (r is CR.CmdOk) return true
Log.e(TAG, "apiSetUserUIThemes bad response: ${r.responseType} ${r.details}")
return false
}
suspend fun apiSetChatUIThemes(rh: Long?, chatId: ChatId, themes: ThemeModeOverrides?): Boolean {
val r = sendCmd(rh, CC.ApiSetChatUIThemes(chatId, themes))
if (r is CR.CmdOk) return true
Log.e(TAG, "apiSetChatUIThemes bad response: ${r.responseType} ${r.details}")
return false
}
suspend fun apiCreateUserAddress(rh: Long?): String? {
val userId = kotlin.runCatching { currentUserId("apiCreateUserAddress") }.getOrElse { return null }
val r = sendCmd(rh, CC.ApiCreateMyAddress(userId))
@@ -2437,9 +2460,8 @@ sealed class CC {
class ApiDeleteUser(val userId: Long, val delSMPQueues: Boolean, val viewPwd: String?): CC()
class StartChat(val mainApp: Boolean): CC()
class ApiStopChat: CC()
class SetTempFolder(val tempFolder: String): CC()
class SetFilesFolder(val filesFolder: String): CC()
class SetRemoteHostsFolder(val remoteHostsFolder: String): CC()
@Serializable
class ApiSetAppFilePaths(val appFilesFolder: String, val appTempFolder: String, val appAssetsFolder: String, val appRemoteHostsFolder: String): CC()
class ApiSetEncryptLocalFiles(val enable: Boolean): CC()
class ApiExportArchive(val config: ArchiveConfig): CC()
class ApiImportArchive(val config: ArchiveConfig): CC()
@@ -2507,6 +2529,8 @@ sealed class CC {
class ApiSetContactPrefs(val contactId: Long, val prefs: ChatPreferences): CC()
class ApiSetContactAlias(val contactId: Long, val localAlias: String): CC()
class ApiSetConnectionAlias(val connId: Long, val localAlias: String): CC()
class ApiSetUserUIThemes(val userId: Long, val themes: ThemeModeOverrides?): CC()
class ApiSetChatUIThemes(val chatId: String, val themes: ThemeModeOverrides?): CC()
class ApiCreateMyAddress(val userId: Long): CC()
class ApiDeleteMyAddress(val userId: Long): CC()
class ApiShowMyAddress(val userId: Long): CC()
@@ -2574,9 +2598,7 @@ sealed class CC {
is ApiDeleteUser -> "/_delete user $userId del_smp=${onOff(delSMPQueues)}${maybePwd(viewPwd)}"
is StartChat -> "/_start main=${onOff(mainApp)}"
is ApiStopChat -> "/_stop"
is SetTempFolder -> "/_temp_folder $tempFolder"
is SetFilesFolder -> "/_files_folder $filesFolder"
is SetRemoteHostsFolder -> "/remote_hosts_folder $remoteHostsFolder"
is ApiSetAppFilePaths -> "/set file paths ${json.encodeToString(this)}"
is ApiSetEncryptLocalFiles -> "/_files_encrypt ${onOff(enable)}"
is ApiExportArchive -> "/_db export ${json.encodeToString(config)}"
is ApiImportArchive -> "/_db import ${json.encodeToString(config)}"
@@ -2656,6 +2678,8 @@ sealed class CC {
is ApiSetContactPrefs -> "/_set prefs @$contactId ${json.encodeToString(prefs)}"
is ApiSetContactAlias -> "/_set alias @$contactId ${localAlias.trim()}"
is ApiSetConnectionAlias -> "/_set alias :$connId ${localAlias.trim()}"
is ApiSetUserUIThemes -> "/_set theme user $userId ${if (themes != null) json.encodeToString(themes) else ""}"
is ApiSetChatUIThemes -> "/_set theme $chatId ${if (themes != null) json.encodeToString(themes) else ""}"
is ApiCreateMyAddress -> "/_address $userId"
is ApiDeleteMyAddress -> "/_delete_address $userId"
is ApiShowMyAddress -> "/_show_address $userId"
@@ -2720,9 +2744,7 @@ sealed class CC {
is ApiDeleteUser -> "apiDeleteUser"
is StartChat -> "startChat"
is ApiStopChat -> "apiStopChat"
is SetTempFolder -> "setTempFolder"
is SetFilesFolder -> "setFilesFolder"
is SetRemoteHostsFolder -> "setRemoteHostsFolder"
is ApiSetAppFilePaths -> "apiSetAppFilePaths"
is ApiSetEncryptLocalFiles -> "apiSetEncryptLocalFiles"
is ApiExportArchive -> "apiExportArchive"
is ApiImportArchive -> "apiImportArchive"
@@ -2790,6 +2812,8 @@ sealed class CC {
is ApiSetContactPrefs -> "apiSetContactPrefs"
is ApiSetContactAlias -> "apiSetContactAlias"
is ApiSetConnectionAlias -> "apiSetConnectionAlias"
is ApiSetUserUIThemes -> "apiSetUserUIThemes"
is ApiSetChatUIThemes -> "apiSetChatUIThemes"
is ApiCreateMyAddress -> "apiCreateMyAddress"
is ApiDeleteMyAddress -> "apiDeleteMyAddress"
is ApiShowMyAddress -> "apiShowMyAddress"
@@ -4061,6 +4085,15 @@ val json = Json {
explicitNulls = false
}
// Can decode unknown enum to default value specified for this field
val jsonCoerceInputValues = Json {
prettyPrint = true
ignoreUnknownKeys = true
encodeDefaults = true
explicitNulls = false
coerceInputValues = true
}
val jsonShort = Json {
prettyPrint = false
ignoreUnknownKeys = true
@@ -4071,6 +4104,8 @@ val jsonShort = Json {
val yaml = Yaml(configuration = YamlConfiguration(
strictMode = false,
encodeDefaults = false,
/** ~5.5 MB limitation since wallpaper is limited by 5 MB, see [saveWallpaperFile] */
codePointLimit = 5500000,
))
@Serializable
@@ -4907,7 +4942,6 @@ sealed class ChatErrorType {
is GroupMemberNotActive -> "groupMemberNotActive"
is GroupMemberUserRemoved -> "groupMemberUserRemoved"
is GroupMemberNotFound -> "groupMemberNotFound"
is GroupMemberIntroNotFound -> "groupMemberIntroNotFound"
is GroupCantResendInvitation -> "groupCantResendInvitation"
is GroupInternal -> "groupInternal"
is FileNotFound -> "fileNotFound"
@@ -4987,7 +5021,6 @@ sealed class ChatErrorType {
@Serializable @SerialName("groupMemberNotActive") object GroupMemberNotActive: ChatErrorType()
@Serializable @SerialName("groupMemberUserRemoved") object GroupMemberUserRemoved: ChatErrorType()
@Serializable @SerialName("groupMemberNotFound") object GroupMemberNotFound: ChatErrorType()
@Serializable @SerialName("groupMemberIntroNotFound") class GroupMemberIntroNotFound(val contactName: String): ChatErrorType()
@Serializable @SerialName("groupCantResendInvitation") class GroupCantResendInvitation(val groupInfo: GroupInfo, val contactName: String): ChatErrorType()
@Serializable @SerialName("groupInternal") class GroupInternal(val message: String): ChatErrorType()
@Serializable @SerialName("fileNotFound") class FileNotFound(val message: String): ChatErrorType()
@@ -5521,6 +5554,11 @@ data class AppSettings(
var androidCallOnLockScreen: AppSettingsLockScreenCalls? = null,
var iosCallKitEnabled: Boolean? = null,
var iosCallKitCallsInRecents: Boolean? = null,
var uiProfileImageCornerRadius: Float? = null,
var uiColorScheme: String? = null,
var uiDarkColorScheme: String? = null,
var uiCurrentThemeIds: Map<String, String>? = null,
var uiThemes: List<ThemeOverrides>? = null,
) {
fun prepareForExport(): AppSettings {
val empty = AppSettings()
@@ -5545,6 +5583,11 @@ data class AppSettings(
if (androidCallOnLockScreen != def.androidCallOnLockScreen) { empty.androidCallOnLockScreen = androidCallOnLockScreen }
if (iosCallKitEnabled != def.iosCallKitEnabled) { empty.iosCallKitEnabled = iosCallKitEnabled }
if (iosCallKitCallsInRecents != def.iosCallKitCallsInRecents) { empty.iosCallKitCallsInRecents = iosCallKitCallsInRecents }
if (uiProfileImageCornerRadius != def.uiProfileImageCornerRadius) { empty.uiProfileImageCornerRadius = uiProfileImageCornerRadius }
if (uiColorScheme != def.uiColorScheme) { empty.uiColorScheme = uiColorScheme }
if (uiDarkColorScheme != def.uiDarkColorScheme) { empty.uiDarkColorScheme = uiDarkColorScheme }
if (uiCurrentThemeIds != def.uiCurrentThemeIds) { empty.uiCurrentThemeIds = uiCurrentThemeIds }
if (uiThemes != def.uiThemes) { empty.uiThemes = uiThemes }
return empty
}
@@ -5577,6 +5620,11 @@ data class AppSettings(
androidCallOnLockScreen?.let { def.callOnLockScreen.set(it.toCallOnLockScreen()) }
iosCallKitEnabled?.let { def.iosCallKitEnabled.set(it) }
iosCallKitCallsInRecents?.let { def.iosCallKitCallsInRecents.set(it) }
uiProfileImageCornerRadius?.let { def.profileImageCornerRadius.set(it) }
uiColorScheme?.let { def.currentTheme.set(it) }
uiDarkColorScheme?.let { def.systemDarkTheme.set(it) }
uiCurrentThemeIds?.let { def.currentThemeIds.set(it) }
uiThemes?.let { def.themeOverrides.set(it.skipDuplicates()) }
}
companion object {
@@ -5601,7 +5649,12 @@ data class AppSettings(
confirmDBUpgrades = false,
androidCallOnLockScreen = AppSettingsLockScreenCalls.SHOW,
iosCallKitEnabled = true,
iosCallKitCallsInRecents = false
iosCallKitCallsInRecents = false,
uiProfileImageCornerRadius = 22.5f,
uiColorScheme = DefaultTheme.SYSTEM_THEME_NAME,
uiDarkColorScheme = DefaultTheme.SIMPLEX.themeName,
uiCurrentThemeIds = null,
uiThemes = null,
)
val current: AppSettings
@@ -5628,6 +5681,11 @@ data class AppSettings(
androidCallOnLockScreen = AppSettingsLockScreenCalls.from(def.callOnLockScreen.get()),
iosCallKitEnabled = def.iosCallKitEnabled.get(),
iosCallKitCallsInRecents = def.iosCallKitCallsInRecents.get(),
uiProfileImageCornerRadius = def.profileImageCornerRadius.get(),
uiColorScheme = def.currentTheme.get() ?: DefaultTheme.SYSTEM_THEME_NAME,
uiDarkColorScheme = def.systemDarkTheme.get() ?: DefaultTheme.SIMPLEX.themeName,
uiCurrentThemeIds = def.currentThemeIds.get(),
uiThemes = def.themeOverrides.get(),
)
}
}
@@ -2,7 +2,6 @@ package com.sd.lib.compose.wheel_picker
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.background
import chat.simplex.common.ui.theme.isSystemInDarkTheme
import androidx.compose.foundation.layout.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -12,6 +11,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import chat.simplex.common.ui.theme.isInDarkTheme
/**
* The default implementation of focus view in vertical.
@@ -76,7 +76,7 @@ fun FWheelPickerFocusHorizontal(
*/
private val DefaultDividerColor: Color
@Composable
get() = (if (isSystemInDarkTheme()) {
get() = (if (isInDarkTheme()) {
Color.White
} else {
Color.Black
@@ -42,6 +42,12 @@ fun runMigrations() {
ChatController.appPrefs.currentTheme.set(DefaultTheme.SIMPLEX.name)
}
lastMigration.set(117)
} else if (lastMigration.get() < 203) {
// Moving to a different key for storing themes as a List
val oldOverrides = ChatController.appPrefs.themeOverridesOld.get().values.toList()
ChatController.appPrefs.themeOverrides.set(oldOverrides)
ChatController.appPrefs.currentThemeIds.set(oldOverrides.associate { it.base.themeName to it.themeId })
lastMigration.set(203)
} else {
lastMigration.set(BuildConfigCommon.ANDROID_VERSION_CODE)
break
@@ -43,14 +43,13 @@ val appPreferences: AppPreferences
val chatController: ChatController = ChatController
fun initChatControllerAndRunMigrations() {
fun initChatControllerOnStart() {
withLongRunningApi {
if (appPreferences.chatStopped.get() && appPreferences.storeDBPassphrase.get() && ksDatabasePassword.get() != null) {
initChatController(startChat = ::showStartChatAfterRestartAlert)
} else {
initChatController()
}
runMigrations()
}
}
@@ -88,11 +87,13 @@ suspend fun initChatController(useKey: String? = null, confirmMigrations: Migrat
return
}
platform.androidRestartNetworkObserver()
controller.apiSetTempFolder(coreTmpDir.absolutePath)
controller.apiSetFilesFolder(appFilesDir.absolutePath)
if (appPlatform.isDesktop) {
controller.apiSetRemoteHostsFolder(remoteHostsDir.absolutePath)
}
controller.apiSetAppFilePaths(
appFilesDir.absolutePath,
coreTmpDir.absolutePath,
wallpapersDir.parentFile.absolutePath,
remoteHostsDir.absolutePath,
ctrl
)
controller.apiSetEncryptLocalFiles(controller.appPrefs.privacyEncryptLocalFiles.get())
// If we migrated successfully means previous re-encryption process on database level finished successfully too
if (appPreferences.encryptionStartedAt.get() != null) appPreferences.encryptionStartedAt.set(null)
@@ -1,10 +1,12 @@
package chat.simplex.common.platform
import androidx.compose.runtime.Composable
import chat.simplex.common.model.CIFile
import chat.simplex.common.model.CryptoFile
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.generalGetString
import chat.simplex.res.MR
import com.charleskorn.kaml.*
import kotlinx.serialization.encodeToString
import java.io.*
import java.net.URI
import java.net.URLDecoder
@@ -14,8 +16,10 @@ expect val dataDir: File
expect val tmpDir: File
expect val filesDir: File
expect val appFilesDir: File
expect val wallpapersDir: File
expect val coreTmpDir: File
expect val dbAbsolutePrefixPath: String
expect val preferencesDir: File
expect val chatDatabaseFileName: String
expect val agentDatabaseFileName: String
@@ -78,6 +82,20 @@ fun getAppFilePath(fileName: String): String {
}
}
fun getWallpaperFilePath(fileName: String): String {
val rh = chatModel.currentRemoteHost.value
val s = File.separator
val path = if (rh == null) {
wallpapersDir.absolutePath + s + fileName
} else {
remoteHostsDir.absolutePath + s + rh.storePath + s + "simplex_v1_assets" + s + "wallpapers" + s + fileName
}
File(path).parentFile.mkdirs()
return path
}
fun getPreferenceFilePath(fileName: String = "themes.yaml"): String = preferencesDir.absolutePath + File.separator + fileName
fun getLoadedFilePath(file: CIFile?): String? {
val f = file?.fileSource?.filePath
return if (f != null && file.loaded) {
@@ -98,6 +116,42 @@ fun getLoadedFileSource(file: CIFile?): CryptoFile? {
}
}
fun readThemeOverrides(): List<ThemeOverrides> {
return try {
val file = File(getPreferenceFilePath("themes.yaml"))
if (!file.exists()) return emptyList()
file.inputStream().use {
val map = yaml.parseToYamlNode(it).yamlMap
val list = map.get<YamlList>("themes")
val res = ArrayList<ThemeOverrides>()
list?.items?.forEach {
try {
res.add(yaml.decodeFromYamlNode(ThemeOverrides.serializer(), it))
} catch (e: Throwable) {
Log.e(TAG, "Error while reading specific theme: ${e.stackTraceToString()}")
}
}
res.skipDuplicates()
}
} catch (e: Throwable) {
Log.e(TAG, "Error while reading themes file: ${e.stackTraceToString()}")
emptyList()
}
}
fun writeThemeOverrides(overrides: List<ThemeOverrides>): Boolean =
try {
File(getPreferenceFilePath("themes.yaml")).outputStream().use {
val string = yaml.encodeToString(ThemesFile(themes = overrides))
it.bufferedWriter().use { it.write(string) }
}
true
} catch (e: Throwable) {
Log.e(TAG, "Error while writing themes file: ${e.stackTraceToString()}")
false
}
private fun fileReady(file: CIFile, filePath: String) =
File(filePath).exists() &&
CIFile.cachedRemoteFileRequests[file.fileSource] != false
@@ -1,11 +1,13 @@
package chat.simplex.common.platform
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.Dp
import com.russhwolf.settings.Settings
import dev.icerock.moko.resources.ImageResource
import dev.icerock.moko.resources.StringResource
@Composable
@@ -31,3 +33,5 @@ expect fun windowWidth(): Dp
expect fun desktopExpandWindowToWidth(width: Dp)
expect fun isRtl(text: CharSequence): Boolean
expect fun ImageResource.toComposeImageBitmap(): ImageBitmap?
@@ -31,17 +31,6 @@ val WarningOrange = Color(255, 127, 0, 255)
val WarningYellow = Color(255, 192, 0, 255)
val FileLight = Color(183, 190, 199, 255)
val FileDark = Color(101, 101, 106, 255)
val SentMessageColor = Color(0x1E45B8FF)
val MenuTextColor: Color @Composable get () = if (isInDarkTheme()) LocalContentColor.current.copy(alpha = 0.8f) else Color.Black
val NoteFolderIconColor: Color @Composable get() = with(CurrentColors.collectAsState().value.appColors.sentMessage) {
// Default color looks too light and better to have it here a little bit brighter
if (alpha == SentMessageColor.alpha) {
copy(min(SentMessageColor.alpha + 0.1f, 1f))
} else {
// Color is non-standard and theme maker can choose color without alpha at all since the theme bound to dark/light variant,
// and it shouldn't be universal
this
}
}
val NoteFolderIconColor: Color @Composable get() = MaterialTheme.appColors.primaryVariant2
@@ -6,53 +6,136 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.*
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp
import chat.simplex.common.model.ChatController
import chat.simplex.common.platform.isInNightMode
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.platform.*
import chat.simplex.common.ui.theme.ThemeManager.colorFromReadableHex
import chat.simplex.common.ui.theme.ThemeManager.toReadableHex
import chat.simplex.common.views.helpers.*
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import chat.simplex.res.MR
import kotlinx.serialization.Transient
import java.util.UUID
enum class DefaultTheme {
SYSTEM, LIGHT, DARK, SIMPLEX;
LIGHT, DARK, SIMPLEX, BLACK;
companion object {
const val SYSTEM_THEME_NAME: String = "SYSTEM"
}
val themeName: String
get() = name
val mode: DefaultThemeMode get() = if (this == LIGHT) DefaultThemeMode.LIGHT else DefaultThemeMode.DARK
// Call it only with base theme, not SYSTEM
fun hasChangedAnyColor(colors: Colors, appColors: AppColors): Boolean {
val palette = when (this) {
SYSTEM -> return false
LIGHT -> LightColorPalette
DARK -> DarkColorPalette
SIMPLEX -> SimplexColorPalette
}
val appPalette = when (this) {
SYSTEM -> return false
LIGHT -> LightColorPaletteApp
DARK -> DarkColorPaletteApp
SIMPLEX -> SimplexColorPaletteApp
}
return colors.primary != palette.primary ||
colors.primaryVariant != palette.primaryVariant ||
colors.secondary != palette.secondary ||
colors.secondaryVariant != palette.secondaryVariant ||
colors.background != palette.background ||
colors.surface != palette.surface ||
appColors != appPalette
fun hasChangedAnyColor(overrides: ThemeOverrides?): Boolean {
if (overrides == null) return false
return overrides.colors != ThemeColors() ||
overrides.wallpaper != null && (overrides.wallpaper.background != null || overrides.wallpaper.tint != null)
}
}
data class AppColors(
val title: Color,
val sentMessage: Color,
val receivedMessage: Color
)
@Serializable
enum class DefaultThemeMode {
@SerialName("light") LIGHT,
@SerialName("dark") DARK
}
@Stable
class AppColors(
title: Color,
primaryVariant2: Color,
sentMessage: Color,
sentQuote: Color,
receivedMessage: Color,
receivedQuote: Color,
) {
var title by mutableStateOf(title, structuralEqualityPolicy())
internal set
var primaryVariant2 by mutableStateOf(primaryVariant2, structuralEqualityPolicy())
internal set
var sentMessage by mutableStateOf(sentMessage, structuralEqualityPolicy())
internal set
var sentQuote by mutableStateOf(sentQuote, structuralEqualityPolicy())
internal set
var receivedMessage by mutableStateOf(receivedMessage, structuralEqualityPolicy())
internal set
var receivedQuote by mutableStateOf(receivedQuote, structuralEqualityPolicy())
internal set
fun copy(
title: Color = this.title,
primaryVariant2: Color = this.primaryVariant2,
sentMessage: Color = this.sentMessage,
sentQuote: Color = this.sentQuote,
receivedMessage: Color = this.receivedMessage,
receivedQuote: Color = this.receivedQuote,
): AppColors = AppColors(
title,
primaryVariant2,
sentMessage,
sentQuote,
receivedMessage,
receivedQuote,
)
override fun toString(): String {
return buildString {
append("AppColors(")
append("title=$title, ")
append("primaryVariant2=$primaryVariant2, ")
append("sentMessage=$sentMessage, ")
append("sentQuote=$sentQuote, ")
append("receivedMessage=$receivedMessage, ")
append("receivedQuote=$receivedQuote")
append(")")
}
}
}
@Stable
class AppWallpaper(
background: Color? = null,
tint: Color? = null,
type: WallpaperType = WallpaperType.Empty,
) {
var background by mutableStateOf(background, structuralEqualityPolicy())
internal set
var tint by mutableStateOf(tint, structuralEqualityPolicy())
internal set
var type by mutableStateOf(type, structuralEqualityPolicy())
internal set
fun copy(
background: Color? = this.background,
tint: Color? = this.tint,
type: WallpaperType = this.type,
): AppWallpaper = AppWallpaper(
background,
tint,
type,
)
override fun toString(): String {
return buildString {
append("AppWallpaper(")
append("background=$background, ")
append("tint=$tint, ")
append("type=$type")
append(")")
}
}
}
enum class ThemeColor {
PRIMARY, PRIMARY_VARIANT, SECONDARY, SECONDARY_VARIANT, BACKGROUND, SURFACE, TITLE, SENT_MESSAGE, RECEIVED_MESSAGE;
PRIMARY, PRIMARY_VARIANT, SECONDARY, SECONDARY_VARIANT, BACKGROUND, SURFACE, TITLE, SENT_MESSAGE, SENT_QUOTE, RECEIVED_MESSAGE, RECEIVED_QUOTE, PRIMARY_VARIANT2, WALLPAPER_BACKGROUND, WALLPAPER_TINT;
fun fromColors(colors: Colors, appColors: AppColors): Color {
fun fromColors(colors: Colors, appColors: AppColors, appWallpaper: AppWallpaper): Color? {
return when (this) {
PRIMARY -> colors.primary
PRIMARY_VARIANT -> colors.primaryVariant
@@ -61,8 +144,13 @@ enum class ThemeColor {
BACKGROUND -> colors.background
SURFACE -> colors.surface
TITLE -> appColors.title
PRIMARY_VARIANT2 -> appColors.primaryVariant2
SENT_MESSAGE -> appColors.sentMessage
SENT_QUOTE -> appColors.sentQuote
RECEIVED_MESSAGE -> appColors.receivedMessage
RECEIVED_QUOTE -> appColors.receivedQuote
WALLPAPER_BACKGROUND -> appWallpaper.background
WALLPAPER_TINT -> appWallpaper.tint
}
}
@@ -75,8 +163,13 @@ enum class ThemeColor {
BACKGROUND -> generalGetString(MR.strings.color_background)
SURFACE -> generalGetString(MR.strings.color_surface)
TITLE -> generalGetString(MR.strings.color_title)
PRIMARY_VARIANT2 -> generalGetString(MR.strings.color_primary_variant2)
SENT_MESSAGE -> generalGetString(MR.strings.color_sent_message)
SENT_QUOTE -> generalGetString(MR.strings.color_sent_quote)
RECEIVED_MESSAGE -> generalGetString(MR.strings.color_received_message)
RECEIVED_QUOTE -> generalGetString(MR.strings.color_received_quote)
WALLPAPER_BACKGROUND -> generalGetString(MR.strings.color_wallpaper_background)
WALLPAPER_TINT -> generalGetString(MR.strings.color_wallpaper_tint)
}
}
@@ -92,45 +185,232 @@ data class ThemeColors(
@SerialName("menus")
val surface: String? = null,
val title: String? = null,
@SerialName("accentVariant2")
val primaryVariant2: String? = null,
val sentMessage: String? = null,
@SerialName("sentReply")
val sentQuote: String? = null,
val receivedMessage: String? = null,
@SerialName("receivedReply")
val receivedQuote: String? = null,
) {
fun toColors(base: DefaultTheme): Colors {
companion object {
fun from(colors: Colors, appColors: AppColors): ThemeColors =
ThemeColors(
primary = colors.primary.toReadableHex(),
primaryVariant = colors.primaryVariant.toReadableHex(),
secondary = colors.secondary.toReadableHex(),
secondaryVariant = colors.secondaryVariant.toReadableHex(),
background = colors.background.toReadableHex(),
surface = colors.surface.toReadableHex(),
title = appColors.title.toReadableHex(),
primaryVariant2 = appColors.primaryVariant2.toReadableHex(),
sentMessage = appColors.sentMessage.toReadableHex(),
sentQuote = appColors.sentQuote.toReadableHex(),
receivedMessage = appColors.receivedMessage.toReadableHex(),
receivedQuote = appColors.receivedQuote.toReadableHex(),
)
}
}
@Serializable
data class ThemeWallpaper (
val preset: String? = null,
val scale: Float? = null,
val scaleType: WallpaperScaleType? = null,
val background: String? = null,
val tint: String? = null,
val image: String? = null,
val imageFile: String? = null,
) {
fun toAppWallpaper(): AppWallpaper {
return AppWallpaper(
background = background?.colorFromReadableHex(),
tint = tint?.colorFromReadableHex(),
type = WallpaperType.from(this) ?: WallpaperType.Empty
)
}
fun withFilledWallpaperBase64(): ThemeWallpaper {
val aw = toAppWallpaper()
val type = aw.type
return ThemeWallpaper(
image = if (type is WallpaperType.Image && type.image != null) resizeImageToStrSize(type.image!!, 5_000_000) else null,
imageFile = null,
preset = if (type is WallpaperType.Preset) type.filename else null,
scale = if (type is WallpaperType.Preset) type.scale else if (type is WallpaperType.Image) type.scale else 1f,
scaleType = if (type is WallpaperType.Image) type.scaleType else null,
background = aw.background?.toReadableHex(),
tint = aw.tint?.toReadableHex(),
)
}
fun withFilledWallpaperPath(): ThemeWallpaper {
val aw = toAppWallpaper()
val type = aw.type
return ThemeWallpaper(
image = null,
imageFile = if (type is WallpaperType.Image) type.filename else null,
preset = if (type is WallpaperType.Preset) type.filename else null,
scale = if (scale == null) null else if (type is WallpaperType.Preset) type.scale else if (type is WallpaperType.Image) scale else null,
scaleType = if (scaleType == null) null else if (type is WallpaperType.Image) type.scaleType else null,
background = aw.background?.toReadableHex(),
tint = aw.tint?.toReadableHex(),
)
}
fun importFromString(): ThemeWallpaper =
if (preset == null && image != null) {
// Need to save image from string and to save its path
try {
val parsed = base64ToBitmap(image)
val filename = saveWallpaperFile(parsed)
copy(image = null, imageFile = filename)
} catch (e: Exception) {
Log.e(TAG, "Error while parsing/copying the image: ${e.stackTraceToString()}")
ThemeWallpaper()
}
} else this
companion object {
fun from(type: WallpaperType, background: String?, tint: String?): ThemeWallpaper {
return ThemeWallpaper(
image = null,
imageFile = if (type is WallpaperType.Image) type.filename else null,
preset = if (type is WallpaperType.Preset) type.filename else null,
scale = if (type is WallpaperType.Preset) type.scale else if (type is WallpaperType.Image) type.scale else null,
scaleType = if (type is WallpaperType.Image) type.scaleType else null,
background = background,
tint = tint,
)
}
}
}
@Serializable
data class ThemesFile(
val themes: List<ThemeOverrides> = emptyList()
)
@Serializable
data class ThemeOverrides (
val themeId: String = UUID.randomUUID().toString(),
val base: DefaultTheme,
val colors: ThemeColors = ThemeColors(),
val wallpaper: ThemeWallpaper? = null,
) {
fun isSame(type: WallpaperType?, themeName: String): Boolean =
(
(wallpaper?.preset != null && type is WallpaperType.Preset && wallpaper.preset == type.filename) ||
(wallpaper?.imageFile != null && type is WallpaperType.Image) ||
(wallpaper?.preset == null && wallpaper?.imageFile == null && (type == WallpaperType.Empty || type == null))
) && base.themeName == themeName
fun withUpdatedColor(name: ThemeColor, color: String?): ThemeOverrides {
return copy(
colors = when (name) {
ThemeColor.PRIMARY -> colors.copy(primary = color)
ThemeColor.PRIMARY_VARIANT -> colors.copy(primaryVariant = color)
ThemeColor.SECONDARY -> colors.copy(secondary = color)
ThemeColor.SECONDARY_VARIANT -> colors.copy(secondaryVariant = color)
ThemeColor.BACKGROUND -> colors.copy(background = color)
ThemeColor.SURFACE -> colors.copy(surface = color)
ThemeColor.TITLE -> colors.copy(title = color)
ThemeColor.PRIMARY_VARIANT2 -> colors.copy(primaryVariant2 = color)
ThemeColor.SENT_MESSAGE -> colors.copy(sentMessage = color)
ThemeColor.SENT_QUOTE -> colors.copy(sentQuote = color)
ThemeColor.RECEIVED_MESSAGE -> colors.copy(receivedMessage = color)
ThemeColor.RECEIVED_QUOTE -> colors.copy(receivedQuote = color)
ThemeColor.WALLPAPER_BACKGROUND -> colors.copy()
ThemeColor.WALLPAPER_TINT -> colors.copy()
}, wallpaper = when (name) {
ThemeColor.WALLPAPER_BACKGROUND -> wallpaper?.copy(background = color)
ThemeColor.WALLPAPER_TINT -> wallpaper?.copy(tint = color)
else -> wallpaper?.copy()
}
)
}
fun toColors(base: DefaultTheme, perChatTheme: ThemeColors?, perUserTheme: ThemeColors?, presetWallpaperTheme: ThemeColors?): Colors {
val baseColors = when (base) {
DefaultTheme.LIGHT -> LightColorPalette
DefaultTheme.DARK -> DarkColorPalette
DefaultTheme.SIMPLEX -> SimplexColorPalette
// shouldn't be here
DefaultTheme.SYSTEM -> LightColorPalette
DefaultTheme.BLACK -> BlackColorPalette
}
return baseColors.copy(
primary = primary?.colorFromReadableHex() ?: baseColors.primary,
primaryVariant = primaryVariant?.colorFromReadableHex() ?: baseColors.primaryVariant,
secondary = secondary?.colorFromReadableHex() ?: baseColors.secondary,
secondaryVariant = secondaryVariant?.colorFromReadableHex() ?: baseColors.secondaryVariant,
background = background?.colorFromReadableHex() ?: baseColors.background,
surface = surface?.colorFromReadableHex() ?: baseColors.surface,
primary = perChatTheme?.primary?.colorFromReadableHex() ?: perUserTheme?.primary?.colorFromReadableHex() ?: colors.primary?.colorFromReadableHex() ?: presetWallpaperTheme?.primary?.colorFromReadableHex() ?: baseColors.primary,
primaryVariant = perChatTheme?.primaryVariant?.colorFromReadableHex() ?: perUserTheme?.primaryVariant?.colorFromReadableHex() ?: colors.primaryVariant?.colorFromReadableHex() ?: presetWallpaperTheme?.primaryVariant?.colorFromReadableHex() ?: baseColors.primaryVariant,
secondary = perChatTheme?.secondary?.colorFromReadableHex() ?: perUserTheme?.secondary?.colorFromReadableHex() ?: colors.secondary?.colorFromReadableHex() ?: presetWallpaperTheme?.secondary?.colorFromReadableHex() ?: baseColors.secondary,
secondaryVariant = perChatTheme?.secondaryVariant?.colorFromReadableHex() ?: perUserTheme?.secondaryVariant?.colorFromReadableHex() ?: colors.secondaryVariant?.colorFromReadableHex() ?: presetWallpaperTheme?.secondaryVariant?.colorFromReadableHex() ?: baseColors.secondaryVariant,
background = perChatTheme?.background?.colorFromReadableHex() ?: perUserTheme?.background?.colorFromReadableHex() ?: colors.background?.colorFromReadableHex() ?: presetWallpaperTheme?.background?.colorFromReadableHex() ?: baseColors.background,
surface = perChatTheme?.surface?.colorFromReadableHex() ?: perUserTheme?.surface?.colorFromReadableHex() ?: colors.surface?.colorFromReadableHex() ?: presetWallpaperTheme?.surface?.colorFromReadableHex() ?: baseColors.surface,
)
}
fun toAppColors(base: DefaultTheme): AppColors {
fun toAppColors(base: DefaultTheme, perChatTheme: ThemeColors?, perChatWallpaperType: WallpaperType?, perUserTheme: ThemeColors?, perUserWallpaperType: WallpaperType?, presetWallpaperTheme: ThemeColors?): AppColors {
val baseColors = when (base) {
DefaultTheme.LIGHT -> LightColorPaletteApp
DefaultTheme.DARK -> DarkColorPaletteApp
DefaultTheme.SIMPLEX -> SimplexColorPaletteApp
// shouldn't be here
DefaultTheme.SYSTEM -> LightColorPaletteApp
DefaultTheme.BLACK -> BlackColorPaletteApp
}
val sentMessageFallback = colors.sentMessage?.colorFromReadableHex() ?: presetWallpaperTheme?.sentMessage?.colorFromReadableHex() ?: baseColors.sentMessage
val sentQuoteFallback = colors.sentQuote?.colorFromReadableHex() ?: presetWallpaperTheme?.sentQuote?.colorFromReadableHex() ?: baseColors.sentQuote
val receivedMessageFallback = colors.receivedMessage?.colorFromReadableHex() ?: presetWallpaperTheme?.receivedMessage?.colorFromReadableHex() ?: baseColors.receivedMessage
val receivedQuoteFallback = colors.receivedQuote?.colorFromReadableHex() ?: presetWallpaperTheme?.receivedQuote?.colorFromReadableHex() ?: baseColors.receivedQuote
return baseColors.copy(
title = title?.colorFromReadableHex() ?: baseColors.title,
sentMessage = sentMessage?.colorFromReadableHex() ?: baseColors.sentMessage,
receivedMessage = receivedMessage?.colorFromReadableHex() ?: baseColors.receivedMessage,
title = perChatTheme?.title?.colorFromReadableHex() ?: perUserTheme?.title?.colorFromReadableHex() ?: colors.title?.colorFromReadableHex() ?: presetWallpaperTheme?.title?.colorFromReadableHex() ?: baseColors.title,
primaryVariant2 = perChatTheme?.primaryVariant2?.colorFromReadableHex() ?: perUserTheme?.primaryVariant2?.colorFromReadableHex() ?: colors.primaryVariant2?.colorFromReadableHex() ?: presetWallpaperTheme?.primaryVariant2?.colorFromReadableHex() ?: baseColors.primaryVariant2,
sentMessage = if (perChatTheme?.sentMessage != null) perChatTheme.sentMessage.colorFromReadableHex()
else if (perUserTheme != null && (perChatWallpaperType == null || perUserWallpaperType == null || perChatWallpaperType.sameType(perUserWallpaperType))) perUserTheme.sentMessage?.colorFromReadableHex() ?: sentMessageFallback
else sentMessageFallback,
sentQuote = if (perChatTheme?.sentQuote != null) perChatTheme.sentQuote.colorFromReadableHex()
else if (perUserTheme != null && (perChatWallpaperType == null || perUserWallpaperType == null || perChatWallpaperType.sameType(perUserWallpaperType))) perUserTheme.sentQuote?.colorFromReadableHex() ?: sentQuoteFallback
else sentQuoteFallback,
receivedMessage = if (perChatTheme?.receivedMessage != null) perChatTheme.receivedMessage.colorFromReadableHex()
else if (perUserTheme != null && (perChatWallpaperType == null || perUserWallpaperType == null || perChatWallpaperType.sameType(perUserWallpaperType))) perUserTheme.receivedMessage?.colorFromReadableHex() ?: receivedMessageFallback
else receivedMessageFallback,
receivedQuote = if (perChatTheme?.receivedQuote != null) perChatTheme.receivedQuote.colorFromReadableHex()
else if (perUserTheme != null && (perChatWallpaperType == null || perUserWallpaperType == null || perChatWallpaperType.sameType(perUserWallpaperType))) perUserTheme.receivedQuote?.colorFromReadableHex() ?: receivedQuoteFallback
else receivedQuoteFallback,
)
}
fun withFilledColors(base: DefaultTheme): ThemeColors {
val c = toColors(base)
val ac = toAppColors(base)
fun toAppWallpaper(themeOverridesForType: WallpaperType?, perChatTheme: ThemeModeOverride?, perUserTheme: ThemeModeOverride?, materialBackgroundColor: Color): AppWallpaper {
val mainType = when {
themeOverridesForType != null -> themeOverridesForType
// type can be null if override is empty `"wallpaper": "{}"`, in this case no wallpaper is needed, empty.
// It's not null to override upper level wallpaper
perChatTheme?.wallpaper != null -> perChatTheme.wallpaper.toAppWallpaper().type
perUserTheme?.wallpaper != null -> perUserTheme.wallpaper.toAppWallpaper().type
else -> wallpaper?.toAppWallpaper()?.type ?: return AppWallpaper()
}
val first: ThemeWallpaper? = if (mainType.sameType(perChatTheme?.wallpaper?.toAppWallpaper()?.type)) perChatTheme?.wallpaper else null
val second: ThemeWallpaper? = if (mainType.sameType(perUserTheme?.wallpaper?.toAppWallpaper()?.type)) perUserTheme?.wallpaper else null
val third: ThemeWallpaper? = if (mainType.sameType(this.wallpaper?.toAppWallpaper()?.type)) this.wallpaper else null
return AppWallpaper(type = when (mainType) {
is WallpaperType.Preset -> mainType.copy(
scale = mainType.scale ?: first?.scale ?: second?.scale ?: third?.scale
)
is WallpaperType.Image -> mainType.copy(
scale = if (themeOverridesForType == null) mainType.scale ?: first?.scale ?: second?.scale ?: third?.scale else second?.scale ?: third?.scale ?: mainType.scale,
scaleType = if (themeOverridesForType == null) mainType.scaleType ?: first?.scaleType ?: second?.scaleType ?: third?.scaleType else second?.scaleType ?: third?.scaleType ?: mainType.scaleType,
filename = if (themeOverridesForType == null) mainType.filename else first?.imageFile ?: second?.imageFile ?: third?.imageFile ?: mainType.filename,
)
is WallpaperType.Empty -> mainType
},
background = (first?.background ?: second?.background ?: third?.background)?.colorFromReadableHex() ?: mainType.defaultBackgroundColor(base, materialBackgroundColor),
tint = (first?.tint ?: second?.tint ?: third?.tint)?.colorFromReadableHex() ?: mainType.defaultTintColor(base)
)
}
fun withFilledColors(base: DefaultTheme, perChatTheme: ThemeColors?, perChatWallpaperType: WallpaperType?, perUserTheme: ThemeColors?, perUserWallpaperType: WallpaperType?, presetWallpaperTheme: ThemeColors?): ThemeColors {
val c = toColors(base, perChatTheme, perUserTheme, presetWallpaperTheme)
val ac = toAppColors(base, perChatTheme, perChatWallpaperType, perUserTheme, perUserWallpaperType, presetWallpaperTheme)
return ThemeColors(
primary = c.primary.toReadableHex(),
primaryVariant = c.primaryVariant.toReadableHex(),
@@ -139,23 +419,71 @@ data class ThemeColors(
background = c.background.toReadableHex(),
surface = c.surface.toReadableHex(),
title = ac.title.toReadableHex(),
primaryVariant2 = ac.primaryVariant2.toReadableHex(),
sentMessage = ac.sentMessage.toReadableHex(),
receivedMessage = ac.receivedMessage.toReadableHex()
sentQuote = ac.sentQuote.toReadableHex(),
receivedMessage = ac.receivedMessage.toReadableHex(),
receivedQuote = ac.receivedQuote.toReadableHex(),
)
}
}
private fun String.colorFromReadableHex(): Color =
Color(this.replace("#", "").toLongOrNull(16) ?: Color.White.toArgb().toLong())
fun List<ThemeOverrides>.getTheme(themeId: String?): ThemeOverrides? =
firstOrNull { it.themeId == themeId }
private fun Color.toReadableHex(): String = "#" + Integer.toHexString(toArgb())
fun List<ThemeOverrides>.getTheme(themeId: String?, type: WallpaperType?, base: DefaultTheme): ThemeOverrides? =
firstOrNull { it.themeId == themeId || it.isSame(type, base.themeName)}
fun List<ThemeOverrides>.replace(theme: ThemeOverrides): List<ThemeOverrides> {
val index = indexOfFirst { it.themeId == theme.themeId ||
// prevent situation when two themes has the same type but different theme id (maybe something was changed in prefs by hand)
it.isSame(WallpaperType.from(theme.wallpaper), theme.base.themeName)
}
return if (index != -1) {
val a = ArrayList(this)
a[index] = theme
a
} else {
this + theme
}
}
fun List<ThemeOverrides>.sameTheme(type: WallpaperType?, themeName: String): ThemeOverrides? = firstOrNull { it.isSame(type, themeName) }
/** See [ThemesTest.testSkipDuplicates] */
fun List<ThemeOverrides>.skipDuplicates(): List<ThemeOverrides> {
val res = ArrayList<ThemeOverrides>()
forEach { theme ->
val themeType = WallpaperType.from(theme.wallpaper)
if (res.none { it.themeId == theme.themeId || it.isSame(themeType, theme.base.themeName) }) {
res.add(theme)
}
}
return res
}
@Serializable
data class ThemeOverrides (
val base: DefaultTheme,
val colors: ThemeColors
data class ThemeModeOverrides (
val light: ThemeModeOverride? = null,
val dark: ThemeModeOverride? = null
) {
fun withUpdatedColor(name: ThemeColor, color: String): ThemeOverrides {
fun preferredMode(darkTheme: Boolean): ThemeModeOverride? = when (darkTheme) {
false -> light
else -> dark
}
}
@Serializable
data class ThemeModeOverride (
val mode: DefaultThemeMode = CurrentColors.value.base.mode,
val colors: ThemeColors = ThemeColors(),
val wallpaper: ThemeWallpaper? = null,
) {
@Transient
val type = WallpaperType.from(wallpaper)
fun withUpdatedColor(name: ThemeColor, color: String?): ThemeModeOverride {
return copy(colors = when (name) {
ThemeColor.PRIMARY -> colors.copy(primary = color)
ThemeColor.PRIMARY_VARIANT -> colors.copy(primaryVariant = color)
@@ -164,9 +492,97 @@ data class ThemeOverrides (
ThemeColor.BACKGROUND -> colors.copy(background = color)
ThemeColor.SURFACE -> colors.copy(surface = color)
ThemeColor.TITLE -> colors.copy(title = color)
ThemeColor.PRIMARY_VARIANT2 -> colors.copy(primaryVariant2 = color)
ThemeColor.SENT_MESSAGE -> colors.copy(sentMessage = color)
ThemeColor.SENT_QUOTE -> colors.copy(sentQuote = color)
ThemeColor.RECEIVED_MESSAGE -> colors.copy(receivedMessage = color)
})
ThemeColor.RECEIVED_QUOTE -> colors.copy(receivedQuote = color)
ThemeColor.WALLPAPER_BACKGROUND -> colors.copy()
ThemeColor.WALLPAPER_TINT -> colors.copy()
}, wallpaper = when (name) {
ThemeColor.WALLPAPER_BACKGROUND -> wallpaper?.copy(background = color)
ThemeColor.WALLPAPER_TINT -> wallpaper?.copy(tint = color)
else -> wallpaper?.copy()
}
)
}
fun removeSameColors(base: DefaultTheme): ThemeModeOverride {
val c = when (base) {
DefaultTheme.LIGHT -> LightColorPalette
DefaultTheme.DARK -> DarkColorPalette
DefaultTheme.SIMPLEX -> SimplexColorPalette
DefaultTheme.BLACK -> BlackColorPalette
}
val ac = when (base) {
DefaultTheme.LIGHT -> LightColorPaletteApp
DefaultTheme.DARK -> DarkColorPaletteApp
DefaultTheme.SIMPLEX -> SimplexColorPaletteApp
DefaultTheme.BLACK -> BlackColorPaletteApp
}
val w = when (val wallpaperType = WallpaperType.from(wallpaper)) {
is WallpaperType.Preset -> {
val p = PresetWallpaper.from(wallpaperType.filename)
ThemeWallpaper(
preset = wallpaperType.filename,
scale = p?.scale ?: wallpaper?.scale,
scaleType = null,
background = p?.background?.get(base)?.toReadableHex(),
tint = p?.tint?.get(base)?.toReadableHex(),
image = null,
imageFile = null,
)
}
is WallpaperType.Image -> {
ThemeWallpaper(
preset = null,
scale = null,
scaleType = WallpaperScaleType.FILL,
background = Color.Transparent.toReadableHex(),
tint = Color.Transparent.toReadableHex(),
image = null,
imageFile = null,
)
}
else -> {
ThemeWallpaper()
}
}
return copy(
colors = ThemeColors(
primary = if (colors.primary?.colorFromReadableHex() != c.primary) colors.primary else null,
primaryVariant = if (colors.primaryVariant?.colorFromReadableHex() != c.primaryVariant) colors.primaryVariant else null,
secondary = if (colors.secondary?.colorFromReadableHex() != c.secondary) colors.secondary else null,
secondaryVariant = if (colors.secondaryVariant?.colorFromReadableHex() != c.secondaryVariant) colors.secondaryVariant else null,
background = if (colors.background?.colorFromReadableHex() != c.background) colors.background else null,
surface = if (colors.surface?.colorFromReadableHex() != c.surface) colors.surface else null,
title = if (colors.title?.colorFromReadableHex() != ac.title) colors.title else null,
primaryVariant2 = if (colors.primaryVariant2?.colorFromReadableHex() != ac.primaryVariant2) colors.primary else null,
sentMessage = if (colors.sentMessage?.colorFromReadableHex() != ac.sentMessage) colors.sentMessage else null,
sentQuote = if (colors.sentQuote?.colorFromReadableHex() != ac.sentQuote) colors.sentQuote else null,
receivedMessage = if (colors.receivedMessage?.colorFromReadableHex() != ac.receivedMessage) colors.receivedMessage else null,
receivedQuote = if (colors.receivedQuote?.colorFromReadableHex() != ac.receivedQuote) colors.receivedQuote else null,
),
wallpaper = wallpaper?.copy(
preset = wallpaper.preset,
scale = if (wallpaper.scale != w.scale) wallpaper.scale else null,
scaleType = if (wallpaper.scaleType != w.scaleType) wallpaper.scaleType else null,
background = if (wallpaper.background != w.background) wallpaper.background else null,
tint = if (wallpaper.tint != w.tint) wallpaper.tint else null,
image = wallpaper.image,
imageFile = wallpaper.imageFile,
)
)
}
companion object {
fun withFilledAppDefaults(mode: DefaultThemeMode, base: DefaultTheme): ThemeModeOverride =
ThemeModeOverride(
mode = mode,
colors = ThemeOverrides(base = base).withFilledColors(base, null, null, null, null, null),
wallpaper = ThemeWallpaper(preset = PresetWallpaper.SCHOOL.filename)
)
}
}
@@ -204,7 +620,6 @@ val DarkColorPalette = darkColors(
// background = Color.Black,
surface = Color(0xFF222222),
// background = Color(0xFF121212),
// surface = Color(0xFF121212),
error = Color.Red,
onBackground = Color(0xFFFFFBFA),
onSurface = Color(0xFFFFFBFA),
@@ -212,8 +627,11 @@ val DarkColorPalette = darkColors(
)
val DarkColorPaletteApp = AppColors(
title = SimplexBlue,
sentMessage = SentMessageColor,
receivedMessage = Color(0x20B1B0B5)
primaryVariant2 = Color(0xFF18262E),
sentMessage = Color(0xFF18262E),
sentQuote = Color(0xFF1D3847),
receivedMessage = Color(0xff262627),
receivedQuote = Color(0xff373739),
)
val LightColorPalette = lightColors(
@@ -231,8 +649,11 @@ val LightColorPalette = lightColors(
)
val LightColorPaletteApp = AppColors(
title = SimplexBlue,
sentMessage = SentMessageColor,
receivedMessage = Color(0x20B1B0B5)
primaryVariant2 = Color(0xFFE9F7FF),
sentMessage = Color(0xFFE9F7FF),
sentQuote = Color(0xFFD6F0FF),
receivedMessage = Color(0xfff5f5f6),
receivedQuote = Color(0xffececee),
)
val SimplexColorPalette = darkColors(
@@ -251,11 +672,39 @@ val SimplexColorPalette = darkColors(
)
val SimplexColorPaletteApp = AppColors(
title = Color(0xFF267BE5),
sentMessage = SentMessageColor,
receivedMessage = Color(0x20B1B0B5)
primaryVariant2 = Color(0xFF172941),
sentMessage = Color(0xFF172941),
sentQuote = Color(0xFF1C3A57),
receivedMessage = Color(0xff25283a),
receivedQuote = Color(0xff36394a),
)
val CurrentColors: MutableStateFlow<ThemeManager.ActiveTheme> = MutableStateFlow(ThemeManager.currentColors(isInNightMode()))
val BlackColorPalette = darkColors(
primary = Color(0xff0077e0), // If this value changes also need to update #0088ff in string resource files
primaryVariant = Color(0xff0077e0),
secondary = HighOrLowlight,
secondaryVariant = DarkGray,
background = Color(0xff070707),
surface = Color(0xff161617),
// background = Color(0xFF121212),
// surface = Color(0xFF121212),
error = Color.Red,
onBackground = Color(0xFFFFFBFA),
onSurface = Color(0xFFFFFBFA),
// onError: Color = Color.Black,
)
val BlackColorPaletteApp = AppColors(
title = Color(0xff0077e0),
primaryVariant2 = Color(0xff243747),
sentMessage = Color(0xFF18262E),
sentQuote = Color(0xFF1D3847),
receivedMessage = Color(0xff1b1b1b),
receivedQuote = Color(0xff29292b),
)
var systemInDarkThemeCurrently: Boolean = isInNightMode()
val CurrentColors: MutableStateFlow<ThemeManager.ActiveTheme> = MutableStateFlow(ThemeManager.currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPreferences.themeOverrides.get()))
@Composable
fun isInDarkTheme(): Boolean = !CurrentColors.collectAsState().value.colors.isLight
@@ -263,31 +712,113 @@ fun isInDarkTheme(): Boolean = !CurrentColors.collectAsState().value.colors.isLi
@Composable
expect fun isSystemInDarkTheme(): Boolean
internal val LocalAppColors = staticCompositionLocalOf { LightColorPaletteApp }
internal val LocalAppWallpaper = staticCompositionLocalOf { AppWallpaper() }
val MaterialTheme.appColors: AppColors
@Composable
@ReadOnlyComposable
get() = LocalAppColors.current
fun AppColors.updateColorsFrom(other: AppColors) {
title = other.title
primaryVariant2 = other.primaryVariant2
sentMessage = other.sentMessage
sentQuote = other.sentQuote
receivedMessage = other.receivedMessage
receivedQuote = other.receivedQuote
}
fun AppWallpaper.updateWallpaperFrom(other: AppWallpaper) {
background = other.background
tint = other.tint
type = other.type
}
val MaterialTheme.wallpaper: AppWallpaper
@Composable
@ReadOnlyComposable
get() = LocalAppWallpaper.current
fun reactOnDarkThemeChanges(isDark: Boolean) {
if (ChatController.appPrefs.currentTheme.get() == DefaultTheme.SYSTEM.name && CurrentColors.value.colors.isLight == isDark) {
systemInDarkThemeCurrently = isDark
if (ChatController.appPrefs.currentTheme.get() == DefaultTheme.SYSTEM_THEME_NAME && CurrentColors.value.colors.isLight == isDark) {
// Change active colors from light to dark and back based on system theme
ThemeManager.applyTheme(DefaultTheme.SYSTEM.name, isDark)
ThemeManager.applyTheme(DefaultTheme.SYSTEM_THEME_NAME)
}
}
@Composable
fun SimpleXTheme(darkTheme: Boolean? = null, content: @Composable () -> Unit) {
LaunchedEffect(darkTheme) {
// For preview
if (darkTheme != null)
CurrentColors.value = ThemeManager.currentColors(darkTheme)
}
val systemDark = isSystemInDarkTheme()
LaunchedEffect(systemDark) {
reactOnDarkThemeChanges(systemDark)
// TODO: Fix preview working with dark/light theme
// LaunchedEffect(darkTheme) {
// // For preview
// if (darkTheme != null)
// CurrentColors.value = ThemeManager.currentColors(darkTheme, null, null, chatModel.currentUser.value?.uiThemes, appPreferences.themeOverrides.get())
// }
val systemDark = rememberUpdatedState(isSystemInDarkTheme())
LaunchedEffect(Unit) {
// snapshotFlow vs LaunchedEffect reduce number of recomposes
snapshotFlow { systemDark.value }
.collect {
reactOnDarkThemeChanges(systemDark.value)
}
}
val theme by CurrentColors.collectAsState()
LaunchedEffect(Unit) {
// snapshotFlow vs LaunchedEffect reduce number of recomposes when user is changed or it's themes
snapshotFlow { chatModel.currentUser.value?.uiThemes }
.collect {
ThemeManager.applyTheme(appPrefs.currentTheme.get()!!)
}
}
MaterialTheme(
colors = theme.colors,
typography = Typography,
shapes = Shapes,
content = {
CompositionLocalProvider(LocalContentColor provides MaterialTheme.colors.onBackground, content = content)
val rememberedAppColors = remember {
// Explicitly creating a new object here so we don't mutate the initial [appColors]
// provided, and overwrite the values set in it.
theme.appColors.copy()
}.apply { updateColorsFrom(theme.appColors) }
val rememberedWallpaper = remember {
// Explicitly creating a new object here so we don't mutate the initial [wallpaper]
// provided, and overwrite the values set in it.
theme.wallpaper.copy()
}.apply { updateWallpaperFrom(theme.wallpaper) }
CompositionLocalProvider(
LocalContentColor provides MaterialTheme.colors.onBackground,
LocalAppColors provides rememberedAppColors,
LocalAppWallpaper provides rememberedWallpaper,
content = content)
}
)
}
@Composable
fun SimpleXThemeOverride(theme: ThemeManager.ActiveTheme, content: @Composable () -> Unit) {
MaterialTheme(
colors = theme.colors,
typography = Typography,
shapes = Shapes,
content = {
val rememberedAppColors = remember {
// Explicitly creating a new object here so we don't mutate the initial [appColors]
// provided, and overwrite the values set in it.
theme.appColors.copy()
}.apply { updateColorsFrom(theme.appColors) }
val rememberedWallpaper = remember {
// Explicitly creating a new object here so we don't mutate the initial [wallpaper]
// provided, and overwrite the values set in it.
theme.wallpaper.copy()
}.apply { updateWallpaperFrom(theme.wallpaper) }
CompositionLocalProvider(
LocalContentColor provides MaterialTheme.colors.onBackground,
LocalAppColors provides rememberedAppColors,
LocalAppWallpaper provides rememberedWallpaper,
content = content)
}
)
}
@@ -1,14 +1,14 @@
package chat.simplex.common.ui.theme
import androidx.compose.material.Colors
import androidx.compose.runtime.MutableState
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.text.font.FontFamily
import chat.simplex.res.MR
import chat.simplex.common.model.AppPreferences
import chat.simplex.common.model.ChatController
import chat.simplex.common.platform.platform
import chat.simplex.common.views.helpers.generalGetString
import chat.simplex.common.model.*
import chat.simplex.common.platform.*
import chat.simplex.common.views.helpers.*
import java.io.File
// https://github.com/rsms/inter
// I place it here because IDEA shows an error (but still works anyway) when this declaration inside Type.kt
@@ -18,140 +18,215 @@ expect val EmojiFont: FontFamily
object ThemeManager {
private val appPrefs: AppPreferences = ChatController.appPrefs
data class ActiveTheme(val name: String, val base: DefaultTheme, val colors: Colors, val appColors: AppColors)
data class ActiveTheme(val name: String, val base: DefaultTheme, val colors: Colors, val appColors: AppColors, val wallpaper: AppWallpaper = AppWallpaper())
private fun systemDarkThemeColors(): Pair<Colors, DefaultTheme> = when (appPrefs.systemDarkTheme.get()) {
DefaultTheme.DARK.name -> DarkColorPalette to DefaultTheme.DARK
DefaultTheme.SIMPLEX.name -> SimplexColorPalette to DefaultTheme.SIMPLEX
DefaultTheme.DARK.themeName -> DarkColorPalette to DefaultTheme.DARK
DefaultTheme.SIMPLEX.themeName -> SimplexColorPalette to DefaultTheme.SIMPLEX
DefaultTheme.BLACK.themeName -> BlackColorPalette to DefaultTheme.BLACK
else -> SimplexColorPalette to DefaultTheme.SIMPLEX
}
fun currentColors(darkForSystemTheme: Boolean): ActiveTheme {
private fun nonSystemThemeName(): String {
val themeName = appPrefs.currentTheme.get()!!
val themeOverrides = appPrefs.themeOverrides.get()
val nonSystemThemeName = if (themeName != DefaultTheme.SYSTEM.name) {
return if (themeName != DefaultTheme.SYSTEM_THEME_NAME) {
themeName
} else {
if (darkForSystemTheme) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.name
if (systemInDarkThemeCurrently) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.themeName
}
val theme = themeOverrides[nonSystemThemeName]
}
fun defaultActiveTheme(appSettingsTheme: List<ThemeOverrides>): ThemeOverrides? {
val nonSystemThemeName = nonSystemThemeName()
val defaultThemeId = appPrefs.currentThemeIds.get()[nonSystemThemeName]
return appSettingsTheme.getTheme(defaultThemeId)
}
fun defaultActiveTheme(perUserTheme: ThemeModeOverrides?, appSettingsTheme: List<ThemeOverrides>): ThemeModeOverride {
val perUserTheme = if (!CurrentColors.value.colors.isLight) perUserTheme?.dark else perUserTheme?.light
if (perUserTheme != null) {
return perUserTheme
}
val defaultTheme = defaultActiveTheme(appSettingsTheme)
return ThemeModeOverride(colors = defaultTheme?.colors ?: ThemeColors(), wallpaper = defaultTheme?.wallpaper)
}
fun currentColors(themeOverridesForType: WallpaperType?, perChatTheme: ThemeModeOverride?, perUserTheme: ThemeModeOverrides?, appSettingsTheme: List<ThemeOverrides>): ActiveTheme {
val themeName = appPrefs.currentTheme.get()!!
val nonSystemThemeName = nonSystemThemeName()
val defaultTheme = defaultActiveTheme(appSettingsTheme)
val baseTheme = when (nonSystemThemeName) {
DefaultTheme.LIGHT.name -> Triple(DefaultTheme.LIGHT, LightColorPalette, LightColorPaletteApp)
DefaultTheme.DARK.name -> Triple(DefaultTheme.DARK, DarkColorPalette, DarkColorPaletteApp)
DefaultTheme.SIMPLEX.name -> Triple(DefaultTheme.SIMPLEX, SimplexColorPalette, SimplexColorPaletteApp)
else -> Triple(DefaultTheme.LIGHT, LightColorPalette, LightColorPaletteApp)
DefaultTheme.LIGHT.themeName -> ActiveTheme(DefaultTheme.LIGHT.themeName, DefaultTheme.LIGHT, LightColorPalette, LightColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.LIGHT)))
DefaultTheme.DARK.themeName -> ActiveTheme(DefaultTheme.DARK.themeName, DefaultTheme.DARK, DarkColorPalette, DarkColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.DARK)))
DefaultTheme.SIMPLEX.themeName -> ActiveTheme(DefaultTheme.SIMPLEX.themeName, DefaultTheme.SIMPLEX, SimplexColorPalette, SimplexColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.SIMPLEX)))
DefaultTheme.BLACK.themeName -> ActiveTheme(DefaultTheme.BLACK.themeName, DefaultTheme.BLACK, BlackColorPalette, BlackColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.BLACK)))
else -> ActiveTheme(DefaultTheme.LIGHT.themeName, DefaultTheme.LIGHT, LightColorPalette, LightColorPaletteApp, AppWallpaper(type = PresetWallpaper.SCHOOL.toType(DefaultTheme.LIGHT)))
}
if (theme == null) {
return ActiveTheme(themeName, baseTheme.first, baseTheme.second, baseTheme.third)
val perUserTheme = if (baseTheme.colors.isLight) perUserTheme?.light else perUserTheme?.dark
val theme = (appSettingsTheme.sameTheme(themeOverridesForType ?: perChatTheme?.type ?: perUserTheme?.type ?: defaultTheme?.wallpaper?.toAppWallpaper()?.type, nonSystemThemeName) ?: defaultTheme)
if (theme == null && perUserTheme == null && perChatTheme == null && themeOverridesForType == null) {
return ActiveTheme(themeName, baseTheme.base, baseTheme.colors, baseTheme.appColors, baseTheme.wallpaper)
}
return ActiveTheme(themeName, baseTheme.first, theme.colors.toColors(theme.base), theme.colors.toAppColors(theme.base))
val presetWallpaperTheme = when {
perChatTheme?.wallpaper != null -> if (perChatTheme.wallpaper.preset != null) PresetWallpaper.from(perChatTheme.wallpaper.preset)?.colors?.get(baseTheme.base) else null
perUserTheme?.wallpaper != null -> if (perUserTheme.wallpaper.preset != null) PresetWallpaper.from(perUserTheme.wallpaper.preset)?.colors?.get(baseTheme.base) else null
else -> if (theme?.wallpaper?.preset != null) PresetWallpaper.from(theme.wallpaper.preset)?.colors?.get(baseTheme.base) else null
}
val themeOrEmpty = theme ?: ThemeOverrides(base = baseTheme.base)
val colors = themeOrEmpty.toColors(themeOrEmpty.base, perChatTheme?.colors, perUserTheme?.colors, presetWallpaperTheme)
return ActiveTheme(
themeName,
baseTheme.base,
colors,
themeOrEmpty.toAppColors(themeOrEmpty.base, perChatTheme?.colors, perChatTheme?.type, perUserTheme?.colors, perUserTheme?.type, presetWallpaperTheme),
themeOrEmpty.toAppWallpaper(themeOverridesForType, perChatTheme, perUserTheme, colors.background)
)
}
fun currentThemeOverridesForExport(darkForSystemTheme: Boolean): ThemeOverrides {
val themeName = appPrefs.currentTheme.get()!!
val nonSystemThemeName = if (themeName != DefaultTheme.SYSTEM.name) {
themeName
} else {
if (darkForSystemTheme) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.name
}
val overrides = appPrefs.themeOverrides.get().toMutableMap()
val nonFilledTheme = overrides[nonSystemThemeName] ?: ThemeOverrides(base = CurrentColors.value.base, colors = ThemeColors())
return nonFilledTheme.copy(colors = nonFilledTheme.colors.withFilledColors(CurrentColors.value.base))
fun currentThemeOverridesForExport(perChatTheme: ThemeModeOverride?, perUserTheme: ThemeModeOverrides?): ThemeOverrides {
val current = currentColors(null, perChatTheme, perUserTheme, appPrefs.themeOverrides.get())
val wType = current.wallpaper.type
val wBackground = current.wallpaper.background
val wTint = current.wallpaper.tint
return ThemeOverrides(
themeId = "",
base = current.base,
colors = ThemeColors.from(current.colors, current.appColors),
wallpaper = if (wType !is WallpaperType.Empty) ThemeWallpaper.from(wType, wBackground?.toReadableHex(), wTint?.toReadableHex()).withFilledWallpaperBase64() else null
)
}
// colors, default theme enum, localized name of theme
fun allThemes(darkForSystemTheme: Boolean): List<Triple<Colors, DefaultTheme, String>> {
val allThemes = ArrayList<Triple<Colors, DefaultTheme, String>>()
allThemes.add(
Triple(
if (darkForSystemTheme) systemDarkThemeColors().first else LightColorPalette,
DefaultTheme.SYSTEM,
generalGetString(MR.strings.theme_system)
)
)
allThemes.add(
Triple(
LightColorPalette,
DefaultTheme.LIGHT,
generalGetString(MR.strings.theme_light)
)
)
allThemes.add(
Triple(
DarkColorPalette,
DefaultTheme.DARK,
generalGetString(MR.strings.theme_dark)
)
)
allThemes.add(
Triple(
SimplexColorPalette,
DefaultTheme.SIMPLEX,
generalGetString(MR.strings.theme_simplex)
)
)
return allThemes
}
fun applyTheme(theme: String, darkForSystemTheme: Boolean) {
fun applyTheme(theme: String) {
appPrefs.currentTheme.set(theme)
CurrentColors.value = currentColors(darkForSystemTheme)
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
platform.androidSetNightModeIfSupported()
}
fun changeDarkTheme(theme: String, darkForSystemTheme: Boolean) {
fun changeDarkTheme(theme: String) {
appPrefs.systemDarkTheme.set(theme)
CurrentColors.value = currentColors(darkForSystemTheme)
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun saveAndApplyThemeColor(name: ThemeColor, color: Color? = null, darkForSystemTheme: Boolean) {
val themeName = appPrefs.currentTheme.get()!!
val nonSystemThemeName = if (themeName != DefaultTheme.SYSTEM.name) {
themeName
} else {
if (darkForSystemTheme) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.name
fun saveAndApplyThemeColor(baseTheme: DefaultTheme, name: ThemeColor, color: Color? = null, pref: SharedPreference<List<ThemeOverrides>> = appPrefs.themeOverrides) {
val nonSystemThemeName = baseTheme.themeName
val overrides = pref.get()
val themeId = appPrefs.currentThemeIds.get()[nonSystemThemeName]
val prevValue = overrides.getTheme(themeId) ?: ThemeOverrides(base = baseTheme)
pref.set(overrides.replace(prevValue.withUpdatedColor(name, color?.toReadableHex())))
val themeIds = appPrefs.currentThemeIds.get().toMutableMap()
themeIds[nonSystemThemeName] = prevValue.themeId
appPrefs.currentThemeIds.set(themeIds)
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun applyThemeColor(name: ThemeColor, color: Color? = null, pref: MutableState<ThemeModeOverride>) {
pref.value = pref.value.withUpdatedColor(name, color?.toReadableHex())
}
fun saveAndApplyWallpaper(baseTheme: DefaultTheme, type: WallpaperType?, pref: SharedPreference<List<ThemeOverrides>> = appPrefs.themeOverrides) {
val nonSystemThemeName = baseTheme.themeName
val overrides = pref.get()
val theme = overrides.sameTheme(type, baseTheme.themeName)
val prevValue = theme ?: ThemeOverrides(base = baseTheme)
pref.set(overrides.replace(prevValue.copy(wallpaper = if (type != null && type !is WallpaperType.Empty) ThemeWallpaper.from(type, prevValue.wallpaper?.background, prevValue.wallpaper?.tint) else null)))
val themeIds = appPrefs.currentThemeIds.get().toMutableMap()
themeIds[nonSystemThemeName] = prevValue.themeId
appPrefs.currentThemeIds.set(themeIds)
CurrentColors.value = currentColors( null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun copyFromSameThemeOverrides(type: WallpaperType?, lowerLevelOverride: ThemeModeOverride?, pref: MutableState<ThemeModeOverride>): Boolean {
val overrides = appPrefs.themeOverrides.get()
val sameWallpaper = if (lowerLevelOverride?.type?.sameType(type) == true) lowerLevelOverride.wallpaper else overrides.sameTheme(type, CurrentColors.value.base.themeName)?.wallpaper
if (sameWallpaper == null) {
if (type != null) {
pref.value = ThemeModeOverride(wallpaper = ThemeWallpaper.from(type, null, null).copy(scale = null, scaleType = null))
} else {
// Make an empty wallpaper to override any top level ones
pref.value = ThemeModeOverride(wallpaper = ThemeWallpaper())
}
return true
}
var colorToSet = color
if (colorToSet == null) {
// Setting default color from a base theme
colorToSet = when(nonSystemThemeName) {
DefaultTheme.LIGHT.name -> name.fromColors(LightColorPalette, LightColorPaletteApp)
DefaultTheme.DARK.name -> name.fromColors(DarkColorPalette, DarkColorPaletteApp)
DefaultTheme.SIMPLEX.name -> name.fromColors(SimplexColorPalette, SimplexColorPaletteApp)
// Will not be here
else -> return
var type = sameWallpaper.toAppWallpaper().type
if (type is WallpaperType.Image && sameWallpaper.imageFile == type.filename) {
// same image file. Needs to be copied first in order to be able to remove the file once it's not needed anymore without affecting main theme override
val filename = saveWallpaperFile(File(getWallpaperFilePath(type.filename)).toURI())
if (filename != null) {
type = WallpaperType.Image(filename, type.scale, type.scaleType)
} else {
Log.e(TAG, "Error while copying wallpaper from global overrides to chat overrides")
return false
}
}
val overrides = appPrefs.themeOverrides.get().toMutableMap()
val prevValue = overrides[nonSystemThemeName] ?: ThemeOverrides(base = CurrentColors.value.base, colors = ThemeColors())
overrides[nonSystemThemeName] = prevValue.withUpdatedColor(name, colorToSet.toReadableHex())
appPrefs.themeOverrides.set(overrides)
CurrentColors.value = currentColors(!CurrentColors.value.colors.isLight)
val prevValue = pref.value
pref.value = prevValue.copy(
colors = ThemeColors(),
wallpaper = ThemeWallpaper.from(type, null, null).copy(scale = null, scaleType = null)
)
return true
}
fun saveAndApplyThemeOverrides(theme: ThemeOverrides, darkForSystemTheme: Boolean) {
val overrides = appPrefs.themeOverrides.get().toMutableMap()
val prevValue = overrides[theme.base.name] ?: ThemeOverrides(base = CurrentColors.value.base, colors = ThemeColors())
overrides[theme.base.name] = prevValue.copy(colors = theme.colors)
appPrefs.themeOverrides.set(overrides)
appPrefs.currentTheme.set(theme.base.name)
CurrentColors.value = currentColors(!CurrentColors.value.colors.isLight)
fun applyWallpaper(type: WallpaperType?, pref: MutableState<ThemeModeOverride>) {
val prevValue = pref.value
pref.value = prevValue.copy(
wallpaper = if (type != null)
ThemeWallpaper.from(type, prevValue.wallpaper?.background, prevValue.wallpaper?.tint)
else null
)
}
fun resetAllThemeColors(darkForSystemTheme: Boolean) {
val themeName = appPrefs.currentTheme.get()!!
val nonSystemThemeName = if (themeName != DefaultTheme.SYSTEM.name) {
themeName
} else {
if (darkForSystemTheme) appPrefs.systemDarkTheme.get()!! else DefaultTheme.LIGHT.name
fun saveAndApplyThemeOverrides(theme: ThemeOverrides, pref: SharedPreference<List<ThemeOverrides>> = appPrefs.themeOverrides) {
val wallpaper = theme.wallpaper?.importFromString()
val nonSystemThemeName = theme.base.themeName
val overrides = pref.get()
val prevValue = overrides.getTheme(null, wallpaper?.toAppWallpaper()?.type, theme.base) ?: ThemeOverrides(base = theme.base)
if (prevValue.wallpaper?.imageFile != null) {
File(getWallpaperFilePath(prevValue.wallpaper.imageFile)).delete()
}
pref.set(overrides.replace(prevValue.copy(base = theme.base, colors = theme.colors, wallpaper = wallpaper)))
appPrefs.currentTheme.set(nonSystemThemeName)
val currentThemeIds = appPrefs.currentThemeIds.get().toMutableMap()
currentThemeIds[nonSystemThemeName] = prevValue.themeId
appPrefs.currentThemeIds.set(currentThemeIds)
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun resetAllThemeColors(pref: SharedPreference<List<ThemeOverrides>> = appPrefs.themeOverrides) {
val nonSystemThemeName = nonSystemThemeName()
val themeId = appPrefs.currentThemeIds.get()[nonSystemThemeName] ?: return
val overrides = pref.get()
val prevValue = overrides.getTheme(themeId) ?: return
pref.set(overrides.replace(prevValue.copy(colors = ThemeColors(), wallpaper = prevValue.wallpaper?.copy(background = null, tint = null))))
CurrentColors.value = currentColors(null, null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
fun resetAllThemeColors(pref: MutableState<ThemeModeOverride>) {
val prevValue = pref.value
pref.value = prevValue.copy(colors = ThemeColors(), wallpaper = prevValue.wallpaper?.copy(background = null, tint = null))
}
fun removeTheme(themeId: String?) {
val themes = ArrayList(appPrefs.themeOverrides.get())
themes.removeAll { it.themeId == themeId }
appPrefs.themeOverrides.set(themes)
}
fun String.colorFromReadableHex(): Color =
Color(this.replace("#", "").toLongOrNull(16) ?: Color.White.toArgb().toLong())
fun Color.toReadableHex(): String {
val s = Integer.toHexString(toArgb())
return when {
this == Color.Transparent -> "#00ffffff"
s.length == 1 -> "#ff$s$s$s$s$s$s"
s.length == 2 -> "#ff$s$s$s"
s.length == 3 -> "#ff$s$s"
s.length == 6 && this.alpha == 0f -> "#00$s"
s.length == 6 -> "#ff$s"
else -> "#$s"
}
val overrides = appPrefs.themeOverrides.get().toMutableMap()
val prevValue = overrides[nonSystemThemeName] ?: return
overrides[nonSystemThemeName] = prevValue.copy(colors = ThemeColors())
appPrefs.themeOverrides.set(overrides)
CurrentColors.value = currentColors(!CurrentColors.value.colors.isLight)
}
}
private fun Color.toReadableHex(): String = "#" + Integer.toHexString(toArgb())
@@ -29,6 +29,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.ChatModel.controller
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.*
@@ -41,6 +42,7 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import kotlinx.datetime.Clock
import java.io.File
@Composable
fun ChatInfoView(
@@ -337,6 +339,16 @@ fun ChatInfoLayout(
if (cStats != null && cStats.ratchetSyncAllowed) {
SynchronizeConnectionButton(syncContactConnection)
}
WallpaperButton {
ModalManager.end.showModal {
val chat = remember { derivedStateOf { chatModel.chats.firstOrNull { it.id == chat.id } } }
val c = chat.value
if (c != null) {
ChatWallpaperEditorModal(c)
}
}
}
// } else if (developerTools) {
// SynchronizeConnectionButtonForce(syncContactConnectionForce)
// }
@@ -642,6 +654,15 @@ private fun SendReceiptsOption(currentUser: User, state: State<SendReceipts>, on
)
}
@Composable
fun WallpaperButton(onClick: () -> Unit) {
SettingsActionItem(
painterResource(MR.images.ic_image),
stringResource(MR.strings.settings_section_title_chat_theme),
click = onClick
)
}
@Composable
fun ClearChatButton(onClick: () -> Unit) {
SettingsActionItem(
@@ -675,6 +696,72 @@ fun ShareAddressButton(onClick: () -> Unit) {
)
}
@Composable
fun ModalData.ChatWallpaperEditorModal(chat: Chat) {
val themes = remember(CurrentColors.collectAsState().value.base) {
(chat.chatInfo as? ChatInfo.Direct)?.contact?.uiThemes
?: (chat.chatInfo as? ChatInfo.Group)?.groupInfo?.uiThemes
?: ThemeModeOverrides()
}
val globalThemeUsed = remember { stateGetOrPut("globalThemeUsed") { false } }
val initialTheme = remember(CurrentColors.collectAsState().value.base) {
val preferred = themes.preferredMode(!CurrentColors.value.colors.isLight)
globalThemeUsed.value = preferred == null
preferred ?: ThemeManager.defaultActiveTheme(chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
ChatWallpaperEditor(
initialTheme,
applyToMode = if (themes.light == themes.dark) null else initialTheme.mode,
globalThemeUsed = globalThemeUsed,
save = { applyToMode, newTheme ->
save(applyToMode, newTheme, chatModel.getChat(chat.id) ?: chat)
})
}
suspend fun save(applyToMode: DefaultThemeMode?, newTheme: ThemeModeOverride?, chat: Chat) {
val unchangedThemes: ThemeModeOverrides = ((chat.chatInfo as? ChatInfo.Direct)?.contact?.uiThemes ?: (chat.chatInfo as? ChatInfo.Group)?.groupInfo?.uiThemes) ?: ThemeModeOverrides()
val wallpaperFiles = setOf(unchangedThemes.light?.wallpaper?.imageFile, unchangedThemes.dark?.wallpaper?.imageFile)
var changedThemes: ThemeModeOverrides? = unchangedThemes
val changed = newTheme?.copy(wallpaper = newTheme.wallpaper?.withFilledWallpaperPath())
changedThemes = when (applyToMode) {
null -> changedThemes?.copy(light = changed?.copy(mode = DefaultThemeMode.LIGHT), dark = changed?.copy(mode = DefaultThemeMode.DARK))
DefaultThemeMode.LIGHT -> changedThemes?.copy(light = changed?.copy(mode = applyToMode))
DefaultThemeMode.DARK -> changedThemes?.copy(dark = changed?.copy(mode = applyToMode))
}
changedThemes = if (changedThemes?.light != null || changedThemes?.dark != null) {
val light = changedThemes.light
val dark = changedThemes.dark
val currentMode = CurrentColors.value.base.mode
// same image file for both modes, copy image to make them as different files
if (light?.wallpaper?.imageFile != null && dark?.wallpaper?.imageFile != null && light.wallpaper.imageFile == dark.wallpaper.imageFile) {
val imageFile = if (currentMode == DefaultThemeMode.LIGHT) {
dark.wallpaper.imageFile
} else {
light.wallpaper.imageFile
}
val filePath = saveWallpaperFile(File(getWallpaperFilePath(imageFile)).toURI())
changedThemes = if (currentMode == DefaultThemeMode.LIGHT) {
changedThemes.copy(dark = dark.copy(wallpaper = dark.wallpaper.copy(imageFile = filePath)))
} else {
changedThemes.copy(light = light.copy(wallpaper = light.wallpaper.copy(imageFile = filePath)))
}
}
changedThemes
} else {
null
}
val wallpaperFilesToDelete = wallpaperFiles - changedThemes?.light?.wallpaper?.imageFile - changedThemes?.dark?.wallpaper?.imageFile
wallpaperFilesToDelete.forEach(::removeWallpaperFile)
if (controller.apiSetChatUIThemes(chat.remoteHostId, chat.id, changedThemes)) {
if (chat.chatInfo is ChatInfo.Direct) {
chatModel.updateChatInfo(chat.remoteHostId, chat.chatInfo.copy(contact = chat.chatInfo.contact.copy(uiThemes = changedThemes)))
} else if (chat.chatInfo is ChatInfo.Group) {
chatModel.updateChatInfo(chat.remoteHostId, chat.chatInfo.copy(groupInfo = chat.chatInfo.groupInfo.copy(uiThemes = changedThemes)))
}
}
}
private fun setContactAlias(chat: Chat, localAlias: String, chatModel: ChatModel) = withBGApi {
val chatRh = chat.remoteHostId
chatModel.controller.apiSetContactAlias(chatRh, chat.chatInfo.apiId, localAlias)?.let {
@@ -42,7 +42,7 @@ sealed class CIInfoTab {
@Composable
fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools: Boolean) {
val sent = ci.chatDir.sent
val appColors = CurrentColors.collectAsState().value.appColors
val appColors = MaterialTheme.appColors
val uriHandler = LocalUriHandler.current
val selection = remember { mutableStateOf<CIInfoTab>(CIInfoTab.History) }
@@ -5,25 +5,24 @@ import androidx.compose.foundation.*
import androidx.compose.foundation.gestures.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.mapSaver
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.*
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.graphics.*
import androidx.compose.ui.platform.*
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.intl.Locale
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.text.*
import androidx.compose.ui.unit.*
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.ChatModel.controller
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.call.*
@@ -118,369 +117,381 @@ fun ChatView(chatId: String, chatModel: ChatModel, onComposed: suspend (chatId:
val clipboard = LocalClipboardManager.current
when (chat.chatInfo) {
is ChatInfo.Direct, is ChatInfo.Group, is ChatInfo.Local -> {
ChatLayout(
chat,
unreadCount,
composeState,
composeView = {
Column(
Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
if (
chat.chatInfo is ChatInfo.Direct
&& !chat.chatInfo.contact.ready
&& chat.chatInfo.contact.active
&& !chat.chatInfo.contact.nextSendGrpInv
val perChatTheme = remember(chat.chatInfo, CurrentColors.value.base) { if (chat.chatInfo is ChatInfo.Direct) chat.chatInfo.contact.uiThemes?.preferredMode(!CurrentColors.value.colors.isLight) else if (chat.chatInfo is ChatInfo.Group) chat.chatInfo.groupInfo.uiThemes?.preferredMode(!CurrentColors.value.colors.isLight) else null }
val overrides = if (perChatTheme != null) ThemeManager.currentColors(null, perChatTheme, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get()) else null
SimpleXThemeOverride(overrides ?: CurrentColors.collectAsState().value) {
ChatLayout(
chat,
unreadCount,
composeState,
composeView = {
Column(
Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
generalGetString(MR.strings.contact_connection_pending),
Modifier.padding(top = 4.dp),
fontSize = 14.sp,
color = MaterialTheme.colors.secondary
if (
chat.chatInfo is ChatInfo.Direct
&& !chat.chatInfo.contact.ready
&& chat.chatInfo.contact.active
&& !chat.chatInfo.contact.nextSendGrpInv
) {
Text(
generalGetString(MR.strings.contact_connection_pending),
Modifier.padding(top = 4.dp),
fontSize = 14.sp,
color = MaterialTheme.colors.secondary
)
}
ComposeView(
chatModel, chat, composeState, attachmentOption,
showChooseAttachment = { scope.launch { attachmentBottomSheetState.show() } }
)
}
ComposeView(
chatModel, chat, composeState, attachmentOption,
showChooseAttachment = { scope.launch { attachmentBottomSheetState.show() } }
)
}
},
attachmentOption,
attachmentBottomSheetState,
searchText,
useLinkPreviews = useLinkPreviews,
linkMode = chatModel.simplexLinkMode.value,
back = {
hideKeyboard(view)
AudioPlayer.stop()
chatModel.chatId.value = null
chatModel.groupMembers.clear()
},
info = {
if (ModalManager.end.hasModalsOpen()) {
ModalManager.end.closeModals()
return@ChatLayout
}
hideKeyboard(view)
withBGApi {
// The idea is to preload information before showing a modal because large groups can take time to load all members
var preloadedContactInfo: Pair<ConnectionStats?, Profile?>? = null
var preloadedCode: String? = null
var preloadedLink: Pair<String, GroupMemberRole>? = null
if (chat.chatInfo is ChatInfo.Direct) {
preloadedContactInfo = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
preloadedCode = chatModel.controller.apiGetContactCode(chatRh, chat.chatInfo.apiId)?.second
} else if (chat.chatInfo is ChatInfo.Group) {
setGroupMembers(chatRh, chat.chatInfo.groupInfo, chatModel)
preloadedLink = chatModel.controller.apiGetGroupLink(chatRh, chat.chatInfo.groupInfo.groupId)
},
attachmentOption,
attachmentBottomSheetState,
searchText,
useLinkPreviews = useLinkPreviews,
linkMode = chatModel.simplexLinkMode.value,
back = {
hideKeyboard(view)
AudioPlayer.stop()
chatModel.chatId.value = null
chatModel.groupMembers.clear()
},
info = {
if (ModalManager.end.hasModalsOpen()) {
ModalManager.end.closeModals()
return@ChatLayout
}
ModalManager.end.showModalCloseable(true) { close ->
val chat = remember { activeChat }.value
if (chat?.chatInfo is ChatInfo.Direct) {
var contactInfo: Pair<ConnectionStats?, Profile?>? by remember { mutableStateOf(preloadedContactInfo) }
var code: String? by remember { mutableStateOf(preloadedCode) }
KeyChangeEffect(chat.id, ChatModel.networkStatuses.toMap()) {
contactInfo = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
preloadedContactInfo = contactInfo
code = chatModel.controller.apiGetContactCode(chatRh, chat.chatInfo.apiId)?.second
preloadedCode = code
}
ChatInfoView(chatModel, (chat.chatInfo as ChatInfo.Direct).contact, contactInfo?.first, contactInfo?.second, chat.chatInfo.localAlias, code, close)
} else if (chat?.chatInfo is ChatInfo.Group) {
var link: Pair<String, GroupMemberRole>? by remember(chat.id) { mutableStateOf(preloadedLink) }
KeyChangeEffect(chat.id) {
setGroupMembers(chatRh, (chat.chatInfo as ChatInfo.Group).groupInfo, chatModel)
link = chatModel.controller.apiGetGroupLink(chatRh, chat.chatInfo.groupInfo.groupId)
preloadedLink = link
}
GroupChatInfoView(chatModel, chatRh, chat.id, link?.first, link?.second, {
link = it
preloadedLink = it
}, close)
}
}
}
},
showMemberInfo = { groupInfo: GroupInfo, member: GroupMember ->
hideKeyboard(view)
withBGApi {
val r = chatModel.controller.apiGroupMemberInfo(chatRh, groupInfo.groupId, member.groupMemberId)
val stats = r?.second
val (_, code) = if (member.memberActive) {
val memCode = chatModel.controller.apiGetGroupMemberCode(chatRh, groupInfo.apiId, member.groupMemberId)
member to memCode?.second
} else {
member to null
}
setGroupMembers(chatRh, groupInfo, chatModel)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) { close ->
remember { derivedStateOf { chatModel.getGroupMember(member.groupMemberId) } }.value?.let { mem ->
GroupMemberInfoView(chatRh, groupInfo, mem, stats, code, chatModel, close, close)
}
}
}
},
loadPrevMessages = {
if (chatModel.chatId.value != activeChat.value?.id) return@ChatLayout
val c = chatModel.getChat(chatModel.chatId.value ?: return@ChatLayout)
val firstId = chatModel.chatItems.value.firstOrNull()?.id
if (c != null && firstId != null) {
hideKeyboard(view)
withBGApi {
apiLoadPrevMessages(c, chatModel, firstId, searchText.value)
}
}
},
deleteMessage = { itemId, mode ->
withBGApi {
val cInfo = chat.chatInfo
val toDeleteItem = chatModel.chatItems.value.firstOrNull { it.id == itemId }
val toModerate = toDeleteItem?.memberToModerate(chat.chatInfo)
val groupInfo = toModerate?.first
val groupMember = toModerate?.second
val deletedChatItem: ChatItem?
val toChatItem: ChatItem?
if (mode == CIDeleteMode.cidmBroadcast && groupInfo != null && groupMember != null) {
val r = chatModel.controller.apiDeleteMemberChatItem(
chatRh,
groupId = groupInfo.groupId,
groupMemberId = groupMember.groupMemberId,
itemId = itemId
)
deletedChatItem = r?.first
toChatItem = r?.second
} else {
val r = chatModel.controller.apiDeleteChatItem(
chatRh,
type = cInfo.chatType,
id = cInfo.apiId,
itemId = itemId,
mode = mode
)
deletedChatItem = r?.deletedChatItem?.chatItem
toChatItem = r?.toChatItem?.chatItem
}
if (toChatItem == null && deletedChatItem != null) {
chatModel.removeChatItem(chatRh, cInfo, deletedChatItem)
} else if (toChatItem != null) {
chatModel.upsertChatItem(chatRh, cInfo, toChatItem)
}
}
},
deleteMessages = { itemIds ->
if (itemIds.isNotEmpty()) {
val chatInfo = chat.chatInfo
withBGApi {
val deletedItems: ArrayList<ChatItem> = arrayListOf()
for (itemId in itemIds) {
val di = chatModel.controller.apiDeleteChatItem(
chatRh, chatInfo.chatType, chatInfo.apiId, itemId, CIDeleteMode.cidmInternal
)?.deletedChatItem?.chatItem
if (di != null) {
deletedItems.add(di)
}
}
for (di in deletedItems) {
chatModel.removeChatItem(chatRh, chatInfo, di)
}
}
}
},
receiveFile = { fileId ->
withBGApi { chatModel.controller.receiveFile(chatRh, user, fileId) }
},
cancelFile = { fileId ->
withBGApi { chatModel.controller.cancelFile(chatRh, user, fileId) }
},
joinGroup = { groupId, onComplete ->
withBGApi {
chatModel.controller.apiJoinGroup(chatRh, groupId)
onComplete.invoke()
}
},
startCall = out@{ media ->
withBGApi {
val cInfo = chat.chatInfo
if (cInfo is ChatInfo.Direct) {
val contactInfo = chatModel.controller.apiContactInfo(chat.remoteHostId, cInfo.contact.contactId)
val profile = contactInfo?.second ?: chatModel.currentUser.value?.profile?.toProfile() ?: return@withBGApi
chatModel.activeCall.value = Call(remoteHostId = chatRh, contact = cInfo.contact, callState = CallState.WaitCapabilities, localMedia = media, userProfile = profile)
chatModel.showCallView.value = true
chatModel.callCommand.add(WCallCommand.Capabilities(media))
}
}
},
endCall = {
val call = chatModel.activeCall.value
if (call != null) withBGApi { chatModel.callManager.endCall(call) }
},
acceptCall = { contact ->
hideKeyboard(view)
withBGApi {
val invitation = chatModel.callInvitations.remove(contact.id)
?: controller.apiGetCallInvitations(chatModel.remoteHostId()).firstOrNull { it.contact.id == contact.id }
if (invitation == null) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.call_already_ended))
} else {
chatModel.callManager.acceptIncomingCall(invitation = invitation)
}
}
},
acceptFeature = { contact, feature, param ->
withBGApi {
chatModel.controller.allowFeatureToContact(chatRh, contact, feature, param)
}
},
openDirectChat = { contactId ->
withBGApi {
openDirectChat(chatRh, contactId, chatModel)
}
},
updateContactStats = { contact ->
withBGApi {
val r = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
if (r != null) {
val contactStats = r.first
if (contactStats != null)
chatModel.updateContactConnectionStats(chatRh, contact, contactStats)
}
}
},
updateMemberStats = { groupInfo, member ->
withBGApi {
val r = chatModel.controller.apiGroupMemberInfo(chatRh, groupInfo.groupId, member.groupMemberId)
if (r != null) {
val memStats = r.second
if (memStats != null) {
chatModel.updateGroupMemberConnectionStats(chatRh, groupInfo, r.first, memStats)
}
}
}
},
syncContactConnection = { contact ->
withBGApi {
val cStats = chatModel.controller.apiSyncContactRatchet(chatRh, contact.contactId, force = false)
if (cStats != null) {
chatModel.updateContactConnectionStats(chatRh, contact, cStats)
}
}
},
syncMemberConnection = { groupInfo, member ->
withBGApi {
val r = chatModel.controller.apiSyncGroupMemberRatchet(chatRh, groupInfo.apiId, member.groupMemberId, force = false)
if (r != null) {
chatModel.updateGroupMemberConnectionStats(chatRh, groupInfo, r.first, r.second)
}
}
},
findModelChat = { chatId ->
chatModel.getChat(chatId)
},
findModelMember = { memberId ->
chatModel.groupMembers.find { it.id == memberId }
},
setReaction = { cInfo, cItem, add, reaction ->
withBGApi {
val updatedCI = chatModel.controller.apiChatItemReaction(
rh = chatRh,
type = cInfo.chatType,
id = cInfo.apiId,
itemId = cItem.id,
add = add,
reaction = reaction
)
if (updatedCI != null) {
chatModel.updateChatItem(cInfo, updatedCI)
}
}
},
showItemDetails = { cInfo, cItem ->
suspend fun loadChatItemInfo(): ChatItemInfo? {
val ciInfo = chatModel.controller.apiGetChatItemInfo(chatRh, cInfo.chatType, cInfo.apiId, cItem.id)
if (ciInfo != null) {
if (chat.chatInfo is ChatInfo.Group) {
// The idea is to preload information before showing a modal because large groups can take time to load all members
var preloadedContactInfo: Pair<ConnectionStats?, Profile?>? = null
var preloadedCode: String? = null
var preloadedLink: Pair<String, GroupMemberRole>? = null
if (chat.chatInfo is ChatInfo.Direct) {
preloadedContactInfo = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
preloadedCode = chatModel.controller.apiGetContactCode(chatRh, chat.chatInfo.apiId)?.second
} else if (chat.chatInfo is ChatInfo.Group) {
setGroupMembers(chatRh, chat.chatInfo.groupInfo, chatModel)
preloadedLink = chatModel.controller.apiGetGroupLink(chatRh, chat.chatInfo.groupInfo.groupId)
}
}
return ciInfo
}
withBGApi {
var initialCiInfo = loadChatItemInfo() ?: return@withBGApi
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(endButtons = {
ShareButton {
clipboard.shareText(itemInfoShareText(chatModel, cItem, initialCiInfo, chatModel.controller.appPrefs.developerTools.get()))
}
}) { close ->
var ciInfo by remember(cItem.id) { mutableStateOf(initialCiInfo) }
ChatItemInfoView(chatRh, cItem, ciInfo, devTools = chatModel.controller.appPrefs.developerTools.get())
LaunchedEffect(cItem.id) {
withContext(Dispatchers.Default) {
for (apiResp in controller.messagesChannel) {
val msg = apiResp.resp
if (apiResp.remoteHostId == chatRh &&
msg is CR.ChatItemStatusUpdated &&
msg.chatItem.chatItem.id == cItem.id
) {
ciInfo = loadChatItemInfo() ?: return@withContext
initialCiInfo = ciInfo
}
ModalManager.end.showModalCloseable(true) { close ->
val chat = remember { activeChat }.value
if (chat?.chatInfo is ChatInfo.Direct) {
var contactInfo: Pair<ConnectionStats?, Profile?>? by remember { mutableStateOf(preloadedContactInfo) }
var code: String? by remember { mutableStateOf(preloadedCode) }
KeyChangeEffect(chat.id, ChatModel.networkStatuses.toMap()) {
contactInfo = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
preloadedContactInfo = contactInfo
code = chatModel.controller.apiGetContactCode(chatRh, chat.chatInfo.apiId)?.second
preloadedCode = code
}
ChatInfoView(chatModel, (chat.chatInfo as ChatInfo.Direct).contact, contactInfo?.first, contactInfo?.second, chat.chatInfo.localAlias, code, close)
} else if (chat?.chatInfo is ChatInfo.Group) {
var link: Pair<String, GroupMemberRole>? by remember(chat.id) { mutableStateOf(preloadedLink) }
KeyChangeEffect(chat.id) {
setGroupMembers(chatRh, (chat.chatInfo as ChatInfo.Group).groupInfo, chatModel)
link = chatModel.controller.apiGetGroupLink(chatRh, chat.chatInfo.groupInfo.groupId)
preloadedLink = link
}
GroupChatInfoView(chatModel, chatRh, chat.id, link?.first, link?.second, {
link = it
preloadedLink = it
}, close)
} else {
LaunchedEffect(Unit) {
close()
}
}
}
KeyChangeEffect(chatModel.chatId.value) {
close()
}
},
showMemberInfo = { groupInfo: GroupInfo, member: GroupMember ->
hideKeyboard(view)
withBGApi {
val r = chatModel.controller.apiGroupMemberInfo(chatRh, groupInfo.groupId, member.groupMemberId)
val stats = r?.second
val (_, code) = if (member.memberActive) {
val memCode = chatModel.controller.apiGetGroupMemberCode(chatRh, groupInfo.apiId, member.groupMemberId)
member to memCode?.second
} else {
member to null
}
setGroupMembers(chatRh, groupInfo, chatModel)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) { close ->
remember { derivedStateOf { chatModel.getGroupMember(member.groupMemberId) } }.value?.let { mem ->
GroupMemberInfoView(chatRh, groupInfo, mem, stats, code, chatModel, close, close)
}
}
}
}
},
addMembers = { groupInfo ->
hideKeyboard(view)
withBGApi {
setGroupMembers(chatRh, groupInfo, chatModel)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) { close ->
AddGroupMembersView(chatRh, groupInfo, false, chatModel, close)
},
loadPrevMessages = {
if (chatModel.chatId.value != activeChat.value?.id) return@ChatLayout
val c = chatModel.getChat(chatModel.chatId.value ?: return@ChatLayout)
val firstId = chatModel.chatItems.value.firstOrNull()?.id
if (c != null && firstId != null) {
withBGApi {
apiLoadPrevMessages(c, chatModel, firstId, searchText.value)
}
}
}
},
openGroupLink = { groupInfo ->
hideKeyboard(view)
withBGApi {
val link = chatModel.controller.apiGetGroupLink(chatRh, groupInfo.groupId)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) {
GroupLinkView(chatModel, chatRh, groupInfo, link?.first, link?.second, onGroupLinkUpdated = null)
},
deleteMessage = { itemId, mode ->
withBGApi {
val cInfo = chat.chatInfo
val toDeleteItem = chatModel.chatItems.value.firstOrNull { it.id == itemId }
val toModerate = toDeleteItem?.memberToModerate(chat.chatInfo)
val groupInfo = toModerate?.first
val groupMember = toModerate?.second
val deletedChatItem: ChatItem?
val toChatItem: ChatItem?
if (mode == CIDeleteMode.cidmBroadcast && groupInfo != null && groupMember != null) {
val r = chatModel.controller.apiDeleteMemberChatItem(
chatRh,
groupId = groupInfo.groupId,
groupMemberId = groupMember.groupMemberId,
itemId = itemId
)
deletedChatItem = r?.first
toChatItem = r?.second
} else {
val r = chatModel.controller.apiDeleteChatItem(
chatRh,
type = cInfo.chatType,
id = cInfo.apiId,
itemId = itemId,
mode = mode
)
deletedChatItem = r?.deletedChatItem?.chatItem
toChatItem = r?.toChatItem?.chatItem
}
if (toChatItem == null && deletedChatItem != null) {
chatModel.removeChatItem(chatRh, cInfo, deletedChatItem)
} else if (toChatItem != null) {
chatModel.upsertChatItem(chatRh, cInfo, toChatItem)
}
}
}
},
markRead = { range, unreadCountAfter ->
chatModel.markChatItemsRead(chat, range, unreadCountAfter)
ntfManager.cancelNotificationsForChat(chat.id)
withBGApi {
chatModel.controller.apiChatRead(
chatRh,
chat.chatInfo.chatType,
chat.chatInfo.apiId,
range
)
}
},
changeNtfsState = { enabled, currentValue -> toggleNotifications(chat, enabled, chatModel, currentValue) },
onSearchValueChanged = { value ->
if (searchText.value == value) return@ChatLayout
if (chatModel.chatId.value != activeChat.value?.id) return@ChatLayout
val c = chatModel.getChat(chatModel.chatId.value ?: return@ChatLayout) ?: return@ChatLayout
withBGApi {
apiFindMessages(c, chatModel, value)
searchText.value = value
}
},
onComposed,
developerTools = chatModel.controller.appPrefs.developerTools.get(),
showViaProxy = chatModel.controller.appPrefs.showSentViaProxy.get(),
)
},
deleteMessages = { itemIds ->
if (itemIds.isNotEmpty()) {
val chatInfo = chat.chatInfo
withBGApi {
val deletedItems: ArrayList<ChatItem> = arrayListOf()
for (itemId in itemIds) {
val di = chatModel.controller.apiDeleteChatItem(
chatRh, chatInfo.chatType, chatInfo.apiId, itemId, CIDeleteMode.cidmInternal
)?.deletedChatItem?.chatItem
if (di != null) {
deletedItems.add(di)
}
}
for (di in deletedItems) {
chatModel.removeChatItem(chatRh, chatInfo, di)
}
}
}
},
receiveFile = { fileId ->
withBGApi { chatModel.controller.receiveFile(chatRh, user, fileId) }
},
cancelFile = { fileId ->
withBGApi { chatModel.controller.cancelFile(chatRh, user, fileId) }
},
joinGroup = { groupId, onComplete ->
withBGApi {
chatModel.controller.apiJoinGroup(chatRh, groupId)
onComplete.invoke()
}
},
startCall = out@{ media ->
withBGApi {
val cInfo = chat.chatInfo
if (cInfo is ChatInfo.Direct) {
val contactInfo = chatModel.controller.apiContactInfo(chat.remoteHostId, cInfo.contact.contactId)
val profile = contactInfo?.second ?: chatModel.currentUser.value?.profile?.toProfile() ?: return@withBGApi
chatModel.activeCall.value = Call(remoteHostId = chatRh, contact = cInfo.contact, callState = CallState.WaitCapabilities, localMedia = media, userProfile = profile)
chatModel.showCallView.value = true
chatModel.callCommand.add(WCallCommand.Capabilities(media))
}
}
},
endCall = {
val call = chatModel.activeCall.value
if (call != null) withBGApi { chatModel.callManager.endCall(call) }
},
acceptCall = { contact ->
hideKeyboard(view)
withBGApi {
val invitation = chatModel.callInvitations.remove(contact.id)
?: controller.apiGetCallInvitations(chatModel.remoteHostId()).firstOrNull { it.contact.id == contact.id }
if (invitation == null) {
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.call_already_ended))
} else {
chatModel.callManager.acceptIncomingCall(invitation = invitation)
}
}
},
acceptFeature = { contact, feature, param ->
withBGApi {
chatModel.controller.allowFeatureToContact(chatRh, contact, feature, param)
}
},
openDirectChat = { contactId ->
withBGApi {
openDirectChat(chatRh, contactId, chatModel)
}
},
forwardItem = { cItem, cInfo ->
chatModel.chatId.value = null
chatModel.sharedContent.value = SharedContent.Forward(cInfo, cItem)
},
updateContactStats = { contact ->
withBGApi {
val r = chatModel.controller.apiContactInfo(chatRh, chat.chatInfo.apiId)
if (r != null) {
val contactStats = r.first
if (contactStats != null)
chatModel.updateContactConnectionStats(chatRh, contact, contactStats)
}
}
},
updateMemberStats = { groupInfo, member ->
withBGApi {
val r = chatModel.controller.apiGroupMemberInfo(chatRh, groupInfo.groupId, member.groupMemberId)
if (r != null) {
val memStats = r.second
if (memStats != null) {
chatModel.updateGroupMemberConnectionStats(chatRh, groupInfo, r.first, memStats)
}
}
}
},
syncContactConnection = { contact ->
withBGApi {
val cStats = chatModel.controller.apiSyncContactRatchet(chatRh, contact.contactId, force = false)
if (cStats != null) {
chatModel.updateContactConnectionStats(chatRh, contact, cStats)
}
}
},
syncMemberConnection = { groupInfo, member ->
withBGApi {
val r = chatModel.controller.apiSyncGroupMemberRatchet(chatRh, groupInfo.apiId, member.groupMemberId, force = false)
if (r != null) {
chatModel.updateGroupMemberConnectionStats(chatRh, groupInfo, r.first, r.second)
}
}
},
findModelChat = { chatId ->
chatModel.getChat(chatId)
},
findModelMember = { memberId ->
chatModel.groupMembers.find { it.id == memberId }
},
setReaction = { cInfo, cItem, add, reaction ->
withBGApi {
val updatedCI = chatModel.controller.apiChatItemReaction(
rh = chatRh,
type = cInfo.chatType,
id = cInfo.apiId,
itemId = cItem.id,
add = add,
reaction = reaction
)
if (updatedCI != null) {
chatModel.updateChatItem(cInfo, updatedCI)
}
}
},
showItemDetails = { cInfo, cItem ->
suspend fun loadChatItemInfo(): ChatItemInfo? {
val ciInfo = chatModel.controller.apiGetChatItemInfo(chatRh, cInfo.chatType, cInfo.apiId, cItem.id)
if (ciInfo != null) {
if (chat.chatInfo is ChatInfo.Group) {
setGroupMembers(chatRh, chat.chatInfo.groupInfo, chatModel)
}
}
return ciInfo
}
withBGApi {
var initialCiInfo = loadChatItemInfo() ?: return@withBGApi
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(endButtons = {
ShareButton {
clipboard.shareText(itemInfoShareText(chatModel, cItem, initialCiInfo, chatModel.controller.appPrefs.developerTools.get()))
}
}) { close ->
var ciInfo by remember(cItem.id) { mutableStateOf(initialCiInfo) }
ChatItemInfoView(chatRh, cItem, ciInfo, devTools = chatModel.controller.appPrefs.developerTools.get())
LaunchedEffect(cItem.id) {
withContext(Dispatchers.Default) {
for (apiResp in controller.messagesChannel) {
val msg = apiResp.resp
if (apiResp.remoteHostId == chatRh &&
msg is CR.ChatItemStatusUpdated &&
msg.chatItem.chatItem.id == cItem.id
) {
ciInfo = loadChatItemInfo() ?: return@withContext
initialCiInfo = ciInfo
}
}
}
}
KeyChangeEffect(chatModel.chatId.value) {
close()
}
}
}
},
addMembers = { groupInfo ->
hideKeyboard(view)
withBGApi {
setGroupMembers(chatRh, groupInfo, chatModel)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) { close ->
AddGroupMembersView(chatRh, groupInfo, false, chatModel, close)
}
}
},
openGroupLink = { groupInfo ->
hideKeyboard(view)
withBGApi {
val link = chatModel.controller.apiGetGroupLink(chatRh, groupInfo.groupId)
ModalManager.end.closeModals()
ModalManager.end.showModalCloseable(true) {
GroupLinkView(chatModel, chatRh, groupInfo, link?.first, link?.second, onGroupLinkUpdated = null)
}
}
},
markRead = { range, unreadCountAfter ->
chatModel.markChatItemsRead(chat, range, unreadCountAfter)
ntfManager.cancelNotificationsForChat(chat.id)
withBGApi {
chatModel.controller.apiChatRead(
chatRh,
chat.chatInfo.chatType,
chat.chatInfo.apiId,
range
)
}
},
changeNtfsState = { enabled, currentValue -> toggleNotifications(chat, enabled, chatModel, currentValue) },
onSearchValueChanged = { value ->
if (searchText.value == value) return@ChatLayout
if (chatModel.chatId.value != activeChat.value?.id) return@ChatLayout
val c = chatModel.getChat(chatModel.chatId.value ?: return@ChatLayout) ?: return@ChatLayout
withBGApi {
apiFindMessages(c, chatModel, value)
searchText.value = value
}
},
onComposed,
developerTools = chatModel.controller.appPrefs.developerTools.get(),
showViaProxy = chatModel.controller.appPrefs.showSentViaProxy.get(),
)
}
}
is ChatInfo.ContactConnection -> {
val close = { chatModel.chatId.value = null }
@@ -534,6 +545,7 @@ fun ChatLayout(
acceptCall: (Contact) -> Unit,
acceptFeature: (Contact, ChatFeature, Int?) -> Unit,
openDirectChat: (Long) -> Unit,
forwardItem: (ChatInfo, ChatItem) -> Unit,
updateContactStats: (Contact) -> Unit,
updateMemberStats: (GroupInfo, GroupMember) -> Unit,
syncContactConnection: (Contact) -> Unit,
@@ -598,15 +610,25 @@ fun ChatLayout(
floatingActionButton = { floatingButton.value() },
contentColor = LocalContentColor.current,
drawerContentColor = LocalContentColor.current,
backgroundColor = Color.Unspecified
) { contentPadding ->
val wallpaperImage = MaterialTheme.wallpaper.type.image
val wallpaperType = MaterialTheme.wallpaper.type
val backgroundColor = MaterialTheme.wallpaper.background ?: wallpaperType.defaultBackgroundColor(CurrentColors.value.base, MaterialTheme.colors.background)
val tintColor = MaterialTheme.wallpaper.tint ?: wallpaperType.defaultTintColor(CurrentColors.value.base)
BoxWithConstraints(Modifier
.fillMaxHeight()
.fillMaxSize()
.background(MaterialTheme.colors.background)
.then(if (wallpaperImage != null)
Modifier.drawBehind { chatViewBackground(wallpaperImage, wallpaperType, backgroundColor, tintColor) }
else
Modifier)
.padding(contentPadding)
) {
ChatItemsList(
chat, unreadCount, composeState, searchValue,
useLinkPreviews, linkMode, showMemberInfo, loadPrevMessages, deleteMessage, deleteMessages,
receiveFile, cancelFile, joinGroup, acceptCall, acceptFeature, openDirectChat,
receiveFile, cancelFile, joinGroup, acceptCall, acceptFeature, openDirectChat, forwardItem,
updateContactStats, updateMemberStats, syncContactConnection, syncMemberConnection, findModelChat, findModelMember,
setReaction, showItemDetails, markRead, setFloatingButton, onComposed, developerTools, showViaProxy,
)
@@ -875,6 +897,7 @@ fun BoxWithConstraintsScope.ChatItemsList(
acceptCall: (Contact) -> Unit,
acceptFeature: (Contact, ChatFeature, Int?) -> Unit,
openDirectChat: (Long) -> Unit,
forwardItem: (ChatInfo, ChatItem) -> Unit,
updateContactStats: (Contact) -> Unit,
updateMemberStats: (GroupInfo, GroupMember) -> Unit,
syncContactConnection: (Contact) -> Unit,
@@ -978,7 +1001,7 @@ fun BoxWithConstraintsScope.ChatItemsList(
tryOrShowError("${cItem.id}ChatItem", error = {
CIBrokenComposableView(if (cItem.chatDir.sent) Alignment.CenterEnd else Alignment.CenterStart)
}) {
ChatItemView(chat.remoteHostId, chat.chatInfo, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, range = range, deleteMessage = deleteMessage, deleteMessages = deleteMessages, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, setReaction = setReaction, showItemDetails = showItemDetails, developerTools = developerTools, showViaProxy = showViaProxy)
ChatItemView(chat.remoteHostId, chat.chatInfo, cItem, composeState, provider, useLinkPreviews = useLinkPreviews, linkMode = linkMode, revealed = revealed, range = range, deleteMessage = deleteMessage, deleteMessages = deleteMessages, receiveFile = receiveFile, cancelFile = cancelFile, joinGroup = joinGroup, acceptCall = acceptCall, acceptFeature = acceptFeature, openDirectChat = openDirectChat, forwardItem = forwardItem, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember, scrollToItem = scrollToItem, setReaction = setReaction, showItemDetails = showItemDetails, developerTools = developerTools, showViaProxy = showViaProxy)
}
}
@@ -1262,7 +1285,7 @@ val MEMBER_IMAGE_SIZE: Dp = 38.dp
@Composable
fun MemberImage(member: GroupMember) {
ProfileImage(MEMBER_IMAGE_SIZE, member.memberProfile.image)
ProfileImage(MEMBER_IMAGE_SIZE, member.memberProfile.image, backgroundColor = MaterialTheme.colors.background)
}
@Composable
@@ -1531,6 +1554,7 @@ fun PreviewChatLayout() {
acceptCall = { _ -> },
acceptFeature = { _, _, _ -> },
openDirectChat = { _ -> },
forwardItem = { _, _ -> },
updateContactStats = { },
updateMemberStats = { _, _ -> },
syncContactConnection = { },
@@ -1604,6 +1628,7 @@ fun PreviewGroupChatLayout() {
acceptCall = { _ -> },
acceptFeature = { _, _, _ -> },
openDirectChat = { _ -> },
forwardItem = { _, _ -> },
updateContactStats = { },
updateMemberStats = { _, _ -> },
syncContactConnection = { },
@@ -16,7 +16,7 @@ import dev.icerock.moko.resources.compose.stringResource
@Composable
fun ComposeContextInvitingContactMemberView() {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val sentColor = MaterialTheme.appColors.sentMessage
Row(
Modifier
.height(60.dp)
@@ -16,7 +16,7 @@ import chat.simplex.res.MR
@Composable
fun ComposeFileView(fileName: String, cancelFile: () -> Unit, cancelEnabled: Boolean) {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val sentColor = MaterialTheme.appColors.sentMessage
Row(
Modifier
.height(60.dp)
@@ -20,7 +20,7 @@ import chat.simplex.common.views.helpers.UploadContent
@Composable
fun ComposeImageView(media: ComposePreview.MediaPreview, cancelImages: () -> Unit, cancelEnabled: Boolean) {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val sentColor = MaterialTheme.appColors.sentMessage
Row(
Modifier
.padding(top = 8.dp)
@@ -776,7 +776,7 @@ fun ComposeView(
@Composable
fun MsgNotAllowedView(reason: String, icon: Painter) {
val color = CurrentColors.collectAsState().value.appColors.receivedMessage
val color = MaterialTheme.appColors.receivedMessage
Row(Modifier.padding(top = 5.dp).fillMaxWidth().background(color).padding(horizontal = DEFAULT_PADDING_HALF, vertical = DEFAULT_PADDING_HALF * 1.5f), verticalAlignment = Alignment.CenterVertically) {
Icon(icon, null, tint = MaterialTheme.colors.secondary)
Spacer(Modifier.width(DEFAULT_PADDING_HALF))
@@ -862,7 +862,7 @@ fun ComposeView(
}
}
Row(
modifier = Modifier.padding(end = 8.dp),
modifier = Modifier.background(MaterialTheme.colors.background).padding(end = 8.dp),
verticalAlignment = Alignment.Bottom,
) {
val isGroupAndProhibitedFiles = chat.chatInfo is ChatInfo.Group && !chat.chatInfo.groupInfo.fullGroupPreferences.files.on(chat.chatInfo.groupInfo.membership)
@@ -974,7 +974,7 @@ fun ComposeView(
val timedMessageAllowed = remember(chat.chatInfo) { chat.chatInfo.featureEnabled(ChatFeature.TimedMessages) }
val sendButtonColor =
if (chat.chatInfo.incognito)
if (isSystemInDarkTheme()) Indigo else Indigo.copy(alpha = 0.7F)
if (isInDarkTheme()) Indigo else Indigo.copy(alpha = 0.7F)
else MaterialTheme.colors.primary
SendMsgView(
composeState,
@@ -35,7 +35,7 @@ fun ComposeVoiceView(
) {
val progress = rememberSaveable { mutableStateOf(0) }
val duration = rememberSaveable(recordedDurationMs) { mutableStateOf(recordedDurationMs) }
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val sentColor = MaterialTheme.appColors.sentMessage
Box {
Box(
Modifier
@@ -30,8 +30,8 @@ fun ContextItemView(
cancelContextItem: () -> Unit
) {
val sent = contextItem.chatDir.sent
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
@Composable
fun MessageText(attachment: ImageResource?, lines: Int) {
@@ -9,7 +9,6 @@ import SectionSpacer
import SectionTextFooter
import SectionView
import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.*
import androidx.compose.material.*
@@ -233,6 +232,16 @@ fun GroupChatInfoLayout(
} else {
SendReceiptsOptionDisabled()
}
WallpaperButton {
ModalManager.end.showModal {
val chat = remember { derivedStateOf { chatModel.chats.firstOrNull { it.id == chat.id } } }
val c = chat.value
if (c != null) {
ChatWallpaperEditorModal(c)
}
}
}
}
SectionTextFooter(stringResource(MR.strings.only_group_owners_can_change_prefs))
SectionDividerSpaced(maxTopPadding = true)
@@ -123,13 +123,12 @@ private fun GroupPreferencesLayout(
applyPrefs(preferences.copy(files = RoleGroupPreference(enable = enable, role)))
}
// TODO enable simplexLinks preference in 5.8
// SectionDividerSpaced(true, maxBottomPadding = false)
// val allowSimplexLinks = remember(preferences) { mutableStateOf(preferences.simplexLinks.enable) }
// val simplexLinksRole = remember(preferences) { mutableStateOf(preferences.simplexLinks.role) }
// FeatureSection(GroupFeature.SimplexLinks, allowSimplexLinks, simplexLinksRole, groupInfo, preferences, onTTLUpdated) { enable, role ->
// applyPrefs(preferences.copy(simplexLinks = RoleGroupPreference(enable = enable, role)))
// }
SectionDividerSpaced(true, maxBottomPadding = false)
val allowSimplexLinks = remember(preferences) { mutableStateOf(preferences.simplexLinks.enable) }
val simplexLinksRole = remember(preferences) { mutableStateOf(preferences.simplexLinks.role) }
FeatureSection(GroupFeature.SimplexLinks, allowSimplexLinks, simplexLinksRole, groupInfo, preferences, onTTLUpdated) { enable, role ->
applyPrefs(preferences.copy(simplexLinks = RoleGroupPreference(enable = enable, role)))
}
SectionDividerSpaced(true, maxBottomPadding = false)
val enableHistory = remember(preferences) { mutableStateOf(preferences.history.enable) }
@@ -189,8 +188,6 @@ private fun FeatureSection(
generalGetString(MR.strings.feature_enabled_for),
featureRoles,
enableForRole,
// remove in v5.8
enabled = remember { mutableStateOf(false) },
onSelected = { value ->
onSelected(enableFeature.value, value)
}
@@ -83,8 +83,8 @@ fun CIGroupInvitationView(
}
}
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
Surface(
modifier = if (action && !inProgress.value) Modifier.clickable(onClick = {
inProgress.value = true
@@ -110,6 +110,7 @@ fun CIGroupInvitationView(
.padding(bottom = 4.dp),
) {
groupInfoView()
val secondaryColor = MaterialTheme.colors.secondary
Column(Modifier.padding(top = 2.dp, start = 5.dp)) {
Divider(Modifier.fillMaxWidth().padding(bottom = 4.dp))
if (action) {
@@ -117,7 +118,7 @@ fun CIGroupInvitationView(
Text(
buildAnnotatedString {
append(generalGetString(if (chatIncognito) MR.strings.group_invitation_tap_to_join_incognito else MR.strings.group_invitation_tap_to_join))
withStyle(reserveTimestampStyle) { append(reserveSpaceForMeta(ci.meta, timedMessagesTTL, encrypted = null, showStatus = false, showEdited = false)) }
withStyle(reserveTimestampStyle) { append(reserveSpaceForMeta(ci.meta, timedMessagesTTL, encrypted = null, showStatus = false, showEdited = false, secondaryColor = secondaryColor)) }
},
color = if (inProgress.value)
MaterialTheme.colors.secondary
@@ -128,7 +129,7 @@ fun CIGroupInvitationView(
Text(
buildAnnotatedString {
append(groupInvitationStr())
withStyle(reserveTimestampStyle) { append(reserveSpaceForMeta(ci.meta, timedMessagesTTL, encrypted = null, showStatus = false, showEdited = false)) }
withStyle(reserveTimestampStyle) { append(reserveSpaceForMeta(ci.meta, timedMessagesTTL, encrypted = null, showStatus = false, showEdited = false, secondaryColor = secondaryColor)) }
}
)
}
@@ -12,7 +12,6 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.ui.theme.CurrentColors
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.isInDarkTheme
import chat.simplex.res.MR
@@ -86,7 +85,7 @@ private fun CIMetaText(
Spacer(Modifier.width(4.dp))
}
if (showViaProxy && meta.sentViaProxy == true) {
Icon(painterResource(MR.images.ic_arrow_forward), null, Modifier.height(17.dp), tint = CurrentColors.value.colors.secondary)
Icon(painterResource(MR.images.ic_arrow_forward), null, Modifier.height(17.dp), tint = MaterialTheme.colors.secondary)
}
if (showStatus) {
val statusIcon = meta.statusIcon(MaterialTheme.colors.primary, color, paleColor)
@@ -115,6 +114,7 @@ fun reserveSpaceForMeta(
meta: CIMeta,
chatTTL: Int?,
encrypted: Boolean?,
secondaryColor: Color,
showStatus: Boolean = true,
showEdited: Boolean = true,
showViaProxy: Boolean = false
@@ -132,7 +132,7 @@ fun reserveSpaceForMeta(
if (showViaProxy && meta.sentViaProxy == true) {
res += iconSpace
}
if (showStatus && (meta.statusIcon(CurrentColors.value.colors.secondary) != null || !meta.disappearing)) {
if (showStatus && (meta.statusIcon(secondaryColor) != null || !meta.disappearing)) {
res += iconSpace
}
if (encrypted != null) {
@@ -14,6 +14,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.CurrentColors
import chat.simplex.common.ui.theme.appColors
import chat.simplex.common.views.helpers.AlertManager
import chat.simplex.common.views.helpers.generalGetString
import chat.simplex.res.MR
@@ -137,7 +138,7 @@ fun DecryptionErrorItemFixButton(
onClick: () -> Unit,
syncSupported: Boolean
) {
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
Surface(
Modifier.clickable(onClick = onClick),
shape = RoundedCornerShape(18.dp),
@@ -164,10 +165,11 @@ fun DecryptionErrorItemFixButton(
tint = if (syncSupported) MaterialTheme.colors.primary else MaterialTheme.colors.secondary
)
Spacer(Modifier.padding(2.dp))
val secondaryColor = MaterialTheme.colors.secondary
Text(
buildAnnotatedString {
append(generalGetString(MR.strings.fix_connection))
withStyle(reserveTimestampStyle) { append(reserveSpaceForMeta(ci.meta, null, encrypted = null)) }
withStyle(reserveTimestampStyle) { append(reserveSpaceForMeta(ci.meta, null, encrypted = null, secondaryColor = secondaryColor)) }
withStyle(reserveTimestampStyle) { append(" ") } // for icon
},
color = if (syncSupported) MaterialTheme.colors.primary else MaterialTheme.colors.secondary
@@ -184,7 +186,7 @@ fun DecryptionErrorItem(
ci: ChatItem,
onClick: () -> Unit
) {
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
Surface(
Modifier.clickable(onClick = onClick),
shape = RoundedCornerShape(18.dp),
@@ -195,10 +197,11 @@ fun DecryptionErrorItem(
Modifier.padding(vertical = 6.dp, horizontal = 12.dp),
contentAlignment = Alignment.BottomEnd,
) {
val secondaryColor = MaterialTheme.colors.secondary
Text(
buildAnnotatedString {
withStyle(SpanStyle(fontStyle = FontStyle.Italic, color = Color.Red)) { append(ci.content.text) }
withStyle(reserveTimestampStyle) { append(reserveSpaceForMeta(ci.meta, null, encrypted = null)) }
withStyle(reserveTimestampStyle) { append(reserveSpaceForMeta(ci.meta, null, encrypted = null, secondaryColor = secondaryColor)) }
},
style = MaterialTheme.typography.body1.copy(lineHeight = 22.sp)
)
@@ -154,8 +154,8 @@ private fun VoiceLayout(
}
when {
hasText -> {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
Spacer(Modifier.width(6.dp))
VoiceMsgIndicator(file, audioPlaying.value, sent, hasText, progress, duration, brokenAudio, play, pause, longClick, receiveFile)
Row(verticalAlignment = Alignment.CenterVertically) {
@@ -224,8 +224,8 @@ private fun PlayPauseButton(
longClick: () -> Unit,
icon: ImageResource = MR.images.ic_play_arrow_filled,
) {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
Surface(
Modifier.drawRingModifier(angle, strokeColor, strokeWidth),
color = if (sent) sentColor else receivedColor,
@@ -59,6 +59,7 @@ fun ChatItemView(
scrollToItem: (Long) -> Unit,
acceptFeature: (Contact, ChatFeature, Int?) -> Unit,
openDirectChat: (Long) -> Unit,
forwardItem: (ChatInfo, ChatItem) -> Unit,
updateContactStats: (Contact) -> Unit,
updateMemberStats: (GroupInfo, GroupMember) -> Unit,
syncContactConnection: (Contact) -> Unit,
@@ -68,7 +69,8 @@ fun ChatItemView(
setReaction: (ChatInfo, ChatItem, Boolean, MsgReaction) -> Unit,
showItemDetails: (ChatInfo, ChatItem) -> Unit,
developerTools: Boolean,
showViaProxy: Boolean
showViaProxy: Boolean,
preview: Boolean = false,
) {
val uriHandler = LocalUriHandler.current
val sent = cItem.chatDir.sent
@@ -260,8 +262,7 @@ fun ChatItemView(
!cItem.isLiveDummy && !live
) {
ItemAction(stringResource(MR.strings.forward_chat_item), painterResource(MR.images.ic_forward), onClick = {
chatModel.chatId.value = null
chatModel.sharedContent.value = SharedContent.Forward(cItem, cInfo)
forwardItem(cInfo, cItem)
showMenu.value = false
})
}
@@ -272,7 +273,7 @@ fun ChatItemView(
if (cItem.meta.itemDeleted == null && cItem.file != null && cItem.file.cancelAction != null && !cItem.localNote) {
CancelFileItemAction(cItem.file.fileId, showMenu, cancelFile = cancelFile, cancelAction = cItem.file.cancelAction)
}
if (!(live && cItem.meta.isLive)) {
if (!(live && cItem.meta.isLive) && !preview) {
DeleteItemAction(cItem, revealed, showMenu, questionText = deleteMessageQuestionText(), deleteMessage, deleteMessages)
}
val groupInfo = cItem.memberToModerate(cInfo)?.first
@@ -819,40 +820,40 @@ expect fun copyItemToClipboard(cItem: ChatItem, clipboard: ClipboardManager)
@Preview
@Composable
fun PreviewChatItemView() {
SimpleXTheme {
ChatItemView(
rhId = null,
ChatInfo.Direct.sampleData,
ChatItem.getSampleData(
1, CIDirection.DirectSnd(), Clock.System.now(), "hello"
),
useLinkPreviews = true,
linkMode = SimplexLinkMode.DESCRIPTION,
composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = true)) },
revealed = remember { mutableStateOf(false) },
range = 0..1,
deleteMessage = { _, _ -> },
deleteMessages = { _ -> },
receiveFile = { _ -> },
cancelFile = {},
joinGroup = { _, _ -> },
acceptCall = { _ -> },
scrollToItem = {},
acceptFeature = { _, _, _ -> },
openDirectChat = { _ -> },
updateContactStats = { },
updateMemberStats = { _, _ -> },
syncContactConnection = { },
syncMemberConnection = { _, _ -> },
findModelChat = { null },
findModelMember = { null },
setReaction = { _, _, _, _ -> },
showItemDetails = { _, _ -> },
developerTools = false,
showViaProxy = false
)
}
fun PreviewChatItemView(
chatItem: ChatItem = ChatItem.getSampleData(1, CIDirection.DirectSnd(), Clock.System.now(), "hello")
) {
ChatItemView(
rhId = null,
ChatInfo.Direct.sampleData,
chatItem,
useLinkPreviews = true,
linkMode = SimplexLinkMode.DESCRIPTION,
composeState = remember { mutableStateOf(ComposeState(useLinkPreviews = true)) },
revealed = remember { mutableStateOf(false) },
range = 0..1,
deleteMessage = { _, _ -> },
deleteMessages = { _ -> },
receiveFile = { _ -> },
cancelFile = {},
joinGroup = { _, _ -> },
acceptCall = { _ -> },
scrollToItem = {},
acceptFeature = { _, _, _ -> },
openDirectChat = { _ -> },
forwardItem = { _, _ -> },
updateContactStats = { },
updateMemberStats = { _, _ -> },
syncContactConnection = { },
syncMemberConnection = { _, _ -> },
findModelChat = { null },
findModelMember = { null },
setReaction = { _, _, _, _ -> },
showItemDetails = { _, _ -> },
developerTools = false,
showViaProxy = false,
preview = true,
)
}
@Preview
@@ -877,6 +878,7 @@ fun PreviewChatItemViewDeletedContent() {
scrollToItem = {},
acceptFeature = { _, _, _ -> },
openDirectChat = { _ -> },
forwardItem = { _, _ -> },
updateContactStats = { },
updateMemberStats = { _, _ -> },
syncContactConnection = { },
@@ -886,7 +888,8 @@ fun PreviewChatItemViewDeletedContent() {
setReaction = { _, _, _, _ -> },
showItemDetails = { _, _ -> },
developerTools = false,
showViaProxy = false
showViaProxy = false,
preview = true,
)
}
}
@@ -18,8 +18,8 @@ import chat.simplex.common.ui.theme.*
@Composable
fun DeletedItemView(ci: ChatItem, timedMessagesTTL: Int?, showViaProxy: Boolean) {
val sent = ci.chatDir.sent
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
Surface(
shape = RoundedCornerShape(18.dp),
color = if (sent) sentColor else receivedColor,
@@ -46,9 +46,6 @@ fun FramedItemView(
return if (chatInfo is ChatInfo.Group) chatInfo.groupInfo.membership else null
}
@Composable
fun Color.toQuote(): Color = if (isInDarkTheme()) lighter(0.12f) else darker(0.12f)
@Composable
fun ciQuotedMsgTextView(qi: CIQuote, lines: Int) {
MarkdownText(
@@ -89,11 +86,11 @@ fun FramedItemView(
@Composable
fun FramedItemHeader(caption: String, italic: Boolean, icon: Painter? = null, pad: Boolean = false) {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentQuote
val receivedColor = MaterialTheme.appColors.receivedQuote
Row(
Modifier
.background(if (sent) sentColor.toQuote() else receivedColor.toQuote())
.background(if (sent) sentColor else receivedColor)
.fillMaxWidth()
.padding(start = 8.dp, top = 6.dp, end = 12.dp, bottom = if (pad || (ci.quotedItem == null && ci.meta.itemForwarded == null)) 6.dp else 0.dp),
horizontalArrangement = Arrangement.spacedBy(4.dp),
@@ -122,11 +119,11 @@ fun FramedItemView(
@Composable
fun ciQuoteView(qi: CIQuote) {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentQuote
val receivedColor = MaterialTheme.appColors.receivedQuote
Row(
Modifier
.background(if (sent) sentColor.toQuote() else receivedColor.toQuote())
.background(if (sent) sentColor else receivedColor)
.fillMaxWidth()
.combinedClickable(
onLongClick = { showMenu.value = true },
@@ -188,10 +185,17 @@ fun FramedItemView(
val transparentBackground = (ci.content.msgContent is MsgContent.MCImage || ci.content.msgContent is MsgContent.MCVideo) &&
!ci.meta.isLive && ci.content.text.isEmpty() && ci.quotedItem == null && ci.meta.itemForwarded == null
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
Box(Modifier
.clip(RoundedCornerShape(18.dp))
.background(
when {
transparentBackground -> Color.Transparent
sent -> MaterialTheme.colors.background
else -> MaterialTheme.colors.background
}
)
.background(
when {
transparentBackground -> Color.Transparent
@@ -17,8 +17,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import chat.simplex.common.model.ChatItem
import chat.simplex.common.model.MsgErrorType
import chat.simplex.common.ui.theme.CurrentColors
import chat.simplex.common.ui.theme.SimpleXTheme
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.helpers.AlertManager
import chat.simplex.common.views.helpers.generalGetString
import chat.simplex.res.MR
@@ -51,7 +50,7 @@ fun IntegrityErrorItemView(msgError: MsgErrorType, ci: ChatItem, timedMessagesTT
@Composable
fun CIMsgError(ci: ChatItem, timedMessagesTTL: Int?, onClick: () -> Unit) {
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
Surface(
Modifier.clickable(onClick = onClick),
shape = RoundedCornerShape(18.dp),
@@ -21,8 +21,8 @@ import kotlinx.datetime.Clock
@Composable
fun MarkedDeletedItemView(ci: ChatItem, timedMessagesTTL: Int?, revealed: MutableState<Boolean>, showViaProxy: Boolean) {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val receivedColor = CurrentColors.collectAsState().value.appColors.receivedMessage
val sentColor = MaterialTheme.appColors.sentMessage
val receivedColor = MaterialTheme.appColors.receivedMessage
Surface(
shape = RoundedCornerShape(18.dp),
color = if (ci.chatDir.sent) sentColor else receivedColor,
@@ -78,7 +78,7 @@ fun MarkdownText (
val reserve = if (textLayoutDirection != LocalLayoutDirection.current && meta != null) {
"\n"
} else if (meta != null) {
reserveSpaceForMeta(meta, chatTTL, null, showViaProxy = showViaProxy)
reserveSpaceForMeta(meta, chatTTL, null, secondaryColor = MaterialTheme.colors.secondary, showViaProxy = showViaProxy)
} else {
" "
}
@@ -486,6 +486,8 @@ fun deleteChatDatabaseFilesAndState() {
tmpDir.deleteRecursively()
getMigrationTempFilesDirectory().deleteRecursively()
tmpDir.mkdir()
wallpapersDir.deleteRecursively()
wallpapersDir.mkdirs()
DatabaseUtils.ksDatabasePassword.remove()
controller.appPrefs.storeDBPassphrase.set(true)
controller.ctrl = null
@@ -2,12 +2,14 @@ package chat.simplex.common.views.helpers
import androidx.compose.desktop.ui.tooling.preview.Preview
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.*
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.geometry.Size
@@ -51,7 +53,8 @@ fun ProfileImage(
size: Dp,
image: String? = null,
icon: ImageResource = MR.images.ic_account_circle_filled,
color: Color = MaterialTheme.colors.secondaryVariant
color: Color = MaterialTheme.colors.secondaryVariant,
backgroundColor: Color? = null
) {
Box(Modifier.size(size)) {
if (image == null) {
@@ -61,6 +64,9 @@ fun ProfileImage(
else -> null
}
if (iconToReplace != null) {
if (backgroundColor != null) {
Box(Modifier.size(size * 0.7f).align(Alignment.Center).background(backgroundColor, CircleShape))
}
Icon(
iconToReplace,
contentDescription = stringResource(MR.strings.icon_descr_profile_image_placeholder),
@@ -0,0 +1,417 @@
package chat.simplex.common.views.helpers
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.*
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.graphics.drawscope.clipRect
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.platform.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.ui.theme.ThemeManager.colorFromReadableHex
import chat.simplex.res.MR
import dev.icerock.moko.resources.ImageResource
import dev.icerock.moko.resources.StringResource
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import java.io.File
import kotlin.math.*
enum class PresetWallpaper(
val res: ImageResource,
val filename: String,
val scale: Float,
val background: Map<DefaultTheme, Color>,
val tint: Map<DefaultTheme, Color>,
val colors: Map<DefaultTheme, ThemeColors>,
) {
CATS(MR.images.wallpaper_cats, "cats", 0.63f,
wallpaperBackgrounds(light = "#ffF8F6EA"),
tint = mapOf(
DefaultTheme.LIGHT to "#ffefdca6".colorFromReadableHex(),
DefaultTheme.DARK to "#ff4b3b0e".colorFromReadableHex(),
DefaultTheme.SIMPLEX to "#ff51400f".colorFromReadableHex(),
DefaultTheme.BLACK to "#ff4b3b0e".colorFromReadableHex()
),
mapOf(
DefaultTheme.LIGHT to ThemeColors(
sentMessage = "#fffffaed",
sentQuote = "#fffaf0d6",
receivedMessage = "#ffF8F7F4",
receivedQuote = "#ffefede9",
),
DefaultTheme.DARK to ThemeColors(
sentMessage = "#ff2f2919",
sentQuote = "#ff473a1d",
receivedMessage = "#ff272624",
receivedQuote = "#ff373633",
),
DefaultTheme.SIMPLEX to ThemeColors(
sentMessage = "#ff41371b",
sentQuote = "#ff654f1c",
receivedMessage = "#ff272624",
receivedQuote = "#ff373633",
),
DefaultTheme.BLACK to ThemeColors(
sentMessage = "#ff41371b",
sentQuote = "#ff654f1c",
receivedMessage = "#ff1f1e1b",
receivedQuote = "#ff2f2d27",
),
)
),
FLOWERS(MR.images.wallpaper_flowers, "flowers", 0.53f,
wallpaperBackgrounds(light = "#ffE2FFE4"),
tint = mapOf(
DefaultTheme.LIGHT to "#ff9CEA59".colorFromReadableHex(),
DefaultTheme.DARK to "#ff31560D".colorFromReadableHex(),
DefaultTheme.SIMPLEX to "#ff36600f".colorFromReadableHex(),
DefaultTheme.BLACK to "#ff31560D".colorFromReadableHex()
),
mapOf(
DefaultTheme.LIGHT to ThemeColors(
sentMessage = "#fff1ffe5",
sentQuote = "#ffdcf9c4",
receivedMessage = "#ffF4F8F2",
receivedQuote = "#ffe7ece7",
),
DefaultTheme.DARK to ThemeColors(
sentMessage = "#ff163521",
sentQuote = "#ff1B5330",
receivedMessage = "#ff242523",
receivedQuote = "#ff353733",
),
DefaultTheme.SIMPLEX to ThemeColors(
sentMessage = "#ff184739",
sentQuote = "#ff1F6F4B",
receivedMessage = "#ff242523",
receivedQuote = "#ff353733",
),
DefaultTheme.BLACK to ThemeColors(
sentMessage = "#ff184739",
sentQuote = "#ff1F6F4B",
receivedMessage = "#ff1c1f1a",
receivedQuote = "#ff282b25",
),
)
),
HEARTS(MR.images.wallpaper_hearts, "hearts", 0.59f,
wallpaperBackgrounds(light = "#ffFDECEC"),
tint = mapOf(
DefaultTheme.LIGHT to "#fffde0e0".colorFromReadableHex(),
DefaultTheme.DARK to "#ff3c0f0f".colorFromReadableHex(),
DefaultTheme.SIMPLEX to "#ff411010".colorFromReadableHex(),
DefaultTheme.BLACK to "#ff3C0F0F".colorFromReadableHex()
),
mapOf(
DefaultTheme.LIGHT to ThemeColors(
sentMessage = "#fffff4f4",
sentQuote = "#ffffdfdf",
receivedMessage = "#fff8f6f6",
receivedQuote = "#ffefebeb",
),
DefaultTheme.DARK to ThemeColors(
sentMessage = "#ff301515",
sentQuote = "#ff4C1818",
receivedMessage = "#ff242121",
receivedQuote = "#ff3b3535",
),
DefaultTheme.SIMPLEX to ThemeColors(
sentMessage = "#ff491A28",
sentQuote = "#ff761F29",
receivedMessage = "#ff242121",
receivedQuote = "#ff3b3535",
),
DefaultTheme.BLACK to ThemeColors(
sentMessage = "#ff491A28",
sentQuote = "#ff761F29",
receivedMessage = "#ff1f1b1b",
receivedQuote = "#ff2e2626",
),
)
),
KIDS(MR.images.wallpaper_kids, "kids", 0.53f,
wallpaperBackgrounds(light = "#ffdbfdfb"),
tint = mapOf(
DefaultTheme.LIGHT to "#ffadeffc".colorFromReadableHex(),
DefaultTheme.DARK to "#ff16404B".colorFromReadableHex(),
DefaultTheme.SIMPLEX to "#ff184753".colorFromReadableHex(),
DefaultTheme.BLACK to "#ff16404B".colorFromReadableHex()
),
mapOf(
DefaultTheme.LIGHT to ThemeColors(
sentMessage = "#ffeafeff",
sentQuote = "#ffcbf4f7",
receivedMessage = "#fff3fafa",
receivedQuote = "#ffe4efef",
),
DefaultTheme.DARK to ThemeColors(
sentMessage = "#ff16302F",
sentQuote = "#ff1a4a49",
receivedMessage = "#ff252626",
receivedQuote = "#ff373A39",
),
DefaultTheme.SIMPLEX to ThemeColors(
sentMessage = "#ff1a4745",
sentQuote = "#ff1d6b69",
receivedMessage = "#ff252626",
receivedQuote = "#ff373a39",
),
DefaultTheme.BLACK to ThemeColors(
sentMessage = "#ff1a4745",
sentQuote = "#ff1d6b69",
receivedMessage = "#ff1e1f1f",
receivedQuote = "#ff262b29",
),
)
),
SCHOOL(MR.images.wallpaper_school, "school", 0.53f,
wallpaperBackgrounds(light = "#ffE7F5FF"),
tint = mapOf(
DefaultTheme.LIGHT to "#ffCEEBFF".colorFromReadableHex(),
DefaultTheme.DARK to "#ff0F293B".colorFromReadableHex(),
DefaultTheme.SIMPLEX to "#ff112f43".colorFromReadableHex(),
DefaultTheme.BLACK to "#ff0F293B".colorFromReadableHex()
),
mapOf(
DefaultTheme.LIGHT to ThemeColors(
sentMessage = "#ffeef9ff",
sentQuote = "#ffD6EDFA",
receivedMessage = "#ffF3F5F9",
receivedQuote = "#ffe4e8ee",
),
DefaultTheme.DARK to ThemeColors(
sentMessage = "#ff172833",
sentQuote = "#ff1C3E4F",
receivedMessage = "#ff26282c",
receivedQuote = "#ff393c40",
),
DefaultTheme.SIMPLEX to ThemeColors(
sentMessage = "#ff1A3C5D",
sentQuote = "#ff235b80",
receivedMessage = "#ff26282c",
receivedQuote = "#ff393c40",
),
DefaultTheme.BLACK to ThemeColors(
sentMessage = "#ff1A3C5D",
sentQuote = "#ff235b80",
receivedMessage = "#ff1d1e22",
receivedQuote = "#ff292b2f",
),
)
),
TRAVEL(MR.images.wallpaper_travel, "travel", 0.68f,
wallpaperBackgrounds(light = "#fff9eeff"),
tint = mapOf(
DefaultTheme.LIGHT to "#ffeedbfe".colorFromReadableHex(),
DefaultTheme.DARK to "#ff311E48".colorFromReadableHex(),
DefaultTheme.SIMPLEX to "#ff35204e".colorFromReadableHex(),
DefaultTheme.BLACK to "#ff311E48".colorFromReadableHex()
),
mapOf(
DefaultTheme.LIGHT to ThemeColors(
sentMessage = "#fffcf6ff",
sentQuote = "#fff2e0fc",
receivedMessage = "#ffF6F4F7",
receivedQuote = "#ffede9ee",
),
DefaultTheme.DARK to ThemeColors(
sentMessage = "#ff33263B",
sentQuote = "#ff53385E",
receivedMessage = "#ff272528",
receivedQuote = "#ff3B373E",
),
DefaultTheme.SIMPLEX to ThemeColors(
sentMessage = "#ff3C255D",
sentQuote = "#ff623485",
receivedMessage = "#ff26273B",
receivedQuote = "#ff3A394F",
),
DefaultTheme.BLACK to ThemeColors(
sentMessage = "#ff3C255D",
sentQuote = "#ff623485",
receivedMessage = "#ff231f23",
receivedQuote = "#ff2c2931",
),
)
);
fun toType(base: DefaultTheme, scale: Float? = null): WallpaperType =
WallpaperType.Preset(
filename,
scale ?: appPrefs.themeOverrides.get().firstOrNull { it.wallpaper != null && it.wallpaper.preset == filename && it.base == base }?.wallpaper?.scale ?: 1f
)
companion object {
fun from(filename: String): PresetWallpaper? =
entries.firstOrNull { it.filename == filename }
}
}
fun wallpaperBackgrounds(light: String): Map<DefaultTheme, Color> =
mapOf(
DefaultTheme.LIGHT to light.colorFromReadableHex(),
DefaultTheme.DARK to "#ff121212".colorFromReadableHex(),
DefaultTheme.SIMPLEX to "#ff111528".colorFromReadableHex(),
DefaultTheme.BLACK to "#ff070707".colorFromReadableHex()
)
@Serializable
enum class WallpaperScaleType(val contentScale: ContentScale, val text: StringResource) {
@SerialName("fill") FILL(ContentScale.Crop, MR.strings.wallpaper_scale_fill),
@SerialName("fit") FIT(ContentScale.Fit, MR.strings.wallpaper_scale_fit),
@SerialName("repeat") REPEAT(ContentScale.Fit, MR.strings.wallpaper_scale_repeat),
}
sealed class WallpaperType {
abstract val scale: Float?
val image by lazy {
val filename = when (this) {
is Preset -> filename
is Image -> filename
else -> return@lazy null
}
if (filename == "") return@lazy null
if (cachedImages[filename] != null) {
cachedImages[filename]
} else {
val res = if (this is Preset) {
(PresetWallpaper.from(filename) ?: PresetWallpaper.CATS).res.toComposeImageBitmap()!!
} else {
try {
// In case of unintentional image deletion don't crash the app
File(getWallpaperFilePath(filename)).inputStream().use { loadImageBitmap(it) }
} catch (e: Exception) {
Log.e(TAG, "Error while loading wallpaper file: ${e.stackTraceToString()}")
null
}
}
res?.prepareToDraw()
cachedImages[filename] = res ?: return@lazy null
res
}
}
fun sameType(other: WallpaperType?): Boolean =
if (this is Preset && other is Preset) this.filename == other.filename
else this.javaClass == other?.javaClass
fun samePreset(other: PresetWallpaper?): Boolean = this is Preset && filename == other?.filename
data class Preset(
val filename: String,
override val scale: Float?,
): WallpaperType() {
val predefinedImageScale = PresetWallpaper.from(filename)?.scale ?: 1f
}
data class Image(
val filename: String,
override val scale: Float?,
val scaleType: WallpaperScaleType?,
): WallpaperType()
object Empty: WallpaperType() {
override val scale: Float?
get() = null
}
fun defaultBackgroundColor(theme: DefaultTheme, materialBackground: Color): Color =
if (this is Preset) {
(PresetWallpaper.from(filename) ?: PresetWallpaper.CATS).background[theme]!!
} else {
materialBackground
}
fun defaultTintColor(theme: DefaultTheme): Color =
if (this is Preset) {
(PresetWallpaper.from(filename) ?: PresetWallpaper.CATS).tint[theme]!!
} else if (this is Image && scaleType == WallpaperScaleType.REPEAT) {
Color.Transparent
} else {
Color.Transparent
}
companion object {
var cachedImages: MutableMap<String, ImageBitmap> = mutableMapOf()
fun from(wallpaper: ThemeWallpaper?): WallpaperType? {
return if (wallpaper == null) {
null
} else if (wallpaper.preset != null) {
Preset(wallpaper.preset, wallpaper.scale)
} else if (wallpaper.imageFile != null) {
Image(wallpaper.imageFile, wallpaper.scale, wallpaper.scaleType)
} else {
Empty
}
}
}
}
fun DrawScope.chatViewBackground(image: ImageBitmap, imageType: WallpaperType, background: Color, tint: Color) = clipRect {
val quality = FilterQuality.High
fun repeat(imageScale: Float) {
val scale = imageScale * density
for (h in 0..(size.height / image.height / scale).roundToInt()) {
for (w in 0..(size.width / image.width / scale).roundToInt()) {
drawImage(
image,
dstOffset = IntOffset(x = (w * image.width * scale).roundToInt(), y = (h * image.height * scale).roundToInt()),
dstSize = IntSize((image.width * scale).roundToInt(), (image.height * scale).roundToInt()),
colorFilter = ColorFilter.tint(tint, BlendMode.SrcIn),
filterQuality = quality
)
}
}
}
drawRect(background)
when (imageType) {
is WallpaperType.Preset -> repeat((imageType.scale ?: 1f) * imageType.predefinedImageScale)
is WallpaperType.Image -> when (val scaleType = imageType.scaleType ?: WallpaperScaleType.FILL) {
WallpaperScaleType.REPEAT -> repeat(imageType.scale ?: 1f)
WallpaperScaleType.FILL, WallpaperScaleType.FIT -> {
val scale = scaleType.contentScale.computeScaleFactor(Size(image.width.toFloat(), image.height.toFloat()), Size(size.width, size.height))
val scaledWidth = (image.width * scale.scaleX).roundToInt()
val scaledHeight = (image.height * scale.scaleY).roundToInt()
// Large image will cause freeze
if (image.width > 4320 || image.height > 4320) return@clipRect
drawImage(image, dstOffset = IntOffset(x = ((size.width - scaledWidth) / 2).roundToInt(), y = ((size.height - scaledHeight) / 2).roundToInt()), dstSize = IntSize(scaledWidth, scaledHeight), filterQuality = quality)
if (scaleType == WallpaperScaleType.FIT) {
if (scaledWidth < size.width) {
// has black lines at left and right sides
var x = (size.width - scaledWidth) / 2
while (x > 0) {
drawImage(image, dstOffset = IntOffset(x = (x - scaledWidth).roundToInt(), y = ((size.height - scaledHeight) / 2).roundToInt()), dstSize = IntSize(scaledWidth, scaledHeight), filterQuality = quality)
x -= scaledWidth
}
x = size.width - (size.width - scaledWidth) / 2
while (x < size.width) {
drawImage(image, dstOffset = IntOffset(x = x.roundToInt(), y = ((size.height - scaledHeight) / 2).roundToInt()), dstSize = IntSize(scaledWidth, scaledHeight), filterQuality = quality)
x += scaledWidth
}
} else {
// has black lines at top and bottom sides
var y = (size.height - scaledHeight) / 2
while (y > 0) {
drawImage(image, dstOffset = IntOffset(x = ((size.width - scaledWidth) / 2).roundToInt(), y = (y - scaledHeight).roundToInt()), dstSize = IntSize(scaledWidth, scaledHeight), filterQuality = quality)
y -= scaledHeight
}
y = size.height - (size.height - scaledHeight) / 2
while (y < size.height) {
drawImage(image, dstOffset = IntOffset(x = ((size.width - scaledWidth) / 2).roundToInt(), y = y.roundToInt()), dstSize = IntSize(scaledWidth, scaledHeight), filterQuality = quality)
y += scaledHeight
}
}
}
drawRect(tint)
}
}
is WallpaperType.Empty -> {}
}
}
@@ -51,7 +51,7 @@ fun CloseSheetBar(close: (() -> Unit)?, showClose: Boolean = true, tintColor: Co
@Composable
fun AppBarTitle(title: String, hostDevice: Pair<Long?, String>? = null, withPadding: Boolean = true, bottomPadding: Dp = DEFAULT_PADDING * 1.5f) {
val theme = CurrentColors.collectAsState()
val titleColor = CurrentColors.collectAsState().value.appColors.title
val titleColor = MaterialTheme.appColors.title
val brush = if (theme.value.base == DefaultTheme.SIMPLEX)
Brush.linearGradient(listOf(titleColor.darker(0.2f), titleColor.lighter(0.35f)), Offset(0f, Float.POSITIVE_INFINITY), Offset(Float.POSITIVE_INFINITY, 0f))
else // color is not updated when changing themes if I pass null here
@@ -76,7 +76,7 @@ suspend fun getLinkPreview(url: String): LinkPreview? {
@Composable
fun ComposeLinkView(linkPreview: LinkPreview?, cancelPreview: () -> Unit, cancelEnabled: Boolean) {
val sentColor = CurrentColors.collectAsState().value.appColors.sentMessage
val sentColor = MaterialTheme.appColors.sentMessage
Row(
Modifier.fillMaxWidth().padding(top = 8.dp).background(sentColor),
verticalAlignment = Alignment.CenterVertically
@@ -41,9 +41,12 @@ enum class ModalPlacement {
}
class ModalData {
private val state = mutableMapOf<String, MutableState<Any>>()
private val state = mutableMapOf<String, MutableState<Any?>>()
fun <T> stateGetOrPut (key: String, default: () -> T): MutableState<T> =
state.getOrPut(key) { mutableStateOf(default() as Any) } as MutableState<T>
fun <T> stateGetOrPutNullable (key: String, default: () -> T?): MutableState<T?> =
state.getOrPut(key) { mutableStateOf(default() as Any?) } as MutableState<T?>
}
class ModalManager(private val placement: ModalPlacement? = null) {
@@ -0,0 +1,520 @@
package chat.simplex.common.views.helpers
import SectionBottomSpacer
import SectionItemView
import SectionSpacer
import SectionView
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.MaterialTheme
import androidx.compose.material.MaterialTheme.colors
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.model.yaml
import chat.simplex.common.platform.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.usersettings.*
import chat.simplex.common.views.usersettings.AppearanceScope.WallpaperPresetSelector
import chat.simplex.common.views.usersettings.AppearanceScope.editColor
import chat.simplex.res.MR
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
import kotlinx.serialization.encodeToString
import java.net.URI
@Composable
fun ModalData.UserWallpaperEditor(
theme: ThemeModeOverride,
applyToMode: DefaultThemeMode?,
globalThemeUsed: MutableState<Boolean>,
save: suspend (applyToMode: DefaultThemeMode?, ThemeModeOverride?) -> Unit
) {
ColumnWithScrollBar(
Modifier
.fillMaxSize()
) {
val applyToMode = remember { stateGetOrPutNullable("applyToMode") { applyToMode } }
var showMore by remember { stateGetOrPut("showMore") { false } }
val themeModeOverride = remember { stateGetOrPut("themeModeOverride") { theme } }
val currentTheme by CurrentColors.collectAsState()
AppBarTitle(stringResource(MR.strings.settings_section_title_user_theme))
val wallpaperImage = MaterialTheme.wallpaper.type.image
val wallpaperType = MaterialTheme.wallpaper.type
val onTypeCopyFromSameTheme = { type: WallpaperType? ->
if (type is WallpaperType.Image && chatModel.remoteHostId() != null) {
false
} else {
ThemeManager.copyFromSameThemeOverrides(type, null, themeModeOverride)
withBGApi { save(applyToMode.value, themeModeOverride.value) }
globalThemeUsed.value = false
true
}
}
val preApplyGlobalIfNeeded = { type: WallpaperType? ->
if (globalThemeUsed.value) {
onTypeCopyFromSameTheme(type)
}
}
val onTypeChange: (WallpaperType?) -> Unit = { type: WallpaperType? ->
if (globalThemeUsed.value) {
preApplyGlobalIfNeeded(type)
// Saves copied static image instead of original from global theme
ThemeManager.applyWallpaper(themeModeOverride.value.type, themeModeOverride)
} else {
ThemeManager.applyWallpaper(type, themeModeOverride)
}
withBGApi { save(applyToMode.value, themeModeOverride.value) }
}
val importWallpaperLauncher = rememberFileChooserLauncher(true) { to: URI? ->
if (to != null) {
val filename = saveWallpaperFile(to)
if (filename != null) {
onTypeChange(WallpaperType.Image(filename, 1f, WallpaperScaleType.FILL))
}
}
}
val currentColors = { type: WallpaperType? ->
// If applying for :
// - all themes: no overrides needed
// - specific user: only user overrides for currently selected theme are needed, because they will NOT be copied when other wallpaper is selected
val perUserOverride = if (wallpaperType.sameType(type)) chatModel.currentUser.value?.uiThemes else null
ThemeManager.currentColors(type, null, perUserOverride, appPrefs.themeOverrides.get())
}
val onChooseType: (WallpaperType?) -> Unit = { type: WallpaperType? ->
when {
// don't have image in parent or already selected wallpaper with custom image
type is WallpaperType.Image && chatModel.remoteHostId() != null -> { /* do nothing */ }
type is WallpaperType.Image && (wallpaperType is WallpaperType.Image || currentColors(type).wallpaper.type.image == null) -> withLongRunningApi { importWallpaperLauncher.launch("image/*") }
type is WallpaperType.Image -> onTypeCopyFromSameTheme(currentColors(type).wallpaper.type)
themeModeOverride.value.type != type || currentTheme.wallpaper.type != type -> onTypeCopyFromSameTheme(type)
else -> onTypeChange(type)
}
}
val editColor = { name: ThemeColor ->
editColor(
name,
wallpaperType,
wallpaperImage,
onColorChange = { color ->
preApplyGlobalIfNeeded(themeModeOverride.value.type)
ThemeManager.applyThemeColor(name, color, themeModeOverride)
withBGApi { save(applyToMode.value, themeModeOverride.value) }
}
)
}
WallpaperPresetSelector(
selectedWallpaper = wallpaperType,
baseTheme = currentTheme.base,
currentColors = { type ->
// If applying for :
// - all themes: no overrides needed
// - specific user: only user overrides for currently selected theme are needed, because they will NOT be copied when other wallpaper is selected
val perUserOverride = if (wallpaperType.sameType(type)) chatModel.currentUser.value?.uiThemes else null
ThemeManager.currentColors(type, null, perUserOverride, appPrefs.themeOverrides.get())
},
onChooseType = onChooseType
)
WallpaperSetupView(
themeModeOverride.value.type,
CurrentColors.collectAsState().value.base,
currentTheme.wallpaper,
currentTheme.appColors.sentMessage,
currentTheme.appColors.sentQuote,
currentTheme.appColors.receivedMessage,
currentTheme.appColors.receivedQuote,
editColor = { name -> editColor(name) },
onTypeChange = onTypeChange,
)
SectionSpacer()
if (!globalThemeUsed.value) {
ResetToGlobalThemeButton(true) {
themeModeOverride.value = ThemeManager.defaultActiveTheme(chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
globalThemeUsed.value = true
withBGApi { save(applyToMode.value, null) }
}
}
SetDefaultThemeButton {
globalThemeUsed.value = false
val lightBase = DefaultTheme.LIGHT
val darkBase = if (CurrentColors.value.base != DefaultTheme.LIGHT) CurrentColors.value.base else if (appPrefs.systemDarkTheme.get() == DefaultTheme.DARK.themeName) DefaultTheme.DARK else if (appPrefs.systemDarkTheme.get() == DefaultTheme.BLACK.themeName) DefaultTheme.BLACK else DefaultTheme.SIMPLEX
val mode = themeModeOverride.value.mode
withBGApi {
// Saving for both modes in one place by changing mode once per save
if (applyToMode.value == null) {
val oppositeMode = if (mode == DefaultThemeMode.LIGHT) DefaultThemeMode.DARK else DefaultThemeMode.LIGHT
save(oppositeMode, ThemeModeOverride.withFilledAppDefaults(oppositeMode, if (oppositeMode == DefaultThemeMode.LIGHT) lightBase else darkBase))
}
themeModeOverride.value = ThemeModeOverride.withFilledAppDefaults(mode, if (mode == DefaultThemeMode.LIGHT) lightBase else darkBase)
save(themeModeOverride.value.mode, themeModeOverride.value)
}
}
KeyChangeEffect(theme.mode) {
themeModeOverride.value = theme
if (applyToMode.value != null) {
applyToMode.value = theme.mode
}
}
// Applies updated global theme if current one tracks global theme
KeyChangeEffect(CurrentColors.collectAsState().value) {
if (globalThemeUsed.value) {
themeModeOverride.value = ThemeManager.defaultActiveTheme(chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
globalThemeUsed.value = true
}
}
SectionSpacer()
if (showMore) {
val values by remember { mutableStateOf(
listOf(
null to generalGetString(MR.strings.chat_theme_apply_to_all_modes),
DefaultThemeMode.LIGHT to generalGetString(MR.strings.chat_theme_apply_to_light_mode),
DefaultThemeMode.DARK to generalGetString(MR.strings.chat_theme_apply_to_dark_mode),
)
)
}
ExposedDropDownSettingRow(
generalGetString(MR.strings.chat_theme_apply_to_mode),
values,
applyToMode,
icon = null,
enabled = remember { mutableStateOf(true) },
onSelected = {
applyToMode.value = it
if (it != null && it != CurrentColors.value.base.mode) {
val lightBase = DefaultTheme.LIGHT
val darkBase = if (CurrentColors.value.base != DefaultTheme.LIGHT) CurrentColors.value.base else if (appPrefs.systemDarkTheme.get() == DefaultTheme.DARK.themeName) DefaultTheme.DARK else if (appPrefs.systemDarkTheme.get() == DefaultTheme.BLACK.themeName) DefaultTheme.BLACK else DefaultTheme.SIMPLEX
ThemeManager.applyTheme(if (it == DefaultThemeMode.LIGHT) lightBase.themeName else darkBase.themeName)
}
}
)
SectionSpacer()
AppearanceScope.CustomizeThemeColorsSection(currentTheme, editColor = editColor)
SectionSpacer()
ImportExportThemeSection(null, remember { chatModel.currentUser }.value?.uiThemes) {
withBGApi {
themeModeOverride.value = it
save(applyToMode.value, it)
}
}
} else {
AdvancedSettingsButton { showMore = true }
}
SectionBottomSpacer()
}
}
@Composable
fun ModalData.ChatWallpaperEditor(
theme: ThemeModeOverride,
applyToMode: DefaultThemeMode?,
globalThemeUsed: MutableState<Boolean>,
save: suspend (applyToMode: DefaultThemeMode?, ThemeModeOverride?) -> Unit
) {
ColumnWithScrollBar(
Modifier
.fillMaxSize()
) {
val applyToMode = remember { stateGetOrPutNullable("applyToMode") { applyToMode } }
var showMore by remember { stateGetOrPut("showMore") { false } }
val themeModeOverride = remember { stateGetOrPut("themeModeOverride") { theme } }
val currentTheme by remember(themeModeOverride.value, CurrentColors.collectAsState().value) {
mutableStateOf(
ThemeManager.currentColors(null, if (globalThemeUsed.value) null else themeModeOverride.value, chatModel.currentUser.value?.uiThemes, appPreferences.themeOverrides.get())
)
}
AppBarTitle(stringResource(MR.strings.settings_section_title_chat_theme))
val onTypeCopyFromSameTheme: (WallpaperType?) -> Boolean = { type ->
if (type is WallpaperType.Image && chatModel.remoteHostId() != null) {
false
} else {
val success = ThemeManager.copyFromSameThemeOverrides(type, chatModel.currentUser.value?.uiThemes?.preferredMode(!CurrentColors.value.colors.isLight), themeModeOverride)
if (success) {
withBGApi { save(applyToMode.value, themeModeOverride.value) }
globalThemeUsed.value = false
}
success
}
}
val preApplyGlobalIfNeeded = { type: WallpaperType? ->
if (globalThemeUsed.value) {
onTypeCopyFromSameTheme(type)
}
}
val onTypeChange: (WallpaperType?) -> Unit = { type ->
if (globalThemeUsed.value) {
preApplyGlobalIfNeeded(type)
// Saves copied static image instead of original from global theme
ThemeManager.applyWallpaper(themeModeOverride.value.type, themeModeOverride)
} else {
ThemeManager.applyWallpaper(type, themeModeOverride)
}
withBGApi { save(applyToMode.value, themeModeOverride.value) }
}
val editColor: (ThemeColor) -> Unit = { name: ThemeColor ->
ModalManager.end.showModal {
val currentTheme by remember(themeModeOverride.value, CurrentColors.collectAsState().value) {
mutableStateOf(
ThemeManager.currentColors(null, themeModeOverride.value, chatModel.currentUser.value?.uiThemes, appPreferences.themeOverrides.get())
)
}
val initialColor: Color = when (name) {
ThemeColor.WALLPAPER_BACKGROUND -> currentTheme.wallpaper.background ?: Color.Transparent
ThemeColor.WALLPAPER_TINT -> currentTheme.wallpaper.tint ?: Color.Transparent
ThemeColor.PRIMARY -> currentTheme.colors.primary
ThemeColor.PRIMARY_VARIANT -> currentTheme.colors.primaryVariant
ThemeColor.SECONDARY -> currentTheme.colors.secondary
ThemeColor.SECONDARY_VARIANT -> currentTheme.colors.secondaryVariant
ThemeColor.BACKGROUND -> currentTheme.colors.background
ThemeColor.SURFACE -> currentTheme.colors.surface
ThemeColor.TITLE -> currentTheme.appColors.title
ThemeColor.PRIMARY_VARIANT2 -> currentTheme.appColors.primaryVariant2
ThemeColor.SENT_MESSAGE -> currentTheme.appColors.sentMessage
ThemeColor.SENT_QUOTE -> currentTheme.appColors.sentQuote
ThemeColor.RECEIVED_MESSAGE -> currentTheme.appColors.receivedMessage
ThemeColor.RECEIVED_QUOTE -> currentTheme.appColors.receivedQuote
}
AppearanceScope.ColorEditor(
name,
initialColor,
CurrentColors.collectAsState().value.base,
themeModeOverride.value.type,
themeModeOverride.value.type?.image,
currentTheme.wallpaper.background,
currentTheme.wallpaper.tint,
currentColors = {
ThemeManager.currentColors(null, themeModeOverride.value, chatModel.currentUser.value?.uiThemes, appPreferences.themeOverrides.get())
},
onColorChange = { color ->
preApplyGlobalIfNeeded(themeModeOverride.value.type)
ThemeManager.applyThemeColor(name, color, themeModeOverride)
withBGApi { save(applyToMode.value, themeModeOverride.value) }
}
)
}
}
val importWallpaperLauncher = rememberFileChooserLauncher(true) { to: URI? ->
if (to != null) {
val filename = saveWallpaperFile(to)
if (filename != null) {
// Delete only non-user image
if (!globalThemeUsed.value) {
removeWallpaperFile((themeModeOverride.value.type as? WallpaperType.Image)?.filename)
}
globalThemeUsed.value = false
onTypeChange(WallpaperType.Image(filename, 1f, WallpaperScaleType.FILL))
}
}
}
val currentColors = { type: WallpaperType? ->
ThemeManager.currentColors(type, if (type?.sameType(themeModeOverride.value.type) == true) themeModeOverride.value else null, chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
}
WallpaperPresetSelector(
selectedWallpaper = currentTheme.wallpaper.type,
activeBackgroundColor = currentTheme.wallpaper.background,
activeTintColor = currentTheme.wallpaper.tint,
baseTheme = CurrentColors.collectAsState().value.base,
currentColors = { type -> currentColors(type) },
onChooseType = { type ->
when {
type is WallpaperType.Image && chatModel.remoteHostId() != null -> { /* do nothing */ }
type is WallpaperType.Image && ((themeModeOverride.value.type is WallpaperType.Image && !globalThemeUsed.value) || currentColors(type).wallpaper.type.image == null) -> {
withLongRunningApi { importWallpaperLauncher.launch("image/*") }
}
type is WallpaperType.Image -> {
if (!onTypeCopyFromSameTheme(currentColors(type).wallpaper.type)) {
withLongRunningApi { importWallpaperLauncher.launch("image/*") }
}
}
globalThemeUsed.value || themeModeOverride.value.type != type -> {
onTypeCopyFromSameTheme(type)
}
else -> {
onTypeChange(type)
}
}
},
)
WallpaperSetupView(
themeModeOverride.value.type,
CurrentColors.collectAsState().value.base,
currentTheme.wallpaper,
currentTheme.appColors.sentMessage,
currentTheme.appColors.sentQuote,
currentTheme.appColors.receivedMessage,
currentTheme.appColors.receivedQuote,
editColor = editColor,
onTypeChange = onTypeChange,
)
SectionSpacer()
if (!globalThemeUsed.value) {
ResetToGlobalThemeButton(remember { chatModel.currentUser }.value?.uiThemes?.preferredMode(isInDarkTheme()) == null) {
themeModeOverride.value = ThemeManager.defaultActiveTheme(chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
globalThemeUsed.value = true
withBGApi { save(applyToMode.value, null) }
}
}
SetDefaultThemeButton {
globalThemeUsed.value = false
val lightBase = DefaultTheme.LIGHT
val darkBase = if (CurrentColors.value.base != DefaultTheme.LIGHT) CurrentColors.value.base else if (appPrefs.systemDarkTheme.get() == DefaultTheme.DARK.themeName) DefaultTheme.DARK else if (appPrefs.systemDarkTheme.get() == DefaultTheme.BLACK.themeName) DefaultTheme.BLACK else DefaultTheme.SIMPLEX
val mode = themeModeOverride.value.mode
withBGApi {
// Saving for both modes in one place by changing mode once per save
if (applyToMode.value == null) {
val oppositeMode = if (mode == DefaultThemeMode.LIGHT) DefaultThemeMode.DARK else DefaultThemeMode.LIGHT
save(oppositeMode, ThemeModeOverride.withFilledAppDefaults(oppositeMode, if (oppositeMode == DefaultThemeMode.LIGHT) lightBase else darkBase))
}
themeModeOverride.value = ThemeModeOverride.withFilledAppDefaults(mode, if (mode == DefaultThemeMode.LIGHT) lightBase else darkBase)
save(themeModeOverride.value.mode, themeModeOverride.value)
}
}
KeyChangeEffect(theme.mode) {
themeModeOverride.value = theme
if (applyToMode.value != null) {
applyToMode.value = theme.mode
}
}
// Applies updated global theme if current one tracks global theme
KeyChangeEffect(CurrentColors.collectAsState()) {
if (globalThemeUsed.value) {
themeModeOverride.value = ThemeManager.defaultActiveTheme(chatModel.currentUser.value?.uiThemes, appPrefs.themeOverrides.get())
globalThemeUsed.value = true
}
}
SectionSpacer()
if (showMore) {
val values by remember { mutableStateOf(
listOf(
null to generalGetString(MR.strings.chat_theme_apply_to_all_modes),
DefaultThemeMode.LIGHT to generalGetString(MR.strings.chat_theme_apply_to_light_mode),
DefaultThemeMode.DARK to generalGetString(MR.strings.chat_theme_apply_to_dark_mode),
)
)
}
ExposedDropDownSettingRow(
generalGetString(MR.strings.chat_theme_apply_to_mode),
values,
applyToMode,
icon = null,
enabled = remember { mutableStateOf(true) },
onSelected = {
applyToMode.value = it
if (it != null && it != CurrentColors.value.base.mode) {
val lightBase = DefaultTheme.LIGHT
val darkBase = if (CurrentColors.value.base != DefaultTheme.LIGHT) CurrentColors.value.base else if (appPrefs.systemDarkTheme.get() == DefaultTheme.DARK.themeName) DefaultTheme.DARK else if (appPrefs.systemDarkTheme.get() == DefaultTheme.BLACK.themeName) DefaultTheme.BLACK else DefaultTheme.SIMPLEX
ThemeManager.applyTheme(if (it == DefaultThemeMode.LIGHT) lightBase.themeName else darkBase.themeName)
}
}
)
SectionSpacer()
AppearanceScope.CustomizeThemeColorsSection(currentTheme, editColor = editColor)
SectionSpacer()
ImportExportThemeSection(themeModeOverride.value, remember { chatModel.currentUser }.value?.uiThemes) {
withBGApi {
themeModeOverride.value = it
save(applyToMode.value, it)
}
}
} else {
AdvancedSettingsButton { showMore = true }
}
SectionBottomSpacer()
}
}
@Composable
private fun ImportExportThemeSection(perChat: ThemeModeOverride?, perUser: ThemeModeOverrides?, save: (ThemeModeOverride) -> Unit) {
SectionView {
val theme = remember { mutableStateOf(null as String?) }
val exportThemeLauncher = rememberFileChooserLauncher(false) { to: URI? ->
val themeValue = theme.value
if (themeValue != null && to != null) {
copyBytesToFile(themeValue.byteInputStream(), to) {
theme.value = null
}
}
}
SectionItemView({
val overrides = ThemeManager.currentThemeOverridesForExport(perChat, perUser)
val lines = yaml.encodeToString<ThemeOverrides>(overrides).lines()
// Removing theme id without using custom serializer or data class
theme.value = lines.subList(1, lines.size).joinToString("\n")
withLongRunningApi { exportThemeLauncher.launch("simplex.theme") }
}) {
Text(generalGetString(MR.strings.export_theme), color = colors.primary)
}
val importThemeLauncher = rememberFileChooserLauncher(true) { to: URI? ->
if (to != null) {
val theme = getThemeFromUri(to)
if (theme != null) {
val res = ThemeModeOverride(mode = theme.base.mode, colors = theme.colors, wallpaper = theme.wallpaper?.importFromString()).removeSameColors(theme.base)
save(res)
}
}
}
// Can not limit to YAML mime type since it's unsupported by Android
SectionItemView({ withLongRunningApi { importThemeLauncher.launch("*/*") } }) {
Text(generalGetString(MR.strings.import_theme), color = colors.primary)
}
}
}
@Composable
private fun ResetToGlobalThemeButton(app: Boolean, onClick: () -> Unit) {
SectionItemView(onClick) {
Text(stringResource(if (app) MR.strings.chat_theme_reset_to_app_theme else MR.strings.chat_theme_reset_to_user_theme), color = MaterialTheme.colors.primary)
}
}
@Composable
private fun SetDefaultThemeButton(onClick: () -> Unit) {
SectionItemView(onClick) {
Text(stringResource(MR.strings.chat_theme_set_default_theme), color = MaterialTheme.colors.primary)
}
}
@Composable
private fun AdvancedSettingsButton(onClick: () -> Unit) {
SettingsActionItem(
painterResource(MR.images.ic_arrow_downward),
stringResource(MR.strings.wallpaper_advanced_settings),
click = onClick
)
}
@@ -19,6 +19,7 @@ import kotlinx.serialization.encodeToString
import java.io.*
import java.net.URI
import java.nio.file.Files
import java.nio.file.StandardCopyOption
import java.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.Executors
@@ -145,6 +146,7 @@ fun getThemeFromUri(uri: URI, withAlertOnException: Boolean = true): ThemeOverri
runCatching {
return yaml.decodeFromStream<ThemeOverrides>(it!!)
}.onFailure {
Log.e(TAG, "Error while decoding theme: ${it.stackTraceToString()}")
if (withAlertOnException) {
AlertManager.shared.showAlertMsg(
title = generalGetString(MR.strings.import_theme_error),
@@ -280,6 +282,38 @@ fun saveFileFromUri(uri: URI, withAlertOnException: Boolean = true): CryptoFile?
}
}
fun saveWallpaperFile(uri: URI): String? {
val destFileName = generateNewFileName("wallpaper", "jpg", File(getWallpaperFilePath("")))
val destFile = File(getWallpaperFilePath(destFileName))
try {
val inputStream = uri.inputStream()
Files.copy(inputStream!!, destFile.toPath(), StandardCopyOption.REPLACE_EXISTING)
} catch (e: Exception) {
Log.e(TAG, "Error saving wallpaper file: ${e.stackTraceToString()}")
AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error), e.stackTraceToString())
return null
}
return destFile.name
}
fun saveWallpaperFile(image: ImageBitmap): String {
val destFileName = generateNewFileName("wallpaper", "jpg", File(getWallpaperFilePath("")))
val destFile = File(getWallpaperFilePath(destFileName))
val dataResized = resizeImageToDataSize(image, false, maxDataSize = 5_000_000)
val output = FileOutputStream(destFile)
dataResized.use {
it.writeTo(output)
}
return destFile.name
}
fun removeWallpaperFile(fileName: String? = null) {
File(getWallpaperFilePath("_")).parentFile.listFiles()?.forEach {
if (it.name == fileName) it.delete()
}
WallpaperType.cachedImages.remove(fileName)
}
fun <T> createTmpFileAndDelete(onCreated: (File) -> T): T {
val tmpFile = File(tmpDir, UUID.randomUUID().toString())
tmpFile.deleteOnExit()
@@ -550,10 +584,33 @@ fun KeyChangeEffect(
val initialKey = remember { key1 }
val initialKey2 = remember { key2 }
var anyChange by remember { mutableStateOf(false) }
LaunchedEffect(key1) {
LaunchedEffect(key1, key2) {
if (anyChange || key1 != initialKey || key2 != initialKey2) {
block()
anyChange = true
}
}
}
/**
* Runs the [block] only after initial value of the [key1], or [key2], or [key3] changes, not after initial launch
* */
@Composable
@NonRestartableComposable
fun KeyChangeEffect(
key1: Any?,
key2: Any?,
key3: Any?,
block: suspend CoroutineScope.() -> Unit
) {
val initialKey = remember { key1 }
val initialKey2 = remember { key2 }
val initialKey3 = remember { key3 }
var anyChange by remember { mutableStateOf(false) }
LaunchedEffect(key1, key2, key3) {
if (anyChange || key1 != initialKey || key2 != initialKey2 || key3 != initialKey3) {
block()
anyChange = true
}
}
}
@@ -34,7 +34,7 @@ fun LocalAuthView(m: ChatModel, authRequest: LocalAuthRequest) {
} else {
val r: LAResult = if (passcode.value == authRequest.password) {
if (authRequest.selfDestruct && sdPassword != null && controller.ctrl == -1L) {
initChatControllerAndRunMigrations()
initChatControllerOnStart()
}
LAResult.Success
} else {
@@ -669,7 +669,7 @@ private suspend fun MutableState<MigrationToState?>.cleanUpOnBack(chatReceiver:
if (state is MigrationToState.ArchiveImportFailed) {
// Original database is not exist, nothing is set up correctly for showing to a user yet. Return to clean state
deleteChatDatabaseFilesAndState()
initChatControllerAndRunMigrations()
initChatControllerOnStart()
} else if (state is MigrationToState.DownloadProgress && state.ctrl != null) {
stopArchiveDownloading(state.fileId, state.ctrl)
}
@@ -250,17 +250,17 @@ fun NetworkAndServersView() {
Divider(Modifier.padding(start = DEFAULT_PADDING_HALF, top = 24.dp, end = DEFAULT_PADDING_HALF, bottom = 30.dp))
}
// if (currentRemoteHost == null) {
// SectionView(generalGetString(MR.strings.settings_section_title_private_message_routing)) {
// SMPProxyModePicker(smpProxyMode, showModal, updateSMPProxyMode)
// SMPProxyFallbackPicker(smpProxyFallback, showModal, updateSMPProxyFallback, enabled = remember { mutableStateOf(smpProxyMode.value != SMPProxyMode.Never) })
// SettingsPreferenceItem(painterResource(MR.images.ic_arrow_forward), stringResource(MR.strings.private_routing_show_message_status), chatModel.controller.appPrefs.showSentViaProxy)
// }
// SectionCustomFooter {
// Text(stringResource(MR.strings.private_routing_explanation))
// }
// Divider(Modifier.padding(start = DEFAULT_PADDING_HALF, top = 32.dp, end = DEFAULT_PADDING_HALF, bottom = 30.dp))
// }
if (currentRemoteHost == null) {
SectionView(generalGetString(MR.strings.settings_section_title_private_message_routing)) {
SMPProxyModePicker(smpProxyMode, showModal, updateSMPProxyMode)
SMPProxyFallbackPicker(smpProxyFallback, showModal, updateSMPProxyFallback, enabled = remember { mutableStateOf(smpProxyMode.value != SMPProxyMode.Never) })
SettingsPreferenceItem(painterResource(MR.images.ic_arrow_forward), stringResource(MR.strings.private_routing_show_message_status), chatModel.controller.appPrefs.showSentViaProxy)
}
SectionCustomFooter {
Text(stringResource(MR.strings.private_routing_explanation))
}
Divider(Modifier.padding(start = DEFAULT_PADDING_HALF, top = 32.dp, end = DEFAULT_PADDING_HALF, bottom = 30.dp))
}
SectionView(generalGetString(MR.strings.settings_section_title_calls)) {
SettingsActionItem(painterResource(MR.images.ic_electrical_services), stringResource(MR.strings.webrtc_ice_servers), { ModalManager.start.showModal { RTCServersView(m) } })
@@ -144,7 +144,7 @@ fun SettingsLayout(
SettingsActionItem(painterResource(MR.images.ic_wifi_tethering), stringResource(MR.strings.network_and_servers), showSettingsModal { NetworkAndServersView() }, disabled = stopped, extraPadding = true)
SettingsActionItem(painterResource(MR.images.ic_videocam), stringResource(MR.strings.settings_audio_video_calls), showSettingsModal { CallSettingsView(it, showModal) }, disabled = stopped, extraPadding = true)
SettingsActionItem(painterResource(MR.images.ic_lock), stringResource(MR.strings.privacy_and_security), showSettingsModal { PrivacySettingsView(it, showSettingsModal, setPerformLA) }, disabled = stopped, extraPadding = true)
SettingsActionItem(painterResource(MR.images.ic_light_mode), stringResource(MR.strings.appearance_settings), showSettingsModal { AppearanceView(it, showSettingsModal) }, extraPadding = true)
SettingsActionItem(painterResource(MR.images.ic_light_mode), stringResource(MR.strings.appearance_settings), showSettingsModal { AppearanceView(it) }, extraPadding = true)
DatabaseItem(encrypted, passphraseSaved, showSettingsModal { DatabaseView(it, showSettingsModal) }, stopped)
}
SectionDividerSpaced()
@@ -847,7 +847,6 @@
<string name="auth_open_chat_profiles">افتح ملفات تعريف الدردشة</string>
<string name="revoke_file__confirm">اسحب الوصول</string>
<string name="save_archive">حفظ الأرشيف</string>
<string name="save_color">حفظ اللون</string>
<string name="reveal_verb">كشف</string>
<string name="stop_rcv_file__message">سيتم إيقاف استلام الملف.</string>
<string name="reject_contact_button">رفض</string>
@@ -1124,7 +1123,7 @@
<string name="settings_section_title_themes">السمات</string>
<string name="v4_6_chinese_spanish_interface_descr">بفضل المستخدمين - المساهمة عبر Weblate!</string>
<string name="database_initialization_error_desc">قاعدة البيانات لا تعمل بشكل صحيح. انقر لمعرفة المزيد</string>
<string name="theme_colors_section_title">ألوان السمة</string>
<string name="theme_colors_section_title">ألوان الواجهة</string>
<string name="tap_to_activate_profile">انقر لتنشيط الملف الشخصي.</string>
<string name="v4_5_transport_isolation">عزل النقل</string>
<string name="this_string_is_not_a_connection_link">هذه السلسلة ليست رابط اتصال!</string>
@@ -1767,4 +1766,73 @@
<string name="v5_7_shape_profile_images">شكل الصور الشخصية</string>
<string name="v5_7_new_interface_languages">واجهة المستخدم الليتوانية</string>
<string name="v5_7_shape_profile_images_descr">مربع أو دائرة أو أي شيء بينهما.</string>
<string name="srv_error_host">عنوان الخادم غير متوافق مع إعدادات الشبكة.</string>
<string name="srv_error_version">إصدار الخادم غير متوافق مع إعدادات الشبكة.</string>
<string name="snd_error_auth">مفتاح خاطئ أو اتصال غير معروف - على الأرجح حُذف هذا الاتصال.</string>
<string name="snd_error_quota">تم تجاوز السعة - لم يتلق المُستلم الرسائل المُرسلة مسبقًا.</string>
<string name="snd_error_relay">خطأ في خادم الوجهة: %1$s</string>
<string name="ci_status_other_error">خطأ: %1$s</string>
<string name="snd_error_proxy_relay">خادم إعادة التوجيه: %1$s
\nخطأ في الخادم الوجهة: %2$s</string>
<string name="snd_error_proxy">خادم إعادة التوجيه: %1$s
\nخطأ: %2$s</string>
<string name="message_delivery_warning_title">تحذير تسليم الرسالة</string>
<string name="snd_error_expired">مشكلات الشبكة - انتهت صلاحية الرسالة بعد عِدة محاولات لإرسالها.</string>
<string name="network_smp_proxy_fallback_allow">نعم</string>
<string name="private_routing_explanation">لحماية عنوان IP الخاص بك، يستخدم التوجيه الخاص خوادم SMP الخاصة بك لتسليم الرسائل.</string>
<string name="settings_section_title_private_message_routing">توجيه الرسائل الخاصة</string>
<string name="network_smp_proxy_mode_private_routing">التوجيه الخاص</string>
<string name="network_smp_proxy_mode_unprotected">غير محمي</string>
<string name="network_smp_proxy_fallback_allow_downgrade">السماح بالرجوع إلى إصدار سابق</string>
<string name="network_smp_proxy_mode_never_description">لا تستخدم التوجيه الخاص.</string>
<string name="update_network_smp_proxy_mode_question">وضع توجيه الرسائل</string>
<string name="network_smp_proxy_fallback_prohibit">لا</string>
<string name="network_smp_proxy_fallback_allow_protected">عندما يكون IP مخفيًا</string>
<string name="network_smp_proxy_fallback_prohibit_description">لا ترسل رسائل مباشرةً، حتى لو كان خادمك أو خادم الوجهة لا يدعم التوجيه الخاص.</string>
<string name="network_smp_proxy_fallback_allow_description">أرسل الرسائل مباشرة عندما لا يدعم الخادم الوجهة الخاص بك أو الخادم الوجهة التوجيه الخاص.</string>
<string name="update_network_smp_proxy_fallback_question">احتياطي توجيه الرسالة</string>
<string name="private_routing_show_message_status">أظهِر حالة الرسالة</string>
<string name="protect_ip_address">احمِ عنوان IP</string>
<string name="without_tor_or_vpn_ip_address_will_be_visible_to_file_servers">بدون تور أو VPN، سيكون عنوان IP الخاص بك مرئيًا لخوادم الملفات.</string>
<string name="network_smp_proxy_mode_unknown_description">استخدم التوجيه الخاص مع خوادم غير معروفة.</string>
<string name="network_smp_proxy_mode_unprotected_description">استخدم التوجيه الخاص مع خوادم غير معروفة عندما لا يكون عنوان IP محميًا.</string>
<string name="network_smp_proxy_mode_always">دائمًا</string>
<string name="network_smp_proxy_mode_always_description">استخدم دائمًا التوجيه الخاص.</string>
<string name="settings_section_title_files">الملفات</string>
<string name="network_smp_proxy_mode_never">مطلقًا</string>
<string name="app_will_ask_to_confirm_unknown_file_servers">سيطلب التطبيق تأكيد التنزيلات من خوادم ملفات غير معروفة (باستثناء .onion أو عند تفعيل وكيل SOCKS).</string>
<string name="network_smp_proxy_fallback_allow_protected_description">أرسل الرسائل مباشرة عندما يكون عنوان IP محميًا ولا يدعم الخادم الوجهة لديك التوجيه الخاص.</string>
<string name="network_smp_proxy_mode_unknown">مُرحلات غير معروفة</string>
<string name="file_not_approved_title">خوادم غير معروفة!</string>
<string name="file_not_approved_descr">بدون تور أو VPN، سيكون عنوان IP الخاص بك مرئيًا لمُرحلات XFTP هذه:
\n%1$s.</string>
<string name="chat_list_always_visible">أظهِر قائمة الدردشة في نافذة جديدة</string>
<string name="settings_section_title_chat_colors">ألوان الدردشة</string>
<string name="settings_section_title_chat_theme">سمة الدردشة</string>
<string name="color_received_quote">تلقى الرد</string>
<string name="theme_remove_image">أزِل الصورة</string>
<string name="wallpaper_scale_repeat">تكرار</string>
<string name="reset_single_color">إعادة تعيين اللون</string>
<string name="color_sent_quote">أرسلت رد</string>
<string name="chat_theme_set_default_theme">تعيين السمة الافتراضية</string>
<string name="color_mode_system">النظام</string>
<string name="color_wallpaper_tint">لون تمييز خلفية الشاشة</string>
<string name="color_primary_variant2">لون إضافي ثانوي 2</string>
<string name="wallpaper_advanced_settings">الإعدادات المتقدمة</string>
<string name="chat_theme_apply_to_all_modes">جميع أوضاع الألوان</string>
<string name="theme_black">أسود</string>
<string name="color_mode">وضع اللون</string>
<string name="color_mode_dark">داكن</string>
<string name="chat_theme_apply_to_dark_mode">الوضع الداكن</string>
<string name="dark_mode_colors">ألوان الوضع الداكن</string>
<string name="wallpaper_scale_fit">ملائمة</string>
<string name="wallpaper_preview_hello_alice">طاب يومك!</string>
<string name="wallpaper_preview_hello_bob">صباح الخير!</string>
<string name="color_wallpaper_background">صورة خلفية الشاشة</string>
<string name="chat_theme_apply_to_light_mode">الوضع الفاتح</string>
<string name="settings_section_title_user_theme">السمة الملف الشخصي</string>
<string name="color_mode_light">فاتح</string>
<string name="chat_theme_apply_to_mode">طبّق لِ</string>
<string name="wallpaper_scale_fill">ملء</string>
<string name="wallpaper_scale">المقياس</string>
</resources>
@@ -746,7 +746,7 @@
<string name="private_routing_explanation">To protect your IP address, private routing uses your SMP servers to deliver messages.</string>
<string name="appearance_settings">Appearance</string>
<string name="customize_theme_title">Customize theme</string>
<string name="theme_colors_section_title">THEME COLORS</string>
<string name="theme_colors_section_title">INTERFACE COLORS</string>
<string name="app_version_title">App version</string>
<string name="app_version_name">App version: v%s</string>
<string name="app_version_code">App build: %s</string>
@@ -874,6 +874,7 @@
<string name="audio_device_speaker">Speaker</string>
<string name="audio_device_wired_headphones">Headphones</string>
<string name="audio_device_bluetooth">Bluetooth</string>
<string name="error_initializing_web_view">Error initializing WebView. Update your system to the new version. Please contact developers.\nError: %s</string>
<!-- SimpleXInfo -->
<string name="next_generation_of_private_messaging">The next generation of private messaging</string>
@@ -1072,6 +1073,9 @@
<string name="settings_section_title_icon">APP ICON</string>
<string name="settings_section_title_themes">THEMES</string>
<string name="settings_section_title_profile_images">Profile images</string>
<string name="settings_section_title_chat_theme">Chat theme</string>
<string name="settings_section_title_user_theme">Profile theme</string>
<string name="settings_section_title_chat_colors">Chat colors</string>
<string name="settings_section_title_messages">MESSAGES AND FILES</string>
<string name="settings_section_title_private_message_routing">PRIVATE MESSAGE ROUTING</string>
<string name="settings_section_title_calls">CALLS</string>
@@ -1201,6 +1205,7 @@
<string name="incompatible_database_version">Incompatible database version</string>
<string name="confirm_database_upgrades">Confirm database upgrades</string>
<string name="terminal_always_visible">Show console in new window</string>
<string name="chat_list_always_visible">Show chat list in new window</string>
<string name="invalid_migration_confirmation">Invalid migration confirmation</string>
<string name="upgrade_and_open_chat">Upgrade and open chat</string>
<string name="downgrade_and_open_chat">Downgrade and open chat</string>
@@ -1543,23 +1548,30 @@
<string name="incognito_info_share">When you share an incognito profile with somebody, this profile will be used for the groups they invite you to.</string>
<!-- Default themes -->
<string name="color_mode_system">System</string>
<string name="color_mode_light">Light</string>
<string name="color_mode_dark">Dark</string>
<string name="theme_system">System</string>
<string name="theme_light">Light</string>
<string name="theme_dark">Dark</string>
<string name="theme_simplex">SimpleX</string>
<string name="theme_black">Black</string>
<!-- Languages -->
<string name="language_system">System</string>
<!-- Appearance.kt -->
<string name="theme">Theme</string>
<string name="color_mode">Color mode</string>
<string name="dark_theme">Dark theme</string>
<string name="save_color">Save color</string>
<string name="dark_mode_colors">Dark mode colors</string>
<string name="import_theme">Import theme</string>
<string name="import_theme_error">Import theme error</string>
<string name="import_theme_error_desc">Make sure the file has correct YAML syntax. Export theme to have an example of the theme file structure.</string>
<string name="export_theme">Export theme</string>
<string name="reset_color">Reset colors</string>
<string name="reset_single_color">Reset color</string>
<string name="theme_destination_app_theme">App theme</string>
<string name="color_primary">Accent</string>
<string name="color_primary_variant">Additional accent</string>
<string name="color_secondary">Secondary</string>
@@ -1567,8 +1579,31 @@
<string name="color_background">Background</string>
<string name="color_surface">Menus &amp; alerts</string>
<string name="color_title">Title</string>
<string name="color_primary_variant2">Additional accent 2</string>
<string name="color_sent_message">Sent message</string>
<string name="color_sent_quote">Sent reply</string>
<string name="color_received_message">Received message</string>
<string name="color_received_quote">Received reply</string>
<string name="color_wallpaper_background">Wallpaper background</string>
<string name="color_wallpaper_tint">Wallpaper accent</string>
<string name="theme_remove_image">Remove image</string>
<!-- Wallpapers -->
<string name="wallpaper_preview_hello_alice">Good afternoon!</string>
<string name="wallpaper_preview_hello_bob">Good morning!</string>
<string name="wallpaper_scale">Scale</string>
<string name="wallpaper_scale_repeat">Repeat</string>
<string name="wallpaper_scale_fill">Fill</string>
<string name="wallpaper_scale_fit">Fit</string>
<string name="wallpaper_advanced_settings">Advanced settings</string>
<string name="chat_theme_reset_to_app_theme">Reset to app theme</string>
<string name="chat_theme_reset_to_user_theme">Reset to user theme</string>
<string name="chat_theme_set_default_theme">Set default theme</string>
<string name="chat_theme_apply_to_mode">Apply to</string>
<string name="chat_theme_apply_to_all_modes">All color modes</string>
<string name="chat_theme_apply_to_light_mode">Light mode</string>
<string name="chat_theme_apply_to_dark_mode">Dark mode</string>
<!-- Preferences.kt -->
<string name="chat_preferences_you_allow">You allow</string>
@@ -1150,7 +1150,6 @@
<string name="network_options_revert">Отмени промените</string>
<string name="network_options_save">Запази</string>
<string name="reset_color">Нулирай цветовете</string>
<string name="save_color">Запази цвета</string>
<string name="color_secondary">Вторичен</string>
<string name="custom_time_picker_select">Избери</string>
<string name="to_start_a_new_chat_help_header">За да започнете нов чат</string>
@@ -55,7 +55,6 @@
<string name="update_network_settings_question">Aktualizovat nastavení sítě\?</string>
<string name="incognito">Inkognito</string>
<string name="incognito_random_profile">Váš náhodný profil</string>
<string name="save_color">Uložit barvu</string>
<string name="reset_color">Obnovit barvu</string>
<string name="color_primary">Zbarvení</string>
<string name="chat_preferences_you_allow">Povolujete</string>
@@ -1770,4 +1769,6 @@
<string name="permissions_camera_and_record_audio">Kamera a mikrofon</string>
<string name="simplex_links_are_prohibited_in_group">SimpleX odkazy jsou v této skupině zakázány.</string>
<string name="e2ee_info_no_pq"><![CDATA[Zprávy, soubory a hovory jsou chráněny <b>koncovým</b> šifrováním s dokonalým dopředným utajením, odmítnutím a obnovením po vloupání.]]></string>
<string name="wallpaper_advanced_settings">Pokročilé nastavení</string>
<string name="chat_theme_apply_to_all_modes">Všechny barevné režimy</string>
</resources>
@@ -400,11 +400,11 @@
<string name="network_use_onion_hosts_prefer">Wenn verfügbar</string>
<string name="network_use_onion_hosts_no">Nein</string>
<string name="network_use_onion_hosts_required">Erforderlich</string>
<string name="network_use_onion_hosts_prefer_desc">Onion-Hosts werden verwendet, wenn sie verfügbar sind.</string>
<string name="network_use_onion_hosts_prefer_desc">Wenn Onion-Hosts verfügbar sind, werden sie verwendet.</string>
<string name="network_use_onion_hosts_no_desc">Onion-Hosts werden nicht verwendet.</string>
<string name="network_use_onion_hosts_required_desc">Für die Verbindung werden Onion-Hosts benötigt.
\nBitte beachten Sie: Ohne .onion-Adresse können Sie keine Verbindung mit den Servern herstellen.</string>
<string name="network_use_onion_hosts_prefer_desc_in_alert">Onion-Hosts werden verwendet, wenn sie verfügbar sind.</string>
<string name="network_use_onion_hosts_prefer_desc_in_alert">Wenn Onion-Hosts verfügbar sind, werden sie verwendet.</string>
<string name="network_use_onion_hosts_no_desc_in_alert">Onion-Hosts werden nicht verwendet.</string>
<string name="network_use_onion_hosts_required_desc_in_alert">Für die Verbindung werden Onion-Hosts benötigt.</string>
<string name="appearance_settings">Erscheinungsbild</string>
@@ -502,7 +502,7 @@
<!-- Call settings -->
<string name="settings_audio_video_calls">Audio- &amp; Videoanrufe</string>
<string name="your_calls">Ihre Anrufe</string>
<string name="always_use_relay">Über ein Relais verbinden</string>
<string name="always_use_relay">Immer über ein Relais verbinden</string>
<string name="call_on_lock_screen">Anrufe auf Sperrbildschirm:</string>
<string name="accept_call_on_lock_screen">Akzeptieren</string>
<string name="show_call_on_lock_screen">Anzeigen</string>
@@ -842,7 +842,6 @@
<string name="theme_dark">Dunkel</string>
<!-- Appearance.kt -->
<string name="theme">Design</string>
<string name="save_color">Farbe speichern</string>
<string name="reset_color">Farben zurücksetzen</string>
<string name="color_primary">Akzent</string>
<!-- Preferences.kt -->
@@ -1208,7 +1207,7 @@
<string name="you_can_accept_or_reject_connection">Wenn Personen eine Verbindung anfordern, können Sie diese annehmen oder ablehnen.</string>
<string name="you_wont_lose_your_contacts_if_delete_address">Sie werden Ihre damit verbundenen Kontakte nicht verlieren, wenn Sie diese Adresse später löschen.</string>
<string name="customize_theme_title">Design anpassen</string>
<string name="theme_colors_section_title">DESIGN-FARBEN</string>
<string name="theme_colors_section_title">INTERFACE-FARBEN</string>
<string name="add_address_to_your_profile">Fügen Sie die Adresse Ihrem Profil hinzu, damit Ihre Kontakte sie mit anderen Personen teilen können. Es wird eine Profilaktualisierung an Ihre Kontakte gesendet.</string>
<string name="all_your_contacts_will_remain_connected_update_sent">Alle Ihre Kontakte bleiben verbunden. Es wird eine Profilaktualisierung an Ihre Kontakte gesendet.</string>
<string name="create_address_and_let_people_connect">Erstellen Sie eine Adresse, damit sich Personen mit Ihnen verbinden können.</string>
@@ -1460,7 +1459,7 @@
<string name="open_database_folder">Datenbank-Ordner öffnen</string>
<string name="passphrase_will_be_saved_in_settings">Das Passwort wird in Klartext in den Einstellungen gespeichert, nachdem Sie es geändert oder die App neu gestartet haben.</string>
<string name="settings_is_storing_in_clear_text">Das Passwort wurde in Klartext in den Einstellungen gespeichert.</string>
<string name="socks_proxy_setting_limitations"><![CDATA[<b>Bitte beachten Sie</b>: Die Nachrichten- und Dateirelais sind per SOCKS Proxy verbunden. Anrufe und gesendete Link-Vorschaubilder nutzen eine direkte Verbindung.]]></string>
<string name="socks_proxy_setting_limitations"><![CDATA[<b>Bitte beachten Sie</b>: Die Nachrichten- und Datei-Relais sind per SOCKS-Proxy verbunden. Anrufe und gesendete Link-Vorschaubilder nutzen eine direkte Verbindung.]]></string>
<string name="encrypt_local_files">Lokale Dateien verschlüsseln</string>
<string name="rcv_group_event_open_chat">Öffnen</string>
<string name="v5_3_encrypt_local_files">Gespeicherte Dateien &amp; Medien verschlüsseln</string>
@@ -1529,7 +1528,7 @@
<string name="unblock_member_confirmation">Freigeben</string>
<string name="non_content_uri_alert_title">Ungültiger Datei-Pfad</string>
<string name="connect_plan_you_have_already_requested_connection_via_this_address">Sie haben über diese Adresse bereits eine Verbindung beantragt!</string>
<string name="terminal_always_visible">Die Konsole in einem neuen Fenster anzeigen</string>
<string name="terminal_always_visible">Konsole in einem neuen Fenster anzeigen</string>
<string name="block_member_desc">Von %s werden alle neuen Nachrichten ausgeblendet!</string>
<string name="blocked_item_description">Blockiert</string>
<string name="encryption_renegotiation_error">Fehler bei der Neuverhandlung der Verschlüsselung</string>
@@ -1670,7 +1669,7 @@
<string name="past_member_vName">Ehemaliges Mitglied %1$s</string>
<string name="possible_slow_function_desc">Die Ausführung dieser Funktion dauert zu lange: %1$d Sekunden: %2$s</string>
<string name="possible_slow_function_title">Langsame Funktion</string>
<string name="show_slow_api_calls">Zeige langsame API-Aufrufe an</string>
<string name="show_slow_api_calls">Langsame API-Aufrufe anzeigen</string>
<string name="group_member_status_unknown_short">unbekannt</string>
<string name="developer_options_section">Optionen für Entwickler</string>
<string name="group_member_status_unknown">unbekannter Gruppenmitglieds-Status</string>
@@ -1729,7 +1728,7 @@
<string name="migrate_to_device_downloading_details">Link-Details werden heruntergeladen</string>
<string name="migrate_to_device_downloading_archive">Archiv wird heruntergeladen</string>
<string name="migrate_to_device_apply_onion">Anwenden</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Server hochgeladen.</string>
<string name="migrate_from_device_all_data_will_be_uploaded">Alle Ihre Kontakte, Unterhaltungen und Dateien werden sicher verschlüsselt und in Daten-Paketen auf die konfigurierten XTFP-Relais hochgeladen.</string>
<string name="migrate_from_device_archive_and_upload">Archivieren und Hochladen</string>
<string name="migrate_from_device_archive_will_be_deleted"><![CDATA[<b>Warnung</b>: Das Archiv wird gelöscht.]]></string>
<string name="migrate_from_device_check_connection_and_try_again">Überprüfen Sie Ihre Internet-Verbindung und probieren Sie es nochmals</string>
@@ -1850,4 +1849,73 @@
<string name="settings_section_title_profile_images">Profil-Bilder</string>
<string name="v5_7_shape_profile_images">Form der Profil-Bilder</string>
<string name="v5_7_shape_profile_images_descr">Quadratisch, kreisförmig oder irgendetwas dazwischen.</string>
<string name="snd_error_relay">Fehler auf dem Zielserver: %1$s</string>
<string name="ci_status_other_error">Fehler: %1$s</string>
<string name="message_delivery_warning_title">Warnung bei der Nachrichtenzustellung</string>
<string name="snd_error_auth">Falscher Schlüssel oder unbekannte Verbindung - höchstwahrscheinlich ist diese Verbindung gelöscht.</string>
<string name="srv_error_version">Die Server-Version ist nicht mit den Netzwerk-Einstellungen kompatibel.</string>
<string name="snd_error_quota">Kapazität überschritten - der Empfänger hat die zuvor gesendeten Nachrichten nicht empfangen.</string>
<string name="snd_error_proxy_relay">Weiterleitungsserver: %1$s
\nFehler auf dem Zielserver: %2$s</string>
<string name="snd_error_proxy">Weiterleitungsserver: %1$s
\nFehler: %2$s</string>
<string name="snd_error_expired">Netzwerk-Fehler - die Nachricht ist nach vielen Sende-Versuchen abgelaufen.</string>
<string name="srv_error_host">Die Server-Adresse ist nicht mit den Netzwerk-Einstellungen kompatibel.</string>
<string name="network_smp_proxy_mode_always">Immer</string>
<string name="network_smp_proxy_mode_private_routing">Privates Routing</string>
<string name="network_smp_proxy_mode_never">Nie</string>
<string name="network_smp_proxy_mode_unknown">Unbekannte Relais</string>
<string name="network_smp_proxy_mode_unprotected">Ungeschützt</string>
<string name="network_smp_proxy_mode_unknown_description">Privates Routing mit unbekannten Servern nutzen.</string>
<string name="network_smp_proxy_mode_never_description">Nutzen Sie kein privates Routing.</string>
<string name="update_network_smp_proxy_mode_question">Modus für das Nachrichten-Routing</string>
<string name="network_smp_proxy_fallback_allow">Ja</string>
<string name="network_smp_proxy_fallback_prohibit">Nein</string>
<string name="network_smp_proxy_fallback_allow_protected">Wenn die IP-Adresse versteckt ist</string>
<string name="update_network_smp_proxy_fallback_question">Fallback für das Nachrichten-Routing</string>
<string name="private_routing_show_message_status">Nachrichtenstatus anzeigen</string>
<string name="network_smp_proxy_fallback_allow_downgrade">Herunterstufung erlauben</string>
<string name="network_smp_proxy_mode_always_description">Immer privates Routing nutzen.</string>
<string name="network_smp_proxy_fallback_prohibit_description">Senden Sie keine direkten Nachrichten, selbst wenn Ihr oder der Zielserver kein privates Routing unterstützt.</string>
<string name="settings_section_title_private_message_routing">PRIVATES NACHRICHTEN-ROUTING</string>
<string name="network_smp_proxy_fallback_allow_protected_description">Nachrichten direkt versenden, wenn die IP-Adresse geschützt ist und Ihr oder der Zielserver kein privates Routing unterstützt.</string>
<string name="network_smp_proxy_fallback_allow_description">Nachrichten direkt versenden, wenn Ihr oder der Zielserver kein privates Routing unterstützt.</string>
<string name="private_routing_explanation">Für die Auslieferung Ihrer Nachrichten wird privates Routing Ihrer SMP-Server genutzt, um Ihre IP-Adresse zu schützen.</string>
<string name="network_smp_proxy_mode_unprotected_description">Privates Routing mit unbekannten Servern nutzen, wenn die IP-Adresse nicht geschützt ist.</string>
<string name="protect_ip_address">IP-Adresse schützen</string>
<string name="settings_section_title_files">DATEIEN</string>
<string name="app_will_ask_to_confirm_unknown_file_servers">Die App wird bei unbekannten Datei-Servern nach einer Download-Bestätigung fragen (außer bei .onion oder wenn ein SOCKS-Proxy aktiviert ist).</string>
<string name="file_not_approved_title">Unbekannte Server!</string>
<string name="without_tor_or_vpn_ip_address_will_be_visible_to_file_servers">Ohne Tor- oder VPN-Nutzung wird Ihre IP-Adresse für Datei-Server sichtbar sein.</string>
<string name="file_not_approved_descr">Ohne Tor- oder VPN-Nutzung wird Ihre IP-Adresse für diese XFTP-Relais sichtbar sein:
\n%1$s.</string>
<string name="settings_section_title_user_theme">Profil-Design</string>
<string name="theme_black">Schwarz</string>
<string name="color_mode">Farbvariante</string>
<string name="color_mode_dark">Dunkel</string>
<string name="color_mode_light">Hell</string>
<string name="reset_single_color">Farbe zurücksetzen</string>
<string name="color_sent_quote">Gesendete Antwort</string>
<string name="color_mode_system">System</string>
<string name="chat_theme_apply_to_dark_mode">Dunkle Variante</string>
<string name="wallpaper_scale_fill">Füllen</string>
<string name="chat_theme_apply_to_light_mode">Helle Variante</string>
<string name="color_received_quote">Empfangene Antwort</string>
<string name="theme_remove_image">Bild entfernen</string>
<string name="wallpaper_scale_repeat">Wiederholen</string>
<string name="wallpaper_scale">Skalieren</string>
<string name="chat_theme_set_default_theme">Default-Design einstellen</string>
<string name="color_wallpaper_tint">Wallpaper-Akzent</string>
<string name="color_wallpaper_background">Wallpaper-Hintergrund</string>
<string name="chat_theme_apply_to_mode">Anwenden auf</string>
<string name="color_primary_variant2">Zusätzlicher Akzent 2</string>
<string name="wallpaper_advanced_settings">Erweiterte Einstellungen</string>
<string name="chat_theme_apply_to_all_modes">Alle Farbvarianten</string>
<string name="settings_section_title_chat_colors">Chat-Farben</string>
<string name="settings_section_title_chat_theme">Chat-Design</string>
<string name="wallpaper_scale_fit">Passend</string>
<string name="chat_list_always_visible">Chat-Liste in einem neuen Fenster anzeigen</string>
<string name="wallpaper_preview_hello_alice">Guten Nachmittag!</string>
<string name="wallpaper_preview_hello_bob">Guten Morgen!</string>
<string name="dark_mode_colors">Farben für die dunkle Variante</string>
</resources>
@@ -220,7 +220,7 @@
<string name="group_member_status_connected">conectado</string>
<string name="conn_level_desc_direct">directa</string>
<string name="chat_preferences_contact_allows">El contacto permite</string>
<string name="chat_preferences_default">predefinido (%s)</string>
<string name="chat_preferences_default">predeterminado (%s)</string>
<string name="full_deletion">Eliminar para todos</string>
<string name="feature_enabled">activado</string>
<string name="contacts_can_mark_messages_for_deletion">Tus contactos sólo pueden marcar los mensajes para eliminar. Tu podrás verlos.</string>
@@ -274,7 +274,7 @@
<string name="chat_is_stopped_indication">Chat está parado</string>
<string name="rcv_group_event_changed_member_role">rol de %s cambiado a %s</string>
<string name="change_role">Cambiar rol</string>
<string name="v4_5_transport_isolation_descr">Mediante perfil (por defecto) o por conexión (BETA)</string>
<string name="v4_5_transport_isolation_descr">Mediante perfil (predeterminado) o por conexión (BETA)</string>
<string name="snd_conn_event_switch_queue_phase_changing">cambiando de servidor…</string>
<string name="chat_preferences">Preferencias de Chat</string>
<string name="feature_cancelled_item">cancelado %s</string>
@@ -606,8 +606,7 @@
<string name="callstatus_rejected">llamada rechazada</string>
<string name="secret_text">secreto</string>
<string name="open_simplex_chat_to_accept_call">Abrir SimpleX Chat para aceptar llamada</string>
<string name="network_options_reset_to_defaults">Restablecer valores por defecto</string>
<string name="save_color">Guardar color</string>
<string name="network_options_reset_to_defaults">Restablecer valores predetarminados</string>
<string name="icon_descr_server_status_pending">Pendiente</string>
<string name="periodic_notifications">Notificaciones periódicas</string>
<string name="store_passphrase_securely">Guarda la contraseña de forma segura, NO podrás cambiarla si la pierdes.</string>
@@ -1162,7 +1161,7 @@
<string name="color_sent_message">Mensaje enviado</string>
<string name="stop_sharing">Dejar de compartir</string>
<string name="stop_sharing_address">¿Dejar de compartir la dirección\?</string>
<string name="theme_colors_section_title">COLORES DEL TEMA</string>
<string name="theme_colors_section_title">COLORES DEL INTERFAZ</string>
<string name="you_can_create_it_later">Puedes crearla más tarde</string>
<string name="share_address_with_contacts_question">¿Compartir la dirección con los contactos\?</string>
<string name="share_with_contacts">Compartir con contactos</string>
@@ -1510,7 +1509,7 @@
<string name="group_member_role_author">autor</string>
<string name="paste_desktop_address">Pegar dirección de ordenador</string>
<string name="connect_plan_this_is_your_link_for_group_vName"><![CDATA[¡Este es tu enlace para el grupo <b>%1$s</b>!]]></string>
<string name="verify_code_with_desktop">Verificar código con ordenador</string>
<string name="verify_code_with_desktop">Verifica el código en el ordenador</string>
<string name="scan_qr_code_from_desktop">Escanear código QR desde ordenador</string>
<string name="unblock_member_confirmation">Desbloquear</string>
<string name="multicast_discoverable_via_local_network">Detectable mediante red local</string>
@@ -1740,7 +1739,7 @@
<string name="network_type_network_wifi">WiFi</string>
<string name="network_type_ethernet">Ethernet por cable</string>
<string name="feature_roles_admins">administradores</string>
<string name="feature_enabled_for">Activar para</string>
<string name="feature_enabled_for">Activado para</string>
<string name="prohibit_sending_simplex_links">No permitir el envío de enlaces SimpleX</string>
<string name="feature_roles_all_members">todos los miembros</string>
<string name="allow_to_send_simplex_links">Permitir enviar enlaces SimpleX.</string>
@@ -1767,7 +1766,76 @@
<string name="v5_7_call_sounds_descr">Al iniciar llamadas de audio y vídeo.</string>
<string name="v5_7_quantum_resistant_encryption_descr">¡Será habilitado en los chats directos!</string>
<string name="v5_7_network_descr">Conexión de red más fiable.</string>
<string name="settings_section_title_profile_images">Imágenes del perfil</string>
<string name="settings_section_title_profile_images">Forma de los perfiles</string>
<string name="v5_7_shape_profile_images">Dar forma a las imágenes de perfil</string>
<string name="v5_7_shape_profile_images_descr">Cuadrada, circular o cualquier forma intermedia.</string>
<string name="snd_error_quota">Capacidad excedida - el destinatario no ha recibido el mensaje previo.</string>
<string name="snd_error_relay">Error del servidor de destino: %1$s</string>
<string name="ci_status_other_error">Error: %1$s</string>
<string name="snd_error_proxy_relay">Servidor de reenvío: %1$s
\nError del servidor de destino: %2$s</string>
<string name="snd_error_proxy">Servidor de reenvío: %1$s
\nError: %2$s</string>
<string name="snd_error_expired">Problema en la red - el mensaje ha expirado tras muchos intentos de envío.</string>
<string name="srv_error_version">La versión del servidor es incompatible con la configuración de red.</string>
<string name="network_smp_proxy_mode_private_routing">Enrutamiento privado</string>
<string name="network_smp_proxy_mode_unknown">Servidor de retransmisión desconocido</string>
<string name="network_smp_proxy_mode_never_description">NO usar enrutamiento privado.</string>
<string name="update_network_smp_proxy_fallback_question">Enrutamiento de mensajes alternativo</string>
<string name="update_network_smp_proxy_mode_question">Modo de enrutamiento de mensajes</string>
<string name="network_smp_proxy_fallback_prohibit">No</string>
<string name="private_routing_show_message_status">Mostrar estado del mensaje</string>
<string name="network_smp_proxy_mode_unprotected_description">Usar enrutamiento privado con servidores desconocidos cuando la dirección IP no está protegida.</string>
<string name="network_smp_proxy_fallback_allow_protected">Con IP oculta</string>
<string name="network_smp_proxy_fallback_allow">Si</string>
<string name="network_smp_proxy_fallback_allow_description">Enviar los mensajes directamente cuando tu servidor o el de destino no soporten enrutamiento privado</string>
<string name="private_routing_explanation">Para proteger tu dirección IP, el enrutamiento privado usa tu servidor SMP para enviar mensajes.</string>
<string name="network_smp_proxy_fallback_prohibit_description">NO enviar mensajes directos incluso si tu servidor o el de destino no soportan enrutamiento privado.</string>
<string name="network_smp_proxy_mode_always">Siempre</string>
<string name="network_smp_proxy_fallback_allow_downgrade">Permitir versión anterior</string>
<string name="network_smp_proxy_mode_always_description">Usar siempre enrutamiento privado.</string>
<string name="message_delivery_warning_title">Aviso de entrega de mensaje</string>
<string name="network_smp_proxy_mode_never">Nunca</string>
<string name="settings_section_title_private_message_routing">ENRUTAMIENTO PRIVADO DE MENSAJES</string>
<string name="srv_error_host">La dirección del servidor es incompatible con la configuración de la red.</string>
<string name="network_smp_proxy_mode_unprotected">Desprotegido</string>
<string name="snd_error_auth">Clave incorrecta o conexión desconocida - probablemente esta conexión fue eliminada</string>
<string name="network_smp_proxy_mode_unknown_description">Usar enrutamiento privado con servidores desconocidos.</string>
<string name="network_smp_proxy_fallback_allow_protected_description">Enviar los mensajes directamente cuando tu dirección IP está protegida y tu servidor o el de destino no soporten enrutamiento privado.</string>
<string name="file_not_approved_title">Servidores desconocidos!</string>
<string name="file_not_approved_descr">Sin Tor o VPN, tu dirección IP será visible para estos relés XFTP:
\n%1$s.</string>
<string name="protect_ip_address">Proteger dirección IP</string>
<string name="without_tor_or_vpn_ip_address_will_be_visible_to_file_servers">Sin Tor o VPN, tu dirección IP será visible para los servidores de archivos.</string>
<string name="settings_section_title_files">ARCHIVOS</string>
<string name="app_will_ask_to_confirm_unknown_file_servers">La aplicación pedirá confirmar las descargas de servidores de archivos desconocidos (excepto .onion o cuando se active SOCKS proxy).</string>
<string name="settings_section_title_chat_colors">Colores del chat</string>
<string name="settings_section_title_chat_theme">Tema del chat</string>
<string name="chat_theme_apply_to_mode">Aplicar a</string>
<string name="theme_black">Negro</string>
<string name="chat_theme_apply_to_all_modes">Todos los modos</string>
<string name="color_mode">Modo de color</string>
<string name="color_mode_dark">Oscuro</string>
<string name="chat_theme_apply_to_dark_mode">Modo oscuro</string>
<string name="dark_mode_colors">Colores en modo oscuro</string>
<string name="wallpaper_scale_fill">Relleno</string>
<string name="wallpaper_preview_hello_alice">¡Buenas tardes!</string>
<string name="wallpaper_preview_hello_bob">¡Buenos días!</string>
<string name="color_mode_light">Claro</string>
<string name="chat_theme_apply_to_light_mode">Modo claro</string>
<string name="color_received_quote">Respuesta recibida</string>
<string name="wallpaper_scale_repeat">Mosaico</string>
<string name="theme_remove_image">Quitar imagen</string>
<string name="reset_single_color">Restablecer color</string>
<string name="wallpaper_scale">Escala</string>
<string name="color_sent_quote">Respuesta enviada</string>
<string name="chat_theme_set_default_theme">Establecer tema predeterminado</string>
<string name="color_mode_system">Sistema</string>
<string name="color_wallpaper_background">Color de fondo</string>
<string name="wallpaper_scale_fit">Encaje</string>
<string name="color_primary_variant2">Color adicional 2</string>
<string name="wallpaper_advanced_settings">Configuración avanzada</string>
<string name="settings_section_title_user_theme">Tema del perfil</string>
<string name="chat_list_always_visible">Listado del chat en ventana nueva</string>
<string name="color_wallpaper_tint">Color imagen de fondo</string>
</resources>
File diff suppressed because it is too large Load Diff
@@ -873,7 +873,6 @@
<string name="v4_6_chinese_spanish_interface_descr">Kiitos käyttäjille osallistu Weblaten kautta!</string>
<string name="profile_password">Profiilin salasana</string>
<string name="reset_color">Oletusvärit</string>
<string name="save_color">Tallenna väri</string>
<string name="prohibit_sending_voice_messages">Estä ääniviestien lähettäminen.</string>
<string name="v4_4_disappearing_messages_desc">Lähetetyt viestit poistetaan asetetun ajan kuluttua.</string>
<string name="add_contact_or_create_group">Aloita uusi keskustelu</string>
@@ -783,7 +783,6 @@
<string name="theme_light">Clair</string>
<string name="theme_dark">Sombre</string>
<string name="theme">Thème</string>
<string name="save_color">Enregistrer la couleur</string>
<string name="reset_color">Réinitialisation des couleurs</string>
<string name="color_primary">Principale</string>
<string name="chat_preferences_you_allow">Vous autorisez</string>
@@ -1769,4 +1768,44 @@
<string name="v5_7_shape_profile_images_descr">Carré, circulaire, ou toute autre forme intermédiaire.</string>
<string name="v5_7_call_sounds_descr">Lors des appels audio et vidéo.</string>
<string name="v5_7_new_interface_languages">Interface utilisateur en lituanien</string>
<string name="message_delivery_warning_title">Avertissement sur la distribution des messages</string>
<string name="srv_error_host">L\'adresse du serveur est incompatible avec les paramètres du réseau.</string>
<string name="srv_error_version">La version du serveur est incompatible avec les paramètres du réseau.</string>
<string name="network_smp_proxy_mode_always_description">Toujours utiliser le routage privé.</string>
<string name="network_smp_proxy_mode_never_description">Ne pas utiliser de routage privé.</string>
<string name="network_smp_proxy_mode_unprotected_description">Utiliser le routage privé avec des serveurs inconnus lorsque l\'adresse IP n\'est pas protégée.</string>
<string name="network_smp_proxy_fallback_allow_description">Envoyez les messages de manière directe lorsque votre serveur ou le serveur de destination ne prend pas en charge le routage privé.</string>
<string name="network_smp_proxy_fallback_allow_protected_description">Envoyer les messages de manière directe lorsque l\'adresse IP est protégée et que votre serveur ou le serveur de destination ne prend pas en charge le routage privé.</string>
<string name="snd_error_expired">Problèmes de réseau - le message a expiré après plusieurs tentatives d\'envoi.</string>
<string name="snd_error_auth">Clé erronée ou connexion non identifiée - il est très probable que cette connexion soit supprimée.</string>
<string name="snd_error_proxy_relay">Serveur de transfert: %1$s
\nErreur au niveau du serveur de destination: %2$s</string>
<string name="snd_error_proxy">Serveur de transfert: %1$s
\nErreur: %2$s</string>
<string name="network_smp_proxy_mode_always">Toujours</string>
<string name="network_smp_proxy_mode_private_routing">Routage privé</string>
<string name="network_smp_proxy_fallback_allow_downgrade">Autoriser la rétrogradation</string>
<string name="update_network_smp_proxy_mode_question">Mode de routage des messages</string>
<string name="network_smp_proxy_mode_never">Jamais</string>
<string name="network_smp_proxy_mode_unknown">Relais inconnus</string>
<string name="network_smp_proxy_fallback_prohibit">Non</string>
<string name="network_smp_proxy_fallback_allow_protected">Lorsque l\'IP est masquée</string>
<string name="network_smp_proxy_fallback_allow">Oui</string>
<string name="update_network_smp_proxy_fallback_question">Rabattement du routage des messages</string>
<string name="private_routing_show_message_status">Afficher le statut du message</string>
<string name="protect_ip_address">Protection de l\'adresse IP</string>
<string name="settings_section_title_files">FICHIERS</string>
<string name="settings_section_title_private_message_routing">ROUTAGE PRIVÉ DES MESSAGES</string>
<string name="snd_error_relay">Erreur au niveau du serveur de destination: %1$s</string>
<string name="ci_status_other_error">Erreur: %1$s</string>
<string name="snd_error_quota">Capacité dépassée - le destinataire n\'a pas pu recevoir les messages envoyés précédemment.</string>
<string name="app_will_ask_to_confirm_unknown_file_servers">L\'app demandera une confirmation pour les téléchargements depuis des serveurs de fichiers inconnus (sauf .onion ou lorsque le proxy SOCKS est activé).</string>
<string name="network_smp_proxy_fallback_prohibit_description">Ne pas envoyer de messages directement, même si votre serveur ou le serveur de destination ne prend pas en charge le routage privé.</string>
<string name="private_routing_explanation">Pour protéger votre adresse IP, le routage privé utilise vos serveurs SMP pour délivrer les messages.</string>
<string name="network_smp_proxy_mode_unprotected">Non protégé</string>
<string name="file_not_approved_title">Serveurs inconnus!</string>
<string name="without_tor_or_vpn_ip_address_will_be_visible_to_file_servers">Sans Tor ou un VPN, votre adresse IP sera visible par les serveurs de fichiers.</string>
<string name="network_smp_proxy_mode_unknown_description">Utiliser le routage privé avec des serveurs inconnus.</string>
<string name="file_not_approved_descr">Sans Tor ou un VPN, votre adresse IP sera visible par ces relais XFTP:
\n%1$s.</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More