Merge branch 'release/1.6.6' into main

This commit is contained in:
ganfra 2023-10-05 16:57:37 +02:00
commit 4fa634a283
100 changed files with 1635 additions and 165 deletions

View File

@ -7,7 +7,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:MaxMetaspaceSize=1g" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
jobs:

View File

@ -7,7 +7,7 @@ on:
- cron: "0 4 * * *"
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:MaxMetaspaceSize=1g" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
jobs:

View File

@ -6,7 +6,7 @@ on:
- cron: "0 4 * * *"
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:MaxMetaspaceSize=1g" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
jobs:

View File

@ -1,5 +1,6 @@
name: Sync Data From External Sources
on:
workflow_dispatch:
schedule:
# At 00:00 on every Monday UTC
- cron: '0 0 * * 1'
@ -80,4 +81,4 @@ jobs:
*Note*: Change are coming from [this project](https://github.com/matrix-org/matrix-analytics-events)
branch: sync-analytics-plan
base: develop
base: develop

View File

@ -9,7 +9,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx5g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx3g" -Dkotlin.incremental=false
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 4 --no-daemon
jobs:

View File

@ -1,3 +1,21 @@
Changes in Element v1.6.6 (2023-10-05)
======================================
Bugfixes 🐛
----------
- Fixed JWT token for Jitsi openidtoken-jwt authentication ([#7758](https://github.com/vector-im/element-android/issues/7758))
- Fix crash when max shortcuts count is exceeded ([#8644](https://github.com/vector-im/element-android/issues/8644))
- Fix Login with QR code not working with rust crypto. ([#8653](https://github.com/vector-im/element-android/issues/8653))
Other changes
-------------
- Use 3PID capability to show / hide email UI in settings ([#8615](https://github.com/vector-im/element-android/issues/8615))
- If an external account manager is configured on the server, use it to delete other sessions and hide the multi session deletion. ([#8616](https://github.com/vector-im/element-android/issues/8616))
- Hide account deactivation UI for account managed externally. ([#8619](https://github.com/vector-im/element-android/issues/8619))
- Fix import of SAS Emoji string translations. ([#8623](https://github.com/vector-im/element-android/issues/8623))
- Open external account manager for delete other sessions using Chrome custom tabs. ([#8645](https://github.com/vector-im/element-android/issues/8645))
Changes in Element v1.6.5 (2023-07-25)
======================================

View File

@ -331,6 +331,10 @@ ext.initScreenshotTests = { project ->
}
}
tasks.withType(Test) {
maxHeapSize = "2g"
}
// Workaround to have KSP generated Kotlin code available in the IDE (for code completion)
// Ref: https://github.com/airbnb/epoxy/releases/tag/5.0.0beta02
subprojects { project ->

View File

@ -0,0 +1,2 @@
Hlavní změny v této verzi: Element Android nyní používá Crypto Rust SDK.
Úplný seznam změn: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Hlavní změny v této verzi: opravné vydání.
Úplný seznam změn: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Die wichtigsten Änderungen in dieser Version: Element Android nutzt nun das Crypto-Rust-SDK.
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Die wichtigsten Änderungen in dieser Version: Fehlerbehebungen.
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Main changes in this version: mainly bug fixes.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
تغییرات عمده در این نگارش: المنت اندروید اکنون از SDK راست Crypto استفاده می‌کند.
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
تغغیرات عمده در این نگارش: ارائه تصحیحی.
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Element Android sekarang menggunakan SDK Kripto Rust.
Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: rilis perbaikan.
Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Threads são agora habilitadas por padrão.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Threads são agora habilitadas por padrão.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Basicamente correção de bugs!
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Basicamente melhorias no recurso de transmissão de voz.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Basicamente correção de bugs, em especial a correção da mensagem não aparecer na linha do tempo.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Basicamente correção de bugs, em especial a correção da mensagem não aparecer na linha do tempo.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Basicamente correção de bugs.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Basicamente correção de bugs.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: permalinks para salas, espaços, usuários e mensagens são agora exibidos como pílulas na linha do tempo. Também corrigimos alguns problemas com figurinhas personalizadas e o marcador de lido ficando travado no passado.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Basicamente correção de bugs.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Element Android está agora usando o Crypto Rust SDK.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Element Android está agora usando o Crypto Rust SDK.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: Element Android está agora usando o Crypto Rust SDK.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Hlavné zmeny v tejto verzii: Element Android teraz používa Crypto Rust SDK.
Úplný zoznam zmien: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Hlavné zmeny v tejto verzii: opravné vydanie.
Úplný zoznam zmien: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Ndryshime në këtë version: Element Android tanimë përdor Crypto Rust SDK.
Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Ndryshimet kryesore në këtë version: hedhje në qarkullim me ndreqje të ndryshme.
Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Основні зміни в цій версії: Element для Android відтепер використовує Crypto Rust SDK.
Список усіх змін: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
Основні зміни в цій версії: коригувальний випуск.
Список усіх змін: https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
此版本的主要變更現在起Element Android 使用 Crypto Rust SDK。
完整的變更紀錄https://github.com/vector-im/element-android/releases

View File

@ -0,0 +1,2 @@
此版本中的主要變動:版本修正。
完整的變更紀錄https://github.com/vector-im/element-android/releases

View File

@ -256,4 +256,39 @@
</plurals>
<string name="notice_room_server_acl_set_ip_literals_not_allowed">• IP literallarına uyğunlaşan serverlər qadağan edildi.</string>
<string name="notice_room_server_acl_set_ip_literals_allowed">• IP literallarına uyğunlaşan serverlərə icazə verilir.</string>
<string name="pill_message_in_unknown_room">Otaqdakı mesaj</string>
<string name="set_link_link">Bağlantı</string>
<string name="set_link_create">Bağlantı yarat</string>
<string name="message_reply_to_poll_preview">Anket</string>
<string name="pill_message_unknown_room_or_space">Otaq / Məkan</string>
<string name="set_link_edit">Bağlantını redaktə et</string>
<string name="set_link_text">Mətn</string>
<string name="message_reply_to_sender_ended_poll">Anket başa çatıb.</string>
<string name="notice_display_name_changed_to">%1$s ekran adını %2$s olaraq dəyişdi</string>
<string name="rich_text_editor_inline_code">Daxili kod formatın işlət</string>
<string name="rich_text_editor_code_block">Kod blokun dəyiş</string>
<string name="notice_room_canonical_alias_set_by_you">Bu otaq üçün əsas ünvanı %1$s olaraq təyin etdiniz.</string>
<string name="pill_message_in_room">Mesaj %s</string>
<string name="notice_room_aliases_added_and_removed_by_you">Bu otaq üçün ünvan kimi %2$s-nı sildiniz və %1$s əlavə etdiniz.</string>
<string name="settings_access_token">Giriş Nişanəniz</string>
<string name="notice_room_canonical_alias_unset">%1$s bu otaq üçün əsas ünvanı sildi.</string>
<string name="message_reply_to_ended_poll_preview">Anket bitdi</string>
<string name="notice_room_canonical_alias_set">%1$s bu otaq üçün əsas ünvanı %2$s olaraq təyin etdi.</string>
<string name="pill_message_from_unknown_user">Mesaj</string>
<string name="pill_message_from_user">%s-dan² mesaj</string>
<string name="settings_access_token_summary">Giriş nişanəniz hesabınıza tam giriş imkanı verir.Bunu heç kimlə paylaşmayın.</string>
<plurals name="notice_room_canonical_alias_alternative_added_by_you">
<item quantity="one">Bu otaq üçün alternativ %1$s ünvanın əlavə etdiniz.</item>
<item quantity="other">Bu otaq üçün alternativ %1$s ünvanın əlavə etdiniz.</item>
</plurals>
<string name="notice_room_canonical_alias_alternative_changed">%1$s bu otaq üçün alternativ ünvanları dəyişdi.</string>
<plurals name="notice_room_canonical_alias_alternative_added">
<item quantity="one">%1$s bu otaq üçün %2$s alternativ ünvanın əlavə etdi.</item>
<item quantity="other">%1$s bu otaq üçün %2$s alternativ ünvanın əlavə etdi.</item>
</plurals>
<string name="notice_room_canonical_alias_alternative_changed_by_you">Bu otaq üçün alternativ ünvanları dəyişdiniz.</string>
<plurals name="notice_room_canonical_alias_alternative_removed">
<item quantity="one">%1$s bu otaq üçün %2$s alternativ ünvanın sildi.</item>
<item quantity="other">%1$s bu otaq üçün %2$s alternativ ünvanın sildi.</item>
</plurals>
</resources>

View File

@ -224,7 +224,7 @@
<string name="notice_room_server_acl_set_title_by_you">Du hast die Server-ACL für diesen Raum gesetzt.</string>
<string name="notice_room_server_acl_set_title">%s hat die Server-Zugriffssteuerungsliste (ACL) für diesen Raum gesetzt.</string>
<string name="title_activity_settings">Einstellungen</string>
<string name="call_notification_answer">Akzeptiere</string>
<string name="call_notification_answer">Akzeptieren</string>
<string name="call_notification_reject">Ablehnen</string>
<string name="call_notification_hangup">Anruf beenden</string>
<string name="ok">Ok</string>
@ -263,7 +263,7 @@
<string name="matrix_only_filter">Nur Matrix-Kontakte</string>
<string name="no_result_placeholder">Keine Ergebnisse</string>
<string name="rooms_header">Räume</string>
<string name="send_bug_report_include_logs">Sende Protokolle</string>
<string name="send_bug_report_include_logs">Protokolle senden</string>
<string name="send_bug_report_include_crash_logs">Absturzberichte übermitteln</string>
<string name="send_bug_report_include_screenshot">Bildschirmfoto übermitteln</string>
<string name="send_bug_report">Problem melden</string>
@ -692,7 +692,7 @@
<string name="settings_noisy_notifications_preferences">Laute Benachrichtigungen einstellen</string>
<string name="settings_call_notifications_preferences">Anrufbenachrichtigung einstellen</string>
<string name="settings_silent_notifications_preferences">Stumme Benachrichtigungen einstellen</string>
<string name="settings_system_preferences_summary">Wähle LED-Farbe, Vibration, Ton …</string>
<string name="settings_system_preferences_summary">LED-Farbe, Vibration, Ton auswählen …</string>
<string name="notification_silent">Stumm</string>
<string name="passphrase_empty_error_message">Bitte eine Passphrase eingeben</string>
<string name="passphrase_passphrase_too_weak">Passphrase ist zu schwach</string>
@ -712,7 +712,7 @@
<string name="keys_backup_unlock_button">Historie entschlüsseln</string>
<string name="keys_backup_settings_restore_backup_button">Von Sicherung wiederherstellen</string>
<string name="keys_backup_settings_delete_backup_button">Lösche Sicherung</string>
<string name="keys_backup_settings_deleting_backup">Lösche Sicherung </string>
<string name="keys_backup_settings_deleting_backup">Sicherung löschen …</string>
<string name="keys_backup_settings_delete_confirm_title">Lösche Sicherung</string>
<string name="settings_notification_by_event">Präferenz der Benachrichtigungen nach Ereignis</string>
<string name="settings_troubleshoot_test_fcm_failed_too_many_registration">[%1$s]
@ -728,7 +728,7 @@
\nSichere deine Schlüssel, um sie nicht zu verlieren.</string>
<string name="keys_backup_setup_step3_generating_key_status">Wiederherstellungsschlüssel aus Passphrase generieren. Dies kann mehrere Sekunden brauchen.</string>
<string name="keys_backup_setup_skip_msg">Du verlierst möglicherweise den Zugang zu deinen Nachrichten, wenn du dich abmeldest oder das Gerät verlierst.</string>
<string name="keys_backup_restore_is_getting_backup_version">Rufe Sicherungsversion ab </string>
<string name="keys_backup_restore_is_getting_backup_version">Sicherungsversion abrufen …</string>
<string name="keys_backup_restore_with_passphrase">Nutze deine Wiederherstellungs-Passphrase, um deinen verschlüsselten Nachrichtenverlauf lesen zu können</string>
<string name="keys_backup_restore_use_recovery_key">nutze deinen Wiederherstellungsschlüssel</string>
<string name="keys_backup_restore_with_passphrase_helper_with_link">Wenn du deine Wiederherstellungspassphrase nicht weist, kannst du %s.</string>
@ -793,15 +793,15 @@
<string name="keys_backup_banner_in_progress">Sichere deine Schlüssel. Dies könnte einige Minuten dauern </string>
<string name="keys_backup_info_keys_all_backup_up">Alle Schlüssel sind gesichert</string>
<plurals name="keys_backup_info_keys_backing_up">
<item quantity="one">Sichere einen Schlüssel …</item>
<item quantity="other">Sichere %d Schlüssel </item>
<item quantity="one">Einen Schlüssel sichern …</item>
<item quantity="other">%d Schlüssel sichern </item>
</plurals>
<string name="keys_backup_info_title_version">Version</string>
<string name="keys_backup_info_title_algorithm">Algorithmus</string>
<string name="keys_backup_info_title_signature">Signatur</string>
<string name="keys_backup_restoring_computing_key_waiting_message">Berechne Wiederherstellungsschlüssel </string>
<string name="keys_backup_restoring_downloading_backup_waiting_message">Lade Schlüssel herunter </string>
<string name="keys_backup_restoring_importing_keys_waiting_message">Importiere Schlüssel …</string>
<string name="keys_backup_restoring_computing_key_waiting_message">Wiederherstellungsschlüssel berechnen </string>
<string name="keys_backup_restoring_downloading_backup_waiting_message">Schlüssel herunterladen …</string>
<string name="keys_backup_restoring_importing_keys_waiting_message">Schlüssel importieren …</string>
<string name="action_ignore">Ignorieren</string>
<string name="auth_login_sso">Mit Single-Sign-On anmelden</string>
<string name="settings_send_message_with_enter">Nachricht mit Eingabetaste senden</string>
@ -903,8 +903,8 @@
<string name="settings_labs_show_hidden_events_in_timeline">Versteckte Ereignisse in der Zeitleiste anzeigen</string>
<string name="bottom_action_people_x">Direktnachrichten</string>
<string name="send_file_step_idle">Warten </string>
<string name="send_file_step_encrypting_thumbnail">Vorschaubild wird verschlüsselt …</string>
<string name="send_file_step_encrypting_file">Verschlüssle Datei </string>
<string name="send_file_step_encrypting_thumbnail">Vorschaubild verschlüsseln …</string>
<string name="send_file_step_encrypting_file">Datei verschlüsseln </string>
<string name="edited_suffix">(bearbeitet)</string>
<string name="message_edits">Nachrichtenbearbeitung</string>
<string name="no_message_edits_found">Keine Änderungen gefunden</string>
@ -912,7 +912,7 @@
<string name="room_filtering_footer_create_new_direct_message">Sende eine neue Direktnachricht</string>
<string name="room_filtering_footer_open_room_directory">Das Raumverzeichnis anzeigen</string>
<string name="link_copied_to_clipboard">Link in die Zwischenablage kopiert</string>
<string name="creating_direct_room">Erstelle Raum </string>
<string name="creating_direct_room">Raum erstellen </string>
<string name="message_view_edit_history">Bearbeitungsverlauf anzeigen</string>
<string name="import_e2e_keys_from_file">E2E-Schlüssel aus der Datei \"%1$s\" importieren.</string>
<string name="send_suggestion_sent">Vielen Dank, der Vorschlag wurde erfolgreich gesendet</string>
@ -1003,7 +1003,7 @@
<string name="send_attachment">Anhang senden</string>
<string name="a11y_open_drawer">Navigationsmenü öffnen</string>
<string name="a11y_create_menu_open">Raumerstellungsmenü öffnen</string>
<string name="a11y_create_menu_close">Schließe das Raumerstellungsmenü </string>
<string name="a11y_create_menu_close">Das Raumerstellungsmenü schließen </string>
<string name="a11y_create_direct_message">Erstelle eine neue Direktnachricht</string>
<string name="a11y_create_room">Erstelle einen neuen Raum</string>
<string name="a11y_close_keys_backup_banner">Schließe Key-Backup-Einblendung</string>
@ -1030,15 +1030,15 @@
<string name="content_reported_title">Inhalt gemeldet</string>
<string name="content_reported_content">Dieser Inhalt wurde gemeldet.
\n
\nWenn du keine weiteren Inhalte dieser Person sehen möchtest, kannst sie ignorieren, um ihre Nachrichten auszublenden.</string>
\nWenn du keine Inhalte mehr von dieser Person sehen möchtest, kannst du sie ignorieren, um ihre Nachrichten auszublenden.</string>
<string name="content_reported_as_spam_title">Als Spam gemeldet</string>
<string name="content_reported_as_spam_content">Dieser Inhalt wurde als Spam gemeldet.
\n
\nWenn du keine weiteren Inhalte dieser Person sehen möchtest, kannst sie ignorieren, um ihre Nachrichten auszublenden.</string>
\nWenn du keine Inhalte mehr von dieser Person sehen möchtest, kannst du sie ignorieren, um ihre Nachrichten auszublenden.</string>
<string name="content_reported_as_inappropriate_title">Als unangebracht gemeldet</string>
<string name="content_reported_as_inappropriate_content">Dieser Inhalt wurde als unangebracht gemeldet.
\n
\nWenn du keine weiteren Inhalte dieser Person sehen möchtest, kannst sie ignorieren, um ihre Nachrichten auszublenden.</string>
\nWenn du keine Inhalte mehr von dieser Person sehen möchtest, kannst du sie ignorieren, um ihre Nachrichten auszublenden.</string>
<string name="message_ignore_user">Nutzer ignorieren</string>
<string name="room_list_quick_actions_notifications_all_noisy">Alle Nachrichten (laut)</string>
<string name="room_list_quick_actions_notifications_all">Alle Nachrichten</string>
@ -1524,8 +1524,8 @@
<string name="uploads_files_title">DATEIEN</string>
<string name="uploads_files_subtitle">%1$s um %2$s</string>
<string name="uploads_files_no_result">Es gibt in diesem Raum keine Dateien</string>
<string name="room_list_quick_actions_favorite_add">Füge zu Favoriten hinzu</string>
<string name="room_list_quick_actions_favorite_remove">Entferne von Favoriten</string>
<string name="room_list_quick_actions_favorite_add">Zu Favoriten hinzufügen</string>
<string name="room_list_quick_actions_favorite_remove">Aus Favoriten entfernen</string>
<string name="notice_member_no_changes_by_you">Du hast keine Änderungen gemacht</string>
<string name="room_join_rules_public_by_you">Du hast den Raum für alle, die den Link kennen, zugänglich gemacht.</string>
<string name="room_join_rules_invite_by_you">Du hast den Raumbeitritt auf Einladungen beschränkt.</string>
@ -1622,9 +1622,9 @@
<string name="settings_call_show_confirmation_dialog_title">Versehentliche Anrufe verhindern</string>
<string name="settings_call_show_confirmation_dialog_summary">Bitte um Bestätigung, bevor du einen Anruf tätigst</string>
<string name="bottom_sheet_setup_secure_backup_submit">Einrichten</string>
<string name="no_permissions_to_start_conf_call">Dir fehlt die Berechtigung in diesem Raum eine Konferenz zu starten</string>
<string name="video_meeting">Beginne eine Videokonferenz</string>
<string name="audio_meeting">Beginne eine Audiokonferenz</string>
<string name="no_permissions_to_start_conf_call">Du bist nicht berechtigt, in diesem Raum ein Konferenzgespräch zu starten</string>
<string name="video_meeting">Videokonferenz starten</string>
<string name="audio_meeting">Audiokonferenz starten</string>
<string name="audio_video_meeting_description">Konferenzen nutzen die Jitsi-Sicherheits- und Berechtigungsrichtlinien. Alle im Raum Anwesenden können während der Konferenz beitreten.</string>
<string name="cannot_call_yourself">Du kannst dich nicht selbst anrufen</string>
<string name="cannot_call_yourself_with_invite">Du kannst dich nicht selbst anrufen, warte bis Teilnehmer die Einladung annehmen</string>
@ -1670,7 +1670,7 @@
<string name="sent_a_poll">Umfrage</string>
<string name="sent_a_reaction">Reagierte mit: %s</string>
<string name="universal_link_malformed">Der Link war fehlerhaft</string>
<string name="no_permissions_to_start_webrtc_call">Du bist nicht berechtigt, einen Anruf in diesem Raum zu beginnen</string>
<string name="no_permissions_to_start_webrtc_call">Du bist nicht berechtigt, in diesem Raum einen Anruf zu beginnen</string>
<string name="sent_verification_conclusion">Ergebnis der Überprüfung</string>
<string name="delete_account_data_warning">Kontodaten vom Typ %1$s löschen\?
\n
@ -1681,8 +1681,8 @@
<string name="settings_troubleshoot_test_push_loop_waiting_for_push">Die Applikation wartet auf den PUSH</string>
<string name="settings_troubleshoot_test_push_loop_title">Push testen</string>
<string name="search_banned_user_hint">Gebannte Nutzer filtern</string>
<string name="no_permissions_to_start_webrtc_call_in_direct_room">Du bist nicht berechtigt einen Anruf zu beginnen</string>
<string name="no_permissions_to_start_conf_call_in_direct_room">Du hast keine Berechtigung ein Konferenzgespräch zu starten</string>
<string name="no_permissions_to_start_webrtc_call_in_direct_room">Du bist nicht berechtigt, einen Anruf zu beginnen</string>
<string name="no_permissions_to_start_conf_call_in_direct_room">Du bist nicht berechtigt, ein Konferenzgespräch zu starten</string>
<string name="settings_security_pin_code_notifications_summary_on">Details wie Raumnamen und Nachrichteninhalt zeigen.</string>
<string name="settings_security_pin_code_notifications_title">Inhalt in Benachrichtigungen anzeigen</string>
<string name="settings_security_pin_code_use_biometrics_summary_off">PIN-Code ist die einzige Möglichkeit ${app_name} zu entsperren.</string>
@ -1729,11 +1729,11 @@
<string name="settings_security_pin_code_notifications_summary_off">Nur die Anzahl ungelesener Nachrichten in der Benachrichtigung zeigen.</string>
<string name="attachment_type_dialog_title">Füge Bild hinzu per</string>
<string name="warning_room_not_created_yet">Der Raum ist noch nicht erstellt. Raumerstellung abbrechen\?</string>
<string name="room_list_quick_actions_low_priority_add">Zu niedrige Priorität hinzufügen</string>
<string name="room_list_quick_actions_low_priority_add">Zu niedriger Priorität hinzufügen</string>
<string name="create_room_topic_hint">Thema</string>
<string name="warning_unsaved_change_discard">Änderungen verwerfen</string>
<string name="warning_unsaved_change">Es gibt ungespeicherte Änderungen. Änderungen verwerfen\?</string>
<string name="room_list_quick_actions_low_priority_remove">Von niedrige Priorität entfernen</string>
<string name="room_list_quick_actions_low_priority_remove">Aus niedriger Priorität entfernen</string>
<string name="rotate_and_crop_screen_title">Rotieren und Zuschneiden</string>
<string name="create_room_settings_section">Raumeinstellungen</string>
<string name="create_room_topic_section">Raumthema (optional)</string>
@ -2026,7 +2026,7 @@
</plurals>
<string name="error_file_too_big_simple">Die Datei ist zu groß.</string>
<string name="send_file_step_compressing_video">Video wird komprimiert (%d%%)</string>
<string name="send_file_step_compressing_image">Komprimiere Bild …</string>
<string name="send_file_step_compressing_image">Bild komprimieren …</string>
<string name="use_as_default_and_do_not_ask_again">Als Standard festsetzen und nicht mehr fragen</string>
<string name="option_always_ask">Jedes Mal fragen</string>
<string name="directory_add_a_new_server_prompt">Gib den Namen des neuen Servers ein, den du erkunden möchtest.</string>
@ -2128,9 +2128,9 @@
<item quantity="other">%d verpasste Sprachanrufe</item>
</plurals>
<string name="hs_client_url">Heim-Server-API-Adresse</string>
<string name="denied_permission_voice_message">Um Sprachnachrichten zu senden, erlaube bitte Zugriff aufs Mikrofon.</string>
<string name="denied_permission_camera">Um fortzufahren, erlaube bitte in den Systemeinstellungen Zugriff auf die Kamera.</string>
<string name="denied_permission_generic">Für diese Aktion fehlen einige Berechtigungen, bitte erlaube diese in den Systemeinstellungen.</string>
<string name="denied_permission_voice_message">Um Sprachnachrichten zu senden, gewähre bitte den Zugriff aufs Mikrofon.</string>
<string name="denied_permission_camera">Um fortzufahren, gewähre bitte in den Systemeinstellungen den Zugriff auf die Kamera.</string>
<string name="denied_permission_generic">Für diese Aktion fehlen einige Berechtigungen, bitte gewähre diese in den Systemeinstellungen.</string>
<string name="voice_message_slide_to_cancel">Wische zum Abbrechen</string>
<string name="spaces_which_can_access">Spaces mit Zugriff auf</string>
<string name="allow_space_member_to_find_and_access">Space-Mitgliedern Auffinden und Zugriff erlauben.</string>
@ -2877,7 +2877,7 @@
<string name="notice_voice_broadcast_ended">%1$s beendete eine Sprachübertragung.</string>
<string name="stop_voice_broadcast_content">Möchtest du die Übertragung wirklich beenden\? Dies wird die Übertragung beenden und die vollständige Aufnahme im Raum bereitstellen.</string>
<string name="stop_voice_broadcast_dialog_title">Live-Übertragung beenden\?</string>
<string name="action_stop">Ja, beende</string>
<string name="action_stop">Ja, beenden</string>
<string name="rich_text_editor_link">Link setzen</string>
<string name="set_link_edit">Link bearbeiten</string>
<string name="set_link_create">Link erstellen</string>

View File

@ -2958,4 +2958,12 @@
<string name="crosssigning_verify_after_update">کاره به‌روز شد</string>
<string name="sign_out_anyway">خروج به هر صورت</string>
<string name="sign_out_failed_dialog_message">نمی‌توان به کارساز خانگی رسید. اگر همچنان خارج شوید این افزاره از سیاههٔ افزاره‌هایتان پاک نخواهد شد و باید از کارخواهس دیگر برش دارید.</string>
<string name="invite_unknown_users_dialog_content">ناتوان در یافتن نمایه‌ها برای شناسه‌های ماتریکس سیاهه شده. می‌خواهید به هر حال دعوتشان کنید؟
\n
\n%s</string>
<string name="create_room_unknown_users_dialog_content">ناتوان در یافتن نمایه‌ها برای شناسه‌های ماتریکس سیاهه شده. می‌خواهید به هر حال گپی بیاغازید؟
\n
\n%s</string>
<string name="create_room_unknown_users_dialog_submit">آغاز گپ به هر حال</string>
<string name="invite_unknown_users_dialog_submit">دعوت به هر حال</string>
</resources>

View File

@ -659,7 +659,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
<string name="send_suggestion_content">Lūdzu, rakstiet savu ieteikumu zemāk.</string>
<string name="send_suggestion">Ieteikumi</string>
<string name="preference_root_help_about">Palīdzība un par lietotni</string>
<string name="settings_security_and_privacy">Drošība un konfidencialitāte</string>
<string name="settings_security_and_privacy">Drošība un privātums</string>
<string name="settings_general_title">Vispārīgi</string>
<string name="create_room_public_title">Publiska</string>
<string name="create_room_settings_section">Istabas iestatījumi</string>
@ -1236,7 +1236,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
<string name="initial_sync_start_server_computing">Sākotnējā sinhronizācija:
\nGaida servera atbildi…</string>
<string name="labs_show_unread_notifications_as_tab">Pievienojiet speciālu cilni priekš nelasītiem paziņojumiem galvenajā ekrānā.</string>
<string name="labs_swipe_to_reply_in_timeline">Ieslēgt pavilkšanas žestu, lai atbildētu uz ziņu</string>
<string name="labs_swipe_to_reply_in_timeline">Laika joslā iespējot atbildēšanu pavelkot</string>
<string name="no_message_edits_found">Labojumi netika atrasti</string>
<string name="message_edits">Ziņu labojumi</string>
<string name="settings_labs_show_complete_history_in_encrypted_room">Rādīt pilnu vēsturi šifrētajās istabās</string>
@ -1877,7 +1877,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
<string name="settings_server_default_room_version">Noklusējuma versija</string>
<string name="settings_server_room_versions">Istabu versijas 👓</string>
<string name="settings_category_composer">Ziņu redaktors</string>
<string name="settings_category_timeline">Hronoloģija</string>
<string name="settings_category_timeline">Laika josla</string>
<string name="verify_cannot_cross_sign">Šī sesija nevar kopīgot šo verifikāciju ar citām sesijām.
\nVerifikācija tiks saglabāta lokāli un kopīgota kādā no nākamajām lietotnes versijām.</string>
<string name="rendering_event_error_exception">${app_name} saskārās ar problēmu, atveidojot notikuma ar id \'%1$s\' saturu</string>
@ -1945,11 +1945,11 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
<string name="push_gateway_item_url">Url:</string>
<string name="push_gateway_item_device_name">Sesijas attēlojamais nosaukums:</string>
<string name="push_gateway_item_app_display_name">Lietotnes attēlojamais nosaukums:</string>
<string name="push_gateway_item_push_key">Iesūtīšanas atslēga:</string>
<string name="push_gateway_item_push_key">Pašpiegādes atslēga:</string>
<string name="push_gateway_item_app_id">Lietotnes identifikators:</string>
<string name="settings_push_gateway_no_pushers">Nav reģistrētu Palaišanas vārtu</string>
<string name="settings_push_rules_no_rules">Nav iestatīti Palaišanas Noteikumi</string>
<string name="settings_push_rules">Palaišanas Noteikumi</string>
<string name="settings_push_gateway_no_pushers">Nav norādītas pašpiegādes vārtejas</string>
<string name="settings_push_rules_no_rules">Nav norādīti pašpiegādes nosacījumi</string>
<string name="settings_push_rules">Pašpiegādes nosacījumi</string>
<string name="create_new_space">Radīt jaunu Telpu</string>
<string name="error_user_already_logged_in">Izskatās, ka mēģini izveidot savienojumu ar citu mājasserveri. Vai atteikties\?</string>
<string name="room_settings_room_notifications_notify_me">Paziņot mani priekš</string>
@ -1988,9 +1988,9 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
\n%1$s</string>
<string name="settings_troubleshoot_test_bg_restricted_success">Fona ierobežojumi ir izslēgti priekš ${app_name}. Šis tests jāveic, izmantojot mobilos datus (bez WIFI).
\n%1$s</string>
<string name="settings_troubleshoot_test_push_loop_failed">Neizdevās saņemt palaišanu. Iespējams, vajag pārielādēt lietotni.</string>
<string name="settings_troubleshoot_test_push_loop_success">Lietotne saņem Palaišanu</string>
<string name="settings_troubleshoot_test_push_loop_waiting_for_push">Lietotne gaida Palaišanu</string>
<string name="settings_troubleshoot_test_push_loop_failed">Neizdevās saņemt pašpiegādi. Risinājums varētu būt atkārtota lietotnes uzstādīšana.</string>
<string name="settings_troubleshoot_test_push_loop_success">Lietotne saņem pašpiegādi</string>
<string name="settings_troubleshoot_test_push_loop_waiting_for_push">Lietotne gaida pašpiegādi</string>
<string name="settings_troubleshoot_test_push_loop_title">Pārbaudīt pašpiegādi</string>
<string name="settings_troubleshoot_test_fcm_failed_account_missing">[%1$s]
\nŠī kļūda ir ārpus ${app_name} kontroles. Tālrunī nav Google konta. Lūdzu, atveriet kontu pārvaldnieku un pievienojiet Google kontu.</string>
@ -2054,8 +2054,8 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
<string name="open_poll_option_title">Atvērt aptauju</string>
<string name="onboarding_new_app_layout_feedback_title">Sniegt atgriezenisko saiti</string>
<string name="onboarding_new_app_layout_feedback_message">Piesist augšējā labajā stūrī, lai redzētu iespēju sniegt atgriezenisko saiti.</string>
<string name="notice_voice_broadcast_ended_by_you">Tu beidzi balss pārraidi.</string>
<string name="notice_voice_broadcast_ended">%1$s izbeidza balss pārraidi.</string>
<string name="notice_voice_broadcast_ended_by_you">Tu beidzi balss apraidi.</string>
<string name="notice_voice_broadcast_ended">%1$s izbeidza balss apraidi.</string>
<string name="qr_code_login_header_show_qr_code_new_device_description">Izmantot ierīci, kurā veikta pieteikšanās, lai nolasītu zemāk esošo kvadrātkodu:</string>
<string name="qr_code_login_header_show_qr_code_link_a_device_description">Nolasīt zemāk esošo kvadrātkodu ar ierīci, kurā ir notikusi atteikšanās.</string>
<string name="qr_code_login_header_show_qr_code_title">Pieteikties ar kvadrātkodu</string>
@ -2132,7 +2132,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
<string name="thread_list_modal_my_threads_subtitle">Rāda visus pavedienus, kuros ir notikusi iesaistīšanās</string>
<string name="call_start_screen_sharing">Kopīgot ekrānu</string>
<string name="labs_enable_deferred_dm_summary">Izveidot tiešo ziņu tikai pēc pirmās ziņas</string>
<string name="labs_enable_rich_text_editor_summary">Izmēģināt bagātinātu teksta rakstīšanu (vienkārša teksta ievade būs drīzumā)</string>
<string name="labs_enable_rich_text_editor_summary">Izmēģināt bagātinātu teksta rakstīšanu (vienkārša teksta ievade gaidāma drīzumā)</string>
<string name="invites_empty_title">Nekā jauna.</string>
<string name="room_notification_more_than_two_users_are_typing">%1$s, %2$s un citi</string>
<string name="thread_list_modal_all_threads_title">Visi pavedieni</string>
@ -2200,7 +2200,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
<string name="threads_labs_enable_notice_title">Pavedieni Beta</string>
<string name="search_space_two_parents">%1$s un %2$s</string>
<string name="analytics_opt_in_title">Palīdzēt uzlabot ${app_name}</string>
<string name="settings_autoplay_animated_images_summary">Atskaņot kustīgos laikjoslas attēlus, tiklīdz tie ir redzami</string>
<string name="settings_autoplay_animated_images_summary">Atskaņot kustīgos laika joslas attēlus, tiklīdz tie ir redzami</string>
<string name="settings_troubleshoot_test_system_settings_permission_failed">${app_name} ir nepieciešama atļauja, lai parādītu paziņojumus.
\nLūgums piešķirt atļauju.</string>
<plurals name="search_space_multiple_parents">
@ -2341,7 +2341,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
<string name="contact_admin_to_restore_encryption">Lūgums sazināties ar pārvaldītāju, lai atjaunotu šifrēšanu derīgā stāvoklī.</string>
<string name="ftue_auth_phone_confirmation_title">Apstiprināt tālruņa numuru</string>
<string name="permalink_unsupported_groups">Šo saiti nevar atvērt: kopienas tika aizstātas ar vietām</string>
<string name="started_a_voice_broadcast">Uzsāka balss pārraidi</string>
<string name="started_a_voice_broadcast">Uzsāka balss apraidi</string>
<string name="ftue_auth_use_case_skip_partial">Izlaist šo jautājumu</string>
<string name="verification_request_waiting_for_recovery">Apliecina ar drošo atslēgu vai vārdkopu…</string>
<string name="encryption_has_been_misconfigured">Šifrēšana ir kļūdaini uzstādīta.</string>
@ -2503,4 +2503,520 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka.</string>
<string name="alert_push_are_disabled_description">Jāpārskata iestatījumi, lai iespējotu pašpiegādes paziņojumus</string>
<string name="save_recovery_key_chooser_hint">Saglabāt atkopšanas atslēgu</string>
<string name="bottom_sheet_setup_secure_backup_submit">Uzstādīt</string>
<plurals name="entries">
<item quantity="zero">%d ierakstu</item>
<item quantity="one">%d ieraksts</item>
<item quantity="other">%d ieraksti</item>
</plurals>
<string name="settings_security_application_protection_title">Aizsargāt piekļuvi</string>
<string name="settings_security_application_protection_screen_title">Iestatīt aizsardzību</string>
<string name="auth_pin_reset_content">Lai atiestatītu PIN, būs nepieciešams atkārtoti pieteikties un izveidot jaunu.</string>
<string name="create_pin_confirm_failure">Neizdevās apstiprināt PIN, lūgums ievadīt jaunu.</string>
<string name="auth_biometric_key_invalidated_message">Biometriskā autentificēšanās tika atspējota, jo nesen tika pievienots jauns biometriskās autentifikācijas veids. To var atkal iespējot iestatījumos.</string>
<string name="settings_security_application_protection_summary">Aizsargāt piekļuvi ar PIN un biometriju.</string>
<plurals name="wrong_pin_message_remaining_attempts">
<item quantity="zero">Nepareizs kods, atlikuši %d mēģinājumu</item>
<item quantity="one">Nepareizs kods, atlicis %d mēģinājums</item>
<item quantity="other">Nepareizs kods, atlikuši %d mēģinājumi</item>
</plurals>
<string name="too_many_pin_failures">Pārāk daudz kļūdu, tādēļ tiki izrakstīts</string>
<string name="settings_security_pin_code_use_biometrics_error">Nevarēja iespējot biometrisko autentifikāciju.</string>
<string name="a11y_open_settings">Atvērt iestatījumus</string>
<string name="a11y_trust_level_default">Noklusējuma uzticamības līmenis</string>
<string name="settings_security_pin_code_summary">Ja ir vēlēšanas atiestatīt savu PIN, jāpiesit Aizmirsu PIN, lai atteiktos un atiesatītu.</string>
<string name="settings_security_pin_code_grace_period_title">Pieprasīt PIN pēc 2 minūtēm</string>
<string name="call_transfer_consult_first">Iepriekškonsultēšana</string>
<string name="dev_tools_error_no_content">Nav satura</string>
<string name="error_voice_message_unable_to_record">Nevar ierakstīt balss ziņu</string>
<string name="voice_broadcast_buffering">Buferizācija…</string>
<string name="a11y_trust_level_warning">Brīdinājuma uzticamības līmenis</string>
<string name="re_authentication_default_confirm_text">${app_name} pieprasa ievadīt piekļuves datus, lai veiktu šo darbību.</string>
<string name="a11y_unsent_draft">ir nenosūtīts melnraksts</string>
<string name="dev_tools_explore_room_state">Izpētīt istabas stāvokli</string>
<string name="a11y_trust_level_trusted">Uzticams uzticamības līmenis</string>
<string name="a11y_checked">Atzīmēts</string>
<string name="dev_tools_send_custom_event">Nosūtīt pielāgotu notikumu</string>
<string name="dev_tools_edit_content">Labot saturu</string>
<string name="dev_tools_send_custom_state_event">Nosūtīt pielāgotu stāvokļa notikumu</string>
<string name="dev_tools_error_no_message_type">Trūkst ziņas veida</string>
<string name="dev_tools_success_state_event">Stāvokļa notikums ir nosūtīts.</string>
<string name="dev_tools_event_content_hint">Notikuma saturs</string>
<string name="space_explore_filter_no_result_description">Dažas vietas var būt paslēptas, jo tās ir privātas un ir nepieciešams uzaicinājums uz tām.</string>
<string name="spaces_feeling_experimental_subspace">Jūtams izmēģinājuma gars\?
\nVietai ir iespējams pievienot esošas vietas.</string>
<string name="error_voice_message_cannot_reply_or_edit">Nevar atbildēt vai labot, kamēr tiek izmantota balss ziņa</string>
<string name="a11y_pause_audio_message">Apturēt %1$s</string>
<string name="audio_message_reply_content">%1$s (%2$s)</string>
<string name="audio_message_file_size">(%1$s)</string>
<string name="upgrade">Jaunināt</string>
<string name="voice_message_n_seconds_warning_toast">Atlikušas %1$d s</string>
<plurals name="call_active_status">
<item quantity="zero">%1$d notiekošu zvanu ·</item>
<item quantity="one">%1$d notiekošs zvans ·</item>
<item quantity="other">%1$d notiekoši zvani ·</item>
</plurals>
<string name="a11y_unchecked">Nav atzīmēts</string>
<string name="dev_tools_menu_name">Izstrādātāja rīki</string>
<string name="discovery_section">Atklājamība (%s)</string>
<string name="space_add_existing_spaces">Pievienot esošas vietas</string>
<string name="space_add_space_to_any_space_you_manage">Pievienot vietu jebkurai sevis pārvaldītai vietai.</string>
<string name="labs_enable_thread_messages_desc">Piezīme: lietotne tiks pārsāknēta</string>
<string name="settings_show_latest_profile">Parādīt jaunāko lietotāja informāciju</string>
<string name="a11y_play_voice_message">Atskaņot balss ziņu</string>
<string name="a11y_pause_voice_message">Apturēt balss ziņu</string>
<string name="voice_message_reply_content">Balss ziņa (%1$s)</string>
<string name="voice_broadcast_live">Tiešraide</string>
<string name="a11y_resume_voice_broadcast_record">Atsākt balss apraides ierakstu</string>
<string name="call_transfer_consulting_with">Konsultējas ar %1$s</string>
<string name="voice_message_slide_to_cancel">Slidināt, lai atceltu</string>
<string name="a11y_stop_voice_broadcast_record">Pārtraukt balss apraides ierakstu</string>
<string name="call_transfer_title">Pārvirzīt</string>
<string name="a11y_rule_notify_noisy">Paziņot ar skaņu</string>
<string name="a11y_error_some_message_not_sent">Dažas ziņas netika nosūtītas</string>
<string name="user_invites_you">%s uzaicina Tevi</string>
<string name="upgrade_room_update_parent_space">Automātiski uzaicināt vietas vecākvienumu</string>
<string name="error_failed_to_join_room">Atvainojamies, atgadījās kļūda pievienošanās mēģinājuma laikā: %s</string>
<string name="a11y_import_key_from_file">Ievietot atslēgu no datnes</string>
<string name="dev_tools_send_state_event">Nosūtīt stāvokļa notikumu</string>
<string name="dev_tools_error_malformed_event">Nepareizi veidots notikums</string>
<string name="space_mark_as_not_suggested">Atzīmēt kā neieteikto</string>
<string name="a11y_start_voice_message">Ierakstīt balss ziņu</string>
<string name="voice_broadcast_live_broadcast">Tiešraides apraide</string>
<string name="upgrade_room_auto_invite">Automātiski uzaicināt lietotājus</string>
<string name="a11y_presence_busy">Aizņemts</string>
<string name="command_description_upgrade_room">Atjaunina istabu uz jaunu versiju</string>
<plurals name="space_people_you_know">
<item quantity="zero">Jau pievienojušies %d zināmu cilvēku</item>
<item quantity="one">Jau pievienojies %d zināms cilvēks</item>
<item quantity="other">Jau pievienojušies %d zināmi cilvēki</item>
</plurals>
<string name="dev_tools_form_hint_event_content">Notikuma saturs</string>
<string name="upgrade_public_room_from_to">Šī istaba tiks jaunināta no %1$s uz %2$s.</string>
<string name="space_mark_as_suggested">Atzīmēt kā ieteikto</string>
<string name="settings_security_pin_code_notifications_title">Rādīt saturu paziņojumos</string>
<string name="settings_security_pin_code_notifications_summary_on">Rādīt, piemēram, istabu nosaukumus un ziņas saturu.</string>
<string name="settings_security_pin_code_notifications_summary_off">Attēlot tikai neizlasīto ziņu skaitu vienkāršā paziņojumā.</string>
<string name="error_opening_banned_room">Nevar atvērt istabu, no kuras esi izslēgts.</string>
<string name="call_transfer_transfer_to_title">Pārvirzīt uz %1$s</string>
<string name="re_authentication_activity_title">Nepieciešama atkārtota autentificēšanās</string>
<string name="dev_tools_state_event">Stāvokļa notikumi</string>
<string name="room_alias_preview_not_found">Pašlaik šis aizstājvārds nav pieejams.
\nVēlāk jāmēģina vēlreiz vai jāvaicā istabas pārvaldītājam, lai pārbauda, vai Tev ir piekļuve.</string>
<string name="create_space_identity_server_info_none">Pašlaik netiek izmantots identitātes serveris. Lai varētu uzaicināt komandas biedrus un būtu tiem atklājams, jāiestata tāds zemāk.</string>
<string name="space_leave_prompt_msg_private">Nebūs iespējams atkārtoti pievienoties bez uzaicinājuma.</string>
<string name="space_explore_filter_no_result_title">Nekas netika atrasts</string>
<string name="labs_auto_report_uisi">Automātiski ziņot par atšifrēšanas kļūdām.</string>
<string name="labs_auto_report_uisi_desc">Sistēma automātiski nosūtīts žurnāla ierakstus, kad notiks kļūda \"nav iespējams atšifrēt\"</string>
<string name="settings_security_pin_code_use_biometrics_summary_on">Iespējot no ierīces atkarīgu biometriju, piemēram, pirkstu nospiedumus un sejas atpazīšanu.</string>
<string name="settings_security_pin_code_grace_period_summary_on">PIN kods tiks pieprasīts pēc 2 minūšu ${app_name} neizmantošanas.</string>
<string name="settings_security_pin_code_grace_period_summary_off">PIN kods tiek pieprasīts katrā ${app_name} atvēršanas reizē.</string>
<string name="call_transfer_failure">Notika kļūda zvana pārvirzīšanas laikā</string>
<string name="a11y_rule_notify_silent">Paziņot bez skaņas</string>
<string name="dev_tools_success_event">Notikums ir nosūtīts.</string>
<string name="event_status_a11y_failed">Neizdevās</string>
<string name="space_leave_prompt_msg_as_admin">Tu esi vienīgais šīs vietas pārvaldītājs. Tās atstāšana nozīmē, ka neviens to nepārvaldīs.</string>
<string name="labs_enable_thread_messages">Iespējot pavedienu ziņas</string>
<string name="looking_for_someone_not_in_space">Meklē kādu, kurš nav %s\?</string>
<string name="space_suggested">Ieteiktā</string>
<string name="unnamed_room">Istaba bez nosaukuma</string>
<string name="upgrade_required">Nepieciešams jauninājums</string>
<string name="upgrade_private_room">Jaunināt privāto istabu</string>
<string name="upgrade_room_no_power_to_manage">Ir nepieciešama atļauja, lai jauninātu istabu</string>
<string name="a11y_stop_voice_message">Apturēt ierakstīšanu</string>
<string name="a11y_recording_voice_message">Ieraksta balss ziņu</string>
<string name="error_voice_message_broadcast_in_progress">Nevar uzsākt balss ziņu</string>
<string name="a11y_audio_message_item">%1$s, %2$s, %3$s</string>
<string name="a11y_play_audio_message">Atskaņot %1$s</string>
<string name="settings_show_latest_profile_description">Parādīt jaunāko profila informāciju (attēlu un attēlojamo vārdu) visām ziņām.</string>
<string name="it_may_take_some_time">Lūgums paciesties, tas var aizņemt kādu laiku.</string>
<string name="upgrade_room_warning">Istabas jaunināšana ir sarežģīta darbība un parasti ir ieteicama, kad istaba ir nepastāvīga kļūdu, trūkstošu iespēju vai drošības ievainojamību dēļ.
\nTas parasti tikai ietekmē to, kā istaba tiek apstrādāta serverī.</string>
<string name="room_upgrade_to_recommended_version">Jaunināt uz ieteicamo istabas versiju</string>
<string name="voice_message_tap_to_stop_toast">Jāpiesit ierakstam, lai klausītos vai apturētu</string>
<string name="error_voice_message_broadcast_in_progress_message">Nevar uzsākt balss ziņu, jo pašreiz tiek ierakstīta tiešraides apraide. Lūgums to pārtraukt, lai varētu uzsākt balss ziņas ierakstīšanu</string>
<string name="a11y_pause_voice_broadcast_record">Apturēt balss apraides ierakstu</string>
<string name="error_voice_message_unable_to_play">Nevar atskaņot šo balss ziņu</string>
<string name="a11y_error_message_not_sent">Ziņa nav nosūtīta kļūdas dēļ</string>
<string name="share_by_text">Kopīgot ar tekstu</string>
<string name="settings_security_pin_code_use_biometrics_title">Iespējot biometriju</string>
<string name="finish_setup">Pabeigt iestatīšanu</string>
<string name="joining_replacement_room">Pievienoties aizvietotājistabai</string>
<string name="a11y_rule_notify_off">Nepaziņot</string>
<string name="finish_setting_up_discovery">Pabeigt atklājamības izveidošanu.</string>
<string name="you_are_invited">Tu esi uzaicināts</string>
<string name="upgrade_public_room">Jaunināt publisko istabu</string>
<string name="a11y_audio_playback_duration" tools:ignore="PluralsCandidate">%1$d minūtes %2$d sekundes</string>
<string name="error_audio_message_unable_to_play">Nespēj atskaņot %1$s</string>
<string name="settings_security_pin_code_use_biometrics_summary_off">PIN kods ir vienīgais veids, kā atslēgt ${app_name}.</string>
<string name="discovery_invite">Uzaicināt e-pastā, atrast kontaktus un vēl…</string>
<string name="dev_tools_form_hint_state_key">Stāvokļa atslēga</string>
<string name="space_leave_radio_buttons_title">Lietas šajā vietā</string>
<string name="location_share_external">Atvērt ar</string>
<string name="room_polls_wait_for_display">Attēlo aptaujas</string>
<string name="location_share_option_user_live">Kopīgot atrašanās vietu tiešraidē</string>
<string name="create_poll_question_title">Aptaujas jautājums vai temats</string>
<string name="a11y_location_share_option_pinned_icon">Kopīgot šo atrašanās vietu</string>
<string name="link_this_email_settings_link">Sasaistīt šo e-pasta adresi ar kontu</string>
<plurals name="poll_total_vote_count_before_ended_and_voted">
<item quantity="zero">Pamatojoties uz %1$d balsojumiem</item>
<item quantity="one">Pamatojoties uz %1$d balsojumu</item>
<item quantity="other">Pamatojoties uz %1$d balsojumiem</item>
</plurals>
<string name="create_poll_button">IZVEIDOT APTAUJU</string>
<string name="poll_no_votes_cast">Nav saņemti balsojumi</string>
<string name="end_poll_confirmation_title">Noslēgt šo aptauju\?</string>
<string name="error_voice_broadcast_unauthorized_title">Nevar uzsākt jaunu balss apraidi</string>
<string name="a11y_play_voice_broadcast">Atskaņot vai atsākt balss apraidi</string>
<string name="a11y_voice_broadcast_fast_backward">Ātri patīt 30 sekundes atpakaļ</string>
<string name="a11y_voice_broadcast_fast_forward">Ātri patīt 30 sekundes uz priekšu</string>
<string name="error_voice_broadcast_blocked_by_someone_else_message">Kāds cits jau ieraksta balss apraidi. Jāgaida, līdz tā beigsies, lai varētu uzsākt jaunu.</string>
<string name="stop_voice_broadcast_content">Vai tiešām pārtraukt tiešraides apraidi\? Tas izbeigs apraidi, un istabā būs pieejams viss ieraksts.</string>
<string name="this_invite_to_this_space_was_sent">Šis uzaicinājums uz šo vietu tika nosūtīts uz %s, kas nav saistīts ar Tavu kontu</string>
<string name="labs_enable_latex_maths">Iespējot LaTeX matemātiku</string>
<string name="create_poll_question_hint">Jautājums vai temats</string>
<string name="create_poll_empty_question_error">Jautājums nevar būt tukšs</string>
<plurals name="poll_total_vote_count_before_ended_and_not_voted">
<item quantity="zero">Saņemti %1$d balsojumu. Jābalso, lai redzētu iznākumu</item>
<item quantity="one">Saņemts %1$d balsojums. Jābalso, lai redzētu iznākumu</item>
<item quantity="other">Saņemti %1$d balsojumi. Jābalso, lai redzētu iznākumu</item>
</plurals>
<plurals name="poll_total_vote_count_after_ended">
<item quantity="zero">Galīgais iznākums, pamatojoties uz %1$d balsojumiem</item>
<item quantity="one">Galīgais iznākums, pamatojoties uz %1$d balsojumu</item>
<item quantity="other">Galīgais iznākums, pamatojoties uz %1$d balsojumiem</item>
</plurals>
<string name="poll_end_room_list_preview">Aptauja noslēgta</string>
<string name="edit_poll_title">Labot aptauju</string>
<string name="ended_poll_indicator">Noslēdza aptauju.</string>
<string name="room_polls_load_more">Ielādēt vairāk aptauju</string>
<string name="room_polls_loading_error">Kļūda aptauju izgūšanā.</string>
<string name="a11y_location_share_locate_button">Pietuvināt līdz pašreizējai atrašanās vietai</string>
<string name="location_share_live_select_duration_option_1">15 minūtes</string>
<string name="live_location_description">Atrašanās vietas tiešraide</string>
<string name="error_voice_broadcast_already_in_progress_message">Tu jau ieraksti balss apraidi. Lūgums pabeigt pašreizējo, lai uzsāktu jaunu.</string>
<string name="end_poll_confirmation_description">Tas vairs neļaus cilvēkiem balsot, un tiks attēlots aptaujas galīgais iznākums.</string>
<string name="poll_type_title">Aptaujas veids</string>
<string name="open_poll_option_description">Balsotāji redz iznākumu, tiklīdz viņi ir nobalsojuši</string>
<string name="location_share_live_enabled">Atrašanās vietas tiešraide iespējota</string>
<string name="location_share_live_ended">Atrašanās vietas tiešraide beidzās</string>
<string name="live_location_bottom_sheet_last_updated_at">Atjaunota pirms %1$s</string>
<string name="unable_to_decrypt_some_events_in_poll">Atšifrēšanas kļūdu dēļ daži balsojumi var netikt ieskaitīti</string>
<string name="location_share_option_pinned">Kopīgot šo atrašanās vietu</string>
<string name="a11y_location_share_pin_on_map">Piespraust atlasīto atrašanās vietu kartē</string>
<string name="location_share_live_view">Apskatīt atrašanās vietas tiešraidi</string>
<string name="tooltip_attachment_photo">Atvērt kameru</string>
<string name="tooltip_attachment_gallery">Nosūtīt attēlus un video</string>
<string name="location_share_live_until">Tiešraidē līdz %1$s</string>
<string name="a11y_static_map_image">Karte</string>
<string name="location_not_available_dialog_title">${app_name} nevarēja piekļūt atrašanās vietai</string>
<string name="a11y_pause_voice_broadcast">Apturēt balss apraidi</string>
<string name="poll_undisclosed_not_ended">Iznākums būs redzams, kad aptauja būs beigusies</string>
<string name="closed_poll_option_title">Aizvērta aptauja</string>
<string name="location_share_live_remaining_time">Atlicis %1$s</string>
<string name="labs_enable_msc3061_share_history">MSC3061: istabu atslēgu kopīgošana pagātnes ziņām</string>
<string name="poll_response_room_list_preview">Saņemtais balsojums</string>
<string name="delete_poll_dialog_title">Noņemt aptauju</string>
<string name="location_share_live_select_duration_option_3">8 stundas</string>
<string name="poll_end_action">Noslēgt aptauju</string>
<string name="location_share_live_stop">Pārtraukt</string>
<string name="stop_voice_broadcast_dialog_title">Pārtraukt tiešraides apraidi\?</string>
<string name="create_poll_title">Izveidot aptauju</string>
<string name="room_polls_ended_no_item">Šajā istabā nav noslēgto aptauju</string>
<string name="location_share_live_select_duration_option_2">1 stundu</string>
<string name="location_timeline_failed_to_load_map">Neizdevās ielādēt karti</string>
<string name="labs_enable_live_location">Iespējot atrašanās vietas tiešraides kopīgošanu</string>
<string name="end_poll_confirmation_approve_button">Noslēgt aptauju</string>
<string name="error_voice_broadcast_unable_to_decrypt">Nav iespējams atšifrēt šo balss apraidi.</string>
<string name="restart_the_application_to_apply_changes">Lietotne ir jāpārsāknē, lai izmaiņas stātos spēkā.</string>
<string name="delete_poll_dialog_content">Vai tiešām noņemt šo aptauju\? To pēc noņemšanas vairs nevarēs atgūt.</string>
<string name="room_polls_active_no_item">Šajā istabā nav notiekošu aptauju</string>
<string name="room_polls_ended">Noslēgušās aptaujas</string>
<string name="location_share_option_user_current">Kopīgot manu pašreizējo atrašanās vietu</string>
<string name="a11y_location_share_option_user_live_icon">Kopīgot atrašanās vietu tiešraidē</string>
<string name="live_location_not_enough_permission_dialog_description">Nepieciešamas atbilstošas atļaujas, lai šajā istabā varētu kopīgot atrašanās vietas tiešraidi.</string>
<string name="location_activity_title_preview">Atrašanās vieta</string>
<string name="a11y_location_share_option_user_current_icon">Kopīgot manu pašreizējo atrašanās vietu</string>
<string name="location_share_live_select_duration_title">Kopīgot atrašanās vietu tiešraidē</string>
<string name="location_share_loading_map_error">Nebija iespējams ielādēt karti
\nŠis mājasserveris var nebūt iestatīts, lai attēlotu kartes.</string>
<string name="live_location_share_location_item_share">Kopīgot atrašanās vietu</string>
<string name="room_polls_active">Notiekošās aptaujas</string>
<plurals name="room_polls_ended_no_item_for_loaded_period">
<item quantity="zero">Iepriekšējās %1$d dienās nav noslēgto aptauju.
\nJāielādē vairāk aptauju, lai apskatītu iepriekšējo dienu aptaujas.</item>
<item quantity="one">Iepriekšējā dienā nav noslēgto aptauju.
\nJāielādē vairāk aptauju, lai apskatītu iepriekšējo dienu aptaujas.</item>
<item quantity="other">Iepriekšējās %1$d dienās nav noslēgto aptauju.
\nJāielādē vairāk aptauju, lai apskatītu iepriekšējo dienu aptaujas.</item>
</plurals>
<string name="location_not_available_dialog_content">${app_name} nevarēja piekļūt atrašanās vietai. Lūgums vēlāk mēģināt vēlreiz.</string>
<string name="error_voice_broadcast_permission_denied_message">Nav nepieciešamo atļauju, lai uzsāktu balss apraidi šajā istabā. Jāsazinās ar istabas pārvaldītāju, lai paaugstinātu atļaujas.</string>
<plurals name="room_polls_active_no_item_for_loaded_period">
<item quantity="zero">Iepriekšējās %1$d dienās nav notiekošu aptauju.
\nJāielādē vairāk aptauju, lai redzētu iepriekšējo dienu aptaujas.</item>
<item quantity="one">Iepriekšējā dienā nav notiekošu aptauju.
\nJāielādē vairāk aptauju, lai redzētu iepriekšējo dienu aptaujas.</item>
<item quantity="other">Iepriekšējās %1$d dienās nav notiekošu aptauju.
\nJāielādē vairāk aptauju, lai redzētu iepriekšējo dienu aptaujas.</item>
</plurals>
<string name="room_poll_details_go_to_timeline">Apskatīt aptauju laika joslā</string>
<string name="location_share_live_started">Ielādē atrašanās vietas tiešraidi…</string>
<string name="error_voice_broadcast_unable_to_play">Nav iespējams atskaņot šo balss apraidi.</string>
<string name="location_activity_title_static_sharing">Kopīgot atrašanās vietu</string>
<string name="live_location_sharing_notification_title">${app_name} atrašanās vietas tiešraide</string>
<string name="error_voice_broadcast_no_connection_recording">Savienojuma kļūda - ierakstīšana apturēta</string>
<string name="live_location_sharing_notification_description">Notiek atrašanās vietas kopīgošana</string>
<string name="voice_broadcast_recording_time_left">Atlicis %1$s</string>
<string name="labs_enable_live_location_summary">Pagaidu īstenojums: atrašanās vietas ir paliekošas istabas vēsturē</string>
<string name="upgrade_room_for_restricted">Ikviens no %s varēs atrast šo istabu un pievienoties tai - nav nepieciešams pašrocīgi visus uzaicināt. To jebkurā laikā būs iespējams mainīt istabas iestatījumos.</string>
<string name="live_location_not_enough_permission_dialog_title">Nav atļaujas kopīgot atrašanās vietas tiešraidi</string>
<string name="upgrade_room_for_restricted_no_param">Ikviens vecākvietā varēs atrast šo istabu un pievienoties tai - nav nepieciešams pašrocīgi visus uzaicināt. To jebkurā laikā ir iespējams mainīt istabas iestatījumos.</string>
<string name="upgrade_room_for_restricted_note">Lūgums ņemt vērā, ka jaunināšana izveidos jaunu istabas versiju. Visas pašreizējās ziņas paliks šajā arhivētajā istabā.</string>
<string name="message_bubbles">Rādīt ziņu burbuļus</string>
<string name="this_invite_to_this_room_was_sent">Šis uzaicinājums uz šo istabu tika nosūtīts uz %s, kas nav saistīta ar Tavu kontu</string>
<string name="link_this_email_with_your_account">%s iestatījumos, lai saņemtu uzaicinājumus tieši ${app_name}.</string>
<string name="labs_enable_msc3061_share_history_desc">Kad uzaicina šifrētā istabā, kas kopīgo vēsturi, būs redzama šifrētā vēsture.</string>
<plurals name="poll_option_vote_count">
<item quantity="zero">%1$d balsojumu</item>
<item quantity="one">%1$d balsojums</item>
<item quantity="other">%1$d balsojumi</item>
</plurals>
<string name="closed_poll_option_description">Iznākums tiek atklāts tikai pēc aptaujas noslēgšanas</string>
<string name="attachment_type_selector_poll">Aptaujas</string>
<string name="attachment_type_selector_camera">Kamera</string>
<string name="settings_troubleshoot_test_current_endpoint_title">Galamērķis</string>
<string name="device_manager_other_sessions_multi_signout_selection">Atteikties</string>
<plurals name="device_manager_other_sessions_multi_signout_all">
<item quantity="zero">Atteikties no %1$d sesijām</item>
<item quantity="one">Atteikties no %1$d sesijas</item>
<item quantity="other">Atteikties no %1$d sesijām</item>
</plurals>
<string name="device_manager_other_sessions_show_ip_address">Parādīt IP adresi</string>
<string name="device_manager_other_sessions_hide_ip_address">Paslēpt IP adresi</string>
<string name="device_manager_session_details_application_name">Nosaukums</string>
<string name="device_manager_session_rename_edit_hint">Sesijas nosaukums</string>
<string name="device_manager_learn_more_sessions_unverified_title">Neapliecinātās sesijas</string>
<plurals name="message_reaction_show_more">
<item quantity="zero">Vēl %1$d</item>
<item quantity="one">Vēl %1$d</item>
<item quantity="other">Vēl %1$d</item>
</plurals>
<string name="device_manager_learn_more_session_rename_title">Sesiju pārdēvēšana</string>
<string name="device_manager_session_overview_signout">Atteikties no šīs sesijas</string>
<string name="tooltip_attachment_file">Augšupielādēt datni</string>
<string name="tooltip_attachment_poll">Izveidot aptauju</string>
<string name="attachment_type_selector_voice_broadcast">Balss apraide</string>
<string name="message_reaction_show_less">Rādīt mazāk</string>
<string name="room_message_autocomplete_notification">Istabas paziņojums</string>
<string name="screen_sharing_notification_title">${app_name} ekrāna kopīgošana</string>
<string name="settings_troubleshoot_test_distributors_fdroid">Netika atrasts neviens cits veids bez sinhronizēšanas fonā.</string>
<string name="settings_troubleshoot_test_current_endpoint_success">Pašreizējais galamērķis: %s</string>
<string name="settings_troubleshoot_test_current_gateway_title">Vārteja</string>
<string name="device_manager_verification_status_unknown">Nezināms apliecinājuma stāvoklis</string>
<string name="device_manager_other_sessions_view_all">Apskatīt visas (%1$d)</string>
<string name="device_manager_unverified_sessions_description">Jāapliecina vai jāatsakās no neapliecinātām sesijām.</string>
<string name="device_manager_filter_option_verified_description">Gatavas drošai ziņapmaiņai</string>
<string name="device_manager_filter_option_unverified_description">Nav gatavas drošai ziņapmaiņai</string>
<string name="device_manager_other_sessions_recommendation_description_verified">Vislabākajai drošībai jāatsakās no jebkuras neatpazīstamas vai vairs neizmantotas sesijas.</string>
<string name="device_manager_other_sessions_recommendation_description_unverified">Jāapliecina savas sesijas paplašinātai drošajai ziņapmaiņai vai jāatsakās no tām, kas nav atpazīstamas vai vairs netiek izmantotas.</string>
<string name="device_manager_session_details_description">Informācija par lietotne, ierīci un darbībām.</string>
<string name="device_manager_session_details_device_operating_system">Operētājsistēma</string>
<string name="device_manager_learn_more_sessions_verified_title">Apliecinātas sesijas</string>
<string name="screen_sharing_notification_description">Notiek ekrāna kopīgošana</string>
<string name="labs_enable_element_call_permission_shortcuts_summary">Automātiski apstiprināt Element zvanu logrīkus un piešķirt piekļuvi kamerai/mikrofonam</string>
<string name="device_manager_filter_bottom_sheet_title">Atlase</string>
<string name="device_manager_other_sessions_recommendation_title_unverified">Neapliecinātas</string>
<string name="device_manager_session_details_application">Lietotne</string>
<string name="device_manager_verification_status_unverified">Neapliecināta sesija</string>
<string name="settings_troubleshoot_test_distributors_title">Pieejamie veidi</string>
<string name="device_manager_session_title">Sesija</string>
<string name="device_manager_other_sessions_no_verified_sessions_found">Apliecinātas sesijas netika atrastas.</string>
<string name="device_manager_session_rename">Pārdēvēt sesiju</string>
<string name="unifiedpush_getdistributors_dialog_title">Izvēlēties, kā saņemt paziņojumus</string>
<string name="unifiedpush_distributor_fcm_fallback">Google pakalpojumi</string>
<plurals name="room_removed_messages">
<item quantity="zero">Noņemtas %d ziņu</item>
<item quantity="one">Noņemta %d ziņa</item>
<item quantity="other">Noņemtas %d ziņas</item>
</plurals>
<string name="device_manager_verification_status_detail_current_session_unverified">Jāapliecina pašreizējā sesija paplašinātai drošajai ziņapmaiņai.</string>
<string name="tooltip_attachment_contact">Atvērt kontaktus</string>
<string name="a11y_device_manager_device_type_mobile">Tālrunis</string>
<string name="device_manager_session_details_title">Sesijas izvērsums</string>
<string name="attachment_type_selector_text_formatting">Teksta formatēšana</string>
<string name="device_manager_device_title">Iekārta</string>
<string name="device_manager_session_details_session_name">Sesijas nosaukums</string>
<string name="attachment_type_selector_location">Atrašanās vieta</string>
<string name="settings_troubleshoot_test_current_distributor_title">Veids</string>
<string name="device_manager_header_section_security_recommendations_description">Uzlabo sava konta drošību ievērojot šos ieteikumus.</string>
<string name="device_manager_session_details_device_browser">Pārlūks</string>
<string name="device_manager_sessions_sign_in_with_qr_code_title">Pieteikties ar kvadrātkodu</string>
<string name="device_manager_verify_session">Apliecināt sesiju</string>
<string name="a11y_device_manager_filter">Atlasīt</string>
<string name="tooltip_attachment_location">Kopīgot atrašanās vietu</string>
<string name="tooltip_attachment_voice_broadcast">Uzsākt balss apraidi</string>
<string name="attachment_type_selector_contact">Kontakts</string>
<string name="room_message_notify_everyone">Paziņot visai istabai</string>
<string name="room_message_autocomplete_users">Lietotāji</string>
<string name="unifiedpush_distributor_background_sync">Sinhronizēšana fonā</string>
<string name="settings_notification_method">Paziņojuma veids</string>
<string name="settings_troubleshoot_test_current_endpoint_failed">Nevar atrast galamērķi.</string>
<string name="live_location_labs_promotion_title">Atrašanās vietas tiešraides kopīgošana</string>
<string name="device_manager_sessions_other_title">Citas sesijas</string>
<string name="a11y_device_manager_device_type_web">Tīmeklis</string>
<string name="a11y_device_manager_device_type_desktop">Darbvirsma</string>
<string name="device_manager_verification_status_detail_other_session_verified">Šī sesija ir gatava drošai ziņapmaiņai.</string>
<string name="device_manager_other_sessions_description_unverified">Neapliecināta · Pēdējā darbība %1$s</string>
<plurals name="device_manager_other_sessions_description_inactive">
<item quantity="zero">Neizmantota %1$d+ dienas (%2$s)</item>
<item quantity="one">Neizmantota %1$d+ dienu (%2$s)</item>
<item quantity="other">Neizmantota %1$d+ dienas (%2$s)</item>
</plurals>
<string name="device_manager_unverified_sessions_title">Neapliecinātas sesijas</string>
<string name="device_manager_session_details_session_last_activity">Pēdējā darbība</string>
<string name="device_manager_session_details_application_version">Versija</string>
<string name="device_manager_session_rename_warning">Lūgums ņemt vērā, ka sesiju nosaukumi ir redzami arī cilvēkiem, ar kuriem sazinies.</string>
<string name="settings_troubleshoot_test_current_distributor">Pašreiz tiek izmantots %s.</string>
<string name="device_manager_verification_status_detail_other_session_unknown">Jāapliecina pašreizējā sesija, lai atklātu šīs sesijas apliecinājuma stāvokli.</string>
<string name="device_manager_filter_option_all_sessions">Visas sesijas</string>
<string name="device_manager_header_section_security_recommendations_title">Drošības ieteikumi</string>
<string name="device_manager_current_session_title">Pašreizējā sesija</string>
<string name="device_manager_other_sessions_clear_filter">Notīrīt atlasi</string>
<string name="tooltip_attachment_sticker">Nosūtīt uzlīmi</string>
<string name="attachment_type_selector_gallery">Attēlu bibliotēka</string>
<string name="attachment_type_selector_sticker">Uzlīmes</string>
<string name="attachment_type_selector_file">Pielikumi</string>
<string name="settings_troubleshoot_test_distributors_gplay">Netika atrasts neviens cits veids bez Google Play pakalpojuma.</string>
<plurals name="settings_troubleshoot_test_distributors_many">
<item quantity="zero">Atrasti %d veidu.</item>
<item quantity="one">Atrasts %d veids.</item>
<item quantity="other">Atrasti %d veidi.</item>
</plurals>
<string name="settings_troubleshoot_test_current_gateway">Pašreizējā vārteja: %s</string>
<string name="a11y_device_manager_device_type_unknown">Nezināms ierīces veids</string>
<string name="device_manager_view_details">Apskatīt izvērsumu</string>
<string name="device_manager_inactive_sessions_title">Neizmantotas sesijas</string>
<string name="device_manager_filter_option_verified">Apliecinātas</string>
<string name="device_manager_filter_option_inactive">Neizmantotas</string>
<string name="device_manager_other_sessions_recommendation_title_verified">Apliecinātas</string>
<string name="device_manager_other_sessions_no_inactive_sessions_found">Neizmantotas sesijas netika atrastas.</string>
<string name="device_manager_other_sessions_select">Atlasīt sesijas</string>
<string name="device_manager_signout_all_other_sessions">Atteikties no visām pārējām sesijām</string>
<string name="device_manager_session_details_device_ip_address">IP adrese</string>
<string name="device_manager_session_details_application_url">URL</string>
<string name="device_manager_session_details_device_model">Modelis</string>
<string name="device_manager_learn_more_sessions_inactive_title">Neizmantotās sesijas</string>
<string name="device_manager_learn_more_sessions_unverified">Neapliecinātās sesijas ir sesijas, kurās ir notikusi pieteikšanās ar Taviem datiem, bet nav starpapliecinātas.
\n
\nVajadzētu īpaši pārliecināties, ka šīs sesijas ir atpazīstamas, jo tās var norādīt uz nepilnvarotu konta izmantošanu.</string>
<string name="live_location_labs_promotion_switch_title">Iespējot atrašanās vietas kopīgošanu</string>
<plurals name="device_manager_inactive_sessions_description">
<item quantity="zero">Jāapsver atteikšanās no vecajām sesijām (%1$d dienu vai vairāk), kas vairs netiek izmantotas.</item>
<item quantity="one">Jāapsver atteikšanās no vecajām sesijām (%1$d diena vai vairāk), kas vairs netiek izmantotas.</item>
<item quantity="other">Jāapsver atteikšanās no vecajām sesijām (%1$d dienas vai vairāk), kas vairs netiek izmantotas.</item>
</plurals>
<string name="labs_enable_element_call_permission_shortcuts">Iespējot Element zvanu atļauju īsceļus</string>
<string name="device_manager_session_last_activity">Pēdējā darbība %1$s</string>
<string name="device_manager_sessions_other_description">Vislielākajai drošībai jāapliecina savas sesijas un jāatsakās no jebkuras neatpazītas vai neizmantotas sesijas.</string>
<string name="device_manager_filter_option_unverified">Neapliecinātas</string>
<string name="device_manager_verification_status_verified">Apliecināta sesija</string>
<string name="device_manager_verification_status_detail_current_session_verified">Pašreizējā sesija ir gatava drošai ziņapmaiņai.</string>
<string name="device_manager_verification_status_detail_other_session_unverified">Vislabākajai drošībai un uzticamībai jāapliecina šī sesija vai jāatsakās no tās.</string>
<plurals name="device_manager_filter_option_inactive_description">
<item quantity="zero">Neizmantotas %1$d dienu vai ilgāk</item>
<item quantity="one">Neizmantotas %1$d dienu vai ilgāk</item>
<item quantity="other">Neizmantotas %1$d dienas vai ilgāk</item>
</plurals>
<string name="device_manager_verification_status_detail_session_encryption_not_supported">Šī sesija nenodrošina šifrēšanu, tādēļ to nevar apliecināt.</string>
<string name="device_manager_other_sessions_recommendation_title_inactive">Neizmantotas</string>
<string name="device_manager_other_sessions_description_verified">Apliecināta · Pēdējā darbība %1$s</string>
<plurals name="device_manager_other_sessions_recommendation_description_inactive">
<item quantity="zero">Jāapsver atteikšanās no vecajām sesijām (%1$d dienu vai vairāk), kas vairs netiek izmantotas.</item>
<item quantity="one">Jāapsver atteikšanās no vecajām sesijām (%1$d diena vai vairāk), kas vairs netiek izmantotas.</item>
<item quantity="other">Jāapsver atteikšanās no vecajām sesijām (%1$d dienas vai vairāk), kas vairs netiek izmantotas.</item>
</plurals>
<string name="device_manager_other_sessions_description_unverified_current_session">Neapliecināta · Pašreizējā sesija</string>
<string name="device_manager_other_sessions_no_unverified_sessions_found">Neapliecinātas sesijas netika atrastas.</string>
<string name="device_manager_session_rename_description">Pielāgoti sesiju nosaukumi var palīdzēt vieglāk atpazīt savas ierīces.</string>
<string name="device_manager_sessions_sign_in_with_qr_code_description">Tu vari izmanto šo ierīci, lai pieteiktos tālruņa vai tīmekļa ierīcē ar kvadrātkodu. Ir divi veidi, kā to izdarīt:</string>
<string name="device_manager_learn_more_sessions_inactive">Neizmantotās sesijas ir sesijas, kas kādu laiku nav izmantotas, bet tās turpina saņemt šifrēšanas atslēgas.
\n
\nNeizmantotas sesijas noņemšana uzlabo drošību un veiktspēju un ir vieglāk noteikt, vai jauna sesija ir aizdomīga.</string>
<string name="pill_message_from_unknown_user">Ziņa</string>
<string name="qr_code_login_header_failed_other_device_not_signed_in_description">Otrā ierīcē ir jāpiesakās.</string>
<string name="rich_text_editor_link">Iestatīt saiti</string>
<string name="labs_enable_voice_broadcast_summary">Padara iespējamu ierakstīt un nosūtīt balss apraidi istabas laika joslā.</string>
<string name="home_empty_no_unreads_message">Šeit tiks parādītas nelasītās ziņas, kad tādas būs.</string>
<string name="qr_code_login_confirm_security_code">Apstiprināt</string>
<string name="pill_message_in_room">Ziņa %s</string>
<string name="home_empty_no_unreads_title">Nav nekā, par ko ziņot.</string>
<string name="qr_code_login_new_device_instruction_2">Jādodas uz Iestatījumi -&gt; Drošība un privātums</string>
<string name="qr_code_login_signing_in_a_mobile_device">Piesakies mobilajā ierīcē\?</string>
<string name="rich_text_editor_format_italic">Pielietot slīprakstu</string>
<string name="message_reply_to_sender_sent_video">nosūtīja video.</string>
<string name="qr_code_login_header_failed_device_is_not_supported_description">Sasaistīšana ar šo ierīci nav nodrošināta.</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_2">Jāatlasa \'Nolasīt kvadrātkodu\'</string>
<string name="message_reply_to_sender_created_poll">izveidoja aptauju.</string>
<string name="qr_code_login_header_connected_title">Izveidots drošs savienojums</string>
<string name="qr_code_login_header_failed_title">Neveiksmīgs savienojums</string>
<string name="qr_code_login_connecting_to_device">Savienojas ar ierīci</string>
<string name="qr_code_login_signing_in">Piesakās</string>
<string name="rich_text_editor_numbered_list">Pārslēgt numurētu sarakstu</string>
<string name="rich_text_editor_inline_code">Pielietot iekļautu kodu</string>
<string name="rich_text_editor_code_block">Pārslēgt koda bloku</string>
<string name="message_reply_to_sender_sent_audio_file">nosūtīja skaņas datni.</string>
<string name="settings_access_token_summary">Piekļuves pilnvara sniedz pilnu piekļuvi kontam. To nevajag kopīgot ne ar vienu.</string>
<string name="onboarding_new_app_layout_welcome_title">Laipni lūdzam jaunajā skatā!</string>
<string name="qr_code_login_new_device_instruction_3">Jāatlasa \'Parādīt kvadrātkodu\'</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_1">Jāsāk pieteikšanās skatā</string>
<string name="qr_code_login_show_qr_code_button">Rādīt kvadrātkodu šajā ierīcē</string>
<string name="qr_code_login_status_no_match">Nav atbilstības\?</string>
<string name="qr_code_login_try_again">Jāmēģina vēlreiz</string>
<string name="rich_text_editor_format_underline">Pielietot pasvītrojumu</string>
<string name="labs_enable_session_manager_title">Iespējot jauno sesiju pārvaldnieku</string>
<string name="home_empty_no_rooms_title">Laipni lūdzam ${app_name},
\n%s!</string>
<string name="rich_text_editor_format_bold">Pielietot treknrakstu</string>
<string name="message_reply_to_sender_sent_image">nosūtīja attēlu.</string>
<string name="rich_text_editor_bullet_list">Pārslēgt vienkāršu sarakstu</string>
<string name="set_link_text">Teksts</string>
<string name="labs_enable_client_info_recording_title">Iespējot klienta informācijas ierakstīšanu</string>
<string name="onboarding_new_app_layout_spaces_title">Piekļūt vietām</string>
<string name="qr_code_login_header_failed_other_description">Pieprasījums neizdevās.</string>
<string name="rich_text_editor_full_screen_toggle">Pārslēgt pilnekrānu</string>
<string name="home_empty_space_no_rooms_title">%s
\nizskatās mazliet tukša.</string>
<string name="qr_code_login_header_failed_timeout_description">Sasaistīšana netika pabeigta nepieciešamajā laikā.</string>
<string name="qr_code_login_new_device_instruction_1">Jāatver lietotne otrā ierīcē</string>
<string name="qr_code_login_link_a_device_show_qr_code_instruction_1">Jāsāk pieteikšanās skatā</string>
<string name="set_link_link">Saite</string>
<string name="set_link_edit">Labot saiti</string>
<string name="message_reply_to_sender_sent_voice_message">nosūtīja balss ziņu.</string>
<string name="message_reply_to_sender_ended_poll">noslēdza aptauju.</string>
<string name="message_reply_to_poll_preview">Aptauja</string>
<string name="pill_message_in_unknown_room">Ziņa istabā</string>
<string name="message_reply_to_ended_poll_preview">Noslēgtās aptaujas</string>
<string name="labs_enable_session_manager_summary">Iegūsti labāku pārredzamību un pārraudzību pār visām savām sesijām!</string>
<string name="labs_enable_voice_broadcast_title">Iespējot balss apraidi</string>
<string name="qr_code_login_header_failed_other_device_already_signed_in_description">Otrā ierīcē jau ir pieteikšanās.</string>
<string name="rich_text_editor_indent">Ievietot atkāpi</string>
<string name="rich_text_editor_unindent">Noņemt atkāpi</string>
<string name="rich_text_editor_quote">Pārslēgt citātu</string>
<string name="set_link_create">Izveidot saiti</string>
<string name="settings_access_token">Piekļuves pilnvara</string>
<string name="qr_code_login_header_failed_invalid_qr_code_description">Šis kvadrātkods ir nederīgs.</string>
<string name="qr_code_login_header_failed_user_cancelled_description">Pieteikšanās tika atcelta otrā ierīcē.</string>
<string name="qr_code_login_link_a_device_scan_qr_code_instruction_2">Jāatlasa \'Pieteikties ar kvadrātkodu\'</string>
<string name="rich_text_editor_format_strikethrough">Pielietot pārsvītrojumu</string>
<string name="message_reply_to_prefix">Atbildē uz</string>
<string name="message_reply_to_sender_sent_file">nosūtīja datni.</string>
<string name="message_reply_to_sender_sent_sticker">nosūtīja uzlīmi.</string>
<string name="pill_message_from_user">Ziņa no %s</string>
<string name="pill_message_unknown_room_or_space">Istaba/vieta</string>
<string name="labs_enable_client_info_recording_summary">Ierakstīt klienta nosaukumu, versiju un URL, lai sesiju pārvaldniekā vieglāk atpazītu sesijas.</string>
<string name="onboarding_new_app_layout_spaces_message">Piekļūsti savām vietām (apakšējā labajā stūrī) ātrāk un vienkāršāk kā jebkad iepriekš!</string>
<string name="qr_code_login_header_connected_description">Jāpārbauda ierīce, kurā esi pieteicies, tajā vajadzētu būt attēlotam zemāk redzamajam kodam. Jāapstiprina, ka zemāk esošais kods saskan ar to, kas ir ierīcē:</string>
<string name="qr_code_login_header_failed_denied_description">Pieprasījums tika atteikts otrā ierīcē.</string>
<string name="qr_code_login_scan_qr_code_button">Nolasīt kvadrātkodu</string>
<string name="qr_code_login_confirm_security_code_description">Lūgums nodrošināt, ka šī koda izcelsme ir zināma. Ar ierīču sasaistīšanu kādam tiks nodrošināta pilna piekļuve kontam.</string>
</resources>

View File

@ -2909,4 +2909,53 @@
<string name="sign_out_anyway">Terminar sessão ainda assim</string>
<string name="verification_request_waiting_for_recovery">Verificação a partir de Chave ou Frase Segura…</string>
<string name="verification_profile_other_device_untrust_info">Até que este utilizador confie nesta sessão, as mensagens enviadas para e a partir dela são marcadas com avisos.</string>
<string name="pill_message_in_unknown_room">Mensagem na sala</string>
<string name="rich_text_editor_numbered_list">Alternar lista numerada</string>
<string name="room_polls_active">Votações ativas</string>
<string name="room_poll_details_go_to_timeline">Ver votação na linha do tempo</string>
<string name="unable_to_decrypt_some_events_in_poll">Devido a erros de descriptografia, alguns votos podem não serem contados</string>
<string name="confirm_your_identity_after_update">A mensageria segura fora aprimorada com a atualização mais recente. Verifique novamente seu dispositivo.</string>
<string name="ended_poll_indicator">Votação encerrada.</string>
<string name="room_polls_ended">Votações anteriores</string>
<string name="rich_text_editor_bullet_list">Alternar lista de marcadores</string>
<string name="pill_message_unknown_room_or_space">Sala/Espaço</string>
<string name="direct_room_encryption_enabled_waiting_users">Aguardando os usuários entrarem no ${app_name}</string>
<string name="direct_room_encryption_enabled_waiting_users_tile_description">Assim que os usuários convidados entrarem no ${app_name}, vocês poderão conversar e a sala terá criptografia de ponta a ponta</string>
<string name="room_polls_active_no_item">Não há votação ativa nesta sala</string>
<string name="room_polls_ended_no_item">Não há votações anteriores nesta sala</string>
<string name="message_reply_to_ended_poll_preview">Votação encerrada</string>
<string name="secure_backup_reset_danger_warning">Prossiga apenas se você tem certeza que você perdeu todos os outros dispositivos e sua chave de segurança.</string>
<string name="encrypted_by_deleted">Criptografado por um dispositivo apagado</string>
<string name="rich_text_editor_unindent">Remover recuo</string>
<string name="rich_text_editor_quote">Alternar aspas</string>
<string name="rich_text_editor_inline_code">Aplicar formatação de código em linha</string>
<string name="_resume">Prosseguir</string>
<string name="verification_not_found">O pedido de verificação não foi encontrado. Ele pode ter sido cancelado ou tratado por outra sessão.</string>
<string name="rich_text_editor_indent">Recuar</string>
<string name="rich_text_editor_code_block">Alternar bloco de código</string>
<string name="message_reply_to_sender_ended_poll">terminou uma votação.</string>
<string name="message_reply_to_poll_preview">Votação</string>
<string name="settings_access_token">Token de acesso</string>
<string name="error_voice_message_broadcast_in_progress_message">Você não pode iniciar uma mensagem de voz porque está gravando uma transmissão ao vivo. Termine sua transmissão ao vivo para iniciar uma mensagem de voz</string>
<plurals name="room_polls_ended_no_item_for_loaded_period">
<item quantity="one">Não há votação anterior para antes de ontem.
\nCarregue mais votações para ver as votações dos dias anteriores.</item>
<item quantity="other">Não há votação anterior para os últimos %1$d dias.
\nCarregue mais votações para ver as votações dos dias anteriores.</item>
</plurals>
<plurals name="room_polls_active_no_item_for_loaded_period">
<item quantity="one">Não há votação ativa para antes de ontem.
\nCarregue mais votações para ver as votações dos dias anteriores.</item>
<item quantity="other">Não há votação ativa para os últimos %1$d dias.
\nCarregue mais votações para ver as votações dos dias anteriores.</item>
</plurals>
<string name="room_polls_load_more">Carregar mais votações</string>
<string name="room_polls_loading_error">Erro ao buscar votações.</string>
<string name="settings_access_token_summary">Seu token de acesso fornece acesso completo à sua conta. Não o compartilhe com outras pessoais.</string>
<string name="pill_message_from_user">Mensagem de %s</string>
<string name="secure_backup_reset_all_no_other_devices_long">A redefinição de suas chaves de verificação não pode ser desfeita. Após a redefinição, você não terá acesso às mensagens criptografadas antigas e todos os amigos que fizeram a verificação anteriormente verão avisos de segurança até que você faça a verificação novamente com eles.</string>
<string name="error_voice_message_broadcast_in_progress">Não foi possível iniciar a mensagem de voz</string>
<string name="room_polls_wait_for_display">Exibindo votações</string>
<string name="pill_message_from_unknown_user">Mensagem</string>
<string name="pill_message_in_room">Mensagem em %s</string>
</resources>

View File

@ -3060,4 +3060,5 @@
<string name="rich_text_editor_code_block">Блок кода</string>
<string name="rich_text_editor_indent">Подпункт</string>
<string name="rich_text_editor_unindent">Пункт</string>
<string name="settings_acceptable_use_policy">Политика пользования</string>
</resources>

View File

@ -2945,4 +2945,13 @@
<string name="crosssigning_verify_after_update">Aplikacioni u përditësua</string>
<string name="sign_out_anyway">Dil, sido qoftë</string>
<string name="sign_out_failed_dialog_message">Skapet dot shërbyesi Home. Nëse keni dalë, sido qoftë, kjo pajisje sdo të fshihet te lista e pajisjeve tuaja, mund të doni ta hiqni duke përdorur klient tjetër.</string>
<string name="create_room_unknown_users_dialog_content">Sarrihet të gjenden profile për ID-rat Matrix të radhitura më poshtë. Do të donit të fillohej një fjalosje, sido që të jetë\?
\n
\n%s</string>
<string name="settings_enable_direct_share_title">Aktivizo ndarje të drejtpërdrejtë me të tjerët</string>
<string name="create_room_unknown_users_dialog_submit">Fillo fjalosje, sido që të jetë</string>
<string name="invite_unknown_users_dialog_content">Sarrihet të gjenden profile për ID-rat Matrix të radhitura më poshtë. Do të donit të ftohen, sido qoftë\?
\n
\n%s</string>
<string name="invite_unknown_users_dialog_submit">Ftoji, sido qoftë</string>
</resources>

View File

@ -2958,4 +2958,12 @@
<string name="crosssigning_verify_after_update">App uppdaterad</string>
<string name="sign_out_failed_dialog_message">Kan inte nå hemservern. Om du ändå loggar ut kommer den här enheten inte att raderas från din enhetslista, du kanske vill ta bort den med en annan klient.</string>
<string name="sign_out_anyway">Logga ut ändå</string>
<string name="create_room_unknown_users_dialog_content">Kunde in hitta profiler för Matrix-ID:n nedan. Vill du starta en chatt ändå\?
\n
\n%s</string>
<string name="create_room_unknown_users_dialog_submit">Starta chatt ändå</string>
<string name="invite_unknown_users_dialog_content">Kunde inte hitta profiler för Matrix-ID:n nedan. Vill du bjuda in dem ändå\?
\n
\n%s</string>
<string name="invite_unknown_users_dialog_submit">Bjud in ändå</string>
</resources>

View File

@ -1734,4 +1734,32 @@
<string name="action_view_threads">Konuları Görüntüle</string>
<string name="initial_sync_request_title">Başlangıç eşitleme isteği</string>
<string name="all_chats">Tüm Sohbetler</string>
</resources>
<string name="start_chat">Sohbet Başlat</string>
<string name="notice_voice_broadcast_ended">%1$s bir ses yayınını sonlandırdı.</string>
<string name="notice_voice_broadcast_ended_by_you">Bir sesli yayını sonlandırdınız.</string>
<string name="create_room">Oda yarat</string>
<string name="explore_rooms">Odaları keşfedin</string>
<string name="initial_sync_request_content">${app_name}, aşağıdaki nedenden dolayı güncel olması için önbelleği temizlemelidir:
\n %s
\n
\n Bu eylemin uygulamayı yeniden başlatacağını ve biraz zaman alabileceğini unutmayın.</string>
<string name="initial_sync_request_reason_unignored_users">- Bazı kullanıcılar göz ardı edildi</string>
<string name="a11y_expand_space_children">%s çocuğu genişlet</string>
<string name="time_unit_minute_short">dk.</string>
<string name="action_disable">Devre dışı bırak</string>
<string name="time_unit_hour_short">sa.</string>
<string name="change_space">Alanı Değiştir</string>
<string name="sign_out_anyway">Yine de oturumu kapat</string>
<plurals name="x_selected">
<item quantity="one">%1$d seçildi</item>
<item quantity="other">%1$d seçildi</item>
</plurals>
<string name="notice_display_name_changed_to">%1$s görünen adını %2$s olarak değiştirdi</string>
<string name="sign_out_failed_dialog_message">Ana sunucuya ulaşılamıyor. Yine de çıkış yaparsanız, bu cihaz, cihaz listenizden silinmez, başka bir istemci kullanarak kaldırmak isteyebilirsiniz.</string>
<plurals name="notice_room_server_acl_changes">
<item quantity="one">%d sunucu ACL\'si değişti</item>
<item quantity="other">%d sunucu ACL değişikliği</item>
</plurals>
<string name="time_unit_second_short">s.</string>
<string name="a11y_collapse_space_children">%s çocuğu daralt</string>
</resources>

View File

@ -57,7 +57,7 @@
<string name="notice_room_name_changed_by_you">Ви змінили назву кімнати на: %1$s</string>
<string name="notice_room_avatar_changed_by_you">Ви змінили аватар кімнати</string>
<string name="notice_room_topic_changed_by_you">Ви змінили тему на: %1$s</string>
<string name="notice_display_name_changed_from_by_you">Ви змінили показуване ім\'я з %1$s на %2$s</string>
<string name="notice_display_name_changed_from_by_you">Ви змінили псевдонім з %1$s на %2$s</string>
<string name="notice_avatar_url_changed_by_you">Ви змінили свій аватар</string>
<plurals name="room_displayname_four_and_more_members">
<item quantity="one">%1$s, %2$s, %3$s та %4$d інший</item>
@ -85,7 +85,7 @@
<string name="notice_placed_voice_call_by_you">Ви починаєте голосовий виклик.</string>
<string name="notice_placed_video_call_by_you">Ви починаєте відеовиклик.</string>
<string name="notice_room_avatar_changed">%1$s змінює аватар кімнати</string>
<string name="notice_display_name_removed_by_you">Ви прибрали показуване ім\'я (%1$s)</string>
<string name="notice_display_name_removed_by_you">Ви вилучили псевдонім (%1$s)</string>
<string name="notice_room_remove_by_you">Ви вилучили %1$s</string>
<string name="notice_direct_room_third_party_invite">%1$s запрошує %2$s</string>
<string name="notice_room_reject_by_you">Ви відхилили запрошення</string>
@ -137,7 +137,7 @@
<string name="notice_answered_call_by_you">Ви відповіли на виклик.</string>
<string name="notice_call_candidates_by_you">Ви надіслали дані для налаштування виклику.</string>
<string name="notice_call_candidates">%s надсилає дані для налаштування виклику.</string>
<string name="notice_display_name_set_by_you">Ви встановили собі показуване ім\'я %1$s</string>
<string name="notice_display_name_set_by_you">Ви налаштували псевдонімом %1$s</string>
<string name="notice_room_withdraw_by_you">Ви відкликали запрошення для %1$s</string>
<string name="notice_room_ban_by_you">Ви заблокували %1$s</string>
<string name="notice_room_unban_by_you">Ви заблокували %1$s</string>
@ -268,7 +268,7 @@
<string name="search_members_hint">Фільтр переліку користувачів</string>
<string name="search_no_results">Тут порожньо</string>
<string name="settings_profile_picture">Аватар</string>
<string name="settings_display_name">Показуване ім\'я</string>
<string name="settings_display_name">Псевдонім</string>
<string name="settings_add_email_address">Додати адресу е-пошти</string>
<string name="settings_add_phone_number">Додати номер телефону</string>
<string name="settings_app_info_link_summary">Екран системної інформації застосунку.</string>
@ -276,7 +276,7 @@
<string name="settings_notification_ringtone">Тон сповіщення</string>
<string name="settings_enable_all_notif">Увімкнути сповіщення для цього облікового запису</string>
<string name="settings_enable_this_device">Увімкнути сповіщення для цього пристрою</string>
<string name="settings_containing_my_display_name">Повідомлення, що містять моє показуване ім\'я</string>
<string name="settings_containing_my_display_name">Повідомлення з моїм псевдонімом</string>
<string name="settings_containing_my_user_name">Повідомлення, що містять моє ім\'я користувача</string>
<string name="settings_messages_in_one_to_one">В особистих чатах</string>
<string name="settings_messages_in_group_chat">У групових чатах</string>
@ -495,7 +495,7 @@
<string name="command_description_part_room">Вийти з кімнати</string>
<string name="command_description_topic">Встановити тему кімнати</string>
<string name="command_description_remove_user">Вилучити користувача із вказаним ID</string>
<string name="command_description_nick">Змінити Ваш псевдонім</string>
<string name="command_description_nick">Змінити псевдонім</string>
<string name="command_description_markdown">Увімкнути/Вимкнути розмітку Markdown</string>
<string name="command_description_clear_scalar_token">Для виправлення керування застосунками Matrix</string>
<string name="create">Створити</string>
@ -816,7 +816,7 @@
<string name="room_widget_permission_theme">Ваша тема</string>
<string name="room_widget_permission_user_id">Ваш ідентифікатор користувача</string>
<string name="room_widget_permission_avatar_url">URL-адреса аватара</string>
<string name="room_widget_permission_display_name">Ваше показуване ім\'я</string>
<string name="room_widget_permission_display_name">Ваш псевдонім</string>
<string name="room_widget_revoke_access">Скасувати доступ для мене</string>
<string name="room_widget_open_in_browser">Відкрити у браузері</string>
<string name="room_widget_reload">Перезавантажити віджет</string>
@ -1564,7 +1564,7 @@
<string name="settings_encrypted_group_messages">Зашифровані групові повідомлення</string>
<string name="settings_group_messages">Групові повідомлення</string>
<string name="settings_messages_containing_username">Моє користувацьке ім\'я</string>
<string name="settings_messages_containing_display_name">Моє показуване ім\'я</string>
<string name="settings_messages_containing_display_name">Мій псевдонім</string>
<string name="settings_messages_at_room">Повідомлення, які містять @room</string>
<string name="settings_when_rooms_are_upgraded">Коли кімнати оновлено</string>
<string name="settings_messages_in_e2e_group_chat">Зашифровані повідомлення в групових бесідах</string>
@ -2060,7 +2060,7 @@
<string name="command_description_whois">Показує відомості про користувача</string>
<string name="command_description_avatar_for_room">Змінює ваш аватар лише у поточній кімнаті</string>
<string name="command_description_room_avatar">Змінює аватар поточної кімнати</string>
<string name="command_description_nick_for_room">Змінює ваше показуване ім\'я лише у поточній кімнаті</string>
<string name="command_description_nick_for_room">Змінює ваш псевдонім лише у поточній кімнаті</string>
<string name="command_description_room_name">Установлює назву кімнати</string>
<string name="settings_discovery_no_policy_provided">Сервер ідентифікації не надав жодних правил</string>
<string name="spaces_feeling_experimental_subspace">Бажаєте поекспериментувати\?
@ -2408,7 +2408,7 @@
<string name="tooltip_attachment_photo">Відкрити камеру</string>
<string name="labs_auto_report_uisi_desc">Ваша система автоматично надсилатиме журнали, коли виникне помилка неможливості розшифрування</string>
<string name="labs_auto_report_uisi">Автозвіт про помилки шифрування.</string>
<string name="room_member_override_nick_color">Замінити колір показуваного імені</string>
<string name="room_member_override_nick_color">Замінити колір псевдоніма</string>
<string name="login_splash_already_have_account">Я вже маю обліковий запис</string>
<string name="ftue_auth_carousel_encrypted_title">Захищене спілкування.</string>
<string name="ftue_auth_carousel_control_title">Ви контролюєте все.</string>
@ -2517,8 +2517,8 @@
<string name="ftue_profile_picture_subtitle">Час вказати ім’я</string>
<string name="ftue_profile_picture_title">Додати зображення профілю</string>
<string name="ftue_display_name_entry_footer">Ви можете змінити його пізніше</string>
<string name="ftue_display_name_entry_title">Показуване ім\'я</string>
<string name="ftue_display_name_title">Виберіть показуване ім\'я</string>
<string name="ftue_display_name_entry_title">Псевдонім</string>
<string name="ftue_display_name_title">Оберіть псевдонім</string>
<string name="ftue_account_created_subtitle">Ваш обліковий запис %s створений</string>
<string name="ftue_account_created_congratulations_title">Вітаємо!</string>
<string name="ftue_account_created_take_me_home">На головну</string>
@ -2562,7 +2562,7 @@
\n
\nЗауважте, що ця дія перезапустить застосунок, і це може тривати деякий час.</string>
<string name="initial_sync_request_title">Початковий запит синхронізації</string>
<string name="settings_show_latest_profile_description">Показувати найновіші дані профілю (аватар і показуване ім\'я) для всіх повідомлень.</string>
<string name="settings_show_latest_profile_description">Показувати найновіші дані профілю (аватар і псевдонім) для всіх повідомлень.</string>
<string name="settings_show_latest_profile">Показувати найновіші дані користувача</string>
<string name="a11y_presence_busy">Зайнятий</string>
<string name="keys_backup_settings_signature_from_this_user">Резервна копія має дійсний підпис від цього користувача.</string>

View File

@ -2554,4 +2554,6 @@
<string name="device_manager_session_title">Phiên</string>
<string name="device_manager_device_title">Thiết bị</string>
<string name="device_manager_session_last_activity">Hoạt động cuối %1$s</string>
<string name="_resume">Tiếp tục</string>
<string name="a11y_presence_busy">Bận</string>
</resources>

View File

@ -654,7 +654,7 @@
<string name="settings_silent_notifications_preferences">设置静音通知</string>
<string name="settings_system_preferences_summary">选择LED颜色、震动、铃声……</string>
<string name="settings_cryptography_manage_keys">加密密钥管理</string>
<string name="encryption_message_recovery">恢复已加密消息</string>
<string name="encryption_message_recovery">已加密消息恢复</string>
<string name="encryption_settings_manage_message_recovery_summary">管理密钥备份</string>
<string name="notification_silent">静音</string>
<string name="error_empty_field_enter_user_name">请输入一个用户名。</string>

View File

@ -748,7 +748,7 @@
<string name="backup">備份</string>
<string name="sign_out_bottom_sheet_will_lose_secure_messages">除非您在登出前備份好金鑰,否則將無法再存取所有加密訊息。</string>
<string name="action_sign_out_confirmation_simple">您確定要登出嗎?</string>
<string name="encryption_message_recovery">還原加密訊息</string>
<string name="encryption_message_recovery">加密訊息還原</string>
<string name="error_empty_field_enter_user_name">請輸入使用者名稱。</string>
<string name="keys_backup_setup">開始使用金鑰備份</string>
<string name="keys_backup_setup_step1_advanced">(進階)</string>

View File

@ -63,7 +63,7 @@ android {
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
buildConfigField "String", "SDK_VERSION", "\"1.6.5\""
buildConfigField "String", "SDK_VERSION", "\"1.6.6\""
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""
@ -216,7 +216,7 @@ dependencies {
implementation libs.google.phonenumber
rustCryptoImplementation("org.matrix.rustcomponents:crypto-android:0.3.10")
rustCryptoImplementation("org.matrix.rustcomponents:crypto-android:0.3.15")
// rustCryptoApi project(":library:rustCrypto")
testImplementation libs.tests.junit

View File

@ -28,6 +28,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.junit.runners.MethodSorters
import org.matrix.android.sdk.BuildConfig
import org.matrix.android.sdk.InstrumentedTest
import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session
@ -196,6 +197,7 @@ class E2eeShareKeysHistoryTest : InstrumentedTest {
@Test
fun testNeedsRotationFromSharedToWorldReadable() {
Assume.assumeTrue("Test is flacky on legacy crypto", BuildConfig.FLAVOR == "rustCrypto")
testRotationDueToVisibilityChange(RoomHistoryVisibility.SHARED, RoomHistoryVisibilityContent("world_readable"))
}

View File

@ -136,6 +136,13 @@ internal class SecretShareManager @Inject constructor(
.w("handleSecretRequest() : malformed request norequestingDeviceId ")
}
if (deviceId == credentials.deviceId) {
return Unit.also {
Timber.tag(loggerTag.value)
.v("handleSecretRequest() : Ignore request from self device")
}
}
val device = cryptoStore.getUserDevice(credentials.userId, deviceId)
?: return Unit.also {
Timber.tag(loggerTag.value)
@ -254,6 +261,37 @@ internal class SecretShareManager @Inject constructor(
}
}
suspend fun requestMissingSecrets() {
// quick implementation for backward compatibility with rust, will request all secrets to all own devices
val secretNames = listOf(MASTER_KEY_SSSS_NAME, SELF_SIGNING_KEY_SSSS_NAME, USER_SIGNING_KEY_SSSS_NAME, KEYBACKUP_SECRET_SSSS_NAME)
secretNames.forEach { secretName ->
val toDeviceContent = SecretShareRequest(
requestingDeviceId = credentials.deviceId,
secretName = secretName,
requestId = createUniqueTxnId()
)
val contentMap = MXUsersDevicesMap<Any>()
contentMap.setObject(credentials.userId, "*", toDeviceContent)
val params = SendToDeviceTask.Params(
eventType = EventType.REQUEST_SECRET,
contentMap = contentMap
)
try {
withContext(coroutineDispatchers.io) {
sendToDeviceTask.execute(params)
}
Timber.tag(loggerTag.value)
.d("Secret request sent for $secretName")
} catch (failure: Throwable) {
Timber.tag(loggerTag.value)
.w("Failed to request secret $secretName")
}
}
}
suspend fun onSecretSendReceived(toDevice: Event, handleGossip: ((name: String, value: String) -> Boolean)) {
Timber.tag(loggerTag.value)
.i("onSecretSend() from ${toDevice.senderId} : onSecretSendReceived ${toDevice.content?.get("sender_key")}")

View File

@ -34,10 +34,6 @@ import org.matrix.android.sdk.api.rendezvous.model.SecureRendezvousChannelAlgori
import org.matrix.android.sdk.api.rendezvous.transports.SimpleHttpRendezvousTransport
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel
import org.matrix.android.sdk.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME
import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME
import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
import org.matrix.android.sdk.api.util.MatrixJsonParser
import timber.log.Timber
@ -222,15 +218,10 @@ class Rendezvous(
Timber.tag(TAG).i("No master key given by verifying device")
}
// request secrets from the verifying device
Timber.tag(TAG).i("Requesting secrets from $verifyingDeviceId")
// request secrets from other sessions.
Timber.tag(TAG).i("Requesting secrets from other sessions")
session.sharedSecretStorageService().let {
it.requestSecret(MASTER_KEY_SSSS_NAME, verifyingDeviceId)
it.requestSecret(SELF_SIGNING_KEY_SSSS_NAME, verifyingDeviceId)
it.requestSecret(USER_SIGNING_KEY_SSSS_NAME, verifyingDeviceId)
it.requestSecret(KEYBACKUP_SECRET_SSSS_NAME, verifyingDeviceId)
}
session.sharedSecretStorageService().requestMissingSecrets()
} else {
Timber.tag(TAG).i("Not doing verification")
}

View File

@ -85,6 +85,11 @@ data class HomeServerCapabilities(
* External account management url for use with MSC3824 delegated OIDC, provided in Wellknown.
*/
val externalAccountManagementUrl: String? = null,
/**
* Authentication issuer for use with MSC3824 delegated OIDC, provided in Wellknown.
*/
val authenticationIssuer: String? = null,
) {
enum class RoomCapabilitySupport {
@ -141,6 +146,8 @@ data class HomeServerCapabilities(
return cap?.preferred ?: cap?.support?.lastOrNull()
}
val delegatedOidcAuthEnabled: Boolean = authenticationIssuer != null
companion object {
const val MAX_UPLOAD_FILE_SIZE_UNKNOWN = -1L
const val ROOM_CAP_KNOCK = "knock"

View File

@ -135,5 +135,11 @@ interface SharedSecretStorageService {
fun checkShouldBeAbleToAccessSecrets(secretNames: List<String>, keyId: String?): IntegrityResult
@Deprecated("Requesting custom secrets not yet support by rust stack, prefer requestMissingSecrets")
suspend fun requestSecret(name: String, myOtherDeviceId: String)
/**
* Request the missing local secrets to other sessions.
*/
suspend fun requestMissingSecrets()
}

View File

@ -298,7 +298,7 @@ internal class DefaultAuthenticationService @Inject constructor(
}
// If an m.login.sso flow is present that is flagged as being for MSC3824 OIDC compatibility then we only return that flow
val oidcCompatibilityFlow = loginFlowResponse.flows.orEmpty().firstOrNull { it.type == "m.login.sso" && it.delegatedOidcCompatibilty == true }
val oidcCompatibilityFlow = loginFlowResponse.flows.orEmpty().firstOrNull { it.type == "m.login.sso" && it.delegatedOidcCompatibility == true }
val flows = if (oidcCompatibilityFlow != null) listOf(oidcCompatibilityFlow) else loginFlowResponse.flows
val supportsGetLoginTokenFlow = loginFlowResponse.flows.orEmpty().firstOrNull { it.type == "m.login.token" && it.getLoginToken == true } != null

View File

@ -51,7 +51,7 @@ internal data class LoginFlow(
* See [MSC3824](https://github.com/matrix-org/matrix-spec-proposals/pull/3824)
*/
@Json(name = "org.matrix.msc3824.delegated_oidc_compatibility")
val delegatedOidcCompatibilty: Boolean? = null,
val delegatedOidcCompatibility: Boolean? = null,
/**
* Whether a login flow of type m.login.token could accept a token issued using /login/get_token.

View File

@ -385,7 +385,12 @@ internal class DefaultSharedSecretStorageService @Inject constructor(
return IntegrityResult.Success(keyInfo.content.passphrase != null)
}
@Deprecated("Requesting custom secrets not yet support by rust stack, prefer requestMissingSecrets")
override suspend fun requestSecret(name: String, myOtherDeviceId: String) {
secretShareManager.requestSecretTo(myOtherDeviceId, name)
}
override suspend fun requestMissingSecrets() {
secretShareManager.requestMissingSecrets()
}
}

View File

@ -69,6 +69,7 @@ import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo049
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo050
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo051
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo052
import org.matrix.android.sdk.internal.database.migration.MigrateSessionTo053
import org.matrix.android.sdk.internal.util.Normalizer
import org.matrix.android.sdk.internal.util.database.MatrixRealmMigration
import javax.inject.Inject
@ -77,7 +78,7 @@ internal class RealmSessionStoreMigration @Inject constructor(
private val normalizer: Normalizer
) : MatrixRealmMigration(
dbName = "Session",
schemaVersion = 52L,
schemaVersion = 53L,
) {
/**
* Forces all RealmSessionStoreMigration instances to be equal.
@ -139,5 +140,6 @@ internal class RealmSessionStoreMigration @Inject constructor(
if (oldVersion < 50) MigrateSessionTo050(realm).perform()
if (oldVersion < 51) MigrateSessionTo051(realm).perform()
if (oldVersion < 52) MigrateSessionTo052(realm).perform()
if (oldVersion < 53) MigrateSessionTo053(realm).perform()
}
}

View File

@ -49,6 +49,7 @@ internal object HomeServerCapabilitiesMapper {
canRemotelyTogglePushNotificationsOfDevices = entity.canRemotelyTogglePushNotificationsOfDevices,
canRedactRelatedEvents = entity.canRedactEventWithRelations,
externalAccountManagementUrl = entity.externalAccountManagementUrl,
authenticationIssuer = entity.authenticationIssuer,
)
}

View File

@ -0,0 +1,30 @@
/*
* Copyright (c) 2023 The Matrix.org Foundation C.I.C.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.matrix.android.sdk.internal.database.migration
import io.realm.DynamicRealm
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntityFields
import org.matrix.android.sdk.internal.extensions.forceRefreshOfHomeServerCapabilities
import org.matrix.android.sdk.internal.util.database.RealmMigrator
internal class MigrateSessionTo053(realm: DynamicRealm) : RealmMigrator(realm, 53) {
override fun doMigrate(realm: DynamicRealm) {
realm.schema.get("HomeServerCapabilitiesEntity")
?.addField(HomeServerCapabilitiesEntityFields.AUTHENTICATION_ISSUER, String::class.java)
?.forceRefreshOfHomeServerCapabilities()
}
}

View File

@ -36,6 +36,7 @@ internal open class HomeServerCapabilitiesEntity(
var canRemotelyTogglePushNotificationsOfDevices: Boolean = false,
var canRedactEventWithRelations: Boolean = false,
var externalAccountManagementUrl: String? = null,
var authenticationIssuer: String? = null,
) : RealmObject() {
companion object

View File

@ -165,6 +165,7 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
Timber.v("Extracted integration config : $config")
realm.insertOrUpdate(config)
}
homeServerCapabilitiesEntity.authenticationIssuer = getWellknownResult.wellKnown.unstableDelegatedAuthConfig?.issuer
homeServerCapabilitiesEntity.externalAccountManagementUrl = getWellknownResult.wellKnown.unstableDelegatedAuthConfig?.accountManagementUrl
}

View File

@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Generated file, do not edit -->
<string name="verification_emoji_dog">كَلب</string>
<string name="verification_emoji_dog">كلب</string>
<string name="verification_emoji_cat">هِرَّة</string>
<string name="verification_emoji_lion">أَسَد</string>
<string name="verification_emoji_horse">حِصَان</string>
<string name="verification_emoji_unicorn">حِصَانٌ بِقَرن</string>
<string name="verification_emoji_unicorn">حصان وحيد القرن</string>
<string name="verification_emoji_pig">خِنزِير</string>
<string name="verification_emoji_elephant">فِيل</string>
<string name="verification_emoji_rabbit">أَرنَب</string>
<string name="verification_emoji_panda">باندَا</string>
<string name="verification_emoji_rooster">دِيك</string>
<string name="verification_emoji_penguin">بِطريق</string>
<string name="verification_emoji_penguin">بطريق</string>
<string name="verification_emoji_turtle">سُلحفاة</string>
<string name="verification_emoji_fish">سَمَكَة</string>
<string name="verification_emoji_fish">سَمَكة</string>
<string name="verification_emoji_octopus">أُخطُبُوط</string>
<string name="verification_emoji_butterfly">فَرَاشَة</string>
<string name="verification_emoji_flower">زَهرَة</string>

View File

@ -48,7 +48,7 @@
<string name="verification_emoji_paperclip">Sponka</string>
<string name="verification_emoji_scissors">Nůžky</string>
<string name="verification_emoji_lock">Zámek</string>
<string name="verification_emoji_key">Klíč</string>
<string name="verification_emoji_key">Klíč ke dveřím</string>
<string name="verification_emoji_hammer">Kladivo</string>
<string name="verification_emoji_telephone">Telefon</string>
<string name="verification_emoji_flag">Vlajka</string>

View File

@ -50,7 +50,7 @@
<string name="verification_emoji_lock">Candado</string>
<string name="verification_emoji_key">Llave</string>
<string name="verification_emoji_hammer">Martillo</string>
<string name="verification_emoji_telephone">Telefono</string>
<string name="verification_emoji_telephone">Teléfono</string>
<string name="verification_emoji_flag">Bandera</string>
<string name="verification_emoji_train">Tren</string>
<string name="verification_emoji_bicycle">Bicicleta</string>

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Generated file, do not edit -->
<string name="verification_emoji_dog">سگ</string>
<string name="verification_emoji_cat">گربه</string>
<string name="verification_emoji_lion">شیر</string>
<string name="verification_emoji_horse">اسب</string>
<string name="verification_emoji_unicorn">تک شاخ</string>
<string name="verification_emoji_pig">خوک</string>
<string name="verification_emoji_elephant">فیل</string>
<string name="verification_emoji_rabbit">خرگوش</string>
<string name="verification_emoji_panda">پاندا</string>
<string name="verification_emoji_rooster">خروس</string>
<string name="verification_emoji_penguin">پنگوئن</string>
<string name="verification_emoji_turtle">لاک‌پشت</string>
<string name="verification_emoji_fish">ماهی</string>
<string name="verification_emoji_octopus">اختاپوس</string>
<string name="verification_emoji_butterfly">پروانه</string>
<string name="verification_emoji_flower">گل</string>
<string name="verification_emoji_tree">درخت</string>
<string name="verification_emoji_cactus">کاکتوس</string>
<string name="verification_emoji_mushroom">قارچ</string>
<string name="verification_emoji_globe">زمین</string>
<string name="verification_emoji_moon">ماه</string>
<string name="verification_emoji_cloud">ابر</string>
<string name="verification_emoji_fire">آتش</string>
<string name="verification_emoji_banana">موز</string>
<string name="verification_emoji_apple">سیب</string>
<string name="verification_emoji_strawberry">توت فرنگی</string>
<string name="verification_emoji_corn">ذرت</string>
<string name="verification_emoji_pizza">پیتزا</string>
<string name="verification_emoji_cake">کیک</string>
<string name="verification_emoji_heart">قلب</string>
<string name="verification_emoji_smiley">خنده</string>
<string name="verification_emoji_robot">ربات</string>
<string name="verification_emoji_hat">کلاه</string>
<string name="verification_emoji_glasses">عینک</string>
<string name="verification_emoji_spanner">آچار</string>
<string name="verification_emoji_santa">بابا نوئل</string>
<string name="verification_emoji_thumbs_up">لایک</string>
<string name="verification_emoji_umbrella">چتر</string>
<string name="verification_emoji_hourglass">ساعت شنی</string>
<string name="verification_emoji_clock">ساعت</string>
<string name="verification_emoji_gift">هدیه</string>
<string name="verification_emoji_light_bulb">لامپ</string>
<string name="verification_emoji_book">کتاب</string>
<string name="verification_emoji_pencil">مداد</string>
<string name="verification_emoji_paperclip">گیره کاغذ</string>
<string name="verification_emoji_scissors">قیچی</string>
<string name="verification_emoji_lock">قفل</string>
<string name="verification_emoji_key">کلید</string>
<string name="verification_emoji_hammer">چکش</string>
<string name="verification_emoji_telephone">تلفن</string>
<string name="verification_emoji_flag">پرچم</string>
<string name="verification_emoji_train">قطار</string>
<string name="verification_emoji_bicycle">دوچرخه</string>
<string name="verification_emoji_aeroplane">هواپیما</string>
<string name="verification_emoji_rocket">موشک</string>
<string name="verification_emoji_trophy">جام</string>
<string name="verification_emoji_ball">توپ</string>
<string name="verification_emoji_guitar">گیتار</string>
<string name="verification_emoji_trumpet">شیپور</string>
<string name="verification_emoji_bell">زنگ</string>
<string name="verification_emoji_anchor">لنگر</string>
<string name="verification_emoji_headphones">هدفون</string>
<string name="verification_emoji_folder">پوشه</string>
<string name="verification_emoji_pin">سنجاق</string>
</resources>

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Generated file, do not edit -->
<string name="verification_emoji_dog">Anjing</string>
<string name="verification_emoji_cat">Kucing</string>
<string name="verification_emoji_lion">Singa</string>
<string name="verification_emoji_horse">Kuda</string>
<string name="verification_emoji_unicorn">Unicorn</string>
<string name="verification_emoji_pig">Babi</string>
<string name="verification_emoji_elephant">Gajah</string>
<string name="verification_emoji_rabbit">Kelinci</string>
<string name="verification_emoji_panda">Panda</string>
<string name="verification_emoji_rooster">Ayam</string>
<string name="verification_emoji_penguin">Penguin</string>
<string name="verification_emoji_turtle">Kura-Kura</string>
<string name="verification_emoji_fish">Ikan</string>
<string name="verification_emoji_octopus">Gurita</string>
<string name="verification_emoji_butterfly">Kupu-Kupu</string>
<string name="verification_emoji_flower">Bunga</string>
<string name="verification_emoji_tree">Pohon</string>
<string name="verification_emoji_cactus">Kaktus</string>
<string name="verification_emoji_mushroom">Jamur</string>
<string name="verification_emoji_globe">Bola Dunia</string>
<string name="verification_emoji_moon">Bulan</string>
<string name="verification_emoji_cloud">Awan</string>
<string name="verification_emoji_fire">Api</string>
<string name="verification_emoji_banana">Pisang</string>
<string name="verification_emoji_apple">Apel</string>
<string name="verification_emoji_strawberry">Stroberi</string>
<string name="verification_emoji_corn">Jagung</string>
<string name="verification_emoji_pizza">Pizza</string>
<string name="verification_emoji_cake">Kue</string>
<string name="verification_emoji_heart">Hati</string>
<string name="verification_emoji_smiley">Senyuman</string>
<string name="verification_emoji_robot">Robot</string>
<string name="verification_emoji_hat">Topi</string>
<string name="verification_emoji_glasses">Kacamata</string>
<string name="verification_emoji_spanner">Kunci Bengkel</string>
<string name="verification_emoji_santa">Santa</string>
<string name="verification_emoji_thumbs_up">Jempol</string>
<string name="verification_emoji_umbrella">Payung</string>
<string name="verification_emoji_hourglass">Jam Pasir</string>
<string name="verification_emoji_clock">Jam</string>
<string name="verification_emoji_gift">Kado</string>
<string name="verification_emoji_light_bulb">Bohlam Lampu</string>
<string name="verification_emoji_book">Buku</string>
<string name="verification_emoji_pencil">Pensil</string>
<string name="verification_emoji_paperclip">Klip Kertas</string>
<string name="verification_emoji_scissors">Gunting</string>
<string name="verification_emoji_lock">Gembok</string>
<string name="verification_emoji_key">Kunci</string>
<string name="verification_emoji_hammer">Palu</string>
<string name="verification_emoji_telephone">Telepon</string>
<string name="verification_emoji_flag">Bendera</string>
<string name="verification_emoji_train">Kereta Api</string>
<string name="verification_emoji_bicycle">Sepeda</string>
<string name="verification_emoji_aeroplane">Pesawat</string>
<string name="verification_emoji_rocket">Roket</string>
<string name="verification_emoji_trophy">Piala</string>
<string name="verification_emoji_ball">Bola</string>
<string name="verification_emoji_guitar">Gitar</string>
<string name="verification_emoji_trumpet">Terompet</string>
<string name="verification_emoji_bell">Lonceng</string>
<string name="verification_emoji_anchor">Jangkar</string>
<string name="verification_emoji_headphones">Headphone</string>
<string name="verification_emoji_folder">Map</string>
<string name="verification_emoji_pin">Pin</string>
</resources>

View File

@ -32,7 +32,7 @@
<string name="verification_emoji_cake">ケーキ</string>
<string name="verification_emoji_heart">ハート</string>
<string name="verification_emoji_smiley">スマイル</string>
<string name="verification_emoji_robot">ロボ</string>
<string name="verification_emoji_robot">ロボット</string>
<string name="verification_emoji_hat">帽子</string>
<string name="verification_emoji_glasses">めがね</string>
<string name="verification_emoji_spanner">スパナ</string>
@ -63,6 +63,6 @@
<string name="verification_emoji_bell">ベル</string>
<string name="verification_emoji_anchor">いかり</string>
<string name="verification_emoji_headphones">ヘッドホン</string>
<string name="verification_emoji_folder">フォルダ</string>
<string name="verification_emoji_folder">フォルダ</string>
<string name="verification_emoji_pin">ピン</string>
</resources>

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Generated file, do not edit -->
<string name="verification_emoji_dog">Cão</string>
<string name="verification_emoji_cat">Gato</string>
<string name="verification_emoji_lion">Leão</string>
<string name="verification_emoji_horse">Cavalo</string>
<string name="verification_emoji_unicorn">Unicórnio</string>
<string name="verification_emoji_pig">Porco</string>
<string name="verification_emoji_elephant">Elefante</string>
<string name="verification_emoji_rabbit">Coelho</string>
<string name="verification_emoji_panda">Panda</string>
<string name="verification_emoji_rooster">Galo</string>
<string name="verification_emoji_penguin">Pinguim</string>
<string name="verification_emoji_turtle">Tartaruga</string>
<string name="verification_emoji_fish">Peixe</string>
<string name="verification_emoji_octopus">Polvo</string>
<string name="verification_emoji_butterfly">Borboleta</string>
<string name="verification_emoji_flower">Flor</string>
<string name="verification_emoji_tree">Árvore</string>
<string name="verification_emoji_cactus">Cato</string>
<string name="verification_emoji_mushroom">Cogumelo</string>
<string name="verification_emoji_globe">Globo</string>
<string name="verification_emoji_moon">Lua</string>
<string name="verification_emoji_cloud">Nuvem</string>
<string name="verification_emoji_fire">Fogo</string>
<string name="verification_emoji_banana">Banana</string>
<string name="verification_emoji_apple">Maçã</string>
<string name="verification_emoji_strawberry">Morango</string>
<string name="verification_emoji_corn">Milho</string>
<string name="verification_emoji_pizza">Piza</string>
<string name="verification_emoji_cake">Bolo</string>
<string name="verification_emoji_heart">Coração</string>
<string name="verification_emoji_smiley">Sorriso</string>
<string name="verification_emoji_robot">Robô</string>
<string name="verification_emoji_hat">Chapéu</string>
<string name="verification_emoji_glasses">Óculos</string>
<string name="verification_emoji_spanner">Chave inglesa</string>
<string name="verification_emoji_santa">Pai Natal</string>
<string name="verification_emoji_thumbs_up">Polegar para cima</string>
<string name="verification_emoji_umbrella">Guarda-chuva</string>
<string name="verification_emoji_hourglass">Ampulheta</string>
<string name="verification_emoji_clock">Relógio</string>
<string name="verification_emoji_gift">Presente</string>
<string name="verification_emoji_light_bulb">Lâmpada</string>
<string name="verification_emoji_book">Livro</string>
<string name="verification_emoji_pencil">Lápis</string>
<string name="verification_emoji_paperclip">Clipe</string>
<string name="verification_emoji_scissors">Tesoura</string>
<string name="verification_emoji_lock">Cadeado</string>
<string name="verification_emoji_key">Chave</string>
<string name="verification_emoji_hammer">Martelo</string>
<string name="verification_emoji_telephone">Telefone</string>
<string name="verification_emoji_flag">Bandeira</string>
<string name="verification_emoji_train">Comboio</string>
<string name="verification_emoji_bicycle">Bicicleta</string>
<string name="verification_emoji_aeroplane">Avião</string>
<string name="verification_emoji_rocket">Foguetão</string>
<string name="verification_emoji_trophy">Troféu</string>
<string name="verification_emoji_ball">Bola</string>
<string name="verification_emoji_guitar">Guitarra</string>
<string name="verification_emoji_trumpet">Trompete</string>
<string name="verification_emoji_bell">Sino</string>
<string name="verification_emoji_anchor">Âncora</string>
<string name="verification_emoji_headphones">Fones</string>
<string name="verification_emoji_folder">Pasta</string>
<string name="verification_emoji_pin">Pionés</string>
</resources>

View File

@ -1,66 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Generated file, do not edit -->
<string name="verification_emoji_dog">Hlava psa</string>
<string name="verification_emoji_cat">Hlava mačky</string>
<string name="verification_emoji_lion">Hlava leva</string>
<string name="verification_emoji_dog">Pes</string>
<string name="verification_emoji_cat">Mačka</string>
<string name="verification_emoji_lion">Lev</string>
<string name="verification_emoji_horse">Kôň</string>
<string name="verification_emoji_unicorn">Hlava jednorožca</string>
<string name="verification_emoji_pig">Hlava prasaťa</string>
<string name="verification_emoji_unicorn">Jednorožec</string>
<string name="verification_emoji_pig">Prasa</string>
<string name="verification_emoji_elephant">Slon</string>
<string name="verification_emoji_rabbit">Hlava zajaca</string>
<string name="verification_emoji_panda">Hlava pandy</string>
<string name="verification_emoji_rabbit">Zajac</string>
<string name="verification_emoji_panda">Panda</string>
<string name="verification_emoji_rooster">Kohút</string>
<string name="verification_emoji_penguin">Tučniak</string>
<string name="verification_emoji_turtle">Korytnačka</string>
<string name="verification_emoji_fish">Ryba</string>
<string name="verification_emoji_octopus">Chobotnica</string>
<string name="verification_emoji_butterfly">Motýľ</string>
<string name="verification_emoji_flower">Tulipán</string>
<string name="verification_emoji_tree">Listnatý strom</string>
<string name="verification_emoji_flower">Kvet</string>
<string name="verification_emoji_tree">Strom</string>
<string name="verification_emoji_cactus">Kaktus</string>
<string name="verification_emoji_mushroom">Huba</string>
<string name="verification_emoji_globe">Zemeguľa</string>
<string name="verification_emoji_moon">Polmesiac</string>
<string name="verification_emoji_moon">Mesiac</string>
<string name="verification_emoji_cloud">Oblak</string>
<string name="verification_emoji_fire">Oheň</string>
<string name="verification_emoji_banana">Banán</string>
<string name="verification_emoji_apple">Červené jablko</string>
<string name="verification_emoji_apple">Jablko</string>
<string name="verification_emoji_strawberry">Jahoda</string>
<string name="verification_emoji_corn">Kukuričný klas</string>
<string name="verification_emoji_corn">Kukurica</string>
<string name="verification_emoji_pizza">Pizza</string>
<string name="verification_emoji_cake">Narodeninová torta</string>
<string name="verification_emoji_heart">červené srdce</string>
<string name="verification_emoji_smiley">Škeriaca sa tvár</string>
<string name="verification_emoji_cake">Torta</string>
<string name="verification_emoji_heart">Srdce</string>
<string name="verification_emoji_smiley">Smajlík</string>
<string name="verification_emoji_robot">Robot</string>
<string name="verification_emoji_hat">Cilinder</string>
<string name="verification_emoji_hat">Klobúk</string>
<string name="verification_emoji_glasses">Okuliare</string>
<string name="verification_emoji_spanner">Francúzsky kľúč</string>
<string name="verification_emoji_santa">Santa Claus</string>
<string name="verification_emoji_spanner">Vidlicový kľúč</string>
<string name="verification_emoji_santa">Mikuláš</string>
<string name="verification_emoji_thumbs_up">Palec nahor</string>
<string name="verification_emoji_umbrella">Dáždnik</string>
<string name="verification_emoji_hourglass">Presýpacie hodiny</string>
<string name="verification_emoji_clock">Budík</string>
<string name="verification_emoji_gift">Zabalený darček</string>
<string name="verification_emoji_gift">Darček</string>
<string name="verification_emoji_light_bulb">Žiarovka</string>
<string name="verification_emoji_book">Zatvorená kniha</string>
<string name="verification_emoji_book">Kniha</string>
<string name="verification_emoji_pencil">Ceruzka</string>
<string name="verification_emoji_paperclip">Sponka na papier</string>
<string name="verification_emoji_paperclip">Kancelárska sponka</string>
<string name="verification_emoji_scissors">Nožnice</string>
<string name="verification_emoji_lock">Zatvorená zámka</string>
<string name="verification_emoji_lock">Zámka</string>
<string name="verification_emoji_key">Kľúč</string>
<string name="verification_emoji_hammer">Kladivo</string>
<string name="verification_emoji_telephone">Telefón</string>
<string name="verification_emoji_flag">Kockovaná zástava</string>
<string name="verification_emoji_train">Rušeň</string>
<string name="verification_emoji_flag">Zástava</string>
<string name="verification_emoji_train">Vlak</string>
<string name="verification_emoji_bicycle">Bicykel</string>
<string name="verification_emoji_aeroplane">Lietadlo</string>
<string name="verification_emoji_rocket">Raketa</string>
<string name="verification_emoji_trophy">Trofej</string>
<string name="verification_emoji_ball">Futbal</string>
<string name="verification_emoji_ball">Lopta</string>
<string name="verification_emoji_guitar">Gitara</string>
<string name="verification_emoji_trumpet">Trúbka</string>
<string name="verification_emoji_bell">Zvon</string>
<string name="verification_emoji_bell">Zvonec</string>
<string name="verification_emoji_anchor">Kotva</string>
<string name="verification_emoji_headphones">Slúchadlá</string>
<string name="verification_emoji_folder">Fascikel</string>

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Generated file, do not edit -->
<string name="verification_emoji_dog">Qen</string>
<string name="verification_emoji_cat">Mace</string>
<string name="verification_emoji_lion">Luan</string>
<string name="verification_emoji_horse">Kalë</string>
<string name="verification_emoji_unicorn">Njëbrirësh</string>
<string name="verification_emoji_pig">Derr</string>
<string name="verification_emoji_elephant">Elefant</string>
<string name="verification_emoji_rabbit">Lepur</string>
<string name="verification_emoji_panda">Panda</string>
<string name="verification_emoji_rooster">Këndes</string>
<string name="verification_emoji_penguin">Pinguin</string>
<string name="verification_emoji_turtle">Breshkë</string>
<string name="verification_emoji_fish">Peshk</string>
<string name="verification_emoji_octopus">Oktapod</string>
<string name="verification_emoji_butterfly">Flutur</string>
<string name="verification_emoji_flower">Lule</string>
<string name="verification_emoji_tree">Pemë</string>
<string name="verification_emoji_cactus">Kaktus</string>
<string name="verification_emoji_mushroom">Kërpudhë</string>
<string name="verification_emoji_globe">Rruzull</string>
<string name="verification_emoji_moon">Hënë</string>
<string name="verification_emoji_cloud">Re</string>
<string name="verification_emoji_fire">Zjarr</string>
<string name="verification_emoji_banana">Banane</string>
<string name="verification_emoji_apple">Mollë</string>
<string name="verification_emoji_strawberry">Luleshtrydhe</string>
<string name="verification_emoji_corn">Misër</string>
<string name="verification_emoji_pizza">Picë</string>
<string name="verification_emoji_cake">Tortë</string>
<string name="verification_emoji_heart">Zemër</string>
<string name="verification_emoji_smiley">Emotikon</string>
<string name="verification_emoji_robot">Robot</string>
<string name="verification_emoji_hat">Kapë</string>
<string name="verification_emoji_glasses">Syze</string>
<string name="verification_emoji_spanner">Çelës</string>
<string name="verification_emoji_santa">Babagjyshi i Vitit të Ri</string>
<string name="verification_emoji_umbrella">Ombrellë</string>
<string name="verification_emoji_hourglass">Klepsidër</string>
<string name="verification_emoji_clock">Sahat</string>
<string name="verification_emoji_gift">Dhuratë</string>
<string name="verification_emoji_light_bulb">Llambë</string>
<string name="verification_emoji_book">Libër</string>
<string name="verification_emoji_pencil">Laps</string>
<string name="verification_emoji_paperclip">Kapëse</string>
<string name="verification_emoji_scissors">Gërshërë</string>
<string name="verification_emoji_lock">Dry</string>
<string name="verification_emoji_key">Çelës</string>
<string name="verification_emoji_hammer">Çekiç</string>
<string name="verification_emoji_telephone">Telefon</string>
<string name="verification_emoji_flag">Flamur</string>
<string name="verification_emoji_train">Tren</string>
<string name="verification_emoji_bicycle">Biçikletë</string>
<string name="verification_emoji_aeroplane">Avion</string>
<string name="verification_emoji_rocket">Raketë</string>
<string name="verification_emoji_trophy">Trofe</string>
<string name="verification_emoji_ball">Top</string>
<string name="verification_emoji_guitar">Kitarë</string>
<string name="verification_emoji_trumpet">Trombë</string>
<string name="verification_emoji_bell">Kambanë</string>
<string name="verification_emoji_anchor">Spirancë</string>
<string name="verification_emoji_headphones">Kufje</string>
<string name="verification_emoji_folder">Dosje</string>
<string name="verification_emoji_pin">Karficë</string>
</resources>

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Generated file, do not edit -->
<string name="verification_emoji_dog">Chó</string>
<string name="verification_emoji_cat">Mèo</string>
<string name="verification_emoji_lion">Sư tử</string>
<string name="verification_emoji_horse">Ngựa</string>
<string name="verification_emoji_unicorn">Kỳ lân</string>
<string name="verification_emoji_pig">Heo</string>
<string name="verification_emoji_elephant">Voi</string>
<string name="verification_emoji_rabbit">Thỏ</string>
<string name="verification_emoji_panda">Gấu trúc</string>
<string name="verification_emoji_rooster">Gà trống</string>
<string name="verification_emoji_penguin">Chim cánh cụt</string>
<string name="verification_emoji_turtle">Rùa</string>
<string name="verification_emoji_fish"></string>
<string name="verification_emoji_octopus">Bạch tuộc</string>
<string name="verification_emoji_butterfly">Bướm</string>
<string name="verification_emoji_flower">Hoa</string>
<string name="verification_emoji_tree">Cây</string>
<string name="verification_emoji_cactus">Xương rồng</string>
<string name="verification_emoji_mushroom">Nấm</string>
<string name="verification_emoji_globe">Địa cầu</string>
<string name="verification_emoji_moon">Mặt trăng</string>
<string name="verification_emoji_cloud">Mây</string>
<string name="verification_emoji_fire">Lửa</string>
<string name="verification_emoji_banana">Chuối</string>
<string name="verification_emoji_apple">Táo</string>
<string name="verification_emoji_strawberry">Dâu tây</string>
<string name="verification_emoji_corn">Bắp</string>
<string name="verification_emoji_pizza">Pizza</string>
<string name="verification_emoji_cake">Bánh</string>
<string name="verification_emoji_heart">Tim</string>
<string name="verification_emoji_smiley">Mặt cười</string>
<string name="verification_emoji_robot">Rô-bô</string>
<string name="verification_emoji_hat"></string>
<string name="verification_emoji_glasses">Kính mắt</string>
<string name="verification_emoji_spanner">Cờ-lê</string>
<string name="verification_emoji_santa">ông già Nô-en</string>
<string name="verification_emoji_thumbs_up">Thích</string>
<string name="verification_emoji_umbrella">Cái ô</string>
<string name="verification_emoji_hourglass">Đồng hồ cát</string>
<string name="verification_emoji_clock">Đồng hồ</string>
<string name="verification_emoji_gift">Quà tặng</string>
<string name="verification_emoji_light_bulb">Bóng đèn tròn</string>
<string name="verification_emoji_book">Sách</string>
<string name="verification_emoji_pencil">Viết chì</string>
<string name="verification_emoji_paperclip">Kẹp giấy</string>
<string name="verification_emoji_scissors">Cái kéo</string>
<string name="verification_emoji_lock">Ổ khóa</string>
<string name="verification_emoji_key">Chìa khóa</string>
<string name="verification_emoji_hammer">Búa</string>
<string name="verification_emoji_telephone">Điện thoại</string>
<string name="verification_emoji_flag">Lá cờ</string>
<string name="verification_emoji_train">Xe lửa</string>
<string name="verification_emoji_bicycle">Xe đạp</string>
<string name="verification_emoji_aeroplane">Máy bay</string>
<string name="verification_emoji_rocket">Tên lửa</string>
<string name="verification_emoji_trophy">Cúp</string>
<string name="verification_emoji_ball">Banh</string>
<string name="verification_emoji_guitar">Ghi-ta</string>
<string name="verification_emoji_trumpet">Kèn</string>
<string name="verification_emoji_bell">Chuông</string>
<string name="verification_emoji_anchor">Mỏ neo</string>
<string name="verification_emoji_headphones">Tai nghe</string>
<string name="verification_emoji_folder">Thư mục</string>
<string name="verification_emoji_pin">Ghim</string>
</resources>

View File

@ -76,6 +76,7 @@ import org.matrix.rustcomponents.sdk.crypto.DeviceLists
import org.matrix.rustcomponents.sdk.crypto.EncryptionSettings
import org.matrix.rustcomponents.sdk.crypto.KeyRequestPair
import org.matrix.rustcomponents.sdk.crypto.KeysImportResult
import org.matrix.rustcomponents.sdk.crypto.LocalTrust
import org.matrix.rustcomponents.sdk.crypto.Logger
import org.matrix.rustcomponents.sdk.crypto.MegolmV1BackupKey
import org.matrix.rustcomponents.sdk.crypto.Request
@ -869,6 +870,11 @@ internal class OlmMachine @Inject constructor(
}
}
suspend fun requestMissingSecretsFromOtherSessions(): Boolean {
return withContext(coroutineDispatchers.io) {
inner.queryMissingSecretsFromOtherSessions()
}
}
@Throws(CryptoStoreException::class)
suspend fun enableBackupV1(key: String, version: String) {
return withContext(coroutineDispatchers.computation) {
@ -934,4 +940,11 @@ internal class OlmMachine @Inject constructor(
inner.verifyBackup(serializedAuthData)
}
}
@Throws(CryptoStoreException::class)
suspend fun setDeviceLocalTrust(userId: String, deviceId: String, trusted: Boolean) {
withContext(coroutineDispatchers.io) {
inner.setLocalTrust(userId, deviceId, if (trusted) LocalTrust.VERIFIED else LocalTrust.UNSET)
}
}
}

View File

@ -31,6 +31,7 @@ import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM
import org.matrix.android.sdk.api.crypto.MXCryptoConfig
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.listeners.ProgressListener
import org.matrix.android.sdk.api.logger.LoggerTag
@ -536,7 +537,8 @@ internal class RustCryptoService @Inject constructor(
}
override suspend fun setDeviceVerification(trustLevel: DeviceTrustLevel, userId: String, deviceId: String) {
TODO("Not yet implemented")
Timber.w("Rust stack only support API to set local trust")
olmMachine.setDeviceLocalTrust(userId, deviceId, trustLevel.isLocallyVerified().orFalse())
}
/**

View File

@ -16,15 +16,29 @@
package org.matrix.android.sdk.internal.crypto
import org.matrix.android.sdk.BuildConfig
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.internal.crypto.network.OutgoingRequestsProcessor
import org.matrix.rustcomponents.sdk.crypto.Request
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Provider
internal class SecretShareManager @Inject constructor() {
internal class SecretShareManager @Inject constructor(
private val olmMachine: Provider<OlmMachine>,
private val outgoingRequestsProcessor: OutgoingRequestsProcessor) {
suspend fun requestSecretTo(deviceId: String, secretName: String) {
// nop in rust?
if (BuildConfig.DEBUG) TODO("requestSecretTo Not implemented in Rust")
Timber.e("SecretShareManager Not supported in rust $deviceId, $secretName")
Timber.w("SecretShareManager requesting custom secrets not supported $deviceId, $secretName")
// rust stack only support requesting secrets defined in the spec (not custom secret yet)
requestMissingSecrets()
}
suspend fun requestMissingSecrets() {
this.olmMachine.get().requestMissingSecretsFromOtherSessions()
// immediately send the requests
outgoingRequestsProcessor.processOutgoingRequests(this.olmMachine.get()) {
it is Request.ToDevice && it.eventType == EventType.REQUEST_SECRET
}
}
}

View File

@ -35,7 +35,7 @@ if args.verbose:
print("Argument:")
print(args)
base_url = "https://raw.githubusercontent.com/matrix-org/matrix-doc/master/data-definitions/sas-emoji.json"
base_url = "https://raw.githubusercontent.com/matrix-org/matrix-spec/main/data-definitions/sas-emoji.json"
print("Downloading " + base_url + "")

View File

@ -17,7 +17,7 @@
<issue id="IconDuplicatesConfig" severity="error" />
<issue id="IconDuplicates" severity="error" />
<issue id="IconExpectedSize" severity="error" />
<issue id="LocaleFolder" severity="error" />
<issue id="LocaleFolder" severity="ignore" />
<!-- AlwaysShowAction is considered as an error to force ignoring the issue when detected -->
<issue id="AlwaysShowAction" severity="error" />

View File

@ -37,7 +37,7 @@ ext.versionMinor = 6
// Note: even values are reserved for regular release, odd values for hotfix release.
// When creating a hotfix, you should decrease the value, since the current value
// is the value for the next regular release.
ext.versionPatch = 5
ext.versionPatch = 6
static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct'

View File

@ -277,6 +277,7 @@ dependencies {
runtimeOnly(libs.jsonwebtoken.jjwtOrgjson) {
exclude group: 'org.json', module: 'json' //provided by Android natively
}
testImplementation(libs.jsonwebtoken.jjwtOrgjson)
implementation 'commons-codec:commons-codec:1.15'
// MapTiler

View File

@ -19,8 +19,11 @@ package im.vector.app.features.call.conference.jwt
import im.vector.app.core.utils.ensureProtocol
import io.jsonwebtoken.Jwts
import io.jsonwebtoken.SignatureAlgorithm
import io.jsonwebtoken.io.Encoders
import io.jsonwebtoken.security.Keys
import org.matrix.android.sdk.api.session.openid.OpenIdToken
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import javax.inject.Inject
class JitsiJWTFactory @Inject constructor() {
@ -37,7 +40,12 @@ class JitsiJWTFactory @Inject constructor() {
userDisplayName: String
): String {
// The secret key here is irrelevant, we're only using the JWT to transport data to Prosody in the Jitsi stack.
val key = Keys.secretKeyFor(SignatureAlgorithm.HS256)
// In the PR https://github.com/jitsi/luajwtjitsi/pull/3 the function `luajwtjitsi.decode` was removed and
// we cannot use random secret keys anymore. But the JWT library `jjwt` doesn't accept the hardcoded key `notused`
// from the module `prosody-mod-auth-matrix-user-verification` since it's too short and thus insecure. So, we
// create a new token using a random key and then re-sign the token manually with the 'weak' key.
val signatureAlgorithm = SignatureAlgorithm.HS256
val key = Keys.secretKeyFor(signatureAlgorithm)
val context = mapOf(
"matrix" to mapOf(
"token" to openIdToken.accessToken,
@ -52,7 +60,8 @@ class JitsiJWTFactory @Inject constructor() {
// As per Jitsi token auth, `iss` needs to be set to something agreed between
// JWT generating side and Prosody config. Since we have no configuration for
// the widgets, we can't set one anywhere. Using the Jitsi domain here probably makes sense.
return Jwts.builder()
val token = Jwts.builder()
.setHeaderParam("typ", "JWT")
.setIssuer(jitsiServerDomain)
.setSubject(jitsiServerDomain)
.setAudience(jitsiServerDomain.ensureProtocol())
@ -61,5 +70,11 @@ class JitsiJWTFactory @Inject constructor() {
.claim("context", context)
.signWith(key)
.compact()
// Re-sign token with the hardcoded key
val toSign = token.substring(0, token.lastIndexOf('.'))
val mac = Mac.getInstance(signatureAlgorithm.jcaName)
mac.init(SecretKeySpec("notused".toByteArray(), mac.algorithm))
val prosodySignature = Encoders.BASE64URL.encode(mac.doFinal(toSign.toByteArray()))
return "$toSign.$prosodySignature"
}
}

View File

@ -139,19 +139,19 @@ class ShortcutsHandler @Inject constructor(
}
private fun createShortcuts(rooms: List<RoomSummary>) {
if (hasPinCode.get()) {
// No shortcut in this case (privacy)
ShortcutManagerCompat.removeAllDynamicShortcuts(context)
} else {
val shortcuts = rooms
.take(maxShortcutCountPerActivity)
.mapIndexed { index, room ->
shortcutCreator.create(room, index)
}
ShortcutManagerCompat.removeAllDynamicShortcuts(context)
shortcuts.forEach { shortcut ->
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)
}
// No shortcut in this case (privacy)
if (hasPinCode.get()) return
val shortcuts = rooms
.take(maxShortcutCountPerActivity)
.mapIndexed { index, room ->
shortcutCreator.create(room, index)
}
shortcuts.forEach { shortcut ->
ShortcutManagerCompat.pushDynamicShortcut(context, shortcut)
}
}

View File

@ -20,6 +20,7 @@ import android.content.SharedPreferences
import android.os.Build
import androidx.core.content.edit
import im.vector.app.core.di.DefaultPreferences
import im.vector.app.core.resources.AppNameProvider
import im.vector.app.core.resources.VersionCodeProvider
import im.vector.app.features.version.VersionProvider
import org.matrix.android.sdk.api.Matrix
@ -36,6 +37,7 @@ class VectorUncaughtExceptionHandler @Inject constructor(
private val bugReporter: BugReporter,
private val versionProvider: VersionProvider,
private val versionCodeProvider: VersionCodeProvider,
private val appNameProvider: AppNameProvider,
) : Thread.UncaughtExceptionHandler {
// key to save the crash status
@ -67,12 +69,12 @@ class VectorUncaughtExceptionHandler @Inject constructor(
putBoolean(PREFS_CRASH_KEY, true)
}
val b = StringBuilder()
val appName = "Element" // TODO Matrix.getApplicationName()
val appName = appNameProvider.getAppName()
b.append(appName + " Build : " + versionCodeProvider.getVersionCode() + "\n")
b.append("$appName Build : ${versionCodeProvider.getVersionCode()}\n")
b.append("$appName Version : ${versionProvider.getVersion(longFormat = true)}\n")
b.append("SDK Version : ${Matrix.getSdkVersion()}\n")
b.append("Phone : " + Build.MODEL.trim() + " (" + Build.VERSION.INCREMENTAL + " " + Build.VERSION.RELEASE + " " + Build.VERSION.CODENAME + ")\n")
b.append("Phone : ${Build.MODEL.trim()} (${Build.VERSION.INCREMENTAL} ${Build.VERSION.RELEASE} ${Build.VERSION.CODENAME})\n")
b.append("Memory statuses \n")

View File

@ -45,10 +45,11 @@ import im.vector.app.core.intent.getFilenameFromUri
import im.vector.app.core.platform.SimpleTextWatcher
import im.vector.app.core.preference.UserAvatarPreference
import im.vector.app.core.preference.VectorPreference
import im.vector.app.core.preference.VectorPreferenceCategory
import im.vector.app.core.preference.VectorSwitchPreference
import im.vector.app.core.utils.TextUtils
import im.vector.app.core.utils.getSizeOfFiles
import im.vector.app.core.utils.openUrlInExternalBrowser
import im.vector.app.core.utils.openUrlInChromeCustomTab
import im.vector.app.core.utils.toast
import im.vector.app.databinding.DialogChangePasswordBinding
import im.vector.app.features.MainActivity
@ -101,12 +102,18 @@ class VectorSettingsGeneralFragment :
private val mPasswordPreference by lazy {
findPreference<VectorPreference>(VectorPreferences.SETTINGS_CHANGE_PASSWORD_PREFERENCE_KEY)!!
}
private val mManage3pidsPreference by lazy {
findPreference<VectorPreference>(VectorPreferences.SETTINGS_EMAILS_AND_PHONE_NUMBERS_PREFERENCE_KEY)!!
}
private val mIdentityServerPreference by lazy {
findPreference<VectorPreference>(VectorPreferences.SETTINGS_IDENTITY_SERVER_PREFERENCE_KEY)!!
}
private val mExternalAccountManagementPreference by lazy {
findPreference<VectorPreference>(VectorPreferences.SETTINGS_EXTERNAL_ACCOUNT_MANAGEMENT_KEY)!!
}
private val mDeactivateAccountCategory by lazy {
findPreference<VectorPreferenceCategory>("SETTINGS_DEACTIVATE_ACCOUNT_CATEGORY_KEY")!!
}
// Local contacts
private val mContactSettingsCategory by lazy {
@ -197,6 +204,10 @@ class VectorSettingsGeneralFragment :
mPasswordPreference.isVisible = false
}
// Manage 3Pid
// Hide the preference if 3pids can not be updated
mManage3pidsPreference.isVisible = homeServerCapabilities.canChange3pid
val openDiscoveryScreenPreferenceClickListener = Preference.OnPreferenceClickListener {
(requireActivity() as VectorSettingsActivity).navigateTo(
DiscoverySettingsFragment::class.java,
@ -214,7 +225,7 @@ class VectorSettingsGeneralFragment :
// Hide the preference if no URL is given by server
if (homeServerCapabilities.externalAccountManagementUrl != null) {
mExternalAccountManagementPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener {
openUrlInExternalBrowser(it.context, homeServerCapabilities.externalAccountManagementUrl)
openUrlInChromeCustomTab(it.context, null, homeServerCapabilities.externalAccountManagementUrl!!)
true
}
@ -315,6 +326,8 @@ class VectorSettingsGeneralFragment :
false
}
// Account deactivation is visible only if account is not managed by an external URL.
mDeactivateAccountCategory.isVisible = homeServerCapabilities.delegatedOidcAuthEnabled.not()
}
private suspend fun getCacheSize(): Long = withContext(Dispatchers.IO) {

View File

@ -50,4 +50,6 @@ sealed class DevicesViewEvents : VectorViewEvents {
data class ShowManuallyVerify(val cryptoDeviceInfo: CryptoDeviceInfo) : DevicesViewEvents()
object PromptResetSecrets : DevicesViewEvents()
data class OpenBrowser(val url: String) : DevicesViewEvents()
}

View File

@ -346,6 +346,20 @@ class DevicesViewModel @AssistedInject constructor(
private fun handleDelete(action: DevicesAction.Delete) {
val deviceId = action.deviceId
val accountManagementUrl = session.homeServerCapabilitiesService().getHomeServerCapabilities().externalAccountManagementUrl
if (accountManagementUrl != null) {
// Open external browser to delete this session
_viewEvents.post(
DevicesViewEvents.OpenBrowser(
url = accountManagementUrl.removeSuffix("/") + "?action=session_end&device_id=$deviceId"
)
)
} else {
doDelete(deviceId)
}
}
private fun doDelete(deviceId: String) {
setState {
copy(
request = Loading()

View File

@ -35,6 +35,7 @@ import im.vector.app.core.extensions.cleanup
import im.vector.app.core.extensions.configureWith
import im.vector.app.core.extensions.registerStartForActivityResult
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.core.utils.openUrlInChromeCustomTab
import im.vector.app.databinding.DialogBaseEditTextBinding
import im.vector.app.databinding.FragmentGenericRecyclerBinding
import im.vector.app.features.auth.ReAuthActivity
@ -95,6 +96,9 @@ class VectorSettingsDevicesFragment :
is DevicesViewEvents.PromptResetSecrets -> {
navigator.open4SSetup(requireActivity(), SetupMode.PASSPHRASE_AND_NEEDED_SECRETS_RESET)
}
is DevicesViewEvents.OpenBrowser -> {
openUrlInChromeCustomTab(requireContext(), null, it.url)
}
}
}
}

View File

@ -35,12 +35,13 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
import timber.log.Timber
class DevicesViewModel @AssistedInject constructor(
@Assisted initialState: DevicesViewState,
activeSessionHolder: ActiveSessionHolder,
private val activeSessionHolder: ActiveSessionHolder,
private val getCurrentSessionCrossSigningInfoUseCase: GetCurrentSessionCrossSigningInfoUseCase,
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
private val refreshDevicesOnCryptoDevicesChangeUseCase: RefreshDevicesOnCryptoDevicesChangeUseCase,
@ -69,6 +70,19 @@ class DevicesViewModel @AssistedInject constructor(
refreshDeviceList()
refreshIpAddressVisibility()
observePreferences()
initDelegatedOidcAuthEnabled()
}
private fun initDelegatedOidcAuthEnabled() {
setState {
copy(
delegatedOidcAuthEnabled = activeSessionHolder.getSafeActiveSession()
?.homeServerCapabilitiesService()
?.getHomeServerCapabilities()
?.delegatedOidcAuthEnabled
.orFalse()
)
}
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {

View File

@ -26,6 +26,7 @@ data class DevicesViewState(
val devices: Async<DeviceFullInfoList> = Uninitialized,
val isLoading: Boolean = false,
val isShowingIpAddress: Boolean = false,
val delegatedOidcAuthEnabled: Boolean = false,
) : MavericksState
data class DeviceFullInfoList(

View File

@ -290,8 +290,8 @@ class VectorSettingsDevicesFragment :
val unverifiedSessionsCount = deviceFullInfoList?.unverifiedSessionsCount ?: 0
renderSecurityRecommendations(inactiveSessionsCount, unverifiedSessionsCount)
renderCurrentSessionView(currentDeviceInfo, hasOtherDevices = otherDevices?.isNotEmpty().orFalse())
renderOtherSessionsView(otherDevices, state.isShowingIpAddress)
renderCurrentSessionView(currentDeviceInfo, hasOtherDevices = otherDevices?.isNotEmpty().orFalse(), state)
renderOtherSessionsView(otherDevices, state)
} else {
hideSecurityRecommendations()
hideCurrentSessionView()
@ -347,13 +347,16 @@ class VectorSettingsDevicesFragment :
hideInactiveSessionsRecommendation()
}
private fun renderOtherSessionsView(otherDevices: List<DeviceFullInfo>?, isShowingIpAddress: Boolean) {
private fun renderOtherSessionsView(otherDevices: List<DeviceFullInfo>?, state: DevicesViewState) {
val isShowingIpAddress = state.isShowingIpAddress
if (otherDevices.isNullOrEmpty()) {
hideOtherSessionsView()
} else {
views.deviceListHeaderOtherSessions.isVisible = true
val colorDestructive = colorProvider.getColorFromAttribute(R.attr.colorError)
val multiSignoutItem = views.deviceListHeaderOtherSessions.menu.findItem(R.id.otherSessionsHeaderMultiSignout)
// Hide multi signout if the homeserver delegates the account management
multiSignoutItem.isVisible = state.delegatedOidcAuthEnabled.not()
val nbDevices = otherDevices.size
multiSignoutItem.title = stringProvider.getQuantityString(R.plurals.device_manager_other_sessions_multi_signout_all, nbDevices, nbDevices)
multiSignoutItem.setTextColor(colorDestructive)
@ -377,23 +380,24 @@ class VectorSettingsDevicesFragment :
views.deviceListOtherSessions.isVisible = false
}
private fun renderCurrentSessionView(currentDeviceInfo: DeviceFullInfo?, hasOtherDevices: Boolean) {
private fun renderCurrentSessionView(currentDeviceInfo: DeviceFullInfo?, hasOtherDevices: Boolean, state: DevicesViewState) {
currentDeviceInfo?.let {
renderCurrentSessionHeaderView(hasOtherDevices)
renderCurrentSessionHeaderView(hasOtherDevices, state)
renderCurrentSessionListView(it)
} ?: run {
hideCurrentSessionView()
}
}
private fun renderCurrentSessionHeaderView(hasOtherDevices: Boolean) {
private fun renderCurrentSessionHeaderView(hasOtherDevices: Boolean, state: DevicesViewState) {
views.deviceListHeaderCurrentSession.isVisible = true
val colorDestructive = colorProvider.getColorFromAttribute(R.attr.colorError)
val signoutSessionItem = views.deviceListHeaderCurrentSession.menu.findItem(R.id.currentSessionHeaderSignout)
signoutSessionItem.setTextColor(colorDestructive)
val signoutOtherSessionsItem = views.deviceListHeaderCurrentSession.menu.findItem(R.id.currentSessionHeaderSignoutOtherSessions)
signoutOtherSessionsItem.setTextColor(colorDestructive)
signoutOtherSessionsItem.isVisible = hasOtherDevices
// Hide signout other sessions if the homeserver delegates the account management
signoutOtherSessionsItem.isVisible = hasOtherDevices && state.delegatedOidcAuthEnabled.not()
}
private fun renderCurrentSessionListView(currentDeviceInfo: DeviceFullInfo) {

View File

@ -103,10 +103,15 @@ class OtherSessionsFragment :
val nbDevices = viewState.devices()?.size ?: 0
stringProvider.getQuantityString(R.plurals.device_manager_other_sessions_multi_signout_all, nbDevices, nbDevices)
}
multiSignoutItem.isVisible = if (viewState.isSelectModeEnabled) {
viewState.devices.invoke()?.any { it.isSelected }.orFalse()
multiSignoutItem.isVisible = if (viewState.delegatedOidcAuthEnabled) {
// Hide multi signout if the homeserver delegates the account management
false
} else {
viewState.devices.invoke()?.isNotEmpty().orFalse()
if (viewState.isSelectModeEnabled) {
viewState.devices.invoke()?.any { it.isSelected }.orFalse()
} else {
viewState.devices.invoke()?.isNotEmpty().orFalse()
}
}
val showAsActionFlag = if (viewState.isSelectModeEnabled) MenuItem.SHOW_AS_ACTION_IF_ROOM else MenuItem.SHOW_AS_ACTION_NEVER
multiSignoutItem.setShowAsAction(showAsActionFlag or MenuItem.SHOW_AS_ACTION_WITH_TEXT)
@ -308,7 +313,10 @@ class OtherSessionsFragment :
)
)
views.otherSessionsNotFoundTextView.text = getString(R.string.device_manager_other_sessions_no_inactive_sessions_found)
updateSecurityLearnMoreButton(R.string.device_manager_learn_more_sessions_inactive_title, R.string.device_manager_learn_more_sessions_inactive)
updateSecurityLearnMoreButton(
R.string.device_manager_learn_more_sessions_inactive_title,
R.string.device_manager_learn_more_sessions_inactive
)
}
DeviceManagerFilterType.ALL_SESSIONS -> { /* NOOP. View is not visible */
}

View File

@ -36,12 +36,13 @@ import im.vector.app.features.settings.devices.v2.signout.SignoutSessionsReAuthN
import im.vector.app.features.settings.devices.v2.signout.SignoutSessionsUseCase
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.uia.DefaultBaseAuth
import timber.log.Timber
class OtherSessionsViewModel @AssistedInject constructor(
@Assisted private val initialState: OtherSessionsViewState,
activeSessionHolder: ActiveSessionHolder,
private val activeSessionHolder: ActiveSessionHolder,
private val getDeviceFullInfoListUseCase: GetDeviceFullInfoListUseCase,
private val signoutSessionsUseCase: SignoutSessionsUseCase,
private val pendingAuthHandler: PendingAuthHandler,
@ -65,6 +66,19 @@ class OtherSessionsViewModel @AssistedInject constructor(
observeDevices(initialState.currentFilter)
refreshIpAddressVisibility()
observePreferences()
initDelegatedOidcAuthEnabled()
}
private fun initDelegatedOidcAuthEnabled() {
setState {
copy(
delegatedOidcAuthEnabled = activeSessionHolder.getSafeActiveSession()
?.homeServerCapabilitiesService()
?.getHomeServerCapabilities()
?.delegatedOidcAuthEnabled
.orFalse()
)
}
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {

View File

@ -29,6 +29,7 @@ data class OtherSessionsViewState(
val isSelectModeEnabled: Boolean = false,
val isLoading: Boolean = false,
val isShowingIpAddress: Boolean = false,
val delegatedOidcAuthEnabled: Boolean = false,
) : MavericksState {
constructor(args: OtherSessionsArgs) : this(excludeCurrentDevice = args.excludeCurrentDevice)

View File

@ -39,6 +39,7 @@ import im.vector.app.core.platform.VectorMenuProvider
import im.vector.app.core.resources.ColorProvider
import im.vector.app.core.resources.DrawableProvider
import im.vector.app.core.resources.StringProvider
import im.vector.app.core.utils.openUrlInChromeCustomTab
import im.vector.app.databinding.FragmentSessionOverviewBinding
import im.vector.app.features.auth.ReAuthActivity
import im.vector.app.features.crypto.recover.SetupMode
@ -135,10 +136,19 @@ class SessionOverviewFragment :
activity?.let { SignOutUiWorker(it).perform() }
}
private fun confirmSignoutOtherSession() {
activity?.let {
buildConfirmSignoutDialogUseCase.execute(it, this::signoutSession)
.show()
private fun confirmSignoutOtherSession() = withState(viewModel) { state ->
if (state.externalAccountManagementUrl != null) {
// Manage in external account manager
openUrlInChromeCustomTab(
requireContext(),
null,
state.externalAccountManagementUrl.removeSuffix("/") + "?action=session_end&device_id=${state.deviceId}"
)
} else {
activity?.let {
buildConfirmSignoutDialogUseCase.execute(it, this::signoutSession)
.show()
}
}
}

View File

@ -75,6 +75,18 @@ class SessionOverviewViewModel @AssistedInject constructor(
observeNotificationsStatus(initialState.deviceId)
refreshIpAddressVisibility()
observePreferences()
initExternalAccountManagementUrl()
}
private fun initExternalAccountManagementUrl() {
setState {
copy(
externalAccountManagementUrl = activeSessionHolder.getSafeActiveSession()
?.homeServerCapabilitiesService()
?.getHomeServerCapabilities()
?.externalAccountManagementUrl
)
}
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {

View File

@ -29,6 +29,7 @@ data class SessionOverviewViewState(
val isLoading: Boolean = false,
val notificationsStatus: NotificationsStatus = NotificationsStatus.NOT_SUPPORTED,
val isShowingIpAddress: Boolean = false,
val externalAccountManagementUrl: String? = null,
) : MavericksState {
constructor(args: SessionOverviewArgs) : this(
deviceId = args.deviceId

View File

@ -113,7 +113,9 @@
</im.vector.app.core.preference.VectorPreferenceCategory>
<im.vector.app.core.preference.VectorPreferenceCategory android:title="@string/settings_deactivate_account_section">
<im.vector.app.core.preference.VectorPreferenceCategory
android:key="SETTINGS_DEACTIVATE_ACCOUNT_CATEGORY_KEY"
android:title="@string/settings_deactivate_account_section">
<im.vector.app.core.preference.VectorPreference
android:key="SETTINGS_DEACTIVATE_ACCOUNT_KEY"

View File

@ -0,0 +1,156 @@
/*
* Copyright (c) 2023 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.call.conference.jwt
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Test
import org.matrix.android.sdk.api.session.openid.OpenIdToken
import java.lang.reflect.ParameterizedType
import java.util.Base64
import kotlin.streams.toList
class JitsiJWTFactoryTest {
private val base64Decoder = Base64.getUrlDecoder()
private val moshi = Moshi.Builder().build()
private val stringToString = Types.newParameterizedType(Map::class.java, String::class.java, String::class.java)
private val stringToAny = Types.newParameterizedType(Map::class.java, String::class.java, Any::class.java)
private lateinit var factory: JitsiJWTFactory
@Before
fun init() {
factory = JitsiJWTFactory()
}
@Test
fun `token contains 3 encoded parts`() {
val token = createToken()
val parts = token.split(".")
assertEquals(3, parts.size)
parts.forEach {
assertTrue("Non-empty array", base64Decoder.decode(it).isNotEmpty())
}
}
@Test
fun `token contains unique signature`() {
val signatures = listOf("one", "two").stream()
.map { createToken(it) }
.map { it.split(".")[2] }
.map { base64Decoder.decode(it) }
.toList()
assertEquals(2, signatures.size)
signatures.forEach {
assertEquals(32, it.size)
}
assertFalse("Unique", signatures[0].contentEquals(signatures[1]))
}
@Test
fun `token header contains algorithm`() {
val token = createToken()
assertEquals("HS256", parseTokenHeader(token)["alg"])
}
@Test
fun `token header contains type`() {
val token = createToken()
assertEquals("JWT", parseTokenHeader(token)["typ"])
}
@Test
fun `token body contains subject`() {
val token = createToken()
assertEquals("jitsi-server-domain", parseTokenBody(token)["sub"])
}
@Test
fun `token body contains issuer`() {
val token = createToken()
assertEquals("jitsi-server-domain", parseTokenBody(token)["iss"])
}
@Test
fun `token body contains audience`() {
val token = createToken()
assertEquals("https://jitsi-server-domain", parseTokenBody(token)["aud"])
}
@Test
fun `token body contains room claim`() {
val token = createToken()
assertEquals("*", parseTokenBody(token)["room"])
}
@Test
fun `token body contains matrix data`() {
val token = createToken()
assertEquals(mutableMapOf("room_id" to "room-id", "server_name" to "matrix-server-name", "token" to "matrix-token"), parseMatrixData(token))
}
@Test
fun `token body contains user data`() {
val token = createToken()
assertEquals(mutableMapOf("name" to "user-display-name", "avatar" to "user-avatar-url"), parseUserData(token))
}
private fun createToken(): String {
return createToken("matrix-token")
}
private fun createToken(accessToken: String): String {
val openIdToken = OpenIdToken(accessToken, "matrix-token-type", "matrix-server-name", -1)
return factory.create(openIdToken, "jitsi-server-domain", "room-id", "user-avatar-url", "user-display-name")
}
private fun parseTokenHeader(token: String): Map<String, String> {
return parseTokenPart(token.split(".")[0], stringToString)
}
private fun parseTokenBody(token: String): Map<String, Any> {
return parseTokenPart(token.split(".")[1], stringToAny)
}
private fun parseMatrixData(token: String): Map<*, *> {
return (parseTokenBody(token)["context"] as Map<*, *>)["matrix"] as Map<*, *>
}
private fun parseUserData(token: String): Map<*, *> {
return (parseTokenBody(token)["context"] as Map<*, *>)["user"] as Map<*, *>
}
private fun <T> parseTokenPart(value: String, type: ParameterizedType): T {
val decoded = String(base64Decoder.decode(value))
val adapter: JsonAdapter<T> = moshi.adapter(type)
return adapter.fromJson(decoded)!!
}
}

View File

@ -75,10 +75,15 @@ class FakeSharedSecretStorageService : SharedSecretStorageService by mockk() {
override fun checkShouldBeAbleToAccessSecrets(secretNames: List<String>, keyId: String?) = integrityResult
@Deprecated("Requesting custom secrets not yet support by rust stack, prefer requestMissingSecrets")
override suspend fun requestSecret(name: String, myOtherDeviceId: String) {
TODO("Not yet implemented")
}
override suspend fun requestMissingSecrets() {
TODO("Not yet implemented")
}
fun givenIsRecoverySetupReturns(isRecoverySetup: Boolean) {
every { isRecoverySetup() } returns isRecoverySetup
}