CHANGELOG.md 🔗
@@ -1,5 +1,9 @@
# Changelog
+### Version 2.16.7
+
+* Add timeout to call initiation
+
### Version 2.16.6
* Offer higher automatic file accept values
Stephen Paul Weber created
* 'master' of https://codeberg.org/iNPUTmice/Conversations: (60 commits)
Translated using Weblate (Estonian)
Translated using Weblate (Swedish)
Translated using Weblate (German)
Translated using Weblate (Chinese (Simplified Han script))
Translated using Weblate (Albanian)
Translated using Weblate (Romanian)
Translated using Weblate (Ukrainian)
Translated using Weblate (Dutch)
Translated using Weblate (Galician)
Translated using Weblate (German)
do not merge messages w/ reactions
Translated using Weblate (Romanian)
Translated using Weblate (Polish)
Translated using Weblate (Russian)
Translated using Weblate (Ukrainian)
Translated using Weblate (Russian)
Translated using Weblate (Russian)
Translated using Weblate (Chinese (Simplified Han script))
Translated using Weblate (Galician)
Translated using Weblate (Albanian)
...
CHANGELOG.md | 4
build.gradle | 21
fastlane/metadata/android/de-DE/changelogs/4211804.txt | 1
fastlane/metadata/android/en-US/changelogs/4211804.txt | 1
fastlane/metadata/android/gl-ES/changelogs/4211804.txt | 1
fastlane/metadata/android/pl-PL/changelogs/4211804.txt | 1
fastlane/metadata/android/sq/changelogs/4211704.txt | 3
fastlane/metadata/android/sq/changelogs/4211804.txt | 1
fastlane/metadata/android/sv-SE/changelogs/349.txt | 4
fastlane/metadata/android/sv-SE/changelogs/405.txt | 1
fastlane/metadata/android/sv-SE/changelogs/42015.txt | 1
fastlane/metadata/android/sv-SE/changelogs/42065.txt | 1
fastlane/metadata/android/sv-SE/changelogs/4211604.txt | 1
fastlane/metadata/android/uk/changelogs/4211804.txt | 1
fastlane/metadata/android/zh-CN/changelogs/4211704.txt | 3
fastlane/metadata/android/zh-CN/changelogs/4211804.txt | 1
src/cheogram/java/com/cheogram/android/TagEditorView.java | 2
src/conversations/fastlane/metadata/android/de-DE/full_description.txt | 2
src/conversations/fastlane/metadata/android/gl-ES/full_description.txt | 2
src/conversations/fastlane/metadata/android/nl-NL/full_description.txt | 2
src/conversations/fastlane/metadata/android/pl-PL/full_description.txt | 2
src/conversations/fastlane/metadata/android/pt-BR/full_description.txt | 39
src/conversations/fastlane/metadata/android/pt-BR/short_description.txt | 1
src/conversations/fastlane/metadata/android/ro/full_description.txt | 2
src/conversations/fastlane/metadata/android/sr/full_description.txt | 39
src/conversations/fastlane/metadata/android/sr/short_description.txt | 1
src/conversations/fastlane/metadata/android/uk/full_description.txt | 2
src/conversations/fastlane/metadata/android/zh-CN/full_description.txt | 4
src/conversations/res/values-et/strings.xml | 20
src/conversations/res/values-ru/strings.xml | 6
src/conversations/res/values-sr/strings.xml | 22
src/free/java/eu/siacs/conversations/services/EmojiInitializationService.java | 21
src/main/java/eu/siacs/conversations/Conversations.java | 2
src/main/java/eu/siacs/conversations/entities/Bookmark.java | 11
src/main/java/eu/siacs/conversations/entities/Conversation.java | 17
src/main/java/eu/siacs/conversations/entities/IndividualMessage.java | 51
src/main/java/eu/siacs/conversations/entities/Message.java | 88
src/main/java/eu/siacs/conversations/entities/MucOptions.java | 10
src/main/java/eu/siacs/conversations/entities/Reaction.java | 178
src/main/java/eu/siacs/conversations/generator/MessageGenerator.java | 18
src/main/java/eu/siacs/conversations/parser/AbstractParser.java | 3
src/main/java/eu/siacs/conversations/parser/MessageParser.java | 108
src/main/java/eu/siacs/conversations/parser/PresenceParser.java | 18
src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java | 31
src/main/java/eu/siacs/conversations/services/CallIntegration.java | 36
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 57
src/main/java/eu/siacs/conversations/ui/BindingAdapters.java | 117
src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java | 2
src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java | 7
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java | 20
src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java | 2
src/main/java/eu/siacs/conversations/ui/XmppActivity.java | 81
src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java | 6
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 36
src/main/java/eu/siacs/conversations/ui/adapter/UserAdapter.java | 4
src/main/java/eu/siacs/conversations/utils/WakeLockHelper.java | 42
src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java | 1
src/main/res/drawable/ic_add_reaction_24dp.xml | 12
src/main/res/layout/dialog_add_reaction.xml | 18
src/main/res/layout/item_emoji_button.xml | 8
src/main/res/layout/item_message_received.xml | 41
src/main/res/layout/item_message_sent.xml | 43
src/main/res/layout/item_tag.xml | 0
src/main/res/menu/message_context.xml | 5
src/main/res/values-de/strings.xml | 2
src/main/res/values-et/strings.xml | 131
src/main/res/values-gl/strings.xml | 2
src/main/res/values-nl/strings.xml | 2
src/main/res/values-pt-rBR/strings.xml | 76
src/main/res/values-ro-rRO/strings.xml | 2
src/main/res/values-ru/strings.xml | 460
src/main/res/values-sq-rAL/strings.xml | 2
src/main/res/values-sr/strings.xml | 1073
src/main/res/values-sv/strings.xml | 41
src/main/res/values-uk/strings.xml | 2
src/main/res/values-zh-rCN/strings.xml | 2
src/main/res/values/strings.xml | 2
src/quicksy/fastlane/metadata/android/et/short_description.txt | 1
src/quicksy/fastlane/metadata/android/pt-BR/full_description.txt | 13
src/quicksy/fastlane/metadata/android/pt-BR/short_description.txt | 1
src/quicksy/fastlane/metadata/android/sr/full_description.txt | 14
src/quicksy/fastlane/metadata/android/sr/short_description.txt | 1
src/quicksy/fastlane/metadata/android/sv-SE/full_description.txt | 14
src/quicksy/fastlane/metadata/android/sv-SE/short_description.txt | 1
src/quicksy/res/values-sr/strings.xml | 12
src/quicksy/res/values-sv/strings.xml | 14
86 files changed, 2,340 insertions(+), 814 deletions(-)
@@ -1,5 +1,9 @@
# Changelog
+### Version 2.16.7
+
+* Add timeout to call initiation
+
### Version 2.16.6
* Offer higher automatic file accept values
@@ -48,15 +48,14 @@ dependencies {
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation "androidx.core:core:1.10.1"
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.2'
implementation project(':libs:annotation')
annotationProcessor project(':libs:annotation-processor')
-
implementation 'androidx.viewpager:viewpager:1.0.0'
- playstoreImplementation('com.google.firebase:firebase-messaging:24.0.0') {
+ playstoreImplementation('com.google.firebase:firebase-messaging:24.0.1') {
exclude group: 'com.google.firebase', module: 'firebase-core'
exclude group: 'com.google.firebase', module: 'firebase-analytics'
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
@@ -72,11 +71,12 @@ dependencies {
implementation 'androidx.cardview:cardview:1.0.0'
implementation "androidx.preference:preference:1.2.1"
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
- implementation 'com.google.android.material:material:1.12.0'
- implementation 'androidx.work:work-runtime:2.9.0'
+ implementation 'com.google.android.material:material:1.13.0-alpha06'
+ implementation 'androidx.work:work-runtime:2.9.1'
- implementation "androidx.emoji2:emoji2:1.4.0"
- freeImplementation "androidx.emoji2:emoji2-bundled:1.4.0"
+ implementation "androidx.emoji2:emoji2:1.5.0"
+ freeImplementation "androidx.emoji2:emoji2-bundled:1.5.0"
+ implementation "androidx.emoji2:emoji2-emojipicker:1.5.0"
implementation 'org.bouncycastle:bcmail-jdk18on:1.78.1'
implementation 'com.google.zxing:core:3.5.3'
@@ -105,7 +105,7 @@ dependencies {
implementation 'com.google.guava:guava:32.1.3-android'
implementation 'io.michaelrocks:libphonenumber-android:8.13.35'
- implementation 'im.conversations.webrtc:webrtc-android:119.0.1'
+ implementation 'im.conversations.webrtc:webrtc-android:129.0.0'
implementation 'io.github.nishkarsh:android-permissions:2.1.6'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.documentfile:documentfile:1.0.1'
@@ -259,11 +259,6 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
ndk.debugSymbolLevel = 'full'
}
- debug {
- shrinkResources true
- minifyEnabled true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
}
@@ -0,0 +1 @@
+* Zeitüberschreitung beim Anrufaufbau hinzugefügt
@@ -0,0 +1 @@
+* Add timeout to call initiation
@@ -0,0 +1 @@
+* Engadido límite para iniciar unha chamada
@@ -0,0 +1 @@
+* Dodanie limitu czasu zestawiania połączenia
@@ -0,0 +1,3 @@
+* Ofro vlera më të larta pranimi automatik kartelash
+* Dhënie e më tepër hollësish te “Hollësi shërbyesi”
+* Ndreqje të metash të ndryshme
@@ -0,0 +1 @@
+* Shtim mbarimi kohe te gatitje thirrjeje
@@ -0,0 +1,4 @@
+* Introducera expert-inställning för att utföra kanal-upptäckt i den lokala servern istället för search.jabber.network
+* Aktivera leverans-kontrollmarkeringar som standard och ta bort inställning
+* Aktivera 'Skicka-knappen inidikerar status' som standard och ta bort inställning
+* Flytta inställningar för Säkerhetskopiering och Bakgrundstjänst till huvud-skärmen
@@ -0,0 +1 @@
+* Quicksy: Ta automatiskt emot bekräftelse-SMS
@@ -0,0 +1 @@
+* mindre A/V-förbättringar
@@ -0,0 +1 @@
+* Introducera nytt fil-format för säkerhetskopiering
@@ -0,0 +1 @@
+* Mindre buggfixar
@@ -0,0 +1 @@
+* Додано таймаут для ініціювання виклику
@@ -0,0 +1,3 @@
+* 提供更大的自动下载文件的大小
+* 在“服务器信息”中提供更多信息
+* 各种错误修复
@@ -0,0 +1 @@
+* 添加超时到通话发起
@@ -37,7 +37,7 @@ public class TagEditorView extends TokenCompleteTextView<ListItem.Tag> {
@Override
protected View getViewForObject(ListItem.Tag tag) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
- final TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, (ViewGroup) getParent(), false);
+ final TextView tv = (TextView) inflater.inflate(R.layout.item_tag, (ViewGroup) getParent(), false);
tv.setText(tag.getName());
tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(getContext(),XEP0392Helper.rgbFromNick(tag.getName()))));
return tv;
@@ -28,7 +28,7 @@ Conversations funktioniert mit jedem XMPP-Server. XMPP ist jedoch ein erweiterba
Diese XEPs sind es derzeit:
-* XEP-0065: SOCKS5 Bytestreams (oder mod_proxy65). Wird für die Übertragung von Dateien verwendet, wenn sich beide Parteien hinter einer Firewall (NAT) befinden.
+* XEP-0065: SOCKS5 Bytestreams (oder mod_proxy65). Wird für die Übertragung von Dateien verwendet, wenn sich beide Parteien hinter einer Firewall oder NAT befinden.
* XEP-0163: Personal Eventing Protocol für Profilbilder
* XEP-0191: Mit dem Blockierungsbefehl kannst du Spammer auf eine schwarze Liste setzen oder Kontakte blockieren, ohne sie aus deiner Liste zu entfernen.
* XEP-0198: Stream Management ermöglicht es XMPP, kleinere Netzwerkausfälle und Änderungen der zugrunde liegenden TCP-Verbindung zu überstehen.
@@ -29,7 +29,7 @@ Conversations da soporte a un par delas que axudan a mellorar a experiencia de u
Estes XEPs son - neste intre:
-* XEP-0065: SOCKS5 Bytestreams (ou mod_proxy65). Usado para a transferencia de ficheiros se as dúas partes están detrás dun cortalumes (NAT).
+* XEP-0065: SOCKS5 Bytestreams (ou mod_proxy65). Usado para a transferencia de ficheiros se as dúas partes están detrás dun cortalumes ou NAT.
* XEP-0163: Personal Eventing Protocol para os avatares
* XEP-0191: O bloqueo de ordes permiteche bloquear spammer ou contactos sen eliminalos das túas listaxes.
* XEP-0198: Stream Management permite que XMPP sobreviva a caídas da rede e cambios na conexión TCP.
@@ -28,7 +28,7 @@ Conversations werkt met elke bestaande XMPP-server. XMPP is echter een uitbreidb
Deze XEP's zijn - vanaf nu:
-* XEP-0065: SOCKS5 Bytestreams (or mod_proxy65). Wordt gebruikt om bestanden over te dragen als beide partijen achter een firewall zitten (NAT).
+* XEP-0065: SOCKS5 Bytestreams (or mod_proxy65). Wordt gebruikt om bestanden over te dragen als beide partijen achter een firewall of NAT zitten.
* XEP-0163: Personal Eventing Protocol for avatars
* XEP-0191: Blocking command laat je spammers op de zwarte lijst zetten of contacten blokkeren zonder ze uit je selectie te verwijderen.
* XEP-0198: Stream Management stelt XMPP in staat om kleine netwerkuitval en veranderingen van de onderliggende TCP-verbinding te overleven.
@@ -28,7 +28,7 @@ Conversations działa z każdym dostępnym serwerem XMPP, jednak XMPP to rozsze
Obecnie są obsługiwane następujące rozszerzenia:
-* XEP-0065: SOCKS5 Bytestreams (lub mod_proxy65). Będzie używany do przesyłania plików jeżeli obie strony znajdują się za zaporą (NAT);
+* XEP-0065: SOCKS5 Bytestreams (lub mod_proxy65). Będzie używany do przesyłania plików jeżeli obie strony znajdują się za zaporą lub NAT;
* XEP-0163: Personal Eventing Protocol dla awatarów;
* XEP-0191: Blocking Command umożliwia ochronę przed spamerami lub blokowanie bez usuwanie ich z rostera;
* XEP-0198: Stream Management pozwala na przetrwanie krótkich braków połączenia z siecią oraz zmian używanego połączenia TCP;
@@ -0,0 +1,39 @@
+Fácil de usar, estável, e bem otimizado. Com suporte à imagens, conversas em grupo, e criptografia de ponta-a-ponta.
+
+Base do design:
+
+* Ser o mais bonito e fácil de usar possível sem sacrificar privacidade ou segurança
+* Depender de protocolos existentes e bem estabelecidos
+* Não precisar de uma conta Google ou especificamente do Google Cloud Messaging (GCM)
+* Usar o mínimo de permissões possíveis
+
+Recursos:
+
+* Criptografia de ponta-a-ponta com <a href="http://conversations.im/omemo/">OMEMO</a> ou <a href="http://openpgp.org/about/">OpenPGP</a>.
+* Envio e recebimento de imagens
+* Chamadas de áudio e vídeo criptografadas (DTLS-SRTP)
+* UI intuitiva que segue as regras do Android Design
+* Imagens / Avatares para seus Contatos
+* Sincroniza com o cliente desktop
+* Conferências (com suporte a favoritos)
+* Integração com livro de endereços
+* Múltiplas contas / caixa de entrada unificada
+* Baixo uso da bateria
+
+O Conversations faz com que seja fácil criar uma conta no servidor conversations.im. Mesmo assim, o Conversations funcionará com qualquer outro servidor XMPP. Muitos servidores XMPP são mantidos por voluntários e são gratuitos.
+
+Recursos XMPP:
+
+O Conversations funciona com qualquer servidor XMPP por aí. Porém, o XMPP é um protocolo extensível. Estas extensões são padronizadas, nos chamados XEPs. O Conversations suporta alguns desses para tornar a experiência do usuário melhor. Existe uma chance que seu servidor XMPP atual não suporta estas extensões. Por causa disso, para tirar melhor proveito do Conversations, você pode considerar alterar para um servidor XMPP que as suporta - ou melhor ainda - manter seu próprio servidor XMPP para você e seus amigos.
+
+Estas XEPs são - atualmente:
+
+* XEP-0065: Bytestreams SOCKS5 (ou mod_proxy65). Será usado para transferir arquivos caso ambas partes estão atrás de um firewall ou NAT.
+* XEP-0163: Protocolo de Eventos Pessoais para avatares
+* XEP-0191: O comando de bloquear permite que bloqueie spam ou contatos sem removê-los de sua lista.
+* XEP-0198: Gerenciamento de Streams permite que o XMPP sobreviva a pequenas interrupções ou mudanças na conexão TCP.
+* XEP-0280: Carbonos de Mensagem que automaticamente sincroniza as mensagens que envia no computador e permite que você troque de cliente facilmente do seu celular para seu computador e ao contrário em uma conversa.
+* XEP-0237: Controle de Versões da Lista principalmente para economizar banda larga em conexões móveis ruins
+* XEP-0313: Gerenciamento do Histórico de Mensagens para sincronizar o histórico de mensagens com o servidor. Recupere mensagens enviadas enquanto o Conversations estava off-line.
+* XEP-0352: Indicação do Estado do Cliente permite que o servidor saiba quando o Conversations está ou não em segundo plano. Permite que o servidor economize banda larga.
+* XEP-0363: Envio de Arquivos HTTP permite que compartilhe arquivos em conferências e com contatos off-line. Requer um componente adicional em seu servidor.
@@ -0,0 +1 @@
+Mensageiro XMPP criptografado, fácil de usar, para o seu dispositivo móvel
@@ -27,7 +27,7 @@ Caracteristici XMPP:
Conversations funcționează cu orice server XMPP existent. Cu toate acestea, XMPP este un protocol extensibil. Aceste extensii sunt, de asemenea, standardizate în așa-numitele XEP-uri. Conversations suportă câteva dintre acestea pentru a îmbunătăți experiența generală a utilizatorului. Există o șansă ca serverul XMPP actual să nu suporte aceste extensii. Prin urmare, pentru a profita la maximum de Conversations, ar trebui să luați în considerare fie trecerea la un server XMPP care să suporte aceste extensii, fie - și mai bine - să rulați propriul server XMPP pentru dumneavoastră și prietenii dumneavoastră.
Aceste XEP-uri sunt - deocamdată:
-* XEP-0065: SOCKS5 Bytestreams (sau mod_proxy65). Va fi utilizat pentru a transfera fișiere dacă ambele părți se află în spatele unui firewall (NAT).
+* XEP-0065: SOCKS5 Bytestreams (sau mod_proxy65). Va fi utilizat pentru a transfera fișiere dacă ambele părți se află în spatele unui firewall sau NAT.
* XEP-0163: Protocol de evenimente personale pentru avatare.
* XEP-0191: Comanda de blocare vă permite să puneți pe lista neagră spamerii sau să blocați contactele fără a le elimina din listă.
* XEP-0198: Stream Management permite XMPP să supraviețuiască unor mici întreruperi de rețea și schimbărilor conexiunii TCP de bază.
@@ -0,0 +1,39 @@
+Лагана за коришћење, поуздана, са малом потрошњом батерије. Има уграђену подршку за слике, групне преписке и e2e шифровање.
+
+Приципи дизајна:
+
+* Леп изглед и једноставност коришћења, без компромитовања безбедности и приватности
+* Ослања се на постојеће, добро установљене протоколе
+* Не захтева Google налог нити конкретно Google Cloud Messaging (GCM)
+* Захтева минималан број дозвола
+
+Способности:
+
+* E2E шифровање уз <a href="http://conversations.im/omemo/">OMEMO</a> или <a href="http://openpgp.org/about/">OpenPGP</a>
+* Слање и примање слика
+* Шифровани аудио и видео позиви (DTLS-SRTP)
+* Интуитивно корисничко сучеље које прати смернице Android дизајна
+* Слике / аватари за твоје контакте
+* Синхронизација са десктоп клијентима
+* Конференције (уз подршку за обележивачe)
+* Интеграција са имеником
+* Више истовремених налога / обједињени inbox
+* Веома мали утицај на потрошњу батерије
+
+Conversations омогућава веома лако отварање налога на бесплатном серверу conversations.im. Поред тога, Conversations може да ради и уз било који други XMPP сервер. Многе XMPP сервере одржавају добровољци и бесплатни су за коришћење.
+
+XMPP способности:
+
+Conversations ради уз сваки XMPP сервер. Међутим XMPP је проширив протокол. Ова проширења су такође стандардизована у такозваним XEP-овима. Conversations има подршку за неколико тих проширења ради побољшања свеопштег корисничког искуства. Постоји шанса да твој тренутни XMPP сервер не подржава ова проширења. Да би максимално искористио/ла Conversations требало би да размислиш или о преласку на XMPP сервер који подржава ова проширења или - још боље - да успоставиш сопствени XMPP сервер за тебе и твоје пријатеље.
+
+Ови XEP-ови су - за сада:
+
+* XEP-0065: SOCKS5 Bytestreams (или mod_proxy65). Користи се за пребацивање фајлова ако су обе стране иза firewall-а (NAT).
+* XEP-0163: Personal Eventing Protocol за аватаре
+* XEP-0191: Blocking command омогућава blacklist-овање спамера или блокирање контаката без њиховог уклањања из твог списка.
+* XEP-0198: Stream Management омогућава да XMPP преживи мање прекиде на мрежи и промене у TCP веза.
+* XEP-0280: Message Carbons који аутоматски синхронизује поруке које шаљеш на свој десктоп клијент и са тим ти омогућава да се лако пребациш са мобилног клијента на десктоп клијент и обратно у оквиру исте преписке.
+* XEP-0237: Roster Versioning углавном за уштеду количине пренетих података на непоузданим мобилним везама
+* XEP-0313: Message Archive Management синхронизује историју порука са сервером. Усаглашава поруке које су послате док Conversations није био на вези.
+* XEP-0352: Client State Indication обавештава сервер да ли је Conversations у позадини или не. Омогућава серверу да уштеди количину пренетих података спречавањем слања непотребних пакета.
+* XEP-0363: HTTP File Upload омогућава дељење фајлова у конференцијама и са контактима који нису на вези. Захтева додатну компоненту на твом серверу.
@@ -0,0 +1 @@
+Шифрована и лагана XMPP апликација за инстант поруке за твој мобилни телефон
@@ -28,7 +28,7 @@ Conversations працює з будь-яким сервером XMPP. Прот
На даний час підтримуються такі XEP:
-* XEP-0065: SOCKS5 Bytestreams (або mod_proxy65). Використовується для передачі файлів, якщо обидві сторони знаходяться за брандмауером (NAT).
+* XEP-0065: SOCKS5 Bytestreams (або mod_proxy65). Використовується для передачі файлів, якщо обидві сторони знаходяться за брандмауером або NAT.
* XEP-0163: персональний протокол подій для аватарів
* XEP-0191: команда блокування дозволяє Вам заносити спамерів у чорний список або блокувати контакти, не видаляючи їх зі свого списку.
* XEP-0198: керування потоками дозволяє XMPP витримувати невеликі перебої в мережі та зміни основного TCP-з'єднання.
@@ -20,7 +20,7 @@
* 多账号/统一消息栏
* 对电池寿命的影响非常小
-Conversations 使在免费的 conversations.im 服务器上创建账号变得非常简单。不过,Conversations 也适用于任何其他 XMPP 服务器。许多 XMPP 服务器都是由志愿者免费运行的。
+您可以很容易地使用 Conversations 在免费的 conversations.im 服务器上创建账号。不过,Conversations 也适用于任何其他 XMPP 服务器。许多 XMPP 服务器由志愿者免费运行。
XMPP 功能:
@@ -28,7 +28,7 @@ Conversations 适用于所有 XMPP 服务器。然而,XMPP 是一种可扩展
到目前为止,这些 XMPP 扩展协议是:
-* XEP-0065:SOCKS5 字节流(或 mod_proxy65)。如果双方都在防火墙(NAT)后面,将用于传输文件。
+* XEP-0065:SOCKS5 字节流(或 mod_proxy65)。如果双方都在防火墙或 NAT 后面,将用于传输文件。
* XEP-0163:个人事件协议(头像)
* XEP-0191:屏蔽命令可让您将垃圾消息发送者列入黑名单或屏蔽的联系人中,而不会将其从花名册中删除。
* XEP-0198:流管理允许 XMPP 在小规模网络中断和底层 TCP 连接发生变化时继续运行。
@@ -1,2 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
-<resources></resources>
+<resources>
+ <string name="pick_a_server">Vali oma XMPP-teenusepakkuja</string>
+ <string name="create_new_account">Loo uus kasutajakonto</string>
+ <string name="do_you_have_an_account">Kas sul juba on XMPP-konto olemas? Kui sa oled varem kasutanud Conversationsit või mõnda muud XMPP-klienti, siis see tõesti võib nii olla. Kui aga mitte, siis võid XMPP-konto kohe luua.
+\nVihje: Ka mitmed e-postiteenuse pakkujad pakuvad ka XMPP-teenuseid.</string>
+ <string name="server_select_text">XMPP on teenusepakkujast sõltumatu sõnumivõrk. Sa võid kasutada seda rakendust ükspuha missuguse XMPP-serveriga.
+\nAga mugavuse nimel oleme teinud lihtsaks kasutajakonto loomise conversations.im serverisse, mis on Conversationsiga hästi sobituv teenusepakkuja.</string>
+ <string name="magic_create_text_on_x">Sa oled saanud kutse kasutama serverit %1$s. Järgnevaga aitame sind kasutajakonto loomise kõikides sammudes.
+\nKui valid serveriks %1$s, siis jagades oma XMPP-aadressi saad suhelda kõikide teiste XMPP kasutajatega.</string>
+ <string name="magic_create_text_fixed">Sa oled saanud kutse kasutama serverit %1$s. Kasutajanimi on juba sulle valitud. Järgnevaga aitame sind kasutajakonto loomise kõikides sammudes.
+\nJagades oma XMPP-aadressi saad suhelda kõikide teiste XMPP kasutajatega kõikides teistes serverites.</string>
+ <string name="use_conversations.im">Kasuta conversations.im teenust</string>
+ <string name="your_server_invitation">Sinu kutse serveri kasutajaks</string>
+ <string name="improperly_formatted_provisioning">Vigaselt vormindatud eeltäidetud kutse kood</string>
+ <string name="tap_share_button_send_invite">Klõpsi „Jaga“ nuppu ja saada oma kontaktile kutse kasutamaks serverit %1$s.</string>
+ <string name="if_contact_is_nearby_use_qr">Kui teine osapool on lähedal, siis ta saab kutse vastuvõtmiseks skaneerida järgnevat koodi.</string>
+ <string name="easy_invite_share_text">Liitu serveriga %1$s ja vestle minuga: %2$s</string>
+ <string name="share_invite_with">Jaga kutset…</string>
+</resources>
@@ -3,8 +3,8 @@
<string name="pick_a_server">Выберите своего XMPP-провайдера</string>
<string name="use_conversations.im">Использовать conversations.im</string>
<string name="create_new_account">Создать новый аккаунт</string>
- <string name="do_you_have_an_account">У вас есть аккаунт XMPP\? Если вы использовали Conversations или другой XMPP-клиент в прошлом, то скорее всего, он у вас есть. Если у вас нет аккаунта, вы можете создать его прямо сейчас.
-\nПодсказка: Некоторые провайдеры электронной почты также регистрируют аккаунты XMPP.</string>
+ <string name="do_you_have_an_account">У вас есть аккаунт XMPP? Если вы использовали Conversations или другой XMPP-клиент в прошлом, то скорее всего, он у вас есть. Если у вас нет аккаунта, вы можете создать его прямо сейчас.
+\nПодсказка: некоторые провайдеры электронной почты также регистрируют аккаунты XMPP.</string>
<string name="server_select_text">XMPP - это независимая сеть обмена сообщениями. Это приложение позволяет подключиться к любому XMPP-серверу на ваш выбор.
\nЕсли у вас нет сервера, предлагаем вам зарегистрировать аккаунт на conversations.im, сервере, специально предназначенном для работы с Conversations.</string>
<string name="magic_create_text_on_x">Вас пригласили на %1$s. Мы проведём вас через процесс создания аккаунта.
@@ -14,7 +14,7 @@
<string name="your_server_invitation">Ваше приглашение</string>
<string name="improperly_formatted_provisioning">Неправильный формат кода</string>
<string name="tap_share_button_send_invite">Нажмите кнопку «Поделиться», чтобы отправить вашему контакту приглашение в %1$s.</string>
- <string name="if_contact_is_nearby_use_qr">Если ваш контакт находится поблизости, он также может отсканировать приведенный ниже код, чтобы принять ваше приглашение.</string>
+ <string name="if_contact_is_nearby_use_qr">Если ваш контакт находится поблизости, он также может отсканировать приведённый ниже код, чтобы принять ваше приглашение.</string>
<string name="easy_invite_share_text">Присоединяйтесь к %1$s и пообщайтесь со мной: %2$s</string>
<string name="share_invite_with">Поделиться приглашением с…</string>
</resources>
@@ -1,10 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="pick_a_server">Одаберите вашег ИксМПП провајдера</string>
- <string name="use_conversations.im">Користи conversations.im</string>
+ <string name="pick_a_server">Одабери свог XMPP провајдера</string>
+ <string name="use_conversations.im">Одабери conversations.im</string>
<string name="create_new_account">Направи нови налог</string>
- <string name="do_you_have_an_account">Да ли већ имате ИксМПП налог? Извесно је да га имате ако користите неки ИксМПП клијент или сте раније користили Конверзацију. Ако немате, сада можете направити нови ИксМПП налог.\nСавет: неки поштански провајдери такође омогућавају и ИксМПП налоге.</string>
- <string name="server_select_text">ИксМПП је мрежа брзих порука, независна од провајдера. Овај клијент можете користити уз било који сервер по вашем избору.
-\nДа бисмо вам олакшали, омогућили смо креирање налога на conversations.im; провајдеру специјално прилаг.ођеном за коришћење уз Конверзацију</string>
- <string name="your_server_invitation">Ваша серверска позивница</string>
+ <string name="do_you_have_an_account">Да ли већ имаш XMPP налог? Могуће је да имаш ако већ користиш неки други XMPP клијент или ако си раније користио/ла Conversations. Ако немаш, можеш сада да направиш нови XMPP налог.
+\nУспут: поједини имејл провајдери пружају и XMPP налоге.</string>
+ <string name="server_select_text">XMPP је мрежа за инстант поруке, независна од провајдера. Ову апликацију можеш да користиш уз било који XMPP сервер по свом избору.
+\nРади погодности, омогућили смо лако креирање налога на conversations.im - провајдер посебно прилагођен за коришћење уз Conversations.</string>
+ <string name="your_server_invitation">Твоја позивница на сервер</string>
+ <string name="magic_create_text_on_x">Позван/а си на %1$s. Спровешћемо те кроз поступак прављења налога.
+\nАко одабереш %1$s као провајдера можеш да комуницираш са корисницима других провајдера тако што им проследиш своју пуну XMPP адресу.</string>
+ <string name="improperly_formatted_provisioning">Неисправно форматиран провизиони кôд</string>
+ <string name="tap_share_button_send_invite">Притисни дугме за дељење како би свом контакту послао/ла позивницу на %1$s.</string>
+ <string name="if_contact_is_nearby_use_qr">Ако је твој контакт у близини, може да скенира кôд у наставку како би прихватио твоју позивницу.</string>
+ <string name="easy_invite_share_text">Пријави се на %1$s и разговарај са мном: %2$s</string>
+ <string name="share_invite_with">Подели позивницу са…</string>
+ <string name="magic_create_text_fixed">Позван/а си на %1$s. Корисничко име је већ одабрано за тебе. Спровешћемо те кроз поступак прављења налога.
+\nМожеш да комуницираш са корисницима других провајдера тако што им проследиш своју пуну XMPP адресу.</string>
</resources>
@@ -1,14 +1,31 @@
package eu.siacs.conversations.services;
import android.content.Context;
+import android.util.Log;
+import androidx.annotation.Nullable;
import androidx.emoji2.bundled.BundledEmojiCompatConfig;
import androidx.emoji2.text.EmojiCompat;
+import eu.siacs.conversations.Config;
+
public class EmojiInitializationService {
public static void execute(final Context context) {
- EmojiCompat.init(new BundledEmojiCompatConfig(context).setReplaceAll(true));
- }
+ EmojiCompat.init(new BundledEmojiCompatConfig(context).setReplaceAll(true))
+ .registerInitCallback(
+ new EmojiCompat.InitCallback() {
+ @Override
+ public void onInitialized() {
+ Log.d(Config.LOGTAG, "initialized EmojiCompat");
+ super.onInitialized();
+ }
+ @Override
+ public void onFailed(@Nullable Throwable throwable) {
+ Log.e(Config.LOGTAG, "failed to initialize EmojiCompat", throwable);
+ super.onFailed(throwable);
+ }
+ });
+ }
}
@@ -11,6 +11,7 @@ import androidx.appcompat.app.AppCompatDelegate;
import com.google.android.material.color.DynamicColors;
import com.google.android.material.color.DynamicColorsOptions;
+import eu.siacs.conversations.services.EmojiInitializationService;
import eu.siacs.conversations.utils.ExceptionHelper;
import eu.siacs.conversations.utils.ThemeHelper;
@@ -27,6 +28,7 @@ public class Conversations extends Application {
public void onCreate() {
super.onCreate();
CONTEXT = this.getApplicationContext();
+ EmojiInitializationService.execute(getApplicationContext());
ExceptionHelper.init(getApplicationContext());
applyThemeSettings();
}
@@ -61,11 +61,11 @@ public class Bookmark extends Element implements ListItem {
return bookmarks;
}
- public static Map<Jid, Bookmark> parseFromPubsub(Element pubsub, Account account) {
- if (pubsub == null) {
+ public static Map<Jid, Bookmark> parseFromPubSub(final Element pubSub, final Account account) {
+ if (pubSub == null) {
return Collections.emptyMap();
}
- final Element items = pubsub.findChild("items");
+ final Element items = pubSub.findChild("items");
if (items != null && Namespace.BOOKMARKS2.equals(items.getAttribute("node"))) {
final Map<Jid, Bookmark> bookmarks = new HashMap<>();
for(Element item : items.getChildren()) {
@@ -99,6 +99,7 @@ public class Bookmark extends Element implements ListItem {
}
final Bookmark bookmark = new Bookmark(account);
bookmark.jid = InvalidJid.getNullForInvalid(item.getAttributeAsJid("id"));
+ // TODO verify that we only use bare jids and ignore full jids
if (bookmark.jid == null) {
return null;
}
@@ -128,14 +129,14 @@ public class Bookmark extends Element implements ListItem {
}
public void setGroups(List<String> groups) {
- final List<Element> children = new ArrayList<>(getChildren());
+ final List<Element> children = ImmutableList.copyOf(getChildren());
for (final Element el : children) {
if (el.getName().equals("group")) {
removeChild(el);
}
}
- final List<Element> extChildren = new ArrayList<>(extensions.getChildren());
+ final List<Element> extChildren = ImmutableList.copyOf(extensions.getChildren());
for (final Element el : extChildren) {
if (el.getName().equals("group")) {
extensions.removeChild(el);
@@ -519,6 +519,17 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return null;
}
+ public Message findMessageWithUuidOrRemoteId(final String id) {
+ synchronized (this.messages) {
+ for (final Message message : this.messages) {
+ if (id.equals(message.getUuid()) || id.equals(message.getRemoteMsgId())) {
+ return message;
+ }
+ }
+ }
+ return null;
+ }
+
public Message findMessageWithRemoteIdAndCounterpart(String id, Jid counterpart) {
synchronized (this.messages) {
for (int i = this.messages.size() - 1; i >= 0; --i) {
@@ -602,7 +613,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
if (reactor != null && message.getCounterpart() == null) continue;
if (reactor != null && !(message.getCounterpart().equals(reactor) || message.getCounterpart().asBareJid().equals(reactor))) continue;
- final Element r = message.getReactions();
+ final Element r = message.getReactionsEl();
if (r != null && r.getAttribute("id") != null && id.equals(r.getAttribute("id"))) {
return message;
}
@@ -628,7 +639,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
public Set<String> findReactionsTo(String id, Jid reactor) {
Set<String> reactionEmoji = new HashSet<>();
Message reactM = findMessageReactingTo(id, reactor);
- Element reactions = reactM == null ? null : reactM.getReactions();
+ Element reactions = reactM == null ? null : reactM.getReactionsEl();
if (reactions != null) {
for (Element el : reactions.getChildren()) {
if (el.getName().equals("reaction") && el.getNamespace().equals("urn:xmpp:reactions:0")) {
@@ -696,7 +707,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
} else if (getLockThread() && mthread != null) {
Element reply = m.getReply();
if (reply != null && reply.getAttribute("id") != null) extraIds.add(reply.getAttribute("id"));
- Element reactions = m.getReactions();
+ Element reactions = m.getReactionsEl();
if (reactions != null && reactions.getAttribute("id") != null) extraIds.add(reactions.getAttribute("id"));
}
}
@@ -31,6 +31,7 @@ package eu.siacs.conversations.entities;
import android.database.Cursor;
+import java.util.Collection;
import java.util.Set;
import eu.siacs.conversations.ui.adapter.MessageAdapter;
@@ -43,8 +44,8 @@ public class IndividualMessage extends Message {
super(conversation);
}
- private IndividualMessage(Conversational conversation, String uuid, String conversationUUid, Jid counterpart, Jid trueCounterpart, String body, long timeSent, int encryption, int status, int type, boolean carbon, String remoteMsgId, String relativeFilePath, String serverMsgId, String fingerprint, boolean read, String edited, boolean oob, String errorMessage, Set<ReadByMarker> readByMarkers, boolean markable, boolean deleted, String bodyLanguage) {
- super(conversation, uuid, conversationUUid, counterpart, trueCounterpart, body, timeSent, encryption, status, type, carbon, remoteMsgId, relativeFilePath, serverMsgId, fingerprint, read, edited, oob, errorMessage, readByMarkers, markable, deleted, bodyLanguage, timeSent, null, null, null);
+ private IndividualMessage(Conversational conversation, String uuid, String conversationUUid, Jid counterpart, Jid trueCounterpart, String body, long timeSent, int encryption, int status, int type, boolean carbon, String remoteMsgId, String relativeFilePath, String serverMsgId, String fingerprint, boolean read, String edited, boolean oob, String errorMessage, Set<ReadByMarker> readByMarkers, boolean markable, boolean deleted, String bodyLanguage, String occupantId, Collection<Reaction> reactions) {
+ super(conversation, uuid, conversationUUid, counterpart, trueCounterpart, body, timeSent, encryption, status, type, carbon, remoteMsgId, relativeFilePath, serverMsgId, fingerprint, read, edited, oob, errorMessage, readByMarkers, markable, deleted, bodyLanguage, occupantId, reactions, timeSent, null, null, null);
}
@Override
@@ -73,7 +74,7 @@ public class IndividualMessage extends Message {
public static Message fromCursor(Cursor cursor, Conversational conversation) {
Jid jid;
try {
- String value = cursor.getString(cursor.getColumnIndex(COUNTERPART));
+ String value = cursor.getString(cursor.getColumnIndexOrThrow(COUNTERPART));
if (value != null) {
jid = Jid.of(value);
} else {
@@ -86,7 +87,7 @@ public class IndividualMessage extends Message {
}
Jid trueCounterpart;
try {
- String value = cursor.getString(cursor.getColumnIndex(TRUE_COUNTERPART));
+ String value = cursor.getString(cursor.getColumnIndexOrThrow(TRUE_COUNTERPART));
if (value != null) {
trueCounterpart = Jid.of(value);
} else {
@@ -96,28 +97,30 @@ public class IndividualMessage extends Message {
trueCounterpart = null;
}
return new IndividualMessage(conversation,
- cursor.getString(cursor.getColumnIndex(UUID)),
- cursor.getString(cursor.getColumnIndex(CONVERSATION)),
+ cursor.getString(cursor.getColumnIndexOrThrow(UUID)),
+ cursor.getString(cursor.getColumnIndexOrThrow(CONVERSATION)),
jid,
trueCounterpart,
- cursor.getString(cursor.getColumnIndex(BODY)),
- cursor.getLong(cursor.getColumnIndex(TIME_SENT)),
- cursor.getInt(cursor.getColumnIndex(ENCRYPTION)),
- cursor.getInt(cursor.getColumnIndex(STATUS)),
- cursor.getInt(cursor.getColumnIndex(TYPE)),
- cursor.getInt(cursor.getColumnIndex(CARBON)) > 0,
- cursor.getString(cursor.getColumnIndex(REMOTE_MSG_ID)),
- cursor.getString(cursor.getColumnIndex(RELATIVE_FILE_PATH)),
- cursor.getString(cursor.getColumnIndex(SERVER_MSG_ID)),
- cursor.getString(cursor.getColumnIndex(FINGERPRINT)),
- cursor.getInt(cursor.getColumnIndex(READ)) > 0,
- cursor.getString(cursor.getColumnIndex(EDITED)),
- cursor.getInt(cursor.getColumnIndex(OOB)) > 0,
- cursor.getString(cursor.getColumnIndex(ERROR_MESSAGE)),
- ReadByMarker.fromJsonString(cursor.getString(cursor.getColumnIndex(READ_BY_MARKERS))),
- cursor.getInt(cursor.getColumnIndex(MARKABLE)) > 0,
- cursor.getInt(cursor.getColumnIndex(DELETED)) > 0,
- cursor.getString(cursor.getColumnIndex(BODY_LANGUAGE))
+ cursor.getString(cursor.getColumnIndexOrThrow(BODY)),
+ cursor.getLong(cursor.getColumnIndexOrThrow(TIME_SENT)),
+ cursor.getInt(cursor.getColumnIndexOrThrow(ENCRYPTION)),
+ cursor.getInt(cursor.getColumnIndexOrThrow(STATUS)),
+ cursor.getInt(cursor.getColumnIndexOrThrow(TYPE)),
+ cursor.getInt(cursor.getColumnIndexOrThrow(CARBON)) > 0,
+ cursor.getString(cursor.getColumnIndexOrThrow(REMOTE_MSG_ID)),
+ cursor.getString(cursor.getColumnIndexOrThrow(RELATIVE_FILE_PATH)),
+ cursor.getString(cursor.getColumnIndexOrThrow(SERVER_MSG_ID)),
+ cursor.getString(cursor.getColumnIndexOrThrow(FINGERPRINT)),
+ cursor.getInt(cursor.getColumnIndexOrThrow(READ)) > 0,
+ cursor.getString(cursor.getColumnIndexOrThrow(EDITED)),
+ cursor.getInt(cursor.getColumnIndexOrThrow(OOB)) > 0,
+ cursor.getString(cursor.getColumnIndexOrThrow(ERROR_MESSAGE)),
+ ReadByMarker.fromJsonString(cursor.getString(cursor.getColumnIndexOrThrow(READ_BY_MARKERS))),
+ cursor.getInt(cursor.getColumnIndexOrThrow(MARKABLE)) > 0,
+ cursor.getInt(cursor.getColumnIndexOrThrow(DELETED)) > 0,
+ cursor.getString(cursor.getColumnIndexOrThrow(BODY_LANGUAGE)),
+ cursor.getString(cursor.getColumnIndexOrThrow(OCCUPANT_ID)),
+ Reaction.fromString(cursor.getString(cursor.getColumnIndexOrThrow(REACTIONS)))
);
}
}
@@ -28,20 +28,22 @@ import com.google.common.primitives.Longs;
import org.json.JSONException;
-import java.lang.ref.WeakReference;
import java.io.IOException;
+import java.lang.ref.WeakReference;
import java.net.URI;
import java.net.URISyntaxException;
-import java.time.Duration;
import java.security.NoSuchAlgorithmException;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
-import java.util.stream.Collectors;
import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.stream.Collectors;
import io.ipfs.cid.Cid;
@@ -119,6 +121,8 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
public static final String READ_BY_MARKERS = "readByMarkers";
public static final String MARKABLE = "markable";
public static final String DELETED = "deleted";
+ public static final String OCCUPANT_ID = "occupantId";
+ public static final String REACTIONS = "reactions";
public static final String ME_COMMAND = "/me ";
public static final String ERROR_MESSAGE_CANCELLED = "eu.siacs.conversations.cancelled";
@@ -156,6 +160,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
private String errorMessage = null;
private Set<ReadByMarker> readByMarkers = new CopyOnWriteArraySet<>();
protected Message mInReplyTo = null;
+ private Collection<Reaction> reactions = Collections.emptyList();
private Boolean isGeoUri = null;
private Boolean isEmojisOnly = null;
@@ -195,6 +200,8 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
false,
false,
null,
+ null,
+ Collections.emptyList(),
System.currentTimeMillis(),
null,
null,
@@ -224,6 +231,8 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
false,
false,
null,
+ null,
+ Collections.emptyList(),
System.currentTimeMillis(),
null,
null,
@@ -236,7 +245,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
final String remoteMsgId, final String relativeFilePath,
final String serverMsgId, final String fingerprint, final boolean read,
final String edited, final boolean oob, final String errorMessage, final Set<ReadByMarker> readByMarkers,
- final boolean markable, final boolean deleted, final String bodyLanguage, final long timeReceived, final String subject, final String fileParams, final List<Element> payloads) {
+ final boolean markable, final boolean deleted, final String bodyLanguage, final String occupantId, final Collection<Reaction> reactions, final long timeReceived, final String subject, final String fileParams, final List<Element> payloads) {
this.conversation = conversation;
this.uuid = uuid;
this.conversationUuid = conversationUUid;
@@ -260,6 +269,8 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
this.markable = markable;
this.deleted = deleted;
this.bodyLanguage = bodyLanguage;
+ this.occupantId = occupantId;
+ this.reactions = reactions;
this.timeReceived = timeReceived;
this.subject = subject;
if (payloads != null) this.payloads = payloads;
@@ -305,12 +316,15 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
cursor.getInt(cursor.getColumnIndex(MARKABLE)) > 0,
cursor.getInt(cursor.getColumnIndex(DELETED)) > 0,
cursor.getString(cursor.getColumnIndex(BODY_LANGUAGE)),
+ cursor.getString(cursor.getColumnIndexOrThrow(OCCUPANT_ID)),
+ Reaction.fromString(cursor.getString(cursor.getColumnIndexOrThrow(REACTIONS))),
cursor.getLong(cursor.getColumnIndex(cursor.isNull(cursor.getColumnIndex("timeReceived")) ? TIME_SENT : "timeReceived")),
cursor.getString(cursor.getColumnIndex("subject")),
cursor.getString(cursor.getColumnIndex("fileParams")),
payloads
);
- m.setOccupantId(cursor.getString(cursor.getColumnIndex("occupant_id")));
+ final var legacyOccupant = cursor.getString(cursor.getColumnIndex("occupant_id"));
+ if (legacyOccupant != null) m.setOccupantId(legacyOccupant);
return m;
}
@@ -361,7 +375,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
@Override
public ContentValues getContentValues() {
- ContentValues values = new ContentValues();
+ final var values = new ContentValues();
values.put(UUID, uuid);
values.put(CONVERSATION, conversationUuid);
if (counterpart == null) {
@@ -396,6 +410,8 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
values.put(MARKABLE, markable ? 1 : 0);
values.put(DELETED, deleted ? 1 : 0);
values.put(BODY_LANGUAGE, bodyLanguage);
+ values.put(OCCUPANT_ID, occupantId);
+ values.put(REACTIONS, Reaction.toString(this.reactions));
return values;
}
@@ -415,7 +431,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
}
public void clearReplyReact() {
- this.payloads.remove(getReactions());
+ this.payloads.remove(getReactionsEl());
this.payloads.remove(getReply());
clearFallbacks("urn:xmpp:reply:0", "urn:xmpp:reactions:0");
}
@@ -446,7 +462,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
public Message react(String emoji) {
final var m = reply();
- if (getReactions() == null) {
+ if (getReactionsEl() == null) {
m.updateReaction(this, emoji);
} else if (mInReplyTo != null) {
// Try to send react-to-reaction to parent
@@ -475,25 +491,6 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
addPayload(reactions);
}
- public void setReactions(Element reactions) {
- if (this.payloads != null) {
- this.payloads.remove(getReactions());
- }
- addPayload(reactions);
- }
-
- public Element getReactions() {
- if (this.payloads == null) return null;
-
- for (Element el : this.payloads) {
- if (el.getName().equals("reactions") && el.getNamespace().equals("urn:xmpp:reactions:0")) {
- return el;
- }
- }
-
- return null;
- }
-
public Element getReply() {
if (this.payloads == null) return null;
@@ -1017,7 +1014,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
}
public boolean mergeable(final Message message) {
- return false; // Merrgine messages messes up reply, so disable for now
+ return false; // Merging messages messes up reply, so disable for now
}
private static boolean isStatusMergeable(int a, int b) {
@@ -1062,6 +1059,41 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
return oob || getFileParams().url != null;
}
+ public Collection<Reaction> getReactions() {
+ return this.reactions;
+ }
+
+ public void setReactions(Element reactions) {
+ if (this.payloads != null) {
+ this.payloads.remove(getReactionsEl());
+ }
+ addPayload(reactions);
+ }
+
+ public Element getReactionsEl() {
+ if (this.payloads == null) return null;
+
+ for (Element el : this.payloads) {
+ if (el.getName().equals("reactions") && el.getNamespace().equals("urn:xmpp:reactions:0")) {
+ return el;
+ }
+ }
+
+ return null;
+ }
+
+ public boolean isReactionsEmpty() {
+ return this.reactions.isEmpty();
+ }
+
+ public Reaction.Aggregated getAggregatedReactions() {
+ return Reaction.aggregated(this.reactions);
+ }
+
+ public void setReactions(final Collection<Reaction> reactions) {
+ this.reactions = reactions;
+ }
+
public static class MergeSeparator {
}
@@ -22,6 +22,7 @@ import eu.siacs.conversations.services.AvatarService;
import eu.siacs.conversations.services.MessageArchiveService;
import eu.siacs.conversations.utils.JidHelper;
import eu.siacs.conversations.utils.UIHelper;
+import eu.siacs.conversations.xml.Namespace;
import eu.siacs.conversations.xmpp.Jid;
import eu.siacs.conversations.xmpp.chatstate.ChatState;
import eu.siacs.conversations.xmpp.forms.Data;
@@ -240,6 +241,11 @@ public class MucOptions {
return getFeatures().contains("http://jabber.org/protocol/muc#stable_id");
}
+ public boolean occupantId() {
+ final var features = getFeatures();
+ return features.contains(Namespace.OCCUPANT_ID);
+ }
+
public User deleteUser(Jid jid) {
User user = findUserByFullJid(jid);
if (user != null) {
@@ -1120,5 +1126,9 @@ public class MucOptions {
public String getAvatarName() {
return getConversation().getName().toString();
}
+
+ public void setOccupantId(final String occupantId) {
+ this.occupantId = occupantId;
+ }
}
}
@@ -0,0 +1,178 @@
+package eu.siacs.conversations.entities;
+
+import androidx.annotation.NonNull;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Multimaps;
+import com.google.common.collect.Ordering;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonSyntaxException;
+import com.google.gson.TypeAdapter;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonToken;
+import com.google.gson.stream.JsonWriter;
+
+import eu.siacs.conversations.xmpp.Jid;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class Reaction {
+
+ public static final List<String> SUGGESTIONS =
+ Arrays.asList(
+ "\u2764\uFE0F",
+ "\uD83D\uDC4D",
+ "\uD83D\uDC4E",
+ "\uD83D\uDE02",
+ "\uD83D\uDE2E",
+ "\uD83D\uDE22");
+
+ private static final Gson GSON;
+
+ static {
+ GSON = new GsonBuilder().registerTypeAdapter(Jid.class, new JidTypeAdapter()).create();
+ }
+
+ public final String reaction;
+ public final boolean received;
+ public final Jid from;
+ public final Jid trueJid;
+ public final String occupantId;
+
+ public Reaction(
+ final String reaction,
+ boolean received,
+ final Jid from,
+ final Jid trueJid,
+ final String occupantId) {
+ this.reaction = reaction;
+ this.received = received;
+ this.from = from;
+ this.trueJid = trueJid;
+ this.occupantId = occupantId;
+ }
+
+ public static String toString(final Collection<Reaction> reactions) {
+ return (reactions == null || reactions.isEmpty()) ? null : GSON.toJson(reactions);
+ }
+
+ public static Collection<Reaction> fromString(final String asString) {
+ if (Strings.isNullOrEmpty(asString)) {
+ return Collections.emptyList();
+ }
+ try {
+ return GSON.fromJson(asString, new TypeToken<ArrayList<Reaction>>() {}.getType());
+ } catch (final JsonSyntaxException e) {
+ return Collections.emptyList();
+ }
+ }
+
+ public static Collection<Reaction> withOccupantId(
+ final Collection<Reaction> existing,
+ final Collection<String> reactions,
+ final boolean received,
+ final Jid from,
+ final Jid trueJid,
+ final String occupantId) {
+ final ImmutableList.Builder<Reaction> builder = new ImmutableList.Builder<>();
+ builder.addAll(Collections2.filter(existing, e -> !occupantId.equals(e.occupantId)));
+ builder.addAll(
+ Collections2.transform(
+ reactions, r -> new Reaction(r, received, from, trueJid, occupantId)));
+ return builder.build();
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("reaction", reaction)
+ .add("received", received)
+ .add("from", from)
+ .add("trueJid", trueJid)
+ .add("occupantId", occupantId)
+ .toString();
+ }
+
+ public static Collection<Reaction> withFrom(
+ final Collection<Reaction> existing,
+ final Collection<String> reactions,
+ final boolean received,
+ final Jid from) {
+ final ImmutableList.Builder<Reaction> builder = new ImmutableList.Builder<>();
+ builder.addAll(
+ Collections2.filter(existing, e -> !from.asBareJid().equals(e.from.asBareJid())));
+ builder.addAll(
+ Collections2.transform(
+ reactions, r -> new Reaction(r, received, from, null, null)));
+ return builder.build();
+ }
+
+ private static class JidTypeAdapter extends TypeAdapter<Jid> {
+ @Override
+ public void write(final JsonWriter out, final Jid value) throws IOException {
+ if (value == null) {
+ out.nullValue();
+ } else {
+ out.value(value.toEscapedString());
+ }
+ }
+
+ @Override
+ public Jid read(final JsonReader in) throws IOException {
+ if (in.peek() == JsonToken.NULL) {
+ in.nextNull();
+ return null;
+ } else if (in.peek() == JsonToken.STRING) {
+ final String value = in.nextString();
+ return Jid.ofEscaped(value);
+ }
+ throw new IOException("Unexpected token");
+ }
+ }
+
+ public static Aggregated aggregated(final Collection<Reaction> reactions) {
+ final Map<String, Integer> aggregatedReactions =
+ Maps.transformValues(
+ Multimaps.index(reactions, r -> r.reaction).asMap(), Collection::size);
+ final List<Map.Entry<String, Integer>> sortedList =
+ Ordering.from(
+ Comparator.comparingInt(
+ (Map.Entry<String, Integer> o) -> o.getValue()))
+ .reverse()
+ .immutableSortedCopy(aggregatedReactions.entrySet());
+ return new Aggregated(
+ sortedList,
+ ImmutableSet.copyOf(
+ Collections2.transform(
+ Collections2.filter(reactions, r -> !r.received),
+ r -> r.reaction)));
+ }
+
+ public static final class Aggregated {
+
+ public final List<Map.Entry<String, Integer>> reactions;
+ public final Set<String> ourReactions;
+
+ private Aggregated(
+ final List<Map.Entry<String, Integer>> reactions, Set<String> ourReactions) {
+ this.reactions = reactions;
+ this.ourReactions = ourReactions;
+ }
+ }
+}
@@ -2,6 +2,7 @@ package eu.siacs.conversations.generator;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
@@ -23,6 +24,8 @@ import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager;
import eu.siacs.conversations.xmpp.jingle.JingleRtpConnection;
import eu.siacs.conversations.xmpp.jingle.Media;
import eu.siacs.conversations.xmpp.jingle.stanzas.Reason;
+import im.conversations.android.xmpp.model.reactions.Reaction;
+import im.conversations.android.xmpp.model.reactions.Reactions;
public class MessageGenerator extends AbstractGenerator {
private static final String OMEMO_FALLBACK_MESSAGE = "I sent you an OMEMO encrypted message but your client doesn’t seem to support that. Find more information on https://conversations.im/omemo";
@@ -197,6 +200,21 @@ public class MessageGenerator extends AbstractGenerator {
return packet;
}
+ public im.conversations.android.xmpp.model.stanza.Message reaction(final Conversational conversation, final String reactingTo, final Collection<String> ourReactions) {
+ final boolean groupChat = conversation.getMode() == Conversational.MODE_MULTI;
+ final Jid to = conversation.getJid().asBareJid();
+ final im.conversations.android.xmpp.model.stanza.Message packet = new im.conversations.android.xmpp.model.stanza.Message();
+ packet.setType(groupChat ? im.conversations.android.xmpp.model.stanza.Message.Type.GROUPCHAT : im.conversations.android.xmpp.model.stanza.Message.Type.CHAT);
+ packet.setTo(to);
+ final var reactions = packet.addExtension(new Reactions());
+ reactions.setId(reactingTo);
+ for(final String ourReaction : ourReactions) {
+ reactions.addExtension(new Reaction(ourReaction));
+ }
+ packet.addChild("store", "urn:xmpp:hints");
+ return packet;
+ }
+
public im.conversations.android.xmpp.model.stanza.Message conferenceSubject(Conversation conversation, String subject) {
im.conversations.android.xmpp.model.stanza.Message packet = new im.conversations.android.xmpp.model.stanza.Message();
packet.setType(im.conversations.android.xmpp.model.stanza.Message.Type.GROUPCHAT);
@@ -1,6 +1,5 @@
package eu.siacs.conversations.parser;
-
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -139,7 +138,7 @@ public abstract class AbstractParser {
return parseItem(conference,item,null,null,null,new Element("hats", "urn:xmpp:hats:0"));
}
- public static MucOptions.User parseItem(Conversation conference, Element item, Jid fullJid, final Element occupantId, final String nicknameIn, final Element hatsEl) {
+ public static MucOptions.User parseItem(final Conversation conference, Element item, Jid fullJid, final Element occupantId, final String nicknameIn, final Element hatsEl) {
final String local = conference.getJid().getLocal();
final String domain = conference.getJid().getDomain().toEscapedString();
String affiliation = item.getAttribute("affiliation");
@@ -42,6 +42,7 @@ import eu.siacs.conversations.entities.Conversational;
import eu.siacs.conversations.entities.DownloadableFile;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.MucOptions;
+import eu.siacs.conversations.entities.Reaction;
import eu.siacs.conversations.entities.ReadByMarker;
import eu.siacs.conversations.entities.ReceiptRequest;
import eu.siacs.conversations.entities.RtpSessionStatus;
@@ -65,6 +66,8 @@ import im.conversations.android.xmpp.model.Extension;
import im.conversations.android.xmpp.model.carbons.Received;
import im.conversations.android.xmpp.model.carbons.Sent;
import im.conversations.android.xmpp.model.forward.Forwarded;
+import im.conversations.android.xmpp.model.occupant.OccupantId;
+import im.conversations.android.xmpp.model.reactions.Reactions;
public class MessageParser extends AbstractParser implements Consumer<im.conversations.android.xmpp.model.stanza.Message> {
@@ -445,7 +448,8 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
} else if (query != null) {
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received mam result with invalid from (" + original.getFrom() + ") or queryId (" + queryId + ")");
return;
- } else if (original.fromServer(account)) {
+ } else if (original.fromServer(account)
+ && original.getType() != im.conversations.android.xmpp.model.stanza.Message.Type.GROUPCHAT) {
Pair<im.conversations.android.xmpp.model.stanza.Message, Long> f;
f = getForwardedMessagePacket(original, Received.class);
f = f == null ? getForwardedMessagePacket(original, Sent.class) : f;
@@ -462,6 +466,7 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
if (timestamp == null) {
timestamp = AbstractParser.parseTimestamp(original, AbstractParser.parseTimestamp(packet));
}
+ final Reactions reactions = packet.getExtension(Reactions.class);
final Element mucUserElement = packet.findChild("x", Namespace.MUC_USER);
final String pgpEncrypted = packet.findChildContent("x", "jabber:x:encrypted");
Element replaceElement = packet.findChild("replace", "urn:xmpp:message-correct:0");
@@ -556,27 +561,6 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
}
}
- final Element reactions = packet.findChild("reactions", "urn:xmpp:reactions:0");
- if (body == null && html == null) {
- if (reactions != null && reactions.getAttribute("id") != null) {
- final Conversation conversation = mXmppConnectionService.find(account, counterpart.asBareJid());
- if (conversation != null) {
- final Message reactionTo = conversation.findMessageWithRemoteIdAndCounterpart(reactions.getAttribute("id"), null);
- if (reactionTo != null) {
- String bodyS = reactionTo.reply().getBody();
- for (Element el : reactions.getChildren()) {
- if (el.getName().equals("reaction") && el.getNamespace().equals("urn:xmpp:reactions:0")) {
- bodyS += el.getContent();
- }
- }
- body = new LocalizedContent(bodyS, "en", 1);
- final Message previousReaction = conversation.findMessageReactingTo(reactions.getAttribute("id"), counterpart);
- if (previousReaction != null) replacementId = previousReaction.replyId();
- }
- }
- }
- }
-
final boolean conversationIsProbablyMuc = isTypeGroupChat || mucUserElement != null || account.getXmppConnection().getMucServersWithholdAccount().contains(counterpart.getDomain().toEscapedString());
final Element webxdc = packet.findChild("x", "urn:xmpp:webxdc:0");
final Element thread = packet.findChild("thread");
@@ -761,7 +745,6 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
}
}
message.markable = packet.hasChild("markable", "urn:xmpp:chat-markers:0");
- if (reactions != null) message.addPayload(reactions);
for (Element el : packet.getChildren()) {
if ((el.getName().equals("query") && el.getNamespace().equals("http://jabber.org/protocol/disco#items") && el.getAttribute("node").equals("http://jabber.org/protocol/commands")) ||
(el.getName().equals("fallback") && el.getNamespace().equals("urn:xmpp:fallback:0"))) {
@@ -787,10 +770,14 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
}
}
if (conversationMultiMode) {
- message.setMucUser(conversation.getMucOptions().findUserByFullJid(counterpart));
- final Element occupantId = packet.findChild("occupant-id", "urn:xmpp:occupant-id:0");
- if (occupantId != null) message.setOccupantId(occupantId.getAttribute("id"));
- final Jid fallback = conversation.getMucOptions().getTrueCounterpart(counterpart);
+ final var mucOptions = conversation.getMucOptions();
+ final var occupantId =
+ mucOptions.occupantId() ? packet.getExtension(OccupantId.class) : null;
+ if (occupantId != null) {
+ message.setOccupantId(occupantId.getId());
+ }
+ message.setMucUser(mucOptions.findUserByFullJid(counterpart));
+ final Jid fallback = mucOptions.getTrueCounterpart(counterpart);
Jid trueCounterpart;
if (message.getEncryption() == Message.ENCRYPTION_AXOLOTL) {
trueCounterpart = message.getTrueCounterpart();
@@ -824,10 +811,14 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
final boolean trueCountersMatch = replacedMessage.getTrueCounterpart() != null
&& message.getTrueCounterpart() != null
&& replacedMessage.getTrueCounterpart().asBareJid().equals(message.getTrueCounterpart().asBareJid());
- final boolean mucUserMatches = query == null && replacedMessage.sameMucUser(message);
+ final boolean occupantIdMatch =
+ replacedMessage.getOccupantId() != null
+ && replacedMessage
+ .getOccupantId()
+ .equals(message.getOccupantId());
+ final boolean mucUserMatches = query == null && replacedMessage.sameMucUser(message); //can not be checked when using mam
final boolean duplicate = conversation.hasDuplicateMessage(message);
- if (fingerprintsMatch && (trueCountersMatch || !conversationMultiMode || mucUserMatches || counterpart.isBareJid()) && !duplicate) {
- Log.d(Config.LOGTAG, "replaced message '" + replacedMessage.getBody() + "' with '" + message.getBody() + "'");
+ if (fingerprintsMatch && (trueCountersMatch || occupantIdMatch || !conversationMultiMode || mucUserMatches) && !duplicate) {
synchronized (replacedMessage) {
final String uuid = replacedMessage.getUuid();
replacedMessage.setUuid(UUID.randomUUID().toString());
@@ -1225,6 +1216,7 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
final Element displayed = packet.findChild("displayed", "urn:xmpp:chat-markers:0");
if (displayed != null) {
final String id = displayed.getAttribute("id");
+ // TODO we don’t even use 'sender' any more. Remove this!
final Jid sender = InvalidJid.getNullForInvalid(displayed.getAttributeAsJid("sender"));
if (packet.fromAccount(account) && !selfAddressed) {
final Conversation c =
@@ -1250,7 +1242,9 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
message = null;
}
if (message != null) {
+ // TODO use occupantId to extract true counterpart from presence
final Jid fallback = conversation.getMucOptions().getTrueCounterpart(counterpart);
+ // TODO try to externalize mucTrueCounterpart
final Jid trueJid = getTrueCounterpart((query != null && query.safeToExtractTrueCounterpart()) ? mucUserElement : null, fallback);
final boolean trueJidMatchesAccount = account.getJid().asBareJid().equals(trueJid == null ? null : trueJid.asBareJid());
if (trueJidMatchesAccount || conversation.getMucOptions().isSelf(counterpart)) {
@@ -1289,6 +1283,60 @@ public class MessageParser extends AbstractParser implements Consumer<im.convers
}
}
+ if (reactions != null) {
+ final String reactingTo = reactions.getId();
+ final Conversation conversation =
+ mXmppConnectionService.find(account, counterpart.asBareJid());
+
+ if (conversation != null) {
+ if (isTypeGroupChat && conversation.getMode() == Conversational.MODE_MULTI) {
+ final var mucOptions = conversation.getMucOptions();
+ final var occupant =
+ mucOptions.occupantId() ? packet.getExtension(OccupantId.class) : null;
+ final var occupantId = occupant == null ? null : occupant.getId();
+ final var message = conversation.findMessageWithServerMsgId(reactingTo);
+ // TODO use occupant id for isSelf assessment
+ final boolean isReceived = !mucOptions.isSelf(counterpart);
+ if (occupantId != null && message != null) {
+ final var combinedReactions =
+ Reaction.withOccupantId(
+ message.getReactions(),
+ reactions.getReactions(),
+ isReceived,
+ counterpart,
+ null,
+ occupantId);
+ message.setReactions(combinedReactions);
+ mXmppConnectionService.updateMessage(message, false);
+ } else {
+ Log.d(Config.LOGTAG,"not found occupant or message");
+ }
+ } else if (conversation.getMode() == Conversational.MODE_SINGLE) {
+ final var message = conversation.findMessageWithUuidOrRemoteId(reactingTo);
+ final boolean isReceived;
+ final Jid reactionFrom;
+ if (packet.fromAccount(account)) {
+ isReceived = false;
+ reactionFrom = account.getJid().asBareJid();
+ } else {
+ isReceived = true;
+ reactionFrom = counterpart;
+ }
+ packet.fromAccount(account);
+ if (message != null) {
+ final var combinedReactions =
+ Reaction.withFrom(
+ message.getReactions(),
+ reactions.getReactions(),
+ isReceived,
+ reactionFrom);
+ message.setReactions(combinedReactions);
+ mXmppConnectionService.updateMessage(message, false);
+ }
+ }
+ }
+ }
+
final Element event = original.findChild("event", "http://jabber.org/protocol/pubsub#event");
if (event != null && InvalidJid.hasValidFrom(original) && original.getFrom().isBareJid()) {
if (event.hasChild("items")) {
@@ -20,6 +20,7 @@ import eu.siacs.conversations.xml.Namespace;
import eu.siacs.conversations.xmpp.InvalidJid;
import eu.siacs.conversations.xmpp.Jid;
import eu.siacs.conversations.xmpp.pep.Avatar;
+import im.conversations.android.xmpp.model.occupant.OccupantId;
import org.openintents.openpgp.util.OpenPgpUtils;
@@ -71,7 +72,7 @@ public class PresenceParser extends AbstractParser implements Consumer<im.conver
hats = packet.findChild("hats", "xmpp:prosody.im/protocol/hats:1");
}
if (hats == null) hats = new Element("hats", "urn:xmpp:hats:0");
- final Element occupantId = packet.findChild("occupant-id", "urn:xmpp:occupant-id:0");
+ final Element occupantIdEl = packet.findChild("occupant-id", "urn:xmpp:occupant-id:0");
Avatar avatar = Avatar.parsePresence(packet.findChild("x", "vcard-temp:x:update"));
final List<String> codes = getStatusCodes(x);
if (type == null) {
@@ -79,8 +80,15 @@ public class PresenceParser extends AbstractParser implements Consumer<im.conver
Element item = x.findChild("item");
if (item != null && !from.isBareJid()) {
mucOptions.setError(MucOptions.Error.NONE);
- MucOptions.User user = parseItem(conversation, item, from, occupantId, nick == null ? null : nick.getContent(), hats);
- if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE) || (codes.contains(MucOptions.STATUS_CODE_ROOM_CREATED) && jid.equals(InvalidJid.getNullForInvalid(item.getAttributeAsJid("jid"))))) {
+ MucOptions.User user = parseItem(conversation, item, from, occupantIdEl, nick == null ? null : nick.getContent(), hats);
+ final var occupant = packet.getExtension(OccupantId.class);
+ final String occupantId = mucOptions.occupantId() && occupant != null ? occupant.getId() : null;
+ user.setOccupantId(occupantId);
+ if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE)
+ || (codes.contains(MucOptions.STATUS_CODE_ROOM_CREATED)
+ && jid.equals(
+ InvalidJid.getNullForInvalid(
+ item.getAttributeAsJid("jid"))))) {
if (mucOptions.setOnline()) {
mXmppConnectionService.getAvatarService().clear(mucOptions);
}
@@ -205,10 +213,10 @@ public class PresenceParser extends AbstractParser implements Consumer<im.conver
} else if (!from.isBareJid()) {
Element item = x.findChild("item");
if (item != null) {
- mucOptions.updateUser(parseItem(conversation, item, from, occupantId, nick == null ? null : nick.getContent(), hats));
+ mucOptions.updateUser(parseItem(conversation, item, from, occupantIdEl, nick == null ? null : nick.getContent(), hats));
}
MucOptions.User user = mucOptions.deleteUser(from);
- if (user != null && occupantId == null) {
+ if (user != null && occupantIdEl == null) {
mXmppConnectionService.getAvatarService().clear(user);
}
}
@@ -76,7 +76,7 @@ import eu.siacs.conversations.xmpp.mam.MamReference;
public class DatabaseBackend extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "history";
- private static final int DATABASE_VERSION = 51;
+ private static final int DATABASE_VERSION = 52;
private static boolean requiresMessageIndexRebuild = false;
private static DatabaseBackend instance = null;
@@ -424,6 +424,8 @@ public class DatabaseBackend extends SQLiteOpenHelper {
+ Message.MARKABLE + " NUMBER DEFAULT 0,"
+ Message.DELETED + " NUMBER DEFAULT 0,"
+ Message.BODY_LANGUAGE + " TEXT,"
+ + Message.OCCUPANT_ID + " TEXT,"
+ + Message.REACTIONS + " TEXT,"
+ Message.REMOTE_MSG_ID + " TEXT, FOREIGN KEY("
+ Message.CONVERSATION + ") REFERENCES "
+ Conversation.TABLENAME + "(" + Conversation.UUID
@@ -763,6 +765,10 @@ public class DatabaseBackend extends SQLiteOpenHelper {
db.execSQL("ALTER TABLE " + Account.TABLENAME + " ADD COLUMN " + Account.FAST_MECHANISM + " TEXT");
db.execSQL("ALTER TABLE " + Account.TABLENAME + " ADD COLUMN " + Account.FAST_TOKEN + " TEXT");
}
+ if (oldVersion < 52 && newVersion >= 52) {
+ db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN " + Message.OCCUPANT_ID + " TEXT");
+ db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN " + Message.REACTIONS + " TEXT");
+ }
}
private void canonicalizeJids(SQLiteDatabase db) {
@@ -1397,28 +1403,29 @@ public class DatabaseBackend extends SQLiteOpenHelper {
}
public boolean updateAccount(Account account) {
- SQLiteDatabase db = this.getWritableDatabase();
- String[] args = {account.getUuid()};
- final int rows = db.update(Account.TABLENAME, account.getContentValues(), Account.UUID + "=?", args);
+ final var db = this.getWritableDatabase();
+ final String[] args = {account.getUuid()};
+ final int rows =
+ db.update(Account.TABLENAME, account.getContentValues(), Account.UUID + "=?", args);
return rows == 1;
}
- public boolean deleteAccount(Account account) {
- SQLiteDatabase db = this.getWritableDatabase();
- String[] args = {account.getUuid()};
+ public boolean deleteAccount(final Account account) {
+ final var db = this.getWritableDatabase();
+ final String[] args = {account.getUuid()};
final int rows = db.delete(Account.TABLENAME, Account.UUID + "=?", args);
return rows == 1;
}
- public boolean updateMessage(Message message, boolean includeBody) {
- SQLiteDatabase db = this.getWritableDatabase();
- String[] args = {message.getUuid()};
- ContentValues contentValues = message.getContentValues();
+ public boolean updateMessage(final Message message, final boolean includeBody) {
+ final var db = this.getWritableDatabase();
+ final String[] args = {message.getUuid()};
+ final var contentValues = message.getContentValues();
contentValues.remove(Message.UUID);
if (!includeBody) {
contentValues.remove(Message.BODY);
}
- return db.update(Message.TABLENAME, message.getContentValues(), Message.UUID + "=?", args) == 1 &&
+ return db.update(Message.TABLENAME, contentValues, Message.UUID + "=?", args) == 1 &&
db.update("cheogram." + Message.TABLENAME, message.getCheogramContentValues(), Message.UUID + "=?", args) == 1;
}
@@ -16,6 +16,7 @@ import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
+import com.google.common.base.Strings;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -30,6 +31,7 @@ import eu.siacs.conversations.xmpp.jingle.Media;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -37,17 +39,28 @@ import java.util.concurrent.atomic.AtomicBoolean;
public class CallIntegration extends Connection {
/**
- * OnePlus 6 (Android 8.1-11) Device is buggy and always starts the OS call screen even though
- * we want to be self managed
- *
- * <p>Samsung Galaxy Tab A claims to have FEATURE_CONNECTION_SERVICE but then throws
+ * Samsung Galaxy Tab A claims to have FEATURE_CONNECTION_SERVICE but then throws
* SecurityException when invoking placeCall(). Both Stock and LineageOS have this problem.
*
* <p>Lenovo Yoga Smart Tab YT-X705F claims to have FEATURE_CONNECTION_SERVICE but throws
* SecurityException
*/
private static final List<String> BROKEN_DEVICE_MODELS =
- Arrays.asList("OnePlus6", "gtaxlwifi", "YT-X705F");
+ Arrays.asList("gtaxlwifi", "a5y17lte", "YT-X705F");
+
+ /**
+ * all Realme devices at least up to and including Android 11 are broken
+ *
+ * <p>we are relatively sure that old Oppo devices are broken too. We get reports of 'number not
+ * sent' from Oppo R15x (Android 10)
+ *
+ * <p>OnePlus 6 (Android 8.1-11) Device is buggy and always starts the OS call screen even
+ * though we want to be self managed
+ *
+ * <p>a bunch of OnePlus devices are broken in other ways
+ */
+ private static final List<String> BROKEN_MANUFACTURES_UP_TO_11 =
+ Arrays.asList("realme", "oppo", "oneplus");
public static final int DEFAULT_TONE_VOLUME = 60;
private static final int DEFAULT_MEDIA_PLAYER_VOLUME = 90;
@@ -534,25 +547,18 @@ public class CallIntegration extends Connection {
}
private static boolean isDeviceModelSupported() {
+ final var manufacturer = Strings.nullToEmpty(Build.MANUFACTURER).toLowerCase(Locale.ROOT);
if (BROKEN_DEVICE_MODELS.contains(Build.DEVICE)) {
return false;
}
- // all Realme devices at least up to and including Android 11 are broken
- if ("realme".equalsIgnoreCase(Build.MANUFACTURER)
- && Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
- return false;
- }
- // we are relatively sure that old Oppo devices are broken too. We get reports of 'number
- // not sent' from Oppo R15x (Android 10)
- if ("OPPO".equalsIgnoreCase(Build.MANUFACTURER)
+ if (BROKEN_MANUFACTURES_UP_TO_11.contains(manufacturer)
&& Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
return false;
}
// we only know of one Umidigi device (BISON_GT2_5G) that doesn't work (audio is not being
// routed properly) However with those devices being extremely rare it's impossible to gauge
// how many might be effected and no Naomi Wu around to clarify with the company directly
- if ("umidigi".equalsIgnoreCase(Build.MANUFACTURER)
- && Build.VERSION.SDK_INT <= Build.VERSION_CODES.S) {
+ if ("umidigi".equals(manufacturer) && Build.VERSION.SDK_INT <= Build.VERSION_CODES.S) {
return false;
}
return true;
@@ -136,6 +136,7 @@ import eu.siacs.conversations.entities.MucOptions;
import eu.siacs.conversations.entities.MucOptions.OnRenameListener;
import eu.siacs.conversations.entities.Presence;
import eu.siacs.conversations.entities.PresenceTemplate;
+import eu.siacs.conversations.entities.Reaction;
import eu.siacs.conversations.entities.Roster;
import eu.siacs.conversations.entities.ServiceDiscoveryResult;
import eu.siacs.conversations.generator.AbstractGenerator;
@@ -181,7 +182,6 @@ import eu.siacs.conversations.xml.LocalizedContent;
import eu.siacs.conversations.xml.Namespace;
import eu.siacs.conversations.xmpp.InvalidJid;
import eu.siacs.conversations.xmpp.Jid;
-import eu.siacs.conversations.xmpp.OnBindListener;
import eu.siacs.conversations.xmpp.OnContactStatusChanged;
import eu.siacs.conversations.xmpp.OnGatewayResult;
import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
@@ -1513,7 +1513,11 @@ public class XmppConnectionService extends Service {
}
final PowerManager powerManager = getSystemService(PowerManager.class);
- this.wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Conversations:Service");
+ if (powerManager != null) {
+ this.wakeLock =
+ powerManager.newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK, "Conversations:Service");
+ }
toggleForegroundService();
updateUnreadCountBadge();
@@ -2258,7 +2262,7 @@ public class XmppConnectionService extends Service {
sendIqPacket(account, retrieve, (response) -> {
if (response.getType() == Iq.Type.RESULT) {
final Element pubsub = response.findChild("pubsub", Namespace.PUBSUB);
- final Map<Jid, Bookmark> bookmarks = Bookmark.parseFromPubsub(pubsub, account);
+ final Map<Jid, Bookmark> bookmarks = Bookmark.parseFromPubSub(pubsub, account);
processBookmarksInitial(account, bookmarks, true);
}
});
@@ -5258,6 +5262,53 @@ public class XmppConnectionService extends Service {
PublishOptions.persistentWhitelistAccessMaxItems());
}
+ public boolean sendReactions(final Message message, final Collection<String> reactions) {
+ if (message.getConversation() instanceof Conversation conversation) {
+ final String reactToId;
+ final Collection<Reaction> combinedReactions;
+ if (conversation.getMode() == Conversational.MODE_MULTI) {
+ final var self = conversation.getMucOptions().getSelf();
+ final String occupantId = self.getOccupantId();
+ if (Strings.isNullOrEmpty(occupantId)) {
+ Log.d(Config.LOGTAG, "occupant id not found for reaction in MUC");
+ return false;
+ }
+ reactToId = message.getServerMsgId();
+ combinedReactions =
+ Reaction.withOccupantId(
+ message.getReactions(),
+ reactions,
+ false,
+ self.getFullJid(),
+ conversation.getAccount().getJid(),
+ occupantId);
+ } else {
+ if (message.isCarbon() || message.getStatus() == Message.STATUS_RECEIVED) {
+ reactToId = message.getRemoteMsgId();
+ } else {
+ reactToId = message.getUuid();
+ }
+ combinedReactions =
+ Reaction.withFrom(
+ message.getReactions(),
+ reactions,
+ false,
+ conversation.getAccount().getJid());
+ }
+ if (Strings.isNullOrEmpty(reactToId)) {
+ return false;
+ }
+ final var reactionMessage =
+ mMessageGenerator.reaction(conversation, reactToId, reactions);
+ sendMessagePacket(conversation.getAccount(), reactionMessage);
+ message.setReactions(combinedReactions);
+ updateMessage(message, false);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
public MemorizingTrustManager getMemorizingTrustManager() {
return this.mMemorizingTrustManager;
}
@@ -0,0 +1,117 @@
+package eu.siacs.conversations.ui;
+
+import android.view.View;
+
+import com.google.android.material.chip.Chip;
+import com.google.android.material.chip.ChipGroup;
+import com.google.android.material.color.MaterialColors;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableSet;
+
+import eu.siacs.conversations.R;
+import eu.siacs.conversations.entities.Reaction;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.function.Consumer;
+
+public class BindingAdapters {
+
+ public static void setReactionsOnReceived(
+ final ChipGroup chipGroup,
+ final Reaction.Aggregated reactions,
+ final Consumer<Collection<String>> onModifiedReactions,
+ final Runnable addReaction) {
+ setReactions(chipGroup, reactions, true, onModifiedReactions, addReaction);
+ }
+
+ public static void setReactionsOnSent(
+ final ChipGroup chipGroup,
+ final Reaction.Aggregated reactions,
+ final Consumer<Collection<String>> onModifiedReactions) {
+ setReactions(chipGroup, reactions, false, onModifiedReactions, null);
+ }
+
+ private static void setReactions(
+ final ChipGroup chipGroup,
+ final Reaction.Aggregated aggregated,
+ final boolean onReceived,
+ final Consumer<Collection<String>> onModifiedReactions,
+ final Runnable addReaction) {
+ final var context = chipGroup.getContext();
+ final List<Map.Entry<String, Integer>> reactions = aggregated.reactions;
+ if (reactions == null || reactions.isEmpty()) {
+ chipGroup.setVisibility(View.GONE);
+ } else {
+ chipGroup.removeAllViews();
+ chipGroup.setVisibility(View.VISIBLE);
+ for (final Map.Entry<String, Integer> reaction : reactions) {
+ final var emoji = reaction.getKey();
+ final var count = reaction.getValue();
+ final Chip chip = new Chip(chipGroup.getContext());
+ chip.setEnsureMinTouchTargetSize(false);
+ chip.setChipStartPadding(0.0f);
+ chip.setChipEndPadding(0.0f);
+ if (count == 1) {
+ chip.setText(emoji);
+ } else {
+ chip.setText(String.format(Locale.ENGLISH, "%s %d", emoji, count));
+ }
+ final boolean oneOfOurs = aggregated.ourReactions.contains(emoji);
+ // received = surface; sent = surface high matches bubbles
+ if (oneOfOurs) {
+ chip.setChipBackgroundColor(
+ MaterialColors.getColorStateListOrNull(
+ context,
+ com.google.android.material.R.attr
+ .colorSurfaceContainerHighest));
+ } else {
+ chip.setChipBackgroundColor(
+ MaterialColors.getColorStateListOrNull(
+ context,
+ com.google.android.material.R.attr.colorSurfaceContainerLow));
+ }
+ chip.setOnClickListener(
+ v -> {
+ if (oneOfOurs) {
+ onModifiedReactions.accept(
+ ImmutableSet.copyOf(
+ Collections2.filter(
+ aggregated.ourReactions,
+ r -> !r.equals(emoji))));
+ } else {
+ onModifiedReactions.accept(
+ new ImmutableSet.Builder<String>()
+ .addAll(aggregated.ourReactions)
+ .add(emoji)
+ .build());
+ }
+ });
+ chipGroup.addView(chip);
+ }
+ if (onReceived) {
+ final Chip chip = new Chip(chipGroup.getContext());
+ chip.setChipIconResource(R.drawable.ic_add_reaction_24dp);
+ chip.setChipStrokeColor(
+ MaterialColors.getColorStateListOrNull(
+ chipGroup.getContext(),
+ com.google.android.material.R.attr.colorTertiary));
+ chip.setChipBackgroundColor(
+ MaterialColors.getColorStateListOrNull(
+ chipGroup.getContext(),
+ com.google.android.material.R.attr.colorTertiaryContainer));
+ chip.setChipIconTint(
+ MaterialColors.getColorStateListOrNull(
+ chipGroup.getContext(),
+ com.google.android.material.R.attr.colorOnTertiaryContainer));
+ chip.setEnsureMinTouchTargetSize(false);
+ chip.setTextEndPadding(0.0f);
+ chip.setTextStartPadding(0.0f);
+ chip.setOnClickListener(v -> addReaction.run());
+ chipGroup.addView(chip);
+ }
+ }
+ }
+}
@@ -704,7 +704,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
final ImmutableList.Builder<Integer> viewIdBuilder = new ImmutableList.Builder<>();
for (final ListItem.Tag tag : tagList) {
final String name = tag.getName();
- final TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, binding.tags, false);
+ final TextView tv = (TextView) inflater.inflate(R.layout.item_tag, binding.tags, false);
tv.setText(name);
tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(this,XEP0392Helper.rgbFromNick(name))));
final int id = ViewCompat.generateViewId();
@@ -35,7 +35,6 @@ import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.databinding.DataBindingUtil;
@@ -610,7 +609,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
final ImmutableList.Builder<Integer> viewIdBuilder = new ImmutableList.Builder<>();
for (final ListItem.Tag tag : tagList) {
final String name = tag.getName();
- final TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, binding.tags, false);
+ final TextView tv = (TextView) inflater.inflate(R.layout.item_tag, binding.tags, false);
tv.setText(name);
tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(this,XEP0392Helper.rgbFromNick(name))));
final int id = ViewCompat.generateViewId();
@@ -622,7 +621,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
final TextView tv =
(TextView)
inflater.inflate(
- R.layout.list_item_tag, binding.tags, false);
+ R.layout.item_tag, binding.tags, false);
tv.setText(R.string.blocked);
tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(tv.getContext(), ContextCompat.getColor(tv.getContext(),R.color.gray_800))));
final int id = ViewCompat.generateViewId();
@@ -635,7 +634,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
final TextView tv =
(TextView)
inflater.inflate(
- R.layout.list_item_tag, binding.tags, false);
+ R.layout.item_tag, binding.tags, false);
UIHelper.setStatus(tv, status);
final int id = ViewCompat.generateViewId();
tv.setId(id);
@@ -1803,6 +1803,7 @@ public class ConversationFragment extends XmppFragment
|| t instanceof HttpDownloadConnection);
activity.getMenuInflater().inflate(R.menu.message_context, menu);
final MenuItem reportAndBlock = menu.findItem(R.id.action_report_and_block);
+ final MenuItem addReaction = menu.findItem(R.id.action_add_reaction);
MenuItem openWith = menu.findItem(R.id.open_with);
MenuItem copyMessage = menu.findItem(R.id.copy_message);
MenuItem quoteMessage = menu.findItem(R.id.quote_message);
@@ -1838,6 +1839,14 @@ public class ConversationFragment extends XmppFragment
}
}
if (!encrypted && !m.getBody().equals("")) {
+ addReaction.setVisible(!showError && !m.isDeleted());
+ }
+ if (!m.isFileOrImage()
+ && !encrypted
+ && !m.isGeoUri()
+ && !m.treatAsDownloadable()
+ && !unInitiatedButKnownSize
+ && t == null) {
copyMessage.setVisible(true);
}
quoteMessage.setVisible(!encrypted && !showError);
@@ -1945,10 +1954,10 @@ public class ConversationFragment extends XmppFragment
activity.xmppConnectionService.deleteMessage(message);
return;
}
- Element reactions = message.getReactions();
+ Element reactions = message.getReactionsEl();
if (reactions != null) {
final Message previousReaction = conversation.findMessageReactingTo(reactions.getAttribute("id"), null);
- if (previousReaction != null) reactions = previousReaction.getReactions();
+ if (previousReaction != null) reactions = previousReaction.getReactionsEl();
for (Element el : reactions.getChildren()) {
if (message.getRawBody().endsWith(el.getContent())) {
reactions.removeChild(el);
@@ -2053,6 +2062,9 @@ public class ConversationFragment extends XmppFragment
case R.id.action_report_and_block:
reportMessage(selectedMessage);
return true;
+ case R.id.action_add_reaction:
+ addReaction(selectedMessage);
+ return true;
default:
return onOptionsItemSelected(item);
}
@@ -2875,6 +2887,10 @@ public class ConversationFragment extends XmppFragment
}
}
+ private void addReaction(final Message message) {
+ activity.addReaction(message, reactions -> activity.xmppConnectionService.sendReactions(message, reactions));
+ }
+
private void reportMessage(final Message message) {
BlockContactDialog.show(activity, conversation.getContact(), message.getServerMsgId());
}
@@ -1832,7 +1832,7 @@ public class StartConversationActivity extends XmppActivity
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
- View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_tag, null);
+ View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_tag, null);
return new ViewHolder(view);
}
@@ -60,6 +60,7 @@ import com.google.android.material.color.MaterialColors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.common.base.Strings;
import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableSet;
import java.io.IOException;
import java.lang.ref.WeakReference;
@@ -75,15 +76,16 @@ import eu.siacs.conversations.BuildConfig;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.PgpEngine;
+import eu.siacs.conversations.databinding.DialogAddReactionBinding;
import eu.siacs.conversations.databinding.DialogQuickeditBinding;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.Presences;
+import eu.siacs.conversations.entities.Reaction;
import eu.siacs.conversations.services.AvatarService;
import eu.siacs.conversations.services.BarcodeProvider;
-import eu.siacs.conversations.services.EmojiInitializationService;
import eu.siacs.conversations.services.QuickConversationsService;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder;
@@ -103,8 +105,11 @@ import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import java.util.concurrent.RejectedExecutionException;
+import java.util.function.Consumer;
public abstract class XmppActivity extends ActionBarActivity {
@@ -199,9 +204,11 @@ public abstract class XmppActivity extends ActionBarActivity {
}
protected void hideToast() {
- if (mToast != null) {
- mToast.cancel();
+ final var toast = this.mToast;
+ if (toast == null) {
+ return;
}
+ toast.cancel();
}
protected void replaceToast(String msg) {
@@ -286,29 +293,66 @@ public abstract class XmppActivity extends ActionBarActivity {
XmppConnectionService.class));
finish();
});
- builder.setPositiveButton(getString(R.string.install),
+ builder.setPositiveButton(
+ getString(R.string.install),
(dialog, which) -> {
- Uri uri = Uri
- .parse("market://details?id=org.sufficientlysecure.keychain");
- Intent marketIntent = new Intent(Intent.ACTION_VIEW,
- uri);
- PackageManager manager = getApplicationContext()
- .getPackageManager();
- List<ResolveInfo> infos = manager
- .queryIntentActivities(marketIntent, 0);
- if (infos.size() > 0) {
- startActivity(marketIntent);
+ final Uri uri =
+ Uri.parse("market://details?id=org.sufficientlysecure.keychain");
+ Intent marketIntent = new Intent(Intent.ACTION_VIEW, uri);
+ PackageManager manager = getApplicationContext().getPackageManager();
+ final var infos = manager.queryIntentActivities(marketIntent, 0);
+ if (infos.isEmpty()) {
+ final var website = Uri.parse("http://www.openkeychain.org/");
+ final Intent browserIntent = new Intent(Intent.ACTION_VIEW, website);
+ try {
+ startActivity(browserIntent);
+ } catch (final ActivityNotFoundException e) {
+ Toast.makeText(
+ this,
+ R.string.application_found_to_open_website,
+ Toast.LENGTH_LONG)
+ .show();
+ }
} else {
- uri = Uri.parse("http://www.openkeychain.org/");
- Intent browserIntent = new Intent(
- Intent.ACTION_VIEW, uri);
- startActivity(browserIntent);
+ startActivity(marketIntent);
}
finish();
});
builder.create().show();
}
+ public void addReaction(final Message message, Consumer<Collection<String>> callback) {
+ final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this);
+ final var layoutInflater = this.getLayoutInflater();
+ final DialogAddReactionBinding viewBinding =
+ DataBindingUtil.inflate(layoutInflater, R.layout.dialog_add_reaction, null, false);
+ builder.setView(viewBinding.getRoot());
+ final var dialog = builder.create();
+ for (final String emoji : Reaction.SUGGESTIONS) {
+ final Button button =
+ (Button)
+ layoutInflater.inflate(
+ R.layout.item_emoji_button, viewBinding.emojis, false);
+ viewBinding.emojis.addView(button);
+ button.setText(emoji);
+ button.setOnClickListener(
+ v -> {
+ final var aggregated = message.getAggregatedReactions();
+ if (aggregated.ourReactions.contains(emoji)) {
+ callback.accept(aggregated.ourReactions);
+ } else {
+ final ImmutableSet.Builder<String> reactionBuilder =
+ new ImmutableSet.Builder<>();
+ reactionBuilder.addAll(aggregated.ourReactions);
+ reactionBuilder.add(emoji);
+ callback.accept(reactionBuilder.build());
+ }
+ dialog.dismiss();
+ });
+ }
+ dialog.show();
+ }
+
protected void deleteAccount(final Account account) {
this.deleteAccount(account, null);
}
@@ -508,7 +552,6 @@ public abstract class XmppActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
metrics = getResources().getDisplayMetrics();
- EmojiInitializationService.execute(this);
this.isCameraFeatureAvailable = getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
this.mCustomColors = ThemeHelper.applyCustomColors(this);
}
@@ -100,7 +100,7 @@ public class ListItemAdapter extends ArrayAdapter<ListItem> {
final ImmutableList.Builder<Integer> viewIdBuilder = new ImmutableList.Builder<>();
for (final ListItem.Tag tag : tags) {
final String name = tag.getName();
- final TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, viewHolder.tags, false);
+ final TextView tv = (TextView) inflater.inflate(R.layout.item_tag, viewHolder.tags, false);
tv.setText(name);
tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(getContext(),XEP0392Helper.rgbFromNick(name))));
tv.setOnClickListener(this.onTagTvClick);
@@ -114,7 +114,7 @@ public class ListItemAdapter extends ArrayAdapter<ListItem> {
final TextView tv =
(TextView)
inflater.inflate(
- R.layout.list_item_tag, viewHolder.tags, false);
+ R.layout.item_tag, viewHolder.tags, false);
tv.setText(R.string.blocked);
tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(tv.getContext(),ContextCompat.getColor(tv.getContext(),R.color.gray_800))));
final int id = ViewCompat.generateViewId();
@@ -127,7 +127,7 @@ public class ListItemAdapter extends ArrayAdapter<ListItem> {
final TextView tv =
(TextView)
inflater.inflate(
- R.layout.list_item_tag, viewHolder.tags, false);
+ R.layout.item_tag, viewHolder.tags, false);
UIHelper.setStatus(tv, status);
final int id = ViewCompat.generateViewId();
tv.setId(id);
@@ -30,10 +30,12 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
+import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
+import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
@@ -64,11 +66,17 @@ import com.cheogram.android.Util;
import com.cheogram.android.WebxdcPage;
import com.cheogram.android.WebxdcUpdate;
+import androidx.emoji2.emojipicker.EmojiViewItem;
+import androidx.emoji2.emojipicker.RecentEmojiProvider;
+
import com.google.android.material.button.MaterialButton;
+import com.google.android.material.chip.ChipGroup;
import com.google.android.material.color.MaterialColors;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.lelloman.identicon.view.GithubIdenticonView;
@@ -94,6 +102,7 @@ import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.axolotl.FingerprintStatus;
import eu.siacs.conversations.databinding.LinkDescriptionBinding;
+import eu.siacs.conversations.databinding.DialogAddReactionBinding;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation;
@@ -109,6 +118,7 @@ import eu.siacs.conversations.persistance.FileBackend;
import eu.siacs.conversations.services.MessageArchiveService;
import eu.siacs.conversations.services.NotificationService;
import eu.siacs.conversations.ui.Activities;
+import eu.siacs.conversations.ui.BindingAdapters;
import eu.siacs.conversations.ui.ConversationFragment;
import eu.siacs.conversations.ui.ConversationsActivity;
import eu.siacs.conversations.ui.XmppActivity;
@@ -132,12 +142,14 @@ import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.xmpp.Jid;
import eu.siacs.conversations.xmpp.mam.MamReference;
import eu.siacs.conversations.xml.Element;
+import kotlin.coroutines.Continuation;
import java.net.URI;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
+import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -1126,6 +1138,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.audioPlayer = view.findViewById(R.id.audio_player);
viewHolder.link_descriptions = view.findViewById(R.id.link_descriptions);
viewHolder.thread_identicon = view.findViewById(R.id.thread_identicon);
+ viewHolder.reactions = view.findViewById(R.id.reactions);
break;
case RECEIVED:
view = activity.getLayoutInflater().inflate(R.layout.item_message_received, parent, false);
@@ -1149,6 +1162,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
viewHolder.commands_list = view.findViewById(R.id.commands_list);
viewHolder.link_descriptions = view.findViewById(R.id.link_descriptions);
viewHolder.thread_identicon = view.findViewById(R.id.thread_identicon);
+ viewHolder.reactions = view.findViewById(R.id.reactions);
break;
case STATUS:
view =
@@ -1518,6 +1532,16 @@ public class MessageAdapter extends ArrayAdapter<Message> {
CryptoHelper.encryptionTypeToText(message.getEncryption()));
}
}
+ BindingAdapters.setReactionsOnReceived(
+ viewHolder.reactions,
+ message.getAggregatedReactions(),
+ reactions -> sendReactions(message, reactions),
+ () -> addReaction(message));
+ } else if (type == SENT) {
+ BindingAdapters.setReactionsOnSent(
+ viewHolder.reactions,
+ message.getAggregatedReactions(),
+ reactions -> sendReactions(message, reactions));
}
if (type == RECEIVED || type == SENT) {
@@ -1585,6 +1609,17 @@ public class MessageAdapter extends ArrayAdapter<Message> {
return view;
}
+ private void sendReactions(final Message message, final Collection<String> reactions) {
+ if (activity.xmppConnectionService.sendReactions(message, reactions)) {
+ return;
+ }
+ Toast.makeText(activity, R.string.could_not_add_reaction, Toast.LENGTH_LONG).show();
+ }
+
+ private void addReaction(final Message message) {
+ activity.addReaction(message, reactions -> activity.xmppConnectionService.sendReactions(message,reactions));
+ }
+
private void promptOpenKeychainInstall(View view) {
activity.showInstallPgpDialog();
}
@@ -1792,6 +1827,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
protected ListView commands_list;
protected ListView link_descriptions;
protected GithubIdenticonView thread_identicon;
+ protected ChipGroup reactions;
}
class ThumbnailTask extends AsyncTask<DownloadableFile, Void, Drawable[]> {
@@ -149,7 +149,7 @@ public class UserAdapter extends ListAdapter<MucOptions.User, UserAdapter.ViewHo
final ImmutableList.Builder<Integer> viewIdBuilder = new ImmutableList.Builder<>();
for (MucOptions.Hat hat : user.getPseudoHats(viewHolder.binding.getRoot().getContext())) {
final String tag = hat.toString();
- final TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, viewHolder.binding.tags, false);
+ final TextView tv = (TextView) inflater.inflate(R.layout.item_tag, viewHolder.binding.tags, false);
tv.setText(tag);
tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(context,hat.getColor())));
final int id = ViewCompat.generateViewId();
@@ -159,7 +159,7 @@ public class UserAdapter extends ListAdapter<MucOptions.User, UserAdapter.ViewHo
}
for (MucOptions.Hat hat : user.getHats()) {
final String tag = hat.toString();
- final TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, viewHolder.binding.tags, false);
+ final TextView tv = (TextView) inflater.inflate(R.layout.item_tag, viewHolder.binding.tags, false);
tv.setText(tag);
tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(context,hat.getColor())));
final int id = ViewCompat.generateViewId();
@@ -36,24 +36,28 @@ import eu.siacs.conversations.Config;
public class WakeLockHelper {
- public static void acquire(final PowerManager.WakeLock wakeLock) {
- try {
- wakeLock.acquire(2000);
- } catch (final RuntimeException e) {
- Log.d(Config.LOGTAG, "unable to acquire wake lock", e);
- }
- }
+ public static void acquire(final PowerManager.WakeLock wakeLock) {
+ if (wakeLock == null) {
+ Log.d(Config.LOGTAG, "could not acquire WakeLock. PowerManager was null");
+ return;
+ }
+ try {
+ wakeLock.acquire(2000);
+ } catch (final RuntimeException e) {
+ Log.d(Config.LOGTAG, "Could not acquire WakeLock", e);
+ }
+ }
- public static void release(final PowerManager.WakeLock wakeLock) {
- if (wakeLock == null) {
- return;
- }
- try {
- if (wakeLock.isHeld()) {
- wakeLock.release();
- }
- } catch (final RuntimeException e) {
- Log.d(Config.LOGTAG, "unable to release wake lock", e);
- }
- }
+ public static void release(final PowerManager.WakeLock wakeLock) {
+ if (wakeLock == null) {
+ return;
+ }
+ try {
+ if (wakeLock.isHeld()) {
+ wakeLock.release();
+ }
+ } catch (final RuntimeException e) {
+ Log.d(Config.LOGTAG, "unable to release wake lock", e);
+ }
+ }
}
@@ -589,6 +589,7 @@ public class JingleFileTransferConnection extends AbstractJingleConnection
}
terminateTransport();
final State target = reasonToState(wrapper.reason);
+ // TODO check if we were already terminated
transitionOrThrow(target);
finish();
}
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:tint="?colorControlNormal"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M18,9V7h-2V2.84C14.77,2.3 13.42,2 11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12c0,-1.05 -0.17,-2.05 -0.47,-3H18zM15.5,8C16.33,8 17,8.67 17,9.5S16.33,11 15.5,11S14,10.33 14,9.5S14.67,8 15.5,8zM8.5,8C9.33,8 10,8.67 10,9.5S9.33,11 8.5,11S7,10.33 7,9.5S7.67,8 8.5,8zM12,17.5c-2.33,0 -4.31,-1.46 -5.11,-3.5h10.22C16.31,16.04 14.33,17.5 12,17.5zM22,3h2v2h-2v2h-2V5h-2V3h2V1h2V3z" />
+
+</vector>
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <RelativeLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent">
+
+ <com.google.android.material.button.MaterialButtonGroup
+ android:layout_centerInParent="true"
+
+ android:id="@+id/emojis"
+ style="@style/Widget.Material3.MaterialButtonGroup.Connected"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="?dialogPreferredPadding" />
+ </RelativeLayout>
+
+</layout>
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Button xmlns:android="http://schemas.android.com/apk/res/android"
+ style="?attr/materialButtonOutlinedStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minWidth="0dp"
+ android:paddingHorizontal="8dp"
+ android:textAppearance="?attr/textAppearanceTitleMedium" />
@@ -3,10 +3,9 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
- <RelativeLayout
- android:layout_width="fill_parent"
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
android:paddingHorizontal="8dp"
android:paddingVertical="4dp">
@@ -14,23 +13,27 @@
android:id="@+id/message_photo"
android:layout_width="48dp"
android:layout_height="48dp"
- android:layout_alignParentStart="true"
- android:layout_alignParentTop="true"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="@id/message_box"
android:layout_marginEnd="0dp"
android:scaleType="centerCrop"
app:shapeAppearance="@style/ShapeAppearanceOverlay.Photo" />
+ <!-- TODO port app:layout_constraintWidth_max="@dimen/message_bubble_max_width" from c3 -->
<LinearLayout
android:id="@+id/message_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toEndOf="@+id/message_photo"
android:background="@drawable/message_bubble_received"
android:backgroundTint="?colorTertiaryContainer"
android:longClickable="true"
android:paddingLeft="7dp"
- android:minHeight="48dp">
+ android:minHeight="48dp"
+ app:layout_constrainedWidth="true"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintStart_toEndOf="@id/message_photo"
+ app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/message_box_inner"
@@ -120,5 +123,25 @@
</com.wefika.flowlayout.FlowLayout>
</LinearLayout>
</LinearLayout>
- </RelativeLayout>
+
+ <Space
+ android:id="@+id/reactions_anchor"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_marginBottom="4dp"
+ app:layout_constraintBottom_toBottomOf="@+id/message_box"
+ app:layout_constraintStart_toStartOf="@+id/message_box" />
+
+ <com.google.android.material.chip.ChipGroup
+ android:id="@+id/reactions"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="10dp"
+ android:orientation="horizontal"
+ android:visibility="visible"
+ app:chipSpacingHorizontal="4dp"
+ app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintStart_toStartOf="@+id/message_box"
+ app:layout_constraintTop_toBottomOf="@+id/reactions_anchor" />
+ </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
@@ -2,20 +2,18 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
- <RelativeLayout
- android:layout_width="fill_parent"
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
android:paddingHorizontal="8dp"
android:paddingVertical="4dp">
-
<LinearLayout
android:id="@+id/message_photo_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_alignParentBottom="true"
+ app:layout_constraintBottom_toBottomOf="@id/message_box"
+ app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="0dp"
android:orientation="vertical">
@@ -27,18 +25,20 @@
app:shapeAppearance="@style/ShapeAppearanceOverlay.Photo" />
</LinearLayout>
-
<LinearLayout
android:id="@+id/message_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toStartOf="@+id/message_photo_box"
android:background="@drawable/message_bubble_sent"
android:backgroundTint="?colorSecondaryContainer"
android:longClickable="true"
+ android:minHeight="48dp"
android:paddingRight="7dp"
- android:minHeight="48dp">
+ app:layout_constrainedWidth="true"
+ app:layout_constraintEnd_toStartOf="@id/message_photo_box"
+ app:layout_constraintHorizontal_bias="1.0"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/message_box_inner"
@@ -130,5 +130,26 @@
</com.wefika.flowlayout.FlowLayout>
</LinearLayout>
</LinearLayout>
- </RelativeLayout>
+
+ <Space
+ android:id="@+id/reactions_anchor"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_marginBottom="4dp"
+ app:layout_constraintBottom_toBottomOf="@+id/message_box"
+ app:layout_constraintEnd_toEndOf="@+id/message_box" />
+
+ <com.google.android.material.chip.ChipGroup
+ android:id="@+id/reactions"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="10dp"
+ android:orientation="horizontal"
+ android:visibility="visible"
+ app:chipSpacingHorizontal="4dp"
+ app:layout_constraintEnd_toEndOf="@+id/message_box"
+ app:layout_constraintHorizontal_bias="0.0"
+ app:layout_constraintTop_toBottomOf="@+id/reactions_anchor" />
+
+ </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
@@ -1,6 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:id="@+id/action_add_reaction"
+ android:title="@string/add_reaction"
+ android:visible="false" />
+
<item
android:id="@+id/action_report_and_block"
android:title="@string/report_spam"
@@ -1089,4 +1089,6 @@
<string name="server_info_bind2">XEP-0386: Bind 2</string>
<string name="server_info_sasl2">XEP-0388: Extensible SASL Profile</string>
<string name="server_info_login_mechanism">Anmeldeverfahren</string>
+ <string name="could_not_add_reaction">Reaktion konnte nicht hinzugefügt werden</string>
+ <string name="add_reaction">Reaktion hinzufügen…</string>
</resources>
@@ -1,2 +1,131 @@
<?xml version="1.0" encoding="utf-8"?>
-<resources></resources>
+<resources>
+ <string name="action_settings">Seadistused</string>
+ <string name="action_edit_contact">Muuda nime</string>
+ <string name="action_add_phone_book">Lisa aadressiraamatusse</string>
+ <string name="title_activity_choose_contacts">Vali kontaktid</string>
+ <string name="minute_ago">1 minut tagasi</string>
+ <string name="action_contact_details">Kontaktandmed</string>
+ <string name="action_muc_details">Rühmavestluse üksikasjad</string>
+ <string name="channel_details">Kanali teave</string>
+ <string name="action_delete_contact">Kustuta serveri kontaktiloendist</string>
+ <string name="action_block_contact">Blokeeri kontakt</string>
+ <string name="action_accounts">Halda kasutajakontosid</string>
+ <string name="action_block_domain">Blokeeri domeen</string>
+ <string name="visitor">Külaline</string>
+ <string name="action_add_account">Lisa konto</string>
+ <string name="action_unblock_domain">Eemalda domeeni blokeering</string>
+ <string name="action_block_participant">Blokeeri osaleja</string>
+ <string name="title_activity_share_via_account">Jaga kasutajakontoga</string>
+ <string name="minutes_ago">%d minutit tagasi</string>
+ <string name="sending">saadame…</string>
+ <string name="owner">Omanik</string>
+ <string name="moderator">Moderaator</string>
+ <string name="participant">Osaleja</string>
+ <string name="action_account">Halda kasutajakontot</string>
+ <string name="action_archive_chat">Arhiveeri vestlus</string>
+ <string name="action_unblock_contact">Eemalda kontakti blokeering</string>
+ <string name="action_unblock_participant">Eemalda osaleja blokeering</string>
+ <string name="title_activity_manage_accounts">Halda kasutajakontosid</string>
+ <string name="title_activity_settings">Seadistused</string>
+ <string name="title_activity_share_with">Jaga…</string>
+ <string name="title_activity_choose_contact">Vali kontakt</string>
+ <string name="title_activity_block_list">Blokeeringute loend</string>
+ <string name="title_activity_new_chat">Uus vestlus</string>
+ <string name="just_now">just nüüd</string>
+ <string name="message_decrypting">Dekrüptime sõnumit. Palun oota…</string>
+ <string name="pgp_message">OpenPGP abil krüptitud sõnum</string>
+ <string name="nick_in_use">Hüüdnimi on juba kasutusel</string>
+ <string name="invalid_muc_nick">Vigane hüüdnimi</string>
+ <string name="admin">Peakasutaja</string>
+ <plurals name="x_unread_conversations">
+ <item quantity="one">%d lugemata vestlus</item>
+ <item quantity="other">%d lugemata vestlust</item>
+ </plurals>
+ <string name="unblock_contact_text">Kas sa soovid, et kasutaja %s blokeering oleks eemaldatud ja ta saaks sulle sõnumeid saata?</string>
+ <string name="block_domain_text">Kas soovid blokeerida kõik kasutajad domeenist %s?</string>
+ <string name="unblock_domain_text">Kas soovid eemaldada blokeeringu kõikidelt kasutajatelt domeenist %s?</string>
+ <string name="blocked">Blokeeritud</string>
+ <string name="remove_bookmark">Kas sa soovid eemaldada %s järjehoidja?</string>
+ <string name="register_account">Registreeri serveris uues kasutajakonto</string>
+ <string name="change_password_on_server">Muuda salasõna serveris</string>
+ <string name="share_with">Jaga…</string>
+ <string name="invite_contact">Saada kutse kasutajale</string>
+ <string name="invite">Kutsu</string>
+ <string name="contacts">Kontaktid</string>
+ <string name="contact">Kontakt</string>
+ <string name="cancel">Katkesta</string>
+ <string name="set">Seadista</string>
+ <string name="add">Lisa</string>
+ <string name="edit">Muuda</string>
+ <string name="delete">Kustuta</string>
+ <string name="block">Blokeeri</string>
+ <string name="unblock">Eemalda blokeering</string>
+ <string name="save">Salvesta</string>
+ <string name="ok">Sobib</string>
+ <string name="crash_report_title">%1$s on kokku jooksnud</string>
+ <string name="crash_report_message">Kui kasutad oma XMPP kontot ja saadad meile oma nutiseadme pinujälje, siis aitad meid %1$s rakenduse arendamisel.</string>
+ <string name="send_now">Saada nüüd</string>
+ <string name="send_never">Ära küsi enam kunagi</string>
+ <string name="problem_connecting_to_account">Kasutajakontoga ei saanud ühendust</string>
+ <string name="problem_connecting_to_accounts">Mitme kasutajakontoga ei saanud ühendust</string>
+ <string name="touch_to_fix">Kasutajakontode kaldamiseks klõpsi</string>
+ <string name="not_in_roster">Kas soovid selle puuduva kontakti oma kontaktide loendisse lisada?</string>
+ <string name="add_contact">Lisa kontakt</string>
+ <string name="preparing_image">Valmistume pildi saatmiseks</string>
+ <string name="preparing_images">Valmistume piltide saatmiseks</string>
+ <string name="sharing_files_please_wait">Jagame faile. Palun oota…</string>
+ <string name="action_clear_history">Tühjenda ajalugu</string>
+ <string name="clear_conversation_history">Tühjenda vestluse ajalugu</string>
+ <string name="clear_histor_msg">Kas sa soovid eemaldada kõik selle vestluse sõnumid?
+\n
+\n<b>Hoiatus:</b> See ei mõjuta muudes seadmetes ja serverites salvestatud samade sõnumite koopiaid.</string>
+ <string name="delete_file_dialog">Kustuta fail</string>
+ <string name="delete_file_dialog_msg">Kas sa soovid selle faili?
+\n
+\n<b>Hoiatus:</b> See ei mõjuta muudes seadmetes ja serverites salvestatud sama faili koopiaid. </string>
+ <string name="archive_this_chat">Kustuta vestus hiljem</string>
+ <string name="choose_presence">Vali seade</string>
+ <string name="send_unencrypted_message">Saada sõnum krüptimata tekstina</string>
+ <string name="send_message">Saada sõnum</string>
+ <string name="send_message_to_x">Saada sõnum kasutajale %s</string>
+ <string name="send_encrypted_message">Saada krüptitud sõnum</string>
+ <string name="send_omemo_x509_message">Saada v\\OMEMO-krüptitud sõnum</string>
+ <string name="your_nick_has_been_changed">Uus hüüdnimi on juba kasutusel</string>
+ <string name="send_unencrypted">Saada sõnum krüptimata tekstina</string>
+ <string name="decryption_failed">Dekrüptimine ei õnnestunud. Võib-olla pole sul õiget privaatvõtit.</string>
+ <string name="openkeychain_required">OpenKeychain</string>
+ <string name="pref_general">Üldist</string>
+ <string name="pref_accept_files">Failide vastuvõtmine</string>
+ <string name="pref_accept_files_summary">Võta automaatselt vastu failid, mis on väiksemad kui…</string>
+ <string name="pref_attachments">Manused</string>
+ <string name="pref_notification_settings">Teavitus</string>
+ <string name="pref_led">LRD-märgutuli</string>
+ <string name="pref_led_summary">Sõnumi saabumisel vilguta LED-märgutuld</string>
+ <string name="pref_ringtone">Helin</string>
+ <string name="pref_notification_sound">Teavituse heli</string>
+ <string name="pref_notification_sound_summary">Uute sõnumite märguhelin</string>
+ <string name="pref_call_ringtone_summary">Saabuvate kõnede helin</string>
+ <string name="pref_vibrate">Värinaalarm</string>
+ <string name="pref_vibrate_summary">Anna uuest sõnumit märku värinaalarmiga</string>
+ <string name="remove_contact_text">Kas sa soovid %s eemaldada oma kontaktide loendist? Selle toiminguga ei eemaldata temaga peetud vestlust.</string>
+ <string name="contact_blocked">Kontakt on blokeeritud</string>
+ <string name="remove_bookmark_and_close">Kas sa soovid eemaldada %s järjehoidja ja selle vestluse arhiveerida?</string>
+ <string name="attach_file">Lisa fail</string>
+ <string name="block_contact_text">Kas sa soovid, et kasutaja %s oleks blokeeritud ega saaks sulle sõnumeid saata?</string>
+ <string name="send_failed">kohaletoimetamine ei õnnestunud</string>
+ <string name="openkeychain_required_long">%1$s kasutab sõnumite krüptimiseks ja dekrüptimiseks ning sinu avalike võtmete haldamiseks rakendust <b>OpenKeychain</b>.<br><br>Ta on litsentseeritud GPLv3+ alusel ning leidub nii F-Droidi kui Google Play rakendustepoodides.<br><br><small>(Palun käivita %1$s hiljem uuesti.)</small></string>
+ <string name="restart">Käivita uuesti</string>
+ <string name="install">Paigalda</string>
+ <string name="openkeychain_not_installed">Palun paigalda rakendus OpenKeychain</string>
+ <string name="offering">pakume…</string>
+ <string name="waiting">ootame…</string>
+ <string name="no_pgp_key">OpenPGP võtit ei leidu</string>
+ <string name="contact_has_no_pgp_key">Kuna sõnumi saaja pole avaldanud oma avalikku võtit, siis sinu sõnumi krüptimine ei õnnestu.
+\n
+\n<small>Palu, et ta seadistaks OpenPGP.</small></string>
+ <string name="no_pgp_keys">OpenPGP võtmeid ei leidu</string>
+ <string name="contacts_have_no_pgp_keys">Kuna sõnumi saajad pole avaldanud oma avalikke võtmeid, siis sinu sõnumi krüptimine ei õnnestu.
+\n
+\n<small>Palu, et nad seadistaks OpenPGP.</small></string>
+</resources>
@@ -1091,4 +1091,6 @@
<string name="server_info_sasl2">XEP-0388: Extensible SASL Profile</string>
<string name="server_info_login_mechanism">Método de acceso</string>
<string name="server_info_bind2">XEP-0386: Bind 2</string>
+ <string name="could_not_add_reaction">Non se puido engadir a reacción</string>
+ <string name="add_reaction">Engadir reacción…</string>
</resources>
@@ -1105,4 +1105,6 @@
<string name="server_info_sasl2">XEP-0388: Extensible SASL Profile</string>
<string name="server_info_login_mechanism">Inlogmethode</string>
<string name="server_info_bind2">XEP-0386: Bind 2</string>
+ <string name="add_reaction">Reactie toevoegen…</string>
+ <string name="could_not_add_reaction">Kan reactie niet toevoegen</string>
</resources>
@@ -40,7 +40,7 @@
<string name="moderator">Moderador</string>
<string name="participant">Participante</string>
<string name="visitor">Visitante</string>
- <string name="remove_contact_text">Gostaria de remover %s da sua lista de contatos? O chat com este contato não será removido.</string>
+ <string name="remove_contact_text">Gostaria de remover %s da sua lista de contatos? A conversa com este contato não será removida.</string>
<string name="block_contact_text">Deseja bloquear o recebimento de mensagens de %s?</string>
<string name="unblock_contact_text">Deseja desbloquear o recebimento de mensagens de %s?</string>
<string name="block_domain_text">Bloquear todos os contatos de %s?</string>
@@ -78,9 +78,9 @@
<string name="preparing_images">Preparando para enviar as imagens</string>
<string name="sharing_files_please_wait">Compartilhando arquivos. Por favor, aguarde…</string>
<string name="action_clear_history">Limpar o histórico</string>
- <string name="clear_conversation_history">Limpar histórico do chat</string>
- <string name="clear_histor_msg">Deseja excluir todas as mensagens dessa conversa?
-\n
+ <string name="clear_conversation_history">Limpar histórico da conversa</string>
+ <string name="clear_histor_msg">Deseja excluir todas as mensagens desta conversa?
+\n
\n<b>Atenção:</b> Isso não afetará mensagens armazenadas em outros dispositivos ou servidores.</string>
<string name="delete_file_dialog">Excluir arquivo</string>
<string name="delete_file_dialog_msg">Deseja realmente excluir este arquivo?
@@ -179,7 +179,7 @@
<string name="unpublish_pgp_message">Tem certeza que deseja remover sua chave pública OpenPGP do seu anúncio de presença?\nSeus contatos não poderão mais enviar mensagens criptografadas com o OpenPGP para você.</string>
<string name="openpgp_has_been_published">A chave pública do OpenPGP foi publicada.</string>
<string name="mgmt_account_enable">Habilitar a conta</string>
- <string name="mgmt_account_delete_confirm_text">Tem certeza de que deseja excluir sua conta? Excluir sua conta apaga todo o seu histórico do chat</string>
+ <string name="mgmt_account_delete_confirm_text">Tem certeza de que deseja excluir sua conta? Excluir sua conta apaga todo o seu histórico de conversa</string>
<string name="attach_record_voice">Gravar voz</string>
<string name="account_settings_jabber_id">Endereço XMPP</string>
<string name="block_jabber_id">Bloquear endereço XMPP</string>
@@ -235,9 +235,11 @@
<string name="channel_bare_jid_example">canal@conferencia.exemplo.com</string>
<string name="save_as_bookmark">Salvar como favorito</string>
<string name="delete_bookmark">Excluir o favorito</string>
- <string name="destroy_room">Destruir a conversa em grupo</string>
+ <string name="destroy_room">Destruir conversa em grupo</string>
<string name="destroy_channel">Destruir o canal</string>
- <string name="destroy_room_dialog">Deseja realmente destruir essa conversa em grupo?\n\n<b>Atenção:</b> A conversa em grupo será completamente removida do servidor.</string>
+ <string name="destroy_room_dialog">Deseja realmente destruir esta conversa em grupo?
+\n
+\n<b>Atenção:</b> A conversa em grupo será completamente removida do servidor.</string>
<string name="destroy_channel_dialog">Tem certeza que deseja destruir esse canal público?\n\n<b>Atenção:</b> O canal será removido completamente do servidor.</string>
<string name="could_not_destroy_room">Não foi possível destruir a conversa em grupo</string>
<string name="could_not_destroy_channel">Não foi possível destruir o canal</string>
@@ -269,11 +271,11 @@
<string name="skip">Pular</string>
<string name="disable_notifications">Desabilitar notificações</string>
<string name="enable">Habilitar</string>
- <string name="conference_requires_password">Essa conversa em grupo exige uma senha</string>
+ <string name="conference_requires_password">Esta conversa em grupo exige uma senha</string>
<string name="enter_password">Digite a senha</string>
<string name="request_presence_updates">Por favor, primeiro solicite atualizações de presença do seu contato.
\n
-\n<small>Isso determinará qual cliente de chat o seu contato está usando</small>.</string>
+\n<small>Isso determinará qual app de conversa o seu contato está usando</small>.</string>
<string name="request_now">Solicitar agora</string>
<string name="ignore">Ignorar</string>
<string name="without_mutual_presence_updates"><b>Aviso:</b> Enviar isso sem atualizações mútuas de presença pode provocar problemas inesperados.\n\n<small>Verifique nos detalhes do contato suas inscrições de presença.</small></string>
@@ -293,12 +295,12 @@
<string name="pref_autojoin_summary">Define a flag \"autojoin\" ao entrar ou sair de uma sala e reage a modificações feitas por outros clientes.</string>
<string name="toast_message_omemo_fingerprint">Impressão digital OMEMO copiada para a área de transferência</string>
<string name="conference_banned">Você foi banido desta conversa em grupo</string>
- <string name="conference_members_only">Somente membros podem entrar nessa conversa em grupo</string>
+ <string name="conference_members_only">Esta conversa em grupo é somente para membros</string>
<string name="conference_resource_constraint">Restrição de recursos</string>
<string name="conference_kicked">Você foi retirado desta conversa em grupo</string>
<string name="conference_shutdown">A conversa em grupo foi encerrada</string>
<string name="conference_unknown_error">Você não está mais nesta conversa em grupo</string>
- <string name="conference_technical_problems">Você saiu desta conversa em grupo devido a razões técnicas</string>
+ <string name="conference_technical_problems">Você saiu desta conversa em grupo devido à razões técnicas</string>
<string name="using_account">usando a conta %s</string>
<string name="hosted_on">hospedado em %s</string>
<string name="checking_x">Verificando %s no host HTTP</string>
@@ -350,7 +352,7 @@
<string name="pref_show_dynamic_tags">Rótulos dinâmicos</string>
<string name="pref_show_dynamic_tags_summary">Exibe rótulos de somente-leitura abaixo dos contatos</string>
<string name="enable_notifications">Habilitar notificações</string>
- <string name="no_conference_server_found">Não foi encontrado nenhum servidor de conversas em grupo</string>
+ <string name="no_conference_server_found">Nenhum servidor de conversas em grupo encontrado</string>
<string name="conference_creation_failed">Não foi possível criar a conversa em grupo</string>
<string name="account_image_description">Avatar da conta</string>
<string name="copy_omemo_clipboard_description">Copiar a impressão digital OMEMO para a área de transferência</string>
@@ -431,7 +433,7 @@
<string name="show_location">Exibir localização</string>
<string name="no_application_found_to_display_location">Não foi encontrado nenhum aplicativo para exibir a localização</string>
<string name="location">Localização</string>
- <string name="title_undo_swipe_out_group_chat">Deixar a conversa em grupo privada</string>
+ <string name="title_undo_swipe_out_group_chat">Sair da conversa em grupo privada</string>
<string name="title_undo_swipe_out_channel">Deixar o canal público</string>
<string name="pref_dont_trust_system_cas_title">Não confiar nas CAs do sistema</string>
<string name="pref_dont_trust_system_cas_summary">Todos os certificados devem ser aprovados manualmente</string>
@@ -465,7 +467,7 @@
<string name="account_status_bind_failure">Falha na associação</string>
<string name="account_status_host_unknown">O servidor não responde por esse domínio</string>
<string name="server_info_broken">Quebrado</string>
- <string name="pref_presence_settings">Dispôr</string>
+ <string name="pref_presence_settings">Disponibilidade</string>
<string name="pref_away_when_screen_off">\"Afastado\" quando o dispositivo estiver travado</string>
<string name="pref_away_when_screen_off_summary">Exibe como Afastado quando o dispositivo estiver travado</string>
<string name="pref_dnd_on_silent_mode">\"Ocupado\" no modo silencioso</string>
@@ -533,7 +535,7 @@
<string name="this_field_is_required">Este campo é necessário</string>
<string name="correct_message">Corrigir</string>
<string name="send_corrected_message">Enviar a mensagem corrigida</string>
- <string name="no_keys_just_confirm">Você já confiou na impressão digital desse contato. Ao selecionar \"Concluído\" você está apenas confirmando que %s é parte deste chat em grupo.</string>
+ <string name="no_keys_just_confirm">Você já confiou na impressão digital desse contato. Ao selecionar \"Concluído\" você está apenas confirmando que %s é parte desta conversa em grupo.</string>
<string name="this_account_is_disabled">Você desabilitou essa conta</string>
<string name="security_error_invalid_file_access">Erro de segurança: Acesso inválido ao arquivo!</string>
<string name="no_application_to_share_uri">Não foi encontrado nenhum aplicativo para compartilhar a URI</string>
@@ -545,8 +547,8 @@
<string name="create_account">Criar conta</string>
<string name="use_own_provider">Usar meu próprio provedor</string>
<string name="pick_your_username">Selecione seu nome de usuário</string>
- <string name="pref_manually_change_presence">Gerenciar o dispôr a dedo</string>
- <string name="pref_manually_change_presence_summary">Defina seu dispôr ao editar a sua mensagem de estado.</string>
+ <string name="pref_manually_change_presence">Gerenciar a disponibilidade manualmente</string>
+ <string name="pref_manually_change_presence_summary">Defina sua disponibilidade ao editar a sua mensagem de status.</string>
<string name="status_message">Mensagem de status</string>
<string name="presence_chat">Livre para conversar</string>
<string name="presence_online">Conectado</string>
@@ -704,14 +706,14 @@
<string name="error_trustkey_device_list">Não foi possível obter a lista de dispositivos</string>
<string name="error_trustkey_bundle">Não foi possível obter as chaves de criptografia</string>
<string name="error_trustkey_hint_mutual">Dica: Em alguns casos isso pode ser resolvido adicionando-se um ao outro na lista de contatos.</string>
- <string name="disable_encryption_message">Tem certeza que deseja desabilitar a criptografia OMEMO neste chat?
+ <string name="disable_encryption_message">Tem certeza que deseja desativar a criptografia OMEMO para esta conversa?
\nIsso permitirá que o administrador do seu servidor seja capaz de ler suas mensagens. Por outro lado, pode ser a única forma de se comunicar com pessoas usando clientes desatualizados.</string>
<string name="disable_now">Desabilitar agora</string>
<string name="draft">Rascunho:</string>
<string name="pref_omemo_setting">Criptografia OMEMO</string>
<string name="pref_omemo_setting_summary_always">OMEMO será sempre utilizado em conversas um-para-um e de grupos privados.</string>
- <string name="pref_omemo_setting_summary_default_on">OMEMO será utilizado por padrão em novos chats.</string>
- <string name="pref_omemo_setting_summary_default_off">OMEMO deverá ser explicitamente ativado para novos chats.</string>
+ <string name="pref_omemo_setting_summary_default_on">OMEMO será utilizado por padrão em novas conversas.</string>
+ <string name="pref_omemo_setting_summary_default_off">OMEMO deverá ser explicitamente ativado para novas conversas.</string>
<string name="create_shortcut">Criar atalho</string>
<string name="default_on">Ligado por padrão</string>
<string name="default_off">Desligado por padrão</string>
@@ -732,14 +734,14 @@
<string name="no_microphone_permission">Permita o acesso do %1$s ao microfone</string>
<string name="search_messages">Pesquisar mensagens</string>
<string name="gif">GIF</string>
- <string name="view_conversation">Visualizar chat</string>
+ <string name="view_conversation">Visualizar conversa</string>
<string name="pref_use_share_location_plugin">Plugin de Compartilhamento de Localização</string>
<string name="pref_use_share_location_plugin_summary">Usar o Plugin de Compartilhamento de Localização ao invés do mapa integrado</string>
<string name="copy_link">Copiar endereço web</string>
<string name="copy_jabber_id">Copiar endereço XMPP</string>
<string name="p1_s3_filetransfer">Compartilhamento de arquivos via HTTP para S3</string>
<string name="pref_start_search">Pesquisa direta</string>
- <string name="pref_start_search_summary">Na tela \"Novo chat\", abra o teclado e coloque o cursor no campo de pesquisa</string>
+ <string name="pref_start_search_summary">Na tela \"Nova conversa\", abra o teclado e coloque o cursor no campo de pesquisa</string>
<string name="group_chat_avatar">Avatar de conversa em grupo</string>
<string name="host_does_not_support_group_chat_avatars">O host não suporta avatares de conversa em grupo</string>
<string name="only_the_owner_can_change_group_chat_avatar">Somente o proprietário pode alterar o avatar da conversa em grupo</string>
@@ -953,8 +955,8 @@
<string name="remove_from_favorites">Desafixar do topo</string>
<string name="gpx_track">Trilha GPX</string>
<string name="could_not_correct_message">Não foi possível corrigir a mensagem</string>
- <string name="search_all_conversations">Todos os chats</string>
- <string name="search_this_conversation">Este chat</string>
+ <string name="search_all_conversations">Todos as conversas</string>
+ <string name="search_this_conversation">Esta conversa</string>
<string name="your_avatar">Seu avatar</string>
<string name="avatar_for_x">Avatar para %s</string>
<string name="encrypted_with_omemo">Criptografada com OMEMO</string>
@@ -994,10 +996,10 @@
<string name="reject_switch_to_video">Recusar requisição de mudança para vídeo</string>
<string name="pref_send_crash_reports">Enviar relatórios de erro</string>
<string name="remove_bookmark_and_close">Gostaria de remover o favorito de %s e arquivar a conversa?</string>
- <string name="archive_this_chat">Exclua o chat depois</string>
+ <string name="archive_this_chat">Exclua esta conversa depois</string>
<string name="title_activity_share_with">Compartilhar com…</string>
<string name="action_archive_chat">Arquivar conversa</string>
- <string name="title_activity_new_chat">Novo chat</string>
+ <string name="title_activity_new_chat">Nova conversa</string>
<string name="send_encrypted_message">Enviar mensagem criptografada</string>
<string name="account_state_logged_out">Desconectado</string>
<string name="remove_bookmark">Gostaria de remover o favorito de %s?</string>
@@ -1006,11 +1008,11 @@
<string name="contact_uses_unverified_keys">Seu contato tem dispositivos não verificados. Escaneie o Código QR dele para fazer uma verificação e impedir ataques MITM.</string>
<string name="log_out">Sair</string>
<string name="unverified_devices">Você está usando dispositivos não verificados. Escaneie o Código QR em outro dispositivo para fazer a verificação, e impedir ataques MITM.</string>
- <string name="switch_to_chat">Trocar para o chat</string>
+ <string name="switch_to_chat">Trocar para conversa</string>
<string name="pref_title_interface">Interface</string>
<string name="pref_summary_appearance">Tema, Cores, Capturas de tela, Entrada</string>
<string name="pref_title_security">Segurança</string>
- <string name="pref_summary_security">Encriptação E2E, Confiar cegamente antes da verificação, Detecção de MITM</string>
+ <string name="pref_summary_security">Criptografia de ponta-a-ponta, confiança cega antes da verificação, detecção de MITM</string>
<string name="notifications">Notificações</string>
<string name="pref_attachments_summary">Tamanho do arquivo, Compressão de imagem, Qualidade de vídeo</string>
<string name="pref_title_trust_system_ca_store_summary">Confiar nos certificados CA do sistema</string>
@@ -1023,7 +1025,7 @@
<string name="report_spam">Reportar spam</string>
<string name="report_spam_and_block">Reportar e bloquear o spammer</string>
<string name="call_integration_not_available">A integração de chamada não está disponível!</string>
- <string name="start_chat">Iniciar chat</string>
+ <string name="start_chat">Iniciar conversa</string>
<string name="no_certificate_selected">Nenhum certificado de cliente selecionado!</string>
<string name="pref_category_sending">Enviando</string>
<string name="pref_category_receiving">Recebendo</string>
@@ -1041,7 +1043,7 @@
<string name="pref_title_trust_system_ca_store">Autoridades de certificação</string>
<string name="hide_notification">Esconder notificação</string>
<string name="pref_up_long_summary">Ao atuar como um distribuidor UnifiedPush, a conexão persistente, estável, e amigável à bateria do XMPP será usada para alertar outros apps compatíveis com o UnifiedPush, como o Tusky, Ltt.RS, FluffyChat, e mais.</string>
- <string name="corresponding_chats_closed">Chats correspondentes arquivados.</string>
+ <string name="corresponding_chats_closed">Conversas correspondentes arquivadas.</string>
<string name="restore_warning_continued">Não tente restaurar backups que você não criou!</string>
<string name="rtp_state_contact_offline">O contato não está disponível</string>
<string name="video_is_enabled_tap_to_disable">O vídeo está ativado. Toque para desativar.</string>
@@ -1052,11 +1054,11 @@
<string name="pref_create_backup_one_off_summary">Criar um único backup</string>
<string name="audiobook">Audiobook</string>
<string name="this_account_is_logged_out">Você desconectou desta conta</string>
- <string name="pref_use_colorful_bubbles">Bolhas de chat coloridas</string>
+ <string name="pref_use_colorful_bubbles">Bolhas de conversa coloridas</string>
<string name="pref_use_colorful_bubbles_summary">Cores de fundo distintas para mensagens enviadas e recebidas</string>
<string name="pref_accept_invites_from_strangers">Convites de estranhos</string>
- <string name="pref_accept_invites_from_strangers_summary">Aceitar convites de estranhos para chat em grupo</string>
- <string name="title_undo_swipe_out_chat">Chat arquivado</string>
+ <string name="pref_accept_invites_from_strangers_summary">Aceitar convites de estranhos para conversas em grupo</string>
+ <string name="title_undo_swipe_out_chat">Conversa arquivada</string>
<string name="pref_large_font">Texto grande</string>
<string name="pref_large_font_summary">Aumentar o tamanho do texto em bolhas de mensagem</string>
<string name="your_avatar_tap_to_select_new_avatar">Seu avatar. Toque para selecionar um novo avatar da galeria.</string>
@@ -1066,12 +1068,12 @@
<string name="video_is_disabled_tap_to_enable">O vídeo está desativado. Toque para ativar.</string>
<string name="server_info_bind2">XEP-0386: Vinculação 2</string>
<string name="server_info_sasl2">XEP-0388: Perfil SASL extensível</string>
- <string name="group_chats">Chats em grupo</string>
- <string name="search_group_chats">Pesquisar chats em grupo</string>
+ <string name="group_chats">Conversas em grupo</string>
+ <string name="search_group_chats">Pesquisar conversas em grupo</string>
<string name="quicksy_wants_your_consent">O Quicksy pede seu consentimento ao usar seus dados</string>
<string name="reconnect_on_other_host">Reconectar em outro host</string>
<string name="no_permission_to_place_call">Sem permissão para fazer uma ligação</string>
- <string name="barcode_does_not_contain_fingerprints_for_this_chat">Este código de barras não contém impressões digitais para este chat.</string>
+ <string name="barcode_does_not_contain_fingerprints_for_this_chat">Este código de barras não contém impressões digitais para esta conversa.</string>
<string name="pref_dynamic_colors">Cores dinâmicas</string>
<string name="pref_dynamic_colors_summary">Cores do sistema (Material You)</string>
<string name="outdated_backup_file_format">Você está tentando importar um backup com um formato desatualizado</string>
@@ -1101,7 +1103,7 @@
<string name="pref_allow_screenshots_summary">Mostrar o conteúdo do app no alternador de apps e permitir que a tela seja capturada</string>
<string name="detect_mim">Exigir vínculo do canal</string>
<string name="detect_mim_summary">A vinculação de canal pode detectar alguns ataques de máquina-no-meio</string>
- <string name="pref_privacy_summary">Notificações de digitação, Visto por último, Dispôr</string>
+ <string name="pref_privacy_summary">Notificações de digitação, Visto por Último, Disponibilidade</string>
<string name="pref_connection_summary">Nome do host e porta, Tor</string>
<string name="pref_connection_summary_w_cd">Nome do host e porta, Tor, Descoberta de Canais</string>
<string name="pref_keyboard_options">Teclado</string>
@@ -1106,4 +1106,6 @@
<string name="server_info_bind2">XEP-0386: Bind 2</string>
<string name="server_info_sasl2">XEP-0388: Profil SASL extensibil</string>
<string name="server_info_login_mechanism">Mecanism autentificare</string>
+ <string name="add_reaction">Adaugă reacție…</string>
+ <string name="could_not_add_reaction">Nu s-a putut adăuga o reacție</string>
</resources>
@@ -6,8 +6,8 @@
<string name="action_contact_details">Сведения о контакте</string>
<string name="action_muc_details">Подробности конференции</string>
<string name="channel_details">Сведения о канале</string>
- <string name="action_add_account">Добавить учётную запись</string>
- <string name="action_edit_contact">Редактировать контакт</string>
+ <string name="action_add_account">Добавить аккаунт</string>
+ <string name="action_edit_contact">Изменить контакт</string>
<string name="action_add_phone_book">Добавить в адресную книгу</string>
<string name="action_delete_contact">Удалить из списка</string>
<string name="action_block_contact">Заблокировать контакт</string>
@@ -27,28 +27,28 @@
<string name="minutes_ago">%d мин. назад</string>
<plurals name="x_unread_conversations">
<item quantity="one">%d непрочитанная беседа</item>
- <item quantity="few">%d непрочитанные беседы</item>
+ <item quantity="few">%d непрочитанных беседы</item>
<item quantity="many">%d непрочитанных бесед</item>
<item quantity="other">%d непрочитанных бесед</item>
</plurals>
<string name="sending">отправка…</string>
<string name="message_decrypting">Расшифровка сообщения. Подождите…</string>
- <string name="pgp_message">OpenPGP зашифр. сообщение</string>
+ <string name="pgp_message">Зашифрованное OpenPGP сообщение</string>
<string name="nick_in_use">Имя уже используется</string>
- <string name="invalid_muc_nick">Некорректный никнейм</string>
+ <string name="invalid_muc_nick">Н имя</string>
<string name="admin">Администратор</string>
<string name="owner">Владелец</string>
<string name="moderator">Модератор</string>
<string name="participant">Участник</string>
<string name="visitor">Посетитель</string>
- <string name="remove_contact_text">Вы хотите удалить %s из своего списка контактов? Чат с этим контактом удалён не будет.</string>
- <string name="block_contact_text">Вы хотите заблокировать дальнейшие сообщения от %s?</string>
- <string name="unblock_contact_text">Вы хотите разблокировать пользователя %s?</string>
+ <string name="remove_contact_text">Удалить %s из своего списка контактов? Чат с этим контактом удалён не будет.</string>
+ <string name="block_contact_text">Заблокировать дальнейшие сообщения от %s?</string>
+ <string name="unblock_contact_text">Разблокировать пользователя %s?</string>
<string name="block_domain_text">Заблокировать всех пользователей домена %s?</string>
<string name="unblock_domain_text">Разблокировать всех пользователей домена %s?</string>
<string name="contact_blocked">Контакт заблокирован</string>
<string name="blocked">Заблокирован</string>
- <string name="register_account">Создать новую учётную запись на сервере</string>
+ <string name="register_account">Создать новый аккаунт на сервере</string>
<string name="change_password_on_server">Изменить пароль на сервере</string>
<string name="share_with">Поделиться с…</string>
<string name="invite_contact">Пригласить контакт</string>
@@ -58,7 +58,7 @@
<string name="cancel">Отмена</string>
<string name="set">Установить</string>
<string name="add">Добавить</string>
- <string name="edit">Редактировать</string>
+ <string name="edit">Изменить</string>
<string name="delete">Удалить</string>
<string name="block">Заблокировать</string>
<string name="unblock">Разблокировать</string>
@@ -68,72 +68,76 @@
<string name="crash_report_message">Отправляя отчёты об ошибках, вы помогаете совершенствованию %1$s.</string>
<string name="send_now">Отправить сейчас</string>
<string name="send_never">Больше не спрашивать</string>
- <string name="problem_connecting_to_account">Не удалось подключиться к учетной записи</string>
- <string name="problem_connecting_to_accounts">Не удалось подключиться к учетным записям</string>
- <string name="touch_to_fix">Нажмите, чтобы настроить учетные записи</string>
+ <string name="problem_connecting_to_account">Невозможно подключиться к аккаунту</string>
+ <string name="problem_connecting_to_accounts">Невозможно подключиться к аккаунтам</string>
+ <string name="touch_to_fix">Нажмите, чтобы настроить аккаунт</string>
<string name="attach_file">Прикрепить файл</string>
- <string name="not_in_roster">Контакт не находится в вашем списке контактов. Хотите добавить его?</string>
+ <string name="not_in_roster">Контакт не находится в вашем списке контактов. Добавить его?</string>
<string name="add_contact">Добавить контакт</string>
- <string name="send_failed">доставка не удалась</string>
+ <string name="send_failed">доставка не выполнена</string>
<string name="preparing_image">Подготовка к передаче изображения</string>
<string name="preparing_images">Подготовка к передаче изображений</string>
- <string name="sharing_files_please_wait">Обмен файлами. Пожалуйста, подождите…</string>
+ <string name="sharing_files_please_wait">Обмен файлами. Подождите…</string>
<string name="action_clear_history">Очистить историю</string>
<string name="clear_conversation_history">Очистить историю чата</string>
- <string name="clear_histor_msg">Вы хотите удалить все сообщения в этой беседе?
-\n
-\n<b>Внимание:</b> Данная операция не повлияет на сообщения, хранящиеся на других устройствах или серверах.</string>
+ <string name="clear_histor_msg">Удалить все сообщения в этой беседе?
+\n
+\n<b>Внимание:</b> данная операция не повлияет на сообщения, хранящиеся на других устройствах или серверах.</string>
<string name="delete_file_dialog">Удалить файл</string>
- <string name="delete_file_dialog_msg">Вы уверены, что хотите удалить этот файл?
-\n
-\n<b>Предупреждение:</b> Данная операция не удалит копии этого файла, хранящиеся на других устройствах или серверах. </string>
+ <string name="delete_file_dialog_msg">Удалить этот файл?
+\n
+\n<b>Предупреждение:</b> данная операция не удалит копии файла, хранящиеся на других устройствах или серверах. </string>
<string name="choose_presence">Выберите устройство</string>
<string name="send_unencrypted_message">Отправить сообщение без шифрования</string>
<string name="send_message">Сообщение</string>
<string name="send_message_to_x">Сообщение для %s</string>
- <string name="send_omemo_x509_message">v\\OMEMO-зашифр. сообщение</string>
+ <string name="send_omemo_x509_message">v\\Зашифрованное OMEMO сообщение</string>
<string name="your_nick_has_been_changed">Используется новое имя</string>
<string name="send_unencrypted">Отправить чистый текст</string>
- <string name="decryption_failed">Расшифровка не удалась. Вероятно, что у вас нет надлежащего ключа.</string>
+ <string name="decryption_failed">Расшифровка невозможна. Вероятно, у вас нет надлежащего ключа.</string>
<string name="openkeychain_required">Установите OpenKeychain</string>
<string name="openkeychain_required_long"><![CDATA[%1$s использует <b>OpenKeychain</b> для шифрования и дешифрования сообщений и управления открытыми ключами.<br><br>OpenKeychain распространяется под лицензией GPLv3+ и доступна для загрузки через F-Droid или Google Play.<br><br><small>(Потребуется перезапуск %1$s после установки.)</small>]]></string>
<string name="restart">Перезапуск</string>
<string name="install">Установка</string>
- <string name="openkeychain_not_installed">Пожалуйста, установите OpenKeychain</string>
+ <string name="openkeychain_not_installed">Установите OpenKeychain</string>
<string name="offering">предложение…</string>
<string name="waiting">ожидание…</string>
- <string name="no_pgp_key">Нет OpenPGP ключа</string>
- <string name="contact_has_no_pgp_key">Conversations не может зашифровать сообщение, потому что ваш собеседник не анонсирует свой открытый ключ.\n\n<small>Пожалуйста, попросите вашего собеседника настроить OpenPGP.</small></string>
- <string name="no_pgp_keys">Нет OpenPGP ключей</string>
- <string name="contacts_have_no_pgp_keys">Conversations не может зашифровать сообщение, потому что ваши собеседники не анонсируют свои открытые ключи.\n\n<small>Пожалуйста, попросите ваших собеседников настроить OpenPGP.</small></string>
+ <string name="no_pgp_key">Нет ключа OpenPGP</string>
+ <string name="contact_has_no_pgp_key">Conversations не может зашифровать сообщение, потому что ваш собеседник не анонсирует свой открытый ключ.
+\n
+\n<small>Попросите вашего собеседника настроить OpenPGP.</small></string>
+ <string name="no_pgp_keys">Нет ключей OpenPGP</string>
+ <string name="contacts_have_no_pgp_keys">Conversations не может зашифровать сообщение, потому что ваши собеседники не анонсируют свои открытые ключи.
+\n
+\n<small>Попросите ваших собеседников настроить OpenPGP.</small></string>
<string name="pref_general">Общие</string>
<string name="pref_accept_files">Принимать файлы</string>
<string name="pref_accept_files_summary">Автоматический приём файлов…</string>
<string name="pref_attachments">Вложения</string>
<string name="pref_notification_settings">Уведомление</string>
<string name="pref_vibrate">Вибрация</string>
- <string name="pref_vibrate_summary">Вибрировать, когда приходят новые сообщения</string>
+ <string name="pref_vibrate_summary">Вибрация при получении нового сообщения</string>
<string name="pref_led">Светодиодное уведомление</string>
<string name="pref_led_summary">Мерцание индикатора при получении нового сообщения</string>
<string name="pref_ringtone">Мелодия звонка</string>
<string name="pref_notification_sound">Звук уведомления</string>
<string name="pref_notification_sound_summary">Звук уведомления о новых сообщениях</string>
<string name="pref_call_ringtone_summary">Мелодия входящего звонка</string>
- <string name="pref_notification_grace_period">Грейс-период</string>
+ <string name="pref_notification_grace_period">Период отсрочки</string>
<string name="pref_notification_grace_period_summary">Время, на которое уведомления будут отключены, когда вы пользуетесь аккаунтом на другом устройстве.</string>
<string name="pref_advanced_options">Дополнительно</string>
<string name="pref_never_send_crash_summary">Отправляя отчёты об ошибках, вы помогаете разработке</string>
<string name="pref_confirm_messages">Отчёты о получении</string>
<string name="pref_confirm_messages_summary">Позволяет вашим контактам видеть, когда вы получили и прочитали их сообщения</string>
- <string name="pref_prevent_screenshots">Запретить скриншоты</string>
- <string name="pref_prevent_screenshots_summary">Прятать содержимое приложения при переключении приложений и запретить скриншоты</string>
+ <string name="pref_prevent_screenshots">Запретить снимки экрана</string>
+ <string name="pref_prevent_screenshots_summary">Прятать содержимое приложения при переключении приложений и запретить снимки экрана</string>
<string name="pref_ui_options">Интерфейс</string>
<string name="openpgp_error">OpenKeychain вызвал ошибку.</string>
<string name="bad_key_for_encryption">Неподходящий ключ для шифрования.</string>
<string name="accept">Принять</string>
<string name="error">Произошла ошибка</string>
<string name="recording_error">Ошибка</string>
- <string name="your_account">Ваша учётная запись</string>
+ <string name="your_account">Ваш аккаунт</string>
<string name="send_presence_updates">Отправлять присутствие</string>
<string name="receive_presence_updates">Получать присутствие</string>
<string name="ask_for_presence_updates">Запрашивать присутствие</string>
@@ -141,26 +145,28 @@
<string name="attach_take_picture">Сделать снимок</string>
<string name="preemptively_grant">Удовлетворять запросы на подписки</string>
<string name="error_not_an_image_file">Выбранный файл не является изображением</string>
- <string name="error_compressing_image">Не удалось конвертировать изображение</string>
+ <string name="error_compressing_image">Невозможно преобразовать изображение</string>
<string name="error_file_not_found">Файл не найден</string>
<string name="error_io_exception">Общая ошибка ввода/вывода. Возможно, на устройстве недостаточно свободного места?</string>
- <string name="error_security_exception_during_image_copy">У приложения, которым вы выбрали это изображение, недостаточно прав, чтобы прочитать этот файл.\n\n<small>Пожалуйста, используйте другой файловый менеджер, чтобы выбрать это изображение</small>.</string>
+ <string name="error_security_exception_during_image_copy">У приложения, которым вы выбрали это изображение, недостаточно прав, чтобы прочитать этот файл.
+\n
+\n<small>Используйте другой файловый менеджер, чтобы выбрать это изображение</small>.</string>
<string name="error_security_exception">Приложение, которое вы использовали для публикации этого файла, не предоставило достаточно разрешений.</string>
<string name="account_status_unknown">Неизвестен</string>
<string name="account_status_disabled">Временно отключён</string>
<string name="account_status_online">В сети</string>
<string name="account_status_connecting">Соединение\u2026</string>
<string name="account_status_offline">Не в сети</string>
- <string name="account_status_unauthorized">Неавторизован</string>
+ <string name="account_status_unauthorized">Не авторизован</string>
<string name="account_status_not_found">Сервер не найден</string>
<string name="account_status_no_internet">Нет подключения к сети</string>
- <string name="account_status_regis_fail">Регистрация не удалась</string>
+ <string name="account_status_regis_fail">Регистрация не выполнена</string>
<string name="account_status_regis_conflict">Имя пользователя уже используется</string>
<string name="account_status_regis_success">Регистрация завершена</string>
<string name="account_status_regis_not_sup">Сервер не поддерживает возможность регистрации</string>
<string name="account_status_regis_invalid_token">Неправильный токен регистрации</string>
- <string name="account_status_tls_error">Не удалось согласовать TLS</string>
- <string name="account_status_tls_error_domain">Домен не поддается проверке</string>
+ <string name="account_status_tls_error">Не согласовать TLS</string>
+ <string name="account_status_tls_error_domain">Домен не поддаётся проверке</string>
<string name="account_status_policy_violation">Нарушение правил</string>
<string name="account_status_incompatible_server">Несовместимый сервер</string>
<string name="account_status_stream_error">Ошибка потока</string>
@@ -172,45 +178,46 @@
<string name="mgmt_account_delete">Удалить аккаунт</string>
<string name="mgmt_account_disable">Временно отключить</string>
<string name="mgmt_account_publish_avatar">Разместить аватар</string>
- <string name="mgmt_account_publish_pgp">Анонсировать OpenPGP ключ</string>
+ <string name="mgmt_account_publish_pgp">Анонсировать ключ OpenPGP</string>
<string name="unpublish_pgp">Удалить открытый ключ OpenPGP</string>
- <string name="unpublish_pgp_message">Вы действительно хотите удалить ваш OpenPGP публичный ключ из опубликованных?\nВаши собеседники не смогут больше отправлять вам зашифрованные OpenPGP сообщения.</string>
+ <string name="unpublish_pgp_message">Удалить ваш публичный ключ OpenPGP из опубликованных?
+\nВаши собеседники не смогут больше отправлять вам зашифрованные OpenPGP сообщения.</string>
<string name="openpgp_has_been_published">Публичный ключ OpenPGP опубликован.</string>
<string name="mgmt_account_enable">Включить аккаунт</string>
- <string name="mgmt_account_delete_confirm_text">Вы точно хотите удалить свою учётную запись? Удаление учётной записи сотрёт все истории диалогов</string>
+ <string name="mgmt_account_delete_confirm_text">Удалить свой аккаунт? Удаление аккаунта также сотрёт все истории диалогов.</string>
<string name="attach_record_voice">Запись голоса</string>
<string name="account_settings_jabber_id">XMPP-адрес</string>
<string name="block_jabber_id">Заблокировать XMPP-адрес</string>
<string name="account_settings_example_jabber_id">username@example.com</string>
<string name="password">Пароль</string>
<string name="invalid_jid">Недопустимый XMPP-адрес</string>
- <string name="error_out_of_memory">Нехватка памяти. Изображение слишком большое</string>
- <string name="add_phone_book_text">Вы хотите добавить %s в вашу адресную книгу?</string>
+ <string name="error_out_of_memory">Нехватка памяти. Изображение слишком большое.</string>
+ <string name="add_phone_book_text">Добавить %s в вашу адресную книгу?</string>
<string name="server_info_show_more">Информация о сервере</string>
- <string name="server_info_mam">XEP-0313: Архив сообщений</string>
- <string name="server_info_carbon_messages">XEP-0280: Дублиров. сообщений</string>
- <string name="server_info_csi">XEP-0352: Состояние клиента</string>
- <string name="server_info_blocking">XEP-0191: Команда блокирования</string>
- <string name="server_info_roster_version">XEP-0237: Версии списков</string>
- <string name="server_info_stream_management">XEP-0198: Управление потоками</string>
- <string name="server_info_external_service_discovery">XEP-0215: Обнаружение внешних служб</string>
- <string name="server_info_pep">XEP-0163: PEP (Аватары / OMEMO)</string>
- <string name="server_info_http_upload">XEP-0363: Загрузка по HTTP</string>
- <string name="server_info_push">XEP-0357: Push-уведомления</string>
+ <string name="server_info_mam">XEP-0313: архив сообщений</string>
+ <string name="server_info_carbon_messages">XEP-0280: дублирование сообщений</string>
+ <string name="server_info_csi">XEP-0352: состояние клиента</string>
+ <string name="server_info_blocking">XEP-0191: команда блокирования</string>
+ <string name="server_info_roster_version">XEP-0237: версии списков</string>
+ <string name="server_info_stream_management">XEP-0198: управление потоками</string>
+ <string name="server_info_external_service_discovery">XEP-0215: обнаружение внешних служб</string>
+ <string name="server_info_pep">XEP-0163: PEP (аватары / OMEMO)</string>
+ <string name="server_info_http_upload">XEP-0363: загрузка по HTTP</string>
+ <string name="server_info_push">XEP-0357: push-уведомления</string>
<string name="server_info_available">доступно</string>
<string name="server_info_unavailable">недоступно</string>
<string name="missing_public_keys">Отсутствие анонсирования открытых ключей</string>
<string name="last_seen_now">Присутствие: только что</string>
- <string name="last_seen_min">Присутствие: одну минуту назад</string>
+ <string name="last_seen_min">Присутствие: минуту назад</string>
<string name="last_seen_mins">Присутствие: %d мин. назад</string>
- <string name="last_seen_hour">Присутствие: один час назад</string>
+ <string name="last_seen_hour">Присутствие: час назад</string>
<string name="last_seen_hours">Присутствие: %d час. назад</string>
- <string name="last_seen_day">Присутствие: один день назад</string>
+ <string name="last_seen_day">Присутствие: день назад</string>
<string name="last_seen_days">Присутствие: %d дн. назад</string>
- <string name="install_openkeychain">Зашифрованное сообщение. Пожалуйста, установите OpenKeychain для расшифровки.</string>
- <string name="openpgp_messages_found">Найдены новые OpenPGP зашифрованые сообщения</string>
- <string name="openpgp_key_id">ID OpenPGP ключа</string>
- <string name="omemo_fingerprint">OMEMO-отпечаток</string>
+ <string name="install_openkeychain">Зашифрованное сообщение. Установите OpenKeychain для расшифровки.</string>
+ <string name="openpgp_messages_found">Найдены новые зашифрованные OpenPGP сообщения</string>
+ <string name="openpgp_key_id">ID ключа OpenPGP</string>
+ <string name="omemo_fingerprint">Отпечаток OMEMO</string>
<string name="omemo_fingerprint_x509">v\\OMEMO-отпечаток</string>
<string name="omemo_fingerprint_selected_message">OMEMO-отпечаток (выбранного сообщения)</string>
<string name="omemo_fingerprint_x509_selected_message">v\\OMEMO-отпечаток (выбранного сообщения)</string>
@@ -229,39 +236,43 @@
<string name="select">Выбрать</string>
<string name="contact_already_exists">Контакт уже существует</string>
<string name="join">Присоединиться</string>
- <string name="channel_full_jid_example">канал@конференция.пример.com/никнейм</string>
+ <string name="channel_full_jid_example">канал@конференция.пример.com/имя</string>
<string name="channel_bare_jid_example">канал@конференция.пример.com</string>
<string name="save_as_bookmark">Сохранить закладку</string>
<string name="delete_bookmark">Удалить закладку</string>
<string name="destroy_room">Уничтожить конференцию</string>
<string name="destroy_channel">Уничтожить канал</string>
- <string name="destroy_room_dialog">Вы уверены, что хотите распустить эту конференцию?\n\n<b>Предупреждение:</b>Конференция будет полностью удалена с сервера.</string>
- <string name="destroy_channel_dialog">Вы уверены, что хотите закрыть этот публичный канал?\n\n<b>Предупреждение:</b> Канал будет полностью удален с сервера.</string>
- <string name="could_not_destroy_room">Не удалось уничтожить конференцию</string>
- <string name="could_not_destroy_channel">Не удалось уничтожить канал</string>
- <string name="action_edit_subject">Редактировать тему конференции</string>
+ <string name="destroy_room_dialog">Уничтожить эту конференцию?
+\n
+\n<b>Предупреждение:</b>конференция будет полностью удалена с сервера.</string>
+ <string name="destroy_channel_dialog">Уничтожить этот публичный канал?
+\n
+\n<b>Предупреждение:</b> канал будет полностью удалён с сервера.</string>
+ <string name="could_not_destroy_room">Невозможно уничтожить конференцию</string>
+ <string name="could_not_destroy_channel">Невозможно уничтожить канал</string>
+ <string name="action_edit_subject">Изменить тему конференции</string>
<string name="topic">Тема</string>
<string name="joining_conference">Вход в конференцию…</string>
<string name="leave">Покинуть</string>
<string name="contact_added_you">Собеседник добавил вас в список контактов</string>
<string name="add_back">Добавить в ответ</string>
- <string name="contact_has_read_up_to_this_point">%s прочит. сообщ. до этого момента</string>
- <string name="contacts_have_read_up_to_this_point">%s прочитали сообщения до этого момента</string>
- <string name="contacts_and_n_more_have_read_up_to_this_point">%1$s + ещё %2$d прочитали до этого места</string>
+ <string name="contact_has_read_up_to_this_point">%s прочитал до этого момента</string>
+ <string name="contacts_have_read_up_to_this_point">%s прочитали до этого момента</string>
+ <string name="contacts_and_n_more_have_read_up_to_this_point">%1$s + ещё %2$d прочитали до этого момента</string>
<string name="everyone_has_read_up_to_this_point">Все прочитали сообщения до этого момента</string>
<string name="publish">Опубликовать</string>
<string name="touch_to_choose_picture">Нажмите на аватар, чтобы выбрать новую фотографию из галереи</string>
<string name="publishing">Установка…</string>
<string name="error_publish_avatar_server_reject">Сервер отклонил размещение аватара</string>
- <string name="error_publish_avatar_converting">Не удалось преобразовать вашу фотографию</string>
- <string name="error_saving_avatar">Не удалось сохранить аватар</string>
+ <string name="error_publish_avatar_converting">Невозможно преобразовать вашу фотографию</string>
+ <string name="error_saving_avatar">Невозможно сохранить аватар</string>
<string name="or_long_press_for_default">(Или долгое прикосновение, чтобы вернуть значения по умолчанию)</string>
<string name="error_publish_avatar_no_server_support">Ваш сервер не поддерживает публикацию аватаров</string>
- <string name="private_message">шёпот</string>
+ <string name="private_message">шёпотом</string>
<string name="private_message_to">отправить %s</string>
<string name="send_private_message_to">Приватное сообщение %s</string>
<string name="connect">Подключиться</string>
- <string name="account_already_exists">Эта учётная запись уже существует</string>
+ <string name="account_already_exists">Этот аккаунт уже существует</string>
<string name="next">Далее</string>
<string name="server_info_session_established">Сеанс установлен</string>
<string name="skip">Пропустить</string>
@@ -269,10 +280,14 @@
<string name="enable">Включить</string>
<string name="conference_requires_password">Конференция требует авторизации</string>
<string name="enter_password">Введите пароль</string>
- <string name="request_presence_updates">Пожалуйста, сначала запросите обновления присутствия у вашего собеседника.\n\n<small>Эта информация будет использоваться для определения того, каким клиентом пользуется ваш собеседник</small>.</string>
+ <string name="request_presence_updates">Сначала запросите обновления присутствия у вашего собеседника.
+\n
+\n<small>Эта информация будет использоваться для определения того, каким клиентом пользуется ваш собеседник</small>.</string>
<string name="request_now">Запросить сейчас</string>
<string name="ignore">Игнорировать</string>
- <string name="without_mutual_presence_updates"><b>Внимание:</b> Если обновления присутствия не включены на обеих сторонах, это может привести к возникновению неожиданных проблем.\n\n<small>Просмотрите сведения о контакте для проверки настроек обновлений присутствия.</small></string>
+ <string name="without_mutual_presence_updates"><b>Внимание:</b> если обновления присутствия не включены на обеих сторонах, это может привести к возникновению неожиданных проблем.
+\n
+\n<small>Просмотрите сведения о контакте для проверки настроек обновлений присутствия.</small></string>
<string name="pref_security_settings">Безопасность</string>
<string name="pref_allow_message_correction">Исправление сообщений</string>
<string name="pref_allow_message_correction_summary">Позволить контактам редактировать сообщения</string>
@@ -282,8 +297,8 @@
<string name="title_pref_quiet_hours">Тихие часы</string>
<string name="title_pref_quiet_hours_start_time">Начало</string>
<string name="title_pref_quiet_hours_end_time">Окончание</string>
- <string name="title_pref_enable_quiet_hours">Включить режим «тихих часов»</string>
- <string name="pref_quiet_hours_summary">Уведомления будут отключены во время «тихих часов»</string>
+ <string name="title_pref_enable_quiet_hours">Включить режим \"тихих часов\"</string>
+ <string name="pref_quiet_hours_summary">Уведомления будут отключены во время \"тихих часов\"</string>
<string name="pref_expert_options_other">Другие</string>
<string name="toast_message_omemo_fingerprint">OMEMO-отпечаток скопирован в буфер обмена</string>
<string name="conference_banned">Вы заблокированы в этой конференции</string>
@@ -295,10 +310,10 @@
<string name="using_account">используется аккаунт %s</string>
<string name="hosted_on">размещено на %s</string>
<string name="checking_x">Проверка %s на сервере HTTP</string>
- <string name="not_connected_try_again">Вы неподключены. Попробуйте позже</string>
+ <string name="not_connected_try_again">Вы не подключены. Попробуйте позже.</string>
<string name="check_x_filesize">Проверить размер (%s)</string>
<string name="check_x_filesize_on_host">Проверить размер на %2$s (%1$s)</string>
- <string name="message_options">Опции сообщения</string>
+ <string name="message_options">Параметры сообщения</string>
<string name="quote">Цитировать</string>
<string name="paste_as_quote">Вставить как цитату</string>
<string name="copy_original_url">Копировать адрес ссылки</string>
@@ -311,19 +326,19 @@
<string name="scan_qr_code">Сканировать QR-код</string>
<string name="show_qr_code">Показать QR-код</string>
<string name="show_block_list">Показать чёрный список</string>
- <string name="account_details">Сведения об учётной записи</string>
+ <string name="account_details">Сведения об аккаунте</string>
<string name="confirm">Подтвердить</string>
<string name="try_again">Повторить</string>
<string name="pref_keep_foreground_service">Процесс переднего плана</string>
- <string name="pref_keep_foreground_service_summary">Не позволяет операционной системе закрыть ваше соединение</string>
+ <string name="pref_keep_foreground_service_summary">Не позволять операционной системе закрывать ваше соединение</string>
<string name="pref_create_backup">Создать резервную копию</string>
<string name="pref_create_backup_summary">Файлы резервной копии будут сохранены в %s</string>
<string name="notification_create_backup_title">Создание резервной копии</string>
- <string name="notification_backup_created_title">Ваша резервная копия была создана</string>
+ <string name="notification_backup_created_title">Ваша резервная копия создана</string>
<string name="notification_backup_created_subtitle">Файлы резервной копии сохранены в %s</string>
<string name="restoring_backup">Восстановление из резервной копии</string>
<string name="notification_restored_backup_title">Восстановление из резервной копии выполнено</string>
- <string name="notification_restored_backup_subtitle">Не забудьте включить учётную запись.</string>
+ <string name="notification_restored_backup_subtitle">Не забудьте включить аккаунт.</string>
<string name="choose_file">Выбрать файл</string>
<string name="receiving_x_file">%1$s загружается (%2$d%% выполнено)</string>
<string name="download_x_file">Загрузить %s</string>
@@ -334,30 +349,31 @@
<string name="preparing_file">Файл готовится для передачи</string>
<string name="x_file_offered_for_download">%s предлагается скачать</string>
<string name="cancel_transmission">Отменить передачу</string>
- <string name="file_transmission_failed">передача файла не удалась</string>
+ <string name="file_transmission_failed">передача файла не выполнена</string>
<string name="file_transmission_cancelled">передача файла отменена</string>
<string name="file_deleted">Файл был удалён</string>
<string name="no_application_found_to_open_file">Не найдено приложения для открытия файла</string>
<string name="no_application_found_to_open_link">Не найдено приложения, способного открыть эту ссылку</string>
<string name="no_application_found_to_view_contact">Не найдено приложения для просмотра контакта</string>
- <string name="pref_show_dynamic_tags">Динамические тэги</string>
+ <string name="pref_show_dynamic_tags">Динамические теги</string>
<string name="pref_show_dynamic_tags_summary">Отображать теги только для чтения под контактами</string>
<string name="enable_notifications">Включить уведомления</string>
<string name="no_conference_server_found">Сервер конференции не найден</string>
- <string name="conference_creation_failed">Не удалось создать конференцию</string>
+ <string name="conference_creation_failed">Невозможно создать конференцию</string>
<string name="account_image_description">Аватар аккаунта</string>
<string name="copy_omemo_clipboard_description">Скопировать OMEMO-отпечаток в буфер обмена</string>
<string name="regenerate_omemo_key">Создать ключ OMEMO заново</string>
<string name="clear_other_devices">Очистить устройства</string>
- <string name="clear_other_devices_desc">Вы уверены, что хотите очистить все остальные устройства из анонса ключей OMEMO? При соединении устройств в следующий раз новые ключи анонсируются автоматически, но устройства могут не получить сообщения, посланные до этого.</string>
- <string name="error_no_keys_to_trust_server_error">Для этого контакта нет доступных ключей.\nНе удалось получить новые ключи от сервера. Возможно, что-то не так с сервером вашего собеседника.</string>
+ <string name="clear_other_devices_desc">Очистить все остальные устройства из анонса ключей OMEMO? При соединении устройств в следующий раз новые ключи анонсируются автоматически, но устройства могут не получить сообщения, посланные до этого.</string>
+ <string name="error_no_keys_to_trust_server_error">Для этого контакта нет доступных ключей.
+\nНевозможно получить новые ключи от сервера. Возможно, что-то не так с сервером вашего собеседника.</string>
<string name="error_no_keys_to_trust_presence">Нет доступных ключей для данного контакта.\nУбедитесь, что у вас обоих есть подписка на присутствие.</string>
<string name="error_trustkeys_title">Что-то пошло не так</string>
<string name="fetching_history_from_server">Получение истории с сервера</string>
<string name="no_more_history_on_server">На сервере больше нет истории</string>
<string name="updating">Обновление…</string>
<string name="password_changed">Пароль изменён!</string>
- <string name="could_not_change_password">Не удалось изменить пароль</string>
+ <string name="could_not_change_password">Невозможно изменить пароль</string>
<string name="change_password">Изменить пароль</string>
<string name="current_password">Текущий пароль</string>
<string name="new_password">Новый пароль</string>
@@ -378,20 +394,20 @@
<string name="remove_owner_privileges">Снять права администратора</string>
<string name="remove_from_room">Убрать из конференции</string>
<string name="remove_from_channel">Исключить</string>
- <string name="could_not_change_affiliation">Не удалось изменить принадлежность %s</string>
+ <string name="could_not_change_affiliation">Невозможно изменить принадлежность %s</string>
<string name="ban_from_conference">Заблокировать в конференции</string>
<string name="ban_from_channel">Заблокировать</string>
<string name="removing_from_public_conference">Вы пытаетесь исключить %s из публичного канала. Единственный способ это сделать — навсегда заблокировать этого пользователя. </string>
<string name="ban_now">Заблокировать</string>
- <string name="could_not_change_role">Не удалось сменить роль %s</string>
+ <string name="could_not_change_role">Невозможно сменить роль %s</string>
<string name="conference_options">Настройки приватной конференции</string>
<string name="channel_options">Настройки публичного канала</string>
<string name="members_only">Приватная</string>
- <string name="non_anonymous">Сделать XMPP адрес видимым для всех</string>
+ <string name="non_anonymous">Сделать XMPP-адрес видимым для всех</string>
<string name="moderated">Сделать канал модерируемым</string>
<string name="you_are_not_participating">Вы не участвуете</string>
<string name="modified_conference_options">Настройки конференции изменены!</string>
- <string name="could_not_modify_conference_options">Не удалось изменить настройки конференции</string>
+ <string name="could_not_modify_conference_options">Невозможно изменить настройки конференции</string>
<string name="never">Никогда</string>
<string name="until_further_notice">Пока не включу</string>
<string name="snooze">Повтор</string>
@@ -399,9 +415,9 @@
<string name="mark_as_read">Прочитано</string>
<string name="pref_input_options">Ввод</string>
<string name="pref_enter_is_send">Отправка по \"Enter\"</string>
- <string name="pref_enter_is_send_summary">Отправлять сообщения клавишей Enter. Даже если эта опция отключена, сообщение можно отправить, нажав Ctrl+Enter.</string>
+ <string name="pref_enter_is_send_summary">Отправлять сообщения клавишей ввода. Даже если эта функция отключена, сообщение можно отправить, нажав Ctrl+Enter.</string>
<string name="pref_display_enter_key">Показывать клавишу ввода</string>
- <string name="pref_display_enter_key_summary">Поменять кнопку смайликов на кнопку ввода</string>
+ <string name="pref_display_enter_key_summary">Заменить кнопку смайлов кнопкой ввода</string>
<string name="audio">аудио</string>
<string name="video">видео</string>
<string name="image">изображение</string>
@@ -412,9 +428,9 @@
<string name="avatar_has_been_published">Аватар загружен!</string>
<string name="sending_x_file">Отправляется %s</string>
<string name="offering_x_file">Предложен %s</string>
- <string name="hide_offline">Скрыть пользователей вне сети</string>
+ <string name="hide_offline">Скрыть не в сети</string>
<string name="contact_is_typing">%s печатает…</string>
- <string name="contact_has_stopped_typing">%s прекратил набор</string>
+ <string name="contact_has_stopped_typing">%s перестал печатать</string>
<string name="contacts_are_typing">%s печатают…</string>
<string name="contacts_have_stopped_typing">%s перестали печатать</string>
<string name="pref_chat_states">Оповещения о наборе</string>
@@ -434,7 +450,7 @@
<string name="dialog_manage_certs_positivebutton">Удалить отмеченные</string>
<plurals name="toast_delete_certificates">
<item quantity="one">Удалён %d сертификат</item>
- <item quantity="few">Удалено %d сертификата</item>
+ <item quantity="few">Удалены %d сертификата</item>
<item quantity="many">Удалено %d сертификатов</item>
<item quantity="other">Удалено %d сертификатов</item>
</plurals>
@@ -449,33 +465,33 @@
<string name="username">Имя пользователя</string>
<string name="username_hint">Имя пользователя</string>
<string name="invalid_username">Недопустимое имя пользователя</string>
- <string name="download_failed_server_not_found">Загрузка не удалась: сервер не найден</string>
- <string name="download_failed_file_not_found">Загрузка не удалась: файл не найден</string>
- <string name="download_failed_could_not_connect">Загрузка не удалась: не удалось подключиться к серверу</string>
- <string name="download_failed_could_not_write_file">Загрузка не удалась: ошибка записи файла</string>
+ <string name="download_failed_server_not_found">Загрузка не выполнена: сервер не найден</string>
+ <string name="download_failed_file_not_found">Загрузка не выполнена: файл не найден</string>
+ <string name="download_failed_could_not_connect">Загрузка не выполнена: невозможно подключиться к серверу</string>
+ <string name="download_failed_could_not_write_file">Загрузка не выполнена: ошибка записи файла</string>
<string name="account_status_tor_unavailable">Сеть Tor недоступна</string>
<string name="account_status_bind_failure">Ошибка связывания</string>
<string name="account_status_host_unknown">Сервер не ответственен за этот домен</string>
<string name="server_info_broken">Повреждено</string>
<string name="pref_presence_settings">Доступность</string>
- <string name="pref_away_when_screen_off">\"Отошёл\" когда экран заблокирован</string>
- <string name="pref_away_when_screen_off_summary">Устанавливает статус \"Отошёл\", когда устройство заблокировано</string>
+ <string name="pref_away_when_screen_off">\"Отошёл\" при блокировке экрана</string>
+ <string name="pref_away_when_screen_off_summary">Устанавливать статус \"Отошёл\", когда устройство заблокировано</string>
<string name="pref_dnd_on_silent_mode">\"Не беспокоить\" в беззвучном режиме</string>
- <string name="pref_dnd_on_silent_mode_summary">Устанавливает статус \"Не беспокоить\", когда устройство в беззвучном режиме</string>
- <string name="pref_treat_vibrate_as_silent">Не доступен в режиме вибрации</string>
- <string name="pref_treat_vibrate_as_dnd_summary">Устанавливает статус \"Не беспокоить\", когда устройство в режиме вибрации</string>
+ <string name="pref_dnd_on_silent_mode_summary">Устанавливать статус \"Не беспокоить\", когда устройство в беззвучном режиме</string>
+ <string name="pref_treat_vibrate_as_silent">\"Не беспокоить\" в режиме вибрации</string>
+ <string name="pref_treat_vibrate_as_dnd_summary">Устанавливать статус \"Не беспокоить\", когда устройство в режиме вибрации</string>
<string name="pref_show_connection_options">Имя хоста и порт</string>
<string name="pref_show_connection_options_summary">Показывать расширенные настройки соединения при настройке аккаунта</string>
<string name="hostname_example">xmpp.example.com</string>
- <string name="action_add_account_with_certificate">Авторизироваться с помощью сертификата</string>
- <string name="unable_to_parse_certificate">Не удалось прочитать сертификат</string>
+ <string name="action_add_account_with_certificate">Войти с помощью сертификата</string>
+ <string name="unable_to_parse_certificate">Невозможно прочитать сертификат</string>
<string name="mam_prefs">Настройки архивирования</string>
<string name="server_side_mam_prefs">Настройки архивирования на сервере</string>
- <string name="fetching_mam_prefs">Получение настроек архивирования. Пожалуйста, подождите…</string>
- <string name="unable_to_fetch_mam_prefs">Не удалось получить настройки архивирования</string>
+ <string name="fetching_mam_prefs">Получение настроек архивирования. Подождите…</string>
+ <string name="unable_to_fetch_mam_prefs">Невозможно получить настройки архивирования</string>
<string name="captcha_required">Необходима проверка CAPTCHA</string>
<string name="captcha_hint">Введите текст с изображения</string>
- <string name="certificate_chain_is_not_trusted">Ненадежная цепь сертификатов</string>
+ <string name="certificate_chain_is_not_trusted">Ненадёжная цепь сертификатов</string>
<string name="jid_does_not_match_certificate">XMPP-адрес не соответствует сертификату</string>
<string name="action_renew_certificate">Обновить сертификат</string>
<string name="error_fetching_omemo_key">Ошибка при получении OMEMO-ключа!</string>
@@ -483,13 +499,13 @@
<string name="device_does_not_support_certificates">Ваше устройство не поддерживает выбор клиентских сертификатов!</string>
<string name="pref_connection_options">Подключение</string>
<string name="pref_use_tor">Соединение через Tor</string>
- <string name="pref_use_tor_summary">Направить все соединения через сеть Tor. Требуется Orbot</string>
+ <string name="pref_use_tor_summary">Направить все соединения через сеть Tor. Требуется Orbot.</string>
<string name="account_settings_hostname">Имя сервера</string>
<string name="account_settings_port">Порт</string>
- <string name="hostname_or_onion">Сервер- или .onion-адрес</string>
- <string name="not_a_valid_port">Это недопустимый номер порта</string>
- <string name="not_valid_hostname">Это недопустимое имя сервера</string>
- <string name="connected_accounts">%1$d из %2$d аккаунтов соединены</string>
+ <string name="hostname_or_onion">Сервер или .onion-адрес</string>
+ <string name="not_a_valid_port">Недопустимый номер порта</string>
+ <string name="not_valid_hostname">Недопустимое имя сервера</string>
+ <string name="connected_accounts">%1$d из %2$d аккаунтов подключены</string>
<plurals name="x_messages">
<item quantity="one">%d сообщение</item>
<item quantity="few">%d сообщения</item>
@@ -512,35 +528,36 @@
<string name="notify_never">Уведомления выключены</string>
<string name="notify_paused">Уведомления приостановлены</string>
<string name="pref_picture_compression">Сжатие изображений</string>
- <string name="pref_picture_compression_summary">Подсказка: используйте ‘Выбрать файл’ вместо ‘Выбрать изображение’, чтобы отправлять изображения в несжатом виде, независимо от этой опции.</string>
+ <string name="pref_picture_compression_summary">Подсказка: используйте \"Выбрать файл\" вместо \"Выбрать изображение\", чтобы отправлять изображения в несжатом виде, независимо от этой настройки.</string>
<string name="always">Всегда</string>
<string name="large_images_only">Только большие изображения</string>
<string name="battery_optimizations_enabled">Оптимизации энергопотребления разрешены</string>
- <string name="battery_optimizations_enabled_explained">Ваше устройство использует агрессивную оптимизацию энергопотребления %1$s, что может привести к задержке уведомлений и даже потере сообщений.\nРекомендуем её отключить.</string>
+ <string name="battery_optimizations_enabled_explained">Ваше устройство использует агрессивную оптимизацию энергопотребления %1$s, что может привести к задержке уведомлений и даже потере сообщений.
+\nРекомендуется её отключить.</string>
<string name="battery_optimizations_enabled_dialog">Ваше устройство использует агрессивную оптимизацию энергопотребления %1$s, что может привести к задержке уведомлений и даже потере сообщений.
\n
\nСейчас появится предложение её отключить.</string>
<string name="disable">Запретить</string>
<string name="selection_too_large">Выбранная область слишком большая</string>
- <string name="no_accounts">(Нет активированных учётных записей)</string>
+ <string name="no_accounts">(Нет активированных аккаунтов)</string>
<string name="this_field_is_required">Незаполненное поле</string>
<string name="correct_message">Исправить сообщение</string>
<string name="send_corrected_message">Отправить исправленное сообщение</string>
<string name="no_keys_just_confirm">Вы уже пометили отпечаток этого человека как доверенный. Выбрав \"Готово\", вы только подтвердите, что %s является участником конференции.</string>
- <string name="this_account_is_disabled">Вы отключили эту учётную запись</string>
- <string name="security_error_invalid_file_access">Ошибка безопасности: недействительный доступ к файлу!</string>
+ <string name="this_account_is_disabled">Вы отключили этот аккаунт</string>
+ <string name="security_error_invalid_file_access">Ошибка безопасности: доступ к файлу невозможен!</string>
<string name="no_application_to_share_uri">Не найдено приложения для передачи URI</string>
<string name="share_uri_with">Отправить URI…</string>
<string name="agree_and_continue">Согласиться и продолжить</string>
- <string name="magic_create_text">Мы поможем Вам создать аккаунт на conversations.im.
+ <string name="magic_create_text">Мы поможем вам создать аккаунт на conversations.im.
\nВыбрав conversations.im в качестве провайдера, вы сможете общаться с пользователями других провайдеров, сообщив им свой полный XMPP-адрес.</string>
<string name="your_full_jid_will_be">Ваш полный XMPP-адрес будет: %s</string>
<string name="create_account">Создать аккаунт</string>
- <string name="use_own_provider">Использовать свой провайдер</string>
+ <string name="use_own_provider">Использовать своего провайдера</string>
<string name="pick_your_username">Выберите имя пользователя</string>
<string name="pref_manually_change_presence">Управлять доступностью вручную</string>
<string name="pref_manually_change_presence_summary">Устанавливать свою доступность при редактировании статусного сообщения.</string>
- <string name="status_message">Статусное собщение</string>
+ <string name="status_message">Статусное сообщение</string>
<string name="presence_chat">Свободен для общения</string>
<string name="presence_online">В сети</string>
<string name="presence_away">Отошёл</string>
@@ -548,8 +565,8 @@
<string name="presence_dnd">Занят</string>
<string name="secure_password_generated">Пароль был сгенерирован</string>
<string name="device_does_not_support_battery_op">Ваше устройство не поддерживает отключение оптимизации энергопотребления</string>
- <string name="registration_please_wait">Регистрация не удалась: повторите попытку позднее</string>
- <string name="registration_password_too_weak">Регистрация не удалась: слишком слабый пароль</string>
+ <string name="registration_please_wait">Регистрация не выполнена: повторите попытку позднее</string>
+ <string name="registration_password_too_weak">Регистрация не выполнена: слишком слабый пароль</string>
<string name="choose_participants">Выбрать участников</string>
<string name="creating_conference">Создание конференции…</string>
<string name="invite_again">Пригласить ещё раз</string>
@@ -564,23 +581,23 @@
<string name="pref_theme_options_summary">Выбрать цветовую палитру</string>
<string name="pref_theme_automatic">Автоматически</string>
<string name="pref_theme_light">Светлая</string>
- <string name="pref_theme_dark">Темная</string>
- <string name="unable_to_connect_to_keychain">Не удалось подключиться к OpenKeyChain</string>
+ <string name="pref_theme_dark">Тёмная</string>
+ <string name="unable_to_connect_to_keychain">Не подключиться к OpenKeyChain</string>
<string name="this_device_is_no_longer_in_use">Данное устройство больше не используется</string>
<string name="type_pc">Компьютер</string>
<string name="type_phone">Телефон</string>
<string name="type_tablet">Планшет</string>
- <string name="type_web">Веб-браузер</string>
+ <string name="type_web">Браузер</string>
<string name="type_console">Консоль</string>
<string name="payment_required">Требуется оплата</string>
- <string name="missing_internet_permission">Предоставить доступ к Интернету</string>
+ <string name="missing_internet_permission">Предоставить доступ к интернету</string>
<string name="me">Я</string>
<string name="contact_asks_for_presence_subscription">Контакт запрашивает подписку</string>
<string name="allow">Разрешить</string>
<string name="no_permission_to_access_x">Нет доступа к %s</string>
<string name="remote_server_not_found">Удалённый сервер не найден</string>
- <string name="remote_server_timeout">Время ожидания удаленного сервера истекло</string>
- <string name="unable_to_update_account">Не удалось обновить учетную запись</string>
+ <string name="remote_server_timeout">Время ожидания удалённого сервера истекло</string>
+ <string name="unable_to_update_account">Невозможно обновить аккаунт</string>
<string name="report_jid_as_spammer">Отправить жалобу на спам от этого XMPP-адреса.</string>
<string name="pref_delete_omemo_identities">Удалить OMEMO-ключи</string>
<string name="pref_delete_omemo_identities_summary">Создать заново OMEMO-ключи. Вашим контактам потребуется повторно подтвердить ваши ключи. Используйте только в крайнем случае.</string>
@@ -588,35 +605,36 @@
<string name="error_publish_avatar_offline">Вы должны подключиться для публикации аватара.</string>
<string name="show_error_message">Показать текст ошибки</string>
<string name="error_message">Текст ошибки</string>
- <string name="data_saver_enabled">Режим экономии трафика включен</string>
- <string name="data_saver_enabled_explained">Ваша операционная система не позволяет %1$s получать доступ в Интернет в фоновом режиме. Для получения уведомлений вы должны дать %1$s неограниченный доступ в режиме экономии трафика.\n%1$s постарается экономить трафик по возможности.</string>
+ <string name="data_saver_enabled">Режим экономии трафика включён</string>
+ <string name="data_saver_enabled_explained">Ваша операционная система не позволяет %1$s получать доступ в интернет в фоновом режиме. Для получения уведомлений вы должны дать %1$s неограниченный доступ в режиме экономии трафика.
+\n%1$s постарается экономить трафик по возможности.</string>
<string name="device_does_not_support_data_saver">Ваше устройство не поддерживает отключение режима экономии трафика для %1$s.</string>
- <string name="error_unable_to_create_temporary_file">Не удалось создать временный файл</string>
+ <string name="error_unable_to_create_temporary_file">Невозможно создать временный файл</string>
<string name="this_device_has_been_verified">Это устройство было подтверждено</string>
<string name="copy_fingerprint">Копировать отпечаток</string>
<string name="all_omemo_keys_have_been_verified">Все имеющиеся у вас OMEMO-ключи были подтверждены</string>
<string name="verified_fingerprints">Подтверждённые отпечатки</string>
- <string name="use_camera_icon_to_scan_barcode">Используйте камеру для сканирования штрихкода контакта</string>
+ <string name="use_camera_icon_to_scan_barcode">Используйте камеру для сканирования штрих-кода контакта</string>
<string name="please_wait_for_keys_to_be_fetched">Подождите получения ключей</string>
- <string name="share_as_barcode">Отправить штрихкод</string>
+ <string name="share_as_barcode">Отправить штрих-код</string>
<string name="share_as_uri">Отправить XMPP URI</string>
- <string name="share_as_http">Отправить HTTP ссылку</string>
- <string name="pref_blind_trust_before_verification">Слепое доверие перед подтверждением</string>
- <string name="pref_blind_trust_before_verification_summary">Автоматически доверять всем новым устройствам контактов, которые не были подтверждены ранее, но запрашивать ручное подтверждение каждый раз, когда подтвержденный контакт добавляет новое устройство.</string>
+ <string name="share_as_http">Отправить HTTP-ссылку</string>
+ <string name="pref_blind_trust_before_verification">Слепое доверие до подтверждения</string>
+ <string name="pref_blind_trust_before_verification_summary">Автоматически доверять всем новым устройствам контактов, которые не были подтверждены ранее, но запрашивать ручное подтверждение каждый раз, когда подтверждённый контакт добавляет новое устройство.</string>
<string name="blindly_trusted_omemo_keys">Принятие OMEMO-ключей вслепую. Это означает, что собеседник может оказаться недоверенным лицом.</string>
<string name="not_trusted">Недоверенный</string>
<string name="invalid_barcode">Некорректный QR-код</string>
<string name="pref_clean_cache_summary">Очистить кэш (используется камерой)</string>
<string name="pref_clean_cache">Очистить кэш</string>
<string name="pref_clean_private_storage">Очистить приватное хранилище</string>
- <string name="pref_clean_private_storage_summary">Очистить закрытое хранилище, где хранятся файлы (Файлы можно заново скачать с сервера)</string>
+ <string name="pref_clean_private_storage_summary">Очистить приватное хранилище, где хранятся файлы (их можно заново скачать с сервера)</string>
<string name="i_followed_this_link_from_a_trusted_source">Открывать ссылки из надёжного источника</string>
<string name="verifying_omemo_keys_trusted_source">Вы подтверждаете OMEMO-ключи %1$s после нажатия на ссылку. Это безопасно только если вы перешли по ссылке из доверенного источника, где только %2$s мог разместить эту ссылку.</string>
<string name="verify_omemo_keys">Проверить OMEMO-ключи</string>
<string name="show_inactive_devices">Показывать неактивные</string>
<string name="hide_inactive_devices">Скрыть неактивные</string>
<string name="distrust_omemo_key">Прекратить доверять устройству</string>
- <string name="distrust_omemo_key_text">Вы действительно хотите удалить устройство из доверенных?
+ <string name="distrust_omemo_key_text">Удалить устройство из доверенных?
\nЭто устройство и сообщения, полученные с него, будут помечаться как недоверенные.</string>
<plurals name="seconds">
<item quantity="one">%d секунда</item>
@@ -657,21 +675,21 @@
<string name="pref_automatically_delete_messages">Автоматическое удаление сообщений</string>
<string name="pref_automatically_delete_messages_description">Автоматически удалять сообщения с этого устройства по прошествии заданного времени.</string>
<string name="encrypting_message">Зашифровать сообщение</string>
- <string name="not_fetching_history_retention_period">Не загружаем сообщения, в соответствии с локальным сроком хранения.</string>
+ <string name="not_fetching_history_retention_period">Сообщения не загружаются в соответствии с локальным сроком хранения.</string>
<string name="transcoding_video">Сжимание видео</string>
<string name="contact_blocked_past_tense">Контакт заблокирован.</string>
<string name="pref_notifications_from_strangers">Уведомления от неизвестных контактов</string>
- <string name="pref_notifications_from_strangers_summary">Уведомлять о сообщениях и звонках от незнакомых контактов.</string>
+ <string name="pref_notifications_from_strangers_summary">Уведомлять о сообщениях и звонках от неизвестных контактов.</string>
<string name="received_message_from_stranger">Получено сообщение от неизвестного контакта</string>
<string name="block_stranger">Заблокировать неизвестный контакт</string>
<string name="block_entire_domain">Заблокировать весь домен</string>
- <string name="online_right_now">сейчас онлайн</string>
+ <string name="online_right_now">сейчас в сети</string>
<string name="retry_decryption">Повторить расшифровку</string>
<string name="session_failure">Сбой сеанса</string>
<string name="sasl_downgrade">Устарелый механизм SASL</string>
<string name="account_status_regis_web">Сервер требует регистрации на сайте</string>
<string name="open_website">Открыть сайт</string>
- <string name="application_found_to_open_website">Не найдено приложения, способного открыть этот веб-сайт</string>
+ <string name="application_found_to_open_website">Не найдено приложения, способного открыть этот сайт</string>
<string name="pref_headsup_notifications">Экранные уведомления</string>
<string name="pref_headsup_notifications_summary">Показывать экранные уведомления</string>
<string name="today">Сегодня</string>
@@ -685,24 +703,24 @@
<string name="message_copied_to_clipboard">Сообщение скопировано в буфер обмена</string>
<string name="message">Сообщение</string>
<string name="private_messages_are_disabled">Личные сообщения выключены</string>
- <string name="mtm_accept_cert">Принять Неизвестный Сертификат?</string>
+ <string name="mtm_accept_cert">Принять неизвестный сертификат?</string>
<string name="mtm_trust_anchor">Этот сертификат сервера не подписан ни одним из известных центров сертификации.</string>
<string name="mtm_accept_servername">Принять несовпадающее имя сервера?</string>
- <string name="mtm_hostname_mismatch">Серверу не удалось аутентифицироваться в качестве \"%s\". Сертификат подходит только для:</string>
- <string name="mtm_connect_anyway">Вы все равно хотите подключиться?</string>
+ <string name="mtm_hostname_mismatch">Сервер может аутентифицироваться в качестве \"%s\". Сертификат подходит только для:</string>
+ <string name="mtm_connect_anyway">Всё равно подключиться?</string>
<string name="mtm_cert_details">Детали сертификата:</string>
<string name="once">Один раз</string>
<string name="qr_code_scanner_needs_access_to_camera">Сканеру QR-кода необходим доступ к камере</string>
<string name="pref_scroll_to_bottom">Прокручивать вниз</string>
<string name="pref_scroll_to_bottom_summary">Прокручивать вниз после отправки сообщения</string>
- <string name="edit_status_message_title">Редактировать статусное сообщение</string>
- <string name="edit_status_message">Редактировать статусное сообщение</string>
+ <string name="edit_status_message_title">Изменить статусное сообщение</string>
+ <string name="edit_status_message">Изменить статусное сообщение</string>
<string name="disable_encryption">Отключить шифрование</string>
- <string name="error_trustkey_general">%1$s не удалось отправить зашифрованные сообщения для %2$s. Причиной этому может быть использование получателем устаревшего сервера или клиента, которые не поддерживают OMEMO.</string>
- <string name="error_trustkey_device_list">Не удалось получить список устройств</string>
- <string name="error_trustkey_bundle">Не удалось получить ключи шифрования</string>
+ <string name="error_trustkey_general">%1$s может отправить зашифрованные сообщения для %2$s. Причиной этому может быть использование получателем устаревшего сервера или клиента, которые не поддерживают OMEMO.</string>
+ <string name="error_trustkey_device_list">Невозможно получить список устройств</string>
+ <string name="error_trustkey_bundle">Невозможно получить ключи шифрования</string>
<string name="error_trustkey_hint_mutual">Подсказка: в некоторых случаях это может исправлено добавлением друг друга в список контактов.</string>
- <string name="disable_encryption_message">Вы уверены, что хотите выключить OMEMO-шифрование для этого чата?
+ <string name="disable_encryption_message">Выключить OMEMO-шифрование для этого чата?
\nЭто позволит администратору сервера читать ваши сообщения, но также это может быть единственным способом связи с людьми, использующими устаревшие клиенты.</string>
<string name="disable_now">Отключить сейчас</string>
<string name="draft">Черновик:</string>
@@ -714,9 +732,9 @@
<string name="default_on">Включено по умолчанию</string>
<string name="default_off">Выключено по умолчанию</string>
<string name="not_encrypted_for_this_device">Сообщение не зашифровано для этого устройства.</string>
- <string name="omemo_decryption_failed">Не удалось расшифровать OMEMO-сообщение.</string>
+ <string name="omemo_decryption_failed">Невозможно расшифровать OMEMO-сообщение.</string>
<string name="undo">отменить</string>
- <string name="location_disabled">Обмен информацией о местонахождении отключен</string>
+ <string name="location_disabled">Обмен информацией о местонахождении отключён</string>
<string name="action_fix_to_location">Закрепить позицию</string>
<string name="action_unfix_from_location">Открепить позицию</string>
<string name="action_copy_location">Копировать местоположение</string>
@@ -725,29 +743,29 @@
<string name="title_activity_share_location">Поделиться местоположением</string>
<string name="title_activity_show_location">Показать местоположение</string>
<string name="share">Поделиться</string>
- <string name="unable_to_start_recording">Не удалось начать запись</string>
- <string name="please_wait">Пожалуйста, подождите…</string>
+ <string name="unable_to_start_recording">Невозможно начать запись</string>
+ <string name="please_wait">Подождите…</string>
<string name="no_microphone_permission">Предоставить %1$s разрешение на использование микрофона</string>
<string name="search_messages">Поиск сообщений</string>
<string name="gif">GIF</string>
<string name="view_conversation">Посмотреть чат</string>
<string name="pref_use_share_location_plugin">Расширение для обмена информацией о местонахождении</string>
- <string name="pref_use_share_location_plugin_summary">Используйте расширение для обмена информацией о местонахождении вместо встроенной карты</string>
- <string name="copy_link">Копировать веб-адрес</string>
+ <string name="pref_use_share_location_plugin_summary">Использовать расширение для обмена информацией о местонахождении вместо встроенной карты</string>
+ <string name="copy_link">Копировать ссылку</string>
<string name="copy_jabber_id">Копировать XMPP-адрес</string>
<string name="p1_s3_filetransfer">Файлообмен по HTTP для S3</string>
<string name="pref_start_search">Быстрый поиск</string>
- <string name="pref_start_search_summary">На экране \"Новая беседа\" открывать клавиатуру и ставить курсор в поле поиска</string>
+ <string name="pref_start_search_summary">На экране новой беседы открывать клавиатуру и ставить курсор в поле поиска</string>
<string name="group_chat_avatar">Аватар конференции</string>
<string name="host_does_not_support_group_chat_avatars">Сервер не поддерживает наличие аватар у конференций</string>
<string name="only_the_owner_can_change_group_chat_avatar">Только владелец может менять аватар конференции</string>
<string name="contact_name">Имя контакта</string>
- <string name="nickname">Никнейм</string>
+ <string name="nickname">Имя</string>
<string name="group_chat_name">Название</string>
<string name="providing_a_name_is_optional">Предоставление имени необязательно</string>
<string name="create_dialog_group_chat_name">Название конференции</string>
<string name="conference_destroyed">Эта конференция была уничтожена</string>
- <string name="unable_to_save_recording">Не удалось сохранить запись</string>
+ <string name="unable_to_save_recording">Невозможно сохранить запись</string>
<string name="foreground_service_channel_name">Процесс переднего плана</string>
<string name="foreground_service_channel_description">Эта категория уведомлений используется для отображения постоянного уведомления о том, что %1$s запущен.</string>
<string name="notification_group_status_information">Информация о статусе</string>
@@ -759,7 +777,7 @@
<string name="incoming_calls_channel_name">Входящие вызовы</string>
<string name="ongoing_calls_channel_name">Активные вызовы</string>
<string name="silent_messages_channel_name">Тихие сообщения</string>
- <string name="silent_messages_channel_description">Эта группа уведомлений используется для отображения беззвучных оповещений. Например, при активности на другом устройстве (Грейс-период).</string>
+ <string name="silent_messages_channel_description">Эта группа уведомлений используется для отображения беззвучных оповещений. Например, при активности на другом устройстве (период отсрочки).</string>
<string name="delivery_failed_channel_name">Недоставленные сообщения</string>
<string name="pref_message_notification_settings">Настройки уведомлений о сообщениях</string>
<string name="pref_incoming_call_notification_settings">Настройки уведомлений о входящих вызовах</string>
@@ -768,7 +786,7 @@
<string name="view_media">Просмотр медиа</string>
<string name="group_chat_members">Участники</string>
<string name="media_browser">Просмотр медиафайлов</string>
- <string name="security_violation_not_attaching_file">Файл не прикреплен из соображений безопасности.</string>
+ <string name="security_violation_not_attaching_file">Файл не прикреплён из соображений безопасности.</string>
<string name="pref_video_compression">Качество видео</string>
<string name="pref_video_compression_summary">Чем ниже качество, тем меньше объем файлов</string>
<string name="video_360p">Среднее (360p)</string>
@@ -776,67 +794,67 @@
<string name="cancelled">отменено</string>
<string name="already_drafting_message">Вы уже пишите черновик сообщения.</string>
<string name="feature_not_implemented">Функция не реализована</string>
- <string name="invalid_country_code">Неверный код страны</string>
+ <string name="invalid_country_code">Неправильный код страны</string>
<string name="choose_a_country">Выберите страну</string>
<string name="phone_number">номер телефона</string>
<string name="verify_your_phone_number">Проверьте ваш номер телефона</string>
<string name="enter_country_code_and_phone_number">Quicksy отправит SMS (оператором может взиматься абонентская плата) для проверки вашего номера телефона. Введите код страны и номер телефона:</string>
<string name="we_will_be_verifying"><![CDATA[Мы проверим номер телефона<br/><br/><b>%s</b><br/><br/>Продолжить или вы желаете изменить номер?]]></string>
<string name="not_a_valid_phone_number">%s не является корректным номером телефона.</string>
- <string name="please_enter_your_phone_number">Пожалуйста, введите ваш номер телефона.</string>
+ <string name="please_enter_your_phone_number">Введите ваш номер телефона.</string>
<string name="search_countries">Поиск стран</string>
<string name="verify_x">Подтвердите %s</string>
<string name="we_have_sent_you_an_sms_to_x"><![CDATA[Мы отправили вам SMS на <b>%s</b>.]]></string>
- <string name="we_have_sent_you_another_sms">Мы отправили вам еще одну SMS с кодом из 6 цифр.</string>
- <string name="please_enter_pin_below">Пожалуйста, введите ПИН-код из 6 цифр ниже.</string>
- <string name="resend_sms">Отправьте заново SMS</string>
- <string name="resend_sms_in">Отправьте заново SMS (%s)</string>
- <string name="wait_x">Пожалуйста, подождите (%s)</string>
+ <string name="we_have_sent_you_another_sms">Мы отправили вам ещё одну SMS с кодом из 6 цифр.</string>
+ <string name="please_enter_pin_below">Введите PIN-код из 6 цифр ниже.</string>
+ <string name="resend_sms">Отправить заново SMS</string>
+ <string name="resend_sms_in">Отправить заново SMS (%s)</string>
+ <string name="wait_x">Подождите (%s)</string>
<string name="back">Назад</string>
- <string name="possible_pin">Автоматически вставлен возможный ПИН-код из буфера обмена.</string>
- <string name="please_enter_pin">Пожалуйста, введите ваш ПИН-код из 6 цифр.</string>
- <string name="abort_registration_procedure">Вы уверены, что хотите прервать процедуру регистрации?</string>
+ <string name="possible_pin">Автоматически вставлен возможный PIN-код из буфера обмена.</string>
+ <string name="please_enter_pin">Введите ваш PIN-код из 6 цифр.</string>
+ <string name="abort_registration_procedure">Прервать процедуру регистрации?</string>
<string name="yes">Да</string>
<string name="no">Нет</string>
<string name="verifying">Подтверждение…</string>
<string name="requesting_sms">Запрос SMS…</string>
- <string name="incorrect_pin">Введенный вами ПИН-код некорректен.</string>
- <string name="pin_expired">Отправленный вам ПИН-код просрочен.</string>
+ <string name="incorrect_pin">Введённый вами PIN-код неправильный.</string>
+ <string name="pin_expired">Отправленный вам PIN-код просрочен.</string>
<string name="unknown_api_error_network">Неизвестная ошибка сети.</string>
<string name="unknown_api_error_response">Неизвестный ответ от сервера.</string>
- <string name="unable_to_connect_to_server">Не удалось подключиться к серверу.</string>
- <string name="unable_to_establish_secure_connection">Не удалось установить безопасное соединение.</string>
- <string name="unable_to_find_server">Не удалось найти сервер.</string>
+ <string name="unable_to_connect_to_server">Невозможно подключиться к серверу.</string>
+ <string name="unable_to_establish_secure_connection">Невозможно установить безопасное соединение.</string>
+ <string name="unable_to_find_server">Невозможно найти сервер.</string>
<string name="something_went_wrong_processing_your_request">Что-то пошло не так с обработкой вашего запроса.</string>
- <string name="invalid_user_input">Некорректный ввод</string>
+ <string name="invalid_user_input">Неправильный ввод</string>
<string name="temporarily_unavailable">Временно недоступно. Попробуйте снова позже.</string>
<string name="no_network_connection">Нет подключения к сети.</string>
- <string name="try_again_in_x">Пожалуйста, попробуйте еще раз через %s</string>
+ <string name="try_again_in_x">Попробуйте ещё раз через %s</string>
<string name="rate_limited">У вас есть ограничение скорости</string>
<string name="too_many_attempts">Слишком много попыток</string>
- <string name="the_app_is_out_of_date">Вы используете устаревшую версию этого приложения.</string>
+ <string name="the_app_is_out_of_date">Вы используете устаревшую версию приложения.</string>
<string name="update">Обновить</string>
<string name="logged_in_with_another_device">Этот номер телефона в данный момент авторизирован на другом устройстве.</string>
- <string name="enter_your_name_instructions">Пожалуйста, введите ваше имя, чтобы другие люди, у которых нет вас в списке контактов, знали кто вы.</string>
+ <string name="enter_your_name_instructions">Введите ваше имя, чтобы другие люди, у которых нет вас в списке контактов, знали кто вы.</string>
<string name="your_name">Ваше имя</string>
<string name="enter_your_name">Введите ваше имя</string>
<string name="no_name_set_instructions">Используйте кнопку редактирования, чтобы задать ваше имя.</string>
<string name="reject_request">Отклонить запрос</string>
- <string name="install_orbot">Установите Orbot</string>
- <string name="start_orbot">Запустите Orbot</string>
+ <string name="install_orbot">Установить Orbot</string>
+ <string name="start_orbot">Запустить Orbot</string>
<string name="no_market_app_installed">Не установлен магазин приложений.</string>
<string name="group_chat_will_make_your_jabber_id_public">Этот канал сделает ваш XMPP-адрес публичным</string>
<string name="ebook">Электронная книга</string>
<string name="video_original">Оригинал (без сжатия)</string>
<string name="open_with">Открыть с помощью…</string>
- <string name="set_profile_picture">Картинка профиля Conversations</string>
+ <string name="set_profile_picture">Фотография профиля Conversations</string>
<string name="choose_account">Выбрать аккаунт</string>
<string name="restore_backup">Восстановить из резервной копии</string>
<string name="restore">Восстановить</string>
- <string name="enter_password_to_restore">Введите пароль учетной записи %s для восстановления резервной копии.</string>
+ <string name="enter_password_to_restore">Введите пароль аккаунта %s для восстановления резервной копии.</string>
<string name="restore_warning">Не используйте восстановление резервной копии для дублирования установленного приложения (одновременного исполнения). Восстановление резервной копии нужно лишь для того, чтобы перенести данные на другое устройство или на случай потери своего устройства.</string>
- <string name="unable_to_restore_backup">Не удалось восстановить резервную копию.</string>
- <string name="unable_to_decrypt_backup">Не удалось расшифровать резервную копию. Вы ввели верный пароль?</string>
+ <string name="unable_to_restore_backup">Невозможно восстановить резервную копию.</string>
+ <string name="unable_to_decrypt_backup">Невозможно расшифровать резервную копию. Вы ввели верный пароль?</string>
<string name="backup_channel_name">Резервное копирование и восстановление</string>
<string name="enter_jabber_id">Введите XMPP-адрес</string>
<string name="create_group_chat">Создать конференцию</string>
@@ -845,55 +863,55 @@
<string name="create_public_channel">Создать публичный канал</string>
<string name="create_dialog_channel_name">Название канала</string>
<string name="xmpp_address">XMPP-адрес</string>
- <string name="please_enter_name">Пожалуйста, предоставьте имя для канала</string>
- <string name="please_enter_xmpp_address">Пожалуйста, предоставьте XMPP-адрес</string>
- <string name="this_is_an_xmpp_address">Это XMPP-адрес. Пожалуйста, предоставьте имя.</string>
+ <string name="please_enter_name">Введите имя для канала</string>
+ <string name="please_enter_xmpp_address">Введите XMPP-адрес</string>
+ <string name="this_is_an_xmpp_address">Это XMPP-адрес. Введите имя.</string>
<string name="creating_channel">Создание публичного канала…</string>
<string name="channel_already_exists">Этот канал уже существует</string>
<string name="joined_an_existing_channel">Вы присоединились к существующему каналу</string>
- <string name="unable_to_set_channel_configuration">Не удалось сохранить настройки канала</string>
- <string name="allow_participants_to_edit_subject">Разрешить всем редактировать тему</string>
+ <string name="unable_to_set_channel_configuration">Невозможно сохранить настройки канала</string>
+ <string name="allow_participants_to_edit_subject">Разрешить всем изменять тему</string>
<string name="allow_participants_to_invite_others">Разрешить всем приглашать других</string>
- <string name="anyone_can_edit_subject">Кто угодно может редактировать тему.</string>
- <string name="owners_can_edit_subject">Владельцы могут редактировать тему.</string>
- <string name="admins_can_edit_subject">Администраторы могут редактировать тему.</string>
+ <string name="anyone_can_edit_subject">Кто угодно может изменять тему.</string>
+ <string name="owners_can_edit_subject">Владельцы могут изменять тему.</string>
+ <string name="admins_can_edit_subject">Администраторы могут изменять тему.</string>
<string name="owners_can_invite_others">Владельцы могут приглашать других.</string>
<string name="anyone_can_invite_others">Кто угодно может приглашать других.</string>
- <string name="jabber_ids_are_visible_to_admins">XMPP-адреса видимы для администраторов.</string>
- <string name="jabber_ids_are_visible_to_anyone">XMPP-адреса видимы для всех.</string>
- <string name="no_users_hint_channel">У этого публичного канала нет участников. Пригласите ваших знакомых или нажмите на кнопку \"Поделиться\", чтобы отправить XMPP-адрес.</string>
+ <string name="jabber_ids_are_visible_to_admins">XMPP-адреса видны администраторам.</string>
+ <string name="jabber_ids_are_visible_to_anyone">XMPP-адреса видны всем.</string>
+ <string name="no_users_hint_channel">У этого публичного канала нет участников. Пригласите ваших знакомых или нажмите кнопку \"Поделиться\", чтобы отправить XMPP-адрес.</string>
<string name="no_users_hint_group_chat">У этой приватной конференции нет участников.</string>
<string name="manage_permission">Управление правами</string>
<string name="search_participants">Поиск участников</string>
- <string name="file_too_large">Объем файла слишком велик</string>
+ <string name="file_too_large">Объём файла слишком велик</string>
<string name="attach">Прикрепить</string>
<string name="discover_channels">Найти каналы</string>
<string name="search_channels">Поиск каналов</string>
<string name="channel_discovery_opt_in_title">Возможно нарушение конфиденциальности!</string>
- <string name="i_already_have_an_account">У меня уже есть учётная запись</string>
+ <string name="i_already_have_an_account">У меня уже есть аккаунт</string>
<string name="add_existing_account">Добавить существующий аккаунт</string>
- <string name="register_new_account">Создать новую учетную запись</string>
+ <string name="register_new_account">Создать новый аккаунт</string>
<string name="this_looks_like_a_domain">Это похоже на имя домена</string>
- <string name="add_anway">Добавить все равно</string>
+ <string name="add_anway">Добавить всё равно</string>
<string name="this_looks_like_channel">Это похоже на адрес канала</string>
<string name="share_backup_files">Поделиться резервными копиями</string>
<string name="conversations_backup">Резервная копия Conversations</string>
<string name="event">Событие</string>
<string name="open_backup">Открыть резервную копию</string>
<string name="not_a_backup_file">Выбранный вами файл не является файлом резервной копии Conversations</string>
- <string name="account_already_setup">Эта учетная запись уже настроена</string>
- <string name="please_enter_password">Пожалуйста, введите пароль этой учетной записи</string>
- <string name="unable_to_perform_this_action">Не удалось совершить это действие</string>
+ <string name="account_already_setup">Этот аккаунт уже настроен</string>
+ <string name="please_enter_password">Введите пароль аккаунта</string>
+ <string name="unable_to_perform_this_action">Невозможно совершить это действие</string>
<string name="open_join_dialog">Присоединиться к публичному каналу…</string>
<string name="sharing_application_not_grant_permission">Приложение для обмена не предоставило право доступа к этому файлу.</string>
<string name="group_chats_and_channels"><![CDATA[Группы и каналы]]></string>
<string name="jabber_network">jabber.network</string>
<string name="local_server">Локальный сервер</string>
- <string name="pref_channel_discovery_summary">Большиству пользователей следует выбрать ‘jabber.network’ для получения наиболее подходящих предложений от всей публичной экосистемы XMPP.</string>
+ <string name="pref_channel_discovery_summary">Большинству пользователей следует выбрать \"jabber.network\" для получения наиболее подходящих предложений от всей публичной экосистемы XMPP.</string>
<string name="pref_channel_discovery">Способ поиска каналов</string>
<string name="backup">Резервное копирование</string>
<string name="category_about">О приложении</string>
- <string name="please_enable_an_account">Пожалуйста, активируйте учетную запись</string>
+ <string name="please_enable_an_account">Активируйте аккаунт</string>
<string name="make_call">Позвонить</string>
<string name="rtp_state_incoming_call">Входящий вызов</string>
<string name="rtp_state_incoming_video_call">Входящий видеовызов</string>
@@ -906,7 +924,7 @@
<string name="rtp_state_finding_device">Поиск устройств</string>
<string name="rtp_state_ringing">Вызов</string>
<string name="rtp_state_declined_or_busy">Занято</string>
- <string name="rtp_state_connectivity_error">Не удалось установить соединение</string>
+ <string name="rtp_state_connectivity_error">Невозможно установить соединение</string>
<string name="rtp_state_connectivity_lost_error">Соединение потеряно</string>
<string name="rtp_state_retracted">Вызов отменён</string>
<string name="rtp_state_application_failure">Ошибка приложения</string>
@@ -924,11 +942,11 @@
<string name="microphone_unavailable">Микрофон недоступен</string>
<string name="only_one_call_at_a_time">Нельзя одновременно совершать больше одного вызова.</string>
<string name="return_to_ongoing_call">Вернуться к текущему вызову</string>
- <string name="could_not_switch_camera">Не удалось переключить камеру</string>
+ <string name="could_not_switch_camera">Невозможно переключить камеру</string>
<string name="add_to_favorites">Прикрепить</string>
<string name="remove_from_favorites">Открепить</string>
<string name="gpx_track">GPX-трек</string>
- <string name="could_not_correct_message">Не удалось исправить сообщение</string>
+ <string name="could_not_correct_message">Невозможно исправить сообщение</string>
<string name="search_all_conversations">Все чаты</string>
<string name="search_this_conversation">Этот чат</string>
<string name="your_avatar">Ваш аватар</string>
@@ -948,10 +966,10 @@
<item quantity="other">Просмотр %1$d участников</item>
</plurals>
<plurals name="some_messages_could_not_be_delivered">
- <item quantity="one">Не удалось доставить сообщение</item>
- <item quantity="few">Не удалось доставить сообщения</item>
- <item quantity="many">Не удалось доставить сообщения</item>
- <item quantity="other">Не удалось доставить некоторые сообщения</item>
+ <item quantity="one">Невозможно доставить сообщение</item>
+ <item quantity="few">Невозможно доставить сообщения</item>
+ <item quantity="many">Невозможно доставить сообщения</item>
+ <item quantity="other">Невозможно доставить сообщения</item>
</plurals>
<string name="failed_deliveries">Недоставленные сообщения</string>
<string name="more_options">Ещё</string>
@@ -1100,4 +1100,6 @@
<string name="server_info_bind2">XEP-0386: Bind 2</string>
<string name="server_info_sasl2">XEP-0388: Profil SASL i Zgjerueshëm</string>
<string name="server_info_login_mechanism">Mekanizëm hyrjesh</string>
+ <string name="could_not_add_reaction">S’u shtua dot reagim</string>
+ <string name="add_reaction">Shtoni reagim…</string>
</resources>
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="action_settings">Поставке</string>
- <string name="action_accounts">Управљај налозима</string>
- <string name="action_account">Управљај налогом</string>
+ <string name="action_settings">Подешавања</string>
+ <string name="action_accounts">Подеси налоге</string>
+ <string name="action_account">Подеси налог</string>
<string name="action_contact_details">Детаљи контакта</string>
- <string name="action_muc_details">Детаљи групног ћаскања</string>
+ <string name="action_muc_details">Детаљи групне преписке</string>
<string name="channel_details">Детаљи канала</string>
<string name="action_add_account">Додај налог</string>
- <string name="action_edit_contact">Уреди име</string>
+ <string name="action_edit_contact">Измени</string>
<string name="action_add_phone_book">Додај у именик</string>
<string name="action_delete_contact">Обриши са списка контаката</string>
<string name="action_block_contact">Блокирај контакт</string>
@@ -16,8 +16,8 @@
<string name="action_unblock_domain">Одблокирај домен</string>
<string name="action_block_participant">Блокирај учесника</string>
<string name="action_unblock_participant">Одблокирај учесника</string>
- <string name="title_activity_manage_accounts">Управљање налозима</string>
- <string name="title_activity_settings">Поставке</string>
+ <string name="title_activity_manage_accounts">Подешавање налога</string>
+ <string name="title_activity_settings">Подешавања</string>
<string name="title_activity_choose_contact">Изабери контакт</string>
<string name="title_activity_choose_contacts">Изабери контакте</string>
<string name="title_activity_share_via_account">Подели преко налога</string>
@@ -31,8 +31,8 @@
<item quantity="other">%d непрочитаних порука</item>
</plurals>
<string name="sending">шаљем…</string>
- <string name="message_decrypting">Дешифрујем поруку, сачекајте…</string>
- <string name="pgp_message">ОпенПГП шифрована порука</string>
+ <string name="message_decrypting">Дешифрујем поруку. Сачекај…</string>
+ <string name="pgp_message">OpenPGP шифрована порука</string>
<string name="nick_in_use">Надимак је већ у употреби</string>
<string name="invalid_muc_nick">Неисправан надимак</string>
<string name="admin">Администратор</string>
@@ -40,9 +40,9 @@
<string name="moderator">Модератор</string>
<string name="participant">Учесник</string>
<string name="visitor">Посетилац</string>
- <string name="remove_contact_text">Да ли желите да уклоните %s са вашег списка контаката? Преписке са овим контактом неће бити уклоњене.</string>
- <string name="block_contact_text">Желите ли да блокирате поруке од %s?</string>
- <string name="unblock_contact_text">Желите ли да одблокирате %s и допустите им да вам шаљу поруке?</string>
+ <string name="remove_contact_text">Желиш да уклониш %s са твог списка контаката? Преписка са овим контактом неће бити уклоњена.</string>
+ <string name="block_contact_text">Желиш да блокираш поруке од %s?</string>
+ <string name="unblock_contact_text">Желиш да одблокираш %s и да дозволиш да ти шаље поруке?</string>
<string name="block_domain_text">Блокирати све контакте од %s?</string>
<string name="unblock_domain_text">Одблокирати све контакте од %s?</string>
<string name="contact_blocked">Контакт блокиран</string>
@@ -63,97 +63,105 @@
<string name="unblock">Одблокирај</string>
<string name="save">Сачувај</string>
<string name="ok">У реду</string>
- <string name="crash_report_title">%1$s је принудно заустављен</string>
- <string name="crash_report_message">Слањем извештаја рада путем вашег ИксМПП налога помажете даљем развоју %1$s.</string>
+ <string name="crash_report_title">%1$s је неочекивано заустављен</string>
+ <string name="crash_report_message">Слањем извештаја о грешкама путем свог XMPP налога помажеш даљем развоју %1$s апликације.</string>
<string name="send_now">Пошаљи одмах</string>
<string name="send_never">Не питај више</string>
- <string name="problem_connecting_to_account">Не могу да се повежем са налогом</string>
- <string name="problem_connecting_to_accounts">Не могу да се повежем са више налога</string>
- <string name="touch_to_fix">Тапните овде да бисте управљали вашим налозима</string>
- <string name="attach_file">Приложи фајл</string>
- <string name="not_in_roster">Контакт није на вашем списку контаката. Желите ли да га додате?</string>
+ <string name="problem_connecting_to_account">Није могуће повезати се са налогом</string>
+ <string name="problem_connecting_to_accounts">Није могуће повезати се са више налога</string>
+ <string name="touch_to_fix">Притисни овде да подесиш своје налоге</string>
+ <string name="attach_file">Накачи фајл</string>
+ <string name="not_in_roster">Додај овај контакт који није на твом списку контаката?</string>
<string name="add_contact">Додај контакт</string>
<string name="send_failed">испорука није успела</string>
- <string name="preparing_image">Припремам слику за пренос</string>
- <string name="preparing_images">Припремам слике за пренос</string>
- <string name="sharing_files_please_wait">Делим фајлове, сачекајте…</string>
- <string name="action_clear_history">Очисти историјат</string>
- <string name="clear_conversation_history">Брисање историјата преписки</string>
- <string name="clear_histor_msg">Желите ли да обришете све поруке из ове преписке?
+ <string name="preparing_image">Припремам слику за слање</string>
+ <string name="preparing_images">Припремам слике за слање</string>
+ <string name="sharing_files_please_wait">Делим фајлове. Сачекај…</string>
+ <string name="action_clear_history">Обриши историјат</string>
+ <string name="clear_conversation_history">Обриши историју преписке</string>
+ <string name="clear_histor_msg">Желиш да обришеш све поруке из ове преписке?
\n
-\n<b>Упозорење:</b> Ово неће утицати на поруке складиштене на осталим уређајима или серверима.</string>
- <string name="delete_file_dialog">Обриши датотеку</string>
- <string name="delete_file_dialog_msg">Желите ли да обришете ову датотеку?\n\n<b>Упозорење:</b> Ово неће утицати на копије ове датотеке складиштене на осталим уређајима или серверима.</string>
- <string name="choose_presence">Изаберите уређај</string>
+\n<b>Упозорење:</b> Ово неће утицати на поруке смештене на осталим уређајима или серверима.</string>
+ <string name="delete_file_dialog">Обриши фајл</string>
+ <string name="delete_file_dialog_msg">Да ли си сигуран/на да желиш да обришеш овај фајл?
+\n
+\n<b>Упозорење:</b> Ово неће утицати на копије овог фајла смештене на осталим уређајима или серверима. </string>
+ <string name="choose_presence">Изабери уређај</string>
<string name="send_unencrypted_message">Пошаљи нешифровану поруку</string>
<string name="send_message">Пошаљи поруку</string>
- <string name="send_message_to_x">Пошаљи поруку за %s</string>
+ <string name="send_message_to_x">Пошаљи поруку ка %s</string>
<string name="send_omemo_x509_message">Пошаљи v\\ОМЕМО шифровану поруку</string>
<string name="your_nick_has_been_changed">Нови надимак је у употреби</string>
<string name="send_unencrypted">Пошаљи нешифровано</string>
- <string name="decryption_failed">Шифровање није успело. Можда немате одговарајући лични кључ.</string>
- <string name="openkeychain_required">Отворени кључарник</string>
+ <string name="decryption_failed">Дешифровање није успело. Можда немаш одговарајући приватни кључ.</string>
+ <string name="openkeychain_required">OpenKeychain</string>
<string name="restart">Поново покрени</string>
<string name="install">Инсталирај</string>
- <string name="openkeychain_not_installed">Инсталирајте Отворени кључарник</string>
+ <string name="openkeychain_not_installed">Инсталирај OpenKeychain</string>
<string name="offering">нудим…</string>
<string name="waiting">чекам…</string>
- <string name="no_pgp_key">Нема ОпенПГП кључа</string>
- <string name="contact_has_no_pgp_key">Није могуће шифровати вашу поруку јер контакт није објавио свој јавни кључ.\n\n<small>Замолите контакт да подеси ОпенПГП.</small></string>
- <string name="no_pgp_keys">Нема ОпенПГП кључева</string>
- <string name="contacts_have_no_pgp_keys">Није могуће шифровати вашу поруку јер контакти нису објавили своје јавне кључеве.\n\n<small>Замолите контакте да подесе ОпенПГП.</small></string>
+ <string name="no_pgp_key">Није пронађен OpenPGP кључ</string>
+ <string name="contact_has_no_pgp_key">Није могуће шифровати твоју поруку јер контакт није објавио свој јавни кључ.
+\n
+\n<small>Замоли контакт да подеси OpenPGP.</small></string>
+ <string name="no_pgp_keys">Нису пронађени OpenPGP кључеви</string>
+ <string name="contacts_have_no_pgp_keys">Није могуће шифровати твоју поруку јер контакти нису објавили своје јавне кључеве.
+\n
+\n<small>Замоли контакте да подесе OpenPGP.</small></string>
<string name="pref_general">Опште</string>
- <string name="pref_accept_files">Прихватај фајлове</string>
+ <string name="pref_accept_files">Прихватање фајлова</string>
<string name="pref_accept_files_summary">Аутоматски прихватај фајлове мање од…</string>
- <string name="pref_attachments">Прилози</string>
+ <string name="pref_attachments">Накачени фајлови</string>
<string name="pref_notification_settings">Обавештење</string>
- <string name="pref_vibrate">Вибрирај</string>
- <string name="pref_vibrate_summary">Вибрирање кад стигне нова порука</string>
- <string name="pref_led">ЛЕД светло</string>
- <string name="pref_led_summary">Трептање ЛЕД светла кад стигне нова порука</string>
- <string name="pref_ringtone">Звук</string>
+ <string name="pref_vibrate">Вибрација</string>
+ <string name="pref_vibrate_summary">Завибрирај кад стигне нова порука</string>
+ <string name="pref_led">LED обавештења</string>
+ <string name="pref_led_summary">Затрепери лампицом за обавештења кад стигне нова порука</string>
+ <string name="pref_ringtone">Мелодија звона</string>
<string name="pref_notification_sound">Звук обавештења</string>
<string name="pref_notification_sound_summary">Звук обавештења нових порука</string>
- <string name="pref_call_ringtone_summary">Мелодија долазног позива</string>
- <string name="pref_notification_grace_period">Период одгоде</string>
- <string name="pref_advanced_options">Напредно</string>
- <string name="pref_never_send_crash_summary">Слањем извештаја рада помажете развоју апликације.</string>
+ <string name="pref_call_ringtone_summary">Мелодија звона долазног позива</string>
+ <string name="pref_notification_grace_period">Период тишине</string>
+ <string name="pref_advanced_options">Напредне опције</string>
+ <string name="pref_never_send_crash_summary">Слањем извештаја о грешкама помажеш развоју апликације</string>
<string name="pref_confirm_messages">Потврди поруке</string>
- <string name="pref_confirm_messages_summary">Обзнаните контактима када примите и прочитате њихове поруке</string>
+ <string name="pref_confirm_messages_summary">Обавести контакте када си примио/ла и прочитао(ла њихове поруке</string>
<string name="pref_ui_options">Сучеље</string>
- <string name="openpgp_error">Отворени кључарник је направио грешку.</string>
+ <string name="openpgp_error">OpenKeychain је произвео грешку.</string>
<string name="bad_key_for_encryption">Лош кључ за шифровање.</string>
<string name="accept">Прихвати</string>
<string name="error">Десила се грешка</string>
<string name="recording_error">Грешка</string>
- <string name="your_account">Ваш налог</string>
- <string name="send_presence_updates">Шаљи ажурирања присутности</string>
- <string name="receive_presence_updates">Примај ажурирања присутности</string>
- <string name="ask_for_presence_updates">Питај за ажурирања присутности</string>
+ <string name="your_account">Твој налог</string>
+ <string name="send_presence_updates">Шаљи пријаве присутности</string>
+ <string name="receive_presence_updates">Примај пријаве присутности</string>
+ <string name="ask_for_presence_updates">Питај за пријаве присутности</string>
<string name="attach_choose_picture">Изабери слику</string>
<string name="attach_take_picture">Фотографиши</string>
- <string name="preemptively_grant">Унапред дозволи захтев за претплатом</string>
+ <string name="preemptively_grant">Унапред прихвати захтев за пријавом</string>
<string name="error_not_an_image_file">Изабрани фајл није слика</string>
- <string name="error_compressing_image">Не могу преобратити датотеку фотографије</string>
- <string name="error_file_not_found">Фајл није нађен</string>
- <string name="error_io_exception">Општа У/И грешка. Можда вам је нестало простора у складишту?</string>
- <string name="error_security_exception_during_image_copy">Апликација из које делите ову слику не даје дозволу довољну да се датотека учита.\n\n<small>Поделите слику другим претраживачем датотека</small>.</string>
- <string name="error_security_exception">Апликација из које делите овај садржај не даје довољну дозволу.</string>
+ <string name="error_compressing_image">Није могуће конвертовати слику</string>
+ <string name="error_file_not_found">Фајл није пронађен</string>
+ <string name="error_io_exception">Општа У/И грешка. Можда ти је понестало слободног простора на уређају?</string>
+ <string name="error_security_exception_during_image_copy">Апликација којом си одабрао/ла ову слику није дала неопходне дозволе да се фајл исчита.
+\n
+\n<small>Подели слику користећи други фајл менаџер</small>.</string>
+ <string name="error_security_exception">Апликација којом си поделио/ла овај фајл није дала неопходне дозволе.</string>
<string name="account_status_unknown">Непознато</string>
<string name="account_status_disabled">Привремено искључен</string>
<string name="account_status_online">На вези</string>
<string name="account_status_connecting">Повезивање\u2026</string>
- <string name="account_status_offline">Ван везе</string>
+ <string name="account_status_offline">Није на вези</string>
<string name="account_status_unauthorized">Неовлашћен</string>
- <string name="account_status_not_found">Сервер није нађен</string>
- <string name="account_status_no_internet">Нема везе</string>
+ <string name="account_status_not_found">Сервер није пронађен</string>
+ <string name="account_status_no_internet">Не постоји веза</string>
<string name="account_status_regis_fail">Регистрација није успела</string>
<string name="account_status_regis_conflict">Корисничко име је већ у употреби</string>
<string name="account_status_regis_success">Регистрација завршена</string>
<string name="account_status_regis_not_sup">Овај сервер не подржава регистрацију</string>
<string name="account_status_regis_invalid_token">Неисправан регистрациони токен</string>
- <string name="account_status_tls_error">ТЛС преговарање није успело</string>
- <string name="account_status_tls_error_domain">Непроверљив домен</string>
+ <string name="account_status_tls_error">TLS преговарање није успело</string>
+ <string name="account_status_tls_error_domain">Домен не може да се овери</string>
<string name="account_status_policy_violation">Нарушавање полисе</string>
<string name="account_status_incompatible_server">Некомпатибилан сервер</string>
<string name="account_status_stream_error">Грешка тока</string>
@@ -165,31 +173,32 @@
<string name="mgmt_account_delete">Обриши налог</string>
<string name="mgmt_account_disable">Привремено искључи</string>
<string name="mgmt_account_publish_avatar">Објави аватар</string>
- <string name="mgmt_account_publish_pgp">Објави ОпенПГП јавни кључ</string>
- <string name="unpublish_pgp">Уклони ОпенПГП кључ</string>
- <string name="unpublish_pgp_message">Желите ли заиста да уклоните ваш ОпенПГП кључ из ваше објаве присутности?\nВаши контакти више неће моћи да вам шаљу ОпенПГП шифроване поруке.</string>
- <string name="openpgp_has_been_published">ОпенПГП кључ је објављен.</string>
+ <string name="mgmt_account_publish_pgp">Објави OpenPGP јавни кључ</string>
+ <string name="unpublish_pgp">Уклони OpenPGP јавни кључ</string>
+ <string name="unpublish_pgp_message">Да ли си сигуран/на да желиш да уклониш свој OpenPGP јавни кључ из своје објаве присутности?
+\nТвоји контакти више неће моћи да ти шаљу OpenPGP шифроване поруке.</string>
+ <string name="openpgp_has_been_published">OpenPGP јавни кључ је објављен.</string>
<string name="mgmt_account_enable">Укључи налог</string>
- <string name="mgmt_account_delete_confirm_text">Брисањем налога бришете и целу историју ваших разговора.</string>
+ <string name="mgmt_account_delete_confirm_text">Да ли си сигуран/на да желиш да обришеш свој налог? Брисањем налога бришеш и целу историју својих преписки</string>
<string name="attach_record_voice">Сними глас</string>
- <string name="account_settings_jabber_id">ИксМПП адреса</string>
- <string name="block_jabber_id">Блокирај ИксМПП адресу</string>
+ <string name="account_settings_jabber_id">XMPP адреса</string>
+ <string name="block_jabber_id">Блокирај XMPP адресу</string>
<string name="account_settings_example_jabber_id">korisnickoime@primer.com</string>
<string name="password">Лозинка</string>
- <string name="invalid_jid">Ово је неисправна ИксМПП адреса</string>
- <string name="error_out_of_memory">Недовољно меморије. Фотографија је превелика</string>
- <string name="add_phone_book_text">Желите ли да додате %s у ваш именик?</string>
+ <string name="invalid_jid">Ово је неисправна XMPP адреса</string>
+ <string name="error_out_of_memory">Недовољно меморије. Слика је превелика</string>
+ <string name="add_phone_book_text">Да ли желиш да додаш %s у свој именик?</string>
<string name="server_info_show_more">Подаци о серверу</string>
<string name="server_info_mam">XEP-0313: МАМ</string>
- <string name="server_info_carbon_messages">XEP-0280: копије порука</string>
- <string name="server_info_csi">XEP-0352: индикација стања клијента</string>
- <string name="server_info_blocking">XEP-0191: наредба блокирања</string>
- <string name="server_info_roster_version">XEP-0237: верзионисање ростера</string>
- <string name="server_info_stream_management">XEP-0198: менаџмент тока</string>
- <string name="server_info_external_service_discovery">XEP-0215: Проналажење спољњих сервиса</string>
- <string name="server_info_pep">XEP-0163: PEP (аватари/ОМЕМО)</string>
- <string name="server_info_http_upload">XEP-0363: ХТТП отпремање фајлова</string>
- <string name="server_info_push">XEP-0357: „push“</string>
+ <string name="server_info_carbon_messages">XEP-0280: Message Carbons</string>
+ <string name="server_info_csi">XEP-0352: Client State Indication</string>
+ <string name="server_info_blocking">XEP-0191: Blocking Command</string>
+ <string name="server_info_roster_version">XEP-0237: Roster Versioning</string>
+ <string name="server_info_stream_management">XEP-0198: Stream Management</string>
+ <string name="server_info_external_service_discovery">XEP-0215: External Service Discovery</string>
+ <string name="server_info_pep">XEP-0163: PEP (Avatars / OMEMO)</string>
+ <string name="server_info_http_upload">XEP-0363: HTTP File Upload</string>
+ <string name="server_info_push">XEP-0357: Push</string>
<string name="server_info_available">доступан</string>
<string name="server_info_unavailable">недоступан</string>
<string name="missing_public_keys">Недостају објаве јавног кључа</string>
@@ -200,9 +209,9 @@
<string name="last_seen_hours">виђен/а пре %d сати</string>
<string name="last_seen_day">виђен/а јуче</string>
<string name="last_seen_days">виђен/а пре %d дана</string>
- <string name="install_openkeychain">Шифрована порука. Инсталирајте Отворени кључарник да је дешифрујете.</string>
- <string name="openpgp_messages_found">Пронаћене су нове ОпенПГП шифроване поруке</string>
- <string name="openpgp_key_id">ИД ОпенПГП кључа</string>
+ <string name="install_openkeychain">Шифрована порука. Инсталирај OpenKeychain да је дешифрујеш.</string>
+ <string name="openpgp_messages_found">Пронађене су нове OpenPGP шифроване поруке</string>
+ <string name="openpgp_key_id">ID OpenPGP кључа</string>
<string name="omemo_fingerprint">ОМЕМО отисак</string>
<string name="omemo_fingerprint_x509">v\\ОМЕМО отисак</string>
<string name="omemo_fingerprint_selected_message">ОМЕМО отисак (порекло поруке)</string>
@@ -222,37 +231,41 @@
<string name="select">Изабери</string>
<string name="contact_already_exists">Контакт већ постоји</string>
<string name="join">Придружи се</string>
- <string name="channel_full_jid_example">channel@conference.example.com/nick</string>
- <string name="channel_bare_jid_example">channel@conference.example.com</string>
+ <string name="channel_full_jid_example">kanal@konferencija.primer.com/nadimak</string>
+ <string name="channel_bare_jid_example">kanal@konferencija.primer.com</string>
<string name="save_as_bookmark">Сачувај као обележивач</string>
<string name="delete_bookmark">Обриши обележивач</string>
- <string name="destroy_room">Уклони групно ћаскање</string>
+ <string name="destroy_room">Уклони групну преписку</string>
<string name="destroy_channel">Уклони канал</string>
- <string name="destroy_room_dialog">Да ли сигурно жеите да уклоните ово групно ћаскање?\n\n<b>Упозорење:</b> Групно ћаскање ће бити потпуно обрисано са сервера.</string>
- <string name="destroy_channel_dialog">Да ли сигурно жеите да уклоните овај јавни канал?\n\n<b>Упозорење:</b> Канал ће бити потпуно обрисан са сервера.</string>
- <string name="could_not_destroy_room">Не могу уклонити групно ћаскање</string>
- <string name="could_not_destroy_channel">Не могу уклонити канал</string>
- <string name="action_edit_subject">Уреди предмет групног ћаскања</string>
+ <string name="destroy_room_dialog">Да ли си сигуран/на да желиш да уклониш ову групну преписку?
+\n
+\n<b>Упозорење:</b> Групна преписка ће бити потпуно обрисана са сервера.</string>
+ <string name="destroy_channel_dialog">Да ли си сигуран/на да желиш да уклониш овај јавни канал?
+\n
+\n<b>Упозорење:</b> Канал ће бити потпуно обрисан са сервера.</string>
+ <string name="could_not_destroy_room">Није могуће уклонити групну преписку</string>
+ <string name="could_not_destroy_channel">Није могуће уклонити канал</string>
+ <string name="action_edit_subject">Измени предмет групне преписке</string>
<string name="topic">Тема</string>
- <string name="joining_conference">Улазим у групно ћаскање…</string>
+ <string name="joining_conference">Улазим у групну преписку…</string>
<string name="leave">Напусти</string>
- <string name="contact_added_you">Контакт вас је додао на списак контаката</string>
- <string name="add_back">Додај га</string>
- <string name="contact_has_read_up_to_this_point">%s је прочитао довде</string>
- <string name="contacts_have_read_up_to_this_point">%s је прочитао/ла довде</string>
+ <string name="contact_added_you">Контакт вас је додао на свој списак контаката</string>
+ <string name="add_back">Додај га код себе</string>
+ <string name="contact_has_read_up_to_this_point">%s је прочитао/ла довде</string>
+ <string name="contacts_have_read_up_to_this_point">%s су прочитали довде</string>
<string name="contacts_and_n_more_have_read_up_to_this_point">%1$s + %2$d других су прочитали довде</string>
<string name="everyone_has_read_up_to_this_point">Сви су прочитали довде</string>
<string name="publish">Објави</string>
- <string name="touch_to_choose_picture">Тапните аватар да изаберете слику из галерије</string>
+ <string name="touch_to_choose_picture">Притисни аватар да изабереш слику из галерије</string>
<string name="publishing">Објављујем…</string>
- <string name="error_publish_avatar_server_reject">Сервер је одбио вашу објаву</string>
- <string name="error_publish_avatar_converting">Не могу преобратити вашу фотографију</string>
- <string name="error_saving_avatar">Не могох да сачувам аватар на диск</string>
- <string name="or_long_press_for_default">(или притисните дуго да вратите подразумевани)</string>
- <string name="error_publish_avatar_no_server_support">Ваш сервер не подржава објаву аватара</string>
+ <string name="error_publish_avatar_server_reject">Сервер је одбио твоју објаву</string>
+ <string name="error_publish_avatar_converting">Није могуће конвертовати твоју слику</string>
+ <string name="error_saving_avatar">Није могуће сачувати аватар на интерну меморију</string>
+ <string name="or_long_press_for_default">(или притисни дуго да вратиш подразумевани)</string>
+ <string name="error_publish_avatar_no_server_support">Твој сервер не подржава објаву аватара</string>
<string name="private_message">шапну</string>
- <string name="private_message_to">за %s</string>
- <string name="send_private_message_to">Пошаљи личну поруку за %s</string>
+ <string name="private_message_to">ка %s</string>
+ <string name="send_private_message_to">Пошаљи приватну поруку ка %s</string>
<string name="connect">Повежи</string>
<string name="account_already_exists">Овај налог већ постоји</string>
<string name="next">Следеће</string>
@@ -260,63 +273,67 @@
<string name="skip">Прескочи</string>
<string name="disable_notifications">Искључи обавештења</string>
<string name="enable">Укључи</string>
- <string name="conference_requires_password">Групно ћаскање захтева лозинку</string>
- <string name="enter_password">Унесите лозинку</string>
- <string name="request_presence_updates">Најпре захтевајте ажурирање присутности од вашег контакта.\n\n<small>Ово ће омогућити да се одреди који клијент ваш контакт користи</small>.</string>
- <string name="request_now">Захтевај одмах</string>
+ <string name="conference_requires_password">Групна преписка захтева лозинку</string>
+ <string name="enter_password">Унеси лозинку</string>
+ <string name="request_presence_updates">Прво затражи пријаве присутности од твог контакта.
+\n
+\n<small>Ово ће омогућити да се установи апликација коју твој контакт користи</small>.</string>
+ <string name="request_now">Затражи одмах</string>
<string name="ignore">Занемари</string>
- <string name="without_mutual_presence_updates"><b>Упозорење:</b> Слањем овога без обостраног ажурирања присутности може изазвати неочекиване проблеме.\n\n<small>Идите у „Детаљи контакта” да потврдите вашу претплату за присутност.</small></string>
+ <string name="without_mutual_presence_updates"><b>Упозорење:</b> Слање овога без обостране пријаве присутности може изазвати неочекиване проблеме.
+\n
+\n<small>Иди у „Детаљи контакта” да потврдиш своје пријаве присутности.</small></string>
<string name="pref_security_settings">Безбедност</string>
- <string name="pref_allow_message_correction">Дозволи исправљање порука</string>
- <string name="pref_allow_message_correction_summary">Дозвољава вашим контактима да ретроактивно уређују њихове поруке</string>
- <string name="pref_expert_options">Поставке за стручњаке</string>
- <string name="pref_expert_options_summary">Будите пажљиви са овим</string>
+ <string name="pref_allow_message_correction">Преправљање порука</string>
+ <string name="pref_allow_message_correction_summary">Дозволи својим контактима да ретроактивно измењују своје поруке</string>
+ <string name="pref_expert_options">Стручна подешавања</string>
+ <string name="pref_expert_options_summary">Буди пажљив/а са овим</string>
<string name="title_activity_about_x">О %s</string>
<string name="title_pref_quiet_hours">Тихи сати</string>
<string name="title_pref_quiet_hours_start_time">Време почетка</string>
<string name="title_pref_quiet_hours_end_time">Време завршетка</string>
<string name="title_pref_enable_quiet_hours">Укључи тихе сате</string>
- <string name="pref_quiet_hours_summary">Обавештења ће бити ућуткана за време тихих сати</string>
+ <string name="pref_quiet_hours_summary">Обавештења ће бити утишана за време тихих сати</string>
<string name="pref_expert_options_other">Остало</string>
- <string name="toast_message_omemo_fingerprint">ОМЕМО отисак копиран на клипборд</string>
- <string name="conference_banned">Забрањен вам је приступ овом групном ћаскању</string>
- <string name="conference_members_only">Ово групно ћаскање је само за чланове</string>
+ <string name="toast_message_omemo_fingerprint">OMEMO отисак копиран у клипборд</string>
+ <string name="conference_banned">Забрањен ти је приступ овој групној преписци</string>
+ <string name="conference_members_only">Ова групна преписка је само за чланове</string>
<string name="conference_resource_constraint">Ограничење ресурса</string>
- <string name="conference_kicked">Шутнути сте из овог групног ћаскања</string>
- <string name="conference_shutdown">Групно ћаскање је угашено</string>
- <string name="conference_unknown_error">Више нисте у овом групном ћаскању</string>
- <string name="using_account">преко налога %s</string>
- <string name="hosted_on">код домаћина %s</string>
- <string name="checking_x">Проверавам %s на ХТТП домаћину</string>
- <string name="not_connected_try_again">Нисте повезани. Покушајте поново касније</string>
+ <string name="conference_kicked">Избачен/а си из ове групне преписке</string>
+ <string name="conference_shutdown">Групнa преписка је угашена</string>
+ <string name="conference_unknown_error">Ниси више у овој групној преписци</string>
+ <string name="using_account">користећи налог %s</string>
+ <string name="hosted_on">хостовано на %s</string>
+ <string name="checking_x">Проверавам %s на HTTP серверу</string>
+ <string name="not_connected_try_again">Ниси повезан/а. Покушај поново касније</string>
<string name="check_x_filesize">Провери величину %s</string>
- <string name="check_x_filesize_on_host">Провери величину %1$s na %2$s</string>
+ <string name="check_x_filesize_on_host">Провери величину %1$s на %2$s</string>
<string name="message_options">Опције поруке</string>
<string name="quote">Цитирај</string>
- <string name="paste_as_quote">Налепи као навод</string>
- <string name="copy_original_url">Копирај изворни УРЛ</string>
+ <string name="paste_as_quote">Налепи као цитат</string>
+ <string name="copy_original_url">Копирај оригинални линк</string>
<string name="send_again">Пошаљи поново</string>
- <string name="file_url">УРЛ фајла</string>
- <string name="url_copied_to_clipboard">УРЛ је копиран на клипборд</string>
- <string name="jabber_id_copied_to_clipboard">ИксМПП адреса копирана на клипборд</string>
- <string name="error_message_copied_to_clipboard">Порука грешке копирана на клипборд</string>
+ <string name="file_url">Линк ка фајлу</string>
+ <string name="url_copied_to_clipboard">Линк је копиран у клипборд</string>
+ <string name="jabber_id_copied_to_clipboard">XMPP адреса копирана у клипборд</string>
+ <string name="error_message_copied_to_clipboard">Текст грешке копиран у клипборд</string>
<string name="web_address">веб адреса</string>
- <string name="scan_qr_code">Очитај 2Д бар-кôд</string>
- <string name="show_qr_code">Прикажи 2Д бар-кôд</string>
+ <string name="scan_qr_code">Очитај QR кôд</string>
+ <string name="show_qr_code">Прикажи QR кôд</string>
<string name="show_block_list">Прикажи списак блокираних</string>
<string name="account_details">Детаљи налога</string>
<string name="confirm">Потврди</string>
<string name="try_again">Покушај поново</string>
<string name="pref_keep_foreground_service">Сервис у првом плану</string>
- <string name="pref_keep_foreground_service_summary">Спречава оперативни систем да прекине вашу везу</string>
- <string name="pref_create_backup">Направите резерву</string>
- <string name="pref_create_backup_summary">Резерва ће бити складиштена у %s</string>
- <string name="notification_create_backup_title">Правим резерву</string>
- <string name="notification_backup_created_title">Ваша резерва је направљена</string>
- <string name="notification_backup_created_subtitle">Резерве су складиштене у %s</string>
- <string name="restoring_backup">Учитавам резерву</string>
- <string name="notification_restored_backup_title">Ваша резерва је учитана</string>
- <string name="notification_restored_backup_subtitle">Не заборавите да омогућите налог</string>
+ <string name="pref_keep_foreground_service_summary">Спречава оперативни систем да прекине твоју везу</string>
+ <string name="pref_create_backup">Направи резервну копију</string>
+ <string name="pref_create_backup_summary">Резервна копија ће бити смештена у %s</string>
+ <string name="notification_create_backup_title">Правим резервну копију</string>
+ <string name="notification_backup_created_title">Твоја резервна копија је направљена</string>
+ <string name="notification_backup_created_subtitle">Резервне копије су смештене у %s</string>
+ <string name="restoring_backup">Враћам резервну копију</string>
+ <string name="notification_restored_backup_title">Твоја резервна копија је враћена</string>
+ <string name="notification_restored_backup_subtitle">Не заборави да омогућиш налог.</string>
<string name="choose_file">Изабери фајл</string>
<string name="receiving_x_file">Примам %1$s (%2$d%% завршено)</string>
<string name="download_x_file">Преузми %s</string>
@@ -324,96 +341,97 @@
<string name="file">фајл</string>
<string name="open_x_file">Отвори %s</string>
<string name="sending_file">шаљем (%1$d%% завршено)</string>
- <string name="preparing_file">Припремам датотеку за пренос</string>
+ <string name="preparing_file">Припремам фајл за слање</string>
<string name="x_file_offered_for_download">%s понуђен за преузимање</string>
<string name="cancel_transmission">Прекини пренос</string>
- <string name="file_transmission_failed">не могу поделити датотеку</string>
- <string name="file_transmission_cancelled">пренос датотеке је прекинут</string>
- <string name="file_deleted">Датотека је обрисана</string>
- <string name="no_application_found_to_open_file">Нема апликације за отварање датотеке</string>
- <string name="no_application_found_to_open_link">Нема апликације за отварање везе</string>
- <string name="no_application_found_to_view_contact">Нема апликације за приказ контакта</string>
+ <string name="file_transmission_failed">није могуће поделити фајл</string>
+ <string name="file_transmission_cancelled">пренос фајла је прекинут</string>
+ <string name="file_deleted">Фајл је обрисан</string>
+ <string name="no_application_found_to_open_file">Није пронађена апликација за отварање фајла</string>
+ <string name="no_application_found_to_open_link">Није пронађена апликација за отварање линка</string>
+ <string name="no_application_found_to_view_contact">Није пронађена апликација за приказ контакта</string>
<string name="pref_show_dynamic_tags">Динамичке ознаке</string>
- <string name="pref_show_dynamic_tags_summary">Приказ ознака испод контаката</string>
+ <string name="pref_show_dynamic_tags_summary">Прикажи ознаке испод контаката</string>
<string name="enable_notifications">Укључи обавештења</string>
- <string name="no_conference_server_found">Сервер групног ћаскања није нађен</string>
- <string name="conference_creation_failed">Не могу направити групно ћаскање</string>
+ <string name="no_conference_server_found">Није пронађен сервер групне преписке</string>
+ <string name="conference_creation_failed">Није могуће направити групну преписку</string>
<string name="account_image_description">Аватар налога</string>
- <string name="copy_omemo_clipboard_description">Копирај ОМЕМО отисак на клипборд</string>
+ <string name="copy_omemo_clipboard_description">Копирај OMEMO отисак у клипборд</string>
<string name="regenerate_omemo_key">Поново генериши ОМЕМО кључ</string>
- <string name="clear_other_devices">Очисти уређаје</string>
- <string name="error_no_keys_to_trust_presence">Нема употребљивих кључева за овај контакт.\nПроверите да ли сте одобрили узајамно ажурирање присутности.</string>
- <string name="error_trustkeys_title">Нешто је пошло по злу</string>
+ <string name="clear_other_devices">Почисти уређаје</string>
+ <string name="error_no_keys_to_trust_presence">Нема употребљивих кључева за овај контакт.
+\nПровери да ли обоје имате пријаву присутности.</string>
+ <string name="error_trustkeys_title">Нешто није како треба</string>
<string name="fetching_history_from_server">Добављам историјат са сервера</string>
<string name="no_more_history_on_server">Нема више историјата на серверу</string>
<string name="updating">Ажурирам…</string>
<string name="password_changed">Лозинка промењена!</string>
- <string name="could_not_change_password">Не могох да променим лозинку</string>
+ <string name="could_not_change_password">Није могуће променити лозинку</string>
<string name="change_password">Промени лозинку</string>
- <string name="current_password">Текућа лозинка</string>
+ <string name="current_password">Тренутна лозинка</string>
<string name="new_password">Нова лозинка</string>
<string name="password_should_not_be_empty">Лозинка не може бити празна</string>
<string name="enable_all_accounts">Укључи све налоге</string>
<string name="disable_all_accounts">Искључи све налоге</string>
- <string name="perform_action_with">Изврши радњу са</string>
+ <string name="perform_action_with">Изврши радњу користећи</string>
<string name="no_affiliation">Без припадности</string>
- <string name="no_role">Ван везе</string>
- <string name="outcast">Изгнаник</string>
+ <string name="no_role">Није на вези</string>
+ <string name="outcast">Забрањен/а</string>
<string name="member">Члан</string>
<string name="advanced_mode">Напредни режим</string>
- <string name="grant_membership">Одобри админ. привилегије</string>
- <string name="remove_membership">Укини админ. привилегије</string>
+ <string name="grant_membership">Одобри чланске привилегије</string>
+ <string name="remove_membership">Укини чланске привилегије</string>
<string name="grant_admin_privileges">Одобри админ. привилегије</string>
<string name="remove_admin_privileges">Одобри админ. привилегије</string>
<string name="grant_owner_privileges">Одобри власничке привилегије</string>
<string name="remove_owner_privileges">Укини власничке привилегије</string>
- <string name="remove_from_room">Уклони из групног ћаскања</string>
+ <string name="remove_from_room">Уклони из групне преписке</string>
<string name="remove_from_channel">Уклони из канала</string>
- <string name="could_not_change_affiliation">Не могох да изменим припадност за %s</string>
- <string name="ban_from_conference">Забрани приступ групном ћаскању</string>
- <string name="ban_from_channel">Забрани приступ каналу</string>
- <string name="removing_from_public_conference">Покушавате да уклоните %s из јавног канала. Ово се за стално постиже једино забраном приступа кориснику.</string>
- <string name="ban_now">Забрани одмах</string>
- <string name="could_not_change_role">Не могох да изменим улогу за %s</string>
- <string name="conference_options">Поставке приватног групног ћаскања</string>
- <string name="channel_options">Поставке јавног канала</string>
- <string name="members_only">Лична, само чланови</string>
- <string name="non_anonymous">Начините ИксМПП адресу видљиву свима</string>
- <string name="moderated">Начините канал модерисаним</string>
- <string name="you_are_not_participating">Не учествујете</string>
- <string name="modified_conference_options">Опције групног ћаскања измењене!</string>
- <string name="could_not_modify_conference_options">Не могу да изменим опције групног ћаскања</string>
- <string name="never">никад</string>
- <string name="until_further_notice">до даљњег</string>
+ <string name="could_not_change_affiliation">Није могуће променити припадност за %s</string>
+ <string name="ban_from_conference">Избаци из групне преписке</string>
+ <string name="ban_from_channel">Избаци из канала</string>
+ <string name="removing_from_public_conference">Покушаваш да уклониш %s из јавног канала. Ово се постиже једино трајним избацивањем корисника.</string>
+ <string name="ban_now">Избаци одмах</string>
+ <string name="could_not_change_role">Није могуће променити улогу за %s</string>
+ <string name="conference_options">Подешавања приватне групне преписке</string>
+ <string name="channel_options">Подешавања јавног канала</string>
+ <string name="members_only">Приватно, само чланови</string>
+ <string name="non_anonymous">Учини XMPP адресе видљиве свима</string>
+ <string name="moderated">Учини канал модерисаним</string>
+ <string name="you_are_not_participating">Не учествујеш</string>
+ <string name="modified_conference_options">Опције групне преписке измењене!</string>
+ <string name="could_not_modify_conference_options">Није могуће изменити опције групне преписке</string>
+ <string name="never">Никад</string>
+ <string name="until_further_notice">До даљњег</string>
<string name="snooze">Одложи</string>
<string name="reply">Одговори</string>
<string name="mark_as_read">Означи прочитаним</string>
<string name="pref_input_options">Унос</string>
- <string name="pref_enter_is_send">Ентер шаље</string>
- <string name="pref_display_enter_key">Прикажи Ентер тастер</string>
- <string name="pref_display_enter_key_summary">Промени тастер за емотиконе у ентер тастер</string>
+ <string name="pref_enter_is_send">Enter шаље</string>
+ <string name="pref_display_enter_key">Прикажи Enter дугме</string>
+ <string name="pref_display_enter_key_summary">Промени дугме за емотиконе у Enter дугме</string>
<string name="audio">звук</string>
<string name="video">видео</string>
<string name="image">слика</string>
- <string name="pdf_document">ПДФ документ</string>
- <string name="apk">Апликација за Андроид</string>
+ <string name="pdf_document">PDF документ</string>
+ <string name="apk">Аndroid апликација</string>
<string name="vcard">Контакт</string>
<string name="avatar_has_been_published">Аватар је објављен!</string>
<string name="sending_x_file">Шаљем %s</string>
<string name="offering_x_file">Нудим %s</string>
<string name="hide_offline">Сакриј неповезане</string>
<string name="contact_is_typing">%s куца…</string>
- <string name="contact_has_stopped_typing">%s престаде да куца</string>
+ <string name="contact_has_stopped_typing">%s је престао/ла да куца</string>
<string name="contacts_are_typing">%s куцају…</string>
- <string name="contacts_have_stopped_typing">%s престаше да куцају</string>
- <string name="pref_chat_states">Обавештења о куцању</string>
- <string name="pref_chat_states_summary">Обзнаните контактима када им куцате поруке</string>
+ <string name="contacts_have_stopped_typing">%s су престали да куцају</string>
+ <string name="pref_chat_states">Индикатори куцања</string>
+ <string name="pref_chat_states_summary">Дозволи својим контактима да знају када им куцаш поруке</string>
<string name="send_location">Пошаљи локацију</string>
<string name="show_location">Прикажи локацију</string>
- <string name="no_application_found_to_display_location">Нема апликације за приказ локације</string>
+ <string name="no_application_found_to_display_location">Није пронађена апликација за приказ локације</string>
<string name="location">Локација</string>
- <string name="title_undo_swipe_out_group_chat">Напустили сте групно ћаскање</string>
- <string name="title_undo_swipe_out_channel">Напустили сте јавни канал</string>
+ <string name="title_undo_swipe_out_group_chat">Напустиo/ла си групну преписку</string>
+ <string name="title_undo_swipe_out_channel">Напустиo/ла си јавни канал</string>
<string name="pref_dont_trust_system_cas_title">Не поуздај се у системска сертификациона тела</string>
<string name="pref_dont_trust_system_cas_summary">Сви сертификати морају ручно да се одобре</string>
<string name="pref_remove_trusted_certificates_title">Уклони сертификате</string>
@@ -431,52 +449,52 @@
<string name="none">Ниједна</string>
<string name="recently_used">Недавно коришћена</string>
<string name="choose_quick_action">Изаберите брзу радњу</string>
- <string name="search_contacts">Тражи контакте</string>
- <string name="send_private_message">Пошаљи личну поруку</string>
- <string name="user_has_left_conference">%1$s је напустио/ла групно ћаскање</string>
+ <string name="search_contacts">Претражи контакте</string>
+ <string name="send_private_message">Пошаљи приватну поруку</string>
+ <string name="user_has_left_conference">%1$s је напустио/ла групну преписку</string>
<string name="username">Корисничко име</string>
<string name="username_hint">Корисничко име</string>
<string name="invalid_username">Ово није исправно корисничко име</string>
- <string name="download_failed_server_not_found">Преузимање није успело: сервер није нађен</string>
- <string name="download_failed_file_not_found">Преузимање није успело: фајл није нађен</string>
- <string name="download_failed_could_not_connect">Преузимање није успело: не могох да се повежем са домаћином</string>
- <string name="download_failed_could_not_write_file">Преузимање није успело: не могох да упишем фајл</string>
+ <string name="download_failed_server_not_found">Преузимање није успело: сервер није пронађен</string>
+ <string name="download_failed_file_not_found">Преузимање није успело: фајл није пронађен</string>
+ <string name="download_failed_could_not_connect">Преузимање није успело: није могуће повезивање са сервером</string>
+ <string name="download_failed_could_not_write_file">Преузимање није успело: није могуће уписивање фајла</string>
<string name="account_status_tor_unavailable">Тор мрежа недоступна</string>
- <string name="account_status_bind_failure">Неуспех свезивања</string>
+ <string name="account_status_bind_failure">Неуспех везивања</string>
<string name="account_status_host_unknown">Сервер није одговоран за овај домен</string>
<string name="server_info_broken">Оштећен</string>
- <string name="pref_presence_settings">Доступност</string>
- <string name="pref_away_when_screen_off">Увек када је уређај закљчан</string>
- <string name="pref_away_when_screen_off_summary">Прикажи ме одсутним када је уређај закљчан</string>
- <string name="pref_dnd_on_silent_mode">Заузет у нечујном режиму</string>
- <string name="pref_dnd_on_silent_mode_summary">Прикажи ме заузетум у нечујном режиму</string>
- <string name="pref_treat_vibrate_as_silent">Вибрација је нечујни режим</string>
- <string name="pref_treat_vibrate_as_dnd_summary">Прикажи ме заузетум у режиму вибрације</string>
- <string name="pref_show_connection_options">Проширене поставке повезивања</string>
- <string name="pref_show_connection_options_summary">Приказ домаћина и порта у поставкама налога</string>
+ <string name="pref_presence_settings">Присутност</string>
+ <string name="pref_away_when_screen_off">Одсутан/на кад је уређај закључан</string>
+ <string name="pref_away_when_screen_off_summary">Прикажи ме одсутним/ом када је уређај закључан</string>
+ <string name="pref_dnd_on_silent_mode">Заузет/а у нечујном режиму</string>
+ <string name="pref_dnd_on_silent_mode_summary">Прикажи ме заузетим/ом у нечујном режиму</string>
+ <string name="pref_treat_vibrate_as_silent">Третирај вибрацију као нечујни режим</string>
+ <string name="pref_treat_vibrate_as_dnd_summary">Прикажи ме заузетим/ом у режиму вибрације</string>
+ <string name="pref_show_connection_options">Назив сервера и порт</string>
+ <string name="pref_show_connection_options_summary">Прикажи додатна подешавања везе при отварању налога</string>
<string name="hostname_example">xmpp.primer.com</string>
- <string name="action_add_account_with_certificate">Пријавите се сертификатом</string>
- <string name="unable_to_parse_certificate">Не могу прочитати сертификат</string>
- <string name="mam_prefs">Поставке архивисања</string>
- <string name="server_side_mam_prefs">Серверске поставке архивисања</string>
- <string name="fetching_mam_prefs">Добављам поставке архивисања, сачекајте…</string>
- <string name="unable_to_fetch_mam_prefs">Не могу да добавим поставке архивисања</string>
- <string name="captcha_required">КЕПЧА је обавезна</string>
- <string name="captcha_hint">Унесите текст са слике изнад</string>
+ <string name="action_add_account_with_certificate">Пријави се сертификатом</string>
+ <string name="unable_to_parse_certificate">Није могуће ишчитати сертификат</string>
+ <string name="mam_prefs">Подешавања архивирања</string>
+ <string name="server_side_mam_prefs">Серверска подешавања архивирања</string>
+ <string name="fetching_mam_prefs">Добављам подешавања архивирања. Сачекај…</string>
+ <string name="unable_to_fetch_mam_prefs">Није могуће добавити подешавања архивирања</string>
+ <string name="captcha_required">CAPTCHA је обавезан</string>
+ <string name="captcha_hint">Унеси текст са слике изнад</string>
<string name="certificate_chain_is_not_trusted">Неповерљив ланац сертификата</string>
- <string name="jid_does_not_match_certificate">ИксМПП адреса се не слаже са сертификатом</string>
+ <string name="jid_does_not_match_certificate">XMPP адреса се не слаже са сертификатом</string>
<string name="action_renew_certificate">Обнови сертификат</string>
- <string name="error_fetching_omemo_key">Грешка добављања ОМЕМО кључа!</string>
+ <string name="error_fetching_omemo_key">Грешка у добављању OMEMO кључа!</string>
<string name="verified_omemo_key_with_certificate">Оверен ОМЕМО кључ помоћу сертификата!</string>
- <string name="device_does_not_support_certificates">Ваш уређај не подржава избор сертификата клијента!</string>
+ <string name="device_does_not_support_certificates">Твој уређај не подржава одабране клијентске сертификате!</string>
<string name="pref_connection_options">Повезивање</string>
<string name="pref_use_tor">Повежи се преко Тора</string>
- <string name="pref_use_tor_summary">Тунеловање свих веза кроз Тор мрежу. Захтева Орбот</string>
- <string name="account_settings_hostname">Име домаћина</string>
+ <string name="pref_use_tor_summary">Спроведи сав саобраћај кроз Тор мрежу. Захтева Орбот</string>
+ <string name="account_settings_hostname">Назив сервера</string>
<string name="account_settings_port">Порт</string>
<string name="hostname_or_onion">Серверска или .onion адреса</string>
<string name="not_a_valid_port">Ово није исправан број порта</string>
- <string name="not_valid_hostname">Ово није исправно име домаћина</string>
+ <string name="not_valid_hostname">Ово није исправан назив сервера</string>
<string name="connected_accounts">%1$d од %2$d налога повезано</string>
<plurals name="x_messages">
<item quantity="one">%d порука</item>
@@ -484,101 +502,101 @@
<item quantity="other">%d порука</item>
</plurals>
<string name="load_more_messages">Учитај још порука</string>
- <string name="shared_file_with_x">Датотека подељена са %s</string>
+ <string name="shared_file_with_x">Фајл подељен са %s</string>
<string name="shared_image_with_x">Слика подељена са %s</string>
<string name="shared_images_with_x">Слике подељене са %s</string>
<string name="shared_text_with_x">Текст подељен са %s</string>
- <string name="no_storage_permission">Дозволите да %1$s приступи спољној меморији</string>
- <string name="no_camera_permission">Дозволите да %1$s приступи камери</string>
- <string name="sync_with_contacts">Синхронизуј са контактима</string>
- <string name="notify_on_all_messages">Обавештења за све поруке</string>
- <string name="notify_only_when_highlighted">Обавести само када ме помињу</string>
+ <string name="no_storage_permission">Дозволи да %1$s приступи спољној меморији</string>
+ <string name="no_camera_permission">Дозволи да %1$s приступи камери</string>
+ <string name="sync_with_contacts">Интеграција са имеником</string>
+ <string name="notify_on_all_messages">Обавести ме за све поруке</string>
+ <string name="notify_only_when_highlighted">Обавести ме само када ме неко спомене</string>
<string name="notify_never">Обавештења искључена</string>
<string name="notify_paused">Обавештења паузирана</string>
<string name="pref_picture_compression">Компресија слике</string>
- <string name="always">увек</string>
+ <string name="always">Увек</string>
<string name="large_images_only">Само велике слике</string>
<string name="battery_optimizations_enabled">Оптимизација батерије је укључена</string>
<string name="disable">Искључи</string>
- <string name="selection_too_large">Назначена површина је превелика</string>
+ <string name="selection_too_large">Означена површина је превелика</string>
<string name="no_accounts">(Нема активираних налога)</string>
- <string name="this_field_is_required">Ово поље је захтевано</string>
- <string name="correct_message">Исправи поруку</string>
- <string name="send_corrected_message">Пошаљи исправљену поруку</string>
- <string name="this_account_is_disabled">Искључили сте овај налог</string>
- <string name="security_error_invalid_file_access">Безбедносна грешка: неисправан приступ датотеци!</string>
- <string name="no_application_to_share_uri">Нема апликације за дељење ресурса</string>
- <string name="share_uri_with">Подели везу помоћу…</string>
- <string name="agree_and_continue">Сложи се и настави</string>
- <string name="your_full_jid_will_be">Ваша цела ИксМПП адреса ће бити: %s</string>
+ <string name="this_field_is_required">Ово поље је обавезно</string>
+ <string name="correct_message">Преправи поруку</string>
+ <string name="send_corrected_message">Пошаљи преправљену поруку</string>
+ <string name="this_account_is_disabled">Искључио/ла си овај налог</string>
+ <string name="security_error_invalid_file_access">Безбедносна грешка: неисправан приступ фајлу!</string>
+ <string name="no_application_to_share_uri">Није пронађена апликација за дељење линкова</string>
+ <string name="share_uri_with">Подели линк користећи…</string>
+ <string name="agree_and_continue">Слажем се, настави</string>
+ <string name="your_full_jid_will_be">Твоја пуна XMPP адреса ће бити: %s</string>
<string name="create_account">Направи налог</string>
- <string name="use_own_provider">Користићу сопствени провајдер</string>
- <string name="pick_your_username">Одредите ваше корисничко име</string>
- <string name="pref_manually_change_presence">Ручно мењај доступност</string>
- <string name="pref_manually_change_presence_summary">Поставите присутност при измени ваше поруке стања.</string>
- <string name="status_message">Порука стања</string>
- <string name="presence_chat">Слободан за ћаскање</string>
+ <string name="use_own_provider">Користићу свог провајдера</string>
+ <string name="pick_your_username">Одабери своје корисничко име</string>
+ <string name="pref_manually_change_presence">Ручно мењај присутност</string>
+ <string name="pref_manually_change_presence_summary">Постави присутност при измени своје статусне поруке.</string>
+ <string name="status_message">Статусна порука</string>
+ <string name="presence_chat">Слободан/на за преписку</string>
<string name="presence_online">На вези</string>
- <string name="presence_away">Одсутан</string>
- <string name="presence_xa">Недоступан</string>
- <string name="presence_dnd">Заузет</string>
- <string name="secure_password_generated">Безбедна лозинка је направљена</string>
- <string name="device_does_not_support_battery_op">Ваш уређај не подржава искључивање оптимизације батерије</string>
- <string name="registration_please_wait">Регистрација није успела: покушајте поново касније</string>
- <string name="registration_password_too_weak">Регистрација није успела: лозинка преслаба</string>
- <string name="choose_participants">Додај учеснике</string>
- <string name="creating_conference">Правим групно ћаскање…</string>
- <string name="invite_again">Пошаљи поново</string>
+ <string name="presence_away">Одсутан/на</string>
+ <string name="presence_xa">Недоступан/на</string>
+ <string name="presence_dnd">Заузет/а</string>
+ <string name="secure_password_generated">Јака лозинка је направљена</string>
+ <string name="device_does_not_support_battery_op">Твој уређај не подржава искључивање оптимизације батерије</string>
+ <string name="registration_please_wait">Регистрација није успела: покушај поново касније</string>
+ <string name="registration_password_too_weak">Регистрација није успела: лозинка превише слаба</string>
+ <string name="choose_participants">Одабери учеснике</string>
+ <string name="creating_conference">Правим групну преписку…</string>
+ <string name="invite_again">Позови поново</string>
<string name="gp_disable">Искључи</string>
<string name="gp_short">Кратак</string>
<string name="gp_medium">Средњи</string>
<string name="gp_long">Дуг</string>
- <string name="pref_broadcast_last_activity">Објави употребу</string>
- <string name="pref_broadcast_last_activity_summary">Обзнаните контакте кад користите Конверзацију</string>
+ <string name="pref_broadcast_last_activity">Последњи пут виђен/а</string>
+ <string name="pref_broadcast_last_activity_summary">Дозволи својим контактима да виде када си последњи пут користио/ла апликацију</string>
<string name="pref_privacy">Приватност</string>
<string name="pref_theme_options">Тема</string>
- <string name="pref_theme_options_summary">Избор палете боја</string>
- <string name="pref_theme_automatic">Аутопатски</string>
- <string name="pref_theme_light">Светла</string>
- <string name="pref_theme_dark">Тамна</string>
- <string name="unable_to_connect_to_keychain">Не могу да се повежем са Отвореним кључарником</string>
+ <string name="pref_theme_options_summary">Изабери палету боја</string>
+ <string name="pref_theme_automatic">Аутоматски</string>
+ <string name="pref_theme_light">Светли</string>
+ <string name="pref_theme_dark">Тамни</string>
+ <string name="unable_to_connect_to_keychain">Није могуће повезати се на OpenKeychain</string>
<string name="this_device_is_no_longer_in_use">Овај уређај више није у употреби</string>
<string name="type_pc">Рачунар</string>
<string name="type_phone">Мобилни телефон</string>
<string name="type_tablet">Таблет</string>
<string name="type_web">Веб прегледач</string>
<string name="type_console">Конзола</string>
- <string name="payment_required">Захтевано је плаћање</string>
- <string name="missing_internet_permission">Дозволите приступ интернету</string>
+ <string name="payment_required">Плаћање је обавезно</string>
+ <string name="missing_internet_permission">Дозволи приступ интернету</string>
<string name="me">Ја</string>
- <string name="contact_asks_for_presence_subscription">Контакт пита за претплату на ажурирање присутности</string>
+ <string name="contact_asks_for_presence_subscription">Контакт пита за пријаву присутности</string>
<string name="allow">Дозволи</string>
<string name="no_permission_to_access_x">Нема дозвола за приступ %s</string>
- <string name="remote_server_not_found">Удаљени сервер није нађен</string>
+ <string name="remote_server_not_found">Удаљени сервер није пронађен</string>
<string name="remote_server_timeout">Удаљени сервер се не одазива</string>
- <string name="unable_to_update_account">Не могу да ажурирам налог</string>
- <string name="report_jid_as_spammer">Пријавите ову ИксМПП адресу због нежељених порука.</string>
+ <string name="unable_to_update_account">Није могуће ажурирати налог</string>
+ <string name="report_jid_as_spammer">Пријави ову XMPP адресу због нежељених порука.</string>
<string name="pref_delete_omemo_identities">Обриши ОМЕМО идентитете</string>
<string name="delete_selected_keys">Обриши изабране кључеве</string>
- <string name="error_publish_avatar_offline">Морате бити повезани да бисте објавили ваш аватар.</string>
- <string name="show_error_message">Прикажи поруку грешке</string>
- <string name="error_message">Порука грешке</string>
- <string name="data_saver_enabled">Чувар протока укључен</string>
- <string name="device_does_not_support_data_saver">Ваш уређај не подржава искључење „Уштеде података” за %1$s.</string>
- <string name="error_unable_to_create_temporary_file">Не могу да направим привремену датотеку</string>
- <string name="this_device_has_been_verified">Овај уређај је оверен.</string>
+ <string name="error_publish_avatar_offline">Мораш бити повезан/а да би објавио/ла свој аватар.</string>
+ <string name="show_error_message">Прикажи текст грешке</string>
+ <string name="error_message">Текст грешке</string>
+ <string name="data_saver_enabled">Уштеда података укључена</string>
+ <string name="device_does_not_support_data_saver">Твој уређај не подржава искључивање уштеде података за %1$s.</string>
+ <string name="error_unable_to_create_temporary_file">Није могуће направити привремени фајл</string>
+ <string name="this_device_has_been_verified">Овај уређај је оверен</string>
<string name="copy_fingerprint">Копирај отисак</string>
<string name="verified_fingerprints">Оверени отисци</string>
- <string name="use_camera_icon_to_scan_barcode">Користи камеру за очитавање контактова бар-кôда</string>
- <string name="please_wait_for_keys_to_be_fetched">Сачекајте на добављање кључева</string>
+ <string name="use_camera_icon_to_scan_barcode">Употреби камеру за очитавање бар-кôда контакта</string>
+ <string name="please_wait_for_keys_to_be_fetched">Сачекај да се добаве кључеви</string>
<string name="share_as_barcode">Подели као бар-кôд</string>
- <string name="share_as_uri">Подели као ИксМПП УРИ</string>
- <string name="share_as_http">Подели као ХТТП везу</string>
- <string name="pref_blind_trust_before_verification">Слепо веруј и пре провере</string>
- <string name="not_trusted">Непоуздан</string>
- <string name="invalid_barcode">Неисправан 2Д бар-кôд</string>
- <string name="pref_clean_cache">Очисти кеш</string>
- <string name="pref_clean_private_storage">Очисти лично складиште</string>
+ <string name="share_as_uri">Подели као XMPP линк</string>
+ <string name="share_as_http">Подели као HTTP линк</string>
+ <string name="pref_blind_trust_before_verification">Слепо одобри пре овере</string>
+ <string name="not_trusted">Неодобрен</string>
+ <string name="invalid_barcode">Неисправан QR кôд</string>
+ <string name="pref_clean_cache">Почисти кеш</string>
+ <string name="pref_clean_private_storage">Почисти приватно складиште</string>
<string name="verify_omemo_keys">Овери ОМЕМО кључеве</string>
<string name="show_inactive_devices">Прикажи неактивне</string>
<string name="hide_inactive_devices">Сакриј неактивне</string>
@@ -617,9 +635,9 @@
<string name="encrypting_message">Шифрујем поруку</string>
<string name="transcoding_video">Компресујем видео</string>
<string name="contact_blocked_past_tense">Контакт блокиран.</string>
- <string name="pref_notifications_from_strangers">Обавештења од непознатих</string>
- <string name="received_message_from_stranger">Примљена порука од незнанца</string>
- <string name="block_stranger">Блокирај странца</string>
+ <string name="pref_notifications_from_strangers">Обавештења од непознатих особа</string>
+ <string name="received_message_from_stranger">Примљена порука од непознате особе</string>
+ <string name="block_stranger">Блокирај непознату особу</string>
<string name="block_entire_domain">Блокирај читав домен</string>
<string name="online_right_now">на вези сада</string>
<string name="retry_decryption">Покушај дешифровање поново</string>
@@ -630,11 +648,11 @@
<string name="yesterday">Јуче</string>
<string name="server_info_partial">делимично</string>
<string name="attach_record_video">Сними видео</string>
- <string name="copy_to_clipboard">Копирај на клипборд</string>
- <string name="message_copied_to_clipboard">Порука копирана на клипборд</string>
+ <string name="copy_to_clipboard">Копирај у клипборд</string>
+ <string name="message_copied_to_clipboard">Порука копирана у клипборд</string>
<string name="message">Порука</string>
<string name="draft">Нацрт:</string>
- <string name="pref_omemo_setting_summary_always">ОМЕМО ће увек бити у употреби за један-на-један и приватна групна ћаскања.</string>
+ <string name="pref_omemo_setting_summary_always">OMEMO ће увек бити у употреби за један-на-један и приватне групне преписке.</string>
<string name="create_shortcut">Направи пречицу</string>
<string name="default_on">Подразумевано укључено</string>
<string name="default_off">Подразумевано искључено</string>
@@ -642,26 +660,467 @@
<string name="location_disabled">Дељење локације је искључено</string>
<string name="action_copy_location">Копирај локацију</string>
<string name="action_share_location">Подели локацију</string>
- <string name="action_directions">Упутства</string>
+ <string name="action_directions">Путоказ</string>
<string name="title_activity_share_location">Подели локацију</string>
<string name="title_activity_show_location">Прикажи локацију</string>
- <string name="share">Дели</string>
- <string name="please_wait">Сачекајте…</string>
- <string name="search_messages">Тражи поруке</string>
+ <string name="share">Подели</string>
+ <string name="please_wait">Сачекај…</string>
+ <string name="search_messages">Претражи поруке</string>
<string name="view_conversation">Погледај преписку</string>
<string name="copy_link">Копирај веб адресу</string>
- <string name="group_chat_avatar">Аватар групног ћаскања</string>
- <string name="host_does_not_support_group_chat_avatars">Домаћин не подржава аватар групног ћаскања</string>
- <string name="only_the_owner_can_change_group_chat_avatar">Само власник може да промени аватар групног ћаскања</string>
+ <string name="group_chat_avatar">Аватар групне преписке</string>
+ <string name="host_does_not_support_group_chat_avatars">Сервер не подржава аватаре за групне преписке</string>
+ <string name="only_the_owner_can_change_group_chat_avatar">Само власник може да промени аватар групне преписке</string>
<string name="contact_name">Име контакта</string>
<string name="nickname">Надимак</string>
<string name="group_chat_name">Име</string>
- <string name="providing_a_name_is_optional">Име је опционо</string>
- <string name="create_dialog_group_chat_name">Назив групног ћаскања</string>
- <string name="conference_destroyed">Ово групно ћаскање је обрисано</string>
+ <string name="providing_a_name_is_optional">Навођење имена није обавезно</string>
+ <string name="create_dialog_group_chat_name">Назив групне преписке</string>
+ <string name="conference_destroyed">Ова групна преписка је обрисана</string>
<string name="notification_group_messages">Поруке</string>
<string name="messages_channel_name">Поруке</string>
<string name="silent_messages_channel_name">Тихе поруке</string>
<string name="video_compression_channel_name">Видео компресија</string>
- <string name="rtp_state_declined_or_busy">Заузет</string>
-</resources>
+ <string name="rtp_state_declined_or_busy">Заузет/а</string>
+ <string name="encrypted_with_omemo">Шифровано користећи OMEMO</string>
+ <string name="verify_x">Овери %s</string>
+ <string name="search_countries">Претражи земље</string>
+ <string name="logged_in_with_another_device">Овај број телефона је тренутно пријављен са другим уређајем.</string>
+ <string name="start_orbot">Покрени Orbot</string>
+ <string name="no_market_app_installed">Ниједна продавница апликација није инсталирана.</string>
+ <string name="ebook">е-књига</string>
+ <string name="creating_channel">Правим јавни канал…</string>
+ <string name="owners_can_edit_subject">Власници могу да измене тему.</string>
+ <string name="admins_can_edit_subject">Админи могу да измене тему.</string>
+ <string name="owners_can_invite_others">Власници могу да позову некога.</string>
+ <string name="allow_participants_to_invite_others">Дозволи било коме да позове неког</string>
+ <string name="anyone_can_invite_others">Било ко може да позове некога.</string>
+ <string name="jabber_ids_are_visible_to_anyone">XMPP адресе су видљиве било коме.</string>
+ <string name="ongoing_video_call">Тренутни видео позив</string>
+ <string name="outgoing_call">Одлазни позив</string>
+ <string name="pause_audio">Паузирај снимак</string>
+ <string name="pref_up_push_server_title">Push сервер</string>
+ <string name="account_state_logged_out">Одјављен/а</string>
+ <plurals name="n_missed_calls_from_x">
+ <item quantity="one">%1$d пропуштен позив од %2$s</item>
+ <item quantity="few">%1$d пропуштена позива од %2$s</item>
+ <item quantity="other">%1$d пропуштених позива од %2$s</item>
+ </plurals>
+ <string name="rtp_state_ringing">Звони</string>
+ <string name="no_keys_just_confirm">Већ си одобрио/ла отисак овог контакта. Кликом на “Готово” само потврђујеш да је %s део ове групне преписке.</string>
+ <string name="pref_send_crash_reports">Шаљи извештаје о неочекиваним заустављањима апликације</string>
+ <string name="disable_now">Искључи одмах</string>
+ <string name="pref_omemo_setting_summary_default_on">ОМЕМО ће подразумевано бити употребљен за нове преписке.</string>
+ <string name="pref_omemo_setting_summary_default_off">OMEMO ће морати експлицитно да се укључује на нове преписке.</string>
+ <string name="omemo_decryption_failed">Није успело дешифровање OMEMO поруке.</string>
+ <string name="action_fix_to_location">Фиксирај позицију</string>
+ <string name="pref_use_share_location_plugin_summary">Употреби plugin за дељење локације уместо уграђене мапе</string>
+ <string name="pref_use_share_location_plugin">Plugin за дељење локације</string>
+ <string name="pref_start_search_summary">На екрану “Нова преписка” отвори тастатуру и постави позицију у поље за претрагу</string>
+ <string name="view_media">Прикажи садржај</string>
+ <string name="group_chat_members">Учесници</string>
+ <string name="media_browser">Прегледач садржаја</string>
+ <string name="set_profile_picture">Conversations профилна слика</string>
+ <string name="open_with">Отвори користећи…</string>
+ <string name="restore_warning_continued">Не покушавај да вратиш резервну копију коју ниси направио/ла сам!</string>
+ <string name="create_public_channel">Направи јавни канал</string>
+ <string name="allow_participants_to_edit_subject">Дозволи било коме да измени тему</string>
+ <string name="share_backup_files">Подели резервне копије</string>
+ <string name="group_chats_and_channels">Групне Преписке и Канали</string>
+ <string name="rtp_state_retracted">Опозван позив</string>
+ <string name="reconnecting_call">Поновно успостављање позива</string>
+ <string name="reconnecting_video_call">Поновно успостављање видео позива</string>
+ <string name="not_encrypted">Нешифровано</string>
+ <string name="failed_deliveries">Неуспеле испоруке</string>
+ <string name="more_options">Додатне опције</string>
+ <string name="plain_text_document">Обичан текстуални документ</string>
+ <string name="account_registrations_are_not_supported">Регистрације налога нису подржане</string>
+ <string name="pref_light_dark_mode">Светли/тамни режим</string>
+ <string name="pref_allow_screenshots">Дозволи скриншотове</string>
+ <string name="pref_allow_screenshots_summary">Приказуј садржај апликације у прегледу недавних апликација и дозволи прављење скриншотова</string>
+ <string name="pref_summary_security">E2E шифровање, Слепо одобрење пре овере, MITM детекција</string>
+ <plurals name="n_missed_calls_from_m_contacts">
+ <item quantity="one">%1$d пропуштен позив од %2$d контаката</item>
+ <item quantity="few">%1$d пропуштена позива од %2$d контаката</item>
+ <item quantity="other">%1$d пропуштених позива од %2$d контаката</item>
+ </plurals>
+ <plurals name="some_messages_could_not_be_delivered">
+ <item quantity="one">Порука није могла да се испоручи</item>
+ <item quantity="few">Поруке нису могле да се испоруче</item>
+ <item quantity="other">Порука није могло да се испоручи</item>
+ </plurals>
+ <string name="pref_backup_summary">Направи једну, Закажи аутоматске</string>
+ <string name="pref_create_backup_one_off_summary">Направи једну резервну копију</string>
+ <string name="pref_backup_recurring">Аутоматске резервне копије</string>
+ <string name="pref_fullscreen_notification">Обавештења преко целог екрана</string>
+ <string name="pref_fullscreen_notification_summary">Дозволи овој апликацији да приказује обавештења о долазним позивима која заузимају цео екран када је уређај закључан.</string>
+ <string name="unsupported_operation">Неподржана операција</string>
+ <string name="privacy_policy">Полиса приватности</string>
+ <string name="contact_list_integration_not_available">Интеграција са имеником није расположива</string>
+ <string name="log_in">Пријави се</string>
+ <string name="error_no_keys_to_trust_server_error">Нема употребљивих кључева за овај контакт.
+\nНови кључеви не могу да се добаве са сервера. Можда нешто није у реду са сервером твог контакта?</string>
+ <string name="distrust_omemo_key">Избаци уређај из листе одобрених</string>
+ <string name="mtm_connect_anyway">Да ли свеједно желиш да се повежеш?</string>
+ <string name="mtm_cert_details">Детаљи сертификата:</string>
+ <string name="once">Једном</string>
+ <string name="pref_scroll_to_bottom">Премотај до краја</string>
+ <string name="action_unfix_from_location">Одфиксирај позицију</string>
+ <string name="p1_s3_filetransfer">HTTP дељење фајлова за S3</string>
+ <string name="error_trustkey_hint_mutual">Савет: У неким случајевима ово може да се среди обостраним додавањем у именик.</string>
+ <string name="back">Назад</string>
+ <string name="yes">Да</string>
+ <string name="possible_pin">Аутоматски налепљен могући PIN из клипборда.</string>
+ <string name="please_enter_pin">Унеси свој 6-оцифрени PIN.</string>
+ <string name="verifying">Оверавам…</string>
+ <string name="requesting_sms">Тражим SMS…</string>
+ <string name="incorrect_pin">PIN који си унео/ла није тачан.</string>
+ <string name="pin_expired">PIN који смо ти послали је истекао.</string>
+ <string name="unknown_api_error_network">Непозната грешка са мрежом.</string>
+ <string name="unknown_api_error_response">Непознат одговор од сервера.</string>
+ <string name="unable_to_establish_secure_connection">Није могуће успостављање безбедне везе.</string>
+ <string name="unable_to_find_server">Није могуће пронаћи сервер.</string>
+ <string name="unable_to_connect_to_server">Није могуће повезивање на сервер.</string>
+ <string name="invalid_user_input">Неисправан кориснички унос</string>
+ <string name="no_network_connection">Нема мрежне везе.</string>
+ <string name="enter_your_name_instructions">Унеси своје име да би људи који те немају у свом именику знали ко си.</string>
+ <string name="enter_your_name">Унеси своје име</string>
+ <string name="your_name">Твоје име</string>
+ <string name="no_name_set_instructions">Притисни дугме за измену да би подесио/ла своје име.</string>
+ <string name="reject_request">Одбиј захтев</string>
+ <string name="attach">Накачи</string>
+ <string name="help">Помоћ</string>
+ <string name="switch_to_chat">Пређи на преписку</string>
+ <string name="microphone_unavailable">Твој микрофон није расположив</string>
+ <string name="only_one_call_at_a_time">Можеш да обављаш само један позив у исто време.</string>
+ <string name="return_to_ongoing_call">Врати се у тренутни позив</string>
+ <string name="could_not_switch_camera">Није могуће пребацити камеру</string>
+ <string name="add_to_favorites">Закачи на врх</string>
+ <string name="remove_from_favorites">Откачи са врха</string>
+ <string name="gpx_track">GPX рута</string>
+ <string name="could_not_correct_message">Није могуће изменити поруку</string>
+ <string name="pref_up_push_account_title">XMPP налог</string>
+ <string name="no_active_accounts_support_this">Ниједан активан налог не подржава ову функцију</string>
+ <string name="backup_started_message">Прављење резервне копије је започето. Добићеш обавештење када се заврши.</string>
+ <string name="unable_to_enable_video">Није могуће укључити видео.</string>
+ <string name="account_status_temporary_auth_failure">Привремена грешка у аутентификацији</string>
+ <string name="delete_avatar">Обриши аватар</string>
+ <string name="audio_video_disabled_tor">Позиви су искључени када се користи Тор</string>
+ <string name="switch_to_video">Пређи на видео</string>
+ <string name="decline">Одбиј</string>
+ <string name="pref_keyboard_options">Тастатура</string>
+ <string name="pref_use_colorful_bubbles_summary">Различите позадинске боје за послате и примљене поруке</string>
+ <string name="action_archive_chat">Архивирај преписку</string>
+ <string name="title_activity_new_chat">Нова преписка</string>
+ <string name="archive_this_chat">Уклони преписку из листе</string>
+ <string name="pref_autojoin_summary">Постави “autojoin” заставицу при уласку или изласку из MUC-а и реагуј на измене од стране других клијената.</string>
+ <string name="not_encrypted_for_this_device">Порука није шифрована за овај уређај.</string>
+ <string name="account_status_incompatible_client">Некомпатибилан клијент</string>
+ <string name="quicksy_wants_your_consent">Quicksy тражи твоју сагласност да користи твоје податке</string>
+ <string name="battery_optimizations_enabled_dialog">Твој уређај примењује јаку оптимизацију батерије за %1$s што може довести до кашњења обавештења или чак губитка порука.
+\n
+\nСада ћеш добити упит да је искључиш.</string>
+ <string name="magic_create_text">Припремљено је упутство за отварање налога на conversations.im.
+\nАко одабереш conversations.im као провајдера можеш да комуницираш са корисницима других провајдера тако што им проследиш своју пуну XMPP адресу.</string>
+ <string name="pref_use_colorful_bubbles">Разнобојни балончићи преписке</string>
+ <string name="no_permission_to_place_call">Недостатак пермисија за обављање позива</string>
+ <string name="pref_validate_hostname">Валидирај назив сервера користећи DNSSEC</string>
+ <string name="foreground_service_channel_description">Ова категорија обавештења се користи за трајни приказ обавештења да %1$s ради.</string>
+ <string name="remove_bookmark">Желиш да уклониш обележивач за %s?</string>
+ <string name="search_group_chats">Претражи групне преписке</string>
+ <string name="remove_bookmark_and_close">Желиш да уклониш обележивач за %s и да архивираш преписку?</string>
+ <string name="mtm_accept_servername">Прихвати име сервера које се не подудара?</string>
+ <string name="server_info_sasl2">XEP-0388: Extensible SASL Profile</string>
+ <string name="clear_other_devices_desc">Да ли си сигуран/на да желиш да уклониш све остале уређаје из OMEMO објаве? Следећи пут када се твоји уређаји повежу, објавиће се сами, али можда неће примити поруке које су послате у међувремену.</string>
+ <string name="sync_with_contacts_long">%1$s обрађује твој именик локално, на твом уређају, да ти прикаже имена и профилне слике за одговарајуће контакте на XMPP-у.
+\n
+\nНикакви подаци из твог именика не излазе ван твог уређаја!</string>
+ <string name="welcome_header">Придружи се на разговор</string>
+ <string name="unable_to_set_channel_configuration">Није могуће сачувати подешавање канала</string>
+ <string name="backup">Резервна копија</string>
+ <string name="outgoing_call_duration_timestamp">Одлазни позив (%s) · %s</string>
+ <string name="pref_delete_omemo_identities_summary">Поново генериши своје OMEMO кључеве. Сви твоји контакти ће морати поново да те овере. Употреби ову опцију само у крајњем случају.</string>
+ <string name="certificate_does_not_contain_jid">Сертификат не садржи XMPP адресу</string>
+ <string name="qr_code_scanner_needs_access_to_camera">QR кôд читач захтева приступ камери</string>
+ <string name="we_have_sent_you_another_sms">Послали смо ти нови SMS са 6-оцифреним кодом.</string>
+ <string name="server_does_not_support_easy_onboarding_invites">Сервер нема могућност генерисања позивница</string>
+ <string name="data_saver_enabled_explained">Твој оперативни систем ограничава позадински приступ интернету за %1$s. Да би могао/ла да примаш обавештења о новим порукама, требало би да омогућиш неограничен приступ за %1$s када је укључена штедња преноса података.
+\n%1$s ће свакако покушати да уштеди на преносу података када год је то могуће.</string>
+ <string name="not_fetching_history_retention_period">Поруке се не добављају услед локалног периода ретенције.</string>
+ <string name="pref_notifications_from_strangers_summary">Обавести о порукама и позивима од непознатих особа.</string>
+ <string name="abort_registration_procedure">Да ли си сигуран/на да желиш да обуставиш процедуру регистрације?</string>
+ <string name="temporarily_unavailable">Привремено недоступан. Покушај поново касније.</string>
+ <string name="video_original">Оригинални (некомпресован)</string>
+ <string name="choose_account">Одабери налог</string>
+ <string name="restore_backup">Врати резервну копију</string>
+ <string name="channel_discover_opt_in_message">Проналазак канала користи страни сервис <a href=https://search.jabber.network>search.jabber.network</a>.<br><br>Коришћење ове функције ће послати твоју IP адресу и термине претраге том сервису. Погледај њихову <a href=https://search.jabber.network/privacy>Полису Приватности</a> за више информација.</string>
+ <string name="video_720p">Високи (720p)</string>
+ <string name="enter_country_code_and_phone_number">Quicksy ће послати SMS поруку (могућа је наплата од стране оператера) да овери твој број телефона. Унеси свој позивни број и број телефона:</string>
+ <string name="mtm_hostname_mismatch">Сервер не може да се аутентификује као \"%s\". Сертификат је валидан само за:</string>
+ <string name="disable_encryption_message">Да ли си сигуран/на да желиш да искључиш OMEMO шифровање за ову преписку?
+\nОво ће омогућити твом администратору сервера да чита твоје поруке, али је можда једини начин да комуницираш са људима који користе застареле клијенте.</string>
+ <string name="wait_x">Причекај (%s)</string>
+ <string name="channel_already_exists">Овај канал већ постоји</string>
+ <string name="jabber_ids_are_visible_to_admins">XMPP адресе су видљиве админима.</string>
+ <string name="video_is_enabled_tap_to_disable">Видео је укључен. Притисни да искључиш.</string>
+ <string name="silent_messages_channel_description">Ова група обавештења се користи за приказ обавештења која не би требало да пусте било какав звук. На пример, у току активности на другом уређају (Период тишине).</string>
+ <string name="security_violation_not_attaching_file">Фајл изостављен услед нарушавања безбедности.</string>
+ <string name="could_not_delete_account_from_server">Није могуће обрисати налог са сервера</string>
+ <string name="call_is_using_speaker">Позив користи звучник.</string>
+ <string name="invalid_country_code">Неважећи позивни број</string>
+ <string name="group_chat_will_make_your_jabber_id_public">Овај канал ће јавно објавити твоју XMPP адресу</string>
+ <plurals name="n_missed_calls">
+ <item quantity="one">%d пропуштен позив</item>
+ <item quantity="few">%d пропуштена позива</item>
+ <item quantity="other">%d пропуштених позива</item>
+ </plurals>
+ <string name="log_out">Одјави се</string>
+ <string name="title_activity_share_with">Подели користећи…</string>
+ <string name="sharing_application_not_grant_permission">Апликација за дељење није дозволила пермисију за приступ овом фајлу.</string>
+ <string name="incoming_call_duration_timestamp">Долазни позив (%s) · %s</string>
+ <string name="send_encrypted_message">Пошаљи шифровану поруку</string>
+ <string name="openkeychain_required_long">%1$s користи <b>OpenKeychain</b> за шифровање и дешифровање порука и управљање твојим јавним кључевима.<br><br>Лиценциран је под GPLv3+ и доступан је на F-Droid и Google Play продавницама.<br><br><small>(После поново покрени %1$s.)</small></string>
+ <string name="pref_notification_grace_period_summary">Временски период током којег су обавештења утишана након примећене активности на једном од твојих других уређаја.</string>
+ <string name="pref_prevent_screenshots">Забрани скриншотове</string>
+ <string name="pref_prevent_screenshots_summary">Сакриј садржај апликације у прегледу недавних апликација и блокирај скриншотове</string>
+ <string name="pref_autojoin">Синхронизуј обележивачe</string>
+ <string name="conference_technical_problems">Напустио/ла си ову групну преписку из техничких разлога</string>
+ <string name="pref_enter_is_send_summary">Користи Enter дугме за слање порука. Увек можеш да пошаљеш поруку са Ctrl+Enter, чак и када је ова опција угашена.</string>
+ <string name="vector_graphic">векторска слика</string>
+ <string name="multimedia_file">мултимедијални фајл</string>
+ <string name="audiobook">Аудиокњига</string>
+ <string name="download_failed_invalid_file">Преузимање није успело: Неисправан фајл</string>
+ <string name="pref_picture_compression_summary">Савет: Употреби “Изабери фајл” уместо “Изабери слику” за слање појединачних слика без компресије, без обзира на ову опцију.</string>
+ <string name="pref_clean_cache_summary">Очисти кеш фолдер (који користи апликација за камеру)</string>
+ <string name="pref_omemo_setting">OMEMO шифровање</string>
+ <string name="pref_dynamic_colors">Динамичке боје</string>
+ <string name="phone_number">број телефона</string>
+ <string name="local_server">Локални сервер</string>
+ <string name="jabber_network">jabber.network</string>
+ <string name="allow_private_messages">Дозволи приватне поруке</string>
+ <string name="pref_accept_invites_from_strangers_summary">Прихвати позивнице за групне преписке од непознатих особа</string>
+ <string name="pref_accept_invites_from_strangers">Позивнице од непознатих особа</string>
+ <string name="title_undo_swipe_out_chat">Преписка је архивирана</string>
+ <string name="pref_large_font">Велика слова</string>
+ <plurals name="view_users">
+ <item quantity="one">Погледај %1$dог учесника</item>
+ <item quantity="few">Погледај %1$d учесника</item>
+ <item quantity="other">Погледај %1$d учесника</item>
+ </plurals>
+ <string name="your_avatar_tap_to_select_new_avatar">Твој аватар. Притисни да одабереш нови аватар из галерије.</string>
+ <string name="exit">Изађи</string>
+ <string name="record_voice_mail">Сними гласовну поруку</string>
+ <string name="play_audio">Пусти снимак</string>
+ <string name="add_contact_or_create_or_join_group_chat">Додај контакт, направи или се придружи у групну преписку, или пронађи канале</string>
+ <string name="no_application_found">Није пронађена апликација</string>
+ <string name="invite_to_app">Позови на Conversations</string>
+ <string name="unable_to_parse_invite">Није могуће ишчитати позивницу</string>
+ <string name="could_not_disable_video">Није могуће искључити видео.</string>
+ <string name="no_xmpp_adddress_found">Није пронађена XMPP адреса</string>
+ <string name="reject_switch_to_video">Одбиј захтев за прелазак на видео</string>
+ <string name="pref_summary_appearance">Тема, Боје, Скриншотови, Унос</string>
+ <string name="pref_title_security">Безбедност</string>
+ <string name="unified_push_summary">Релеј обавештења за UnifiedPush-компатибилне апликације</string>
+ <string name="notifications">Обавештења</string>
+ <string name="pref_attachments_summary">Величина фајлова, Компресија слика, Видео квалитет</string>
+ <string name="pref_notifications_summary">Период тишине, Мелодија звона, Вибрација, Непознате особе</string>
+ <string name="pref_category_sending">Слање</string>
+ <string name="pref_category_receiving">Примање</string>
+ <string name="pref_automatic_download">Аутоматско преузимање</string>
+ <string name="call_is_using_bluetooth">Позив користи bluetooth.</string>
+ <string name="video_is_disabled_tap_to_enable">Видео је искључен. Притисни да укључиш.</string>
+ <string name="server_info_bind2">XEP-0386: Bind 2</string>
+ <string name="group_chats">Групне преписке</string>
+ <string name="battery_optimizations_enabled_explained">Твој уређај примењује јаку оптимизацију батерије за %1$s што може довести до кашњења обавештења или чак губитка порука.
+\nПрепорука је да је искључиш.</string>
+ <string name="this_account_is_logged_out">Одјавио/ла си се из овог налога</string>
+ <string name="welcome_header_quicksy">Добродошао/ла на Quicksy!</string>
+ <string name="reconnect_on_other_host">Поново повежи на други сервер</string>
+ <string name="all_omemo_keys_have_been_verified">Оверио/ла си све OMEMO кључеве које поседујеш</string>
+ <string name="barcode_does_not_contain_fingerprints_for_this_chat">Бар-кôд не садржи отиске за ову преписку.</string>
+ <string name="pref_clean_private_storage_summary">Очисти приватно складиште где се чувају фајлови (могу поново да се преузму са сервера)</string>
+ <string name="pref_blind_trust_before_verification_summary">Одобри нове уређаје од неоверених контаката, али питај за потврду нових уређаја за оверене контакте.</string>
+ <string name="blindly_trusted_omemo_keys">Слепо одобрени OMEMO кључеви, у смислу да би то могао да буде неко други или је неко упао.</string>
+ <string name="i_followed_this_link_from_a_trusted_source">Испратио/ла сам овај линк из поузданог извора</string>
+ <string name="verifying_omemo_keys_trusted_source_account">Оверићеш OMEMO кључеве за свој налог. Ово је безбедно само ако си испратио/ла овај линк из поузданог извора где си само ти могао/ла да објавиш овај линк.</string>
+ <string name="continue_btn">Настави</string>
+ <string name="verifying_omemo_keys_trusted_source">Оверићеш OMEMO кључеве за %1$s кликом на линк. Ово је безбедно само ако си испратио/ла овај линк из поузданог извора где је само %2$s могао/ла да објави овај линк.</string>
+ <string name="distrust_omemo_key_text">Да ли си сигуран/на да желиш да уклониш оверу за овај уређај?
+\nОвај уређај и поруке са њега ће бити означене као “Неоверене”.</string>
+ <string name="corresponding_chats_closed">Одговарајуће преписке су архивиране.</string>
+ <string name="sasl_downgrade">Ослабљен SASL механизам</string>
+ <string name="application_found_to_open_website">Није пронађена апликација за отварање сајта</string>
+ <string name="pref_headsup_notifications">“Heads-up” обавештења</string>
+ <string name="pref_headsup_notifications_summary">Приказуј “heads-up” обавештења</string>
+ <string name="pref_validate_hostname_summary">Серверски сертификати који садрже валидиран назив сервера се сматрају овереним</string>
+ <string name="private_messages_are_disabled">Приватне поруке су искључене</string>
+ <string name="mtm_trust_anchor">Серверски сертификат није потписан од стране неког познатог сертификационог тела.</string>
+ <string name="pref_scroll_to_bottom_summary">Премотај на доле након слања поруке</string>
+ <string name="edit_status_message_title">Измени Статусну Поруку</string>
+ <string name="edit_status_message">Измени статусну поруку</string>
+ <string name="error_trustkey_device_list">Није могуће добавити листу уређаја</string>
+ <string name="disable_encryption">Искључи шифровање</string>
+ <string name="error_trustkey_general">%1$s не може да шаље шифроване поруке ка %2$s. Могуће је да твој контакт користи застарели сервер или клијент који не подржава OMEMO.</string>
+ <string name="error_trustkey_bundle">Није могуће добавити кључеве за шифровање</string>
+ <string name="unable_to_start_recording">Није могуће покренути снимање</string>
+ <string name="no_microphone_permission">Дозволи да %1$s приступи микрофону</string>
+ <string name="gif">GIF</string>
+ <string name="copy_jabber_id">Копирај XMPP адресу</string>
+ <string name="pref_start_search">Директна претрага</string>
+ <string name="unable_to_save_recording">Није могуће сачувати снимак</string>
+ <string name="foreground_service_channel_name">Сервис у првом плану</string>
+ <string name="notification_group_status_information">Статусне Информације</string>
+ <string name="error_channel_name">Проблеми у повезивању</string>
+ <string name="error_channel_description">Ова категорија обавештења се користи за приказ обавештења у случају да постоји проблем са повезивањем на налог.</string>
+ <string name="notification_group_calls">Позиви</string>
+ <string name="incoming_calls_channel_name">Долазни позиви</string>
+ <string name="ongoing_calls_channel_name">Одлазни позиви</string>
+ <string name="missed_calls_channel_name">Пропуштени позиви</string>
+ <string name="delivery_failed_channel_name">Неуспеле испоруке</string>
+ <string name="pref_message_notification_settings">Подешавања обавештења за поруке</string>
+ <string name="pref_incoming_call_notification_settings">Подешавања обавештења за долазне позиве</string>
+ <string name="pref_more_notification_settings_summary">Хитност, Звук, Вибрација</string>
+ <string name="pref_video_compression">Видео Квалитет</string>
+ <string name="pref_video_compression_summary">Нижи квалитет значи да су фајлови мањи</string>
+ <string name="video_360p">Средњи (360p)</string>
+ <string name="cancelled">прекинуто</string>
+ <string name="already_drafting_message">Већ правиш нацрт поруке.</string>
+ <string name="feature_not_implemented">Функција није имплементирана</string>
+ <string name="choose_a_country">Одабери земљу</string>
+ <string name="verify_your_phone_number">Овери свој број телефона</string>
+ <string name="we_will_be_verifying">Оверићемо број телефона<br/><br/><b>%s</b><br/><br/>Да ли је ово у реду, или би хтео/ла да измениш број?</string>
+ <string name="not_a_valid_phone_number">%s није важећи број телефона.</string>
+ <string name="please_enter_your_phone_number">Унеси свој број телефона.</string>
+ <string name="we_have_sent_you_an_sms_to_x">Послали смо ти SMS на <b>%s</b>.</string>
+ <string name="please_enter_pin_below">Унеси 6-оцифрени PIN испод.</string>
+ <string name="resend_sms">Поново пошаљи SMS</string>
+ <string name="resend_sms_in">Поново пошаљи SMS (%s)</string>
+ <string name="no">Не</string>
+ <string name="something_went_wrong_processing_your_request">Нешто није како треба у обради твог захтева.</string>
+ <string name="try_again_in_x">Покушај поново за %s</string>
+ <string name="rate_limited">Ограничен/а си услед учесталих покушаја</string>
+ <string name="too_many_attempts">Превише покушаја</string>
+ <string name="the_app_is_out_of_date">Користиш застарелу верзију ове апликације.</string>
+ <string name="update">Освежи</string>
+ <string name="install_orbot">Инсталирај Orbot</string>
+ <string name="restore">Врати</string>
+ <string name="enter_password_to_restore">Унеси своју лозинку за налог %s да вратиш резервну копију.</string>
+ <string name="restore_warning">Не употребљавај функцију враћања резервне копије ради клонирања инсталације (за рад у паралели). Враћање резервне копије је предвиђено само за миграције или у случају да си изгубио/ла оригинални уређај.</string>
+ <string name="unable_to_restore_backup">Није могуће вратити резервну копију.</string>
+ <string name="unable_to_decrypt_backup">Није могуће дешифровати резервну копију. Да ли је лозинка исправна?</string>
+ <string name="backup_channel_name">Резервна копија и Враћање</string>
+ <string name="enter_jabber_id">Унеси XMPP адресу</string>
+ <string name="create_group_chat">Направи групну преписку</string>
+ <string name="join_public_channel">Придружи се на јавни канал</string>
+ <string name="create_private_group_chat">Направи приватну групну преписку</string>
+ <string name="create_dialog_channel_name">Име канала</string>
+ <string name="xmpp_address">XMPP адреса</string>
+ <string name="please_enter_name">Унеси име канала</string>
+ <string name="please_enter_xmpp_address">Унеси XMPP адресу</string>
+ <string name="this_is_an_xmpp_address">Ово је XMPP адреса. Унеси име.</string>
+ <string name="joined_an_existing_channel">Придружио/ла си се на постојећи канал</string>
+ <string name="anyone_can_edit_subject">Било ко може да измени тему.</string>
+ <string name="no_users_hint_channel">Овај јавни канал нема учеснике. Позови своје контакте или употреби дугме за дељење како би објавио/ла његову XMPP адресу.</string>
+ <string name="no_users_hint_group_chat">Ова приватна групна преписка нема учеснике.</string>
+ <string name="manage_permission">Подеси привилегије</string>
+ <string name="search_participants">Претражи учеснике</string>
+ <string name="file_too_large">Фајл је превелики</string>
+ <string name="discover_channels">Пронађи канале</string>
+ <string name="search_channels">Претражи канале</string>
+ <string name="channel_discovery_opt_in_title">Потенцијално нарушавање приватности!</string>
+ <string name="i_already_have_an_account">Већ имам налог</string>
+ <string name="add_existing_account">Додај постојећи налог</string>
+ <string name="register_new_account">Региструј нов налог</string>
+ <string name="this_looks_like_a_domain">Ово изгледа као адреса домена</string>
+ <string name="add_anway">Додај свеједно</string>
+ <string name="this_looks_like_channel">Ово изгледа као адреса канала</string>
+ <string name="conversations_backup">Conversations резервне копије</string>
+ <string name="event">Догађај</string>
+ <string name="open_backup">Отвори резервну копију</string>
+ <string name="not_a_backup_file">Фајл који си одабрао/ла није Conversations резервна копија</string>
+ <string name="outdated_backup_file_format">Покушаваш да увезеш резервну копију застарелог формата</string>
+ <string name="account_already_setup">Овај налог је већ подешен</string>
+ <string name="please_enter_password">Унеси лозинку за овај налог</string>
+ <string name="unable_to_perform_this_action">Није могуће извршити ову радњу</string>
+ <string name="open_join_dialog">Придружи се на јавни канал…</string>
+ <string name="pref_channel_discovery_summary">Већина корисника би требало да одабере ‘jabber.network’ за боље предлоге из целокупног јавног XMPP екосистема.</string>
+ <string name="pref_channel_discovery">Начин проналаска канала</string>
+ <string name="category_about">О апликацији</string>
+ <string name="please_enable_an_account">Укључи неки налог</string>
+ <string name="make_call">Обави позив</string>
+ <string name="rtp_state_incoming_call">Долазни позив</string>
+ <string name="rtp_state_incoming_video_call">Долазни видео позив</string>
+ <string name="rtp_state_content_add_video">Пређи на видео позив?</string>
+ <string name="rtp_state_content_add">Унеси додатне руте?</string>
+ <string name="rtp_state_connecting">Повезујем</string>
+ <string name="rtp_state_connected">Повезан</string>
+ <string name="rtp_state_reconnecting">Поновно повезивање</string>
+ <string name="rtp_state_accepting_call">Прихватање позива</string>
+ <string name="rtp_state_ending_call">Завршавање позива</string>
+ <string name="answer_call">Јави се</string>
+ <string name="dismiss_call">Одбиј</string>
+ <string name="rtp_state_finding_device">Проналажење уређаја</string>
+ <string name="rtp_state_contact_offline">Контакт није доступан</string>
+ <string name="rtp_state_connectivity_error">Није могуће успоставити позив</string>
+ <string name="rtp_state_connectivity_lost_error">Прекид везе</string>
+ <string name="rtp_state_application_failure">Грешка у апликацији</string>
+ <string name="hang_up">Прекини везу</string>
+ <string name="ongoing_call">Тренутни позив</string>
+ <string name="disable_tor_to_make_call">Искључи Тор да би обављао/ла позиве</string>
+ <string name="incoming_call">Долазни позив</string>
+ <string name="missed_call_timestamp">Пропуштен позив · %s</string>
+ <string name="outgoing_call_timestamp">Одлазни позив · %s</string>
+ <string name="missed_call">Пропуштен позив</string>
+ <string name="audio_call">Аудио позив</string>
+ <string name="video_call">Видео позив</string>
+ <string name="search_all_conversations">Све преписке</string>
+ <string name="search_this_conversation">Ова преписка</string>
+ <string name="unified_push_distributor">UnifiedPush дистрибутер</string>
+ <string name="pref_up_push_account_summary">Налог кроз који ће “push” поруке бити примљене.</string>
+ <string name="no_account_deactivated">Ниједан (искључен)</string>
+ <string name="delete_from_server">Обриши налог са сервера</string>
+ <string name="hide_notification">Сакриј обавештење</string>
+ <string name="contact_uses_unverified_keys">Твој контакт користи неоверене уређаје. Очитај његов/њен QR кôд да би извршио/ла оверу и спречио/ла активне MITM нападе.</string>
+ <string name="unverified_devices">Користиш неоверене уређаје. Очитај QR кôд на својим другим уређајима да би извршио/ла оверу и спречио/ла активне MITM нападе.</string>
+ <string name="report_spam">Пријави спам</string>
+ <string name="report_spam_and_block">Пријави спам и блокирај спамера</string>
+ <string name="your_avatar">Твој аватар</string>
+ <string name="avatar_for_x">Аватар за %s</string>
+ <string name="encrypted_with_openpgp">Шифровано користећи OpenPGP</string>
+ <string name="call_integration_not_available">Интеграција позива није расположива!</string>
+ <string name="delete_and_close">Обриши и Архивирај преписку</string>
+ <string name="start_chat">Покрени преписку</string>
+ <string name="no_certificate_selected">Ниједан клијентски сертификат није одабран!</string>
+ <string name="pref_title_interface">Сучеље</string>
+ <string name="appearance">Изглед</string>
+ <string name="pref_category_e2ee">E2E шифровање</string>
+ <string name="pref_title_trust_system_ca_store">Сертификациона тела</string>
+ <string name="pref_title_trust_system_ca_store_summary">Поуздај се у системске CA сертификате</string>
+ <string name="detect_mim">Захтевај везивање канала</string>
+ <string name="detect_mim_summary">Везивање канала може да детектује неке “machine-in-the-middle” нападе</string>
+ <string name="pref_category_server_connection">Веза ка серверу</string>
+ <string name="pref_category_operating_system">Оперативни Систем</string>
+ <string name="pref_category_interaction">Интеракција</string>
+ <string name="pref_category_on_this_device">На уређају</string>
+ <string name="pref_up_long_summary">Када ради као UnifiedPush дистрибутер, трајна, поуздана и економична XMPP веза ће бити употребљена да “пробуди” другу UnifiedPush-компатибилну апликацију, попут Tusky, Ltt.rs, FluffyChat и других.</string>
+ <string name="pref_privacy_summary">Индикатори куцања, Последњи пут виђен/а, Присутност</string>
+ <string name="pref_connection_summary">Назив сервера и порт, Тор</string>
+ <string name="pref_connection_summary_w_cd">Назив сервера и порт, Тор, Проналажење канала</string>
+ <string name="pref_category_engagement_notifications">Обавештења о учествовању</string>
+ <string name="pref_category_application">Апликација</string>
+ <string name="pref_large_font_summary">Повећај величину слова у порукама</string>
+ <string name="edit_nick">Измени надимак</string>
+ <string name="delete_pgp_key">Обриши OpenPGP кључ</string>
+ <string name="edit_name_and_topic">Измени назив и тему</string>
+ <string name="edit_configuration">Промени подешавање</string>
+ <string name="change_notification_settings">Промени подешавања обавештења</string>
+ <string name="call_is_using_earpiece_tap_to_switch_to_speaker">Позив користи слушалицу. Притисни да пребациш на звучник.</string>
+ <string name="call_is_using_earpiece">Позив користи слушалицу.</string>
+ <string name="call_is_using_wired_headset">Позив користи жичане слушалице</string>
+ <string name="call_is_using_speaker_tap_to_switch_to_earpiece">Позив користи звучник, Притисни да пребациш на слушалицу.</string>
+ <string name="flip_camera">Пребаци камеру</string>
+ <string name="server_info_login_mechanism">Механизам за пријаву</string>
+ <string name="rtp_state_security_error">Проблем са овером</string>
+ <string name="mtm_accept_cert">Прихвати непознат сертификат?</string>
+ <string name="pref_dynamic_colors_summary">Системске боје (Material You)</string>
+</resources>
@@ -26,8 +26,8 @@
<string name="minute_ago">1 min sedan</string>
<string name="minutes_ago">%d min sedan</string>
<plurals name="x_unread_conversations">
- <item quantity="one">%d oläst konversation</item>
- <item quantity="other">%d olästa konversationer</item>
+ <item quantity="one">%d oläst chatt</item>
+ <item quantity="other">%d o-lästa chattar</item>
</plurals>
<string name="sending">skickar…</string>
<string name="message_decrypting">Avkrypterar meddelande. Vänta…</string>
@@ -39,7 +39,7 @@
<string name="moderator">Moderator</string>
<string name="participant">Deltagare</string>
<string name="visitor">Besökare</string>
- <string name="remove_contact_text">Vill du ta bort %s från din kontaktlista? Konversationer med denna kontakt kommer inte att tas bort.</string>
+ <string name="remove_contact_text">Skulle du vilja ta bort %s från din kontaktlista? Chatten med den här kontakten kommer inte att tas bort.</string>
<string name="block_contact_text">Vill du blockera %s från att skicka dig meddelanden?</string>
<string name="unblock_contact_text">Vill du avblockera %s och tillåta användaren att skicka dig meddelanden\?</string>
<string name="block_domain_text">Blockera alla kontakter från %s?</string>
@@ -77,7 +77,7 @@
<string name="preparing_images">Förbereder att skicka bilder</string>
<string name="sharing_files_please_wait">Delar filer. Var god vänta…</string>
<string name="action_clear_history">Rensa historik</string>
- <string name="clear_conversation_history">Rensa konversationshistorik</string>
+ <string name="clear_conversation_history">Rensa chatt-historiken</string>
<string name="clear_histor_msg">Vill du ta bort alla meddelanden i den här konversationen?
\n
\n<b>Varning:</b> Det här påverkar inte meddelanden som finns lagrade på andra enheter eller servrar.</string>
@@ -86,12 +86,12 @@
\n
\n<b>Varning:</b> Den här åtgärden kommer inte att ta bort kopior av den här filen som finns lagrad på andra enheter eller servrar. </string>
<string name="choose_presence">Välj enhet</string>
- <string name="send_unencrypted_message">Skicka okrypterat meddelande</string>
+ <string name="send_unencrypted_message">Skicka ett meddelande i klartext</string>
<string name="send_message">Skicka meddelande</string>
<string name="send_message_to_x">Skicka meddelande till %s</string>
<string name="send_omemo_x509_message">Skicka v\\OMEMO-krypterat meddelande</string>
<string name="your_nick_has_been_changed">Nytt smeknamn är nu i bruk</string>
- <string name="send_unencrypted">Skicka okrypterat</string>
+ <string name="send_unencrypted">Skicka klartext</string>
<string name="decryption_failed">Dekrypteringen misslyckades. Du har kanske inte rätt privat nyckel.</string>
<string name="openkeychain_required">OpenKeychain</string>
<string name="openkeychain_required_long">%1$s använder <b>OpenKeychain</b> för att kryptera och avkryptera dina publika nycklar.<br><br>Programmet är licensierat under GPLv3+, och finns tillgängligt via F-Droid och Google Play.<br><br><small>(Var god starta om %1$s efter installationen.)</small></string>
@@ -182,7 +182,7 @@
\nDina kontakter kommer inte längre att kunna skicka OpenPGP-krypterade meddelande till dig.</string>
<string name="openpgp_has_been_published">OpenPGP-nyckel har publicerats.</string>
<string name="mgmt_account_enable">Aktivera konto</string>
- <string name="mgmt_account_delete_confirm_text">Är du säker på att du vill ta bort ditt konto? Om du tar bort ditt konto, tas hela din konversationshistorik bort</string>
+ <string name="mgmt_account_delete_confirm_text">Är du säker på att du vill ta bort ditt konto? Hela din chatt-historik kommer att tas bort om ditt konto tas bort</string>
<string name="attach_record_voice">Spela in röst</string>
<string name="account_settings_jabber_id">XMPP-adress</string>
<string name="block_jabber_id">Blockera XMPP-adress</string>
@@ -475,7 +475,7 @@
<string name="pref_dnd_on_silent_mode_summary">Visa som upptagen när enheten är i tyst läge</string>
<string name="pref_treat_vibrate_as_silent">Behandla vibrera-läget som tyst läge</string>
<string name="pref_treat_vibrate_as_dnd_summary">Visa som upptagen när enheten är satt till att endast vibrera</string>
- <string name="pref_show_connection_options">Utökade anslutningsinställningar</string>
+ <string name="pref_show_connection_options">Värdnamn & Port</string>
<string name="pref_show_connection_options_summary">Visa värdnamn och portinställningar när du skapar ett konto</string>
<string name="hostname_example">xmpp.exempel.se</string>
<string name="action_add_account_with_certificate">Logga in med certifikat</string>
@@ -1023,4 +1023,27 @@
<string name="contact_list_integration_not_available">Integrering av kontaktlista är inte tillgängligt</string>
<string name="call_integration_not_available">Samtalsintegration inte tillgänglig!</string>
<string name="rtp_state_contact_offline">Kontakten är inte tillgänglig</string>
-</resources>
+ <string name="pref_send_crash_reports">Skicka kraschrapporter</string>
+ <string name="notifications">Aviseringar</string>
+ <string name="remove_bookmark">Skulle du vilja ta bort bokmärket för %s?</string>
+ <string name="action_archive_chat">Arkivera chatten</string>
+ <string name="title_activity_new_chat">Ny chatt</string>
+ <string name="send_encrypted_message">Skicka ett avkrypterat meddelande</string>
+ <string name="pref_title_interface">Gränssnitt</string>
+ <string name="pref_keyboard_options">Tangentbord</string>
+ <string name="pref_category_interaction">Interaktion</string>
+ <string name="server_info_bind2">XEP-0386: Bind 2</string>
+ <string name="server_info_sasl2">XEP-0388: Utökad SASL-profil</string>
+ <string name="title_undo_swipe_out_chat">Chatten arkiverades</string>
+ <string name="pref_dynamic_colors">Dynamiska färger</string>
+ <string name="pref_category_sending">Skickar</string>
+ <string name="pref_category_receiving">Tar emot</string>
+ <string name="appearance">Utseende</string>
+ <string name="pref_automatic_download">Hämta automatiskt</string>
+ <string name="pref_light_dark_mode">Ljust/Mörkt läge</string>
+ <string name="pref_allow_screenshots">Tillåt skärmdumpar</string>
+ <string name="title_activity_share_with">Dela med…</string>
+ <string name="remove_bookmark_and_close">Skulle du vilja ta bort bokmärket för %s och arkivera chatten?</string>
+ <string name="pref_title_security">Säkerhet</string>
+ <string name="archive_this_chat">Ta bort chatten i efterhand</string>
+</resources>
@@ -1135,4 +1135,6 @@
<string name="server_info_login_mechanism">Механізм авторизації</string>
<string name="server_info_bind2">XEP-0386: Bind 2</string>
<string name="server_info_sasl2">XEP-0388: Розширюваний профіль SASL</string>
+ <string name="could_not_add_reaction">Не вдалося додати реакцію</string>
+ <string name="add_reaction">Додати реакцію…</string>
</resources>
@@ -1093,4 +1093,6 @@
<string name="server_info_login_mechanism">登录机制</string>
<string name="server_info_bind2">XEP-0386:绑定 2</string>
<string name="server_info_sasl2">XEP-0388:可扩展 SASL 配置文件</string>
+ <string name="could_not_add_reaction">无法添加回应</string>
+ <string name="add_reaction">添加回应…</string>
</resources>
@@ -1093,4 +1093,6 @@
<string name="video_is_enabled_tap_to_disable">Video is enabled. Tap to disable.</string>
<string name="video_is_disabled_tap_to_enable">Video is disabled. Tap to enable.</string>
<string name="server_info_login_mechanism">Login mechanism</string>
+ <string name="could_not_add_reaction">Could not add reaction</string>
+ <string name="add_reaction">Add reaction…</string>
</resources>
@@ -0,0 +1 @@
+Lihtsalt kasutuselevõetav ja kasutatav Jabber/XMPP klient
@@ -0,0 +1,13 @@
+O Quicksy é uma modificação do cliente Jabber/XMPP popular Conversations, com descoberta automática de contatos.
+
+Você se registra com seu número de telefone e o Quicksy automaticamente--com base nos números de telefone em seus contatos--irá sugerir possíveis contatos para você.
+
+Em baixo do capô, o Quicksy é um cliente Jabber completo que permite que você se comunique com qualquer usuário em qualquer servidor que esteja federando publicamente. Do mesmo modo, usuários do Quicksy podem ser contatados facilmente adicionando +numerodetelefone@quicksy.im à sua lista de contatos.
+
+Tirando a sincronização com os contatos, a interface do usuário é o mais perto possível do Conversations. Isto permite que usuários eventualmente migrem do Quicksy para o Conversations sem precisar aprender novamente como o app funciona.
+
+Contatos sugeridos consistem de outros usuários do Quicksy e usuários regulares do Jabber/XMPP que inscreveram seu ID Jabber no Diretório do Quicksy (https://quicksy.im/#get-listed).
+
+AVISO: Para entrar seu ID Jabber no Diretório do Quicksy (https://quicksy.im/enter/), uma taxa única será cobrada.
+
+Leia a Política de Privacidade (https://quicksy.im/#privacy) para mais informações.
@@ -0,0 +1 @@
+Jabber/XMPP com uma entrada e descoberta mais fácil
@@ -0,0 +1,14 @@
+Quicksy је варијанта популарног Jabber/XMPP клијента Conversations са аутоматским проналаском контаката.
+
+Пријавиш се својим бројем телефона и Quicksy ће ти аутоматски, на основу бројева телефона у твом именику, предложити могуће контакте.
+
+"Испод хаубе" Quicksy је комплетан Jabber клијент који ти омогућава да комуницираш са било којим корисником на било којем јавно федеративном серверу. Такође, Quicksy корисници могу бити контактирани од споља само додавањем +phonenumber@quicksy.im у твоју листу контаката.
+
+Поред синхронизације контаката, корисничко сучеље је с намером максимално близу Conversations клијенту. Ово корисницима омогућава да у неком тренутку пређу са Quicksy на Conversations без да морају поново да уче како апликација ради.
+
+Предложени контакти се састоје од других Quicksy корисника и уобичајених Jabber/XMPP корисника који су унели свој Jabber ID у Quicksy директоријум (https://quicksy.im/#get-listed).
+
+УСПУТ: Да унесеш (https://quicksy.im/enter/) свој Jabber ID у Quicksy директоријум
+неопходна је једнократна новчана накнада за регистрацију.
+
+Прочитај Полису Приватности (https://quicksy.im/#privacy) за више детаља.
@@ -0,0 +1 @@
+Jabber/XMPP са лаким приступом и лаким проналаском
@@ -0,0 +1,14 @@
+Quicksy är en avknoppning av den populära Jabber/XMPP-klienten Conversations som upptäcker kontakter automatiskt.
+
+Du registrerar dig med ditt telefonnummer varpå Quicksy då automatiskt kommer (baserat på telefonnumren i din adressbok) att föreslå möjliga kontakter till dig.
+
+Under huven så är Quicksy en fullfjädrad Jabber-klient som låter dig kommunicera med alla användare på vilken federerad server som helst. På samma sätt kan användare på Quicksy kontaktas från utsidan genom att helt enkelt lägga till +telefonnummer@quicksy.im till din kontaktlista.
+
+Bortsett från kontaktsynkroniseringen så är användargränssnittet avsiktligt så nära Conversations som möjligt. Detta gör att användare så småningom kan migrera från Quicksy till Conversations utan att behöva lära sig på nytt hur appen fungerar.
+
+Föreslagna kontakter består av andra Quicksy-användare och vanliga Jabber/XMPP-användare som har angett sitt Jabber-ID i Quicksy-katalogen (https://quicksy.im/#get-listed).
+
+NOTERA ATT: För att lägga in (https://quicksy.im/enter/) ditt Jabber-ID
+i Quicksy-katalogen så krävs en engångsregistreringsavgift.
+
+Läs sekretesspolicyn (https://quicksy.im/#privacy) för mer information.
@@ -0,0 +1 @@
+Jabber/XMPP med Enkel inloggning och Lätt igenkänning
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="pref_notification_grace_period_summary">Временски период током којег је Quicksy утишан након што примети активност на другом уређају</string>
+ <string name="pref_broadcast_last_activity_summary">Обавести све своје контакте када користиш Quicksy</string>
+ <string name="set_profile_picture">Quicksy профилна слика</string>
+ <string name="not_available_in_your_country">Quicksy није доступан у твојој земљи.</string>
+ <string name="unable_to_verify_server_identity">Није могуће оверити идентитет сервера.</string>
+ <string name="unknown_security_error">Непозната безбедносна грешка.</string>
+ <string name="timeout_while_connecting_to_server">Нема одзива приликом повезивања на сервер.</string>
+ <string name="pref_never_send_crash_summary">Слањем извештаја о грешкама помажеш даљем развоју Quicksy-ја</string>
+ <string name="huawei_protected_apps_summary">Да би наставио/ла да примаш обавештења, чак и када је екран угашен, требало би да додаш Quicksy у листу заштићених апликација.</string>
+</resources>
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="pref_broadcast_last_activity_summary">Berätta för alla dina kontakter när du använder Quicksy</string>
+ <string name="pref_broadcast_last_activity_summary">Låt alla dina kontakter veta när du använder Quicksy</string>
<string name="not_available_in_your_country">Quicksy är inte tillgängligt i ditt land.</string>
<string name="unknown_security_error">Okänt säkerhetsfel.</string>
- <string name="set_profile_picture">Quicksy-profilbild</string>
- <string name="unable_to_verify_server_identity">Det gick inte att verifiera serveridentiteten.</string>
- <string name="timeout_while_connecting_to_server">Timeout under anslutning till servern.</string>
- <string name="pref_never_send_crash_summary">Genom att skicka in kraschrapporter hjälper du den pågående utvecklingen av Quicksy</string>
- <string name="huawei_protected_apps_summary">För att fortsätta ta emot aviseringar även när skärmen är avstängd, måste du lägga till Quicksy i listan över skyddade appar.</string>
- <string name="pref_notification_grace_period_summary">Hur lång tid Quicksy håller tyst efter att ha sett aktivitet på en annan enhet</string>
+ <string name="set_profile_picture">Profilbild för Quicksy</string>
+ <string name="unable_to_verify_server_identity">Serverns identitet kunde inte bekräftas.</string>
+ <string name="timeout_while_connecting_to_server">Tidsgränsen nåddes i samband med anslutning mot servern.</string>
+ <string name="pref_never_send_crash_summary">Genom att skicka in stack-spår så hjälper du den pågående utvecklingen av Quicksy</string>
+ <string name="huawei_protected_apps_summary">För att fortsätta ta emot aviseringar även när skärmen är avstängd så måste du lägga till Quicksy i listan över skyddade appar.</string>
+ <string name="pref_notification_grace_period_summary">Tidslängden som Quicksy håller tyst efter att ha sett aktivitet i en annan enhet</string>
</resources>