diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..e552f5fd43 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,23 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + # Updates for Github Actions used in the repo + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + # Updates for Gradle dependencies used in the app + - package-ecosystem: gradle + directory: "/" + schedule: + interval: "daily" + open-pull-requests-limit: 200 + reviewers: + - "bmarty" +### ignore: +### - dependency-name: com.squareup.okhttp3:logging-interceptor +### versions: "> 3.12.10" diff --git a/.idea/dictionaries/bmarty.xml b/.idea/dictionaries/bmarty.xml index 4de90e9405..4585842153 100644 --- a/.idea/dictionaries/bmarty.xml +++ b/.idea/dictionaries/bmarty.xml @@ -31,6 +31,7 @@ signin signout signup + snackbar ssss sygnal threepid diff --git a/CHANGES.md b/CHANGES.md index 1054667336..c4d4c00980 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,42 @@ +Changes in Element 1.1.1 (2021-XX-XX) +=================================================== + +Features ✨: + - + +Improvements 🙌: + - Allow non-HTTPS connections to homeservers on Tor (#2941) + - Fetch homeserver type and version and display in a new setting screen and add info in rageshakes (#2831) + - Improve initial sync performance - split into 2 transactions (#983) + - PIP support for Jitsi call (#2418) + - Add tooltip for room quick actions + - Pre-share session keys when opening a room or start typing (#2771) + - Sending is now queuing by room and not uniquely to the session + - Improve Snackbar duration (#2929) + - Improve sending message state (#2937) + +Bugfix 🐛: + - Try to fix crash about UrlPreview (#2640) + - Be robust if Event.type is missing (#2946) + - Snappier message send status + - Fix MainActivity display (#2927) + +Translations 🗣: + - All string resources and translations have been moved to the application module. Weblate project for the SDK will be removed. + +SDK API changes ⚠️: + - + +Build 🧱: + - Update a lot of dependencies, with the help of dependabot. + - Add a script to download and install APK from the CI + +Test: + - + +Other changes: + - Rework edition of event management + Changes in Element 1.1.0 (2021-02-19) =================================================== @@ -1196,7 +1235,7 @@ Mode details here: https://medium.com/@RiotChat/introducing-the-riotx-beta-for-a ======================================================= -Changes in Element 1.X.X (2021-XX-XX) +Changes in Element 1.1.X (2021-XX-XX) =================================================== Features ✨: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3464fd9e76..dd32991051 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,7 +29,7 @@ To create a new screen: - Then right click on the package, and select `New/New Vector/RiotX Feature`. - Follow the Wizard, especially replace `Main` by something more relevant to your feature. - Click on `Finish`. -- Remaining steps are described as TODO in the generated files, or will be pointed out by the compilator, or at runtime :) +- Remaining steps are described as TODO in the generated files, or will be pointed out by the compiler, or at runtime :) Note that if the templates are modified, the only things to do is to restart Android Studio for the change to take effect. diff --git a/attachment-viewer/build.gradle b/attachment-viewer/build.gradle index 5ce9f1eff6..7725bf23db 100644 --- a/attachment-viewer/build.gradle +++ b/attachment-viewer/build.gradle @@ -63,13 +63,13 @@ android { dependencies { implementation 'com.github.chrisbanes:PhotoView:2.1.4' - implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0' + implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.2.0' - implementation "androidx.recyclerview:recyclerview:1.1.0" + implementation "androidx.recyclerview:recyclerview:1.2.0-beta02" - implementation 'com.google.android.material:material:1.2.1' + implementation 'com.google.android.material:material:1.3.0' } \ No newline at end of file diff --git a/attachment-viewer/src/main/res/layout/view_image_attachment.xml b/attachment-viewer/src/main/res/layout/view_image_attachment.xml deleted file mode 100644 index 3518a4472d..0000000000 --- a/attachment-viewer/src/main/res/layout/view_image_attachment.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 3da87093ec..ec7ec8c1de 100644 --- a/build.gradle +++ b/build.gradle @@ -2,8 +2,8 @@ buildscript { // Ref: https://kotlinlang.org/releases.html - ext.kotlin_version = '1.4.21' - ext.kotlin_coroutines_version = "1.4.1" + ext.kotlin_version = '1.4.31' + ext.kotlin_coroutines_version = "1.4.2" repositories { google() jcenter() @@ -15,8 +15,9 @@ buildscript { classpath 'com.android.tools.build:gradle:4.1.2' classpath 'com.google.gms:google-services:4.3.5' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.7.1' + classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.1.1' classpath 'com.google.android.gms:oss-licenses-plugin:0.10.2' + classpath "com.likethesalad.android:string-reference:1.2.1" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/fastlane/metadata/android/ca/changelogs/40101000.txt b/fastlane/metadata/android/ca/changelogs/40101000.txt new file mode 100644 index 0000000000..2c651e1801 --- /dev/null +++ b/fastlane/metadata/android/ca/changelogs/40101000.txt @@ -0,0 +1,2 @@ +Canvis principals d'aquesta versió: millora de VoIP (trucades i videotrucades en xats personals) i correcció d'errors! +Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/cs/changelogs/40100130.txt b/fastlane/metadata/android/cs/changelogs/40100130.txt index 0e90f17e8b..bf44ad40e0 100644 --- a/fastlane/metadata/android/cs/changelogs/40100130.txt +++ b/fastlane/metadata/android/cs/changelogs/40100130.txt @@ -1,2 +1,2 @@ Hlavní změny v této verzi: Náhled URL, nová klávesice s Emoji, nové možnosti nastavení místností a sníh na vánoce! -Plné znění změn: https://github.com/vector-im/element-android/releases/tag/v1.0.12 +Plné znění změn: https://github.com/vector-im/element-android/releases/tag/v1.0.13 diff --git a/fastlane/metadata/android/cs/changelogs/40100140.txt b/fastlane/metadata/android/cs/changelogs/40100140.txt new file mode 100644 index 0000000000..2c9c568c8d --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/40100140.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Úpravy práv místností, automatický tmavý/světlý vzhled a řada oprav chyb. +Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.0.14 diff --git a/fastlane/metadata/android/cs/changelogs/40100150.txt b/fastlane/metadata/android/cs/changelogs/40100150.txt new file mode 100644 index 0000000000..7976d97411 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/40100150.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Podpora přihlášení v sociálních sítích. +Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.0.15 diff --git a/fastlane/metadata/android/cs/changelogs/40100160.txt b/fastlane/metadata/android/cs/changelogs/40100160.txt new file mode 100644 index 0000000000..2cc6c65207 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/40100160.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Podpora přihlášení v sociálních sítích. +Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.0.15 a https://github.com/vector-im/element-android/releases/tag/v1.0.16 diff --git a/fastlane/metadata/android/cs/changelogs/40100170.txt b/fastlane/metadata/android/cs/changelogs/40100170.txt new file mode 100644 index 0000000000..693ff3fbaf --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/40100170.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Opravy chyb! +Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.0.17 diff --git a/fastlane/metadata/android/cs/changelogs/40101000.txt b/fastlane/metadata/android/cs/changelogs/40101000.txt new file mode 100644 index 0000000000..7c1e140601 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/40101000.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: VoIP (audio a video hovory v DM), vylepšení a opravy chyb! +Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/cs/full_description.txt b/fastlane/metadata/android/cs/full_description.txt index 50ca0ac171..f9c1f2ad0c 100644 --- a/fastlane/metadata/android/cs/full_description.txt +++ b/fastlane/metadata/android/cs/full_description.txt @@ -1,30 +1,30 @@ -Element je nový typ aplikace pro výměnu zpráv a kolaboraci, která: +Element je nový typ aplikace pro výměnu zpráv a spolupráci, která: -1. Vám dá moc zachovat si soukromí -2. Vás nechá komunikovat s kýmkoli v síti Matrix a dokonce dále integrací s aplikacemi jako Slack -3. Vás ochrání před inzercí, těžbou dat a uzavřenými zahradami -4. Vás zabezpečí šifrováním end-to-end s křížovým podepisováním pro ověření ostatních +1. Vám dá kontrolu nad ochranou vašeho soukromí +2. Umožní vám komunikovat s kýmkoli v síti Matrix a dokonce i mimo ni pomocí integrací s aplikacemi, jako je Slack +3. Ochrání vás před inzercí, dataminingem a uzavřenými zahradami +4. Zabezpečí vás end-to-end šifrováním s křížovým podpisem pro ověření ostatních -Element is completely different from other messaging and collaboration apps because it is decentralised and open source. +Element je zcela odlišný od ostatních aplikací pro zasílání zpráv a spolupráci, protože je decentralizovaný a otevřený. -Element lets you self-host - or choose a host - so that you have privacy, ownership and control of your data and conversations. It gives you access to an open network; so you’re not just stuck speaking to other Element users only. And it is very secure. +Element vám umožňuje použít vlastní domovský server - nebo si vybrat hostitele - abyste měli soukromí, vlastnictví a kontrolu nad svými daty a konverzacemi. Poskytuje vám přístup k otevřené síti; takže nejste zaseknuti jen při konverzaci s ostatními uživateli Elementu. A je velmi bezpečný. -Element is able to do all this because it operates on Matrix - the standard for open, decentralised communication. +Element je toho všeho schopen, protože pracuje na Matrixu - standardu otevřené, decentralizované komunikace. -Element puts you in control by letting you choose who hosts your conversations. From the Element app, you can choose to host in different ways: +Element vám dává kontrolu nad tím, že si můžete vybrat, kdo bude hostovat vaše konverzace. Z aplikace Element si můžete vybrat hostování různými způsoby: -1. Get a free account on the matrix.org public server hosted by the Matrix developers, or choose from thousands of public servers hosted by volunteers -2. Self-host your account by running a server on your own hardware -3. Sign up for an account on a custom server by simply subscribing to the Element Matrix Services hosting platform +1. Získejte zdarma účet na veřejném serveru matrix.org hostovaném vývojáři Matrixu, nebo si vyberte z tisíců veřejných serverů hostovaných dobrovolníky +2. Hostujte svůj účet spuštěním serveru na svém vlastním hardwaru +3. Zaregistrujte si účet na vlastním serveru jednoduchým přihlášením k hostitelské platformě Element Matrix Services -Why choose Element? +Proč zvolit Element? -OWN YOUR DATA: You decide where to keep your data and messages. You own it and control it, not some MEGACORP that mines your data or gives access to third parties. +VLASTNĚTE SVÁ DATA: Vy rozhodnete, kde svá data a zprávy ponecháte. Vlastníte je a jsou pod vaší kontrolou, ne nějaký MEGACORP, který těží vaše data nebo poskytuje přístup třetím stranám. -OPEN MESSAGING AND COLLABORATION: You can chat with anyone else in the Matrix network, whether they’re using Element or another Matrix app, and even if they are using a different messaging system of the likes of Slack, IRC or XMPP. +ZPRÁVY A SPOLUPRÁCE: Můžete chatovat s kýmkoli v síti Matrix, ať už používá Element nebo jinou aplikaci, a to i v případě, že používají jiný systém zasílání zpráv, jako je Slack, IRC nebo XMPP. -SUPER-SECURE: Real end-to-end encryption (only those in the conversation can decrypt messages), and cross-signing to verify the devices of conversation participants. +MAXIMÁLNĚ BEZPEČNÉ: Skutečné šifrování typu end-to-end (pouze ti v konverzaci mohou dešifrovat zprávy) a křížové podepisování k ověření zařízení účastníků konverzace. -COMPLETE COMMUNICATION: Messaging, voice and video calls, file sharing, screen sharing and a whole bunch of integrations, bots and widgets. Build rooms, communities, stay in touch and get things done. +KOMPLETNÍ KOMUNIKACE: Zprávy, hlasové hovory a videohovory, sdílení souborů, sdílení obrazovky a celá řada integrací, robotů a widgetů. Budujte místnosti, komunity, zůstaňte v kontaktu a spolupracujte. -EVERYWHERE YOU ARE: Stay in touch wherever you are with fully synchronised message history across all your devices and on the web at https://app.element.io. +KDEKOLIV JSTE: Zůstaňte v kontaktu, ať jste kdekoli, s plně synchronizovanou historií zpráv na všech vašich zařízeních a na webu na adrese https://app.element.io. diff --git a/fastlane/metadata/android/cs/short_description.txt b/fastlane/metadata/android/cs/short_description.txt index 0e62a3e249..a654a9ea6a 100644 --- a/fastlane/metadata/android/cs/short_description.txt +++ b/fastlane/metadata/android/cs/short_description.txt @@ -1 +1 @@ -Zabezpečený decentralizovaný chat & VoIP. Uchovejte svá data v bezpečí. +Zabezpečený decentralizovaný chat a VoIP. Uchovejte svá data v bezpečí. diff --git a/fastlane/metadata/android/de/changelogs/40101000.txt b/fastlane/metadata/android/de/changelogs/40101000.txt new file mode 100644 index 0000000000..03a85ba86a --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/40101000.txt @@ -0,0 +1,2 @@ +Hauptänderungen in dieser Version: VoIP-Verbesserung (Audio- und Video-Anrufe in Direktnachrichten) und Fehlerkorrekturen! +Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/en-US/changelogs/40101010.txt b/fastlane/metadata/android/en-US/changelogs/40101010.txt new file mode 100644 index 0000000000..e411a6889c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40101010.txt @@ -0,0 +1,2 @@ +Main changes in this version: performance improvement and bug fixes! +Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.1 \ No newline at end of file diff --git a/fastlane/metadata/android/et/changelogs/40101000.txt b/fastlane/metadata/android/et/changelogs/40101000.txt new file mode 100644 index 0000000000..4d3facffc8 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40101000.txt @@ -0,0 +1,2 @@ +Olulisemad muutused selles versioonis: Heli- ja videokõnede parandused otsevestluses ning üldised veaparandused! +Muudatuste logi täismahus: https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/fi/changelogs/40100120.txt b/fastlane/metadata/android/fi/changelogs/40100120.txt index 19b06d436a..cc47bb0ceb 100644 --- a/fastlane/metadata/android/fi/changelogs/40100120.txt +++ b/fastlane/metadata/android/fi/changelogs/40100120.txt @@ -1,2 +1,2 @@ -Tärkeimmät muutokset tässä versiossa: URL-esikatselu, uusi emoji-näppäimistö, uudet huoneasetukset ja lunta jouluna! +Tärkeimmät muutokset tässä versiossa: URL-esikatselu, uusi emoji-näppäimistö, uudet huoneasetukset ja lunta jouluksi! Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.12 diff --git a/fastlane/metadata/android/fi/changelogs/40100130.txt b/fastlane/metadata/android/fi/changelogs/40100130.txt index 19b06d436a..f96792957b 100644 --- a/fastlane/metadata/android/fi/changelogs/40100130.txt +++ b/fastlane/metadata/android/fi/changelogs/40100130.txt @@ -1,2 +1,2 @@ -Tärkeimmät muutokset tässä versiossa: URL-esikatselu, uusi emoji-näppäimistö, uudet huoneasetukset ja lunta jouluna! -Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.12 +Tärkeimmät muutokset tässä versiossa: URL-esikatselu, uusi emoji-näppäimistö, uudet huoneasetukset ja lunta jouluksi! +Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.13 diff --git a/fastlane/metadata/android/fi/changelogs/40100140.txt b/fastlane/metadata/android/fi/changelogs/40100140.txt new file mode 100644 index 0000000000..b01b7e7325 --- /dev/null +++ b/fastlane/metadata/android/fi/changelogs/40100140.txt @@ -0,0 +1,2 @@ +Tärkeimmät muutokset tässä versiossa: Huoneoikeuksien muokkaus, automaattinen valoisa/tumma teema ja läjäpäin virheenkorjauksia. +Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.14 diff --git a/fastlane/metadata/android/fi/changelogs/40100150.txt b/fastlane/metadata/android/fi/changelogs/40100150.txt new file mode 100644 index 0000000000..6ae0b1abf4 --- /dev/null +++ b/fastlane/metadata/android/fi/changelogs/40100150.txt @@ -0,0 +1,2 @@ +Tärkeimmät muutokset tässä versiossa: Social Login -tuki. +Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.15 diff --git a/fastlane/metadata/android/fi/changelogs/40100160.txt b/fastlane/metadata/android/fi/changelogs/40100160.txt new file mode 100644 index 0000000000..ab143642a8 --- /dev/null +++ b/fastlane/metadata/android/fi/changelogs/40100160.txt @@ -0,0 +1,2 @@ +Tärkeimmät muutokset tässä versiossa: Social Login -tuki. +Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16 diff --git a/fastlane/metadata/android/fi/changelogs/40100170.txt b/fastlane/metadata/android/fi/changelogs/40100170.txt new file mode 100644 index 0000000000..22a851b495 --- /dev/null +++ b/fastlane/metadata/android/fi/changelogs/40100170.txt @@ -0,0 +1,2 @@ +Tärkeimmät muutokset tässä versiossa: Virheenkorjauksia! +Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.17 diff --git a/fastlane/metadata/android/nb_NO/changelogs/40100100.txt b/fastlane/metadata/android/nb-NO/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/nb_NO/changelogs/40100100.txt rename to fastlane/metadata/android/nb-NO/changelogs/40100100.txt diff --git a/fastlane/metadata/android/nb_NO/changelogs/40100110.txt b/fastlane/metadata/android/nb-NO/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/nb_NO/changelogs/40100110.txt rename to fastlane/metadata/android/nb-NO/changelogs/40100110.txt diff --git a/fastlane/metadata/android/nb_NO/short_description.txt b/fastlane/metadata/android/nb-NO/short_description.txt similarity index 100% rename from fastlane/metadata/android/nb_NO/short_description.txt rename to fastlane/metadata/android/nb-NO/short_description.txt diff --git a/fastlane/metadata/android/nb_NO/title.txt b/fastlane/metadata/android/nb-NO/title.txt similarity index 100% rename from fastlane/metadata/android/nb_NO/title.txt rename to fastlane/metadata/android/nb-NO/title.txt diff --git a/fastlane/metadata/android/pt_BR/changelogs/40100100.txt b/fastlane/metadata/android/pt-BR/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/changelogs/40100100.txt rename to fastlane/metadata/android/pt-BR/changelogs/40100100.txt diff --git a/fastlane/metadata/android/pt_BR/changelogs/40100110.txt b/fastlane/metadata/android/pt-BR/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/changelogs/40100110.txt rename to fastlane/metadata/android/pt-BR/changelogs/40100110.txt diff --git a/fastlane/metadata/android/pt_BR/changelogs/40100120.txt b/fastlane/metadata/android/pt-BR/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/changelogs/40100120.txt rename to fastlane/metadata/android/pt-BR/changelogs/40100120.txt diff --git a/fastlane/metadata/android/pt_BR/changelogs/40100130.txt b/fastlane/metadata/android/pt-BR/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/changelogs/40100130.txt rename to fastlane/metadata/android/pt-BR/changelogs/40100130.txt diff --git a/fastlane/metadata/android/pt_BR/changelogs/40100140.txt b/fastlane/metadata/android/pt-BR/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/changelogs/40100140.txt rename to fastlane/metadata/android/pt-BR/changelogs/40100140.txt diff --git a/fastlane/metadata/android/pt_BR/changelogs/40100150.txt b/fastlane/metadata/android/pt-BR/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/changelogs/40100150.txt rename to fastlane/metadata/android/pt-BR/changelogs/40100150.txt diff --git a/fastlane/metadata/android/pt_BR/changelogs/40100160.txt b/fastlane/metadata/android/pt-BR/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/changelogs/40100160.txt rename to fastlane/metadata/android/pt-BR/changelogs/40100160.txt diff --git a/fastlane/metadata/android/pt-BR/changelogs/40100170.txt b/fastlane/metadata/android/pt-BR/changelogs/40100170.txt new file mode 100644 index 0000000000..15081f160f --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40100170.txt @@ -0,0 +1,2 @@ +Principais mudanças nessa versão: correções de erros! +Registro de todas as alterações: https://github.com/vector-im/element-android/releases/tag/v1.0.17 diff --git a/fastlane/metadata/android/pt_BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/full_description.txt rename to fastlane/metadata/android/pt-BR/full_description.txt diff --git a/fastlane/metadata/android/pt_BR/short_description.txt b/fastlane/metadata/android/pt-BR/short_description.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/short_description.txt rename to fastlane/metadata/android/pt-BR/short_description.txt diff --git a/fastlane/metadata/android/pt_BR/title.txt b/fastlane/metadata/android/pt-BR/title.txt similarity index 100% rename from fastlane/metadata/android/pt_BR/title.txt rename to fastlane/metadata/android/pt-BR/title.txt diff --git a/fastlane/metadata/android/ru/changelogs/40100170.txt b/fastlane/metadata/android/ru/changelogs/40100170.txt new file mode 100644 index 0000000000..0e636dc4dc --- /dev/null +++ b/fastlane/metadata/android/ru/changelogs/40100170.txt @@ -0,0 +1,2 @@ +Основные изменения в этой версии: Исправлены ошибки! +Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.0.17 diff --git a/fastlane/metadata/android/si/title.txt b/fastlane/metadata/android/si/title.txt new file mode 100644 index 0000000000..83955cd75e --- /dev/null +++ b/fastlane/metadata/android/si/title.txt @@ -0,0 +1 @@ +ඉලෙමන්ට් (මීට පෙර Riot.im) diff --git a/fastlane/metadata/android/sv/changelogs/40100170.txt b/fastlane/metadata/android/sv/changelogs/40100170.txt new file mode 100644 index 0000000000..37f027d054 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/40100170.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Buggfixar! +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.17 diff --git a/fastlane/metadata/android/sv/changelogs/40101000.txt b/fastlane/metadata/android/sv/changelogs/40101000.txt new file mode 100644 index 0000000000..1a5944da88 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/40101000.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Förbättringar för VoIP (ljud- och videosamtal i DM) och buggfixar! +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/uk/changelogs/40101000.txt b/fastlane/metadata/android/uk/changelogs/40101000.txt new file mode 100644 index 0000000000..36870f5ef7 --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40101000.txt @@ -0,0 +1,2 @@ +Основні зміни в цій версії: поліпшення VoIP (аудіо та відео дзвінки в DM) та виправлення помилок! +Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/zh_Hans/changelogs/40100100.txt b/fastlane/metadata/android/zh-Hans/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/zh_Hans/changelogs/40100100.txt rename to fastlane/metadata/android/zh-Hans/changelogs/40100100.txt diff --git a/fastlane/metadata/android/zh_Hans/changelogs/40100110.txt b/fastlane/metadata/android/zh-Hans/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/zh_Hans/changelogs/40100110.txt rename to fastlane/metadata/android/zh-Hans/changelogs/40100110.txt diff --git a/fastlane/metadata/android/zh_Hans/full_description.txt b/fastlane/metadata/android/zh-Hans/full_description.txt similarity index 100% rename from fastlane/metadata/android/zh_Hans/full_description.txt rename to fastlane/metadata/android/zh-Hans/full_description.txt diff --git a/fastlane/metadata/android/zh_Hans/short_description.txt b/fastlane/metadata/android/zh-Hans/short_description.txt similarity index 100% rename from fastlane/metadata/android/zh_Hans/short_description.txt rename to fastlane/metadata/android/zh-Hans/short_description.txt diff --git a/fastlane/metadata/android/zh_Hans/title.txt b/fastlane/metadata/android/zh-Hans/title.txt similarity index 100% rename from fastlane/metadata/android/zh_Hans/title.txt rename to fastlane/metadata/android/zh-Hans/title.txt diff --git a/fastlane/metadata/android/zh_Hant/changelogs/40100100.txt b/fastlane/metadata/android/zh-Hant/changelogs/40100100.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/changelogs/40100100.txt rename to fastlane/metadata/android/zh-Hant/changelogs/40100100.txt diff --git a/fastlane/metadata/android/zh_Hant/changelogs/40100110.txt b/fastlane/metadata/android/zh-Hant/changelogs/40100110.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/changelogs/40100110.txt rename to fastlane/metadata/android/zh-Hant/changelogs/40100110.txt diff --git a/fastlane/metadata/android/zh_Hant/changelogs/40100120.txt b/fastlane/metadata/android/zh-Hant/changelogs/40100120.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/changelogs/40100120.txt rename to fastlane/metadata/android/zh-Hant/changelogs/40100120.txt diff --git a/fastlane/metadata/android/zh_Hant/changelogs/40100130.txt b/fastlane/metadata/android/zh-Hant/changelogs/40100130.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/changelogs/40100130.txt rename to fastlane/metadata/android/zh-Hant/changelogs/40100130.txt diff --git a/fastlane/metadata/android/zh_Hant/changelogs/40100140.txt b/fastlane/metadata/android/zh-Hant/changelogs/40100140.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/changelogs/40100140.txt rename to fastlane/metadata/android/zh-Hant/changelogs/40100140.txt diff --git a/fastlane/metadata/android/zh_Hant/changelogs/40100150.txt b/fastlane/metadata/android/zh-Hant/changelogs/40100150.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/changelogs/40100150.txt rename to fastlane/metadata/android/zh-Hant/changelogs/40100150.txt diff --git a/fastlane/metadata/android/zh_Hant/changelogs/40100160.txt b/fastlane/metadata/android/zh-Hant/changelogs/40100160.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/changelogs/40100160.txt rename to fastlane/metadata/android/zh-Hant/changelogs/40100160.txt diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40100170.txt b/fastlane/metadata/android/zh-Hant/changelogs/40100170.txt new file mode 100644 index 0000000000..35b8a54110 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/40100170.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:錯誤修復! +完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.17 diff --git a/fastlane/metadata/android/zh-Hant/changelogs/40101000.txt b/fastlane/metadata/android/zh-Hant/changelogs/40101000.txt new file mode 100644 index 0000000000..3d5049ad65 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/40101000.txt @@ -0,0 +1,2 @@ +此版本的主要變更:VoIP(直接訊息中的音訊與視訊通話)改善與錯誤修復! +完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.0 diff --git a/fastlane/metadata/android/zh_Hant/full_description.txt b/fastlane/metadata/android/zh-Hant/full_description.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/full_description.txt rename to fastlane/metadata/android/zh-Hant/full_description.txt diff --git a/fastlane/metadata/android/zh_Hant/short_description.txt b/fastlane/metadata/android/zh-Hant/short_description.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/short_description.txt rename to fastlane/metadata/android/zh-Hant/short_description.txt diff --git a/fastlane/metadata/android/zh_Hant/title.txt b/fastlane/metadata/android/zh-Hant/title.txt similarity index 100% rename from fastlane/metadata/android/zh_Hant/title.txt rename to fastlane/metadata/android/zh-Hant/title.txt diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 30d5f428d7..6e61ea7487 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ -#Fri Jan 29 18:05:42 CET 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=1433372d903ffba27496f8d5af24265310d2da0d78bf6b4e5138831d4fe066e9 -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-all.zip +distributionSha256Sum=9af5c8e7e2cd1a3b0f694a4ac262b9f38c75262e74a9e8b5101af302a6beadd7 +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/matrix-sdk-android-rx/build.gradle b/matrix-sdk-android-rx/build.gradle index 0e899e21ff..37b0ff8d00 100644 --- a/matrix-sdk-android-rx/build.gradle +++ b/matrix-sdk-android-rx/build.gradle @@ -36,7 +36,7 @@ android { dependencies { implementation project(":matrix-sdk-android") implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0' + implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$kotlin_coroutines_version" diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle index dca19e7755..c9918cceaf 100644 --- a/matrix-sdk-android/build.gradle +++ b/matrix-sdk-android/build.gradle @@ -9,7 +9,7 @@ buildscript { jcenter() } dependencies { - classpath "io.realm:realm-gradle-plugin:10.1.2" + classpath "io.realm:realm-gradle-plugin:10.3.1" } } @@ -112,9 +112,9 @@ dependencies { def lifecycle_version = '2.2.0' def arch_version = '2.1.0' def markwon_version = '3.1.0' - def daggerVersion = '2.31' - def work_version = '2.4.0' - def retrofit_version = '2.6.2' + def daggerVersion = '2.33' + def work_version = '2.5.0' + def retrofit_version = '2.9.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" @@ -130,7 +130,7 @@ dependencies { implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version" - implementation(platform("com.squareup.okhttp3:okhttp-bom:4.8.1")) + implementation(platform("com.squareup.okhttp3:okhttp-bom:4.9.1")) implementation 'com.squareup.okhttp3:okhttp' implementation 'com.squareup.okhttp3:logging-interceptor' implementation 'com.squareup.okhttp3:okhttp-urlconnection' @@ -141,11 +141,11 @@ dependencies { implementation "ru.noties.markwon:core:$markwon_version" // Image - implementation 'androidx.exifinterface:exifinterface:1.3.1' + implementation 'androidx.exifinterface:exifinterface:1.3.2' // Database implementation 'com.github.Zhuinden:realm-monarchy:0.7.1' - kapt 'dk.ilios:realmfieldnameshelper:1.1.1' + kapt 'dk.ilios:realmfieldnameshelper:2.0.0' // Work implementation "androidx.work:work-runtime-ktx:$work_version" @@ -155,7 +155,7 @@ dependencies { implementation "io.arrow-kt:arrow-instances-core:$arrow_version" // olm lib is now hosted by jitpack: https://jitpack.io/#org.matrix.gitlab.matrix-org/olm - implementation 'org.matrix.gitlab.matrix-org:olm:3.1.2' + implementation 'org.matrix.gitlab.matrix-org:olm:3.2.2' // DI implementation "com.google.dagger:dagger:$daggerVersion" @@ -166,14 +166,14 @@ dependencies { implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1' // Phone number https://github.com/google/libphonenumber - implementation 'com.googlecode.libphonenumber:libphonenumber:8.10.23' + implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.19' - testImplementation 'junit:junit:4.13' - testImplementation 'org.robolectric:robolectric:4.3' + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.robolectric:robolectric:4.5.1' //testImplementation 'org.robolectric:shadows-support-v4:3.0' // Note: version sticks to 1.9.2 due to https://github.com/mockk/mockk/issues/281 - testImplementation 'io.mockk:mockk:1.9.2.kotlin12' - testImplementation 'org.amshove.kluent:kluent-android:1.61' + testImplementation 'io.mockk:mockk:1.10.6' + testImplementation 'org.amshove.kluent:kluent-android:1.65' testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" // Plant Timber tree for test testImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1' @@ -186,7 +186,7 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' androidTestImplementation 'org.amshove.kluent:kluent-android:1.61' // Note: version sticks to 1.9.2 due to https://github.com/mockk/mockk/issues/281 - androidTestImplementation 'io.mockk:mockk-android:1.9.2.kotlin12' + androidTestImplementation 'io.mockk:mockk-android:1.10.6' androidTestImplementation "androidx.arch.core:core-testing:$arch_version" androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" // Plant Timber tree for test diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt index c677d91f0a..287a4233d9 100644 --- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt @@ -19,6 +19,15 @@ package org.matrix.android.sdk.common import android.content.Context import android.net.Uri import androidx.lifecycle.Observer +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertTrue import org.matrix.android.sdk.api.Matrix import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.MatrixConfiguration @@ -34,15 +43,6 @@ import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings import org.matrix.android.sdk.api.session.sync.SyncState -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withTimeout -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull -import org.junit.Assert.assertTrue import java.util.ArrayList import java.util.UUID import java.util.concurrent.CountDownLatch @@ -59,7 +59,13 @@ class CommonTestHelper(context: Context) { fun getTestInterceptor(session: Session): MockOkHttpInterceptor? = TestNetworkModule.interceptorForSession(session.sessionId) as? MockOkHttpInterceptor init { - Matrix.initialize(context, MatrixConfiguration("TestFlavor")) + Matrix.initialize( + context, + MatrixConfiguration( + applicationFlavor = "TestFlavor", + roomDisplayNameFallbackProvider = TestRoomDisplayNameFallbackProvider() + ) + ) matrix = Matrix.getInstance(context) } @@ -385,8 +391,8 @@ fun List.checkSendOrder(baseTextMessage: String, numberOfMessages return drop(startIndex) .take(numberOfMessages) .foldRightIndexed(true) { index, timelineEvent, acc -> - val body = timelineEvent.root.content.toModel()?.body - val currentMessageSuffix = numberOfMessages - index - acc && (body == null || body.startsWith(baseTextMessage) && body.endsWith("#$currentMessageSuffix")) - } + val body = timelineEvent.root.content.toModel()?.body + val currentMessageSuffix = numberOfMessages - index + acc && (body == null || body.startsWith(baseTextMessage) && body.endsWith("#$currentMessageSuffix")) + } } diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestRoomDisplayNameFallbackProvider.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestRoomDisplayNameFallbackProvider.kt new file mode 100644 index 0000000000..7a1d4604f0 --- /dev/null +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestRoomDisplayNameFallbackProvider.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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.common + +import org.matrix.android.sdk.api.RoomDisplayNameFallbackProvider + +class TestRoomDisplayNameFallbackProvider() : RoomDisplayNameFallbackProvider { + + override fun getNameForRoomInvite() = + "Room invite" + + override fun getNameForEmptyRoom() = + "Empty room" + + override fun getNameFor2members(name1: String?, name2: String?) = + "$name1 and $name2" + + override fun getNameFor3members(name1: String?, name2: String?, name3: String?) = + "$name1, $name2 and $name3" + + override fun getNameFor4members(name1: String?, name2: String?, name3: String?, name4: String?) = + "$name1, $name2, $name3 and $name4" + + override fun getNameFor4membersAndMore(name1: String?, name2: String?, name3: String?, remainingCount: Int) = + "$name1, $name2, $name3 and $remainingCount others" +} diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/PreShareKeysTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/PreShareKeysTest.kt new file mode 100644 index 0000000000..122584142e --- /dev/null +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/PreShareKeysTest.kt @@ -0,0 +1,103 @@ +/* + * Copyright 2020 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.crypto + +import android.util.Log +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.FixMethodOrder +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.matrix.android.sdk.InstrumentedTest +import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.common.CommonTestHelper +import org.matrix.android.sdk.common.CryptoTestHelper +import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent +import org.matrix.android.sdk.internal.crypto.model.event.RoomKeyContent +import kotlin.test.assertEquals +import kotlin.test.assertNotNull + +@RunWith(AndroidJUnit4::class) +@FixMethodOrder(MethodSorters.JVM) +class PreShareKeysTest : InstrumentedTest { + + private val mTestHelper = CommonTestHelper(context()) + private val mCryptoTestHelper = CryptoTestHelper(mTestHelper) + + @Test + fun ensure_outbound_session_happy_path() { + val testData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true) + val e2eRoomID = testData.roomId + val aliceSession = testData.firstSession + val bobSession = testData.secondSession!! + + // clear any outbound session + aliceSession.cryptoService().discardOutboundSession(e2eRoomID) + + val preShareCount = bobSession.cryptoService().getGossipingEvents().count { + it.senderId == aliceSession.myUserId + && it.getClearType() == EventType.ROOM_KEY + } + + assertEquals(0, preShareCount, "Bob should not have receive any key from alice at this point") + Log.d("#Test", "Room Key Received from alice $preShareCount") + + // Force presharing of new outbound key + mTestHelper.doSync { + aliceSession.cryptoService().prepareToEncrypt(e2eRoomID, it) + } + + mTestHelper.waitWithLatch { latch -> + mTestHelper.retryPeriodicallyWithLatch(latch) { + val newGossipCount = bobSession.cryptoService().getGossipingEvents().count { + it.senderId == aliceSession.myUserId + && it.getClearType() == EventType.ROOM_KEY + } + newGossipCount > preShareCount + } + } + + val latest = bobSession.cryptoService().getGossipingEvents().lastOrNull { + it.senderId == aliceSession.myUserId + && it.getClearType() == EventType.ROOM_KEY + } + + val content = latest?.getClearContent().toModel() + assertNotNull(content, "Bob should have received and decrypted a room key event from alice") + assertEquals(e2eRoomID, content.roomId, "Wrong room") + val megolmSessionId = content.sessionId!! + + val sharedIndex = aliceSession.cryptoService().getSharedWithInfo(e2eRoomID, megolmSessionId) + .getObject(bobSession.myUserId, bobSession.sessionParams.deviceId) + + assertEquals(0, sharedIndex, "The session received by bob should match what alice sent") + + // Just send a real message as test + val sentEvent = mTestHelper.sendTextMessage(aliceSession.getRoom(e2eRoomID)!!, "Allo", 1).first() + + assertEquals(megolmSessionId, sentEvent.root.content.toModel()?.sessionId, "Unexpected megolm session") + mTestHelper.waitWithLatch { latch -> + mTestHelper.retryPeriodicallyWithLatch(latch) { + bobSession.getRoom(e2eRoomID)?.getTimeLineEvent(sentEvent.eventId)?.root?.getClearType() == EventType.MESSAGE + } + } + + mTestHelper.signOutAndClose(aliceSession) + mTestHelper.signOutAndClose(bobSession) + } +} diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/WithHeldTests.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/WithHeldTests.kt index 80cc14fcb6..b2516ea2be 100644 --- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/WithHeldTests.kt +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/WithHeldTests.kt @@ -51,7 +51,7 @@ class WithHeldTests : InstrumentedTest { // ============================= val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true)) - val bobSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true)) + val bobSession = mTestHelper.createAccount(TestConstants.USER_BOB, SessionTestParams(true)) // Initialize cross signing on both mCryptoTestHelper.initializeCrossSigning(aliceSession) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt index 93a1b962ed..ed809cdb04 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt @@ -39,7 +39,11 @@ data class MatrixConfiguration( /** * True to advertise support for call transfers to other parties on Matrix calls. */ - val supportsCallTransfer: Boolean = false + val supportsCallTransfer: Boolean = false, + /** + * RoomDisplayNameFallbackProvider to provide default room display name. + */ + val roomDisplayNameFallbackProvider: RoomDisplayNameFallbackProvider ) { /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt new file mode 100644 index 0000000000..4ac14d5f63 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 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.api + +interface RoomDisplayNameFallbackProvider { + fun getNameForRoomInvite(): String + fun getNameForEmptyRoom(): String + fun getNameFor2members(name1: String?, name2: String?): String + fun getNameFor3members(name1: String?, name2: String?, name3: String?): String + fun getNameFor4members(name1: String?, name2: String?, name3: String?, name4: String?): String + fun getNameFor4membersAndMore(name1: String?, name2: String?, name3: String?, remainingCount: Int): String +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/VerificationState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/VerificationState.kt new file mode 100644 index 0000000000..54276a6b51 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/VerificationState.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 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.api.crypto + +enum class VerificationState { + REQUEST, + WAITING, + CANCELED_BY_ME, + CANCELED_BY_OTHER, + DONE +} + +fun VerificationState.isCanceled(): Boolean { + return this == VerificationState.CANCELED_BY_ME || this == VerificationState.CANCELED_BY_OTHER +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationService.kt new file mode 100644 index 0000000000..0761ef8d21 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationService.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021 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.api.federation + +interface FederationService { + /** + * Get information about the homeserver + */ + suspend fun getFederationVersion(): FederationVersion +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationVersion.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationVersion.kt new file mode 100644 index 0000000000..2ed3f848b6 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationVersion.kt @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 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.api.federation + +/** + * Ref: https://matrix.org/docs/spec/server_server/latest#get-matrix-federation-v1-version + */ +data class FederationVersion( + /** + * Arbitrary name that identify this implementation. + */ + val name: String?, + /** + * Version of this implementation. The version format depends on the implementation. + */ + val version: String? +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt index 039025e0df..7a24ccac11 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.LiveData import okhttp3.OkHttpClient import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.failure.GlobalError +import org.matrix.android.sdk.api.federation.FederationService import org.matrix.android.sdk.api.pushrules.PushRuleService import org.matrix.android.sdk.api.session.account.AccountService import org.matrix.android.sdk.api.session.accountdata.AccountDataService @@ -34,6 +35,7 @@ import org.matrix.android.sdk.api.session.file.FileService import org.matrix.android.sdk.api.session.group.GroupService import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService import org.matrix.android.sdk.api.session.identity.IdentityService +import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService import org.matrix.android.sdk.api.session.integrationmanager.IntegrationManagerService import org.matrix.android.sdk.api.session.media.MediaService import org.matrix.android.sdk.api.session.permalinks.PermalinkService @@ -213,6 +215,11 @@ interface Session : */ fun searchService(): SearchService + /** + * Returns the federation service associated with the session + */ + fun federationService(): FederationService + /** * Returns the third party service associated with the session */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt index eead9b4ab7..1b7a5243e2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt @@ -156,4 +156,10 @@ interface CryptoService { fun getWithHeldMegolmSession(roomId: String, sessionId: String): RoomKeyWithHeldContent? fun logDbUsageInfo() + + /** + * Perform any background tasks that can be done before a message is ready to + * send, in order to speed up sending of the message. + */ + fun prepareToEncrypt(roomId: String, callback: MatrixCallback) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt index 8f9f409b74..844e8dbbab 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt @@ -66,7 +66,7 @@ inline fun T.toContent(): Content { */ @JsonClass(generateAdapter = true) data class Event( - @Json(name = "type") val type: String, + @Json(name = "type") val type: String? = null, @Json(name = "event_id") val eventId: String? = null, @Json(name = "content") val content: Content? = null, @Json(name = "prev_content") val prevContent: Content? = null, @@ -98,6 +98,19 @@ data class Event( @Transient var ageLocalTs: Long? = null + /** + * Copy all fields, including transient fields + */ + fun copyAll(): Event { + return copy().also { + it.mxDecryptionResult = mxDecryptionResult + it.mCryptoError = mCryptoError + it.mCryptoErrorReason = mCryptoErrorReason + it.sendState = sendState + it.ageLocalTs = ageLocalTs + } + } + /** * Check if event is a state event. * @return true if event is state event. @@ -135,7 +148,7 @@ data class Event( * @return the event type */ fun getClearType(): String { - return mxDecryptionResult?.payload?.get("type")?.toString() ?: type + return mxDecryptionResult?.payload?.get("type")?.toString() ?: type ?: EventType.MISSING_TYPE } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt index d79117ad87..905e18b8e8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt @@ -20,6 +20,8 @@ package org.matrix.android.sdk.api.session.events.model * Constants defining known event types from Matrix specifications. */ object EventType { + // Used when the type is missing, which should not happen + const val MISSING_TYPE = "org.matrix.android.sdk.missing_type" const val PRESENCE = "m.presence" const val MESSAGE = "m.room.message" diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilitiesService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilitiesService.kt index 2c9121ce4a..f12cbcd6db 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilitiesService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilitiesService.kt @@ -21,6 +21,11 @@ package org.matrix.android.sdk.api.session.homeserver */ interface HomeServerCapabilitiesService { + /** + * Force a refresh of the stored data + */ + suspend fun refreshHomeServerCapabilities() + /** * Get the HomeServer capabilities */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/InitSyncStep.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/InitSyncStep.kt new file mode 100644 index 0000000000..901c1b2ffb --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/InitSyncStep.kt @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 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.api.session.initsync + +enum class InitSyncStep { + ServerComputing, + Downloading, + ImportingAccount, + ImportingAccountCrypto, + ImportingAccountRoom, + ImportingAccountGroups, + ImportingAccountData, + ImportingAccountJoinedRooms, + ImportingAccountInvitedRooms, + ImportingAccountLeftRooms +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/InitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/InitialSyncProgressService.kt similarity index 83% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/InitialSyncProgressService.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/InitialSyncProgressService.kt index 09c6b8e94c..b5d4ef4dbb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/InitialSyncProgressService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/InitialSyncProgressService.kt @@ -5,7 +5,7 @@ * 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 + * 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, @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.matrix.android.sdk.api.session +package org.matrix.android.sdk.api.session.initsync -import androidx.annotation.StringRes import androidx.lifecycle.LiveData interface InitialSyncProgressService { @@ -25,7 +24,7 @@ interface InitialSyncProgressService { sealed class Status { object Idle : Status() data class Progressing( - @StringRes val statusText: Int, + val initSyncStep: InitSyncStep, val percentProgress: Int = 0 ) : Status() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomDirectoryService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomDirectoryService.kt index 55f3b76760..176de8e408 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomDirectoryService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomDirectoryService.kt @@ -16,11 +16,9 @@ package org.matrix.android.sdk.api.session.room -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse -import org.matrix.android.sdk.api.util.Cancelable /** * This interface defines methods to get and join public rooms. It's implemented at the session level. @@ -30,9 +28,8 @@ interface RoomDirectoryService { /** * Get rooms from directory */ - fun getPublicRooms(server: String?, - publicRoomsParams: PublicRoomsParams, - callback: MatrixCallback): Cancelable + suspend fun getPublicRooms(server: String?, + publicRoomsParams: PublicRoomsParams): PublicRoomsResponse /** * Get the visibility of a room in the directory diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/crypto/RoomCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/crypto/RoomCryptoService.kt index 1251fd9857..6581247b90 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/crypto/RoomCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/crypto/RoomCryptoService.kt @@ -30,4 +30,10 @@ interface RoomCryptoService { * Enable encryption of the room */ suspend fun enableEncryption(algorithm: String = MXCRYPTO_ALGORITHM_MEGOLM) + + /** + * Ensures all members of the room are loaded and outbound session keys are shared. + * If this method is not called, CryptoService will ensure it before sending events. + */ + suspend fun prepareToEncrypt() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EditAggregatedSummary.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EditAggregatedSummary.kt index 10fb81dc7f..67bab626cb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EditAggregatedSummary.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EditAggregatedSummary.kt @@ -18,7 +18,7 @@ package org.matrix.android.sdk.api.session.room.model import org.matrix.android.sdk.api.session.events.model.Content data class EditAggregatedSummary( - val aggregatedContent: Content? = null, + val latestContent: Content? = null, // The list of the eventIDs used to build the summary (might be out of sync if chunked received from message chunk) val sourceEvents: List, val localEchos: List, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/ReferencesAggregatedContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/ReferencesAggregatedContent.kt index 0947c96bb0..664d042e18 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/ReferencesAggregatedContent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/ReferencesAggregatedContent.kt @@ -17,7 +17,7 @@ package org.matrix.android.sdk.api.session.room.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass -import org.matrix.android.sdk.internal.session.room.VerificationState +import org.matrix.android.sdk.api.crypto.VerificationState /** * Contains an aggregated summary info of the references. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationService.kt index 49aa95924c..59d84ef40f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationService.kt @@ -16,7 +16,6 @@ package org.matrix.android.sdk.api.session.room.model.relation import androidx.lifecycle.LiveData -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent @@ -67,11 +66,11 @@ interface RelationService { /** * Edit a text message body. Limited to "m.text" contentType - * @param targetEventId The event to edit + * @param targetEvent The event to edit * @param newBodyText The edited body * @param compatibilityBodyText The text that will appear on clients that don't support yet edition */ - fun editTextMessage(targetEventId: String, + fun editTextMessage(targetEvent: TimelineEvent, msgType: String, newBodyText: CharSequence, newBodyAutoMarkdown: Boolean, @@ -92,8 +91,11 @@ interface RelationService { /** * Get the edit history of the given event + * The return list will contain the original event and all the editions of this event, done by the + * same sender, sorted in the reverse order (so the original event is the latest element, and the + * latest edition is the first element of the list) */ - fun fetchEditHistory(eventId: String, callback: MatrixCallback>) + suspend fun fetchEditHistory(eventId: String): List /** * Reply to an event in the timeline (must be in same room) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/powerlevels/Role.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/powerlevels/Role.kt index ecfddad0a4..5fe9bf6993 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/powerlevels/Role.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/powerlevels/Role.kt @@ -17,14 +17,11 @@ package org.matrix.android.sdk.api.session.room.powerlevels -import androidx.annotation.StringRes -import org.matrix.android.sdk.R - -sealed class Role(open val value: Int, @StringRes val res: Int) : Comparable { - object Admin : Role(100, R.string.power_level_admin) - object Moderator : Role(50, R.string.power_level_moderator) - object Default : Role(0, R.string.power_level_default) - data class Custom(override val value: Int) : Role(value, R.string.power_level_custom) +sealed class Role(open val value: Int) : Comparable { + object Admin : Role(100) + object Moderator : Role(50) + object Default : Role(0) + data class Custom(override val value: Int) : Role(value) override fun compareTo(other: Role): Int { return value.compareTo(other.value) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt index 152a018e78..6ae42de90c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/send/SendService.kt @@ -132,4 +132,9 @@ interface SendService { * Resend all failed messages one by one (and keep order) */ fun resendAllFailedMessages() + + /** + * Cancel all failed messages + */ + fun cancelAllFailedMessages() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt index 53f0e5a8d3..32f6b94cd8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt @@ -38,6 +38,9 @@ import org.matrix.android.sdk.api.util.ContentUtils.extractUsefulTextFromReply */ data class TimelineEvent( val root: Event, + /** + * Uniquely identify an event, computed locally by the sdk + */ val localId: Long, val eventId: String, val displayIndex: Int, @@ -123,8 +126,7 @@ fun TimelineEvent.getLastMessageContent(): MessageContent? { return if (root.getClearType() == EventType.STICKER) { root.getClearContent().toModel() } else { - annotations?.editSummary?.aggregatedContent?.toModel() - ?: root.getClearContent().toModel() + (annotations?.editSummary?.latestContent ?: root.getClearContent()).toModel() } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineService.kt index 2876ec69e5..3c021384e1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineService.kt @@ -36,9 +36,23 @@ interface TimelineService { */ fun createTimeline(eventId: String?, settings: TimelineSettings): Timeline + /** + * Returns a snapshot of TimelineEvent event with eventId. + * At the opposite of getTimeLineEventLive which will be updated when local echo event is synced, it will return null in this case. + * @param eventId the eventId to get the TimelineEvent + */ fun getTimeLineEvent(eventId: String): TimelineEvent? + /** + * Creates a LiveData of Optional TimelineEvent event with eventId. + * If the eventId is a local echo eventId, it will make the LiveData be updated with the synced TimelineEvent when coming through the sync. + * In this case, makes sure to use the new synced eventId from the TimelineEvent class if you want to interact, as the local echo is removed from the SDK. + * @param eventId the eventId to listen for TimelineEvent + */ fun getTimeLineEventLive(eventId: String): LiveData> + /** + * Returns a snapshot list of TimelineEvent with EventType.MESSAGE and MessageType.MSGTYPE_IMAGE or MessageType.MSGTYPE_VIDEO. + */ fun getAttachmentMessages(): List } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/FilterService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/FilterService.kt index 70de026857..6d1d12f1bc 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/FilterService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/FilterService.kt @@ -22,9 +22,9 @@ interface FilterService { NoFilter, /** - * Filter for Riot, will include only known event type + * Filter for Element, will include only known event type */ - RiotFilter + ElementFilter } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt index 67229a5eae..17d25736eb 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt @@ -53,6 +53,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomMemberContent import org.matrix.android.sdk.internal.crypto.actions.MegolmSessionDataImporter import org.matrix.android.sdk.internal.crypto.actions.SetDeviceVerificationAction import org.matrix.android.sdk.internal.crypto.algorithms.IMXEncrypting +import org.matrix.android.sdk.internal.crypto.algorithms.IMXGroupEncryption import org.matrix.android.sdk.internal.crypto.algorithms.IMXWithHeldExtension import org.matrix.android.sdk.internal.crypto.algorithms.megolm.MXMegolmEncryptionFactory import org.matrix.android.sdk.internal.crypto.algorithms.olm.MXOlmEncryptionFactory @@ -97,7 +98,6 @@ import org.matrix.olm.OlmManager import timber.log.Timber import java.util.concurrent.atomic.AtomicBoolean import javax.inject.Inject -import kotlin.jvm.Throws import kotlin.math.max /** @@ -667,7 +667,12 @@ internal class DefaultCryptoService @Inject constructor( override fun discardOutboundSession(roomId: String) { cryptoCoroutineScope.launch(coroutineDispatchers.crypto) { - roomEncryptorsStore.get(roomId)?.discardSessionKey() + val roomEncryptor = roomEncryptorsStore.get(roomId) + if (roomEncryptor is IMXGroupEncryption) { + roomEncryptor.discardSessionKey() + } else { + Timber.e("## CRYPTO | discardOutboundSession() for:$roomId: Unable to handle IMXGroupEncryption") + } } } @@ -703,7 +708,7 @@ internal class DefaultCryptoService @Inject constructor( */ @Throws(MXCryptoError::class) private fun internalDecryptEvent(event: Event, timeline: String): MXEventDecryptionResult { - return eventDecryptor.decryptEvent(event, timeline) + return eventDecryptor.decryptEvent(event, timeline) } /** @@ -1290,6 +1295,43 @@ internal class DefaultCryptoService @Inject constructor( cryptoStore.logDbUsageInfo() } + override fun prepareToEncrypt(roomId: String, callback: MatrixCallback) { + cryptoCoroutineScope.launch(coroutineDispatchers.crypto) { + Timber.d("## CRYPTO | prepareToEncrypt() : Check room members up to date") + // Ensure to load all room members + try { + loadRoomMembersTask.execute(LoadRoomMembersTask.Params(roomId)) + } catch (failure: Throwable) { + Timber.e("## CRYPTO | prepareToEncrypt() : Failed to load room members") + callback.onFailure(failure) + return@launch + } + + val userIds = getRoomUserIds(roomId) + val alg = roomEncryptorsStore.get(roomId) + ?: getEncryptionAlgorithm(roomId) + ?.let { setEncryptionInRoom(roomId, it, false, userIds) } + ?.let { roomEncryptorsStore.get(roomId) } + + if (alg == null) { + val reason = String.format(MXCryptoError.UNABLE_TO_ENCRYPT_REASON, MXCryptoError.NO_MORE_ALGORITHM_REASON) + Timber.e("## CRYPTO | prepareToEncrypt() : $reason") + callback.onFailure(IllegalArgumentException("Missing algorithm")) + return@launch + } + + runCatching { + (alg as? IMXGroupEncryption)?.preshareKey(userIds) + }.fold( + { callback.onSuccess(Unit) }, + { + Timber.e("## CRYPTO | prepareToEncrypt() failed.") + callback.onFailure(it) + } + ) + } + } + /* ========================================================================================== * For test only * ========================================================================================== */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt index 92b7728890..32324896fa 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt @@ -105,7 +105,7 @@ internal class EventDecryptor @Inject constructor( try { return alg.decryptEvent(event, timeline) } catch (mxCryptoError: MXCryptoError) { - Timber.d("## CRYPTO | internalDecryptEvent : Failed to decrypt ${event.eventId} reason: $mxCryptoError") + Timber.v("## CRYPTO | internalDecryptEvent : Failed to decrypt ${event.eventId} reason: $mxCryptoError") if (algorithm == MXCRYPTO_ALGORITHM_OLM) { if (mxCryptoError is MXCryptoError.Base && mxCryptoError.errorType == MXCryptoError.ErrorType.BAD_ENCRYPTED_MESSAGE) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/IncomingGossipingRequestManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/IncomingGossipingRequestManager.kt index c075c90eb9..4a0a274f4f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/IncomingGossipingRequestManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/IncomingGossipingRequestManager.kt @@ -28,6 +28,7 @@ import org.matrix.android.sdk.api.session.crypto.keyshare.GossipingRequestListen import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.internal.crypto.algorithms.IMXGroupEncryption import org.matrix.android.sdk.internal.crypto.crosssigning.toBase64NoPadding import org.matrix.android.sdk.internal.crypto.keysbackup.util.extractCurveKeyFromRecoveryKey import org.matrix.android.sdk.internal.crypto.model.rest.GossipingDefaultContent @@ -290,12 +291,16 @@ internal class IncomingGossipingRequestManager @Inject constructor( .also { cryptoStore.updateGossipingRequestState(request, GossipingRequestState.REJECTED) } cryptoCoroutineScope.launch(coroutineDispatchers.crypto) { - val isSuccess = roomEncryptor.reshareKey(sessionId, userId, deviceId, senderKey) + if (roomEncryptor is IMXGroupEncryption) { + val isSuccess = roomEncryptor.reshareKey(sessionId, userId, deviceId, senderKey) - if (isSuccess) { - cryptoStore.updateGossipingRequestState(request, GossipingRequestState.ACCEPTED) + if (isSuccess) { + cryptoStore.updateGossipingRequestState(request, GossipingRequestState.ACCEPTED) + } else { + cryptoStore.updateGossipingRequestState(request, GossipingRequestState.UNABLE_TO_PROCESS) + } } else { - cryptoStore.updateGossipingRequestState(request, GossipingRequestState.UNABLE_TO_PROCESS) + Timber.e("## CRYPTO | handleKeyRequestFromOtherUser() from:$userId: Unable to handle IMXGroupEncryption.reshareKey for $alg") } } cryptoStore.updateGossipingRequestState(request, GossipingRequestState.RE_REQUESTED) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/IMXEncrypting.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/IMXEncrypting.kt index fc3ea08a21..5294429198 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/IMXEncrypting.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/IMXEncrypting.kt @@ -32,34 +32,4 @@ internal interface IMXEncrypting { * @return the encrypted content */ suspend fun encryptEventContent(eventContent: Content, eventType: String, userIds: List): Content - - /** - * In Megolm, each recipient maintains a record of the ratchet value which allows - * them to decrypt any messages sent in the session after the corresponding point - * in the conversation. If this value is compromised, an attacker can similarly - * decrypt past messages which were encrypted by a key derived from the - * compromised or subsequent ratchet values. This gives 'partial' forward - * secrecy. - * - * To mitigate this issue, the application should offer the user the option to - * discard historical conversations, by winding forward any stored ratchet values, - * or discarding sessions altogether. - */ - fun discardSessionKey() - - /** - * Re-shares a session key with devices if the key has already been - * sent to them. - * - * @param sessionId The id of the outbound session to share. - * @param userId The id of the user who owns the target device. - * @param deviceId The id of the target device. - * @param senderKey The key of the originating device for the session. - * - * @return true in case of success - */ - suspend fun reshareKey(sessionId: String, - userId: String, - deviceId: String, - senderKey: String): Boolean } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/IMXGroupEncryption.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/IMXGroupEncryption.kt new file mode 100644 index 0000000000..1fd5061a65 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/IMXGroupEncryption.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2020 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.crypto.algorithms + +internal interface IMXGroupEncryption { + + /** + * In Megolm, each recipient maintains a record of the ratchet value which allows + * them to decrypt any messages sent in the session after the corresponding point + * in the conversation. If this value is compromised, an attacker can similarly + * decrypt past messages which were encrypted by a key derived from the + * compromised or subsequent ratchet values. This gives 'partial' forward + * secrecy. + * + * To mitigate this issue, the application should offer the user the option to + * discard historical conversations, by winding forward any stored ratchet values, + * or discarding sessions altogether. + */ + fun discardSessionKey() + + suspend fun preshareKey(userIds: List) + + /** + * Re-shares a session key with devices if the key has already been + * sent to them. + * + * @param sessionId The id of the outbound session to share. + * @param userId The id of the user who owns the target device. + * @param deviceId The id of the target device. + * @param senderKey The key of the originating device for the session. + * + * @return true in case of success + */ + suspend fun reshareKey(sessionId: String, + userId: String, + deviceId: String, + senderKey: String): Boolean +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt index fa8acafb83..6b91c0b859 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryption.kt @@ -18,8 +18,6 @@ package org.matrix.android.sdk.internal.crypto.algorithms.megolm import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import org.matrix.android.sdk.api.MatrixCallback -import org.matrix.android.sdk.api.auth.data.Credentials import org.matrix.android.sdk.api.session.crypto.MXCryptoError import org.matrix.android.sdk.api.session.events.model.Content import org.matrix.android.sdk.api.session.events.model.Event @@ -30,6 +28,7 @@ import org.matrix.android.sdk.internal.crypto.MXOlmDevice import org.matrix.android.sdk.internal.crypto.actions.EnsureOlmSessionsForDevicesAction import org.matrix.android.sdk.internal.crypto.actions.MessageEncrypter import org.matrix.android.sdk.internal.crypto.algorithms.IMXEncrypting +import org.matrix.android.sdk.internal.crypto.algorithms.IMXGroupEncryption import org.matrix.android.sdk.internal.crypto.keysbackup.DefaultKeysBackupService import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap @@ -39,8 +38,6 @@ import org.matrix.android.sdk.internal.crypto.model.forEach import org.matrix.android.sdk.internal.crypto.repository.WarnOnUnknownDeviceRepository import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask -import org.matrix.android.sdk.internal.task.TaskExecutor -import org.matrix.android.sdk.internal.task.configureWith import org.matrix.android.sdk.internal.util.JsonCanonicalizer import org.matrix.android.sdk.internal.util.MatrixCoroutineDispatchers import org.matrix.android.sdk.internal.util.convertToUTF8 @@ -54,14 +51,14 @@ internal class MXMegolmEncryption( private val cryptoStore: IMXCryptoStore, private val deviceListManager: DeviceListManager, private val ensureOlmSessionsForDevicesAction: EnsureOlmSessionsForDevicesAction, - private val credentials: Credentials, + private val userId: String, + private val deviceId: String, private val sendToDeviceTask: SendToDeviceTask, private val messageEncrypter: MessageEncrypter, private val warnOnUnknownDevicesRepository: WarnOnUnknownDeviceRepository, - private val taskExecutor: TaskExecutor, private val coroutineDispatchers: MatrixCoroutineDispatchers, private val cryptoCoroutineScope: CoroutineScope -) : IMXEncrypting { +) : IMXEncrypting, IMXGroupEncryption { // OutboundSessionInfo. Null if we haven't yet started setting one up. Note // that even if this is non-null, it may not be ready for use (in which @@ -93,6 +90,7 @@ internal class MXMegolmEncryption( // annoyingly we have to serialize again the saved outbound session to store message index :/ // if not we would see duplicate message index errors olmDevice.storeOutboundGroupSessionForRoom(roomId, outboundSession.sessionId) + Timber.v("## CRYPTO | encryptEventContent: Finished in ${System.currentTimeMillis() - ts} millis") } } @@ -117,6 +115,16 @@ internal class MXMegolmEncryption( olmDevice.discardOutboundGroupSessionForRoom(roomId) } + override suspend fun preshareKey(userIds: List) { + val ts = System.currentTimeMillis() + Timber.v("## CRYPTO | preshareKey : getDevicesInRoom") + val devices = getDevicesInRoom(userIds) + val outboundSession = ensureOutboundSession(devices.allowedDevices) + + notifyWithheldForSession(devices.withHeldDevices, outboundSession) + + Timber.v("## CRYPTO | preshareKey ${System.currentTimeMillis() - ts} millis") + } /** * Prepare a new session. * @@ -252,7 +260,7 @@ internal class MXMegolmEncryption( continue } - Timber.i("## CRYPTO | shareUserDevicesKey() : Sharing keys with device $userId:$deviceID") + Timber.i("## CRYPTO | shareUserDevicesKey() : Add to share keys contentMap for $userId:$deviceID") contentMap.setObject(userId, deviceID, messageEncrypter.encryptMessage(payload, listOf(sessionResult.deviceInfo))) haveTargets = true } @@ -263,12 +271,14 @@ internal class MXMegolmEncryption( // attempted to share with) rather than the contentMap (those we did // share with), because we don't want to try to claim a one-time-key // for dead devices on every message. + val gossipingEventBuffer = arrayListOf() for ((userId, devicesToShareWith) in devicesByUser) { for ((deviceId) in devicesToShareWith) { session.sharedWithHelper.markedSessionAsShared(userId, deviceId, chainIndex) - cryptoStore.saveGossipingEvent(Event( + gossipingEventBuffer.add( + Event( type = EventType.ROOM_KEY, - senderId = credentials.userId, + senderId = this.userId, content = submap.apply { this["session_key"] = "" // we add a fake key for trail @@ -278,6 +288,8 @@ internal class MXMegolmEncryption( } } + cryptoStore.saveGossipingEvents(gossipingEventBuffer) + if (haveTargets) { t0 = System.currentTimeMillis() Timber.i("## CRYPTO | shareUserDevicesKey() ${session.sessionId} : has target") @@ -294,8 +306,11 @@ internal class MXMegolmEncryption( } } - private fun notifyKeyWithHeld(targets: List, sessionId: String, senderKey: String?, code: WithHeldCode) { - Timber.i("## CRYPTO | notifyKeyWithHeld() :sending withheld key for $targets session:$sessionId ") + private suspend fun notifyKeyWithHeld(targets: List, + sessionId: String, + senderKey: String?, + code: WithHeldCode) { + Timber.i("## CRYPTO | notifyKeyWithHeld() :sending withheld key for $targets session:$sessionId and code $code") val withHeldContent = RoomKeyWithHeldContent( roomId = roomId, senderKey = senderKey, @@ -311,13 +326,11 @@ internal class MXMegolmEncryption( } } ) - sendToDeviceTask.configureWith(params) { - callback = object : MatrixCallback { - override fun onFailure(failure: Throwable) { - Timber.e("## CRYPTO | notifyKeyWithHeld() : Failed to notify withheld key for $targets session: $sessionId ") - } - } - }.executeBy(taskExecutor) + try { + sendToDeviceTask.execute(params) + } catch (failure: Throwable) { + Timber.e("## CRYPTO | notifyKeyWithHeld() : Failed to notify withheld key for $targets session: $sessionId ") + } } /** @@ -343,7 +356,7 @@ internal class MXMegolmEncryption( // Include our device ID so that recipients can send us a // m.new_device message if they don't have our session key. - map["device_id"] = credentials.deviceId!! + map["device_id"] = deviceId session.useCount++ return map } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryptionFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryptionFactory.kt index f0cc15fb63..9f6312ea97 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryptionFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/megolm/MXMegolmEncryptionFactory.kt @@ -17,7 +17,6 @@ package org.matrix.android.sdk.internal.crypto.algorithms.megolm import kotlinx.coroutines.CoroutineScope -import org.matrix.android.sdk.api.auth.data.Credentials import org.matrix.android.sdk.internal.crypto.DeviceListManager import org.matrix.android.sdk.internal.crypto.MXOlmDevice import org.matrix.android.sdk.internal.crypto.actions.EnsureOlmSessionsForDevicesAction @@ -26,7 +25,8 @@ import org.matrix.android.sdk.internal.crypto.keysbackup.DefaultKeysBackupServic import org.matrix.android.sdk.internal.crypto.repository.WarnOnUnknownDeviceRepository import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask -import org.matrix.android.sdk.internal.task.TaskExecutor +import org.matrix.android.sdk.internal.di.DeviceId +import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.util.MatrixCoroutineDispatchers import javax.inject.Inject @@ -36,29 +36,29 @@ internal class MXMegolmEncryptionFactory @Inject constructor( private val cryptoStore: IMXCryptoStore, private val deviceListManager: DeviceListManager, private val ensureOlmSessionsForDevicesAction: EnsureOlmSessionsForDevicesAction, - private val credentials: Credentials, + @UserId private val userId: String, + @DeviceId private val deviceId: String?, private val sendToDeviceTask: SendToDeviceTask, private val messageEncrypter: MessageEncrypter, private val warnOnUnknownDevicesRepository: WarnOnUnknownDeviceRepository, - private val taskExecutor: TaskExecutor, private val coroutineDispatchers: MatrixCoroutineDispatchers, private val cryptoCoroutineScope: CoroutineScope) { fun create(roomId: String): MXMegolmEncryption { return MXMegolmEncryption( - roomId, - olmDevice, - defaultKeysBackupService, - cryptoStore, - deviceListManager, - ensureOlmSessionsForDevicesAction, - credentials, - sendToDeviceTask, - messageEncrypter, - warnOnUnknownDevicesRepository, - taskExecutor, - coroutineDispatchers, - cryptoCoroutineScope + roomId = roomId, + olmDevice = olmDevice, + defaultKeysBackupService = defaultKeysBackupService, + cryptoStore = cryptoStore, + deviceListManager = deviceListManager, + ensureOlmSessionsForDevicesAction = ensureOlmSessionsForDevicesAction, + userId = userId, + deviceId = deviceId!!, + sendToDeviceTask = sendToDeviceTask, + messageEncrypter = messageEncrypter, + warnOnUnknownDevicesRepository = warnOnUnknownDevicesRepository, + coroutineDispatchers = coroutineDispatchers, + cryptoCoroutineScope = cryptoCoroutineScope ) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/olm/MXOlmEncryption.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/olm/MXOlmEncryption.kt index 9acc9bc1b2..65f78e11f0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/olm/MXOlmEncryption.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/olm/MXOlmEncryption.kt @@ -76,13 +76,4 @@ internal class MXOlmEncryption( deviceListManager.downloadKeys(users, false) ensureOlmSessionsForUsersAction.handle(users) } - - override fun discardSessionKey() { - // No need for olm - } - - override suspend fun reshareKey(sessionId: String, userId: String, deviceId: String, senderKey: String): Boolean { - // No need for olm - return false - } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/EncryptEventTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/EncryptEventTask.kt index 56b267decd..627352f568 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/EncryptEventTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/EncryptEventTask.kt @@ -45,7 +45,7 @@ internal class DefaultEncryptEventTask @Inject constructor( // don't want to wait for any query // if (!params.crypto.isRoomEncrypted(params.roomId)) return params.event val localEvent = params.event - if (localEvent.eventId == null) { + if (localEvent.eventId == null || localEvent.type == null) { throw IllegalArgumentException() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendEventTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendEventTask.kt index b772bfbce2..573f2c3a54 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendEventTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendEventTask.kt @@ -51,14 +51,13 @@ internal class DefaultSendEventTask @Inject constructor( val event = handleEncryption(params) val localId = event.eventId!! - localEchoRepository.updateSendState(localId, params.event.roomId, SendState.SENDING) val executeRequest = executeRequest(globalErrorReceiver) { apiCall = roomAPI.send( localId, roomId = event.roomId ?: "", content = event.content, - eventType = event.type + eventType = event.type ?: "" ) } localEchoRepository.updateSendState(localId, params.event.roomId, SendState.SENT) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendVerificationMessageTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendVerificationMessageTask.kt index c39dfb1016..ab125135bb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendVerificationMessageTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendVerificationMessageTask.kt @@ -50,7 +50,7 @@ internal class DefaultSendVerificationMessageTask @Inject constructor( localId, roomId = event.roomId ?: "", content = event.content, - eventType = event.type + eventType = event.type ?: "" ) } localEchoRepository.updateSendState(localId, event.roomId, SendState.SENT) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationStateExt.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationStateExt.kt new file mode 100644 index 0000000000..0617f32c24 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationStateExt.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 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.crypto.verification + +import org.matrix.android.sdk.api.crypto.VerificationState +import org.matrix.android.sdk.api.crypto.isCanceled + +// State transition with control +internal fun VerificationState?.toState(newState: VerificationState): VerificationState { + // Cancel is always prioritary ? + // Eg id i found that mac or keys mismatch and send a cancel and the other send a done, i have to + // consider as canceled + if (newState.isCanceled()) { + return newState + } + // never move out of cancel + if (this?.isCanceled() == true) { + return this + } + return newState +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessage.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessage.kt index a447e659f5..ad490bcd27 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessage.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessage.kt @@ -24,7 +24,6 @@ import androidx.work.WorkInfo import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.matrix.android.sdk.R import org.matrix.android.sdk.api.session.crypto.verification.CancelCode import org.matrix.android.sdk.api.session.crypto.verification.ValidVerificationInfoRequest import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState @@ -46,23 +45,16 @@ import org.matrix.android.sdk.api.session.room.model.message.MessageVerification import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_RECIPROCATE import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_SAS -import org.matrix.android.sdk.internal.di.DeviceId -import org.matrix.android.sdk.internal.di.SessionId -import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.di.WorkManagerProvider import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory -import org.matrix.android.sdk.internal.task.TaskExecutor -import org.matrix.android.sdk.internal.util.StringProvider import org.matrix.android.sdk.internal.worker.SessionSafeCoroutineWorker import org.matrix.android.sdk.internal.worker.WorkerParamsFactory import timber.log.Timber import java.util.UUID import java.util.concurrent.TimeUnit -import javax.inject.Inject internal class VerificationTransportRoomMessage( private val workManagerProvider: WorkManagerProvider, - private val stringProvider: StringProvider, private val sessionId: String, private val userId: String, private val userDeviceId: String?, @@ -167,7 +159,8 @@ internal class VerificationTransportRoomMessage( ) val info = MessageVerificationRequestContent( - body = stringProvider.getString(R.string.key_verification_request_fallback_message, userId), + body = "$userId is requesting to verify your key, but your client does not support in-chat key verification." + + " You will need to use legacy key verification to verify keys.", fromDevice = validInfo.fromDevice, toUserId = otherUserId, timestamp = validInfo.timestamp, @@ -387,29 +380,3 @@ internal class VerificationTransportRoomMessage( Timber.w("## SAS ignored verification ready with methods: ${keyReq.methods}") } } - -internal class VerificationTransportRoomMessageFactory @Inject constructor( - private val workManagerProvider: WorkManagerProvider, - private val stringProvider: StringProvider, - @SessionId - private val sessionId: String, - @UserId - private val userId: String, - @DeviceId - private val deviceId: String?, - private val localEchoEventFactory: LocalEchoEventFactory, - private val taskExecutor: TaskExecutor -) { - - fun createTransport(roomId: String, tx: DefaultVerificationTransaction?): VerificationTransportRoomMessage { - return VerificationTransportRoomMessage(workManagerProvider, - stringProvider, - sessionId, - userId, - deviceId, - roomId, - localEchoEventFactory, - tx, - taskExecutor.executorScope) - } -} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessageFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessageFactory.kt new file mode 100644 index 0000000000..f89127273b --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessageFactory.kt @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 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.crypto.verification + +import org.matrix.android.sdk.internal.di.DeviceId +import org.matrix.android.sdk.internal.di.SessionId +import org.matrix.android.sdk.internal.di.UserId +import org.matrix.android.sdk.internal.di.WorkManagerProvider +import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory +import org.matrix.android.sdk.internal.task.TaskExecutor +import javax.inject.Inject + +internal class VerificationTransportRoomMessageFactory @Inject constructor( + private val workManagerProvider: WorkManagerProvider, + @SessionId + private val sessionId: String, + @UserId + private val userId: String, + @DeviceId + private val deviceId: String?, + private val localEchoEventFactory: LocalEchoEventFactory, + private val taskExecutor: TaskExecutor +) { + + fun createTransport(roomId: String, tx: DefaultVerificationTransaction?): VerificationTransportRoomMessage { + return VerificationTransportRoomMessage(workManagerProvider, + sessionId, + userId, + deviceId, + roomId, + localEchoEventFactory, + tx, + taskExecutor.executorScope) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportToDevice.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportToDevice.kt index 5fd1c5d650..0dbbe656c7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportToDevice.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportToDevice.kt @@ -16,8 +16,8 @@ package org.matrix.android.sdk.internal.crypto.verification import org.matrix.android.sdk.api.MatrixCallback -import org.matrix.android.sdk.api.session.crypto.verification.ValidVerificationInfoRequest import org.matrix.android.sdk.api.session.crypto.verification.CancelCode +import org.matrix.android.sdk.api.session.crypto.verification.ValidVerificationInfoRequest import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.room.model.message.MessageType @@ -33,11 +33,9 @@ import org.matrix.android.sdk.internal.crypto.model.rest.KeyVerificationStart import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_RECIPROCATE import org.matrix.android.sdk.internal.crypto.model.rest.VERIFICATION_METHOD_SAS import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask -import org.matrix.android.sdk.internal.di.DeviceId import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.task.configureWith import timber.log.Timber -import javax.inject.Inject internal class VerificationTransportToDevice( private var tx: DefaultVerificationTransaction?, @@ -248,13 +246,3 @@ internal class VerificationTransportToDevice( ) } } - -internal class VerificationTransportToDeviceFactory @Inject constructor( - private val sendToDeviceTask: SendToDeviceTask, - @DeviceId val myDeviceId: String?, - private val taskExecutor: TaskExecutor) { - - fun createTransport(tx: DefaultVerificationTransaction?): VerificationTransportToDevice { - return VerificationTransportToDevice(tx, sendToDeviceTask, myDeviceId, taskExecutor) - } -} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportToDeviceFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportToDeviceFactory.kt new file mode 100644 index 0000000000..e9a2c65ef7 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportToDeviceFactory.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021 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.crypto.verification + +import org.matrix.android.sdk.internal.crypto.tasks.SendToDeviceTask +import org.matrix.android.sdk.internal.di.DeviceId +import org.matrix.android.sdk.internal.task.TaskExecutor +import javax.inject.Inject + +internal class VerificationTransportToDeviceFactory @Inject constructor( + private val sendToDeviceTask: SendToDeviceTask, + @DeviceId val myDeviceId: String?, + private val taskExecutor: TaskExecutor) { + + fun createTransport(tx: DefaultVerificationTransaction?): VerificationTransportToDevice { + return VerificationTransportToDevice(tx, sendToDeviceTask, myDeviceId, taskExecutor) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt index 8b4ce6106b..f11ecc5d75 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt @@ -47,7 +47,7 @@ private const val MIN_NUMBER_OF_EVENTS_BY_CHUNK = 300 internal class DatabaseCleaner @Inject constructor(@SessionDatabase private val realmConfiguration: RealmConfiguration, private val taskExecutor: TaskExecutor) : SessionLifecycleObserver { - override fun onStart() { + override fun onSessionStarted() { taskExecutor.executorScope.launch(Dispatchers.Default) { awaitTransaction(realmConfiguration) { realm -> val allRooms = realm.where(RoomEntity::class.java).findAll() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmLiveEntityObserver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmLiveEntityObserver.kt index 3e2160e666..2a0cd963b2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmLiveEntityObserver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmLiveEntityObserver.kt @@ -46,7 +46,7 @@ internal abstract class RealmLiveEntityObserver(protected val r private val backgroundRealm = AtomicReference() private lateinit var results: AtomicReference> - override fun onStart() { + override fun onSessionStarted() { if (isStarted.compareAndSet(false, true)) { BACKGROUND_HANDLER.post { val realm = Realm.getInstance(realmConfiguration) @@ -58,7 +58,7 @@ internal abstract class RealmLiveEntityObserver(protected val r } } - override fun onStop() { + override fun onSessionStopped() { if (isStarted.compareAndSet(true, false)) { BACKGROUND_HANDLER.post { results.getAndSet(null).removeAllChangeListeners() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionProvider.kt index 1947cc83e3..f8d5d323a5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionProvider.kt @@ -44,14 +44,14 @@ internal class RealmSessionProvider @Inject constructor(@SessionDatabase private } @MainThread - override fun onStart() { + override fun onSessionStarted() { realmThreadLocal.getOrSet { Realm.getInstance(monarchy.realmConfiguration) } } @MainThread - override fun onStop() { + override fun onSessionStopped() { realmThreadLocal.get()?.close() realmThreadLocal.remove() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt index 57002b5a60..c7fe7ab447 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt @@ -18,6 +18,8 @@ package org.matrix.android.sdk.internal.database import io.realm.DynamicRealm import io.realm.RealmMigration +import org.matrix.android.sdk.internal.database.model.EditAggregatedSummaryEntityFields +import org.matrix.android.sdk.internal.database.model.EditionOfEventFields import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntityFields import org.matrix.android.sdk.internal.database.model.PendingThreePidEntityFields import org.matrix.android.sdk.internal.database.model.PreviewUrlCacheEntityFields @@ -30,7 +32,7 @@ import javax.inject.Inject class RealmSessionStoreMigration @Inject constructor() : RealmMigration { companion object { - const val SESSION_STORE_SCHEMA_VERSION = 7L + const val SESSION_STORE_SCHEMA_VERSION = 8L } override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) { @@ -43,6 +45,7 @@ class RealmSessionStoreMigration @Inject constructor() : RealmMigration { if (oldVersion <= 4) migrateTo5(realm) if (oldVersion <= 5) migrateTo6(realm) if (oldVersion <= 6) migrateTo7(realm) + if (oldVersion <= 7) migrateTo8(realm) } private fun migrateTo1(realm: DynamicRealm) { @@ -122,4 +125,28 @@ class RealmSessionStoreMigration @Inject constructor() : RealmMigration { } ?.removeField("areAllMembersLoaded") } + + private fun migrateTo8(realm: DynamicRealm) { + Timber.d("Step 7 -> 8") + + val editionOfEventSchema = realm.schema.create("EditionOfEvent") + .apply { + // setEmbedded does not return `this`... + isEmbedded = true + } + .addField(EditionOfEventFields.CONTENT, String::class.java) + .addField(EditionOfEventFields.EVENT_ID, String::class.java) + .setRequired(EditionOfEventFields.EVENT_ID, true) + .addField(EditionOfEventFields.SENDER_ID, String::class.java) + .setRequired(EditionOfEventFields.SENDER_ID, true) + .addField(EditionOfEventFields.TIMESTAMP, Long::class.java) + .addField(EditionOfEventFields.IS_LOCAL_ECHO, Boolean::class.java) + + realm.schema.get("EditAggregatedSummaryEntity") + ?.removeField("aggregatedContent") + ?.removeField("sourceEvents") + ?.removeField("lastEditTs") + ?.removeField("sourceLocalEchoEvents") + ?.addRealmListField(EditAggregatedSummaryEntityFields.EDITIONS.`$`, editionOfEventSchema) + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt index b4935cfdcc..e262b40419 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt @@ -97,7 +97,8 @@ internal fun ChunkEntity.addTimelineEvent(roomId: String, this.root = eventEntity this.eventId = eventId this.roomId = roomId - this.annotations = EventAnnotationsSummaryEntity.where(realm, eventId).findFirst() + this.annotations = EventAnnotationsSummaryEntity.where(realm, roomId, eventId).findFirst() + ?.also { it.cleanUp(eventEntity.sender) } this.readReceipts = readReceiptsSummaryEntity this.displayIndex = displayIndex val roomMemberContent = roomMemberContentsByUser[senderId] diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/EventAnnotationsSummaryMapper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/EventAnnotationsSummaryMapper.kt index 9ed2664068..4a26b4c4bf 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/EventAnnotationsSummaryMapper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/EventAnnotationsSummaryMapper.kt @@ -20,11 +20,7 @@ import org.matrix.android.sdk.api.session.room.model.EditAggregatedSummary import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary import org.matrix.android.sdk.api.session.room.model.ReactionAggregatedSummary import org.matrix.android.sdk.api.session.room.model.ReferencesAggregatedSummary -import org.matrix.android.sdk.internal.database.model.EditAggregatedSummaryEntity import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntity -import org.matrix.android.sdk.internal.database.model.ReactionAggregatedSummaryEntity -import org.matrix.android.sdk.internal.database.model.ReferencesAggregatedSummaryEntity -import io.realm.RealmList internal object EventAnnotationsSummaryMapper { fun map(annotationsSummary: EventAnnotationsSummaryEntity): EventAnnotationsSummary { @@ -40,14 +36,18 @@ internal object EventAnnotationsSummaryMapper { it.sourceLocalEcho.toList() ) }, - editSummary = annotationsSummary.editSummary?.let { - EditAggregatedSummary( - ContentMapper.map(it.aggregatedContent), - it.sourceEvents.toList(), - it.sourceLocalEchoEvents.toList(), - it.lastEditTs - ) - }, + editSummary = annotationsSummary.editSummary + ?.let { + val latestEdition = it.editions.maxByOrNull { editionOfEvent -> editionOfEvent.timestamp } ?: return@let null + EditAggregatedSummary( + latestContent = ContentMapper.map(latestEdition.content), + sourceEvents = it.editions.filter { editionOfEvent -> !editionOfEvent.isLocalEcho } + .map { editionOfEvent -> editionOfEvent.eventId }, + localEchos = it.editions.filter { editionOfEvent -> editionOfEvent.isLocalEcho } + .map { editionOfEvent -> editionOfEvent.eventId }, + lastEditTs = latestEdition.timestamp + ) + }, referencesAggregatedSummary = annotationsSummary.referencesSummaryEntity?.let { ReferencesAggregatedSummary( it.eventId, @@ -62,46 +62,6 @@ internal object EventAnnotationsSummaryMapper { ) } - - fun map(annotationsSummary: EventAnnotationsSummary, roomId: String): EventAnnotationsSummaryEntity { - val eventAnnotationsSummaryEntity = EventAnnotationsSummaryEntity() - eventAnnotationsSummaryEntity.eventId = annotationsSummary.eventId - eventAnnotationsSummaryEntity.roomId = roomId - eventAnnotationsSummaryEntity.editSummary = annotationsSummary.editSummary?.let { - EditAggregatedSummaryEntity( - ContentMapper.map(it.aggregatedContent), - RealmList().apply { addAll(it.sourceEvents) }, - RealmList().apply { addAll(it.localEchos) }, - it.lastEditTs - ) - } - eventAnnotationsSummaryEntity.reactionsSummary = annotationsSummary.reactionsSummary.let { - RealmList().apply { - addAll(it.map { - ReactionAggregatedSummaryEntity( - it.key, - it.count, - it.addedByMe, - it.firstTimestamp, - RealmList().apply { addAll(it.sourceEvents) }, - RealmList().apply { addAll(it.localEchoEvents) } - ) - }) - } - } - eventAnnotationsSummaryEntity.referencesSummaryEntity = annotationsSummary.referencesAggregatedSummary?.let { - ReferencesAggregatedSummaryEntity( - it.eventId, - ContentMapper.map(it.content), - RealmList().apply { addAll(it.sourceEvents) }, - RealmList().apply { addAll(it.localEchos) } - ) - } - eventAnnotationsSummaryEntity.pollResponseSummary = annotationsSummary.pollResponseSummary?.let { - PollResponseAggregatedSummaryEntityMapper.map(it) - } - return eventAnnotationsSummaryEntity - } } internal fun EventAnnotationsSummaryEntity.asDomain(): EventAnnotationsSummary { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/EventMapper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/EventMapper.kt index 66eccdfba0..a4a2fadd21 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/EventMapper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/EventMapper.kt @@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.database.mapper import com.squareup.moshi.JsonDataException import org.matrix.android.sdk.api.session.crypto.MXCryptoError import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.UnsignedData import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.internal.crypto.algorithms.olm.OlmDecryptionResult @@ -29,8 +30,6 @@ import timber.log.Timber internal object EventMapper { fun map(event: Event, roomId: String): EventEntity { - val uds = if (event.unsignedData == null) null - else MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).toJson(event.unsignedData) val eventEntity = EventEntity() // TODO change this as we shouldn't use event everywhere eventEntity.eventId = event.eventId ?: "$$roomId-${System.currentTimeMillis()}-${event.hashCode()}" @@ -39,14 +38,16 @@ internal object EventMapper { eventEntity.prevContent = ContentMapper.map(event.resolvedPrevContent()) eventEntity.isUseless = IsUselessResolver.isUseless(event) eventEntity.stateKey = event.stateKey - eventEntity.type = event.type + eventEntity.type = event.type ?: EventType.MISSING_TYPE eventEntity.sender = event.senderId eventEntity.originServerTs = event.originServerTs eventEntity.redacts = event.redacts eventEntity.age = event.unsignedData?.age ?: event.originServerTs - eventEntity.unsignedData = uds + eventEntity.unsignedData = event.unsignedData?.let { + MoshiProvider.providesMoshi().adapter(UnsignedData::class.java).toJson(it) + } eventEntity.decryptionResultJson = event.mxDecryptionResult?.let { - MoshiProvider.providesMoshi().adapter(OlmDecryptionResult::class.java).toJson(it) + MoshiProvider.providesMoshi().adapter(OlmDecryptionResult::class.java).toJson(it) } eventEntity.decryptionErrorReason = event.mCryptoErrorReason eventEntity.decryptionErrorCode = event.mCryptoError?.name diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EditAggregatedSummaryEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EditAggregatedSummaryEntity.kt index 604afc1ab1..0ed927a6b8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EditAggregatedSummaryEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EditAggregatedSummaryEntity.kt @@ -17,17 +17,24 @@ package org.matrix.android.sdk.internal.database.model import io.realm.RealmList import io.realm.RealmObject +import io.realm.annotations.RealmClass /** - * Keep the latest state of edition of a message + * Keep all the editions of a message */ internal open class EditAggregatedSummaryEntity( - var aggregatedContent: String? = null, - // The list of the eventIDs used to build the summary (might be out of sync if chunked received from message chunk) - var sourceEvents: RealmList = RealmList(), - var sourceLocalEchoEvents: RealmList = RealmList(), - var lastEditTs: Long = 0 + // The list of the editions used to build the summary (might be out of sync if chunked received from message chunk) + var editions: RealmList = RealmList() ) : RealmObject() { companion object } + +@RealmClass(embedded = true) +internal open class EditionOfEvent( + var senderId: String = "", + var eventId: String = "", + var content: String? = null, + var timestamp: Long = 0, + var isLocalEcho: Boolean = false +) : RealmObject() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventAnnotationsSummaryEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventAnnotationsSummaryEntity.kt index 33f26d439f..3e88130420 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventAnnotationsSummaryEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventAnnotationsSummaryEntity.kt @@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.database.model import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey +import timber.log.Timber internal open class EventAnnotationsSummaryEntity( @PrimaryKey @@ -29,6 +30,21 @@ internal open class EventAnnotationsSummaryEntity( var pollResponseSummary: PollResponseAggregatedSummaryEntity? = null ) : RealmObject() { + /** + * Cleanup undesired editions, done by users different from the originalEventSender + */ + fun cleanUp(originalEventSenderId: String?) { + originalEventSenderId ?: return + + editSummary?.editions?.filter { + it.senderId != originalEventSenderId + } + ?.forEach { + Timber.w("Deleting an edition from ${it.senderId} of event sent by $originalEventSenderId") + it.deleteFromRealm() + } + } + companion object } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventInsertType.java b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventInsertType.kt similarity index 88% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventInsertType.java rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventInsertType.kt index 05153c5734..463ccb2f46 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventInsertType.java +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventInsertType.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.database.model; +package org.matrix.android.sdk.internal.database.model -public enum EventInsertType { +internal enum class EventInsertType { INITIAL_SYNC, INCREMENTAL_SYNC, PAGINATION, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/SessionRealmModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/SessionRealmModule.kt index bca2c42c9e..6e6096cf8a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/SessionRealmModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/SessionRealmModule.kt @@ -43,6 +43,7 @@ import io.realm.annotations.RealmModule EventAnnotationsSummaryEntity::class, ReactionAggregatedSummaryEntity::class, EditAggregatedSummaryEntity::class, + EditionOfEvent::class, PollResponseAggregatedSummaryEntity::class, ReferencesAggregatedSummaryEntity::class, PushRulesEntity::class, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt index 6028697054..f7d2823303 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt @@ -18,7 +18,6 @@ package org.matrix.android.sdk.internal.database.query import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.ChunkEntityFields -import org.matrix.android.sdk.internal.database.model.RoomEntityFields import io.realm.Realm import io.realm.RealmQuery import io.realm.RealmResults @@ -27,7 +26,7 @@ import io.realm.kotlin.where internal fun ChunkEntity.Companion.where(realm: Realm, roomId: String): RealmQuery { return realm.where() - .equalTo("${ChunkEntityFields.ROOM}.${RoomEntityFields.ROOM_ID}", roomId) + .equalTo(ChunkEntityFields.ROOM.ROOM_ID, roomId) } internal fun ChunkEntity.Companion.find(realm: Realm, roomId: String, prevToken: String? = null, nextToken: String? = null): ChunkEntity? { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventAnnotationsSummaryEntityQuery.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventAnnotationsSummaryEntityQuery.kt index 9a298b7e79..c3cae3d268 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventAnnotationsSummaryEntityQuery.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventAnnotationsSummaryEntityQuery.kt @@ -23,18 +23,10 @@ import io.realm.Realm import io.realm.RealmQuery import io.realm.kotlin.where -internal fun EventAnnotationsSummaryEntity.Companion.where(realm: Realm, eventId: String): RealmQuery { - val query = realm.where() - query.equalTo(EventAnnotationsSummaryEntityFields.EVENT_ID, eventId) - return query -} - -internal fun EventAnnotationsSummaryEntity.Companion.whereInRoom(realm: Realm, roomId: String?): RealmQuery { - val query = realm.where() - if (roomId != null) { - query.equalTo(EventAnnotationsSummaryEntityFields.ROOM_ID, roomId) - } - return query +internal fun EventAnnotationsSummaryEntity.Companion.where(realm: Realm, roomId: String, eventId: String): RealmQuery { + return realm.where() + .equalTo(EventAnnotationsSummaryEntityFields.ROOM_ID, roomId) + .equalTo(EventAnnotationsSummaryEntityFields.EVENT_ID, eventId) } internal fun EventAnnotationsSummaryEntity.Companion.create(realm: Realm, roomId: String, eventId: String): EventAnnotationsSummaryEntity { @@ -49,6 +41,6 @@ internal fun EventAnnotationsSummaryEntity.Companion.create(realm: Realm, roomId } internal fun EventAnnotationsSummaryEntity.Companion.getOrCreate(realm: Realm, roomId: String, eventId: String): EventAnnotationsSummaryEntity { - return EventAnnotationsSummaryEntity.where(realm, eventId).findFirst() - ?: EventAnnotationsSummaryEntity.create(realm, roomId, eventId).apply { this.roomId = roomId } + return EventAnnotationsSummaryEntity.where(realm, roomId, eventId).findFirst() + ?: EventAnnotationsSummaryEntity.create(realm, roomId, eventId) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt index d78bda2317..359b256844 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt @@ -48,6 +48,6 @@ internal fun PushRuleEntity.Companion.where(realm: Realm, scope: String, ruleId: String): RealmQuery { return realm.where() - .equalTo("${PushRuleEntityFields.PARENT}.${PushRulesEntityFields.SCOPE}", scope) + .equalTo(PushRuleEntityFields.PARENT.SCOPE, scope) .equalTo(PushRuleEntityFields.RULE_ID, ruleId) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserDraftsEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserDraftsEntityQueries.kt index 35f317f192..4af4da0a22 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserDraftsEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserDraftsEntityQueries.kt @@ -16,7 +16,6 @@ package org.matrix.android.sdk.internal.database.query -import org.matrix.android.sdk.internal.database.model.RoomSummaryEntityFields import org.matrix.android.sdk.internal.database.model.UserDraftsEntity import org.matrix.android.sdk.internal.database.model.UserDraftsEntityFields import io.realm.Realm @@ -26,7 +25,7 @@ import io.realm.kotlin.where internal fun UserDraftsEntity.Companion.where(realm: Realm, roomId: String? = null): RealmQuery { val query = realm.where() if (roomId != null) { - query.equalTo(UserDraftsEntityFields.ROOM_SUMMARY_ENTITY + "." + RoomSummaryEntityFields.ROOM_ID, roomId) + query.equalTo(UserDraftsEntityFields.ROOM_SUMMARY_ENTITY.ROOM_ID, roomId) } return query } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/MoshiProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/MoshiProvider.kt index 48fa41b350..074f8dc43e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/MoshiProvider.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/MoshiProvider.kt @@ -36,6 +36,7 @@ import org.matrix.android.sdk.internal.network.parsing.ForceToBooleanJsonAdapter import org.matrix.android.sdk.internal.network.parsing.RuntimeJsonAdapterFactory import org.matrix.android.sdk.internal.network.parsing.TlsVersionMoshiAdapter import org.matrix.android.sdk.internal.network.parsing.UriMoshiAdapter +import org.matrix.android.sdk.internal.session.sync.parsing.DefaultLazyRoomSyncEphemeralJsonAdapter object MoshiProvider { @@ -44,6 +45,8 @@ object MoshiProvider { .add(ForceToBooleanJsonAdapter()) .add(CipherSuiteMoshiAdapter()) .add(TlsVersionMoshiAdapter()) + // Use addLast here so we can inject a SplitLazyRoomSyncJsonAdapter later to override the default parsing. + .addLast(DefaultLazyRoomSyncEphemeralJsonAdapter()) .add(RuntimeJsonAdapterFactory.of(MessageContent::class.java, "msgtype", MessageDefaultContent::class.java) .registerSubtype(MessageTextContent::class.java, MessageType.MSGTYPE_TEXT) .registerSubtype(MessageNoticeContent::class.java, MessageType.MSGTYPE_NOTICE) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/DefaultFederationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/DefaultFederationService.kt new file mode 100644 index 0000000000..862a4855cc --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/DefaultFederationService.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 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.federation + +import org.matrix.android.sdk.api.federation.FederationService +import org.matrix.android.sdk.api.federation.FederationVersion +import javax.inject.Inject + +internal class DefaultFederationService @Inject constructor( + private val getFederationVersionTask: GetFederationVersionTask +) : FederationService { + override suspend fun getFederationVersion(): FederationVersion { + return getFederationVersionTask.execute(Unit) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationAPI.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationAPI.kt new file mode 100644 index 0000000000..1816616336 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationAPI.kt @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021 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.federation + +import org.matrix.android.sdk.internal.network.NetworkConstants +import retrofit2.Call +import retrofit2.http.GET + +internal interface FederationAPI { + @GET(NetworkConstants.URI_FEDERATION_PATH + "version") + fun getVersion(): Call +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationGetVersionResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationGetVersionResult.kt new file mode 100644 index 0000000000..3d84008be6 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationGetVersionResult.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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.federation + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * Ref: https://matrix.org/docs/spec/server_server/latest#get-matrix-federation-v1-version + */ +@JsonClass(generateAdapter = true) +internal data class FederationGetVersionResult( + @Json(name = "server") + val server: FederationGetVersionServer? +) + +@JsonClass(generateAdapter = true) +internal data class FederationGetVersionServer( + /** + * Arbitrary name that identify this implementation. + */ + @Json(name = "name") + val name: String?, + /** + * Version of this implementation. The version format depends on the implementation. + */ + @Json(name = "version") + val version: String? +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationModule.kt new file mode 100644 index 0000000000..320bf1d445 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationModule.kt @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 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.federation + +import dagger.Binds +import dagger.Lazy +import dagger.Module +import dagger.Provides +import okhttp3.OkHttpClient +import org.matrix.android.sdk.api.auth.data.SessionParams +import org.matrix.android.sdk.api.federation.FederationService +import org.matrix.android.sdk.internal.di.Unauthenticated +import org.matrix.android.sdk.internal.network.RetrofitFactory + +@Module +internal abstract class FederationModule { + + @Module + companion object { + @Provides + @JvmStatic + fun providesFederationAPI(@Unauthenticated okHttpClient: Lazy, + sessionParams: SessionParams, + retrofitFactory: RetrofitFactory): FederationAPI { + return retrofitFactory.create(okHttpClient, sessionParams.homeServerUrl).create(FederationAPI::class.java) + } + } + + @Binds + abstract fun bindFederationService(service: DefaultFederationService): FederationService + + @Binds + abstract fun bindGetFederationVersionTask(task: DefaultGetFederationVersionTask): GetFederationVersionTask +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/GetFederationVersionTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/GetFederationVersionTask.kt new file mode 100644 index 0000000000..ce35e48f6b --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/GetFederationVersionTask.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 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.federation + +import org.matrix.android.sdk.api.federation.FederationVersion +import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.task.Task +import javax.inject.Inject + +internal interface GetFederationVersionTask : Task + +internal class DefaultGetFederationVersionTask @Inject constructor( + private val federationAPI: FederationAPI +) : GetFederationVersionTask { + + override suspend fun execute(params: Unit): FederationVersion { + val result = executeRequest(null) { + apiCall = federationAPI.getVersion() + } + + return FederationVersion( + name = result.server?.name, + version = result.server?.version + ) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConstants.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConstants.kt index a14c86efb6..99c12255cd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConstants.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConstants.kt @@ -36,4 +36,7 @@ internal object NetworkConstants { // Integration const val URI_INTEGRATION_MANAGER_PATH = "_matrix/integrations/v1/" + + // Federation + const val URI_FEDERATION_PATH = "_matrix/federation/v1/" } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultInitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultInitialSyncProgressService.kt deleted file mode 100644 index 9918e83fbc..0000000000 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultInitialSyncProgressService.kt +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2020 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.session - -import androidx.annotation.StringRes -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import org.matrix.android.sdk.api.session.InitialSyncProgressService -import timber.log.Timber -import javax.inject.Inject - -@SessionScope -class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgressService { - - private val status = MutableLiveData() - - private var rootTask: TaskInfo? = null - - override fun getInitialSyncProgressStatus(): LiveData { - return status - } - - fun startTask(@StringRes nameRes: Int, totalProgress: Int, parentWeight: Float = 1f) { - // Create a rootTask, or add a child to the leaf - if (rootTask == null) { - rootTask = TaskInfo(nameRes, totalProgress) - } else { - val currentLeaf = rootTask!!.leaf() - - val newTask = TaskInfo(nameRes, - totalProgress, - currentLeaf, - parentWeight) - - currentLeaf.child = newTask - } - reportProgress(0) - } - - fun reportProgress(progress: Int) { - rootTask?.leaf()?.setProgress(progress) - } - - fun endTask(nameRes: Int) { - val endedTask = rootTask?.leaf() - if (endedTask?.nameRes == nameRes) { - // close it - val parent = endedTask.parent - parent?.child = null - parent?.setProgress(endedTask.offset + (endedTask.totalProgress * endedTask.parentWeight).toInt()) - } - if (endedTask?.parent == null) { - status.postValue(InitialSyncProgressService.Status.Idle) - } - } - - fun endAll() { - rootTask = null - status.postValue(InitialSyncProgressService.Status.Idle) - } - - private inner class TaskInfo(@StringRes var nameRes: Int, - var totalProgress: Int, - var parent: TaskInfo? = null, - var parentWeight: Float = 1f, - var offset: Int = parent?.currentProgress ?: 0) { - var child: TaskInfo? = null - var currentProgress: Int = 0 - - /** - * Get the further child - */ - fun leaf(): TaskInfo { - var last = this - while (last.child != null) { - last = last.child!! - } - return last - } - - /** - * Set progress of the parent if any (which will post value), or post the value - */ - fun setProgress(progress: Int) { - currentProgress = progress -// val newProgress = Math.min(currentProgress + progress, totalProgress) - parent?.let { - val parentProgress = (currentProgress * parentWeight).toInt() - it.setProgress(offset + parentProgress) - } ?: run { - Timber.v("--- ${leaf().nameRes}: $currentProgress") - status.postValue(InitialSyncProgressService.Status.Progressing(leaf().nameRes, currentProgress)) - } - } - } -} - -inline fun reportSubtask(reporter: DefaultInitialSyncProgressService?, - @StringRes nameRes: Int, - totalProgress: Int, - parentWeight: Float = 1f, - block: () -> T): T { - reporter?.startTask(nameRes, totalProgress, parentWeight) - return block().also { - reporter?.endTask(nameRes) - } -} - -inline fun Map.mapWithProgress(reporter: DefaultInitialSyncProgressService?, - taskId: Int, - weight: Float, - transform: (Map.Entry) -> R): List { - val total = count().toFloat() - var current = 0 - reporter?.startTask(taskId, 100, weight) - return map { - reporter?.reportProgress((current / total * 100).toInt()) - current++ - transform.invoke(it) - }.also { - reporter?.endTask(taskId) - } -} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt index 890f3a6ac3..45fcc5af2d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt @@ -22,8 +22,9 @@ import io.realm.RealmConfiguration import okhttp3.OkHttpClient import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.failure.GlobalError +import org.matrix.android.sdk.api.federation.FederationService import org.matrix.android.sdk.api.pushrules.PushRuleService -import org.matrix.android.sdk.api.session.InitialSyncProgressService +import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.account.AccountService import org.matrix.android.sdk.api.session.accountdata.AccountDataService @@ -64,7 +65,6 @@ import org.matrix.android.sdk.internal.di.UnauthenticatedWithCertificate import org.matrix.android.sdk.internal.di.WorkManagerProvider import org.matrix.android.sdk.internal.network.GlobalErrorHandler import org.matrix.android.sdk.internal.session.identity.DefaultIdentityService -import org.matrix.android.sdk.internal.session.room.send.queue.EventSenderProcessor import org.matrix.android.sdk.internal.session.sync.SyncTokenStore import org.matrix.android.sdk.internal.session.sync.job.SyncThread import org.matrix.android.sdk.internal.session.sync.job.SyncWorker @@ -88,6 +88,7 @@ internal class DefaultSession @Inject constructor( private val groupService: Lazy, private val userService: Lazy, private val filterService: Lazy, + private val federationService: Lazy, private val cacheService: Lazy, private val signOutService: Lazy, private val pushRuleService: Lazy, @@ -118,8 +119,7 @@ internal class DefaultSession @Inject constructor( private val thirdPartyService: Lazy, private val callSignalingService: Lazy, @UnauthenticatedWithCertificate - private val unauthenticatedWithCertificateOkHttpClient: Lazy, - private val eventSenderProcessor: EventSenderProcessor + private val unauthenticatedWithCertificateOkHttpClient: Lazy ) : Session, RoomService by roomService.get(), RoomDirectoryService by roomDirectoryService.get(), @@ -156,10 +156,9 @@ internal class DefaultSession @Inject constructor( isOpen = true cryptoService.get().ensureDevice() uiHandler.post { - lifecycleObservers.forEach { it.onStart() } + lifecycleObservers.forEach { it.onSessionStarted() } } globalErrorHandler.listener = this - eventSenderProcessor.start() } override fun requireBackgroundSync() { @@ -198,12 +197,11 @@ internal class DefaultSession @Inject constructor( stopSync() // timelineEventDecryptor.destroy() uiHandler.post { - lifecycleObservers.forEach { it.onStop() } + lifecycleObservers.forEach { it.onSessionStopped() } } cryptoService.get().close() isOpen = false globalErrorHandler.listener = null - eventSenderProcessor.interrupt() } override fun getSyncStateLive() = getSyncThread().liveState() @@ -260,6 +258,8 @@ internal class DefaultSession @Inject constructor( override fun searchService(): SearchService = searchService.get() + override fun federationService(): FederationService = federationService.get() + override fun thirdPartyService(): ThirdPartyService = thirdPartyService.get() override fun getOkHttpClient(): OkHttpClient { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt index 9279c5c97a..7e1e3d0f70 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionComponent.kt @@ -27,6 +27,7 @@ import org.matrix.android.sdk.internal.crypto.SendGossipWorker import org.matrix.android.sdk.internal.crypto.crosssigning.UpdateTrustWorker import org.matrix.android.sdk.internal.crypto.verification.SendVerificationMessageWorker import org.matrix.android.sdk.internal.di.MatrixComponent +import org.matrix.android.sdk.internal.federation.FederationModule import org.matrix.android.sdk.internal.network.NetworkConnectivityChecker import org.matrix.android.sdk.internal.session.account.AccountModule import org.matrix.android.sdk.internal.session.cache.CacheModule @@ -87,6 +88,7 @@ import org.matrix.android.sdk.internal.util.MatrixCoroutineDispatchers AccountDataModule::class, ProfileModule::class, AccountModule::class, + FederationModule::class, CallModule::class, SearchModule::class, ThirdPartyModule::class diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionLifecycleObserver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionLifecycleObserver.kt index d26e9861d0..cb37fbec75 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionLifecycleObserver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionLifecycleObserver.kt @@ -27,7 +27,7 @@ internal interface SessionLifecycleObserver { Called when the session is opened */ @MainThread - fun onStart() { + fun onSessionStarted() { // noop } @@ -43,7 +43,7 @@ internal interface SessionLifecycleObserver { Called when the session is closed */ @MainThread - fun onStop() { + fun onSessionStopped() { // noop } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt index 468c193ad3..f10eb67921 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt @@ -32,7 +32,7 @@ import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.auth.data.sessionId import org.matrix.android.sdk.api.crypto.MXCryptoConfig -import org.matrix.android.sdk.api.session.InitialSyncProgressService +import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.accountdata.AccountDataService import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService @@ -77,11 +77,14 @@ import org.matrix.android.sdk.internal.session.call.CallEventProcessor import org.matrix.android.sdk.internal.session.download.DownloadProgressInterceptor import org.matrix.android.sdk.internal.session.homeserver.DefaultHomeServerCapabilitiesService import org.matrix.android.sdk.internal.session.identity.DefaultIdentityService +import org.matrix.android.sdk.internal.session.initsync.DefaultInitialSyncProgressService import org.matrix.android.sdk.internal.session.integrationmanager.IntegrationManager import org.matrix.android.sdk.internal.session.permalinks.DefaultPermalinkService import org.matrix.android.sdk.internal.session.room.EventRelationsAggregationProcessor import org.matrix.android.sdk.internal.session.room.create.RoomCreateEventProcessor import org.matrix.android.sdk.internal.session.room.prune.RedactionEventProcessor +import org.matrix.android.sdk.internal.session.room.send.queue.EventSenderProcessor +import org.matrix.android.sdk.internal.session.room.send.queue.EventSenderProcessorCoroutine import org.matrix.android.sdk.internal.session.room.tombstone.RoomTombstoneEventProcessor import org.matrix.android.sdk.internal.session.securestorage.DefaultSecureStorageService import org.matrix.android.sdk.internal.session.typing.DefaultTypingUsersTracker @@ -338,6 +341,10 @@ internal abstract class SessionModule { @IntoSet abstract fun bindRealmSessionProvider(provider: RealmSessionProvider): SessionLifecycleObserver + @Binds + @IntoSet + abstract fun bindEventSenderProcessorAsSessionLifecycleObserver(processor: EventSenderProcessorCoroutine): SessionLifecycleObserver + @Binds abstract fun bindInitialSyncProgressService(service: DefaultInitialSyncProgressService): InitialSyncProgressService @@ -361,4 +368,7 @@ internal abstract class SessionModule { @Binds abstract fun bindRedactEventTask(task: DefaultRedactEventTask): RedactEventTask + + @Binds + abstract fun bindEventSenderProcessor(processor: EventSenderProcessorCoroutine): EventSenderProcessor } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/FilterFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/FilterFactory.kt index 2eac0a5059..7415b988a4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/FilterFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/FilterFactory.kt @@ -33,11 +33,11 @@ internal object FilterFactory { return FilterUtil.enableLazyLoading(Filter(), true) } - fun createRiotFilter(): Filter { + fun createElementFilter(): Filter { return Filter( room = RoomFilter( - timeline = createRiotTimelineFilter(), - state = createRiotStateFilter() + timeline = createElementTimelineFilter(), + state = createElementStateFilter() ) ) } @@ -48,7 +48,7 @@ internal object FilterFactory { ) } - fun createRiotRoomFilter(): RoomEventFilter { + fun createElementRoomFilter(): RoomEventFilter { return RoomEventFilter( lazyLoadMembers = true // TODO Enable this for optimization @@ -56,26 +56,26 @@ internal object FilterFactory { ) } - private fun createRiotTimelineFilter(): RoomEventFilter { - return RoomEventFilter().apply { + private fun createElementTimelineFilter(): RoomEventFilter? { + return null // RoomEventFilter().apply { // TODO Enable this for optimization // types = listOfSupportedEventTypes.toMutableList() - } + // } } - private fun createRiotStateFilter(): RoomEventFilter { + private fun createElementStateFilter(): RoomEventFilter { return RoomEventFilter( lazyLoadMembers = true ) } - // Get only managed types by Riot + // Get only managed types by Element private val listOfSupportedEventTypes = listOf( // TODO Complete the list EventType.MESSAGE ) - // Get only managed types by Riot + // Get only managed types by Element private val listOfSupportedStateEventTypes = listOf( // TODO Complete the list EventType.STATE_ROOM_MEMBER diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/SaveFilterTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/SaveFilterTask.kt index da747934e2..d42962d54a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/SaveFilterTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/SaveFilterTask.kt @@ -42,18 +42,18 @@ internal class DefaultSaveFilterTask @Inject constructor( override suspend fun execute(params: SaveFilterTask.Params) { val filterBody = when (params.filterPreset) { - FilterService.FilterPreset.RiotFilter -> { - FilterFactory.createRiotFilter() + FilterService.FilterPreset.ElementFilter -> { + FilterFactory.createElementFilter() } - FilterService.FilterPreset.NoFilter -> { + FilterService.FilterPreset.NoFilter -> { FilterFactory.createDefaultFilter() } } val roomFilter = when (params.filterPreset) { - FilterService.FilterPreset.RiotFilter -> { - FilterFactory.createRiotRoomFilter() + FilterService.FilterPreset.ElementFilter -> { + FilterFactory.createElementRoomFilter() } - FilterService.FilterPreset.NoFilter -> { + FilterService.FilterPreset.NoFilter -> { FilterFactory.createDefaultRoomFilter() } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/DefaultHomeServerCapabilitiesService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/DefaultHomeServerCapabilitiesService.kt index 27396aac80..0ed690d972 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/DefaultHomeServerCapabilitiesService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/DefaultHomeServerCapabilitiesService.kt @@ -17,16 +17,23 @@ package org.matrix.android.sdk.internal.session.homeserver import com.zhuinden.monarchy.Monarchy +import io.realm.Realm import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService import org.matrix.android.sdk.internal.database.mapper.HomeServerCapabilitiesMapper import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntity import org.matrix.android.sdk.internal.database.query.get import org.matrix.android.sdk.internal.di.SessionDatabase -import io.realm.Realm import javax.inject.Inject -internal class DefaultHomeServerCapabilitiesService @Inject constructor(@SessionDatabase private val monarchy: Monarchy) : HomeServerCapabilitiesService { +internal class DefaultHomeServerCapabilitiesService @Inject constructor( + @SessionDatabase private val monarchy: Monarchy, + private val getHomeServerCapabilitiesTask: GetHomeServerCapabilitiesTask +) : HomeServerCapabilitiesService { + + override suspend fun refreshHomeServerCapabilities() { + getHomeServerCapabilitiesTask.execute(GetHomeServerCapabilitiesTask.Params(forceRefresh = true)) + } override fun getHomeServerCapabilities(): HomeServerCapabilities { return Realm.getInstance(monarchy.realmConfiguration).use { realm -> diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt index 845cfb392e..84c9132d61 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt @@ -38,7 +38,11 @@ import timber.log.Timber import java.util.Date import javax.inject.Inject -internal interface GetHomeServerCapabilitiesTask : Task +internal interface GetHomeServerCapabilitiesTask : Task { + data class Params( + val forceRefresh: Boolean + ) +} internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor( private val capabilitiesAPI: CapabilitiesAPI, @@ -52,12 +56,14 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor( private val userId: String ) : GetHomeServerCapabilitiesTask { - override suspend fun execute(params: Unit) { - var doRequest = false - monarchy.awaitTransaction { realm -> - val homeServerCapabilitiesEntity = HomeServerCapabilitiesEntity.getOrCreate(realm) + override suspend fun execute(params: GetHomeServerCapabilitiesTask.Params) { + var doRequest = params.forceRefresh + if (!doRequest) { + monarchy.awaitTransaction { realm -> + val homeServerCapabilitiesEntity = HomeServerCapabilitiesEntity.getOrCreate(realm) - doRequest = homeServerCapabilitiesEntity.lastUpdatedTimestamp + MIN_DELAY_BETWEEN_TWO_REQUEST_MILLIS < Date().time + doRequest = homeServerCapabilitiesEntity.lastUpdatedTimestamp + MIN_DELAY_BETWEEN_TWO_REQUEST_MILLIS < Date().time + } } if (!doRequest) { @@ -123,7 +129,7 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor( } companion object { - // 8 hours like on Riot Web + // 8 hours like on Element Web private const val MIN_DELAY_BETWEEN_TWO_REQUEST_MILLIS = 8 * 60 * 60 * 1000 } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/DefaultIdentityService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/DefaultIdentityService.kt index c6fb34151c..948e387cb1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/DefaultIdentityService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/identity/DefaultIdentityService.kt @@ -92,7 +92,7 @@ internal class DefaultIdentityService @Inject constructor( private val listeners = mutableSetOf() - override fun onStart() { + override fun onSessionStarted() { lifecycleRegistry.currentState = Lifecycle.State.STARTED // Observe the account data change accountDataDataSource @@ -117,7 +117,7 @@ internal class DefaultIdentityService @Inject constructor( } } - override fun onStop() { + override fun onSessionStopped() { lifecycleRegistry.currentState = Lifecycle.State.DESTROYED } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/DefaultInitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/DefaultInitialSyncProgressService.kt new file mode 100644 index 0000000000..eb3e3066b1 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/DefaultInitialSyncProgressService.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2020 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.session.initsync + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import org.matrix.android.sdk.api.session.initsync.InitSyncStep +import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService +import org.matrix.android.sdk.internal.session.SessionScope +import javax.inject.Inject + +@SessionScope +internal class DefaultInitialSyncProgressService @Inject constructor() + : InitialSyncProgressService, + ProgressReporter { + + private val status = MutableLiveData() + + private var rootTask: TaskInfo? = null + + override fun getInitialSyncProgressStatus(): LiveData { + return status + } + + /** + * Create a rootTask + */ + fun startRoot(initSyncStep: InitSyncStep, + totalProgress: Int) { + endAll() + rootTask = TaskInfo(initSyncStep, totalProgress, null, 1F) + reportProgress(0F) + } + + /** + * Add a child to the leaf + */ + override fun startTask(initSyncStep: InitSyncStep, + totalProgress: Int, + parentWeight: Float) { + val currentLeaf = rootTask?.leaf() ?: return + currentLeaf.child = TaskInfo( + initSyncStep = initSyncStep, + totalProgress = totalProgress, + parent = currentLeaf, + parentWeight = parentWeight + ) + reportProgress(0F) + } + + override fun reportProgress(progress: Float) { + rootTask?.let { root -> + root.leaf().let { leaf -> + // Update the progress of the leaf and all its parents + leaf.setProgress(progress) + // Then update the live data using leaf wording and root progress + status.postValue(InitialSyncProgressService.Status.Progressing(leaf.initSyncStep, root.currentProgress.toInt())) + } + } + } + + override fun endTask() { + rootTask?.leaf()?.let { endedTask -> + // Ensure the task progress is complete + reportProgress(endedTask.totalProgress.toFloat()) + endedTask.parent?.child = null + + if (endedTask.parent != null) { + // And close it + endedTask.parent.child = null + } else { + status.postValue(InitialSyncProgressService.Status.Idle) + } + } + } + + fun endAll() { + rootTask = null + status.postValue(InitialSyncProgressService.Status.Idle) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/Extensions.kt new file mode 100644 index 0000000000..b40b1a56bf --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/Extensions.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2021 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.session.initsync + +import org.matrix.android.sdk.api.session.initsync.InitSyncStep + +internal inline fun reportSubtask(reporter: ProgressReporter?, + initSyncStep: InitSyncStep, + totalProgress: Int, + parentWeight: Float, + block: () -> T): T { + reporter?.startTask(initSyncStep, totalProgress, parentWeight) + return block().also { + reporter?.endTask() + } +} + +internal inline fun Map.mapWithProgress(reporter: ProgressReporter?, + initSyncStep: InitSyncStep, + parentWeight: Float, + transform: (Map.Entry) -> R): List { + var current = 0F + reporter?.startTask(initSyncStep, count() + 1, parentWeight) + return map { + reporter?.reportProgress(current) + current++ + transform.invoke(it) + }.also { + reporter?.endTask() + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/ProgressReporter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/ProgressReporter.kt new file mode 100644 index 0000000000..8a7b26b4b8 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/ProgressReporter.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2021 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.session.initsync + +import org.matrix.android.sdk.api.session.initsync.InitSyncStep + +internal interface ProgressReporter { + fun startTask(initSyncStep: InitSyncStep, + totalProgress: Int, + parentWeight: Float) + + fun reportProgress(progress: Float) + + fun endTask() +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/TaskInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/TaskInfo.kt new file mode 100644 index 0000000000..3e4cce2e1f --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/TaskInfo.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2021 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.session.initsync + +import org.matrix.android.sdk.api.session.initsync.InitSyncStep +import timber.log.Timber + +internal class TaskInfo(val initSyncStep: InitSyncStep, + val totalProgress: Int, + val parent: TaskInfo?, + val parentWeight: Float) { + var child: TaskInfo? = null + var currentProgress = 0F + private set + private val offset = parent?.currentProgress ?: 0F + + /** + * Get the further child + */ + fun leaf(): TaskInfo { + var last = this + while (last.child != null) { + last = last.child!! + } + return last + } + + /** + * Set progress of this task and update the parent progress iteratively + */ + fun setProgress(progress: Float) { + Timber.v("setProgress: $progress / $totalProgress") + currentProgress = progress + + parent?.let { + val parentProgress = (currentProgress / totalProgress) * (parentWeight * it.totalProgress) + it.setProgress(offset + parentProgress) + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt index 19a87103f4..e34615d269 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt @@ -77,7 +77,7 @@ internal class IntegrationManager @Inject constructor(matrixConfiguration: Matri currentConfigs.add(defaultConfig) } - override fun onStart() { + override fun onSessionStarted() { lifecycleRegistry.currentState = Lifecycle.State.STARTED observeWellknownConfig() accountDataDataSource @@ -105,7 +105,7 @@ internal class IntegrationManager @Inject constructor(matrixConfiguration: Matri } } - override fun onStop() { + override fun onSessionStopped() { lifecycleRegistry.currentState = Lifecycle.State.DESTROYED } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt index 7763251a01..54883b51e6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt @@ -80,7 +80,7 @@ internal class DefaultProcessEventForPushTask @Inject constructor( val allRedactedEvents = params.syncResponse.join .asSequence() - .mapNotNull { (_, value) -> value.timeline?.events } + .mapNotNull { it.value.timeline?.events } .flatten() .filter { it.type == EventType.REDACTION } .mapNotNull { it.redacts } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt index 7a819250cf..8e817ec31a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoom.kt @@ -45,6 +45,7 @@ import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryDataSourc import org.matrix.android.sdk.internal.session.search.SearchTask import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.task.configureWith +import org.matrix.android.sdk.internal.util.awaitCallback import java.security.InvalidParameterException import javax.inject.Inject @@ -104,6 +105,12 @@ internal class DefaultRoom @Inject constructor(override val roomId: String, return cryptoService.shouldEncryptForInvitedMembers(roomId) } + override suspend fun prepareToEncrypt() { + awaitCallback { + cryptoService.prepareToEncrypt(roomId, it) + } + } + override suspend fun enableEncryption(algorithm: String) { when { isEncrypted() -> { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomDirectoryService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomDirectoryService.kt index f9047fdf3c..218d846afb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomDirectoryService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomDirectoryService.kt @@ -16,33 +16,24 @@ package org.matrix.android.sdk.internal.session.room -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.room.RoomDirectoryService import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse -import org.matrix.android.sdk.api.util.Cancelable import org.matrix.android.sdk.internal.session.room.directory.GetPublicRoomTask import org.matrix.android.sdk.internal.session.room.directory.GetRoomDirectoryVisibilityTask import org.matrix.android.sdk.internal.session.room.directory.SetRoomDirectoryVisibilityTask -import org.matrix.android.sdk.internal.task.TaskExecutor -import org.matrix.android.sdk.internal.task.configureWith import javax.inject.Inject internal class DefaultRoomDirectoryService @Inject constructor( private val getPublicRoomTask: GetPublicRoomTask, private val getRoomDirectoryVisibilityTask: GetRoomDirectoryVisibilityTask, - private val setRoomDirectoryVisibilityTask: SetRoomDirectoryVisibilityTask, - private val taskExecutor: TaskExecutor) : RoomDirectoryService { + private val setRoomDirectoryVisibilityTask: SetRoomDirectoryVisibilityTask +) : RoomDirectoryService { - override fun getPublicRooms(server: String?, - publicRoomsParams: PublicRoomsParams, - callback: MatrixCallback): Cancelable { - return getPublicRoomTask - .configureWith(GetPublicRoomTask.Params(server, publicRoomsParams)) { - this.callback = callback - } - .executeBy(taskExecutor) + override suspend fun getPublicRooms(server: String?, + publicRoomsParams: PublicRoomsParams): PublicRoomsResponse { + return getPublicRoomTask.execute(GetPublicRoomTask.Params(server, publicRoomsParams)) } override suspend fun getRoomDirectoryVisibility(roomId: String): RoomDirectoryVisibility { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt index d090ba5296..60440c6359 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt @@ -16,6 +16,7 @@ package org.matrix.android.sdk.internal.session.room import io.realm.Realm +import org.matrix.android.sdk.api.crypto.VerificationState import org.matrix.android.sdk.api.session.events.model.AggregatedAnnotation import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType @@ -31,9 +32,11 @@ import org.matrix.android.sdk.api.session.room.model.message.MessagePollResponse import org.matrix.android.sdk.api.session.room.model.message.MessageRelationContent import org.matrix.android.sdk.api.session.room.model.relation.ReactionContent import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent +import org.matrix.android.sdk.internal.crypto.verification.toState import org.matrix.android.sdk.internal.database.mapper.ContentMapper import org.matrix.android.sdk.internal.database.mapper.EventMapper import org.matrix.android.sdk.internal.database.model.EditAggregatedSummaryEntity +import org.matrix.android.sdk.internal.database.model.EditionOfEvent import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntity import org.matrix.android.sdk.internal.database.model.EventEntity import org.matrix.android.sdk.internal.database.model.EventInsertType @@ -50,33 +53,6 @@ import org.matrix.android.sdk.internal.session.EventInsertLiveProcessor import timber.log.Timber import javax.inject.Inject -enum class VerificationState { - REQUEST, - WAITING, - CANCELED_BY_ME, - CANCELED_BY_OTHER, - DONE -} - -fun VerificationState.isCanceled(): Boolean { - return this == VerificationState.CANCELED_BY_ME || this == VerificationState.CANCELED_BY_OTHER -} - -// State transition with control -private fun VerificationState?.toState(newState: VerificationState): VerificationState { - // Cancel is always prioritary ? - // Eg id i found that mac or keys mismatch and send a cancel and the other send a done, i have to - // consider as canceled - if (newState.isCanceled()) { - return newState - } - // never move out of cancel - if (this?.isCanceled() == true) { - return this - } - return newState -} - internal class EventRelationsAggregationProcessor @Inject constructor(@UserId private val userId: String) : EventInsertLiveProcessor { @@ -118,13 +94,11 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr Timber.v("###REACTION Agreggation in room $roomId for event ${event.eventId}") handleInitialAggregatedRelations(event, roomId, event.unsignedData.relations.annotations, realm) - EventAnnotationsSummaryEntity.where(realm, event.eventId - ?: "").findFirst()?.let { - TimelineEventEntity.where(realm, roomId = roomId, eventId = event.eventId - ?: "").findFirst()?.let { tet -> - tet.annotations = it - } - } + EventAnnotationsSummaryEntity.where(realm, roomId, event.eventId ?: "").findFirst() + ?.let { + TimelineEventEntity.where(realm, roomId = roomId, eventId = event.eventId ?: "").findFirst() + ?.let { tet -> tet.annotations = it } + } } val content: MessageContent? = event.content.toModel() @@ -216,63 +190,78 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr // OPT OUT serer aggregation until API mature enough private val SHOULD_HANDLE_SERVER_AGREGGATION = false - private fun handleReplace(realm: Realm, event: Event, content: MessageContent, roomId: String, isLocalEcho: Boolean, relatedEventId: String? = null) { + private fun handleReplace(realm: Realm, + event: Event, + content: MessageContent, + roomId: String, + isLocalEcho: Boolean, + relatedEventId: String? = null) { val eventId = event.eventId ?: return val targetEventId = relatedEventId ?: content.relatesTo?.eventId ?: return val newContent = content.newContent ?: return + + // Check that the sender is the same + val editedEvent = EventEntity.where(realm, targetEventId).findFirst() + if (editedEvent == null) { + // We do not know yet about the edited event + } else if (editedEvent.sender != event.senderId) { + // Edited by someone else, ignore + Timber.w("Ignore edition by someone else") + return + } + // ok, this is a replace - val existing = EventAnnotationsSummaryEntity.getOrCreate(realm, roomId, targetEventId) + val eventAnnotationsSummaryEntity = EventAnnotationsSummaryEntity.getOrCreate(realm, roomId, targetEventId) // we have it - val existingSummary = existing.editSummary + val existingSummary = eventAnnotationsSummaryEntity.editSummary if (existingSummary == null) { Timber.v("###REPLACE new edit summary for $targetEventId, creating one (localEcho:$isLocalEcho)") // create the edit summary - val editSummary = realm.createObject(EditAggregatedSummaryEntity::class.java) - editSummary.aggregatedContent = ContentMapper.map(newContent) - if (isLocalEcho) { - editSummary.lastEditTs = 0 - editSummary.sourceLocalEchoEvents.add(eventId) - } else { - editSummary.lastEditTs = event.originServerTs ?: 0 - editSummary.sourceEvents.add(eventId) - } - - existing.editSummary = editSummary + eventAnnotationsSummaryEntity.editSummary = realm.createObject(EditAggregatedSummaryEntity::class.java) + .also { editSummary -> + editSummary.editions.add( + EditionOfEvent( + senderId = event.senderId ?: "", + eventId = event.eventId, + content = ContentMapper.map(newContent), + timestamp = if (isLocalEcho) 0 else event.originServerTs ?: 0, + isLocalEcho = isLocalEcho + ) + ) + } } else { - if (existingSummary.sourceEvents.contains(eventId)) { + if (existingSummary.editions.any { it.eventId == eventId }) { // ignore this event, we already know it (??) Timber.v("###REPLACE ignoring event for summary, it's known $eventId") return } val txId = event.unsignedData?.transactionId // is it a remote echo? - if (!isLocalEcho && existingSummary.sourceLocalEchoEvents.contains(txId)) { + if (!isLocalEcho && existingSummary.editions.any { it.eventId == txId }) { // ok it has already been managed Timber.v("###REPLACE Receiving remote echo of edit (edit already done)") - existingSummary.sourceLocalEchoEvents.remove(txId) - existingSummary.sourceEvents.add(event.eventId) - } else if ( - isLocalEcho // do not rely on ts for local echo, take it - || event.originServerTs ?: 0 >= existingSummary.lastEditTs - ) { - Timber.v("###REPLACE Computing aggregated edit summary (isLocalEcho:$isLocalEcho)") - if (!isLocalEcho) { - // Do not take local echo originServerTs here, could mess up ordering (keep old ts) - existingSummary.lastEditTs = event.originServerTs ?: System.currentTimeMillis() - } - existingSummary.aggregatedContent = ContentMapper.map(newContent) - if (isLocalEcho) { - existingSummary.sourceLocalEchoEvents.add(eventId) - } else { - existingSummary.sourceEvents.add(eventId) + existingSummary.editions.firstOrNull { it.eventId == txId }?.let { + it.eventId = event.eventId + it.timestamp = event.originServerTs ?: System.currentTimeMillis() + it.isLocalEcho = false } } else { - // ignore this event for the summary (back paginate) - if (!isLocalEcho) { - existingSummary.sourceEvents.add(eventId) - } - Timber.v("###REPLACE ignoring event for summary, it's to old $eventId") + Timber.v("###REPLACE Computing aggregated edit summary (isLocalEcho:$isLocalEcho)") + existingSummary.editions.add( + EditionOfEvent( + senderId = event.senderId ?: "", + eventId = event.eventId, + content = ContentMapper.map(newContent), + timestamp = if (isLocalEcho) { + System.currentTimeMillis() + } else { + // Do not take local echo originServerTs here, could mess up ordering (keep old ts) + event.originServerTs ?: System.currentTimeMillis() + }, + isLocalEcho = isLocalEcho + ) + ) } } } @@ -290,7 +279,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr val eventTimestamp = event.originServerTs ?: return // ok, this is a poll response - var existing = EventAnnotationsSummaryEntity.where(realm, targetEventId).findFirst() + var existing = EventAnnotationsSummaryEntity.where(realm, roomId, targetEventId).findFirst() if (existing == null) { Timber.v("## POLL creating new relation summary for $targetEventId") existing = EventAnnotationsSummaryEntity.create(realm, roomId, targetEventId) @@ -370,7 +359,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr aggregation.chunk?.forEach { if (it.type == EventType.REACTION) { val eventId = event.eventId ?: "" - val existing = EventAnnotationsSummaryEntity.where(realm, eventId).findFirst() + val existing = EventAnnotationsSummaryEntity.where(realm, roomId, eventId).findFirst() if (existing == null) { val eventSummary = EventAnnotationsSummaryEntity.create(realm, roomId, eventId) val sum = realm.createObject(ReactionAggregatedSummaryEntity::class.java) @@ -454,46 +443,29 @@ internal class EventRelationsAggregationProcessor @Inject constructor(@UserId pr */ private fun handleRedactionOfReplace(redacted: EventEntity, relatedEventId: String, realm: Realm) { Timber.d("Handle redaction of m.replace") - val eventSummary = EventAnnotationsSummaryEntity.where(realm, relatedEventId).findFirst() + val eventSummary = EventAnnotationsSummaryEntity.where(realm, redacted.roomId, relatedEventId).findFirst() if (eventSummary == null) { Timber.w("Redaction of a replace targeting an unknown event $relatedEventId") return } - val sourceEvents = eventSummary.editSummary?.sourceEvents - val sourceToDiscard = sourceEvents?.indexOf(redacted.eventId) + val sourceToDiscard = eventSummary.editSummary?.editions?.firstOrNull { it.eventId == redacted.eventId } if (sourceToDiscard == null) { Timber.w("Redaction of a replace that was not known in aggregation $sourceToDiscard") return } - // Need to remove this event from the redaction list and compute new aggregation state - sourceEvents.removeAt(sourceToDiscard) - val previousEdit = sourceEvents.mapNotNull { EventEntity.where(realm, it).findFirst() }.sortedBy { it.originServerTs }.lastOrNull() - if (previousEdit == null) { - // revert to original - eventSummary.editSummary?.deleteFromRealm() - } else { - // I have the last event - ContentMapper.map(previousEdit.content)?.toModel()?.newContent?.let { newContent -> - eventSummary.editSummary?.lastEditTs = previousEdit.originServerTs - ?: System.currentTimeMillis() - eventSummary.editSummary?.aggregatedContent = ContentMapper.map(newContent) - } ?: run { - Timber.e("Failed to udate edited summary") - // TODO how to reccover that - } - } + // Need to remove this event from the edition list + sourceToDiscard.deleteFromRealm() } - fun handleReactionRedact(eventToPrune: EventEntity, realm: Realm, userId: String) { + private fun handleReactionRedact(eventToPrune: EventEntity, realm: Realm, userId: String) { Timber.v("REDACTION of reaction ${eventToPrune.eventId}") // delete a reaction, need to update the annotation summary if any - val reactionContent: ReactionContent = EventMapper.map(eventToPrune).content.toModel() - ?: return + val reactionContent: ReactionContent = EventMapper.map(eventToPrune).content.toModel() ?: return val eventThatWasReacted = reactionContent.relatesTo?.eventId ?: return val reactionKey = reactionContent.relatesTo.key Timber.v("REMOVE reaction for key $reactionKey") - val summary = EventAnnotationsSummaryEntity.where(realm, eventThatWasReacted).findFirst() + val summary = EventAnnotationsSummaryEntity.where(realm, eventToPrune.roomId, eventThatWasReacted).findFirst() if (summary != null) { summary.reactionsSummary.where() .equalTo(ReactionAggregatedSummaryEntityFields.KEY, reactionKey) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/LoadRoomMembersTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/LoadRoomMembersTask.kt index 2be90bf8e3..97cfcdaa44 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/LoadRoomMembersTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/LoadRoomMembersTask.kt @@ -105,12 +105,17 @@ internal class DefaultLoadRoomMembersTask @Inject constructor( ?: realm.createObject(roomId) val now = System.currentTimeMillis() for (roomMemberEvent in response.roomMemberEvents) { - if (roomMemberEvent.eventId == null || roomMemberEvent.stateKey == null) { + if (roomMemberEvent.eventId == null || roomMemberEvent.stateKey == null || roomMemberEvent.type == null) { continue } val ageLocalTs = roomMemberEvent.unsignedData?.age?.let { now - it } val eventEntity = roomMemberEvent.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION) - CurrentStateEventEntity.getOrCreate(realm, roomId, roomMemberEvent.stateKey, roomMemberEvent.type).apply { + CurrentStateEventEntity.getOrCreate( + realm, + roomId, + roomMemberEvent.stateKey, + roomMemberEvent.type + ).apply { eventId = roomMemberEvent.eventId root = eventEntity } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt index 784b610af7..0e18e30b13 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/membership/RoomDisplayNameResolver.kt @@ -17,7 +17,7 @@ package org.matrix.android.sdk.internal.session.room.membership import io.realm.Realm -import org.matrix.android.sdk.R +import org.matrix.android.sdk.api.MatrixConfiguration import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.Membership @@ -32,17 +32,18 @@ import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity import org.matrix.android.sdk.internal.database.query.getOrNull import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.di.UserId -import org.matrix.android.sdk.internal.util.StringProvider import javax.inject.Inject /** * This class computes room display name */ internal class RoomDisplayNameResolver @Inject constructor( - private val stringProvider: StringProvider, + matrixConfiguration: MatrixConfiguration, @UserId private val userId: String ) { + private val roomDisplayNameFallbackProvider = matrixConfiguration.roomDisplayNameFallbackProvider + /** * Compute the room display name * @@ -82,7 +83,7 @@ internal class RoomDisplayNameResolver @Inject constructor( .findFirst() ?.displayName } else { - stringProvider.getString(R.string.room_displayname_room_invite) + roomDisplayNameFallbackProvider.getNameForRoomInvite() } } else if (roomEntity?.membership == Membership.JOIN) { val roomSummary = RoomSummaryEntity.where(realm, roomId).findFirst() @@ -104,25 +105,25 @@ internal class RoomDisplayNameResolver @Inject constructor( val otherMembersCount = otherMembersSubset.count() name = when (otherMembersCount) { 0 -> { - stringProvider.getString(R.string.room_displayname_empty_room) + roomDisplayNameFallbackProvider.getNameForEmptyRoom() // TODO (was xx and yyy) ... } 1 -> resolveRoomMemberName(otherMembersSubset[0], roomMembers) 2 -> { - stringProvider.getString(R.string.room_displayname_two_members, + roomDisplayNameFallbackProvider.getNameFor2members( resolveRoomMemberName(otherMembersSubset[0], roomMembers), resolveRoomMemberName(otherMembersSubset[1], roomMembers) ) } 3 -> { - stringProvider.getString(R.string.room_displayname_3_members, + roomDisplayNameFallbackProvider.getNameFor3members( resolveRoomMemberName(otherMembersSubset[0], roomMembers), resolveRoomMemberName(otherMembersSubset[1], roomMembers), resolveRoomMemberName(otherMembersSubset[2], roomMembers) ) } 4 -> { - stringProvider.getString(R.string.room_displayname_4_members, + roomDisplayNameFallbackProvider.getNameFor4members( resolveRoomMemberName(otherMembersSubset[0], roomMembers), resolveRoomMemberName(otherMembersSubset[1], roomMembers), resolveRoomMemberName(otherMembersSubset[2], roomMembers), @@ -131,9 +132,7 @@ internal class RoomDisplayNameResolver @Inject constructor( } else -> { val remainingCount = invitedCount + joinedCount - otherMembersCount + 1 - stringProvider.getQuantityString( - R.plurals.room_displayname_four_and_more_members, - remainingCount, + roomDisplayNameFallbackProvider.getNameFor4membersAndMore( resolveRoomMemberName(otherMembersSubset[0], roomMembers), resolveRoomMemberName(otherMembersSubset[1], roomMembers), resolveRoomMemberName(otherMembersSubset[2], roomMembers), diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/DefaultRelationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/DefaultRelationService.kt index b7caf62865..9693e56ff0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/DefaultRelationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/DefaultRelationService.kt @@ -17,14 +17,13 @@ package org.matrix.android.sdk.internal.session.room.relation import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations -import dagger.assisted.Assisted -import dagger.assisted.AssistedInject -import dagger.assisted.AssistedFactory import com.zhuinden.monarchy.Monarchy +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary -import org.matrix.android.sdk.api.session.room.model.message.MessageType import org.matrix.android.sdk.api.session.room.model.relation.RelationService import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.util.Cancelable @@ -47,6 +46,7 @@ import timber.log.Timber internal class DefaultRelationService @AssistedInject constructor( @Assisted private val roomId: String, + private val eventEditor: EventEditor, private val eventSenderProcessor: EventSenderProcessor, private val eventFactory: LocalEchoEventFactory, private val cryptoSessionInfoProvider: CryptoSessionInfoProvider, @@ -112,41 +112,23 @@ internal class DefaultRelationService @AssistedInject constructor( .executeBy(taskExecutor) } - override fun editTextMessage(targetEventId: String, + override fun editTextMessage(targetEvent: TimelineEvent, msgType: String, newBodyText: CharSequence, newBodyAutoMarkdown: Boolean, compatibilityBodyText: String): Cancelable { - val event = eventFactory - .createReplaceTextEvent(roomId, targetEventId, newBodyText, newBodyAutoMarkdown, msgType, compatibilityBodyText) - .also { saveLocalEcho(it) } - return eventSenderProcessor.postEvent(event, cryptoSessionInfoProvider.isRoomEncrypted(roomId)) + return eventEditor.editTextMessage(targetEvent, msgType, newBodyText, newBodyAutoMarkdown, compatibilityBodyText) } override fun editReply(replyToEdit: TimelineEvent, originalTimelineEvent: TimelineEvent, newBodyText: String, compatibilityBodyText: String): Cancelable { - val event = eventFactory.createReplaceTextOfReply( - roomId, - replyToEdit, - originalTimelineEvent, - newBodyText, - true, - MessageType.MSGTYPE_TEXT, - compatibilityBodyText - ) - .also { saveLocalEcho(it) } - return eventSenderProcessor.postEvent(event, cryptoSessionInfoProvider.isRoomEncrypted(roomId)) + return eventEditor.editReply(replyToEdit, originalTimelineEvent, newBodyText, compatibilityBodyText) } - override fun fetchEditHistory(eventId: String, callback: MatrixCallback>) { - val params = FetchEditHistoryTask.Params(roomId, eventId) - fetchEditHistoryTask - .configureWith(params) { - this.callback = callback - } - .executeBy(taskExecutor) + override suspend fun fetchEditHistory(eventId: String): List { + return fetchEditHistoryTask.execute(FetchEditHistoryTask.Params(roomId, eventId)) } override fun replyToMessage(eventReplied: TimelineEvent, replyText: CharSequence, autoMarkdown: Boolean): Cancelable? { @@ -159,7 +141,7 @@ internal class DefaultRelationService @AssistedInject constructor( override fun getEventAnnotationsSummary(eventId: String): EventAnnotationsSummary? { return monarchy.fetchCopyMap( - { EventAnnotationsSummaryEntity.where(it, eventId).findFirst() }, + { EventAnnotationsSummaryEntity.where(it, roomId, eventId).findFirst() }, { entity, _ -> entity.asDomain() } @@ -168,7 +150,7 @@ internal class DefaultRelationService @AssistedInject constructor( override fun getEventAnnotationsSummaryLive(eventId: String): LiveData> { val liveData = monarchy.findAllMappedWithChanges( - { EventAnnotationsSummaryEntity.where(it, eventId) }, + { EventAnnotationsSummaryEntity.where(it, roomId, eventId) }, { it.asDomain() } ) return Transformations.map(liveData) { results -> diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/EventEditor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/EventEditor.kt new file mode 100644 index 0000000000..5fe06287d2 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/EventEditor.kt @@ -0,0 +1,104 @@ +/* + * Copyright 2021 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.session.room.relation + +import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.room.model.message.MessageType +import org.matrix.android.sdk.api.session.room.send.SendState +import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent +import org.matrix.android.sdk.api.util.Cancelable +import org.matrix.android.sdk.api.util.NoOpCancellable +import org.matrix.android.sdk.internal.crypto.CryptoSessionInfoProvider +import org.matrix.android.sdk.internal.database.mapper.toEntity +import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory +import org.matrix.android.sdk.internal.session.room.send.LocalEchoRepository +import org.matrix.android.sdk.internal.session.room.send.queue.EventSenderProcessor +import timber.log.Timber +import javax.inject.Inject + +internal class EventEditor @Inject constructor(private val eventSenderProcessor: EventSenderProcessor, + private val eventFactory: LocalEchoEventFactory, + private val cryptoSessionInfoProvider: CryptoSessionInfoProvider, + private val localEchoRepository: LocalEchoRepository) { + + fun editTextMessage(targetEvent: TimelineEvent, + msgType: String, + newBodyText: CharSequence, + newBodyAutoMarkdown: Boolean, + compatibilityBodyText: String): Cancelable { + val roomId = targetEvent.roomId + if (targetEvent.root.sendState.hasFailed()) { + // We create a new in memory event for the EventSenderProcessor but we keep the eventId of the failed event. + val editedEvent = eventFactory.createTextEvent(roomId, msgType, newBodyText, newBodyAutoMarkdown).copy( + eventId = targetEvent.eventId + ) + updateFailedEchoWithEvent(roomId, targetEvent.eventId, editedEvent) + return eventSenderProcessor.postEvent(editedEvent, cryptoSessionInfoProvider.isRoomEncrypted(roomId)) + } else if (targetEvent.root.sendState.isSent()) { + val event = eventFactory + .createReplaceTextEvent(roomId, targetEvent.eventId, newBodyText, newBodyAutoMarkdown, msgType, compatibilityBodyText) + .also { localEchoRepository.createLocalEcho(it) } + return eventSenderProcessor.postEvent(event, cryptoSessionInfoProvider.isRoomEncrypted(roomId)) + } else { + // Should we throw? + Timber.w("Can't edit a sending event") + return NoOpCancellable + } + } + + fun editReply(replyToEdit: TimelineEvent, + originalTimelineEvent: TimelineEvent, + newBodyText: String, + compatibilityBodyText: String): Cancelable { + val roomId = replyToEdit.roomId + if (replyToEdit.root.sendState.hasFailed()) { + // We create a new in memory event for the EventSenderProcessor but we keep the eventId of the failed event. + val editedEvent = eventFactory.createReplyTextEvent(roomId, originalTimelineEvent, newBodyText, false)?.copy( + eventId = replyToEdit.eventId + ) ?: return NoOpCancellable + updateFailedEchoWithEvent(roomId, replyToEdit.eventId, editedEvent) + return eventSenderProcessor.postEvent(editedEvent, cryptoSessionInfoProvider.isRoomEncrypted(roomId)) + } else if (replyToEdit.root.sendState.isSent()) { + val event = eventFactory.createReplaceTextOfReply( + roomId, + replyToEdit, + originalTimelineEvent, + newBodyText, + true, + MessageType.MSGTYPE_TEXT, + compatibilityBodyText + ) + .also { localEchoRepository.createLocalEcho(it) } + return eventSenderProcessor.postEvent(event, cryptoSessionInfoProvider.isRoomEncrypted(roomId)) + } else { + // Should we throw? + Timber.w("Can't edit a sending event") + return NoOpCancellable + } + } + + private fun updateFailedEchoWithEvent(roomId: String, failedEchoEventId: String, editedEvent: Event) { + val editedEventEntity = editedEvent.toEntity(roomId, SendState.UNSENT, System.currentTimeMillis()) + localEchoRepository.updateEchoAsync(failedEchoEventId) { _, entity -> + entity.content = editedEventEntity.content + entity.ageLocalTs = editedEventEntity.ageLocalTs + entity.age = editedEventEntity.age + entity.originServerTs = editedEventEntity.originServerTs + entity.sendState = editedEventEntity.sendState + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FetchEditHistoryTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FetchEditHistoryTask.kt index 854585ca29..f9fd5f9348 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FetchEditHistoryTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FetchEditHistoryTask.kt @@ -49,8 +49,11 @@ internal class DefaultFetchEditHistoryTask @Inject constructor( ) } - val events = response.chunks.toMutableList() - response.originalEvent?.let { events.add(it) } - return events + // Filter out edition form other users, and redacted editions + val originalSenderId = response.originalEvent?.senderId + val events = response.chunks + .filter { it.senderId == originalSenderId } + .filter { !it.isRedacted() } + return events + listOfNotNull(response.originalEvent) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FindReactionEventForUndoTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FindReactionEventForUndoTask.kt index fa6db2ee37..863ae4f5ce 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FindReactionEventForUndoTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FindReactionEventForUndoTask.kt @@ -45,16 +45,16 @@ internal class DefaultFindReactionEventForUndoTask @Inject constructor( override suspend fun execute(params: FindReactionEventForUndoTask.Params): FindReactionEventForUndoTask.Result { val eventId = Realm.getInstance(monarchy.realmConfiguration).use { realm -> - getReactionToRedact(realm, params.reaction, params.eventId)?.eventId + getReactionToRedact(realm, params)?.eventId } return FindReactionEventForUndoTask.Result(eventId) } - private fun getReactionToRedact(realm: Realm, reaction: String, eventId: String): EventEntity? { - val summary = EventAnnotationsSummaryEntity.where(realm, eventId).findFirst() ?: return null + private fun getReactionToRedact(realm: Realm, params: FindReactionEventForUndoTask.Params): EventEntity? { + val summary = EventAnnotationsSummaryEntity.where(realm, params.roomId, params.eventId).findFirst() ?: return null val rase = summary.reactionsSummary.where() - .equalTo(ReactionAggregatedSummaryEntityFields.KEY, reaction) + .equalTo(ReactionAggregatedSummaryEntityFields.KEY, params.reaction) .findFirst() ?: return null // want to find the event originated by me! diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/SendRelationWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/SendRelationWorker.kt index c12597bea0..403aa274fe 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/SendRelationWorker.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/SendRelationWorker.kt @@ -89,7 +89,7 @@ internal class SendRelationWorker(context: Context, params: WorkerParameters) roomId = roomId, parentId = relatedEventId, relationType = relationType, - eventType = localEvent.type, + eventType = localEvent.type!!, content = localEvent.content ) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/UpdateQuickReactionTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/UpdateQuickReactionTask.kt index 1f68a700ad..32d6c5aa7e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/UpdateQuickReactionTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/UpdateQuickReactionTask.kt @@ -47,22 +47,22 @@ internal class DefaultUpdateQuickReactionTask @Inject constructor(@SessionDataba override suspend fun execute(params: UpdateQuickReactionTask.Params): UpdateQuickReactionTask.Result { var res: Pair?>? = null monarchy.doWithRealm { realm -> - res = updateQuickReaction(realm, params.reaction, params.oppositeReaction, params.eventId) + res = updateQuickReaction(realm, params) } return UpdateQuickReactionTask.Result(res?.first, res?.second.orEmpty()) } - private fun updateQuickReaction(realm: Realm, reaction: String, oppositeReaction: String, eventId: String): Pair?> { + private fun updateQuickReaction(realm: Realm, params: UpdateQuickReactionTask.Params): Pair?> { // the emoji reaction has been selected, we need to check if we have reacted it or not - val existingSummary = EventAnnotationsSummaryEntity.where(realm, eventId).findFirst() - ?: return Pair(reaction, null) + val existingSummary = EventAnnotationsSummaryEntity.where(realm, params.roomId, params.eventId).findFirst() + ?: return Pair(params.reaction, null) // Ok there is already reactions on this event, have we reacted to it val aggregationForReaction = existingSummary.reactionsSummary.where() - .equalTo(ReactionAggregatedSummaryEntityFields.KEY, reaction) + .equalTo(ReactionAggregatedSummaryEntityFields.KEY, params.reaction) .findFirst() val aggregationForOppositeReaction = existingSummary.reactionsSummary.where() - .equalTo(ReactionAggregatedSummaryEntityFields.KEY, oppositeReaction) + .equalTo(ReactionAggregatedSummaryEntityFields.KEY, params.oppositeReaction) .findFirst() if (aggregationForReaction == null || !aggregationForReaction.addedByMe) { @@ -72,7 +72,7 @@ internal class DefaultUpdateQuickReactionTask @Inject constructor(@SessionDataba val entity = EventEntity.where(realm, it).findFirst() if (entity?.sender == userId) entity.eventId else null } - return Pair(reaction, toRedact) + return Pair(params.reaction, toRedact) } else { // I already added it, so i need to undo it (like a toggle) // find all m.redaction coming from me to readact them diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt index a12962b51f..c5b8b42b3c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt @@ -232,6 +232,14 @@ internal class DefaultSendService @AssistedInject constructor( } } + override fun cancelAllFailedMessages() { + taskExecutor.executorScope.launch { + localEchoRepository.getAllFailedEventsToResend(roomId).forEach { event -> + cancelSend(event.eventId) + } + } + } + override fun sendMedia(attachment: ContentAttachmentData, compressBeforeSending: Boolean, roomIds: Set): Cancelable { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt index c01923055b..432a4af062 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt @@ -20,7 +20,6 @@ import android.content.Context import android.graphics.Bitmap import android.media.MediaMetadataRetriever import androidx.exifinterface.media.ExifInterface -import org.matrix.android.sdk.R import org.matrix.android.sdk.api.session.content.ContentAttachmentData import org.matrix.android.sdk.api.session.events.model.Content import org.matrix.android.sdk.api.session.events.model.Event @@ -42,7 +41,6 @@ import org.matrix.android.sdk.api.session.room.model.message.MessageOptionsConte import org.matrix.android.sdk.api.session.room.model.message.MessagePollResponseContent import org.matrix.android.sdk.api.session.room.model.message.MessageTextContent import org.matrix.android.sdk.api.session.room.model.message.MessageType -import org.matrix.android.sdk.api.session.room.model.message.MessageVerificationRequestContent import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent import org.matrix.android.sdk.api.session.room.model.message.OPTION_TYPE_POLL import org.matrix.android.sdk.api.session.room.model.message.OptionItem @@ -59,7 +57,6 @@ import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.session.content.ThumbnailExtractor import org.matrix.android.sdk.internal.session.permalinks.PermalinkFactory import org.matrix.android.sdk.internal.session.room.send.pills.TextPillsUtils -import org.matrix.android.sdk.internal.util.StringProvider import javax.inject.Inject /** @@ -74,7 +71,6 @@ import javax.inject.Inject internal class LocalEchoEventFactory @Inject constructor( private val context: Context, @UserId private val userId: String, - private val stringProvider: StringProvider, private val markdownParser: MarkdownParser, private val textPillsUtils: TextPillsUtils, private val localEchoRepository: LocalEchoRepository, @@ -334,25 +330,6 @@ internal class LocalEchoEventFactory @Inject constructor( ) } - fun createVerificationRequest(roomId: String, fromDevice: String, toUserId: String, methods: List): Event { - val localId = LocalEcho.createLocalEchoId() - return Event( - roomId = roomId, - originServerTs = dummyOriginServerTs(), - senderId = userId, - eventId = localId, - type = EventType.MESSAGE, - content = MessageVerificationRequestContent( - body = stringProvider.getString(R.string.key_verification_request_fallback_message, userId), - fromDevice = fromDevice, - toUserId = toUserId, - timestamp = System.currentTimeMillis(), - methods = methods - ).toContent(), - unsignedData = UnsignedData(age = null, transactionId = localId) - ) - } - private fun dummyOriginServerTs(): Long { return System.currentTimeMillis() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoRepository.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoRepository.kt index f742271fa7..70245cbd5e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoRepository.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoRepository.kt @@ -27,7 +27,6 @@ import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.internal.database.RealmSessionProvider import org.matrix.android.sdk.internal.database.asyncTransaction -import org.matrix.android.sdk.internal.database.helper.nextId import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper import org.matrix.android.sdk.internal.database.mapper.asDomain import org.matrix.android.sdk.internal.database.mapper.toEntity @@ -45,6 +44,7 @@ import org.matrix.android.sdk.internal.session.room.timeline.TimelineInput import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.util.awaitTransaction import timber.log.Timber +import java.util.UUID import javax.inject.Inject internal class LocalEchoRepository @Inject constructor(@SessionDatabase private val monarchy: Monarchy, @@ -56,15 +56,15 @@ internal class LocalEchoRepository @Inject constructor(@SessionDatabase private fun createLocalEcho(event: Event) { val roomId = event.roomId ?: throw IllegalStateException("You should have set a roomId for your event") - val senderId = event.senderId ?: throw IllegalStateException("You should have set a senderIf for your event") - if (event.eventId == null) { - throw IllegalStateException("You should have set an eventId for your event") - } + val senderId = event.senderId ?: throw IllegalStateException("You should have set a senderId for your event") + event.eventId ?: throw IllegalStateException("You should have set an eventId for your event") + event.type ?: throw IllegalStateException("You should have set a type for your event") + val timelineEventEntity = realmSessionProvider.withRealm { realm -> val eventEntity = event.toEntity(roomId, SendState.UNSENT, System.currentTimeMillis()) val roomMemberHelper = RoomMemberHelper(realm, roomId) val myUser = roomMemberHelper.getLastRoomMember(senderId) - val localId = TimelineEventEntity.nextId(realm) + val localId = UUID.randomUUID().mostSignificantBits TimelineEventEntity(localId).also { it.root = eventEntity it.eventId = event.eventId diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessor.kt index 62338a1d07..8bafa5f882 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessor.kt @@ -1,11 +1,11 @@ /* - * Copyright 2020 The Matrix.org Foundation C.I.C. + * Copyright 2021 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 + * 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, @@ -16,235 +16,21 @@ package org.matrix.android.sdk.internal.session.room.send.queue -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import org.matrix.android.sdk.api.auth.data.SessionParams -import org.matrix.android.sdk.api.auth.data.sessionId -import org.matrix.android.sdk.api.extensions.tryOrNull -import org.matrix.android.sdk.api.failure.Failure -import org.matrix.android.sdk.api.failure.MatrixError -import org.matrix.android.sdk.api.failure.isTokenError -import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.events.model.Event -import org.matrix.android.sdk.api.session.sync.SyncState import org.matrix.android.sdk.api.util.Cancelable -import org.matrix.android.sdk.internal.session.SessionScope -import org.matrix.android.sdk.internal.task.TaskExecutor -import timber.log.Timber -import java.io.IOException -import java.net.InetAddress -import java.net.InetSocketAddress -import java.net.Socket -import java.util.Timer -import java.util.TimerTask -import java.util.concurrent.LinkedBlockingQueue -import javax.inject.Inject -import kotlin.concurrent.schedule +import org.matrix.android.sdk.internal.session.SessionLifecycleObserver -/** - * A simple ever running thread unique for that session responsible of sending events in order. - * Each send is retried 3 times, if there is no network (e.g if cannot ping home server) it will wait and - * periodically test reachability before resume (does not count as a retry) - * - * If the app is killed before all event were sent, on next wakeup the scheduled events will be re posted - */ -@SessionScope -internal class EventSenderProcessor @Inject constructor( - private val cryptoService: CryptoService, - private val sessionParams: SessionParams, - private val queuedTaskFactory: QueuedTaskFactory, - private val taskExecutor: TaskExecutor, - private val memento: QueueMemento -) : Thread("SENDER_THREAD_SID_${sessionParams.credentials.sessionId()}") { +internal interface EventSenderProcessor: SessionLifecycleObserver { - private fun markAsManaged(task: QueuedTask) { - memento.track(task) - } + fun postEvent(event: Event): Cancelable - private fun markAsFinished(task: QueuedTask) { - memento.unTrack(task) - } + fun postEvent(event: Event, encrypt: Boolean): Cancelable - // API - fun postEvent(event: Event): Cancelable { - return postEvent(event, event.roomId?.let { cryptoService.isRoomEncrypted(it) } ?: false) - } + fun postRedaction(redactionLocalEcho: Event, reason: String?): Cancelable - override fun start() { - super.start() - // We should check for sending events not handled because app was killed - // But we should be careful of only took those that was submitted to us, because if it's - // for example it's a media event it is handled by some worker and he will handle it - // This is a bit fragile :/ - // also some events cannot be retried manually by users, e.g reactions - // they were previously relying on workers to do the work :/ and was expected to always finally succeed - // Also some echos are not to be resent like redaction echos (fake event created for aggregation) + fun postRedaction(redactionLocalEchoId: String, eventToRedactId: String, roomId: String, reason: String?): Cancelable - tryOrNull { - taskExecutor.executorScope.launch { - Timber.d("## Send relaunched pending events on restart") - memento.restoreTasks(this@EventSenderProcessor) - } - } - } + fun postTask(task: QueuedTask): Cancelable - fun postEvent(event: Event, encrypt: Boolean): Cancelable { - val task = queuedTaskFactory.createSendTask(event, encrypt) - return postTask(task) - } - - fun postRedaction(redactionLocalEcho: Event, reason: String?): Cancelable { - return postRedaction(redactionLocalEcho.eventId!!, redactionLocalEcho.redacts!!, redactionLocalEcho.roomId!!, reason) - } - - fun postRedaction(redactionLocalEchoId: String, eventToRedactId: String, roomId: String, reason: String?): Cancelable { - val task = queuedTaskFactory.createRedactTask(redactionLocalEchoId, eventToRedactId, roomId, reason) - return postTask(task) - } - - fun postTask(task: QueuedTask): Cancelable { - // non blocking add to queue - sendingQueue.add(task) - markAsManaged(task) - return task - } - - fun cancel(eventId: String, roomId: String) { - (currentTask as? SendEventQueuedTask) - ?.takeIf { it -> it.event.eventId == eventId && it.event.roomId == roomId } - ?.cancel() - } - - companion object { - private const val RETRY_WAIT_TIME_MS = 10_000L - } - - private var currentTask: QueuedTask? = null - - private var sendingQueue = LinkedBlockingQueue() - - private var networkAvailableLock = Object() - private var canReachServer = true - private var retryNoNetworkTask: TimerTask? = null - - override fun run() { - Timber.v("## SendThread started ts:${System.currentTimeMillis()}") - try { - while (!isInterrupted) { - Timber.v("## SendThread wait for task to process") - val task = sendingQueue.take() - .also { currentTask = it } - Timber.v("## SendThread Found task to process $task") - - if (task.isCancelled()) { - Timber.v("## SendThread send cancelled for $task") - // we do not execute this one - continue - } - // we check for network connectivity - while (!canReachServer) { - Timber.v("## SendThread cannot reach server, wait ts:${System.currentTimeMillis()}") - // schedule to retry - waitForNetwork() - // if thread as been killed meanwhile -// if (state == State.KILLING) break - } - Timber.v("## Server is Reachable") - // so network is available - - runBlocking { - retryLoop@ while (task.retryCount < 3) { - try { - // SendPerformanceProfiler.startStage(task.event.eventId!!, SendPerformanceProfiler.Stages.SEND_WORKER) - Timber.v("## SendThread retryLoop for $task retryCount ${task.retryCount}") - task.execute() - // sendEventTask.execute(SendEventTask.Params(task.event, task.encrypt, cryptoService)) - // SendPerformanceProfiler.stopStage(task.event.eventId, SendPerformanceProfiler.Stages.SEND_WORKER) - break@retryLoop - } catch (exception: Throwable) { - when { - exception is IOException || exception is Failure.NetworkConnection -> { - canReachServer = false - task.retryCount++ - if (task.retryCount >= 3) task.onTaskFailed() - while (!canReachServer) { - Timber.v("## SendThread retryLoop cannot reach server, wait ts:${System.currentTimeMillis()}") - // schedule to retry - waitForNetwork() - } - } - (exception is Failure.ServerError && exception.error.code == MatrixError.M_LIMIT_EXCEEDED) -> { - task.retryCount++ - if (task.retryCount >= 3) task.onTaskFailed() - Timber.v("## SendThread retryLoop retryable error for $task reason: ${exception.localizedMessage}") - // wait a bit - // Todo if its a quota exception can we get timout? - sleep(3_000) - continue@retryLoop - } - exception.isTokenError() -> { - Timber.v("## SendThread retryLoop retryable TOKEN error, interrupt") - // we can exit the loop - task.onTaskFailed() - throw InterruptedException() - } - exception is CancellationException -> { - Timber.v("## SendThread task has been cancelled") - break@retryLoop - } - else -> { - Timber.v("## SendThread retryLoop Un-Retryable error, try next task") - // this task is in error, check next one? - task.onTaskFailed() - break@retryLoop - } - } - } - } - } - markAsFinished(task) - } - } catch (interruptionException: InterruptedException) { - // will be thrown is thread is interrupted while seeping - interrupt() - Timber.v("## InterruptedException!! ${interruptionException.localizedMessage}") - } -// state = State.KILLED - // is this needed? - retryNoNetworkTask?.cancel() - Timber.w("## SendThread finished ${System.currentTimeMillis()}") - } - - private fun waitForNetwork() { - retryNoNetworkTask = Timer(SyncState.NoNetwork.toString(), false).schedule(RETRY_WAIT_TIME_MS) { - synchronized(networkAvailableLock) { - canReachServer = checkHostAvailable().also { - Timber.v("## SendThread checkHostAvailable $it") - } - networkAvailableLock.notify() - } - } - synchronized(networkAvailableLock) { networkAvailableLock.wait() } - } - - /** - * Check if homeserver is reachable. - */ - private fun checkHostAvailable(): Boolean { - val host = sessionParams.homeServerConnectionConfig.homeServerUri.host ?: return false - val port = sessionParams.homeServerConnectionConfig.homeServerUri.port.takeIf { it != -1 } ?: 80 - val timeout = 30_000 - try { - Socket().use { socket -> - val inetAddress: InetAddress = InetAddress.getByName(host) - val inetSocketAddress = InetSocketAddress(inetAddress, port) - socket.connect(inetSocketAddress, timeout) - return true - } - } catch (e: IOException) { - Timber.v("## EventSender isHostAvailable failure ${e.localizedMessage}") - return false - } - } + fun cancel(eventId: String, roomId: String) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorCoroutine.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorCoroutine.kt new file mode 100644 index 0000000000..2972332989 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorCoroutine.kt @@ -0,0 +1,200 @@ +/* + * Copyright 2021 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.session.room.send.queue + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.matrix.android.sdk.api.auth.data.SessionParams +import org.matrix.android.sdk.api.failure.Failure +import org.matrix.android.sdk.api.failure.MatrixError +import org.matrix.android.sdk.api.session.crypto.CryptoService +import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.util.Cancelable +import org.matrix.android.sdk.internal.session.SessionScope +import org.matrix.android.sdk.internal.task.CoroutineSequencer +import org.matrix.android.sdk.internal.task.SemaphoreCoroutineSequencer +import org.matrix.android.sdk.internal.task.TaskExecutor +import org.matrix.android.sdk.internal.util.toCancelable +import timber.log.Timber +import java.io.IOException +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicBoolean +import javax.inject.Inject +import kotlin.coroutines.cancellation.CancellationException + +private const val RETRY_WAIT_TIME_MS = 10_000L +private const val MAX_RETRY_COUNT = 3 + +/** + * This class is responsible for sending events in order in each room. It uses the QueuedTask.queueIdentifier to execute tasks sequentially. + * Each send is retried 3 times, if there is no network (e.g if cannot ping home server) it will wait and + * periodically test reachability before resume (does not count as a retry) + * + * If the app is killed before all event were sent, on next wakeup the scheduled events will be re posted + * + */ +@SessionScope +internal class EventSenderProcessorCoroutine @Inject constructor( + private val cryptoService: CryptoService, + private val sessionParams: SessionParams, + private val queuedTaskFactory: QueuedTaskFactory, + private val taskExecutor: TaskExecutor, + private val memento: QueueMemento +) : EventSenderProcessor { + + private val waitForNetworkSequencer = SemaphoreCoroutineSequencer() + + /** + * sequencers use QueuedTask.queueIdentifier as key + */ + private val sequencers = ConcurrentHashMap() + + /** + * cancelableBag use QueuedTask.taskIdentifier as key + */ + private val cancelableBag = ConcurrentHashMap() + + override fun onSessionStarted() { + // We should check for sending events not handled because app was killed + // But we should be careful of only took those that was submitted to us, because if it's + // for example it's a media event it is handled by some worker and he will handle it + // This is a bit fragile :/ + // also some events cannot be retried manually by users, e.g reactions + // they were previously relying on workers to do the work :/ and was expected to always finally succeed + // Also some echos are not to be resent like redaction echos (fake event created for aggregation) + taskExecutor.executorScope.launch { + Timber.d("## Send relaunched pending events on restart") + try { + memento.restoreTasks(this@EventSenderProcessorCoroutine) + } catch (failure: Throwable) { + Timber.e(failure, "Fail restoring send tasks") + } + } + } + + override fun postEvent(event: Event): Cancelable { + return postEvent(event, event.roomId?.let { cryptoService.isRoomEncrypted(it) } ?: false) + } + + override fun postEvent(event: Event, encrypt: Boolean): Cancelable { + val task = queuedTaskFactory.createSendTask(event, encrypt) + return postTask(task) + } + + override fun postRedaction(redactionLocalEcho: Event, reason: String?): Cancelable { + return postRedaction(redactionLocalEcho.eventId!!, redactionLocalEcho.redacts!!, redactionLocalEcho.roomId!!, reason) + } + + override fun postRedaction(redactionLocalEchoId: String, eventToRedactId: String, roomId: String, reason: String?): Cancelable { + val task = queuedTaskFactory.createRedactTask(redactionLocalEchoId, eventToRedactId, roomId, reason) + return postTask(task) + } + + override fun postTask(task: QueuedTask): Cancelable { + markAsManaged(task) + val sequencer = sequencers.getOrPut(task.queueIdentifier) { + SemaphoreCoroutineSequencer() + } + Timber.v("## post $task") + return taskExecutor.executorScope + .launchWith(sequencer) { + executeTask(task) + }.toCancelable() + .also { + cancelableBag[task.taskIdentifier] = it + } + } + + override fun cancel(eventId: String, roomId: String) { + // eventId is most likely the taskIdentifier + cancelableBag[eventId]?.cancel() + } + + private fun CoroutineScope.launchWith(sequencer: CoroutineSequencer, block: suspend CoroutineScope.() -> Unit) = launch { + sequencer.post { + block() + } + } + + private suspend fun executeTask(task: QueuedTask) { + try { + if (task.isCancelled()) { + Timber.v("## $task has been cancelled, try next task") + return + } + task.waitForNetwork() + task.execute() + } catch (exception: Throwable) { + when { + exception is IOException || exception is Failure.NetworkConnection -> { + canReachServer.set(false) + task.markAsFailedOrRetry(exception, 0) + } + (exception is Failure.ServerError && exception.error.code == MatrixError.M_LIMIT_EXCEEDED) -> { + val delay = exception.error.retryAfterMillis?.plus(100) ?: 3_000 + task.markAsFailedOrRetry(exception, delay) + } + exception is CancellationException -> { + Timber.v("## $task has been cancelled, try next task") + } + else -> { + Timber.v("## un-retryable error for $task, try next task") + // this task is in error, check next one? + task.onTaskFailed() + } + } + } + markAsFinished(task) + } + + private suspend fun QueuedTask.markAsFailedOrRetry(failure: Throwable, retryDelay: Long) { + if (retryCount.incrementAndGet() >= MAX_RETRY_COUNT) { + onTaskFailed() + } else { + Timber.v("## retryable error for $this reason: ${failure.localizedMessage}") + // Wait if necessary + delay(retryDelay) + // And then retry + executeTask(this) + } + } + + private fun markAsManaged(task: QueuedTask) { + memento.track(task) + } + + private fun markAsFinished(task: QueuedTask) { + cancelableBag.remove(task.taskIdentifier) + memento.unTrack(task) + } + + private val canReachServer = AtomicBoolean(true) + + private suspend fun QueuedTask.waitForNetwork() = waitForNetworkSequencer.post { + while (!canReachServer.get()) { + Timber.v("## $this cannot reach server wait ts:${System.currentTimeMillis()}") + delay(RETRY_WAIT_TIME_MS) + withContext(Dispatchers.IO) { + val hostAvailable = HomeServerAvailabilityChecker(sessionParams).check() + canReachServer.set(hostAvailable) + } + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt new file mode 100644 index 0000000000..b79a86dd7e --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/EventSenderProcessorThread.kt @@ -0,0 +1,234 @@ +/* + * Copyright 2020 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.session.room.send.queue + +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import org.matrix.android.sdk.api.auth.data.SessionParams +import org.matrix.android.sdk.api.auth.data.sessionId +import org.matrix.android.sdk.api.extensions.tryOrNull +import org.matrix.android.sdk.api.failure.Failure +import org.matrix.android.sdk.api.failure.MatrixError +import org.matrix.android.sdk.api.failure.isTokenError +import org.matrix.android.sdk.api.session.crypto.CryptoService +import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.sync.SyncState +import org.matrix.android.sdk.api.util.Cancelable +import org.matrix.android.sdk.internal.session.SessionScope +import org.matrix.android.sdk.internal.task.TaskExecutor +import timber.log.Timber +import java.io.IOException +import java.util.Timer +import java.util.TimerTask +import java.util.concurrent.LinkedBlockingQueue +import javax.inject.Inject +import kotlin.concurrent.schedule + +/** + * A simple ever running thread unique for that session responsible of sending events in order. + * Each send is retried 3 times, if there is no network (e.g if cannot ping home server) it will wait and + * periodically test reachability before resume (does not count as a retry) + * + * If the app is killed before all event were sent, on next wakeup the scheduled events will be re posted + */ +@Deprecated("You should know use EventSenderProcessorCoroutine instead") +@SessionScope +internal class EventSenderProcessorThread @Inject constructor( + private val cryptoService: CryptoService, + private val sessionParams: SessionParams, + private val queuedTaskFactory: QueuedTaskFactory, + private val taskExecutor: TaskExecutor, + private val memento: QueueMemento +) : Thread("SENDER_THREAD_SID_${sessionParams.credentials.sessionId()}"), EventSenderProcessor { + + private fun markAsManaged(task: QueuedTask) { + memento.track(task) + } + + private fun markAsFinished(task: QueuedTask) { + memento.unTrack(task) + } + + override fun onSessionStarted() { + start() + } + + override fun onSessionStopped() { + interrupt() + } + + override fun start() { + super.start() + // We should check for sending events not handled because app was killed + // But we should be careful of only took those that was submitted to us, because if it's + // for example it's a media event it is handled by some worker and he will handle it + // This is a bit fragile :/ + // also some events cannot be retried manually by users, e.g reactions + // they were previously relying on workers to do the work :/ and was expected to always finally succeed + // Also some echos are not to be resent like redaction echos (fake event created for aggregation) + + tryOrNull { + taskExecutor.executorScope.launch { + Timber.d("## Send relaunched pending events on restart") + memento.restoreTasks(this@EventSenderProcessorThread) + } + } + } + + // API + override fun postEvent(event: Event): Cancelable { + return postEvent(event, event.roomId?.let { cryptoService.isRoomEncrypted(it) } ?: false) + } + + override fun postEvent(event: Event, encrypt: Boolean): Cancelable { + val task = queuedTaskFactory.createSendTask(event, encrypt) + return postTask(task) + } + + override fun postRedaction(redactionLocalEcho: Event, reason: String?): Cancelable { + return postRedaction(redactionLocalEcho.eventId!!, redactionLocalEcho.redacts!!, redactionLocalEcho.roomId!!, reason) + } + + override fun postRedaction(redactionLocalEchoId: String, eventToRedactId: String, roomId: String, reason: String?): Cancelable { + val task = queuedTaskFactory.createRedactTask(redactionLocalEchoId, eventToRedactId, roomId, reason) + return postTask(task) + } + + override fun postTask(task: QueuedTask): Cancelable { + // non blocking add to queue + sendingQueue.add(task) + markAsManaged(task) + return task + } + + override fun cancel(eventId: String, roomId: String) { + (currentTask as? SendEventQueuedTask) + ?.takeIf { it -> it.event.eventId == eventId && it.event.roomId == roomId } + ?.cancel() + } + + companion object { + private const val RETRY_WAIT_TIME_MS = 10_000L + } + + private var currentTask: QueuedTask? = null + + private var sendingQueue = LinkedBlockingQueue() + + private var networkAvailableLock = Object() + private var canReachServer = true + private var retryNoNetworkTask: TimerTask? = null + + override fun run() { + Timber.v("## SendThread started ts:${System.currentTimeMillis()}") + try { + while (!isInterrupted) { + Timber.v("## SendThread wait for task to process") + val task = sendingQueue.take() + .also { currentTask = it } + Timber.v("## SendThread Found task to process $task") + + if (task.isCancelled()) { + Timber.v("## SendThread send cancelled for $task") + // we do not execute this one + continue + } + // we check for network connectivity + while (!canReachServer) { + Timber.v("## SendThread cannot reach server, wait ts:${System.currentTimeMillis()}") + // schedule to retry + waitForNetwork() + // if thread as been killed meanwhile +// if (state == State.KILLING) break + } + Timber.v("## Server is Reachable") + // so network is available + + runBlocking { + retryLoop@ while (task.retryCount.get() < 3) { + try { + // SendPerformanceProfiler.startStage(task.event.eventId!!, SendPerformanceProfiler.Stages.SEND_WORKER) + Timber.v("## SendThread retryLoop for $task retryCount ${task.retryCount}") + task.execute() + // sendEventTask.execute(SendEventTask.Params(task.event, task.encrypt, cryptoService)) + // SendPerformanceProfiler.stopStage(task.event.eventId, SendPerformanceProfiler.Stages.SEND_WORKER) + break@retryLoop + } catch (exception: Throwable) { + when { + exception is IOException || exception is Failure.NetworkConnection -> { + canReachServer = false + if (task.retryCount.getAndIncrement() >= 3) task.onTaskFailed() + while (!canReachServer) { + Timber.v("## SendThread retryLoop cannot reach server, wait ts:${System.currentTimeMillis()}") + // schedule to retry + waitForNetwork() + } + } + (exception is Failure.ServerError && exception.error.code == MatrixError.M_LIMIT_EXCEEDED) -> { + if (task.retryCount.getAndIncrement() >= 3) task.onTaskFailed() + Timber.v("## SendThread retryLoop retryable error for $task reason: ${exception.localizedMessage}") + // wait a bit + // Todo if its a quota exception can we get timout? + sleep(3_000) + continue@retryLoop + } + exception.isTokenError() -> { + Timber.v("## SendThread retryLoop retryable TOKEN error, interrupt") + // we can exit the loop + task.onTaskFailed() + throw InterruptedException() + } + exception is CancellationException -> { + Timber.v("## SendThread task has been cancelled") + break@retryLoop + } + else -> { + Timber.v("## SendThread retryLoop Un-Retryable error, try next task") + // this task is in error, check next one? + task.onTaskFailed() + break@retryLoop + } + } + } + } + } + markAsFinished(task) + } + } catch (interruptionException: InterruptedException) { + // will be thrown is thread is interrupted while seeping + interrupt() + Timber.v("## InterruptedException!! ${interruptionException.localizedMessage}") + } +// state = State.KILLED + // is this needed? + retryNoNetworkTask?.cancel() + Timber.w("## SendThread finished ${System.currentTimeMillis()}") + } + + private fun waitForNetwork() { + retryNoNetworkTask = Timer(SyncState.NoNetwork.toString(), false).schedule(RETRY_WAIT_TIME_MS) { + synchronized(networkAvailableLock) { + canReachServer = HomeServerAvailabilityChecker(sessionParams).check().also { + Timber.v("## SendThread checkHostAvailable $it") + } + networkAvailableLock.notify() + } + } + synchronized(networkAvailableLock) { networkAvailableLock.wait() } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/HomeServerAvailabilityChecker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/HomeServerAvailabilityChecker.kt new file mode 100644 index 0000000000..2d53699917 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/HomeServerAvailabilityChecker.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2021 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.session.room.send.queue + +import org.matrix.android.sdk.api.auth.data.SessionParams +import timber.log.Timber +import java.io.IOException +import java.net.InetAddress +import java.net.InetSocketAddress +import java.net.Socket + +internal class HomeServerAvailabilityChecker(val sessionParams: SessionParams) { + + fun check(): Boolean { + val host = sessionParams.homeServerConnectionConfig.homeServerUri.host ?: return false + val port = sessionParams.homeServerConnectionConfig.homeServerUri.port.takeIf { it != -1 } ?: 80 + val timeout = 30_000 + try { + Socket().use { socket -> + val inetAddress: InetAddress = InetAddress.getByName(host) + val inetSocketAddress = InetSocketAddress(inetAddress, port) + socket.connect(inetSocketAddress, timeout) + return true + } + } catch (e: IOException) { + Timber.v("## EventSender isHostAvailable failure ${e.localizedMessage}") + return false + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueueMemento.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueueMemento.kt index a6836c8086..116c8d5c6b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueueMemento.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueueMemento.kt @@ -32,6 +32,9 @@ import javax.inject.Inject * It is just used to remember what events/localEchos was managed by the event sender in order to * reschedule them (and only them) on next restart */ + +private const val PERSISTENCE_KEY = "ManagedBySender" + internal class QueueMemento @Inject constructor(context: Context, @SessionId sessionId: String, private val queuedTaskFactory: QueuedTaskFactory, @@ -39,28 +42,27 @@ internal class QueueMemento @Inject constructor(context: Context, private val cryptoService: CryptoService) { private val storage = context.getSharedPreferences("QueueMemento_$sessionId", Context.MODE_PRIVATE) - private val managedTaskInfos = mutableListOf() + private val trackedTasks = mutableListOf() - fun track(task: QueuedTask) { - synchronized(managedTaskInfos) { - managedTaskInfos.add(task) - persist() - } + fun track(task: QueuedTask) = synchronized(trackedTasks) { + trackedTasks.add(task) + persist() } - fun unTrack(task: QueuedTask) { - synchronized(managedTaskInfos) { - managedTaskInfos.remove(task) - persist() - } + fun unTrack(task: QueuedTask) = synchronized(trackedTasks) { + trackedTasks.remove(task) + persist() + } + + fun trackedTasks() = synchronized(trackedTasks) { } private fun persist() { - managedTaskInfos.mapIndexedNotNull { index, queuedTask -> + trackedTasks.mapIndexedNotNull { index, queuedTask -> toTaskInfo(queuedTask, index)?.let { TaskInfo.map(it) } }.toSet().let { set -> storage.edit() - .putStringSet("ManagedBySender", set) + .putStringSet(PERSISTENCE_KEY, set) .apply() } } @@ -82,7 +84,7 @@ internal class QueueMemento @Inject constructor(context: Context, suspend fun restoreTasks(eventProcessor: EventSenderProcessor) { // events should be restarted in correct order - storage.getStringSet("ManagedBySender", null)?.let { pending -> + storage.getStringSet(PERSISTENCE_KEY, null)?.let { pending -> Timber.d("## Send - Recovering unsent events $pending") pending.mapNotNull { tryOrNull { TaskInfo.map(it) } } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueuedTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueuedTask.kt index 9a7fcd8d91..948786677d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueuedTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueuedTask.kt @@ -17,15 +17,29 @@ package org.matrix.android.sdk.internal.session.room.send.queue import org.matrix.android.sdk.api.util.Cancelable +import timber.log.Timber +import java.util.concurrent.atomic.AtomicInteger -abstract class QueuedTask : Cancelable { - var retryCount = 0 +/** + * @param queueIdentifier String value to identify a unique Queue + * @param taskIdentifier String value to identify a unique Task. Should be different from queueIdentifier + */ +internal abstract class QueuedTask( + val queueIdentifier: String, + val taskIdentifier: String +) : Cancelable { + + override fun toString() = "${javaClass.simpleName} queueIdentifier: $queueIdentifier, taskIdentifier: $taskIdentifier)" + + var retryCount = AtomicInteger(0) private var hasBeenCancelled: Boolean = false suspend fun execute() { if (!isCancelled()) { + Timber.v("Execute: $this start") doExecute() + Timber.v("Execute: $this finish") } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/RedactQueuedTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/RedactQueuedTask.kt index 8e7ba2f155..0e3d88aa79 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/RedactQueuedTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/RedactQueuedTask.kt @@ -29,9 +29,7 @@ internal class RedactQueuedTask( private val redactEventTask: RedactEventTask, private val localEchoRepository: LocalEchoRepository, private val cancelSendTracker: CancelSendTracker -) : QueuedTask() { - - override fun toString() = "[RedactQueuedTask $redactionLocalEchoId]" +) : QueuedTask(queueIdentifier = roomId, taskIdentifier = redactionLocalEchoId) { override suspend fun doExecute() { redactEventTask.execute(RedactEventTask.Params(redactionLocalEchoId, roomId, toRedactEventId, reason)) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/SendEventQueuedTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/SendEventQueuedTask.kt index ea097082c7..49492e7990 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/SendEventQueuedTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/SendEventQueuedTask.kt @@ -31,9 +31,7 @@ internal class SendEventQueuedTask( val cryptoService: CryptoService, val localEchoRepository: LocalEchoRepository, val cancelSendTracker: CancelSendTracker -) : QueuedTask() { - - override fun toString() = "[SendEventQueuedTask ${event.eventId}]" +) : QueuedTask(queueIdentifier = event.roomId!!, taskIdentifier = event.eventId!!) { override suspend fun doExecute() { sendEventTask.execute(SendEventTask.Params(event, encrypt)) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/TaskInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/TaskInfo.kt index 87c6299c4d..a03ab778f6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/TaskInfo.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/TaskInfo.kt @@ -36,7 +36,7 @@ internal interface TaskInfo { const val TYPE_SEND = "TYPE_SEND" const val TYPE_REDACT = "TYPE_REDACT" - val moshi = Moshi.Builder() + private val moshi = Moshi.Builder() .add(RuntimeJsonAdapterFactory.of(TaskInfo::class.java, "type", FallbackTaskInfo::class.java) .registerSubtype(SendEventTaskInfo::class.java, TYPE_SEND) .registerSubtype(RedactEventTaskInfo::class.java, TYPE_REDACT) @@ -71,6 +71,6 @@ internal data class RedactEventTaskInfo( @JsonClass(generateAdapter = true) internal data class FallbackTaskInfo( - @Json(name = "type") override val type: String = TaskInfo.TYPE_REDACT, + @Json(name = "type") override val type: String = TaskInfo.TYPE_UNKNOWN, @Json(name = "order") override val order: Int ) : TaskInfo diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt index ae90282d52..d0946abe28 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt @@ -28,13 +28,7 @@ import org.matrix.android.sdk.api.NoOpMatrixCallback import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.events.model.EventType -import org.matrix.android.sdk.api.session.events.model.RelationType -import org.matrix.android.sdk.api.session.events.model.toModel -import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary -import org.matrix.android.sdk.api.session.room.model.ReactionAggregatedSummary import org.matrix.android.sdk.api.session.room.model.ReadReceipt -import org.matrix.android.sdk.api.session.room.model.message.MessageContent -import org.matrix.android.sdk.api.session.room.model.relation.ReactionContent import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent @@ -43,11 +37,9 @@ import org.matrix.android.sdk.api.util.CancelableBag import org.matrix.android.sdk.internal.database.RealmSessionProvider import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper import org.matrix.android.sdk.internal.database.model.ChunkEntity -import org.matrix.android.sdk.internal.database.model.ChunkEntityFields import org.matrix.android.sdk.internal.database.model.RoomEntity import org.matrix.android.sdk.internal.database.model.TimelineEventEntity import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields -import org.matrix.android.sdk.internal.database.query.filterEvents import org.matrix.android.sdk.internal.database.query.findAllInRoomWithSendStates import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.database.query.whereRoomId @@ -84,7 +76,8 @@ internal class DefaultTimeline( private val loadRoomMembersTask: LoadRoomMembersTask ) : Timeline, TimelineHiddenReadReceipts.Delegate, - TimelineInput.Listener { + TimelineInput.Listener, + UIEchoManager.Listener { companion object { val BACKGROUND_HANDLER = createBackgroundHandler("TIMELINE_DB_THREAD") @@ -105,12 +98,12 @@ internal class DefaultTimeline( private var prevDisplayIndex: Int? = null private var nextDisplayIndex: Int? = null - private val uiEchoManager = UIEchoManager() + private val uiEchoManager = UIEchoManager(settings, this) private val builtEvents = Collections.synchronizedList(ArrayList()) private val builtEventsIdMap = Collections.synchronizedMap(HashMap()) - private val backwardsState = AtomicReference(State()) - private val forwardsState = AtomicReference(State()) + private val backwardsState = AtomicReference(TimelineState()) + private val forwardsState = AtomicReference(TimelineState()) override val timelineID = UUID.randomUUID().toString() @@ -169,13 +162,13 @@ internal class DefaultTimeline( // are still used for ui echo (relation like reaction) sendingEvents = roomEntity.sendingTimelineEvents.where()/*.filterEventsWithSettings()*/.findAll() sendingEvents.addChangeListener { events -> - uiEchoManager.sentEventsUpdated(events) + uiEchoManager.onSentEventsInDatabase(events.map { it.eventId }) postSnapshot() } nonFilteredEvents = buildEventQuery(realm).sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.DESCENDING).findAll() filteredEvents = nonFilteredEvents.where() - .filterEventsWithSettings() + .filterEventsWithSettings(settings) .findAll() nonFilteredEvents.addChangeListener(eventsChangeListener) handleInitialLoad() @@ -261,7 +254,9 @@ internal class DefaultTimeline( .equalTo(TimelineEventEntityFields.EVENT_ID, eventId) .findFirst() - val filteredEvents = nonFilteredEvents.where().filterEventsWithSettings().findAll() + val filteredEvents = nonFilteredEvents.where() + .filterEventsWithSettings(settings) + .findAll() val isEventInDb = nonFilteredEvent != null val isHidden = isEventInDb && filteredEvents.where() @@ -327,20 +322,29 @@ internal class DefaultTimeline( } override fun onLocalEchoCreated(roomId: String, timelineEvent: TimelineEvent) { - if (uiEchoManager.onLocalEchoCreated(roomId, timelineEvent)) { + if (roomId != this.roomId || !isLive) return + + val postSnapShot = uiEchoManager.onLocalEchoCreated(timelineEvent) + + if (listOf(timelineEvent).filterEventsWithSettings(settings).isNotEmpty()) { + listeners.forEach { + it.onNewTimelineEvents(listOf(timelineEvent.eventId)) + } + } + + if (postSnapShot) { postSnapshot() } } override fun onLocalEchoUpdated(roomId: String, eventId: String, sendState: SendState) { - if (uiEchoManager.onLocalEchoUpdated(roomId, eventId, sendState)) { + if (roomId != this.roomId || !isLive) return + if (uiEchoManager.onSendStateUpdated(eventId, sendState)) { postSnapshot() } } -// Private methods ***************************************************************************** - - private fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean { + override fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean { return tryOrNull { builtEventsIdMap[eventId]?.let { builtIndex -> // Update the relation of existing event @@ -360,6 +364,8 @@ internal class DefaultTimeline( } ?: false } +// Private methods ***************************************************************************** + private fun hasMoreInCache(direction: Timeline.Direction) = getState(direction).hasMoreInCache private fun hasReachedEnd(direction: Timeline.Direction) = getState(direction).hasReachedEnd @@ -412,35 +418,41 @@ internal class DefaultTimeline( } private fun buildSendingEvents(): List { - val builtSendingEvents = ArrayList() + val builtSendingEvents = mutableListOf() if (hasReachedEnd(Timeline.Direction.FORWARDS) && !hasMoreInCache(Timeline.Direction.FORWARDS)) { - builtSendingEvents.addAll(uiEchoManager.getInMemorySendingEvents().filterEventsWithSettings()) + uiEchoManager.getInMemorySendingEvents() + .filterSendingEventsTo(builtSendingEvents) sendingEvents - .map { timelineEventMapper.map(it) } - // Filter out sending event that are not displayable! - .filterEventsWithSettings() - .forEach { timelineEvent -> - if (builtSendingEvents.find { it.eventId == timelineEvent.eventId } == null) { - uiEchoManager.updateSentStateWithUiEcho(timelineEvent) - builtSendingEvents.add(timelineEvent) - } + .filter { timelineEvent -> + builtSendingEvents.none { it.eventId == timelineEvent.eventId } } + .map { timelineEventMapper.map(it) } + .filterSendingEventsTo(builtSendingEvents) } return builtSendingEvents } + private fun List.filterSendingEventsTo(target: MutableList) { + target.addAll( + // Filter out sending event that are not displayable! + filterEventsWithSettings(settings) + // Get most up to date send state (in memory) + .map { uiEchoManager.updateSentStateWithUiEcho(it) } + ) + } + private fun canPaginate(direction: Timeline.Direction): Boolean { return isReady.get() && !getState(direction).isPaginating && hasMoreToLoad(direction) } - private fun getState(direction: Timeline.Direction): State { + private fun getState(direction: Timeline.Direction): TimelineState { return when (direction) { Timeline.Direction.FORWARDS -> forwardsState.get() Timeline.Direction.BACKWARDS -> backwardsState.get() } } - private fun updateState(direction: Timeline.Direction, update: (State) -> State) { + private fun updateState(direction: Timeline.Direction, update: (TimelineState) -> TimelineState) { val stateReference = when (direction) { Timeline.Direction.FORWARDS -> forwardsState Timeline.Direction.BACKWARDS -> backwardsState @@ -512,7 +524,7 @@ internal class DefaultTimeline( eventEntity?.eventId?.let { eventId -> postSnapshot = rebuildEvent(eventId) { val builtEvent = buildTimelineEvent(eventEntity) - listOf(builtEvent).filterEventsWithSettings().firstOrNull() + listOf(builtEvent).filterEventsWithSettings(settings).firstOrNull() } || postSnapshot } } @@ -688,11 +700,11 @@ internal class DefaultTimeline( return if (initialEventId == null) { TimelineEventEntity .whereRoomId(realm, roomId = roomId) - .equalTo("${TimelineEventEntityFields.CHUNK}.${ChunkEntityFields.IS_LAST_FORWARD}", true) + .equalTo(TimelineEventEntityFields.CHUNK.IS_LAST_FORWARD, true) } else { TimelineEventEntity .whereRoomId(realm, roomId = roomId) - .`in`("${TimelineEventEntityFields.CHUNK}.${ChunkEntityFields.TIMELINE_EVENTS.EVENT_ID}", arrayOf(initialEventId)) + .`in`("${TimelineEventEntityFields.CHUNK.TIMELINE_EVENTS}.${TimelineEventEntityFields.EVENT_ID}", arrayOf(initialEventId)) } } @@ -745,8 +757,8 @@ internal class DefaultTimeline( nextDisplayIndex = null builtEvents.clear() builtEventsIdMap.clear() - backwardsState.set(State()) - forwardsState.set(State()) + backwardsState.set(TimelineState()) + forwardsState.set(TimelineState()) } private fun createPaginationCallback(limit: Int, direction: Timeline.Direction): MatrixCallback { @@ -780,191 +792,4 @@ internal class DefaultTimeline( private fun Timeline.Direction.toPaginationDirection(): PaginationDirection { return if (this == Timeline.Direction.BACKWARDS) PaginationDirection.BACKWARDS else PaginationDirection.FORWARDS } - - private fun RealmQuery.filterEventsWithSettings(): RealmQuery { - return filterEvents(settings.filters) - } - - private fun List.filterEventsWithSettings(): List { - return filter { event -> - val filterType = !settings.filters.filterTypes - || settings.filters.allowedTypes.any { it.eventType == event.root.type && (it.stateKey == null || it.stateKey == event.root.senderId) } - if (!filterType) return@filter false - - val filterEdits = if (settings.filters.filterEdits && event.root.getClearType() == EventType.MESSAGE) { - val messageContent = event.root.getClearContent().toModel() - messageContent?.relatesTo?.type != RelationType.REPLACE && messageContent?.relatesTo?.type != RelationType.RESPONSE - } else { - true - } - if (!filterEdits) return@filter false - - val filterRedacted = settings.filters.filterRedacted && event.root.isRedacted() - !filterRedacted - } - } - - private data class State( - val hasReachedEnd: Boolean = false, - val hasMoreInCache: Boolean = true, - val isPaginating: Boolean = false, - val requestedPaginationCount: Int = 0 - ) - - private data class ReactionUiEchoData( - val localEchoId: String, - val reactedOnEventId: String, - val reaction: String - ) - - inner class UIEchoManager { - - private val inMemorySendingEvents = Collections.synchronizedList(ArrayList()) - - fun getInMemorySendingEvents(): List { - return inMemorySendingEvents.toList() - } - - /** - * Due to lag of DB updates, we keep some UI echo of some properties to update timeline faster - */ - private val inMemorySendingStates = Collections.synchronizedMap(HashMap()) - - private val inMemoryReactions = Collections.synchronizedMap>(HashMap()) - - fun sentEventsUpdated(events: RealmResults) { - // Remove in memory as soon as they are known by database - events.forEach { te -> - inMemorySendingEvents.removeAll { te.eventId == it.eventId } - } - inMemorySendingStates.keys.removeAll { key -> - events.find { it.eventId == key } == null - } - - inMemoryReactions.forEach { (_, uiEchoData) -> - uiEchoData.removeAll { data -> - // I remove the uiEcho, when the related event is not anymore in the sending list - // (means that it is synced)! - events.find { it.eventId == data.localEchoId } == null - } - } - } - - fun onLocalEchoUpdated(roomId: String, eventId: String, sendState: SendState): Boolean { - if (isLive && roomId == this@DefaultTimeline.roomId) { - val existingState = inMemorySendingStates[eventId] - inMemorySendingStates[eventId] = sendState - if (existingState != sendState) { - return true - } - } - return false - } - - // return true if should update - fun onLocalEchoCreated(roomId: String, timelineEvent: TimelineEvent): Boolean { - var postSnapshot = false - if (isLive && roomId == this@DefaultTimeline.roomId) { - // Manage some ui echos (do it before filter because actual event could be filtered out) - when (timelineEvent.root.getClearType()) { - EventType.REDACTION -> { - } - EventType.REACTION -> { - val content = timelineEvent.root.content?.toModel() - if (RelationType.ANNOTATION == content?.relatesTo?.type) { - val reaction = content.relatesTo.key - val relatedEventID = content.relatesTo.eventId - inMemoryReactions.getOrPut(relatedEventID) { mutableListOf() } - .add( - ReactionUiEchoData( - localEchoId = timelineEvent.eventId, - reactedOnEventId = relatedEventID, - reaction = reaction - ) - ) - postSnapshot = rebuildEvent(relatedEventID) { - decorateEventWithReactionUiEcho(it) - } || postSnapshot - } - } - } - - // do not add events that would have been filtered - if (listOf(timelineEvent).filterEventsWithSettings().isNotEmpty()) { - listeners.forEach { - it.onNewTimelineEvents(listOf(timelineEvent.eventId)) - } - Timber.v("On local echo created: ${timelineEvent.eventId}") - inMemorySendingEvents.add(0, timelineEvent) - postSnapshot = true - } - } - return postSnapshot - } - - fun decorateEventWithReactionUiEcho(timelineEvent: TimelineEvent): TimelineEvent? { - val relatedEventID = timelineEvent.eventId - val contents = inMemoryReactions[relatedEventID] ?: return null - - var existingAnnotationSummary = timelineEvent.annotations ?: EventAnnotationsSummary( - relatedEventID - ) - val updateReactions = existingAnnotationSummary.reactionsSummary.toMutableList() - - contents.forEach { uiEchoReaction -> - val existing = updateReactions.firstOrNull { it.key == uiEchoReaction.reaction } - if (existing == null) { - // just add the new key - ReactionAggregatedSummary( - key = uiEchoReaction.reaction, - count = 1, - addedByMe = true, - firstTimestamp = System.currentTimeMillis(), - sourceEvents = emptyList(), - localEchoEvents = listOf(uiEchoReaction.localEchoId) - ).let { updateReactions.add(it) } - } else { - // update Existing Key - if (!existing.localEchoEvents.contains(uiEchoReaction.localEchoId)) { - updateReactions.remove(existing) - // only update if echo is not yet there - ReactionAggregatedSummary( - key = existing.key, - count = existing.count + 1, - addedByMe = true, - firstTimestamp = existing.firstTimestamp, - sourceEvents = existing.sourceEvents, - localEchoEvents = existing.localEchoEvents + uiEchoReaction.localEchoId - - ).let { updateReactions.add(it) } - } - } - } - - existingAnnotationSummary = existingAnnotationSummary.copy( - reactionsSummary = updateReactions - ) - return timelineEvent.copy( - annotations = existingAnnotationSummary - ) - } - - fun updateSentStateWithUiEcho(element: TimelineEvent) { - inMemorySendingStates[element.eventId]?.let { - // Timber.v("## ${System.currentTimeMillis()} Send event refresh echo with live state ${it} from state ${element.root.sendState}") - element.root.sendState = element.root.sendState.takeIf { it == SendState.SENT } ?: it - } - } - - fun onSyncedEvent(transactionId: String?) { - val sendingEvent = inMemorySendingEvents.find { - it.eventId == transactionId - } - inMemorySendingEvents.remove(sendingEvent) - // Is it too early to clear it? will be done when removed from sending anyway? - inMemoryReactions.forEach { (_, u) -> - u.filterNot { it.localEchoId == transactionId } - } - } - } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt index ef890db79e..d000bbeb50 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt @@ -17,7 +17,6 @@ package org.matrix.android.sdk.internal.session.room.timeline import androidx.lifecycle.LiveData -import androidx.lifecycle.Transformations import dagger.assisted.Assisted import dagger.assisted.AssistedInject import dagger.assisted.AssistedFactory @@ -31,7 +30,6 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineService import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings import org.matrix.android.sdk.api.util.Optional -import org.matrix.android.sdk.api.util.toOptional import org.matrix.android.sdk.internal.database.RealmSessionProvider import org.matrix.android.sdk.internal.database.mapper.ReadReceiptsSummaryMapper import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper @@ -89,13 +87,7 @@ internal class DefaultTimelineService @AssistedInject constructor(@Assisted priv } override fun getTimeLineEventLive(eventId: String): LiveData> { - val liveData = monarchy.findAllMappedWithChanges( - { TimelineEventEntity.where(it, roomId = roomId, eventId = eventId) }, - { timelineEventMapper.map(it) } - ) - return Transformations.map(liveData) { events -> - events.firstOrNull().toOptional() - } + return LiveTimelineEvent(timelineInput, monarchy, taskExecutor.executorScope, timelineEventMapper, roomId, eventId) } override fun getAttachmentMessages(): List { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/Extensions.kt new file mode 100644 index 0000000000..b2c8021f3b --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/Extensions.kt @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021 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.session.room.timeline + +import io.realm.RealmQuery +import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.events.model.RelationType +import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.api.session.room.model.message.MessageContent +import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent +import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings +import org.matrix.android.sdk.internal.database.model.TimelineEventEntity +import org.matrix.android.sdk.internal.database.query.filterEvents + +internal fun RealmQuery.filterEventsWithSettings(settings: TimelineSettings): RealmQuery { + return filterEvents(settings.filters) +} + +internal fun List.filterEventsWithSettings(settings: TimelineSettings): List { + return filter { event -> + val filterType = !settings.filters.filterTypes + || settings.filters.allowedTypes.any { it.eventType == event.root.type && (it.stateKey == null || it.stateKey == event.root.senderId) } + if (!filterType) return@filter false + + val filterEdits = if (settings.filters.filterEdits && event.root.getClearType() == EventType.MESSAGE) { + val messageContent = event.root.getClearContent().toModel() + messageContent?.relatesTo?.type != RelationType.REPLACE && messageContent?.relatesTo?.type != RelationType.RESPONSE + } else { + true + } + if (!filterEdits) return@filter false + + val filterRedacted = settings.filters.filterRedacted && event.root.isRedacted() + !filterRedacted + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LiveTimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LiveTimelineEvent.kt new file mode 100644 index 0000000000..3c0f101e11 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LiveTimelineEvent.kt @@ -0,0 +1,94 @@ +/* + * Copyright 2020 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.session.room.timeline + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData +import androidx.lifecycle.Transformations +import com.zhuinden.monarchy.Monarchy +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.session.events.model.LocalEcho +import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent +import org.matrix.android.sdk.api.util.Optional +import org.matrix.android.sdk.api.util.toOptional +import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper +import org.matrix.android.sdk.internal.database.model.TimelineEventEntity +import org.matrix.android.sdk.internal.database.query.where +import java.util.concurrent.atomic.AtomicBoolean + +/** + * This class takes care of handling case where local echo is replaced by the synced event in the db. + */ +internal class LiveTimelineEvent(private val timelineInput: TimelineInput, + private val monarchy: Monarchy, + private val coroutineScope: CoroutineScope, + private val timelineEventMapper: TimelineEventMapper, + private val roomId: String, + private val eventId: String) + : TimelineInput.Listener, + MediatorLiveData>() { + + private var queryLiveData: LiveData>? = null + + // If we are listening to local echo, we want to be aware when event is synced + private var shouldObserveSync = AtomicBoolean(LocalEcho.isLocalEchoId(eventId)) + + init { + buildAndObserveQuery(eventId) + } + + // Makes sure it's made on the main thread + private fun buildAndObserveQuery(eventIdToObserve: String) = coroutineScope.launch(Dispatchers.Main) { + queryLiveData?.also { + removeSource(it) + } + val liveData = monarchy.findAllMappedWithChanges( + { TimelineEventEntity.where(it, roomId = roomId, eventId = eventIdToObserve) }, + { timelineEventMapper.map(it) } + ) + queryLiveData = Transformations.map(liveData) { events -> + events.firstOrNull().toOptional() + }.also { + addSource(it) { newValue -> value = newValue } + } + } + + override fun onLocalEchoSynced(roomId: String, localEchoEventId: String, syncedEventId: String) { + if (this.roomId == roomId && localEchoEventId == this.eventId) { + timelineInput.listeners.remove(this) + shouldObserveSync.set(false) + // rebuild the query with the new eventId + buildAndObserveQuery(syncedEventId) + } + } + + override fun onActive() { + super.onActive() + if (shouldObserveSync.get()) { + timelineInput.listeners.add(this) + } + } + + override fun onInactive() { + super.onInactive() + if (shouldObserveSync.get()) { + timelineInput.listeners.remove(this) + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/ReactionUiEchoData.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/ReactionUiEchoData.kt new file mode 100644 index 0000000000..521120c415 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/ReactionUiEchoData.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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.session.room.timeline + +internal data class ReactionUiEchoData( + val localEchoId: String, + val reactedOnEventId: String, + val reaction: String +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineHiddenReadReceipts.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineHiddenReadReceipts.kt index fa517bebf2..0ade8ad3b8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineHiddenReadReceipts.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineHiddenReadReceipts.kt @@ -24,6 +24,7 @@ import io.realm.RealmResults import org.matrix.android.sdk.api.session.room.model.ReadReceipt import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings import org.matrix.android.sdk.internal.database.mapper.ReadReceiptsSummaryMapper +import org.matrix.android.sdk.internal.database.model.EventEntityFields import org.matrix.android.sdk.internal.database.model.ReadReceiptsSummaryEntity import org.matrix.android.sdk.internal.database.model.ReadReceiptsSummaryEntityFields import org.matrix.android.sdk.internal.database.model.TimelineEventEntity @@ -121,7 +122,7 @@ internal class TimelineHiddenReadReceipts constructor(private val readReceiptsSu // We are looking for read receipts set on hidden events. // We only accept those with a timelineEvent (so coming from pagination/sync). this.hiddenReadReceipts = ReadReceiptsSummaryEntity.whereInRoom(realm, roomId) - .isNotEmpty(ReadReceiptsSummaryEntityFields.TIMELINE_EVENT) + .isNotEmpty(ReadReceiptsSummaryEntityFields.TIMELINE_EVENT.`$`) .isNotEmpty(ReadReceiptsSummaryEntityFields.READ_RECEIPTS.`$`) .filterReceiptsWithSettings() .findAllAsync() @@ -157,12 +158,12 @@ internal class TimelineHiddenReadReceipts constructor(private val readReceiptsSu // Result: D, F, H, I settings.filters.allowedTypes.forEachIndexed { index, filter -> if (filter.stateKey == null) { - notEqualTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.TYPE}", filter.eventType) + notEqualTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT.ROOT}.${EventEntityFields.TYPE}", filter.eventType) } else { beginGroup() - notEqualTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.TYPE}", filter.eventType) + notEqualTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT.ROOT}.${EventEntityFields.TYPE}", filter.eventType) or() - notEqualTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.STATE_KEY}", filter.stateKey) + notEqualTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT.ROOT}.${EventEntityFields.STATE_KEY}", filter.stateKey) endGroup() } if (index != settings.filters.allowedTypes.size - 1) { @@ -174,19 +175,19 @@ internal class TimelineHiddenReadReceipts constructor(private val readReceiptsSu } if (settings.filters.filterUseless) { if (needOr) or() - equalTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.IS_USELESS}", true) + equalTo("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT.ROOT}.${EventEntityFields.IS_USELESS}", true) needOr = true } if (settings.filters.filterEdits) { if (needOr) or() - like("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.CONTENT}", TimelineEventFilter.Content.EDIT) + like("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT.ROOT}.${EventEntityFields.CONTENT}", TimelineEventFilter.Content.EDIT) or() - like("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.CONTENT}", TimelineEventFilter.Content.RESPONSE) + like("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT.ROOT}.${EventEntityFields.CONTENT}", TimelineEventFilter.Content.RESPONSE) needOr = true } if (settings.filters.filterRedacted) { if (needOr) or() - like("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT}.${TimelineEventEntityFields.ROOT.UNSIGNED_DATA}", TimelineEventFilter.Unsigned.REDACTED) + like("${ReadReceiptsSummaryEntityFields.TIMELINE_EVENT.ROOT}.${EventEntityFields.UNSIGNED_DATA}", TimelineEventFilter.Unsigned.REDACTED) } endGroup() return this diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineInput.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineInput.kt index 002ab1dd8a..8911f265d5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineInput.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineInput.kt @@ -35,11 +35,16 @@ internal class TimelineInput @Inject constructor() { listeners.toSet().forEach { it.onNewTimelineEvents(roomId, eventIds) } } + fun onLocalEchoSynced(roomId: String, localEchoEventId: String, syncEventId: String) { + listeners.toSet().forEach { it.onLocalEchoSynced(roomId, localEchoEventId, syncEventId) } + } + val listeners = mutableSetOf() internal interface Listener { - fun onLocalEchoCreated(roomId: String, timelineEvent: TimelineEvent) - fun onLocalEchoUpdated(roomId: String, eventId: String, sendState: SendState) - fun onNewTimelineEvents(roomId: String, eventIds: List) + fun onLocalEchoCreated(roomId: String, timelineEvent: TimelineEvent) = Unit + fun onLocalEchoUpdated(roomId: String, eventId: String, sendState: SendState) = Unit + fun onNewTimelineEvents(roomId: String, eventIds: List) = Unit + fun onLocalEchoSynced(roomId: String, localEchoEventId: String, syncedEventId: String) = Unit } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineState.kt new file mode 100644 index 0000000000..0143d9bab3 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineState.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021 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.session.room.timeline + +internal data class TimelineState( + val hasReachedEnd: Boolean = false, + val hasMoreInCache: Boolean = true, + val isPaginating: Boolean = false, + val requestedPaginationCount: Int = 0 +) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/UIEchoManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/UIEchoManager.kt new file mode 100644 index 0000000000..67d0d90d77 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/UIEchoManager.kt @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2021 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.session.room.timeline + +import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.events.model.RelationType +import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary +import org.matrix.android.sdk.api.session.room.model.ReactionAggregatedSummary +import org.matrix.android.sdk.api.session.room.model.relation.ReactionContent +import org.matrix.android.sdk.api.session.room.send.SendState +import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent +import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings +import timber.log.Timber +import java.util.Collections + +internal class UIEchoManager( + private val settings: TimelineSettings, + private val listener: Listener +) { + + interface Listener { + fun rebuildEvent(eventId: String, builder: (TimelineEvent) -> TimelineEvent?): Boolean + } + + private val inMemorySendingEvents = Collections.synchronizedList(ArrayList()) + + fun getInMemorySendingEvents(): List { + return inMemorySendingEvents.toList() + } + + /** + * Due to lag of DB updates, we keep some UI echo of some properties to update timeline faster + */ + private val inMemorySendingStates = Collections.synchronizedMap(HashMap()) + + private val inMemoryReactions = Collections.synchronizedMap>(HashMap()) + + fun onSentEventsInDatabase(eventIds: List) { + // Remove in memory as soon as they are known by database + eventIds.forEach { eventId -> + inMemorySendingEvents.removeAll { eventId == it.eventId } + } + inMemoryReactions.forEach { (_, uiEchoData) -> + uiEchoData.removeAll { data -> + // I remove the uiEcho, when the related event is not anymore in the sending list + // (means that it is synced)! + eventIds.find { it == data.localEchoId } == null + } + } + } + + fun onSendStateUpdated(eventId: String, sendState: SendState): Boolean { + val existingState = inMemorySendingStates[eventId] + inMemorySendingStates[eventId] = sendState + return existingState != sendState + } + + // return true if should update + fun onLocalEchoCreated(timelineEvent: TimelineEvent): Boolean { + var postSnapshot = false + + // Manage some ui echos (do it before filter because actual event could be filtered out) + when (timelineEvent.root.getClearType()) { + EventType.REDACTION -> { + } + EventType.REACTION -> { + val content = timelineEvent.root.content?.toModel() + if (RelationType.ANNOTATION == content?.relatesTo?.type) { + val reaction = content.relatesTo.key + val relatedEventID = content.relatesTo.eventId + inMemoryReactions.getOrPut(relatedEventID) { mutableListOf() } + .add( + ReactionUiEchoData( + localEchoId = timelineEvent.eventId, + reactedOnEventId = relatedEventID, + reaction = reaction + ) + ) + postSnapshot = listener.rebuildEvent(relatedEventID) { + decorateEventWithReactionUiEcho(it) + } || postSnapshot + } + } + } + + // do not add events that would have been filtered + if (listOf(timelineEvent).filterEventsWithSettings(settings).isNotEmpty()) { + Timber.v("On local echo created: ${timelineEvent.eventId}") + inMemorySendingEvents.add(0, timelineEvent) + postSnapshot = true + } + + return postSnapshot + } + + fun decorateEventWithReactionUiEcho(timelineEvent: TimelineEvent): TimelineEvent? { + val relatedEventID = timelineEvent.eventId + val contents = inMemoryReactions[relatedEventID] ?: return null + + var existingAnnotationSummary = timelineEvent.annotations ?: EventAnnotationsSummary( + relatedEventID + ) + val updateReactions = existingAnnotationSummary.reactionsSummary.toMutableList() + + contents.forEach { uiEchoReaction -> + val existing = updateReactions.firstOrNull { it.key == uiEchoReaction.reaction } + if (existing == null) { + // just add the new key + ReactionAggregatedSummary( + key = uiEchoReaction.reaction, + count = 1, + addedByMe = true, + firstTimestamp = System.currentTimeMillis(), + sourceEvents = emptyList(), + localEchoEvents = listOf(uiEchoReaction.localEchoId) + ).let { updateReactions.add(it) } + } else { + // update Existing Key + if (!existing.localEchoEvents.contains(uiEchoReaction.localEchoId)) { + updateReactions.remove(existing) + // only update if echo is not yet there + ReactionAggregatedSummary( + key = existing.key, + count = existing.count + 1, + addedByMe = true, + firstTimestamp = existing.firstTimestamp, + sourceEvents = existing.sourceEvents, + localEchoEvents = existing.localEchoEvents + uiEchoReaction.localEchoId + + ).let { updateReactions.add(it) } + } + } + } + + existingAnnotationSummary = existingAnnotationSummary.copy( + reactionsSummary = updateReactions + ) + return timelineEvent.copy( + annotations = existingAnnotationSummary + ) + } + + fun updateSentStateWithUiEcho(timelineEvent: TimelineEvent): TimelineEvent { + if (timelineEvent.root.sendState.isSent()) return timelineEvent + val inMemoryState = inMemorySendingStates[timelineEvent.eventId] ?: return timelineEvent + // Timber.v("## ${System.currentTimeMillis()} Send event refresh echo with live state $inMemoryState from state ${element.root.sendState}") + return timelineEvent.copy( + root = timelineEvent.root.copyAll() + .also { it.sendState = inMemoryState } + ) + } + + fun onSyncedEvent(transactionId: String?) { + val sendingEvent = inMemorySendingEvents.find { + it.eventId == transactionId + } + inMemorySendingEvents.remove(sendingEvent) + // Is it too early to clear it? will be done when removed from sending anyway? + inMemoryReactions.forEach { (_, u) -> + u.filterNot { it.localEchoId == transactionId } + } + inMemorySendingStates.remove(transactionId) + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/CryptoSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/CryptoSyncHandler.kt index fc476a3dd6..ae60faf905 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/CryptoSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/CryptoSyncHandler.kt @@ -26,7 +26,7 @@ import org.matrix.android.sdk.internal.crypto.MXEventDecryptionResult import org.matrix.android.sdk.internal.crypto.algorithms.olm.OlmDecryptionResult import org.matrix.android.sdk.internal.crypto.model.event.OlmEventContent import org.matrix.android.sdk.internal.crypto.verification.DefaultVerificationService -import org.matrix.android.sdk.internal.session.DefaultInitialSyncProgressService +import org.matrix.android.sdk.internal.session.initsync.ProgressReporter import org.matrix.android.sdk.internal.session.sync.model.SyncResponse import org.matrix.android.sdk.internal.session.sync.model.ToDeviceSyncResponse import timber.log.Timber @@ -35,10 +35,10 @@ import javax.inject.Inject internal class CryptoSyncHandler @Inject constructor(private val cryptoService: DefaultCryptoService, private val verificationService: DefaultVerificationService) { - fun handleToDevice(toDevice: ToDeviceSyncResponse, initialSyncProgressService: DefaultInitialSyncProgressService? = null) { + fun handleToDevice(toDevice: ToDeviceSyncResponse, progressReporter: ProgressReporter? = null) { val total = toDevice.events?.size ?: 0 toDevice.events?.forEachIndexed { index, event -> - initialSyncProgressService?.reportProgress(((index / total.toFloat()) * 100).toInt()) + progressReporter?.reportProgress(index * 100F / total) // Decrypt event if necessary Timber.i("## CRYPTO | To device event from ${event.senderId} of type:${event.type}") decryptToDeviceEvent(event, null) @@ -75,7 +75,7 @@ internal class CryptoSyncHandler @Inject constructor(private val cryptoService: // try to find device id to ease log reading val deviceId = cryptoService.getCryptoDeviceInfo(event.senderId!!).firstOrNull { it.identityKey() == senderKey - }?.deviceId ?: senderKey + }?.deviceId ?: senderKey Timber.e("## CRYPTO | Failed to decrypt to device event from ${event.senderId}|$deviceId reason:<${event.mCryptoError ?: exception}>") } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/GroupSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/GroupSyncHandler.kt index 135f711a6c..02362bf050 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/GroupSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/GroupSyncHandler.kt @@ -16,17 +16,17 @@ package org.matrix.android.sdk.internal.session.sync -import org.matrix.android.sdk.R +import io.realm.Realm +import org.matrix.android.sdk.api.session.initsync.InitSyncStep import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.internal.database.model.GroupEntity import org.matrix.android.sdk.internal.database.model.GroupSummaryEntity import org.matrix.android.sdk.internal.database.query.getOrCreate import org.matrix.android.sdk.internal.database.query.where -import org.matrix.android.sdk.internal.session.DefaultInitialSyncProgressService -import org.matrix.android.sdk.internal.session.mapWithProgress +import org.matrix.android.sdk.internal.session.initsync.ProgressReporter +import org.matrix.android.sdk.internal.session.initsync.mapWithProgress import org.matrix.android.sdk.internal.session.sync.model.GroupsSyncResponse import org.matrix.android.sdk.internal.session.sync.model.InvitedGroupSync -import io.realm.Realm import javax.inject.Inject internal class GroupSyncHandler @Inject constructor() { @@ -37,11 +37,9 @@ internal class GroupSyncHandler @Inject constructor() { data class LEFT(val data: Map) : HandlingStrategy() } - fun handle( - realm: Realm, - roomsSyncResponse: GroupsSyncResponse, - reporter: DefaultInitialSyncProgressService? = null - ) { + fun handle(realm: Realm, + roomsSyncResponse: GroupsSyncResponse, + reporter: ProgressReporter? = null) { handleGroupSync(realm, HandlingStrategy.JOINED(roomsSyncResponse.join), reporter) handleGroupSync(realm, HandlingStrategy.INVITED(roomsSyncResponse.invite), reporter) handleGroupSync(realm, HandlingStrategy.LEFT(roomsSyncResponse.leave), reporter) @@ -49,20 +47,20 @@ internal class GroupSyncHandler @Inject constructor() { // PRIVATE METHODS ***************************************************************************** - private fun handleGroupSync(realm: Realm, handlingStrategy: HandlingStrategy, reporter: DefaultInitialSyncProgressService?) { + private fun handleGroupSync(realm: Realm, handlingStrategy: HandlingStrategy, reporter: ProgressReporter?) { val groups = when (handlingStrategy) { is HandlingStrategy.JOINED -> - handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_groups, 0.6f) { + handlingStrategy.data.mapWithProgress(reporter, InitSyncStep.ImportingAccountGroups, 0.6f) { handleJoinedGroup(realm, it.key) } is HandlingStrategy.INVITED -> - handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_groups, 0.3f) { + handlingStrategy.data.mapWithProgress(reporter, InitSyncStep.ImportingAccountGroups, 0.3f) { handleInvitedGroup(realm, it.key) } is HandlingStrategy.LEFT -> - handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_groups, 0.1f) { + handlingStrategy.data.mapWithProgress(reporter, InitSyncStep.ImportingAccountGroups, 0.1f) { handleLeftGroup(realm, it.key) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/InitialSyncStatusRepository.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/InitialSyncStatusRepository.kt new file mode 100644 index 0000000000..4b82ecc3e5 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/InitialSyncStatusRepository.kt @@ -0,0 +1,111 @@ +/* + * Copyright 2020 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.session.sync + +import com.squareup.moshi.JsonClass +import okio.buffer +import okio.source +import org.matrix.android.sdk.internal.di.MoshiProvider +import timber.log.Timber +import java.io.File + +@JsonClass(generateAdapter = true) +internal data class InitialSyncStatus( + val step: Int = STEP_INIT, + val downloadedDate: Long = 0 +) { + companion object { + const val STEP_INIT = 0 + const val STEP_DOWNLOADING = 1 + const val STEP_DOWNLOADED = 2 + const val STEP_PARSED = 3 + const val STEP_SUCCESS = 4 + } +} + +internal interface InitialSyncStatusRepository { + fun getStep(): Int + + fun setStep(step: Int) +} + +/** + * This class handle the current status of an initial sync and persist it on the disk, to be robust against crash + */ +internal class FileInitialSyncStatusRepository(directory: File) : InitialSyncStatusRepository { + + companion object { + // After 2 hours, we consider that the downloaded file is outdated: + // - if a problem occurs, it's for big accounts, and big accounts have lots of new events in 2 hours + // - For small accounts, there should be no problem, so 2 hours delay will never be used. + private const val INIT_SYNC_FILE_LIFETIME = 2 * 60 * 60 * 1_000L + } + + private val file = File(directory, "status.json") + private val jsonAdapter = MoshiProvider.providesMoshi().adapter(InitialSyncStatus::class.java) + + private var cache: InitialSyncStatus? = null + + override fun getStep(): Int { + ensureCache() + val state = cache?.step ?: InitialSyncStatus.STEP_INIT + return if (state >= InitialSyncStatus.STEP_DOWNLOADED + && System.currentTimeMillis() > (cache?.downloadedDate ?: 0) + INIT_SYNC_FILE_LIFETIME) { + Timber.v("INIT_SYNC downloaded file is outdated, download it again") + // The downloaded file is outdated + setStep(InitialSyncStatus.STEP_INIT) + InitialSyncStatus.STEP_INIT + } else { + state + } + } + + override fun setStep(step: Int) { + var newStatus = cache?.copy(step = step) ?: InitialSyncStatus(step = step) + if (step == InitialSyncStatus.STEP_DOWNLOADED) { + // Also store the downloaded date + newStatus = newStatus.copy( + downloadedDate = System.currentTimeMillis() + ) + } + cache = newStatus + writeFile() + } + + private fun ensureCache() { + if (cache == null) readFile() + } + + /** + * File -> Cache + */ + private fun readFile() { + cache = file + .takeIf { it.exists() } + ?.let { jsonAdapter.fromJson(it.source().buffer()) } + } + + /** + * Cache -> File + */ + private fun writeFile() { + file.delete() + cache + ?.let { jsonAdapter.toJson(it) } + ?.let { file.writeText(it) } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/InitialSyncStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/InitialSyncStrategy.kt new file mode 100644 index 0000000000..297cc213ed --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/InitialSyncStrategy.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2020 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.session.sync + +var initialSyncStrategy: InitialSyncStrategy = InitialSyncStrategy.Optimized() + +sealed class InitialSyncStrategy { + /** + * Parse the result in its entirety + * Pros: + * - Faster to handle parsed data + * Cons: + * - Slower to download and parse data + * - big RAM usage + * - not robust to crash + */ + object Legacy : InitialSyncStrategy() + + /** + * Optimized. + * First store the request result in a file, to avoid doing it again in case of crash + */ + data class Optimized( + /** + * Limit to reach to decide to split the init sync response into smaller files + * Empiric value: 1 megabytes + */ + val minSizeToSplit: Long = 1024 * 1024, + /** + * Limit per room to reach to decide to store a join room ephemeral Events into a file + * Empiric value: 6 kilobytes + */ + val minSizeToStoreInFile: Long = 6 * 1024, + /** + * Max number of rooms to insert at a time in database (to avoid too much RAM usage) + */ + val maxRoomsToInsert: Int = 100 + ) : InitialSyncStrategy() +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt index 6d1b3ae034..336a83eaad 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt @@ -18,11 +18,11 @@ package org.matrix.android.sdk.internal.session.sync import io.realm.Realm import io.realm.kotlin.createObject -import org.matrix.android.sdk.R import org.matrix.android.sdk.api.session.crypto.MXCryptoError import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.api.session.initsync.InitSyncStep import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.RoomMemberContent import org.matrix.android.sdk.api.session.room.model.tag.RoomTagContent @@ -49,8 +49,9 @@ import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.di.MoshiProvider import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.extensions.clearWith -import org.matrix.android.sdk.internal.session.DefaultInitialSyncProgressService -import org.matrix.android.sdk.internal.session.mapWithProgress +import org.matrix.android.sdk.internal.session.initsync.ProgressReporter +import org.matrix.android.sdk.internal.session.initsync.mapWithProgress +import org.matrix.android.sdk.internal.session.initsync.reportSubtask import org.matrix.android.sdk.internal.session.room.membership.RoomChangeMembershipStateDataSource import org.matrix.android.sdk.internal.session.room.membership.RoomMemberEventHandler import org.matrix.android.sdk.internal.session.room.read.FullyReadContent @@ -61,10 +62,10 @@ import org.matrix.android.sdk.internal.session.room.typing.TypingEventContent import org.matrix.android.sdk.internal.session.sync.model.InvitedRoomSync import org.matrix.android.sdk.internal.session.sync.model.RoomSync import org.matrix.android.sdk.internal.session.sync.model.RoomSyncAccountData -import org.matrix.android.sdk.internal.session.sync.model.RoomSyncEphemeral import org.matrix.android.sdk.internal.session.sync.model.RoomsSyncResponse import timber.log.Timber import javax.inject.Inject +import kotlin.math.ceil internal class RoomSyncHandler @Inject constructor(private val readReceiptHandler: ReadReceiptHandler, private val roomSummaryUpdater: RoomSummaryUpdater, @@ -83,21 +84,32 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle data class LEFT(val data: Map) : HandlingStrategy() } - fun handle( - realm: Realm, - roomsSyncResponse: RoomsSyncResponse, - isInitialSync: Boolean, - reporter: DefaultInitialSyncProgressService? = null - ) { + fun handle(realm: Realm, + roomsSyncResponse: RoomsSyncResponse, + isInitialSync: Boolean, + reporter: ProgressReporter? = null) { Timber.v("Execute transaction from $this") handleRoomSync(realm, HandlingStrategy.JOINED(roomsSyncResponse.join), isInitialSync, reporter) handleRoomSync(realm, HandlingStrategy.INVITED(roomsSyncResponse.invite), isInitialSync, reporter) handleRoomSync(realm, HandlingStrategy.LEFT(roomsSyncResponse.leave), isInitialSync, reporter) } + fun handleInitSyncEphemeral(realm: Realm, + roomsSyncResponse: RoomsSyncResponse) { + roomsSyncResponse.join.forEach { roomSync -> + val ephemeralResult = roomSync.value.ephemeral + ?.roomSyncEphemeral + ?.events + ?.takeIf { it.isNotEmpty() } + ?.let { events -> handleEphemeral(realm, roomSync.key, events, true) } + + roomTypingUsersHandler.handle(realm, roomSync.key, ephemeralResult) + } + } + // PRIVATE METHODS ***************************************************************************** - private fun handleRoomSync(realm: Realm, handlingStrategy: HandlingStrategy, isInitialSync: Boolean, reporter: DefaultInitialSyncProgressService?) { + private fun handleRoomSync(realm: Realm, handlingStrategy: HandlingStrategy, isInitialSync: Boolean, reporter: ProgressReporter?) { val insertType = if (isInitialSync) { EventInsertType.INITIAL_SYNC } else { @@ -105,17 +117,24 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle } val syncLocalTimeStampMillis = System.currentTimeMillis() val rooms = when (handlingStrategy) { - is HandlingStrategy.JOINED -> - handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_joined_rooms, 0.6f) { - handleJoinedRoom(realm, it.key, it.value, isInitialSync, insertType, syncLocalTimeStampMillis) + is HandlingStrategy.JOINED -> { + if (isInitialSync && initialSyncStrategy is InitialSyncStrategy.Optimized) { + insertJoinRoomsFromInitSync(realm, handlingStrategy, syncLocalTimeStampMillis, reporter) + // Rooms are already inserted, return an empty list + emptyList() + } else { + handlingStrategy.data.mapWithProgress(reporter, InitSyncStep.ImportingAccountJoinedRooms, 0.6f) { + handleJoinedRoom(realm, it.key, it.value, true, insertType, syncLocalTimeStampMillis) + } } + } is HandlingStrategy.INVITED -> - handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_invited_rooms, 0.1f) { + handlingStrategy.data.mapWithProgress(reporter, InitSyncStep.ImportingAccountInvitedRooms, 0.1f) { handleInvitedRoom(realm, it.key, it.value, insertType, syncLocalTimeStampMillis) } is HandlingStrategy.LEFT -> { - handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_left_rooms, 0.3f) { + handlingStrategy.data.mapWithProgress(reporter, InitSyncStep.ImportingAccountLeftRooms, 0.3f) { handleLeftRoom(realm, it.key, it.value, insertType, syncLocalTimeStampMillis) } } @@ -123,17 +142,60 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle realm.insertOrUpdate(rooms) } + private fun insertJoinRoomsFromInitSync(realm: Realm, + handlingStrategy: HandlingStrategy.JOINED, + syncLocalTimeStampMillis: Long, + reporter: ProgressReporter?) { + val maxSize = (initialSyncStrategy as? InitialSyncStrategy.Optimized)?.maxRoomsToInsert ?: Int.MAX_VALUE + val listSize = handlingStrategy.data.keys.size + val numberOfChunks = ceil(listSize / maxSize.toDouble()).toInt() + + if (numberOfChunks > 1) { + reportSubtask(reporter, InitSyncStep.ImportingAccountJoinedRooms, numberOfChunks, 0.6f) { + val chunkSize = listSize / numberOfChunks + Timber.v("INIT_SYNC $listSize rooms to insert, split into $numberOfChunks sublists of $chunkSize items") + // I cannot find a better way to chunk a map, so chunk the keys and then create new maps + handlingStrategy.data.keys + .chunked(chunkSize) + .forEachIndexed { index, roomIds -> + val roomEntities = roomIds + .also { Timber.v("INIT_SYNC insert ${roomIds.size} rooms") } + .map { + handleJoinedRoom( + realm = realm, + roomId = it, + roomSync = handlingStrategy.data[it] ?: error("Should not happen"), + handleEphemeralEvents = false, + insertType = EventInsertType.INITIAL_SYNC, + syncLocalTimestampMillis = syncLocalTimeStampMillis + ) + } + realm.insertOrUpdate(roomEntities) + reporter?.reportProgress(index + 1F) + } + } + } else { + // No need to split + val rooms = handlingStrategy.data.mapWithProgress(reporter, InitSyncStep.ImportingAccountJoinedRooms, 0.6f) { + handleJoinedRoom(realm, it.key, it.value, false, EventInsertType.INITIAL_SYNC, syncLocalTimeStampMillis) + } + realm.insertOrUpdate(rooms) + } + } + private fun handleJoinedRoom(realm: Realm, roomId: String, roomSync: RoomSync, - isInitialSync: Boolean, + handleEphemeralEvents: Boolean, insertType: EventInsertType, syncLocalTimestampMillis: Long): RoomEntity { Timber.v("Handle join sync for room $roomId") var ephemeralResult: EphemeralResult? = null - if (roomSync.ephemeral?.events?.isNotEmpty() == true) { - ephemeralResult = handleEphemeral(realm, roomId, roomSync.ephemeral, isInitialSync) + if (handleEphemeralEvents) { + ephemeralResult = roomSync.ephemeral?.roomSyncEphemeral?.events + ?.takeIf { it.isNotEmpty() } + ?.let { handleEphemeral(realm, roomId, it, insertType == EventInsertType.INITIAL_SYNC) } } if (roomSync.accountData?.events?.isNotEmpty() == true) { @@ -150,7 +212,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle // State event if (roomSync.state?.events?.isNotEmpty() == true) { for (event in roomSync.state.events) { - if (event.eventId == null || event.stateKey == null) { + if (event.eventId == null || event.stateKey == null || event.type == null) { continue } val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } @@ -173,8 +235,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle roomSync.timeline.prevToken, roomSync.timeline.limited, insertType, - syncLocalTimestampMillis, - isInitialSync + syncLocalTimestampMillis ) roomEntity.addIfNecessary(chunkEntity) } @@ -207,7 +268,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle roomEntity.membership = Membership.INVITE if (roomSync.inviteState != null && roomSync.inviteState.events.isNotEmpty()) { roomSync.inviteState.events.forEach { event -> - if (event.stateKey == null) { + if (event.stateKey == null || event.type == null) { return@forEach } val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } @@ -234,7 +295,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle syncLocalTimestampMillis: Long): RoomEntity { val roomEntity = RoomEntity.where(realm, roomId).findFirst() ?: realm.createObject(roomId) for (event in roomSync.state?.events.orEmpty()) { - if (event.eventId == null || event.stateKey == null) { + if (event.eventId == null || event.stateKey == null || event.type == null) { continue } val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } @@ -246,7 +307,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle roomMemberEventHandler.handle(realm, roomId, event) } for (event in roomSync.timeline?.events.orEmpty()) { - if (event.eventId == null || event.senderId == null) { + if (event.eventId == null || event.senderId == null || event.type == null) { continue } val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } @@ -278,8 +339,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle prevToken: String? = null, isLimited: Boolean = true, insertType: EventInsertType, - syncLocalTimestampMillis: Long, - isInitialSync: Boolean): ChunkEntity { + syncLocalTimestampMillis: Long): ChunkEntity { val lastChunk = ChunkEntity.findLastForwardChunkOfRoom(realm, roomEntity.roomId) val chunkEntity = if (!isLimited && lastChunk != null) { lastChunk @@ -294,12 +354,12 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle val roomMemberContentsByUser = HashMap() for (event in eventList) { - if (event.eventId == null || event.senderId == null) { + if (event.eventId == null || event.senderId == null || event.type == null) { continue } eventIds.add(event.eventId) - if (event.isEncrypted() && !isInitialSync) { + if (event.isEncrypted() && insertType != EventInsertType.INITIAL_SYNC) { decryptIfNeeded(event, roomId) } @@ -340,6 +400,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle event.mxDecryptionResult = adapter.fromJson(json) } } + timelineInput.onLocalEchoSynced(roomId, it, event.eventId) // Finally delete the local echo sendingEventEntity.deleteOnCascade(true) } else { @@ -375,10 +436,10 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle private fun handleEphemeral(realm: Realm, roomId: String, - ephemeral: RoomSyncEphemeral, + ephemeralEvents: List, isInitialSync: Boolean): EphemeralResult { var result = EphemeralResult() - for (event in ephemeral.events) { + for (event in ephemeralEvents) { when (event.type) { EventType.RECEIPT -> { @Suppress("UNCHECKED_CAST") diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncAPI.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncAPI.kt index 77289f04b4..8e3523bc57 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncAPI.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncAPI.kt @@ -16,6 +16,7 @@ package org.matrix.android.sdk.internal.session.sync +import okhttp3.ResponseBody import org.matrix.android.sdk.internal.network.NetworkConstants import org.matrix.android.sdk.internal.network.TimeOutInterceptor import org.matrix.android.sdk.internal.session.sync.model.SyncResponse @@ -23,6 +24,7 @@ import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.QueryMap +import retrofit2.http.Streaming internal interface SyncAPI { /** @@ -34,4 +36,15 @@ internal interface SyncAPI { @Header(TimeOutInterceptor.READ_TIMEOUT) readTimeOut: Long = TimeOutInterceptor.DEFAULT_LONG_TIMEOUT, @Header(TimeOutInterceptor.WRITE_TIMEOUT) writeTimeOut: Long = TimeOutInterceptor.DEFAULT_LONG_TIMEOUT ): Call + + /** + * Set all the timeouts to 1 minute by default + */ + @Streaming + @GET(NetworkConstants.URI_API_PREFIX_PATH_R0 + "sync") + fun syncStream(@QueryMap params: Map, + @Header(TimeOutInterceptor.CONNECT_TIMEOUT) connectTimeOut: Long = TimeOutInterceptor.DEFAULT_LONG_TIMEOUT, + @Header(TimeOutInterceptor.READ_TIMEOUT) readTimeOut: Long = TimeOutInterceptor.DEFAULT_LONG_TIMEOUT, + @Header(TimeOutInterceptor.WRITE_TIMEOUT) writeTimeOut: Long = TimeOutInterceptor.DEFAULT_LONG_TIMEOUT + ): Call } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt index a80b062427..d17a672485 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt @@ -18,17 +18,17 @@ package org.matrix.android.sdk.internal.session.sync import androidx.work.ExistingPeriodicWorkPolicy import com.zhuinden.monarchy.Monarchy -import org.matrix.android.sdk.R import org.matrix.android.sdk.api.pushrules.PushRuleService import org.matrix.android.sdk.api.pushrules.RuleScope +import org.matrix.android.sdk.api.session.initsync.InitSyncStep import org.matrix.android.sdk.internal.crypto.DefaultCryptoService import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.di.SessionId import org.matrix.android.sdk.internal.di.WorkManagerProvider -import org.matrix.android.sdk.internal.session.DefaultInitialSyncProgressService import org.matrix.android.sdk.internal.session.group.GetGroupDataWorker +import org.matrix.android.sdk.internal.session.initsync.ProgressReporter +import org.matrix.android.sdk.internal.session.initsync.reportSubtask import org.matrix.android.sdk.internal.session.notification.ProcessEventForPushTask -import org.matrix.android.sdk.internal.session.reportSubtask import org.matrix.android.sdk.internal.session.sync.model.GroupsSyncResponse import org.matrix.android.sdk.internal.session.sync.model.RoomsSyncResponse import org.matrix.android.sdk.internal.session.sync.model.SyncResponse @@ -51,13 +51,13 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private private val cryptoService: DefaultCryptoService, private val tokenStore: SyncTokenStore, private val processEventForPushTask: ProcessEventForPushTask, - private val pushRuleService: PushRuleService, - private val initialSyncProgressService: DefaultInitialSyncProgressService) { + private val pushRuleService: PushRuleService) { - suspend fun handleResponse(syncResponse: SyncResponse, fromToken: String?) { + suspend fun handleResponse(syncResponse: SyncResponse, + fromToken: String?, + reporter: ProgressReporter?) { val isInitialSync = fromToken == null Timber.v("Start handling sync, is InitialSync: $isInitialSync") - val reporter = initialSyncProgressService.takeIf { isInitialSync } measureTimeMillis { if (!cryptoService.isStarted()) { @@ -73,7 +73,7 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private // to ensure to decrypt them properly measureTimeMillis { Timber.v("Handle toDevice") - reportSubtask(reporter, R.string.initial_sync_start_importing_account_crypto, 100, 0.1f) { + reportSubtask(reporter, InitSyncStep.ImportingAccountCrypto, 100, 0.1f) { if (syncResponse.toDevice != null) { cryptoSyncHandler.handleToDevice(syncResponse.toDevice, reporter) } @@ -85,7 +85,7 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private monarchy.awaitTransaction { realm -> measureTimeMillis { Timber.v("Handle rooms") - reportSubtask(reporter, R.string.initial_sync_start_importing_account_rooms, 100, 0.7f) { + reportSubtask(reporter, InitSyncStep.ImportingAccountRoom, 1, 0.7f) { if (syncResponse.rooms != null) { roomSyncHandler.handle(realm, syncResponse.rooms, isInitialSync, reporter) } @@ -95,7 +95,7 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private } measureTimeMillis { - reportSubtask(reporter, R.string.initial_sync_start_importing_account_groups, 100, 0.1f) { + reportSubtask(reporter, InitSyncStep.ImportingAccountGroups, 1, 0.1f) { Timber.v("Handle groups") if (syncResponse.groups != null) { groupSyncHandler.handle(realm, syncResponse.groups, reporter) @@ -106,7 +106,7 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private } measureTimeMillis { - reportSubtask(reporter, R.string.initial_sync_start_importing_account_data, 100, 0.1f) { + reportSubtask(reporter, InitSyncStep.ImportingAccountData, 1, 0.1f) { Timber.v("Handle accountData") userAccountDataSyncHandler.handle(realm, syncResponse.accountData) } @@ -128,6 +128,15 @@ internal class SyncResponseHandler @Inject constructor(@SessionDatabase private cryptoSyncHandler.onSyncCompleted(syncResponse) } + suspend fun handleInitSyncSecondTransaction(syncResponse: SyncResponse) { + // Start another transaction to handle the ephemeral events + monarchy.awaitTransaction { realm -> + if (syncResponse.rooms != null) { + roomSyncHandler.handleInitSyncEphemeral(realm, syncResponse.rooms) + } + } + } + /** * At the moment we don't get any group data through the sync, so we poll where every hour. * You can also force to refetch group data using [Group] API. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt index 7c38230065..00060a33b1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt @@ -16,18 +16,29 @@ package org.matrix.android.sdk.internal.session.sync -import org.matrix.android.sdk.R +import okhttp3.ResponseBody +import org.matrix.android.sdk.api.session.initsync.InitSyncStep +import org.matrix.android.sdk.internal.di.SessionFilesDirectory import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.network.GlobalErrorReceiver import org.matrix.android.sdk.internal.network.TimeOutInterceptor import org.matrix.android.sdk.internal.network.executeRequest -import org.matrix.android.sdk.internal.session.DefaultInitialSyncProgressService +import org.matrix.android.sdk.internal.network.toFailure import org.matrix.android.sdk.internal.session.filter.FilterRepository import org.matrix.android.sdk.internal.session.homeserver.GetHomeServerCapabilitiesTask +import org.matrix.android.sdk.internal.session.initsync.DefaultInitialSyncProgressService +import org.matrix.android.sdk.internal.session.initsync.reportSubtask +import org.matrix.android.sdk.internal.session.sync.model.LazyRoomSyncEphemeral import org.matrix.android.sdk.internal.session.sync.model.SyncResponse +import org.matrix.android.sdk.internal.session.sync.parsing.InitialSyncResponseParser import org.matrix.android.sdk.internal.session.user.UserStore import org.matrix.android.sdk.internal.task.Task +import org.matrix.android.sdk.internal.util.logDuration +import retrofit2.Response +import retrofit2.awaitResponse import timber.log.Timber +import java.io.File +import java.net.SocketTimeoutException import javax.inject.Inject internal interface SyncTask : Task { @@ -48,11 +59,19 @@ internal class DefaultSyncTask @Inject constructor( private val getHomeServerCapabilitiesTask: GetHomeServerCapabilitiesTask, private val userStore: UserStore, private val syncTaskSequencer: SyncTaskSequencer, - private val globalErrorReceiver: GlobalErrorReceiver + private val globalErrorReceiver: GlobalErrorReceiver, + @SessionFilesDirectory + private val fileDirectory: File, + private val syncResponseParser: InitialSyncResponseParser ) : SyncTask { - override suspend fun execute(params: SyncTask.Params) = syncTaskSequencer.post { - doSync(params) + private val workingDir = File(fileDirectory, "is") + private val initialSyncStatusRepository: InitialSyncStatusRepository = FileInitialSyncStatusRepository(workingDir) + + override suspend fun execute(params: SyncTask.Params) { + syncTaskSequencer.post { + doSync(params) + } } private suspend fun doSync(params: SyncTask.Params) { @@ -73,28 +92,136 @@ internal class DefaultSyncTask @Inject constructor( if (isInitialSync) { // We might want to get the user information in parallel too userStore.createOrUpdate(userId) - initialSyncProgressService.endAll() - initialSyncProgressService.startTask(R.string.initial_sync_start_importing_account, 100) + initialSyncProgressService.startRoot(InitSyncStep.ImportingAccount, 100) } // Maybe refresh the home server capabilities data we know - getHomeServerCapabilitiesTask.execute(Unit) + getHomeServerCapabilitiesTask.execute(GetHomeServerCapabilitiesTask.Params(forceRefresh = false)) val readTimeOut = (params.timeout + TIMEOUT_MARGIN).coerceAtLeast(TimeOutInterceptor.DEFAULT_LONG_TIMEOUT) - val syncResponse = executeRequest(globalErrorReceiver) { - apiCall = syncAPI.sync( - params = requestParams, - readTimeOut = readTimeOut - ) - } - syncResponseHandler.handleResponse(syncResponse, token) if (isInitialSync) { + Timber.v("INIT_SYNC with filter: ${requestParams["filter"]}") + val initSyncStrategy = initialSyncStrategy + var syncResp: SyncResponse? = null + logDuration("INIT_SYNC strategy: $initSyncStrategy") { + if (initSyncStrategy is InitialSyncStrategy.Optimized) { + val file = downloadInitSyncResponse(requestParams) + syncResp = reportSubtask(initialSyncProgressService, InitSyncStep.ImportingAccount, 1, 0.7F) { + handleSyncFile(file, initSyncStrategy) + } + } else { + val syncResponse = logDuration("INIT_SYNC Request") { + executeRequest(globalErrorReceiver) { + apiCall = syncAPI.sync( + params = requestParams, + readTimeOut = readTimeOut + ) + } + } + + logDuration("INIT_SYNC Database insertion") { + syncResponseHandler.handleResponse(syncResponse, token, initialSyncProgressService) + } + } + } initialSyncProgressService.endAll() + + if (initSyncStrategy is InitialSyncStrategy.Optimized) { + logDuration("INIT_SYNC Handle ephemeral") { + syncResponseHandler.handleInitSyncSecondTransaction(syncResp!!) + } + initialSyncStatusRepository.setStep(InitialSyncStatus.STEP_SUCCESS) + // Delete all files + workingDir.deleteRecursively() + } + } else { + val syncResponse = executeRequest(globalErrorReceiver) { + apiCall = syncAPI.sync( + params = requestParams, + readTimeOut = readTimeOut + ) + } + syncResponseHandler.handleResponse(syncResponse, token, null) } Timber.v("Sync task finished on Thread: ${Thread.currentThread().name}") } + private suspend fun downloadInitSyncResponse(requestParams: Map): File { + workingDir.mkdirs() + val workingFile = File(workingDir, "initSync.json") + val status = initialSyncStatusRepository.getStep() + if (workingFile.exists() && status >= InitialSyncStatus.STEP_DOWNLOADED) { + Timber.v("INIT_SYNC file is already here") + reportSubtask(initialSyncProgressService, InitSyncStep.Downloading, 1, 0.3f) { + // Empty task + } + } else { + initialSyncStatusRepository.setStep(InitialSyncStatus.STEP_DOWNLOADING) + val syncResponse = logDuration("INIT_SYNC Perform server request") { + reportSubtask(initialSyncProgressService, InitSyncStep.ServerComputing, 1, 0.2f) { + getSyncResponse(requestParams, MAX_NUMBER_OF_RETRY_AFTER_TIMEOUT) + } + } + + if (syncResponse.isSuccessful) { + logDuration("INIT_SYNC Download and save to file") { + reportSubtask(initialSyncProgressService, InitSyncStep.Downloading, 1, 0.1f) { + syncResponse.body()?.byteStream()?.use { inputStream -> + workingFile.outputStream().use { outputStream -> + inputStream.copyTo(outputStream) + } + } + } + } + } else { + throw syncResponse.toFailure(globalErrorReceiver) + .also { Timber.w("INIT_SYNC request failure: $this") } + } + initialSyncStatusRepository.setStep(InitialSyncStatus.STEP_DOWNLOADED) + } + return workingFile + } + + private suspend fun getSyncResponse(requestParams: Map, maxNumberOfRetries: Int): Response { + var retry = maxNumberOfRetries + while (true) { + retry-- + try { + return syncAPI.syncStream( + params = requestParams + ).awaitResponse() + } catch (throwable: Throwable) { + if (throwable is SocketTimeoutException && retry > 0) { + Timber.w("INIT_SYNC timeout retry left: $retry") + } else { + Timber.e(throwable, "INIT_SYNC timeout, no retry left, or other error") + throw throwable + } + } + } + } + + private suspend fun handleSyncFile(workingFile: File, initSyncStrategy: InitialSyncStrategy.Optimized): SyncResponse { + return logDuration("INIT_SYNC handleSyncFile()") { + val syncResponse = logDuration("INIT_SYNC Read file and parse") { + syncResponseParser.parse(initSyncStrategy, workingFile) + } + initialSyncStatusRepository.setStep(InitialSyncStatus.STEP_PARSED) + // Log some stats + val nbOfJoinedRooms = syncResponse.rooms?.join?.size ?: 0 + val nbOfJoinedRoomsInFile = syncResponse.rooms?.join?.values?.count { it.ephemeral is LazyRoomSyncEphemeral.Stored } + Timber.v("INIT_SYNC $nbOfJoinedRooms rooms, $nbOfJoinedRoomsInFile ephemeral stored into files") + + logDuration("INIT_SYNC Database insertion") { + syncResponseHandler.handleResponse(syncResponse, null, initialSyncProgressService) + } + syncResponse + } + } + companion object { + private const val MAX_NUMBER_OF_RETRY_AFTER_TIMEOUT = 50 + private const val TIMEOUT_MARGIN: Long = 10_000 } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/LazyRoomSyncEphemeral.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/LazyRoomSyncEphemeral.kt new file mode 100644 index 0000000000..938168b5f4 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/LazyRoomSyncEphemeral.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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.session.sync.model + +import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.JsonClass +import com.squareup.moshi.JsonReader +import okio.buffer +import okio.source +import java.io.File + +@JsonClass(generateAdapter = false) +internal sealed class LazyRoomSyncEphemeral { + data class Parsed(val _roomSyncEphemeral: RoomSyncEphemeral) : LazyRoomSyncEphemeral() + data class Stored(val roomSyncEphemeralAdapter: JsonAdapter, val file: File) : LazyRoomSyncEphemeral() + + val roomSyncEphemeral: RoomSyncEphemeral + get() { + return when (this) { + is Parsed -> _roomSyncEphemeral + is Stored -> { + // Parse the file now + file.inputStream().use { pos -> + roomSyncEphemeralAdapter.fromJson(JsonReader.of(pos.source().buffer()))!! + } + } + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt index 212d319139..9aed0d37d6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt @@ -34,7 +34,7 @@ internal data class RoomSync( /** * The ephemeral events in the room that aren't recorded in the timeline or state of the room (e.g. typing, receipts). */ - @Json(name = "ephemeral") val ephemeral: RoomSyncEphemeral? = null, + @Json(name = "ephemeral") val ephemeral: LazyRoomSyncEphemeral? = null, /** * The account data events for the room (e.g. tags). diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/DefaultLazyRoomSyncEphemeralJsonAdapter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/DefaultLazyRoomSyncEphemeralJsonAdapter.kt new file mode 100644 index 0000000000..ef56802a66 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/DefaultLazyRoomSyncEphemeralJsonAdapter.kt @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 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.session.sync.parsing + +import com.squareup.moshi.FromJson +import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.JsonReader +import com.squareup.moshi.JsonWriter +import com.squareup.moshi.ToJson +import org.matrix.android.sdk.internal.session.sync.InitialSyncStrategy +import org.matrix.android.sdk.internal.session.sync.model.LazyRoomSyncEphemeral +import org.matrix.android.sdk.internal.session.sync.model.RoomSyncEphemeral +import timber.log.Timber +import java.io.File +import java.util.concurrent.atomic.AtomicInteger + +internal class DefaultLazyRoomSyncEphemeralJsonAdapter { + + @FromJson + fun fromJson(reader: JsonReader, delegate: JsonAdapter): LazyRoomSyncEphemeral? { + val roomSyncEphemeral = delegate.fromJson(reader) ?: return null + return LazyRoomSyncEphemeral.Parsed(roomSyncEphemeral) + } + + @ToJson + fun toJson(writer: JsonWriter, value: LazyRoomSyncEphemeral?) { + // This Adapter is not supposed to serialize object + Timber.v("To json $value with $writer") + throw UnsupportedOperationException() + } +} + +internal class SplitLazyRoomSyncJsonAdapter( + private val workingDirectory: File, + private val syncStrategy: InitialSyncStrategy.Optimized +) { + private val atomicInteger = AtomicInteger(0) + + private fun createFile(): File { + val index = atomicInteger.getAndIncrement() + return File(workingDirectory, "room_$index.json") + } + + @FromJson + fun fromJson(reader: JsonReader, delegate: JsonAdapter): LazyRoomSyncEphemeral? { + val path = reader.path + val json = reader.nextSource().inputStream().bufferedReader().use { + it.readText() + } + val limit = syncStrategy.minSizeToStoreInFile + return if (json.length > limit) { + Timber.v("INIT_SYNC $path content length: ${json.length} copy to a file") + // Copy the source to a file + val file = createFile() + file.writeText(json) + LazyRoomSyncEphemeral.Stored(delegate, file) + } else { + Timber.v("INIT_SYNC $path content length: ${json.length} parse it now") + val roomSync = delegate.fromJson(json) ?: return null + LazyRoomSyncEphemeral.Parsed(roomSync) + } + } + + @ToJson + fun toJson(writer: JsonWriter, value: LazyRoomSyncEphemeral?) { + // This Adapter is not supposed to serialize object + Timber.v("To json $value with $writer") + throw UnsupportedOperationException() + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/InitialSyncResponseParser.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/InitialSyncResponseParser.kt new file mode 100644 index 0000000000..ae7b2a4468 --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/InitialSyncResponseParser.kt @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 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.session.sync.parsing + +import com.squareup.moshi.Moshi +import okio.buffer +import okio.source +import org.matrix.android.sdk.internal.session.sync.InitialSyncStrategy +import org.matrix.android.sdk.internal.session.sync.model.SyncResponse +import timber.log.Timber +import java.io.File +import javax.inject.Inject + +internal class InitialSyncResponseParser @Inject constructor(private val moshi: Moshi) { + + fun parse(syncStrategy: InitialSyncStrategy.Optimized, workingFile: File): SyncResponse { + val syncResponseLength = workingFile.length().toInt() + Timber.v("INIT_SYNC Sync file size is $syncResponseLength bytes") + val shouldSplit = syncResponseLength >= syncStrategy.minSizeToSplit + Timber.v("INIT_SYNC should split in several files: $shouldSplit") + return getMoshi(syncStrategy, workingFile.parentFile!!, shouldSplit) + .adapter(SyncResponse::class.java) + .fromJson(workingFile.source().buffer())!! + } + + private fun getMoshi(syncStrategy: InitialSyncStrategy.Optimized, workingDirectory: File, shouldSplit: Boolean): Moshi { + // If we don't have to split we'll rely on the already default moshi + if (!shouldSplit) return moshi + // Otherwise, we create a new adapter for handling Map of Lazy sync + return moshi.newBuilder() + .add(SplitLazyRoomSyncJsonAdapter(workingDirectory, syncStrategy)) + .build() + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetURLFormatter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetURLFormatter.kt index db74e76b31..0937f6d18b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetURLFormatter.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetURLFormatter.kt @@ -37,12 +37,12 @@ internal class DefaultWidgetURLFormatter @Inject constructor(private val integra private lateinit var currentConfig: IntegrationManagerConfig private var whiteListedUrls: List = emptyList() - override fun onStart() { + override fun onSessionStarted() { setupWithConfiguration() integrationManager.addListener(this) } - override fun onStop() { + override fun onSessionStopped() { integrationManager.removeListener(this) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt index f841a2a245..73a4cc697d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt @@ -62,12 +62,12 @@ internal class WidgetManager @Inject constructor(private val integrationManager: private val lifecycleOwner: LifecycleOwner = LifecycleOwner { lifecycleRegistry } private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(lifecycleOwner) - override fun onStart() { + override fun onSessionStarted() { lifecycleRegistry.currentState = Lifecycle.State.STARTED integrationManager.addListener(this) } - override fun onStop() { + override fun onSessionStopped() { integrationManager.removeListener(this) lifecycleRegistry.currentState = Lifecycle.State.DESTROYED } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/LogUtil.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/LogUtil.kt new file mode 100644 index 0000000000..fe68b49a5c --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/LogUtil.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2020 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.util + +import org.matrix.android.sdk.BuildConfig +import timber.log.Timber + +internal suspend fun logDuration(message: String, + block: suspend () -> T): T { + Timber.v("$message -- BEGIN") + val start = System.currentTimeMillis() + val result = logRamUsage(message) { + block() + } + val duration = System.currentTimeMillis() - start + Timber.v("$message -- END duration: $duration ms") + + return result +} + +internal suspend fun logRamUsage(message: String, block: suspend () -> T): T { + return if (BuildConfig.DEBUG) { + val runtime = Runtime.getRuntime() + runtime.gc() + val freeMemoryInMb = runtime.freeMemory() / 1048576L + val usedMemInMBStart = runtime.totalMemory() / 1048576L - freeMemoryInMb + Timber.v("$message -- BEGIN (free memory: $freeMemoryInMb MB)") + val result = block() + runtime.gc() + val usedMemInMBEnd = (runtime.totalMemory() - runtime.freeMemory()) / 1048576L + val usedMemInMBDiff = usedMemInMBEnd - usedMemInMBStart + Timber.v("$message -- END RAM usage: $usedMemInMBDiff MB") + result + } else { + block() + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/StringProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/StringProvider.kt deleted file mode 100644 index 69d50680a7..0000000000 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/StringProvider.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2020 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.util - -import android.content.res.Resources -import androidx.annotation.NonNull -import androidx.annotation.PluralsRes -import androidx.annotation.StringRes -import dagger.Reusable -import javax.inject.Inject - -@Reusable -internal class StringProvider @Inject constructor(private val resources: Resources) { - - /** - * Returns a localized string from the application's package's - * default string table. - * - * @param resId Resource id for the string - * @return The string data associated with the resource, stripped of styled - * text information. - */ - @NonNull - fun getString(@StringRes resId: Int): String { - return resources.getString(resId) - } - - /** - * Returns a localized formatted string from the application's package's - * default string table, substituting the format arguments as defined in - * [java.util.Formatter] and [java.lang.String.format]. - * - * @param resId Resource id for the format string - * @param formatArgs The format arguments that will be used for - * substitution. - * @return The string data associated with the resource, formatted and - * stripped of styled text information. - */ - @NonNull - fun getString(@StringRes resId: Int, vararg formatArgs: Any?): String { - return resources.getString(resId, *formatArgs) - } - - @NonNull - fun getQuantityString(@PluralsRes resId: Int, quantity: Int, vararg formatArgs: Any?): String { - return resources.getQuantityString(resId, quantity, *formatArgs) - } -} diff --git a/matrix-sdk-android/src/main/res/values-ar/strings.xml b/matrix-sdk-android/src/main/res/values-ar/strings.xml deleted file mode 100644 index 0da4dc8f8e..0000000000 --- a/matrix-sdk-android/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,150 +0,0 @@ - - - %1$s قد أرسل صورة. - دعوة من %s - %1$s قد دعى %2$s - %1$s قد دعاك أنت - %1$s قد إنضّم إلى الغرفة - %1$s قد غادر الغرفة - %1$s قد رفض الدعوة - %1$s قد طرد %2$s - %1$s قد رفع الحظر عن %2$s - %1$s قد حظر %2$s - %1$s قد غيّر صورته الشخصية - %1$s قد عيّن اسمه الظاهر إلى %2$s - %1$s قد غيّر اسمه الظاهر من %2$s إلى %3$s - %1$s قد أزال اسمه الظاهر (لقد كان %2$s) - %1$s قد غيّر الموضوع إلى: %2$s - %1$s قد غيّر اسم الغرفة إلى: %2$s - %s قد أجاب على المُكالمة. - %s قد أنهى المُكالمة. - %1$s قد جعل التأريخ المُستقبلي للغرفة مرئيًا لـ %2$s - جميع أعضاء الغرفة، من اللحظة التي تمت دعوتهم. - جميع أعضاء الغرفة، من لحظة انضمامهم. - جميع أعضاء الغرفة. - أيُّ شخص. - غير معروف (%s). - %1$s قد فعّل تعمية النهاية-إلى-النهاية (%2$s) - %1$s قد طلب اجتماع VoIP - اجتماع VoIP قد بدأ - اجتماع VoIP قد انتهى - %1$s قد أزال اسم الغرفة - %1$s قد أزال موضوع الغرفة - حدّث ⁨%1$s⁩ اللاحة ⁨%2$s⁩ - أرسل ⁨%1$s⁩ دعوة إلى ⁨%2$s⁩ للانضمام إلى الغرفة - ** تعذّر فك التعمية: ⁨%s⁩ ** - لم يُرسل جهاز المرسل مفاتيح هذه الرسالة. - تعذّر إرسال الرسالة - فشل رفع الصورة - خطأ في الشبكة - خطأ في «ماترِكس» - لا يمكنك حاليًا الانضمام ثانيةً إلى غرفة فارغة. - رسالة معمّاة - عنوان البريد الإلكتروني - رقم الهاتف - ‏‏⁨%1$s⁩: ‏⁨%2$s⁩ - %1$s قد سحب دعوة %2$s - %s قد أجرى مُكالمة مرئية. - %s قد أجرى مُكالمة صوتية. - قَبِل ⁨%1$s⁩ دعوة ⁨%2$s⁩ - تعذر التهذيب - %1$s قد أرسل مُلصقًا. - (تمَّ تغيير الصورة أيضًا) - دعوة من ⁨%s⁩ - غرفة فارغة - ‏⁨%1$s⁩ و ⁨%2$s⁩ - دعوة إلى غرفة - - - - - - - - - أنت قد أرسلت صورة. - أنت قد أرسلت مُلصقًا. - دعوة منك أنت - %1$s قد أنشأ الغرفة - أنت قد أنشأت الغرفة - أنت قد دعوت %1$s - أنت قد انضممت إلى الغرفة - أنت قد غادرت الغرفة - أنت قد رفضت الدعوة - أنت قد طردت %1$s - أنت قد رفعت الحظر عن %1$s - أنت قد حظرت %1$s - أنت قد سحبت دعوة %1$s - أنت قد غيّرت صورتك الشخصية - أنت قد عيّنت اسمك الظاهر إلى %1$s - أنت قد غيّرت اسمك الظاهر من ⁨%1$s⁩ إلى ⁨%2$s⁩ - أنت قد أزلت اسمك الظاهر (لقد كان ⁨%1$s⁩) - أنت قد غيّرت الموضوع إلى: ⁨%1$s⁩ - %1$s قد غيّر صورة الغرفة - أنت قد غيّرت صورة الغرفة - أنت قد غيّرت اسم الغرفة إلى: %1$s - أنت قد أجريت مُكالمة مرئية. - أنت قد أجريت مُكالمة صوتية. - %s قد أرسل بيانات لإعداد مُكالمة. - أنت قد أرسلت بيانات لإعداد مُكالمة. - أنت قد أجبت على المُكالمة. - أنت قد أنهيت المُكالمة. - أنت قد جعلت التأريخ المُستقبلي للغرفة مرئيًا لـ %1$s - أنت قد فعّلت تعيمية النهاية-إلى-النهاية (%1$s) - %s قد قام بترقية هذه الغرفة. - أنت قد رقّيتَ هذه الغرفة. - أنت قد طلبت اجتماع VoIP - أنت قد أزلت اسم الغرفة - أنت قد أزلت موضوع الغرفة - %1$s قد أزال صورة الغرفة - أنت قد أزلت صورة الغرفة - تمت إزالة الرسالة - الرسالة قد أُزيلت بواسطة %1$s - أُزيلت الرسالة [السبب: ⁨%1$s⁩] - أزال ⁨%1$s⁩ الرسالة [السبب: ⁨%2$s⁩] - أرسلت دعوة إلى ⁨%1$s⁩ للانضمام إلى الغرفة - سحب ⁨%1$s⁩ دعوة ⁨%2$s⁩ للانضمام إلى الغرفة - سحبت دعوة ⁨%1$s⁩ للانضمام إلى الغرفة - قَبِلت دعوة ⁨%1$s⁩ - أضاف ⁨%1$s⁩ الودجة ⁨%2$s⁩ - أضفت الودجة ⁨%1$s⁩ - أزال ⁨%1$s⁩ الودجة ⁨%2$s⁩ - أزلت الودجة ⁨%1$s⁩ - عدّل ⁨%1$s⁩ الودجة ⁨%2$s⁩ - عدّلت الودجة ⁨%1$s⁩ - مدير - المبدئي - مخصّص (⁨%1$d⁩) - مخصّص - غيّرت مستوى قوّة %1$s⁩. - غيّر ⁨%1$s⁩ مستوى قوّة %2$s⁩. - ‏⁨%1$s⁩ من ⁨%2$s⁩ إلى ⁨%3$s⁩ - المزامنة الأولية: -\nيستورد الحساب… - 🎉 جميع الخوادم محظورة من المُشاركة! لم يعُد من الممكن استخدام هذه الغرفة. - لا تغيير. - • خوادم مُطابقة IP الحرفية محظورة الآن. - • الخادم المُطابق لـ %s قد أُزيل من قائمة السماح. - • الخادم المُطابق لـ %s مسموح الآن. - • الخادم المُطابق لـ %s قد أُزيل من قائمة الحظر. - • الخادم المُطابق لـ %s محظور الآن. - • خوادم مُطابقة IP الحرفية مسموحة الآن. - أنت قد غيّرت خادم الـACLs لهذه الغرفة. - %s قد غيّر خادم الـACLs لهذه الغرفة. - • الخادم يحظر مُطابقة القيم الحرفية للـIP. - • الخادم المُطابق لـ %s مسموح. - • الخادم المُطابق لـ %s محظور. - • الخادم يسمح بمُطابقة القيم الحرفية للـIP. - أنت قد عيّنت خادم الـACLs لهذه الغرفة. - %s قد عيّن خادم الـACLs لهذه الغرفة. - أنت قد قمت بالترقية هُنا. - %s قد قام بالترقية هُنا. - أنت قد جعلت الرسائل المُستقبلية مرئية لـ %1$s - %1$s قد جعل الرسائل المُستقبلية مرئية لـ %2$s - أنت قد غادرت الغرفة - %1$s قد غادر الغرفة - أنت قد انضممت - %1$s قد انضم - أنت قد أنشأت المُناقشة - %1$s قد أنشأ المُناقشة - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-ar/strings_sas.xml b/matrix-sdk-android/src/main/res/values-ar/strings_sas.xml new file mode 100644 index 0000000000..423a8332bf --- /dev/null +++ b/matrix-sdk-android/src/main/res/values-ar/strings_sas.xml @@ -0,0 +1,68 @@ + + + + كَلب + هِرَّة + أَسَد + حِصَان + حِصَانٌ بِقَرن + خِنزِير + فِيل + أَرنَب + باندَا + دِيك + بِطريق + سُلحفاة + سَمَكَة + أُخطُبُوط + فَرَاشَة + زَهرَة + شَجَرَة + صبار + فُطر + كُرَةٌ أرضِيَّة + قَمَر + سَحابَة + نار + مَوزَة + تُفَّاحَة + فَراوِلَة + ذُرَة + بِيتزا + كَعكَة + قَلب + اِبتِسَامَة + رُوبُوت + قُبَّعَة + نَظَّارَة + مِفتَاحُ رَبط + سانتا + رَفعُ إِبهَام + مِظَلَّة + سَاعَةٌ رَملِيَّة + سَاعَة + هَدِيَّة + مِصبَاح + كِتَاب + قَلَمُ رَصاص + مِشبَكُ وَرَق + مِقَصّ + قُفل + مِفتَاح + مِطرَقَة + تِلِفُون + عَلَم + قِطَار + دَرّاجَة + طَائِرة + صَارُوخ + كَأسُ النَّصر + كُرَة + غيتار + بُوق + جَرَس + مِرسَاة + سَمّاعَة رَأس + مُجَلَّد + دَبُّوس + diff --git a/matrix-sdk-android/src/main/res/values-az/strings.xml b/matrix-sdk-android/src/main/res/values-az/strings.xml deleted file mode 100644 index 1f366c647f..0000000000 --- a/matrix-sdk-android/src/main/res/values-az/strings.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - %1$s: %2$s - %1$s şəkil göndərdi. - %1$s stiker göndərdi. - - %s-nin dəvəti - %1$s dəvət etdi %2$s - %1$s sizi dəvət etdi - %1$s qoşuldu - %1$s qalıb - %1$s dəvəti rədd etdi - %1$s %2$s-i xaric etdi - %1$s %2$s-i blokdan açdı - %1$s %2$s-i blokladı - %1$s %2$s-in dəvətini geri götürdü - %1$s avatarı dəyişdi - %1$s ekran adını %2$s olaraq təyin etdi - %1$s ekran adını %2$s-dan %3$s-ya dəyişdi - %1$s onların göstərilən adlarını sildi (%2$s) - %1$s mövzunu dəyişdi: %2$s - %1$s otaq adını dəyişdirdi: %2$s - %s video zəng etdi. - %s səsli zəng etdi. - %s zəngə cavab verdi. - %s zəng başa çatdı. - "%1$s gələcək otaq tarixçəsini %2$s-ə görünən etdi" - bütün otaq üzvləri, dəvət olunduğu andan. - bütün otaq üzvləri, qoşulduğu andan. - bütün otaq üzvləri. - hər kəs. - naməlum (%s). - %1$s sondan-sona şifrələmə açdı (%2$s) - %s bu otağı təkmilləşdirdi. - - %1$s VoIP konfrans istədi - VoIP konfransı başladı - VoIP konfransı başa çatdı - - (avatar da dəyişdirilib) - %1$s otaq adını sildi - %1$s otaq mövzusunu sildi - Mesaj silindi - Mesaj %1$s tərəfindən silindi - Mesaj silindi [səbəb: %1$s] - Mesaj %1$s tərəfindən qaldırıldı [səbəb: %2$s] - %1$s profilini %2$s yenilədi - %1$s otağa qoşulmaq üçün %2$s dəvətnamə göndərdi - %1$s otağa qoşulmaq üçün %2$s dəvətini ləğv etdi - %1$s %2$s üçün dəvəti qəbul etdi - - ** Şifrəni aça bilmir: %s ** - Göndərənin cihazı bu mesaj üçün açarları bizə göndərməyib. - - Redaktə etmək olmur - Mesaj göndərmək olmur - - Şəkil yükləmək olmur - - Şəbəkə xətası - Matris xətası - - Boş bir otağa yenidən qoşulmaq hazırda mümkün deyil. - - Şifrəli mesaj - - Elektron poçt ünvanı - Telefon nömrəsi - - %s-dən dəvət - Otağa dəvət - - %1$s və %2$s - - - %1$s və 1 digər - %1$s və %2$d digərləri - - - Boş otaq - - İlkin sinxronizasiya: -\nHesab idxal olunur… - İlkin sinxronizasiya: -\nKriptografiyanın idxalı - İlkin sinxronizasiya: -\nOtaqlar idxalı - İlkin sinxronizasiya: -\nOtaqlara daxil olmaq - İlkin sinxronizasiya: -\nDəvət olunmuş otaqların idxalı - İlkin sinxronizasiya: -\nTərk olunmuş otaqların idxalı - İlkin sinxronizasiya: -\nİcmaların idxalı - İlkin sinxronizasiya: -\nHesab məlumatlarının idxalı - - Mesaj göndərilir… - Göndərmə növbəsini təmizləyin - - %1$s-nin dəvəti. Səbəb: %2$s - %1$s dəvət olunmuş %2$s. Səbəb: %3$s - %1$s sizi dəvət etdi. Səbəb: %2$s - %1$s qoşuldu. Səbəb: %2$s - %1$s qalıb. Səbəb: %2$s - %1$s dəvəti rədd etdi. Səbəb: %2$s - %1$s %2$s-i xaric etdi. Səbəb: %3$s - %1$s blokdan açdı %2$s. Səbəb: %3$s - %1$s blokladı %2$s. Səbəb: %3$s - %1$s otağa qoşulmaq üçün %2$s dəvətnamə göndərdi. Səbəb: %3$s - %1$s otağa qoşulmaq üçün %2$s dəvətini ləğv etdi. Səbəb: %3$s - %1$s %2$s üçün dəvəti qəbul etdi. Səbəb: %3$s - %1$s %2$s dəvətini geri götürdü. Səbəb: %3$s - - diff --git a/matrix-sdk-android/src/main/res/values-bg/strings.xml b/matrix-sdk-android/src/main/res/values-bg/strings.xml deleted file mode 100644 index c3a5f3be82..0000000000 --- a/matrix-sdk-android/src/main/res/values-bg/strings.xml +++ /dev/null @@ -1,216 +0,0 @@ - - - %1$s: %2$s - %1$s изпрати снимка. - Поканата на %s - %1$s покани %2$s - %1$s Ви покани - %1$s се присъедини в стаята - %1$s напусна стаята - %1$s отхвърли поканата - %1$s изгони %2$s - %1$s отблокира %2$s - %1$s блокира %2$s - %1$s оттегли поканата си за %2$s - %1$s смени своята профилна снимка - %1$s си сложи име %2$s - %1$s смени своето име от %2$s на %3$s - %1$s премахна своето име (%2$s) - %1$s смени темата на: %2$s - %1$s смени името на стаята на: %2$s - %s започна видео разговор. - %s започна гласов разговор. - %s отговори на обаждането. - %s прекрати разговора. - %1$s направи бъдещата история на стаята видима за %2$s - всички членове, от момента на поканването им в нея. - всички членове, от момента на присъединяването им в нея. - всички членове в нея. - всеки. - непозната (%s). - %1$s включи шифроване от край до край (%2$s) - %1$s заяви VoIP групов разговор - Започна VoIP групов разговор - Груповият разговор приключи - (профилната снимка също беше сменена) - %1$s премахна името на стаята - %1$s премахна темата на стаята - %1$s обнови своя профил %2$s - %1$s изпрати покана на %2$s да се присъедини към стаята - %1$s прие поканата за %2$s - ** Неуспешно разшифроване: %s ** - Неуспешно премахване - Неуспешно изпращане на съобщението - Неуспешно качване на снимката - Грешка в мрежата - Matrix грешка - В момента не е възможно да се присъедините отново към празна стая. - Шифровано съобщение - Имейл адрес - Телефонен номер - Устройството на подателя не изпрати ключовете за това съобщение. - %1$s изпрати стикер. - Покана от %s - Покана за стая - %1$s и %2$s - - %1$s и 1 друг - %1$s и %2$d други - - Празна стая - Премахнато съобщение - Съобщение премахнато от %1$s - Премахнато съобщение [причина: %1$s] - Съобщение премахнато от %1$s [причина: %2$s] - Начална синхронизация: -\nИмпортиране на профил… - Начална синхронизация: -\nИмпортиране на данни за шифроване - Начална синхронизация: -\nИмпортиране на стаи - Начална синхронизация: -\nИмпортиране на стаи, от които съм част - Начална синхронизация: -\nИмпортиране на стаи, към които съм поканен - Начална синхронизация: -\nИмпортиране на стаи, които съм напуснал - Начална синхронизация: -\nИмпортиране на общности - Начална синхронизация: -\nИмпортиране на данни за профила - %s обнови тази стая. - Изпращане на съобщение… - Изчисти опашката за изпращане - %1$s оттегли поканата за присъединяване на %2$s към стаята - поканата на %1$s. Причина: %2$s - %1$s покани %2$s. Причина: %3$s - %1$s ви покани. Причина: %2$s - %1$s се присъедини в стаята. Причина: %2$s - %1$s напусна стаята. Причина: %2$s - %1$s отхвърли поканата. Причина: %2$s - %1$s изгони %2$s. Причина: %3$s - %1$s блокира %2$s. Причина: %3$s - %1$s блокира %2$s. Причина: %3$s - %1$s изпрати покана до %2$s да се присъедини в стаята. Причина: %3$s - %1$s премахна поканата за присъединяване на %2$s в стаята. Причина: %3$s - %1$s прие поканата за %2$s. Причина: %3$s - %1$s оттегли поканата на %2$s. Причина: %3$s - - %1$s добави %2$s като адрес за тази стая. - %1$s добави %2$s като адреси за тази стая. - - - %1$s премахна %2$s като адрес за тази стая. - %1$s премахна %2$s като адреси за тази стая. - - %1$s добави %2$s и премахна %3$s като адреси за тази стая. - %1$s настрой %2$s като основен адрес за тази стая. - %1$s премахна основния адрес за тази стая. - %1$s разреши на гости да се присъединяват в стаята. - %1$s предотврати присъединяването на гости в стаята. - %1$s включи шифроване от-край-до-край. - %1$s включи шифроване от-край-до-край (неразпознат алгоритъм %2$s). - %s изпрати запитване за потвърждение на ключа ви, но клиентът ви не поддържа верифициране посредством чат. Ще трябва да използвате стария метод за верифициране на ключове. - %1$s създаде стаята - Изпратихте снимка. - Изпратихте стикер. - Ваша покана - Създадохте стаята - Поканихте %1$s - Присъединихте се в стаята - Напуснахте стаята - Отхвърлихте поканата - Изгонихте %1$s - Отблокирахте %1$s - Блокирахте %1$s - Включихте шифроване от-край-до-край (непознат алгоритъм: %1$s). - Включихте шифроване от-край-до-край. - Спряхте възможността гости да се присъединяват в стаята. - %1$s спря възможността гости да се присъединяват в стаята. - Спряхте възможността гости да се присъединяват в стаята. - Позволихте на гости да се присъединяват тук. - %1$s позволи на гости да се присъединяват тук. - Позволихте на гости да се присъединяват към стаята. - Премахнахте основния адрес на стаята. - Зададохте %1$s като основен адрес на стаята. - Добавихте %1$s и премахнахте %2$s от адресите за стаята. - - Премахнахте %1$s от адресите на стаята. - Премахнахте %1$s от адресите на стаята. - - - Добавихте %1$s като адрес за тази стая. - Добавихте %1$s като адреси за тази стая. - - Оттеглихте поканата на %1$s. Причина: %2$s - Приехте поканата за %1$s. Причина: %2$s - Оттеглихте поканата за присъединяване в стаята от %1$s. Причина: %2$s - Изпратихте покана към %1$s за присъединяване в стаята. Причина: %2$s - Блокирахте %1$s. Причина: %2$s - Отблокирахте %1$s. Причина: %2$s - Изгонихте %1$s. Причина: %2$s - Отхвърлихте поканата. Причина: %1$s - Напуснахте. Причина: %1$s - %1$s напусна. Причина: %2$s - Напуснахте стаята. Причина: %1$s - Присъединихте се. Причина: %1$s - %1$s се присъедини. Причина: %2$s - Присъединихте се в стаята. Причина: %1$s - Поканихте %1$s. Причина: %2$s - Ваша покана. Причина: %1$s - %1$s от %2$s на %3$s - %1$s промени нивото на достъп на %2$s. - Променихте нивото на достъп на %1$s. - Собствено ниво - Собствено ниво (%1$d) - По подразбиране - Модератор - Администратор - Променихте %1$s приспособлението - %1$s промени %2$s приспособлението - Премахнахте %1$s приспособлението - %1$s премахна %2$s приспособлението - Добавихте %1$s приспособление - %1$s добави %2$s приспособление - Приехте поканата за %1$s - Оттеглихте поканата от %1$s - %1$s оттегли поканата от %2$s - Оттеглихте поканата за присъединяване в стаята от %1$s - Поканихте %1$s - %1$s покани %2$s - Изпратихте покана към %1$s за присъединяване в стаята - Обновихте профила си %1$s - Премахнахте снимката на стаята - %1$s премахна снимката на стаята - Премахнахте темата на стаята - Премахнахте името на стаята - Заявихте VoIP конференция - Обновихте чата. - %s обнови чата. - Обновихте стаята. - Включихте шифроване от-край-до-край (%1$s) - Направихте бъдещите съобщения видими за %1$s - %1$s направи бъдещите съобщения видими за %2$s - Направихте бъдещата история на стаята видима за %1$s - Прекратихте разговора. - Започнахте видео разговор. - Отговорихте на обаждането. - Изпратихте данни за настройка на разговора. - %s изпрати данни за настройка на разговора. - Започнахте гласов разговор. - Променихте името на стаята на: %1$s - Променихте снимката на стаята - %1$s промени снимката на стаята - Променихте темата на: %1$s - Премахнахте името си (%1$s) - Променихте името си от %1$s на %2$s - Променихте името си на %1$s - Променихте снимката си - Оттеглихте поканата от %1$s - Напуснахте стаята - %1$s напусна стаята - Присъединихте се - %1$s се присъедини - Създадохте дискусията - %1$s създаде дискусията - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-bn-rIN/strings.xml b/matrix-sdk-android/src/main/res/values-bn-rIN/strings.xml deleted file mode 100644 index 35f8feaf0f..0000000000 --- a/matrix-sdk-android/src/main/res/values-bn-rIN/strings.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - %1$s একটি ফটো পাঠিয়েছে। - %1$s একটি স্তিকার পাঠিয়েছে। - %s এর আমন্ত্রণ - %1$s %2$s কে আমন্ত্রণ করেছে - %1$s আপনাকে আমন্ত্রণ করেছে - %1$s রুম এ যোগ দিয়েছে - %1$s রুম ছেড়ে দিয়েছে - %1$s আমন্ত্রণ টি বাতিল করেছে - %1$s %2$s কে কিক করেছে - %1$s %2$s কে নিষিদ্ধ তালিকা থেকে মুক্ত করেছে - %1$s %2$s কে নিষিদ্ধ করেছে - %1$s %2$s এর আমন্ত্রণ ফেরত নিয়েছে - %1$s নিজের অবতার পরিবর্তন করেছে - %1$s নিজের প্রদর্শন নাম %2$s রেখেছে - %1$s নিজের প্রদর্শন নাম %2$s থেকে %3$s তে পরিবর্তন করেছে - %1$s নিজের প্রদর্শন নাম মুছে দিয়েছে (%2$s) - %1$s বিষয় টি এতে পরিবর্তন করেছে: %2$s - %1$s রুম এর নাম এতে পরিবর্তন করেছে: %2$s - %s একটি ভিডিও কল স্থাপন করেছিল। - %s একটি ভয়েস কল দিয়েছে। - %1$s: %2$s - আপনি একটি ছবি প্রেরণ করেছেন। - আপনি একটি স্তিকার পাঠিয়েছেন। - আপনার আমন্ত্রণ - %1$s কক্ষটি তৈরি করেছেন - আপনি কক্ষটি তৈরি করেছেন - আপনি %1$s কে আমন্ত্রিত করেছেন - আপনি কক্ষে যোগ দিয়েছেন - আপনি কক্ষ ছেড়ে দিয়েছেন - আপনি আমন্ত্রণটি বাতিল করেছেন - আপনি %1$s কে কীক করেছেন - আপনি %1$s কে নিষিদ্ধ মুক্ত করেছেন - আপনি %1$s কে নিষিদ্ধ করেছেন - আপনি %1$s এর আমন্ত্রণ প্রত্যাহার করেছেন - আপনি আপনার অবতারটি পরিবর্তন করেছেন - আপনি আপনার প্রদর্শনের নামটি %1$s তে সেট করেছেন - আপনি আপনার প্রদর্শনের নামটি %1$s থেকে %2$s এ পরিবর্তন করেছেন - আপনি আপনার প্রদর্শনের নামটি সরিয়ে দিয়েছেন (যেটা ছিল %1$s) - আপনি বিষয়টিকে এতে পরিবর্তন করেছেন: %1$s - %1$s কক্ষের অবতারটি পরিবর্তন করেছে - আপনি কক্ষের অবতারটি পরিবর্তন করেছেন - আপনি কক্ষের নাম এতে পরিবর্তন করেছেন:%1$s - আপনি একটি ভিডিও কল করেছেন। - আপনি একটি ভয়েস কল দিয়েছেন। - কল সেটআপ করার জন্য %s ডেটা প্রেরণ করেছে। - আপনি কল সেটআপ করার জন্য ডেটা প্রেরণ করেছেন। - %s কলটির উত্তর দিয়েছে। - আপনি কলটি উত্তর দিয়েছেন। - %s কলটি শেষ করেছেন। - আপনি কলটি শেষ করেছেন। - %1$s ভবিষ্যতের ঘরের ইতিহাস %2$s এর কাছে দৃশ্যমান করে তুলেছে - আপনি ভবিষ্যতের কক্ষ ইতিহাস %1$s এর কাছে দৃশ্যমান করেছেন - কক্ষের সমস্ত সদস্য, যখন থেকে তারা আমন্ত্রিত। - কক্ষের সমস্ত সদস্য, যখন থেকে তারা যোগদান করেছিল। - সমস্ত কক্ষের সদস্য। - যে কেউ। - অজানা (%s)। - %1$s এন্ড-টু-এন্ড এনক্রিপশন চালু করেছে (%2$s) - আপনি শেষ-থেকে-শেষ এনক্রিপশন চালু করেছেন (%1$s) - %s এই কক্ষটিকে আপগ্রেড করেছে। - আপনি এই কক্ষটি আপগ্রেড করেছেন। - %1$s একটি ভিওআইপি সম্মেলনের জন্য অনুরোধ করেছে - আপনি একটি ভিওআইপি সম্মেলনের অনুরোধ করেছেন - ভিওআইপি সম্মেলন শুরু হয়েছে - ভিওআইপি সম্মেলন শেষ হয়েছে - (আবতারটিও পরিবর্তন করা হয়েছিল) - %1$s কক্ষের নাম সরিয়েছে - আপনি কক্ষের নাম সরিয়েছেন - %1$s কক্ষের বিষয় মুছে ফেলেছে - আপনি কক্ষের বিষয়টিকে সরিয়ে দিয়েছেন - %1$s কক্ষের অবতার সরিয়ে নিয়েছে - আপনি কক্ষের অবতার সরিয়েছেন - বার্তা সরানো হয়েছে - %1$s দ্বারা বার্তা সরানো হয়েছে - বার্তা সরানো হয়েছে [কারণ:%1$s] - %1$s দ্বারা বার্তা সরানো হয়েছে [কারণ: %2$s] - %1$s তাদের প্রোফাইল %2$s আপডেট করেছে - আপনি আপনার প্রোফাইল %1$s আপডেট করেছেন - %1$s %2$s কে ঘরে যোগদানের জন্য একটি আমন্ত্রণ পাঠিয়েছে - আপনি %1$s কে ঘরে যোগদানের জন্য একটি আমন্ত্রণ প্রেরণ করেছেন - %1$s %2$s এর কক্ষে যোগদানের আমন্ত্রণ বাতিল করে দিয়েছিল - আপনি %1$s এর কক্ষে যোগদানের জন্য আমন্ত্রণটি বাতিল করেছেন - %1$s %2$s এর জন্য আমন্ত্রণটি গ্রহণ করেছে - আপনি %1$s এর জন্য আমন্ত্রণটি গ্রহণ করেছেন - %1$s %2$s উইজেট যুক্ত করেছে - আপনি %1$s উইজেট যুক্ত করেছেন - %1$s %2$s উইজেট সরিয়ে দিয়েছেন - আপনি %1$s উইজেট সরিয়েছেন - %1$s %2$s উইজেট পরিবর্তন করেছেন - আপনি %1$s উইজেট পরিবর্তন করেছেন - অ্যাডমিন - নিয়ামক - ডিফল্ট - কাস্টম (%1$d) - কাস্টম - আপনি %1$s এর পাওয়ার স্তর পরিবর্তন করেছেন। - %1$s %2$s এর পাওয়ার স্তর পরিবর্তন করেছে। - %1$s %2$s থেকে %3$s পর্যন্ত - ** ডিক্রিপ্ট করতে অক্ষম: %s ** - প্রেরকের ডিভাইস আমাদের এই বার্তার জন্য কীগুলি প্রেরণ করেনি। - পুনরায় প্রতিক্রিয়া করতে পারেনি - বার্তা পাঠাতে অক্ষম - চিত্র আপলোড করতে ব্যর্থ - নেটওয়ার্ক ত্রুটি - ম্যাট্রিক্স ত্রুটি - খালি কক্ষে পুনরায় যোগদান করা বর্তমানে সম্ভব নয়। - এনক্রিপ্ট করা বার্তা - ইমেল ঠিকানা - ফোন নম্বর - %s থেকে আমন্ত্রণ করুন - কক্ষ আমন্ত্রণ - %1$s এবং %2$s - - %1$s এবং অন্য ১ জন - %1$s এবং অন্যান্য %2$d জন - - খালি কক্ষ - প্রাথমিক সিঙ্ক: -\nঅ্যাকাউন্ট আমদানি করা হচ্ছে… - প্রাথমিক সিঙ্ক: -\nক্রিপ্টো আমদানি হচ্ছে - প্রাথমিক সিঙ্ক: -\nকক্ষগুলি আমদানি করা হচ্ছে - প্রাথমিক সিঙ্ক: -\nযোগ করা কক্ষগুলিতে আমদানি করা হিচ্ছে - প্রাথমিক সিঙ্ক: -\nআমন্ত্রিত করা কক্ষগুলিতে আমদানি করা হিচ্ছে - প্রাথমিক সিঙ্ক: -\nছেড়ে দেওয়া কক্ষগুলিতে আমদানি করা হিচ্ছে - প্রাথমিক সিঙ্ক: -\nসম্প্রদায়গুলি আমদানি করা হচ্ছে - প্রাথমিক সিঙ্ক: -\nঅ্যাকাউন্ট ডেটা আমদানি করা হচ্ছে - বার্তা প্রেরণ করা হচ্ছে … - প্রেরণ সারি পরিষ্কার করুন - %1$s এর আমন্ত্রণ। কারণ: %2$s - আপনার আমন্ত্রণ। কারণ: %1$s - %1$s আমন্ত্রিত করেছেন %2$s কে। কারণ: %3$s - আপনি %1$s কে আমন্ত্রিত করেছেন। কারণ: %2$s - %1$s আপনাকে আমন্ত্রণ করেছে। কারণ: %2$s - %1$s রুম এ যোগ দিয়েছে। কারণ: %2$s - আপনি কক্ষে যোগ দিয়েছেন। কারণ: %1$s - %1$s রুম ছেড়ে দিয়েছে। কারণ: %2$s - আপনি কক্ষ ছেড়ে দিয়েছেন। কারণ: %1$s - %1$s আমন্ত্রণ বাতিল করেছেন। কারণ: %2$s - আপনি আমন্ত্রণটি বাতিল করেছেন। কারণ: %1$s - %1$s %2$s কে কিক করেছে। কারণ: %3$s - আপনি %1$s কে কীক করেছেন। কারণ: %2$s - %1$s %2$s কে নিষিদ্ধ তালিকা থেকে মুক্ত করেছে। কারণ: %3$s - আপনি %1$s কে নিষিদ্ধ মুক্ত করেছেন। কারণ: %2$s - %1$s %2$s কে নিষিদ্ধ করেছে। কারণ: %3$s - আপনি %1$s কে নিষিদ্ধ করেছেন। কারণ: %2$s - %1$s রুমের সাথে যোগ দিতে %2$s কে একটি আমন্ত্রণ পাঠিয়েছেন। কারণ: %3$s - আপনি %1$s কে ঘরে যোগদানের জন্য একটি আমন্ত্রণ প্রেরণ করেছেন। কারণ: %2$s - %1$s %2$s এর কক্ষে যোগদানের আমন্ত্রণ বাতিল করে দিয়েছিল। কারণ: %3$s - আপনি %1$s এর কক্ষে যোগদানের জন্য আমন্ত্রণটি বাতিল করেছেন। কারণ: %2$s - %1$s %2$s এর জন্য আমন্ত্রণ গ্রহণ করেছেন। কারণ: %3$s - আপনি %1$s এর জন্য আমন্ত্রণটি গ্রহণ করেছেন। কারণ: %2$s - %1$s %2$s এর আমন্ত্রণ ফেরত নিয়েছে। কারণ: %3$s - আপনি %1$s এর আমন্ত্রণ প্রত্যাহার করেছেন। কারণ: %2$s - - %1$s এই ঘরের ঠিকানা হিসাবে %2$s যুক্ত করেছে। - %1$s এই ঘরের ঠিকানাগুলি হিসাবে %2$s যুক্ত করেছে। - - - আপনি এই কক্ষের জন্য ঠিকানা হিসাবে %1$s যুক্ত করেছেন। - আপনি এই কক্ষের ঠিকানা হিসাবে %1$s যুক্ত করেছেন। - - - %1$s এই ঘরের ঠিকানা হিসাবে %2$s সরানো হয়েছে। - %1$s %3$s কে এই ঘরের ঠিকানা হিসাবে সরানো হয়েছে। - - - আপনি এই ঘরের ঠিকানা হিসাবে %1$s সরিয়েছেন। - আপনি এই ঘরের ঠিকানা হিসাবে %1$s গুলি সরিয়েছেন। - - %1$s %2$s যোগ করেছে এবং %3$s গুলি এই ঘরের ঠিকানা হিসাবে সরানো হয়েছে। - আপনি %1$s যোগ করেছেন এবং %2$s কে এই ঘরের ঠিকানা হিসাবে সরিয়ে দিয়েছেন। - %1$s এই ঘরের মূল ঠিকানাটি %2$s তে সেট করে। - আপনি এই ঘরের মূল ঠিকানাটি %1$s তে সেট করেছেন। - %1$s এই ঘরের মূল ঠিকানা সরিয়ে নিয়েছে। - আপনি এই ঘরের মূল ঠিকানা সরিয়েছেন। - %1$s অতিথিদের ঘরে যোগদানের অনুমতি দিয়েছে। - আপনি অতিথিদের ঘরে যোগদানের অনুমতি দিয়েছেন। - %1$s অতিথিদের ঘরে যোগদান করতে বাধা দিয়েছে। - আপনি অতিথিদের ঘরে যোগদান করতে বাধা দিয়েছেন। - %1$s এন্ড-টু-এন্ড এনক্রিপশন চালু করেছে। - আপনি শেষ থেকে শেষ এনক্রিপশন চালু করেছেন। - %1$s এন্ড-টু-এন্ড এনক্রিপশন চালু করেছে (অজানা অ্যালগরিদম %2$s)। - আপনি শেষ-থেকে-শেষ এনক্রিপশন চালু করেছেন (অজানা অ্যালগরিদম %1$s )। - %s আপনার কীটি যাচাই করার জন্য অনুরোধ করছে, তবে আপনার ক্লায়েন্ট ইন-চ্যাট কী যাচাইকরণ সমর্থন করে না। কীগুলি যাচাই করতে আপনাকে লিগ্যাসি কী যাচাইকরণ ব্যবহার করতে হবে। - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-bs/strings.xml b/matrix-sdk-android/src/main/res/values-bs/strings.xml deleted file mode 100644 index 6a6ee46d32..0000000000 --- a/matrix-sdk-android/src/main/res/values-bs/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - Pozovite iz %s - Poziv u Sobu - %1$s i %2$s - Prazna soba - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-ca/strings.xml b/matrix-sdk-android/src/main/res/values-ca/strings.xml deleted file mode 100644 index 98bda2c4ed..0000000000 --- a/matrix-sdk-android/src/main/res/values-ca/strings.xml +++ /dev/null @@ -1,268 +0,0 @@ - - - %1$s: %2$s - %1$s ha enviat una imatge. - %1$s ha marxat de la sala - %1$s s\'ha unit a la sala - Número de telèfon - Correu electrònic - Missatge xifrat - invitació de %s - %1$s ha convidat a %2$s - %1$s t\'ha convidat - %1$s ha rebutjat la invitació - %1$s ha expulsat %2$s - %1$s ha canviat el seu àlies de %2$s a %3$s - %1$s ha eliminat el àlies (era %2$s) - %1$s ha canviat el tema a: %2$s - %1$s ha canviat el nom de la sala a: %2$s - %s ha respost a la trucada. - %s ha finalitzat la trucada. - tots el participants de la sala, des de que són convidats. - tots els participants de la sala. - desconegut (%s). - %1$s ha activat el xifrat d\'extrem a extrem (%2$s) - %1$s ha sol·licitat una conferència VoIP - %1$s ha tret el vet a %2$s - %1$s ha vetat %2$s - %1$s ha retirat la invitació de %2$s - %1$s ha canviat la seva icona - %1$s ha establert la visibilitat de l\'històric futur de la sala a %2$s - tots els participants de la sala, des de que s\'hi uneixen. - qualsevol. - S\'ha iniciat la conferència VoIP - Ha finalitzat la conferència VoIP - (també ha canviat la icona) - %1$s ha eliminat el nom de la sala - %1$s ha eliminat el tema de la sala - %1$s ha actualitzat el seu perfil %2$s - %1$s ha enviat una invitació a %2$s perquè s\'uneixi a la sala - %1$s ha acceptat la invitació de %2$s - ** No s\'ha pogut desxifrar: %s ** - El dispositiu del remitent no ens ha enviat les claus per aquest missatge. - No s\'ha pogut redactar - No s\'ha pogut enviar el missatge - No s\'ha pogut pujar la imatge - Error de xarxa - Error de Matrix - Ara per ara no és possible tornar a unir-se a una sala buida. - %1$s a canviat el seu àlies a %2$s - %s ha realitzat una videotrucada. - %s ha realitzat una trucada de veu. - - Invitació de %s - Convida a la sala - %1$s i %2$s - Sala buida - - %1$s i 1 altre - %1$s i %2$d altres - - %1$s ha enviat un adhesiu. - %s s\'ha actualitzat aquí. - Ho has actualitzat aquí. - %s està sol·licitant la verificació de la teva clau, però el teu client no admet la verificació de clau des del xat. Hauràs d\'utilitzar la verificació de claus heretada per fer la verificació. - Has activat el xifrat d\'extrem a extrem (algorisme %1$s no reconegut). - %1$s ha activat el xifrat d\'extrem a extrem (algorisme %2$s no reconegut). - Has activat el xifrat d\'extrem a extrem. - %1$s ha activat el xifrat d\'extrem a extrem. - Has impedit que els convidats es puguin unir a la sala. - %1$s ha impedit que els convidats es puguin unir a la sala. - Has impedit que els convidats es puguin unir a la sala. - %1$s ha impedit que els convidats es puguin unir a la sala. - Has permès que els convidats s\'uneixin aquí. - %1$s ha permès que els convidats s\'uneixin aquí. - Has permès que els convidats s\'uneixin a la sala. - %1$s ha permès que els convidats s\'uneixin a la sala. - Has eliminat l\'adreça principal d\'aquesta sala. - %1$s ha eliminat l\'adreça principal d\'aquesta sala. - Has establert l\'adreça principal d\'aquesta sala a %1$s. - %1$s ha establert l\'adreça principal d\'aquesta sala a %2$s. - Has afegit %1$s i has eliminat %2$s d\'aquesta sala (adreces). - %1$s ha afegit %2$s i ha eliminat %3$s d\'aquesta sala (adreces). - - Has eliminat l\'adreça %1$s d\'aquesta sala. - Has eliminat les adreces %1$s d\'aquesta sala. - - - %1$s ha eliminat %2$s com a adreça d\'aquesta sala. - %1$s ha eliminat %2$s com a adreces d\'aquesta sala. - - - Has afegit l\'adreça %1$s a aquesta sala. - Has afegit les adreces %1$s a aquesta sala. - - - %1$s ha afegit l\'adreça %2$s a aquesta sala. - %1$s ha afegit les adreces %2$s a aquesta sala. - - Has revocat la invitació de %1$s perquè s\'uneixi a la sala. Motiu: %2$s - %1$s ha revocat la invitació de %2$s perquè s\'uneixi a la sala. Motiu: %3$s - Has revocat la invitació de %1$s - %1$s ha revocat la invitació de %2$s - Has revocat la invitació de %1$s perquè s\'uneixi a la sala - %1$s ha revocat la invitació de %2$s perquè s\'uneixi a la sala - Has retirat la invitació de %1$s. Motiu: %2$s - %1$s ha retirat la invitació de %2$s. Motiu: %3$s - Has acceptat la invitació de %1$s. Motiu: %2$s - %1$s ha acceptat la invitació de %2$s. Motiu: %3$s - Has enviat una invitació a %1$s perquè s\'uneixi a la sala. Motiu: %2$s - %1$s ha enviat una invitació a %2$s perquè s\'uneixi a la sala. Motiu: %3$s - Has vetat %1$s. Motiu: %2$s - %1$s ha vetat %2$s. Motiu: %3$s - Has tret el vet a %1$s. Motiu: %2$s - %1$s ha tret el vet a %2$s. Motiu: %3$s - Has vetat %1$s - Has marxat de la sala. Motiu: %1$s - %1$s ha marxat de la sala. Motiu: %2$s - Has marxat de la sala - %1$s ha marxat de la sala - Has marxat de la sala - Has expulsat %1$s - Has expulsat %1$s. Motiu: %2$s - %1$s ha expulsat %2$s. Motiu: %3$s - Has rebutjat la invitació. Motiu: %1$s - %1$s ha rebutjat la invitació. Motiu: %2$s - Has marxat. Motiu: %1$s - %1$s ha marxat. Motiu: %2$s - T\'has unit. Motiu: %1$s - %1$s s\'ha unit. Motiu: %2$s - T\'has unit a la sala. Motiu: %1$s - %1$s s\'ha unit a la sala. Motiu: %2$s - %1$s t\'ha convidat. Motiu: %2$s - Has convidat %1$s. Motiu: %2$s - %1$s ha convidat %2$s. Motiu: %3$s - La teva invitació. Motiu: %1$s - la invitació de %1$s. Motiu: %2$s - Esborra la cua d\'enviament - Enviant missatge… - Sincronització inicial: -\nImportant dades del compte - Sincronització inicial: -\nImportant comunitats - Sincronització inicial: -\nImportant sales que deixat - Sincronització inicial: -\nImportant compte… - Sincronització inicial: -\nImportant xifrat - Sincronització inicial: -\nImportant sales - Sincronització inicial: -\nImportant sales on hi estàs convidat - Sincronització inicial: -\nImportant sales on hi estàs unit - %1$s de %2$s a %3$s - %1$s ha canviat el nivell d\'autoritat de %2$s. - Has canviat el nivell d\'autoritat de %1$s. - Personalitzat - Personalitzat (%1$d) - Predeterminat - Moderador - Administrador - Has modificat el giny %1$s - %1$s ha modificat el giny %2$s - Has eliminat el giny %1$s - %1$s ha eliminat el giny %2$s - Has afegit el giny %1$s - %1$s ha afegit el giny %2$s - Has acceptat la invitació de %1$s - Has convidat a %1$s - %1$s ha convidat a %2$s - Has enviat una invitació a %1$s perquè s\'uneixi a la sala - Has actualitzat el teu perfil %1$s - Missatge eliminat per %1$s [motiu: %2$s] - Missatge eliminat [motiu: %1$s] - Missatge eliminat per %1$s - Missatge eliminat - Has eliminat la icona de la sala - %1$s ha eliminat la icona de la sala - Has eliminat el tema de la sala - Has eliminat el nom de la sala - Has sol·licitat una conferència VoIP - Has actualitzat aquesta sala. - %s ha actualitzat aquesta sala. - Has activat el xifrat d\'extrem a extrem (%1$s) - Has establert la visibilitat dels missatges futurs a %1$s - %1$s ha establert la visibilitat dels missatges futurs a %2$s - Has establert la visibilitat de l\'històric futur de la sala a %1$s - Has finalitzat la trucada. - Has respost a la trucada. - Has enviat dades per configurar la trucada. - %s ha enviat dades per configurar la trucada. - Has realitzat una trucada de veu. - Has realitzat una videotrucada. - Has canviat el nom de la sala a: %1$s - Has canviat la icona de la sala - %1$s ha canviat la icona de la sala - Has canviat el tema a: %1$s - Has eliminat el teu àlies (era %1$s) - Has canviat el teu àlies de %1$s a %2$s - Has canviat el teu àlies a %1$s - Has canviat la teva icona - Has retirat la invitació de %1$s - Has tret el vet a %1$s - Has rebutjat la invitació - Has creat la discussió - %1$s ha creat la discussió - T\'has unit - %1$s s\'ha unit - T\'has unit a la sala - Has convidat a %1$s - Has creat la sala - %1$s ha creat la sala - La teva invitació - Has enviat un adhesiu. - Has enviat una imatge. - • Servidors coincidents amb literals IP ara estan vetats. - • Servidors coincidents amb literals IP ara estan permesos. - • Servidors coincidents amb %s han estat eliminats de la llista de permesos. - • Servidors coincidents amb %s ara estan permesos. - • Servidors coincidents amb %s han estat eliminats del llista de vetats. - • Servidors coincidents amb %s ara estan vetats. - • Servidors coincidents amb literals IP estan vetats. - • Servidors coincidents amb literals IP estan permesos. - • Servidors coincidents amb %s estan permesos. - • Servidors coincidents amb %s estan vetats. - Has canviat les adreces d\'aquesta sala. - %1$s ha canviat les adreces d\'aquesta sala. - Has canviat l\'adreça principal i les adreces alternatives d\'aquesta sala. - %1$s ha canviat l\'adreça principal i les adreces alternatives d\'aquesta sala. - Has canviat les adreces alternatives d\'aquesta sala. - %1$s ha canviat les adreces alternatives d\'aquesta sala. - - Has eliminat l\'adreça alternativa %1$s d\'aquesta sala. - Has eliminat les adreces alternatives %1$s d\'aquesta sala. - - - %1$s ha eliminat l\'adreça alternativa %2$s d\'aquesta sala. - %1$s ha eliminat les adreces alternatives %2$s d\'aquesta sala. - - - Has afegit l\'adreça alternativa %1$s per aquesta sala. - Has afegit les adreces alternatives %1$s per aquesta sala. - - - %1$s ha afegit l\'adreça alternativa %2$s per aquesta sala. - %1$s ha afegit les adreces alternatives %2$s per aquesta sala. - - Sala buida (era %s) - - %1$s, %2$s, %3$s i %4$d altre - %1$s, %2$s, %3$s i %4$d altres - - %1$s, %2$s, %3$s i %4$s - %1$s, %2$s i %3$s - 🎉 Tots els servidors tenen la participació vetada! Aquesta sala ja no pot ser utilitzada. - Sense canvis. - Has canviat les ACLs de servidor d\'aquesta sala. - %s ha canviat les ACLs de servidor d\'aquesta sala. - Has establert les ACLs de servidor per aquesta sala. - %s ha establert les ACLs de servidor d\'aquesta sala. - Has modificat la videoconferència - %1$s ha modificat la videoconferència - Has finalitzat la videoconferència - %1$s ha iniciat una videoconferència - Has iniciat una videoconferència - %1$s ha finalitzat la videoconferència - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-cs/strings.xml b/matrix-sdk-android/src/main/res/values-cs/strings.xml deleted file mode 100644 index d92959ac4c..0000000000 --- a/matrix-sdk-android/src/main/res/values-cs/strings.xml +++ /dev/null @@ -1,271 +0,0 @@ - - - %1$s: %2$s - Uživatel %1$s poslal obrázek. - Uživatel %1$s poslal nálepku. - Pozvání od uživatele %s - Uživatel %1$s pozval uživatele %2$s - Uživatel %1$s vás pozval - %1$s vstoupil do místnosti - Uživatel %1$s odešel - %1$s odmítli pozvání - %1$s vykopli %2$s - %1$s zrušil vykázání %2$s - %1$s vykázali %2$s - %1$s zrušili pozvání pro %2$s - %1$s změnili svůj profilový obrázek - %1$s nastavili své veřejné jméno na %2$s - %1$s změnili své veřejné jméno z %2$s na %3$s - %1$s odstranili své veřejné jméno (%2$s) - %1$s změnili téma na: %2$s - %1$s změnili název místnosti na: %2$s - %s uskutečnili videohovor. - %s uskutečnili hlasový hovor. - %s přijali hovor. - %s ukončili hovor. - %1$s nastavili viditelnost budoucí historie místnosti pro %2$s - všechny členy místnosti od chvíle, kdy budou pozváni. - všechny členy místnosti od chvíle, kdy se připojí. - všechny členy místnosti. - kohokoliv. - neznámým (%s). - %1$s zapnuli end-to-end šifrování (%2$s) - %1$s požádali o VoIP konferenci - Začala VoIP konference - VoIP konference skončila - (profilový obrázek byl také změněn) - %1$s odstranili název místnosti - %1$s odstranili téma místnosti - %1$s aktualizovali svůj profil %2$s - %1$s do této místnosti pozvali %2$s - %1$s přijali pozvání pro %2$s - ** Nelze dešifrovat: %s ** - Odesílatelovo zařízení nám neposlalo klíče pro tuto zprávu. - Nelze vymazat - Zprávu nelze odeslat - Obrázek nelze nahrát - Chyba sítě - Chyba v Matrixu - V současnosti není možné znovu vstoupit do prázdné místnosti. - Šifrovaná zpráva - E-mailová adresa - Telefonní číslo - Pozvání od %s - Pozvání do místnosti - %1$s a %2$s - - %1$s a jeden další - %1$s a %2$d další - %1$s a %2$d dalších - - Prázdná místnost - %s povýšili tuto místnost. - Zpráva byla smazána [důvod: %1$s] - Zpráva smazána uživatelem %1$s [důvod: %2$s] - %1$s zrušili pozvánku do místnosti pro %2$s - Úvodní synchronizace: -\nImportuji účet… - Úvodní synchronizace: -\nImportuji klíče - Úvodní synchronizace: -\nImportuji místnosti - Úvodní synchronizace: -\nImportuji místností, jichž jste členy - Úvodní synchronizace: -\nImportuji místnost, jež jste opustili - Úvodní synchronizace: -\nImportuji skupiny - Úvodní synchronizace: -\nImportuji data účtu - Odesílám zprávu… - Úvodní synchronizace: -\nImportuji pozvání - Vymazat frontu neodeslaných zpráv - %1$s pozvali %2$s. Důvod: %3$s - %1$s vás pozvali. Důvod: %2$s - %1$s opustil místnost. Důvod: %2$s - Zpráva odstraněna - Zprávu odstranil/a %1$s - Poslali jste obrázek. - Poslali jste nálepku. - Vaše pozvání - %1$s založil místnost - Založili jste místnost - Pozvali jste %1$s - Vstoupili jste do místnosti - Opustili jste místnost - Odmítli jste pozvání - Vykopli jste %1$s - Zrušili jste vykázání pro %1$s - Vykázali jste %1$s - Stáhli jste pozvánku od %1$s zpět - Změnili jste svůj profilový obrázek - Změnili jste své veřejné jméno na %1$s - Změnili jste své veřejné jméno z %1$s na %2$s - Odstranili jste své veřejné jméno (%1$s) - Změnili jste téma na: %1$s - %1$s změnili obrázek místnosti - Změnili jste obrázek místnosti - Změnili jste jméno místnosti na: %1$s - Zahájili jste video hovor. - Zahájili jste hlasový hovor. - %s poslali data, aby mohli zahájit hovor. - Poslali jste data, abyste mohli zahájit hovor. - Přijali jste hovor. - Ukončili jste hovor. - Učinili jste budoucí historii místnosti viditelnou pro %1$s - Zapnuli jste end-to-end šifrování (%1$s) - Povýšili jste tuto místnost. - Požádali jste o VoIP konferenci - Odstranili jste jméno místnosti - Odstranili jste téma místnosti - %1$s odstranili obrázek místnosti - Odstranili jste obrázek místnosti - Aktualizovali jste svů profil %1$s - Poslali jste %1$s pozvání ke vstupu do místnosti - Zrušili jste pozvánku ke vstupu do místnosti pro %1$s - Přijali jste pozvání pro %1$s - %1$s přidali widget %2$s - Přidali jste widget %1$s - %1$s odstranili widget %2$s - Odstranili jste widget %1$s - %1$s změnil widget %2$s - Změnili jste widget %1$s - Správce - Moderátor - Výchozí - Vlastní (%1$d) - Vlastní - Změnili jste %1$s stupeň oprávnění. - %1$s změnili %2$s stupeň oprávnění. - %1$s z %2$s na %3$s - Pozvání od %1$s. Důvod: %2$s - Vaše pozvání. Důvod: %1$s - Pozvali jste %1$s. Důvod: %2$s - %1$s vstoupili do místnosti. Důvod: %2$s - Vstoupili jste do místnosti. Důvod: %1$s - Opustili jste místnost. Důvod: %1$s - %1$s pozvání odmítli. Důvod: %2$s - Odmítli jste pozvání. Důvod: %1$s - %1$s vykopnuli %2$s. Důvod: %3$s - Vykopnuli jste %1$s. Důvod: %2$s - %1$s zrušili %2$s vykázání. Důvod: %3$s - Zrušili jste %1$s vykázání. Důvod: %2$s - %1$s vykázali %2$s. Důvod: %3$s - Vykázali jste %1$s. Důvod: %2$s - %1$s poslali %2$s pozvání, aby vstoupili do místnosti. Důvod: %3$s - Poslali jste %1$s pozvání, aby vstoupili do místnosti. Důvod: %2$s - %1$s zrušili pozvání do místnosti pro %2$s. Důvod: %3$s - Zrušili jste pozvání do místnosti pro %1$s. Důvod: %2$s - %1$s přijali pozvání pro %2$s. Důvod: %3$s - Přijali jste pozvání pro %1$s. Důvod: %2$s - %1$s zrušili pozvání pro %2$s. Důvod: %3$s - Zrušili jste pozvání od %1$s. Důvod: %2$s - - %1$s přidali %2$s jako adresu pro tuto místnost. - %1$s přidali %2$s jako adresy pro tuto místnost. - %1$s přidali %2$s jako adresy pro tuto místnost. - - - Přidali jste %1$s jako adresu pro tuto místnost. - Přidali jste %1$s jako adresy pro tuto místnost. - Přidali jste %1$s jako adresy pro tuto místnost. - - - %1$s odstranili %2$s jako adresu pro tuto místnost. - %1$s odstranili %2$s jako adresy pro tuto místnost. - %1$s odstranili %2$s jako adresy pro tuto místnost. - - - Odstranili jste %1$s jako adresu pro tuto místnost. - Odstranili jste %1$s jako adresuy pro tuto místnost. - Odstranili jste %1$s jako adresy pro tuto místnost. - - %1$s přidali %2$s a odstranili %3$s jako adresy pro tuto místnost. - Přidali jste %1$s a odstranili %2$s jako adresy pro tuto místnost. - %1$s nastavili hlavní adresu této místnosti na %2$s. - Nastavili jste %1$s na hlavní adresu této místnosti. - %1$s odstranili hlavní adresu této místnosti. - Odstranili jste hlavní adresu této místnosti. - %1$s povolili hostům vstoupit do místnosti. - Povolili jste hostům vstoupit do místnosti. - %1$s zamezili hostům vstoupit do místnosti. - Zamezili jste hostům vstoupit do místnosti. - %1$s zapnuli end-to-end šifrování. - Zapnuli jste end-to-end šifrování. - %1$s zapnuli end-to-end šifrování (neznámý algoritmus %2$s). - Zapnuli jste end-to-end šifrování (neznámý algoritmus %1$s). - %s žádá ověření Vašeho klíče, ale Váš klient nepodporuje ověření klíče v chatu. Budete muset k ověření klíčů použít zastaralý způsob ověření. - Zamezili jste hostům vstoupit do této místnosti. - %1$s zamezil hostům vstoupit do této místnosti. - Povolili jste hostům vstoupit. - %1$s povolil hostům vstoupit. - Odešli jste. Důvod: %1$s - %1$s odešli. Důvod: %2$s - Vstoupili jste. Důvod: %1$s - %1$s vstoupili. Důvod: %2$s - Zrušili jste pozvání pro %1$s - %1$s zrušili pozvání pro %2$s - Pozvali jste %1$s - %1$s pozvali %2$s - Tady jste provedli upgrade. - %s tady provedli upgrade. - Učinili jste budoucí zprávy viditelné pro %1$s - %1$s učinili budoucí zprávy viditelné pro %2$s - Odešli jste z místnosti - %1$s odešli z místnosti - Vstoupili jste - %1$s vstoupili - Založili jste diskusi - %1$s založil diskusi - Prázdná místnost (byla %s) - - %1$s, %2$s, %3$s a %4$d další - %1$s, %2$s, %3$s a %4$d další - %1$s, %2$s, %3$s a %4$d dalších - - %1$s, %2$s, %3$s a %4$s - %1$s, %2$s a %3$s - 🎉 Účast všech serverů je zakázána! Tuto místnost již nelze použít. - Beze změny. - • Servery shodující se doslovně s IP jsou nyní zakázány. - • Servery shodující se doslovně s IP jsou nyní povoleny. - • Servery shodující se s %s byly odstraněny ze seznamu povolených. - • Servery shodující se s %s jsou nyní povoleny. - • Servery shodující se s %s byly odstraněny ze seznamu zakázaných. - • Servery shodující se s %s jsou nyní zakázány. - Změnili jste ACL serveru pro tuto místnost. - %s změnili ACL serveru pro tuto místnost. - • Server shodující se doslovně s IP je povolen. - • Server shodující se doslovně s IP je zakázán. - • Server shodující se s %s je povolen. - • Server shodující se s %s je zakázán. - Nastavili jste ACL serveru pro tuto místnost. - %s nastavili ACL serveru pro tuto místnost. - Změnili jste adresy pro tuto místnost. - %1$s změnili adresy pro tuto místnost. - Změnili jste hlavní a alternativní adresu pro tuto místnost. - %1$s změnili hlavní a alternativní adresu pro tuto místnost. - Změnili jste alternativní adresu pro tuto místnost. - %1$s změnili alternativní adresu pro tuto místnost. - - Odstranili jste alternativní adresu %1$s pro tuto místnost. - Odstranili jste alternativní adresy %1$s pro tuto místnost. - Odstranili jste alternativní adresy %1$s pro tuto místnost. - - - %1$s odstranili alternativní adresu %2$s pro tuto místnost. - %1$s odstranili alternativní adresy %2$s pro tuto místnost. - %1$s odstranili alternativní adresy %2$s pro tuto místnost. - - - Přidali jste alternativní adresu %1$s pro tuto místnost. - Přidali jste alternativní adresy %1$s pro tuto místnost. - Přidali jste alternativní adresy %1$s pro tuto místnost. - - - %1$s přidali alternativní adresu %2$s pro tuto místnost. - %1$s přidali alternativní adresy %2$s pro tuto místnost. - %1$s přidali alternativní adresy %2$s pro tuto místnost. - - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-cs/strings_sas.xml b/matrix-sdk-android/src/main/res/values-cs/strings_sas.xml new file mode 100644 index 0000000000..1ef9d56f60 --- /dev/null +++ b/matrix-sdk-android/src/main/res/values-cs/strings_sas.xml @@ -0,0 +1,68 @@ + + + + Pes + Kočka + Lev + Kůň + Jednorožec + Prase + Slon + Králík + Panda + Kohout + Tučňák + Želva + Ryba + Chobotnice + Motýl + Květina + Strom + Kaktus + Houba + Zeměkoule + Měsíc + Mrak + Oheň + Banán + Jablko + Jahoda + Kukuřice + Pizza + Dort + Srdce + Smajlík + Robot + Klobouk + Brýle + Klíč + Mikuláš + Palec nahoru + Deštník + Přesýpací hodiny + Hodiny + Dárek + Žárovka + Kniha + Tužka + Sponka + Nůžky + Zámek + Klíč + Kladivo + Telefon + Vlajka + Vlak + Kolo + Letadlo + Raketa + Pohár + Míč + Kytara + Trumpeta + Zvonek + Kotva + Sluchátka + Složka + Špendlík + diff --git a/matrix-sdk-android/src/main/res/values-da/strings.xml b/matrix-sdk-android/src/main/res/values-da/strings.xml deleted file mode 100644 index 510fa231af..0000000000 --- a/matrix-sdk-android/src/main/res/values-da/strings.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - %1$s: %2$s - %1$s sendte et billede. - - %ss invitation - %1$s inviterede %2$s - %1$s inviterede dig - %1$s forbandt - %1$s forlod rummet - %1$s afviste invitationen - %1$s kickede %2$s - %1$s unbannede %2$s - %1$s bannede %2$s - %1$s trak %2$ss invitation tilbage - %1$s skiftede sin avatar - %1$s satte sit viste navn til %2$s - %1$s ændrede sit viste navn fra %2$s til %3$s - %1$s fjernede sit viste navn (%2$s) - %1$s ændrede emnet til: %2$s - %1$s ændrede rumnavnet til: %2$s - %s startede et videoopkald. - %s startede et stemmeopkald. - %s svarede opkaldet. - %s stoppede opkaldet. - %1$s gjorde den fremtidige rum historik synlig for %2$s - alle medlemmer af rummet, fra det tidspunkt de er inviteret. - alle medlemmer af rummet, fra det tidspunkt de er forbundede. - Alle medlemmer af rummet. - alle. - ukendt (%s). - %1$s slog ende-til-ende kryptering til (%2$s) - - %1$s forespurgte en VoIP konference - VoIP konference startet - VoIP konference afsluttet - - (avatar blev også ændret) - %1$s fjernede navnet på rummet - %1$s fjernede emnet for rummet - %1$s opdaterede sin profil %2$s - %1$s inviterede %2$s til rummet - %1$s accepterede invitationen til %2$s - - ** Kunne ikke dekryptere: %s ** - Afsenderens enhed har ikke sendt os nøglerne til denne besked. - - Kunne ikke hemmeligholde - Kunne ikke sende besked - - Kunne ikke uploade billede - - Netværks fejl - Matrix fejl - - Det er i øjeblikket ikke muligt at genforbinde til et tomt rum. - - Krypteret besked - - mailadresse - Telefonnummer - - Invitation fra %s - Invitation til rum - %1$s og %2$s - - - %1$s og 1 anden - %1$s og %2$d andre - - - Tomt rum - - diff --git a/matrix-sdk-android/src/main/res/values-de/strings.xml b/matrix-sdk-android/src/main/res/values-de/strings.xml deleted file mode 100644 index 81cf01983d..0000000000 --- a/matrix-sdk-android/src/main/res/values-de/strings.xml +++ /dev/null @@ -1,275 +0,0 @@ - - - %1$s: %2$s - %1$s hat ein Bild gesendet. - Einladung von %s - %1$s hat %2$s eingeladen - %1$s hat dich eingeladen - %1$s hat den Raum betreten - %1$s hat den Raum verlassen - %1$s hat die Einladung abgelehnt - %1$s hat %2$s gekickt - %1$s hat die Sperre von %2$s aufgehoben - %1$s hat %2$s verbannt - %1$s hat die Einladung für %2$s zurückgezogen - %1$s hat das Profilbild geändert - %1$s hat den Anzeigenamen geändert in %2$s - %1$s hat den Anzeigenamen von %2$s auf %3$s geändert - %1$s hat den Anzeigenamen gelöscht (%2$s) - %1$s hat das Raumthema geändert auf: %2$s - %1$s hat den Raumnamen geändert in: %2$s - %s hat einen Videoanruf durchgeführt. - %s hat einen Sprachanruf getätigt. - %s hat den Anruf angenommen. - %s hat den Anruf beendet. - %1$s hat den zukünftigen Chatverlauf sichtbar gemacht für %2$s - Alle Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden). - Alle Mitglieder (ab dem Zeitpunkt, an dem sie den Raum betreten haben). - alle Raum-Mitglieder. - Jeder. - Unbekannt (%s). - %1$s hat die Ende-zu-Ende-Verschlüsselung aktiviert (%2$s) - %1$s möchte eine VoIP-Konferenz beginnen - VoIP-Konferenz gestartet - VoIP-Konferenz beendet - (Profilbild wurde ebenfalls geändert) - %1$s hat den Raumnamen entfernt - %1$s hat das Raum-Thema entfernt - %1$s hat das Benutzerprofil aktualisiert %2$s - %1$s hat eine Einladung an %2$s gesendet - %1$s hat die Einladung in %2$s akzeptiert - ** Nicht entschlüsselbar: %s ** - Das absendende Gerät hat uns keine Schlüssel für diese Nachricht übermittelt. - - Entfernen nicht möglich - Nachricht kann nicht gesendet werden - Bild konnte nicht hochgeladen werden - - Netzwerk-Fehler - Matrix-Fehler - - - - - Es ist aktuell nicht möglich, einen leeren Raum erneut zu betreten. - Verschlüsselte Nachricht - - E-Mail-Adresse - Telefonnummer - %1$s hat einen Sticker gesendet. - - Einladung von %s - Raumeinladung - %1$s und %2$s - Leerer Raum - - %1$s und 1 andere(r) - %1$s und %2$d andere - - Nachricht entfernt - Nachricht entfernt von %1$s - Nachricht entfernt [Grund: %1$s] - Nachricht entfernt von %1$s [Grund: %2$s] - %s hat diesen Raum aufgewertet. - Sende eine Nachricht… - Sendewarteschlange leeren - Erste Synchronisation: -\nImportiere Benutzerkonto… - Erste Synchronisation: -\nImportiere Cryptoschlüssel - Erste Synchronisation: -\nImportiere Räume - Erste Synchronisation: -\nImportiere betretene Räume - Erste Synchronisation: -\nImportiere eingeladene Räume - Erste Synchronisation: -\nImportiere verlassene Räume - Erste Synchronisation: -\nImportiere Communities - Erste Synchronisation: -\nImportiere Benutzerdaten - %1$s hat die Einladung an %2$s, den Raum zu betreten, zurückgezogen - %1$s\'s Einladung. Grund: %2$s - %1$s hat %2$s eingeladen. Grund: %3$s - %1$s hat dich eingeladen. Grund: %2$s - %1$s ist dem Raum beigetreten. Grund: %2$s - %1$s hat den Raum verlassen. Grund: %2$s - %1$s hat die Einladung abgelehnt. Grund: %2$s - %1$s hat %2$s gekickt. Grund: %3$s - %1$s hat Sperre von %2$s aufgehoben. Grund: %3$s - %1$s hat %2$s verbannt. Grund: %3$s - %1$s hat eine Einladung an %2$s gesandt um diesem Raum beizutreten. Grund: %3$s - %1$s hat Einladung an %2$s zu Betreten dieses Raumes zurückgezogen. Grund: %3$s - %1$s hat die Einladung für %2$s angenommen. Grund: %3$s - %1$s hat Einladung für %2$s verworfen. Grund: %3$s - - %1$s fügt %2$s als eine Adresse für diesen Raum hinzu. - %1$s fügt %2$s als Adressen für diesen Raum hinzu. - - - %1$s entfernt %2$s als eine Adresse für diesen Raum. - %1$s entfernt %2$s als Adressen für diesen Raum. - - %1$s fügt %2$s als Adresse für diesen Raum hinzu und entfernt %3$s. - %1$s legt die Hauptadresse fest für diesen Raum als %2$s fest. - %1$s entfernte die Hauptadresse für diesen Raum. - %1$s hat Gästen erlaubt den Raum zu betreten. - %1$s hat Gästen untersagt den Raum zu betreten. - %1$s aktivierte Ende-zu-Ende-Verschlüsselung. - %1$s aktivierte Ende-zu-Ende-Verschlüsselung (unbekannter Algorithmus %2$s). - %s fordert zur Überprüfung deines Schlüssels auf, jedoch unterstützt dein Client nicht die Schlüsselüberprüfung im Chat. Du musst die herkömmliche Schlüsselüberprüfung verwenden, um die Schlüssel zu überprüfen. - Du hast ein Bild gesendet. - Du hast einen Sticker gesendet. - Deine Einladung - %1$s hat den Raum erstellt - Du hast den Raum erstellt - Du hast %1$s eingeladen - Du bist dem Raum beigetreten - Du hast den Raum verlassen - Du hast die Einladung abgelehnt - Du hast %1$s aus dem Raum entfernt - Du hast den Bann von %1$s aufgehoben - Du hast %1$s gebannt - Du hast die Einladung von %1$s zurückgenommen - Du hast dein Profilbild geändert - Du hast deinen Anzeigenamen zu %1$s geändert - Du hast deinen Anzeigenamen von %1$s zu %2$s geändert - Du hast deinen Anzeigenamen entfernt (er war %1$s) - Du hast das Thema geändert auf: %1$s - %1$s hat das Bild des Raumes geändert - Du hast das Bild des Raumes geändert - Du hast den Raumnamen zu %1$s geändert - Du hast einen Videoanruf gestartet. - Du hast einen Audioanruf gestartet. - Du hast den Anruf angenommen. - Du hast den Anruf beendet. - Du hast den zukünftigen Nachrichtenverlauf für %1$s sichtbar gemacht - Du hast Ende-zu-Ende-Verschlüsselung aktiviert (%1$s) - Du hast den Raum aufgwertet. - Du hast eine VoIP-Konferenz angefordert - Du hast den Raumnamen entfernt - Du hast das Raumthema entfernt - %1$s hat das Bild des Raumes entfernt - Du hast das Bild des Raumes entfernt - Du hast dein Profil %1$s aktualisiert - Du hast %1$s in den Raum eingeladen - Du hast die Einladung für %1$s zurückgenommen - Du hast die Einladung für %1$s akzeptiert - %1$s hat das %2$s Widget hinzugefügt - Du hast das %1$s Widget hinzugefügt - %1$s hat das %2$s Widget entfernt - Du hast das %1$s Widget entfernt - %1$s hat das %2$s Widget modifiziert - Du hast das %1$s Widget modifiziert - Administrator - Moderator - Standard - Benutzerdefiniert (%1$d) - Benutzerdefiniert - Du hast die Berechtigungsstufe von %1$s geändert. - %1$s hat die Berechtigungsstufe von %2$s geändert. - %1$s von %2$s zu %3$s - Deine Einladung. Grund: %1$s - Du hast %1$s eingeladen. Grund: %2$s - Du bist dem Raum beigetreten. Grund: %1$s - Du hast den Raum verlassen. Grund: %1$s - Du hast die Einladung abgelehnt. Grund: %1$s - Du hast %1$s aus dem Raum entfernt. Grund %2$s - Du hast den Bann von %1$s aufgehoben. Grund: %2$s - Du hast %1$s gebannt. Grund: %2$s - Du hast %1$s in den Raum eingeladen. Grund: %2$s - Du hast die Einladung für %1$s zurückgenommen. Grund: %2$s - Du hast die Einladung von %1$s angenommen. Grund: %2$s - Du hast die Einladung von %1$s abgelehnt. Grund: %2$s - - Du hast die Raumaddresse %1$s hinzugefügt. - Du hast die Raumaddressen %1$s hinzugefügt. - - - Du hast die Raum-Adresse %1$s vom Raum entfernt. - Du hast die Raum-Adressen %1$s vom Raum entfernt. - - Du hast den Raumaddressen %1$s hinzugefügt und %2$s entfernt. - Du hast die Hauptaddresse für diesen Raum auf %1$s gesetzt. - Du hast die Hauptaddresse des Raums entfernt. - Du hast Gästen erlaubt dem Raum beizutreten. - Du hast Gästen untersagt dem Raum beizutreten. - Du hast Ende-zu-Ende-Verschlüsselung aktiviert. - Du hast Ende-zu-Ende-Verschlüsselung aktiviert (unbekannter Algorithmus %1$s). - %s hat Daten gesendet, um einen Anruf zu starten. - Du hast Daten geschickt, um eine Anruf zu starten. - Du hast Gästen erlaubt hier beizutreten. - %1$s hat Gästen erlaubt hier beizutreten. - Du bist beigetreten. Grund: %1$s - %1$s ist beigetreten. Grund: %2$s - Du hast die Einladung für %1$s zurückgezogen - %1$s hat die Einladung für %2$s zurückgezogen - Du hast %1$s eingeladen - %1$s hat %2$s eingeladen - Du hast zukünftige Nachrichten für %1$s sichtbar gemacht - %1$s hat zukünftige Nachrichten für %2$s sichtbar gemacht - Du hast den Raum verlassen - %1$s hat den Raum verlassen - Du bist beigetreten - %1$s ist beigetreten - Du hast eine Diskussion erstellt - %1$s hat eine Diskussion erstellt - %s hat hier ein Upgrade durchgeführt. - Du hast hier ein Upgrade durchgeführt. - Du hast Gästen untersagt den Raum zu betreten. - %1$s hat Gästen untersagt den Raum zu betreten. - Du bist gegangen. Grund: %1$s - %1$s ist gegangen. Grund: %2$s - Du hast die Adressen für diesen Raum geändert. - %1$s hat die Adressen für diesen Raum geändert. - Du hast die Haupt- und die alternativen Adressen für diesen Raum geändert. - %1$s hat die Haupt- und die alternativen Adressen für diesen Raum geändert. - Du hast die alternativen Adressen für diesen Raum geändert. - %1$s hat die alternativen Adressen für diesen Raum geändert. - - Du entferntest die alternative Adresse %1$s für diesen Raum. - Du entferntest die alternativen Adressen %1$s für diesen Raum. - - - %1$s entfernte die alternative Adresse %2$s für diesen Raum. - %1$s entfernte die alternativen Adressen %2$s für diesen Raum. - - - Du fügtest die alternative Adresse %2$s für diesen Raum hinzu. - Du fügtest die alternativen Adressen %2$s für diesen Raum hinzu. - - - %1$s fügte die alternative Adresse %2$s für diesen Raum hinzu. - %1$s fügte die alternativen Adressen %2$s für diesen Raum hinzu. - - Leerer Raum (war %s) - - %1$s, %2$s, %3$s und %4$d andere/r - %1$s, %2$s, %3$s und %4$d andere - - %1$s, %2$s, %3$s und %4$s - %1$s, %2$s und %3$s - 🎉 Alle Server sind von der Teilnahme ausgeschlossen! Dieser Raum kann nicht mehr genutzt werden. - Keine Änderung. - • Server, die mit IPs übereinstimmen, sind jetzt gesperrt. - • Server, die mit IPs übereinstimmen, sind nicht erlaubt. - • Server, die mit %s übereinstimmen, wurden von der Elaubten-Liste entfernt. - • Server, die mit %s übereinstimmen, sind jetzt erlaubt. - • Server, die mit %s übereinstimmen, werden von der Sperrliste entfernt. - • Server, die mit %s übereinstimmen, sind jetzt gesperrt. - Du hast die Server-ACL für diesen Raum geändert. - %s hat die Server-Zugriffssteuerungsliste (ACL) für diesen Raum geändert. - • Server, die mit IPs übereinstimmen, sind gesperrt. - • Server, die mit IPs übereinstimmen, sind erlaubt. - • Server, die mit %s übereinstimmen, sind erlaubt. - • Server, die mit %s übereinstimmen, sind gesperrt. - Du hast die Server-ACL für diesen Raum gesetzt. - %s hat die Server-Zugriffssteuerungsliste (ACL) für diesen Raum gesetzt. - Du hast eine Videokonferenz geändert - Videokonferenz von %1$s geändert - Videokonferenz von %1$s beendet - Du hast eine Videokonferenz beendet - Du hast eine Videokonferenz gestartet - Videokonferenz von %1$s gestartet - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-de/strings_sas.xml b/matrix-sdk-android/src/main/res/values-de/strings_sas.xml index 108dedd1a5..be75f797f9 100644 --- a/matrix-sdk-android/src/main/res/values-de/strings_sas.xml +++ b/matrix-sdk-android/src/main/res/values-de/strings_sas.xml @@ -27,20 +27,20 @@ Banane Apfel Erdbeere - Korn + Mais Pizza Kuchen Herz - Smiley + Lächeln Roboter Hut Brille Schraubenschlüssel - Nikolaus + Weihnachtsmann Daumen Hoch Regenschirm Sanduhr - Wecker + Uhr Geschenk Glühbirne Buch @@ -56,7 +56,7 @@ Fahrrad Flugzeug Rakete - Trophäe + Pokal Ball Gitarre Trompete diff --git a/matrix-sdk-android/src/main/res/values-el/strings.xml b/matrix-sdk-android/src/main/res/values-el/strings.xml deleted file mode 100644 index 9db4e91849..0000000000 --- a/matrix-sdk-android/src/main/res/values-el/strings.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - Ηλεκτρονική διεύθυνση - %1$s: %2$s - Ο/Η %1$s έστειλε μια εικόνα. - Ο/Η %1$s έστειλε ένα αυτοκόλλητο. - - Ο/Η %1$s σας προσκάλεσε - Ο/Η %1$s αποχώρησε - Ο/Η %1$s απέρριψε την πρόσκληση - Ο/Η %1$s έδιωξε τον/την %2$s - Ο/Η %1$s προσκάλεσε τον/την %2$s - Η πρόσκληση του/της %s - Αριθμός τηλεφώνου - - Ο/Η %1$s απέκλεισε τον/την %2$s - Ο/Η %1$s απέσυρε την πρόσκληση του/της %2$s - Ο/Η %1$s άλλαξε εικονίδιο χρήστη - Ο/Η %1$s άλλαξε το εμφανιζόμενό του/της όνομα σε %2$s - Ο/Η %1$s άλλαξε το εμφανιζόμενό του/της όνομα από %2$s σε %3$s - Ο/Η %1$s αφαίρεσε το εμφανιζόμενό του/της όνομα (%2$s) - Ο/Η %1$s άλλαξε το θέμα σε: %2$s - Ο/Η %1$s άλλαξε το όνομα του δωματίου σε: %2$s - Ο/Η %s απάντησε στην κλήση. - Ο/Η %s τερμάτισε την κλήση. - - Ο/Η %s πραγματοποίησε μια κλήση βίντεο. - Ο/Η %s πραγματοποίησε μια κλήση ήχου. - Ο/Η %1$s κατέστησε το μελλοντικό ιστορικό του δωματίου ορατό στον/στην %2$s - όλα τα μέλη του δωματίου, από την στιγμή που προσκλήθηκαν. - όλα τα μέλη του δωματίου. - οποιοσδήποτε. - άγνωστος/η (%s). - (έγινε αλλαγή και του εικονιδίου χρήστη) - Ο/Η %1$s αφαίρεσε το όνομα του δωματίου - Ο/Η %1$s αφαίρεσε το θέμα του δωματίου - Ο/Η %1$s ανανέωσε το προφίλ του/της %2$s - Ο/Η %1$s δέχτηκε την πρόσκληση για το %2$s - - ** Αδυναμία αποκρυπτογράφησης: %s ** - Η συσκευή του/της αποστολέα δεν μας έχει στείλει τα κλειδιά για αυτό το μήνυμα. - - Αποτυχία αποστολής μηνύματος - - Αποτυχία αναφόρτωσης εικόνας - - Σφάλμα δικτύου - Σφάλμα του Matrix - - Κρυπτογραφημένο μήνυμα - - Ο/Η %1$s ζήτησε μια VoIP διάσκεψη - Η VoIP διάσκεψη ξεκίνησε - Η VoIP διάσκεψη έληξε - - Ο/Η %1$s εισήλθε στο δωμάτιο - - Πρόσκληση από %s - Πρόσκληση στο δωμάτιο - - %1$s και %2$s - - - %1$s και 1 ακόμα - %1$s και %2$d ακόμα - - - Άδειο δωμάτιο - - όλα τα μέλη του δωματίου από την στιγμή που εισήλθαν. - Ο/Η %1$s ενεργοποίησε την κρυπτογράφηση απ\'άκρη σ\'άκρη (%2$s) - - Ο/Η %1$s έστειλε μία πρόσκληση στον/στην %2$s για να εισέλθει στο δωμάτιο - Δεν είναι δυνατή ακόμα η επανείσοδος σε ένα άδειο δωμάτιο. - - diff --git a/matrix-sdk-android/src/main/res/values-eo/strings.xml b/matrix-sdk-android/src/main/res/values-eo/strings.xml deleted file mode 100644 index 10be2103cf..0000000000 --- a/matrix-sdk-android/src/main/res/values-eo/strings.xml +++ /dev/null @@ -1,216 +0,0 @@ - - - %1$s sendis bildon. - %1$s sendis glumarkon. - Invito de %s - %1$s invitis uzanton %2$s - %1$s invitis vin - %1$s envenis - %1$s foriris de la ĉambro - %1$s rifuzis la inviton - %1$s forpelis uzanton %2$s - %1$s malforbaris uzanton %2$s - %1$s forbaris uzanton %2$s - %1$s nuligis inviton por %2$s - %1$s ŝanĝis sian profilbildon - ** Ne eblas malĉifri: %s ** - La aparato de la sendinto ne sendis al ni la ŝlosilojn por tiu mesaĝo. - %1$s: %2$s - %1$s ŝanĝis sian prezentan nomon al %2$s - %1$s ŝanĝis sian prezentan nomon de %2$s al %3$s - %1$s forigis sian prezentan nomon (%2$s) - %1$s ŝanĝis la temon al: %2$s - %1$s ŝanĝis nomon de la ĉambro al: %2$s - %s vidvokis. - %s voĉvokis. - %s respondis la vokon. - %s finis la vokon. - %1$s videbligis estontan historion de ĉambro al %2$s - ĉiuj ĉambranoj, ekde siaj invitoj. - ĉiuj ĉambranoj, ekde siaj aliĝoj. - ĉiuj ĉambranoj. - ĉiu ajn. - nekonata (%s). - %1$s ŝaltis tutvojan ĉifradon (%2$s) - %s gradaltigis la ĉambron. - Mesaĝo foriĝis - Mesaĝon forigis %1$s - Mesaĝo foriĝis [kialo: %1$s] - Mesaĝon forigis %1$s [kialo: %2$s] - %1$s ĝisdatigis sian profilon %2$s - %1$s sendis aliĝan inviton al %2$s - %1$s nuligis la aliĝan inviton por %2$s - %1$s akceptis la inviton por %2$s - Ne povis redakti - Ne povas sendi mesaĝon - Malsukcesis alŝuti bildon - Reta eraro - Matrix-eraro - Nun ne eblas re-aliĝi al malplena ĉambro. - Ĉifrita mesaĝo - Retpoŝtadreso - Telefonnumero - Invito de %s - Invito al ĉambro - %1$s kaj %2$s - - %1$s kaj 1 alia - %1$s kaj %2$d aliaj - - Malplena ĉambro - Komenca spegulado: -\nEnportante konton… - Komenca spegulado: -\nEnportante ĉifrilojn - Komenca spegulado: -\nEnportante ĉambrojn - Komenca spegulado: -\nEnportante aliĝitajn ĉambrojn - Komenca spegulado: -\nEnportante ĉambrojn de invitoj - Komenca spegulado: -\nEnportante forlasitajn ĉambrojn - Komenca spegulado: -\nEnportante komunumojn - Komenca spegulado: -\nEnportante datumojn de konto - Sendante mesaĝon… - Vakigi sendan atendovicon - %1$s petis grupan vokon - Grupa voko komenciĝis - Grupa voko finiĝis - (ankaŭ profilbildo ŝanĝiĝis) - %1$s forigis nomon de la ĉambro - %1$s forigis temon de la ĉambro - Invito de %1$s. Kialo: %2$s - %1$s invitis uzanton %2$s. Kialo: %3$s - %1$s invitis vin. Kialo: %2$s - %1$s envenis. Kialo: %2$s - %1$s foriris de la ĉambro. Kialo: %2$s - %1$s rifuzis la inviton. Kialo: %2$s - %1$s forpelis uzanton %2$s. Kialo: %3$s - %1$s malforbaris uzanton %2$s. Kialo: %3$s - %1$s forbaris uzanton %2$s. Kialo: %3$s - %1$s sendis al %2$s inviton al la ĉambro. Kialo: %3$s - %1$s nuligis la inviton al la ĉambro por %2$s. Kialo: %3$s - %1$s akceptis la inviton por %2$s. Kialo: %3$s - %1$s nuligis la inviton por %2$s. Kialo: %3$s - - %1$s aldonis %2$s kiel adreson por ĉi tiu ĉambro. - %1$s aldonis %2$s kiel adresojn por ĉi tiu ĉambro. - - - %1$s forigis %2$s kiel adreson por ĉi tiu ĉambro. - %1$s forigis %2$s kiel adresojn por ĉi tiu ĉambro. - - %1$s aldonis %2$s kaj forigis %3$s kiel adresojn por ĉi tiu ĉambro. - %1$s agordis la ĉefadreson de ĉi tiu ĉambro al %2$s. - %1$s forigis la ĉefadreson de ĉi tiu ĉambro. - %1$s permesis al gastoj enveni. - %1$s malpermesis al gastoj enveni. - %1$s ŝaltis tutvojan ĉifradon. - %1$s ŝaltis tutvojan ĉifradon (kun nerekonita algoritmo %2$s). - %s petas kontrolon de via ŝlosilo, sed via kliento ne subtenas kontrolon de ŝlosiloj en la babilujo. Vi devos uzi malnovan kontrolmanieron de ŝlosiloj. - Vi ŝanĝis la povnivelon de %1$s. - %1$s sanĝis la povnivelon de %2$s. - Vi ŝaltis tutvojan ĉifradon (kun nerekonita algoritmo %1$s). - Vi ŝaltis tutvojan ĉifradon. - Vi malpermesis al gastoj aliĝi. - %1$s malpermesis al gastoj aliĝi. - Vi malpermesis al gastoj enveni. - Vi permesis al gastoj aliĝi. - %1$s permesis al gastoj aliĝi. - Vi permesis al gastoj enveni. - Vi forigis la ĉefadreson de ĉi tiu ĉambro. - Vi agordis al ĉefadreson de ĉi tiu ĉambro al %1$s. - Vi aldonis %1$s kaj forigis %2$s kiel adresojn por ĉi tiu ĉambro. - - Vi forigis %1$s kiel adreson por ĉi tiu ĉambro. - Vi forigis %1$s kiel adresojn por ĉi tiu ĉambro. - - - Vi aldonis %1$s kiel adreson por ĉi tiu ĉambro. - Vi aldonis %1$s kiel adresojn por ĉi tiu ĉambro. - - Vi nuligis la inviton por %1$s. Kialo: %2$s - Vi akceptis la inviton por %1$s. Kialo: %2$s - Vi nuligis inviton al la ĉambro por %1$s. Kialo: %2$s - Vi sendis al %1$s inviton al la ĉambro. Kialo: %2$s - Vi forbaris uzanton %1$s. Kialo: %2$s - Vi malforbaris uzanton %1$s. Kialo: %2$s - Vi forpelis uzanton %1$s. Kialo: %2$s - Vi rifuzis la inviton. Kialo: %1$s - Vi foriris. Kialo: %1$s - %1$s foriris. Kialo: %2$s - Vi foriris de la ĉambro. Kialo: %1$s - Vi envenis. Kialo: %1$s - Vi aliĝis. Kialo: %1$s - %1$s aliĝis. Kialo: %2$s - Vi invitis uzanton %1$s. Kialo: %2$s - Via invito. Kialo: %1$s - %1$s de %2$s al %3$s - Propra - Ordinara - Propra (%1$d) - Reguligisto - Administranto - Vi ŝanĝis la fenestraĵon %1$s - %1$s ŝanĝis la fenestraĵon %2$s - Vi forigis la fenestraĵon %1$s - %1$s forigis la fenestraĵon %2$s - Vi aldonis la fenestraĵon %1$s - %1$s aldonis la fenestraĵon %2$s - Vi akceptis la inviton por %1$s - Vi nuligis la inviton por %1$s - %1$s nuligis la inviton por %2$s - Vi nuligis la aliĝan inviton por %1$s - Vi invitis uzanton %1$s - %1$s invitis uzanton %2$s - Vi sendis aliĝan inviton al %1$s - Vi ĝisdatigis vian profilon %1$s - Vi forigis bildon de la ĉambro - %1$s forigis bildon de la ĉambro - Vi forigis temon de la ĉambro - Vi forigis nomon de la ĉambro - Vi petis grupan vokon - Vi gradaltigis la interparolon. - %s gradaltigis la interparolon. - Vi gradaltigis la ĉambron. - Vi ŝaltis tutvojan ĉifradon (%1$s) - %1$s videbligis al %2$s estontajn mesaĝojn - Vi videbligis al %1$s estontajn mesaĝojn - Vi videbligis estontan historion de ĉambro al %1$s - Vi finis la vokon. - Vi respondis la vokon. - Vi sendis datumojn por prepari la vokon. - %s sendis datumojn por prepari la vokon. - Vi voĉvokis. - Vi vidvokis. - Vi ŝanĝis la nomon de la ĉambro al: %1$s - Vi ŝanĝis la bildon de la ĉambro - %1$s ŝanĝis la bildon de la ĉambro - Vi ŝanĝis la temon al: %1$s - Vi forigis vian prezentan nomon (%1$s) - Vi ŝanĝis vian prezentan nomon de %1$s al %2$s - Vi ŝanĝis vian prezentan nomon al %1$s - Vi ŝanĝis vian profilbildon - Vi nuligis inviton por %1$s - Vi forbaris uzanton %1$s - Vi malforbaris uzanton %1$s - Vi forpelis uzanton %1$s - Vi rifuzis la inviton - Vi foriris de la ĉambro - %1$s foriris de la ĉambro - Vi foriris de la ĉambro - Vi envenis - %1$s envenis - Vi envenis - Vi invitis uzanton %1$s - Vi kreis la diskuton - %1$s kreis la diskuton - Vi kreis la ĉambron - %1$s kreis la ĉambron - Via invito - Vi sendis glumarkon. - Vi sendis bildon. - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-es-rMX/strings.xml b/matrix-sdk-android/src/main/res/values-es-rMX/strings.xml deleted file mode 100644 index a8e8477005..0000000000 --- a/matrix-sdk-android/src/main/res/values-es-rMX/strings.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - %1$s: %2$s - %1$s envió una imagen. - - la invitación de %s - %1$s invitó a %2$s - %1$s te invitó - %1$s se unió - %1$s salió - %1$s rechazó la invitación - %1$s quitó a %2$s - %1$s desprohibió a %2$s - %1$s prohibió %2$s - %1$s retiró la invitación de %2$s - %1$s cambió su foto de perfil - %1$s estableció %2$s como su nombre visible - %1$s cambió su nombre visible de %2$s a %3$s - %1$s eliminó su nombre visible (%2$s) - %1$s cambió el tema a: %2$s - %1$s cambió el nombre de la sala a: %2$s - %s comenzó una llamada de video. - %s comenzó una llamada de voz. - %s recibió la llamada. - %s terminó la llamada. - %1$s dejó que %2$s vea el historial del futuro - todos los miembros de la sala, desde su invitación. - todos los miembros de la sala, desde cuando entraron. - todos los miembros de la sala. - todos. - desconocido (%s). - %1$s encendió el cifrado de extremo a extremo (%2$s) - - %1$s solicitó una conferencia VoIP - conferencia VoIP comenzó - conferencia VoIP finalizó - - (foto de perfil también se cambió) - %1$s eliminó el nombre de la sala - %1$s retiró el tema de la sala - %1$s actualizó su perfil %2$s - %1$s envió una invitación a %2$s para entrar a la sala - %1$s aceptó la invitación de %2$s - - ** No se puede descifrar: %s ** - El dispositivo del remitente no nos ha enviado las claves de este mensaje. - - - No se pudo redactar - No se puede enviar el mensaje - - La subida de la imagen falló - - - Error de la red - Error de Matrix - - - - - - - - - No es posible volver a unirse a una sala vacía. - - Mensaje cifrado - - - Correo electrónico - Número telefónico - - %1$s envió una calcomanía. - - - Invitación de %s - Invitación de Sala - %1$s y %2$s - Sala vacía - - - - %1$s y otro - %1$s y %2$d otros - - - Mensaje eliminado - Mensaje eliminado por %1$s - Mensaje eliminado [motivo: %1$s] - Mensaje eliminado por %1$s [motivo: %2$s] - diff --git a/matrix-sdk-android/src/main/res/values-es/strings.xml b/matrix-sdk-android/src/main/res/values-es/strings.xml deleted file mode 100644 index 3648ca3a72..0000000000 --- a/matrix-sdk-android/src/main/res/values-es/strings.xml +++ /dev/null @@ -1,224 +0,0 @@ - - - %1$s: %2$s - %1$s envió una imagen. - la invitación de %s - %1$s invitó a %2$s - %1$s te ha invitado - %1$s se ha unido - %1$s salió - %1$s rechazó la invitación - %1$s expulsó a %2$s - %1$s le quitó el veto a %2$s - %1$s vetó a %2$s - %1$s retiró la invitación de %2$s - %1$s cambió su avatar - %1$s estableció %2$s como su nombre público - %1$s cambió su nombre público de %2$s a %3$s - %1$s eliminó su nombre público (%2$s) - %1$s cambió el tema a: %2$s - %1$s cambió el nombre de la sala a: %2$s - %s realizó una llamada de vídeo. - %s realizó una llamada de voz. - %s contestó la llamada. - %s finalizó la llamada. - %1$s hizo visible el historial futuro de la sala para %2$s - todos los miembros de la sala, desde su invitación. - todos los miembros de la sala, desde el momento en que se unieron. - todos los miembros de la sala. - todos. - desconocido (%s). - %1$s ha activado la encriptación de Extremo-a-Extremo (%2$s) - %1$s solicitó una conferencia de vozIP - conferencia de vozIP iniciada - conferencia de vozIP finalizada - (el avatar también se cambió) - %1$s eliminó el nombre de la sala - %1$s eliminó el tema de la sala - %1$s actualizó su perfil %2$s - %1$s invitó a %2$s a unirse a la sala - %1$s aceptó la invitación para %2$s - ** No es posible descifrar: %s ** - El dispositivo emisor no nos ha enviado las claves para este mensaje. - - No se pudo redactar - No es posible enviar el mensaje - No se pudo cargar la imagen - - Error de red - Error de Matrix - - - - - Actualmente no es posible volver a unirse a una sala vacía. - Mensaje encriptado - - Dirección de correo electrónico - Número telefónico - %1$s envió una pegatina. - - Invitación de %s - Invitación a Sala - %1$s y %2$s - Sala vacía - - %1$s y 1 otro - %1$s y %2$d otros - - Mensaje eliminado - Mensaje eliminado por %1$s - Mensaje eliminado [motivo: %1$s] - Mensaje eliminado por %1$s [motivo: %2$s] - %1$s ha revocado la invitación a unirse a la sala para %2$s - Sincronización Inicial -\nImportando cuenta… - Sincronización Inicial: -\nImportando Salas - Sincronización Inicial: -\nImportando Comunidades - Sincronización Inicial: -\nImportando Datos de la Cuenta - Enviando mensaje… - Borrar cola de envío - %1$s ha invitado a %2$s. Razón: %3$s - %1$s te ha invitado. Razón: %2$s - %1$s se ha unido. Razón: %2$s - %1$s se ha ido. Razón: %2$s - %1$s ha rechadazo la invitación. Razón: %2$s - %1$s expulsó a %2$s. Razón: %3$s - %1$s ha baneado a %2$s. Razón: %3$s - %1$s ha aceptado la invitación para %2$s. Razón: %3$s - %1$s ha eliminado la dirección principal para esta sala. - %s ha actualizado la sala. - Sincronización Inicial: -\nImportando criptografía - Sincronización Inicial: -\nImportando Salas a las que te has unido - Sincronización Inicial: -\nImportando Salas a las que has sido invitada - Sincronización Inicial: -\nImportando Salas Abandonadas - Invitación de %1$s. Razón: %2$s - %1$s ha desbaneado a %2$s. Razón: %3$s - %1$s envió una invitación a %2$s para que se una a la sala. Razón: %3$s - %1$s revocó la invitación de %2$s para unirse a la sala. Razón: %3$s - %1$s ha retirado la invitación de %2$s. Razón: %3$s - - %1$s ha añadido %2$s como alias de esta sala. - %1$s ha añadido %2$s como alias de esta sala. - - - %1$s ha quitado %2$s como alias de esta sala. - %1$s ha quitado %2$s como alias de esta sala. - - %1$s ha establecido la dirección principal de esta sala a %2$s. - %1$s ha permitido que los invitados se unan a la sala. - %1$s ha impedido que los invitados se unan a la sala. - %1$s ha activado la encriptación extremo a extremo. - %1$s ha activado la encriptación de extremo a extremo (algoritmo no reconocido %2$s). - %s solicita verificar su clave, pero su cliente no soporta la verificación de la clave en chat. Necesitará usar la verificación de claves clásica para poder verificar las claves. - Enviaste una imagen. - Enviaste un sticker. - Tu invitación - %1$s creó la sala - Creaste la sala - Invitaste a %1$s - Te uniste a la Sala - Dejaste la Sala - Rechazaste la invitación - Tu pateaste a %1$s - Tu desbanaste a %1$s - Usted prohibió a %1$s - Retiró la invitación de %1$s\'s - Cambiaste tu avatar - Establece su nombre de visualización en %1$s - Cambiaste tu nombre para mostrar de %1$s a %2$s - Quitaste tu nombre para mostrar (era %1$s) - Cambiaste el tema a: %1$s - %1$s cambió el avatar de la sala - Cambiaste el avatar de la sala - Cambiaste el nombre de la sala a: %1$s - Hiciste una videollamada. - Hiciste una llamada de voz. - %s envió datos para configurar la llamada. - Enviaste datos para configurar la llamada. - Respondiste la llamada. - Terminaste la llamada. - Hiciste visible el futuro historial de la %1$s - Has activado la encriptación de Extremo-a-Extremo (%1$s) - Has actualizado esta sala. - Solicitaste una conferencia de VoIP - Quitaste el nombre de la sala - Quitaste el tema de la sala - %1$s eliminó el avatar de la sala - Quitaste el avatar de la sala - Actualizaste tu perfil %1$s - Enviaste una invitación a %1$s para unirse a la sala - Revocaste la invitación para que %1$s se una a la sala - Aceptaste la invitación para %1$s - %1$s agrego el widget %2$s - Agregaste el widget %1$s - %1$s eliminó el widget %2$s - Quitaste el widget %1$s - %1$s modifico el widget %2$s - Modificaste el widget %1$s - Administrador - Moderador - Por defecto - Personalizado (%1$d) - Personalizado - Cambiaste el nivel de potencia de %1$s. - %1$s cambió el nivel de potencia de %2$s. - %1$s de %2$s a %3$s - Tu invitación. Razón: %1$s - Invitaste a %1$s. Razón: %2$s - Te uniste a la sala. Razón: %1$s - Dejaste la sala. Razón: %1$s - Rechazaste la invitación. Razón: %1$s - Pateaste a %1$s. Motivo: %2$s - Has desactivado a %1$s. Motivo: %2$s - Prohibiste a %1$s. Motivo: %2$s - Enviaste una invitación a %1$s para unirse a la sala. Motivo: %2$s - Revocaste la invitación para que %1$s se una a la sala. Motivo: %2$s - Aceptaste la invitación para %1$s. Motivo: %2$s - Retiró la invitación de %1$s\'s. Motivo: %2$s - - Agregaste %1$s como dirección para esta sala. - Agregaste %1$s como direcciones para esta sala. - - - Quitaste %1$s como dirección para esta sala. - Quitaste %1$s como direcciones para esta sala. - - %1$s añadió %2$s y eliminó %3$s como alias para esta sala. - Agregaste %1$s y quitaste %2$s como direcciones para esta sala. - Estableciste la dirección principal de esta sala en %1$s. - Quitaste la dirección principal de esta sala. - Ha permitido que los invitados se unan a la sala. - Ha impedido que los invitados se unan a la sala. - Tu has activado la encriptación de Extremo-a-Extremo. - Has activado la encriptación de Extremo-a-Extremo (algoritmo %1$s no reconocido). - Has impedido que invitados se unan a la sala. - Has permitido a invitados unirse aquí. - Te has ido. Razón: %1$s - Has revocado la invitación de %1$s - Has invitado a %1$s - Has actualizado aquí. - Has hecho futuros mensajes visibles a %1$s - Te saliste de la sala - Te uniste - Creaste la conversación - %1$s ha impedido que invitados se unan a la sala. - %1$s ha permitido a invitados a unirse aquí. - %1$s se ha ido. Razón: %2$s - Tu te has unido. Razón: %1$s - %1$s se ha unido. Razón: %2$s - %1$s ha revocado la invitación de %2$s - %1$s ha invitado %2$s - %s ha actualizado aquí. - %1$s ha hecho futuros mensajes visibles a %2$s - %1$s ha salido de la sala - %1$s se ha unido - %1$s ha creado la conversación - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-es/strings_sas.xml b/matrix-sdk-android/src/main/res/values-es/strings_sas.xml index fd396c1778..b5f062cb62 100644 --- a/matrix-sdk-android/src/main/res/values-es/strings_sas.xml +++ b/matrix-sdk-android/src/main/res/values-es/strings_sas.xml @@ -36,18 +36,33 @@ Sombrero Gafas Llave inglesa + Papá Noel + Pulgar arriba + Paraguas + Reloj de arena Reloj Regalo + Bombilla Libro Lápiz + Clip + Tijeras + Candado Llave Martillo Telefono + Bandera Tren Bicicleta + Avión + Cohete + Trofeo Bola Guitarra Trompeta Campana + Ancla + Cascos + Carpeta Alfiler diff --git a/matrix-sdk-android/src/main/res/values-et/strings.xml b/matrix-sdk-android/src/main/res/values-et/strings.xml deleted file mode 100644 index 0cf5c3e438..0000000000 --- a/matrix-sdk-android/src/main/res/values-et/strings.xml +++ /dev/null @@ -1,267 +0,0 @@ - - - %1$s: %2$s - %1$s saatis pildi. - %1$s saatis kleepsu. - Kasutaja %s kutse - %1$s kutsus kasutajat %2$s - %1$s kutsus sind - %1$s liitus jututoaga - %1$s lahkus jututoast - %1$s lükkas tagasi kutse - %1$s müksas kasutajat %2$s - %1$s võttis tagasi kutse kasutajale %2$s - %1$s muutis oma avatari - %1$s määras oma kuvatavaks nimeks %2$s - %1$s muutis senise kuvatava nime %2$s uueks nimeks %3$s - %1$s eemaldas oma kuvatava nime (%2$s) - %1$s muutis uueks teemaks %2$s - %1$s muutis jututoa uueks nimeks %2$s - %s alustas videokõnet. - %s alustas häälkõnet. - %s vastas kõnele. - %s lõpetas kõne. - %1$s seadistas, et tulevane jututoa ajalugu on nähtav kasutajale %2$s - kõikidele jututoa liikmetele alates kutsumise hetkest. - kõikidele jututoa liikmetele alates liitumise hetkest. - kõikidele jututoa liikmetele. - kõikidele. - teadmata (%s). - %1$s lülitas sisse läbiva krüptimise (%2$s) - %s uuendas seda jututuba. - %1$s saatis VoIP konverentsi kutse - VoIP-konverents algas - VoIP-konverents lõppes - (samuti sai avatar muudetud) - %1$s eemaldas jututoa nime - %1$s eemaldas jututoa teema - Sõnum on eemaldatud - Sõnum on eemaldatud %1$s poolt - Sõnum on eemaldatud [põhjus: %1$s] - Sõnum on eemaldatud %1$s poolt [põhjus: %2$s] - %1$s uuendas oma profiili %2$s - %1$s saatis jututoaga liitumiseks kutse kasutajale %2$s - %1$s võttis tagasi jututoaga liitumise kutse kasutajalt %2$s - %1$s võttis vastu kutse %2$s nimel - ** Ei õnnestu dekrüptida: %s ** - Sõnumi saatja seade ei ole selle sõnumi jaoks saatnud dekrüptimisvõtmeid. - Ei saanud muuta sõnumit - Sõnumi saatmine ei õnnestunud - Pildi üleslaadimine ei õnnestunud - Võrguühenduse viga - Matrix\'i viga - Hetkel ei ole võimalik uuesti liituda tühja jututoaga. - Krüptitud sõnum - E-posti aadress - Telefoninumber - Kutse kasutajalt %s - Kutse jututuppa - %1$s ja %2$s - - %1$s ja üks muu - %1$s ja %2$d muud - - Tühi jututuba - Alglaadimine: -\nImpordin kontot… - Alglaadimine: -\nImpordin krüptoseadistusi - Alglaadimine: -\nImpordin jututubasid - Alglaadimine: -\nImpordin liitutud jututubasid - Alglaadimine: -\nImpordin kutsutud jututubasid - Alglaadimine: -\nImpordin lahkutud jututubasid - Alglaadimine: -\nImpordin kogukondi - Alglaadimine: -\nImpordin kontoandmeid - Saadan sõnumit… - Tühjenda saatmisjärjekord - Kasutaja %1$s kutse. Põhjus: %2$s - %1$s kutsus kasutajat %2$s. Põhjus: %3$s - %1$s kutsus sind. Põhjus: %2$s - %1$s liitus jututoaga. Põhjus: %2$s - %1$s lahkus jututoast. Põhjus: %2$s - %1$s lükkas kutse tagasi. Põhjus: %2$s - %1$s müksas välja kasutaja %2$s. Põhjus: %3$s - %1$s saatis kasutajale %2$s kutse jututoaga liitumiseks. Põhjus: %3$s - %1$s tühistas kasutajale %2$s saadetud kutse jututoaga liitumiseks. Põhjus: %3$s - %1$s võttis vastu kutse %2$s jututoaga liitumiseks. Põhjus: %3$s - %1$s võttis tagasi kasutajale %2$s saadetud kutse. Põhjus: %3$s - %1$s lülitas sisse läbiva krüptimise. - %1$s lülitas sisse läbiva krüptimise (tundmatu algoritm %2$s). - - %1$s lisas %2$s selle jututoa aadressiks. - %1$s lisas %2$s selle jututoa aadressideks. - - - %1$s eemaldas %2$s kui selle jututoa aadressi. - %1$s eemaldas %2$s selle jututoa aadresside hulgast. - - %1$s lisas %2$s ja eemaldas %3$s selle jututoa aadresside loendist. - %1$s seadistas selle jututoa põhiaadressiks %2$s. - %1$s eemaldas selle jututoa põhiaadressi. - %1$s lubas külalistel selle jututoaga liituda. - %1$s seadistas, et külalised ei või selle jututoaga liituda. - %s soovib verifitseerida sinu võtmeid, kuid sinu kasutatav klient ei oska vestluse-sisest verifitseerimist teha. Sa pead kasutama traditsioonilist verifitseerimislahendust. - Kasutaja %1$s lõi jututoa - Sina saatsid pildi. - Sina saatsid kleepsu. - Sinu kutse - Sa lõid jututoa - Sina kutsusid kasutajat %1$s - Sina liitusid jututoaga - Sina lahkusid jututoast - Sina lükkasid kutse tagasi - Sina müksasid %1$s välja - %1$s taastas %2$s ligipääsu - Sina taastasid %1$s ligipääsu - %1$s keelas %2$s ligipääsu - Sina keelasid %1$s ligipääsu - Sina võtsid tagasi %1$s kutse - Sina muutsid oma tunnuspilti - Sina määrasid oma kuvatavaks nimeks %1$s - Sina muutsid senise kuvatava nime %1$s uueks nimeks %2$s - Sina eemaldasid oma kuvatava nime (oli %1$s) - Sina muutsid uueks teemaks %1$s - %1$s muutis jututoa tunnuspilti - Sina muutsid jututoa tunnuspilti - Sina muutsid jututoa uueks nimeks %1$s - Sa alustasid videokõnet. - Sa alustasid häälkõnet. - %s saatis info kõne algatamiseks. - Sa saatsid info kõne algatamiseks. - Sa vastasid kõnele. - Sa lõpetasid kõne. - Sa seadistasid, et tulevane jututoa ajalugu on nähtav kasutajale %1$s - Sa lülitasid sisse läbiva krüptimise (%1$s) - Sa uuendasid seda jututuba. - Sa algatasid VoIP rühmakõne - Sa eemaldasid jututoa nime - Sa eemaldasid jututoa teema - %1$s eemaldas jututoa tunnuspildi - Sa eemaldasid jututoa tunnuspildi - Sa uuendasid oma profiili %1$s - Sina saatsid kasutajale %1$s kutse jututoaga liitumiseks - Sina võtsid tagasi jututoaga liitumise kutse kasutajalt %1$s - Sina võtsid vastu kutse %1$s nimel - %1$s lisas %2$s vidina - Sina lisasid %1$s vidina - %1$s eemaldas %2$s vidina - Sina eemdaldasid %1$s vidina - %1$s muutis %2$s vidinat - Sa muutsid %1$s vidinat - Peakasutaja - Moderaator - Tavakasutaja - Kohandatud kasutajaõigused (%1$d) - Kohandatud õigused - Sina muutsid kasutaja %1$s õigusi. - %1$s muutis kasutaja %2$s õigusi. - %1$s õiguste muutus %2$s -> %3$s - Sinu kutse. Põhjus %1$s - Sina kutsusid kasutajat %1$s. Põhjus: %2$s - Sina liitusid jututoaga. Põhjus: %1$s - Sina lahkusid jututoast. Põhjus: %1$s - Sina lükkasid kutse tagasi. Põhjus: %1$s - Sina müksasid kasutaja %1$s välja. Põhjus: %2$s - %1$s taastas ligipääsu kasutajale %2$s. Põhjus: %3$s - Sina taastasid kasutaja %1$s ligipääsu. Põhjus: %2$s - %1$s keelas kasutaja %2$s ligipääsu. Põhjus: %3$s - Sina keelasid kasutaja %1$s ligipääsu. Põhjus: %2$s - Sina saatsid kasutajale %1$s kutse jututoaga liitumiseks. Põhjus: %2$s - Sina võtsid tagasi jututoaga liitumise kutse kasutajalt %1$s. Põhjus: %2$s - Sina võtsid vastu kutse %1$s nimel. Põhjus: %2$s - Sina võtsid tagasi kasutaja %1$s kutse. Põhjus: %2$s - - Sina lisasid %1$s selle jututoa aadressiks. - Sina lisasid %1$s selle jututoa aadressideks. - - - Sina eemaldasid %1$s, kui selle jututoa aadressi. - Sina eemaldasid %1$s selle jututoa aadresside hulgast. - - Sina lisasid %1$s selle jututoa aadressiks ning eemaldasid %2$s aadresside hulgast. - Sina seadistasid selle jututoa põhiaadressiks %1$s. - Sina eemaldasid selle jututoa põhiaadressi. - Sina lubasid külalistel selle jututoaga liituda. - Sina seadistasid, et külalised ei või selle jututoaga liituda. - Sa lülitasid sisse läbiva krüptimise. - Sa lülitasid sisse läbiva krüptimise (kasutusel on tundmatu algoritm %1$s). - Sina seadistasid, et külalised ei või selle jututoaga liituda. - %1$s seadistas, et külalised ei või selle jututoaga liituda. - Sina lubasid külalistel selle jututoaga liituda. - %1$s lubas külalistel selle jututoaga liituda. - Sina lahkusid jututoast. Põhjus: %1$s - %1$s lahkus jututoast. Põhjus: %2$s - Sina liitusid jututoaga. Põhjus: %1$s - %1$s liitus jututoaga. Põhjus: %2$s - Sina võtsid tagasi jututoaga liitumise kutse kasutajalt %1$s - %1$s võttis tagasi jututoaga liitumise kutse kasutajalt %2$s - Sina kutsusid kasutajat %1$s - %1$s kutsus kasutajat %2$s - Sa uuendasid seda jututuba. - %s uuendas seda jututuba. - Sina seadistasid, et tulevased jututoa sõnumid on nähtavad kasutajale %1$s - %1$s seadistas, et tulevased jututoa sõnumid on nähtavad kasutajale %2$s - Sina lahkusid jututoast - %1$s lahkus jututoast - Sina liitusid - %1$s liitus - Sina alustasid vestlust - %1$s alustas vestlust - Tühi jututuba (oli %s) - - %1$s, %2$s, %3$s ja %4$d muu - %1$s, %2$s, %3$s ja %4$d muud - - %1$s, %2$s, %3$s ja %4$s - %1$s, %2$s ja %3$s - 🎉 Kõikide serverite osalemine on keelatud! Seda jututuba ei saa enam kasutada. - Muudatusi ei ole. - • Nüüd on keelatud serverid, mille ip-aadress vastab mustrile. - • Nüüd on lubatud serverid, mille ip-aadress vastab mustrile. - • Server, mille nimes leidub %s, eemaldati lubatud serverite loendist. - • Nüüd on lubatud serverid, mille nimes leidub %s. - • Server, mille nimes leidub %s eemaldati keeluloendist. - • Keelatud on server, mille nimes leidub %s. - Sina muutsid selle jututoa jaoks serverite pääsuloendit. - %s muutis selle jututoa jaoks serverite pääsuloendit. - Sina kirjeldasid selle jututoa jaoks serverite pääsuloendi. - %s kirjeldas selle jututoa jaoks serverite pääsuloendi. - • Keelatud on serverid, mille ip-aadress vastab mustrile. - • Lubatud on serverid, mille ip-aadress vastab mustrile. - • Lubatud on serverid, mille nimes leidub %s. - • Keelatud on serverid, mille nimes leidub %s. - %1$s muutis selle jututoa aadresse. - Sa muutsid selle jututoa põhiaadressi ja täiendavaid aadresse. - %1$s muutis selle jututoa täiendavaid aadresse. - Sa muutsid selle jututoa täiendavaid aadresse. - %1$s muutis selle jututoa põhiaadressi ja täiendavaid aadresse. - - Sa eemaldasid selle jututoa täiendava aadressi %1$s. - Sa eemaldasid selle jututoa täiendavad aadressid %1$s. - - - %1$s eemaldas selle jututoa täiendava aadressi %2$s. - %1$s eemaldas selle jututoa täiendavad aadressid %2$s. - - - Sa lisasid sellele jututoale täiendava aadressi %1$s. - Sa lisasid sellele jututoale täiendavad aadressid %1$s. - - - %1$s lisas sellele jututoale täiendava aadressi %2$s. - %1$s lisas sellele jututoale täiendavad aadressid %2$s. - - Sa muutsid selle jututoa aadresse. - Sina muutsid videokoosolekut - Sina lõpetasid videokoosoleku - %1$s lõpetas videokoosoleku - Sina algatasid videokoosoleku - %1$s algatas videokoosoleku - %1$s muutis videokoosolekut - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-eu/strings.xml b/matrix-sdk-android/src/main/res/values-eu/strings.xml deleted file mode 100644 index bc61035c24..0000000000 --- a/matrix-sdk-android/src/main/res/values-eu/strings.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - %1$s: %2$s - %1$s erabiltzaileak irudi bat bidali du. - - %s erabiltzailearen gonbidapena - %1$s erabiltzaileak %2$s gonbidatu du - %1$s erabiltzaileak gonbidatu zaitu - %1$s gelara elkartu da - %1$s gelatik atera da - %1$s erabiltzaileak gonbidapena baztertu du - %1$s erabiltzaileak %2$s kanporatu du - %1$s erabiltzaileak debekua kendu dio %2$s erabiltzaileari - %1$s erabiltzaileak %2$s debekatu du - %1$s erabiltzaileak %2$s erabiltzailearen gonbidapena atzera bota du - %1$s erabiltzaileak abatarra aldatu du - %1$s erabiltzaileak bere pantaila-izena aldatu du beste honetara: %2$s - %1$s erabiltzaileak bere pantaila-izena aldatu du, honetatik: %2$s honetara: %3$s - %1$s erabiltzaileak bere pantaila-izena kendu du (%2$s) - %1$s erabiltzaileak mintzagaia honetara aldatu du: %2$s - %1$s erabiltzaileak gelaren izena honetara aldatu du: %2$s - %s erabiltzaileak bideo deia hasi du. - %s erabiltzaileak ahots deia hasi du. - %s erabiltzaileak deia erantzun du. - %s erabiltzaileak deia amaitu du. - %1$s erabiltzaileak gelaren historiala ikusgai jarri du hauentzat: %2$s - gelako kide guztiak, gonbidatu zitzaienetik. - gelako kide guztiak, elkartu zirenetik. - gelako kide guztiak. - edonor. - ezezaguna (%s). - %1$s erabiltzaileak muturretik muturrera zifratzea aktibatu du (%2$s) - - %1$s erabiltzaileak VoIP konferentzia bat eskatu du - VoIP konferentzia hasita - VoIP konferentzia amaituta - - (abatarra ere aldatu da) - %1$s erabiltzaileak gelaren izena kendu du - %1$s erabiltzaileak gelaren mintzagaia kendu du - %1$s erabiltzaileak bere profila eguneratu du %2$s - %1$s erabiltzaileak gelara elkartzeko gonbidapen bat bidali dio %2$s erabiltzaileari - %1$s erabiltzaileak %2$s gelarako gonbidapena onartu du - - ** Ezin izan da deszifratu: %s ** - Igorlearen gailuak ez dizkigu mezu honetarako gakoak bidali. - - Ezin izan da kendu - Ezin izan da mezua bidali - - Huts egin du irudia igotzean - - Sare errorea - Matrix errorea - - Ezin da oraingoz hutsik dagoen gela batetara berriro sartu. - - Zifratutako mezua - - E-mail helbidea - Telefono zenbakia - - %1$s erabiltzaileak eranskailu bat bidali du. - - %s gelarako gonbidapena - Gela gonbidapena - %1$s eta %2$s - Gela hutsa - - - %1$s eta beste bat - %1$s eta beste %2$d - - - - Mezua kendu da - %1$s erabiltzaileak mezua kendu du - Mezua kendu da [arrazoia: %1$s] - %1$s erabiltzaileak mezua kendu du [arrazoia: %2$s] - - Hasierako sinkronizazioa: -\nKontua inportatzen… - Hasierako sinkronizazioa: -\nZifratzea inportatzen - Hasierako sinkronizazioa: -\nGelak inportatzen - Hasierako sinkronizazioa: -\nElkartutako gelak inportatzen - Hasierako sinkronizazioa: -\nGonbidatutako gelak inportatzen - Hasierako sinkronizazioa: -\nUtzitako gelak inportatzen - Hasierako sinkronizazioa: -\nKomunitateak inportatzen - Hasierako sinkronizazioa: -\nKontuaren datuak inportatzen - - %s erabiltzaileak gela hau eguneratu du. - - Mezua bidaltzen… - Garbitu bidalketa-ilara - - %1$s erabiltzaileak %2$s gelara elkartzeko gonbidapena indargabetu du - %1$s erabiltzailearen gonbidapena. Arrazoia: %2$s - %1$s erabiltzaileak %2$s gonbidatu du. Arrazoia: %3$s - %1$s erabiltzaileak gonbidatu zaitu. Arrazoia: %2$s - %1$s gelara elkartu da. Arrazoia: %2$s - %1$s gelatik atera da. Arrazoia: %2$s - %1$s erabiltzaileak gonbidapena baztertu du. Arrazoia: %2$s - %1$s erabiltzaileak %2$s kanporatu du. Arrazoia: %3$s - %1$s erabiltzaileak debekua kendu dio %2$s erabiltzaileari. Arrazoia: %3$s - %1$s erabiltzaileak %2$s debekatu du. Arrazoia: %3$s - "%1$s erabiltzaileak gelara elkartzeko gonbidapen bat bidali dio %2$s erabiltzaileari. Arrazoia: %3$s" - "%1$s erabiltzaileak %2$s gelara elkartzeko gonbidapena indargabetu du. Arrazoia: %3$s" - "%1$s erabiltzaileak %2$s gelarako gonbidapena onartu du. Arrazoia: %3$s" - "%1$s erabiltzaileak %2$s erabiltzailearen gonbidapena indargabetu du. Arrazoia: %3$s" - - - %1$s erabiltzaileak %2$s gehitu du gela honen helbide gisa. - %1$s erabiltzaileak %2$s gehitu ditu gela honen helbide gisa. - - - - %1$s erabiltzaileak %2$s kendu du gela honen helbide gisa. - %1$s erabiltzaileak %3$s kendu ditu gela honen helbide gisa. - - - %1$s erabiltzaileak %2$s gehitu %3$s eta kendu ditu gela honen helbide gisa. - - %1$s erabiltzaileak %2$s ezarri du gela honen helbide nagusi gisa. - %1$s erabiltzaileak gela honen helbide nagusia kendu du. - - %1$k gonbidatuak gelara sartzea onartu du. - %1%k gonbidatuak gelara sartzea galerazi du. - - %1$s erabiltzaileak muturretik muturrerako zifratzea gaitu du. - %1$s erabiltzaileak muturretik muturrerako zifratzea gaitu du. (%2$s algoritmo ezezaguna). - - %s(e)k zure gakoa egiaztatzea eskatu du, baina zure bezeroak ez du txatean gakoa egiaztatzea onartzen. Gako egiaztaketa zaharra erabili beharko duzu. - - %1$s erabiltzaileak gela sortu du - diff --git a/matrix-sdk-android/src/main/res/values-fa/strings.xml b/matrix-sdk-android/src/main/res/values-fa/strings.xml deleted file mode 100644 index 50446b9708..0000000000 --- a/matrix-sdk-android/src/main/res/values-fa/strings.xml +++ /dev/null @@ -1,222 +0,0 @@ - - - %1$s: %2$s - %1$s تصویری فرستاد. - %1$s برچسبی فرستاد. - دعوت %s - ‫%1$s، %2$s را دعوت کرد - %1$s دعوتتان کرد - %1$s به اتاق پیوست - %1$s اتاق را ترک کرد - %1$s دعوت را رد کرد - %1$s، %2$s را اخراج کرد - %1$s، انسداد %2$s را رفع کرد - %1$s، %2$s را مسدود کرد - %1$s دعوت %2$s را نپذیرفت - %1$s تصویرش را عوض کرد - %1$s نام نمایشی خود را به %2$s تنظیم کرد - %1$s نام نمایشیش را از %2$s به %3$s تغییر داد - %1$s نام نمایشیش (%2$s) را پاک کرد - %1$s موضوع را به %2$s تغییر داد - %1$s نام اتاق را به %2$s تغییر داد - %s یک تماس تصویری برقرار کرد. - %s یک تماس صوتی برقرار کرد. - %s تماس را پاسخ داد. - %s به تماس پایان داد. - %1$s تاریخچهٔ آیندهٔ اتاق را برای %2$s نمایان کرد - همهٔ اعضای اتاق، از زمان دعوت شدنشان. - همهٔ اعضای اتاق، از زمان پیوستنشان. - همهٔ اعضای اتاق. - هرکسی. - ناشناخته (%s). - %1$s رمزنگاری سرتاسری را روشن کرد (%2$s) - %s این اتاق را ارتقا داد. - %1$s درخواست یک گردهمایی صوتی داد - گردهمایی صوتی آغاز شد - گردهمایی صوتی پایان یافت - (تصویر هم عوض شد) - %1$s نام اتاق را پاک کرد - %1$s موضوع اتاق را پاک کرد - پیام برداشته شد - پیام به دست %1$s برداشته شد - پیام برداشته شد [دلیل: %1$s] - پیام به دست %1$s برداشته شد [دلیل: %2$s] - %1$s دعوتی برای پیوستن %2$s به اتاق فرستاد - %1$s دعوت پیوستن به اتاق %2$s را باطل کرد - %1$s دعوت برای %2$s را پذیرفت - ** ناتوان در رمزگشایی: %s ** - دستگاه فرستنده، کلیدهای این پیام را برایمان نفرستاده است. - ناتوان در فرستادن پیام - شکست در بارگذاری تصویر - خطای شبکه - خطای ماتریکس - در حال حاضر امکان بازپیوست به اتاقی خالی وجود ندارد‌‌. - پیام رمزنگاری شده - نشانی رایانامه - شماره تلفن - دعوت از %s - دعوت اتاق - %1$s و %2$s - - %1$s و ۱ نفر دیگر - %1$s و %2$d نفر دیگر - - اتاق خالی - همگام‌سازی نخستین: -\nدر حال درون‌ریزی حساب… - همگام‌سازی نخستین: -\nدر حال درون‌ریزی رمزنگاری - همگام‌سازی نخستین: -\nدر حال درون‌ریزی اتاق‌ها - همگام‌سازی نخستین: -\nدر حال درون‌ریزی اتاق‌های پیوسته - همگام‌سازی نخستین: -\nدر حال درون‌ریزی اتاق‌های دعوت‌شده - همگام‌سازی نخستین: -\nدر حال درون‌ریزی اتاق‌های ترک‌شده - همگام‌سازی نخستین: -\nدر حال درون‌ریزی انجمن‌ها - همگام‌سازی نخستین: -\nدر حال درون‌ریزی داده‌های حساب - در حال فرستادن پیام… - پاک‌سازی صفِ در حال ارسال - دعوت %1$s. دلیل: %2$s - %1$s، %2$s را دعوت کرد. دلیل: %3$s - %1$s دعوتتان کرد. دلیل: %2$s - %1$s به اتاق پیوست. دلیل: %2$s - %1$s اتاق را ترک کرد. دلیل: %2$s - %1$s دعوت را رد کرد. دلیل: %2$s - %1$s، %2$s را اخراج کرد. دلیل: %3$s - %1$s انسداد %2$s را رفع کرد. دلیل: %3$s - %1$s، %2$s را مسدود کرد. دلیل: %3$s - %1$s دعوتی برای پیوستن %2$s به اتاق فرستاد. دلیل: %3$s - %1$s دعوت %2$s برای پیوستن به اتاق را باطل کرد. دلیل: %3$s - %1$s دعوت برای %2$s را پذیرفت. دلیل: %3$s - %1$s دعوت %2$s را نپذیرفت. دلیل: %3$s - - %1$s، %2$s را به عنوان نشانی‌ای برای این اتاق افزود. - %1$s، %2$s را به عنوان نشانی‌هایی برای این اتاق افزود. - - - %1$s، %2$s را به عنوان نشانی‌ای برای این اتاق پاک کرد. - %1$s، %3$s را به عنوان نشانی‌هایی برای این اتاق پاک کرد. - - %1$s برای نشانی این اتاق، %2$s را افزود و %3$s را پاک کرد. - %1$s نشانی اصلی این اتاق را به %2$s تنظیم کرد. - %1$s نشانی اصلی را برای این اتاق پاک کرد. - %1$s اجازه داد میمهانان به گروه بپیوندند. - %1$s جلوی پیوستن میمهانان به گروه را گرفت. - %1$s رمزنگاری سرتاسری را روشن کرد. - %1$s رمزنگاری سرتاسری را روشن کرد (الگوریتم تشخیص‌داده‌نشده %2$s ). - %s درخواست تأیید کلیدتان را دارد، ولی کارخواهتان تأیید کلید درون گپ را پشتیبانی نمی‌کند. برای تأیید کلیدها لازم است از تأییدیهٔ کلید قدیمی استفاده کنید. - %1$s اتاق را ایجاد کرد - %1$s نمایه‌اش را به‌روز کرد %2$s - نمی‌توان ویرایش کرد - تصویری فرستادید. - برچسبی فرستادید. - دعوتتان - اتاق را ایجاد کردید - از %1$s دعوت کردید - به اتاق پیوستید - اتاق را ترک کردید - دعوت را رد کردید - %1$s را اخراج کردید - تحریم %1$s را برداشتید - %1$s را تحریم کردید - دعوت %1$s را پس‌گرفتید - آواتارتان را عوض کردید - نام نمایشیتان را به %1$s تغییر دادید - نام نمایشیتان را از %1$s به %2$s تغییر دادید - نام نمایشیتان را برداشتید (%1$s بود) - موضوع را به %1$s تغییر دادید - %1$s آواتار اتاق را تغییر داد - آواتار اتاق را تغییر دادید - نام اتاق را به %1$s تغییر دادید - تماس تصویری گرفتید. - تماس صوتی گرفتید. - %s برای برپایی تماس، داده فرستاد. - برای برپایی تماس، داده فرستادید. - تماس را پاسخ دادید. - به تماس پایان دادید. - تاریخچهٔ آتی اتاق را برای %1$s نمایان کردید - رمزنگاری سرتاسری را روشن کردید (%1$s) - این اتاق را ارتقا دادید. - دارخواست کنفرانس ویپ دادید - نام اتاق را برداشتید - موضوع اتاق را برداشتید - %1$s آواتار اتاق را برداشت - آواتار اتاق را برداشتید - نمایه‌تان را به‌روز کردید %1$s - برای %1$s دعوت پیوستن به اتاق فرستادید - دعوت پیوستن %1$s به اتاق را پس گرفتید - دعوت برای %1$s را پذیرفتید - %1$s ابزارک %2$s را افزود - ابزارک %1$s را افزودید - %1$s ابزارک %2$s را برداشت - ابزارک %1$s را برداشتید - %1$s ابزارک %2$s را دستکاری کرد - ابزارک %1$s را دستکاری کردید - مدیر - ناظم - پیش‌گزیده - سفارشی (%1$d) - سفارشی - سطح قدرت %1$s را تغییر دادید. - %1$s سطح قدرت %2$s را تغییر داد. - %1$s از %2$s به %3$s - دعوتتان. دلیل: %1$s - %1$s را دعوت کردید. دلیل: %2$s - به اتاق پیوستید. دلیل: %1$s - اتاق را ترک کردید. دلیل: %1$s - دعوت را رد کردید. دلیل: %1$s - %1$s را اخراج کردید. دلیل: %2$s - تحریم %1$s را برداشتید. دلیل: %2$s - %1$s را تحریم کردید. دلیل: %2$s - دعوتی به %1$s برای پیوستن به اتاق فرستادید. دلیل: %2$s - دعوت %1$s برای پیوستن به اتاق را پس گرفتید. دلیل: %2$s - دعوت برای %1$s را پذیرفتید. دلیل: %2$s - دعوت %1$s را رد کردید. دلیل: %2$s - - نشانی %1$s را به این اتاق افزودید. - نشانی‌های %1$s را به این اتاق افزودید. - - - نشانی %1$s را از این اتاق برداشتید. - نشانی‌های %1$s را از این اتاق برداشتید. - - نشانی %1$s ار افزوده و %2$s را از این اتاق برداشتید. - نشانی اصلی این اتاق را به %1$s تنظیم کردید. - نشانی اصلی این اتاق را برداشتید. - به میهمانان اجازهٔ پیوستن به گروه دادید. - میمهانان را از پیوستن به گروه بازداشتید. - رمزنگاری سرتاسری را روشن کردید. - رمزنگاری سرتاسری را روشن کردید (الگوریتم ناشناخته %1$s). - مهمان‌ها را از پیوستن به اتاق بازداشتید. - %1$s مهمان‌ها را از پیوستن به اتاق بازداشت. - به مهمان‌ها اجازه دادید به این‌جا بپیوندند. - %1$s به مهمان‌ها اجازه داد به این‌جا بپیوندند. - رفتید. دلیل: %1$s - %1$s رفت. دلیل: %2$s - پیوستید. دلیل: %1$s - %1$sپیوست. دلیل: %2$s - دعوت %1$s را پس گرفتید - %1$s دعوت %2$s را پس گرفت - %1$s را دعوت کردید - %1$s، %2$s را دعوت کرد - این‌جا را ارتقا دادید. - %s این‌جا را ارتقا داد. - پیام‌های آینده را برای %1$s نمایان کردید - %1$s پیام‌های آینده را برای %2$s نمایان کرد - اتاق را ترک کردید - %1$s اتاق را ترک کرد - پیوستید - %1$s پیوست - گفت‌وگو را ایجاد کردید - %1$s گفت‌وگو را ایجاد کرد - - %1$s، %2$s، %3$s و %4$d نفر دیگر - %1$s، %2$s، %3$s و %4$d نفر دیگر - - %1$s، %2$s و %3$s - %1$s، %2$s، %3$s و %4$s - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-fi/strings.xml b/matrix-sdk-android/src/main/res/values-fi/strings.xml deleted file mode 100644 index 1e3788476f..0000000000 --- a/matrix-sdk-android/src/main/res/values-fi/strings.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - %1$s lähetti kuvan. - Käyttäjän %s kutsu - %1$s kutsui käyttäjän %2$s - %1$s kutsui sinut - %1$s liittyi huoneeseen - %1$s poistui huoneesta - %1$s hylkäsi kutsun - %1$s poisti käyttäjän %2$s - %1$s poisti porttikiellon käyttäjältä %2$s - %1$s antoi porttikiellon käyttäjälle %2$s - %1$s veti takaisin kutsun käyttäjälle %2$s - %1$s vaihtoi profiilikuvaansa - %1$s asetti näyttönimekseen %2$s - %1$s muutti näyttönimensä nimestä %2$s nimeen %3$s - %1$s poisti näyttönimensä (%2$s) - %1$s vaihtoi aiheeksi: %2$s - %1$s vaihtoi huoneen nimeksi %2$s - %s soitti videopuhelun. - %s soitti äänipuhelun. - %s vastasi puheluun. - %s lopetti puhelun. - %1$s muutti tulevan huonehistorian näkyväksi seuraaville: %2$s - kaikki huoneen jäsenet, kutsumisestaan asti. - kaikki huoneen jäsenet, liittymisestään asti. - kaikki huoneen jäsenet. - kaikki. - tuntematon (%s). - %1$s otti käyttöön osapuolten välisen salauksen (%2$s) - %1$s lähetti VoIP-konferenssipyynnön - VoIP-konferenssi alkoi - VoIP-konferenssi päättyi - (myös kuva vaihdettiin) - %1$s poisti huoneen nimen - %1$s poisti huoneen aiheen - %1$s päivitti profiilinsa %2$s - %1$s lähetti liittymiskutsun huoneeseen käyttäjälle %2$s - %1$s hyväksyi kutsun käyttäjän %2$s puolesta - ** Salauksen purku epäonnistui: %s ** - Lähettäjän laite ei ole lähettänyt avaimia tähän viestiin. - Viestin lähetys epäonnistui - Kuvan lataaminen epäonnistui - Verkkovirhe - Matrix-virhe - Tällä hetkellä ei ole mahdollista liittyä uudelleen tyhjään huoneeseen. - Salattu viesti - Sähköpostiosoite - Puhelinnumero - Takaisinveto epäonnistui - %1$s: %2$s - - Kutsu käyttäjältä %s - - Huonekutsu - %1$s ja %2$s - Tyhjä huone - %1$s lähetti tarran. - - %1$s ja yksi muu - %1$s ja %2$d muuta - - Viesti poistettu - %1$s poisti viestin - Viesti poistettu [syy: %1$s] - %1$s poisti viestin [syy: %2$s] - Alkusynkronointi: -\nTuodaan tiliä… - Alkusynkronointi: -\nTuodaan kryptoa - Alkusynkronointi: -\nTuodaan huoneita - Alkusynkronointi: -\nTuodaan liityttyjä huoneita - Alkusynkronointi: -\nTuodaan kutsuttuja huoneita - Alkusynkronointi: -\nTuodaan poistuttuja huoneita - Alkusynkronointi: -\nTuodaan yhteisöjä - Alkusynkronointi: -\nTuodaan tilin tietoja - %s päivitti tämän huoneen. - Lähetetään viestiä… - Tyhjennä lähetysjono - %1$s veti takaisin käyttäjän %2$s liittymiskutsun huoneeseen - Henkilön %1$s kutsu. Syy: %2$s - %1$s kutsui henkilön %2$s. Syy: %3$s - %1$s kutsui sinut. Syy: %2$s - %1$s liittyi huoneeseen. Syy: %2$s - %1$s poistui huoneesta. Syy: %2$s - %1$s hylkäsi kutsun. Syy: %2$s - %1$s poisti käyttäjän %2$s huoneesta. Syy: %3$s - %1$s poisti porttikiellon käyttäjältä %2$s. Syy: %3$s - %1$s antoi porttikiellon käyttäjälle %2$s. Syy: %3$s - %1$s lähetti kutsun liittyä huoneeseen käyttäjälle %2$s. Syy: %3$s - %1$s kumosi kutsun liittyä huoneeseen käyttäjälle %2$s. Syy: %3$s - %1$s hyväksyi kutsun liityäkseen huoneeseen %2$s. Syy: %3$s - %1$s veti takaisin käyttäjän %2$s kutsun. Syy: %3$s - - %1$s lisäsi tälle huoneelle osoitteen %2$s. - %1$s lisäsi tälle huoneelle osoitteet %2$s. - - - %1$s poisti tältä huoneelta osoitteen %2$s. - %1$s poisti tältä huoneelta osoitteet %3$s. - - %1$s lisäsi tälle huoneelle osoitteen %2$s ja poisti osoitteen %3$s. - %1$s asetti tämän huoneen pääosoitteeksi %2$s. - %1$s poisti tämän huoneen pääosoitteen. - %1$s salli vieraiden liittyä huoneeseen. - %1$s esti vieraita liittymästä huoneeseen. - %1$s laittoi päälle osapuolten välisen salauksen. - %1$s laittoi päälle osapuolisten välisen salauksen (tuntematon algoritmi %2$s). - %s haluaa varmentaa salausavaimesi, mutta asiakasohjelmasi ei tue keskustelun aikana tapahtuvaa avainten varmennusta. Joudut käyttämään perinteistä varmennustapaa. - Hyväksyit käyttäjän %1$s kutsun. Syy: %2$s - Peruutit kutsun liittyä huoneeseen käyttäjältä %1$s. Syy: %2$s - Lähetit kutsun liittyä huoneeseen käyttäjälle %1$s. Syy: %2$s - Estit käyttäjän %1$s. Syy: %2$s - Peruutit eston %1$s. Syy: %2$s - Poistit käyttäjän %1$s. Syy: %2$s - Hylkäsit kutsun. Syy: %1$s - Lähdit. Syy: %1$s - %1$s lähti. Syy: %2$s - Poistuit huoneesta. Syy: %1$s - Liityit. Syy: %1$s - %1$s liittyi. Syy: %2$s - Liityit ryhmään. Syy: %1$s - Kutsuit %1$s. Syy: %2$s - Kutsusi. Syy: %1$s - Tyhjä huone (oli %s) - %1$s, %2$s, %3$s ja %4$s - %1$s, %2$s ja %3$s - Mukautettu - Mukautettu (%1$d) - Oletus - Valvoja - Ylläpitäjä - %1$s muutti %2$s sovelmaa - Poistit %1$s sovelman - %1$s poisti %2$s sovelman - Lisäsit %1$s sovelman - %1$s lisäsi %2$s sovelman - Muutit %1$s sovelmaa - Hyväksyit kutsun henkilölle %1$s - Peruutit kutsun henkilöltä %1$s - %1$s peruutti kutsun henkilöltä %2$s - Peruutit henkilön %1$s kutsun liittyä ryhmään - Kutsuit %1$s - %1$s kutsui %2$s - Lähetit henkilölle %1$s kutsun liittyä huoneeseen - Päivitit profiilisi %1$s - Poistit huoneen profiilikuvan - %1$s poisti huoneen profiilikuvan - Poistit huoneen aiheen - Poistit huoneen nimen - Pyysit ryhmäpuhelua - 🎉 Kaikki palvelimet on estetty osallistumasta! Tätä huonetta ei voi enää käyttää. - Ei muutosta. - • Palvelimet jotka %s poistettiin estolistalta. - • Palvelimen haku %s on nyt kielletty. - • Palvelimen haku %s on sallittu. - • Palvelimen haku %s on kielletty. - %1$s on estänyt vieraita liittymästä huoneeseen. - Estit vieraita liittymästä huoneeseen. - Annoit vieraille luvan liittyä huoneeseen. - Annoit vieraille luvan liittyä tänne. - %1$s on antanut vieraille luvan liittyä tänne. - Poistit tämän huoneen pääosoitteen. - Otit käyttöön päästä päähän -salauksen. - Olet estänyt vieraiden liittymisen huoneeseen. - Otit päästä päähän -salauksen käyttöön (tuntematon algoritmi %1$s). - Päivitit tässä. - %s päivitti täällä. - Päivitit tämän huoneen. - Otit päästä päähän -salauksen käyttöön (%1$s) - Teit tulevista viesteistä näkyviä käyttäjälle %1$s - %1$s teki tulevista viesteistä näkyviä käyttäjälle %2$s - Teit tulevan huonehistorian näkyväksi %1$s - Lopetit puhelun. - Vastasit puheluun. - Lähetit tietoja puhelun valmistelemiseksi. - %s lähetti tietoja puhelun valmistelemiseksi. - Aloitit äänipuhelun. - Aloitit videopuhelun. - Vaihdoit huoneen nimeksi: %1$s - Vaihdoit huoneen profiilikuvaa - %1$s muutti huoneen profiilikuvaa - Vaihdoit aiheen: %1$s - Poistit nimimerkkisi (se oli %1$s) - Vaihdoit nimimerkkisi %1$s nimeen %2$s - Asetit nimimerkiksesi %1$s - Kutsusi - Vaihdoit profiilikuvaasi - Peruutit %1$sn kutsun - Estit %1$s - Poistit eston %1$s - Poistit %1$s - Hylkäsit kutsun - Poistuit huoneesta - %1$s poistui huoneesta - Poistuit huoneesta - Liityit - %1$s liittyi - Liityit huoneeseen - Kutsuit %1$s - Loit keskustelun - %1$s loi keskustelun - Loit huoneen - %1$s loi huoneen - Lähetit tarran. - Lähetit kuvan. - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-fr/strings.xml b/matrix-sdk-android/src/main/res/values-fr/strings.xml deleted file mode 100644 index f49c54a8ba..0000000000 --- a/matrix-sdk-android/src/main/res/values-fr/strings.xml +++ /dev/null @@ -1,239 +0,0 @@ - - - %1$s : %2$s - %1$s a envoyé une image. - invitation de %s - %1$s a invité %2$s - %1$s vous a invité - %1$s a rejoint le salon - %1$s est parti du salon - %1$s a rejeté l’invitation - %1$s a expulsé %2$s - %1$s a révoqué l\'exclusion de %2$s - %1$s a exclus %2$s - %1$s a annulé l’invitation de %2$s - %1$s a changé d’avatar - %1$s a modifié son nom affiché en %2$s - %1$s a modifié son nom affiché de %2$s en %3$s - %1$s a supprimé son nom affiché (précédemment %2$s) - %1$s a changé le sujet en : %2$s - %1$s a changé le nom du salon en : %2$s - %s a passé un appel vidéo. - %s a passé un appel vocal. - %s a répondu à l’appel. - %s a raccroché. - %1$s a rendu l’historique futur du salon visible pour %2$s - tous les membres du salon, depuis qu’ils ont été invités. - tous les membres du salon, depuis qu’ils l’ont rejoint. - tous les membres du salon. - n’importe qui. - inconnu (%s). - %1$s a activé le chiffrement de bout en bout (%2$s) - %1$s a demandé une téléconférence VoIP - Téléconférence VoIP démarrée - Téléconférence VoIP terminée - (l’avatar a aussi changé) - %1$s a supprimé le nom du salon - %1$s a supprimé le sujet du salon - %1$s a mis à jour son profil %2$s - %1$s a envoyé une invitation à %2$s pour rejoindre le salon - %1$s a accepté l’invitation pour %2$s - ** Déchiffrement impossible : %s ** - L’appareil de l’expéditeur ne nous a pas envoyé les clés pour ce message. - Effacement impossible - Envoi du message impossible - L’envoi de l’image a échoué - Erreur de réseau - Erreur de Matrix - Il est impossible pour le moment de revenir dans un salon vide. - Message chiffré - Adresse e-mail - Numéro de téléphone - %1$s a envoyé un sticker. - Invitation de %s - Invitation au salon - Salon vide - %1$s et %2$s - - %1$s et 1 autre - %1$s et %2$d autres - - Message supprimé - Message supprimé par %1$s - Message supprimé [motif : %1$s] - Message supprimé par %1$s [motif : %2$s] - Synchronisation initiale : -\nImportation du compte… - Synchronisation initiale : -\nImportation de la cryptographie - Synchronisation initiale : -\nImportation des salons - Synchronisation initiale : -\nImportation des salons que vous avez rejoints - Synchronisation initiale : -\nImportation des salons où vous avez été invités - Synchronisation initiale : -\nImportation des salons que vous avez quittés - Synchronisation initiale : -\nImportation des communautés - Synchronisation initiale : -\nImportation des données du compte - %s a mis à niveau ce salon. - Envoi du message… - Vider la file d’envoi - %1$s a révoqué l’invitation pour %2$s à rejoindre le salon - Invitation de %1$s. Raison : %2$s - %1$s a invité %2$s. Raison : %3$s - %1$s vous a invité. Raison : %2$s - %1$s a rejoint le salon. Raison : %2$s - %1$s est parti du salon. Raison : %2$s - %1$s a refusé l’invitation. Raison : %2$s - %1$s a expulsé %2$s. Raison : %3$s - %1$s a révoqué l\'exclusion de %2$s. Raison : %3$s - %1$s a exclus %2$s. Raison : %3$s - %1$s a envoyé une invitation à %2$s pour rejoindre le salon. Raison : %3$s - %1$s a révoqué l’invitation de %2$s à rejoindre le salon. Raison : %3$s - %1$s a accepté l’invitation pour %2$s. Raison : %3$s - %1$s a annulé l’invitation de %2$s. Raison : %3$s - - %1$s a ajouté %2$s comme adresse pour ce salon. - %1$s a ajouté %2$s comme adresses pour ce salon. - - - %1$s a supprimé %2$s comme adresse pour ce salon. - %1$s a supprimé %3$s comme adresses pour ce salon. - - %1$s a ajouté %2$s et supprimé %3$s comme adresses pour ce salon. - %1$s a défini %2$s comme adresse principale pour ce salon. - %1$s a supprimé l’adresse principale de ce salon. - %1$s a autorisé les visiteurs à rejoindre le salon. - %1$s a empêché les visiteurs de rejoindre le salon. - %1$s a activé le chiffrement de bout en bout. - %1$s a activé le chiffrement de bout en bout (algorithme %2$s inconnu). - %s demande à vérifier votre clé, mais votre client ne supporte pas la vérification de clés dans les discussions. Vous devrez utiliser l’ancienne vérification de clés pour vérifier les clés. - %1$s a créé le salon - Vous avez mis cet endroit à niveau. - %s a mis cet endroit à niveau. - Vous avez mis à niveau ce salon. - Vous avez expulsé %1$s - Vous avez rejeté l\'invitation - Vous avez quitté le salon - %1$s a quitté le salon - Vous avez quitté le salon - Vous avez rejoint le salon - %1$s a rejoint le salon - Vous avez rejoint le salon - Vous avez invité %1$s - Vous avez créé la discussion - %1$s a créé la discussion - Vous avez créé le salon - Votre invitation - Vous avez envoyé un autocollant. - Vous avez envoyé une image. - Vous avez activé le chiffrement de bout en bout (algorithme %1$s inconnu). - Vous avez activé le chiffrement de bout en bout. - Vous avez empêché les visiteurs de rejoindre le salon. - %1$s a empêché les visiteurs de rejoindre le salon. - Vous avez empêché les visiteurs de rejoindre le salon. - Vous avez autorisé les visiteurs à venir ici. - %1$s a autorisé les visiteurs à venir ici. - Vous avez autorisé les visiteurs à rejoindre le salon. - Vous avez supprimé l’adresse principale de ce salon. - Vous avez défini %1$s comme adresse principale pour ce salon. - Vous avez ajouté %1$s et supprimé %2$s comme adresses pour ce salon. - - Vous avez supprimé %1$s comme adresse pour ce salon. - Vous avez supprimé %1$s comme adresses pour ce salon. - - - Vous avez ajouté %1$s comme adresse pour ce salon. - Vous avez ajouté %1$s comme adresses pour ce salon. - - Vous avez annulé l’invitation de %1$s. Raison : %2$s - Vous avez accepté l’invitation pour %1$s. Raison : %2$s - Vous avez révoqué l’invitation de %1$s à rejoindre le salon. Raison : %2$s - Vous avez envoyé une invitation à %1$s pour rejoindre le salon. Raison : %2$s - Vous avez refusé l’invitation. Raison : %1$s - Vous êtes parti. Raison : %1$s - %1$s est parti. Raison : %2$s - Vous êtes parti du salon. Raison : %1$s - %1$s rejoint. Raison : %2$s - Vous avez rejoint. Raison : %1$s - Vous avez rejoint le salon. Raison : %1$s - Vous avez invité %1$s. Raison : %2$s - Votre invitation. Raison %1$s - %1$s de %2$s à %3$s - %1$s a modifié le niveau de pouvoir de %2$s. - Vous avez modifié le niveau de pouvoir de %1$s. - Personnalisé - Personnalisé (%1$d) - Défaut - Modérateur - Admin - Vous avez modifié le widget %1$s - %1$s a modifié le widget %2$s - Vous avez supprimé le widget %1$s - %1$s a supprimé le widget %2$s - Vous avez ajouté le widget %1$s - %1$s a ajouté le widget %2$s - Vous avez accepté l’invitation pour %1$s - Vous avez révoqué l\'invitation pour %1$s - %1$s a révoqué l\'invitation pour %2$s - Vous avez rendu les futurs messages visible pour %1$s - %1$s a rendu les futurs messages visible pour %2$s - Vous avez supprimé l\'avatar du salon - %1$s a supprimé l\'avatar du salon - Vous avez supprimé le nom du salon - Vous avez demandé une téléconférence VoIP - Vous avez activé le chiffrement de bout en bout (%1$s) - Vous avez rendu l’historique futur du salon visible pour %1$s - Vous avez raccroché. - Vous avez répondu à l’appel. - Vous avez envoyé les données pour configurer l\'appel. - %s a envoyé les données pour configurer l\'appel. - Vous avez passé un appel vocal. - Vous avez passé un appel vidéo. - Vous avez changé le nom du salon en : %1$s - Vous avez modifié l\'avatar du salon - %1$s a modifié l\'avatar du salon - Vous avez modifié votre nom affiché de %1$s en %2$s - Vous avez modifié votre nom affiché en %1$s - Vous avez changé votre avatar - Vous avez annulé l’invitation de %1$s - Vous avez changé le sujet en : %1$s - Vous avez supprimé votre nom affiché (précédemment %1$s) - Vous avez révoqué l’invitation pour %1$s à rejoindre le salon - Vous avez invité %1$s - %1$s a invité %2$s - Vous avez envoyé une invitation à %1$s pour rejoindre le salon - Vous avez mis à jour votre profile %1$s - Vous avez supprimé le sujet du salon - Vous avez exclus %1$s. Raison : %2$s - Vous avez révoqué l\'exclusion de %1$s. Raison : %2$s - Vous avez exclus %1$s - Vous avez révoqué l\'exclusion de %1$s - Vous avez expulsé %1$s. Raison : %2$s - Salon vide (était %s) - - %1$s, %2$s, %3$s et %4$d autre - %1$s, %2$s, %3$s et %4$d autres - - %1$s, %2$s, %3$s et %4$s - %1$s, %2$s et %3$s - 🎉 Tous les serveurs sont interdits de participer ! Ce salon ne peut plus être utilisé. - Aucun changement. - • Les serveurs correspondant à des IP littérales sont maintenant interdits. - • Les serveurs correspondant à %s sont interdits. - • Les serveurs correspondants à des IP littérales sont interdites. - • Les serveurs correspondants à des IP littérales sont autorisés. - • Les serveurs correspondants à des IP littérales sont maintenant autorisées. - • Les serveurs correspondant à %s sont supprimés de la liste autorisée. - • les serveur correspondant à %s sont maintenant autorisés. - • Les serveurs correspondant à %s étaient supprimés de la liste des interdits. - • Les serveurs correspondant à %s sont maintenant interdits. - Vous avez changé les droits ACL du serveur pour ce salon. - %s a changé les droits ACL du serveur pour ce salon. - • Les serveurs correspondant à %s sont autorisés. - Vous avez paramétré les ACL pour ce salon. - %s paramètre les autorisations étendues (ACL) du serveur pour ce salon. - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-gl/strings.xml b/matrix-sdk-android/src/main/res/values-gl/strings.xml deleted file mode 100644 index 6ae9b33b66..0000000000 --- a/matrix-sdk-android/src/main/res/values-gl/strings.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - Enderezo de correo - Fallo ao subir a páxina - %1$s: %2$s - %1$s enviou unha imaxe. - %1$s enviou unha icona. - Convite de %s - %1$s convidou a %2$s - %1$s convidouno - %1$s entrou - %1$s saíu - %1$s rexeitou o convite - %1$s expulsou a %2$s - %1$s desbloqueou a %2$s - %1$s bloqueou a %2$s - %1$s cancelou o convite de %2$s - %1$s cambiou o seu avatar - %1$s cambiou o seu nome a %2$s - %1$s cambiou o seu nome de %2$s a %3$s - %1$s borrou o seu nome público (%2$s) - %1$s cambiou o tema desta sala para: %2$s - %1$s cambiou o nome desta sala para: %2$s - %s iniciou unha chamada de vídeo. - %s iniciou unha chamada de voz. - %s respondeu á chamada. - %s terminou a chamada. - %1$s fixo visible os próximos históricos para %2$s - toda a xente que integran esta sala, desde o momento en que foron convidados. - todas a xente da sala, desde o momento en que entraron. - todas os membros da sala. - todos. - descoñecido (%s). - %1$s activou a criptografía par-a-par (%2$s) - %1$s solicitou unha conferencia VoIP - A conferencia VoIP comenzou - A conferencia VoIP terminou - (o avatar tamén foi cambiado) - %1$s borrou o nome da sala - %1$s removeu o tema da sala - %1$s actualizou o seu perfil %2$s - %1$s envioulle un convite a %2$s para que entre na sala - %1$s aceptou o convite para %2$s - ** Imposíbel descifrar: %s ** - O dispositivo do que envía non enviou as chaves desta mensaxe. - Non se puido redactar - Non foi posíbel enviar a mensaxe - Erro da conexión - Erro de Matrix - Aínda non é posíbel volver a entrar nunha sala baleira. - Mensaxe cifrada - Número de teléfono - %1$s e %2$s - Fixeches unha chamada de audio. - Fixeches unha chamada de vídeo. - Cambiaches o nome da sala a: %1$s - Cambiaches o avatar da sala - %1$s cambiou o avatar da sala - Cambiaches o asunto a: %1$s - Eliminaches o teu nome público (era %1$s) - Cambiaches o teu nome público de %1$s a %2$s - Estableceches o nome público a %1$s - Cambiaches o teu avatar - Retirácheslle o convite a %1$s - Vetaches a %1$s - Readmitiches a %1$s - Expulsaches a %1$s - Rexeitaches o convite - Deixaches a sala - %1$s deixou a sala - Saíches da sala - Unícheste - %1$s iniuse - Unícheste a sala - Convidaches a %1$s - Creaches a conversa - %1$s creou a conversa - Creaches a sala - %1$s creou a sala - O teu convite - Enviaches un adhesivo. - Enviaches unha imaxe. - • Servidores con literais IP están vetados. - • Servidores con IP literais están permitidos. - • Servidores con %s están vetados. - • Servidores con %s están permitidos. - Estableceches os ACLs do servidor para esta sala. - %s estableceu os ACLs do servidor para esta sala. - %s actualizou aquí. - Actualizaches aquí. - Actualizaches esta sala. - %s actualizou esta sala. - Activaches o cifrado extremo-a-extremo (%1$s) - Fixeches visibles as mensaxes futuras para %1$s - %1$s fixo visibles as mensaxes futuras para %2$s - Fixeches visible no futuro o historial da sala para %1$s - Remataches a chamada. - Respondeches á chamada. - Enviaches datos para configurar a chamada. - %s enviou datos para configurar a chamada. - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-he/strings.xml b/matrix-sdk-android/src/main/res/values-he/strings.xml deleted file mode 100644 index a6b3daec93..0000000000 --- a/matrix-sdk-android/src/main/res/values-he/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-hr/strings_sas.xml b/matrix-sdk-android/src/main/res/values-hr/strings_sas.xml new file mode 100644 index 0000000000..423ab20186 --- /dev/null +++ b/matrix-sdk-android/src/main/res/values-hr/strings_sas.xml @@ -0,0 +1,68 @@ + + + + pas + mačka + lav + konj + jednorog + svinja + slon + zec + panda + kokot + pingvin + kornjača + riba + hobotnica + leptir + svijet + drvo + kaktus + gljiva + Globus + mjesec + oblak + vatra + banana + jabuka + jagoda + kukuruza + pizza + torta + srca + smajlića + robot + kapa + naočale + ključ + deda Mraz + palac gore + kišobran + pješčani sat + sat + poklon + žarulja + knjiga + olovka + spajalica + škare + zaključati + ključ + čekić + telefon + zastava + vlak + bicikl + avion + raketa + trofej + lopta + gitara + truba + zvono + sidro + slušalice + mapu + pribadača + diff --git a/matrix-sdk-android/src/main/res/values-hu/strings.xml b/matrix-sdk-android/src/main/res/values-hu/strings.xml deleted file mode 100644 index 6c06c11813..0000000000 --- a/matrix-sdk-android/src/main/res/values-hu/strings.xml +++ /dev/null @@ -1,197 +0,0 @@ - - - %1$s: %2$s - %1$s küldött egy képet. - %s meghívója - %1$s meghívta: %2$s - %1$s meghívott - %1$s belépett a szobába - %1$s kilépett a szobából - %1$s elutasította a meghívást - %1$s kidobta: %2$s - %1$s feloldotta %2$s tiltását - %1$s kitiltotta: %2$s - %1$s visszavonta %2$s meghívását - %1$s megváltoztatta a profilképét - %1$s megváltoztatta a megjelenő nevét erre: %2$s - %1$s megváltoztatta a megjelenítendő nevét erről: %2$s, erre: %3$s - %1$s eltávolította a megjelenítendő nevét (%2$s) - %1$s megváltoztatta a témát erre: %2$s - %1$s megváltoztatta a szoba nevét erre: %2$s - %s videóhívást kezdeményezett. - %s hanghívást indított. - %s fogadta a hívást. - %s befejezte a hívást. - %1$s láthatóvá tette a jövőbeli előzményeket %2$s - a szoba összes tagja számára, a meghívásuk időpontjától kezdve. - a szoba összes tagja számára, a csatlakozásuk időpontjától kezdve. - az összes szobatag számára. - bárki. - ismeretlen (%s). - %1$s bekapcsolta a végpontok közötti titkosítást (%2$s) - %1$s hanghívás konferenciát kérelmezett - Hanghívás konferencia elindult - Hanghívás konferencia befejeződött - (a profilkép is megváltozott) - %1$s eltávolította a szoba nevét - %1$s eltávolította a szoba témáját - %1$s megváltoztatta a(z) %2$s profilját - %1$s meghívót küldött %2$s számára, hogy csatlakozzon a szobához - %1$s elfogadta a meghívót ebbe: %2$s - ** Visszafejtés sikertelen: %s ** - A küldő eszköze nem küldte el a kulcsokat ehhez az üzenethez. - Kitakarás sikertelen - Üzenet küldése sikertelen - Kép feltöltése sikertelen - Hálózati hiba - Matrix hiba - Jelenleg nem lehetséges újracsatlakozni egy üres szobához. - Titkosított üzenet - E-mail cím - Telefonszám - %1$s küldött egy matricát. - Meghívó tőle: %s - Meghívó egy szobába - %1$s és %2$s - Üres szoba - - %1$s és 1 másik - %1$s és %2$d másik - - Üzenet eltávolítva - Üzenetet eltávolította: %1$s - Üzenet eltávolítva [ok: %1$s] - Üzenetet eltávolította: %1$s [ok: %2$s] - Induló szinkronizáció: -\nFiók betöltése… - Induló szinkronizáció: -\nTitkosítás betöltése - Induló szinkronizáció: -\nSzobák betöltése - Induló szinkronizáció: -\nCsatlakozott szobák betöltése - Induló szinkronizáció: -\nMeghívott szobák betöltése - Induló szinkronizáció: -\nElhagyott szobák betöltése - Induló szinkronizáció: -\nKözösségek betöltése - Induló szinkronizáció: -\nFiók adatok betöltése - %s frissítette ezt a szobát. - Üzenet küldése… - Küldő sor ürítése - %1$s visszavonta %2$s meghívását, hogy csatlakozzon a szobához - %1$s meghívója. Ok: %2$s - %1$s meghívta őt: %2$s. Ok: %3$s - %1$s meghívott. Ok: %2$s - %1$s belépett a szobába. Mert: %2$s - %1$s kilépett a szobából. Ok: %2$s - %1$s visszautasította a meghívót. Ok: %2$s - %1$s kirúgta őt: %2$s. Ok: %3$s - %1$s visszaengedte őt: %2$s. Ok: %3$s - %1$s kitiltotta őt: %2$s. Ok: %3$s - %1$s meghívót küldött neki: %2$s, hogy lépjen be a szobába. Ok: %3$s - %1$s visszavonta %2$s meghívóját a szobába való belépéshez. Ok: %3$s - %1$s elfogadta a meghívót ide: %2$s. Ok: %3$s - %1$s visszavonta %2$s meghívóját. Ok: %3$s - - %1$s ezt a címet adta a szobához: %2$s. - %1$s ezeket a címeket adta a szobához: %2$s. - - - %1$s ezt a címet törölte a szobából: %3$s. - %1$s ezeket a címeket törölte a szobából: %3$s. - - %1$s a szobához adta ezeket:%2$s és törölte ezeket: %3$s. - %1$s a szoba elsődleges címét erre állította be: %2$s. - %1$s eltávolította a szoba elsődleges címét. - %1$s megengedte a vendégeknek, hogy belépjenek ebbe a szobába. - %1$s megtiltotta a vendégeknek, hogy belépjenek ebbe a szobába. - %1$s bekapcsolta a végpontok közötti titkosítást. - %1$s bekapcsolta a végpontok közötti titkosítást (ismeretlen algoritmus %2$s). - %s kéri a kulcsok ellenőrzését de a kliens nem támogatja a szobán belüli kulcs ellenőrzést. A hagyományos módon kell ellenőrizned a kulcsokat. - %1$s szobát készített - Fogadtad a hívást. - Befejezted a hívást. - Hívási adatokat küldtél. - %s hívási adatokat küldött. - Hanghívást indítottál. - Videóhívást indítottál. - Megváltoztattad a szoba képét - %1$s megváltoztatta a szoba képét - Megváltoztattad a témát erre: %1$s - Megváltoztattad a profilképed - Visszavontad %1$s meghívóját - Kitiltottad %1$s felhasználót - Visszaengedted %1$s felhasználót - Kirúgtad %1$s felhasználót - Visszautasítottad a meghívót - Elhagytad a szobát - %1$s elhagyta a szobát - Elhagytad a szobát - Csatlakoztál - %1$s csatlakozott - Beléptél a szobába - Meghívtad: %1$s - Létrehoztad a beszélgetést - %1$s létrehozta a beszélgetést - Létrehoztad a szobát - Matricát küldtél. - Képet küldtél. - Saját - Saját (%1$d) - Alapértelmezett - Moderátor - Admin - Ön megváltoztatta a %1$s kisalkalmazást - %1$s megváltoztatta a %2$s kisalkalmazást - Ön eltávolította a %1$s kisalkalmazást - %1$s eltávolította a %2$s kisalkalmazást - Ön hozzáadott egy %1$s kisalkalmazást - %1$s hozzáadott egy %2$s kisalkalmazást - Ön elfogadta a meghívót ehhez: %1$s - Ön visszavonta %1$s felhasználó meghívóját - %1$s visszavonta %2$s felhasználó meghívóját - Ön visszavonta %1$s felhasználó meghívóját - Ön meghívta %1$s felhasználót - %1$s meghívta %2$s felhasználót - Ön meghívót küldött %1$s felhasználónak, hogy csatlakozzon a szobához - Ön frissítette a saját profilját %1$s - Ön eltávolította a szoba képét - %1$s eltávolította a szoba képét - Ön eltávolította a szoba témáját - Ön eltávolította a szoba nevét - Ön videókonferencia kezdeményezését kérte - Ön frissítette ezt a szobát. - %s frissítette a szobát. - Ön frissítette ezt a szobát. - Ön bekapcsolta a végpontok közötti titkosítást (%1$s) - Ön elérhetővé tette a jövőbeni üzeneteket %1$s - Ön elérhetővé tette a jövőbeni üzeneteket %1$s - %1$s elérhetővé tette a jövőbeni üzeneteket %2$s - Ön megváltoztatta a szoba nevét erre: %1$s - Ön eltávolította a saját megjelenített nevét (%1$s volt) - Ön megváltoztatta a saját megjelenítési nevét erről: %1$s, erre: %2$s - Ön beállította a saját megjelenítési nevét erre: %1$s - Az ön meghívása - %1$s felhasználó hozzáférési szintjét erről: %2$s, erre: %3$s - %1$s megváltoztatta %2$s. - Megváltoztattad %1$s hozzáférési szintjét. - 🎉 Minden szerver ki lett tiltva a szobából! Ez a szoba többé nem használható. - Nincs változás. - • Most már tiltva vannak az IP címet hosztnévként használó szerverek. - • Az IP címet hosztnévként használó szerverek most már engedélyezve vannak. - • El lettek távolítva a tiltólistából az erre illeszkedő szerverek: %s - • Most már engedélyezve vannak az erre illeszkedő szerverek: %s - • El lettek távolítva a tiltólistából az erre illeszkedő szerverek: %s - • Most már tiltva vannak az erre a kifejezésre illeszkedő szerverek: %s - Megváltoztattad a szerver ACL-eket ehhez a szobához. - %s megváltoztatta a szerver ACL-eket ehhez a szobához. - • IP címet hosztnévként használó szerverek tiltva vannak. - • IP címet hosztnévként használó szerverek engedélyezve vannak. - • Engedélyezve vannak azok a szerverek, amik illeszkednek erre: %s - • Tiltva vannak azok a szerverek, amik illeszkednek erre: %s - Beállítottad a szerver ACL-eket ehhez a szobához. - %s beállította a szerver ACL-eket ehhez a szobához. - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-id/strings.xml b/matrix-sdk-android/src/main/res/values-id/strings.xml deleted file mode 100644 index 157b23d401..0000000000 --- a/matrix-sdk-android/src/main/res/values-id/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Undang dari %s - Undangan Ruang - %1$s dan %2$s - - Ruang kosong - - - %1$s dan %2$d yang lain - - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-in/strings.xml b/matrix-sdk-android/src/main/res/values-in/strings.xml deleted file mode 100644 index 157b23d401..0000000000 --- a/matrix-sdk-android/src/main/res/values-in/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Undang dari %s - Undangan Ruang - %1$s dan %2$s - - Ruang kosong - - - %1$s dan %2$d yang lain - - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-is/strings.xml b/matrix-sdk-android/src/main/res/values-is/strings.xml deleted file mode 100644 index ecf19edb8a..0000000000 --- a/matrix-sdk-android/src/main/res/values-is/strings.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - %1$s: %2$s - %1$s sendi mynd. - %1$s sendi límmerki. - - %s sendi boð um þátttöku - %1$s bauð %2$s - %1$s bauð þér - %1$s gekk í hópinn - %1$s hætti - %1$s hafnaði boðinu - %1$s sparkaði %2$s - %1$s afbannaði %2$s - %1$s bannaði %2$s - %1$s breyttu auðkennismynd sinni - allir meðlimir spjallrásar, síðan þeim var boðið. - allir meðlimir spjallrásar, síðan þeir skráðu sig. - allir meðlimir spjallrásar. - hver sem er. - óþekktur (%s). - VoIP-símafundur hafinn - VoIP-símafundi lokið - - (einnig var skipt um auðkennismynd) - ** Mistókst að afkóða: %s ** - - Gat ekki sent skilaboð - - Gat ekki sent inn mynd - - Villa í netkerfi - Villa í Matrix - - Dulrituð skilaboð - - Tölvupóstfang - Símanúmer - - %1$s tók til baka boð frá %2$s - %1$s setti birtingarnafn sitt sem %2$s - %1$s breytti birtingarnafni sínu úr %2$s í %3$s - %1$s fjarlægði birtingarnafn sitt (%2$s) - %1$s breytti umræðuefninu í: %2$s - %1$s breytti heiti spjallrásarinnar í: %2$s - %s hringdi myndsamtal. - %s hringdi raddsamtal. - %s svaraði símtalinu. - %s lauk símtalinu. - %1$s kveikti á enda-í-enda dulritun (%2$s) - - %1$s bað um VoIP-símafund - %1$s fjarlægði heiti spjallrásar - %1$s fjarlægði umfjöllunarefni spjallrásar - %1$s gerði ferilskrá spjallrásar héðan í frá sýnilega fyrir %2$s - %1$s uppfærði notandasniðið sitt %2$s - %1$s sendi boð til %2$s um þátttöku í spjallrásinni - %1$s samþykkti boð um að taka þátt í %2$s - - Tæki sendandans hefur ekki sent okkur dulritunarlyklana fyrir þessi skilaboð. - - Gat ekki ritstýrt - Ekki er í augnablikinu hægt að taka aftur þátt í spjallrás sem er tóm. - - Boð á spjallrás - %1$s og %2$s - - - %1$s og 1 annar - %1$s og %2$d aðrir - - - Tóm spjallrás - Boð frá %s - - diff --git a/matrix-sdk-android/src/main/res/values-it/strings.xml b/matrix-sdk-android/src/main/res/values-it/strings.xml deleted file mode 100644 index e1f57ddac0..0000000000 --- a/matrix-sdk-android/src/main/res/values-it/strings.xml +++ /dev/null @@ -1,268 +0,0 @@ - - - %1$s: %2$s - %1$s ha inviato un\'immagine. - Invito di %s - %1$s ha invitato %2$s - %1$s ti ha invitato - %1$s è entrato nella stanza - %1$s è uscito dalla stanza - %1$s ha rifiutato l\'invito - %1$s ha buttato fuori %2$s - %1$s ha tolto il bando a %2$s - %1$s ha bandito %2$s - %1$s ha revocato l\'invito per %2$s - %1$s ha modificato il suo avatar - %1$s hanno cambiato il nome visualizzato con %2$s - %1$s ha cambiato il nome visualizzato da %2$s a %3$s - %1$s ha rimosso il nome visibile (%2$s) - %1$s ha cambiato l\'argomento con: %2$s - %1$s ha cambiato il nome della stanza con: %2$s - %s ha iniziato una chiamata video. - %s ha iniziato una chiamata vocale. - %s ha risposto alla chiamata. - %s ha terminato la chiamata. - %1$s ha reso la futura cronologia della stanza visibile a %2$s - tutti i membri della stanza, dal momento del loro invito. - tutti i membri della stanza, dal momento in cui sono entrati. - tutti i membri della stanza. - chiunque. - sconosciuto (%s). - %1$s ha attivato la crittografia end-to-end (%2$s) - %1$s ha richiesto una conferenza VoIP - Conferenza VoIP iniziata - Conferenza VoIP terminata - (anche l\'avatar è cambiato) - %1$s ha rimosso il nome della stanza - %1$s ha rimosso l\'argomento della stanza - %1$s ha aggiornato il profilo %2$s - %1$s ha mandato un invito a %2$s per unirsi alla stanza - %1$s ha accettato l\'invito per %2$s - ** Impossibile decriptare: %s ** - Il dispositivo del mittente non ci ha inviato le chiavi per questo messaggio. - Impossibile revisionare - Impossibile inviare il messaggio - Invio dell\'immagine fallito - Errore di rete - Errore di Matrix - Al momento non è possibile rientrare in una stanza vuota. - Messaggio criptato - Indirizzo email - Numero di telefono - %1$s ha inviato un adesivo. - - Invito da %s - Invito nella stanza - %1$s e %2$s - Stanza vuota - - %1$s e 1 altro - %1$s e %2$d altri - - Messaggio rimosso - Messaggio rimosso da %1$s - Messaggio rimosso [motivo: %1$s] - Messaggio rimosso da %1$s [motivo: %2$s] - Sync iniziale: -\nImportazione account… - Sync iniziale: -\nImportazione cifratura - Sync iniziale: -\nImportazione stanze - Sync iniziale: -\nImportazione stanze partecipate - Sync iniziale: -\nImportazione stanze invitate - Sync iniziale: -\nImportazione stanze lasciate - Sync iniziale: -\nImportazione comunità - Sync iniziale: -\nImportazione dati account - %s ha aggiornato questa stanza. - Invio messaggio in corso … - Cancella la coda di invio - %1$s ha revocato l\'invito a %2$s di unirsi alla stanza - Invito di %1$s. Motivo: %2$s - %1$s ha invitato %2$s. Motivo: %3$s - %1$s ti ha invitato. Motivo: %2$s - %1$s è entrato nella stanza. Motivo: %2$s - %1$s è uscito dalla stanza. Motivo: %2$s - %1$s ha rifiutato l\'invito. Motivo: %2$s - %1$s ha buttato fuori %2$s. Motivo: %3$s - %1$s ha riammesso %2$s. Motivo: %3$s - %1$s ha bandito %2$s. Motivo: %3$s - %1$s ha inviato un invito a %2$s di unirsi alla stanza. Motivo: %3$s - %1$s ha revocato l\'invito a %2$s di unirsi alla stanza. Motivo: %3$s - %1$s ha accettato l\'invito per %2$s. Motivo: %3$s - %1$s ha rifiutato l\'invito di %2$s. Motivo: %3$s - - %1$s ha aggiunto %2$s come indirizzo per questa stanza. - %1$s ha aggiunto %2$s come indirizzi per questa stanza. - - - %1$s ha rimosso %2$s come indirizzo per questa stanza. - %1$s ha rimosso %2$s come indirizzi per questa stanza. - - %1$s ha aggiunto %2$s e rimosso %3$s come indirizzi per questa stanza. - %1$s ha impostato l\'indirizzo principale per questa stanza a %2$s. - %1$s ha rimosso l\'indirizzo principale per questa stanza. - %1$s ha permesso l\'accesso alla stanza per gli ospiti. - %1$s ha impedito l\'accesso alla stanza per gli ospiti. - %1$s ha attivato la cifratura end-to-end. - %1$s ha attivato la cifratura end-to-end (algoritmo %2$s non riconosciuto). - %s sta chiedendo di verificare la tua chiave, ma il tuo client non supporta la verifica in-chat. Dovrai usare il metodo di verifica obsoleto per verificare le chiavi. - %1$s ha creato la stanza - Hai inviato un\'immagine. - Hai inviato un adesivo. - Il tuo invito - Hai creato la stanza - Hai invitato %1$s - Sei entrato nella stanza - Sei uscito dalla stanza - Hai rifiutato l\'invito - Hai buttato fuori %1$s - Hai riammesso %1$s - Hai bandito %1$s - Hai ritirato l\'invito di %1$s - Hai cambiato il tuo avatar - Hai impostato il tuo nome visualizzato a %1$s - Hai cambiato il tuo nome visualizzato da %1$s a %2$s - Hai rimosso il tuo nome visibile (era %1$s) - Hai cambiato l\'argomento a: %1$s - %1$s ha modificato l\'avatar della stanza - Hai modificato l\'avatar della stanza - Hai cambiato il nome della stanza a: %1$s - Hai iniziato una videochiamata. - Hai iniziato una telefonata. - %s ha inviato dati per impostare la chiamata. - Hai inviato dati per impostare la chiamata. - Hai risposto alla chiamata. - Hai terminato la chiamata. - Hai reso visibile la futura cronologia della stanza a %1$s - Hai attivato la crittografia end-to-end (%1$s) - Hai aggiornato questa stanza. - Hai richiesto una conferenza VoIP - Hai rimosso il nome della stanza - Hai rimosso l\'argomento della stanza - %1$s ha rimosso l\'avatar della stanza - Hai rimosso l\'avatar della stanza - Hai aggiornato il tuo profilo %1$s - Hai mandato un invito a %1$s a unirsi alla stanza - Hai revocato l\'invito per %1$s a unirsi alla stanza - Hai accettato l\'invito per %1$s - %1$s ha aggiunto il widget %2$s - Hai aggiunto il widget %1$s - %1$s ha rimosso il widget %2$s - Hai rimosso il widget %1$s - %1$s ha modificato il widget %2$s - Hai modificato il widget %1$s - Amministratore - Moderatore - Predefinito - Personalizzato (%1$d) - Personalizzato - Hai cambiato il livello di potere di %1$s. - %1$s ha cambiato il livello di potere di %2$s. - %1$s da %2$s a %3$s - Il tuo invito. Motivo: %1$s - Hai invitato %1$s. Motivo: %2$s - Sei entrato nella stanza. Motivo: %1$s - Sei uscito dalla stanza. Motivo: %1$s - Hai rifiutato l\'invito. Motivo: %1$s - Hai buttato fuori %1$s. Motivo: %2$s - Hai riammesso %1$s. Motivo: %2$s - Hai bandito %1$s. Motivo: %2$s - Hai mandato un invito a %1$s a unirsi alla stanza. Motivo: %2$s - Hai revocato l\'invito a %1$s a unirsi alla stanza. Motivo: %2$s - Hai accettato l\'invito per %1$s. Motivo: %2$s - Hai ritirato l\'invito di %1$s. Motivo: %2$s - - Hai aggiunto %1$s come indirizzo per questa stanza. - Hai aggiunto %1$s come indirizzi per questa stanza. - - - Hai rimosso %1$s come indirizzo per questa stanza. - Hai rimosso %1$s come indirizzi per questa stanza. - - Hai aggiunto %1$s e rimosso %2$s come indirizzi per questa stanza. - Hai impostato l\'indirizzo principale per questa stanza a %1$s. - Hai rimosso l\'indirizzo principale per questa stanza. - Hai permesso l\'accesso alla stanza per gli ospiti. - Hai impedito l\'accesso alla stanza per gli ospiti. - Hai attivato la crittografia end-to-end. - Hai attivato la crittografia end-to-end (algoritmo %1$s sconosciuto). - Hai impedito l\'accesso alla stanza agli ospiti. - %1$s ha impedito l\'accesso alla stanza agli ospiti. - Hai permesso l\'accesso agli ospiti. - %1$s ha permesso l\'accesso agli ospiti. - Sei entrato. Motivo: %1$s - Sei uscito. Motivo: %1$s - %1$s è uscito. Motivo: %2$s - %1$s è entrato. Motivo: %2$s - Hai revocato l\'invito per %1$s - %1$s ha revocato l\'invito per %2$s - Hai invitato %1$s - %1$s ha invitato %2$s - Hai aggiornato la stanza. - %s ha aggiornato la stanza. - Hai reso visibili i messaggi futuri a %1$s - %1$s ha reso visibili i messaggi futuri a %2$s - Sei uscito dalla stanza - %1$s è uscito dalla stanza - Sei entrato - %1$s è entrato - Hai creato la discussione - %1$s ha creato la discussione - Stanza vuota (era %s) - - %1$s, %2$s, %3$s e %4$d altro - %1$s, %2$s, %3$s e altri %4$d - - %1$s, %2$s, %3$s e %4$s - %1$s, %2$s e %3$s - 🎉 Tutti i server sono banditi dalla partecipazione! Questa stanza non può più essere usata. - Nessuna modifica. - • I server che corrispondono a IP letterali ora sono banditi. - • I server che corrispondono a IP letterali ora sono permessi. - • I server che corrispondono a %s sono stati rimossi dalla lista dei consentiti. - • I server che corrispondono a %s ora sono permessi. - • I server che corrispondono a %s sono stati rimossi dalla lista di ban. - • I server che corrispondono a %s ora sono banditi. - Hai cambiato le ACL del server per questa stanza. - %s ha cambiato le ACL del server per questa stanza. - • I server che corrispondono a IP letterali sono banditi. - • I server che corrispondono a IP letterali sono permessi. - • I server che corrispondono a %s sono permessi. - • I server che corrispondono a %s sono banditi. - Hai impostato le ACL del server per questa stanza. - %s ha impostato le ACL del server per questa stanza. - Hai cambiato gli indirizzi per questa stanza. - %1$s ha cambiato gli indirizzi per questa stanza. - Hai cambiato gli indirizzi principali ed alternativi per questa stanza. - %1$s ha cambiato gli indirizzi principali ed alternativi per questa stanza. - Hai cambiato gli indirizzi alternativi per questa stanza. - %1$s ha cambiato gli indirizzi alternativi per questa stanza. - - Hai rimosso l\'indirizzo alternativo %1$s per questa stanza. - Hai rimosso gli indirizzi alternativi %1$s per questa stanza. - - - %1$s ha rimosso l\'indirizzo alternativo %2$s per questa stanza. - %1$s ha rimosso gli indirizzi alternativi %2$s per questa stanza. - - - Hai aggiunto l\'indirizzo alternativo %1$s per questa stanza. - Hai aggiunto gli indirizzi alternativi %1$s per questa stanza. - - - %1$s ha aggiunto l\'indirizzo alternativo %2$s per questa stanza. - %1$s ha aggiunto gli indirizzi alternativi %2$s per questa stanza. - - Hai modificato la video conferenza - Video conferenza modificata da %1$s - Hai iniziato la video conferenza - Hai terminato la video conferenza - Video conferenza terminata da %1$s - Video conferenza iniziata da %1$s - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-ja/strings.xml b/matrix-sdk-android/src/main/res/values-ja/strings.xml deleted file mode 100644 index add19edfaf..0000000000 --- a/matrix-sdk-android/src/main/res/values-ja/strings.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - %1$s: %2$s - %1$sが画像を送信しました。 - %1$sがスタンプを送信しました。 - %sの招待 - %1$sが%2$sを招待しました - %1$sがあなたを招待しました - %1$sが参加しました - %1$sが退出しました - %1$sが招待を断りました - %1$sが%2$sを追放しました - %1$sが%2$sをブロック解除しました - %1$sが%2$sをブロックしました - %1$sが%2$sの招待を撤回しました - %1$sがアバターを変更しました - %1$sが表示名を%2$sに設定しました - %1$sが表示名を%2$sから%3$sに変更しました - %1$sが表示名 (%2$s) を削除しました - %1$sがテーマを%2$sに変更しました - %1$sが部屋名を%2$sに変更しました - %sがビデオ通話を開始しました。 - %sが音声通話を開始しました。 - %sが電話に出ました。 - %sが通話を終了しました。 - %sさんからの招待 - 部屋への招待 - %1$sと%2$s - 空の部屋 - - %1$sと他%2$d名 - - %1$sは、今後の部屋履歴を%2$sに表示させました - 部屋のメンバー全員、招待された時点から。 - 部屋のメンバー全員、参加した時点から。 - 部屋のメンバー全員。 - 誰でも。 - 不明 (%s)。 - %1$s がエンドツーエンド暗号化を有効にしました (%2$s) - %1$s がVoIP会議をリクエストしました - VoIP会議が開始されました - VoIP会議が終了しました - (アバターも変更された) - %1$s が部屋名を削除しました - %1$s がルームトピックを削除しました - %1$s がプロフィール %2$s を更新しました - %1$s は %2$s に部屋に参加するよう招待状を送りました - %1$sは%2$sの招待を受け入れました - ** 解読できません: %s ** - 送信者の端末からこのメッセージのキーが送信されていません。 - 修正できませんでした - メッセージを送信できません - 画像のアップロードに失敗しました - ネットワークエラー - Matrixエラー - 現在空の部屋に再参加することはできません。 - 暗号化されたメッセージ - メールアドレス - 電話番号 - ルームのアバターを変更しました - %1$sがルームのアバターを変更しました - トピックを%1$sに変更しました - 表示名を削除しました(%1$sでした) - 表示名を%1$sから%2$sに変更しました - 表示名を%1$sに設定しました - アバターを変更しました - %1$sの招待を取り下げました - %1$sをBANしました - %1$sのBANを解除しました - %1$sを退出させました - 招待を拒否しました - ルームから退出しました - %1$sがルームから退出しました - ルームから退出しました - 参加しました - %1$sが参加しました - ルームに参加しました - %1$sを招待しました - ディスカッションを作成しました - %1$sがディスカッションを作成しました - ルームを作成しました - %1$sがルームを作成しました - 招待 - ステッカーを送信しました。 - 画像を送信しました。 - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-kab/strings.xml b/matrix-sdk-android/src/main/res/values-kab/strings.xml deleted file mode 100644 index 8b94fad9eb..0000000000 --- a/matrix-sdk-android/src/main/res/values-kab/strings.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - %1$s: %2$s - %1$s t.yuzen tugna. - Tuzneḍ tugna. - Tinubga n %s - Tinubga-k•m - %1$s yesnulfa-d taxxamt - Tesnulfaḍ-d taxxamt-a - %1$s inced-d %2$s - Tnecdeḍ-d %1$s - %1$s inced-ik-id - %1$s yedda ɣer texxamt - Teddiḍ ɣer texxamt - %1$s yeǧǧa taxxamt - Teǧǧiḍ taxxamt - %1$s yugi/tugi tinubga - Tufiḍ tinubga - %1$s yessufeɣ %2$s - Tessufɣeḍ %1$s - Tbeddleḍ avatar-inek·inem - Anedbal - Aseɣyad - Amezwer - Sagen - %1$s seg %2$s ɣer %3$s - Tegguma ad d-tali tugna - Tansa n yimayl - %1$s azen astiker. - Tuzneḍ amenṭaḍ. - %1$s yekkes agdal i %2$s - Tekkseḍ agdal i %1$s - %1$s igdel %2$s - Tgedleḍ %1$s - %1$s issefsex tinubga n %2$s - Tesfesxeḍ tinubga n %1$s - %1$s ibeddel avatar-is - %1$s isbadu isem-is i d-ittuseknen ɣer %2$s - Tesbaduḍ isem-ik•im i d-ittuseknen ɣer %1$s - %1$s ibeddel isem-is i d-ittuseknen seg %2$s ɣer %3$s - Tbeddleḍ isem-ik•im i d-ittuseknen seg %1$s ɣer %2$s - %1$s yekkes isem-is i d-ittuseknen (yella %2$s) - Tekkseḍ isem-ik·im yettwaskanen (d %1$s) - %1$s isnifel asentel s: %2$s - Tesnifleḍ asentel s: %1$s - %1$s ibeddel avaṭar n texxamt - Tbeddleḍ avaṭar n texxamt - %1$s ibeddel isem n texxamt s: %2$s - Tbeddleḍ isem n texxamt s: %1$s - %s isɛedda siwel s tvidyut. - Tesɛeddaḍ siwel s tvidyut. - %s isɛedda asiwel s taɣect. - Tesɛeddaḍ siwel s taɣect. - %s yuzen isefka i usbadu n usiwel. - Tuzneḍ isefka i usbadu n usiwel. - %s yerra ɣef usiwel. - Terriḍ ɣef usiwel. - %s iḥbes asiwel. - Tḥebseḍ asiwel. - meṛṛa iɛeggalen n texxamt, segmi ara d-ttwanecden. - meṛṛa iɛeggalen n texamt, segmi ara d-rnun. - meṛṛa iɛeggalen n texxamt. - yal yiwen. - arussin (%s). - %1$s isermed awgelhen seg yixef ɣer yixef (%2$s) - Tesremdeḍ awgelhen seg yixef ɣer yixef (%1$s) - %s ileqqem taxxamt-a. - Tleqqmeḍ taxxamt-a. - %1$s isuter-d asarag VoIP - Tsutreḍ-d asarag VoIP - Asarag VoIP yebda - Asarag VoIP yekfa - (avatar daɣen ibeddel) - %1$s yekkes isem n texxamt - Tekkseḍ isem n texxamt - %1$s yekkes asentel n texxamt - Tekkseḍ asentel n texxamt - %1$s yekkes avatar n texxamt - Tekkseḍ avatar n texxamt - Izen ittwakkes - Izen ittwakkes sɣur %1$s - Izen ittwakkes [tamentilt: %1$s] - Izen ittwakkes sɣur %1$s [tamentilt: %2$s] - %1$s ileqqem amaɣnu-ines %2$s - Tleqqmeḍ amaɣnu-inek•inem %1$s - %1$s yuzen tinubga i %2$s akken ad yeddu ɣer texxamt - Tuzneḍ tinubga i %1$s akken ad yeddu ɣer texxamt - %1$s iqbel tinubga i %2$s - Tqebleḍ tinubga i %1$s - %1$s yerna awiǧit %2$s - Terniḍ awiǧit %1$s - %1$s yekkes awiǧit %2$s - Tekkseḍ awiǧit %1$s - %1$s ibeddel awiǧit %2$s - Tbeddleḍ awiǧit %1$s - Sagen (%1$d) - Tbeddleḍ aswir n tezmert n %1$s. - %1$s ibeddel aswir n tezmert n %2$s. - ** Awgelhen d awezɣi: %s ** - Ibenk n umazan ur aɣ-d-yuzin ara tisura i yizen-a. - Tuzna n yizen d tawezɣit - Tuccḍa deg uẓeṭṭa - Tuccḍa deg Matrix - %1$s iga amazray n texxamyt i d-iteddun yettban i %2$s - Tgiḍ amazray n texxamyt i d-iteddun yettban i %1$s - %1$s issefsax tinubga i %2$s i wakken ad d-yekcem ɣer texxamt - Tesfesxeḍ tinubga i %1$s i wakken ad d-yernu ɣer texxamt - D awezɣi tura ad nales ad nuɣal ɣer texxamt tilemt. - Izen yettwawgelhen - Uṭṭun n tiliɣri - Tinubga sɣur %s - Tinubga ɣer texxamt - %1$s d %2$s - - %1$s d 1 wayeḍ - %1$s d %2$d wiyaḍ - - Tremdeḍ awgelhen seg yixef ɣer yixef (alguritm %1$s ur yettwassen ara). - %s isuter-d ad isenqed tasarut-ik·im, maca amsaɣ-ik·im ur issefrak ara asenqed n tsura deg yidiwenniyen. Ilaq-ak·am useqdec asenqed iqdim n tsura i usenqed n tsura. - Taxxamt tilemt - Amtawi n tazwara: -\nAktar n umiḍan… - Amtawi n tazwara: -\nAktar n uwgelhen - Amtawi n tazwara: -\nAktar n texxamin - Amtawi n tazwara: -\nAktar n texxamin iɣer terniḍ - Amtawi n tazwara: -\nAktar n texxamin iɣer tettwanecdeḍ - Amtawi n tazwara: -\nAktar n texxamin i teǧǧiḍ - Amtawi n tazwara: -\nAktar n tmezdagnutin - Amtawi n tazwara: -\nAktar n yisefka n umiḍan - Tuzzna n yizen… - Tinubga n %1$s. Tamentilt: %2$s - Tinubga-k•m. Tamentilt: %1$s - %1$s inced %2$s. Tamentilt: %3$s - Tnecdeḍ %1$s. Tamentilt: %2$s - %1$s inced-ik•ikem. Tamentilt: %2$s - %1$s yedda ɣer texxamt. Tamentilt: %2$s - Teddiḍ ɣer texxamt. Tamentilt: %1$s - %1$s yeǧǧa taxxamt. Tamentilt: %2$s - Teǧǧiḍ taxxamt. Tamentilt: %1$s - %1$s yugi tinubga. Tamentilt: %2$s - Tugiḍ tinubga. Tamentilt: %1$s - %1$s yessufeɣ %2$s. Tamentilt: %3$s - Tessufɣeḍ %1$s. Tamentilt: %2$s - %1$s yekkes agdal i %2$s. Tamentilt: %3$s - Tekkseḍ agdal i %1$s. Tamentilt: %2$s - %1$s igdel %2$s. Tamentilt: %3$s - Tgedleḍ %1$s. Tamentilt: %2$s - %1$s yuzen tinubga i %2$s akken ad yeddu ɣer texxamt. Tamentilt: %3$s - Tuzneḍ tinubga i %1$s iwakken ad yeddu ɣer texxamt. Tamentilt: %2$s - %1$s iqbel tinubga i %2$s. Tamentilt: %3$s - Tqebleḍ tinubga i %1$s. Tamentilt: %2$s - %1$s issefsex tinubga n %2$s. Tamentilt: %3$s - Tesfesxeḍ tinubga n %1$s. Tamentilt: %2$s - - %1$s yerna %2$s d tansa i texxamt-a. - %1$s yerna %2$s d tansiwin i texxamt-a. - - - Terniḍ %1$s d tansa i texxamt-a. - Terniḍ %1$s d tansiwin i texxamt-a. - - - %1$s yekkes %2$s am tansa i texxamt-a. - %1$s yekkes %3$s am tansiwin i texxamt-a. - - - Tekkseḍ %1$s am tansa i texxamt-a. - Tekkseḍ %1$s am tansiwin i texxamt-a. - - %1$s yerna %2$s terniḍ tekkseḍ %3$s am tansiwin i texxamt-a. - Terniḍ %1$s terniḍ tekkseḍ %2$s am tansiwin i texxamt-a. - %1$s isbadu %2$s am tansa tagejdant i texxamt-a. - Tesbaduḍ %1$s am tansa tagejdant i texxamt-a. - %1$s yekkes tansa tagejdant i texxamt-a. - Tekkseḍ tansa tagejdant i texxamt-a. - %1$s isireg inebgawen ad ddun ɣer texxamt. - Tsirgeḍ inebgawen ad ddun ɣer texxamt. - %1$s issewḥel inebgawen iwakken ur tteddun ara ɣer texxamt. - Tesweḥleḍ inebgawen iwakken ur tteddun ara ɣer texxamt. - %1$s yermed awgelhen seg yixef ɣer yixef. - Tremdeḍ awgelhen seg yixef ɣer yixef. - %1$s yermed awgelhen seg yixef ɣer yixef (alguritm %2$s ur yettwassen ara). - Sfeḍ tabdart n uraǧu n tuzzna - %1$s issefsex tinubga n %2$s i tmerniwt ɣer texxamt. Tamentilt: %3$s - Tesfesxeḍ tinubga n %1$s i tmerna ɣer texxamt. Tamentilt: %2$s - Yegguma ad yaru - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-ko/strings.xml b/matrix-sdk-android/src/main/res/values-ko/strings.xml deleted file mode 100644 index eee67628eb..0000000000 --- a/matrix-sdk-android/src/main/res/values-ko/strings.xml +++ /dev/null @@ -1,101 +0,0 @@ - - - %1$s: %2$s - %s님의 초대 - %1$s님이 사진을 보냈습니다. - %1$s님이 스티커를 보냈습니다. - - %1$s님이 %2$s님을 초대했습니다 - %1$s님이 당신을 초대했습니다 - %1$s님이 참가했습니다 - %1$s님이 떠났습니다 - %1$s님이 초대를 거부했습니다 - %1$s님이 %2$s님을 추방했습니다 - %1$s님이 %2$s님의 출입 금지를 풀었습니다 - %1$s님이 %2$s님을 출입 금지했습니다 - %1$s님이 %2$s님의 초대를 취소했습니다 - %1$s님이 아바타를 변경했습니다 - %1$s님이 표시 이름을 %2$s(으)로 설정했습니다 - %1$s님이 표시 이름을 %2$s에서 %3$s(으)로 변경했습니다 - %1$s님이 표시 이름을 삭제했습니다 (%2$s) - %1$s님이 주제를 다음으로 변경했습니다: %2$s - %1$s님이 방 이름을 다음으로 변경했습니다: %2$s - %s님이 영상 통화를 걸었습니다. - %s님이 음성 통화를 걸었습니다. - %s님이 전화를 받았습니다. - %s님이 전화를 끊었습니다. - %1$s님이 이후 %2$s에게 방 기록을 공개했습니다 - 초대된 시점부터 모든 방 구성원 - 들어온 시점부터 모든 방 구성원 - 모든 방 구성원 - 누구나. - 알 수 없음 (%s). - %1$s님이 종단간 암호화를 켰습니다 (%2$s) - %s님이 방을 업그레이드했습니다. - - %1$s님이 VoIP 회의를 요청했습니다 - VoIP 회의가 시작했습니다 - VoIP 회의가 끝났습니다 - - (아바타도 변경됨) - %1$s님이 방 이름을 삭제했습니다 - %1$s님이 방 주제를 삭제했습니다 - 메시지가 삭제되었습니다 - 메시지가 %1$s님에 의해 삭제되었습니다 - 메시지가 삭제되었습니다 [이유: %1$s] - 메시지가 %1$s님에 의해 삭제되었습니다 [이유: %2$s] - %1$s님이 프로필 %2$s을(를) 업데이트했습니다 - %1$s님이 %2$s님에게 방 초대를 보냈습니다 - %1$s님이 %2$s의 초대를 수락했습니다 - - ** 암호를 복호화할 수 없음: %s ** - 발신인의 기기에서 이 메시지의 키를 보내지 않았습니다. - - 검열할 수 없습니다 - 메시지를 보낼 수 없습니다 - - 사진 업로드에 실패했습니다 - - 네트워크 오류 - Matrix 오류 - - 현재 빈 방에 다시 들어갈 수 없습니다. - - 암호화된 메시지 - - 이메일 주소 - 전화번호 - - %s에서 초대함 - 방 초대 - - %1$s님과 %2$s님 - - - %1$s님 외 %2$d명 - - - 빈 방 - - 초기 동기화: -\n계정 가져오는 중… - 초기 동기화: -\n암호 가져오는 중 - 초기 동기화: -\n방 가져오는 중 - 초기 동기화: -\n들어간 방 가져오는 중 - 초기 동기화: -\n초대받은 방 가져오는 중 - 초기 동기화: -\n떠난 방 가져오는 중 - 초기 동기화: -\n커뮤니티 가져오는 중 - 초기 동기화: -\n계정 데이터 가져오는 중 - - 메시지 보내는 중… - 전송 대기 열 지우기 - - %1$s님이 %2$s님에게 방에 참가하라고 보낸 초대를 취소했습니다 - diff --git a/matrix-sdk-android/src/main/res/values-lt/strings.xml b/matrix-sdk-android/src/main/res/values-lt/strings.xml deleted file mode 100644 index db63c9385a..0000000000 --- a/matrix-sdk-android/src/main/res/values-lt/strings.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - %1$s: %2$s - %1$s išsiuntė vaizdą. - %1$s išsiuntė lipduką. - %s pakvietimas - Jūs prisijungėte prie kambario - %1$s prisijungė prie kambario - %1$s pakvietė jus - Jūs pakvietėte %1$s - %1$s pakvietė %2$s - Jūs sukūrėte diskusiją - %1$s sukūrė diskusiją - Jūs sukūrėte kambarį - %1$s sukūrė kambarį - Jūsų pakvietimas - Jūs išsiuntėte lipduką. - Jūs išsiuntėte vaizdą. - Jūs atšaukėte %1$s pakvietimą - %1$s atšaukė %2$s pakvietimą - Jūs užblokavote %1$s - %1$s užblokavo %2$s - Jūs atblokavote %1$s - %1$s atblokavo %2$s - Jūs išmetėte %1$s - %1$s išmetė %2$s - Jūs atmetėte pakvietimą - %1$s atmetė pakvietimą - Jūs išėjote iš kambario - %1$s išėjo iš kambario - Jūs išėjote iš kambario - %1$s išėjo iš kambario - Jūs prisijungėte - %1$s prisijungė - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-lv/strings.xml b/matrix-sdk-android/src/main/res/values-lv/strings.xml deleted file mode 100644 index 815760f394..0000000000 --- a/matrix-sdk-android/src/main/res/values-lv/strings.xml +++ /dev/null @@ -1,245 +0,0 @@ - - - %1$s: %2$s - %1$s nosūtīja attēlu. - Uzaicinājums no %s - %1$s uzaicināja %2$s - %1$s uzaicināja jūs - %1$s pievienojās - %1$s pameta istabu - %1$s noraidīja uzaicinājumu - %1$s padzina %2$s - %1$s atcēla pieejas liegumu %2$s - %1$s liedza pieeju %2$s - %1$s atsauca %2$s uzaicinājumu - %1$s nomainīja avataru - %1$s uzstādīja parādāmo vārdu uz %2$s - %1$s nomainīja parādāmo vārdu no %2$s uz %3$s - %1$s dzēsa savu parādāmo vārdu (iepriekš %2$s) - %1$s nomainīja tematu uz %2$s - %1$s nomainīja istabas nosaukumu uz %2$s - %s veica video zvanu. - %s veica audio zvanu. - %s atbildēja uz zvanu. - %s beidza zvanu. - %1$s padarīja istabas turpmāko ziņu vēsturi redzamu %2$s - visi istabas biedri no brīža, kad tika uzaicināti. - visi istabas biedri no brīža, kad tika pievienojušies. - visi istabas biedri. - ikviens. - nezināms (%s). - %1$s ieslēdza pilnīgu šifrēšanu (%2$s) - %1$s pieprasīja VoIP konferenci - VoIP konference sākās - VoIP konference beidzās - (arī avatars tika nomainīts) - %1$s dzēsa istabas nosaukumu - %1$s izdzēsa istabas tematu - %1$s atjaunoja savu profilu %2$s - %1$s nosūtīja %2$s uzaicinājumu pievienoties istabai - %1$s pieņēma uzaicinājumu %2$s - ** Neizdodas atšifrēt: %s ** - Sūtītāja ierīce mums nav nenosūtījusi atslēgas priekš šīs ziņas. - Nevarēja rediģēt - Neizdodas nosūtīt ziņu - Neizdevās augšuplādēt attēlu - Tīkla kļūda - Matrix kļūda - Šobrīd nav iespējams atkārtoti pievienoties tukšai istabai. - Šifrēta ziņa - Epasta adrese - Telefona numurs - Uzaicinājums no %s - Uzaicinājums uz istabu - %1$s un %2$s - Tukša istaba - - %1$s un 1 cits - %1$s un %2$d citi - %1$s un %2$d citu - - Jūs nomainījāt savu parādāmo vārdu no %1$s uz %2$s - Jūs nomainījāt savu parādāmo vārdu uz %1$s - Jūs nomainījāt savu avataru - Jūs atsaucāt %1$s uzaicinājumu - Jūs liedzāt pieeju %1$s - Jūs atcēlāt pieejas liegumu %1$s - Jūs padzināt %1$s - Jūs noraidījāt uzaicinājumu - Jūs pametāt istabu - %1$s pameta istabu - Jūs pametāt istabu - Jūs pievienojāties - %1$s pievienojās istabai - Jūs pievienojāties istabai - Jūs uzaicinājāt %1$s - Jūs izveidojāt diskusiju - %1$s izveidoja diskusiju - Jūs izveidojāt istabu - %1$s izveidoja istabu - Jūsu uzaicinājums - Jūs nosūtījāt uzlīmi. - %1$s nosūtīja uzlīmi. - Jūs nosūtījāt attēlu. - %s pieprasa verificēt jūsu atslēgu, taču jūsu klients neatbalsta tērzēšanas atslēgas verifikāciju. Lai verificētu atslēgas, jums būs jāizmanto atslēgu verifikācija novecojušā veidā. - Jūs ieslēdzāt pilnīgu šifrēšanu (neatpazīts algoritms %1$s). - %1$s ieslēdza pilnīgu šifrēšanu (neatpazīts algoritms %2$s). - Jūs ieslēdzāt pilnīgu šifrēšanu. - %1$s ieslēdza pilnīgu šifrēšanu. - Jūs esat novērsis iespēju viesiem pievienoties istabai. - %1$s ir novērsis iespēju viesiem pievienoties istabai. - Jūs esat novērsis iespēju viesiem pievienoties istabai. - %1$s ir novērsis iespēju viesiem pievienoties istabai. - Jūs esat atļāvis viesiem pievienoties istabai. - %1$s ir atļāvis viesiem pievienoties istabai. - Jūs esat atļāvis viesiem pievienoties istabai. - %1$s ir atļāvis viesiem pievienoties istabai. - Jūs nomainījāt adreses šai istabai. - %1$s nomainīja adreses šai istabai. - Jūs nomainījāt galveno un alternatīvās adreses šai istabai. - %1$s nomainīja galveno un alternatīvās adreses šai istabai. - Jūs nomainījāt alternatīvās adreses šai istabai. - %1$s nomainīja alternatīvās adreses šai istabai. - - Jūs izdzēsāt šīs istabas alternatīvo adresi %1$s. - Jūs izdzēsāt šīs istabas alternatīvās adreses %1$s. - Jūs izdzēsāt šīs istabas alternatīvās adreses %1$s. - - - %1$s izdzēsa šīs istabas alternatīvo adresi %2$s. - %1$s izdzēsa šīs istabas alternatīvās adreses %2$s. - %1$s izdzēsa šīs istabas alternatīvās adreses %2$s. - - - Jūs pievienojāt šīs istabas alternatīvo adresi %1$s. - Jūs pievienojāt šīs istabas alternatīvās adreses %1$s. - Jūs pievienojāt šīs istabas alternatīvās adreses %1$s. - - - %1$s pievienoja šīs istabas alternatīvo adresi %2$s. - %1$s pievienoja šīs istabas alternatīvās adreses %2$s. - %1$s pievienoja šīs istabas alternatīvās adreses %2$s. - - Jūs izdzēsāt šis istabas galveno adresi. - %1$s izdzēsa šis istabas galveno adresi. - Jūs iestatījāt %1$s kā šis istabas galveno adresi. - %1$s iestatīja %2$s kā šis istabas galveno adresi. - Jūs pievienojāt %1$s un izdzēsāt %2$s kā šīs istabas adreses. - %1$s pievienoja %2$s un izdzēsa %3$s kā šīs istabas adreses. - - Jūs izdzēsāt %1$s kā šīs istabas adresi. - Jūs izdzēsāt %1$s kā šīs istabas adreses. - Jūs izdzēsāt %1$s kā šīs istabas adreses. - - - %1$s izdzēsa %2$s kā šīs istabas adresi. - %1$s izdzēsa %2$s kā šīs istabas adreses. - %1$s izdzēsa %2$s kā šīs istabas adreses. - - - Jūs pievienojāt %1$s kā šīs istabas adresi. - Jūs pievienojāt %1$s kā šīs istabas adreses. - Jūs pievienojāt %1$s kā šīs istabas adreses. - - - %1$s pievienoja %2$s kā šīs istabas adresi. - %1$s pievienoja %2$s kā šis istabas adreses. - %1$s pievienoja %2$s kā šīs istabas adreses. - - Jūs atsaucāt %1$s uzaicinājumu. Iemesls: %2$s - %1$s atsauca uzaicinājumu %2$s. Iemesls: %3$s - Jūs pieņēmāt uzaicinājumu %1$s. Iemesls: %2$s - %1$s pieņēma uzaicinājumu %2$s. Iemesls: %3$s - Jūs atsaucāt uzaicinājumu %1$s pievienoties istabai. Iemesls: %2$s - %1$s atsauca uzaicinājumu %2$s pievienoties istabai. Iemesls: %3$s - Jūs nosūtījāt uzaicinājumu %1$s pievienoties istabai. Iemesls: %2$s - %1$s nosūtīja uzaicinājumu %2$s pievienoties istabai. Iemesls: %3$s - Jūs liedzāt pieeju %1$s. Iemesls: %2$s - %1$s liedza pieeju %2$s. Iemesls: %3$s - Jūs atcēlāt pieejas liegumu %1$s. Iemesls: %2$s - %1$s atcēla %2$s pieejas liegumu. Iemesls: %3$s - Jūs padzināt %1$s. Iemesls: %2$s - %1$s padzina %2$s. Iemesls: %3$s - Jūs noraidījāt uzaicinājumu. Iemesls: %1$s - %1$s noraidīja uzaicinājumu. Iemesls: %2$s - Jūs izgājāt. Iemesls: %1$s - %1$s izgāja. Iemels: %2$s - Jūs pametāt istabu. Iemesls: %1$s - %1$s pameta istabu. Iemesls: %2$s - Jūs pievienojāties. Iemesls: %1$s - %1$s pievienojās. Iemesls: %2$s - Jūs pievienojāties istabai. Iemesls: %1$s - %1$s pievienojās istabai. Iemesls: %2$s - %1$s uzaicināja jūs. Iemesls: %2$s - Jūs uzaicinājāt %1$s. Iemesls: %2$s - %1$s uzaicināja %2$s. Iemesls: %3$s - Jūsu uzaicinājums. Iemesls: %1$s - %1$s uzaicinājums. Iemesls: %2$s - Notīrīt sūtīšanas rindu - Sūta ziņu… - Sākotnējā sinhronizācija: -\nImportē konta datus - Sākotnējā sinhronizācija: -\nImportē kopienas - Sākotnējā sinhronizācija: -\nImportē pamestās istabas - Sākotnējā sinhronizācija: -\nImportē istabas, uz kurām uzaicināts - Sākotnējā sinhronizācija: -\nImportē istabas, kurās ieiets - Sākotnējā sinhronizācija: -\nImportē istabas - Sākotnējā sinhronizācija: -\nImportē kriptogrāfiju - Sākotnējā sinhronizācija: -\nImportē kontu… - Tukša istaba (bija %s) - - %1$s, %2$s, %3$s un %4$d citi - %1$s, %2$s, %3$s un %4$d cits - %1$s, %2$s, %3$s un %4$d citi - - %1$s, %2$s, %3$s un %4$s - %1$s, %2$s un %3$s - %1$s no %2$s uz %3$s - %1$s nomainīja %2$s pieejas līmeni. - Jūs nomainījāt %1$s pieejas līmeni. - Pielāgots - Pielāgots (%1$d) - Noklusējuma - Moderators - Administrators - Jūs pieņēmāt uzaicinājumu %1$s - Jūs atsaucāt uzaicinājumu %1$s - %1$s atsauca uzaicinājumu %2$s - Jūs atsaucāt uzaicinājumu %1$s pievienoties istabai - %1$s atsauca uzaicinājumu %2$s pievienoties istabai - Jūs uzaicinājāt %1$s - %1$s uzaicināja %2$s - Jūs nosūtījāt %1$s uzaicinājumu pievienoties istabai - Jūs atjaunojāt savu profilu %1$s - %1$s izdzēsa ziņu [iemesls: %2$s] - Ziņa izdzēsta [iemesls: %1$s] - %1$s izdzēsa ziņu - Ziņa izdzēsta - Jūs izdzēsāt istabas avataru - %1$s izdzēsa istabas avataru - Jūs izdzēsāt istabas tematu - Jūs dzēsāt istabas nosaukumu - Jūs pieprasījāt VoIP konferenci - Jūs ieslēdzāt pilnīgu šifrēšanu (%1$s) - Jūs padarījāt turpmākās ziņas redzamas %1$s - %1$s padarīja turpmākās ziņas redzamas %2$s - Jūs padarījāt istabas turpmāko ziņu vēsturi redzamu %1$s - Jūs beidzāt zvanu. - Jūs atbildējāt uz zvanu. - Jūs nosūtījāt datus zvana uzsākšanai. - %s nosūtīja datus zvana uzsākšanai. - Jūs veicāt balss zvanu. - Jūs veicāt video zvanu. - Jūs nomainījāt istabas nosaukumu uz %1$s - Jūs nomainījāt istabas avataru - %1$s nomainīja istabas avataru - Jūs nomainījāt tematu uz %1$s - Jūs dzēsāt savu parādāmo vārdu (iepriekš %1$s) - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-nl/strings.xml b/matrix-sdk-android/src/main/res/values-nl/strings.xml deleted file mode 100644 index 1b05052ba6..0000000000 --- a/matrix-sdk-android/src/main/res/values-nl/strings.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - %1$s: %2$s - %1$s heeft een afbeelding gestuurd. - - Uitnodiging van %s - %1$s heeft %2$s uitgenodigd - %1$s heeft u uitgenodigd - %1$s neemt nu deel aan het gesprek - %1$s heeft het gesprek verlaten - %1$s heeft de uitnodiging geweigerd - %1$s heeft %2$s uit het gesprek verwijderd - %1$s heeft %2$s ontbannen - %1$s heeft %2$s verbannen - %1$s heeft de uitnodiging van %2$s ingetrokken - %1$s heeft zijn/haar avatar aangepast - %1$s heeft zijn/haar naam aangepast naar %2$s - %1$s heeft zijn/haar naam aangepast van %2$s naar %3$s - %1$s heeft zijn/haar naam verwijderd (%2$s) - %1$s heeft het onderwerp veranderd naar: %2$s - %1$s heeft de gespreksnaam veranderd naar: %2$s - %s heeft een video-oproep gemaakt. - %s heeft een spraakoproep gemaakt. - %s heeft de oproep beantwoord. - %s heeft opgehangen. - %1$s heeft de toekomstige gespreksgeschiedenis zichtbaar gemaakt voor %2$s - alle deelnemers aan het gesprek, vanaf het punt dat ze zijn uitgenodigd. - alle deelnemers aan het gesprek, vanaf het punt dat ze zijn toegetreden. - alle deelnemers aan het gesprek. - iedereen. - onbekend (%s). - %1$s heeft eind-tot-eind-versleuteling aangezet (%2$s) - - %1$s heeft een VoIP-vergadering aangevraagd - VoIP-vergadering gestart - VoIP-vergadering gestopt - - (avatar is ook veranderd) - %1$s heeft de gespreksnaam verwijderd - %1$s heeft het gespreksonderwerp verwijderd - %1$s heeft zijn/haar profiel %2$s bijgewerkt - %1$s heeft een uitnodiging naar %2$s gestuurd om het gesprek toe te treden - %1$s heeft de uitnodiging voor %2$s aanvaard - - ** Kan niet ontsleutelen: %s ** - Het apparaat van de afzender heeft geen sleutels voor dit bericht gestuurd. - - - Kon niet verwijderd worden - Kan bericht niet verzenden - - Uploaden van de afbeelding mislukt - - - Netwerkfout - Matrix-fout - - - - - - - Het is momenteel niet mogelijk om een leeg gesprek opnieuw toe te treden. - - Versleuteld bericht - - - E-mailadres - Telefoonnummer - - %1$s heeft een sticker gestuurd. - - - Uitnodiging van %s - Gespreksuitnodiging - %1$s en %2$s - Leeg gesprek - - - %1$s en 1 andere - %1$s en %2$d anderen - - - - Bericht verwijderd - Bericht verwijderd door %1$s - Bericht verwijderd [reden: %1$s] - Bericht verwijderd door %1$s [reden: %2$s] - - Initiële synchronisatie: -\nAccount wordt geïmporteerd… - Initiële synchronisatie: -\nCrypto wordt geïmporteerd - Initiële synchronisatie: -\nGesprekken worden geïmporteerd - Initiële synchronisatie: -\nDeelgenomen gesprekken worden geïmporteerd - Initiële synchronisatie: -\nUitgenodigde gesprekken worden geïmporteerd - Initiële synchronisatie: -\nVerlaten gesprekken worden geïmporteerd - Initiële synchronisatie: -\nGemeenschappen worden geïmporteerd - Initiële synchronisatie: -\nAccountgegevens worden geïmporteerd - - %s heeft dit gesprek opgewaardeerd. - - Bericht wordt verstuurd… - Uitgaande wachtrij legen - - %1$s heeft de uitnodiging voor %2$s om het gesprek toe te treden ingetrokken - Uitnodiging van %1$s. Reden: %2$s - %1$s heeft %2$s uitgenodigd. Reden: %3$s - %1$s heeft u uitgenodigd. Reden: %2$s - %1$s neemt nu deel. Reden: %2$s - %1$s is weggegaan. Reden: %2$s - %1$s heeft de uitnodiging geweigerd. Reden: %2$s - %1$s heeft %2$s verwijderd. Reden: %3$s - %1$s heeft %2$s ontbannen. Reden: %3$s - %1$s heeft %2$s verbannen. Reden: %3$s - %1$s heeft %2$s een uitnodiging voor het gesprek gestuurd. Reden: %3$s - %1$s heeft de uitnodiging voor %2$s ingetrokken. Reden: %3$s - %1$s heeft de uitnodiging voor %2$s aanvaard. Reden: %3$s - %1$s heeft de uitnodiging van %2$s ingetrokken. Reden: %3$s - - - %1$s heeft %2$s als gespreksadres toegevoegd. - %1$s heeft %2$s als gespreksadressen toegevoegd. - - - - %1$s heeft %2$s als gespreksadres verwijderd. - %1$s heeft %3$s als gespreksadressen verwijderd. - - - %1$s heeft %2$s als gespreksadres toegevoegd en %3$s verwijderd. - - %1$s heeft het hoofdadres voor dit gesprek ingesteld op %2$s. - %1$s heeft het hoofdadres voor dit gesprek verwijderd. - - %1$s heeft gasten de toegang tot het gesprek verleend. - %1$s heeft gasten de toegang tot het gesprek verhinderd. - - %1$s heeft eind-tot-eind-versleuteling ingeschakeld. - %1$s heeft eind-tot-eind-versleuteling ingeschakeld (onbekend algoritme %2$s). - - %s vraagt om uw sleutel te verifiëren, maar uw cliënt biedt geen ondersteuning voor verificatie in het gesprek. U zult de verouderde sleutelverificatie moeten gebruiken om de sleutels te verifiëren. - - diff --git a/matrix-sdk-android/src/main/res/values-nn/strings.xml b/matrix-sdk-android/src/main/res/values-nn/strings.xml deleted file mode 100644 index 441d568fc3..0000000000 --- a/matrix-sdk-android/src/main/res/values-nn/strings.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - Kryptert melding - %1$s: %2$s - %1$s sende eit bilæte. - %1$s sende eit klistremerke. - %s si innbjoding - %1$s inviterte %2$s - %1$s inviterte deg - %1$s kom inn - %1$s forlot rommet - %1$s sa nei til innbjodingi - %1$s sparka %2$s - %1$s slapp %2$s inn att - %1$s stengde %2$s ute - %1$s tok attende %2$s si innbjoding - %1$s byta avataren sin - %1$s sette visingsnamnet sitt som %2$s - %1$s byta visingsnamnet sitt frå %2$s til %3$s - %1$s tok burt visingsnamnet sitt (%2$s) - %1$s gjorde emnet til: %2$s - %1$s gjorde romnamnet til: %2$s - %s starta ei videosamtala. - %s starta ein talesamtale. - %s tok røyret. - %s la på røyret. - %1$s gjorde den framtidige romsoga synleg for %2$s - alle rommedlemmar, frå då dei vart invitert inn. - alle rommedlemmar, frå då dei kom inn. - alle rommedlemmar. - kven som heldst. - uvisst (%s). - %1$s skrudde ende-til-ende-kryptering på (%2$s) - %1$s bad um ei VoIP-gruppasamtala - VoIP-gruppasamtala er starta - VoIP-gruppasamtala er ferdug - (avataren vart au byta) - %1$s tok burt romnamnet - %1$s tok burt romemnet - %1$s gjorde um på skildringi si %2$s - %1$s inviterte %2$s til rommet - %1$s sa ja til innbjodingi til %2$s - ** Fekk ikkje til å dekryptera: %s ** - Avsendareiningi hev ikkje sendt oss nyklane fyr denna meldingi. - Kunde ikkje gjera um - Fekk ikkje til å senda meldingi - Fekk ikkje til å lasta biletet upp - Noko gjekk gale med netverket - Noko gjekk gale med Matrix - Det lèt seg fyrebils ikkje gjera å fara inn att i eit tomt rom. - Epostadresse - Telefonnummer - Innbjoding frå %s - Rominnbjoding - %1$s og %2$s - - %1$s og 1 til - %1$s og %2$d til - - Tomt rom - Ei melding vart stroki - %1$s strauk meldingi - Meldingi vart stroki [av di: %1$s] - %1$s strauk meldingi [av di: %2$s] - %s oppgraderte rommet. - Nullstill sendingskø - %1$s forlot rommet. Grunn: %2$s - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-pl/strings.xml b/matrix-sdk-android/src/main/res/values-pl/strings.xml deleted file mode 100644 index 0d79edc658..0000000000 --- a/matrix-sdk-android/src/main/res/values-pl/strings.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - %1$s: %2$s - %1$s wysłał(a) zdjęcie. - - Zaproszenie od %s - %1$s zaprosił(a) %2$s - %1$s zaprosił(a) Cię - %1$s dołączył(a) - %1$s opuścił(a) - %1$s odrzucił(a) zaproszenie - %1$s wyrzucił(a) %2$s - %1$s odblokował(a) %2$s - %1$s zablokował(a) %2$s - %1$s zmienił(a) awatar - %1$s zmienił(a) wyświetlaną nazwę na %2$s - %1$s zmienił(a) wyświetlaną nazwę z %2$s na %3$s - %1$s usunął(-ęła) swoją wyświetlaną nazwę (%2$s) - %1$s zmienił(a) temat na: %2$s - Nie można wysłać wiadomości - - Przesyłanie zdjęcia nie powiodło się - - Błąd sieci - Błąd Matrixa - - Wiadomość zaszyfrowana - - Adres e-mail - Numer telefonu - - wszyscy członkowie pokoju. - wszyscy. - %1$s zmienił(a) nazwę pokoju na: %2$s - %s zakończył(a) rozmowę. - %1$s usunął(-ęła) nazwę pokoju - %1$s usunął(-ęła) temat pokoju - %1$s wysłał(a) naklejkę. - - %1$s włączył(a) szyfrowanie end-to-end (%2$s) - - %1$s wycofał(a) zaproszenie %2$s - %s odebrał(a) połączenie. - (awatar też został zmieniony) - - Zaproszenie od %s - Zaproszenie do pokoju - %1$s i %2$s - Pusty pokój - - - %1$s i jeden inny - %1$s i kilku innych - %1$s i %2$d innych - - - - ** Nie można odszyfrować: %s ** - %s wykonał(a) rozmowę wideo. - %s wykonał(a) połączenie głosowe. - %1$s uczynił(a) przyszłą historię pokoju widoczną dla %2$s - wszyscy członkowie pokoju, od momentu w którym zostali zaproszeni. - wszyscy członkowie pokoju, od momentu w którym dołączyli. - nieznane (%s). - %1$s zażądał(a) grupowego połączenia VoIP - Rozpoczęto grupowe połączenie głosowe VoIP - Zakończono grupowe połączenie głosowe VoIP - - %1$s zaktualizował swój profil %2$s - %1$s wysłał(a) zaproszenie do %2$s aby dołączył(a) do tego pokoju - %1$s zaakceptował(a) zaproszenie dla %2$s - - Urządzenie nadawcy nie wysłało nam kluczy do tej wiadomości. - - Nie można zredagować - Obecnie nie jest możliwe ponowne dołączenie do pustego pokoju. - - Wiadomość usunięta - Wiadomość usunięta przez %1$s - Wiadomość usunięta [powód: %1$s] - Wiadomość usunięta przez %1$s [powód: %2$s] - %s zakutalizował(a) ten pokój. - - Synchronizacja początkowa: -\nImportowanie konta… - Synchronizacja początkowa: -\nImportowanie kryptografii - Synchronizacja początkowa: -\nImportowanie Pokoi - Synchronizacja początkowa: -\nImportowanie dołączonych Pokoi - Synchronizacja początkowa: -\nImportowanie zaproszonych Pokoi - Synchronizacja początkowa: -\nImportowanie opuszczonych Pokoi - Synchronizacja początkowa: -\nImportowanie Społeczności - Synchronizacja początkowa: -\nImportowanie danych Konta - - Wysyłanie wiadomości… - Wyczyść kolejkę wysyłania - - diff --git a/matrix-sdk-android/src/main/res/values-pt-rBR/strings.xml b/matrix-sdk-android/src/main/res/values-pt-rBR/strings.xml deleted file mode 100644 index 5e3282a305..0000000000 --- a/matrix-sdk-android/src/main/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,269 +0,0 @@ - - - %1$s: %2$s - %1$s enviou uma foto. - convite de %s - %1$s convidou %2$s - %1$s convidou você - %1$s entrou na sala - %1$s saiu da sala - %1$s recusou o convite - %1$s removeu %2$s - %1$s removeu o banimento de %2$s - %1$s baniu %2$s - %1$s desfez o convite a %2$s - %1$s alterou a foto de perfil - %1$s definiu o nome e sobrenome como %2$s - %1$s alterou o nome e sobrenome de %2$s para %3$s - %1$s removeu o nome e sobrenome (era %2$s) - %1$s alterou a descrição para: %2$s - %1$s alterou o nome da sala para: %2$s - %s iniciou uma chamada de vídeo. - %s iniciou uma chamada de voz. - %s aceitou a chamada. - %s encerrou a chamada. - %1$s deixou o histórico futuro da sala visível para %2$s - todos os participantes da sala, a partir do momento em que foram convidados. - todos os participantes da sala, a partir do momento em que entraram nela. - todos os participantes da sala. - qualquer pessoa. - desconhecido (%s). - %1$s ativou a criptografia de ponta a ponta (%2$s) - %1$s deseja iniciar uma chamada em grupo - Chamada em grupo iniciada - Chamada em grupo encerrada - (a foto de perfil também foi alterada) - %1$s removeu o nome da sala - %1$s removeu a descrição da sala - %1$s atualizou o perfil %2$s - %1$s enviou um convite para %2$s entrar na sala - %1$s aceitou o convite para %2$s - ** Não foi possível descriptografar: %s ** - O aparelho do remetente não nos enviou as chaves para esta mensagem. - - Não foi possível redigir - Não foi possível enviar a mensagem - O envio da imagem falhou - - Erro de conexão à internet - Erro no servidor Matrix - - - - - Atualmente, não é possível entrar novamente em uma sala vazia. - Mensagem criptografada - - Endereço de e-mail - Número de telefone - %1$s enviou uma figurinha. - - Convite de %s - Convite para sala - %1$s e %2$s - Sala vazia - - %1$s e 1 outro - %1$s e %2$d outros - - Você enviou uma foto. - Você enviou uma figurinha. - Seu convite - %1$s criou a sala - Você criou a sala - Você convidou %1$s - Você entrou na sala - Você saiu da sala - Você recusou o convite - Você removeu %1$s - Você removeu o banimento de %1$s - Você baniu %1$s - Você desfez o convite a %1$s - Você alterou a sua foto de perfil - Você definiu o seu nome e sobrenome como %1$s - Você alterou o seu nome e sobrenome de %1$s para %2$s - Você removeu o seu nome e sobrenome (era %1$s) - Você alterou a descrição para: %1$s - %1$s alterou a foto da sala - Você alterou a foto da sala - Você alterou o nome da sala para: %1$s - Você iniciou uma chamada de vídeo. - Você iniciou uma chamada de voz. - %s enviou dados para configurar a chamada. - Você enviou dados para configurar a chamada. - Você aceitou a chamada. - Você encerrou a chamada. - Você deixou o histórico futuro da sala visível para %1$s - Você ativou a criptografia de ponta a ponta (%1$s) - %s atualizou esta sala. - Você atualizou esta sala. - Você solicitou uma chamada em grupo - Você removeu o nome da sala - Você removeu a descrição da sala - %1$s removeu a foto da sala - Você removeu a foto da sala - Mensagem apagada - Mensagem apagada por %1$s - Mensagem apagada [motivo: %1$s] - Mensagem apagada por %1$s [motivo: %2$s] - Você atualizou o seu perfil %1$s - Você enviou um convite para %1$s entrar na sala - %1$s cancelou o convite a %2$s para entrar na sala - Você cancelou o convite a %1$s para entrar na sala - Você aceitou o convite para %1$s - %1$s adicionou o widget %2$s - Você adicionou o widget %1$s - %1$s removeu o widget %2$s - Você removeu o widget %1$s - %1$s editou o widget %2$s - Você editou o widget %1$s - Administrador - Moderador - Padrão - Personalizado (%1$d) - Personalizado - Você alterou o nível de permissão de %1$s. - %1$s alterou o nível de permissão de %2$s. - %1$s de %2$s para %3$s - Primeira sincronização: -\nImportando a conta… - Primeira sincronização: -\nImportando as chaves de criptografia - Primeira sincronização: -\nImportando as salas - Primeira sincronização: -\nImportando as salas em que você entrou - Primeira sincronização: -\nImportando as salas em que você foi convidado - Primeira sincronização: -\nImportando as salas em que você saiu - Primeira sincronização: -\nImportando as comunidades - Primeira sincronização: -\nImportando os dados da conta - Enviando mensagem… - Limpar a fila de envio - Convite de %1$s. Motivo: %2$s - O seu convite. Motivo: %1$s - %1$s convidou %2$s. Motivo: %3$s - Você convidou %1$s. Motivo: %2$s - %1$s convidou você. Motivo: %2$s - %1$s entrou na sala. Motivo: %2$s - Você entrou na sala. Motivo: %1$s - %1$s saiu da sala. Motivo: %2$s - Você saiu da sala. Motivo: %1$s - %1$s recusou o convite. Motivo: %2$s - Você recusou o convite. Motivo: %1$s - %1$s removeu %2$s. Motivo: %3$s - Você removeu %1$s. Motivo: %2$s - %1$s removeu o banimento de %2$s. Motivo: %3$s - Você removeu o banimento de %1$s. Motivo: %2$s - %1$s baniu %2$s. Motivo: %3$s - Você baniu %1$s. Motivo: %2$s - %1$s enviou um convite para %2$s entrar na sala. Motivo: %3$s - Você enviou um convite para %1$s entrar na sala. Motivo: %2$s - %1$s revogou o convite para %2$s entrar na sala. Motivo: %3$s - Você revogou o convite para %1$s entrar na sala. Motivo: %2$s - %1$s aceitou o convite para %2$s. Motivo: %3$s - Você aceitou o convite para %1$s. Motivo: %2$s - %1$s desfez o convite de %2$s. Motivo: %3$s - Você desfez o convite de %1$s. Motivo: %2$s - - %1$s adicionou %2$s como um endereço desta sala. - %1$s adicionou %2$s como endereços desta sala. - - - Você adicionou %1$s como um endereço desta sala. - Você adicionou %1$s como endereços desta sala. - - - %1$s removeu %2$s como um endereço desta sala. - %1$s removeu %2$s como endereços desta sala. - - - Você removeu %1$s como um endereço desta sala. - Você removeu %1$s como endereços desta sala. - - %1$s adicionou %2$s e removeu %3$s como endereços desta sala. - Você adicionou %1$s e removeu %2$s como endereços desta sala. - %1$s definiu o endereço principal desta sala como %2$s. - Você definiu o endereço principal desta sala como %1$s. - %1$s removeu o endereço principal desta sala. - Você removeu o endereço principal desta sala. - %1$s permitiu que convidados entrem na sala. - Você permitiu que convidados entrem na sala. - %1$s impediu que convidados entrassem na sala. - Você impediu que convidados entrassem na sala. - %1$s ativou a criptografia de ponta a ponta. - Você ativou a criptografia de ponta a ponta. - %1$s ativou a criptografia de ponta a ponta (algoritmo não reconhecido %2$s). - Você ativou a criptografia de ponta a ponta (algoritmo não reconhecido %1$s). - %s deseja confirmar a sua chave, mas o seu aplicativo não suporta a confirmação da chave da conversa. Você precisará usar a confirmação tradicional de chaves para confirmar chaves. - Você impediu que desconhecidos entrem na sala. - %1$s impediu que desconhecidos entrem na sala. - Você permitiu que desconhecidos entrem aqui. - %1$s permitiu que desconhecidos entrem aqui. - Você saiu. Motivo: %1$s - %1$s saiu. Motivo: %2$s - Você entrou. Motivo: %1$s - %1$s entrou. Motivo: %2$s - Você cancelou o convite para %1$s - %1$s cancelou o convite para %2$s - Você convidou %1$s - %1$s convidou %2$s - Você atualizou esta sala. - %s atualizou esta sala. - Você definiu que as mensagens enviadas a partir do presente momento estarão disponíveis para %1$s - %1$s definiu que as mensagens enviadas a partir do presente momento estarão disponíveis para %2$s - Você saiu da sala - %1$s saiu da sala - Você entrou - %1$s entrou - Você criou a sala - %1$s criou a sala - Sala vazia (era %s) - - %1$s, %2$s, %3$s e %4$d outro - %1$s, %2$s, %3$s e %4$d outros - - %1$s, %2$s, %3$s e %4$s - %1$s, %2$s e %3$s - 🎉 Todos os servidores estão proibidos de participar! Esta sala não pode mais ser usada. - Nenhuma alteração. - • Servidores correspondentes aos IP literais agora estão banidos. - • Servidores correspondentes aos IP literais agora estão permitidos. - • Servidores correspondentes à %s foram removidos da lista de permitidos. - • Servidores correspondentes à %s agora são permitidos. - • Servidores correspondente à %s foram removidos da lista de banidos. - • Servidores correspondentes à %s foram banidos. - Você alterou a lista de controle de acesso (ACL) do servidor para esta sala. - %s alterou a lista de controle de acesso (ACL) do servidor para esta sala. - • Servidores correspondentes aos IP literais estão banidos. - • Servidores correspondentes aos IP literais estão permitidos. - • Servidores correspondentes à %s estão permitidos. - • Servidores correspondentes à %s estão banidos. - Você definiu a lista de controle de acesso (ACL) do servidor para esta sala. - %s definiu a lista de controle de acesso (ACL) do servidor para esta sala. - Você alterou os endereços alternativos desta sala. - %1$s alterou os endereços alternativos desta sala. - - Você removeu o endereço alternativo %1$s para esta sala. - Você removeu os endereços alternativos %1$s para esta sala. - - - %1$s removeu o endereço alternativo %2$s para esta sala. - %1$s removeu os endereços alternativos %2$s para esta sala. - - - Você adicionou o endereço alternativo %1$s para esta sala. - Você adicionou os endereços alternativos %1$s para esta sala. - - - %1$s adicionou o endereço alternativo %2$s para esta sala. - %1$s adicionou os endereços alternativos %2$s para esta sala. - - Você alterou os endereços desta sala. - %1$s alterou os endereços desta sala. - Você alterou os endereços principal e alternativos desta sala. - %1$s alterou os endereços principal e alternativos desta sala. - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-pt/strings.xml b/matrix-sdk-android/src/main/res/values-pt/strings.xml deleted file mode 100644 index 4bc90cf0cb..0000000000 --- a/matrix-sdk-android/src/main/res/values-pt/strings.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - %1$s: %2$s - %1$s enviou uma imagem. - - convite de %s - %1$s convidou %2$s - %1$s convidou-o - %1$s entrou - %1$s saiu - %1$s recusou o convite - %1$s expulsou %2$s - %1$s des-baniu %2$s - %1$s baniu %2$s - %1$s cancelou o convite de %2$s - %1$s mudou o seu avatar - %1$s definiu seu nome público como %2$s - %1$s alterou seu nome público de %2$s para %3$s - %1$s apagou o seu nome público (%2$s) - %1$s alterou o tópico desta sala para: %2$s - %1$s alterou o nome desta sala para: %2$s - %s iniciou uma chamada de vídeo. - %s iniciou uma chamada de voz. - %s respondeu à chamada. - %s terminou a chamada. - %1$s tornou o histórico futuro desta sala visível para %2$s - todas os membros que integram esta sala, a partir do momento em que foram convidados. - todas os membros da sala, a partir do momento em que entraram. - todas os membros da sala. - todos. - desconhecida (%s). - %1$s ativou a criptografia ponta-a-ponta (%2$s) - - %1$s solicitou uma conferência VoIP - A conferência VoIP começou - A conferência VoIP terminou - - (o avatar também foi alterado) - %1$s removeu o nome da sala - %1$s removeu o tópico da sala - %1$s atualizou o seu perfil %2$s - %1$s enviou um convite para que %2$s se junte à sala - %1$s aceitou o convite para %2$s - - ** Impossível decifrar: %s ** - O dispositivo de quem enviou a mensagem não nos enviou as chaves para esta mensagem. - - - Não foi possível apagar - Não foi possível enviar a mensagem - - O envio da imagem falhou - - - Erro de conexão à Internet - Erro do Matrix - - - - - - - - - Ainda não é possível voltar a entrar numa sala vazia. - - Mensagem cifrada - - - Endereço de e-mail - Número de telefone - - - Convite de %s - Convite para sala - %1$s e %2$s - Sala vazia - - - %1$s enviou um sticker. - - %s fez o upgrade da sala. - - Mensagem removida - Mensagem removida por %1$s - diff --git a/matrix-sdk-android/src/main/res/values-ru/strings.xml b/matrix-sdk-android/src/main/res/values-ru/strings.xml deleted file mode 100644 index f2e0bd668f..0000000000 --- a/matrix-sdk-android/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,285 +0,0 @@ - - - %1$s: %2$s - %1$s отправил(а) изображение. - %s приглашение - %1$s пригласил(а) %2$s - %1$s пригласил(а) вас - %1$s вошёл(ла) в комнату - %1$s покинул(а) комнату - %1$s отклонил(а) приглашение - %1$s выгнан %2$s - %1$s разблокировал(а) %2$s - %1$s заблокировал(а) %2$s - %1$s отозвал(а) приглашение %2$s - %1$s изменил(а) свой аватар - %1$s установил(а) имя %2$s - %1$s изменил(а) имя с %2$s на %3$s - %1$s удалил(а) свое имя (%2$s) - %1$s изменил(а) тему на: %2$s - %1$s изменил(а) название комнаты: %2$s - %s начал(а) видеовызов. - %s начал(а) голосовой вызов. - %s ответил(а) на звонок. - %s завершил(а) вызов. - %1$s сделал(а) будущую историю комнаты видимой %2$s - всем членам, с момента их приглашения. - всем членам, с момента присоединения. - всем членам. - всем. - неизвестно (%s). - %1$s включил(а) сквозное шифрование (%2$s) - %1$s запросил(а) VoIP конференцию - VoIP-конференция начата - VoIP-конференция завершена - (аватар также был изменен) - %1$s удалил(а) название комнаты - %1$s удалил(а) тему комнаты - %1$s обновил(а) свой профиль %2$s - %1$s отправил(а) приглашение %2$s присоединиться к комнате - %1$s принял(а) приглашение от %2$s - ** Невозможно расшифровать: %s ** - Устройство отправителя не предоставило нам ключ для расшифровки этого сообщения. - - Не удалось изменить - Не удалось отправить сообщение - Не удалось загрузить изображение - - Сетевая ошибка - Ошибка Matrix - - - - - В настоящее время невозможно вновь присоединиться к пустой комнате. - Зашифрованное сообщение - - Адрес электронной почты - Номер телефона - %1$s отправил стикер. - - Приглашение от %s - Приглашение в комнату - %1$s и %2$s - Пустая комната - - %1$s и 1 другой - %1$s и %2$d другие - %1$s и %2$d других - - - Сообщение удалено - %1$s удалил(а) сообщение - Сообщение удалено [причина: %1$s] - %1$s удалил(а) сообщение [причина: %2$s] - Начальная синхронизация: -\nИмпорт учетной записи… - Начальная синхронизация: -\nИмпорт криптографии - Начальная синхронизация: -\nИмпорт комнат - Синхронизация начата: -\nИмпорт присоединенных комнат - Синхронизация начата: -\nИмпорт приглашенных комнат - Начальная синхронизация: -\nИмпорт покинутых комнат - Начальная синхронизация: -\nИмпорт сообществ - Начальная синхронизация: -\nИмпорт данных учетной записи - %s обновил эту комнату. - Отправка сообщения… - Очистить очередь отправки - %1$s отозвал приглашение %2$s присоединиться к комнате - Приглашение %1$s. Причина: %2$s - %1$s приглашен %2$s. Причина: %3$s - %1$s пригласил вас. Причина: %2$s - %1$s вошёл(ла) в комнату. Причина: %2$s - %1$s покинул(а) комнату. Причина: %2$s - %1$s отклонил приглашение. Причина: %2$s - %1$s выгнали %2$s. Причина: %3$s - %1$s разблокировано %2$s. Причина: %3$s - %1$s забанен %2$s. Причина: %3$s - %1$s отправил приглашение %2$s в комнату. Причина: %3$s - %1$s отозвал приглашение %2$s присоединиться к комнате. Причина: %3$s - %1$s принял приглашение для %2$s. Причина: %3$s - %1$s отозвал приглашение %2$s. Причина: %3$s - %1$s создал(а) комнату - - %1$s добавил(а) %2$s в качестве адреса для этой комнаты. - %1$s добавил(а) %2$s в качестве адресов для этой комнаты. - %1$s добавил(а) %2$s в качестве адресов для этой комнаты. - - - %1$s удалил(а) адрес %2$s для комнаты. - %1$s удалил(а) адреса %2$s для комнаты. - %1$s удалил(а) адреса %2$s для комнаты. - - %1$s добавил(а) адреса %2$s и удалил(а) %3$s для комнаты. - %1$s сделал(а) %2$s главным адресом комнаты. - %1$s удалил(а) главный адрес комнаты. - %1$s разрешил(а) гостям входить в комнату. - %1$s запретил(а) гостям входить в комнату. - %1$s включил(а) сквозное шифрование. - %1$s включил(а) сквозное шифрование (неизвестный алгоритм %2$s). - %s запрашивает подтверждение вашего ключа, но ваш клиент не поддерживает подтверждение в чате. Используйте устаревшую проверку для сверки ключей. - Вы отправили изображение. - Вы отправили стикер. - Ваше приглашение - Вы создали комнату - Вы пригласили %1$s - Вы вошли в комнату - Вы покинули комнату - Вы отклонили приглашение - Вы выгнали %1$s - Вы разбанили %1$s - Вы забанили %1$s - Вы отозвали приглашение %1$s - Вы сменили свой аватар - Вы сменили своё отображаемое имя на %1$s - Вы сменили своё отображаемое имя с %1$s на %2$s - Вы удалили своё отображаемое имя (%1$s) - Вы сменили тему на: %1$s - Вы сменили название комнаты на: %1$s - Вы начали видеозвонок. - Вы начали звонок. - Вы ответили на звонок. - Вы закончили звонок. - Вы сделали будущую историю комнаты видимой для %1$s - Вы включили сквозное шифрование (%1$s) - Вы обновили эту комнату. - Вы начали групповой звонок - Вы удалили название комнаты - Вы удалили тему комнаты - Вы обновили свой профиль %1$s - Вы отправили %1$s приглашение в эту комнату - Вы отозвали у %1$s приглашение в эту комнату - Вы приняли приглашение для %1$s - %1$s добавил(а) виджет %2$s - Вы добавили виджет %1$s - %1$s удалил(а) виджет %2$s - Вы удалили виджет %1$s - %1$s изменил(а) виджет %2$s - Вы изменили виджет %1$s - Администратор - Модератор - По умолчанию - Пользовательский (%1$d) - Пользовательский - Вы изменили уровни доступа %1$s. - %1$s изменил(а) уровни доступа %2$s. - %1$s с %2$s на %3$s - Ваше приглашение. Причина: %1$s - Вы пригласили %1$s. Причина: %2$s - Вы вошли в комнату. Причина: %1$s - Вы покинули комнату. Причина: %1$s - Вы отклонили приглашение. Причина: %1$s - Вы выгнали %1$s. Причина: %2$s - Вы разбанили %1$s. Причина: %2$s - Вы забанили %1$s. Причина: %2$s - Вы отправили %1$s приглашение в эту комнату. Причина: %2$s - Вы отозвали у %1$s приглашение в эту комнату. Причина: %2$s - Вы приняли приглашение для %1$s. Причина: %2$s - Вы отозвали приглашение %1$s. Причина: %2$s - - Вы добавили адрес %1$s для этой комнаты. - Вы добавили %1$s в качестве адресов для этой комнаты. - Вы добавили %1$s в качестве адресов для этой комнаты. - - - Вы удалили адрес этой комнаты: %1$s. - Вы удалили адреса этой комнаты: %1$s. - Вы удалили адреса этой комнаты: %1$s. - - Вы добавили адреса %1$s и удалили %2$s для этой комнаты. - Вы задали главный адрес этой комнаты %1$s. - Вы удалили главный адрес этой комнаты. - Вы разрешили гостям входить в комнату. - Вы запретили гостям входить в комнату. - Вы включили сквозное шифрование. - Вы включили сквозное шифрование (неизвестный алгоритм %1$s). - %1$s изменил(а) аватар комнаты - Вы изменили аватар комнаты - %s отправил(а) данные для начала звонка. - Вы отправили данные для начала звонка. - %1$s удалил(а) аватар комнаты - Вы удалили аватар комнаты - Вы запретили гостям входить в комнату. - %1$s запретил(а) гостям входить в комнату. - Вы разрешили гостям присоединяться сюда. - %1$s разрешил(а) гостям присоединиться сюда. - Вы вышли. Причина: %1$s - %1$s вышел(-ла). Причина: %2$s - Вы вошли. Причина: %1$s - %1$s вошел(-ла). Причина: %2$s - Вы отозвали приглашение %1$s - %1$s отозвал(а) приглашение %2$s - Вы пригласили %1$s - %1$s пригласил(а) %2$s - Вы сделали будущие сообщения видимыми для %1$s - %1$s сделал(а) будущие сообщения видимыми для %2$s - Вы покинули комнату - %1$s покинул(а) комнату - Вы вошли - %1$s вошел(ла) - Вы создали обсуждение - %1$s создал(а) обсуждение - Вы обновили эту комнату. - %s обновил(а) эту комнату. - - %1$s, %2$s, %3$s и %4$d другой - %1$s, %2$s, %3$s и %4$d других - %1$s, %2$s, %3$s и %4$d другие - %1$s, %2$s, %3$s и %4$d другие - - %1$s, %2$s, %3$s и %4$s - %1$s, %2$s и %3$s - 🎉 Всем серверам запрещено участвовать! Эта комната больше не может быть использована. - Без изменений. - Пустая комната (была %s) - • Соответствующий сервер %s заблокирован. - • Сервер, соответствующий буквальным IP-адресам, теперь запрещён. - • Сервер, соответствующий буквальным IP-адресам, теперь разрешён. - • Сервер, соответствующий %s, теперь запрещён. - • Сервер, соответствующий %s, теперь разрешён. - • Сервер, соответствующий %s, был удалён из списка блокировки. - • Сервер, соответствующий буквальным IP-адресам, запрещён. - • Сервер, соответствующий буквальным IP-адресам, разрешён. - • Сервер, соответствующий %s, разрешён. - • Сервер, соответствующий %s, был удалён из разрешённого списка. - Вы изменили права доступа сервера (ACL) для этой комнаты. - %s изменил права доступа сервера (ACL) для этой комнаты. - Вы настроили права доступа сервера (ACL) для этой комнаты. - %s устанавливает права доступа сервера (ACL) для этой комнаты. - Вы изменили адреса этой комнаты. - %1$s изменил(а) адреса этой комнаты. - Вы изменили основной и альтернативный адреса этой комнаты. - %1$s изменил(а) основной и альтернативный адреса этой комнаты. - Вы изменили альтернативные адреса для этой комнаты. - %1$s изменил(а) альтернативные адреса для этой комнаты. - - Вы удалили альтернативный адрес %1$s для этой комнаты. - Вы удалили альтернативные адреса %1$s для этой комнаты. - Вы удалили альтернативные адреса %1$s для этой комнаты. - Вы удалили альтернативные адреса %1$s для этой комнаты. - - - %1$s удалил(а) альтернативный адрес %2$s для этой комнаты. - %1$s удалил(а) альтернативные адреса %2$s для этой комнаты. - %1$s удалил(а) альтернативные адреса %2$s для этой комнаты. - %1$s удалил(а) альтернативные адреса %2$s для этой комнаты. - - - Вы добавили альтернативный адрес %1$s для этой комнаты. - Вы добавили альтернативные адреса %1$s для этой комнаты. - Вы добавили альтернативные адреса %1$s для этой комнаты. - Вы добавили альтернативные адреса %1$s для этой комнаты. - - - %1$s добавил(а) альтернативный адрес %2$s для этой комнаты. - %1$s добавил(а) альтернативные адреса %2$s для этой комнаты. - %1$s добавил(а) альтернативные адреса %2$s для этой комнаты. - %1$s добавил(а) альтернативные адреса %2$s для этой комнаты. - - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-si/strings_sas.xml b/matrix-sdk-android/src/main/res/values-si/strings_sas.xml new file mode 100644 index 0000000000..7ea72d2a4d --- /dev/null +++ b/matrix-sdk-android/src/main/res/values-si/strings_sas.xml @@ -0,0 +1,8 @@ + + + + බල්ලා + පූසා + සිංහයා + අශ්වයා + diff --git a/matrix-sdk-android/src/main/res/values-sk/strings.xml b/matrix-sdk-android/src/main/res/values-sk/strings.xml deleted file mode 100644 index a40654f7bf..0000000000 --- a/matrix-sdk-android/src/main/res/values-sk/strings.xml +++ /dev/null @@ -1,212 +0,0 @@ - - - %1$s: %2$s - %1$s poslal/a obrázok. - Pozvanie od %s - %1$s pozval/a %2$s - %1$s vás pozval/a - %1$s vstúpil/a do miestnosti - %1$s opustil/a miestnosť - %1$s odmietol/a pozvanie - %1$s vykázal/a %2$s - %1$s povolil/a vstupovať %2$s - %1$s zakázal/a vstupovať %2$s - %1$s vzal/a späť pozvanie %2$s - %1$s si zmenil/a obrázok v profile - %1$s si nastavil/a zobrazované meno %2$s - %1$s si zmenil/a zobrazované meno %2$s na %3$s - %1$s odstránil/a svoje zobrazované meno (%2$s) - %1$s zmenil/a tému na: %2$s - %1$s zmenil/a názov miestnosti na: %2$s - %s uskutočnil/a video hovor. - %s zatelefonoval/a. - %s prijal/a hovor. - %s ukončil/a hovor. - %1$s sprístupnil/a budúcu históriu miestnosti %2$s - pre všetkých členov, od kedy boli pozvaní. - pre všetkých členov, od kedy vstúpili. - pre všetkých členov. - pre každého. - neznámym (%s). - %1$s povolil/a E2E šifrovanie (%2$s) - %1$s požiadal/a o VoIP konferenciu - Začala sa VoIP konferencia - Skončila sa VoIP konferencia - (aj obrázok v profile) - %1$s odstránil/a názov miestnosti - %1$s odstránil/a tému miestnosti - %1$s aktualizoval/a svoj profil %2$s - %1$s pozval/a %2$s vstúpiť do miestnosti - %1$s prijal/a pozvanie pre %2$s - ** Nie je možné dešifrovať: %s ** - Zo zariadenia odosieľateľa nebolo možné získať kľúče potrebné na dešifrovanie tejto správy. - Nie je možné vymazať - Nie je možné odoslať správu - Nepodarilo sa nahrať obrázok - Chyba siete - Chyba Matrix - V súčasnosti nie je možné znovu vstúpiť do prázdnej miestnosti. - Šifrovaná správa - Emailová adresa - Telefónne číslo - %1$s poslal/a nálepku. - Pozvanie od %s - Pozvanie do miestnosti - %1$s a %2$s - Prázdna miestnosť - - %1$s a 1 ďalší - %1$s a %2$d ďalší - %1$s a %2$d ďalších - - - %s aktualizoval/a túto miestnosť. - Odstránená správa - Odstránená správa používateľom %1$s - Odstránená správa [dôvod: %1$s] - Odstránená správa používateľom %1$s [dôvod: %2$s] - Úvodná synchronizácia: -\nPrebieha import účtu… - Úvodná synchronizácia: -\nPrebieha import šifrovacích kľúčov - Úvodná synchronizácia: -\nPrebieha import miestností - Úvodná synchronizácia: -\nPrebieha import miestností, do ktorých ste vstúpili - Úvodná synchronizácia: -\nPrebieha import pozvaní - Úvodná synchronizácia: -\nPrebieha import opustených miestností - Úvodná synchronizácia: -\nPrebieha import komunít - Úvodná synchronizácia: -\nPrebieha import údajov účtu - Odosielanie správy… - Vymazať správy na odoslanie - %1$s zamietol/a pozvanie používateľa %2$s vstúpiť do miestnosti - Pozvanie od %1$s. Dôvod: %2$s - %1$s pozval/a %2$s. Dôvod: %3$s - %1$s vás pozval/a. Dôvod: %2$s - %1$s vstúpil/a do miestnosti. Dôvod: %2$s - %1$s opustil/a miestnosť. Dôvod: %2$s - %1$s odmietol/a pozvanie. Dôvod: %2$s - %1$s vykázal/a %2$s. Dôvod: %3$s - %1$s povolil/a vstupovať %2$s. Dôvod: %3$s - %1$s zakázal/a vstupovať %2$s. Dôvod: %3$s - %1$s pozval/a %2$s vstúpiť do miestnosti. Dôvod: %3$s - %1$s zamietol/a pozvanie používateľa %2$s vstúpiť do miestnosti. Dôvod: %3$s - %1$s prijal/a pozvanie pre %2$s. Dôvod: %3$s - %1$s vzal/a späť pozvanie %2$s. Dôvod: %3$s - - %1$s pridal/a adresu %2$s pre túto miestnosť. - %1$s pridal/a adresy %2$s pre túto miestnosť. - %1$s pridal/a adresy %2$s pre túto miestnosť. - - - %1$s odstránil/a adresu %2$s pre túto miestnosť. - %1$s odstránil/a adresy %3$s pre túto miestnosť. - %1$s odstránil/a adresy %3$s pre túto miestnosť. - - %1$s pridal/a adresy %2$s a odstránil/a adresy %3$s pre túto miestnosť. - %1$s nastavil/a hlavnú adresu tejto miestnosti %2$s. - %1$s odstránil/a hlavnú adresu tejto miestnosti. - %1$s povolil/a hosťom///návštevníkom prístup do tejto miestnosti. - Poslali ste obrázok. - Poslali ste nálepku. - Pozvanie od vás - %1$s vytvoril/a miestnosť - Vytvorili ste miestnosť - Pozvali ste %1$s - Vstúpili ste do miestnosti - Opustili ste miestnosť - Odmietli ste pozvanie - Vykázali ste %1$s - Povolili ste vstupovať %1$s - Zakázali ste vstupovať %1$s - Vzali ste späť pozvanie %1$s - Zmenili ste si obrázok v profile - Nastavili ste si zobrazované meno %1$s - Zmenili ste si zobrazované meno %1$s na %2$s - Odstránili ste svoje zobrazované meno %1$s - Zmenili ste tému na: %1$s - %1$s zmenil/a obrázok miestnosti - Zmenili ste obrázok miestnosti - Zmenili ste názov miestnosti na: %1$s - Uskutočnili ste video hovor. - Zatelefonovali ste. - %s poslal údaje pre nastavenie hovoru. - Poslali ste údaje na nastavenie hovoru. - Prijali ste hovor. - Ukončili ste hovor. - Sprístupnili ste budúcu históriu miestnosti %1$s - Povolili ste E2E šifrovanie (%1$s) - Aktualizovali ste túto miestnosť. - Požiadali ste o VoIP konferenciu - Odstránili ste názov miestnosti - Odstránili ste tému miestnosti - %1$s odstránil obrázok miestnosti - Odstránili ste obrázok miestnosti - Aktualizovali ste svoj profil %1$s - Pozvali ste %1$s vstúpiť do miestnosti - Zamietli ste pozvanie používateľa %1$s vstúpiť do miestnosti - Prijali ste pozvanie pre %1$s - %1$s pridal/a widget %2$s - Pridali ste widget %1$s - %1$s odstránil/a widget %2$s - Odstránili ste widget %1$s - %1$s upravil/a widget %2$s - Upravili ste widget %1$s - Správca - Moderátor - Predvolený - Vlastná úroveň (%1$d) - Vlastná úroveň - Zmenili ste úroveň moci používateľa %1$s. - %1$s zmenil úroveň moci používateľa %2$s. - %1$s z %2$s na %3$s - Pozvanie od vás. Dôvod: %1$s - Pozvali ste %1$s. Dôvod: %2$s - Vstúpili ste do miestnosti. Dôvod: %1$s - Opustili ste miestnosť. Dôvod: %1$s - Odmietli ste pozvanie. Dôvod: %1$s - Vykázali ste %1$s. Dôvod: %2$s - Povolili ste vstupovať %1$s. Dôvod: %2$s - Zakázali ste vstupovať %1$s. Dôvod: %2$s - Pozvali ste %1$s vstúpiť do miestnosti. Dôvod: %2$s - Zamietli ste pozvanie používateľa %1$s vstúpiť do miestnosti. Dôvod: %2$s - Prijali ste pozvanie pre %1$s. Dôvod: %2$s - Vzali ste späť pozvanie %1$s. Dôvod: %2$s - - Pridali ste adresu %1$s pre túto miestnosť. - Pridali ste adresy %1$s pre túto miestnosť. - Pridali ste adresy %1$s pre túto miestnosť. - - - Odstránili ste adresu %1$s pre túto miestnosť. - Odstránili ste adresy %1$s pre túto miestnosť. - Odstránili ste adresy %1$s pre túto miestnosť. - - Pridali ste %1$s a odstránili adresy %2$s pre túto miestnosť. - Nastavili ste hlavnú adresu tejto miestnosti %1$s. - Odstránili ste hlavnú adresu tejto miestnosti. - Povolili ste hosťom///návštevníkom prístup do tejto miestnosti. - %1$s zakázal/a hosťom///návštevníkom prístup do tejto miestnosti. - Zakázali ste hosťom///návštevníkom prístup do tejto miestnosti. - %1$s povolil/a E2E šifrovanie. - Povolili ste E2E šifrovanie. - %1$s povolil/a E2E šifrovanie (Nerozpoznaný algorytmus %2$s). - Povolili ste E2E šifrovanie (Nerozpoznaný algorytmus %1$s). - %s požaduje overenie vašich šifrovacích kľúčov, ale váš klient nepodporuje overenie kľúčov v konverzácii. Budete musieť použiť zastaralú metódu overenia. - nastavili ste na servery pravidlá ACL tejto miestnosti. - %s nastavil(a) na servery pravidlá ACL tejto miestnosti. - Aktualizovali ste sem. - %s aktualizoval(a) sem. - %1$s sprístupnil(a) budúce správy %2$s - Sprístupnili ste budúce správy %1$s - Opustili ste miestnosť - %1$s opustil(a) miestnosť - Vstúpili ste - %1$s vstúpil(a) - Vytvorili ste konverzáciu - %1$s vytvoril(a) konverzáciu - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-sq/strings.xml b/matrix-sdk-android/src/main/res/values-sq/strings.xml deleted file mode 100644 index 0d4b2888ba..0000000000 --- a/matrix-sdk-android/src/main/res/values-sq/strings.xml +++ /dev/null @@ -1,257 +0,0 @@ - - - %1$s: %2$s - %1$s dërgoi një figurë. - %1$s ftoi %2$s - %1$s ju ftoi - %1$s hyri në dhomë - %1$s doli nga dhoma - %1$s hodhi tej ftesën - %1$s përzuri %2$s - %1$s dëboi %2$s - %1$s ndryshoi avatarin e vet - %1$s ndryshoi temën në: %2$s - %1$s ndryshoi emrin e dhomës në: %2$s - %s bëri një thirrje video. - %s bëri një thirrje zanore. - %s iu përgjigj thirrjes. - %s e përfundoi thirrjen. - %1$s e bëri historikun e ardhshëm të dhomës të dukshëm për %2$s - për krejt anëtarët e dhomës, prej çastit kur janë ftuar. - për krejt anëtarët e dhomës, prej çastit kur morën pjesë. - krejt anëtarët e dhomës. - cilido. - e panjohur (%s). - %1$s kërkoi një konferencë VoIP - Konferenca VoIP filloi - Konferenca VoIP përfundoi - (u ndryshua edhe avatari) - %1$s hoqi emrin e dhomës - %1$s përditësoi profilin e tij %2$s - %1$s pranoi ftesën tuaj për %2$s - ** S’arrihet të shfshehtëzohet: %s ** - Pajisja e dërguesit nuk na ka dërguar kyçet për këtë mesazh. - S’u redaktua dot - S’arrihet të dërgohet mesazh - Ngarkimi i figurës dështoi - Gabim rrjeti - Gabim Matrix - Hëpërhë s’është e mundur të rihyhet në një dhomë të zbrazët. - Mesazh i fshehtëzuar - Adresë email - Numër telefoni - Ftesë nga %s - Ftesë Dhome - %1$s dhe %2$s - Dhomë e zbrazët - %1$s dërgoi një ngjitës. - Ftesë e %s - %1$s hoqi dëbimin për %2$s - %1$s tërhoqi mbrapsht ftesën për %2$s - %1$s caktoi për veten emër ekrani %2$s - %1$s ndryshoi emrin e tyre në ekran nga %2$s në %3$s - %1$s hoqi emrin e tij në ekran (%2$s) - %1$s aktivizoi fshehtëzim skaj-më-skaj (%2$s) - %1$s hoqi temën e dhomës - %1$s dërgoi një ftesë për %2$s që të marrë pjesë në dhomë - - %1$s dhe 1 tjetër - %1$s dhe %2$d të tjerë - - Mesazhi u hoq - Mesazhi u hoq nga %1$s - Mesazh i hequr [arsye: %1$s] - Mesazh i hequr nga %1$s [arsye: %2$s] - %s e përmirësoi këtë dhomë. - Njëkohësimi Fillestar: -\nPo importohet llogaria… - Njëkohësimi Fillestar: -\nPo importohet kriptografi - Njëkohësimi Fillestar: -\nPo importohen Dhoma - Njëkohësimi Fillestar: -\nPo importohen Dhoma Ku Është Bërë Hyrje - Njëkohësimi Fillestar: -\nPo importohen Dhoma Me Ftesë - Njëkohësimi Fillestar: -\nPo importohen Dhoma të Braktisura - Njëkohësimi Fillestar: -\nPo importohen Bashkësi - Njëkohësimi Fillestar: -\nPo importohet të Dhëna Llogarie - Po dërgohet mesazh… - Spastro radhë pritjeje - %1$s shfuqizoi ftesën për %2$s për pjesëmarrje te dhoma - Ftesë e %1$s. Arsye: %2$s - %1$s ftoi %2$s. Arsye: %3$s - %1$s ju ftoi. Arsye: %2$s - %1$s erdhi në dhomë. Arsye: %2$s - %1$s doli nga dhoma. Arsye: %2$s - %1$s hodhi poshtë ftesën. Arsye: %2$s - %1$s përzuri %2$s. Arsye: %3$s - %1$s hoqi dëbimin për %2$s. Arsye: %3$s - %1$s dëboi %2$s. Arsye: %3$s - %1$s dërgoi një ftesë për %2$s për të ardhur në dhomë. Arsye: %3$s - %1$s shfuqizoi ftesën për %2$s për të ardhur në dhomë. Arsye: %3$s - %1$s pranoi ftesën për %2$s. Arsye: %3$s - %1$s tërhoqi mbrapsht ftesën për %2$s. Arsye: %3$s - - %1$s shtoi %2$s si një adresë për këtë dhomë. - %1$s shtoi %2$s si adresa për këtë dhomë. - - - %1$s hoqi %2$s si adresë për këtë dhomë. - %1$s hoqi %2$s si adresa për këtë dhomë. - - %1$s shtoi %2$s dhe hoqi %3$s si adresa për këtë dhomë. - %1$s caktoi %2$s si adresë kryesore për këtë dhomë. - %1$s hoqi adresën kryesore për këtë dhomë. - %1$s ka lejuar vizitorë të marrin pjesë në dhomë. - %1$s ka penguar vizitorë të marrin pjesë në dhomë. - %1$s aktivizoi fshehtëzim skaj-më-skaj. - %1$s aktivizoi fshehtëzim skaj-më-skaj (algoritëm i papranuar %2$s). - %s po kërkon të verifikojë kyçin tuaj, por klienti juaj nuk mbulon verifikim kyçesh brenda fjalosjeje. Që të verifikoni kyça, do t’ju duhet të përdorni verifikim të dikurshëm kyçesh. - %1$s krijo dhomën - Dërguat një figurë. - Dërguat një ngjitës. - Ftesa juaj - Krijuat dhomën - Ftuat %1$s - Hytë në dhomë - Dolët nga dhoma - Hodhët poshtë ftesën - Përzutë %1$s - Hoqët dëbimin për %1$s - Dëbuat %1$s - Tërhoqët mbrapsht ftesën për %1$s - Ndryshuat avatarin tuaj - Caktuat si emrin tuaj në ekran %1$s - E ndryshuat emrin tuaj në ekran nga %1$s në %2$s - Hoqët emrin tuaj në ekran (qe %1$s) - E ndryshuat temën në: %1$s - %1$s ndryshoi avatarin e dhomës - Ndryshuat avatarin e dhomës - Ndryshuat emrin e dhomës në: %1$s - Filluat një thirrje video. - Filluat një thirrje zanore. - %s dërgoi të dhëna për ujdisjen e thirrjes. - Dërguat të dhëna për ujdisjen e thirrjes. - Iu përgjigjët thirrjes. - E përfunduat thirrjen. - E bëtë historikun e ardhshëm të dhomë të dukshëm për %1$s - Aktivizuat fshehtëzim skaj-më-skaj (%1$s) - Përmirësuat këtë dhomë. - Kërkuat një konferencë VoIP - Hoqët emrin e dhomës - Hoqët temën e dhomës - %1$s hoqi avatarin e dhomës - Hoqët avatarin e dhomës - Përditësuat profilin tuaj %1$s - Dërguat një ftesë te %1$s për të ardhur te dhoma - Shfuqizuat ftesën për ardhjen në dhomë të %1$s - Pranuat ftesën për %1$s - %1$s shtoi widget-in %2$s - Shtuat widget-in %1$s - %1$s hoqi widget-in %2$s - Hoqët widget-in %1$s - %1$s ndryshoi widget-in %2$s - Ndryshuat widget-in %1$s - Përgjegjës - Moderator - Parazgjedhje - Vetjake (%1$d) - Vetjake - Ndryshuat shkallën e pushtetit për %1$s. - %1$s ndryshoi shkallën e pushtetit për %2$s. - %1$s nga %2$s në %3$s - Ftesa juaj. Arsye: %1$s - Ftuat %1$s. Arsye: %2$s - Erdhët në dhomë, Arsye: %1$s - Ikët nga dhoma. Arsye: %1$s - Hodhët poshtë ftesën. Arsye: %1$s - Përzutë %1$s. Arsye: %2$s - Hoqët dëbimin për %1$s. Arsye: %2$s - Dëbuat %1$s. Arsye: %2$s - Dërguat një ftesë për %1$s të vijë në dhomë. Arsye: %2$s - Shfuqizuat ftesën për ardhjen në dhomë të %1$s. Arsye: %2$s - Pranuat ftesën për %1$s. Arsye: %2$s - Tërhoqët mbrapsht ftesën për %1$s. Arsye: %2$s - - Shtuat %1$s si një adresë për këtë dhomë. - Shtuat %1$s si adresa për këtë dhomë. - - - Hoqët %1$s si një adresë për këtë dhomë. - Hoqët %1$s si adresa për këtë dhomë. - - Shtuat %1$s dhe hoqët %2$s si adresa për këtë dhomë. - Caktuat si adresë kryesore për këtë dhomë %1$s. - Hoqët adresën kryesore për këtë dhomë. - Keni lejuar të vijnë mysafirë në dhomë. - U keni penguar mysafirëve të vijnë në dhomë. - Aktivizuat fshehtëzimin skaj-më-skaj. - Aktivizuat fshehtëzimin skaj-më-skaj (algoritëm %1$s i panjohur). - Keni penguar të vijnë në dhomë mysafirë. - %1$s ka penguar të vijnë në dhomë mysafirë. - Keni lejuar të vijnë mysafirë këtu. - %1$s ka lejuar të vijnë këtu mysafirë. - Dolët. Arsye: %1$s - %1$s doli. Arsye: %2$s - Erdhët. Arsye: %1$s - %1$s erdhi. Arsye: %2$s - Shfuqizuat ftesën për %1$s - %1$s shfuqizoi ftesën për %2$s - Ftuat %1$s - %1$s ftoi %2$s - U përmirësuat këtu. - %s këtu u përmirësua. - I bëtë mesazhet e ardhshëm të dukshëm për %1$s - %1$s i bëri mesazhet e ardhshëm të dukshëm për %2$s - Dolët nga dhoma - %1$s doli nga dhoma - Erdhët - %1$s erdhi - Krijuat diskutimin - %1$s krijoi diskutimin - Dhomë e zbrazët (was %s) - - %1$s, %2$s, %3$s dhe %4$d tjetër - %1$s, %2$s, %3$s dhe %4$d të tjerë - - %1$s, %2$s, %3$s dhe %4$s - %1$s, %2$s dhe %3$s - 🎉 U është penguar pjesëmarrja krejt shërbyesve! Kjo dhomë s’mund të përdoret më. - Pa ndryshim. - Ndryshuat ACL-ra shërbyesi për këtë dhomë. - %s ndryshoi ACL-ra shërbyesi për këtë dhomë. - Ujdisët ACL-ra shërbyesi për këtë dhomë. - %s ujdisi ACL-ra shërbyesi për këtë dhomë. - • Shërbyes që kanë përputhje me %s u hoqën nga lista e të lejuarve. - • Shërbyesit që kanë përputhje me %s tani janë të lejuar. - • Shërbyesit që kanë përputhje me %s u hoqën nga lista e ndalimeve. - • Shërbyesit që kanë përputhje me %s tani janë të ndaluar. - • Shërbyesit që kanë përputhje me %s janë të ndaluar. - • Shërbyesit që kanë përputhje me %s janë të ndaluar. - Ndryshuat adresat për këtë dhomë. - %1$s ndryshoi adresat për këtë dhomë. - Ndryshuat adresat kryesore dhe alternative për këtë dhomë. - %1$s ndryshoi adresat kryesore dhe alternative për këtë dhomë. - Ndryshuat adresat alternative për këtë dhomë. - %1$s ndryshoi adresat alternative për këtë dhomë. - - Hoqët adresën alternative %1$s për këtë dhomë. - Hoqët adresat alternative %1$s për këtë dhomë. - - - %1$s hoqët adresën alternative %2$s për këtë dhomë. - %1$s hoqët adresat alternative %2$s për këtë dhomë. - - - Shtuat adresën alternative %1$s për këtë dhomë. - Shtuat adresat alternative %1$s për këtë dhomë. - - - %1$s shtoi adresën alternative %2$s për këtë dhomë. - %1$s shtoi adresat alternative %2$s për këtë dhomë. - - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-sr/strings.xml b/matrix-sdk-android/src/main/res/values-sr/strings.xml deleted file mode 100644 index c55c92d58a..0000000000 --- a/matrix-sdk-android/src/main/res/values-sr/strings.xml +++ /dev/null @@ -1,277 +0,0 @@ - - - %1$s напусти собу - Ви се придружисте - %1$s се придружи - Ви се придружисте - %1$s се придружи - %1$s позва вас - Ви позвасте корисника %1$s - %1$s позва корисника %2$s - Направили сте дискусију - %1$s: %2$s - Почетна синхронизација: -\nувозим налог… - Празна соба (била је %s) - Празна соба - - %1$s и још %2$d - %1$s и још %2$d - %1$s и још %2$d - - %1$s направи дискусију - Направили сте собу - %1$s направи собу - Ваша позивница - %s шаље позивницу - Послали сте налепницу. - %1$s посла налепницу. - Послали сте слику. - %1$s посла слику. - Изменили сте свој аватар - %1$s измени свој аватар - Повукли сте позивницу за корисника %1$s - %1$s повуче позивницу за корисника %2$s - Забранили сте корисника %1$s - %1$s забрани корисника %2$s - Укинули сте забрану кориснику %1$s - %1$s укину забрану кориснику %2$s - Избацили сте корисника %1$s - %1$s избаци %2$s - Одбили сте позивницу - %1$s одби позивницу - Напустили сте собу - %1$s напусти собу - Напустили сте собу - %s тражи да провери ваш кључ али ваш клијент не подржава верификацију унутар ћаскања. Мораћете да употребите старији начин за оверу кључева. - Укључили сте шифровање с краја на крај (непознат алгоритам %1$s). - %1$s укључи шифровање с краја на крај (непознат алгоритам %2$s). - %1$s искључи шифровање с краја на крај. - Спречили сте да се гости придруже у собу. - Укључили сте шифровање с краја на крај. - Дозволили сте гостима да се придруже соби. - Изменили сте алтернативну адресу за ову собу. - Очисти ред за слање - Шаљем поруку… - - %1$s, %2$s, %3$s и још %4$d - %1$s, %2$s, %3$s и још %4$d - %1$s, %2$s, %3$s и још %4$d - - %1$s, %2$s, %3$s и %4$s - %1$s, %2$s и %3$s - %1$s и %2$s - Број телефона - Адреса е-поште - Шифрована порука - Тренутно није могуће да се вратите у празну собу. - Грешка Матрикса - Мрежна грешка - Неуспело слање слике - Не могу да пошаљем поруку - Уређај пошиљаоца није нам послао кључеве за ову поруку. - Изменили сте ниво снаге корисника %1$s. - посебно - посебно (%1$d) - подразумевано - модератор - админ - Порука уклоњена [разлог: %1$s] - Поруку уклони %1$s - Порука уклоњена - Уклонили сте аватар собе - %1$s уклони аватар собе - Уклонили сте тему собе - %1$s уклони тему собе - Уклонили сте назив собе - %1$s уклони назив собе - (аватар је такође промењен) - 🎉 Свим серверима је забрањено учествовање! Ова соба се више не може користити. - Без измене. - Надоградили сте ову собу. - непознато (%s). - Учинили сте да од сада, историјат буде видљив за %1$s - %1$s учини да од сада, историјат буде видљив за %2$s - Учинили сте да будуће поруке буду видљиве за %1$s - %1$s учини да будуће поруке буду видљиве за %2$s - свакога. - све чланове. - све чланове, од кад се придруже. - све чланове, од када су позвани. - Завршили сте позив. - %s заврши позив. - Одговорили сте на позив. - %s одговори на позив. - Послали сте податке за поставку позива. - %s посла податке за поставку позива. - Позвали сте гласовним позивом. - %s позва видео позивом. - Позвали сте видео позивом. - Изменили сте аватар собе - Поставили сте своје приказно име на %1$s - %1$s постави своје приказно име на %2$s - - Додали сте %1$s као адресу ове собе. - Додали сте %1$s као адресе ове собе. - Додали сте %1$s као адресе ове собе. - - - %1$s додаде %2$s као адресу ове собе. - %1$s додаде %2$s као адресе ове собе. - %1$s додаде %2$s као адресе ове собе. - - Повукли сте позивницу корисника %1$s. Разлог: %2$s - %1$s повлачи позивницу корисника %2$s. Разлог: %3$s - Прихватили сте позивницу за %1$s. Разлог: %2$s - %1$s прихвата позивницу за %2$s. Разлог:%3$s - Повукли сте позивницу да се %1$s придружи соби. Разлог: %2$s - %1$s повуче позивницу да се %2$s придружи соби. Разлог: %3$s - Послали сте позивницу да се %1$s придружи соби. Разлог: %2$s - %1$s посла позивницу да се %2$s придружи соби. Разлог: %3$s - Забранили сте корисника %1$s. Разлог: %2$s - %1$s забрани корисника %2$s. Разлог: %3$s - Одблокирали сте корисника %1$s. Разлог: %2$s - %1$s одблокира корисника %2$s. Разлог: %3$s - Избацили сте корисника %1$s. Разлог: %2$s - %1$s избаци корисника %2$s. Разлог: %3$s - Одбили сте позивницу. Разлог: %1$s - %1$s одби позивницу. Разлог: %2$s - Изашли сте. Разлог: %1$s - %1$s изађе. Разлог: %2$s - Напустили сте собу. Разлог: %1$s - %1$s напусти собу. Разлог: %2$s - Придружили сте се. Разлог: %1$s - %1$s се придружи. Разлог: %2$s - Придружили сте се соби. Разлог: %1$s - %1$s се придружи соби. Разлог: %2$s - %1$s вас позива. Разлог: %2$s - Позвали сте корисника %1$s. Разлог: %2$s - %1$s позва корисника %2$s. Разлог: %3$s - Ваша позивница. Разлог: %1$s - %1$s - позивница. Разлог: %2$s - Почетна синхронизација: -\nувозим податке о налогу - Почетна синхронизација: -\nувозим заједнице - Почетна синхронизација: -\nувозим напуштене собе - Почетна синхронизација: -\nувозим собе са позивницом - Почетна синхронизација: -\nувозим собе у којима сте - Почетна синхронизација: -\nувоз шифровања - Почетна синхронизација: -\nувозим собе - Позивница за собу - %s вас позива - Не могу да редигујем - ** Не могу да дешифрујем: %s ** - %1$s са %2$s на %3$s - %1$s измени ниво снаге кориснику %2$s. - Изменили сте %1$s виџет - %1$s измени %2$s виџет - Уклонили сте %1$s виџет - %1$s уклони %2$s виџет - Додали сте %1$s виџет - %1$s додаде %2$s виџет - Прихватили сте позивницу за %1$s - %1$s прихвати позивницу за %2$s - Повукли сте позивницу за корисника %1$s - %1$s повуче позивницу за корисника %2$s - Повукли сте позивницу да се %1$s придружи у собу - %1$s повуче позивницу да се %2$s придружи у собу - Позвали сте корисника %1$s - %1$s позва корисника %2$s - Послали сте позивницу да се %1$s придружи у собу - %1$s посла позивницу да се %2$s придружи у собу - Освежили сте свој профил %1$s - %1$s освежи свој профил %2$s - Поруку уклони %1$s [разлог: %2$s] - ВоИП конференција завршена - ВоИП конференција започела - Затражили сте ВоИП конференцију - %1$s затражи ВоИП конференцију - • Сервери који садрже ИП бројеве су сада забрањени. - • Сервери који садрже ИП бројеве су сада дозвољени. - • Сервери који садрже %s су уклоњени са листе дозвољених. - • Сервери који садрже %s су сада дозвољени. - • Сервери који садрже %s су уклоњени са листе забрањених. - • Сервери који садрже %s су сада забрањени. - Изменили сте АЦЛ сервера за ову собу. - %s измени АЦЛ сервера за ову собу. - • Сервери са ИП бројевима су забрањени. - • Сервери са ИП бројевима су дозвољени. - • Сервери који садрже %s су дозвољени. - • Сервери који садрже %s су забрањени. - Поставили сте АЦЛ сервера за ову собу. - %s постави АЦЛ сервера за ову собу. - Надоградили сте овде. - %s надогради овде. - %s надогради ову собу. - Укључили сте шифровање с краја на крај (%1$s) - %1$s укључи шифровање с краја на крај (%2$s) - %s упути видео позив. - Изменили сте назив собе у: %1$s - %1$s измени назив собе у: %2$s - %1$s измени аватар собе - Изменили сте тему на: %1$s - %1$s измени тему на: %2$s - Уклонили сте своје приказно име (било је %1$s) - %1$s уклони своје приказно име (било је %2$s) - Изменили сте приказно име са %1$s на %2$s - %1$s измени приказно име са %2$s на %3$s - %1$s забрани гостима да се придруже у собу. - Забранили сте гостима да се придруже у собу. - %1$s забрани гостима да се придруже у собу. - Дозволили сте гостима да се придруже овде. - %1$s дозволи гостима да се придруже овде. - %1$s дозволи гостима да се придруже у собу. - Изменили сте адресе за ову собу. - %1$s измени адресе за ову собу. - Изменили сте главну и алтернативне адресе за ову собу. - %1$s измени главну и алтернативне адресе за ову собу. - %1$s измени алтернативне адресе за ову собу. - - Уклонили сте алтернативну адресу %1$s за ову собу. - Уклонили сте алтернативне адресе %1$s за ову собу. - Уклонили сте алтернативне адресе %1$s за ову собу. - - - %1$s уклони алтернативну адресу %2$s за ову собу. - %1$s уклони алтернативне адресе %2$s за ову собу. - %1$s уклони алтернативне адресе %2$s за ову собу. - - - Додали сте алтернативну адресу %1$s за ову собу. - Додали сте алтернативне адресе %1$s за ову собу. - Додали сте алтернативне адресе %1$s за ову собу. - - - %1$s додаде алтернативну адресу %2$s за ову собу. - %1$s додаде алтернативне адресе %2$s за ову собу. - %1$s додаде алтернативне адресе %2$s за ову собу. - - Уклонили сте главну адресу за ову собу. - %1$s уклони главну адресу за ову собу. - Поставили сте главну адресу ове собе на %1$s. - %1$s постави главну адресу ове собе на %2$s. - Додали сте %1$s и уклонили %2$s као адресе ове собе. - %1$s додаде %2$s и уклони %3$s као адресе ове собе. - - Уклонили сте %1$s као адресу ове собе. - Уклонили сте %1$s као адресе ове собе. - Уклонили сте %1$s као адресе ове собе. - - - %1$s уклони %2$s као адресу ове собе. - %1$s уклони %2$s као адресе ове собе. - %1$s уклони %2$s као адресе ове собе. - - Изменили сте видео конференцију - %1$s измени видео конференцију - Завршили сте видео конференцију - %1$s заврши видео конференцију - Покренули сте видео конференцију - %1$s покрену видео конференцију - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-sr/strings_sas.xml b/matrix-sdk-android/src/main/res/values-sr/strings_sas.xml new file mode 100644 index 0000000000..04da7a11f0 --- /dev/null +++ b/matrix-sdk-android/src/main/res/values-sr/strings_sas.xml @@ -0,0 +1,68 @@ + + + + пас + мачка + лав + коњ + једнорог + прасе + слон + зец + панда + петао + пингвин + корњача + риба + октопод + лептир + цвет + дрво + кактус + печурка + глобус + месец + облак + ватра + банана + јабука + јагода + кукуруз + пица + торта + срце + смајли + робот + шешир + наочаре + кључ + деда Мраз + палчић горе + кишобран + пешчаник + сат + поклон + сијалица + књига + оловка + спајалица + маказе + катанац + кључ + чекић + телефон + застава + воз + бицикл + авион + ракета + пехар + лопта + гитара + труба + звоно + сидро + слушалице + фасцикла + чиода + diff --git a/matrix-sdk-android/src/main/res/values-sv/strings.xml b/matrix-sdk-android/src/main/res/values-sv/strings.xml deleted file mode 100644 index 91d874591f..0000000000 --- a/matrix-sdk-android/src/main/res/values-sv/strings.xml +++ /dev/null @@ -1,261 +0,0 @@ - - - %1$s: %2$s - %1$s skickade en bild. - Du skickade en bild. - %1$s skickade en dekal. - Du skickade en dekal. - Inbjudan från %s - Inbjudan från dig - %1$s skapade rummet - Du skapade rummet - %1$s bjöd in %2$s - Du bjöd in %1$s - %1$s bjöd in dig - %1$s gick med i rummet - Du gick med i rummet - %1$s lämnade rummet - Du lämnade rummet - %1$s avböjde inbjudan - Du avböjde inbjudan - %1$s kickade %2$s - Du kickade %1$s - %1$s avbannade %2$s - Du avbannade %1$s - %1$s avbannade %2$s - Du bannade %1$s - %1$s drog tillbaka inbjudan för %2$s - Du drog tillbaka inbjudan för %1$s - %1$s bytte sin avatar - Du bytte din avatar - %1$s satte sitt visningsnamn till %2$s - Du satte ditt visningsnamn till %1$s - %1$s bytte sitt visningsnamn från %2$s till %3$s - Du bytte ditt visningsnamn från %1$s till %2$s - %1$s tog bort sitt visningsnamn (det var %2$s) - Du tog bort ditt visningsnamn (det var %1$s) - %1$s bytte ämnet till: %2$s - Du bytte ämnet till: %1$s - %1$s bytte rummets avatar - Du bytte rummets avatar - %1$s bytte rummets namn till: %2$s - Du bytte rummets namnet till: %1$s - %s startade ett videosamtal. - Du startade ett videosamtal. - %s startade ett röstsamtal. - Du startade ett röstsamtal. - %s skickade data för att sätta upp samtalet. - Du skickade data för att sätta upp samtalet. - %s svarade på samtalet. - Du svarade på samtalet. - %s avslutade samtalet. - Du avslutade samtalet. - %1$s gjorde framtida rumshistorik synlig för %2$s - Du gjorde framtida rumshistorik synlig för %1$s - alla rumsmedlemmar, från tiden de bjöds in. - alla rumsmedlemmar, från tiden de gick med. - alla rumsmedlemmar. - vem som helst. - okänt (%s). - %1$s aktiverade totalsträckskryptering (%2$s) - Du aktiverade totalsträckskryptering (%1$s) - %s uppgraderade det här rummet. - Du uppgraderade det här rummet. - %1$s begärde ett VoIP-gruppsamtal - Du begärde ett VoIP-gruppsamtal - VoIP-gruppsamtal startat - VoIP-gruppsamtal avslutat - (avataren blev även bytt) - %1$s tog bort rummets namn - Du tog bort rummets namn - %1$s tog bort rummets ämne - Du tog bort rummets ämne - %1$s tog bort rummets avatar - Du tog bort rummets avatar - Meddelande borttaget - Meddelande borttaget av %1$s - Meddelande borttaget [anledning: %1$s] - Meddelande borttaget av %1$s [anledning: %2$s] - %1$s uppdaterade sim profil %2$s - Du uppdaterade din profil %1$s - %1$s bjöd in %2$s att gå med i rummet - Du bjöd in %1$s att gå med i rummet - %1$s drog tillbaka inbjudan för %2$s att gå med i rummet - Du drog tillbaka inbjudan för %1$s att gå med i rummet - %1$s accepterade inbjudan för %2$s - Du accepterade inbjudan för %1$s - %1$s lade till %2$s-widget - Du lade till %1$s-widget - %1$s tog bort %2$s-widget - Du tog bort %1$s-widget - %1$s modifierade %2$s-widget - Du modifierade %1$s-widget - Admin - Moderator - Standard - Anpassad (%1$d) - Anpassad - Du ändrade behörighetsnivå för %1$s. - %1$s ändrade behörighetsnivå för %2$s. - %1$s från %2$s till %3$s - ** Kan inte avkryptera: %s ** - Avsändarens enhet har inte gett oss nycklarna för det här meddelandet. - Kunde inte dölja - Kunde inte skicka meddelandet - Misslyckades att ladda upp bilden - Nätverksfel - Matrixfel - Det går för närvarande inte att gå med i ett tomt rum igen. - Krypterat meddelande - E-postadress - Telefonnummer - Inbjudan från %s - Rumsinbjudan - %1$s och %2$s - - %1$s och en till - %1$s och %2$d till - - Tomt rum - Inledande synk: -\nImporterar konto… - Inledande synk: -\nImporterar krypto - Inledande synk: -\nImporterar rum - Inledande synk: -\nImporterar anslutna rum - Inledande synk: -\nImporterar inbjudna rum - Inledande synk: -\nImporterar lämnade rum - Inledande synk: -\nImporterar gemenskaper - Inledande synk: -\nImporterar kontodata - Skickar meddelande… - Rensa sändningskö - Inbjudan från %1$s. Anledning: %2$s - Inbjudan från dig. Anledning: %1$s - %1$s bjöd in %2$s. Anledning: %3$s - Du bjöd in %1$s. Anledning: %2$s - %1$s bjöd in dig. Anledning: %2$s - %1$s gick med i rummet. Anledning: %2$s - Du gick med i rummet. Anledning: %1$s - %1$s lämnade rummet. Anledning: %2$s - Du lämnade rummet. Anledning: %1$s - %1$s avböjde inbjudan. Anledning: %2$s - Du avböjde inbjudan. Anledning: %1$s - %1$s kickade %2$s. Anledning: %3$s - Du kickade %1$s. Anledning: %2$s - %1$s avbannade %2$s. Anledning: %3$s - Du avbannade %1$s. Anledning: %2$s - %1$s bannade %2$s. Anledning: %3$s - Du bannade %1$s. Anledning: %2$s - %1$s bjöd in %2$s att gå med i rummet. Anledning: %3$s - Du bjöd in %1$s att gå med i rummet. Anledning: %2$s - %1$s drog tillbaka inbjudan för %2$s att gå med i rummet. Anledning: %3$s - Du drog tillbaka inbjudan för %1$s att gå med i rummet. Anledning: %2$s - %1$s accepterade inbjudan för %2$s. Anledning: %3$s - Du accepterade inbjudan för %1$s. Anledning: %2$s - %1$s drog tillbaka inbjudan för %2$s. Anledning: %3$s - Du drog tillbaka inbjudan för %1$s. Anledning: %2$s - - %1$s lade till %2$s som en adress för det här rummet. - %1$s lade till %2$s som adresser för det här rummet. - - - Du lade till %1$s som en adress för det här rummet. - Du lade till %1$s som adresser för det här rummet. - - - %1$s tog bort %2$s som en adress för det här rummet. - %1$s tog bort %2$s som adresser för det här rummet. - - - Du tog bort %1$s som en adress för det här rummet. - Du tog bort %1$s som adresser för det här rummet. - - %1$s lade till %2$s och tog bort %3$s som adresser för det här rummet. - Du lade till %1$s och tog bort %2$s som adresser för det här rummet. - %1$s satta huvudadressen för det här rummet till %2$s. - Du satta huvudadressen för det här rummet till %1$s. - %1$s tog bort huvudadressen för det här rummet. - Du tog bort huvudadressen för det här rummet. - %1$s tillät gäster att gå med i rummet. - Du tillät gäster att gå med i rummet. - %1$s hindrade gäster från att gå med i rummet. - Du hindrade gäster från att gå med i rummet. - %1$s aktiverade totalsträckskryptering. - Du aktiverade totalsträckskryptering. - %1$s aktiverade totalsträckskryptering (okänd algoritm %2$s). - Du aktiverade totalsträckskryptering (okänd algoritm %1$s). - %s begär att verifiera din nyckel, men din klient stöder inte nyckelverifiering i chatten. Du behöver använda legacynyckelverifiering för att verifiera nycklar. - Du hindrade gäster från att gå med i rummet. - %1$s hindrade gäster från att gå med i rummet. - Du tillät gäster att gå med här. - %1$s tillät gäster att gå med här. - Du lämnade. Anledning: %1$s - %1$s Lämnade. Anledning: %2$s - Du gick med. Anledning: %1$s - %1$s gick med. Anledning: %2$s - Du drog tillbaka inbjudan för %1$s - %1$s drog tillbaka inbjudan för %2$s - Du bjöd in %1$s - %1$s bjöd in %2$s - Du uppgraderade här. - %s uppgraderade här. - Du gjorde framtida meddelanden synliga för %1$s - %1$s gjorde framtida meddelanden synliga för %2$s - Du lämnade rummet - %1$s lämnade rummet - Du gick med - %1$s gick med - Du skapade diskussionen - %1$s skapade diskussionen - Du ändrade adresserna för det här rummet. - %1$s ändrade adresserna för det här rummet. - Du ändrade huvudadressen och de alternativa adresserna för det här rummet. - %1$s ändrade huvudadressen och de alternativa adresserna för det här rummet. - Du ändrade de alternativa adresserna för det här rummet. - %1$s ändrade de alternativa adresserna för det här rummet. - - Du tog bort den alternativa adressen %1$s för det här rummet. - Du tog bort de alternativa adresserna %1$s för det här rummet. - - - %1$s tog bort den alternativa adressen %2$s för det här rummet. - %1$s tog bort de alternativa adresserna %2$s för det här rummet. - - - Du lade till den alternativa adressen %1$s för det här rummet. - Du lade till de alternativa adresserna %1$s för det här rummet. - - - %1$s lade till den alternativa adressen %2$s för det här rummet. - %1$s lade till de alternativa adresserna %2$s för det här rummet. - - Tomt rum (var %s) - - %1$s, %2$s, %3$s och %4$d till - %1$s, %2$s, %3$s och %4$d till - - %1$s, %2$s, %3$s och %4$s - %1$s, %2$s och %3$s - 🎉 Alla servrar har bannats från att delta! Det här rummet kan inte användas längre. - Ingen ändring. - • Servrar som matchar IP-adresser är nu bannade. - • Servrar som matchar IP-adresser är nu tillåtna. - • Servrar som matchar %s togs bort från tillåtelselistan. - • Servrar som matchar %s är nu tillåtna. - • Servrar som matchar %s togs bort från bannlistan. - • Servrar som matchar %s är nu bannade. - Du ändrade server-ACLer för det här rummet. - %s ändrade server-ACLer för det här rummet. - • Servrar som matchar IP-adresser är tillåtna. - • Servrar som matchar IP-adresser är bannade. - • Servrar som matchar %s är tillåtna. - • Servrar som matchar %s är bannade. - Du satte server-ACLer för det här rummet. - %s satte server-ACLer för det här rummet. - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-szl/strings.xml b/matrix-sdk-android/src/main/res/values-szl/strings.xml deleted file mode 100644 index a6b3daec93..0000000000 --- a/matrix-sdk-android/src/main/res/values-szl/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-szl/strings_sas.xml b/matrix-sdk-android/src/main/res/values-szl/strings_sas.xml new file mode 100644 index 0000000000..9769ad73ce --- /dev/null +++ b/matrix-sdk-android/src/main/res/values-szl/strings_sas.xml @@ -0,0 +1,4 @@ + + + + diff --git a/matrix-sdk-android/src/main/res/values-te/strings.xml b/matrix-sdk-android/src/main/res/values-te/strings.xml deleted file mode 100644 index 62f58c9e26..0000000000 --- a/matrix-sdk-android/src/main/res/values-te/strings.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - %s\'s ఆహ్వానం - %1$s ఆహ్వానించారు %2$s - %1$s వదిలి వెళారు - %1$s ఆహ్వానాన్ని తిరస్కరించారు - %1$s తన్నాడు %2$s - %1$s నిషేధాన్ని %2$s - %1$s నిషేధించారు %2$s - %1$s ఉపసంహరించుకుంది %2$s\'s ఆహ్వానం - %1$s వారి అవతార్ను మార్చారు - %1$s వారి డిస్ప్లే పేరును ని సెట్ చేసారు %2$s - %1$s వారి ప్రదర్శన పేరును %2$s నుండి %3$s మార్చారు - %1$s వారి ప్రదర్శన పేరుని తీసివేసారు (%2$s) - %1$s అంశం మార్చబడింది:%2$s - %1$s గది పెరు మార్చబడింది %2$s - %s ఒక వీడియో కాల్ని ఉంచింది. - %s వాయిస్ కాల్ని ఉంచారు. - %s కాల్కి సమాధానం ఇచ్చారు. - %s కాల్ ముగిసింది. - %1$s భవిష్యత్ గది చరిత్రను %2$s కి కనిపించేలా చేసింది - పాయింట్నుండి, అన్ని గది సభ్యుల వారు ఆహ్వానించబడ్డారు. - పాయింట్ నుండి, అన్ని గదుల సభ్యుల వారు చేరారు. - అన్ని గదుల సభ్యులు. - ఎవరైనా. - తెలియని (%s). - %1$s ఎండ్-టు-ఎండ్ ఎన్క్రిప్షన్ ఆన్ చెయ్యబడింది (%2$s) - - %1$s వి ఓ ఇ పి సమావేశాన్ని అభ్యర్థించారు - వి ఓ ఇ పి సమావేశం ప్రారంభమైంది - వి ఓ ఇ పి సమావేశం ముగిసింది - - (అవతార్ మార్చబడింది) - %1$s గది పేరు తొలగించబడింది - %1$s గది అంశాన్ని తీసివేసారు - %1$s వారి ప్రొఫైల్ నవీకరించబడింది %2$s - %1$s గదిలో చేరడానికి %2$s కు ఆహ్వానాన్ని పంపారు - %2$sకోసం %1$s ఆహ్వానాన్ని అంగీకరించారు - - ** వ్యక్తీకరించడానికి సాధ్యం కాలేదు: %s ** - ఈ సందేశానికి పంపేవారి పరికరం మాకు కీలను పంపలేదు. - - గది స్క్రీన్ - సందేశం పంపడం సాధ్యం కాలేదు - - చిత్రాన్ని అప్లోడ్ చేయడంలో విఫలమైంది - - సాధారణ లోపాలు - మాట్రిక్స్ లోపం - - మళ్లీ ఖాళీ గది ని చేరడానికి ప్రస్తుతం ఇది సాధ్యం కాదు. - - ఎన్క్రిప్టెడ్ సందేశం - - ఇమెయిల్ చిరునామా - ఫోను నంబరు - - - %1$s: %2$s - %1$s ఒక చిత్రం పంపారు. - - %1$s మిమ్మల్ని ఆహ్వానించారు - %1$s చేరారు - - %s నుండి ఆహ్వానించు - %1$s మరియు %2$s - గదికి ఆహ్వానం - ఖాళీ గది - - - diff --git a/matrix-sdk-android/src/main/res/values-th/strings.xml b/matrix-sdk-android/src/main/res/values-th/strings.xml deleted file mode 100644 index 3abd948f77..0000000000 --- a/matrix-sdk-android/src/main/res/values-th/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - %1$s: %2$s - diff --git a/matrix-sdk-android/src/main/res/values-uk/strings.xml b/matrix-sdk-android/src/main/res/values-uk/strings.xml deleted file mode 100644 index 0624ae3cd7..0000000000 --- a/matrix-sdk-android/src/main/res/values-uk/strings.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - %1$s: %2$s - %1$s надсилає зображення. - %s запрошення - %1$s запрошує %2$s - Зашифроване повідомлення - - Запрошення від %s - Запрошення до кімнати - %1$s і %2$s - Порожня кімната - %1$s надсилає наліпку. - %1$s запрошує вас - %1$s приєднується - %1$s залишає кімнату - %1$s відхиляє запрошення - %1$s викидає %2$s - %1$s розблоковує %2$s - %1$s блокує %2$s - %1$s відкликає запрошення для %2$s - %1$s змінює свій аватар - %1$s встановлюють собі назву %2$s - %1$s змінює своє ім’я з %2$s на %3$s - %1$s прибирає своє ім’я (%2$s) - %1$s змінює тему на: %2$s - %1$s змінює назву кімнати на: %2$s - %s починає відеовиклик. - %s розпочинає голосовий виклик. - %s відповідає на виклик. - %s завершує дзвінок. - %1$s робить майбутню історію кімнати видимою для %2$s - всіх учасників кімнати, з моменту їх запрошення. - всіх учасників кімнати, з моменту їх приєднання. - всіх учасників кімнати. - будь-кого. - невідомо (%s). - %1$s вмикає наскрізне шифрування (%2$s) - %1$s запросив(ла) VoIP конференцію - VoIP конференція розпочалась - VoIP конференція завершилась - (аватар також змінено) - %1$s прибирає назву кімнати - %1$s прибирає тему кімнати - %1$s оновлює свій профіль %2$s - %1$s надсилає запрошення %2$s приєднатися до кімнати - %1$s приймає запрошення до %2$s - ** Неможливо розшифрувати: %s ** - Пристрій відправника не надіслав нам ключ для цього повідомлення. - Неможливо відредагувати - Не вдалося надіслати повідомлення - Не вдалося завантажити зображення - Помилка мережі - Помилка Matrix - Наразі неможливо переприєднатися до порожньої кімнати. - Адреса електронної пошти - Номер телефону - - %1$s та 1 інший - %1$s та %2$d інші - %1$s та %2$d інших - - - %s оновлює цю кімнату. - Повідомлення вилучено - %1$s вилучає повідомлення - Повідомлення вилучено [причина: %1$s] - Початкове налаштування: -\nІмпортування даних облікового запису - Ви вийшли. Причина: %1$s - %1$s виходить. Причина: %2$s - Ви залишили кімнату. Причина: %1$s - %1$s залишає кімнату. Причина: %2$s - %1$s залишає кімнату - Ви залишили кімнату - Ви залишили кімнату - Ви змінили адреси цієї кімнати. - Ви змінили основну та альтернативну адреси цієї кімнати. - Ви змінили альтернативні адреси для цієї кімнати. - Ви змінили рівень доступу на %1$s. - Ви змінили серверні списки контролю доступу для цієї кімнати. - Ви змінили назву кімнати на: %1$s - Ви змінили світлину кімнати - Ви змінили тему на: %1$s - Ви змінили показуване ім\'я з %1$s на %2$s - Ви змінили світлину профілю - - %1$s, %2$s, %3$s та %4$d інший - %1$s, %2$s, %3$s та %4$d інші - %1$s, %2$s, %3$s та %4$d інших - %1$s, %2$s, %3$s та %4$d інших - - %1$s, %2$s, %3$s та %4$s - %1$s, %2$s та %3$s - Типово - Модератор - Адміністратор - Ви вилучили %1$s віджет - %1$s вилучає %2$s віджет - Ви додали %1$s віджет - %1$s додає %2$s віджет - Ви прийняли запрошення до %1$s - Ви надіслали запрошення для %1$s приєднатися до кімнати - Ви оновили свій профіль %1$s - %1$s вилучає повідомлення [причина: %2$s] - Ви прибрали аватар кімнати - %1$s прибирає аватар кімнати - Ви прибрали тему кімнати - Ви прибрали назву кімнати - %s оновлює кімнату. - Ви оновили цю кімнату. - Ви увімкнули наскрізне шифрування (%1$s) - Ви починаєте голосовий виклик. - Ви починаєте відеовиклик. - %1$s змінює аватар кімнати - Ви прибрали показуване ім\'я (%1$s) - Ви викинули %1$s - %1$s запрошує %2$s - Ви відхилили запрошення - Ви приєдналися - %1$s приєднується - Ви приєдналися до кімнати - Ви запросили %1$s - Ви запросили %1$s - Ви створили обговорення - %1$s створює обговорення - Ви створили кімнату - %1$s створює кімнату - Ваше запрошення - Ви надіслали наліпку. - Ви надіслали зображення. - Ви відхилили запрошення. Причина: %1$s - %1$s відхиляє запрошення. Причина: %2$s - Ви приєдналися. Причина: %1$s - %1$s приєднується. Причина: %2$s - Ви приєднуєтеся до кімнати. Причина: %1$s - %1$s приєднується до кімнати. Причина: %2$s - %1$s запрошує вас. Причина: %2$s - Ви запросили %1$s. Причина: %2$s - %1$s запрошує %2$s. Причина: %3$s - Ваше запрошення. Причина: %1$s - Запрошення від %1$s. Причина: %2$s - Очистити чергу надсилання - Надсилання повідомлень… - Початкова синхронізація: -\nІмпортування спільнот - Початкова синхронізація: -\nІмпортування кімнат, які ви залишили - Початкова синхронізація: -\nІмпортування запрошень до кімнат - Початкова синхронізація: -\nІмпортування кімнат, до яких ви приєдналися - Початкова синхронізація: -\nІмпортування кімнат - Початкова синхронізація: -\nІмпортування криптографічних даних - Початкова синхронізація: -\nІмпортування даних облікового запису… - Порожня кімната (була %s) - Власний - Власний (%1$d) - Ви змінили віджет %1$s - %1$s змінює віджет %2$s - Ви оновили кімнату. - Ви зробили майбутню історію кімнати видимою для %1$s - Ви зробили майбутні повідомлення видимими для %1$s - %1$s робить майбутні повідомлення видимими для %2$s - Ви завершили дзвінок. - Ви відповіли на виклик. - Ви надіслали дані для налаштування виклику. - %s надсилає дані для налаштування виклику. - Ви встановили собі показуване ім\'я %1$s - Ви відкликали запрошення для %1$s - Ви заблокували %1$s - Ви заблокували %1$s - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-vls/strings.xml b/matrix-sdk-android/src/main/res/values-vls/strings.xml deleted file mode 100644 index f0f2287a8d..0000000000 --- a/matrix-sdk-android/src/main/res/values-vls/strings.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - %1$s: %2$s - %1$s èt e fotootje gesteurd. - %1$s èt e sticker gesteurd. - - Uutnodigienge van %s - %1$s èt %2$s uutgenodigd - %1$s èt joun uitgenodigd - %1$s neemt nu deel an ’t gesprek - %1$s èt ’t gesprek verloatn - %1$s èt d’uitnodigienge geweigerd - %1$s èt %2$s uut ’t gesprek verwyderd - %1$s èt %2$s ountbann - %1$s èt %2$s verbann - %1$s èt d’uutnodigienge van %2$s ingetrokkn - %1$s èt zyn/heur avatar angepast - %1$s èt zyn/heur noame angepast noa %2$s - %1$s èt zyn/heur noame angepast van %2$s noa %3$s - %1$s èt zyn/heur noame verwyderd (%2$s) - %1$s èt ’t ounderwerp veranderd noa: %2$s - %1$s èt de gespreksnoame veranderd noa: %2$s - %s èt e video-iproep gemakt. - %s èt e sproakiproep gemakt. - %s èt den iproep beantwoord. - %s èt ipgehangn. - %1$s èt de toekomstige gespreksgeschiedenisse zichtboar gemakt vo %2$s - alle deelnemers an ’t gesprek, vanaf ’t punt dan ze zyn uutgenodigd. - alle deelnemers an ’t gesprek, vanaf ’t punt dan ze zyn toegetreedn. - alle deelnemers an ’t gesprek. - iedereen. - ounbekend (%s). - %1$s èt eind-tout-eind-versleutelienge angezet (%2$s) - - %1$s èt e VoIP-vergoaderienge angevroagd - VoIP-vergoaderienge begunn - VoIP-vergoaderienge gestopt - - (avatar es ook veranderd) - %1$s èt de gespreksnoame verwyderd - %1$s èt ’t gespreksounderwerp verwyderd - Bericht verwyderd - Bericht verwyderd deur %1$s - Bericht verwyderd [reden: %1$s] - Bericht verwyderd deur %1$s [reden: %2$s] - %1$s èt zyn/heur profiel %2$s bygewerkt - %1$s èt een uutnodigienge noa %2$s gesteurd vo ’t gesprek toe te treedn - %1$s èt d’uutnodigienge vo %2$s anveird - - ** Kun nie ountsleuteln: %s ** - ’t Toestel van den afzender èt geen sleutels vo da bericht hier gesteurd. - - Kosteg nie verwyderd wordn - Kosteg ’t bericht nie verzendn - - Iploadn van ’t fotootje es mislukt - - Netwerkfout - Matrix-fout - - ’t Es vo de moment nie meuglik van e leeg gesprek were toe te treedn. - - Versleuteld bericht - - E-mailadresse - Telefongnumero - - Uutnodigienge van %s - Gespreksuutnodigienge - - %1$s en %2$s - - - %1$s en 1 andere - %1$s en %2$d anderen - - - Leeg gesprek - - Initiële synchronisoasje: -\nAccount wor geïmporteerd… - Initiële synchronisoasje: -\nCrypto wor geïmporteerd - Initiële synchronisoasje: -\nGesprekkn wordn geïmporteerd - Initiële synchronisoasje: -\nDeelgenoomn gesprekken wordn geïmporteerd - Initiële synchronisoasje: -\nUutgenodigde gesprekkn wordn geïmporteerd - Initiële synchronisoasje: -\nVerloatn gesprekkn wordn geïmporteerd - Initiële synchronisoasje: -\nGemeenschappn wordn geïmporteerd - Initiële synchronisoasje: -\nAccountgegeevns wordn geïmporteerd - - %s èt da gesprek hier ipgewoardeerd. - - Bericht wor verstuurd… - Uutgoande wachtreeke leegn - - %1$s èt d’uutnodigienge vo %2$s vo ’t gesprek toe te treedn ingetrokkn - diff --git a/matrix-sdk-android/src/main/res/values-zh-rCN/strings.xml b/matrix-sdk-android/src/main/res/values-zh-rCN/strings.xml deleted file mode 100644 index 478970a334..0000000000 --- a/matrix-sdk-android/src/main/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,211 +0,0 @@ - - - %1$s 发送了一张图片。 - %s 的邀请 - %1$s 邀请了 %2$s - %1$s 邀请了您 - %1$s 加入了聊天室 - %1$s 离开了聊天室 - %1$s 拒绝了邀请 - %1$s 移除了 %2$s - %1$s 解封了 %2$s - %1$s 封禁了 %2$s - %1$s 更换了他们的头像 - %1$s 将他们的昵称设置为 %2$s - %1$s 把他们的昵称从 %2$s 改为 %3$s - %1$s 移除了他们的昵称 (%2$s) - %1$s 把主题改为: %2$s - %1$s 把聊天室名称改为: %2$s - %s 发起了一次视频通话。 - %s 发起了一次语音通话。 - %s 已接听通话。 - %s 已结束通话。 - 所有聊天室成员,从他们被邀请开始。 - 所有聊天室成员,从他们加入开始。 - 所有聊天室成员。 - 任何人。 - 未知(%s)。 - %1$s 开启了端到端加密(%2$s) - %1$s 请求了一次 VoIP 会议 - VoIP 会议已开始 - VoIP 会议已结束 - (头像也被更改) - %1$s 移除了聊天室名称 - %1$s 移除了聊天室主题 - ** 无法解密:%s ** - 发送者的设备没有向我们发送此消息的密钥。 - 无法发送消息 - 上传图像失败 - 网络错误 - Matrix 错误 - 目前无法重新加入一个空的聊天室。 - 已加密消息 - 电子邮箱地址 - 手机号码 - %1$s 撤回了对 %2$s 的邀请 - %1$s 让未来的聊天室历史记录对 %2$s 可见 - %1$s 更新了他的个人档案 %2$s - %1$s 向 %2$s 发送了加入聊天室的邀请 - %1$s 接受了 %2$s 的邀请 - 无法撤回 - %1$s:%2$s - %1$s 发送了一张贴纸。 - 空聊天室 - 来自 %s 的邀请 - 聊天室邀请 - %1$s 和 %2$s - - %1$s 与其他 %2$d 位 - - 消息已被移除 - 消息已被 %1$s 移除 - 消息已被移除 [原因: %1$s] - 消息已被 %1$s 移除 [原因: %2$s] - 初始化同步: -\n正在导入账号… - 初始化同步: -\n正在导入加密数据 - 初始化同步: -\n正在导入聊天室 - 初始化同步: -\n正在导入已加入的聊天室 - 初始化同步: -\n正在导入已邀请的聊天室 - 初始化同步: -\n正在导入已离开的聊天室 - 初始化同步: -\n正在导入社区 - 初始化同步: -\n正在导入账号数据 - %s 升级了此聊天室。 - 正在发送消息… - 清除正在发送队列 - %1$s 撤回了对 %2$s 加入聊天室的邀请 - %1$s 的邀请。理由:%2$s - %1$s 邀请了 %2$s。理由:%3$s - %1$s 邀请了您。理由:%2$s - %1$s 加入了聊天室。理由:%2$s - %1$s 离开了聊天室。理由:%2$s - %1$s 已拒绝邀请。理由:%2$s - %1$s 踢走了 %2$s。理由:%3$s - %1$s 解封了 %2$s。理由:%3$s - %1$s 封禁了 %2$s。理由:%3$s - %1$s 已发送邀请给 %2$s 来加入聊天室。理由:%3$s - %1$s 撤销了 %2$s 加入聊天室的邀請。理由:%3$s - %1$s 接受 %2$s 的邀請。理由:%3$s - %1$s 撤回了对 %2$s 的邀请。理由:%3$s - - %1$s 新增了 %2$s 为此聊天室的地址。 - - - %1$s 移除了 %2$s 作为此聊天室额地址。 - - %1$s 为此聊天室新增了 %2$s 并移除 %3$s 地址。 - %1$s 将此聊天室的主地址设为了 %2$s。 - %1$s 为此聊天室移除了主地址。 - %1$s 已允许访客加入聊天室。 - %1$s 已禁止访客加入聊天室。 - %1$s 已开启端到端加密。 - %1$s 已开启端到端加密(无法识别的演算法 %2$s)。 - %s 正在请求验证您的密钥,但您的客户端不支援聊天中密钥验证。 您将必须使用旧版的密钥验证来验证金钥。 - %1$s 创建了这个聊天室 - 您发送了一张图片。 - 您发送了一张贴纸。 - 您的邀请 - 您创建了这个聊天室 - 您邀请了 %1$s - 您加入了聊天室 - 您离开了聊天室 - 您拒绝了邀请 - 您移除了 %1$s - 您解封了 %1$s - 您封禁了 %1$s - 您撤回了对 %1$s 的邀请 - 您更换了您的头像 - 您将您的昵称设置为 %1$s - 您将您的昵称从 %1$s 改为 %2$s - 您移除了您的昵称 (%1$s) - 您把主题改为:%1$s - %1$s 变更了聊天室头像 - 您变更了聊天室头像 - 您把聊天室名称改为:%1$s - 您发起了一次视频通话。 - 您发起了一次语音通话。 - %s 发送了数据以建立通话。 - 您发送了数据以建立通话。 - 您接听了通话。 - 您结束了通话。 - 您已让未来的聊天室记录对 %1$s 可见 - 您开启了端到端加密(%1$s) - 您升级了此聊天室。 - 您请求了 VoIP 会议 - 您移除了聊天室名称 - 您移除了聊天室主题 - %1$s 移除了聊天室头像 - 您移除了聊天室头像 - 您更新了您的个人档案 %1$s - 您向 %1$s 发送了加入聊天室的邀请 - 您已撤回了对 %1$s 加入聊天室的邀请 - 您接受了 %1$s 的邀请 - %1$s 添加了 %2$s 小部件 - 您添加了 %1$s 小部件 - %1$s 移除了 %2$s 小部件 - 您移除了 %1$s 小部件 - %1$s 修改了 %2$s 小部件 - 您修改了 %1$s 小部件 - 管理员 - 审核员 - 默认 - 自定义(%1$d) - 自定义 - 您更改了%1$s 的权力等级。 - %1$s 更改了 %2$s 的权力等级。 - %1$s 从 %2$s 到 %3$s - 您的邀请。理由:%1$s - 您邀请了 %1$s。理由:%2$s - 您加入了聊天室。理由:%1$s - 您离开了聊天室。理由:%1$s - 您拒绝了邀请。理由:%1$s - 您踢走了 %1$s。理由:%2$s - 您解封了 %1$s。理由:%2$s - 您封禁了 %1$s。理由:%2$s - 您已发送邀请给 %1$s 来加入聊天室。理由:%2$s - 您撤销了 %1$s 加入聊天室的邀请。理由:%2$s - 您接受了 %1$s 的邀请。理由:%2$s - 您撤回了 %1$s 的邀请。理由:%2$s - - 您新增了 %1$s 为此聊天室的地址。 - - - 您移除了此聊天室的 %1$s 地址。 - - 您为此聊天室新增了 %1$s 并移除了 %2$s 地址。 - 您将此聊天室的主地址设为了 %1$s。 - 您移除了此聊天室的主地址。 - 您已允许访客加入聊天室。 - 您已禁止访客加入聊天室。 - 您已开启端到端加密。 - 您已开启端到端加密(无法识别的算法 %1$s)。 - 您已离开。理由:%1$s - %1$s 已离开。理由:%2$s - 您已加入。理由:%1$s - %1$s 已加入。理由:%2$s - 您撤回了对 %1$s 的邀请 - %1$s 撤回了对 %2$s 的邀请 - 您邀请了 %1$s - %1$s 邀请了 %2$s - 您在此处升级。 - %s 在此处升级。 - 您使未来的消息对 %1$s 可见 - %1$s 使未来的消息对 %2$s 可见 - 您离开了聊天室 - %1$s 离开了聊天室 - 您已加入 - %1$s 已加入 - 您创建了讨论 - %1$s 创建了讨论 - 你已阻止客人加入房间。 - %1$s已阻止客人加入房间。 - 你已允许客人加入这里。 - %1$s 已允许客人加入这里。 - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-zh-rTW/strings.xml b/matrix-sdk-android/src/main/res/values-zh-rTW/strings.xml deleted file mode 100644 index 5038e8aab2..0000000000 --- a/matrix-sdk-android/src/main/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,251 +0,0 @@ - - - %1$s:%2$s - %1$s 傳送了一張圖片。 - %s 的邀請 - %1$s 邀請了 %2$s - %1$s 邀請您 - %1$s 已加入聊天室 - %1$s 已離開聊天室 - %1$s 拒絕邀請 - %1$s 踢出 %2$s - %1$s 解除禁止 %2$s - %1$s 禁止 %2$s - %1$s 收回了對 %2$s 的邀請 - %1$s 變更了他們的大頭貼 - %1$s 設定了他們的顯示名稱為 %2$s - %1$s 變更了他們的顯示名稱從 %2$s 到 %3$s - %1$s 移除了他們的顯示名稱 (%2$s) - %1$s 變更主題為:%2$s - %1$s 變更房間名稱為:%2$s - %s 撥出了視訊通話。 - %s 撥出了語音通話。 - %s 回覆了通話。 - %s 結束通話。 - %1$s 讓房間未來可讓 %2$s 看到歷史紀錄 - 所有的房間成員,從他們被邀請的時間開始。 - 所有的房間成員,從他們加入的時間開始。 - 所有的房間成員。 - 任何人。 - 未知 (%s)。 - %1$s 開啟了端對端加密 (%2$s) - %1$s 請求了 VoIP 會議通話 - VoIP 會議通話已開始 - VoIP 會議通話已結束 - (大頭貼也變更了) - %1$s 移除了房間名稱 - %1$s 移除了房間主題 - %1$s 更新了他們的基本資料 %2$s - %1$s 傳送加入房間的邀請給 %2$s - %1$s 接受 %2$s 的邀請 - ** 無法解密:%s ** - 傳送者的裝置並未在此訊息傳送他們的金鑰。 - 無法編輯 - 無法傳送訊息 - 上傳圖片失敗 - 網路錯誤 - Matrix 錯誤 - 目前無法重新加入空房間。 - 已加密的訊息 - 電子郵件 - 電話號碼 - %1$s 傳送了一張貼圖。 - 來自%s 的邀請 - 聊天室邀請 - %1$s 和 %2$s - 空聊天室 - - %1$s 和 和其他 %2$d 個人 - - 訊息已移除 - 訊息已被 %1$s 移除 - 訊息已移除 [理由:%1$s] - 訊息已被 %1$s 移除 [理由:%2$s] - 初始化同步: -\n正在匯入帳號…… - 初始化同步: -\n正在匯入 crypto - 初始化同步: -\n正在匯入聊天室 - 初始化同步: -\n正在匯入已加入的聊天室 - 初始化同步: -\n正在匯入已邀請的聊天室 - 初始化同步: -\n正在匯入已離開的聊天室 - 初始化同步: -\n正在匯入社群 - 初始化同步: -\n正在匯入帳號資料 - %s 已升級此聊天室。 - 正在傳送訊息…… - 清除傳送佇列 - %1$s 撤銷了 %2$s 加入聊天室的邀請 - %1$s 的邀請。理由:%2$s - %1$s 邀請了 %2$s。理由:%3$s - %1$s 邀請了您。理由:%2$s - %1$s 已加入聊天室。理由:%2$s - %1$s 已離開聊天室。理由:%2$s - %1$s 已回絕邀請。理由:%2$s - %1$s 踢走了 %2$s。理由:%3$s - %1$s 取消封鎖了 %2$s。理由:%3$s - %1$s 封鎖了 %2$s。理由:%3$s - %1$s 已傳送邀請給 %2$s 來加入聊天室。理由:%3$s - %1$s 撤銷了 %2$s 加入聊天室的邀請。理由:%3$s - %1$s 接受 %2$s 的邀請。理由:%3$s - %1$s 撤回了對 %2$s 的邀請。理由:%3$s - - %1$s 新增了 %2$s 為此聊天室的地址。 - - - %1$s 移除了此聊天室的 %2$s 地址。 - - %1$s 為此聊天室新增 %2$s 並移除 %3$s 地址。 - %1$s 為此聊天室設定了 %2$s 為主地址。 - %1$s 為此聊天室移除了主要地址。 - %1$s 已允許訪客加入聊天室。 - %1$s 已禁止訪客加入聊天室。 - %1$s 已開啟端到端加密。 - %1$s 已開啟端到端加密(無法識別的演算法 %2$s)。 - %s 正在請求驗證您的金鑰,但您的客戶端不支援聊天中金鑰驗證。您將必須使用舊版的金鑰驗證來驗證金鑰。 - %1$s 建立了聊天室 - 您傳送了圖片。 - 您傳送了貼圖。 - 您的邀請 - 您建立了聊天室 - 您邀請了 %1$s - 您加入了聊天室 - 您離開的聊天室 - 您回絕了邀請 - 您踢除了 %1$s - 您取消封鎖了 %1$s - 您封鎖了 %1$s - 您撤銷了 %1$s 的邀請 - 您變更了您的大頭貼 - 您將您的顯示名稱設定為 %1$s - 您將您的顯示名稱從 %1$s 變更為 %2$s - 您移除了您的顯示名稱(其曾為 %1$s) - 您將主題變更為:%1$s - %1$s 變更了聊天室大頭貼 - 您變更了聊天室大頭貼 - 您將聊天室名稱變更為:%1$s - 您發起了視訊通話。 - 您發起了音訊通話。 - %s 傳送了資料以建立通話。 - 您傳送了資料以建立通話。 - 您接了通話。 - 您結束了通話。 - 您已將未來的聊天室歷史設定為對 %1$s 可見 - 您開啟了端到端加密 (%1$s) - 您升級了此聊天室。 - 您請求了 VoIP 會議 - 您移除了聊天室名稱 - 您移除了聊天室主題 - %1$s 移除了聊天室大頭貼 - 您移除了聊天室大頭貼 - 您更新了您的個人檔案 %1$s - 您傳送了邀請給 %1$s 以加入聊天室 - 您已撤銷對 %1$s 加入聊天室的邀請 - 您接受了 %1$s 的邀請 - %1$s 新增了 %2$s 小工具 - 您新增了 %1$s 小工具 - %1$s 移除了 %2$s 小工具 - 您移除了 %1$s 小工具 - %1$s 修改了 %2$s 小工具 - 您修改了 %1$s 小工具 - 管理員 - 板主 - 預設 - 自訂 (%1$d) - 自訂 - 您變更了 %1$s 的權力等級。 - %1$s 變更了 %2$s 的權力等級。 - %1$s 從 %2$s 到 %3$s - 您的邀請。理由:%1$s - 您邀請了 %1$s。理由:%2$s - 您加入了聊天室。理由:%1$s - 您離開了聊天室。理由:%1$s - 您回絕了邀請。理由:%1$s - 您踢除了 %1$s。理由:%2$s - 您取消封鎖了 %1$s。理由:%2$s - 您封鎖了 %1$s。理由:%2$s - 您傳甕了邀請給 %1$s 以加入聊天室。理由:%2$s - 您撤銷了 %1$s 加入聊天室的邀請。理由:%2$s - 您接受了 %1$s 的邀請。理由:%2$s - 您撤回了 %1$s 的邀請。理由:%2$s - - 您為此聊天室新增了 %1$s 作為地址。 - - - 您為此聊天室移除了 %1$s 作為地址。 - - 您為此聊天室新增了 %1$s 並移除了 %2$s 作為地址。 - 您將此聊天室的主要地址設定為 %1$s。 - 您將此聊天室的主要地址移除。 - 您已允許訪客加入聊天室。 - 您已阻止訪客加入聊天室。 - 您開啟了端到端加密。 - 您開啟了端到端加密(無法識別的演算法 %1$s)。 - 您已避免訪客加入此聊天室。 - %1$s 已避免訪客加入此聊天室。 - 您已允許訪客加入這裡。 - %1$s 已允許訪客加入這裡。 - 您已離開。理由:%1$s - %1$s 已離開。理由:%2$s - 您已加入。理由:%1$s - %1$s 已加入。理由:%2$s - 您已撤銷對 %1$s 的邀請 - %1$s 已撤銷對 %2$s 的邀請 - 您已邀請了 %1$s - %1$s 邀請了 %2$s - 您已在此升級。 - %s 已在此升級。 - 您讓未來的訊息對 %1$s 可見 - %1$s 已讓未來的訊息對 %2$s 可見 - 您已離開聊天室 - %1$s 已離開聊天室 - 您已加入 - %1$s 已加入 - 您已建立此討論 - %1$s 已建立此討論 - 空的聊天室(曾為 %s) - - %1$s, %2$s, %3$s 與 %4$d 個其他 - - %1$s, %2$s, %3$s 與 %4$s - %1$s, %2$s 與 %3$s - 🎉 禁止所有伺服器參與!無法再使用此聊天室。 - 無變更。 - • 禁止伺服器符合 IP 文字。 - • 允許伺服器符合 IP 文字。 - • 伺服器符合 %s 已從允許清單中移除。 - • 允許伺服器符合 %s。 - • 伺服器符合 %s 已從禁止清單中移除。 - • 現在禁止伺服器符合 %s。 - 您為此聊天室變更了伺服器 ACL。 - %s 為此聊天是變更了伺服器 ACL。 - • 禁止伺服器符合 IP 文字。 - • 允許伺服器符合 IP 文字。 - • 已允許伺服器符合 %s。 - • 已禁止伺服器符合 %s。 - 您為此聊天是設定了伺服器 ACL。 - %s 為此聊天是設定了伺服器 ACL。 - 您變更了此聊天室的地址。 - %1$s 變更了此聊天室的地址。 - 您為此聊天室變更了主要及備用地址。 - %1$s 為此聊天室變更了主要及備用地址。 - 您為此聊天室變更了備用地址。 - %1$s 變更了此聊天室的備用地址。 - - 您為此聊天室移除了備用地址 %1$s。 - - - %1$s 已為此聊天室移除備用地址 %2$s。 - - - 您為此聊天室新增了備用地址 %1$s。 - - - %1$s 已為此聊天室新增了備用地址 %2$s。 - - \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values/strings.xml b/matrix-sdk-android/src/main/res/values/strings.xml deleted file mode 100644 index 26b9bc19d9..0000000000 --- a/matrix-sdk-android/src/main/res/values/strings.xml +++ /dev/null @@ -1,315 +0,0 @@ - - - %1$s: %2$s - %1$s sent an image. - You sent an image. - %1$s sent a sticker. - You sent a sticker. - - %s\'s invitation - Your invitation - %1$s created the room - You created the room - %1$s created the discussion - You created the discussion - %1$s invited %2$s - You invited %1$s - %1$s invited you - %1$s joined the room - You joined the room - %1$s joined - You joined - %1$s left the room - You left the room - %1$s left the room - You left the room - %1$s rejected the invitation - You rejected the invitation - %1$s kicked %2$s - You kicked %1$s - %1$s unbanned %2$s - You unbanned %1$s - %1$s banned %2$s - You banned %1$s - %1$s withdrew %2$s\'s invitation - You withdrew %1$s\'s invitation - %1$s changed their avatar - You changed your avatar - %1$s set their display name to %2$s - You set your display name to %1$s - %1$s changed their display name from %2$s to %3$s - You changed your display name from %1$s to %2$s - %1$s removed their display name (it was %2$s) - You removed your display name (it was %1$s) - %1$s changed the topic to: %2$s - You changed the topic to: %1$s - %1$s changed the room avatar - You changed the room avatar - %1$s changed the room name to: %2$s - You changed the room name to: %1$s - %s placed a video call. - You placed a video call. - %s placed a voice call. - You placed a voice call. - %s sent data to setup the call. - You sent data to setup the call. - %s answered the call. - You answered the call. - %s ended the call. - You ended the call. - %1$s made future room history visible to %2$s - You made future room history visible to %1$s - %1$s made future messages visible to %2$s - You made future messages visible to %1$s - all room members, from the point they are invited. - all room members, from the point they joined. - all room members. - anyone. - unknown (%s). - %1$s turned on end-to-end encryption (%2$s) - You turned on end-to-end encryption (%1$s) - %s upgraded this room. - You upgraded this room. - %s upgraded here. - You upgraded here. - %s set the server ACLs for this room. - You set the server ACLs for this room. - • Server matching %s are banned. - • Server matching %s are allowed. - • Server matching IP literals are allowed. - • Server matching IP literals are banned. - - %s changed the server ACLs for this room. - You changed the server ACLs for this room. - • Server matching %s are now banned. - • Server matching %s were removed from the ban list. - • Server matching %s are now allowed. - • Server matching %s were removed from the allowed list. - • Server matching IP literals are now allowed. - • Server matching IP literals are now banned. - No change. - 🎉 All servers are banned from participating! This room can no longer be used. - - %1$s requested a VoIP conference - You requested a VoIP conference - VoIP conference started - VoIP conference finished - - (avatar was changed too) - %1$s removed the room name - You removed the room name - %1$s removed the room topic - You removed the room topic - %1$s removed the room avatar - You removed the room avatar - Message removed - Message removed by %1$s - Message removed [reason: %1$s] - Message removed by %1$s [reason: %2$s] - %1$s updated their profile %2$s - You updated your profile %1$s - %1$s sent an invitation to %2$s to join the room - You sent an invitation to %1$s to join the room - %1$s invited %2$s - You invited %1$s - %1$s revoked the invitation for %2$s to join the room - You revoked the invitation for %1$s to join the room - %1$s revoked the invitation for %2$s - You revoked the invitation for %1$s - %1$s accepted the invitation for %2$s - You accepted the invitation for %1$s - - %1$s added %2$s widget - You added %1$s widget - %1$s removed %2$s widget - You removed %1$s widget - %1$s modified %2$s widget - You modified %1$s widget - - Video conference started by %1$s - You started video conference - Video conference ended by %1$s - You ended video conference - Video conference modified by %1$s - You modified video conference - - Admin - Moderator - Default - Custom (%1$d) - Custom - - - You changed the power level of %1$s. - - %1$s changed the power level of %2$s. - - %1$s from %2$s to %3$s - - ** Unable to decrypt: %s ** - The sender\'s device has not sent us the keys for this message. - - - - - Could not redact - Unable to send message - - Failed to upload image - - - Network error - Matrix error - - - - - - - - - It is not currently possible to re-join an empty room. - - Encrypted message - - - Email address - Phone number - - - Invite from %s - Room Invite - - - %1$s and %2$s - - %1$s, %2$s and %3$s - - %1$s, %2$s, %3$s and %4$s - - - %1$s, %2$s, %3$s and %4$d other - %1$s, %2$s, %3$s and %4$d others - - - %1$s and 1 other - %1$s and %2$d others - - - Empty room - Empty room (was %s) - - Initial Sync:\nImporting account… - Initial Sync:\nImporting crypto - Initial Sync:\nImporting Rooms - Initial Sync:\nImporting Joined Rooms - Initial Sync:\nImporting Invited Rooms - Initial Sync:\nImporting Left Rooms - Initial Sync:\nImporting Communities - Initial Sync:\nImporting Account Data - - Sending message… - Clear sending queue - - %1$s\'s invitation. Reason: %2$s - Your invitation. Reason: %1$s - %1$s invited %2$s. Reason: %3$s - You invited %1$s. Reason: %2$s - %1$s invited you. Reason: %2$s - %1$s joined the room. Reason: %2$s - You joined the room. Reason: %1$s - %1$s joined. Reason: %2$s - You joined. Reason: %1$s - %1$s left the room. Reason: %2$s - You left the room. Reason: %1$s - %1$s left. Reason: %2$s - You left. Reason: %1$s - %1$s rejected the invitation. Reason: %2$s - You rejected the invitation. Reason: %1$s - %1$s kicked %2$s. Reason: %3$s - You kicked %1$s. Reason: %2$s - %1$s unbanned %2$s. Reason: %3$s - You unbanned %1$s. Reason: %2$s - %1$s banned %2$s. Reason: %3$s - You banned %1$s. Reason: %2$s - %1$s sent an invitation to %2$s to join the room. Reason: %3$s - You sent an invitation to %1$s to join the room. Reason: %2$s - %1$s revoked the invitation for %2$s to join the room. Reason: %3$s - You revoked the invitation for %1$s to join the room. Reason: %2$s - %1$s accepted the invitation for %2$s. Reason: %3$s - You accepted the invitation for %1$s. Reason: %2$s - %1$s withdrew %2$s\'s invitation. Reason: %3$s - You withdrew %1$s\'s invitation. Reason: %2$s - - - %1$s added %2$s as an address for this room. - %1$s added %2$s as addresses for this room. - - - - You added %1$s as an address for this room. - You added %1$s as addresses for this room. - - - - %1$s removed %2$s as an address for this room. - %1$s removed %2$s as addresses for this room. - - - - You removed %1$s as an address for this room. - You removed %1$s as addresses for this room. - - - %1$s added %2$s and removed %3$s as addresses for this room. - You added %1$s and removed %2$s as addresses for this room. - - "%1$s set the main address for this room to %2$s." - "You set the main address for this room to %1$s." - "%1$s removed the main address for this room." - "You removed the main address for this room." - - - %1$s added the alternative address %2$s for this room. - %1$s added the alternative addresses %2$s for this room. - - - - You added the alternative address %1$s for this room. - You added the alternative addresses %1$s for this room. - - - - %1$s removed the alternative address %2$s for this room. - %1$s removed the alternative addresses %2$s for this room. - - - - You removed the alternative address %1$s for this room. - You removed the alternative addresses %1$s for this room. - - - %1$s changed the alternative addresses for this room. - You changed the alternative addresses for this room. - %1$s changed the main and alternative addresses for this room. - You changed the main and alternative addresses for this room. - %1$s changed the addresses for this room. - You changed the addresses for this room. - - "%1$s has allowed guests to join the room." - "You have allowed guests to join the room." - "%1$s has allowed guests to join here." - "You have allowed guests to join here." - "%1$s has prevented guests from joining the room." - "You have prevented guests from joining the room." - "%1$s has prevented guests from joining the room." - "You have prevented guests from joining the room." - - %1$s turned on end-to-end encryption. - You turned on end-to-end encryption. - %1$s turned on end-to-end encryption (unrecognised algorithm %2$s). - You turned on end-to-end encryption (unrecognised algorithm %1$s). - - %s is requesting to verify your key, but your client does not support in-chat key verification. You will need to use legacy key verification to verify keys. - - diff --git a/multipicker/build.gradle b/multipicker/build.gradle index 10dc18e488..89a692a782 100644 --- a/multipicker/build.gradle +++ b/multipicker/build.gradle @@ -43,8 +43,8 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.2.0' - implementation "androidx.fragment:fragment-ktx:1.3.0-beta01" - implementation 'androidx.exifinterface:exifinterface:1.3.1' + implementation "androidx.fragment:fragment-ktx:1.3.0" + implementation 'androidx.exifinterface:exifinterface:1.3.2' // Log implementation 'com.jakewharton.timber:timber:4.7.1' diff --git a/tools/check/forbidden_strings_in_code.txt b/tools/check/forbidden_strings_in_code.txt index e9b29d99ba..468fe717c0 100644 --- a/tools/check/forbidden_strings_in_code.txt +++ b/tools/check/forbidden_strings_in_code.txt @@ -161,7 +161,7 @@ Formatter\.formatShortFileSize===1 # android\.text\.TextUtils ### This is not a rule, but a warning: the number of "enum class" has changed. For Json classes, it is mandatory that they have `@JsonClass(generateAdapter = false)`. If the enum is not used as a Json class, change the value in file forbidden_strings_in_code.txt -enum class===88 +enum class===92 ### Do not import temporary legacy classes import org.matrix.android.sdk.internal.legacy.riot===3 @@ -175,3 +175,6 @@ PreferenceManager\.getDefaultSharedPreferences==2 ### Use ViewBindings # findViewById + +### Do not use `template_` string. Please remove the prefix `template_` to use the generated resource instead. +R\.string\.template_ \ No newline at end of file diff --git a/tools/check/forbidden_strings_in_resources.txt b/tools/check/forbidden_strings_in_resources.txt index 6fb6b184ba..cefeeb6351 100644 --- a/tools/check/forbidden_strings_in_resources.txt +++ b/tools/check/forbidden_strings_in_resources.txt @@ -40,6 +40,9 @@ android\:summary=\"[^@|\%s] app\:ms_floatingLabelText=\"[^@] app\:ms_hint=\"[^@] +### Do not use `template_` string. Please remove the prefix `template_` to use the generated resource instead. +\"@string/template_ + ### "DO NOT COMMIT" has been committed DO NOT COMMIT diff --git a/tools/hs_diag.py b/tools/hs_diag.py index ded10a562d..7d7a947c4c 100755 --- a/tools/hs_diag.py +++ b/tools/hs_diag.py @@ -48,7 +48,8 @@ print("Get information from " + baseUrl) items = [ # [Title, URL, True for GET request and False for POST request] ["Well-known", baseUrl + ".well-known/matrix/client", True] - , ["Version", baseUrl + "_matrix/client/versions", True] + , ["API version", baseUrl + "_matrix/client/versions", True] + , ["Homeserver version", baseUrl + "_matrix/federation/v1/version", True] , ["Login flow", baseUrl + "_matrix/client/r0/login", True] , ["Registration flow", baseUrl + "_matrix/client/r0/register", False] # Useless , ["Username availability", baseUrl + "_matrix/client/r0/register/available?username=benoit", True] diff --git a/tools/install/androidSelectDevice.sh b/tools/install/androidSelectDevice.sh new file mode 100755 index 0000000000..d04afb70e1 --- /dev/null +++ b/tools/install/androidSelectDevice.sh @@ -0,0 +1,116 @@ +#! /bin/bash +#===================================================================== +# Selects an android device +# Copyright (C) 2012-2020 Diego Torres Milano. All rights reserved. +# +# See: +# - http://dtmilano.blogspot.ca/2013/01/android-select-device.html +# - http://dtmilano.blogspot.ca/2012/03/selecting-adb-device.html +# for details on usage. +#===================================================================== + +# BMA: GIST FROM https://gist.github.com/dtmilano/4537110 + +get_adb_devices() { + adb $ADB_SERVER devices $LONG 2>&1 | tail -n +2 | sed '/^$/d' +} + +git_pull() { + [[ "$UNAME" == 'Linux' ]] && OPT=-e + ASD=$(readlink $OPT $0) + if [[ -n "$ASD" ]] + then + DIR=$(dirname $ASD) + if [[ -n "$DIR" && -d "$DIR/.git" ]] + then + (cd $DIR && git pull) + fi + fi +} + +PROGNAME=$(basename $0) +VERSION="3.3.0" +UNAME=$(uname) +DEVICE_OPT= +LONG= +ADB_SERVER= + +git_pull > /dev/null + +for opt in "$@" +do + case "$opt" in + -d|-e|-s|-t) + DEVICE_OPT=$opt + ;; + + -l|--long) + LONG=-l + ;; + + start-server|kill-server|connect|pair|-help) + exit 0 + ;; + + -V|--version) + echo "$PROGNAME version $VERSION" + exit 0 + ;; + esac +done +[ -n "$DEVICE_OPT" ] && exit 0 +DEV=$(get_adb_devices) +if [ -z "$DEV" ] +then + echo "$PROGNAME: ERROR: There's no locally connected devices." >&2 + read -p "Do you want to connect to a remote adb server? [Y/n]: " REPLY + case "$REPLY" in + n|N) + exit 1 + ;; + + y|Y|"") + read -p "ADB server IP: " IP + ADB_SERVER="-H $IP" + DEV=$(get_adb_devices) + ;; + esac +elif echo "$DEV" | grep -q 'daemon started successfully' +then + # try again + DEV=$(get_adb_devices) +fi +N=$(echo "$DEV" | wc -l | sed 's/ //g') + +case $N in +1) + # only one device detected + D=$DEV + ;; + +*) + # more than one device detected + OLDIFS=$IFS + IFS=" +" + PS3="Select the device to use, to quit: " + select D in $DEV + do + [ "$REPLY" = 'q' -o "$REPLY" = 'Q' ] && exit 2 + [ -n "$D" ] && break + done < /dev/tty + + IFS=$OLDIFS + ;; +esac + +if [ -z "$D" ] +then + echo "$PROGNAME: ERROR: target device couldn't be determined" >&2 + exit 1 +fi + +# this didn't work on Darwin +# echo "-s ${D%% *}" +### BMA Modified printf -- '-s %s\n' "$(echo ${D} | sed 's/ .*$//')" +printf -- '%s' "$(echo ${D} | sed 's/ .*$//')" diff --git a/tools/install/installFromBuildkite.sh b/tools/install/installFromBuildkite.sh new file mode 100755 index 0000000000..e47902e31b --- /dev/null +++ b/tools/install/installFromBuildkite.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash + +# Exit on any error +set -e + +if [[ "$#" -ne 1 ]]; then + echo "Usage: $0 BUILDKITE_TOKEN" >&2 + exit 1 +fi + +buildkiteToken=$1 + +# Path where the app is cloned (it's where this project has been cloned) +appPath=$(dirname $(dirname $(dirname $0))) +# Path where the APK will be downloaded from Buildkite (it's a dir) +baseImportPath="${appPath}/tmp/DebugApks" + +# Select device +serialNumber=$(${appPath}/tools/install/androidSelectDevice.sh) + +# Detect device architecture + +arch=$(adb -s ${serialNumber} shell getprop ro.product.cpu.abi) + +# FDroid or Gplay ? +echo +read -p "fdroid or gplay (default to gplay)? " fdroidOrGplay +fdroidOrGplay=${fdroidOrGplay:-gplay} + +echo +echo "Will install ${fdroidOrGplay} version on device ${serialNumber} with arch ${arch}" + +# Buildkite build number +echo +read -p "Buildkite build number (ex: '1792')? " buildkiteBuildNumber + +# Download files + +targetPath=${baseImportPath}/${buildkiteBuildNumber} + +filename="vector-${fdroidOrGplay}-${arch}-debug.apk" + +fullApkPath="${targetPath}/${filename}" + +# Check if file already exists +if test -f "$fullApkPath"; then + read -p "$fullApkPath already exists. Override (yes/no) default to no ? " download + download=${download:-no} +else + download="yes" +fi + +# Ignore error from now +set +e + +if [ ${download} == "yes" ]; then + echo "Downloading ${filename}..." + python3 ${appPath}/tools/release/download_buildkite_artifacts.py \ + --token ${buildkiteToken} \ + --build ${buildkiteBuildNumber} \ + --directory ${targetPath} \ + --filename ${filename} \ + --ignoreErrors +fi + +echo "Installing ${filename} to device ${serialNumber}..." +adb -s ${serialNumber} install -r ${fullApkPath} + +# Check error and propose to uninstall and retry installing +if [[ "$?" -ne 0 ]]; then + read -p "Error, do you want to uninstall the application then retry (yes/no) default to no ? " retry + retry=${retry:-no} + if [ ${retry} == "yes" ]; then + echo "Uninstalling..." + adb -s ${serialNumber} uninstall im.vector.app.debug + echo "Installing again..." + adb -s ${serialNumber} install -r ${fullApkPath} + fi +fi diff --git a/tools/release/download_buildkite_artifacts.py b/tools/release/download_buildkite_artifacts.py index cd1abecfa5..7a824be806 100755 --- a/tools/release/download_buildkite_artifacts.py +++ b/tools/release/download_buildkite_artifacts.py @@ -81,7 +81,9 @@ base_url = "https://api.buildkite.com/v2/organizations/%s/pipelines/%s/builds/%s buildkite_build_state_url = base_url -print("Getting build state of project %s/%s build %s" % (ORG_SLUG, PIPELINE_SLUG, build_str)) +buildkite_url = "https://buildkite.com/%s/%s/builds/%s" % (ORG_SLUG, PIPELINE_SLUG, build_str) + +print("Getting build state of project %s/%s build %s (%s)" % (ORG_SLUG, PIPELINE_SLUG, build_str, buildkite_url)) if args.verbose: print("Url: %s" % buildkite_build_state_url) @@ -141,7 +143,7 @@ else: targetDir = args.directory if not args.simulate: - os.mkdir(targetDir) + os.makedirs(targetDir, exist_ok=True) for elt in data: if args.verbose: diff --git a/vector/build.gradle b/vector/build.gradle index 42cedaaf3e..8bcc5bc02b 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -5,6 +5,7 @@ apply plugin: 'com.google.android.gms.oss-licenses-plugin' apply plugin: 'kotlin-android' apply plugin: 'kotlin-parcelize' apply plugin: 'kotlin-kapt' +apply plugin: 'placeholder-resolver' kapt { correctErrorTypes = true @@ -13,7 +14,7 @@ kapt { // Note: 2 digits max for each value ext.versionMajor = 1 ext.versionMinor = 1 -ext.versionPatch = 0 +ext.versionPatch = 1 static def getGitTimestamp() { def cmd = 'git show -s --format=%ct' @@ -136,6 +137,8 @@ android { buildConfigField "String", "BUILD_NUMBER", "\"${buildNumber}\"" resValue "string", "build_number", "\"${buildNumber}\"" + buildConfigField "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy", "outboundSessionKeySharingStrategy", "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy.WhenTyping" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // Keep abiFilter for the universalApk @@ -287,21 +290,22 @@ android { dependencies { - def epoxy_version = '4.1.0' - def fragment_version = '1.3.0-beta01' + def epoxy_version = '4.4.2' + def fragment_version = '1.3.0' def arrow_version = "0.8.2" def markwon_version = '4.1.2' - def big_image_viewer_version = '1.6.2' - def glide_version = '4.11.0' + def big_image_viewer_version = '1.7.1' + def glide_version = '4.12.0' def moshi_version = '1.11.0' - def daggerVersion = '2.31' - def autofill_version = "1.0.0" - def work_version = '2.4.0' + def daggerVersion = '2.33' + def autofill_version = "1.1.0" + def work_version = '2.5.0' def arch_version = '2.1.0' def lifecycle_version = '2.2.0' + def rxbinding_version = '3.1.0' // Tests - def kluent_version = '1.61' + def kluent_version = '1.65' def androidxTest_version = '1.3.0' def espresso_version = '3.3.0' @@ -316,16 +320,16 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" - implementation "androidx.recyclerview:recyclerview:1.2.0-alpha06" + implementation "androidx.recyclerview:recyclerview:1.2.0-beta02" implementation 'androidx.appcompat:appcompat:1.2.0' implementation "androidx.fragment:fragment-ktx:$fragment_version" implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - implementation "androidx.sharetarget:sharetarget:1.0.0" + implementation "androidx.sharetarget:sharetarget:1.1.0" implementation 'androidx.core:core-ktx:1.3.2' implementation "androidx.media:media:1.2.1" implementation "org.threeten:threetenbp:1.4.0:no-tzdb" - implementation "com.gabrielittner.threetenbp:lazythreetenbp:0.7.0" + implementation "com.gabrielittner.threetenbp:lazythreetenbp:0.9.0" implementation "com.squareup.moshi:moshi-adapters:$moshi_version" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" @@ -338,16 +342,16 @@ dependencies { implementation 'com.facebook.stetho:stetho:1.5.1' // Phone number https://github.com/google/libphonenumber - implementation 'com.googlecode.libphonenumber:libphonenumber:8.10.23' + implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.19' // rx - implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0' + implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.jakewharton.rxrelay2:rxrelay:2.1.1' // RXBinding - implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0' - implementation 'com.jakewharton.rxbinding3:rxbinding-appcompat:3.0.0' - implementation 'com.jakewharton.rxbinding3:rxbinding-material:3.0.0' + implementation "com.jakewharton.rxbinding3:rxbinding:$rxbinding_version" + implementation "com.jakewharton.rxbinding3:rxbinding-appcompat:$rxbinding_version" + implementation "com.jakewharton.rxbinding3:rxbinding-material:$rxbinding_version" implementation("com.airbnb.android:epoxy:$epoxy_version") implementation "com.airbnb.android:epoxy-glide-preloading:$epoxy_version" @@ -369,25 +373,25 @@ dependencies { // UI implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' - implementation 'com.google.android.material:material:1.3.0-alpha04' + implementation 'com.google.android.material:material:1.3.0' implementation 'me.gujun.android:span:1.7' implementation "io.noties.markwon:core:$markwon_version" implementation "io.noties.markwon:html:$markwon_version" - implementation 'com.googlecode.htmlcompressor:htmlcompressor:1.4' + implementation 'com.googlecode.htmlcompressor:htmlcompressor:1.5.2' implementation 'me.saket:better-link-movement-method:2.2.0' - implementation 'com.google.android:flexbox:1.1.1' + implementation 'com.google.android:flexbox:2.0.1' implementation "androidx.autofill:autofill:$autofill_version" implementation 'jp.wasabeef:glide-transformations:4.3.0' implementation 'com.github.vector-im:PFLockScreen-Android:1.0.0-beta12' // Custom Tab - implementation 'androidx.browser:browser:1.2.0' + implementation 'androidx.browser:browser:1.3.0' // Passphrase strength helper - implementation 'com.nulab-inc:zxcvbn:1.2.7' + implementation 'com.nulab-inc:zxcvbn:1.4.0' //Alerter - implementation 'com.tapadoo.android:alerter:5.1.2' + implementation 'com.tapadoo.android:alerter:7.0.1' implementation 'com.otaliastudios:autocomplete:1.1.0' @@ -412,14 +416,14 @@ dependencies { implementation 'me.leolin:ShortcutBadger:1.1.22@aar' // Chat effects - implementation 'nl.dionsegijn:konfetti:1.2.5' + implementation 'nl.dionsegijn:konfetti:1.2.6' implementation 'com.github.jetradarmobile:android-snowfall:1.2.0' // DI implementation "com.google.dagger:dagger:$daggerVersion" kapt "com.google.dagger:dagger-compiler:$daggerVersion" // gplay flavor only - gplayImplementation('com.google.firebase:firebase-messaging:21.0.0') { + gplayImplementation('com.google.firebase:firebase-messaging:21.0.1') { exclude group: 'com.google.firebase', module: 'firebase-core' exclude group: 'com.google.firebase', module: 'firebase-analytics' exclude group: 'com.google.firebase', module: 'firebase-measurement-connector' @@ -442,7 +446,7 @@ dependencies { // QR-code // Stick to 3.3.3 because of https://github.com/zxing/zxing/issues/1170 - implementation 'com.google.zxing:core:3.3.3' + implementation 'com.google.zxing:core:3.4.1' implementation 'me.dm7.barcodescanner:zxing:1.9.13' // Emoji Keyboard @@ -452,7 +456,7 @@ dependencies { implementation 'im.dlg:android-dialer:1.2.5' // TESTS - testImplementation 'junit:junit:4.13' + testImplementation 'junit:junit:4.13.2' testImplementation "org.amshove.kluent:kluent-android:$kluent_version" // Plant Timber tree for test testImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1' @@ -472,7 +476,7 @@ dependencies { // Plant Timber tree for test androidTestImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1' // "The one who serves a great Espresso" - androidTestImplementation('com.schibsted.spain:barista:3.7.0') { + androidTestImplementation('com.schibsted.spain:barista:3.8.0') { exclude group: 'org.jetbrains.kotlin' } } diff --git a/vector/lint.xml b/vector/lint.xml index 28da13ca8d..caed34f2d6 100644 --- a/vector/lint.xml +++ b/vector/lint.xml @@ -3,7 +3,7 @@ - + @@ -12,6 +12,7 @@ + @@ -65,6 +66,13 @@ - - + + + + + + diff --git a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt index 338d57fea8..6f8056de13 100644 --- a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt +++ b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt @@ -23,7 +23,6 @@ import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.action.ViewActions.closeSoftKeyboard import androidx.test.espresso.action.ViewActions.longClick import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItem -import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.hasDescendant import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.withId @@ -145,7 +144,7 @@ class UiAllScreensSanityTest { } private fun ignoreVerification() { - Thread.sleep(6000) + sleep(6000) val activity = EspressoHelper.getCurrentActivity()!! val popup = activity.findViewById(com.tapadoo.alerter.R.id.llAlertBackground) @@ -155,7 +154,7 @@ class UiAllScreensSanityTest { assertDisplayed(R.id.bottomSheetFragmentContainer) - onView(ViewMatchers.isRoot()).perform(SleepViewAction.sleep(2000)) + onView(isRoot()).perform(SleepViewAction.sleep(2000)) clickOn(R.string.skip) assertDisplayed(R.string.are_you_sure) @@ -206,12 +205,12 @@ class UiAllScreensSanityTest { // Test quick reaction longClickOnMessage() // Add quick reaction - clickOn("👍") + clickOn("\uD83D\uDC4D️") // 👍 sleep(1000) // Open reactions - longClickOn("👍") + longClickOn("\uD83D\uDC4D️") // 👍 pressBack() // Test add reaction @@ -226,6 +225,8 @@ class UiAllScreensSanityTest { clickOn(R.string.edit) // TODO Cancel action writeTo(R.id.composerEditText, "Hello universe!") + // Wait a bit for the keyboard layout to update + sleep(30) clickOn(R.id.sendButton) // Open edit history longClickOnMessage("Hello universe! (edited)") @@ -277,13 +278,18 @@ class UiAllScreensSanityTest { assertDisplayed(R.id.roomProfileAvatarView) - // Room addresses + // Leave clickListItem(R.id.matrixProfileRecyclerView, 13) + clickDialogNegativeButton() + + // Advanced + // Room addresses + clickListItem(R.id.matrixProfileRecyclerView, 15) onView(isRoot()).perform(waitForView(withText(R.string.room_alias_published_alias_title))) pressBack() // Room permissions - clickListItem(R.id.matrixProfileRecyclerView, 15) + clickListItem(R.id.matrixProfileRecyclerView, 17) onView(isRoot()).perform(waitForView(withText(R.string.room_permissions_title))) clickOn(R.string.room_permissions_change_room_avatar) clickDialogNegativeButton() @@ -292,10 +298,6 @@ class UiAllScreensSanityTest { clickOn(R.string.hide_advanced) pressBack() - // Leave - clickListItem(R.id.matrixProfileRecyclerView, 17) - clickDialogNegativeButton() - // Menu share // clickMenu(R.id.roomProfileShareAction) // pressBack() @@ -483,6 +485,9 @@ class UiAllScreensSanityTest { clickOn(R.string.add_identity_server) pressBack() pressBack() + // Home server + clickOnPreference(R.string.settings_home_server) + pressBack() // Identity server clickOnPreference(R.string.settings_identity_server) pressBack() diff --git a/vector/src/debug/res/layout/item_test_linkify.xml b/vector/src/debug/res/layout/item_test_linkify.xml index 19bebeaf50..89d1dade0d 100644 --- a/vector/src/debug/res/layout/item_test_linkify.xml +++ b/vector/src/debug/res/layout/item_test_linkify.xml @@ -12,7 +12,6 @@ android:orientation="vertical"> @@ -26,7 +25,6 @@ tools:text="www.example.org" /> diff --git a/vector/src/gplay/java/im/vector/app/gplay/push/fcm/VectorFirebaseMessagingService.kt b/vector/src/gplay/java/im/vector/app/gplay/push/fcm/VectorFirebaseMessagingService.kt index cfd241d4f9..4d2cbecfe4 100755 --- a/vector/src/gplay/java/im/vector/app/gplay/push/fcm/VectorFirebaseMessagingService.kt +++ b/vector/src/gplay/java/im/vector/app/gplay/push/fcm/VectorFirebaseMessagingService.kt @@ -253,25 +253,15 @@ class VectorFirebaseMessagingService : FirebaseMessagingService() { * Try to create an event from the FCM data * * @param data the FCM data - * @return the event + * @return the event or null if required data are missing */ private fun parseEvent(data: Map?): Event? { - // accept only event with room id. - if (null == data || !data.containsKey("room_id") || !data.containsKey("event_id")) { - return null - } - - try { - return Event(eventId = data["event_id"], - senderId = data["sender"], - roomId = data["room_id"], - type = data.getValue("type"), - // TODO content = data.getValue("content"), - originServerTs = System.currentTimeMillis()) - } catch (e: Exception) { - Timber.e(e, "buildEvent fails ") - } - - return null + return Event( + eventId = data?.get("event_id") ?: return null, + senderId = data["sender"], + roomId = data["room_id"] ?: return null, + type = data["type"] ?: return null, + originServerTs = System.currentTimeMillis() + ) } } diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml index 52932920d4..07606d315c 100644 --- a/vector/src/main/AndroidManifest.xml +++ b/vector/src/main/AndroidManifest.xml @@ -37,7 +37,7 @@ tools:node="remove" /> - + @@ -83,8 +83,7 @@ android:resource="@xml/shortcuts" /> - + - + + + android:configChanges="orientation|smallestScreenSize|screenLayout|screenSize" + android:launchMode="singleTask" + android:supportsPictureInPicture="true" /> @@ -247,27 +250,28 @@ - + - - + + - - + + - - - - + + + + - + copyToClipboard(view.context, text, false) - Snackbar.make(view, view.resources.getString(R.string.copied_to_clipboard), Snackbar.LENGTH_SHORT).show() + view.showOptimizedSnackbar(view.resources.getString(R.string.copied_to_clipboard)) } true } diff --git a/vector/src/main/java/im/vector/app/core/platform/SnackbarExt.kt b/vector/src/main/java/im/vector/app/core/platform/SnackbarExt.kt new file mode 100644 index 0000000000..6cdcfabe63 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/platform/SnackbarExt.kt @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021 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.core.platform + +import android.view.View +import com.google.android.material.snackbar.Snackbar + +private const val MIN_SNACKBAR_DURATION = 2000 +private const val MAX_SNACKBAR_DURATION = 8000 +private const val DURATION_PER_LETTER = 50 + +fun View.showOptimizedSnackbar(message: String) { + Snackbar.make(this, message, getDuration(message)).show() +} + +private fun getDuration(message: String): Int { + return (message.length * DURATION_PER_LETTER).coerceIn(MIN_SNACKBAR_DURATION, MAX_SNACKBAR_DURATION) +} diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt index 43c96d2468..b35d582a00 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt @@ -597,9 +597,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScr * ========================================================================================== */ fun showSnackbar(message: String) { - getCoordinatorLayout()?.let { - Snackbar.make(it, message, Snackbar.LENGTH_SHORT).show() - } + getCoordinatorLayout()?.showOptimizedSnackbar(message) } fun showSnackbar(message: String, @StringRes withActionTitle: Int?, action: (() -> Unit)?) { diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt index 0b951fb5a2..f515060db6 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt @@ -35,7 +35,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.viewbinding.ViewBinding import com.airbnb.mvrx.BaseMvRxFragment import com.bumptech.glide.util.Util.assertMainThread -import com.google.android.material.snackbar.Snackbar import com.jakewharton.rxbinding3.view.clicks import im.vector.app.R import im.vector.app.core.di.DaggerScreenComponent @@ -193,10 +192,7 @@ abstract class VectorBaseFragment : BaseMvRxFragment(), HasScre } protected fun showErrorInSnackbar(throwable: Throwable) { - vectorBaseActivity.getCoordinatorLayout()?.let { - Snackbar.make(it, errorFormatter.toHumanReadable(throwable), Snackbar.LENGTH_SHORT) - .show() - } + vectorBaseActivity.getCoordinatorLayout()?.showOptimizedSnackbar(errorFormatter.toHumanReadable(throwable)) } protected fun showLoadingDialog(message: CharSequence? = null, cancelable: Boolean = false) { diff --git a/vector/src/main/java/im/vector/app/core/ui/views/ActiveConferenceView.kt b/vector/src/main/java/im/vector/app/core/ui/views/ActiveConferenceView.kt index 00c7bc16df..256f2d963e 100644 --- a/vector/src/main/java/im/vector/app/core/ui/views/ActiveConferenceView.kt +++ b/vector/src/main/java/im/vector/app/core/ui/views/ActiveConferenceView.kt @@ -46,7 +46,7 @@ class ActiveConferenceView @JvmOverloads constructor( } var callback: Callback? = null - var jitsiWidget: Widget? = null + private var jitsiWidget: Widget? = null private lateinit var views: ViewActiveConferenceViewBinding @@ -95,18 +95,12 @@ class ActiveConferenceView @JvmOverloads constructor( val summary = state.asyncRoomSummary() if (summary?.membership == Membership.JOIN) { // We only display banner for 'live' widgets - val activeConf = - state.activeRoomWidgets()?.firstOrNull { - // for now only jitsi? - it.type == WidgetType.Jitsi - } - - if (activeConf == null) { - isVisible = false - } else { - isVisible = true - jitsiWidget = activeConf + jitsiWidget = state.activeRoomWidgets()?.firstOrNull { + // for now only jitsi? + it.type == WidgetType.Jitsi } + + isVisible = jitsiWidget != null // if sent by me or if i can moderate? views.deleteWidgetButton.isVisible = state.isAllowedToManageWidgets } else { diff --git a/vector/src/main/java/im/vector/app/core/ui/views/FailedMessagesWarningView.kt b/vector/src/main/java/im/vector/app/core/ui/views/FailedMessagesWarningView.kt new file mode 100644 index 0000000000..f9518552a3 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/ui/views/FailedMessagesWarningView.kt @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2021 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.core.ui.views + +import android.content.Context +import android.util.AttributeSet +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.isVisible +import im.vector.app.R +import im.vector.app.databinding.ViewFailedMessagesWarningBinding + +class FailedMessagesWarningView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + interface Callback { + fun onDeleteAllClicked() + fun onRetryClicked() + } + + var callback: Callback? = null + + private lateinit var views: ViewFailedMessagesWarningBinding + + init { + setupViews() + } + + private fun setupViews() { + inflate(context, R.layout.view_failed_messages_warning, this) + views = ViewFailedMessagesWarningBinding.bind(this) + + views.failedMessagesDeleteAllButton.setOnClickListener { callback?.onDeleteAllClicked() } + views.failedMessagesRetryButton.setOnClickListener { callback?.onRetryClicked() } + } + + fun render(hasFailedMessages: Boolean) { + isVisible = hasFailedMessages + } +} diff --git a/vector/src/main/java/im/vector/app/core/ui/views/SendStateImageView.kt b/vector/src/main/java/im/vector/app/core/ui/views/SendStateImageView.kt new file mode 100644 index 0000000000..9acb82581f --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/ui/views/SendStateImageView.kt @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2021 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.core.ui.views + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.AppCompatImageView +import androidx.core.view.isVisible +import im.vector.app.R +import im.vector.app.features.home.room.detail.timeline.item.SendStateDecoration + +class SendStateImageView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : AppCompatImageView(context, attrs, defStyleAttr) { + + init { + if (isInEditMode) { + render(SendStateDecoration.SENT) + } + } + + fun render(sendState: SendStateDecoration) { + isVisible = when (sendState) { + SendStateDecoration.SENDING_NON_MEDIA -> { + setImageResource(R.drawable.ic_sending_message) + contentDescription = context.getString(R.string.event_status_a11y_sending) + true + } + SendStateDecoration.SENT -> { + setImageResource(R.drawable.ic_message_sent) + contentDescription = context.getString(R.string.event_status_a11y_sent) + true + } + SendStateDecoration.FAILED -> { + setImageResource(R.drawable.ic_sending_message_failed) + contentDescription = context.getString(R.string.event_status_a11y_failed) + true + } + SendStateDecoration.SENDING_MEDIA, + SendStateDecoration.NONE -> { + false + } + } + } +} diff --git a/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt b/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt index 45db8ea91d..fa1c50f419 100644 --- a/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt +++ b/vector/src/main/java/im/vector/app/core/utils/ExternalApplicationsUtil.kt @@ -33,14 +33,15 @@ import android.provider.Settings import android.webkit.MimeTypeMap import android.widget.Toast import androidx.activity.result.ActivityResultLauncher +import androidx.browser.customtabs.CustomTabColorSchemeParams import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsSession -import androidx.core.content.ContextCompat import androidx.core.content.FileProvider import androidx.core.content.getSystemService import im.vector.app.BuildConfig import im.vector.app.R import im.vector.app.features.notifications.NotificationUtils +import im.vector.app.features.themes.ThemeUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @@ -92,17 +93,24 @@ fun openUrlInExternalBrowser(context: Context, uri: Uri?) { * If several compatible browsers are installed, the user will be proposed to choose one. * Ref: https://developer.chrome.com/multidevice/android/customtabs */ -fun openUrlInChromeCustomTab(context: Context, session: CustomTabsSession?, url: String) { +fun openUrlInChromeCustomTab(context: Context, + session: CustomTabsSession?, + url: String) { try { CustomTabsIntent.Builder() - .setToolbarColor(ContextCompat.getColor(context, R.color.riotx_background_light)) - .apply { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { - setNavigationBarColor(ContextCompat.getColor(context, R.color.riotx_header_panel_background_light)) - } - } - .setNavigationBarColor(ContextCompat.getColor(context, R.color.riotx_background_light)) - .setColorScheme(CustomTabsIntent.COLOR_SCHEME_LIGHT) + .setDefaultColorSchemeParams( + CustomTabColorSchemeParams.Builder() + .setToolbarColor(ThemeUtils.getColor(context, R.attr.riotx_background)) + .setNavigationBarColor(ThemeUtils.getColor(context, R.attr.riotx_background)) + .build() + ) + .setColorScheme( + when { + ThemeUtils.isSystemTheme(context) -> CustomTabsIntent.COLOR_SCHEME_SYSTEM + ThemeUtils.isLightTheme(context) -> CustomTabsIntent.COLOR_SCHEME_LIGHT + else -> CustomTabsIntent.COLOR_SCHEME_DARK + } + ) // Note: setting close button icon does not work .setCloseButtonIcon(BitmapFactory.decodeResource(context.resources, R.drawable.ic_back_24dp)) .setStartAnimations(context, R.anim.enter_fade_in, R.anim.exit_fade_out) diff --git a/vector/src/main/java/im/vector/app/features/MainActivity.kt b/vector/src/main/java/im/vector/app/features/MainActivity.kt index 351163b026..143506d4df 100644 --- a/vector/src/main/java/im/vector/app/features/MainActivity.kt +++ b/vector/src/main/java/im/vector/app/features/MainActivity.kt @@ -31,7 +31,7 @@ import im.vector.app.core.error.ErrorFormatter import im.vector.app.core.extensions.startSyncing import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.core.utils.deleteAllFiles -import im.vector.app.databinding.FragmentLoadingBinding +import im.vector.app.databinding.ActivityMainBinding import im.vector.app.features.home.HomeActivity import im.vector.app.features.home.ShortcutsHandler import im.vector.app.features.login.LoginActivity @@ -66,7 +66,7 @@ data class MainActivityArgs( * This Activity, when started with argument, is also doing some cleanup when user signs out, * clears cache, is logged out, or is soft logged out */ -class MainActivity : VectorBaseActivity(), UnlockedActivity { +class MainActivity : VectorBaseActivity(), UnlockedActivity { companion object { private const val EXTRA_ARGS = "EXTRA_ARGS" @@ -81,7 +81,7 @@ class MainActivity : VectorBaseActivity(), UnlockedActiv } } - override fun getBinding() = FragmentLoadingBinding.inflate(layoutInflater) + override fun getBinding() = ActivityMainBinding.inflate(layoutInflater) private lateinit var args: MainActivityArgs diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewActions.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewActions.kt index 6554e50d63..830af7de01 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewActions.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewActions.kt @@ -18,4 +18,12 @@ package im.vector.app.features.call.conference import im.vector.app.core.platform.VectorViewModelAction -sealed class JitsiCallViewActions : VectorViewModelAction +sealed class JitsiCallViewActions : VectorViewModelAction { + data class SwitchTo(val args: VectorJitsiActivity.Args, + val withConfirmation: Boolean) : JitsiCallViewActions() + + /** + * The ViewModel will either ask the View to finish, or to join another conf. + */ + object OnConferenceLeft: JitsiCallViewActions() +} diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewEvents.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewEvents.kt index 319322daba..d41f758f52 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewEvents.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewEvents.kt @@ -17,5 +17,21 @@ package im.vector.app.features.call.conference import im.vector.app.core.platform.VectorViewEvents +import org.jitsi.meet.sdk.JitsiMeetUserInfo -sealed class JitsiCallViewEvents : VectorViewEvents +sealed class JitsiCallViewEvents : VectorViewEvents { + data class StartConference( + val enableVideo: Boolean, + val jitsiUrl: String, + val subject: String, + val confId: String, + val userInfo: JitsiMeetUserInfo + ) : JitsiCallViewEvents() + + data class ConfirmSwitchingConference( + val args: VectorJitsiActivity.Args + ) : JitsiCallViewEvents() + + object LeaveConference : JitsiCallViewEvents() + object Finish : JitsiCallViewEvents() +} diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewModel.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewModel.kt index 1525ca6dfe..92dd2ebcd0 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewModel.kt @@ -16,18 +16,25 @@ package im.vector.app.features.call.conference +import androidx.lifecycle.viewModelScope import com.airbnb.mvrx.Fail import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.Success +import com.airbnb.mvrx.Uninitialized import com.airbnb.mvrx.ViewModelContext import dagger.assisted.Assisted -import dagger.assisted.AssistedInject import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import im.vector.app.core.extensions.exhaustive import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.themes.ThemeProvider +import io.reactivex.disposables.Disposable +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import org.jitsi.meet.sdk.JitsiMeetUserInfo import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.widgets.model.Widget import org.matrix.android.sdk.api.session.widgets.model.WidgetType import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.rx.asObservable @@ -35,7 +42,6 @@ import java.net.URL class JitsiCallViewModel @AssistedInject constructor( @Assisted initialState: JitsiCallViewState, - @Assisted val args: VectorJitsiActivity.Args, private val session: Session, private val jitsiMeetPropertiesFactory: JitsiWidgetPropertiesFactory, private val themeProvider: ThemeProvider @@ -43,38 +49,35 @@ class JitsiCallViewModel @AssistedInject constructor( @AssistedFactory interface Factory { - fun create(initialState: JitsiCallViewState, args: VectorJitsiActivity.Args): JitsiCallViewModel + fun create(initialState: JitsiCallViewState): JitsiCallViewModel } + private var currentWidgetObserver: Disposable? = null private val widgetService = session.widgetService() + private var confIsStarted = false + private var pendingArgs: VectorJitsiActivity.Args? = null + init { - val me = session.getRoomMember(session.myUserId, args.roomId)?.toMatrixItem() - val userInfo = JitsiMeetUserInfo().apply { - displayName = me?.getBestName() - avatar = me?.avatarUrl?.let { session.contentUrlResolver().resolveFullSize(it) }?.let { URL(it) } - } - val roomName = session.getRoomSummary(args.roomId)?.displayName + observeWidget(initialState.roomId, initialState.widgetId) + } - setState { - copy(userInfo = userInfo) - } - - widgetService.getRoomWidgetsLive(args.roomId, QueryStringValue.Equals(args.widgetId), WidgetType.Jitsi.values()) + private fun observeWidget(roomId: String, widgetId: String) { + confIsStarted = false + currentWidgetObserver?.dispose() + currentWidgetObserver = widgetService.getRoomWidgetsLive(roomId, QueryStringValue.Equals(widgetId), WidgetType.Jitsi.values()) .asObservable() .distinctUntilChanged() .subscribe { val jitsiWidget = it.firstOrNull() if (jitsiWidget != null) { - val ppt = widgetService.getWidgetComputedUrl(jitsiWidget, themeProvider.isLightTheme()) - ?.let { url -> jitsiMeetPropertiesFactory.create(url) } setState { - copy( - widget = Success(jitsiWidget), - jitsiUrl = "https://${ppt?.domain}", - confId = ppt?.confId ?: "", - subject = roomName ?: "" - ) + copy(widget = Success(jitsiWidget)) + } + + if (!confIsStarted) { + confIsStarted = true + startConference(jitsiWidget) } } else { setState { @@ -87,7 +90,69 @@ class JitsiCallViewModel @AssistedInject constructor( .disposeOnClear() } + private fun startConference(jitsiWidget: Widget) = withState { state -> + val me = session.getRoomMember(session.myUserId, state.roomId)?.toMatrixItem() + val userInfo = JitsiMeetUserInfo().apply { + displayName = me?.getBestName() + avatar = me?.avatarUrl?.let { session.contentUrlResolver().resolveFullSize(it) }?.let { URL(it) } + } + val roomName = session.getRoomSummary(state.roomId)?.displayName + + val ppt = widgetService.getWidgetComputedUrl(jitsiWidget, themeProvider.isLightTheme()) + ?.let { url -> jitsiMeetPropertiesFactory.create(url) } + + _viewEvents.post(JitsiCallViewEvents.StartConference( + enableVideo = state.enableVideo, + jitsiUrl = "https://${ppt?.domain}", + subject = roomName ?: "", + confId = ppt?.confId ?: "", + userInfo = userInfo + )) + } + override fun handle(action: JitsiCallViewActions) { + when (action) { + is JitsiCallViewActions.SwitchTo -> handleSwitchTo(action) + JitsiCallViewActions.OnConferenceLeft -> handleOnConferenceLeft() + }.exhaustive + } + + private fun handleSwitchTo(action: JitsiCallViewActions.SwitchTo) = withState { state -> + // Check if it is the same conf + if (action.args.roomId != state.roomId + || action.args.widgetId != state.widgetId) { + if (action.withConfirmation) { + // Ask confirmation to switch, but wait a bit for the Activity to quit the PiP mode + viewModelScope.launch { + delay(500) + _viewEvents.post(JitsiCallViewEvents.ConfirmSwitchingConference(action.args)) + } + } else { + // Ask the view to leave the conf, then the view will tell us when it's done, to join the new conf + pendingArgs = action.args + _viewEvents.post(JitsiCallViewEvents.LeaveConference) + } + } + } + + private fun handleOnConferenceLeft() { + val safePendingArgs = pendingArgs + pendingArgs = null + + if (safePendingArgs == null) { + // Quit + _viewEvents.post(JitsiCallViewEvents.Finish) + } else { + setState { + copy( + roomId = safePendingArgs.roomId, + widgetId = safePendingArgs.widgetId, + enableVideo = safePendingArgs.enableVideo, + widget = Uninitialized + ) + } + observeWidget(safePendingArgs.roomId, safePendingArgs.widgetId) + } } companion object : MvRxViewModelFactory { @@ -97,8 +162,7 @@ class JitsiCallViewModel @AssistedInject constructor( @JvmStatic override fun create(viewModelContext: ViewModelContext, state: JitsiCallViewState): JitsiCallViewModel? { val callActivity: VectorJitsiActivity = viewModelContext.activity() - val callArgs: VectorJitsiActivity.Args = viewModelContext.args() - return callActivity.viewModelFactory.create(state, callArgs) + return callActivity.viewModelFactory.create(state) } override fun initialState(viewModelContext: ViewModelContext): JitsiCallViewState? { diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewState.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewState.kt index 72b87e7f1b..1fd04542e0 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewState.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiCallViewState.kt @@ -19,16 +19,11 @@ package im.vector.app.features.call.conference import com.airbnb.mvrx.Async import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized -import org.jitsi.meet.sdk.JitsiMeetUserInfo import org.matrix.android.sdk.api.session.widgets.model.Widget data class JitsiCallViewState( val roomId: String = "", val widgetId: String = "", - val enableVideo: Boolean = true, - val jitsiUrl: String = "", - val subject: String = "", - val confId: String = "", - val userInfo: JitsiMeetUserInfo = JitsiMeetUserInfo(), + val enableVideo: Boolean = false, val widget: Async = Uninitialized ) : MvRxState diff --git a/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt b/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt index caece858aa..16478192f7 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/VectorJitsiActivity.kt @@ -20,9 +20,12 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.content.pm.PackageManager +import android.content.res.Configuration import android.os.Bundle import android.os.Parcelable import android.widget.FrameLayout +import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.airbnb.mvrx.Fail @@ -30,7 +33,9 @@ import com.airbnb.mvrx.MvRx import com.airbnb.mvrx.Success import com.airbnb.mvrx.viewModel import com.facebook.react.modules.core.PermissionListener +import im.vector.app.R import im.vector.app.core.di.ScreenComponent +import im.vector.app.core.extensions.exhaustive import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.databinding.ActivityJitsiBinding import kotlinx.parcelize.Parcelize @@ -80,9 +85,39 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee renderState(it) } + jitsiViewModel.observeViewEvents { + when (it) { + is JitsiCallViewEvents.StartConference -> configureJitsiView(it) + is JitsiCallViewEvents.ConfirmSwitchingConference -> handleConfirmSwitching(it) + JitsiCallViewEvents.Finish -> finish() + JitsiCallViewEvents.LeaveConference -> handleLeaveConference() + }.exhaustive + } + registerForBroadcastMessages() } + private fun handleLeaveConference() { + jitsiMeetView?.leave() + } + + private fun handleConfirmSwitching(action: JitsiCallViewEvents.ConfirmSwitchingConference) { + AlertDialog.Builder(this) + .setTitle(R.string.dialog_title_warning) + .setMessage(R.string.jitsi_leave_conf_to_join_another_one_content) + .setPositiveButton(R.string.action_switch) { _, _ -> + jitsiViewModel.handle(JitsiCallViewActions.SwitchTo(action.args, false)) + } + .setNegativeButton(R.string.cancel, null) + .show() + } + + override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, + newConfig: Configuration) { + super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig) + Timber.w("onPictureInPictureModeChanged($isInPictureInPictureMode)") + } + override fun initUiAndData() { super.initUiAndData() jitsiMeetView = JitsiMeetView(this) @@ -96,7 +131,6 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee is Success -> { views.jitsiProgressLayout.isVisible = false jitsiMeetView?.isVisible = true - configureJitsiView(viewState) } else -> { jitsiMeetView?.isVisible = false @@ -105,12 +139,12 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee } } - private fun configureJitsiView(viewState: JitsiCallViewState) { + private fun configureJitsiView(startConference: JitsiCallViewEvents.StartConference) { val jitsiMeetConferenceOptions = JitsiMeetConferenceOptions.Builder() - .setVideoMuted(!viewState.enableVideo) - .setUserInfo(viewState.userInfo) + .setVideoMuted(!startConference.enableVideo) + .setUserInfo(startConference.userInfo) .apply { - tryOrNull { URL(viewState.jitsiUrl) }?.let { + tryOrNull { URL(startConference.jitsiUrl) }?.let { setServerURL(it) } } @@ -120,15 +154,15 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee .setFeatureFlag("add-people.enabled", false) .setFeatureFlag("video-share.enabled", false) .setFeatureFlag("call-integration.enabled", false) - .setRoom(viewState.confId) - .setSubject(viewState.subject) + .setRoom(startConference.confId) + .setSubject(startConference.subject) .build() jitsiMeetView?.join(jitsiMeetConferenceOptions) } - override fun onPause() { + override fun onStop() { JitsiMeetActivityDelegate.onHostPause(this) - super.onPause() + super.onStop() } override fun onResume() { @@ -147,13 +181,23 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee super.onDestroy() } -// override fun onUserLeaveHint() { -// super.onUserLeaveHint() -// jitsiMeetView?.enterPictureInPicture() -// } + override fun onUserLeaveHint() { + super.onUserLeaveHint() + if (packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) { + jitsiMeetView?.enterPictureInPicture() + } + } override fun onNewIntent(intent: Intent?) { JitsiMeetActivityDelegate.onNewIntent(intent) + + // Is it a switch to another conf? + intent?.takeIf { it.hasExtra(MvRx.KEY_ARG) } + ?.let { intent.getParcelableExtra(MvRx.KEY_ARG) } + ?.let { + jitsiViewModel.handle(JitsiCallViewActions.SwitchTo(it, true)) + } + super.onNewIntent(intent) } @@ -195,7 +239,7 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee Timber.v("JitsiMeetViewListener.onConferenceTerminated()") // Do not finish if there is an error if (data["error"] == null) { - finish() + jitsiViewModel.handle(JitsiCallViewActions.OnConferenceLeft) } } @@ -203,7 +247,6 @@ class VectorJitsiActivity : VectorBaseActivity(), JitsiMee fun newIntent(context: Context, roomId: String, widgetId: String, enableVideo: Boolean): Intent { return Intent(context, VectorJitsiActivity::class.java).apply { putExtra(MvRx.KEY_ARG, Args(roomId, widgetId, enableVideo)) - addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) } } } diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysrequest/OutboundSessionKeySharingStrategy.kt b/vector/src/main/java/im/vector/app/features/crypto/keysrequest/OutboundSessionKeySharingStrategy.kt new file mode 100644 index 0000000000..19c62ed572 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/crypto/keysrequest/OutboundSessionKeySharingStrategy.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 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.crypto.keysrequest + +enum class OutboundSessionKeySharingStrategy { + /** + * Keys will be sent for the first time when the first message is sent + */ + WhenSendingEvent, + + /** + * Keys will be sent for the first time when the timeline displayed + */ + WhenEnteringRoom, + + /** + * Keys will be sent for the first time when a typing started + */ + WhenTyping +} diff --git a/vector/src/main/java/im/vector/app/features/devtools/RoomStateListController.kt b/vector/src/main/java/im/vector/app/features/devtools/RoomStateListController.kt index 69070c509b..38138474d9 100644 --- a/vector/src/main/java/im/vector/app/features/devtools/RoomStateListController.kt +++ b/vector/src/main/java/im/vector/app/features/devtools/RoomStateListController.kt @@ -37,7 +37,7 @@ class RoomStateListController @Inject constructor( override fun buildModels(data: RoomDevToolViewState?) { when (data?.displayMode) { RoomDevToolViewState.Mode.StateEventList -> { - val stateEventsGroups = data.stateEvents.invoke().orEmpty().groupBy { it.type } + val stateEventsGroups = data.stateEvents.invoke().orEmpty().groupBy { it.getClearType() } if (stateEventsGroups.isEmpty()) { noResultItem { diff --git a/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt b/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt index 028d37ff5f..8ea3365cf9 100644 --- a/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt +++ b/vector/src/main/java/im/vector/app/features/disclaimer/DisclaimerDialog.kt @@ -43,8 +43,8 @@ fun showDisclaimerDialog(activity: Activity) { AlertDialog.Builder(activity) .setView(dialogLayout) .setCancelable(false) - .setNegativeButton(R.string.element_disclaimer_negative_button, null) - .setPositiveButton(R.string.element_disclaimer_positive_button) { _, _ -> + .setNegativeButton(R.string.disclaimer_negative_button, null) + .setPositiveButton(R.string.disclaimer_positive_button) { _, _ -> openUrlInChromeCustomTab(activity, null, VectorSettingsUrls.DISCLAIMER_URL) } .show() diff --git a/vector/src/main/java/im/vector/app/features/discovery/SettingsCenteredImageItem.kt b/vector/src/main/java/im/vector/app/features/discovery/SettingsCenteredImageItem.kt new file mode 100644 index 0000000000..af79dd8bb5 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/discovery/SettingsCenteredImageItem.kt @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2021 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.discovery + +import android.widget.ImageView +import androidx.annotation.DrawableRes +import com.airbnb.epoxy.EpoxyAttribute +import com.airbnb.epoxy.EpoxyModelClass +import com.airbnb.epoxy.EpoxyModelWithHolder +import im.vector.app.R +import im.vector.app.core.epoxy.VectorEpoxyHolder + +@EpoxyModelClass(layout = R.layout.item_settings_centered_image) +abstract class SettingsCenteredImageItem : EpoxyModelWithHolder() { + + @EpoxyAttribute + @DrawableRes + var drawableRes: Int = 0 + + override fun bind(holder: Holder) { + super.bind(holder) + holder.image.setImageResource(drawableRes) + } + + class Holder : VectorEpoxyHolder() { + val image by bind(R.id.itemSettingsImage) + } +} diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt index 6a381ec049..60a8836be5 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt @@ -21,6 +21,7 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import android.os.Parcelable +import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.Toolbar @@ -40,6 +41,8 @@ import im.vector.app.core.platform.ToolbarConfigurable import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.core.pushers.PushersManager import im.vector.app.databinding.ActivityHomeBinding +import im.vector.app.features.MainActivity +import im.vector.app.features.MainActivityArgs import im.vector.app.features.disclaimer.showDisclaimerDialog import im.vector.app.features.matrixto.MatrixToBottomSheet import im.vector.app.features.notifications.NotificationDrawerManager @@ -57,9 +60,11 @@ import im.vector.app.features.workers.signout.ServerBackupStatusViewState import im.vector.app.push.fcm.FcmHelper import io.reactivex.android.schedulers.AndroidSchedulers import kotlinx.parcelize.Parcelize -import org.matrix.android.sdk.api.session.InitialSyncProgressService +import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService import org.matrix.android.sdk.api.session.permalinks.PermalinkService import org.matrix.android.sdk.api.util.MatrixItem +import org.matrix.android.sdk.internal.session.sync.InitialSyncStrategy +import org.matrix.android.sdk.internal.session.sync.initialSyncStrategy import timber.log.Timber import javax.inject.Inject @@ -94,6 +99,7 @@ class HomeActivity : @Inject lateinit var unknownDeviceViewModelFactory: UnknownDeviceDetectorSharedViewModel.Factory @Inject lateinit var permalinkHandler: PermalinkHandler @Inject lateinit var avatarRenderer: AvatarRenderer + @Inject lateinit var initSyncStepFormatter: InitSyncStepFormatter private val drawerListener = object : DrawerLayout.SimpleDrawerListener() { override fun onDrawerStateChanged(newState: Int) { @@ -203,11 +209,12 @@ class HomeActivity : private fun renderState(state: HomeActivityViewState) { when (val status = state.initialSyncProgressServiceStatus) { - is InitialSyncProgressService.Status.Idle -> { + is InitialSyncProgressService.Status.Idle -> { views.waitingView.root.isVisible = false } is InitialSyncProgressService.Status.Progressing -> { - Timber.v("${getString(status.statusText)} ${status.percentProgress}") + val initSyncStepStr = initSyncStepFormatter.format(status.initSyncStep) + Timber.v("$initSyncStepStr ${status.percentProgress}") views.waitingView.root.setOnClickListener { // block interactions } @@ -218,7 +225,7 @@ class HomeActivity : isVisible = true } views.waitingView.waitingStatusText.apply { - text = getString(status.statusText) + text = initSyncStepStr isVisible = true } views.waitingView.root.isVisible = true @@ -358,6 +365,12 @@ class HomeActivity : override fun getMenuRes() = R.menu.home + override fun onPrepareOptionsMenu(menu: Menu): Boolean { + menu.findItem(R.id.menu_home_init_sync_legacy)?.isVisible = vectorPreferences.developerMode() + menu.findItem(R.id.menu_home_init_sync_optimized)?.isVisible = vectorPreferences.developerMode() + return super.onPrepareOptionsMenu(menu) + } + override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.menu_home_suggestion -> { @@ -368,6 +381,20 @@ class HomeActivity : bugReporter.openBugReportScreen(this, false) return true } + R.id.menu_home_init_sync_legacy -> { + // Configure the SDK + initialSyncStrategy = InitialSyncStrategy.Legacy + // And clear cache + MainActivity.restartApp(this, MainActivityArgs(clearCache = true)) + return true + } + R.id.menu_home_init_sync_optimized -> { + // Configure the SDK + initialSyncStrategy = InitialSyncStrategy.Optimized() + // And clear cache + MainActivity.restartApp(this, MainActivityArgs(clearCache = true)) + return true + } R.id.menu_home_filter -> { navigator.openRoomsFiltering(this) return true diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt index 62bdc61b63..ad61928509 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt @@ -40,7 +40,7 @@ import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse import org.matrix.android.sdk.api.auth.registration.nextUncompletedStage import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.pushrules.RuleIds -import org.matrix.android.sdk.api.session.InitialSyncProgressService +import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import org.matrix.android.sdk.api.util.toMatrixItem @@ -130,7 +130,7 @@ class HomeActivityViewModel @AssistedInject constructor( // Schedule a check of the bootstrap when the init sync will be finished checkBootstrap = true } - is InitialSyncProgressService.Status.Idle -> { + is InitialSyncProgressService.Status.Idle -> { if (checkBootstrap) { checkBootstrap = false maybeBootstrapCrossSigningAfterInitialSync() diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewState.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewState.kt index 0f80fa29ef..d4df7cd073 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewState.kt @@ -17,7 +17,7 @@ package im.vector.app.features.home import com.airbnb.mvrx.MvRxState -import org.matrix.android.sdk.api.session.InitialSyncProgressService +import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService data class HomeActivityViewState( val initialSyncProgressServiceStatus: InitialSyncProgressService.Status = InitialSyncProgressService.Status.Idle diff --git a/vector/src/main/java/im/vector/app/features/home/InitSyncStepFormatter.kt b/vector/src/main/java/im/vector/app/features/home/InitSyncStepFormatter.kt new file mode 100644 index 0000000000..51ca96341e --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/InitSyncStepFormatter.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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.home + +import im.vector.app.R +import im.vector.app.core.resources.StringProvider +import org.matrix.android.sdk.api.session.initsync.InitSyncStep +import javax.inject.Inject + +class InitSyncStepFormatter @Inject constructor( + private val stringProvider: StringProvider +) { + fun format(initSyncStep: InitSyncStep): String { + return stringProvider.getString( + when (initSyncStep) { + InitSyncStep.ServerComputing -> R.string.initial_sync_start_server_computing + InitSyncStep.Downloading -> R.string.initial_sync_start_downloading + InitSyncStep.ImportingAccount -> R.string.initial_sync_start_importing_account + InitSyncStep.ImportingAccountCrypto -> R.string.initial_sync_start_importing_account_crypto + InitSyncStep.ImportingAccountRoom -> R.string.initial_sync_start_importing_account_rooms + InitSyncStep.ImportingAccountGroups -> R.string.initial_sync_start_importing_account_groups + InitSyncStep.ImportingAccountData -> R.string.initial_sync_start_importing_account_data + InitSyncStep.ImportingAccountJoinedRooms -> R.string.initial_sync_start_importing_account_joined_rooms + InitSyncStep.ImportingAccountInvitedRooms -> R.string.initial_sync_start_importing_account_invited_rooms + InitSyncStep.ImportingAccountLeftRooms -> R.string.initial_sync_start_importing_account_left_rooms + } + ) + } +} diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt index 98ad6c454c..ecbd0b0d30 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt @@ -104,4 +104,9 @@ sealed class RoomDetailAction : VectorViewModelAction { // Preview URL data class DoNotShowPreviewUrlFor(val eventId: String, val url: String) : RoomDetailAction() + + data class ComposerFocusChange(val focused: Boolean) : RoomDetailAction() + + // Failed messages + object RemoveAllFailedMessages : RoomDetailAction() } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt index c511c9e666..1a487eb065 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt @@ -69,7 +69,7 @@ import com.airbnb.mvrx.Success import com.airbnb.mvrx.args import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState -import com.google.android.material.snackbar.Snackbar +import com.jakewharton.rxbinding3.view.focusChanges import com.jakewharton.rxbinding3.widget.textChanges import com.vanniktech.emoji.EmojiPopup import im.vector.app.R @@ -89,10 +89,12 @@ import im.vector.app.core.glide.GlideRequests import im.vector.app.core.intent.getFilenameFromUri import im.vector.app.core.intent.getMimeTypeFromUri import im.vector.app.core.platform.VectorBaseFragment +import im.vector.app.core.platform.showOptimizedSnackbar import im.vector.app.core.resources.ColorProvider import im.vector.app.core.ui.views.CurrentCallsView import im.vector.app.core.ui.views.KnownCallsViewHolder import im.vector.app.core.ui.views.ActiveConferenceView +import im.vector.app.core.ui.views.FailedMessagesWarningView import im.vector.app.core.ui.views.JumpToReadMarkerView import im.vector.app.core.ui.views.NotificationAreaView import im.vector.app.core.utils.Debouncer @@ -324,6 +326,7 @@ class RoomDetailFragment @Inject constructor( setupJumpToBottomView() setupConfBannerView() setupEmojiPopup() + setupFailedMessagesWarningView() views.roomToolbarContentView.debouncedClicks { navigator.openRoomProfile(requireActivity(), roomDetailArgs.roomId) @@ -369,7 +372,7 @@ class RoomDetailFragment @Inject constructor( is RoomDetailViewEvents.OnNewTimelineEvents -> scrollOnNewMessageCallback.addNewTimelineEventIds(it.eventIds) is RoomDetailViewEvents.ActionSuccess -> displayRoomDetailActionSuccess(it) is RoomDetailViewEvents.ActionFailure -> displayRoomDetailActionFailure(it) - is RoomDetailViewEvents.ShowMessage -> showSnackWithMessage(it.message, Snackbar.LENGTH_LONG) + is RoomDetailViewEvents.ShowMessage -> showSnackWithMessage(it.message) is RoomDetailViewEvents.NavigateToEvent -> navigateToEvent(it) is RoomDetailViewEvents.FileTooBigError -> displayFileTooBigError(it) is RoomDetailViewEvents.DownloadFileState -> handleDownloadFileState(it) @@ -556,6 +559,25 @@ class RoomDetailFragment @Inject constructor( } } + private fun setupFailedMessagesWarningView() { + views.failedMessagesWarningView.callback = object : FailedMessagesWarningView.Callback { + override fun onDeleteAllClicked() { + AlertDialog.Builder(requireContext()) + .setTitle(R.string.event_status_delete_all_failed_dialog_title) + .setMessage(getString(R.string.event_status_delete_all_failed_dialog_message)) + .setNegativeButton(R.string.no, null) + .setPositiveButton(R.string.yes) { _, _ -> + roomDetailViewModel.handle(RoomDetailAction.RemoveAllFailedMessages) + } + .show() + } + + override fun onRetryClicked() { + roomDetailViewModel.handle(RoomDetailAction.ResendAll) + } + } + } + private fun joinJitsiRoom(jitsiWidget: Widget, enableVideo: Boolean) { navigator.openRoomWidget(requireContext(), roomDetailArgs.roomId, jitsiWidget, mapOf(JitsiCallViewModel.ENABLE_VIDEO_OPTION to enableVideo)) } @@ -775,10 +797,6 @@ class RoomDetailFragment @Inject constructor( navigator.openRoomProfile(requireActivity(), roomDetailArgs.roomId) true } - R.id.resend_all -> { - roomDetailViewModel.handle(RoomDetailAction.ResendAll) - true - } R.id.open_matrix_apps -> { roomDetailViewModel.handle(RoomDetailAction.ManageIntegrations) true @@ -1144,6 +1162,12 @@ class RoomDetailFragment @Inject constructor( roomDetailViewModel.handle(RoomDetailAction.UserIsTyping(it)) } .disposeOnDestroyView() + + views.composerLayout.views.composerEditText.focusChanges() + .subscribe { + roomDetailViewModel.handle(RoomDetailAction.ComposerFocusChange(it)) + } + .disposeOnDestroyView() } private fun sendUri(uri: Uri): Boolean { @@ -1164,6 +1188,7 @@ class RoomDetailFragment @Inject constructor( val summary = state.asyncRoomSummary() renderToolbar(summary, state.typingMessage) views.activeConferenceView.render(state) + views.failedMessagesWarningView.render(state.hasFailedSending) val inviter = state.asyncInviter() if (summary?.membership == Membership.JOIN) { views.jumpToBottomView.count = summary.notificationCount @@ -1540,9 +1565,21 @@ class RoomDetailFragment @Inject constructor( MessageActionsBottomSheet .newInstance(roomId, informationData) .show(requireActivity().supportFragmentManager, "MESSAGE_CONTEXTUAL_ACTIONS") + return true } + private fun handleCancelSend(action: EventSharedAction.Cancel) { + AlertDialog.Builder(requireContext()) + .setTitle(R.string.dialog_title_confirmation) + .setMessage(getString(R.string.event_status_cancel_sending_dialog_message)) + .setNegativeButton(R.string.no, null) + .setPositiveButton(R.string.yes) { _, _ -> + roomDetailViewModel.handle(RoomDetailAction.CancelSend(action.eventId)) + } + .show() + } + override fun onAvatarClicked(informationData: MessageInformationData) { // roomDetailViewModel.handle(RoomDetailAction.RequestVerification(informationData.userId)) openRoomMemberProfile(informationData.senderId) @@ -1685,7 +1722,7 @@ class RoomDetailFragment @Inject constructor( is EventSharedAction.Copy -> { // I need info about the current selected message :/ copyToClipboard(requireContext(), action.content, false) - showSnackWithMessage(getString(R.string.copied_to_clipboard), Snackbar.LENGTH_SHORT) + showSnackWithMessage(getString(R.string.copied_to_clipboard)) } is EventSharedAction.Redact -> { promptConfirmationToRedactEvent(action) @@ -1729,7 +1766,7 @@ class RoomDetailFragment @Inject constructor( is EventSharedAction.CopyPermalink -> { val permalink = session.permalinkService().createPermalink(roomDetailArgs.roomId, action.eventId) copyToClipboard(requireContext(), permalink, false) - showSnackWithMessage(getString(R.string.copied_to_clipboard), Snackbar.LENGTH_SHORT) + showSnackWithMessage(getString(R.string.copied_to_clipboard)) } is EventSharedAction.Resend -> { roomDetailViewModel.handle(RoomDetailAction.ResendMessage(action.eventId)) @@ -1738,7 +1775,7 @@ class RoomDetailFragment @Inject constructor( roomDetailViewModel.handle(RoomDetailAction.RemoveFailedEcho(action.eventId)) } is EventSharedAction.Cancel -> { - roomDetailViewModel.handle(RoomDetailAction.CancelSend(action.eventId)) + handleCancelSend(action) } is EventSharedAction.ReportContentSpam -> { roomDetailViewModel.handle(RoomDetailAction.ReportContent( @@ -1840,8 +1877,8 @@ class RoomDetailFragment @Inject constructor( } } - private fun showSnackWithMessage(message: String, duration: Int = Snackbar.LENGTH_SHORT) { - Snackbar.make(requireView(), message, duration).show() + private fun showSnackWithMessage(message: String) { + view?.showOptimizedSnackbar(message) } private fun showDialogWithMessage(message: String) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index c7a5873a65..115b0b29dd 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -19,15 +19,20 @@ package im.vector.app.features.home.room.detail import android.net.Uri import androidx.annotation.IdRes import androidx.lifecycle.viewModelScope +import com.airbnb.mvrx.Async +import com.airbnb.mvrx.Fail import com.airbnb.mvrx.FragmentViewModelContext +import com.airbnb.mvrx.Loading import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.Success +import com.airbnb.mvrx.Uninitialized import com.airbnb.mvrx.ViewModelContext import com.jakewharton.rxrelay2.BehaviorRelay import com.jakewharton.rxrelay2.PublishRelay import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import im.vector.app.BuildConfig import im.vector.app.R import im.vector.app.core.extensions.exhaustive import im.vector.app.core.platform.VectorViewModel @@ -36,6 +41,7 @@ import im.vector.app.features.call.dialpad.DialPadLookup import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.command.CommandParser import im.vector.app.features.command.ParsedCommand +import im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy import im.vector.app.features.createdirect.DirectRoomHelper import im.vector.app.features.crypto.verification.SupportedVerificationMethodsProvider import im.vector.app.features.home.room.detail.composer.rainbow.RainbowGenerator @@ -79,7 +85,6 @@ import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary -import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.model.message.MessageType import org.matrix.android.sdk.api.session.room.model.message.OptionItem import org.matrix.android.sdk.api.session.room.model.message.getFileUrl @@ -89,6 +94,7 @@ import org.matrix.android.sdk.api.session.room.read.ReadService import org.matrix.android.sdk.api.session.room.send.UserDraft import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent +import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent import org.matrix.android.sdk.api.session.room.timeline.getRelationContent import org.matrix.android.sdk.api.session.room.timeline.getTextEditableContent import org.matrix.android.sdk.api.session.widgets.model.Widget @@ -132,7 +138,7 @@ class RoomDetailViewModel @AssistedInject constructor( val timeline = room.createTimeline(eventId, timelineSettings) // Same lifecycle than the ViewModel (survive to screen rotation) - val previewUrlRetriever = PreviewUrlRetriever(session) + val previewUrlRetriever = PreviewUrlRetriever(session, viewModelScope) // Slot to keep a pending action during permission request var pendingAction: RoomDetailAction? = null @@ -140,6 +146,8 @@ class RoomDetailViewModel @AssistedInject constructor( private var trackUnreadMessages = AtomicBoolean(false) private var mostRecentDisplayedEvent: TimelineEvent? = null + private var prepareToEncrypt: Async = Uninitialized + @AssistedFactory interface Factory { fun create(initialState: RoomDetailViewState): RoomDetailViewModel @@ -179,6 +187,27 @@ class RoomDetailViewModel @AssistedInject constructor( callManager.addPstnSupportListener(this) callManager.checkForPSTNSupportIfNeeded() chatEffectManager.delegate = this + + // Ensure to share the outbound session keys with all members + if (OutboundSessionKeySharingStrategy.WhenEnteringRoom == BuildConfig.outboundSessionKeySharingStrategy && room.isEncrypted()) { + prepareForEncryption() + } + } + + private fun prepareForEncryption() { + // check if there is not already a call made, or if there has been an error + if (prepareToEncrypt.shouldLoad) { + prepareToEncrypt = Loading() + viewModelScope.launch { + runCatching { + room.prepareToEncrypt() + }.fold({ + prepareToEncrypt = Success(Unit) + }, { + prepareToEncrypt = Fail(it) + }) + } + } } private fun observePowerLevel() { @@ -233,65 +262,68 @@ class RoomDetailViewModel @AssistedInject constructor( override fun handle(action: RoomDetailAction) { when (action) { - is RoomDetailAction.UserIsTyping -> handleUserIsTyping(action) - is RoomDetailAction.SaveDraft -> handleSaveDraft(action) - is RoomDetailAction.SendMessage -> handleSendMessage(action) - is RoomDetailAction.SendMedia -> handleSendMedia(action) - is RoomDetailAction.SendSticker -> handleSendSticker(action) - is RoomDetailAction.TimelineEventTurnsVisible -> handleEventVisible(action) - is RoomDetailAction.TimelineEventTurnsInvisible -> handleEventInvisible(action) - is RoomDetailAction.LoadMoreTimelineEvents -> handleLoadMore(action) - is RoomDetailAction.SendReaction -> handleSendReaction(action) - is RoomDetailAction.AcceptInvite -> handleAcceptInvite() - is RoomDetailAction.RejectInvite -> handleRejectInvite() - is RoomDetailAction.RedactAction -> handleRedactEvent(action) - is RoomDetailAction.UndoReaction -> handleUndoReact(action) - is RoomDetailAction.UpdateQuickReactAction -> handleUpdateQuickReaction(action) - is RoomDetailAction.EnterRegularMode -> handleEnterRegularMode(action) - is RoomDetailAction.EnterEditMode -> handleEditAction(action) - is RoomDetailAction.EnterQuoteMode -> handleQuoteAction(action) - is RoomDetailAction.EnterReplyMode -> handleReplyAction(action) - is RoomDetailAction.DownloadOrOpen -> handleOpenOrDownloadFile(action) - is RoomDetailAction.NavigateToEvent -> handleNavigateToEvent(action) - is RoomDetailAction.HandleTombstoneEvent -> handleTombstoneEvent(action) - is RoomDetailAction.ResendMessage -> handleResendEvent(action) - is RoomDetailAction.RemoveFailedEcho -> handleRemove(action) - is RoomDetailAction.ResendAll -> handleResendAll() - is RoomDetailAction.MarkAllAsRead -> handleMarkAllAsRead() - is RoomDetailAction.ReportContent -> handleReportContent(action) - is RoomDetailAction.IgnoreUser -> handleIgnoreUser(action) + is RoomDetailAction.UserIsTyping -> handleUserIsTyping(action) + is RoomDetailAction.ComposerFocusChange -> handleComposerFocusChange(action) + is RoomDetailAction.SaveDraft -> handleSaveDraft(action) + is RoomDetailAction.SendMessage -> handleSendMessage(action) + is RoomDetailAction.SendMedia -> handleSendMedia(action) + is RoomDetailAction.SendSticker -> handleSendSticker(action) + is RoomDetailAction.TimelineEventTurnsVisible -> handleEventVisible(action) + is RoomDetailAction.TimelineEventTurnsInvisible -> handleEventInvisible(action) + is RoomDetailAction.LoadMoreTimelineEvents -> handleLoadMore(action) + is RoomDetailAction.SendReaction -> handleSendReaction(action) + is RoomDetailAction.AcceptInvite -> handleAcceptInvite() + is RoomDetailAction.RejectInvite -> handleRejectInvite() + is RoomDetailAction.RedactAction -> handleRedactEvent(action) + is RoomDetailAction.UndoReaction -> handleUndoReact(action) + is RoomDetailAction.UpdateQuickReactAction -> handleUpdateQuickReaction(action) + is RoomDetailAction.EnterRegularMode -> handleEnterRegularMode(action) + is RoomDetailAction.EnterEditMode -> handleEditAction(action) + is RoomDetailAction.EnterQuoteMode -> handleQuoteAction(action) + is RoomDetailAction.EnterReplyMode -> handleReplyAction(action) + is RoomDetailAction.DownloadOrOpen -> handleOpenOrDownloadFile(action) + is RoomDetailAction.NavigateToEvent -> handleNavigateToEvent(action) + is RoomDetailAction.HandleTombstoneEvent -> handleTombstoneEvent(action) + is RoomDetailAction.ResendMessage -> handleResendEvent(action) + is RoomDetailAction.RemoveFailedEcho -> handleRemove(action) + is RoomDetailAction.ResendAll -> handleResendAll() + is RoomDetailAction.MarkAllAsRead -> handleMarkAllAsRead() + is RoomDetailAction.ReportContent -> handleReportContent(action) + is RoomDetailAction.IgnoreUser -> handleIgnoreUser(action) is RoomDetailAction.EnterTrackingUnreadMessagesState -> startTrackingUnreadMessages() - is RoomDetailAction.ExitTrackingUnreadMessagesState -> stopTrackingUnreadMessages() - is RoomDetailAction.ReplyToOptions -> handleReplyToOptions(action) - is RoomDetailAction.AcceptVerificationRequest -> handleAcceptVerification(action) - is RoomDetailAction.DeclineVerificationRequest -> handleDeclineVerification(action) - is RoomDetailAction.RequestVerification -> handleRequestVerification(action) - is RoomDetailAction.ResumeVerification -> handleResumeRequestVerification(action) - is RoomDetailAction.ReRequestKeys -> handleReRequestKeys(action) - is RoomDetailAction.TapOnFailedToDecrypt -> handleTapOnFailedToDecrypt(action) - is RoomDetailAction.SelectStickerAttachment -> handleSelectStickerAttachment() - is RoomDetailAction.OpenIntegrationManager -> handleOpenIntegrationManager() - is RoomDetailAction.StartCallWithPhoneNumber -> handleStartCallWithPhoneNumber(action) - is RoomDetailAction.StartCall -> handleStartCall(action) - is RoomDetailAction.AcceptCall -> handleAcceptCall(action) - is RoomDetailAction.EndCall -> handleEndCall() - is RoomDetailAction.ManageIntegrations -> handleManageIntegrations() - is RoomDetailAction.AddJitsiWidget -> handleAddJitsiConference(action) - is RoomDetailAction.RemoveWidget -> handleDeleteWidget(action.widgetId) - is RoomDetailAction.EnsureNativeWidgetAllowed -> handleCheckWidgetAllowed(action) - is RoomDetailAction.CancelSend -> handleCancel(action) - is RoomDetailAction.OpenOrCreateDm -> handleOpenOrCreateDm(action) - is RoomDetailAction.JumpToReadReceipt -> handleJumpToReadReceipt(action) - RoomDetailAction.QuickActionInvitePeople -> handleInvitePeople() - RoomDetailAction.QuickActionSetAvatar -> handleQuickSetAvatar() - is RoomDetailAction.SetAvatarAction -> handleSetNewAvatar(action) - RoomDetailAction.QuickActionSetTopic -> _viewEvents.post(RoomDetailViewEvents.OpenRoomSettings) - is RoomDetailAction.ShowRoomAvatarFullScreen -> { + is RoomDetailAction.ExitTrackingUnreadMessagesState -> stopTrackingUnreadMessages() + is RoomDetailAction.ReplyToOptions -> handleReplyToOptions(action) + is RoomDetailAction.AcceptVerificationRequest -> handleAcceptVerification(action) + is RoomDetailAction.DeclineVerificationRequest -> handleDeclineVerification(action) + is RoomDetailAction.RequestVerification -> handleRequestVerification(action) + is RoomDetailAction.ResumeVerification -> handleResumeRequestVerification(action) + is RoomDetailAction.ReRequestKeys -> handleReRequestKeys(action) + is RoomDetailAction.TapOnFailedToDecrypt -> handleTapOnFailedToDecrypt(action) + is RoomDetailAction.SelectStickerAttachment -> handleSelectStickerAttachment() + is RoomDetailAction.OpenIntegrationManager -> handleOpenIntegrationManager() + is RoomDetailAction.StartCallWithPhoneNumber -> handleStartCallWithPhoneNumber(action) + is RoomDetailAction.StartCall -> handleStartCall(action) + is RoomDetailAction.AcceptCall -> handleAcceptCall(action) + is RoomDetailAction.EndCall -> handleEndCall() + is RoomDetailAction.ManageIntegrations -> handleManageIntegrations() + is RoomDetailAction.AddJitsiWidget -> handleAddJitsiConference(action) + is RoomDetailAction.RemoveWidget -> handleDeleteWidget(action.widgetId) + is RoomDetailAction.EnsureNativeWidgetAllowed -> handleCheckWidgetAllowed(action) + is RoomDetailAction.CancelSend -> handleCancel(action) + is RoomDetailAction.OpenOrCreateDm -> handleOpenOrCreateDm(action) + is RoomDetailAction.JumpToReadReceipt -> handleJumpToReadReceipt(action) + RoomDetailAction.QuickActionInvitePeople -> handleInvitePeople() + RoomDetailAction.QuickActionSetAvatar -> handleQuickSetAvatar() + is RoomDetailAction.SetAvatarAction -> handleSetNewAvatar(action) + RoomDetailAction.QuickActionSetTopic -> _viewEvents.post(RoomDetailViewEvents.OpenRoomSettings) + is RoomDetailAction.ShowRoomAvatarFullScreen -> { _viewEvents.post( RoomDetailViewEvents.ShowRoomAvatarFullScreen(action.matrixItem, action.transitionView) ) } - is RoomDetailAction.DoNotShowPreviewUrlFor -> handleDoNotShowPreviewUrlFor(action) + is RoomDetailAction.DoNotShowPreviewUrlFor -> handleDoNotShowPreviewUrlFor(action) + RoomDetailAction.RemoveAllFailedMessages -> handleRemoveAllFailedMessages() + RoomDetailAction.ResendAll -> handleResendAll() }.exhaustive } @@ -593,6 +625,16 @@ class RoomDetailViewModel @AssistedInject constructor( } } + private fun handleComposerFocusChange(action: RoomDetailAction.ComposerFocusChange) { + // Ensure outbound session keys + if (OutboundSessionKeySharingStrategy.WhenTyping == BuildConfig.outboundSessionKeySharingStrategy && room.isEncrypted()) { + if (action.focused) { + // Should we add some rate limit here, or do it only once per model lifecycle? + prepareForEncryption() + } + } + } + private fun handleTombstoneEvent(action: RoomDetailAction.HandleTombstoneEvent) { val tombstoneContent = action.event.getClearContent().toModel() ?: return @@ -620,10 +662,8 @@ class RoomDetailViewModel @AssistedInject constructor( return@withState false } when (itemId) { - R.id.resend_all -> state.asyncRoomSummary()?.hasFailedSending == true R.id.timeline_setting -> true - R.id.invite -> state.canInvite - R.id.clear_all -> state.asyncRoomSummary()?.hasFailedSending == true + R.id.invite -> state.canInvite R.id.open_matrix_apps -> true R.id.voice_call, R.id.video_call -> callManager.getCallsByRoomId(state.roomId).isEmpty() @@ -776,7 +816,7 @@ class RoomDetailViewModel @AssistedInject constructor( } }.exhaustive } - is SendMode.EDIT -> { + is SendMode.EDIT -> { // is original event a reply? val inReplyTo = state.sendMode.timelineEvent.getRelationContent()?.inReplyTo?.eventId if (inReplyTo != null) { @@ -785,12 +825,10 @@ class RoomDetailViewModel @AssistedInject constructor( room.editReply(state.sendMode.timelineEvent, it, action.text.toString()) } } else { - val messageContent: MessageContent? = - state.sendMode.timelineEvent.annotations?.editSummary?.aggregatedContent.toModel() - ?: state.sendMode.timelineEvent.root.getClearContent().toModel() + val messageContent = state.sendMode.timelineEvent.getLastMessageContent() val existingBody = messageContent?.body ?: "" if (existingBody != action.text) { - room.editTextMessage(state.sendMode.timelineEvent.root.eventId ?: "", + room.editTextMessage(state.sendMode.timelineEvent, messageContent?.msgType ?: MessageType.MSGTYPE_TEXT, action.text, action.autoMarkdown) @@ -801,10 +839,8 @@ class RoomDetailViewModel @AssistedInject constructor( _viewEvents.post(RoomDetailViewEvents.MessageSent) popDraft() } - is SendMode.QUOTE -> { - val messageContent: MessageContent? = - state.sendMode.timelineEvent.annotations?.editSummary?.aggregatedContent.toModel() - ?: state.sendMode.timelineEvent.root.getClearContent().toModel() + is SendMode.QUOTE -> { + val messageContent = state.sendMode.timelineEvent.getLastMessageContent() val textMsg = messageContent?.body val finalText = legacyRiotQuoteText(textMsg, action.text.toString()) @@ -824,7 +860,7 @@ class RoomDetailViewModel @AssistedInject constructor( _viewEvents.post(RoomDetailViewEvents.MessageSent) popDraft() } - is SendMode.REPLY -> { + is SendMode.REPLY -> { state.sendMode.timelineEvent.let { room.replyToMessage(it, action.text.toString(), action.autoMarkdown) _viewEvents.post(RoomDetailViewEvents.MessageSent) @@ -1187,6 +1223,10 @@ class RoomDetailViewModel @AssistedInject constructor( room.resendAllFailedMessages() } + private fun handleRemoveAllFailedMessages() { + room.cancelAllFailedMessages() + } + private fun observeEventDisplayedActions() { // We are buffering scroll events for one second // and keep the most recent one to set the read receipt on. @@ -1401,7 +1441,10 @@ class RoomDetailViewModel @AssistedInject constructor( roomSummariesHolder.set(summary) setState { val typingMessage = typingHelper.getTypingMessage(summary.typingUsers) - copy(typingMessage = typingMessage) + copy( + typingMessage = typingMessage, + hasFailedSending = summary.hasFailedSending + ) } if (summary.membership == Membership.INVITE) { summary.inviterId?.let { inviterId -> @@ -1425,7 +1468,7 @@ class RoomDetailViewModel @AssistedInject constructor( snapshot .takeIf { state.asyncRoomSummary.invoke()?.isEncrypted == false } ?.forEach { - previewUrlRetriever.getPreviewUrl(it, viewModelScope) + previewUrlRetriever.getPreviewUrl(it) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt index 8c2b3ffe98..965733c424 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewState.kt @@ -75,7 +75,8 @@ data class RoomDetailViewState( val canInvite: Boolean = true, val isAllowedToManageWidgets: Boolean = false, val isAllowedToStartWebRTCCall: Boolean = true, - val showDialerOption: Boolean = false + val showDialerOption: Boolean = false, + val hasFailedSending: Boolean = false ) : MvRxState { constructor(args: RoomDetailArgs) : this( diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/MessageColorProvider.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/MessageColorProvider.kt index d1bef4c8c7..2b39eb1e26 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/MessageColorProvider.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/MessageColorProvider.kt @@ -50,17 +50,8 @@ class MessageColorProvider @Inject constructor( SendState.FAILED_UNKNOWN_DEVICES -> colorProvider.getColorFromAttribute(R.attr.vctr_unsent_message_text_color) } } else { - // When not in developer mode, we do not use special color for the encrypting state - when (sendState) { - SendState.UNKNOWN, - SendState.UNSENT, - SendState.ENCRYPTING, - SendState.SENDING -> colorProvider.getColorFromAttribute(R.attr.vctr_sending_message_text_color) - SendState.SENT, - SendState.SYNCED -> colorProvider.getColorFromAttribute(R.attr.vctr_message_text_color) - SendState.UNDELIVERED, - SendState.FAILED_UNKNOWN_DEVICES -> colorProvider.getColorFromAttribute(R.attr.vctr_unsent_message_text_color) - } + // When not in developer mode, we use only one color + colorProvider.getColorFromAttribute(R.attr.vctr_message_text_color) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt index 9acd34c827..44f1e9b759 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt @@ -30,6 +30,7 @@ import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.epoxy.LoadingItem_ import im.vector.app.core.extensions.localDateTime import im.vector.app.core.extensions.nextOrNull +import im.vector.app.core.extensions.prevOrNull import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.home.room.detail.RoomDetailAction import im.vector.app.features.home.room.detail.RoomDetailViewState @@ -42,11 +43,13 @@ import im.vector.app.features.home.room.detail.timeline.helper.TimelineControlle import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventDiffUtilCallback import im.vector.app.features.home.room.detail.timeline.helper.TimelineEventVisibilityStateChangedListener import im.vector.app.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider +import im.vector.app.features.home.room.detail.timeline.item.AbsMessageItem import im.vector.app.features.home.room.detail.timeline.item.BasedMergedItem import im.vector.app.features.home.room.detail.timeline.item.DaySeparatorItem import im.vector.app.features.home.room.detail.timeline.item.DaySeparatorItem_ import im.vector.app.features.home.room.detail.timeline.item.MessageInformationData import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData +import im.vector.app.features.home.room.detail.timeline.item.SendStateDecoration import im.vector.app.features.home.room.detail.timeline.url.PreviewUrlRetriever import im.vector.app.features.media.ImageContentRenderer import im.vector.app.features.media.VideoContentRenderer @@ -155,6 +158,7 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec synchronized(modelCache) { assertUpdateCallbacksAllowed() (position until (position + count)).forEach { + // Invalidate cache modelCache[it] = null } requestModelBuild() @@ -173,7 +177,7 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec override fun onInserted(position: Int, count: Int) { synchronized(modelCache) { assertUpdateCallbacksAllowed() - (0 until count).forEach { + repeat(count) { modelCache.add(position, null) } requestModelBuild() @@ -183,7 +187,7 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec override fun onRemoved(position: Int, count: Int) { synchronized(modelCache) { assertUpdateCallbacksAllowed() - (0 until count).forEach { + repeat(count) { modelCache.removeAt(position) } requestModelBuild() @@ -335,11 +339,12 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec private fun buildCacheItem(currentPosition: Int, items: List): CacheItemData { val event = items[currentPosition] val nextEvent = items.nextOrNull(currentPosition) + val prevEvent = items.prevOrNull(currentPosition) if (hasReachedInvite && hasUTD) { return CacheItemData(event.localId, event.root.eventId, null, null, null) } updateUTDStates(event, nextEvent) - val eventModel = timelineItemFactory.create(event, nextEvent, eventIdToHighlight, callback).also { + val eventModel = timelineItemFactory.create(event, prevEvent, nextEvent, eventIdToHighlight, callback).also { it.id(event.localId) it.setOnVisibilityStateChanged(TimelineEventVisibilityStateChangedListener(callback, event)) } @@ -361,7 +366,9 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec requestModelBuild() } val daySeparatorItem = buildDaySeparatorItem(addDaySeparator, event.root.originServerTs) - return CacheItemData(event.localId, event.root.eventId, eventModel, mergedHeaderModel, daySeparatorItem) + // If we have a SENT decoration, we want to built again as it might have to be changed to NONE if more recent event has also SENT decoration + val forceTriggerBuild = eventModel is AbsMessageItem && eventModel.attributes.informationData.sendStateDecoration == SendStateDecoration.SENT + return CacheItemData(event.localId, event.root.eventId, eventModel, mergedHeaderModel, daySeparatorItem, forceTriggerBuild) } private fun buildDaySeparatorItem(addDaySeparator: Boolean, originServerTs: Long?): DaySeparatorItem? { @@ -424,10 +431,12 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec val eventId: String?, val eventModel: EpoxyModel<*>? = null, val mergedHeaderModel: BasedMergedItem<*>? = null, - val formattedDayModel: DaySeparatorItem? = null + val formattedDayModel: DaySeparatorItem? = null, + val forceTriggerBuild: Boolean = false ) { fun shouldTriggerBuild(): Boolean { - return mergedHeaderModel != null || formattedDayModel != null + // Since those items can change when we paginate, force a re-build + return forceTriggerBuild || mergedHeaderModel != null || formattedDayModel != null } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionState.kt index 83d56a65c9..caee485aba 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionState.kt @@ -21,6 +21,7 @@ import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized import im.vector.app.core.extensions.canReact import im.vector.app.features.home.room.detail.timeline.item.MessageInformationData +import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent /** @@ -56,4 +57,6 @@ data class MessageActionState( fun senderName(): String = informationData.memberName?.toString() ?: "" fun canReact() = timelineEvent()?.canReact() == true && actionPermissions.canReact + + fun sendState(): SendState? = timelineEvent()?.root?.sendState } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt index cc3d5cc463..1e93c29673 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsEpoxyController.kt @@ -34,6 +34,8 @@ import im.vector.app.features.home.room.detail.timeline.TimelineEventController import im.vector.app.features.home.room.detail.timeline.item.E2EDecoration import im.vector.app.features.home.room.detail.timeline.tools.createLinkMovementMethod import im.vector.app.features.home.room.detail.timeline.tools.linkify +import org.matrix.android.sdk.api.extensions.orFalse +import org.matrix.android.sdk.api.session.room.send.SendState import javax.inject.Inject /** @@ -63,23 +65,24 @@ class MessageActionsEpoxyController @Inject constructor( } // Send state - if (state.informationData.sendState.isSending()) { - bottomSheetSendStateItem { - id("send_state") - showProgress(true) - text(stringProvider.getString(R.string.event_status_sending_message)) - } - } else if (state.informationData.sendState.hasFailed()) { + val sendState = state.sendState() + if (sendState?.hasFailed().orFalse()) { bottomSheetSendStateItem { id("send_state") showProgress(false) text(stringProvider.getString(R.string.unable_to_send_message)) drawableStart(R.drawable.ic_warning_badge) } + } else if (sendState != SendState.SYNCED) { + bottomSheetSendStateItem { + id("send_state") + showProgress(true) + text(stringProvider.getString(R.string.event_status_sending_message)) + } } when (state.informationData.e2eDecoration) { - E2EDecoration.WARN_IN_CLEAR -> { + E2EDecoration.WARN_IN_CLEAR -> { bottomSheetSendStateItem { id("e2e_clear") showProgress(false) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt index 1697d9250e..adf315a955 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt @@ -18,10 +18,11 @@ package im.vector.app.features.home.room.detail.timeline.action import com.airbnb.mvrx.FragmentViewModelContext import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.ViewModelContext -import dagger.assisted.Assisted -import dagger.assisted.AssistedInject -import dagger.assisted.AssistedFactory +import com.jakewharton.rxrelay2.BehaviorRelay import dagger.Lazy +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import im.vector.app.R import im.vector.app.core.extensions.canReact import im.vector.app.core.platform.EmptyViewEvents @@ -69,13 +70,14 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted private val vectorPreferences: VectorPreferences ) : VectorViewModel(initialState) { - private val eventId = initialState.eventId private val informationData = initialState.informationData private val room = session.getRoom(initialState.roomId) private val pillsPostProcessor by lazy { pillsPostProcessorFactory.create(initialState.roomId) } + private val eventIdObservable = BehaviorRelay.createDefault(initialState.eventId) + @AssistedFactory interface Factory { fun create(initialState: MessageActionState): MessageActionsViewModel @@ -130,7 +132,7 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted private fun observeEvent() { if (room == null) return room.rx() - .liveTimelineEvent(eventId) + .liveTimelineEvent(initialState.eventId) .unwrap() .execute { copy(timelineEvent = it) @@ -139,12 +141,15 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted private fun observeReactions() { if (room == null) return - room.rx() - .liveAnnotationSummary(eventId) - .map { annotations -> - EmojiDataSource.quickEmojis.map { emoji -> - ToggleState(emoji, annotations.getOrNull()?.reactionsSummary?.firstOrNull { it.key == emoji }?.addedByMe ?: false) - } + eventIdObservable + .switchMap { eventId -> + room.rx() + .liveAnnotationSummary(eventId) + .map { annotations -> + EmojiDataSource.quickEmojis.map { emoji -> + ToggleState(emoji, annotations.getOrNull()?.reactionsSummary?.firstOrNull { it.key == emoji }?.addedByMe ?: false) + } + } } .execute { copy(quickStates = it) @@ -154,8 +159,10 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted private fun observeTimelineEventState() { selectSubscribe(MessageActionState::timelineEvent, MessageActionState::actionPermissions) { timelineEvent, permissions -> val nonNullTimelineEvent = timelineEvent() ?: return@selectSubscribe + eventIdObservable.accept(nonNullTimelineEvent.eventId) setState { copy( + eventId = nonNullTimelineEvent.eventId, messageBody = computeMessageBody(nonNullTimelineEvent), actions = actionsForEvent(nonNullTimelineEvent, permissions) ) @@ -229,99 +236,19 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted } private fun actionsForEvent(timelineEvent: TimelineEvent, actionPermissions: ActionPermissions): List { - val messageContent: MessageContent? = timelineEvent.annotations?.editSummary?.aggregatedContent.toModel() - ?: timelineEvent.root.getClearContent().toModel() + val messageContent = timelineEvent.getLastMessageContent() val msgType = messageContent?.msgType return arrayListOf().apply { - if (timelineEvent.root.sendState.hasFailed()) { - if (canRetry(timelineEvent, actionPermissions)) { - add(EventSharedAction.Resend(eventId)) + when { + timelineEvent.root.sendState.hasFailed() -> { + addActionsForFailedState(timelineEvent, actionPermissions, messageContent, msgType) } - add(EventSharedAction.Remove(eventId)) - if (vectorPreferences.developerMode()) { - addViewSourceItems(timelineEvent) + timelineEvent.root.sendState.isSending() -> { + addActionsForSendingState(timelineEvent) } - } else if (timelineEvent.root.sendState.isSending()) { - // TODO is uploading attachment? - if (canCancel(timelineEvent)) { - add(EventSharedAction.Cancel(eventId)) - } - } else if (timelineEvent.root.sendState == SendState.SYNCED) { - if (!timelineEvent.root.isRedacted()) { - if (canReply(timelineEvent, messageContent, actionPermissions)) { - add(EventSharedAction.Reply(eventId)) - } - - if (canEdit(timelineEvent, session.myUserId, actionPermissions)) { - add(EventSharedAction.Edit(eventId)) - } - - if (canRedact(timelineEvent, actionPermissions)) { - add(EventSharedAction.Redact(eventId, askForReason = informationData.senderId != session.myUserId)) - } - - if (canCopy(msgType)) { - // TODO copy images? html? see ClipBoard - add(EventSharedAction.Copy(messageContent!!.body)) - } - - if (timelineEvent.canReact() && actionPermissions.canReact) { - add(EventSharedAction.AddReaction(eventId)) - } - - if (canQuote(timelineEvent, messageContent, actionPermissions)) { - add(EventSharedAction.Quote(eventId)) - } - - if (canViewReactions(timelineEvent)) { - add(EventSharedAction.ViewReactions(informationData)) - } - - if (timelineEvent.hasBeenEdited()) { - add(EventSharedAction.ViewEditHistory(informationData)) - } - - if (canShare(msgType)) { - add(EventSharedAction.Share(timelineEvent.eventId, messageContent!!)) - } - - if (canSave(msgType) && messageContent is MessageWithAttachmentContent) { - add(EventSharedAction.Save(timelineEvent.eventId, messageContent)) - } - - if (timelineEvent.root.sendState == SendState.SENT) { - // TODO Can be redacted - - // TODO sent by me or sufficient power level - } - } - - if (vectorPreferences.developerMode()) { - if (timelineEvent.isEncrypted() && timelineEvent.root.mCryptoError != null) { - val keysBackupService = session.cryptoService().keysBackupService() - if (keysBackupService.state == KeysBackupState.NotTrusted - || (keysBackupService.state == KeysBackupState.ReadyToBackUp - && keysBackupService.canRestoreKeys()) - ) { - add(EventSharedAction.UseKeyBackup) - } - if (session.cryptoService().getCryptoDeviceInfo(session.myUserId).size > 1 - || timelineEvent.senderInfo.userId != session.myUserId) { - add(EventSharedAction.ReRequestKey(timelineEvent.eventId)) - } - } - addViewSourceItems(timelineEvent) - } - add(EventSharedAction.CopyPermalink(eventId)) - if (session.myUserId != timelineEvent.root.senderId) { - // not sent by me - if (timelineEvent.root.getClearType() == EventType.MESSAGE) { - add(EventSharedAction.ReportContent(eventId, timelineEvent.root.senderId)) - } - - add(EventSharedAction.Separator) - add(EventSharedAction.IgnoreUser(timelineEvent.root.senderId)) + timelineEvent.root.sendState == SendState.SYNCED -> { + addActionsForSyncedState(timelineEvent, actionPermissions, messageContent, msgType) } } } @@ -336,6 +263,116 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted } } + private fun ArrayList.addActionsForFailedState(timelineEvent: TimelineEvent, + actionPermissions: ActionPermissions, + messageContent: MessageContent?, + msgType: String?) { + val eventId = timelineEvent.eventId + if (canRetry(timelineEvent, actionPermissions)) { + add(EventSharedAction.Resend(eventId)) + } + add(EventSharedAction.Remove(eventId)) + if (canEdit(timelineEvent, session.myUserId, actionPermissions)) { + add(EventSharedAction.Edit(eventId)) + } + if (canCopy(msgType)) { + // TODO copy images? html? see ClipBoard + add(EventSharedAction.Copy(messageContent!!.body)) + } + if (vectorPreferences.developerMode()) { + addViewSourceItems(timelineEvent) + } + } + + private fun ArrayList.addActionsForSendingState(timelineEvent: TimelineEvent) { + // TODO is uploading attachment? + if (canCancel(timelineEvent)) { + add(EventSharedAction.Cancel(timelineEvent.eventId)) + } + } + + private fun ArrayList.addActionsForSyncedState(timelineEvent: TimelineEvent, + actionPermissions: ActionPermissions, + messageContent: MessageContent?, + msgType: String?) { + val eventId = timelineEvent.eventId + if (!timelineEvent.root.isRedacted()) { + if (canReply(timelineEvent, messageContent, actionPermissions)) { + add(EventSharedAction.Reply(eventId)) + } + + if (canEdit(timelineEvent, session.myUserId, actionPermissions)) { + add(EventSharedAction.Edit(eventId)) + } + + if (canRedact(timelineEvent, actionPermissions)) { + add(EventSharedAction.Redact(eventId, askForReason = informationData.senderId != session.myUserId)) + } + + if (canCopy(msgType)) { + // TODO copy images? html? see ClipBoard + add(EventSharedAction.Copy(messageContent!!.body)) + } + + if (timelineEvent.canReact() && actionPermissions.canReact) { + add(EventSharedAction.AddReaction(eventId)) + } + + if (canQuote(timelineEvent, messageContent, actionPermissions)) { + add(EventSharedAction.Quote(eventId)) + } + + if (canViewReactions(timelineEvent)) { + add(EventSharedAction.ViewReactions(informationData)) + } + + if (timelineEvent.hasBeenEdited()) { + add(EventSharedAction.ViewEditHistory(informationData)) + } + + if (canShare(msgType)) { + add(EventSharedAction.Share(timelineEvent.eventId, messageContent!!)) + } + + if (canSave(msgType) && messageContent is MessageWithAttachmentContent) { + add(EventSharedAction.Save(timelineEvent.eventId, messageContent)) + } + + if (timelineEvent.root.sendState == SendState.SENT) { + // TODO Can be redacted + + // TODO sent by me or sufficient power level + } + } + + if (vectorPreferences.developerMode()) { + if (timelineEvent.isEncrypted() && timelineEvent.root.mCryptoError != null) { + val keysBackupService = session.cryptoService().keysBackupService() + if (keysBackupService.state == KeysBackupState.NotTrusted + || (keysBackupService.state == KeysBackupState.ReadyToBackUp + && keysBackupService.canRestoreKeys()) + ) { + add(EventSharedAction.UseKeyBackup) + } + if (session.cryptoService().getCryptoDeviceInfo(session.myUserId).size > 1 + || timelineEvent.senderInfo.userId != session.myUserId) { + add(EventSharedAction.ReRequestKey(timelineEvent.eventId)) + } + } + addViewSourceItems(timelineEvent) + } + add(EventSharedAction.CopyPermalink(eventId)) + if (session.myUserId != timelineEvent.root.senderId) { + // not sent by me + if (timelineEvent.root.getClearType() == EventType.MESSAGE) { + add(EventSharedAction.ReportContent(eventId, timelineEvent.root.senderId)) + } + + add(EventSharedAction.Separator) + add(EventSharedAction.IgnoreUser(timelineEvent.root.senderId)) + } + } + private fun canCancel(@Suppress("UNUSED_PARAMETER") event: TimelineEvent): Boolean { return true } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewModel.kt index fff1c8a0ff..af814f5856 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewModel.kt @@ -15,42 +15,28 @@ */ package im.vector.app.features.home.room.detail.timeline.edithistory -import com.airbnb.mvrx.Async +import androidx.lifecycle.viewModelScope import com.airbnb.mvrx.Fail import com.airbnb.mvrx.FragmentViewModelContext import com.airbnb.mvrx.Loading -import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.Success -import com.airbnb.mvrx.Uninitialized import com.airbnb.mvrx.ViewModelContext import dagger.assisted.Assisted -import dagger.assisted.AssistedInject import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.platform.EmptyAction import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel -import im.vector.app.features.home.room.detail.timeline.action.TimelineEventFragmentArgs -import org.matrix.android.sdk.api.MatrixCallback +import kotlinx.coroutines.launch import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.MXCryptoError -import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.isReply import org.matrix.android.sdk.internal.crypto.algorithms.olm.OlmDecryptionResult import timber.log.Timber import java.util.UUID -data class ViewEditHistoryViewState( - val eventId: String, - val roomId: String, - val isOriginalAReply: Boolean = false, - val editList: Async> = Uninitialized) - : MvRxState { - - constructor(args: TimelineEventFragmentArgs) : this(roomId = args.roomId, eventId = args.eventId) -} - class ViewEditHistoryViewModel @AssistedInject constructor(@Assisted initialState: ViewEditHistoryViewState, val session: Session, @@ -82,48 +68,48 @@ class ViewEditHistoryViewModel @AssistedInject constructor(@Assisted private fun loadHistory() { setState { copy(editList = Loading()) } - room.fetchEditHistory(eventId, object : MatrixCallback> { - override fun onFailure(failure: Throwable) { + + viewModelScope.launch { + val data = try { + room.fetchEditHistory(eventId) + } catch (failure: Throwable) { setState { copy(editList = Fail(failure)) } + return@launch } - override fun onSuccess(data: List) { - var originalIsReply = false + var originalIsReply = false - val events = data.map { event -> - val timelineID = event.roomId + UUID.randomUUID().toString() - event.also { - // We need to check encryption - if (it.isEncrypted() && it.mxDecryptionResult == null) { - // for now decrypt sync - try { - val result = session.cryptoService().decryptEvent(it, timelineID) - it.mxDecryptionResult = OlmDecryptionResult( - payload = result.clearEvent, - senderKey = result.senderCurve25519Key, - keysClaimed = result.claimedEd25519Key?.let { k -> mapOf("ed25519" to k) }, - forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain - ) - } catch (e: MXCryptoError) { - Timber.w("Failed to decrypt event in history") - } - } - - if (event.eventId == it.eventId) { - originalIsReply = it.isReply() - } + data.forEach { event -> + val timelineID = event.roomId + UUID.randomUUID().toString() + // We need to check encryption + if (event.isEncrypted() && event.mxDecryptionResult == null) { + // for now decrypt sync + try { + val result = session.cryptoService().decryptEvent(event, timelineID) + event.mxDecryptionResult = OlmDecryptionResult( + payload = result.clearEvent, + senderKey = result.senderCurve25519Key, + keysClaimed = result.claimedEd25519Key?.let { k -> mapOf("ed25519" to k) }, + forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain + ) + } catch (e: MXCryptoError) { + Timber.w("Failed to decrypt event in history") } } - setState { - copy( - editList = Success(events), - isOriginalAReply = originalIsReply - ) + + if (event.eventId == eventId) { + originalIsReply = event.isReply() } } - }) + setState { + copy( + editList = Success(data), + isOriginalAReply = originalIsReply + ) + } + } } override fun handle(action: EmptyAction) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewState.kt new file mode 100644 index 0000000000..62f08eef7f --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewState.kt @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 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.home.room.detail.timeline.edithistory + +import com.airbnb.mvrx.Async +import com.airbnb.mvrx.MvRxState +import com.airbnb.mvrx.Uninitialized +import im.vector.app.features.home.room.detail.timeline.action.TimelineEventFragmentArgs +import org.matrix.android.sdk.api.session.events.model.Event + +data class ViewEditHistoryViewState( + val eventId: String, + val roomId: String, + val isOriginalAReply: Boolean = false, + val editList: Async> = Uninitialized) + : MvRxState { + + constructor(args: TimelineEventFragmentArgs) : this(roomId = args.roomId, eventId = args.eventId) +} diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/CallItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/CallItemFactory.kt index d3dd94eae7..548f7a3b1c 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/CallItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/CallItemFactory.kt @@ -52,7 +52,7 @@ class CallItemFactory @Inject constructor( ): VectorEpoxyModel<*>? { if (event.root.eventId == null) return null val roomId = event.roomId - val informationData = messageInformationDataFactory.create(event, null) + val informationData = messageInformationDataFactory.create(event, null, null) val callSignalingContent = event.getCallSignallingContent() ?: return null val callId = callSignalingContent.callId ?: return null val call = callManager.getCallById(callId) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/DefaultItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/DefaultItemFactory.kt index 9d82103d3b..71ac46307b 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/DefaultItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/DefaultItemFactory.kt @@ -61,7 +61,7 @@ class DefaultItemFactory @Inject constructor(private val avatarSizeProvider: Ava } else { stringProvider.getString(R.string.rendering_event_error_exception, event.root.eventId) } - val informationData = informationDataFactory.create(event, null) + val informationData = informationDataFactory.create(event, null, null) return create(text, informationData, highlight, callback) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptedItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptedItemFactory.kt index e88c1f3797..b531e08359 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptedItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptedItemFactory.kt @@ -47,6 +47,7 @@ class EncryptedItemFactory @Inject constructor(private val messageInformationDat private val vectorPreferences: VectorPreferences) { fun create(event: TimelineEvent, + prevEvent: TimelineEvent?, nextEvent: TimelineEvent?, highlight: Boolean, callback: TimelineEventController.Callback?): VectorEpoxyModel<*>? { @@ -108,7 +109,7 @@ class EncryptedItemFactory @Inject constructor(private val messageInformationDat } } - val informationData = messageInformationDataFactory.create(event, nextEvent) + val informationData = messageInformationDataFactory.create(event, prevEvent, nextEvent) val attributes = attributesFactory.create(event.root.content.toModel(), informationData, callback) return MessageTextItem_() .leftGuideline(avatarSizeProvider.leftGuideline) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt index 1eb09f2e7a..68716a3eba 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/EncryptionItemFactory.kt @@ -48,7 +48,7 @@ class EncryptionItemFactory @Inject constructor( return null } val algorithm = event.root.getClearContent().toModel()?.algorithm - val informationData = informationDataFactory.create(event, null) + val informationData = informationDataFactory.create(event, null, null) val attributes = messageItemAttributesFactory.create(null, informationData, callback) val isSafeAlgorithm = algorithm == MXCRYPTO_ALGORITHM_MEGOLM diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index e9cf8251de..e969998613 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -119,13 +119,14 @@ class MessageItemFactory @Inject constructor( } fun create(event: TimelineEvent, + prevEvent: TimelineEvent?, nextEvent: TimelineEvent?, highlight: Boolean, callback: TimelineEventController.Callback? ): VectorEpoxyModel<*>? { event.root.eventId ?: return null roomId = event.roomId - val informationData = messageInformationDataFactory.create(event, nextEvent) + val informationData = messageInformationDataFactory.create(event, prevEvent, nextEvent) if (event.root.isRedacted()) { // message is redacted val attributes = messageItemAttributesFactory.create(null, informationData, callback) @@ -468,7 +469,7 @@ class MessageItemFactory @Inject constructor( spannable.append(linkifiedBody) val editedSuffix = stringProvider.getString(R.string.edited_suffix) spannable.append(" ").append(editedSuffix) - val color = colorProvider.getColorFromAttribute(R.attr.vctr_list_header_secondary_text_color) + val color = colorProvider.getColorFromAttribute(R.attr.riotx_text_secondary) val editStart = spannable.lastIndexOf(editedSuffix) val editEnd = editStart + editedSuffix.length spannable.setSpan( diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/NoticeItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/NoticeItemFactory.kt index 12c7c2318a..dfabf96199 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/NoticeItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/NoticeItemFactory.kt @@ -35,7 +35,7 @@ class NoticeItemFactory @Inject constructor(private val eventFormatter: NoticeEv highlight: Boolean, callback: TimelineEventController.Callback?): NoticeItem? { val formattedText = eventFormatter.format(event) ?: return null - val informationData = informationDataFactory.create(event, null) + val informationData = informationDataFactory.create(event, null, null) val attributes = NoticeItem.Attributes( avatarRenderer = avatarRenderer, informationData = informationData, diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactory.kt index 7fd50147d4..ccc8289e08 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/TimelineItemFactory.kt @@ -37,7 +37,11 @@ class TimelineItemFactory @Inject constructor(private val messageItemFactory: Me private val callItemFactory: CallItemFactory, private val userPreferencesProvider: UserPreferencesProvider) { + /** + * Reminder: nextEvent is older and prevEvent is newer. + */ fun create(event: TimelineEvent, + prevEvent: TimelineEvent?, nextEvent: TimelineEvent?, eventIdToHighlight: String?, callback: TimelineEventController.Callback?): VectorEpoxyModel<*> { @@ -46,7 +50,7 @@ class TimelineItemFactory @Inject constructor(private val messageItemFactory: Me val computedModel = try { when (event.root.getClearType()) { EventType.STICKER, - EventType.MESSAGE -> messageItemFactory.create(event, nextEvent, highlight, callback) + EventType.MESSAGE -> messageItemFactory.create(event, prevEvent, nextEvent, highlight, callback) // State and call EventType.STATE_ROOM_TOMBSTONE, EventType.STATE_ROOM_NAME, @@ -76,9 +80,9 @@ class TimelineItemFactory @Inject constructor(private val messageItemFactory: Me EventType.ENCRYPTED -> { if (event.root.isRedacted()) { // Redacted event, let the MessageItemFactory handle it - messageItemFactory.create(event, nextEvent, highlight, callback) + messageItemFactory.create(event, prevEvent, nextEvent, highlight, callback) } else { - encryptedItemFactory.create(event, nextEvent, highlight, callback) + encryptedItemFactory.create(event, prevEvent, nextEvent, highlight, callback) } } EventType.STATE_ROOM_ALIASES, diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/VerificationItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/VerificationItemFactory.kt index 0b623d78f1..960487140d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/VerificationItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/VerificationItemFactory.kt @@ -26,6 +26,7 @@ import im.vector.app.features.home.room.detail.timeline.helper.MessageInformatio import im.vector.app.features.home.room.detail.timeline.helper.MessageItemAttributesFactory import im.vector.app.features.home.room.detail.timeline.item.StatusTileTimelineItem import im.vector.app.features.home.room.detail.timeline.item.StatusTileTimelineItem_ +import org.matrix.android.sdk.api.crypto.VerificationState import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.verification.CancelCode import org.matrix.android.sdk.api.session.crypto.verification.safeValueOf @@ -35,7 +36,6 @@ import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.message.MessageRelationContent import org.matrix.android.sdk.api.session.room.model.message.MessageVerificationCancelContent import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent -import org.matrix.android.sdk.internal.session.room.VerificationState import javax.inject.Inject /** @@ -75,9 +75,9 @@ class VerificationItemFactory @Inject constructor( // If it's not a request ignore this event // if (refEvent.root.getClearContent().toModel() == null) return ignoredConclusion(event, highlight, callback) - val referenceInformationData = messageInformationDataFactory.create(refEvent, null) + val referenceInformationData = messageInformationDataFactory.create(refEvent, null, null) - val informationData = messageInformationDataFactory.create(event, null) + val informationData = messageInformationDataFactory.create(event, null, null) val attributes = messageItemAttributesFactory.create(null, informationData, callback) when (event.root.getClearType()) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/WidgetItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/WidgetItemFactory.kt index 260958b19e..a6a88a3444 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/WidgetItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/WidgetItemFactory.kt @@ -64,7 +64,7 @@ class WidgetItemFactory @Inject constructor( callback: TimelineEventController.Callback?, widgetContent: WidgetContent, previousWidgetContent: WidgetContent?): VectorEpoxyModel<*> { - val informationData = informationDataFactory.create(timelineEvent, null) + val informationData = informationDataFactory.create(timelineEvent, null, null) val attributes = messageItemAttributesFactory.create(null, informationData, callback) val disambiguatedDisplayName = timelineEvent.senderInfo.disambiguatedDisplayName diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/format/NoticeEventFormatter.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/format/NoticeEventFormatter.kt index 1c86749abc..878cec0a07 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/format/NoticeEventFormatter.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/format/NoticeEventFormatter.kt @@ -20,6 +20,7 @@ import im.vector.app.ActiveSessionDataSource import im.vector.app.R import im.vector.app.core.resources.StringProvider import im.vector.app.features.home.room.detail.timeline.helper.RoomSummariesHolder +import im.vector.app.features.roomprofile.permissions.RoleFormatter import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.extensions.appendNl import org.matrix.android.sdk.api.extensions.orFalse @@ -55,6 +56,7 @@ import javax.inject.Inject class NoticeEventFormatter @Inject constructor( private val activeSessionDataSource: ActiveSessionDataSource, private val roomHistoryVisibilityFormatter: RoomHistoryVisibilityFormatter, + private val roleFormatter: RoleFormatter, private val vectorPreferences: VectorPreferences, private val roomSummariesHolder: RoomSummariesHolder, private val sp: StringProvider @@ -124,8 +126,8 @@ class NoticeEventFormatter @Inject constructor( val from = PowerLevelsHelper(previousPowerLevelsContent).getUserRole(userId) val to = PowerLevelsHelper(powerLevelsContent).getUserRole(userId) if (from != to) { - val fromStr = sp.getString(from.res, from.value) - val toStr = sp.getString(to.res, to.value) + val fromStr = roleFormatter.format(from) + val toStr = roleFormatter.format(to) val diff = sp.getString(R.string.notice_power_level_diff, userId, fromStr, toStr) diffs.add(diff) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt index 802c177197..09f173de14 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/MessageInformationDataFactory.kt @@ -25,10 +25,13 @@ import im.vector.app.features.home.room.detail.timeline.item.PollResponseData import im.vector.app.features.home.room.detail.timeline.item.ReactionInfoData import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData import im.vector.app.features.home.room.detail.timeline.item.ReferencesInfoData +import im.vector.app.features.home.room.detail.timeline.item.SendStateDecoration import im.vector.app.features.settings.VectorPreferences +import org.matrix.android.sdk.api.crypto.VerificationState import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.events.model.isAttachmentMessage import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.ReferencesAggregatedContent import org.matrix.android.sdk.api.session.room.model.message.MessageVerificationRequestContent @@ -37,7 +40,6 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent import org.matrix.android.sdk.api.session.room.timeline.hasBeenEdited import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent -import org.matrix.android.sdk.internal.session.room.VerificationState import javax.inject.Inject /** @@ -49,7 +51,7 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses private val dateFormatter: VectorDateFormatter, private val vectorPreferences: VectorPreferences) { - fun create(event: TimelineEvent, nextEvent: TimelineEvent?): MessageInformationData { + fun create(event: TimelineEvent, prevEvent: TimelineEvent?, nextEvent: TimelineEvent?): MessageInformationData { // Non nullability has been tested before val eventId = event.root.eventId!! @@ -70,6 +72,19 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses val time = dateFormatter.format(event.root.originServerTs, DateFormatKind.MESSAGE_SIMPLE) val e2eDecoration = getE2EDecoration(event) + // SendState Decoration + val isSentByMe = event.root.senderId == session.myUserId + val sendStateDecoration = if (isSentByMe) { + getSendStateDecoration( + eventSendState = event.root.sendState, + prevEventSendState = prevEvent?.root?.sendState, + anyReadReceipts = event.readReceipts.any { it.user.userId != session.myUserId }, + isMedia = event.root.isAttachmentMessage() + ) + } else { + SendStateDecoration.NONE + } + return MessageInformationData( eventId = eventId, senderId = event.root.senderId ?: "", @@ -110,11 +125,27 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses ?: VerificationState.REQUEST ReferencesInfoData(verificationState) }, - sentByMe = event.root.senderId == session.myUserId, - e2eDecoration = e2eDecoration + sentByMe = isSentByMe, + e2eDecoration = e2eDecoration, + sendStateDecoration = sendStateDecoration ) } + private fun getSendStateDecoration(eventSendState: SendState, + prevEventSendState: SendState?, + anyReadReceipts: Boolean, + isMedia: Boolean): SendStateDecoration { + return if (eventSendState.isSending()) { + if (isMedia) SendStateDecoration.SENDING_MEDIA else SendStateDecoration.SENDING_NON_MEDIA + } else if (eventSendState.hasFailed()) { + SendStateDecoration.FAILED + } else if (eventSendState.isSent() && !prevEventSendState?.isSent().orFalse() && !anyReadReceipts) { + SendStateDecoration.SENT + } else { + SendStateDecoration.NONE + } + } + private fun getE2EDecoration(event: TimelineEvent): E2EDecoration { val roomSummary = roomSummariesHolder.get(event.roomId) return if ( diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt index d4b1b8859a..ed61abcf6e 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/AbsMessageItem.kt @@ -19,19 +19,21 @@ package im.vector.app.features.home.room.detail.timeline.item import android.graphics.Typeface import android.view.View import android.widget.ImageView +import android.widget.ProgressBar import android.widget.TextView import androidx.annotation.IdRes import androidx.core.view.isInvisible import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import im.vector.app.R +import im.vector.app.core.ui.views.SendStateImageView import im.vector.app.core.utils.DebouncedClickListener import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.timeline.MessageColorProvider import im.vector.app.features.home.room.detail.timeline.TimelineEventController /** - * Base timeline item that adds an optional information bar with the sender avatar, name and time + * Base timeline item that adds an optional information bar with the sender avatar, name, time, send state * Adds associated click listeners (on avatar, displayname) */ abstract class AbsMessageItem : AbsBaseMessageItem() { @@ -82,6 +84,10 @@ abstract class AbsMessageItem : AbsBaseMessageItem holder.avatarImageView.setOnLongClickListener(null) holder.memberNameView.setOnLongClickListener(null) } + + // Render send state indicator + holder.sendStateImageView.render(attributes.informationData.sendStateDecoration) + holder.eventSendingIndicator.isVisible = attributes.informationData.sendStateDecoration == SendStateDecoration.SENDING_MEDIA } override fun unbind(holder: H) { @@ -99,6 +105,8 @@ abstract class AbsMessageItem : AbsBaseMessageItem val avatarImageView by bind(R.id.messageAvatarImageView) val memberNameView by bind(R.id.messageMemberNameView) val timeView by bind(R.id.messageTimeView) + val sendStateImageView by bind(R.id.messageSendStateImageView) + val eventSendingIndicator by bind(R.id.eventSendingIndicator) } /** diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageFileItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageFileItem.kt index 5160a7cd84..b215fa5dd5 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageFileItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageFileItem.kt @@ -28,7 +28,6 @@ import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R import im.vector.app.features.home.room.detail.timeline.helper.ContentDownloadStateTrackerBinder import im.vector.app.features.home.room.detail.timeline.helper.ContentUploadStateTrackerBinder -import org.matrix.android.sdk.api.session.room.send.SendState @EpoxyModelClass(layout = R.layout.item_timeline_event_base) abstract class MessageFileItem : AbsMessageItem() { @@ -87,13 +86,6 @@ abstract class MessageFileItem : AbsMessageItem() { holder.fileImageWrapper.setOnClickListener(attributes.itemClickListener) holder.fileImageWrapper.setOnLongClickListener(attributes.itemLongClickListener) holder.filenameView.paintFlags = (holder.filenameView.paintFlags or Paint.UNDERLINE_TEXT_FLAG) - - holder.eventSendingIndicator.isVisible = when (attributes.informationData.sendState) { - SendState.UNSENT, - SendState.ENCRYPTING, - SendState.SENDING -> true - else -> false - } } override fun unbind(holder: Holder) { @@ -111,7 +103,6 @@ abstract class MessageFileItem : AbsMessageItem() { val fileImageWrapper by bind(R.id.messageFileImageView) val fileDownloadProgress by bind(R.id.messageFileProgressbar) val filenameView by bind(R.id.messageFilenameView) - val eventSendingIndicator by bind(R.id.eventSendingIndicator) } companion object { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageImageVideoItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageImageVideoItem.kt index b121b14b4a..2c0d1fcfbd 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageImageVideoItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageImageVideoItem.kt @@ -19,7 +19,6 @@ package im.vector.app.features.home.room.detail.timeline.item import android.view.View import android.view.ViewGroup import android.widget.ImageView -import android.widget.ProgressBar import androidx.core.view.ViewCompat import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute @@ -29,7 +28,6 @@ import im.vector.app.core.files.LocalFilesHelper import im.vector.app.core.glide.GlideApp import im.vector.app.features.home.room.detail.timeline.helper.ContentUploadStateTrackerBinder import im.vector.app.features.media.ImageContentRenderer -import org.matrix.android.sdk.api.session.room.send.SendState @EpoxyModelClass(layout = R.layout.item_timeline_event_base) abstract class MessageImageVideoItem : AbsMessageItem() { @@ -69,16 +67,7 @@ abstract class MessageImageVideoItem : AbsMessageItem true - else -> false - } } override fun unbind(holder: Holder) { @@ -96,10 +85,7 @@ abstract class MessageImageVideoItem : AbsMessageItem(R.id.messageMediaUploadProgressLayout) val imageView by bind(R.id.messageThumbnailView) val playContentView by bind(R.id.messageMediaPlayView) - val mediaContentView by bind(R.id.messageContentMedia) - val failedToSendIndicator by bind(R.id.messageFailToSendIndicator) - val eventSendingIndicator by bind(R.id.eventSendingIndicator) } companion object { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageInformationData.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageInformationData.kt index 38575f0cc9..67b79bab9b 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageInformationData.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageInformationData.kt @@ -18,9 +18,9 @@ package im.vector.app.features.home.room.detail.timeline.item import android.os.Parcelable import kotlinx.parcelize.Parcelize +import org.matrix.android.sdk.api.crypto.VerificationState import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.util.MatrixItem -import org.matrix.android.sdk.internal.session.room.VerificationState @Parcelize data class MessageInformationData( @@ -42,7 +42,8 @@ data class MessageInformationData( val readReceipts: List = emptyList(), val referencesInfoData: ReferencesInfoData? = null, val sentByMe: Boolean, - val e2eDecoration: E2EDecoration = E2EDecoration.NONE + val e2eDecoration: E2EDecoration = E2EDecoration.NONE, + val sendStateDecoration: SendStateDecoration = SendStateDecoration.NONE ) : Parcelable { val matrixItem: MatrixItem @@ -84,4 +85,12 @@ enum class E2EDecoration { WARN_SENT_BY_UNKNOWN } +enum class SendStateDecoration { + NONE, + SENDING_NON_MEDIA, + SENDING_MEDIA, + SENT, + FAILED +} + fun ReadReceiptData.toMatrixItem() = MatrixItem.UserItem(userId, displayName, avatarUrl) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt index c7a279979b..9ec1d825df 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt @@ -35,8 +35,8 @@ import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.RoomDetailAction import im.vector.app.features.home.room.detail.timeline.MessageColorProvider import im.vector.app.features.home.room.detail.timeline.TimelineEventController +import org.matrix.android.sdk.api.crypto.VerificationState import org.matrix.android.sdk.api.session.crypto.verification.VerificationService -import org.matrix.android.sdk.internal.session.room.VerificationState @EpoxyModelClass(layout = R.layout.item_timeline_event_base_state) abstract class VerificationRequestItem : AbsBaseMessageItem() { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlRetriever.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlRetriever.kt index 54d5fd9eb3..df75c0094b 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlRetriever.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/url/PreviewUrlRetriever.kt @@ -16,17 +16,17 @@ package im.vector.app.features.home.room.detail.timeline.url -import android.os.Handler -import android.os.Looper import im.vector.app.BuildConfig import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.matrix.android.sdk.api.cache.CacheStrategy import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.getLatestEventId -class PreviewUrlRetriever(session: Session) { +class PreviewUrlRetriever(session: Session, + private val coroutineScope: CoroutineScope) { private val mediaService = session.mediaService() private data class EventIdPreviewUrlUiState( @@ -38,12 +38,11 @@ class PreviewUrlRetriever(session: Session) { // Keys are the main eventId private val data = mutableMapOf() private val listeners = mutableMapOf>() - private val uiHandler = Handler(Looper.getMainLooper()) // In memory list private val blockedUrl = mutableSetOf() - fun getPreviewUrl(event: TimelineEvent, coroutineScope: CoroutineScope) { + fun getPreviewUrl(event: TimelineEvent) { val eventId = event.root.eventId ?: return val latestEventId = event.getLatestEventId() @@ -115,7 +114,7 @@ class PreviewUrlRetriever(session: Session) { private fun updateState(eventId: String, latestEventId: String, state: PreviewUrlUiState) { data[eventId] = EventIdPreviewUrlUiState(latestEventId, state) // Notify the listener - uiHandler.post { + coroutineScope.launch(Dispatchers.Main) { listeners[eventId].orEmpty().forEach { it.onStateUpdated(state) } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginServerUrlFormFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginServerUrlFormFragment.kt index 5d3a6aab49..5b98111645 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginServerUrlFormFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginServerUrlFormFragment.kt @@ -86,7 +86,7 @@ class LoginServerUrlFormFragment @Inject constructor() : AbstractLoginFragment { views.loginServerUrlFormIcon.isVisible = false diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt b/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt index c1bb1dde36..a4f617bf5b 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt @@ -68,7 +68,7 @@ class NotifiableEventResolver @Inject constructor(private val stringProvider: St // If the event can be displayed, display it as is Timber.w("NotifiableEventResolver Received an unsupported event matching a bing rule") // TODO Better event text display - val bodyPreview = event.type + val bodyPreview = event.type ?: EventType.MISSING_TYPE return SimpleNotifiableEvent( session.myUserId, diff --git a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt index 6952d5f653..67ef0514f2 100644 --- a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt +++ b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt @@ -99,7 +99,7 @@ class PopupAlertManager @Inject constructor() { // we want to remove existing popup on previous activity and display it on new one if (currentAlerter != null) { weakCurrentActivity?.get()?.let { - Alerter.clearCurrent(it) + Alerter.clearCurrent(it, null) if (currentAlerter?.isLight == false) { setLightStatusBar() } diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt index 930e41e0d9..024d84f27b 100755 --- a/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReportActivity.kt @@ -21,12 +21,15 @@ import android.view.MenuItem import android.widget.Toast import androidx.core.view.isVisible import androidx.core.widget.doOnTextChanged +import com.airbnb.mvrx.viewModel +import com.airbnb.mvrx.withState import im.vector.app.R import im.vector.app.core.di.ScreenComponent import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.databinding.ActivityBugReportBinding import timber.log.Timber +import javax.inject.Inject /** * Form to send a bug report @@ -39,6 +42,10 @@ class BugReportActivity : VectorBaseActivity() { override fun getBinding() = ActivityBugReportBinding.inflate(layoutInflater) + @Inject lateinit var bugReportViewModelFactory: BugReportViewModel.Factory + + private val viewModel: BugReportViewModel by viewModel() + private var forSuggestion: Boolean = false override fun initUiAndData() { @@ -114,7 +121,7 @@ class BugReportActivity : VectorBaseActivity() { /** * Send the bug report */ - private fun sendBugReport() { + private fun sendBugReport() = withState(viewModel) { state -> views.bugReportScrollview.alpha = 0.3f views.bugReportMaskView.isVisible = true @@ -133,6 +140,7 @@ class BugReportActivity : VectorBaseActivity() { views.bugReportButtonIncludeKeyShareHistory.isChecked, views.bugReportButtonIncludeScreenshot.isChecked, views.bugReportEditText.text.toString(), + state.serverVersion, object : BugReporter.IMXBugReportListener { override fun onUploadFailed(reason: String?) { try { diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReportState.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReportState.kt new file mode 100644 index 0000000000..a5019115fb --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReportState.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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.rageshake + +import com.airbnb.mvrx.MvRxState + +data class BugReportState( + val serverVersion: String = "" +) : MvRxState diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReportViewModel.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReportViewModel.kt new file mode 100644 index 0000000000..c71a89553e --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReportViewModel.kt @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2021 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.rageshake + +import androidx.lifecycle.viewModelScope +import com.airbnb.mvrx.ActivityViewModelContext +import com.airbnb.mvrx.MvRxViewModelFactory +import com.airbnb.mvrx.ViewModelContext +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import im.vector.app.core.di.ActiveSessionHolder +import im.vector.app.core.platform.EmptyAction +import im.vector.app.core.platform.EmptyViewEvents +import im.vector.app.core.platform.VectorViewModel +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.extensions.tryOrNull + +class BugReportViewModel @AssistedInject constructor( + @Assisted initialState: BugReportState, + val activeSessionHolder: ActiveSessionHolder +) : VectorViewModel(initialState) { + + @AssistedFactory + interface Factory { + fun create(initialState: BugReportState): BugReportViewModel + } + + companion object : MvRxViewModelFactory { + + @JvmStatic + override fun create(viewModelContext: ViewModelContext, state: BugReportState): BugReportViewModel? { + val activity: BugReportActivity = (viewModelContext as ActivityViewModelContext).activity() + return activity.bugReportViewModelFactory.create(state) + } + } + + init { + fetchHomeserverVersion() + } + + private fun fetchHomeserverVersion() { + viewModelScope.launch { + val version = tryOrNull { + activeSessionHolder.getSafeActiveSession() + ?.federationService() + ?.getFederationVersion() + ?.let { "${it.name} - ${it.version}" } + } ?: "undefined" + + setState { + copy( + serverVersion = version + ) + } + } + } + + override fun handle(action: EmptyAction) { + // No op + } +} diff --git a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt index a43aca488d..15fd18039b 100755 --- a/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt +++ b/vector/src/main/java/im/vector/app/features/rageshake/BugReporter.kt @@ -165,6 +165,7 @@ class BugReporter @Inject constructor( withKeyRequestHistory: Boolean, withScreenshot: Boolean, theBugDescription: String, + serverVersion: String, listener: IMXBugReportListener?) { // enumerate files to delete val mBugReportFiles: MutableList = ArrayList() @@ -273,6 +274,7 @@ class BugReporter @Inject constructor( .addFormDataPart("app_language", VectorLocale.applicationLocale.toString()) .addFormDataPart("default_app_language", systemLocaleProvider.getSystemLocale().toString()) .addFormDataPart("theme", ThemeUtils.getApplicationTheme(context)) + .addFormDataPart("server_version", serverVersion) val buildNumber = context.getString(R.string.build_number) if (buildNumber.isNotEmpty() && buildNumber != "0") { diff --git a/vector/src/main/java/im/vector/app/features/room/VectorRoomDisplayNameFallbackProvider.kt b/vector/src/main/java/im/vector/app/features/room/VectorRoomDisplayNameFallbackProvider.kt new file mode 100644 index 0000000000..92408d59f4 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/room/VectorRoomDisplayNameFallbackProvider.kt @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021 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.room + +import android.content.Context +import im.vector.app.R +import org.matrix.android.sdk.api.RoomDisplayNameFallbackProvider + +class VectorRoomDisplayNameFallbackProvider( + private val context: Context +) : RoomDisplayNameFallbackProvider { + + override fun getNameForRoomInvite(): String { + return context.getString(R.string.room_displayname_room_invite) + } + + override fun getNameForEmptyRoom(): String { + return context.getString(R.string.room_displayname_empty_room) + } + + override fun getNameFor2members(name1: String?, name2: String?): String { + return context.getString(R.string.room_displayname_two_members, name1, name2) + } + + override fun getNameFor3members(name1: String?, name2: String?, name3: String?): String { + return context.getString(R.string.room_displayname_3_members, name1, name2, name3) + } + + override fun getNameFor4members(name1: String?, name2: String?, name3: String?, name4: String?): String { + return context.getString(R.string.room_displayname_4_members, name1, name2, name3, name4) + } + + override fun getNameFor4membersAndMore(name1: String?, name2: String?, name3: String?, remainingCount: Int): String { + return context.resources.getQuantityString( + R.plurals.room_displayname_four_and_more_members, + remainingCount, + name1, + name2, + name3, + remainingCount + ) + } +} diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsFragment.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsFragment.kt index d200129ed9..cee30e7def 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsFragment.kt @@ -23,7 +23,6 @@ import android.view.View import android.view.ViewGroup import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.withState -import com.google.android.material.snackbar.Snackbar import com.jakewharton.rxbinding3.appcompat.queryTextChanges import im.vector.app.R import im.vector.app.core.extensions.cleanup @@ -31,6 +30,7 @@ import im.vector.app.core.extensions.configureWith import im.vector.app.core.extensions.exhaustive import im.vector.app.core.extensions.trackItemsVisibilityChange import im.vector.app.core.platform.VectorBaseFragment +import im.vector.app.core.platform.showOptimizedSnackbar import im.vector.app.core.utils.toast import im.vector.app.databinding.FragmentPublicRoomsBinding import im.vector.app.features.permalink.NavigationInterceptor @@ -95,8 +95,7 @@ class PublicRoomsFragment @Inject constructor( private fun handleViewEvents(viewEvents: RoomDirectoryViewEvents) { when (viewEvents) { is RoomDirectoryViewEvents.Failure -> { - Snackbar.make(views.coordinatorLayout, errorFormatter.toHumanReadable(viewEvents.throwable), Snackbar.LENGTH_SHORT) - .show() + views.coordinatorLayout.showOptimizedSnackbar(errorFormatter.toHumanReadable(viewEvents.throwable)) } }.exhaustive } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsViewState.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsViewState.kt index b4cdb2f009..16e5428b9c 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsViewState.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/PublicRoomsViewState.kt @@ -29,7 +29,7 @@ data class PublicRoomsViewState( // Store cumul of pagination result val publicRooms: List = emptyList(), // Current pagination request - val asyncPublicRoomsRequest: Async> = Uninitialized, + val asyncPublicRoomsRequest: Async = Uninitialized, // True if more result are available server side val hasMore: Boolean = false, // Set of joined roomId, diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt index f5c545c34d..4ef38758c7 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt @@ -16,6 +16,7 @@ package im.vector.app.features.roomdirectory +import androidx.lifecycle.viewModelScope import com.airbnb.mvrx.ActivityViewModelContext import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Loading @@ -24,9 +25,12 @@ import com.airbnb.mvrx.Success import com.airbnb.mvrx.ViewModelContext import com.airbnb.mvrx.appendAt import dagger.assisted.Assisted -import dagger.assisted.AssistedInject import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.settings.VectorPreferences +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.failure.Failure @@ -34,18 +38,17 @@ import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsFilter import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams -import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse import org.matrix.android.sdk.api.session.room.model.thirdparty.RoomDirectoryData import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams -import org.matrix.android.sdk.api.util.Cancelable import org.matrix.android.sdk.rx.rx import timber.log.Timber +import java.util.Locale -private const val PUBLIC_ROOMS_LIMIT = 20 - -class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState: PublicRoomsViewState, - private val session: Session) - : VectorViewModel(initialState) { +class RoomDirectoryViewModel @AssistedInject constructor( + @Assisted initialState: PublicRoomsViewState, + vectorPreferences: VectorPreferences, + private val session: Session +) : VectorViewModel(initialState) { @AssistedFactory interface Factory { @@ -53,6 +56,12 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState: } companion object : MvRxViewModelFactory { + private const val PUBLIC_ROOMS_LIMIT = 20 + + // List of forbidden terms, in lower case + private val explicitContentTerms = listOf( + "nsfw" + ) @JvmStatic override fun create(viewModelContext: ViewModelContext, state: PublicRoomsViewState): RoomDirectoryViewModel? { @@ -61,9 +70,11 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState: } } + private val showAllRooms = vectorPreferences.showAllPublicRooms() + private var since: String? = null - private var currentTask: Cancelable? = null + private var currentJob: Job? = null init { // Observe joined room (from the sync) @@ -122,7 +133,7 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState: private fun filterWith(action: RoomDirectoryAction.FilterWith) = withState { state -> if (state.currentFilter != action.filter) { - currentTask?.cancel() + currentJob?.cancel() reset(action.filter) load(action.filter, state.roomDirectoryData) @@ -144,7 +155,7 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState: } private fun loadMore() = withState { state -> - if (currentTask == null) { + if (currentJob == null) { setState { copy( asyncPublicRoomsRequest = Loading() @@ -155,47 +166,60 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState: } private fun load(filter: String, roomDirectoryData: RoomDirectoryData) { - currentTask = session.getPublicRooms(roomDirectoryData.homeServer, - PublicRoomsParams( - limit = PUBLIC_ROOMS_LIMIT, - filter = PublicRoomsFilter(searchTerm = filter), - includeAllNetworks = roomDirectoryData.includeAllNetworks, - since = since, - thirdPartyInstanceId = roomDirectoryData.thirdPartyInstanceId - ), - object : MatrixCallback { - override fun onSuccess(data: PublicRoomsResponse) { - currentTask = null + currentJob = viewModelScope.launch { + val data = try { + session.getPublicRooms(roomDirectoryData.homeServer, + PublicRoomsParams( + limit = PUBLIC_ROOMS_LIMIT, + filter = PublicRoomsFilter(searchTerm = filter), + includeAllNetworks = roomDirectoryData.includeAllNetworks, + since = since, + thirdPartyInstanceId = roomDirectoryData.thirdPartyInstanceId + ) + ) + } catch (failure: Throwable) { + if (failure is Failure.Cancelled) { + // Ignore, another request should be already started + return@launch + } - since = data.nextBatch + currentJob = null - setState { - copy( - asyncPublicRoomsRequest = Success(data.chunk!!), - // It's ok to append at the end of the list, so I use publicRooms.size() - publicRooms = publicRooms.appendAt(data.chunk!!, publicRooms.size) - // Rageshake #8206 tells that we can have several times the same room - .distinctBy { it.roomId }, - hasMore = since != null - ) - } + setState { + copy( + asyncPublicRoomsRequest = Fail(failure) + ) + } + null + } + + data ?: return@launch + + currentJob = null + + since = data.nextBatch + + // Filter + val newPublicRooms = data.chunk.orEmpty() + .filter { + showAllRooms + || "${it.name.orEmpty()} ${it.topic.orEmpty()} ${it.canonicalAlias.orEmpty()}".toLowerCase(Locale.ROOT) + .let { str -> + explicitContentTerms.all { term -> term !in str } + } } - override fun onFailure(failure: Throwable) { - if (failure is Failure.Cancelled) { - // Ignore, another request should be already started - return - } - - currentTask = null - - setState { - copy( - asyncPublicRoomsRequest = Fail(failure) - ) - } - } - }) + setState { + copy( + asyncPublicRoomsRequest = Success(Unit), + // It's ok to append at the end of the list, so I use publicRooms.size() + publicRooms = publicRooms.appendAt(newPublicRooms, publicRooms.size) + // Rageshake #8206 tells that we can have several times the same room + .distinctBy { it.roomId }, + hasMore = since != null + ) + } + } } private fun joinRoom(action: RoomDirectoryAction.JoinRoom) = withState { state -> @@ -222,7 +246,7 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState: } override fun onCleared() { - currentTask?.cancel() + currentJob?.cancel() super.onCleared() } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt index 5ab86f7138..bb7d041199 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileController.kt @@ -57,6 +57,7 @@ class RoomProfileController @Inject constructor( fun onRoomAliasesClicked() fun onRoomPermissionsClicked() fun onRoomIdClicked() + fun onRoomDevToolsClicked() fun onUrlInTopicLongClicked(url: String) } @@ -193,7 +194,7 @@ class RoomProfileController @Inject constructor( title = stringProvider.getString(R.string.room_settings_permissions_title), subtitle = stringProvider.getString(R.string.room_settings_permissions_subtitle), dividerColor = dividerColor, - divider = true, + divider = false, editable = true, action = { callback?.onRoomPermissionsClicked() } ) @@ -204,10 +205,29 @@ class RoomProfileController @Inject constructor( title = stringProvider.getString(R.string.room_settings_room_internal_id), subtitle = roomSummary.roomId, dividerColor = dividerColor, - divider = false, + divider = true, editable = false, action = { callback?.onRoomIdClicked() } ) + data.roomCreateContent()?.roomVersion?.let { + buildProfileAction( + id = "roomVersion", + title = stringProvider.getString(R.string.room_settings_room_version_title), + subtitle = it, + dividerColor = dividerColor, + divider = true, + editable = false + ) + } + buildProfileAction( + id = "devTools", + title = stringProvider.getString(R.string.dev_tools_menu_name), + subtitle = roomSummary.roomId, + dividerColor = dividerColor, + divider = false, + editable = true, + action = { callback?.onRoomDevToolsClicked() } + ) } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt index 154483652b..16c703ea48 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileFragment.kt @@ -295,6 +295,10 @@ class RoomProfileFragment @Inject constructor( copyToClipboard(requireContext(), roomProfileArgs.roomId) } + override fun onRoomDevToolsClicked() { + navigator.openDevTools(requireContext(), roomProfileArgs.roomId) + } + override fun onUrlInTopicLongClicked(url: String) { copyToClipboard(requireContext(), url, true) } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt index 02a648287f..c8bb6b5b5c 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewModel.kt @@ -33,13 +33,17 @@ import im.vector.app.features.powerlevel.PowerLevelsObservableFactory import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.matrix.android.sdk.api.MatrixCallback +import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper import org.matrix.android.sdk.api.session.room.state.isPublic import org.matrix.android.sdk.rx.RxRoom +import org.matrix.android.sdk.rx.mapOptional import org.matrix.android.sdk.rx.rx import org.matrix.android.sdk.rx.unwrap @@ -69,10 +73,20 @@ class RoomProfileViewModel @AssistedInject constructor( init { val rxRoom = room.rx() observeRoomSummary(rxRoom) + observeRoomCreateContent(rxRoom) observeBannedRoomMembers(rxRoom) observePermissions() } + private fun observeRoomCreateContent(rxRoom: RxRoom) { + rxRoom.liveStateEvent(EventType.STATE_ROOM_CREATE, QueryStringValue.NoCondition) + .mapOptional { it.content.toModel() } + .unwrap() + .execute { + copy(roomCreateContent = it) + } + } + private fun observeRoomSummary(rxRoom: RxRoom) { rxRoom.liveRoomSummary() .unwrap() diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewState.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewState.kt index 398982ede1..bf7cd732ef 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewState.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileViewState.kt @@ -22,10 +22,12 @@ import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary +import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent data class RoomProfileViewState( val roomId: String, val roomSummary: Async = Uninitialized, + val roomCreateContent: Async = Uninitialized, val bannedMembership: Async> = Uninitialized, val actionPermissions: ActionPermissions = ActionPermissions(), val isLoading: Boolean = false diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoleFormatter.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoleFormatter.kt new file mode 100644 index 0000000000..699cdd29e2 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoleFormatter.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 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.roomprofile.permissions + +import im.vector.app.R +import im.vector.app.core.resources.StringProvider +import org.matrix.android.sdk.api.session.room.powerlevels.Role +import javax.inject.Inject + +class RoleFormatter @Inject constructor( + private val stringProvider: StringProvider +) { + fun format(role: Role): String { + return when (role) { + Role.Admin -> stringProvider.getString(R.string.power_level_admin) + Role.Moderator -> stringProvider.getString(R.string.power_level_moderator) + Role.Default -> stringProvider.getString(R.string.power_level_default) + is Role.Custom -> stringProvider.getString(R.string.power_level_custom, role.value) + } + } +} diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsController.kt index 92bdac7ae0..8f99132bc9 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/permissions/RoomPermissionsController.kt @@ -32,6 +32,7 @@ import javax.inject.Inject class RoomPermissionsController @Inject constructor( private val stringProvider: StringProvider, + private val roleFormatter: RoleFormatter, colorProvider: ColorProvider ) : TypedEpoxyController() { @@ -124,7 +125,7 @@ class RoomPermissionsController @Inject constructor( buildProfileAction( id = editablePermission.labelResId.toString(), title = stringProvider.getString(editablePermission.labelResId), - subtitle = getSubtitle(currentRole), + subtitle = roleFormatter.format(currentRole), dividerColor = dividerColor, divider = true, editable = editable, @@ -136,15 +137,6 @@ class RoomPermissionsController @Inject constructor( ) } - private fun getSubtitle(currentRole: Role): String { - return when (currentRole) { - Role.Admin, - Role.Moderator, - Role.Default -> stringProvider.getString(currentRole.res) - is Role.Custom -> stringProvider.getString(currentRole.res, currentRole.value) - } - } - private fun getCurrentRole(editablePermission: EditablePermission, content: PowerLevelsContent): Role { val value = when (editablePermission) { is EditablePermission.EventTypeEditablePermission -> content.events[editablePermission.eventType] ?: content.stateDefault diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index d3ef36a80b..a1151162c8 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -100,6 +100,9 @@ class VectorPreferences @Inject constructor(private val context: Context) { private const val SETTINGS_ENABLE_CHAT_EFFECTS = "SETTINGS_ENABLE_CHAT_EFFECTS" private const val SETTINGS_SHOW_EMOJI_KEYBOARD = "SETTINGS_SHOW_EMOJI_KEYBOARD" + // Room directory + private const val SETTINGS_ROOM_DIRECTORY_SHOW_ALL_PUBLIC_ROOMS = "SETTINGS_ROOM_DIRECTORY_SHOW_ALL_PUBLIC_ROOMS" + // Help private const val SETTINGS_SHOULD_SHOW_HELP_ON_ROOM_LIST_KEY = "SETTINGS_SHOULD_SHOW_HELP_ON_ROOM_LIST_KEY" @@ -399,6 +402,13 @@ class VectorPreferences @Inject constructor(private val context: Context) { return defaultPrefs.getBoolean(SETTINGS_ENABLE_SEND_VOICE_FEATURE_PREFERENCE_KEY, false) } + /** + * Show all rooms in room directory + */ + fun showAllPublicRooms(): Boolean { + return defaultPrefs.getBoolean(SETTINGS_ROOM_DIRECTORY_SHOW_ALL_PUBLIC_ROOMS, false) + } + /** * Tells which compression level to use by default * diff --git a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeServerSettingsViewState.kt b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeServerSettingsViewState.kt new file mode 100644 index 0000000000..abd823fa99 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeServerSettingsViewState.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 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.settings.homeserver + +import com.airbnb.mvrx.Async +import com.airbnb.mvrx.MvRxState +import com.airbnb.mvrx.Uninitialized +import org.matrix.android.sdk.api.federation.FederationVersion +import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities + +data class HomeServerSettingsViewState( + val baseUrl: String = "", + val homeServerCapabilities: HomeServerCapabilities = HomeServerCapabilities(), + val federationVersion: Async = Uninitialized +) : MvRxState diff --git a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsAction.kt b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsAction.kt new file mode 100644 index 0000000000..6ab097f4bf --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsAction.kt @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 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.settings.homeserver + +import im.vector.app.core.platform.VectorViewModelAction + +sealed class HomeserverSettingsAction : VectorViewModelAction { + object Refresh : HomeserverSettingsAction() +} diff --git a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsController.kt b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsController.kt new file mode 100644 index 0000000000..514311315d --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsController.kt @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2021 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.settings.homeserver + +import com.airbnb.epoxy.TypedEpoxyController +import com.airbnb.mvrx.Fail +import com.airbnb.mvrx.Loading +import com.airbnb.mvrx.Success +import com.airbnb.mvrx.Uninitialized +import im.vector.app.R +import im.vector.app.core.epoxy.errorWithRetryItem +import im.vector.app.core.epoxy.loadingItem +import im.vector.app.core.error.ErrorFormatter +import im.vector.app.core.resources.StringProvider +import im.vector.app.features.discovery.settingsCenteredImageItem +import im.vector.app.features.discovery.settingsInfoItem +import im.vector.app.features.discovery.settingsSectionTitleItem +import org.matrix.android.sdk.api.federation.FederationVersion +import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities +import javax.inject.Inject + +class HomeserverSettingsController @Inject constructor( + private val stringProvider: StringProvider, + private val errorFormatter: ErrorFormatter +) : TypedEpoxyController() { + + var callback: Callback? = null + + interface Callback { + fun retry() + } + + override fun buildModels(data: HomeServerSettingsViewState?) { + data ?: return + + buildHeader(data) + buildCapabilities(data) + when (val federationVersion = data.federationVersion) { + is Loading, + is Uninitialized -> + loadingItem { + id("loading") + } + is Fail -> + errorWithRetryItem { + id("error") + text(errorFormatter.toHumanReadable(federationVersion.error)) + listener { callback?.retry() } + } + is Success -> + buildFederationVersion(federationVersion()) + } + } + + private fun buildHeader(state: HomeServerSettingsViewState) { + settingsCenteredImageItem { + id("icon") + drawableRes(R.drawable.ic_layers) + } + settingsSectionTitleItem { + id("urlTitle") + titleResId(R.string.hs_url) + } + settingsInfoItem { + id("urlValue") + helperText(state.baseUrl) + } + } + + private fun buildFederationVersion(federationVersion: FederationVersion) { + settingsSectionTitleItem { + id("nameTitle") + titleResId(R.string.settings_server_name) + } + settingsInfoItem { + id("nameValue") + helperText(federationVersion.name) + } + settingsSectionTitleItem { + id("versionTitle") + titleResId(R.string.settings_server_version) + } + settingsInfoItem { + id("versionValue") + helperText(federationVersion.version) + } + } + + private fun buildCapabilities(data: HomeServerSettingsViewState) { + settingsSectionTitleItem { + id("uploadTitle") + titleResId(R.string.settings_server_upload_size_title) + } + + val limit = data.homeServerCapabilities.maxUploadFileSize + + settingsInfoItem { + id("uploadValue") + if (limit == HomeServerCapabilities.MAX_UPLOAD_FILE_SIZE_UNKNOWN) { + helperTextResId(R.string.settings_server_upload_size_unknown) + } else { + helperText(stringProvider.getString(R.string.settings_server_upload_size_content, "${limit / 1048576L} MB")) + } + } + } +} diff --git a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsFragment.kt new file mode 100644 index 0000000000..20541a1ebb --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsFragment.kt @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2021 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.settings.homeserver + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import com.airbnb.mvrx.fragmentViewModel +import com.airbnb.mvrx.withState +import im.vector.app.R +import im.vector.app.core.extensions.cleanup +import im.vector.app.core.extensions.configureWith +import im.vector.app.core.platform.VectorBaseFragment +import im.vector.app.databinding.FragmentGenericRecyclerBinding +import javax.inject.Inject + +/** + * Display some information about the homeserver + */ +class HomeserverSettingsFragment @Inject constructor( + val homeserverSettingsViewModelFactory: HomeserverSettingsViewModel.Factory, + private val homeserverSettingsController: HomeserverSettingsController +) : VectorBaseFragment(), + HomeserverSettingsController.Callback { + + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentGenericRecyclerBinding { + return FragmentGenericRecyclerBinding.inflate(inflater, container, false) + } + + private val viewModel: HomeserverSettingsViewModel by fragmentViewModel() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + homeserverSettingsController.callback = this + views.genericRecyclerView.configureWith(homeserverSettingsController) + } + + override fun onDestroyView() { + homeserverSettingsController.callback = null + views.genericRecyclerView.cleanup() + super.onDestroyView() + } + + override fun onResume() { + super.onResume() + (activity as? AppCompatActivity)?.supportActionBar?.setTitle(R.string.settings_home_server) + } + + override fun retry() { + viewModel.handle(HomeserverSettingsAction.Refresh) + } + + override fun invalidate() = withState(viewModel) { state -> + homeserverSettingsController.setData(state) + } +} diff --git a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsViewModel.kt new file mode 100644 index 0000000000..17f03a3456 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsViewModel.kt @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2021 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.settings.homeserver + +import androidx.lifecycle.viewModelScope +import com.airbnb.mvrx.Fail +import com.airbnb.mvrx.FragmentViewModelContext +import com.airbnb.mvrx.Loading +import com.airbnb.mvrx.MvRxViewModelFactory +import com.airbnb.mvrx.Success +import com.airbnb.mvrx.ViewModelContext +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import im.vector.app.core.platform.EmptyViewEvents +import im.vector.app.core.platform.VectorViewModel +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.session.Session + +class HomeserverSettingsViewModel @AssistedInject constructor( + @Assisted initialState: HomeServerSettingsViewState, + private val session: Session +) : VectorViewModel(initialState) { + + @AssistedFactory + interface Factory { + fun create(initialState: HomeServerSettingsViewState): HomeserverSettingsViewModel + } + + companion object : MvRxViewModelFactory { + + @JvmStatic + override fun create(viewModelContext: ViewModelContext, state: HomeServerSettingsViewState): HomeserverSettingsViewModel? { + val fragment: HomeserverSettingsFragment = (viewModelContext as FragmentViewModelContext).fragment() + return fragment.homeserverSettingsViewModelFactory.create(state) + } + } + + init { + setState { + copy( + baseUrl = session.sessionParams.homeServerUrl, + homeServerCapabilities = session.getHomeServerCapabilities() + ) + } + fetchHomeserverVersion() + refreshHomeServerCapabilities() + } + + private fun refreshHomeServerCapabilities() { + viewModelScope.launch { + runCatching { + session.refreshHomeServerCapabilities() + } + + setState { + copy( + homeServerCapabilities = session.getHomeServerCapabilities() + ) + } + } + } + + private fun fetchHomeserverVersion() { + setState { + copy( + federationVersion = Loading() + ) + } + + viewModelScope.launch { + try { + val federationVersion = session.federationService().getFederationVersion() + setState { + copy( + federationVersion = Success(federationVersion) + ) + } + } catch (failure: Throwable) { + setState { + copy( + federationVersion = Fail(failure) + ) + } + } + } + } + + override fun handle(action: HomeserverSettingsAction) { + when (action) { + HomeserverSettingsAction.Refresh -> fetchHomeserverVersion() + } + } +} diff --git a/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt b/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt index 0856ac4b35..3bf58ab709 100644 --- a/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt +++ b/vector/src/main/java/im/vector/app/features/themes/ThemeUtils.kt @@ -59,6 +59,14 @@ object ThemeUtils { setApplicationTheme(context, theme) } + /** + * @return true if current theme is System + */ + fun isSystemTheme(context: Context): Boolean { + val theme = getApplicationTheme(context) + return theme == SYSTEM_THEME_VALUE + } + /** * @return true if current theme is Light or current theme is System and system theme is light */ diff --git a/vector/src/main/res/drawable/ic_delete_unsent_messages.xml b/vector/src/main/res/drawable/ic_delete_unsent_messages.xml new file mode 100644 index 0000000000..24fdbc94c2 --- /dev/null +++ b/vector/src/main/res/drawable/ic_delete_unsent_messages.xml @@ -0,0 +1,9 @@ + + + diff --git a/vector/src/main/res/drawable/ic_layers.xml b/vector/src/main/res/drawable/ic_layers.xml new file mode 100644 index 0000000000..658630add0 --- /dev/null +++ b/vector/src/main/res/drawable/ic_layers.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/vector/src/main/res/drawable/ic_message_sent.xml b/vector/src/main/res/drawable/ic_message_sent.xml new file mode 100644 index 0000000000..3729f3d60f --- /dev/null +++ b/vector/src/main/res/drawable/ic_message_sent.xml @@ -0,0 +1,13 @@ + + + + diff --git a/vector/src/main/res/drawable/ic_retry_sending_messages.xml b/vector/src/main/res/drawable/ic_retry_sending_messages.xml new file mode 100644 index 0000000000..6ea08bb654 --- /dev/null +++ b/vector/src/main/res/drawable/ic_retry_sending_messages.xml @@ -0,0 +1,10 @@ + + + diff --git a/vector/src/main/res/drawable/ic_sending_message.xml b/vector/src/main/res/drawable/ic_sending_message.xml new file mode 100644 index 0000000000..05fa0fb2a2 --- /dev/null +++ b/vector/src/main/res/drawable/ic_sending_message.xml @@ -0,0 +1,10 @@ + + + diff --git a/vector/src/main/res/drawable/ic_sending_message_failed.xml b/vector/src/main/res/drawable/ic_sending_message_failed.xml new file mode 100644 index 0000000000..c720a1cbbf --- /dev/null +++ b/vector/src/main/res/drawable/ic_sending_message_failed.xml @@ -0,0 +1,10 @@ + + + diff --git a/vector/src/main/res/drawable/ic_sliders.xml b/vector/src/main/res/drawable/ic_sliders.xml deleted file mode 100644 index 55ccfcfb3d..0000000000 --- a/vector/src/main/res/drawable/ic_sliders.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/vector/src/main/res/drawable/pill_background_bing.xml b/vector/src/main/res/drawable/pill_background_bing.xml deleted file mode 100644 index 70a2bda8a4..0000000000 --- a/vector/src/main/res/drawable/pill_background_bing.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/vector/src/main/res/drawable/rounded_rect_shape.xml b/vector/src/main/res/drawable/rounded_rect_shape.xml deleted file mode 100644 index e9c0a27f59..0000000000 --- a/vector/src/main/res/drawable/rounded_rect_shape.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/vector/src/main/res/drawable/rounded_rect_shape_off.xml b/vector/src/main/res/drawable/rounded_rect_shape_off.xml deleted file mode 100644 index 8dac3020e3..0000000000 --- a/vector/src/main/res/drawable/rounded_rect_shape_off.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/vector/src/main/res/drawable/sticker_description_background.xml b/vector/src/main/res/drawable/sticker_description_background.xml deleted file mode 100644 index faa6f5b6f4..0000000000 --- a/vector/src/main/res/drawable/sticker_description_background.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/vector/src/main/res/drawable/sticker_description_triangle.xml b/vector/src/main/res/drawable/sticker_description_triangle.xml deleted file mode 100644 index 199c2e7313..0000000000 --- a/vector/src/main/res/drawable/sticker_description_triangle.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/vector/src/main/res/layout/activity_bug_report.xml b/vector/src/main/res/layout/activity_bug_report.xml index 2347d84ee3..78a0139e1d 100644 --- a/vector/src/main/res/layout/activity_bug_report.xml +++ b/vector/src/main/res/layout/activity_bug_report.xml @@ -75,7 +75,6 @@ android:layout_marginTop="10dp" android:layout_marginEnd="10dp" android:hint="@string/send_bug_report_placeholder" - android:textColorHint="?attr/vctr_default_text_hint_color" app:counterEnabled="true" app:counterMaxLength="500"> diff --git a/vector/src/main/res/layout/activity_main.xml b/vector/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000000..2ca8afcccf --- /dev/null +++ b/vector/src/main/res/layout/activity_main.xml @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/vector/src/main/res/layout/dialog_disclaimer_content.xml b/vector/src/main/res/layout/dialog_disclaimer_content.xml index e1442f39f4..ca808605d1 100644 --- a/vector/src/main/res/layout/dialog_disclaimer_content.xml +++ b/vector/src/main/res/layout/dialog_disclaimer_content.xml @@ -43,7 +43,7 @@ android:id="@+id/disclaimerTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/element_disclaimer_title" + android:text="@string/disclaimer_title" android:textColor="?riotx_text_primary" android:textSize="20sp" android:textStyle="bold" @@ -59,7 +59,7 @@ android:layout_marginEnd="24dp" android:gravity="center" android:paddingBottom="32dp" - android:text="@string/element_disclaimer_content" + android:text="@string/disclaimer_content" android:textColor="?riotx_text_secondary" android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" diff --git a/vector/src/main/res/layout/dialog_export_e2e_keys.xml b/vector/src/main/res/layout/dialog_export_e2e_keys.xml index 9561c59301..10c9dcd59b 100644 --- a/vector/src/main/res/layout/dialog_export_e2e_keys.xml +++ b/vector/src/main/res/layout/dialog_export_e2e_keys.xml @@ -39,7 +39,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:textColorHint="?attr/vctr_default_text_hint_color" app:layout_constraintEnd_toStartOf="@+id/exportDialogShowPassword" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/exportDialogText"> @@ -61,7 +60,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="10dp" - android:textColorHint="?attr/vctr_default_text_hint_color" app:errorEnabled="true" app:layout_constraintEnd_toEndOf="@+id/exportDialogTil" app:layout_constraintStart_toStartOf="parent" diff --git a/vector/src/main/res/layout/dialog_import_e2e_keys.xml b/vector/src/main/res/layout/dialog_import_e2e_keys.xml index 68621f8230..177dbd1f66 100644 --- a/vector/src/main/res/layout/dialog_import_e2e_keys.xml +++ b/vector/src/main/res/layout/dialog_import_e2e_keys.xml @@ -29,7 +29,6 @@ style="@style/VectorTextInputLayout" android:layout_width="0dp" android:layout_height="wrap_content" - android:textColorHint="?attr/vctr_default_text_hint_color" app:layout_constraintEnd_toStartOf="@+id/importDialogShowPassword" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/dialog_e2e_keys_passphrase_filename"> diff --git a/vector/src/main/res/layout/fragment_home_drawer.xml b/vector/src/main/res/layout/fragment_home_drawer.xml index 642119e5f8..0a4206b8c0 100644 --- a/vector/src/main/res/layout/fragment_home_drawer.xml +++ b/vector/src/main/res/layout/fragment_home_drawer.xml @@ -12,7 +12,7 @@ android:id="@+id/homeDrawerHeader" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?riotx_base" + android:background="?vctr_home_drawer_header_background" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> diff --git a/vector/src/main/res/layout/fragment_loading.xml b/vector/src/main/res/layout/fragment_loading.xml index 7a6a791edf..27ae764a73 100644 --- a/vector/src/main/res/layout/fragment_loading.xml +++ b/vector/src/main/res/layout/fragment_loading.xml @@ -4,7 +4,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + app:constraint_referenced_ids="composerLayout,notificationAreaView,failedMessagesWarningView" /> + + + app:constraint_referenced_ids="composerLayout,notificationAreaView, failedMessagesWarningView" /> + + - - diff --git a/vector/src/main/res/layout/item_room_widget.xml b/vector/src/main/res/layout/item_room_widget.xml index d86fa2d1cf..22842264e7 100644 --- a/vector/src/main/res/layout/item_room_widget.xml +++ b/vector/src/main/res/layout/item_room_widget.xml @@ -8,19 +8,20 @@ android:gravity="center_vertical" android:minHeight="64dp" android:orientation="horizontal" - android:paddingStart="8dp" - android:paddingEnd="8dp"> + android:paddingStart="@dimen/layout_horizontal_margin" + android:paddingEnd="@dimen/layout_horizontal_margin"> + tools:src="@tools:sample/avatars" + tools:visibility="visible" /> - + + + \ No newline at end of file diff --git a/vector/src/main/res/layout/item_settings_centered_image.xml b/vector/src/main/res/layout/item_settings_centered_image.xml new file mode 100644 index 0000000000..ee249448e7 --- /dev/null +++ b/vector/src/main/res/layout/item_settings_centered_image.xml @@ -0,0 +1,11 @@ + + diff --git a/vector/src/main/res/layout/item_timeline_event_base.xml b/vector/src/main/res/layout/item_timeline_event_base.xml index cba12f7515..ce3460a21c 100644 --- a/vector/src/main/res/layout/item_timeline_event_base.xml +++ b/vector/src/main/res/layout/item_timeline_event_base.xml @@ -80,6 +80,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/messageMemberNameView" + android:layout_toStartOf="@id/messageSendStateImageView" android:layout_toEndOf="@id/messageStartGuideline" android:addStatesFromChildren="true"> @@ -133,6 +134,33 @@ + + + + - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/layout/view_read_receipts.xml b/vector/src/main/res/layout/view_read_receipts.xml index 3e4c49fe00..ac4351b379 100644 --- a/vector/src/main/res/layout/view_read_receipts.xml +++ b/vector/src/main/res/layout/view_read_receipts.xml @@ -9,7 +9,7 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + + + - - - - + - + أرسلَ %1$s صُّورة. + دعوة مِن %s + %1$s دَعى %2$s + دعاكَ %1$s + إنضّم %1$s إلى الغُرفة + غادر %1$s الغرفة + رفضَ %1$s الدعوة + %1$s طردَ %2$s + إنَّ %1$s قد رفعَ الحظر عن %2$s + إنَّ %1$s قد حظرَ %2$s + إنَّ %1$s قد غيَّرَ صورته الشخصية + إنَّ %1$s قد عيَّنَ اسمه الظاهر إلى %2$s + إنَّ %1$s قد غيَّرَ اسمه الظاهر من %2$s إلى %3$s + إنَّ %1$s قد أزالَ اسمه الظاهر (لقد كان %2$s) + إنَّ %1$s قد غيَّرَ الموضوع إلى: %2$s + إنَّ %1$s قد غيَّرَ اسم الغُرفة إلى: %2$s + إنَّ %s قد أجابَ على المُكالمة. + إنَّ %s قد أنهى المُكالمة. + إنَّ %1$s قد جعلَ التأريخ المُستقبلي للغُرفة مرئيًا لـ %2$s + جميع أعضاء الغُرفة، مِنَ اللَّحظة التي تمَّت دعوتهم. + جميع أعضاء الغُرفة، مِن لحظة انضمامهم. + جميع أعضاء الغُرفة. + أيُّ شخص. + غير معروف (%s). + إنَّ %1$s قد فعَّلَ تعمية النهاية-إلى-النهاية (%2$s) + إنَّ %1$s قد طلبَ اجتماع VoIP + إنَّ اجتماع VoIP قد بدأ + إنَّ اجتماع VoIP قد انتهى + إنَّ %1$s قد أزالَ اسم الغُرفة + إنَّ %1$s قد أزالَ موضوع الغُرفة + إنَّ %1$s قد حدَّثَ ملفه الشخصي %2$s + إنَّ %1$s قد أرسلَ دعوة إلى %2$s للإنضمام إلى الغُرفة + ** يتعذَّر فك تعمية: ⁨%s⁩ ** + إنَّ جِهاز المُرسل لم يُرسل لنا المفاتيح لهذه الرِّسالة. + يتعذَّ إرسال الرِّسالة + فَشلَ رفع الصُّورة + خطأ في الشَّبكة + خطأ في Matrix + حاليًا مِن غير المُمكِن إعادة الاِنضمام إلى غُرفة فارِغة. + عُنوان البريد الإلكتروني + رقم الهاتف + ‏‏⁨%1$s⁩: ‏⁨%2$s⁩ + إنَّ %1$s قد سحبَ دعوة %2$s + إنَّ %s قد أجرى مُكالمة مرئية. + إنَّ %s قد أجرى مُكالمة صوتية. + إنَّ %1$s قد قَبَل دعوة %2$s + يتعذَّر التنقيح + أرسلَ %1$s مُلصقًا. + (تمَّ تغيِّير الصُّورة أيضًا) + دَعوة مِن ⁨%s⁩ + غُرفة فارِغة + %1$s وَ %2$s + دَعوة غُرفة + + + %1$s وواحد آخر + %1$s و%2$d آخران + %1$s و%2$d آخرين + %1$s و%2$d آخرون + %1$s و%2$d آخرون + + أرسلتَ صُّورة. + أرسلتَ مُلصقًا. + دعوة مِنكَ + أنشأ %1$s الغُرفة + أنتَ أنشأتَ الغُرفة + أنتَ دعوتَ %1$s + أنتَ انضممت إلى الغُرفة + أنتَ غادرتَ الغُرفة + رفضتَ الدعوة + طردتَ %1$s + أنتَ قد رفعتَ الحظر عن %1$s + أنتَ قد حظرتَ %1$s + أنتَ قد سحبتَ دعوة %1$s + أنتَ قد غيّرتَ صورتك الشخصية + أنتَ قد عيَّنتَ اسمك الظاهر إلى %1$s + أنتَ قد غيّرتَ اسمك الظاهر من ⁨%1$s⁩ إلى ⁨%2$s⁩ + أنتَ قد أزلتَ اسمك الظاهر (لقد كان ⁨%1$s⁩) + أنتَ قد غيَّرتَ الموضوع إلى: ⁨%1$s⁩ + إنَّ %1$s قد غيَّرَ صورة الغُرفة + أنتَ قد غيَّرتَ صورة الغُرفة + أنتَ قد غيَّرتَ اسم الغُرفة إلى: %1$s + أنتَ قد أجريتَ مُكالمة مرئية. + أنتَ قد أجريتَ مُكالمة صوتية. + إنَّ %s قد أرسلَ بيانات لإعداد مُكالمة. + أنتَ قد أرسلتَ بيانات لإعداد مُكالمة. + أنتَ قد أجبتَ على المُكالمة. + أنتَ قد أنهيتَ المُكالمة. + أنتَ قد جعلتَ التأريخ المُستقبلي للغُرفة مرئيًا لـ %1$s + أنتَ قد فعَّلتَ تعيمية النهاية-إلى-النهاية (%1$s) + إنَّ %s قد قامَ بترقية هذه الغرفة. + أنتَ قد رقَّيتَ هذه الغرفة. + أنتَ قد طلبتَ اجتماع VoIP + أنتَ قد أزلتَ اسم الغُرفة + أنتَ قد أزلتَ موضوع الغُرفة + إنَّ %1$s قد أزالَ صورة الغُرفة + أنتَ قد أزلتَ صورة الغُرفة + تمَّت إزالة الرسالة + الرسالة قد أُزيلت بواسطة %1$s + أُزيلت الرسالة [السبب: ⁨%1$s⁩] + الرِّسالة أُزيلت بِواسطة %1$s [السبب: ⁨%2$s⁩] + أنتَ قد أرسلتَ دعوة إلى %1$s للإنضمام إلى الغُرفة + إنَّ %1$s قد سحب دعوة %2$s للإنضمام إلى الغُرفة + أنتَ قد سحبت دعوة %1$s للإنضمام إلى الغُرفة + أنتَ قد قبلتَ دعوة %1$s + إنَّ %1$s قد أضافَ القطعة %2$s + أنتَّ قد أضفتَ القطعة %1$s + إنَّ %1$s قد أزال القطعة %2$s + أنتَ قد أزلتَ القطعة %1$s + إنَّ %1$s قد عدَّلَ القطعة %2$s + أنتَ قد عدَّلتَ القطعة %1$s + مسؤول + الاِفتراضي + مُخصَّص (⁨%1$d⁩) + مخصَّص + أنتَ قد غيَّرتَ مُستوى قوة %1$s. + إنَّ %1$s قد غيَّرَ مُستوى قوة %2$s. + %1$s مِن %2$s إلى %3$s + المُزامنة الأولية: +\nيجري إستيرد الحِساب… + 🎉 جميع الخوادِم محظورة مِنَ المُشاركة! لم يعُد من المُمكِن استخدام هذه الغُرفة. + لا تغيير. + • خوادِم مُطابقة IP الحرفية محظورة الآن. + • الخادِم المُطابق لـ %s قد أُزيل مِن قائمة السماح. + • الخادِم المُطابق لـ %s مسموح الآن. + • الخادِم المُطابق لـ %s قد أُزيل مِن قائمة الحظر. + • الخادِم المُطابق لـ %s محظور الآن. + • خوادِم مُطابقة IP الحرفية مسموحة الآن. + أنتَ قد غيَّرتَ خادِم الـACLs لهذه الغُرفة. + إنَّ %s قد غيَّرَ خادِم الـACLs لهذه الغُرفة. + • الخادِم يحظُر مُطابقة القيم الحرفية للـIP. + • الخادِم المُطابق لـ %s مسموح. + • الخادِم المُطابق لـ %s محظور. + • الخادِم يسمح بمُطابقة القيم الحرفية للـIP. + أنتَ قد عيَّنتَ خادِم الـACLs لهذه الغُرفة. + إنَّ %s قد عيَّنَ خادِم الـACLs لهذه الغُرفة. + أنتَ قد قمتَ بالترقية هُنا. + إنَّ %s قد قامَ بالترقية هُنا. + أنتَ قد جعلتَ الرسائل المُستقبلية مرئية لـ %1$s + إنَّ %1$s قد جعلَ الرسائل المُستقبلية مرئية لـ %2$s + غادرت الغرفة + غادر ⁨%1$s⁩ الغرفة + أنت انضممت + انضم %1$s + أنتَ أنشأتَ المُناقشة + أنشأ %1$s المُناقشة + أنتَ قد سحبتَ دعوة %1$s. السبب: %2$s + إنَّ %1$s قد سحبَ دعوة %2$s. السبب: %3$s + أنتَ قد ألغيتَ دعوة %1$s للإنضمام إلى الغُرفة. السبب: %2$s + إنَّ %1$s قد ألغيت دعوة %2$s للإنضمام إلى الغُرفة. السبب: %3$s + أنتَ قد قبلتَ دعوة %1$s. السبب: %2$s + إنَّ %1$s قد قبلَ دعوة %2$s. السبب: %3$s + أنتَ قد أرسلتَ دعوة إلى %1$s للإنضمام إلى الغُرفة. السبب: %2$s + إنَّ %1$s قد أرسل دعوة إلى %2$s للإنضمام إلى الغُرغة. السبب: %3$s + أنتَ قد حظرتَ %1$s. السبب: %2$s + إنَّ %1$s قد حَظر %2$s. السبب: %3$s + أنتَ قد رفعتَ الحظر عن %1$s. السبب: %2$s + إنَّ %1$s قد رفع الحظر عن %2$s. السبب: %3$s + أنتَ قد طردتَ %1$s. السبب: %2$s + إنَّ %1$s قد طرد %2$s. السبب: %3$s + أنتَ قد رفضتَ الدعوة. السبب: %1$s + إنَّ %1$s قد رفض الدعوة. السبب: %2$s + أنتَ قد غادرت. السبب: %1$s + إنَّ %1$s قد غادر. السبب: %2$s + أنتَ قد غادرتَ الغُرفة. السبب: %1$s + إنَّ %1$s قد غادر الغُرفة. السبب: %2$s + أنتَ قد إنضممت. السبب: %1$s + إنَّ %1$s قد إنضم. السبب: %2$s + أنتَ قد إنضممتَ إلى الغُرفة. السبب: %1$s + إنَّ %1$s قد إنضم إلى الغُرفة. السبب: %2$s + إنَّ %1$s قد دعاكَ أنت. السبب: %2$s + أنتَ قد دعوتَ %1$s. السبب: %2$s + إنَّ %1$s قد دعا %2$s. السبب: %3$s + دعوتُكَ أنت. السبب: %1$s + دعوة %1$s. السبب: %2$s + محو قائمة انتظار الإرسال + يجري إرسال الرِّسالة… + المُزامنة الأولية: +\nيجري إستيرد مَعلومات الحِساب + المُزامنة الأولية: +\nيجري إستيرد المُجتمعات + المُزامنة الأولية: +\nيجري إستيرد الغُرف المُغادَر مِنها + المُزامنة الأولية: +\nيجري إستيرد الغُرف المَدعو إليها + المُزامنة الأولية: +\nيجري إستيرد الغُرف المُنضم فيها + المُزامنة الأولية: +\nيجري إستيرد الغُرف + المُزامنة الأولية: +\nيجري إستيرد التَعمية + غُرفة فارِغة (كانت %s) + + %1$s، %2$s و%3$s + %1$s، %2$s، %3$s و%4$d آخر + %1$s، %2$s، %3$s و%4$d آخران + %1$s، %2$s، %3$s و%4$d آخرين + %1$s، %2$s، %3$s و%4$d آخرون + %1$s،%2$s،%3$s و%4$d آخرون + + الأعضاء %1$s، %2$s، %3$s و %4$s + الأعضاء %1$s، %2$s و %3$s + مُشرِف + أنتَ قد عدَّلتَ اجتماع الفيديو + لقد عُدِّلَ اجتماع الفيديو بواسطة %1$s + أنتَ قد أنهيتَ اجتماع الفيديو + لقد أُنهيَ اجتماع الفيديو بواسطة %1$s + أنتَ قد بدأتَ اجتماع الفيديو + لقد بدأ اجتماع الفيديو بواسطة %1$s + أنتَ قد سحبتَ دعوة %1$s + إنَّ %1$s قد سحب دعوة %2$s + أنتَ قد دعوتَ %1$s + إنَّ %1$s قد دعى %2$s + أنتَ قد حدَّثتَ ملفك الشخصي %1$s السمة الفاتحة السمة الداكنة - السمة السوداء - + السمة السوداء يُزامن يستمع للأحداث الرسائل @@ -12,7 +224,6 @@ تفاصيل الأعضاء الأرشيف أبلِغ عن علة - حسنا ألغِ احفظ @@ -47,22 +258,18 @@ أغلِق نُسخ إلى الحافظة عطّل - أكّد تحذير - الرئيسيّة المفضلة الغرف - الدعوات المحادثات دفتر العناوين المحلي متراسلو «ماترِكس» فقط لا محادثات - لم تسمح لِ‍ Element بمطالعة متراسليك المحليين + لم تسمح لِ‍ Element بمطالعة متراسليك المحليين لا نتائج - الغرف دليل الغرف لا غرف @@ -75,7 +282,6 @@ %d مستخدما %d مستخدم - أرسِل السجلات أرسِل سجلات الانهيار أرسِل لقطة شاشة @@ -83,7 +289,6 @@ صِف المشكلة هنا لنقدر على تحليل المشاكل، ستُرسل السجلات من هذا العميل مع بلاغ العلة هذا. سوف لن يُنشر بلاغ العلة (وذلك يشمل السجلات ولقطات الشاشة) لعموم الناس. إن أردت إرسال النص أعلاه فقط، رجاءً أزل تأشير: انهار التطبيق في آخر مرة. أتريد إرسال بلاغ انهيار؟ - أُرسل بلاغ العلة بنجاح فشل إرسال بلاغ العلة (%s) اسم المستخدم @@ -93,12 +298,10 @@ ابدأ دردشة جديدة ابدأ مكالمة صوتية ابدأ مكالمة صورية - أرسِل ملفات خُذ صورة أو ڤديو خُذ صورة خُذ ڤديو - لِج سجّل أرسِل @@ -136,70 +339,53 @@ لقد صُفّرت كلمة السر. لقد خرجت من كل الأجهزة ولم تعد تستقبل الإخطارات بعد الآن. لإعادة تفعيل الإخطارات عليك الولوج في كل جهاز ثانيةً. - تعذّر الولوج: خطأ في الشبكة تعذّر الولوج تعذّر التسجيل: خطأ في الشبكة تعذّر التسجيل تعذّر التسجيل: فشل في ملكية البريد أدخِل مسارا صالحا - اسم المستخدم/كلمة السر غير صالحة لم يحتوي JSON صالح أُرسلت الكثير من الطلبات اسم المستخدم هذا مستخدم بالفعل لم يُنقر بعد على الرابط في البريد - أأُلغي التنزيل؟ أأُلغي الرفع؟ %d ثا %1$dدق %2$dثا - الأمس اليوم - اسم الغرفة موضوع الغرفة - انتهت المكالمة مكالمة واردة مكالمة صورية واردة مكالمة صوتية واردة المكالمة جارية - تعذّر تمهيد الكمرة - خُذ صورة أو ڤديو تعذّر تسجيل الڤديو - معلومات نأسف، لم يُنفّذ الإجراء بسبب عدم وجود بعض التصاريح - أأحفظ في التنزيلات؟ نعم لا تابع - أزِل انضم ارفض - انتقل إلى أول رسالة غير مقروءة. - لقد دعاك ⁨%s⁩ للانضمام إلى هذه الغرفة هذه معاينة عن الغرفة. عُطّل التفاعل مع الغرفة. - دردشة جديدة أضِف عضوا - ترك الغرفة أمتأكّد من ترك الغرفة؟ أمتأكّد من إزالة ⁨%s⁩ من هذه الدردشة؟ أنشئ - أدوات الإدارة الأجهزة - اترك هذه الغرفة أزِل من هذه الغرفة امنع @@ -211,10 +397,8 @@ اعرض كل رسائل هذا المستخدم اعرض قائمة الأجهزة أمتأكد من دعوة ⁨%s⁩ لهذه الدردشة؟ - المتراسلون المحليون (%d) مستخدمو «ماترِكس» فقط - ‏⁨%1$s⁩ يكتب… أرسِل رسالة معمّاة… أرسِل رسالة (غير معمّاة)… @@ -229,24 +413,20 @@ اخرج البصمة (⁨%s⁩): تعذّر التحقق من معرّف الخادوم البعيد. - تفاصيل الغرفة الملفات إعدادات المدعوّون المنضمون - أتريد إخفاء كل رسائل هذا العضو؟ سيُعيد هذا الإجراء تشغيل التطبيق وقد يأخذ بعض الوقت. ألغِ الرفع ألغِ التنزيل - لا نتائج الغرف الرسائل الملفات - الدليل المفضلة الغرف @@ -255,18 +435,14 @@ انضم إلى غرفة انضم إلى غرفة اكتب معرّف غرفة أو اختصارها - يبحث في الدليل.. - اترك المحادثة انسَ - الرسائل إعدادات الإصدارة حقوق النسخ سياسة الخصوصية - صورة اللاحة اسم العرض البريد الإلكتروني @@ -274,10 +450,8 @@ الهاتف أضِف رقم هاتف معلومات التطبيق - صوت الإخطارات شغّل الشاشة لمدة ٣ ثواني - الرسائل التي فيها اسم العرض الرسائل التي فيها اسم المستخدم الرسائل في محادثات الطرفين @@ -298,9 +472,7 @@ الأجهزة اعرض أختام الرسائل الزمنية دائما اعرض الأختام الزمنية بنسق ١٢ ساعة (مثلا ٢:٣٠م) - وضع حفظ البيانات - تفاصيل الجهاز المعرّف الاسم @@ -308,11 +480,9 @@ آخر ظهور كلمة السر: أرسِل - واجهة المستخدم لغة الواجهة اختر لغة - غيّر كلمة السر كلمة السر القديمة كلمة السر الجديدة @@ -322,34 +492,27 @@ أأعرض كل رسائل ⁨%s⁩؟ سيُعيد هذا الإجراء تشغيل التطبيق وقد يأخذ بعض الوقت. - اختر دولة - الدولة رجاءً اختر دولة رقم الهاتف أدخِل رمز التأكيد خطأ في التحقق من رقم الهاتف الرمز - ٣ أيام أسبوع واحد شهر واحد للأبد - صورة الغرفة اسم الغرفة الموضوع - إمكانيّة قراءة تأريخ الغرفة من يمكنه قراءة التأريخ؟ الكل الأعضاء فقط (من لحظة اختيار هذا الخيار) الأعضاء فقط (من لحظة دعوتهم) الأعضاء فقط (من لحظة انضمامهم) - المستخدمون الممنوعون - متقدم مختبرات تعمية الطرفية @@ -362,35 +525,28 @@ لست في هذه الغرفة. ليس لديك تصريح لفعل هذا في هذه الغرفة. استخدم الكمرة الأصيلة - تحذير! - لم تُرسل الرسائل بسبب وجود أجهزة مجهولة. ماذا أفعل؟ %1$s. ‏%2$s. ليس ’⁨%s⁩‘ تنسيقا صالحا لاختصار لن يُحدّد عنوان رئيسي. سيُنتقى العنوان الرئيسي المبدئي لهذه الغرفة عشوائيا تحذيرات بشأن العنوان الرئيسي - اضبطه كعنوان رئيسي ألغِ ضبطه كعنوان رئيسي انسخ معرّف الغرفة انسخ عنوان الغرفة - التعمية مفعّلة في هذه الغرفة. التعمية معطّلة في هذه الغرفة. فعّل التعمية (احترس: لا يمكنك تعطيلها ثانيةً!) الدليل السمة - معلومات تعمية الطرفين - معلومات الحدث معرّف المستخدم الخوارزميّة معرّف الجلسة خطأ في فكّ التعمية - معلومات الجهاز المرسل اسم الجهاز الاسم @@ -403,21 +559,18 @@ حُفظت مفاتيح الطرفين للغرفة في ’⁨%s⁩‘ تحذير: يمكن أن يُحذف الملف إن أزلت تثبيت التطبيق. - استورد مفاتيح الطرفين لغرفة استورد مفاتيح الغرفة استورد المفاتيح من ملف محلي جهاز مجهول امنع أزِل المنع - أكّد الجهاز قد لا يكون الخادوم متوفّرا أو أنه مشغول اكتب خادوم منزل لسرد الغرف العمومية فيه مسار خادوم المنزل كل الغرف في خادوم ⁨%s⁩ كل غرف ⁨%s⁩ الأصيلة - حجم الخط ضئيل صغير @@ -426,18 +579,15 @@ كبير جدا ضخم ضخم جدا - تحتاج تصريحا لإدارة الودجات في هذه الغرفة المعرّف room_id ناقص في الطلب. المعرّف user_id ناقص في الطلب. الغرفة ⁨%s⁩ غير ظاهرة. لقد أضفت جهازا جديدا ’⁨%s⁩‘ يطلب مفاتيح التعمية. تجاهل الطلب - خطأ في الأمر لم يُفهم الأمر: ⁨%s⁩ - هذّب تحتاج تصريح الدعوة لبدء اجتماع في هذه الغرفة @@ -448,17 +598,14 @@ ابحث في المفضّلة ابحث في الأشخاص ابحث في الغرف - دليل المستخدمين بلاغ علة يبدو أنك تهزّ الهاتف وأنت مُحبط. أتريد إرسال بلاغ علة؟ التقدم (%s٪) - رجاءً اسمح بالنفاذ في المنبثقة الآتية لتتمكن من إجراء محادثة. يحمّل… - لا أعضاء نشطين عضو واحد نشط @@ -485,8 +632,6 @@ %d رسالة جديدة %d رسالة جديدة - - لا غرف غرفة واحدة @@ -497,33 +642,23 @@ الأرشيف المجتمعات - ابحث عن مجتمعات - أولوية منخفضة - المجتمعات لا مجموعات - هزّ الجهاز بجنون يُرسل بلاغًا بعلة - الإخطارات المزعجة الإخطارات الصامتة - تفاصيل المجتمع - لاحقا اخرج قُرأت - عنوان خادوم المنزل عنوان خادوم التعريف ابحث - أمتأكد من بدء دردشة جديدة مع ⁨%s⁩؟ أمتأكد من بدء محادثة صوتية؟ أمتأكد من بدء محادثة صورية؟ - عنوان البريد مُعرّف بالفعل. الأمارة غير صالحة التسجيل عبر البريد ورقم الهاتف معا ليس مدعوما إلى حين توفر واجهة API لذلك. سيُستخدم رقم الهاتف فقط دون البريد. @@ -537,7 +672,6 @@ تعذر التعرف على أمارة الوصول المحددة JSON‏ معطوب قائمة المجموعات - لا تغييرات ملكية تغيير واحد على الملكية @@ -546,23 +680,21 @@ %d تغييرا على الملكية %d تغيير على الملكية - "أرسِل كَ‍ " فشل اتصال الوسائط رُدّ على المكالة في مكان آخر - - يحتاج Element تصريحا منك للوصول إلى مكتبتي الصور والفديو لإرسال المرفقات وحفظها. + يحتاج Element تصريحا منك للوصول إلى مكتبتي الصور والفديو لإرسال المرفقات وحفظها. رجاءً اسمح بالوصول في المنبثقة التالية لتقدر على إرسال الملفات من هاتفك. - يحتاج Element تصريحا منك للوصول إلى الكمرة لأخذ الصور وللمكالمات الصورية. - يحتاج Element تصريحا منك للوصول إلى المِكرفون لإجراء المكالمات الصوتية. + يحتاج Element تصريحا منك للوصول إلى الكمرة لأخذ الصور وللمكالمات الصورية. + يحتاج Element تصريحا منك للوصول إلى المِكرفون لإجراء المكالمات الصوتية. رجاءً اسمح بالنفاذ في المنبثقة الآتية لتتمكن من إجراء محادثة. - يحتاج Element تصريحا منك للوصول إلى الكمرة والمِكرفون لإجراء المكالمات الصورية. + يحتاج Element تصريحا منك للوصول إلى الكمرة والمِكرفون لإجراء المكالمات الصورية. رجاءً اسمح بالوصول في المنبثقة التالية لتقدر على إرسال إجراء المكالمات الصورية. - يحتاج Element تصريحا منك للوصول إلى دفتر العناوين للعثور على مستخدمي ماترِكس الآخرين وذلك حسب البريد الإلكتروني ورقم الهاتف. + يحتاج Element تصريحا منك للوصول إلى دفتر العناوين للعثور على مستخدمي ماترِكس الآخرين وذلك حسب البريد الإلكتروني ورقم الهاتف. رجاءً اسمح بالوصول في المنبثقة التالية لتستكشف مستخدميك في دفتر العناوين من Element. حُفظت @@ -577,26 +709,21 @@ انضم إلى الغرفة لقد أكّدت عنوان بريدي الإلكتروني قائمة علامات القراءة - الأصلي لم يُجب الطرف البعيد. - يحتاج Element تصريحا منك للوصول إلى دفتر العناوين للعثور على مستخدمي ماترِكس الآخرين وذلك حسب البريد الإلكتروني ورقم الهاتف. + يحتاج Element تصريحا منك للوصول إلى دفتر العناوين للعثور على مستخدمي ماترِكس الآخرين وذلك حسب البريد الإلكتروني ورقم الهاتف. أتسمح بأن يصل Element إلى متراسليك؟ - الدردشات المباشرة معرّف المستخدم أو اسمه أو بريده أشِر إليه لن تستطيع العودة عن هذا التغيير إذ أنك تمنح المستخدم نفس مستوى السلطة الذي لك. أمتأكد؟ - أمتأكد من منع هذا المستخدم من هذه الدردشة؟ - ادعُ باستخدام المعرّف دعوة المستخدم حسب معرّفه رجاءً أدخِل عنوان بريد أو معرّف ماترِكس واحد أو أكثر عنوان البريد أو معرّف ماترِكس - ابحث ثِق لا تثق @@ -621,26 +748,20 @@ المدعوّون فقط كل من يجد رابط الغرفة، عدى الزوار كل من يجد رابط الغرفة، مع الزوار - معرّف الغرفة الداخلي العناوين هذه مزايا اختبارية قد تعطب وبشكل غير متوقع. احتط وأنت تستخدمها. ليس لهذه الغرفة عناوين محلية عنوان جديد (مثلا ⁨#foo:matrix.org⁩) - معرّف مجتمع جديد (مثلا ⁨+foo:matrix.org⁩) معرّف المجتمع غير صالح ‏”⁨%s⁩“ ليس معرّف مجتمع صالح - - حاول ‏⁨%s⁩ أن يحمّل نقطة معينة في الخط الزمني ولكن تعذر عليه العثور عليها. - للتحقق فيما إذا كان يمكن الوثوق بالجهاز أم لا، رجاءً راسل مالكه مستخدما طريقة أخرى (وجها لوجه أو عبر مكالمة هاتفية) واسأله فيما إذا كان المفتاح في صفحة ”إعدادات المستخدم“ على جهازه يطابق المفتاح أدناه أم لا: إن كان يتطابق، فانقر زر التأكيد أدناه. وإلا فناك من يعترض هذا الجهاز وأغلب الظن أنه من الأفضل منعه. ستتحسن عملية التأكيد في المستقبل وتصبح أفضل وأرقى. أؤكّد بأن المفتاح يتطابق - تحتوي الغرفة أجهزة مجهولة اختر دليل غرف ابدأ مكالمات الاجتماعات مستخدما Jitsi @@ -652,14 +773,12 @@ %d ودجة نشطة %d ودجة نشطة - أضِف تطبيقات ماترِكس يطلب جهازك غير المؤكّد ”‏⁨%s⁩“ مفاتيح التعمية. ابدأ التأكيد شارِك دون تأكيد رسالة معمّاة - أنشئ اسم المجتمع @@ -668,29 +787,23 @@ الناس الغرف لا مستخدمين - الغرف المنضمّون المدعوّون رشّح أعضاء المجموعة رشّح غرف المجموعة - لم يقدّم مدير المجتمع وصفا طويلا عن مجتمعه. - لقد طُردت من ⁨%1$s⁩ على يد ⁨%2$s⁩ لقد مُنعت من ⁨%1$s⁩ على يد ⁨%2$s⁩ السبب: ⁨%1$s⁩ أعِد الانضمام انسَ الغرفة - الإجراءات كبير متوسط صغير - مكالمة افتح الترويسة - المكالمة التأخير بين كل طلبي مزامنة الإصدارة @@ -698,7 +811,6 @@ الأحكام والشروط إشعارات الأطراف الثالثة أبقِ الوسائط - المستخدمون المتجاهلون أخرى التعمية @@ -708,9 +820,7 @@ ثبّت الغرف التي فيها رسائل غير مقروءة فعّل معاينات العناوين ضمن السياق مبدئيا هُزّ الجهاز عند الإشارة إليّ - التحاليل - ‏⁨%1$s⁩ في ⁨%2$s⁩ تطلب هذه العملية تخويلا إضافيا. رجاءً أدخِل كلمة السر للمتابعة. @@ -718,19 +828,15 @@ والج كَ‍ خادوم المنزل خادوم التعريف - رجاءً افحص بريدك وانقر على الرابط في الرسالة. ما إن تفعل انقر ”تابع“. تعذر تأكيد عنوان البريد الإلكتروني. رجاءً افحص بريدك وانقر على الرابط في الرسالة. ما إن تفعل انقر ”تابع“ عنوان البريد مستخدم بالفعل فشل إرسال البريد: لم يُعثر على عنوان البريد الإلكتروني رقم الهاتف مستخدم بالفعل - أمتأكد من إزالة هدف الإخطار هذا؟ - لقد أرسلنا رسالة نصية فيها رمز التنشيط. رجاءً أدخِل هذا الرمز أدناه. وسم الغرفة موسومة بِ‍: - مفضلة أولوية منخفضة بلا @@ -739,26 +845,20 @@ الإخطارات الوصول إلى الغرفة مَن يمكنه أن يصل إلى هذه الغرفة؟ - عمِّ إلى الأجهزة المؤكّدة فقط لا تميل هذه الغرفة إلى أي من المجتمعات الميل - إنشاء مجتمع معطّل مزعج - ما زالت مكالمات الاجتماعات قيد التطوير وقد لا يُعتمد عليها. - تحتوي هذه الغرفة أجهزة مجهولة لم يُتأكّد منها. يعني هذا عدم وجود أي ضمانات بأن الأجهزة هي فعلا ملك لمن يستخدمها. ننصحك بأن تبدأ عملية التأكيد لكل جهاز وذلك قبل أن تتابع. يمكنك طبعا إرسال الرسالة دون تأكيد إن أردت ذلك. الأجهزة المجهولة: - لا ترسل من هذا الجهاز الرسائل المعمّاة إلى الأجهزة غير المؤكّدة - عمِّ إلى الأجهزة المؤكّدة فقط التأكيد مُرجأ تأكيد الهاتف @@ -768,14 +868,12 @@ أكّد ألغِ التأكيد غير متّصل - اسرد الأعضاء ادعُ دليل المستخدمين (⁨%s⁩) قد يعني هذا بأن أحدهم يعترض الاتصال بعدوانية، أو أن هاتفك لا يثق بالشهادة التي قدّمها الخادوم البعيد. إن قال مدير الخادوم بأن هذا متوقع، فتأكد من أن البصمة أدناه تطابق البصمة التي وفّرها. تغيّرت الشهادة من شهادة كنت تثق بها إلى شهادة لا تثق بها. لربما جدّد الخادوم شهادته. راسل إدارة الخادوم واسألهم عن البصمة المتوقعة. - انضم ابدأ دردشة تصفح الدليل @@ -789,31 +887,23 @@ دردشة مباشرة أضِف اختصارا إلى الشاشة الرئيسية - الأحكام والشروط إشعارات الأطراف الثالثة شاشة معلومات التطبيق في النظام دعوات المكالمات ابدأ عن الإقلاع أمتأكّد من إزالة ⁨%1$s⁩ ⁨%2$s⁩؟ - رقم الهاتف غير صالح حسب الدولة المنتقاة - يجب أن يكون للغرفة عنوان للربط بها. لا ترسل من هذا الجهاز الرسائل المعمّاة في هذه الغرفة إلى الأجهزة غير المؤكّدة. - تنسيق الاسم المختصر غير صالح - مفتاح تعريف Curve25519 بصمة Ed25519 - صدّر مفاتيح تعمية الطرفين لغرفة صدّر استورد في القائمة السوداء - بلا - صفر غرفة غرفة واحدة @@ -823,44 +913,32 @@ %d غرفة ‏⁨%1$s⁩ في ‏⁨%2$s⁩ - ابحث في الأرشيف - يجب أن يكون مستوى السلطة عددا صحيحا موجبا. مثال مثال - الغرفة دعوة أرسل إلى أرسِل ملصقا - رُخص الأطراف الثالثة - نزِّل أرسِل صوتًا - أرسِل ملصقًا ليس ثمة أية حزمة ملصقات مفعّلة حاليًا. أتريد إضافة حزمة الآن؟ - نأسف، لم نجد أي تطبيق خارجي لإكمال هذا الإجراء. - أعِد طلب مفاتيح التعميةمن أجهزتك الأخرى. - أُرسل طلب المفتاح. - أُرسل الطلب - رجاءً أطلِق Element في جهاز آخر يقدر على فك تعمية الرسالة ليُرسل المفاتيح إلى هذا الجهاز. - + رجاءً أطلِق Element في جهاز آخر يقدر على فك تعمية الرسالة ليُرسل المفاتيح إلى هذا الجهاز. انطِق امسح متّصل غير متّصل خامل - خصوصيّة الإخطارات طبيعية خصوصية أقل @@ -869,39 +947,29 @@ • تحتوي الإخطارات بيانات وصفية فحسب • تحتوي الإخطارات بيانات وصفية وبيانات الرسائل • سوف لن تعرض الإخطارات محتوى الرسائل - الرسائل التي أرسلها بوت - انتهت مهلة طلب المزامنة ألغِ تنشيط الحساب ألغِ تنشيط حسابي - خصوصيّة الإخطارات امنح التصريح اختر خيارا آخر - أرسِل بيانات التحاليل - يجمع Element التحاليل بشكل مجهّل فيتيح لنا ذلك تحسين التطبيق. - رجاءً فعّل التحاليل لمساعدتنا في تحسين Element. + يجمع Element التحاليل بشكل مجهّل فيتيح لنا ذلك تحسين التطبيق. + رجاءً فعّل التحاليل لمساعدتنا في تحسين Element. نعم أريد المساعدة! - اكتب هنا… - ثمة معامل مطلوب ناقص. ثمة معامل غير صالح. أرسِل رسالة صوتية (يتطلب تطبيقا من طرف ثالث لتسجيل الرسائل الصوتية) - لمتابعة استخدام خادوم المنزل ⁨%1$s⁩ عليك مراجعة الشروط والقوانين والموافقة عليها. سأراجعها الآن - ألغِ تفعيل الحساب رجاءً اكتب كلمة السر للمتابعة: رجاءً اكتب كلمة السر. - رجاءً اكتب الوصف بالإنجليزية إن أمكن. نظرًا لكون بعض التصاريح ناقصة، هذا الإجراء ليس ممكنًا. تنبيهات النظام - %d ثانية ثانية واحدة @@ -934,14 +1002,11 @@ %d يومًا %d يوم - %1$s الآن %1$s منذ %2$s - "⁨%1$s⁩ و " ⁨%1$s⁩ و ⁨%2$s⁩ %1$s %2$s - أرسِل ردًا غير معمّى… أرسِل ردًا (بلا تعمية)… @@ -952,12 +1017,9 @@ %d محدّدة %d محدّدة - عايِن الوسيط قبل إرساله - - يمكن أن يعمل Element في الخلفية ليُدير الإخطارات بأمان وخصوصية (قد يؤثّر هذا على استهلاك البطارية). + يمكن أن يعمل Element في الخلفية ليُدير الإخطارات بأمان وخصوصية (قد يؤثّر هذا على استهلاك البطارية). لست عضوًا في أي مجتمع حاليًا. - لا رسائل إخطار غير مقروءة رسالة إخطار واحدة غير مقروءة @@ -988,7 +1050,6 @@ %d عضوًا %d عضو - لا غرف غرفة واحدة @@ -998,19 +1059,14 @@ %d غرفة ألغِ تفعيل الحساب - استُبدلت هذه الغرفة ولم تعد نشطة بعد الآن هذه الغرفة هي استمرار لمحادثة أخرى انقر هنا لرؤية الرسائل الأقدم - وصلت إلى حدّ الموارد راسِل المدير - راسِل مدير الخدمة - رجاءً %s لزيادة هذا الحدّ. رجاءً %s لمتابعة استخدام هذه الخدمة. - تابِع مستخدمًا… يعرض إجراءً يُلغي إدارية المستخدم حسب المعرّف المعطى @@ -1020,19 +1076,15 @@ يطرد المستخدم حسب المعرّف المعطى يُغيّر اسم العرض لحسابك لإصلاح إدارة تطبيقات «ماترِكس» - شعار الرصيد شعار إخطار شعار - رجاءً انسَ كل الرسائل التي أرسلتها عندما كان حسابي غير مفعّل (تحذير: سيتسبب هذا بأن يرى المستخدمون اللاحقون عرضًا غير كاملًا للمحادثات) استمرت المحادثة هنا تخطّ خادوم المنزل هذا حدود الموارد لديه بذلك لن يستطيع بعض المستخدمين الولوج. تخطّ خادوم المنزل هذا أحد حدود الموارد لديه. - وصل خادوم المنزل هذا حدّ المستخدمين النشطين شهريًا بذلك لن يستطيع بعض المستخدمين الولوج. وصل خادوم المنزل هذا حدّ المستخدمين النشطين شهريًا. - جرى وصل الاتصال يجري وصل الاتصال… يُجري الاتصال… @@ -1046,20 +1098,35 @@ الرسائل الآمنة تخطي تم - خطأ - المكالمات طرد السبب - الإصدار %s الإعدادات المتقدمة للإشعارات توثق من الجهاز - تأمين المفاتيح لم ينته، يرجى الانتظار عند تسجيل الخروج الآن ستخسر مفاتيحك تأمين المفاتيح ما زال جاريا. في حال خروجك الآن لن تتمكن لاحقا من قراءة الرسائل المشفرة تأكد من تفعيل تأمين المفاتيح على كل أجهزتك كي لا تخسر رسائلك المشفرة يتم تأمين المفاتيح - + لا يوجد لديك أذن لبدء مكالمة إجتماع + لا يوجد لديك أذن لبدء إجتماع في هذه الغرفة + إبدأ بالمحادثة + إعادة ضبط + إصرف + أوقف + شغل + إفصل + أبّطل + لاشيء + إبقى + ستفقد الوصول إلى رسائلك المشفرة إلا إذا أخذت نسخة إحتياطية من مفاتيحك قبل تسجيلك للخروج. + نسخة إحتياطية + هل أنت متأكد؟ + إستخدم المفتاح الإحتياطي + لا أريد رسائلي المشفرة + نسخ إحتياطي للمفتاح + جاري إعداد الخدمة + إفتراضي النظام + \ No newline at end of file diff --git a/vector/src/main/res/values-az/strings.xml b/vector/src/main/res/values-az/strings.xml index a6b3daec93..3821dcfb73 100644 --- a/vector/src/main/res/values-az/strings.xml +++ b/vector/src/main/res/values-az/strings.xml @@ -1,2 +1,115 @@ - \ No newline at end of file + + %1$s: %2$s + %1$s şəkil göndərdi. + %1$s stiker göndərdi. + + %s-nin dəvəti + %1$s dəvət etdi %2$s + %1$s sizi dəvət etdi + %1$s qoşuldu + %1$s qalıb + %1$s dəvəti rədd etdi + %1$s %2$s-i xaric etdi + %1$s %2$s-i blokdan açdı + %1$s %2$s-i blokladı + %1$s %2$s-in dəvətini geri götürdü + %1$s avatarı dəyişdi + %1$s ekran adını %2$s olaraq təyin etdi + %1$s ekran adını %2$s-dan %3$s-ya dəyişdi + %1$s onların göstərilən adlarını sildi (%2$s) + %1$s mövzunu dəyişdi: %2$s + %1$s otaq adını dəyişdirdi: %2$s + %s video zəng etdi. + %s səsli zəng etdi. + %s zəngə cavab verdi. + %s zəng başa çatdı. + "%1$s gələcək otaq tarixçəsini %2$s-ə görünən etdi" + bütün otaq üzvləri, dəvət olunduğu andan. + bütün otaq üzvləri, qoşulduğu andan. + bütün otaq üzvləri. + hər kəs. + naməlum (%s). + %1$s sondan-sona şifrələmə açdı (%2$s) + %s bu otağı təkmilləşdirdi. + + %1$s VoIP konfrans istədi + VoIP konfransı başladı + VoIP konfransı başa çatdı + + (avatar da dəyişdirilib) + %1$s otaq adını sildi + %1$s otaq mövzusunu sildi + Mesaj silindi + Mesaj %1$s tərəfindən silindi + Mesaj silindi [səbəb: %1$s] + Mesaj %1$s tərəfindən qaldırıldı [səbəb: %2$s] + %1$s profilini %2$s yenilədi + %1$s otağa qoşulmaq üçün %2$s dəvətnamə göndərdi + %1$s otağa qoşulmaq üçün %2$s dəvətini ləğv etdi + %1$s %2$s üçün dəvəti qəbul etdi + + ** Şifrəni aça bilmir: %s ** + Göndərənin cihazı bu mesaj üçün açarları bizə göndərməyib. + + Redaktə etmək olmur + Mesaj göndərmək olmur + + Şəkil yükləmək olmur + + Şəbəkə xətası + Matris xətası + + Boş bir otağa yenidən qoşulmaq hazırda mümkün deyil. + + Şifrəli mesaj + + Elektron poçt ünvanı + Telefon nömrəsi + + %s-dən dəvət + Otağa dəvət + + %1$s və %2$s + + + %1$s və 1 digər + %1$s və %2$d digərləri + + + Boş otaq + + İlkin sinxronizasiya: +\nHesab idxal olunur… + İlkin sinxronizasiya: +\nKriptografiyanın idxalı + İlkin sinxronizasiya: +\nOtaqlar idxalı + İlkin sinxronizasiya: +\nOtaqlara daxil olmaq + İlkin sinxronizasiya: +\nDəvət olunmuş otaqların idxalı + İlkin sinxronizasiya: +\nTərk olunmuş otaqların idxalı + İlkin sinxronizasiya: +\nİcmaların idxalı + İlkin sinxronizasiya: +\nHesab məlumatlarının idxalı + + Mesaj göndərilir… + Göndərmə növbəsini təmizləyin + + %1$s-nin dəvəti. Səbəb: %2$s + %1$s dəvət olunmuş %2$s. Səbəb: %3$s + %1$s sizi dəvət etdi. Səbəb: %2$s + %1$s qoşuldu. Səbəb: %2$s + %1$s qalıb. Səbəb: %2$s + %1$s dəvəti rədd etdi. Səbəb: %2$s + %1$s %2$s-i xaric etdi. Səbəb: %3$s + %1$s blokdan açdı %2$s. Səbəb: %3$s + %1$s blokladı %2$s. Səbəb: %3$s + %1$s otağa qoşulmaq üçün %2$s dəvətnamə göndərdi. Səbəb: %3$s + %1$s otağa qoşulmaq üçün %2$s dəvətini ləğv etdi. Səbəb: %3$s + %1$s %2$s üçün dəvəti qəbul etdi. Səbəb: %3$s + %1$s %2$s dəvətini geri götürdü. Səbəb: %3$s + \ No newline at end of file diff --git a/vector/src/main/res/values-b+sr+Latn/strings.xml b/vector/src/main/res/values-b+sr+Latn/strings.xml index 29bd40b977..c5f3d3b407 100644 --- a/vector/src/main/res/values-b+sr+Latn/strings.xml +++ b/vector/src/main/res/values-b+sr+Latn/strings.xml @@ -3,8 +3,7 @@ Svetla Tema Tamna Tema - Crna Tema - Status.im Tema + Crna Tema Inicijalizacija servisa Sinhronizacija u toku… @@ -179,7 +178,7 @@ Tema sobe Pozivi - Koristi podrazumevani Element zvuk zvona za dolazeće pozive + Koristi podrazumevani ${app_name} zvuk zvona za dolazeće pozive Zvuk zvona dolazećeg poziva Izaberite zvuk zvona za pozive: @@ -209,7 +208,7 @@ Servis će se početi sa radom prilikom ponovnog pokretanja uređaja. Optimizacija potrošnje baterije - Optimizacija potrošnje baterije ne utiče na Element. + Optimizacija potrošnje baterije ne utiče na ${app_name}. Ignoriši optimizacije Normalno @@ -264,7 +263,7 @@ Pronalaženje Upravljajte vašim podešavanjima za pronalaženje. Privatnost obaveštenja - Element može da radi u pozadini kako bi upravljao vašim obaveštenjima sigurno i privatno. Ovo može da utiče na potrošnju baterije. + ${app_name} može da radi u pozadini kako bi upravljao vašim obaveštenjima sigurno i privatno. Ovo može da utiče na potrošnju baterije. Dozvoli Izaberi drugu opciju diff --git a/vector/src/main/res/values-bg/strings.xml b/vector/src/main/res/values-bg/strings.xml index c2235f3cd0..cf51e0546d 100644 --- a/vector/src/main/res/values-bg/strings.xml +++ b/vector/src/main/res/values-bg/strings.xml @@ -1,10 +1,221 @@ + %1$s: %2$s + %1$s изпрати снимка. + Поканата на %s + %1$s покани %2$s + %1$s Ви покани + %1$s се присъедини в стаята + %1$s напусна стаята + %1$s отхвърли поканата + %1$s изгони %2$s + %1$s отблокира %2$s + %1$s блокира %2$s + %1$s оттегли поканата си за %2$s + %1$s смени своята профилна снимка + %1$s си сложи име %2$s + %1$s смени своето име от %2$s на %3$s + %1$s премахна своето име (%2$s) + %1$s смени темата на: %2$s + %1$s смени името на стаята на: %2$s + %s започна видео разговор. + %s започна гласов разговор. + %s отговори на обаждането. + %s прекрати разговора. + %1$s направи бъдещата история на стаята видима за %2$s + всички членове, от момента на поканването им в нея. + всички членове, от момента на присъединяването им в нея. + всички членове в нея. + всеки. + непозната (%s). + %1$s включи шифроване от край до край (%2$s) + %1$s заяви VoIP групов разговор + Започна VoIP групов разговор + Груповият разговор приключи + (профилната снимка също беше сменена) + %1$s премахна името на стаята + %1$s премахна темата на стаята + %1$s обнови своя профил %2$s + %1$s изпрати покана на %2$s да се присъедини към стаята + %1$s прие поканата за %2$s + ** Неуспешно разшифроване: %s ** + Неуспешно премахване + Неуспешно изпращане на съобщението + Неуспешно качване на снимката + Грешка в мрежата + Matrix грешка + В момента не е възможно да се присъедините отново към празна стая. + Имейл адрес + Телефонен номер + Устройството на подателя не изпрати ключовете за това съобщение. + %1$s изпрати стикер. + Покана от %s + Покана за стая + %1$s и %2$s + + %1$s и 1 друг + %1$s и %2$d други + + Празна стая + Премахнато съобщение + Съобщение премахнато от %1$s + Премахнато съобщение [причина: %1$s] + Съобщение премахнато от %1$s [причина: %2$s] + Начална синхронизация: +\nИмпортиране на профил… + Начална синхронизация: +\nИмпортиране на данни за шифроване + Начална синхронизация: +\nИмпортиране на стаи + Начална синхронизация: +\nИмпортиране на стаи, от които съм част + Начална синхронизация: +\nИмпортиране на стаи, към които съм поканен + Начална синхронизация: +\nИмпортиране на стаи, които съм напуснал + Начална синхронизация: +\nИмпортиране на общности + Начална синхронизация: +\nИмпортиране на данни за профила + %s обнови тази стая. + Изпращане на съобщение… + Изчисти опашката за изпращане + %1$s оттегли поканата за присъединяване на %2$s към стаята + поканата на %1$s. Причина: %2$s + %1$s покани %2$s. Причина: %3$s + %1$s ви покани. Причина: %2$s + %1$s се присъедини в стаята. Причина: %2$s + %1$s напусна стаята. Причина: %2$s + %1$s отхвърли поканата. Причина: %2$s + %1$s изгони %2$s. Причина: %3$s + %1$s блокира %2$s. Причина: %3$s + %1$s блокира %2$s. Причина: %3$s + %1$s изпрати покана до %2$s да се присъедини в стаята. Причина: %3$s + %1$s премахна поканата за присъединяване на %2$s в стаята. Причина: %3$s + %1$s прие поканата за %2$s. Причина: %3$s + %1$s оттегли поканата на %2$s. Причина: %3$s + + %1$s добави %2$s като адрес за тази стая. + %1$s добави %2$s като адреси за тази стая. + + + %1$s премахна %2$s като адрес за тази стая. + %1$s премахна %2$s като адреси за тази стая. + + %1$s добави %2$s и премахна %3$s като адреси за тази стая. + %1$s настрой %2$s като основен адрес за тази стая. + %1$s премахна основния адрес за тази стая. + %1$s разреши на гости да се присъединяват в стаята. + %1$s предотврати присъединяването на гости в стаята. + %1$s включи шифроване от-край-до-край. + %1$s включи шифроване от-край-до-край (неразпознат алгоритъм %2$s). + %1$s създаде стаята + Изпратихте снимка. + Изпратихте стикер. + Ваша покана + Създадохте стаята + Поканихте %1$s + Присъединихте се в стаята + Напуснахте стаята + Отхвърлихте поканата + Изгонихте %1$s + Отблокирахте %1$s + Блокирахте %1$s + Включихте шифроване от-край-до-край (непознат алгоритъм: %1$s). + Включихте шифроване от-край-до-край. + Спряхте възможността гости да се присъединяват в стаята. + %1$s спря възможността гости да се присъединяват в стаята. + Спряхте възможността гости да се присъединяват в стаята. + Позволихте на гости да се присъединяват тук. + %1$s позволи на гости да се присъединяват тук. + Позволихте на гости да се присъединяват към стаята. + Премахнахте основния адрес на стаята. + Зададохте %1$s като основен адрес на стаята. + Добавихте %1$s и премахнахте %2$s от адресите за стаята. + + Премахнахте %1$s от адресите на стаята. + Премахнахте %1$s от адресите на стаята. + + + Добавихте %1$s като адрес за тази стая. + Добавихте %1$s като адреси за тази стая. + + Оттеглихте поканата на %1$s. Причина: %2$s + Приехте поканата за %1$s. Причина: %2$s + Оттеглихте поканата за присъединяване в стаята от %1$s. Причина: %2$s + Изпратихте покана към %1$s за присъединяване в стаята. Причина: %2$s + Блокирахте %1$s. Причина: %2$s + Отблокирахте %1$s. Причина: %2$s + Изгонихте %1$s. Причина: %2$s + Отхвърлихте поканата. Причина: %1$s + Напуснахте. Причина: %1$s + %1$s напусна. Причина: %2$s + Напуснахте стаята. Причина: %1$s + Присъединихте се. Причина: %1$s + %1$s се присъедини. Причина: %2$s + Присъединихте се в стаята. Причина: %1$s + Поканихте %1$s. Причина: %2$s + Ваша покана. Причина: %1$s + %1$s от %2$s на %3$s + %1$s промени нивото на достъп на %2$s. + Променихте нивото на достъп на %1$s. + Собствено ниво + Собствено ниво (%1$d) + По подразбиране + Модератор + Администратор + Променихте %1$s приспособлението + %1$s промени %2$s приспособлението + Премахнахте %1$s приспособлението + %1$s премахна %2$s приспособлението + Добавихте %1$s приспособление + %1$s добави %2$s приспособление + Приехте поканата за %1$s + Оттеглихте поканата от %1$s + %1$s оттегли поканата от %2$s + Оттеглихте поканата за присъединяване в стаята от %1$s + Поканихте %1$s + %1$s покани %2$s + Изпратихте покана към %1$s за присъединяване в стаята + Обновихте профила си %1$s + Премахнахте снимката на стаята + %1$s премахна снимката на стаята + Премахнахте темата на стаята + Премахнахте името на стаята + Заявихте VoIP конференция + Обновихте чата. + %s обнови чата. + Обновихте стаята. + Включихте шифроване от-край-до-край (%1$s) + Направихте бъдещите съобщения видими за %1$s + %1$s направи бъдещите съобщения видими за %2$s + Направихте бъдещата история на стаята видима за %1$s + Прекратихте разговора. + Започнахте видео разговор. + Отговорихте на обаждането. + Изпратихте данни за настройка на разговора. + %s изпрати данни за настройка на разговора. + Започнахте гласов разговор. + Променихте името на стаята на: %1$s + Променихте снимката на стаята + %1$s промени снимката на стаята + Променихте темата на: %1$s + Премахнахте името си (%1$s) + Променихте името си от %1$s на %2$s + Променихте името си на %1$s + Променихте снимката си + Оттеглихте поканата от %1$s + Напуснахте стаята + %1$s напусна стаята + Присъединихте се + %1$s се присъедини + Създадохте дискусията + %1$s създаде дискусията Шифровано съобщение Светла тема Тъмна тема - Черна тема + Черна тема Синхронизиране… Съобщения Стая @@ -127,7 +338,7 @@ Директория с потребители Само потребители на Matrix Няма разговори - Не сте дали достъп на Element до локалните ви контакти + Не сте дали достъп на ${app_name} до локалните ви контакти Няма резултати Стаи Директория със стаи @@ -558,22 +769,22 @@ Липсва user_id в заявката. Стая %s не е видима. Добави Matrix приложения - Element иска разрешение за достъп до Вашата галерия със снимки и видеа, за да изпраща и запазва прикачени файлове. + ${app_name} иска разрешение за достъп до Вашата галерия със снимки и видеа, за да изпраща и запазва прикачени файлове. \n \nМоля, разрешете достъпа от следващия прозорец, който се покаже, за да можете да изпращате файлове от телефона си. - Element иска разшерение за достъп до Вашата камера, за да прави снимки или да осъществи видео разговори. + ${app_name} иска разшерение за достъп до Вашата камера, за да прави снимки или да осъществи видео разговори. " \n \nМоля, разрешете достъпа от следващия прозорец, който ще се покаже, за да можете да се обадите." - Element иска разшерение за достъп до Вашия микрофон, за да се извърши звуков разговор. + ${app_name} иска разшерение за достъп до Вашия микрофон, за да се извърши звуков разговор. " \n \nМоля, разрешете достъпа от следващия прозорец, който ще се покаже, за да можете да се обадите." - Element иска разширение за достъп до микрофона и камерата Ви, за да извърши видео разговор. + ${app_name} иска разширение за достъп до микрофона и камерата Ви, за да извърши видео разговор. \n \nМоля, разрешете достъпа от следващия прозорец, който ще се покаже, за да можете да се обадите. - Element може да провери контактите ви, за да намери други Matrix потребители по имейл или телефонен номер. Ако сте съгласни да споделите списъка с контактите си за тази цел, моля разрешете достъп при предстоящото запитване. - Element може да провери контактите ви, за да намери други Matrix потребители по имейл и телефонен номер. + ${app_name} може да провери контактите ви, за да намери други Matrix потребители по имейл или телефонен номер. Ако сте съгласни да споделите списъка с контактите си за тази цел, моля разрешете достъп при предстоящото запитване. + ${app_name} може да провери контактите ви, за да намери други Matrix потребители по имейл и телефонен номер. \n \nРазрешавате ли да се сподели списъка с контакти за тази цел\? Извинете. Операцията не е извършена поради липсващи разрешения за достъп @@ -696,7 +907,7 @@ • Уведомленията съдържат метаданни и съдържания на съобщения • Уведомленията няма да показват съдържания на съобщения Конфиденциалност на известията - Element може да работи във фонов режим за да получава известия по защитен начин. Може да повлияе на консумацията на енергия. + ${app_name} може да работи във фонов режим за да получава известия по защитен начин. Може да повлияе на консумацията на енергия. Разреши достъп Избери друг вариант Конфиденциалност на известията @@ -709,8 +920,8 @@ Деактивиране на акаунт Деактивирай акаунта ми Изпращане на статистически данни - Element събира анонимни статистики за да ни помогне да подобрим приложението. - Моля, включете изпращането на статистики за да ни помогнете да подобрим Element. + ${app_name} събира анонимни статистики за да ни помогне да подобрим приложението. + Моля, включете изпращането на статистики за да ни помогнете да подобрим ${app_name}. Да, искам да помогна! Липсва задължителен параметър. Невалиден параметър. @@ -732,7 +943,7 @@ Изисквай повторно ключове за шифроване от другите ми устройства. Заявката за ключове беше изпратена. Изпратена заявка - Моля стартирайте Element на друго устройство можещо да разшифрова съобщението, за да може то да изпрати ключовете до това устройство. + Моля стартирайте ${app_name} на друго устройство можещо да разшифрова съобщението, за да може то да изпрати ключовете до това устройство. Пишете тук… Изпрати гласово съобщение продължете с… @@ -811,7 +1022,6 @@ Подобрява производителността като зарежда членовете в стаите при първи преглед. Сървърът Ви все още не поддържа постепенно зареждане на членовете в стаи. Опитайте по-късно. Съжаляваме, възникна грешка - Status.im тема Версия %s Моля, въведете парола за шифроване на екпортираните ключове. Ще е нужно да въведете същата парола за да можете да ги импортирате. Създай парола @@ -830,7 +1040,7 @@ Приемам Моля прегледайте и приемете политиките на сървъра: Обаждания - Използвай мелодията по подразбиране на Element за входящи повиквания + Използвай мелодията по подразбиране на ${app_name} за входящи повиквания Мелодия за входящо повикване Избор на мелодия за обаждания: Изгони @@ -871,12 +1081,12 @@ Разреши Настройки на устройството. Уведомленията са разрешени за това устройство. - Уведомленията са забранени за тази сесия. -\nМоля, проверете настройките на Element. + Уведомленията са забранени за тази сесия. +\nМоля, проверете настройките на ${app_name}. Разреши Проверка на Google Play услугите APK пакет за Google Play услугите е наличен и с актуална версия. - Element използва Google Play услугите за да доставя известия за съобщения, но изглежда те не са конфигурирани правилно: + ${app_name} използва Google Play услугите за да доставя известия за съобщения, но изглежда те не са конфигурирани правилно: \n%1$s Поправи Google Play услугите Firebase токен @@ -898,22 +1108,22 @@ Услугата не успя да се рестартира Стартирай при старт на системата Услугата ще стартира когато устройството се рестартира. - Услугата няма да стартира когато устройството се рестартира. Няма да получавате известия докато Element не бъде отворен поне веднъж. + Услугата няма да стартира когато устройството се рестартира. Няма да получавате известия докато ${app_name} не бъде отворен поне веднъж. Стартирай при старт на системата Проверка на фоновите ограничения - Ограниченията във фонов режим са изключени за Element. Тази проверка трябва да се изпълни използвайки мобилни данни (не на Wi-Fi). + Ограниченията във фонов режим са изключени за ${app_name}. Тази проверка трябва да се изпълни използвайки мобилни данни (не на Wi-Fi). \n%1$s - Активирани са ограничения във фонов режим за Element. + Активирани са ограничения във фонов режим за ${app_name}. \nРаботата, която приложението се опитва да извършва във фонов режим бива агресивно ограничена. Това може да повлияе на известяването. \n%1$s Премахни ограниченията Оптимизация на батерията - Element не се влияе от Оптимизация на батерията. + ${app_name} не се влияе от Оптимизация на батерията. Ако потребител остави устройството неподвижно с изключен екран за известно време, то влиза в режим на заспиване. Това предотвратява приложенията да достъпват мрежата и отлага техните задачи, синхронизации и стандартни аларми. Игнорирай оптимизацията Връзка във фонов режим - Element трябва да поддържа ниско-натоварваща връзка във фонов режим, за да може известията да пристигат надеждно. -\nНа следващия екран, ще бъдете попитани дали да позволите на Element винаги да работи във фонов режим. Моля, приемете. + ${app_name} трябва да поддържа ниско-натоварваща връзка във фонов режим, за да може известията да пристигат надеждно. +\nНа следващия екран, ще бъдете попитани дали да позволите на ${app_name} винаги да работи във фонов режим. Моля, приемете. Разреши Възникна грешка при проверката на имейл адреса Ви. Възникна грешка при проверката на телефонния Ви номер. @@ -932,12 +1142,12 @@ Някои известия са изключени в собствените Ви настройки. Неуспешно зареждане на собствените правила. Опитайте пак. Провери настройките - [%1$s] -\nТази грешка е извън контрола на Element. Според Google, грешката показва, че устройството има прекалено много приложения регистрирани към системата за известия FCM. Проблема се случва само в случай на огромен брой приложения, така че не би трябвало да повлияе средно-статистическия потребител. - [%1$s] -\nТази грешка е извън контрола на Element. Може да се случи поради няколко причини. Възможно е проблема да изчезне, ако опитате по-късно. Също така, може да проверите дали Google Play услугите не са ограничени откъм мобилни данни (вижте системните настройки), или че часовникът на устройството е правилен. Възможно е грешката да възникне и ако използвате модифицирана операционна система (custom ROM). - [%1$s] -\nТази грешка е извън контрола на Element. Няма Google акаунт на телефонът. Отворете системата за управления на акаунти и добавете Google акаунт. + [%1$s] +\nТази грешка е извън контрола на ${app_name}. Според Google, грешката показва, че устройството има прекалено много приложения регистрирани към системата за известия FCM. Проблема се случва само в случай на огромен брой приложения, така че не би трябвало да повлияе средно-статистическия потребител. + [%1$s] +\nТази грешка е извън контрола на ${app_name}. Може да се случи поради няколко причини. Възможно е проблема да изчезне, ако опитате по-късно. Също така, може да проверите дали Google Play услугите не са ограничени откъм мобилни данни (вижте системните настройки), или че часовникът на устройството е правилен. Възможно е грешката да възникне и ако използвате модифицирана операционна система (custom ROM). + [%1$s] +\nТази грешка е извън контрола на ${app_name}. Няма Google акаунт на телефонът. Отворете системата за управления на акаунти и добавете Google акаунт. Добави акаунт Настройка на шумни известия Настройка на известия за разговори @@ -948,7 +1158,7 @@ Безшумно Моля, въведете парола Паролата е прекалено слаба - Моля, изтрийте паролата, ако искате Element да генерира ключ за възстановяване. + Моля, изтрийте паролата, ако искате ${app_name} да генерира ключ за възстановяване. Не беше открита Matrix сесия Никога не губете шифровани съобщения Съобщения в шифровани стаи са защитени с шифроване от край до край. Само Вие и получателят (получателите) имате ключовете за прочитането им. @@ -1077,7 +1287,7 @@ Паролите не съвпадат Невалиден отговор при опит за откриване на адреса на сървъра Опции за откриване на сървър - Element откри конфигурация за собствен сървър за домейна от потребителското Ви име \"%1$s\": + ${app_name} откри конфигурация за собствен сървър за домейна от потребителското Ви име \"%1$s\": \n%2$s Използвай конфигурацията Инициализиране на услугата @@ -1193,7 +1403,7 @@ Изчакайте… Всички общности Тази стая не може да бъде прегледана - Прегледа на стаи четими от цял свят все още не се поддържа от ElementX + Прегледа на стаи четими от цял свят все още не се поддържа от ${app_name} Стаи Директни съобщения Нова стая @@ -1288,11 +1498,11 @@ Добавете сървър за самоличност в настройки за да извършите това действие. Режим на фонова синхронизация Пестящ батерия - Element ще синхронизира във фонов режим по начин, който пести ограничените ресурси на устройството (батерия). + ${app_name} ще синхронизира във фонов режим по начин, който пести ограничените ресурси на устройството (батерия). \nВ зависимост от състоянието на ресурсите, синхронизацията може да бъде отложена от операционната система. Целящ висока интерактивност - Element ще синхронизира във фонов режим на определен интервал (конфигурируемо). -\nТова ще повлияе на използването на антената и батерията. Ще се показва перманентна нотификация, че Element слуша за събития. + ${app_name} ще синхронизира във фонов режим на определен интервал (конфигурируемо). +\nТова ще повлияе на използването на антената и батерията. Ще се показва перманентна нотификация, че ${app_name} слуша за събития. Без фонова синхронизация Няма да бъдете уведомени за входящи съобщения, когато приложението е във фонов режим. Неуспешно обновяване на настройките. @@ -1376,13 +1586,13 @@ Съдържанието беше докладвано като неподходящо. \n \nАко не искате да виждате повече съдържание от този потребител, може да ги игнорирате за да скриете съобщенията им. - Element се нуждае от привилегии за да запази E2E ключовете върху диска. + ${app_name} се нуждае от привилегии за да запази E2E ключовете върху диска. \n \nПозволете достъп на следващия екран, за да може в бъдеще да експортирате ключовете си ръчно. В момента няма връзка с мрежата Това не е валиден адрес на Matrix сървър Потвърдете паролата - Не може да направите това от мобилно приложение на Element + Не може да направите това от мобилно приложение на ${app_name} Нужна е автентикация Интеграции Използвайте мениджър на интеграции за да управлявате ботове, връзки с други мрежи, приспособления и стикери. @@ -1450,7 +1660,6 @@ Адрес Премиум хостинг за организации Въведете адреса на Modular Element или на сървър, който искате да използвате - Въведете адреса на сървър или Element към който да се свържете Възникна грешка при зареждане на страницата: %1$s (%2$d) Приложението не може да влезе в този сървър. Сървъра поддържа следните методи за вход: %1$s. \n @@ -1549,7 +1758,7 @@ \nВлезте отново за да достъпите профила и съобщенията си. Ще загубите достъпа до защитените съобщения, освен ако не влезете за да възстановите ключовете за шифроване. Изчисти данните - Текущата сесия е за потребител %1$s, а вие сте въвели данни за вход за %2$s. Element не поддържа това. + Текущата сесия е за потребител %1$s, а вие сте въвели данни за вход за %2$s. ${app_name} не поддържа това. \nПърво изчистете данните, след това влезте отново с друг профил. matrix.to връзката ви беше невалидна Описанието е прекалено кратко @@ -1567,7 +1776,7 @@ Други устройства Показване само на първите резултати. Въведете още букви… Бърз-провал - Element може да забива по-често когато възникне неочаквана грешка + ${app_name} може да забива по-често когато възникне неочаквана грешка %1$s: %2$s %1$s: %2$s %3$s Съобщението беше изтрито @@ -1608,7 +1817,7 @@ Избор на звуково устройство Неуспешно установяване на връзка в реално време. \nПомолете администратора на сървъра да конфигурира TURN сървър, за да може разговорите да работят надеждно. - Свързването е неуспешно + Свързването е неуспешно Уведомления Успешно Копирай @@ -1650,9 +1859,9 @@ Тази сесия не може да сподели потвърждението с другите ви сесии. \nПотвърждението ще се съхрани локално и ще може да бъде споделено в бъдеща версия на приложението. Махни игнорирането - Element срещна проблем опитвайки се да визуализира съдържанието на събитие с идентификатор \'%1$s\' - Element не може да обработи събитие от тип \'%1$s\' - Element не може да обработва събития от тип \'%1$s\' + ${app_name} срещна проблем опитвайки се да визуализира съдържанието на събитие с идентификатор \'%1$s\' + ${app_name} не може да обработи събитие от тип \'%1$s\' + ${app_name} не може да обработва събития от тип \'%1$s\' Отиди на последното прочетено съобщение Собствено ниво (%1$d) в %2$s По подразбиране в %1$s @@ -1913,7 +2122,7 @@ Кръстосаното-подписване е включено. \nЧастните ключове са на устройството. Операцията е невъзможна. Сървърът е стар. - Този сървър за идентичност е стар. Element поддържа само API V2. + Този сървър за идентичност е стар. ${app_name} поддържа само API V2. Прекъснете връзката със сървъра за идентичност %s\? Отворете условията за %s Зареждане на наличните езици… @@ -1937,7 +2146,6 @@ Проверете тази връзка отново Изберете парола. Изберете потребителско име. - Извинявайте, тази операция все още не е възможна за профили свързани чрез Single-Sign-On. Маркирай като доверен Потвърдете самоличността си потвърждавайки този вход, давайки му достъп до шифрованите съобщения. Потвърдете самоличността си потвърждавайки този вход от някоя от другите ви сесии, давайки му достъп до шифрованите съобщения. @@ -1965,13 +2173,13 @@ За да продължите, използвайте %1$s или %2$s. Поддържа се само в шифровани стаи Принудително премахва текущата изходяща групова сесия от шифрованата стая - Използвайте последната версия на Element за устройствата си: + Използвайте последната версия на ${app_name} за устройствата си: или друг Matrix клиент поддържаш кръстосано-подписване - Element iOS -\nElement Android - Element Web -\nElement Desktop - Използвайте последната версия на Element за устройствата си (Element Web, Element Desktop, Element iOS, Element за Android) или друг Matrix клиент поддържаш кръстосано-подписване + ${app_name} iOS +\n${app_name} Android + ${app_name} Web +\n${app_name} Desktop + Използвайте последната версия на ${app_name} за устройствата си (${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} за Android) или друг Matrix клиент поддържаш кръстосано-подписване Промяна на паролата за профила… Неуспешно съхраняване на медиен файл Неуспешно добавяне на медиен файл в галерията @@ -2083,19 +2291,19 @@ Обнови Разблокирай шифрованата история на съобщенията Заявки за ключове - Element за Android + ${app_name} за Android Ключовете вече са обновени! Връзката беше с грешен формат Неуспешно откриване на стаята. Потвърдете, че съществува. Не можете да отворите стаи, от които сте били блокирани. Потвърждение на PIN код, за да изключване на PIN кода - PIN код се изисква всеки път когато отворите Element. - Изисква се PIN код след 2 минути неизползване на Element. + PIN код се изисква всеки път когато отворите ${app_name}. + Изисква се PIN код след 2 минути неизползване на ${app_name}. Изисквай PIN код след 2 минути Показвай само броя непрочетени съобщения в опростено уведомление. Показвай подробности, като имена на стаи и съдържание на съобщенията. Показвай съдържанието в уведомленията - PIN кодът е единственият начин да отключите Element. + PIN кодът е единственият начин да отключите ${app_name}. Включване на биометрични данни поддържани от устройството, като пръстов отпечатък и разпознаване на лица. Включване на биометрични данни Ако искате да нулирате PIN кода си, натиснете Забравен PIN код, за да излезете от профила и да го нулирате. @@ -2131,11 +2339,10 @@ Телефонния указател е празен Добави от телефонния указател Запази ключа за възстановяване в - element - НАУЧИ ПОВЕЧЕ - РАЗБРАХ - Развълнувани сме да съобщим, че променихме името! Приложението ви е обновено и сте вписани в профила си. - Riot вече е Element! + НАУЧИ ПОВЕЧЕ + РАЗБРАХ + Развълнувани сме да съобщим, че променихме името! Приложението ви е обновено и сте вписани в профила си. + Riot вече е Element! Изчакване на история на шифроването Не можете да достъпите това съобщение, защото изпращача нарочно не е изпратил ключовете за него Не можете да достъпите това съобщение, защото изпращача не се доверява на сесията ви @@ -2177,7 +2384,7 @@ Сървърът ви (%1$s) предлага използването на %2$s за сървър за идентичност Няма асоциация с текущия идентификатор. Асоциацията беше неуспешна. - За вашата поверителност, Element поддържа изпращането на адреси и телефонни номера на потребители само в хеширан вид. + За вашата поверителност, ${app_name} поддържа изпращането на адреси и телефонни номера на потребители само в хеширан вид. Първо приемете условията за сървъра за идентичност от Настройки. Конфигурирайте сървъра си за идентичност. Отхвърляне на промените diff --git a/vector/src/main/res/values-bn-rIN/strings.xml b/vector/src/main/res/values-bn-rIN/strings.xml index afb13b26f0..0fd00b03fe 100644 --- a/vector/src/main/res/values-bn-rIN/strings.xml +++ b/vector/src/main/res/values-bn-rIN/strings.xml @@ -1,10 +1,198 @@ + %1$s একটি ফটো পাঠিয়েছে। + %1$s একটি স্তিকার পাঠিয়েছে। + %s এর আমন্ত্রণ + %1$s %2$s কে আমন্ত্রণ করেছে + %1$s আপনাকে আমন্ত্রণ করেছে + %1$s রুম এ যোগ দিয়েছে + %1$s রুম ছেড়ে দিয়েছে + %1$s আমন্ত্রণ টি বাতিল করেছে + %1$s %2$s কে কিক করেছে + %1$s %2$s কে নিষিদ্ধ তালিকা থেকে মুক্ত করেছে + %1$s %2$s কে নিষিদ্ধ করেছে + %1$s %2$s এর আমন্ত্রণ ফেরত নিয়েছে + %1$s নিজের অবতার পরিবর্তন করেছে + %1$s নিজের প্রদর্শন নাম %2$s রেখেছে + %1$s নিজের প্রদর্শন নাম %2$s থেকে %3$s তে পরিবর্তন করেছে + %1$s নিজের প্রদর্শন নাম মুছে দিয়েছে (%2$s) + %1$s বিষয় টি এতে পরিবর্তন করেছে: %2$s + %1$s রুম এর নাম এতে পরিবর্তন করেছে: %2$s + %s একটি ভিডিও কল স্থাপন করেছিল। + %s একটি ভয়েস কল দিয়েছে। + %1$s: %2$s + আপনি একটি ছবি প্রেরণ করেছেন। + আপনি একটি স্তিকার পাঠিয়েছেন। + আপনার আমন্ত্রণ + %1$s কক্ষটি তৈরি করেছেন + আপনি কক্ষটি তৈরি করেছেন + আপনি %1$s কে আমন্ত্রিত করেছেন + আপনি কক্ষে যোগ দিয়েছেন + আপনি কক্ষ ছেড়ে দিয়েছেন + আপনি আমন্ত্রণটি বাতিল করেছেন + আপনি %1$s কে কীক করেছেন + আপনি %1$s কে নিষিদ্ধ মুক্ত করেছেন + আপনি %1$s কে নিষিদ্ধ করেছেন + আপনি %1$s এর আমন্ত্রণ প্রত্যাহার করেছেন + আপনি আপনার অবতারটি পরিবর্তন করেছেন + আপনি আপনার প্রদর্শনের নামটি %1$s তে সেট করেছেন + আপনি আপনার প্রদর্শনের নামটি %1$s থেকে %2$s এ পরিবর্তন করেছেন + আপনি আপনার প্রদর্শনের নামটি সরিয়ে দিয়েছেন (যেটা ছিল %1$s) + আপনি বিষয়টিকে এতে পরিবর্তন করেছেন: %1$s + %1$s কক্ষের অবতারটি পরিবর্তন করেছে + আপনি কক্ষের অবতারটি পরিবর্তন করেছেন + আপনি কক্ষের নাম এতে পরিবর্তন করেছেন:%1$s + আপনি একটি ভিডিও কল করেছেন। + আপনি একটি ভয়েস কল দিয়েছেন। + কল সেটআপ করার জন্য %s ডেটা প্রেরণ করেছে। + আপনি কল সেটআপ করার জন্য ডেটা প্রেরণ করেছেন। + %s কলটির উত্তর দিয়েছে। + আপনি কলটি উত্তর দিয়েছেন। + %s কলটি শেষ করেছেন। + আপনি কলটি শেষ করেছেন। + %1$s ভবিষ্যতের ঘরের ইতিহাস %2$s এর কাছে দৃশ্যমান করে তুলেছে + আপনি ভবিষ্যতের কক্ষ ইতিহাস %1$s এর কাছে দৃশ্যমান করেছেন + কক্ষের সমস্ত সদস্য, যখন থেকে তারা আমন্ত্রিত। + কক্ষের সমস্ত সদস্য, যখন থেকে তারা যোগদান করেছিল। + সমস্ত কক্ষের সদস্য। + যে কেউ। + অজানা (%s)। + %1$s এন্ড-টু-এন্ড এনক্রিপশন চালু করেছে (%2$s) + আপনি শেষ-থেকে-শেষ এনক্রিপশন চালু করেছেন (%1$s) + %s এই কক্ষটিকে আপগ্রেড করেছে। + আপনি এই কক্ষটি আপগ্রেড করেছেন। + %1$s একটি ভিওআইপি সম্মেলনের জন্য অনুরোধ করেছে + আপনি একটি ভিওআইপি সম্মেলনের অনুরোধ করেছেন + ভিওআইপি সম্মেলন শুরু হয়েছে + ভিওআইপি সম্মেলন শেষ হয়েছে + (আবতারটিও পরিবর্তন করা হয়েছিল) + %1$s কক্ষের নাম সরিয়েছে + আপনি কক্ষের নাম সরিয়েছেন + %1$s কক্ষের বিষয় মুছে ফেলেছে + আপনি কক্ষের বিষয়টিকে সরিয়ে দিয়েছেন + %1$s কক্ষের অবতার সরিয়ে নিয়েছে + আপনি কক্ষের অবতার সরিয়েছেন + বার্তা সরানো হয়েছে + %1$s দ্বারা বার্তা সরানো হয়েছে + বার্তা সরানো হয়েছে [কারণ:%1$s] + %1$s দ্বারা বার্তা সরানো হয়েছে [কারণ: %2$s] + %1$s তাদের প্রোফাইল %2$s আপডেট করেছে + আপনি আপনার প্রোফাইল %1$s আপডেট করেছেন + %1$s %2$s কে ঘরে যোগদানের জন্য একটি আমন্ত্রণ পাঠিয়েছে + আপনি %1$s কে ঘরে যোগদানের জন্য একটি আমন্ত্রণ প্রেরণ করেছেন + %1$s %2$s এর কক্ষে যোগদানের আমন্ত্রণ বাতিল করে দিয়েছিল + আপনি %1$s এর কক্ষে যোগদানের জন্য আমন্ত্রণটি বাতিল করেছেন + %1$s %2$s এর জন্য আমন্ত্রণটি গ্রহণ করেছে + আপনি %1$s এর জন্য আমন্ত্রণটি গ্রহণ করেছেন + %1$s %2$s উইজেট যুক্ত করেছে + আপনি %1$s উইজেট যুক্ত করেছেন + %1$s %2$s উইজেট সরিয়ে দিয়েছেন + আপনি %1$s উইজেট সরিয়েছেন + %1$s %2$s উইজেট পরিবর্তন করেছেন + আপনি %1$s উইজেট পরিবর্তন করেছেন + অ্যাডমিন + নিয়ামক + ডিফল্ট + কাস্টম (%1$d) + কাস্টম + আপনি %1$s এর পাওয়ার স্তর পরিবর্তন করেছেন। + %1$s %2$s এর পাওয়ার স্তর পরিবর্তন করেছে। + %1$s %2$s থেকে %3$s পর্যন্ত + ** ডিক্রিপ্ট করতে অক্ষম: %s ** + প্রেরকের ডিভাইস আমাদের এই বার্তার জন্য কীগুলি প্রেরণ করেনি। + পুনরায় প্রতিক্রিয়া করতে পারেনি + বার্তা পাঠাতে অক্ষম + চিত্র আপলোড করতে ব্যর্থ + নেটওয়ার্ক ত্রুটি + ম্যাট্রিক্স ত্রুটি + খালি কক্ষে পুনরায় যোগদান করা বর্তমানে সম্ভব নয়। + ইমেল ঠিকানা + ফোন নম্বর + %s থেকে আমন্ত্রণ করুন + কক্ষ আমন্ত্রণ + %1$s এবং %2$s + + %1$s এবং অন্য ১ জন + %1$s এবং অন্যান্য %2$d জন + + খালি কক্ষ + প্রাথমিক সিঙ্ক: +\nঅ্যাকাউন্ট আমদানি করা হচ্ছে… + প্রাথমিক সিঙ্ক: +\nক্রিপ্টো আমদানি হচ্ছে + প্রাথমিক সিঙ্ক: +\nকক্ষগুলি আমদানি করা হচ্ছে + প্রাথমিক সিঙ্ক: +\nযোগ করা কক্ষগুলিতে আমদানি করা হিচ্ছে + প্রাথমিক সিঙ্ক: +\nআমন্ত্রিত করা কক্ষগুলিতে আমদানি করা হিচ্ছে + প্রাথমিক সিঙ্ক: +\nছেড়ে দেওয়া কক্ষগুলিতে আমদানি করা হিচ্ছে + প্রাথমিক সিঙ্ক: +\nসম্প্রদায়গুলি আমদানি করা হচ্ছে + প্রাথমিক সিঙ্ক: +\nঅ্যাকাউন্ট ডেটা আমদানি করা হচ্ছে + বার্তা প্রেরণ করা হচ্ছে … + প্রেরণ সারি পরিষ্কার করুন + %1$s এর আমন্ত্রণ। কারণ: %2$s + আপনার আমন্ত্রণ। কারণ: %1$s + %1$s আমন্ত্রিত করেছেন %2$s কে। কারণ: %3$s + আপনি %1$s কে আমন্ত্রিত করেছেন। কারণ: %2$s + %1$s আপনাকে আমন্ত্রণ করেছে। কারণ: %2$s + %1$s রুম এ যোগ দিয়েছে। কারণ: %2$s + আপনি কক্ষে যোগ দিয়েছেন। কারণ: %1$s + %1$s রুম ছেড়ে দিয়েছে। কারণ: %2$s + আপনি কক্ষ ছেড়ে দিয়েছেন। কারণ: %1$s + %1$s আমন্ত্রণ বাতিল করেছেন। কারণ: %2$s + আপনি আমন্ত্রণটি বাতিল করেছেন। কারণ: %1$s + %1$s %2$s কে কিক করেছে। কারণ: %3$s + আপনি %1$s কে কীক করেছেন। কারণ: %2$s + %1$s %2$s কে নিষিদ্ধ তালিকা থেকে মুক্ত করেছে। কারণ: %3$s + আপনি %1$s কে নিষিদ্ধ মুক্ত করেছেন। কারণ: %2$s + %1$s %2$s কে নিষিদ্ধ করেছে। কারণ: %3$s + আপনি %1$s কে নিষিদ্ধ করেছেন। কারণ: %2$s + %1$s রুমের সাথে যোগ দিতে %2$s কে একটি আমন্ত্রণ পাঠিয়েছেন। কারণ: %3$s + আপনি %1$s কে ঘরে যোগদানের জন্য একটি আমন্ত্রণ প্রেরণ করেছেন। কারণ: %2$s + %1$s %2$s এর কক্ষে যোগদানের আমন্ত্রণ বাতিল করে দিয়েছিল। কারণ: %3$s + আপনি %1$s এর কক্ষে যোগদানের জন্য আমন্ত্রণটি বাতিল করেছেন। কারণ: %2$s + %1$s %2$s এর জন্য আমন্ত্রণ গ্রহণ করেছেন। কারণ: %3$s + আপনি %1$s এর জন্য আমন্ত্রণটি গ্রহণ করেছেন। কারণ: %2$s + %1$s %2$s এর আমন্ত্রণ ফেরত নিয়েছে। কারণ: %3$s + আপনি %1$s এর আমন্ত্রণ প্রত্যাহার করেছেন। কারণ: %2$s + + %1$s এই ঘরের ঠিকানা হিসাবে %2$s যুক্ত করেছে। + %1$s এই ঘরের ঠিকানাগুলি হিসাবে %2$s যুক্ত করেছে। + + + আপনি এই কক্ষের জন্য ঠিকানা হিসাবে %1$s যুক্ত করেছেন। + আপনি এই কক্ষের ঠিকানা হিসাবে %1$s যুক্ত করেছেন। + + + %1$s এই ঘরের ঠিকানা হিসাবে %2$s সরানো হয়েছে। + %1$s %3$s কে এই ঘরের ঠিকানা হিসাবে সরানো হয়েছে। + + + আপনি এই ঘরের ঠিকানা হিসাবে %1$s সরিয়েছেন। + আপনি এই ঘরের ঠিকানা হিসাবে %1$s গুলি সরিয়েছেন। + + %1$s %2$s যোগ করেছে এবং %3$s গুলি এই ঘরের ঠিকানা হিসাবে সরানো হয়েছে। + আপনি %1$s যোগ করেছেন এবং %2$s কে এই ঘরের ঠিকানা হিসাবে সরিয়ে দিয়েছেন। + %1$s এই ঘরের মূল ঠিকানাটি %2$s তে সেট করে। + আপনি এই ঘরের মূল ঠিকানাটি %1$s তে সেট করেছেন। + %1$s এই ঘরের মূল ঠিকানা সরিয়ে নিয়েছে। + আপনি এই ঘরের মূল ঠিকানা সরিয়েছেন। + %1$s অতিথিদের ঘরে যোগদানের অনুমতি দিয়েছে। + আপনি অতিথিদের ঘরে যোগদানের অনুমতি দিয়েছেন। + %1$s অতিথিদের ঘরে যোগদান করতে বাধা দিয়েছে। + আপনি অতিথিদের ঘরে যোগদান করতে বাধা দিয়েছেন। + %1$s এন্ড-টু-এন্ড এনক্রিপশন চালু করেছে। + আপনি শেষ থেকে শেষ এনক্রিপশন চালু করেছেন। + %1$s এন্ড-টু-এন্ড এনক্রিপশন চালু করেছে (অজানা অ্যালগরিদম %2$s)। + আপনি শেষ-থেকে-শেষ এনক্রিপশন চালু করেছেন (অজানা অ্যালগরিদম %1$s )। হালকা থিম গাঢ় থিম - কালো থিম - Status.im থিম + কালো থিম সিংক্রোনাইজ হচ্ছে… ইভেন্টের জন্য শোনা হচ্ছে @@ -121,7 +309,7 @@ ব্যবহারকারী ডিরেক্টরি শুধুমাত্র ম্যাট্রিক্সের যোগাযোগগুলি "কথাবার্তা নেই " - আপনি রায়টকে আপনার স্থানীয় পরিচিতি অ্যাক্সেস করার অনুমতি দেয় নি + আপনি রায়টকে আপনার স্থানীয় পরিচিতি অ্যাক্সেস করার অনুমতি দেয় নি কোন ফলাফল নেই রুমগুলি @@ -261,7 +449,7 @@ চাবির অনুরোধ পাঠানো। অনুরোধ পাঠানো - দয়া করে শুরু করুন Element অন্য সেশান যেটা পারে বর্ণনা করতে বার্তা কে সুতরাং এটা পারে পাঠাতে চাবিগুলো কে যন্ত্র তে. + দয়া করে শুরু করুন ${app_name} অন্য সেশান যেটা পারে বর্ণনা করতে বার্তা কে সুতরাং এটা পারে পাঠাতে চাবিগুলো কে যন্ত্র তে. পড়ো প্রাপ্তিগুলি সারি @@ -290,7 +478,7 @@ ঘরএর বিষয় ডাকা - ব্যবহার করছেন অনুপস্থিত Element রিংটোন আগামী ডাক এর জন্য + ব্যবহার করছেন অনুপস্থিত ${app_name} রিংটোন আগামী ডাক এর জন্য আসা কল এর রিংটোন নির্বাচন করুন রিংটোন কল আর জন্য: @@ -314,22 +502,22 @@ পারছেন না দৃশ্য নথি করতে তথা - Element এর প্রয়াজন অনুমতি নিতে আপনার ছবি এবং দৃশ্য রেকর্ড কে গ্রন্থাগার থেকে পাঠিয়ে জমার জায়গায় সংযুক্ত করতে। + ${app_name} এর প্রয়াজন অনুমতি নিতে আপনার ছবি এবং দৃশ্য রেকর্ড কে গ্রন্থাগার থেকে পাঠিয়ে জমার জায়গায় সংযুক্ত করতে। \nদেয়া করে অনুমতি দিন প্রবেশ করতে পরের pop-up কে যেটা সক্ষম আপনার নথি কে আপনার ফোন থেকে পাঠাতে। - Element এর প্রয়োজন অনুমতি নিয়ে প্রবেশে করতে আপনার ছবি তোলার যন্ত্র থেকে ছবি নিতে এবং দৃষ্টি রেকর্ড ডাকতে। + ${app_name} এর প্রয়োজন অনুমতি নিয়ে প্রবেশে করতে আপনার ছবি তোলার যন্ত্র থেকে ছবি নিতে এবং দৃষ্টি রেকর্ড ডাকতে। " \n \nদয়াকরে অনুমতি দিন প্রবেশ করাতে পরের পপ -আপ কে যেটা ডাকতে সক্ষম।" - Element এর প্রয়োজন অনুমতি নিয়ে প্রবেশ করতে আপনার মাইক্রোফোন আর মাধ্যমে শোনার কালএর সঞ্চালনা করতে। + ${app_name} এর প্রয়োজন অনুমতি নিয়ে প্রবেশ করতে আপনার মাইক্রোফোন আর মাধ্যমে শোনার কালএর সঞ্চালনা করতে। " \n \nদেয়া করে অনুমতিদিন প্রবেশ করতে পরের pop-up এ যেটা কল করতে সক্ষম।" সেবা আরম্ভ করা হচ্ছে - ভিডিও কল সম্পাদনের জন্য Element আপনার ক্যামেরা এবং আপনার মাইক্রোফোন অ্যাক্সেস করার অনুমতির প্রয়োজন। + ভিডিও কল সম্পাদনের জন্য ${app_name} আপনার ক্যামেরা এবং আপনার মাইক্রোফোন অ্যাক্সেস করার অনুমতির প্রয়োজন। \n \nকল করতে সক্ষম হতে পরবর্তী পপ আপ অ্যাক্সেস অনুমতি দিন। - রায়ট অন্যান্য ম্যাট্রিক্স ব্যবহারকারীদের তাদের ইমেল এবং ফোন নম্বরগুলির উপর ভিত্তি করে আপনার ঠিকানা বইটি চেক করতে পারে। আপনি যদি এই উদ্দেশ্যে আপনার ঠিকানা বইটি ভাগ করে নিতে সম্মত হন তবে দয়া করে পরবর্তী পপ-আপটিতে অ্যাক্সেসের অনুমতি দিন। - রায়ট অন্যান্য ম্যাট্রিক্স ব্যবহারকারীদের তাদের ইমেল এবং ফোন নম্বরগুলির উপর ভিত্তি করে আপনার ঠিকানা বইটি চেক করতে পারে। + রায়ট অন্যান্য ম্যাট্রিক্স ব্যবহারকারীদের তাদের ইমেল এবং ফোন নম্বরগুলির উপর ভিত্তি করে আপনার ঠিকানা বইটি চেক করতে পারে। আপনি যদি এই উদ্দেশ্যে আপনার ঠিকানা বইটি ভাগ করে নিতে সম্মত হন তবে দয়া করে পরবর্তী পপ-আপটিতে অ্যাক্সেসের অনুমতি দিন। + রায়ট অন্যান্য ম্যাট্রিক্স ব্যবহারকারীদের তাদের ইমেল এবং ফোন নম্বরগুলির উপর ভিত্তি করে আপনার ঠিকানা বইটি চেক করতে পারে। \n \nআপনি এই উদ্দেশ্যে আপনার ঠিকানা বই ভাগ করতে সম্মত হন\? @@ -563,8 +751,8 @@ সেশান সেটিংস। বিজ্ঞপ্তি এই সেশানের জন্য সক্রিয় করা হয়েছে। - বিজ্ঞপ্তি এই সেশানের জন্য অনুমতি দেওয়া হয় নি। -\nElement এর সেটিংস যাচাই করুন। + বিজ্ঞপ্তি এই সেশানের জন্য অনুমতি দেওয়া হয় নি। +\n${app_name} এর সেটিংস যাচাই করুন। সক্ষম কাস্টম সেটিংস। @@ -575,7 +763,7 @@ Play Services পরীক্ষা গুগল প্লে সার্ভিসেস APK পাওয়া গেছে এবং আপ টু ডেট রয়েছে। - Element পুশ বার্তার প্রদানের জন্য Google Play পরিষেবাদি ব্যবহার করে কিন্তু এটি সঠিকভাবে কনফিগার করা বলে মনে হচ্ছে না: + ${app_name} পুশ বার্তার প্রদানের জন্য Google Play পরিষেবাদি ব্যবহার করে কিন্তু এটি সঠিকভাবে কনফিগার করা বলে মনে হচ্ছে না: \n%1$s Play Services ঠিক করুন @@ -584,12 +772,12 @@ \n%1$s FCM টোকেন উদ্ধার করতে ব্যর্থ হয়েছে: \n%1$s - [%1$s] -\nএই ত্রুটিটি Element এর নিয়ন্ত্রণের বাইরে এবং Google এর মতে, এই ত্রুটিটি ইঙ্গিত করে যে ডিভাইসটিতে FCM এর সাথে নিবন্ধিত অনেকগুলি অ্যাপ্লিকেশন রয়েছে। ত্রুটিগুলি কেবলমাত্র অ্যাপ্লিকেশনের চরম সংখ্যাগুলিতে ঘটে থাকে, তাই এটি গড় ব্যবহারকারীকে প্রভাবিত করবে না। - [%1$s] -\nএই ত্রুটি Element এর নিয়ন্ত্রণের বাইরে। এটা বিভিন্ন কারণে ঘটতে পারে। আপনি পরে পুনরায় চেষ্টা করলে হয়তো এটি কাজ করবে, আপনি এটিও পরীক্ষা করতে পারেন যে Google Play পরিষেবাটি সিস্টেম সেটিংসে ডেটা ব্যবহারের ক্ষেত্রে সীমাবদ্ধ নয়, অথবা আপনার ডিভাইসের ঘড়ি সঠিক, বা এটি কাস্টম রমতে ঘটতে পারে। - [%1$s] -\nএই ত্রুটি Element এর নিয়ন্ত্রণের বাইরে। ফোনে কোন গুগল একাউন্ট নেই। অ্যাকাউন্ট ম্যানেজার খুলুন এবং একটি গুগল একাউন্ট যোগ করুন। + [%1$s] +\nএই ত্রুটিটি ${app_name} এর নিয়ন্ত্রণের বাইরে এবং Google এর মতে, এই ত্রুটিটি ইঙ্গিত করে যে ডিভাইসটিতে FCM এর সাথে নিবন্ধিত অনেকগুলি অ্যাপ্লিকেশন রয়েছে। ত্রুটিগুলি কেবলমাত্র অ্যাপ্লিকেশনের চরম সংখ্যাগুলিতে ঘটে থাকে, তাই এটি গড় ব্যবহারকারীকে প্রভাবিত করবে না। + [%1$s] +\nএই ত্রুটি ${app_name} এর নিয়ন্ত্রণের বাইরে। এটা বিভিন্ন কারণে ঘটতে পারে। আপনি পরে পুনরায় চেষ্টা করলে হয়তো এটি কাজ করবে, আপনি এটিও পরীক্ষা করতে পারেন যে Google Play পরিষেবাটি সিস্টেম সেটিংসে ডেটা ব্যবহারের ক্ষেত্রে সীমাবদ্ধ নয়, অথবা আপনার ডিভাইসের ঘড়ি সঠিক, বা এটি কাস্টম রমতে ঘটতে পারে। + [%1$s] +\nএই ত্রুটি ${app_name} এর নিয়ন্ত্রণের বাইরে। ফোনে কোন গুগল একাউন্ট নেই। অ্যাকাউন্ট ম্যানেজার খুলুন এবং একটি গুগল একাউন্ট যোগ করুন। একাউন্ট যোগ করুন টোকেন নিবন্ধন @@ -609,19 +797,19 @@ বুট করার সময় শুরু ডিভাইসটি পুনরায় চালু হলে পরিষেবা শুরু হবে। - ডিভাইসটি পুনরায় চালু হওয়ার সময় পরিষেবাটি শুরু হবে না, আপনি একবার Element টি খোলা না হওয়া পর্যন্ত বিজ্ঞপ্তি পাবেন না। + ডিভাইসটি পুনরায় চালু হওয়ার সময় পরিষেবাটি শুরু হবে না, আপনি একবার ${app_name} টি খোলা না হওয়া পর্যন্ত বিজ্ঞপ্তি পাবেন না। বুট থেকে শুরু করা সক্রিয় করুন ব্যাকগ্রাউন্ড এর সীমাবদ্ধতা চেক করুন - ব্যাকগ্রউন্ডের সীমাবদ্ধতা Element এর জন্য নিষ্ক্রিয় করা হয়েছে। এই পরীক্ষা মোবাইল ডেটা ব্যবহার করে চালানো উচিত (ওয়াইফাই না)। + ব্যাকগ্রউন্ডের সীমাবদ্ধতা ${app_name} এর জন্য নিষ্ক্রিয় করা হয়েছে। এই পরীক্ষা মোবাইল ডেটা ব্যবহার করে চালানো উচিত (ওয়াইফাই না)। \n%1$s - ব্যাকগ্রউন্ডের সীমাবদ্ধতা রিমোট এর জন্য সক্রিয় করা হয়েছে। + ব্যাকগ্রউন্ডের সীমাবদ্ধতা রিমোট এর জন্য সক্রিয় করা হয়েছে। \nঅ্যাপ্লিকেশন যেটি করার চেষ্টা করে সেটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় আক্রমনাত্মকভাবে সীমিত হবে এবং এটি বিজ্ঞপ্তিগুলিতে প্রভাবিত হতে পারে। \n%1$s সীমাবদ্ধগুলি নিষ্ক্রিয় ব্যাটারি অপ্টিমাইজেশান - Element ব্যাটারি অপ্টিমাইজেশান দ্বারা প্রভাবিত হয় না। + ${app_name} ব্যাটারি অপ্টিমাইজেশান দ্বারা প্রভাবিত হয় না। যদি কোনও ব্যবহারকারী কোনও ডিভাইসটিকে নির্দিষ্ট সময়ের জন্য আনপ্লাগ এবং স্থিতিশীল রাখে তবে স্ক্রীন বন্ধের সাথে ডিভাইসটি ডোজ মোডে প্রবেশ করে। এটি অ্যাপ্লিকেশানগুলিকে নেটওয়ার্ক অ্যাক্সেস করতে বাধা দেয় এবং তাদের কাজ, সিঙ্ক এবং মান অ্যালার্মগুলি স্থগিত করে। "অপ্টিমাইজেশান অবহেলা " @@ -749,19 +937,19 @@ আমার একাউন্ট নিষ্ক্রিয় করুন বিজ্ঞপ্তি\'র গোপনীয়তা - সুরক্ষিতভাবে এবং ব্যক্তিগতভাবে আপনার বিজ্ঞপ্তি পরিচালনা করতে Element পটভূমিতে চালাতে পারে। এই ব্যাটারি ব্যবহার প্রভাবিত হতে পারে। + সুরক্ষিতভাবে এবং ব্যক্তিগতভাবে আপনার বিজ্ঞপ্তি পরিচালনা করতে ${app_name} পটভূমিতে চালাতে পারে। এই ব্যাটারি ব্যবহার প্রভাবিত হতে পারে। অনুমতি প্রদান করুন অন্য বিকল্প চয়ন করুন পটভূমি সংযোগ - নির্ভরযোগ্য বিজ্ঞপ্তি পেতে Element কম প্রভাব ব্যাকগ্রাউন্ড সংযোগ রাখা প্রয়োজন। + নির্ভরযোগ্য বিজ্ঞপ্তি পেতে ${app_name} কম প্রভাব ব্যাকগ্রাউন্ড সংযোগ রাখা প্রয়োজন। \nপরবর্তী স্ক্রিনে আপনাকে দাঙ্গাটি সর্বদা ব্যাকগ্রাউন্ডে চালানোর অনুমতি দেওয়া হবে, দয়া করে স্বীকার করুন। অনুমতি প্রদান করুন বৈশ্লেষিক ন্যায় বিশ্লেষণ তথ্য পাঠান - Element আমাদের অ্যাপ্লিকেশন উন্নত করার অনুমতি দেওয়ার জন্য বেনামী বিশ্লেষণ সংগ্রহ করে। - আমাদের Element উন্নত করতে সাহায্য করার জন্য বিশ্লেষণ সক্রিয় করুন। + ${app_name} আমাদের অ্যাপ্লিকেশন উন্নত করার অনুমতি দেওয়ার জন্য বেনামী বিশ্লেষণ সংগ্রহ করে। + আমাদের ${app_name} উন্নত করতে সাহায্য করার জন্য বিশ্লেষণ সক্রিয় করুন। হ্যাঁ, আমি সাহায্য করতে চাই! ডেটা সংরক্ষণ মোড @@ -1101,10 +1289,10 @@ পটভূমি সিঙ্ক মোড (পরীক্ষামূলক) ব্যাটারির জন্য অনুকূলিত - রায়ট এমনভাবে পটভূমিতে সিঙ্ক হবে যা ডিভাইসের সীমিত সংস্থান (ব্যাটারি) সংরক্ষণ করে। + রায়ট এমনভাবে পটভূমিতে সিঙ্ক হবে যা ডিভাইসের সীমিত সংস্থান (ব্যাটারি) সংরক্ষণ করে। \nআপনার ডিভাইস রিসোর্স স্থিতির উপর নির্ভর করে সিঙ্কটি অপারেটিং সিস্টেম দ্বারা পিছিয়ে যেতে পারে। রিয়েল টাইম জন্য অনুকূলিত - রায়ট নির্দিষ্ট সময়ে সময়ে পটভূমিতে সিঙ্ক হবে (কনফিগারযোগ্য)। + রায়ট নির্দিষ্ট সময়ে সময়ে পটভূমিতে সিঙ্ক হবে (কনফিগারযোগ্য)। \nএটি রেডিও এবং ব্যাটারির ব্যবহারকে প্রভাবিত করবে, রায়ট ইভেন্টগুলি শুনছে বলে জানিয়ে একটি স্থায়ী বিজ্ঞপ্তি প্রদর্শিত হবে। কোনও পটভূমি সিঙ্ক না অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় আপনাকে আগত বার্তাগুলি সম্পর্কে অবহিত করা হবে না। @@ -1248,7 +1436,7 @@ সাফল্য বিজ্ঞপ্তিগুলি - এলিমেন্ট কল ব্যর্থ + এলিমেন্ট কল ব্যর্থ রিয়েল টাইম সংযোগ স্থাপন করতে ব্যর্থ। \nকলগুলি নির্ভরযোগ্যতার সাথে কাজ করার জন্য দয়া করে আপনার হোমসার্ভারের প্রশাসককে একটি টার্ন সার্ভার কনফিগার করতে বলুন। @@ -1345,7 +1533,7 @@ দয়া করে একটি পাসফ্রেজ লিখুন পাসফ্রেজটি খুব দুর্বল - আপনি যদি এলিমেন্টটি পুনরুদ্ধার কী তৈরি করতে চান তবে দয়া করে পাসফ্রেজটি মুছুন। + আপনি যদি এলিমেন্টটি পুনরুদ্ধার কী তৈরি করতে চান তবে দয়া করে পাসফ্রেজটি মুছুন। কোনও ম্যাট্রিক্স সেশন উপলব্ধ নেই এনক্রিপ্ট করা বার্তাগুলি কখনই হারাবেন না diff --git a/vector/src/main/res/values-bs/strings.xml b/vector/src/main/res/values-bs/strings.xml index 21c429d69c..8628a56a26 100644 --- a/vector/src/main/res/values-bs/strings.xml +++ b/vector/src/main/res/values-bs/strings.xml @@ -1,8 +1,12 @@ + Pozovite iz %s + Poziv u Sobu + %1$s i %2$s + Prazna soba Svijetla Tema Tamna Tema - Crna Tema + Crna Tema Sinkronizacija Budući Događaji Glasne notifikacije @@ -72,7 +76,7 @@ Imenik korisnika Samo matriks kontakti Nema razgovora - Niste omogućili Elementu pristup vašim lokalnim kontaktima + Niste omogućili ${app_name}u pristup vašim lokalnim kontaktima Nema rezultata Sobe Imenik soba @@ -196,24 +200,24 @@ Odjavljeni ste sa svih uređaja i više nećete primati obavijesti. Da biste pon Snimi fotografiju ili video Nije moguće snimiti video Informacije - Hepek treba dopuštenje za pristup vašoj biblioteci fotografija i videozapisa za slanje i spremanje privitaka. + Hepek treba dopuštenje za pristup vašoj biblioteci fotografija i videozapisa za slanje i spremanje privitaka. Omogućite pristup sljedećem skočnom prozoru da biste mogli slati datoteke sa telefona. - Hepek treba dopuštenje za pristup vašoj kameri za snimanje fotografija i videopoziva. + Hepek treba dopuštenje za pristup vašoj kameri za snimanje fotografija i videopoziva. Omogućite pristup sljedećem pop-upu kako biste mogli uputiti poziv. - Hepek traži dopuštenje za pristup mikrofonu za obavljanje audio poziva. + Hepek traži dopuštenje za pristup mikrofonu za obavljanje audio poziva. Omogućite pristup sljedećem pop-upu kako biste mogli uputiti poziv. - Hepek treba dopuštenje za pristup vašoj kemeri i mikrofonu za obavljanje video poziva. + Hepek treba dopuštenje za pristup vašoj kemeri i mikrofonu za obavljanje video poziva. Omogućite pristup sljedećim skočnim prozorima da biste mogli uspostaviti poziv. - Hepek treba dopuštenje za pristup kontaktima kako bi pronašao druge Matrix korisnike na temelju njihove email adrese i telefonskih brojeva. + Hepek treba dopuštenje za pristup kontaktima kako bi pronašao druge Matrix korisnike na temelju njihove email adrese i telefonskih brojeva. Dopustite pristup sljedećem skočnom prozoru da biste otkrili kontakte koji koriste Hepek. - Hepek treba dopuštenje za pristup kontaktima kako bi pronašao druge Matrix korisnike na temelju njihove email adrese i telefonskih brojeva. + Hepek treba dopuštenje za pristup kontaktima kako bi pronašao druge Matrix korisnike na temelju njihove email adrese i telefonskih brojeva. Želite li dopustiti da Hepek pristupi vašim kontaktima? Nažalost, akcija nije izvršena zbog nedostatka dozvola diff --git a/vector/src/main/res/values-ca/strings.xml b/vector/src/main/res/values-ca/strings.xml index 20eb222f83..8e99a0a924 100644 --- a/vector/src/main/res/values-ca/strings.xml +++ b/vector/src/main/res/values-ca/strings.xml @@ -1,9 +1,272 @@ + %1$s: %2$s + %1$s ha enviat una imatge. + %1$s ha marxat de la sala + %1$s s\'ha unit a la sala + Número de telèfon + Correu electrònic + invitació de %s + %1$s ha convidat a %2$s + %1$s t\'ha convidat + %1$s ha rebutjat la invitació + %1$s ha expulsat %2$s + %1$s ha canviat el seu àlies de %2$s a %3$s + %1$s ha eliminat el àlies (era %2$s) + %1$s ha canviat el tema a: %2$s + %1$s ha canviat el nom de la sala a: %2$s + %s ha respost a la trucada. + %s ha finalitzat la trucada. + tots el participants de la sala, des de que són convidats. + tots els participants de la sala. + desconegut (%s). + %1$s ha activat el xifrat d\'extrem a extrem (%2$s) + %1$s ha sol·licitat una conferència VoIP + %1$s ha tret el vet a %2$s + %1$s ha vetat %2$s + %1$s ha retirat la invitació de %2$s + %1$s ha canviat la seva icona + %1$s ha establert la visibilitat de l\'històric futur de la sala a %2$s + tots els participants de la sala, des de que s\'hi uneixen. + qualsevol. + S\'ha iniciat la conferència VoIP + Ha finalitzat la conferència VoIP + (també ha canviat la icona) + %1$s ha eliminat el nom de la sala + %1$s ha eliminat el tema de la sala + %1$s ha actualitzat el seu perfil %2$s + %1$s ha enviat una invitació a %2$s perquè s\'uneixi a la sala + %1$s ha acceptat la invitació de %2$s + ** No s\'ha pogut desxifrar: %s ** + El dispositiu del remitent no ens ha enviat les claus per aquest missatge. + No s\'ha pogut redactar + No s\'ha pogut enviar el missatge + No s\'ha pogut pujar la imatge + Error de xarxa + Error de Matrix + Ara per ara no és possible tornar a unir-se a una sala buida. + %1$s a canviat el seu àlies a %2$s + %s ha realitzat una videotrucada. + %s ha realitzat una trucada de veu. + + Invitació de %s + Convida a la sala + %1$s i %2$s + Sala buida + + %1$s i 1 altre + %1$s i %2$d altres + + %1$s ha enviat un adhesiu. + %s s\'ha actualitzat aquí. + Ho has actualitzat aquí. + Has activat el xifrat d\'extrem a extrem (algorisme %1$s no reconegut). + %1$s ha activat el xifrat d\'extrem a extrem (algorisme %2$s no reconegut). + Has activat el xifrat d\'extrem a extrem. + %1$s ha activat el xifrat d\'extrem a extrem. + Has impedit que els convidats es puguin unir a la sala. + %1$s ha impedit que els convidats es puguin unir a la sala. + Has impedit que els convidats es puguin unir a la sala. + %1$s ha impedit que els convidats es puguin unir a la sala. + Has permès que els convidats s\'uneixin aquí. + %1$s ha permès que els convidats s\'uneixin aquí. + Has permès que els convidats s\'uneixin a la sala. + %1$s ha permès que els convidats s\'uneixin a la sala. + Has eliminat l\'adreça principal d\'aquesta sala. + %1$s ha eliminat l\'adreça principal d\'aquesta sala. + Has establert l\'adreça principal d\'aquesta sala a %1$s. + %1$s ha establert l\'adreça principal d\'aquesta sala a %2$s. + Has afegit %1$s i has eliminat %2$s d\'aquesta sala (adreces). + %1$s ha afegit %2$s i ha eliminat %3$s d\'aquesta sala (adreces). + + Has eliminat l\'adreça %1$s d\'aquesta sala. + Has eliminat les adreces %1$s d\'aquesta sala. + + + %1$s ha eliminat %2$s com a adreça d\'aquesta sala. + %1$s ha eliminat %2$s com a adreces d\'aquesta sala. + + + Has afegit l\'adreça %1$s a aquesta sala. + Has afegit les adreces %1$s a aquesta sala. + + + %1$s ha afegit l\'adreça %2$s a aquesta sala. + %1$s ha afegit les adreces %2$s a aquesta sala. + + Has revocat la invitació de %1$s perquè s\'uneixi a la sala. Motiu: %2$s + %1$s ha revocat la invitació de %2$s perquè s\'uneixi a la sala. Motiu: %3$s + Has revocat la invitació de %1$s + %1$s ha revocat la invitació de %2$s + Has revocat la invitació de %1$s perquè s\'uneixi a la sala + %1$s ha revocat la invitació de %2$s perquè s\'uneixi a la sala + Has retirat la invitació de %1$s. Motiu: %2$s + %1$s ha retirat la invitació de %2$s. Motiu: %3$s + Has acceptat la invitació de %1$s. Motiu: %2$s + %1$s ha acceptat la invitació de %2$s. Motiu: %3$s + Has enviat una invitació a %1$s perquè s\'uneixi a la sala. Motiu: %2$s + %1$s ha enviat una invitació a %2$s perquè s\'uneixi a la sala. Motiu: %3$s + Has vetat %1$s. Motiu: %2$s + %1$s ha vetat %2$s. Motiu: %3$s + Has tret el vet a %1$s. Motiu: %2$s + %1$s ha tret el vet a %2$s. Motiu: %3$s + Has vetat %1$s + Has marxat de la sala. Motiu: %1$s + %1$s ha marxat de la sala. Motiu: %2$s + Has marxat de la sala + %1$s ha marxat de la sala + Has marxat de la sala + Has expulsat %1$s + Has expulsat %1$s. Motiu: %2$s + %1$s ha expulsat %2$s. Motiu: %3$s + Has rebutjat la invitació. Motiu: %1$s + %1$s ha rebutjat la invitació. Motiu: %2$s + Has marxat. Motiu: %1$s + %1$s ha marxat. Motiu: %2$s + T\'has unit. Motiu: %1$s + %1$s s\'ha unit. Motiu: %2$s + T\'has unit a la sala. Motiu: %1$s + %1$s s\'ha unit a la sala. Motiu: %2$s + %1$s t\'ha convidat. Motiu: %2$s + Has convidat %1$s. Motiu: %2$s + %1$s ha convidat %2$s. Motiu: %3$s + La teva invitació. Motiu: %1$s + la invitació de %1$s. Motiu: %2$s + Esborra la cua d\'enviament + Enviant missatge… + Sincronització inicial: +\nImportant dades del compte + Sincronització inicial: +\nImportant comunitats + Sincronització inicial: +\nImportant sales que deixat + Sincronització inicial: +\nImportant compte… + Sincronització inicial: +\nImportant xifrat + Sincronització inicial: +\nImportant sales + Sincronització inicial: +\nImportant sales on hi estàs convidat + Sincronització inicial: +\nImportant sales on hi estàs unit + %1$s de %2$s a %3$s + %1$s ha canviat el nivell d\'autoritat de %2$s. + Has canviat el nivell d\'autoritat de %1$s. + Personalitzat + Personalitzat (%1$d) + Predeterminat + Moderador + Administrador + Has modificat el giny %1$s + %1$s ha modificat el giny %2$s + Has eliminat el giny %1$s + %1$s ha eliminat el giny %2$s + Has afegit el giny %1$s + %1$s ha afegit el giny %2$s + Has acceptat la invitació de %1$s + Has convidat a %1$s + %1$s ha convidat a %2$s + Has enviat una invitació a %1$s perquè s\'uneixi a la sala + Has actualitzat el teu perfil %1$s + Missatge eliminat per %1$s [motiu: %2$s] + Missatge eliminat [motiu: %1$s] + Missatge eliminat per %1$s + Missatge eliminat + Has eliminat la icona de la sala + %1$s ha eliminat la icona de la sala + Has eliminat el tema de la sala + Has eliminat el nom de la sala + Has sol·licitat una conferència VoIP + Has actualitzat aquesta sala. + %s ha actualitzat aquesta sala. + Has activat el xifrat d\'extrem a extrem (%1$s) + Has establert la visibilitat dels missatges futurs a %1$s + %1$s ha establert la visibilitat dels missatges futurs a %2$s + Has establert la visibilitat de l\'històric futur de la sala a %1$s + Has finalitzat la trucada. + Has respost a la trucada. + Has enviat dades per configurar la trucada. + %s ha enviat dades per configurar la trucada. + Has realitzat una trucada de veu. + Has realitzat una videotrucada. + Has canviat el nom de la sala a: %1$s + Has canviat la icona de la sala + %1$s ha canviat la icona de la sala + Has canviat el tema a: %1$s + Has eliminat el teu àlies (era %1$s) + Has canviat el teu àlies de %1$s a %2$s + Has canviat el teu àlies a %1$s + Has canviat la teva icona + Has retirat la invitació de %1$s + Has tret el vet a %1$s + Has rebutjat la invitació + Has creat la discussió + %1$s ha creat la discussió + T\'has unit + %1$s s\'ha unit + T\'has unit a la sala + Has convidat a %1$s + Has creat la sala + %1$s ha creat la sala + La teva invitació + Has enviat un adhesiu. + Has enviat una imatge. + • Servidors coincidents amb literals IP ara estan vetats. + • Servidors coincidents amb literals IP ara estan permesos. + • Servidors coincidents amb %s han estat eliminats de la llista de permesos. + • Servidors coincidents amb %s ara estan permesos. + • Servidors coincidents amb %s han estat eliminats del llista de vetats. + • Servidors coincidents amb %s ara estan vetats. + • Servidors coincidents amb literals IP estan vetats. + • Servidors coincidents amb literals IP estan permesos. + • Servidors coincidents amb %s estan permesos. + • Servidors coincidents amb %s estan vetats. + Has canviat les adreces d\'aquesta sala. + %1$s ha canviat les adreces d\'aquesta sala. + Has canviat l\'adreça principal i les adreces alternatives d\'aquesta sala. + %1$s ha canviat l\'adreça principal i les adreces alternatives d\'aquesta sala. + Has canviat les adreces alternatives d\'aquesta sala. + %1$s ha canviat les adreces alternatives d\'aquesta sala. + + Has eliminat l\'adreça alternativa %1$s d\'aquesta sala. + Has eliminat les adreces alternatives %1$s d\'aquesta sala. + + + %1$s ha eliminat l\'adreça alternativa %2$s d\'aquesta sala. + %1$s ha eliminat les adreces alternatives %2$s d\'aquesta sala. + + + Has afegit l\'adreça alternativa %1$s per aquesta sala. + Has afegit les adreces alternatives %1$s per aquesta sala. + + + %1$s ha afegit l\'adreça alternativa %2$s per aquesta sala. + %1$s ha afegit les adreces alternatives %2$s per aquesta sala. + + Sala buida (era %s) + + %1$s, %2$s, %3$s i %4$d altre + %1$s, %2$s, %3$s i %4$d altres + + %1$s, %2$s, %3$s i %4$s + %1$s, %2$s i %3$s + 🎉 Tots els servidors tenen la participació vetada! Aquesta sala ja no pot ser utilitzada. + Sense canvis. + Has canviat les ACLs de servidor d\'aquesta sala. + %s ha canviat les ACLs de servidor d\'aquesta sala. + Has establert les ACLs de servidor per aquesta sala. + %s ha establert les ACLs de servidor d\'aquesta sala. + Has modificat la videoconferència + %1$s ha modificat la videoconferència + Has finalitzat la videoconferència + %1$s ha iniciat una videoconferència + Has iniciat una videoconferència + %1$s ha finalitzat la videoconferència Tema clar Tema fosc - Tema negre + Tema negre Sincronitzant… Escoltant esdeveniments @@ -85,7 +348,7 @@ Directori d\'usuari Només contactes de Matrix No hi ha xats - No has donat permís a Element perquè pugui accedir als teus contactes locals + No has donat permís a ${app_name} perquè pugui accedir als teus contactes locals Sense resultats Sales @@ -161,7 +424,7 @@ Falta el correu electrònic o el número de telefon El token és invàlid Les contrasenyes no coincideixen - Heu oblidat la contrasenya? + Contrasenya oblidada\? Usa les opcions personalitzades del servidor (avançat) Comproveu el correu electrònic per continuar el procés de registre Registrar-se amb correu electrònic i número de telèfon alhora no es podrà fer fins que existeixi l\'api. Només es tindrà en compte el número de telèfon. @@ -235,24 +498,24 @@ No es poden gravar vídeos" Informació - Per poder enviar i desar fitxers adjunts, Element necessita permís per accedir a la galeria de fotos i vídeos. + Per poder enviar i desar fitxers adjunts, ${app_name} necessita permís per accedir a la galeria de fotos i vídeos. \n \nPermet-li l\'accés en la següent finestra emergent per poder enviar fitxers des del mòbil. - Per poder fer fotos i videotrucades, Element necessita permís per accedir a la càmera. + Per poder fer fotos i videotrucades, ${app_name} necessita permís per accedir a la càmera. " \n \nPermet-li l\'accés en la següent finestra emergent per tal de poder fer la trucada." - Per tal de fer trucades de veu, Element necessita permís per accedir al micròfon. + Per tal de fer trucades de veu, ${app_name} necessita permís per accedir al micròfon. " \n \nPermet-li l\'accés en la següent finestra emergent per tal de poder fer la trucada." - Per tal de fer videotrucades, Element necessita permís per accedir a la càmera i al micròfon. + Per tal de fer videotrucades, ${app_name} necessita permís per accedir a la càmera i al micròfon. \n \nPermet-li l\'accés en la següent finestra emergent per tal de poder fer la trucada. - Element pot revisar la teva llista de contactes per tal de trobar altres usuaris de Matrix basant-se en les seves adreces de correu i números de telèfon. Si acceptes compartir la teva llista de contactes amb aquesta finalitat, permet l\'accés en la següent finestra emergent. - Per tal de trobar altres usuaris de Matrix a partir dels seus correus o dels seus números de telèfon, Element necessita permís d\'accés a la llista de contactes. + ${app_name} pot revisar la teva llista de contactes per tal de trobar altres usuaris de Matrix basant-se en les seves adreces de correu i números de telèfon. Si acceptes compartir la teva llista de contactes amb aquesta finalitat, permet l\'accés en la següent finestra emergent. + Per tal de trobar altres usuaris de Matrix a partir dels seus correus o dels seus números de telèfon, ${app_name} necessita permís d\'accés a la llista de contactes. \n -\nPermets que Element accedeixi als teus contactes amb aquesta finalitat\? +\nPermets que ${app_name} accedeixi als teus contactes amb aquesta finalitat\? No s\'ha realitzat l\'acció per falta de permisos Desat @@ -757,9 +1020,8 @@ Tornar a demanar les claus de xifrat de les teves altres sessions. Petició de clau enviada. Sol·licitud enviada - Si us plau, obre Element a un altre dispositiu que pugui desxifrar el missatge de manera que pugui enviar les claus a aquesta sessió. + Si us plau, obre ${app_name} a un altre dispositiu que pugui desxifrar el missatge de manera que pugui enviar les claus a aquesta sessió. Normal - Tema Status.im No es pot dur a terme aquesta acció per falta de permisos. Error Alertes de sistema @@ -807,12 +1069,12 @@ Desactivar el compte Desactivar el meu compte Notificació de privacitat - El Element pot funcionar en segon pla per gestionar les vostres notificacions de forma segura i privada. Això podria afectar el consum de bateria. + El ${app_name} pot funcionar en segon pla per gestionar les vostres notificacions de forma segura i privada. Això podria afectar el consum de bateria. Concedir permís Escolliu una altra opció Envia dades d\'anàlisi - Element recopila dades d\'anàlisi anònimes per tal de permetre millorar l\'aplicació. - Si us plau, activa les dades d\'anàlisi per ajudar-nos a millorar Element. + ${app_name} recopila dades d\'anàlisi anònimes per tal de permetre millorar l\'aplicació. + Si us plau, activa les dades d\'anàlisi per ajudar-nos a millorar ${app_name}. Sí, vull ajudar! Ara mateix no ets membre de cap comunitat. Crea una frase per xifrar les claus exportades. Hauràs d\'introduir la mateixa frase per poder importar les claus. @@ -878,7 +1140,7 @@ plega Accepta Trucada - Utilitza el to de trucada d\'Element predeterminat per trucades entrants + Utilitza el to de trucada d\'${app_name} predeterminat per trucades entrants To de trucada entrant Tria el to per les trucades: Expulsa @@ -919,12 +1181,12 @@ Inicia\'l a l\'arrencada Inhabilita les restriccions Optimització de bateria - El Element no està afectat per l\'optimització de bateria. + El ${app_name} no està afectat per l\'optimització de bateria. Mostra els esdeveniments d\'unió i sortida Inclou els canvis d\'icona i d\'àlies. Connexió al rerefons - Per poder obtenir notificacions fiables, Element necessita mantenir una connexió en segon pla de baixa incidència. -\nA la pantalla següent se\'t demanarà que permetis a Element executar-se sempre en segon pla, si us plau, accepta-ho. + Per poder obtenir notificacions fiables, ${app_name} necessita mantenir una connexió en segon pla de baixa incidència. +\nA la pantalla següent se\'t demanarà que permetis a ${app_name} executar-se sempre en segon pla, si us plau, accepta-ho. Contrasenya Informació addicional: %s S\'ha habilitat el Markdown. @@ -949,8 +1211,8 @@ Diagnostica les notificacions Diagnòstic de la resolució de problemes Ha fallat una o més proves, envia un informe d\'errors per ajudar-nos a investigar-ho. - Les notificacions per aquesta sessió no estan activades. -\nComprova la configuració d\'Element. + Les notificacions per aquesta sessió no estan activades. +\nComprova la configuració d\'${app_name}. Configuració personalitzada. Tingues en compte que alguns tipus de missatge estan configurats per ser silenciosos (es produirà una notificació sense so). Algunes notificacions estan desactivades a la configuració personalitzada. @@ -958,15 +1220,15 @@ Comprova la configuració Comprovació dels serveis de Play L\'APK dels Serveis de Google Play està disponible i està actualitzada. - Element utilitza els serveis de Google Play per lliurar missatges però sembla que no està configurat correctament: + ${app_name} utilitza els serveis de Google Play per lliurar missatges però sembla que no està configurat correctament: \n %1$s Token de Firebase Token FCM obtingut correctament: \n%1$s No s\'ha pogut obtenir el token FCM: \n%1$s - [%1$s] -\nAquest error està fora del control d\'Element i, segons Google, aquest error indica que aquest dispositiu té massa aplicacions registrades amb FCM. L\'error només ocorre en casos en què hi ha un nombre extrem d\'aplicacions i, per tant, no hauria d\'afectar els usuari normals. + [%1$s] +\nAquest error està fora del control d\'${app_name} i, segons Google, aquest error indica que aquest dispositiu té massa aplicacions registrades amb FCM. L\'error només ocorre en casos en què hi ha un nombre extrem d\'aplicacions i, per tant, no hauria d\'afectar els usuari normals. Afegeix un compte Registre de token El token FCM s\'ha registrat correctament al servidor local. @@ -976,7 +1238,7 @@ El servei s\'ha parat i tornat a iniciar automàticament. No s\'ha pogut iniciar el servei El servei s\'iniciarà quan es reiniciï el dispositiu. - El servei no s\'iniciarà quan el dispositiu es reiniciï, per tant, no rebràs notificacions fins que Element no s\'hagi obert per primera vegada. + El servei no s\'iniciarà quan el dispositiu es reiniciï, per tant, no rebràs notificacions fins que ${app_name} no s\'hagi obert per primera vegada. Habilita l\'inici durant l\'arrencada Comprova les restriccions del rerefons Ignora l\'optimització @@ -997,7 +1259,7 @@ Silenciós Introduïu una frase de pas La frase de pas és massa feble - Suprimiu la frase si vols que Element generi una clau de recuperació. + Suprimiu la frase si vols que ${app_name} generi una clau de recuperació. No hi ha cap sessió de Matrix disponible No perdeu mai els missatges xifrats Els missatges en sales xifrades estan protegits amb xifrat d\'extrem a extrem. Només tu i el/s destinatari/s teniu les claus per poder llegir aquests missatges. @@ -1025,13 +1287,13 @@ Introdueix la clau de recuperació Recuperació de missatges Has perdut la clau de recuperació\? Pots configurar-ne una de nova a la configuració. - [%1$s] -\nAquest error està fora del control d\'Element. Pot ser causat per diferents motius. És possible que torni a funcionar més endavant. També pots comprovar, a la configuració del sistema, que els Serveis de Google Play no tinguin cap restricció de dades o que l\'hora del dispositiu sigui la correcta. També pot passar si tens una ROM personalitzada. - [%1$s] -\nAquest error està fora del control d\'Element. No hi ha cap compte de Google al telèfon. Vés a la configuració de comptes i afegeix un compte de Google. - Les restriccions en segon pla per a Element estan desactivades. Aquesta prova s\'hauria de fer emprant dades mòbils (sense WiFi). + [%1$s] +\nAquest error està fora del control d\'${app_name}. Pot ser causat per diferents motius. És possible que torni a funcionar més endavant. També pots comprovar, a la configuració del sistema, que els Serveis de Google Play no tinguin cap restricció de dades o que l\'hora del dispositiu sigui la correcta. També pot passar si tens una ROM personalitzada. + [%1$s] +\nAquest error està fora del control d\'${app_name}. No hi ha cap compte de Google al telèfon. Vés a la configuració de comptes i afegeix un compte de Google. + Les restriccions en segon pla per a ${app_name} estan desactivades. Aquesta prova s\'hauria de fer emprant dades mòbils (sense WiFi). \n%1$s - Les restriccions en segon pla per a Element estan activades. + Les restriccions en segon pla per a ${app_name} estan activades. \nLes tasques que l\'aplicació intenta fer en segon pla estaran força restringides, això pot afectar a les notificacions. \n%1$s Si un usuari deixa un dispositiu amb la pantalla apagada, desendollat i quiet durant un període de temps, el dispositiu entra en el mode repòs. Això impedeix que les aplicacions accedeixin a la xarxa i n\'ajorna les seves tasques, sincronitzacions i alarmes estàndard. @@ -1184,7 +1446,7 @@ Aturar Comprovant l\'estat de la còpia de seguretat Opcions de compleció automàtica del servidor - Element ha detectat una configuració de servidor personalitzada pel teu domini d\'ID d\'usuari \"%1$s\": + ${app_name} ha detectat una configuració de servidor personalitzada pel teu domini d\'ID d\'usuari \"%1$s\": \n%2$s Se t\'ha desconnectat a causa de credencials incorrectes o caducades. Verificar comparant una cadena de text curta. @@ -1255,7 +1517,7 @@ Espereu, si us plau… Totes les comunitats Aquesta sala no es pot pre-visualitzar - Element encara no admet la pre-visualització de les sales llegibles per tothom + ${app_name} encara no admet la pre-visualització de les sales llegibles per tothom Sales Xats personals Sala nova @@ -1277,9 +1539,8 @@ Expert Motiu de l\'expulsió Expulsa usuari - Aquesta operació encara no està disponible en comptes que utilitzen la inscripció única (SSO). Continua amb SSO - Per a la teva pròpia privadesa, Element només admet l\'enviament del \"hash\" de correus electrònics i números de telèfon. + Per a la teva pròpia privadesa, ${app_name} només admet l\'enviament del \"hash\" de correus electrònics i números de telèfon. Només admès en sales xifrades El xifrat que utilitza aquesta sala no és compatible No pots fer això des del mòbil @@ -1289,7 +1550,7 @@ L\'aplicació no ha pogut iniciar sessió en aquest servidor. El servidor és compatible amb el/s següent/s tipus d\'inici de sessió: %1$s. \n \nVols iniciar sessió utilitzant un client web\? - No pots fer això des d\'Element per a mòbils + No pots fer això des d\'${app_name} per a mòbils La cerca en sales xifrades encara no està disponible. La sala encara no s\'ha acabat de crear. Vols cancel·lar la seva creació\? No s\'ha trobat aquesta sala. Assegura\'t que existeixi. @@ -1379,13 +1640,12 @@ Cancel·la invitació Torna a la trucada Error SSL. - La trucada d\'Element ha fallat + La trucada d\'${app_name} ha fallat Restableix la contrasenya a %1$s Aquest correu electrònic no està associat amb cap compte. Ho sentim, aquest servidor no accepta comptes nous. S\'ha produït un error en carregar la pàgina: %1$s (%2$d) Introdueix l\'adreça del servidor que vulguis utilitzar - Introdueix l\'adreça d\'un servidor o d\'un Element al qual et que vulguis connectar Galeria Adhesiu S\'ha produït un error mentre es rebia el fitxer adjunt. @@ -1561,10 +1821,10 @@ No s\'ha pogut actualitzar la configuració. No se\'t notificarà de missatges entrants quan l\'aplicació es trobi en segon pla. Sense sincronització en segon pla - Element farà la sincronització en segon pla periòdicament en instants de temps precisos (configurable). -\nAixò tindrà un impacte en l\'ús de la ràdio i la bateria, es mostrarà una notificació permanent informant de que Element està a l\'espera d\'esdeveniments. + ${app_name} farà la sincronització en segon pla periòdicament en instants de temps precisos (configurable). +\nAixò tindrà un impacte en l\'ús de la ràdio i la bateria, es mostrarà una notificació permanent informant de que ${app_name} està a l\'espera d\'esdeveniments. Optimitzat per a temps real - Element farà la sincronització en segon pla de manera que es preservin els recursos limitats del dispositiu (bateria). + ${app_name} farà la sincronització en segon pla de manera que es preservin els recursos limitats del dispositiu (bateria). \nEn funció de l\'estat dels recursos del dispositiu, pot ser que el sistema operatiu endarrereixi la sincronització. Optimitzat per a la bateria Mode de sincronització en segon pla @@ -1751,10 +2011,10 @@ Usuari i/o contrasenya incorrectes. La contrasenya introduïda comença o acaba amb espais, comprova-la. Aquest compte ha estat desactivat. %1$d de %2$d - Element iOS -\nElement Android - Element Web -\nElement per a escriptori + ${app_name} iOS +\n${app_name} Android + ${app_name} Web +\n${app_name} per a escriptori Afegeix gent Afegeix membres Afegeix des de la meva agenda @@ -1765,7 +2025,7 @@ Codi QR Obre el xat Silencia el micròfon - El codi PIN és l\'única manera de desbloquejar Element. + El codi PIN és l\'única manera de desbloquejar ${app_name}. o un altre client Matrix compatible amb la signatura creuada La signatura creuada no està activada La signatura creuada està activada @@ -1781,7 +2041,7 @@ Enviar esdeveniments m.room.server_acl Canviar els permisos Canviar el nom de la sala - Element necessita permís per poder desar les claus E2E al disc. + ${app_name} necessita permís per poder desar les claus E2E al disc. \n \nPermet-li l\'accés en la següent finestra emergent per poder exportar les claus manualment. Ara mateix no hi ha cap connexió @@ -1825,8 +2085,8 @@ Confirma el PIN per poder desactivar el PIN Canvia el teu PIN actual Canvia el PIN - Codi PIN necessari cada vegada que obres Element. - Codi PIN necessari al cap de 2 minuts sense utilitzar Element. + Codi PIN necessari cada vegada que obres ${app_name}. + Codi PIN necessari al cap de 2 minuts sense utilitzar ${app_name}. Demana el PIN al cap de 2 minuts Mostra, només, el nombre de missatges no llegits en les notificacions simples. Mostra el contingut de les notificacions @@ -1907,7 +2167,7 @@ Comença a xatejar Predeterminat pel sistema Utilitza la %1$s o la %2$s per a continuar. - Utilitza l\'última versió d\'Element als teus altres dispositius: + Utilitza l\'última versió d\'${app_name} als teus altres dispositius: L\'administrador del servidor local (%1$s) ha tancat la teva sessió del compte %2$s (%3$s). %d usuari ho ha llegit @@ -1975,7 +2235,7 @@ Clica per revisar i verificar Nou inici de sessió. Has estat tu\? Actualitza - Element Android + ${app_name} Android Les claus ja estan actualitzades! Esdeveniment eliminat per un usuari, motiu: %1$s Esdeveniment moderat per un administrador de sala, motiu: %1$s @@ -2018,7 +2278,7 @@ Adreça de la sala Activa el xifrat Afegeix ¯\\_(ツ)_/¯ a l\'inici d\'un missatge de text pla - Pot ser que Element falli més sovint quan es produeixi un error inesperat + Pot ser que ${app_name} falli més sovint quan es produeixi un error inesperat Altres sessions Sessió actual Configuració @@ -2106,8 +2366,8 @@ Visualització de notificació Inici de %s. Convida amics - Ei, parla amb mi des d\'Element: %s - 🔐️ Uneix-te a Element + Ei, parla amb mi des d\'${app_name}: %s + 🔐️ Uneix-te a ${app_name} Comparteix aquest codi amb la gent perquè puguin escanejar-lo, afegir-te i començar a xatejar amb tu. L\'usuari no s\'ha acceptat el consentiment. Envia el missatge proporcionat amb confetis @@ -2145,7 +2405,7 @@ Com els correus electrònics, els comptes pertanyen a una entitat però els pots fer servir per parlar amb tothom Potser ho hauries d\'activar si la sala només s\'utilitzarà per la interacció de grups interns dins el teu servidor local. Això no es podrà canviar més tard. Bloqueja qualsevol persona que no formi part de %s perquè mai pugui unir-se a la sala - La sessió actual és de l\'usuari %1$s i has introduït les credencials de l\'usuari %2$s. Això no es pot fer amb Element. + La sessió actual és de l\'usuari %1$s i has introduït les credencials de l\'usuari %2$s. Això no es pot fer amb ${app_name}. \nPrimer esborra les dades i després torna a iniciar sessió amb l\'altre compte. Perdràs l\'accés als missatges protegits tret de que iniciïs sessió i obtinguis les teves claus de xifrat. Atenció: les teves dades personals (incloses les claus de xifrat) encara estan desades en aquest dispositiu. @@ -2194,9 +2454,8 @@ Busca contactes a Matrix Busca als meus contactes - element - MÉS INFORMACIÓ - Riot ara és Element! + MÉS INFORMACIÓ + Riot ara és Element! No pots accedir al missatge perquè el remitent, intencionadament, no ha enviat les claus No pots accedir al missatge perquè la teva sessió no és de confiança pel remitent No pots accedir al missatge perquè el remitent t\'ha bloquejat @@ -2231,9 +2490,9 @@ Completa la seguretat Pot ser que altres usuaris no hi confiïn Deixa d\'ignorar - Element ha trobat un problema al renderitzar el contingut de l\'esdeveniment amb ID \'%1$s\' - Element no gestiona els missatges de tipus \'%1$s\' - Element no gestiona els esdeveniments de tipus \'%1$s\' + ${app_name} ha trobat un problema al renderitzar el contingut de l\'esdeveniment amb ID \'%1$s\' + ${app_name} no gestiona els missatges de tipus \'%1$s\' + ${app_name} no gestiona els esdeveniments de tipus \'%1$s\' Marxant de la sala… Marxa Marxa de la sala @@ -2309,7 +2568,7 @@ \nSegur que vols continuar\? Comprova aquest enllaç Marca-ho com a segur - Utilitza l\'última versió d\'Element als teus altres dispositius, Element Web, Element per escriptori, Element iOS, Element per Android, o algun altre client de Matrix que admeti signatura creuada + Utilitza l\'última versió d\'${app_name} als teus altres dispositius, ${app_name} Web, ${app_name} per escriptori, ${app_name} iOS, ${app_name} per Android, o algun altre client de Matrix que admeti signatura creuada Desant secret de clau de còpia de seguretat a SSSS Verifica\'t a tu i als altres per mantenir els teus xats segurs Envia un missatge com a text pla, sense tenir en compte la formatació markdown @@ -2337,15 +2596,15 @@ Si ho restableixes tot Fes això només si no tens cap altre dispositiu per poder verificar-ne aquest. - Element necessita que introdueixis les teves credencials per poder realitzar aquesta acció. + ${app_name} necessita que introdueixis les teves credencials per poder realitzar aquesta acció. Re-autenticació necessària Llista de contactes La teva agenda està buida Agenda La teva llista de contactes està buida Obtenint contactes… - D\'ACORD - Estem contents d\'anunciar que hem canviat de nom! L\'aplicació està actualitzada i s\'ha iniciat sessió amb el teu compte. + D\'ACORD + Estem contents d\'anunciar que hem canviat de nom! L\'aplicació està actualitzada i s\'ha iniciat sessió amb el teu compte. Desa la clau de seguretat Torna a introduir la frase de seguretat per a confirmar-la. Frase de seguretat @@ -2358,7 +2617,7 @@ L\'associació ha fallat. Primer configura un servidor d\'identitat. No es pot realitzar aquesta operació. El servidor local no està actualitzat. - Aquest servidor d\'identitat no està actualitzat. Element només és compatible amb l\'API V2. + Aquest servidor d\'identitat no està actualitzat. ${app_name} només és compatible amb l\'API V2. Vols desconnectar-te del servidor d\'identitat %s\? Carregant idiomes disponibles… Altres idiomes disponibles @@ -2415,4 +2674,59 @@ %s ha posat la trucada en espera Continua Torna + Vídeo + Alguns missatges no s\'han enviat + Imatge + Importa clau des d\'un fitxer + Captura de pantalla + + %d entrada + %d entrades + + Límit desconegut. + Versió del servidor + Nom del servidor + Configuració de sala + Abandonar conferència actual i anar a l\'altra\? + Versió de sala + Nou valor + Sincronització inicial: +\nBaixant dades… + Sincronització inicial: +\nEsperant resposta del servidor… + Mostra confirmacions de lectura + Obre giny + Límit de càrrega de fitxers al servidor + Commuta + Contingut de l\'esdeveniment + Esdeveniment d\'estat enviat! + Esdeveniment enviat! + Esdeveniment mal format + Falta el tipus de missatge + Sense contingut + Contingut de l\'esdeveniment + Clau d\'estat + Tipus + Envia esdeveniment d\'estat personalitzat + Edita el contingut + Esdeveniments d\'estat + Envia esdeveniment d\'estat + Envia esdeveniment personalitzat + Explora l\'estat de la sala + Eines per desenvolupadors + No notifiquis + Notifica sense so + Notifica amb so + No s\'ha enviat el missatge per culpa d\'un error + Comprovat + Tanca selector d\'emoticones + Obre selector d\'emoticones + Nivell de confiança segur + Nivell de confiança d\'alerta + Nivell de confiança predeterminat + Seleccionats + La sala conté un esborrany no enviat + Elimina la icona + Canvia la icona + El servidor local accepta fitxers adjunts (fotos, fitxers, etc) de fins a una mida de %s. \ No newline at end of file diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 4fe9a905aa..03b733be05 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -1,7 +1,279 @@ + %1$s: %2$s + Uživatel %1$s poslal obrázek. + Uživatel %1$s poslal nálepku. + Pozvání od uživatele %s + Uživatel %1$s pozval uživatele %2$s + Uživatel %1$s vás pozval + %1$s vstoupil do místnosti + Uživatel %1$s odešel + %1$s odmítli pozvání + %1$s vykopli %2$s + %1$s zrušil vykázání %2$s + %1$s vykázali %2$s + %1$s zrušili pozvání pro %2$s + %1$s změnili svůj profilový obrázek + %1$s nastavili své veřejné jméno na %2$s + %1$s změnili své veřejné jméno z %2$s na %3$s + %1$s odstranili své veřejné jméno (%2$s) + %1$s změnili téma na: %2$s + %1$s změnili název místnosti na: %2$s + %s uskutečnili videohovor. + %s uskutečnili hlasový hovor. + %s přijali hovor. + %s ukončili hovor. + %1$s nastavili viditelnost budoucí historie místnosti pro %2$s + všechny členy místnosti od chvíle, kdy budou pozváni. + všechny členy místnosti od chvíle, kdy se připojí. + všechny členy místnosti. + kohokoliv. + neznámým (%s). + %1$s zapnuli end-to-end šifrování (%2$s) + %1$s požádali o VoIP konferenci + Začala VoIP konference + VoIP konference skončila + (profilový obrázek byl také změněn) + %1$s odstranili název místnosti + %1$s odstranili téma místnosti + %1$s aktualizovali svůj profil %2$s + %1$s do této místnosti pozvali %2$s + %1$s přijali pozvání pro %2$s + ** Nelze dešifrovat: %s ** + Odesílatelovo zařízení nám neposlalo klíče pro tuto zprávu. + Nelze vymazat + Zprávu nelze odeslat + Obrázek nelze nahrát + Chyba sítě + Chyba v Matrixu + V současnosti není možné znovu vstoupit do prázdné místnosti. + E-mailová adresa + Telefonní číslo + Pozvání od %s + Pozvání do místnosti + %1$s a %2$s + + %1$s a jeden další + %1$s a %2$d další + %1$s a %2$d dalších + + Prázdná místnost + %s povýšili tuto místnost. + Zpráva byla smazána [důvod: %1$s] + Zpráva smazána uživatelem %1$s [důvod: %2$s] + %1$s zrušili pozvánku do místnosti pro %2$s + Úvodní synchronizace: +\nImportuji účet… + Úvodní synchronizace: +\nImportuji klíče + Úvodní synchronizace: +\nImportuji místnosti + Úvodní synchronizace: +\nImportuji místností, jichž jste členy + Úvodní synchronizace: +\nImportuji místnost, jež jste opustili + Úvodní synchronizace: +\nImportuji skupiny + Úvodní synchronizace: +\nImportuji data účtu + Odesílám zprávu… + Úvodní synchronizace: +\nImportuji pozvání + Vymazat frontu neodeslaných zpráv + %1$s pozvali %2$s. Důvod: %3$s + %1$s vás pozvali. Důvod: %2$s + %1$s opustil místnost. Důvod: %2$s + Zpráva odstraněna + Zprávu odstranil/a %1$s + Poslali jste obrázek. + Poslali jste nálepku. + Vaše pozvání + %1$s založil místnost + Založili jste místnost + Pozvali jste %1$s + Vstoupili jste do místnosti + Opustili jste místnost + Odmítli jste pozvání + Vykopli jste %1$s + Zrušili jste vykázání pro %1$s + Vykázali jste %1$s + Stáhli jste pozvánku od %1$s zpět + Změnili jste svůj profilový obrázek + Změnili jste své veřejné jméno na %1$s + Změnili jste své veřejné jméno z %1$s na %2$s + Odstranili jste své veřejné jméno (%1$s) + Změnili jste téma na: %1$s + %1$s změnili obrázek místnosti + Změnili jste obrázek místnosti + Změnili jste jméno místnosti na: %1$s + Zahájili jste video hovor. + Zahájili jste hlasový hovor. + %s poslali data, aby mohli zahájit hovor. + Poslali jste data, abyste mohli zahájit hovor. + Přijali jste hovor. + Ukončili jste hovor. + Učinili jste budoucí historii místnosti viditelnou pro %1$s + Zapnuli jste end-to-end šifrování (%1$s) + Povýšili jste tuto místnost. + Požádali jste o VoIP konferenci + Odstranili jste jméno místnosti + Odstranili jste téma místnosti + %1$s odstranili obrázek místnosti + Odstranili jste obrázek místnosti + Aktualizovali jste svů profil %1$s + Poslali jste %1$s pozvání ke vstupu do místnosti + Zrušili jste pozvánku ke vstupu do místnosti pro %1$s + Přijali jste pozvání pro %1$s + %1$s přidali widget %2$s + Přidali jste widget %1$s + %1$s odstranili widget %2$s + Odstranili jste widget %1$s + %1$s změnil widget %2$s + Změnili jste widget %1$s + Správce + Moderátor + Výchozí + Vlastní (%1$d) + Vlastní + Změnili jste %1$s stupeň oprávnění. + %1$s změnili %2$s stupeň oprávnění. + %1$s z %2$s na %3$s + Pozvání od %1$s. Důvod: %2$s + Vaše pozvání. Důvod: %1$s + Pozvali jste %1$s. Důvod: %2$s + %1$s vstoupili do místnosti. Důvod: %2$s + Vstoupili jste do místnosti. Důvod: %1$s + Opustili jste místnost. Důvod: %1$s + %1$s pozvání odmítli. Důvod: %2$s + Odmítli jste pozvání. Důvod: %1$s + %1$s vykopnuli %2$s. Důvod: %3$s + Vykopnuli jste %1$s. Důvod: %2$s + %1$s zrušili %2$s vykázání. Důvod: %3$s + Zrušili jste %1$s vykázání. Důvod: %2$s + %1$s vykázali %2$s. Důvod: %3$s + Vykázali jste %1$s. Důvod: %2$s + %1$s poslali %2$s pozvání, aby vstoupili do místnosti. Důvod: %3$s + Poslali jste %1$s pozvání, aby vstoupili do místnosti. Důvod: %2$s + %1$s zrušili pozvání do místnosti pro %2$s. Důvod: %3$s + Zrušili jste pozvání do místnosti pro %1$s. Důvod: %2$s + %1$s přijali pozvání pro %2$s. Důvod: %3$s + Přijali jste pozvání pro %1$s. Důvod: %2$s + %1$s zrušili pozvání pro %2$s. Důvod: %3$s + Zrušili jste pozvání od %1$s. Důvod: %2$s + + %1$s přidali %2$s jako adresu pro tuto místnost. + %1$s přidali %2$s jako adresy pro tuto místnost. + %1$s přidali %2$s jako adresy pro tuto místnost. + + + Přidali jste %1$s jako adresu pro tuto místnost. + Přidali jste %1$s jako adresy pro tuto místnost. + Přidali jste %1$s jako adresy pro tuto místnost. + + + %1$s odstranili %2$s jako adresu pro tuto místnost. + %1$s odstranili %2$s jako adresy pro tuto místnost. + %1$s odstranili %2$s jako adresy pro tuto místnost. + + + Odstranili jste %1$s jako adresu pro tuto místnost. + Odstranili jste %1$s jako adresuy pro tuto místnost. + Odstranili jste %1$s jako adresy pro tuto místnost. + + %1$s přidali %2$s a odstranili %3$s jako adresy pro tuto místnost. + Přidali jste %1$s a odstranili %2$s jako adresy pro tuto místnost. + %1$s nastavili hlavní adresu této místnosti na %2$s. + Nastavili jste %1$s na hlavní adresu této místnosti. + %1$s odstranili hlavní adresu této místnosti. + Odstranili jste hlavní adresu této místnosti. + %1$s povolili hostům vstoupit do místnosti. + Povolili jste hostům vstoupit do místnosti. + %1$s zamezili hostům vstoupit do místnosti. + Zamezili jste hostům vstoupit do místnosti. + %1$s zapnuli end-to-end šifrování. + Zapnuli jste end-to-end šifrování. + %1$s zapnuli end-to-end šifrování (neznámý algoritmus %2$s). + Zapnuli jste end-to-end šifrování (neznámý algoritmus %1$s). + Zamezili jste hostům vstoupit do této místnosti. + %1$s zamezil hostům vstoupit do této místnosti. + Povolili jste hostům vstoupit. + %1$s povolil hostům vstoupit. + Odešli jste. Důvod: %1$s + %1$s odešli. Důvod: %2$s + Vstoupili jste. Důvod: %1$s + %1$s vstoupili. Důvod: %2$s + Zrušili jste pozvání pro %1$s + %1$s zrušili pozvání pro %2$s + Pozvali jste %1$s + %1$s pozvali %2$s + Tady jste provedli upgrade. + %s tady provedli upgrade. + Učinili jste budoucí zprávy viditelné pro %1$s + %1$s učinili budoucí zprávy viditelné pro %2$s + Odešli jste z místnosti + %1$s odešli z místnosti + Vstoupili jste + %1$s vstoupili + Založili jste diskusi + %1$s založil diskusi + Prázdná místnost (byla %s) + + %1$s, %2$s, %3$s a %4$d další + %1$s, %2$s, %3$s a %4$d další + %1$s, %2$s, %3$s a %4$d dalších + + %1$s, %2$s, %3$s a %4$s + %1$s, %2$s a %3$s + 🎉 Účast všech serverů je zakázána! Tuto místnost již nelze použít. + Beze změny. + • Servery shodující se doslovně s IP jsou nyní zakázány. + • Servery shodující se doslovně s IP jsou nyní povoleny. + • Servery shodující se s %s byly odstraněny ze seznamu povolených. + • Servery shodující se s %s jsou nyní povoleny. + • Servery shodující se s %s byly odstraněny ze seznamu zakázaných. + • Servery shodující se s %s jsou nyní zakázány. + Změnili jste ACL serveru pro tuto místnost. + %s změnili ACL serveru pro tuto místnost. + • Server shodující se doslovně s IP je povolen. + • Server shodující se doslovně s IP je zakázán. + • Server shodující se s %s je povolen. + • Server shodující se s %s je zakázán. + Nastavili jste ACL serveru pro tuto místnost. + %s nastavili ACL serveru pro tuto místnost. + Změnili jste adresy pro tuto místnost. + %1$s změnili adresy pro tuto místnost. + Změnili jste hlavní a alternativní adresu pro tuto místnost. + %1$s změnili hlavní a alternativní adresu pro tuto místnost. + Změnili jste alternativní adresu pro tuto místnost. + %1$s změnili alternativní adresu pro tuto místnost. + + Odstranili jste alternativní adresu %1$s pro tuto místnost. + Odstranili jste alternativní adresy %1$s pro tuto místnost. + Odstranili jste alternativní adresy %1$s pro tuto místnost. + + + %1$s odstranili alternativní adresu %2$s pro tuto místnost. + %1$s odstranili alternativní adresy %2$s pro tuto místnost. + %1$s odstranili alternativní adresy %2$s pro tuto místnost. + + + Přidali jste alternativní adresu %1$s pro tuto místnost. + Přidali jste alternativní adresy %1$s pro tuto místnost. + Přidali jste alternativní adresy %1$s pro tuto místnost. + + + %1$s přidali alternativní adresu %2$s pro tuto místnost. + %1$s přidali alternativní adresy %2$s pro tuto místnost. + %1$s přidali alternativní adresy %2$s pro tuto místnost. + + Upravili jste videokonferenci + Videokonference byla upravena uživatelem %1$s + Ukončili jste videokonferenci + Videokonference byla ukončena uživatelem %1$s + Zahájili jste videokonferenci + Videokonference byla zahájena uživatelem %1$s Světlý vzhled - Černý vzhled + Černý vzhled Tmavý vzhled Zprávy Místnost @@ -41,10 +313,10 @@ \nPřipojit se jako %1$s nebo %2$s Hlasem Videem - Nemohu spustit hovor, zkuste, prosím, později + Nemohu zahájit hovor, zkuste, prosím, později Z důvodu chybějících práv mohou některé funkce chybět… Potřebujete práva k pozvání pro spuštění konference v této místnosti - Nemohu spustit hovor + Nemohu zahájit hovor Informace o relaci Konferenční hovory nejsou podporovány v šifrovaných místnostech Přesto poslat @@ -80,7 +352,7 @@ Uživatelský adresář Pouze kontakty Matrix Žádné konverzace - Nepovolil jste aplikaci Element přístup k místním kontaktům + Nepovolil jste aplikaci ${app_name} přístup k místním kontaktům Žádné výsledky Místnosti Adresář místností @@ -177,7 +449,6 @@ Poškozený JSON Bylo odesláno příliš mnoho požadavků Toto uživatelské jméno je již použito - Motiv vzhledu Status.im Odeslat nálepku Licenční smlouvy třetích stran Stáhnout @@ -230,7 +501,7 @@ Název místnosti Téma místnosti Hovory - Použít původní vyzvánění Elementu pro příchozí hovory + Použít původní vyzvánění ${app_name}u pro příchozí hovory Vyzvánění příchozího hovoru Vybrat vyzvánění pro hovory: Hovor @@ -249,14 +520,14 @@ Pořídit fotografii nebo video Nemohu natáčet video Informace - Element potřebuje oprávnění pro přístup do Vaší knihovny fotografií a videí, aby mohl odesílat a ukládat přílohy. + ${app_name} potřebuje oprávnění pro přístup do Vaší knihovny fotografií a videí, aby mohl odesílat a ukládat přílohy. \n \nProsím, povolte přístup na následující hlášce pro možnost odesílání souborů z Vašeho telefonu. - Element potřebuje oprávnění pro přístup k Vašemu fotoaparátu pro pořizování fotografií a uskutečňování video hovorů. + ${app_name} potřebuje oprávnění pro přístup k Vašemu fotoaparátu pro pořizování fotografií a uskutečňování video hovorů. " \n \nProsím, povolte přístup na následující hlášce, abyste mohli uskutečnit hovor." - Element potřebuje oprávnění pro přístup k Vašemu mikrofonu pro uskutečnění hlasových hovorů. + ${app_name} potřebuje oprávnění pro přístup k Vašemu mikrofonu pro uskutečnění hlasových hovorů. " \n \nProsím, povolte přístup na následující hlášce, abyste mohli uskutečnit hovor." @@ -270,7 +541,7 @@ Náhled Byli jste pozváni od %s ke vstupu do místnosti Žádost odeslána - Prosím, spusťte Element na jiném zařízení, které může dešifrovat zprávu, aby poslalo klíče této relaci. + Prosím, spusťte ${app_name} na jiném zařízení, které může dešifrovat zprávu, aby poslalo klíče této relaci. Seznam doručenek Seznam skupin Omlouváme se, ale akce nebyla provedena z důvodu chybějících oprávnění @@ -407,11 +678,11 @@ Zrušit Opravdu se chcete odhlásit\? Video hovor probíhá… - Element potřebuje oprávnění pro přístup k Vaší kameře a mikrofonu pro uskutečnění video hovoru. + ${app_name} potřebuje oprávnění pro přístup k Vaší kameře a mikrofonu pro uskutečnění video hovoru. \n \nProsím, povolte přístup na následující hlášce abyste mohli uskutečnit hovor. - Element může nahlédnout do vašeho adresáře, aby nalezl ostatní uživatele Matrixu na základě jejich e-mailu a telefonního čísla. Pokud souhlasíte se sdílením svého adresáře za tímto účelem, prosím, povolte přístup v příští hlášce. - Element může nahlédnout do vašeho adresáře, aby nalezl ostatní uživatele Matrixu na základě jejich e-mailu a telefonního čísla. + ${app_name} může nahlédnout do vašeho adresáře, aby nalezl ostatní uživatele Matrixu na základě jejich e-mailu a telefonního čísla. Pokud souhlasíte se sdílením svého adresáře za tímto účelem, prosím, povolte přístup v příští hlášce. + ${app_name} může nahlédnout do vašeho adresáře, aby nalezl ostatní uživatele Matrixu na základě jejich e-mailu a telefonního čísla. \n \nSouhlasíte se sdílením svého adresáře za tímto účelem\? Pozvánka byla odeslána na %s, což není spárováno s tímto účtem. @@ -491,7 +762,7 @@ Přidat telefonní číslo Informace o aplikaci Zobrazit informace o aplikaci v systémovém nastavení. - Rozšířená nestavení oznámení + Rozšířená nastavení oznámení Důležitost oznámení na základě události Spouštím služby Ověřit relaci @@ -522,7 +793,7 @@ Použiiji %s jako nápomoc, pokud Váš homeserver žádnou nenabízí (Vaše IP adresa bude sdělena během hovoru) Pro provedení této akce přidat server identit v nastavení. Potvrďte své heslo - Nelze provést z Element mobile + Nelze provést z ${app_name} mobile Ověření je nutné Soukromí oznámení Odstraňování problémů s oznámeními @@ -544,8 +815,8 @@ Zapnout Nastavení relací. Pro tuto relaci jsou oznámení zapnuta. - Oznámení nejsou zapnuta pro tuto relaci. -\nProsím, prověřte nastavení Elementu. + Oznámení nejsou zapnuta pro tuto relaci. +\nProsím, prověřte nastavení ${app_name}u. Zapnout Vlastní nastavení. Všimněte si, že některé typy zpráv jsou ztišeny (vyvolají oznámeni bez zvuku). @@ -554,7 +825,7 @@ Kontrola nastavení Kontrola služeb Play Google Play Services APK je k dispozici a aktuální. - Element používá Google Play Services pro doručení zpráv push, ale patrně nejsou správně nastaveny: + ${app_name} používá Google Play Services pro doručení zpráv push, ale patrně nejsou správně nastaveny: \n%1$s Opravit Play Services Token Firebase @@ -562,12 +833,12 @@ \n%1$s Načtení FCM tokenu selhalo: \n%1$s - [%1$s] -\nTato chyba je mimo kontrolu Elementu a podle Googlu indikuje, že zařízení má příliš mnoho aplikací registrovaných s FCM. Tato chyba se ukáže jen v případech extrémního množství aplikací, a proto by neměla mít vliv na normálního uživatele. - [%1$s] -\nTato chyba je mimo kontrolu Elementu. Múže k ní dojít z několika důvodů. Snad bude fungovat, když zkusíte znovu později, můžete též zkontrolovat, zda Google Play Service nejsou omezeny v množství dat v systémových nastavení nebo zda hodiny zařízení jdou správné nebo k chybě může dojít na zvláštní ROM. - [%1$s] -\nTato chyba je mimo kontrolu Elementu. V telefonu není žádný účet Google. Prosím, spusťte správce účtů a doplňte účet Google. + [%1$s] +\nTato chyba je mimo kontrolu ${app_name}u a podle Googlu indikuje, že zařízení má příliš mnoho aplikací registrovaných s FCM. Tato chyba se ukáže jen v případech extrémního množství aplikací, a proto by neměla mít vliv na normálního uživatele. + [%1$s] +\nTato chyba je mimo kontrolu ${app_name}u. Múže k ní dojít z několika důvodů. Snad bude fungovat, když zkusíte znovu později, můžete též zkontrolovat, zda Google Play Service nejsou omezeny v množství dat v systémových nastavení nebo zda hodiny zařízení jdou správné nebo k chybě může dojít na zvláštní ROM. + [%1$s] +\nTato chyba je mimo kontrolu ${app_name}u. V telefonu není žádný účet Google. Prosím, spusťte správce účtů a doplňte účet Google. Přidat účet Registrace tokenu FCM token se podařilo úspěšné registrovat na homeserveru. @@ -583,17 +854,17 @@ Restart služby se nezdařil Spustit při zavádění Služba se spustí při restartu zařízení. - Služba se nespustí při startu zařízení, neobdržíte oznámení, dokud jednou neotevřete Element. + Služba se nespustí při startu zařízení, neobdržíte oznámení, dokud jednou neotevřete ${app_name}. Zapnout Spustit při zavádění Zkontrolovat omezení na pozadí - Omezení na pozadí jsou pro Element vypnuta. Tento test by měl běžet s mobilními daty (ne WIFI). + Omezení na pozadí jsou pro ${app_name} vypnuta. Tento test by měl běžet s mobilními daty (ne WIFI). \n%1$s - Omezení na pozadí jsou pro Element zapnuta. + Omezení na pozadí jsou pro ${app_name} zapnuta. \nČinnosti prováděné aplikací budou agresivně omezeny, bude-li v pozadí, a to může mít vliv na oznámení. \n%1$s Vypnout omezení Optimalizace baterie - Optimalizace baterie nemá na Element vliv. + Optimalizace baterie nemá na ${app_name} vliv. Nechá-li uživatel zařízení vytažený ze zásuvky a v klidu po nějakou dobu a s obrazovkou vypnutou, zařízení vstoupí do stavu spánku. Ten zamezí aplikacím přístup k síti a odloží jejich úlohy, synchronizaci a běžná upozornění. Ignorovat optimalizaci Normální @@ -623,11 +894,11 @@ Synchronizace na pozadí Režim synchronizace na pozadí Optimalizován pro baterii - Element bude synchronizovat na pozadí způsobem, který šetří omezené zdroje zařízení (baterii). + ${app_name} bude synchronizovat na pozadí způsobem, který šetří omezené zdroje zařízení (baterii). \nV závislosti na stavu zdrojů zařízení může být sync operačním systémem odložen. Optimalizováno pro reálný čas - Element bude synchronizovat na pozadí periodicky v přesný čas (nastavitelné). -\nTo bude mít vliv na využití rádia a baterie, stálé oznámení o tom, že Element čeká na události, bude zobrazeno. + ${app_name} bude synchronizovat na pozadí periodicky v přesný čas (nastavitelné). +\nTo bude mít vliv na využití rádia a baterie, stálé oznámení o tom, že ${app_name} čeká na události, bude zobrazeno. Žádný sync na pozadí Neobdržíte oznámení o příchozích zprávách, je-li aplikace na pozadí. Aktualizace nastavení se nezdařila. @@ -688,17 +959,17 @@ Odhalení Správa Vašich nastaveni pro odhalení. Soukromí ohledně oznámení - Element může běžet na pozadí, aby spravoval Vaše oznámení bezpečně a v soukromí. To může mít vliv na baterii. + ${app_name} může běžet na pozadí, aby spravoval Vaše oznámení bezpečně a v soukromí. To může mít vliv na baterii. Udělit oprávnění Vybrat jinou volbu Spojení na pozadí - Element potřebuje udržovat spojení na pozadí se slabým vlivem, abyste obdrželi spolehlivá oznámení. -\nNa příští obrazovce budete dotázáni o svolení nechat Element vždy v chodu na pozadí, prosím, souhlaste. + ${app_name} potřebuje udržovat spojení na pozadí se slabým vlivem, abyste obdrželi spolehlivá oznámení. +\nNa příští obrazovce budete dotázáni o svolení nechat ${app_name} vždy v chodu na pozadí, prosím, souhlaste. Udělit oprávění Analýza Odeslat analytická data - Element sbírá anonymní analytická data pro vylepšení aplikace. - Prosím, zapněte analýzu pro vylepšení Elementu. + ${app_name} sbírá anonymní analytická data pro vylepšení aplikace. + Prosím, zapněte analýzu pro vylepšení ${app_name}u. Ano, chci pomoci! Režim úsporných dat Režim úsporných data zavádí specifický filtr, takže aktualizace přítomnosti a oznámení o psaní jsou fitrovány. @@ -1119,7 +1390,7 @@ Přistupová fráze se neshoduje Prosím, zadejte přístupovou frázi Přístupová fráze je příliš slabá - Prosím, smažte přístupovou frázi, přejete-li si, aby Element generoval klíč pro obnovu. + Prosím, smažte přístupovou frázi, přejete-li si, aby ${app_name} generoval klíč pro obnovu. Žádná relace Matrix není dostupná Nikdy neztraťte šifrované zprávy Zprávy v šifrovaných místnostech jsou zabezpečeny pomocí end-to-end šifrováním. Pouze Vy a adresát(i) máte klíče ke čtení těchto zpráv. @@ -1211,7 +1482,7 @@ Podpis Neplatná odpověď z hledání homeserverů Volby serveru automaticky - Element nalezl vlastní konfiguraci serveru pro doménu Vašeho uživatelského Id \"%1$s\": + ${app_name} nalezl vlastní konfiguraci serveru pro doménu Vašeho uživatelského Id \"%1$s\": \n%2$s Použít konfiguraci Byli jste odhlášení kvůli chybným či neplatným ověřovacím údajům. @@ -1286,7 +1557,7 @@ Prosím, čekejte… Všechny komunity Nelze provést náhled této místnosti - Náhled místnosti čitelné pro všechny zatím Element nepodporuje + Náhled místnosti čitelné pro všechny zatím ${app_name} nepodporuje Místnosti Přímé zprávy Nová místnost @@ -1426,7 +1697,7 @@ Obsah byl nahlášen jako nepatřičný. \n \nPokud si dále nepřejete vidět obsah tohoto uživatele, můžete jej ignorovat a tím skrýt jejich zprávy. - Element potřebuje práva k uložení Vašich E2E klíčů na disk. + ${app_name} potřebuje práva k uložení Vašich E2E klíčů na disk. \n \nProsím, povolte přístup v příštím dialogu, abyste mohli exportovat své klíče manuálně. Právě nyní není k dispozici žádné síťové spojení @@ -1470,7 +1741,6 @@ Adresa Prémiový hosting pro organizace Zadejte adresu Modular Element nebo serveru, který chcete použít - Zadejte adresu serveru nebo Elementu, k němuž se chcete připojit Při načítání stránky došlo k chybě: %1$s (%2$d) Aplikace se nemůže přihlásit k tomuto homeserveru. Homeserver podporuje následující typy přihlášení: %1$s. \n @@ -1568,7 +1838,7 @@ \nPro přístup k účtu a zprávám se znovu se přihlaste. Ztratíte přístup k šifrovaným zprávám, pokud se nepřihlásíte za účelem obnovy šifrovacích klíčů. Vyčistit data - Tato relace je pro uživatele %1$s a Vy jste zadali údaje pro uživatele %2$s. Element toto nepodporuje. + Tato relace je pro uživatele %1$s a Vy jste zadali údaje pro uživatele %2$s. ${app_name} toto nepodporuje. \nProsím, nejdříve vyčistěte data a pak se přihlaste k jinému účtu. Váš odkaz matrix.to byl chybný Popis je příliš krátký @@ -1586,7 +1856,7 @@ Jiné relace Ukazuji jen první výsledky, zadejte více znaků… Fail-fast - Element se může zbořit častěji, když se objeví neočekávané chyby + ${app_name} se může zbořit častěji, když se objeví neočekávané chyby Předsune ¯\\_(ツ)_/¯ do textové zprávy Zapnout šifrování Jakmile zapnuto, šifrování nelze vypnout. @@ -1658,9 +1928,9 @@ Moderátor v %1$s Vlastní (%1$d) in %2$s Přeskočit k potvrzení přečtení - Element neobstarává události typu \'%1$s\' - Element neobstarává zprávy typu \'%1$s\' - Element narazil na chybu při převádění obsahu události s id \'%1$s\' + ${app_name} neobstarává události typu \'%1$s\' + ${app_name} neobstarává zprávy typu \'%1$s\' + ${app_name} narazil na chybu při převádění obsahu události s id \'%1$s\' Odignorovat Tato relace nemůže sdílet toto ověření s jinými z Vašich relací. \nToto ověření bude uloženo místně a sdíleno v budoucí verzi aplikace. @@ -1758,7 +2028,7 @@ Událost smazána uživatelem, důvod: %1$s Událost moderována správcem místnosti, důvod: %1$s Klíče jsou již aktuální! - Element Android + ${app_name} Android Požadavky na klíče Odemknout zašifrovanou historii zpráv Obnovit @@ -1879,13 +2149,13 @@ To není platný identifikátor uživatele. Platný formát: \'@uživatel:homeserver.org\' Nemohu najít platný domovský server. Prosím, zkontrolujte svůj identifikátor Režim letadlo je zapnut - Použijte na svých zařízeních nejnovější Element, Element Web, Element Desktop, Element iOS, Element pro Android nebo jiný Matrix klient schopný křížového přihlášení - Element Web -\nElement Desktop - Element iOS -\nElement Android + Použijte na svých zařízeních nejnovější ${app_name}, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} pro Android nebo jiný Matrix klient schopný křížového přihlášení + ${app_name} Web +\n${app_name} Desktop + ${app_name} iOS +\n${app_name} Android nebo jiný Matrix klient schopný křížového přihlášení - Použijte na svých zařízeních nejnovější Element: + Použijte na svých zařízeních nejnovější ${app_name}: Vynutí zahození probíhající skupinové relace v šifrované místnosti Podporováno jen v šifrovaných místnostech Použijte své %1$s nebo použijte svůj %2$s a pokračujte. @@ -1927,11 +2197,11 @@ Načítám dostupné jayzky… Otevřít všeobecné podmínky %s Odpojit se od serveru identit %s\? - Tento server identit je zastaralý. Element podporuje jen API V2. + Tento server identit je zastaralý. ${app_name} podporuje jen API V2. Tato operace není možná. Domovský server je zastaralý. Prosím, nejdříve nastavit server identit. Prosím, přijměte nejdříve všeobecné podmínky serveru identit v nastavení. - Pro Vaše soukromí, Element podporuje jen odesílání hašovaných emailových adress a telefonních čísel. + Pro Vaše soukromí, ${app_name} podporuje jen odesílání hašovaných emailových adress a telefonních čísel. Propojení selhalo. S tímto identifikátorem neexistuje žádné propojení. Váš domovský server (%1$s) navrhuje použít %2$s za Váš domovský server @@ -1947,8 +2217,8 @@ Zahájit video schůzku Zahájit hlasovou schůzku Schůzky používají pravidla zabezpečení a přístupu Jitsi. Všichni lidé nyní v místnosti uvidí pozvánku k připojení, zatímco Vaše schůzka probíhá. - Nemůžete spustit hovor se sebou - Nemůžete spustit hovor se sebou, počkejte, až účastníci přijmou pozvánku + Nemůžete zahájit hovor se sebou + Nemůžete zahájit hovor se sebou, počkejte, až účastníci přijmou pozvánku Přidání widgetu se nezdařilo Odstranění widgetu se nezdařilo Přijmout @@ -1957,7 +2227,7 @@ Kopírovat Podařilo se Oznámení - Volání Elementu se nezdařilo + Volání ${app_name}u se nezdařilo Založit spojení v reálném čase se nezdařilo. \nProsím, požádejte správce svého homeserveru o konfiguraci TURN serveru, aby volání fungovala spolehlivě. Vybrat zvukové zařízení @@ -2066,7 +2336,6 @@ Zapnout křížový podpis Uložit mediální soubor se nezdařilo Potvrďte svou identitu ověřením tohoto přihlášení, udělujíce přístup k šifrovaným zprávám. - Je nám líto, tato operace zatím není možná s účty připojenými pomocí Single Sign-On. Nastavit roli Role Otevřít chat @@ -2101,11 +2370,10 @@ Nemůžete číst tuto zprávu, protože Vaše relace není pro odesílatele důvěryhodná Nemůžete číst tuto zprávu, protože odesílatel účelově neposlal klíče Čekám na historii šifrování - Riot je nyní Element! - Jsme nadšení, že smíme oznámit změnu jména! Vaše app je aktuální a jste přihlášeni do svého účtu. - ROZUMÍM - DOZVĚDĚT SE VÍCE - element + Riot je nyní Element! + Jsme nadšení, že smíme oznámit změnu jména! Vaše app je aktuální a jste přihlášeni do svého účtu. + ROZUMÍM + DOZVĚDĚT SE VÍCE Uložit klíče pro obnovu v Přidat z mého adresáře Váš adresář je prázdný @@ -2159,13 +2427,13 @@ Změny zavrhnout Zůstávají neuložené změny. Zavrhnout změny\? Místnost nebyla ještě založena. Zrušit založení místnosti\? - Kód PIN se vyžaduje při každém otevření Elementu. - Kód PIN se vyžaduje, pokud se Element nepoužil 2 minuty. + Kód PIN se vyžaduje při každém otevření ${app_name}u. + Kód PIN se vyžaduje, pokud se ${app_name} nepoužil 2 minuty. Žádat PIN po 2 minutách Zobrazit pouze počet nepřečtených zpráv v jednoduchém oznámení. Zobrazit podrobnosti např. názvy místností a obsah zpráv. Zobrazit obsah v oznámení - Kód PIN je jediný způsob, jak odemknout Element. + Kód PIN je jediný způsob, jak odemknout ${app_name}. Zapnout biometriku specifickou pro zařízení, např. otisk prstu nebo rozpoznání obličeje. Zapnout biometriku Nastavit ochranu @@ -2235,8 +2503,8 @@ Sdílet můj kód Skenovat QR kód To není platný matrixový QR kód - 🔐️ Přidej se ke mně v elementu - Ahoj, pojď si povídat v Elementu: %s + 🔐️ Přidej se ke mně v ${app_name}u + Ahoj, pojď si povídat v ${app_name}u: %s Pozvat přátele Přidat lidi "Téma: " @@ -2354,7 +2622,7 @@ Přidat Výchozí téma Ověření se nezdařilo - Element vyžaduje zadání přihlašovacích údajů k provedení této akce. + ${app_name} vyžaduje zadání přihlašovacích údajů k provedení této akce. Je nutné opětovné ověření Nastavení křížového podepisování se nezdařilo Neautorizováno, chybí platné ověřovací údaje @@ -2388,4 +2656,60 @@ Přidržet Pokračovat Návrat + Obsah události + Stavová událost byla odeslána! + Událost odeslána! + Poškozená událost + Chybí typ zprávy + Žádný obsah + Obsah události + Stavový klíč + Typ + Odeslat vlastní stavovou událost + Upravit obsah + Stavové události + Odeslat stavovou událost + Odeslat vlastní událost + Prozkoumejte stav místnosti + Vývojové nástroje + Zobrazit potvrzení o přečtení + Neupozorňovat + Upozornit bez zvuku + Upozornit zvukem + Zpráva nebyla odeslána z důvodu chyby + Zkontrolováno + Zavřít výběr emoji + Úvodní synchronizace: +\nČekání na odpověď serveru… + Otevřít výběr emoji + Důvěryhodná úroveň důvěryhodnosti + Úroveň důvěryhodnosti varování + Výchozí úroveň důvěryhodnosti + Vybrané + Video + Tato místnost má neodeslaný koncept + Některé zprávy nebyly odeslány + Smazat avatar + Změnit avatar + Obrázek + Importovat klíč ze souboru + Otevřít widgety + Snímek obrazovky + + %d položka + %d položky + %d položek + + Limit není znám. + Váš domovský server přijímá přílohy (soubory, média atd.) o velikosti až %s. + Limit nahrávání souborů na server + Verze serveru + Název serveru + Nastavení místnosti + Opustit aktuální konferenci a přepnout na jinou\? + Verze místnosti + Nová hodnota + Přepnout + Úvodní synchronizace: +\nStahuji data… \ No newline at end of file diff --git a/vector/src/main/res/values-cy/strings.xml b/vector/src/main/res/values-cy/strings.xml index ccfefa7c0d..db4aa089e2 100644 --- a/vector/src/main/res/values-cy/strings.xml +++ b/vector/src/main/res/values-cy/strings.xml @@ -3,8 +3,7 @@ Thema Golau Thema Tywyll - Thema Du - Thema Status.im + Thema Du Yn paratoi gwasanaeth diff --git a/vector/src/main/res/values-da/strings.xml b/vector/src/main/res/values-da/strings.xml index 14b44a616b..d74de284f4 100644 --- a/vector/src/main/res/values-da/strings.xml +++ b/vector/src/main/res/values-da/strings.xml @@ -1,9 +1,78 @@ + %1$s: %2$s + %1$s sendte et billede. + %ss invitation + %1$s inviterede %2$s + %1$s inviterede dig + %1$s forbandt + %1$s forlod rummet + %1$s afviste invitationen + %1$s kickede %2$s + %1$s unbannede %2$s + %1$s bannede %2$s + %1$s trak %2$ss invitation tilbage + %1$s skiftede sin avatar + %1$s satte sit viste navn til %2$s + %1$s ændrede sit viste navn fra %2$s til %3$s + %1$s fjernede sit viste navn (%2$s) + %1$s ændrede emnet til: %2$s + %1$s ændrede rumnavnet til: %2$s + %s startede et videoopkald. + %s startede et stemmeopkald. + %s svarede opkaldet. + %s stoppede opkaldet. + %1$s gjorde den fremtidige rum historik synlig for %2$s + alle medlemmer af rummet, fra det tidspunkt de er inviteret. + alle medlemmer af rummet, fra det tidspunkt de er forbundede. + Alle medlemmer af rummet. + alle. + ukendt (%s). + %1$s slog ende-til-ende kryptering til (%2$s) + + %1$s forespurgte en VoIP konference + VoIP konference startet + VoIP konference afsluttet + + (avatar blev også ændret) + %1$s fjernede navnet på rummet + %1$s fjernede emnet for rummet + %1$s opdaterede sin profil %2$s + %1$s inviterede %2$s til rummet + %1$s accepterede invitationen til %2$s + + ** Kunne ikke dekryptere: %s ** + Afsenderens enhed har ikke sendt os nøglerne til denne besked. + + Kunne ikke hemmeligholde + Kunne ikke sende besked + + Kunne ikke uploade billede + + Netværks fejl + Matrix fejl + + Det er i øjeblikket ikke muligt at genforbinde til et tomt rum. + + Krypteret besked + + mailadresse + Telefonnummer + + Invitation fra %s + Invitation til rum + %1$s og %2$s + + + %1$s og 1 anden + %1$s og %2$d andre + + + Tomt rum Lyst Tema Mørkt Tema - Sort Tema + Sort Tema Synkroniserer Lyt efter begivenheder @@ -79,7 +148,7 @@ Bruger katalog Kun Matrix kontakter Ingen samtaler - Du gav ikke Element tilladelse til at se dine lokale kontakter + Du gav ikke ${app_name} tilladelse til at se dine lokale kontakter Ingen resultater Rum @@ -230,25 +299,25 @@ Du er blevet logget ud af alle enheder og vil ikke længere modtage pushnotifika Kan ikke optage video Information - Element skal bruge tilladelse til at tilgå dit billed- og videoarkiv for at sende og gemme vedhæftninger. + ${app_name} skal bruge tilladelse til at tilgå dit billed- og videoarkiv for at sende og gemme vedhæftninger. Giv venligst tilladelse ved næste pop-up for at kunne sende filer fra din telefon. - Element skal bruge tilladelse til at bruge dit kamera for at billeder og lave videoopkald. + ${app_name} skal bruge tilladelse til at bruge dit kamera for at billeder og lave videoopkald. Giv venligst tilladelse ved næste pop-up for at kunne lave opkald. - Element skal bruge tilladelse til at bruge din mikrofon for at lave lydopkald. + ${app_name} skal bruge tilladelse til at bruge din mikrofon for at lave lydopkald. Giv venligst tilladelse ved næste pop-up for at kunne lave opkaldet. - Element skal bruge tilladelse til at bruge dit kamera og din mikrofon for at lave videoopkald. + ${app_name} skal bruge tilladelse til at bruge dit kamera og din mikrofon for at lave videoopkald. Giv venligst tilladelse ved næste pop-up for at lave opkaldet. - Element skal bruge adgang til dine kontakter for at finde andre Matrix brugere ud fra deres email og telefonnumre. + ${app_name} skal bruge adgang til dine kontakter for at finde andre Matrix brugere ud fra deres email og telefonnumre. -Giv venligst tilladelse ved næste pop-up for at finde kontakter der er på Element. - Element skal bruge adgang til dine kontakter for at finde andre Matrix brugere ud fra deres email og telefonnumre. +Giv venligst tilladelse ved næste pop-up for at finde kontakter der er på ${app_name}. + ${app_name} skal bruge adgang til dine kontakter for at finde andre Matrix brugere ud fra deres email og telefonnumre. -Vil du give Element adgang til dine kontakter? +Vil du give ${app_name} adgang til dine kontakter? Beklager… Handlingen blev ikke udført fordi der mangler tilladelser diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml index 43eef6909f..437c517574 100644 --- a/vector/src/main/res/values-de/strings.xml +++ b/vector/src/main/res/values-de/strings.xml @@ -1,5 +1,275 @@ + %1$s: %2$s + %1$s hat ein Bild gesendet. + Einladung von %s + %1$s hat %2$s eingeladen + %1$s hat dich eingeladen + %1$s hat den Raum betreten + %1$s hat den Raum verlassen + %1$s hat die Einladung abgelehnt + %1$s hat %2$s gekickt + %1$s hat die Sperre von %2$s aufgehoben + %1$s hat %2$s verbannt + %1$s hat die Einladung für %2$s zurückgezogen + %1$s hat das Profilbild geändert + %1$s hat den Anzeigenamen geändert in %2$s + %1$s hat den Anzeigenamen von %2$s auf %3$s geändert + %1$s hat den Anzeigenamen gelöscht (%2$s) + %1$s hat das Raumthema geändert auf: %2$s + %1$s hat den Raumnamen geändert in: %2$s + %s hat einen Videoanruf durchgeführt. + %s hat einen Sprachanruf getätigt. + %s hat den Anruf angenommen. + %s hat den Anruf beendet. + %1$s hat den zukünftigen Chatverlauf sichtbar gemacht für %2$s + Alle Mitglieder (ab dem Zeitpunkt, an dem sie eingeladen wurden). + Alle Mitglieder (ab dem Zeitpunkt, an dem sie den Raum betreten haben). + alle Raum-Mitglieder. + Jeder. + Unbekannt (%s). + %1$s hat die Ende-zu-Ende-Verschlüsselung aktiviert (%2$s) + %1$s möchte eine VoIP-Konferenz beginnen + VoIP-Konferenz gestartet + VoIP-Konferenz beendet + (Profilbild wurde ebenfalls geändert) + %1$s hat den Raumnamen entfernt + %1$s hat das Raum-Thema entfernt + %1$s hat das Benutzerprofil aktualisiert %2$s + %1$s hat eine Einladung an %2$s gesendet + %1$s hat die Einladung in %2$s akzeptiert + ** Nicht entschlüsselbar: %s ** + Das absendende Gerät hat uns keine Schlüssel für diese Nachricht übermittelt. + + Entfernen nicht möglich + Nachricht kann nicht gesendet werden + Bild konnte nicht hochgeladen werden + + Netzwerk-Fehler + Matrix-Fehler + + + + + Es ist aktuell nicht möglich, einen leeren Raum erneut zu betreten. + + E-Mail-Adresse + Telefonnummer + %1$s hat einen Sticker gesendet. + + Einladung von %s + Raumeinladung + %1$s und %2$s + Leerer Raum + + %1$s und 1 andere(r) + %1$s und %2$d andere + + Nachricht entfernt + Nachricht entfernt von %1$s + Nachricht entfernt [Grund: %1$s] + Nachricht entfernt von %1$s [Grund: %2$s] + %s hat diesen Raum aufgewertet. + Sende eine Nachricht… + Sendewarteschlange leeren + Erste Synchronisation: +\nImportiere Benutzerkonto… + Erste Synchronisation: +\nImportiere Cryptoschlüssel + Erste Synchronisation: +\nImportiere Räume + Erste Synchronisation: +\nImportiere betretene Räume + Erste Synchronisation: +\nImportiere eingeladene Räume + Erste Synchronisation: +\nImportiere verlassene Räume + Erste Synchronisation: +\nImportiere Communities + Erste Synchronisation: +\nImportiere Benutzerdaten + %1$s hat die Einladung an %2$s, den Raum zu betreten, zurückgezogen + %1$s\'s Einladung. Grund: %2$s + %1$s hat %2$s eingeladen. Grund: %3$s + %1$s hat dich eingeladen. Grund: %2$s + %1$s ist dem Raum beigetreten. Grund: %2$s + %1$s hat den Raum verlassen. Grund: %2$s + %1$s hat die Einladung abgelehnt. Grund: %2$s + %1$s hat %2$s gekickt. Grund: %3$s + %1$s hat Sperre von %2$s aufgehoben. Grund: %3$s + %1$s hat %2$s verbannt. Grund: %3$s + %1$s hat eine Einladung an %2$s gesandt um diesem Raum beizutreten. Grund: %3$s + %1$s hat Einladung an %2$s zu Betreten dieses Raumes zurückgezogen. Grund: %3$s + %1$s hat die Einladung für %2$s angenommen. Grund: %3$s + %1$s hat Einladung für %2$s verworfen. Grund: %3$s + + %1$s fügt %2$s als eine Adresse für diesen Raum hinzu. + %1$s fügt %2$s als Adressen für diesen Raum hinzu. + + + %1$s entfernt %2$s als eine Adresse für diesen Raum. + %1$s entfernt %2$s als Adressen für diesen Raum. + + %1$s fügt %2$s als Adresse für diesen Raum hinzu und entfernt %3$s. + %1$s legt die Hauptadresse fest für diesen Raum als %2$s fest. + %1$s entfernte die Hauptadresse für diesen Raum. + %1$s hat Gästen erlaubt den Raum zu betreten. + %1$s hat Gästen untersagt den Raum zu betreten. + %1$s aktivierte Ende-zu-Ende-Verschlüsselung. + %1$s aktivierte Ende-zu-Ende-Verschlüsselung (unbekannter Algorithmus %2$s). + Du hast ein Bild gesendet. + Du hast einen Sticker gesendet. + Deine Einladung + %1$s hat den Raum erstellt + Du hast den Raum erstellt + Du hast %1$s eingeladen + Du bist dem Raum beigetreten + Du hast den Raum verlassen + Du hast die Einladung abgelehnt + Du hast %1$s aus dem Raum entfernt + Du hast den Bann von %1$s aufgehoben + Du hast %1$s gebannt + Du hast die Einladung von %1$s zurückgenommen + Du hast dein Profilbild geändert + Du hast deinen Anzeigenamen zu %1$s geändert + Du hast deinen Anzeigenamen von %1$s zu %2$s geändert + Du hast deinen Anzeigenamen entfernt (er war %1$s) + Du hast das Thema geändert auf: %1$s + %1$s hat das Bild des Raumes geändert + Du hast das Bild des Raumes geändert + Du hast den Raumnamen zu %1$s geändert + Du hast einen Videoanruf gestartet. + Du hast einen Audioanruf gestartet. + Du hast den Anruf angenommen. + Du hast den Anruf beendet. + Du hast den zukünftigen Nachrichtenverlauf für %1$s sichtbar gemacht + Du hast Ende-zu-Ende-Verschlüsselung aktiviert (%1$s) + Du hast den Raum aufgwertet. + Du hast eine VoIP-Konferenz angefordert + Du hast den Raumnamen entfernt + Du hast das Raumthema entfernt + %1$s hat das Bild des Raumes entfernt + Du hast das Bild des Raumes entfernt + Du hast dein Profil %1$s aktualisiert + Du hast %1$s in den Raum eingeladen + Du hast die Einladung für %1$s zurückgenommen + Du hast die Einladung für %1$s akzeptiert + %1$s hat das %2$s Widget hinzugefügt + Du hast das %1$s Widget hinzugefügt + %1$s hat das %2$s Widget entfernt + Du hast das %1$s Widget entfernt + %1$s hat das %2$s Widget modifiziert + Du hast das %1$s Widget modifiziert + Administrator + Moderator:in + Standard + Benutzerdefiniert (%1$d) + Benutzerdefiniert + Du hast die Berechtigungsstufe von %1$s geändert. + %1$s hat die Berechtigungsstufe von %2$s geändert. + %1$s von %2$s zu %3$s + Deine Einladung. Grund: %1$s + Du hast %1$s eingeladen. Grund: %2$s + Du bist dem Raum beigetreten. Grund: %1$s + Du hast den Raum verlassen. Grund: %1$s + Du hast die Einladung abgelehnt. Grund: %1$s + Du hast %1$s aus dem Raum entfernt. Grund %2$s + Du hast den Bann von %1$s aufgehoben. Grund: %2$s + Du hast %1$s gebannt. Grund: %2$s + Du hast %1$s in den Raum eingeladen. Grund: %2$s + Du hast die Einladung für %1$s zurückgenommen. Grund: %2$s + Du hast die Einladung von %1$s angenommen. Grund: %2$s + Du hast die Einladung von %1$s abgelehnt. Grund: %2$s + + Du hast die Raumaddresse %1$s hinzugefügt. + Du hast die Raumaddressen %1$s hinzugefügt. + + + Du hast die Raum-Adresse %1$s vom Raum entfernt. + Du hast die Raum-Adressen %1$s vom Raum entfernt. + + Du hast den Raumaddressen %1$s hinzugefügt und %2$s entfernt. + Du hast die Hauptaddresse für diesen Raum auf %1$s gesetzt. + Du hast die Hauptaddresse des Raums entfernt. + Du hast Gästen erlaubt dem Raum beizutreten. + Du hast Gästen untersagt dem Raum beizutreten. + Du hast Ende-zu-Ende-Verschlüsselung aktiviert. + Du hast Ende-zu-Ende-Verschlüsselung aktiviert (unbekannter Algorithmus %1$s). + %s hat Daten gesendet, um einen Anruf zu starten. + Du hast Daten geschickt, um eine Anruf zu starten. + Du hast Gästen erlaubt hier beizutreten. + %1$s hat Gästen erlaubt hier beizutreten. + Du bist beigetreten. Grund: %1$s + %1$s ist beigetreten. Grund: %2$s + Du hast die Einladung für %1$s zurückgezogen + %1$s hat die Einladung für %2$s zurückgezogen + Du hast %1$s eingeladen + %1$s hat %2$s eingeladen + Du hast zukünftige Nachrichten für %1$s sichtbar gemacht + %1$s hat zukünftige Nachrichten für %2$s sichtbar gemacht + Du hast den Raum verlassen + %1$s hat den Raum verlassen + Du bist beigetreten + %1$s ist beigetreten + Du hast eine Diskussion erstellt + %1$s hat eine Diskussion erstellt + %s hat hier ein Upgrade durchgeführt. + Du hast hier ein Upgrade durchgeführt. + Du hast Gästen untersagt den Raum zu betreten. + %1$s hat Gästen untersagt den Raum zu betreten. + Du bist gegangen. Grund: %1$s + %1$s ist gegangen. Grund: %2$s + Du hast die Adressen für diesen Raum geändert. + %1$s hat die Adressen für diesen Raum geändert. + Du hast die Haupt- und die alternativen Adressen für diesen Raum geändert. + %1$s hat die Haupt- und die alternativen Adressen für diesen Raum geändert. + Du hast die alternativen Adressen für diesen Raum geändert. + %1$s hat die alternativen Adressen für diesen Raum geändert. + + Du entferntest die alternative Adresse %1$s für diesen Raum. + Du entferntest die alternativen Adressen %1$s für diesen Raum. + + + %1$s entfernte die alternative Adresse %2$s für diesen Raum. + %1$s entfernte die alternativen Adressen %2$s für diesen Raum. + + + Du hast die alternative Adresse %1$s für diesen Raum hinzugefügt. + Du hast die alternativen Adressen %1$s für diesen Raum hinzufügt. + + + %1$s fügte die alternative Adresse %2$s für diesen Raum hinzu. + %1$s fügte die alternativen Adressen %2$s für diesen Raum hinzu. + + Leerer Raum (war %s) + + %1$s, %2$s, %3$s und %4$d andere/r + %1$s, %2$s, %3$s und %4$d andere + + %1$s, %2$s, %3$s und %4$s + %1$s, %2$s und %3$s + 🎉 Alle Server sind von der Teilnahme ausgeschlossen! Dieser Raum kann nicht mehr genutzt werden. + Keine Änderung. + • Server, die mit IPs übereinstimmen, sind jetzt gesperrt. + • Server, die mit IPs übereinstimmen, sind nicht erlaubt. + • Server, die mit %s übereinstimmen, wurden von der Elaubten-Liste entfernt. + • Server, die mit %s übereinstimmen, sind jetzt erlaubt. + • Server, die mit %s übereinstimmen, werden von der Sperrliste entfernt. + • Server, die mit %s übereinstimmen, sind jetzt gesperrt. + Du hast die Server-ACL für diesen Raum geändert. + %s hat die Server-Zugriffssteuerungsliste (ACL) für diesen Raum geändert. + • Server, die mit IPs übereinstimmen, sind gesperrt. + • Server, die mit IPs übereinstimmen, sind erlaubt. + • Server, die mit %s übereinstimmen, sind erlaubt. + • Server, die mit %s übereinstimmen, sind gesperrt. + Du hast die Server-ACL für diesen Raum gesetzt. + %s hat die Server-Zugriffssteuerungsliste (ACL) für diesen Raum gesetzt. + Du hast eine Videokonferenz geändert + Videokonferenz von %1$s geändert + Videokonferenz von %1$s beendet + Du hast eine Videokonferenz beendet + Du hast eine Videokonferenz gestartet + Videokonferenz von %1$s gestartet Nachrichten "Raum @@ -74,7 +344,7 @@ Lokales Adressbuch Nur Matrix-Kontakte Keine Konversationen - Element wurde nicht erlaubt, auf lokale Kontakte zuzugreifen + ${app_name} wurde nicht erlaubt, auf lokale Kontakte zuzugreifen Keine Ergebnisse Räume @@ -212,20 +482,20 @@ Video kann nicht aufgenommen werden Information - Element benötigt die Berechtigung, auf deine Fotos und Videos zugreifen zu können, um Anhänge zu senden und zu speichern.\n\nBitte erlaube den Zugriff im nächsten Dialog, um Dateien von deinem Gerät zu versenden. - Element benötigt die Berechtigung, auf deine Kamera zugreifen zu können, um Bilder aufzunehmen und Video-Anrufe durchzuführen. + ${app_name} benötigt die Berechtigung, auf deine Fotos und Videos zugreifen zu können, um Anhänge zu senden und zu speichern.\n\nBitte erlaube den Zugriff im nächsten Dialog, um Dateien von deinem Gerät zu versenden. + ${app_name} benötigt die Berechtigung, auf deine Kamera zugreifen zu können, um Bilder aufzunehmen und Video-Anrufe durchzuführen. " \n \nBitte erlaube den Zugriff im nächsten Dialog, um den Anruf durchzuführen." - Element benötigt die Berechtigung, auf dein Mikrofon zugreifen zu können, um (Sprach-)Anrufe tätigen zu können. + ${app_name} benötigt die Berechtigung, auf dein Mikrofon zugreifen zu können, um (Sprach-)Anrufe tätigen zu können. " \n \nBitte erlaube den Zugriff im nächsten Dialog, um den Anruf durchzuführen." - Element benötigt die Berechtigung, auf Kamera und Mikrofon zu zugreifen, um Video-Anrufe durchzuführen. + ${app_name} benötigt die Berechtigung, auf Kamera und Mikrofon zu zugreifen, um Video-Anrufe durchzuführen. \n \nBitte erlaube den Zugriff im nächsten Dialog, um den Anruf durchzuführen. - Element kann dein Adressbuch durchsuchen, um andere Matrix-Nutzer:innen anhand ihrer Email-Adresse und Telefonnummer zu finden. Wenn du der Nutzung deines Adressbuchs zu diesem Zweck zustimmst, erlaube den Zugriff im nächsten Popup-Fenster. - Element kann dein Adressbuch durchsuchen, um andere Matrix-Nutzer:innen anhand ihrer E-Mail-Adresse und Telefonnummer zu finden. + ${app_name} kann dein Adressbuch durchsuchen, um andere Matrix-Nutzer:innen anhand ihrer Email-Adresse und Telefonnummer zu finden. Wenn du der Nutzung deines Adressbuchs zu diesem Zweck zustimmst, erlaube den Zugriff im nächsten Popup-Fenster. + ${app_name} kann dein Adressbuch durchsuchen, um andere Matrix-Nutzer:innen anhand ihrer E-Mail-Adresse und Telefonnummer zu finden. \n \nStimmst du der Nutzung deines Adressbuchs zu diesem Zweck zu\? Entschuldige. Die Aktion wurde aufgrund fehlender Berechtigungen nicht ausgeführt @@ -271,7 +541,7 @@ Verbannen Verbannung aufheben Zum/r normalen Benutzer/in herabstufen - Zum Moderator machen + Zum/r Moderator:in machen Zum Admin machen Alle Nachrichten dieses/r Nutzers/in verbergen Alle Nachrichten dieses/r Nutzers/in anzeigen @@ -312,10 +582,10 @@ Fingerabdruck (%s): Konnte Identität des Remote-Servers nicht verifizieren. Dies kann bedeuten, dass jemand böswillig deinen Internetverkehr abfängt oder dass dein Telefon dem Zertifikat, dass der Remote-Server anbietet, nicht vertraut. - Wenn der Server-Administrator dir mitgeteilt hat, dass dies zu erwarten sei, stelle sicher, dass der Fingerabdruck unten mit dem von deinem Administrator bereitgestellten übereinstimmt. + Wenn der/die Server-Administrator:in dir mitgeteilt hat, dass dies zu erwarten sei, stelle sicher, dass der Fingerabdruck unten mit dem von deinem/r Administrator:in bereitgestellten übereinstimmt. Das Zertifikat unterscheidet sich von dem Zertifikat, dem dein Gerät ursprünglich vertraut hat. Dies ist SEHR UNGEWÖHNLICH. Es wird empfohlen, dass du dieses neue Zertifikat NICHT AKZEPTIERST. Das Zertifikat hat sich von einem ursprünglich vertrauenswürdigem Zertifikat in ein nicht vertrauenswürdiges Zertifikat geändert. Eventuell wurde das Zertifikat des Servers erneuert. Bitte erkundige dich beim Server-Administrator, welcher Fingerprint als vertrauenswürdig gilt. - Akzeptiere das Zertifikat nur dann, wenn der Server-Administrator einen Fingerprint veröffentlicht hat, der mit dem obigen übereinstimmt. + Akzeptiere das Zertifikat nur dann, wenn der/die Server-Administrator:in einen Fingerprint veröffentlicht hat, der mit dem obigen übereinstimmt. Raum-Details Personen @@ -613,7 +883,7 @@ Anfrage enthält keine user_id. Helles Design Dunkles Design - Schwarzes Design + Schwarzes Design Synchronisiere… Auf Ereignisse lauschen Nachrichten, die meinen Anzeigenamen enthalten @@ -681,7 +951,7 @@ Eingeladen Filter Gruppen-Mitglieder Filter Gruppen-Räume - Der Community-Administrator hat keine lange Beschreibung für diese Community zur Verfügung gestellt. + Die Community-Administration hat keine lange Beschreibung für diese Community zur Verfügung gestellt. Du wurdest von %2$s aus %1$s gekickt Du wurdest von %2$s aus %1$s verbannt Grund: %1$s @@ -749,7 +1019,7 @@ • Benachrichtigungen enthalten Metadaten und Nachrichteninhalte • Benachrichtigungen werden den Nachrichteninhalt nicht anzeigen Benachrichtungs-Datenschutz - Element kann im Hintergrund laufen um deine Benachrichtigungen sicher und privat zu verwalten. Dies kann den Energieverbrauch beeinflussen. + ${app_name} kann im Hintergrund laufen um deine Benachrichtigungen sicher und privat zu verwalten. Dies kann den Energieverbrauch beeinflussen. Berechtigung gewähren Wähle eine andere Option Sende einen Sticker @@ -760,8 +1030,8 @@ Account deaktivieren Deaktiviere meinen Account Sende Analysedaten - Element sammelt anonyme Analysedaten um uns zu helfen, die App zu verbessern. - Bitte aktive Analysedaten um uns zu helfen Element zu verbessern. + ${app_name} sammelt anonyme Analysedaten um uns zu helfen, die App zu verbessern. + Bitte aktive Analysedaten um uns zu helfen ${app_name} zu verbessern. Ja, ich möchte helfen! Ein benötigter Parameter fehlt. Ein Parameter ist nicht valide. @@ -783,7 +1053,7 @@ Verschlüsselungsschlüssel von deinen anderen Sitzungen erneut anfragen. Schlüsselanfrage gesendet. Anfrage gesendet - Bitte öffne Element auf einem anderen Gerät, das die Nachricht entschlüsseln kann, damit es die Schlüssel an diese Sitzung senden kann. + Bitte öffne ${app_name} auf einem anderen Gerät, das die Nachricht entschlüsseln kann, damit es die Schlüssel an diese Sitzung senden kann. Hier tippen… Sprachnachricht senden fortfahren mit… @@ -863,7 +1133,6 @@ Dein Home-Server unterstützt noch nicht das Nachladen von Raummitgliedern. Versuche es später. Entschuldige, ein Fehler trat auf Version %s - Status.im-Design Bitte eine Passphrase erstellen um exportierte Schlüssel zu verschlüsseln. Du musst dieselbe Passphrase eingeben um die Schlüssel importieren zu können. Erzeuge Passphrase Passphrasen stimmen nicht überein @@ -898,7 +1167,7 @@ Zeige Konto-Ereignisse Enthält Änderungen des Profilbilds und des Anzeigenamens. Anrufe - Nutze den Standard-Klingelton von Element für eingehende Anrufe + Nutze den Standard-Klingelton von ${app_name} für eingehende Anrufe Klingelton für eingehende Anrufe Wähle Klingelton für Anrufe: Akzeptieren @@ -919,10 +1188,10 @@ Aktiviere Sitzungseinstellungen. Benachrichtigungen sind für diese Sitzung aktiviert. - Benachrichtigungen sind für diese Sitzung nicht aktiviert. -\nBitte überprüfe die Einstellungen für Element. + Benachrichtigungen sind für diese Sitzung nicht aktiviert. +\nBitte überprüfe die Einstellungen für ${app_name}. Aktiviere - Element benutzt Google Play Dienste um Push-Nachrichten zu übermitteln, doch scheinen sie nicht korrekt konfiguriert zu sein: + ${app_name} benutzt Google Play Dienste um Push-Nachrichten zu übermitteln, doch scheinen sie nicht korrekt konfiguriert zu sein: \n%1$s Repariere Play-Dienste Firebase-Token @@ -943,17 +1212,17 @@ Dienst konnte nicht neugestartet werden Starte beim Hochfahren Dienst wird starten, wenn das Gerät neu gestartet wird. - Dieser Dienst wird nicht starten, wenn das Gerät neu gestartet wird. Du wirst keine Benachrichtigungen bekommen bis Element einmal geöffnet wurde. + Dieser Dienst wird nicht starten, wenn das Gerät neu gestartet wird. Du wirst keine Benachrichtigungen bekommen bis ${app_name} einmal geöffnet wurde. Aktiviere das Starten beim Hochfahren Überprüfe Hintergrund-Einschränkungen - Hintergrund-Einschränkungen sind für Element deaktiviert. Dieser Test sollte über mobile Daten ausgeführt werden (kein WLAN). + Hintergrund-Einschränkungen sind für ${app_name} deaktiviert. Dieser Test sollte über mobile Daten ausgeführt werden (kein WLAN). \n%1$s - Hintergrund-Einschränkungen sind für Element aktiviert. + Hintergrund-Einschränkungen sind für ${app_name} aktiviert. \nDie App wird aggressiv eingeschränkt, während sie im Hintergrund arbeiten möchte. Dies könnte Benachrichtigungen beeinflussen. \n%1$s Einschränkungen deaktivieren Batterieoptimierung - Element wird nicht von Batterieoptimierungen beeinflusst. + ${app_name} wird nicht von Batterieoptimierungen beeinflusst. Fehler bei Benachrichtigungen finden Diagnose von Fehlern Basisdiagnose ist OK. Wenn du immer noch keine Benachrichtigungen bekommst, sende bitte einen Fehlerbericht, um uns beim nachforschen zu helfen. @@ -963,8 +1232,8 @@ Wenn ein:e Benutzer:in ein abgestecktes Gerät mit ausgeschaltetem Bildschirm eine Weile nicht bewegt, wechselt es in den Bereitschaftsmodus. Dies hindert Apps daran, auf das Netzwerk zuzugreifen und verzögert die Ausführung von Aufgaben, Synchronisierungen und Standard-Alarmen. Ignoriere Optimierungen Hintergrundverbindung - Element muss eine Hintergrundverbindung (nur geringe Belastung) aufrechterhalten, um verlässliche Benachrichtigungen zu erhalten. -\nAuf dem nächsten Bildschirm wirst du gefragt, ob du Element erlauben möchtest im Hintergrund zu laufen. Bitte akzeptieren. + ${app_name} muss eine Hintergrundverbindung (nur geringe Belastung) aufrechterhalten, um verlässliche Benachrichtigungen zu erhalten. +\nAuf dem nächsten Bildschirm wirst du gefragt, ob du ${app_name} erlauben möchtest im Hintergrund zu laufen. Bitte akzeptieren. Berechtigung gewähren Beim Verifizieren deiner E-Mail-Adresse trat ein Fehler auf. Beim Verifizieren deiner Telefonnummer trat ein Fehler auf. @@ -990,7 +1259,7 @@ Stumm Bitte eine Passphrase eingeben Passphrase ist zu schwach - Bitte lösche die Passphrase, wenn Element einen Wiederherstellungs-Schlüssel erzeugen soll. + Bitte lösche die Passphrase, wenn ${app_name} einen Wiederherstellungs-Schlüssel erzeugen soll. Keine Matrix-Sitzung verfügbar Verliere nie wieder verschlüsselte Nachrichten Setze Passphrase @@ -1013,12 +1282,12 @@ Konnte Sicherung nicht löschen (%s) Lösche Sicherung Präferenz der Benachrichtigungen nach Ereignis - [%1$s] -\nDieser Fehler ist außerhalb von Element passiert. Google sagt, dass dieses Gerät zu viele Apps registriert hat um FCM zu nutzen. Der Fehler taucht nur auf, wenn sehr viele Apps installiert sind. Er sollte also den/die Durchschnittsnutzer:in nicht betreffen. - [%1$s] -\nDieser Fehler liegt nicht unter der Kontrolle von Element. Er kann aus verschiedenen Gründen auftreten. Vielleicht wird es funktionieren, wenn du es später noch einmal probierst. Außerdem kannst Du prüfen, ob die Datennutzung der Google Play-Dienste unbeschränkt ist und die Geräteuhr richtig eingestellt ist. Der Fehler kann aber auch unter Custom-ROMs auftreten. - [%1$s] -\nDieser Fehler ist außerhalb von Element passiert. Es gibt kein Google-Konto auf dem Gerät. Bitte füge ein Google-Konto hinzu. + [%1$s] +\nDieser Fehler ist außerhalb von ${app_name} passiert. Google sagt, dass dieses Gerät zu viele Apps registriert hat um FCM zu nutzen. Der Fehler taucht nur auf, wenn sehr viele Apps installiert sind. Er sollte also den/die Durchschnittsnutzer:in nicht betreffen. + [%1$s] +\nDieser Fehler liegt nicht unter der Kontrolle von ${app_name}. Er kann aus verschiedenen Gründen auftreten. Vielleicht wird es funktionieren, wenn du es später noch einmal probierst. Außerdem kannst Du prüfen, ob die Datennutzung der Google Play-Dienste unbeschränkt ist und die Geräteuhr richtig eingestellt ist. Der Fehler kann aber auch unter Custom-ROMs auftreten. + [%1$s] +\nDieser Fehler ist außerhalb von ${app_name} passiert. Es gibt kein Google-Konto auf dem Gerät. Bitte füge ein Google-Konto hinzu. Verwaltung der Krypto-Schlüssel Schlüssel-Sicherung verwalten Nachrichten in verschlüsselten Räumen sind mit Ende-zu-Ende-Verschlüsselung gesichert. Nur du und der/die Empfänger!nnen haben die Schlüssel um diese Nachrichten zu lesen. @@ -1129,7 +1398,7 @@ Passwörter stimmen nicht überein Ungültige Antwort beim Entdecken des Home-Servers Serveroptionen vervollständigen - Element hat eine benutzerdefinierte Serverkonfiguration für die Domäne deines Benutzernamens gefunden \"%1$s\": + ${app_name} hat eine benutzerdefinierte Serverkonfiguration für die Domäne deines Benutzernamens gefunden \"%1$s\": \n%2$s Nutze Konfiguration Initialisiere Dienst @@ -1224,7 +1493,7 @@ Bitte warten… Alle Communities Für diesen Raum kann keine Vorschau angezeigt werden - Die Vorschau von öffentlichen Räumen wird von Element noch nicht unterstützt + Die Vorschau von öffentlichen Räumen wird von ${app_name} noch nicht unterstützt Räume Direktnachrichten Neuer Raum @@ -1357,13 +1626,13 @@ Wir nutzen %s als Assistenten wenn dein Home-Server keinen anbietet (Deine IP-Adresse wird während des Anrufs geteilt) Führe einen Identitätsserver in deinen Einstellungen hinzu um diese Aktion auszuführen. Passwort bestätigen - Du kannst dies nicht auf einem mobilen Element tun + Du kannst dies nicht auf einem mobilen ${app_name} tun Authentifizierung benötigt Hintergrund-Synchronisierungsmodus - Element wird sich im Hintergrund auf eine Art synchronisieren die Ressourcen des Geräts (Akku) schont. + ${app_name} wird sich im Hintergrund auf eine Art synchronisieren die Ressourcen des Geräts (Akku) schont. \nAbhängig vom Ressourcen-Status deines Geräts kann dein System die Synchronisierung verschieben. - Element wird sich im Hintergrund periodisch zu einem bestimmten Zeitpunkt synchronisieren (konfigurierbar). -\nDies wird Funk- und Akkunutzung beeinflussen. Es wird eine permanente Benachrichtigung geben, die sagt, dass Element auf Ereignisse lauscht. + ${app_name} wird sich im Hintergrund periodisch zu einem bestimmten Zeitpunkt synchronisieren (konfigurierbar). +\nDies wird Funk- und Akkunutzung beeinflussen. Es wird eine permanente Benachrichtigung geben, die sagt, dass ${app_name} auf Ereignisse lauscht. %s \nDie Synchronisierung kann aufgrund deiner Ressourcen (Akku) oder Gerätezustands (schlafend) verschoben werden. Integrationen @@ -1453,7 +1722,7 @@ Dieser Inhalt wurde als unangebracht gemeldet. \n \nWenn du keine weiteren Inhalte dieses/r Nutzers/in sehen möchtest, kannst sie/ihn ignorieren, um jene Nachrichten auszublenden. - Element benötigt Berechtigungen, um deine E2E Schlüssel zu speichern. + ${app_name} benötigt Berechtigungen, um deine E2E Schlüssel zu speichern. \n \nBitte erlaube den Zugriff im nächsten Pop-Up sodass du deine Schlüssel manuell exportieren kannst. Aktuell besteht keine Netzwerkverbindung @@ -1546,8 +1815,7 @@ Es ist deine Konversation. Mache sie dir zu eigen. Premium-Hosting für Organisationen Gib die Adresse des Modular Element oder Servers ein, den du verwenden möchtest - Gibt die Adresse eines Servers oder eines Element ein, zu dem du dich verbinden möchtest - Die Anwendung kann sich nicht bei diesem Home-Server anmelden. Der Home-Server unterstützt die folgenden Anmeldetypen: %1$s. + Die Anwendung kann sich nicht bei diesem Home-Server anmelden. Der Home-Server unterstützt die folgenden Anmeldetypen: %1$s. \n \nMöchtest du dich mit einem Webclient anmelden\? Eine Bestätigungs-E-Mail wird an dich gesendet, um dein neues Passwort zu bestätigen. @@ -1600,7 +1868,7 @@ \nMelde dich erneut an, um auf deine Kontodaten und Nachrichten zuzugreifen. Du verlierst den Zugriff auf verschlüsselte Nachrichten, außer, du meldest dich an, um den Verschlüsselungsschlüssel wiederherzustellen. Daten löschen - Die aktuelle Sitzung gehört dem/der Benutzer!n%1$s. Die angegebenen Anmeldeinformationen sind von Benutzer!n %2$s. Dies wird nicht von Element unterstützt. + Die aktuelle Sitzung gehört dem/der Benutzer!n%1$s. Die angegebenen Anmeldeinformationen sind von Benutzer!n %2$s. Dies wird nicht von ${app_name} unterstützt. \nBitte zuerst die Daten löschen und dann erneut anmelden. matrix.to-Link fehlerhaft Die Beschreibung ist zu kurz @@ -1618,7 +1886,7 @@ Andere Sitzungen Zeigt nur die ersten Ergebnisse, gib mehr Buchstaben ein… Ausfallsicher - Element kann häufiger abstürzen, wenn ein unerwarteter Fehler auftritt + ${app_name} kann häufiger abstürzen, wenn ein unerwarteter Fehler auftritt Stellt einer Klartextnachricht ¯\\_(ツ)_/¯ voran Aktiviere Verschlüsselung Nach der Aktivierung kann die Verschlüsselung nicht deaktiviert werden. @@ -1688,9 +1956,9 @@ Admin in %1$s Moderation in %1$s Springen & als gelesen markieren - Element kann keine Ereignisse vom Typ \'%1$s\' - Element beherrscht keine Nachrichten vom Typ \'%1$s\' - Element ist beim verarbeiten des Ereignisinhalts mit der ID \'%1$s\' auf ein Problem gestoßen + ${app_name} kann keine Ereignisse vom Typ \'%1$s\' + ${app_name} beherrscht keine Nachrichten vom Typ \'%1$s\' + ${app_name} ist beim verarbeiten des Ereignisinhalts mit der ID \'%1$s\' auf ein Problem gestoßen Nicht ignorieren Diese Sitzung kann diese Verifizierung nicht mit deinen anderen Sitzungen teilen. \nDie Überprüfung wird lokal gespeichert und in einer zukünftigen Version der App freigegeben. @@ -1786,7 +2054,7 @@ Schlüssel sind bereits aktuell! Spoiler Benutzerdefiniert (%1$d) in %2$s - Element Android + ${app_name} Android Schlüsselanforderungen Schalte den verschlüsselten Nachrichtenverlauf frei Neu laden @@ -1887,14 +2155,14 @@ Datei wurde der Galerie hinzugefügt Datei konnte nicht zur Galerie hinzugefügt werden Neues Benutzerpasswort festlegen… - Nutze die neueste Version von Element auf deinen anderen Geräten, Element Web, Element Desktop, Element iOS, Element für Android oder einen anderen cross-signing fähigen Matrix client - Element Web -\nElement Desktop - Element iOS -\nElement Android + Nutze die neueste Version von ${app_name} auf deinen anderen Geräten, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} für Android oder einen anderen cross-signing fähigen Matrix client + ${app_name} Web +\n${app_name} Desktop + ${app_name} iOS +\n${app_name} Android oder einen anderen cross-signing fähigen Matrix Client - Nutze die neueste Version von Element auf deinen anderen Geräten: - Erzwingt das Verferfen der aktuell ausgehende Gruppensitzung in einem verschlüsseltem Raum + Nutze die neueste Version von ${app_name} auf deinen anderen Geräten: + Erzwingt das Verwerfen der aktuell ausgehende Gruppensitzung in einem verschlüsseltem Raum Wird nur in verschlüsselten Räumen unterstützt Benutze deine %1$s oder deinen %2$s um fortzufahren. Wiederherstellungsschlüssel verwenden @@ -1934,7 +2202,7 @@ Pause Kopieren Benachrichtigungen - Element-Anruf fehlgeschlagen + ${app_name}-Anruf fehlgeschlagen Abspielen Ablehnen Erfolg @@ -2024,7 +2292,7 @@ Sticker Administrative Aktionen Standard in %1$s - Dein Serveradministrator hat in privaten Räumen & Direktnachrichten Ende-zu-Ende Verschlüsselung standardmäßig deaktiviert. + Dein:e Serveradministrator:in hat in privaten Räumen & Direktnachrichten Ende-zu-Ende Verschlüsselung standardmäßig deaktiviert. Flugzeugmodus ist aktiv Gib eine Sicherheitsphrase ein, die nur du kennst. Diese wird benutzt um deine Daten auf dem Server geheim zu halten. Wenn du jetzt abbrichst und den Zugriff zu deinen Sitzungen verlierst, kannst du verschlüsselte Nachrichten & Daten verlieren. @@ -2039,11 +2307,11 @@ Lade verfügbare Sprachen… Öffne AGBs von %s Trenne Verbingung zu Identitätsserver %s\? - Dieser Identitätsserver ist veraltet. Element unterstützt nur API V2. + Dieser Identitätsserver ist veraltet. ${app_name} unterstützt nur API V2. Diese Operation is nicht möglich. Der Homeserver ist veraltet. Bitte konfiguriere zuerst einen Identitätsserver. Bitte akzeptiere zuerst die AGB des Identitätsservers in den Einstellungen. - Deiner Privatssphäre wegen unterstützt Element nur das Senden gehashter Emailaddressen und Telefonnummern. + Deiner Privatssphäre wegen unterstützt ${app_name} nur das Senden gehashter Emailaddressen und Telefonnummern. Die Assoziierung ist fehlgeschlagen. Für diese Kennung gibt es aktuell keine Assoziierung. Dein Homeserver (%1$s) schlägt %2$s als Identitätsserver vor @@ -2084,11 +2352,10 @@ Du kannst auf diese Nachricht nicht zugreifen, weil der Sender deiner Sitzung nicht vertraut Du kannst auf diese Nachricht nicht zugreifen, weil der Sender absichtlich die Schlüssel nicht gesendet hat Warte auf Verschlüsselungshistorie - Riot heißt nun Element! - Wir sind begeistert unsere Namensänderung mitteilen zu können! Deine App ist auf dem neusten Stand und du bist mit deinem Account angemeldet. - VERSTANDEN - MEHR ERFAHREN - element + Riot heißt nun Element! + Wir sind begeistert unsere Namensänderung mitteilen zu können! Deine App ist auf dem neusten Stand und du bist mit deinem Account angemeldet. + VERSTANDEN + MEHR ERFAHREN Speichere Wiederherstellungsschlüssel in Füge über Kontaktliste hinzu Deine Kontaktliste ist leer @@ -2157,7 +2424,6 @@ Code Verwende das internationale Format (Telefonnummer muss mit \'+\' beginnen) Bestätige deine Identität, indem du dieses Login verifizierst, um Zugriff auf verschlüsselte Nachrichten zu erhalten. - Leider ist dieser Vorgang für Konten, die über Single Sign-On verbunden sind, noch nicht möglich. Raum, indem du gebannt wurdest, kann nicht geöffnet werden. Raum kann nicht gefunden werden. Stelle sicher, dass er existiert. @@ -2186,7 +2452,7 @@ Du hast keine Berechtigung ein Konferenzgespräch zu starten Zeige Details wie Raumnamen und Nachrichteninhalt. Zeige Inhalt in Benachrichtigungen - PIN-Code ist die einzige Möglichkeit Element zu entsperren. + PIN-Code ist die einzige Möglichkeit ${app_name} zu entsperren. Aktiviere Gerät-spezifische Biometrie wie Fingerabdrücke und Gesichtserkennung. Biometrie aktivieren Schutz konfigurieren @@ -2224,8 +2490,8 @@ Bitte klicke auf die Benachrichtigung. Wenn die Benachrichtigung nicht angezeigt wird, überprüfe die Systemeinstellungen. Du siehst die Benachrichtigung! Klick mich! Benachrichtigungsanzeige - Bei jedem Öffnen von Element ist der PIN-Code erforderlich. - PIN-Code ist erforderlich, nachdem Element 2 Minuten lang nicht verwendet wurde. + Bei jedem Öffnen von ${app_name} ist der PIN-Code erforderlich. + PIN-Code ist erforderlich, nachdem ${app_name} 2 Minuten lang nicht verwendet wurde. Fordere PIN nach 2 Minuten an Zeige nur die Anzahl von ungelesenen Nachrichten in einer einfachen Benachrichtigung. Bild hinzufügen von @@ -2279,15 +2545,15 @@ Ändere deine aktuelle PIN PIN ändern Suche nach Kontakten auf Matrix - Avatar einrichten + Raum-Bild einrichten Einverständnis wurde nicht abgegeben. Teile diesen Code mit Leuten, damit sie ihn scannen und mit dir chatten können. Meinen Code teilen Mein Code Scanne einen QR code Das ist kein korrekter QR-Code von Matrix - 🔐️ Komm mit zu Element - Hey, schreibe mit mir auf Element: %s + 🔐️ Komm mit zu ${app_name} + Hey, schreibe mit mir auf ${app_name}: %s Freunde einladen Leute hinzufügen "Thema " @@ -2371,7 +2637,7 @@ m.room.server_acl-Ereignisse senden Berechtigungen ändern Authentifizierung fehlgeschlagen - Deine Anmeldeinformationen müssen für Element eingegeben werden, um diese Aktion auszuführen. + Deine Anmeldeinformationen müssen für ${app_name} eingegeben werden, um diese Aktion auszuführen. Erneute Authentifizierung erforderlich Cross Signing konnte nicht eingerichtet werden Nicht autorisierte, fehlende gültige Authentifizierungsdaten @@ -2402,4 +2668,58 @@ Halten Fortsetzen Zurück + Ereignis-Inhalt + Status-Event gesendet! + Ereignis gesendet! + Falsch geformtes Ereignis + Fehlender Nachrichtentyp + Kein Inhalt + Ereignisinhalt + Statusschlüssel + Typ + Benutzendendefiniertes Status-Event senden + Inhalt bearbeiten + Status-Events + Status-Event senden + Benutzendendefiniertes Ereignis senden + Raum-Status erkunden + Entwicklungswerkzeuge + Lesebestätigungen anzeigen + Nicht benachrichtigen + Mit Ton benachrichtigen + Ohne Ton benachrichtigen + Nachricht wegen eines Errors nicht gesendet + Geprüft + Emoji-Auswahl schließen + Emoji-Auswahl öffnen + Vertraute Vertrauensstufe + Warnungsvertrauensstufe + Standard-Vertrauensstufe + Ausgewählt + Video + Dieser Raum enthält einen ungesendeten Entwurf + Einige Nachrichten wurden nicht gesendet + Avatar löschen + Avatar ändern + Bild + Schlüssel von Datei importieren + Widgets öffnen + Bildschirmfoto + + %d Eintrag + %d Einträge + + Die Obergrenze ist nicht bekannt. + Dein Homeserver akzeptiert Anhänge (wie Dateien, Medien, etc.) mit einer Größe bis zu %s. + Datei-Upload-Obergrenze des Servers + Server-Version + Severname + Raum-Einstellungen + Derzeitige Konferenz verlassen und zu einer anderen wechseln\? + Raum-Version + Neuer Wert + Erste Synchronisation: +\nLade Daten herunter… + Erste Synchronisation: +\nWarte auf Serverantwort… \ No newline at end of file diff --git a/vector/src/main/res/values-el/strings.xml b/vector/src/main/res/values-el/strings.xml index 98907a6a53..1ae7629fef 100644 --- a/vector/src/main/res/values-el/strings.xml +++ b/vector/src/main/res/values-el/strings.xml @@ -1,5 +1,75 @@ + Ηλεκτρονική διεύθυνση + %1$s: %2$s + Ο/Η %1$s έστειλε μια εικόνα. + Ο/Η %1$s έστειλε ένα αυτοκόλλητο. + + Ο/Η %1$s σας προσκάλεσε + Ο/Η %1$s αποχώρησε + Ο/Η %1$s απέρριψε την πρόσκληση + Ο/Η %1$s έδιωξε τον/την %2$s + Ο/Η %1$s προσκάλεσε τον/την %2$s + Η πρόσκληση του/της %s + Αριθμός τηλεφώνου + + Ο/Η %1$s απέκλεισε τον/την %2$s + Ο/Η %1$s απέσυρε την πρόσκληση του/της %2$s + Ο/Η %1$s άλλαξε εικονίδιο χρήστη + Ο/Η %1$s άλλαξε το εμφανιζόμενό του/της όνομα σε %2$s + Ο/Η %1$s άλλαξε το εμφανιζόμενό του/της όνομα από %2$s σε %3$s + Ο/Η %1$s αφαίρεσε το εμφανιζόμενό του/της όνομα (%2$s) + Ο/Η %1$s άλλαξε το θέμα σε: %2$s + Ο/Η %1$s άλλαξε το όνομα του δωματίου σε: %2$s + Ο/Η %s απάντησε στην κλήση. + Ο/Η %s τερμάτισε την κλήση. + + Ο/Η %s πραγματοποίησε μια κλήση βίντεο. + Ο/Η %s πραγματοποίησε μια κλήση ήχου. + Ο/Η %1$s κατέστησε το μελλοντικό ιστορικό του δωματίου ορατό στον/στην %2$s + όλα τα μέλη του δωματίου, από την στιγμή που προσκλήθηκαν. + όλα τα μέλη του δωματίου. + οποιοσδήποτε. + άγνωστος/η (%s). + (έγινε αλλαγή και του εικονιδίου χρήστη) + Ο/Η %1$s αφαίρεσε το όνομα του δωματίου + Ο/Η %1$s αφαίρεσε το θέμα του δωματίου + Ο/Η %1$s ανανέωσε το προφίλ του/της %2$s + Ο/Η %1$s δέχτηκε την πρόσκληση για το %2$s + + ** Αδυναμία αποκρυπτογράφησης: %s ** + Η συσκευή του/της αποστολέα δεν μας έχει στείλει τα κλειδιά για αυτό το μήνυμα. + + Αποτυχία αποστολής μηνύματος + + Αποτυχία αναφόρτωσης εικόνας + + Σφάλμα δικτύου + Σφάλμα του Matrix + + Ο/Η %1$s ζήτησε μια VoIP διάσκεψη + Η VoIP διάσκεψη ξεκίνησε + Η VoIP διάσκεψη έληξε + + Ο/Η %1$s εισήλθε στο δωμάτιο + + Πρόσκληση από %s + Πρόσκληση στο δωμάτιο + + %1$s και %2$s + + + %1$s και 1 ακόμα + %1$s και %2$d ακόμα + + + Άδειο δωμάτιο + + όλα τα μέλη του δωματίου από την στιγμή που εισήλθαν. + Ο/Η %1$s ενεργοποίησε την κρυπτογράφηση απ\'άκρη σ\'άκρη (%2$s) + + Ο/Η %1$s έστειλε μία πρόσκληση στον/στην %2$s για να εισέλθει στο δωμάτιο + Δεν είναι δυνατή ακόμα η επανείσοδος σε ένα άδειο δωμάτιο. Ακύρωση Κλείσιμο Απευθείας συνομιλία @@ -43,8 +113,7 @@ Κρυπτογραφημένο μήνυμα Ανοιχτόχρωμο θέμα Σκουρόχρωμο θέμα - Μαύρο θέμα - Θέμα Status.im + Μαύρο θέμα Αποστολή αυτοκόλλητου Άδειες τρίτων Αργότερα @@ -138,7 +207,7 @@ Όνομα δωματίου Θέμα δωματίου Κλήσεις - Χρήση του προεπιλεγμένου ήχου κλήσης του Element για τις εισερχόμενες κλήσεις + Χρήση του προεπιλεγμένου ήχου κλήσης του ${app_name} για τις εισερχόμενες κλήσεις Ήχος εισερχομένων κλήσεων Επιλέξτε ήχο κλήσης: Κλήση @@ -164,8 +233,8 @@ Ενεργοποίηση Ρυθμίσεις συσκευής. Οι ειδοποιήσεις είναι ενεργοποιημένες για αυτή την συσκευή. - Οι ειδοποιήσεις δεν επιτρέπονται για αυτή την συσκευή. -\nΠαρακαλώ ελέγξτε τις ρυθμίσεις του Element. + Οι ειδοποιήσεις δεν επιτρέπονται για αυτή την συσκευή. +\nΠαρακαλώ ελέγξτε τις ρυθμίσεις του ${app_name}. Ενεργοποίηση Συσκευές Προεπισκόπιση συνδέσμων @@ -445,7 +514,7 @@ Αλλαγή Συσκευής Ήχου Αποτυχία σύνδεσης σε πραγματικό χρόνο. \nΖητήστε από τον διαχειριστή του οικιακού σας διακομιστή να διαμορφώσει έναν διακομιστή TURN ώστε οι κλήσεις να λειτουργούν αξιόπιστα. - Η Κλήση Element Aπέτυχε + Η Κλήση ${app_name} Aπέτυχε Να μην ερωτηθώ ξανά Προσπαθήστε να χρησιμοποιήσετε το %s Παρακαλώ ζητήστε απο τον διαχειριστή του ιδιέταιρου διακομιστή (%1$s) να ρυθμίσει ένα διακομιστή TURN ώστε οι κλήσεις να δουλέυουν αξιόπιστα. @@ -476,7 +545,7 @@ Τέλος κλήσης Τρέχουσα κλήση συνδιάσκεψης. \nΣυνδεθείτε με %1$s ή %2$s - Δεν επιτρέψατε στο Element την πρόσβαση στις επαφές σας + Δεν επιτρέψατε στο ${app_name} την πρόσβαση στις επαφές σας Ειδοποιήσεις Αντιγράφηκε στο πρόχειρο Πρόσθεση diff --git a/vector/src/main/res/values-eo/strings.xml b/vector/src/main/res/values-eo/strings.xml index 776dbdf076..747511f745 100644 --- a/vector/src/main/res/values-eo/strings.xml +++ b/vector/src/main/res/values-eo/strings.xml @@ -1,8 +1,219 @@ + %1$s sendis bildon. + %1$s sendis glumarkon. + Invito de %s + %1$s invitis uzanton %2$s + %1$s invitis vin + %1$s envenis + %1$s foriris de la ĉambro + %1$s rifuzis la inviton + %1$s forpelis uzanton %2$s + %1$s malforbaris uzanton %2$s + %1$s forbaris uzanton %2$s + %1$s nuligis inviton por %2$s + %1$s ŝanĝis sian profilbildon + ** Ne eblas malĉifri: %s ** + La aparato de la sendinto ne sendis al ni la ŝlosilojn por tiu mesaĝo. + %1$s: %2$s + %1$s ŝanĝis sian prezentan nomon al %2$s + %1$s ŝanĝis sian prezentan nomon de %2$s al %3$s + %1$s forigis sian prezentan nomon (%2$s) + %1$s ŝanĝis la temon al: %2$s + %1$s ŝanĝis nomon de la ĉambro al: %2$s + %s vidvokis. + %s voĉvokis. + %s respondis la vokon. + %s finis la vokon. + %1$s videbligis estontan historion de ĉambro al %2$s + ĉiuj ĉambranoj, ekde siaj invitoj. + ĉiuj ĉambranoj, ekde siaj aliĝoj. + ĉiuj ĉambranoj. + ĉiu ajn. + nekonata (%s). + %1$s ŝaltis tutvojan ĉifradon (%2$s) + %s gradaltigis la ĉambron. + Mesaĝo foriĝis + Mesaĝon forigis %1$s + Mesaĝo foriĝis [kialo: %1$s] + Mesaĝon forigis %1$s [kialo: %2$s] + %1$s ĝisdatigis sian profilon %2$s + %1$s sendis aliĝan inviton al %2$s + %1$s nuligis la aliĝan inviton por %2$s + %1$s akceptis la inviton por %2$s + Ne povis redakti + Ne povas sendi mesaĝon + Malsukcesis alŝuti bildon + Reta eraro + Matrix-eraro + Nun ne eblas re-aliĝi al malplena ĉambro. + Retpoŝtadreso + Telefonnumero + Invito de %s + Invito al ĉambro + %1$s kaj %2$s + + %1$s kaj 1 alia + %1$s kaj %2$d aliaj + + Malplena ĉambro + Komenca spegulado: +\nEnportante konton… + Komenca spegulado: +\nEnportante ĉifrilojn + Komenca spegulado: +\nEnportante ĉambrojn + Komenca spegulado: +\nEnportante aliĝitajn ĉambrojn + Komenca spegulado: +\nEnportante ĉambrojn de invitoj + Komenca spegulado: +\nEnportante forlasitajn ĉambrojn + Komenca spegulado: +\nEnportante komunumojn + Komenca spegulado: +\nEnportante datumojn de konto + Sendante mesaĝon… + Vakigi sendan atendovicon + %1$s petis grupan vokon + Grupa voko komenciĝis + Grupa voko finiĝis + (ankaŭ profilbildo ŝanĝiĝis) + %1$s forigis nomon de la ĉambro + %1$s forigis temon de la ĉambro + Invito de %1$s. Kialo: %2$s + %1$s invitis uzanton %2$s. Kialo: %3$s + %1$s invitis vin. Kialo: %2$s + %1$s envenis. Kialo: %2$s + %1$s foriris de la ĉambro. Kialo: %2$s + %1$s rifuzis la inviton. Kialo: %2$s + %1$s forpelis uzanton %2$s. Kialo: %3$s + %1$s malforbaris uzanton %2$s. Kialo: %3$s + %1$s forbaris uzanton %2$s. Kialo: %3$s + %1$s sendis al %2$s inviton al la ĉambro. Kialo: %3$s + %1$s nuligis la inviton al la ĉambro por %2$s. Kialo: %3$s + %1$s akceptis la inviton por %2$s. Kialo: %3$s + %1$s nuligis la inviton por %2$s. Kialo: %3$s + + %1$s aldonis %2$s kiel adreson por ĉi tiu ĉambro. + %1$s aldonis %2$s kiel adresojn por ĉi tiu ĉambro. + + + %1$s forigis %2$s kiel adreson por ĉi tiu ĉambro. + %1$s forigis %2$s kiel adresojn por ĉi tiu ĉambro. + + %1$s aldonis %2$s kaj forigis %3$s kiel adresojn por ĉi tiu ĉambro. + %1$s agordis la ĉefadreson de ĉi tiu ĉambro al %2$s. + %1$s forigis la ĉefadreson de ĉi tiu ĉambro. + %1$s permesis al gastoj enveni. + %1$s malpermesis al gastoj enveni. + %1$s ŝaltis tutvojan ĉifradon. + %1$s ŝaltis tutvojan ĉifradon (kun nerekonita algoritmo %2$s). + Vi ŝanĝis la povnivelon de %1$s. + %1$s sanĝis la povnivelon de %2$s. + Vi ŝaltis tutvojan ĉifradon (kun nerekonita algoritmo %1$s). + Vi ŝaltis tutvojan ĉifradon. + Vi malpermesis al gastoj aliĝi. + %1$s malpermesis al gastoj aliĝi. + Vi malpermesis al gastoj enveni. + Vi permesis al gastoj aliĝi. + %1$s permesis al gastoj aliĝi. + Vi permesis al gastoj enveni. + Vi forigis la ĉefadreson de ĉi tiu ĉambro. + Vi agordis al ĉefadreson de ĉi tiu ĉambro al %1$s. + Vi aldonis %1$s kaj forigis %2$s kiel adresojn por ĉi tiu ĉambro. + + Vi forigis %1$s kiel adreson por ĉi tiu ĉambro. + Vi forigis %1$s kiel adresojn por ĉi tiu ĉambro. + + + Vi aldonis %1$s kiel adreson por ĉi tiu ĉambro. + Vi aldonis %1$s kiel adresojn por ĉi tiu ĉambro. + + Vi nuligis la inviton por %1$s. Kialo: %2$s + Vi akceptis la inviton por %1$s. Kialo: %2$s + Vi nuligis inviton al la ĉambro por %1$s. Kialo: %2$s + Vi sendis al %1$s inviton al la ĉambro. Kialo: %2$s + Vi forbaris uzanton %1$s. Kialo: %2$s + Vi malforbaris uzanton %1$s. Kialo: %2$s + Vi forpelis uzanton %1$s. Kialo: %2$s + Vi rifuzis la inviton. Kialo: %1$s + Vi foriris. Kialo: %1$s + %1$s foriris. Kialo: %2$s + Vi foriris de la ĉambro. Kialo: %1$s + Vi envenis. Kialo: %1$s + Vi aliĝis. Kialo: %1$s + %1$s aliĝis. Kialo: %2$s + Vi invitis uzanton %1$s. Kialo: %2$s + Via invito. Kialo: %1$s + %1$s de %2$s al %3$s + Propra + Ordinara + Propra (%1$d) + Reguligisto + Administranto + Vi ŝanĝis la fenestraĵon %1$s + %1$s ŝanĝis la fenestraĵon %2$s + Vi forigis la fenestraĵon %1$s + %1$s forigis la fenestraĵon %2$s + Vi aldonis la fenestraĵon %1$s + %1$s aldonis la fenestraĵon %2$s + Vi akceptis la inviton por %1$s + Vi nuligis la inviton por %1$s + %1$s nuligis la inviton por %2$s + Vi nuligis la aliĝan inviton por %1$s + Vi invitis uzanton %1$s + %1$s invitis uzanton %2$s + Vi sendis aliĝan inviton al %1$s + Vi ĝisdatigis vian profilon %1$s + Vi forigis bildon de la ĉambro + %1$s forigis bildon de la ĉambro + Vi forigis temon de la ĉambro + Vi forigis nomon de la ĉambro + Vi petis grupan vokon + Vi gradaltigis la interparolon. + %s gradaltigis la interparolon. + Vi gradaltigis la ĉambron. + Vi ŝaltis tutvojan ĉifradon (%1$s) + %1$s videbligis al %2$s estontajn mesaĝojn + Vi videbligis al %1$s estontajn mesaĝojn + Vi videbligis estontan historion de ĉambro al %1$s + Vi finis la vokon. + Vi respondis la vokon. + Vi sendis datumojn por prepari la vokon. + %s sendis datumojn por prepari la vokon. + Vi voĉvokis. + Vi vidvokis. + Vi ŝanĝis la nomon de la ĉambro al: %1$s + Vi ŝanĝis la bildon de la ĉambro + %1$s ŝanĝis la bildon de la ĉambro + Vi ŝanĝis la temon al: %1$s + Vi forigis vian prezentan nomon (%1$s) + Vi ŝanĝis vian prezentan nomon de %1$s al %2$s + Vi ŝanĝis vian prezentan nomon al %1$s + Vi ŝanĝis vian profilbildon + Vi nuligis inviton por %1$s + Vi forbaris uzanton %1$s + Vi malforbaris uzanton %1$s + Vi forpelis uzanton %1$s + Vi rifuzis la inviton + Vi foriris de la ĉambro + %1$s foriris de la ĉambro + Vi foriris de la ĉambro + Vi envenis + %1$s envenis + Vi envenis + Vi invitis uzanton %1$s + Vi kreis la diskuton + %1$s kreis la diskuton + Vi kreis la ĉambron + %1$s kreis la ĉambron + Via invito + Vi sendis glumarkon. + Vi sendis bildon. Hela haŭto Malhela haŭto - Nigra haŭto + Nigra haŭto Spegulante… Atentante eventojn Laŭtaj sciigoj @@ -84,7 +295,6 @@ Uzi savkopiadon de ŝlosiloj Kontroli salutaĵon Kontroli salutaĵon - Haŭto de Status.im Savkopio de ŝlosiloj ne finiĝis; bonvolu atendi… Vi perdos viajn ĉifritajn mesaĝojn se vi nun adiaŭos Progresas savkopio de ŝlosiloj. Se vi nun adiaŭos, vi perdos aliron al viaj ĉifritaj mesaĝoj. @@ -128,7 +338,7 @@ Interparoloj Loka adresaro Neniuj interparoloj - Vi ne permesis al Element aliron al viaj lokaj kontaktoj + Vi ne permesis al ${app_name} aliron al viaj lokaj kontaktoj Neniuj rezultoj Neniu identiga servilo estas agordita. Ĉambroj @@ -298,11 +508,11 @@ Fona spegulado Reĝimo de fona spegulado Optimumigita por baterio - Element spegulos fone, per maniero konservanta la limigitajn rimedojn de la aparato (ĉefe la baterion). + ${app_name} spegulos fone, per maniero konservanta la limigitajn rimedojn de la aparato (ĉefe la baterion). \nDepende de la stato de la rimedoj de via aparato, la spegulado povus esti prokrastita de la operaciumo. Optimumigita por tujeco - Element spegulos fone, ripete, je preciza tempo (agordebla). -\nĈi tio influos uzadon de baterio kaj radiilo, kaj aperigos ĉiaman sciigon pri tio, ke Element aŭskultas okazojn. + ${app_name} spegulos fone, ripete, je preciza tempo (agordebla). +\nĈi tio influos uzadon de baterio kaj radiilo, kaj aperigos ĉiaman sciigon pri tio, ke ${app_name} aŭskultas okazojn. Neniu fona spegulado Vi ne sciiĝos pri envenaj mesaĝoj dum la aplikaĵo estas fone. Malsukcesis ĝisdatigi agordojn. @@ -394,7 +604,7 @@ Repeti ĉifrajn ŝlosilojn de aliaj viaj salutaĵoj. Peto de ŝlosilo sendiĝis. Peto sendiĝis - Bonvolu ruli Elementon sur alia aparato kiu scipovas malĉifri la mesaĝon, por ke ĝi povu sendi la ŝlosilojn al ĉi tiu salutaĵo. + Bonvolu ruli ${app_name} sur alia aparato kiu scipovas malĉifri la mesaĝon, por ke ĝi povu sendi la ŝlosilojn al ĉi tiu salutaĵo. Envena voko Envena vidvoko Envena voĉvoko @@ -404,22 +614,22 @@ Foti aŭ filmi Ne povas filmi Informoj - Element bezonas permeson aliri viajn fotojn kaj filmojn, por sendi kaj konservi kunsendaĵojn. + ${app_name} bezonas permeson aliri viajn fotojn kaj filmojn, por sendi kaj konservi kunsendaĵojn. \n \nBonvolu permesi aliron per la sekva ŝprucpeto, por povi sendi dosierojn el via telefono. - Element bezonas permeson aliri vian filmilon por foti kaj vidvoki. + ${app_name} bezonas permeson aliri vian filmilon por foti kaj vidvoki. " \n \nBonvolu permesi aliron per la sekva ŝprucpeto, por ebligi la vokon." - Element bezonas permeson aliri vian mikrofonon por fari voĉvokojn. + ${app_name} bezonas permeson aliri vian mikrofonon por fari voĉvokojn. " \n \nBonvolu permesi aliron per la sekva ŝprucpeto, por ebligi la vokon." - Element bezonas premeson aliri viajn filmilon kaj mikrofonon por fari vidvokojn. + ${app_name} bezonas premeson aliri viajn filmilon kaj mikrofonon por fari vidvokojn. \n \nBonvolu permesi aliron per la sekva ŝprucpeto, por ebligi la vokon. - Element povas kontroli vian adresaron por trovi aliajn uzantojn de Matrix per iliaj retpoŝtadresoj kaj telefonnumeroj. Se vi konsentas kunhavi vian adresaron por tiu celo, bonvolu permesi aliron per la sekva ŝprucpeto. - Element povas kontroli vian adresaron por trovi aliajn uzantojn de Matrix per iliaj retpoŝtadresoj kaj telefonnumeroj. + ${app_name} povas kontroli vian adresaron por trovi aliajn uzantojn de Matrix per iliaj retpoŝtadresoj kaj telefonnumeroj. Se vi konsentas kunhavi vian adresaron por tiu celo, bonvolu permesi aliron per la sekva ŝprucpeto. + ${app_name} povas kontroli vian adresaron por trovi aliajn uzantojn de Matrix per iliaj retpoŝtadresoj kaj telefonnumeroj. \n \nĈu vi konsentas kunhavi vian adresaron por tiu celo\? Pardonu. Ago ne efektiviĝis, pro mankantaj permesoj @@ -531,9 +741,9 @@ Tiu ĉi salutaĵo ne povas konigi ĉi tiun kontrolon al aliaj viaj salutaĵoj. \nLa kontrolo konserviĝos loke kaj estos konigota de venonta versio de la aplikaĵo. Reatenti - Element renkontis problemon bildigante enhavon de evento kun la identigilo «%1$s» - Elemento ne traktas mesaĝojn de speco «%1$s» - Element ne traktas eventojn de speco «%1$s» + ${app_name} renkontis problemon bildigante enhavon de evento kun la identigilo «%1$s» + ${app_name} ne traktas mesaĝojn de speco «%1$s» + ${app_name} ne traktas eventojn de speco «%1$s» Salti al legokonfirmo Propra (%1$d) en %2$s Ordinara en %1$s @@ -617,7 +827,7 @@ Post ŝalto, ne eblas ĉifradon malŝalti. Ŝalti ĉifradon Antaŭmetas ¯\\_(ツ)_/¯ al platteksta mesaĝo - Element povas fiaski pli ofte kiam okazas neatendita eraro + ${app_name} povas fiaski pli ofte kiam okazas neatendita eraro Montras nur la unuajn rezultojn; tajpu pliajn literojn… Aliaj salutaĵoj Nuna salutaĵo @@ -632,7 +842,7 @@ Komenca spegulado… La priskribo estas tro mallonga Via ligilo al matrix.to estis misformita - Ĉi tiu salutaĵo estas por uzanto %1$s kaj vi donas salutilojn por uzanto %2$s. Element ne subtenas tion. + Ĉi tiu salutaĵo estas por uzanto %1$s kaj vi donas salutilojn por uzanto %2$s. ${app_name} ne subtenas tion. \nBonvolu unue vakigi datumojn, kaj poste saluti alian konton. Vakigi datumojn Vi perdos aliron al sekuraj mesaĝoj, se vi ne salutos por rehavi viajn ĉifrajn ŝlosilojn. @@ -728,7 +938,6 @@ \nĈu vi volas saluti per TTT-kliento\? Eraris enlegado de la paĝo: %1$s (%2$d) Enigu adreson de servilo, kiun vi volas uzi - Enigu la adreson de servilo aŭ Elemento, kien vi volas konektiĝi Adreso Adreso de Element Matrix Services Saluti al %1$s @@ -770,7 +979,7 @@ Ĉiuj mesaĝoj (laŭte) Malatenti uzanton Estas neniu retkonekto nun - Element bezonas rajton konservi viajn tutvoje ĉifrajn ŝlosilojn surdiske. + ${app_name} bezonas rajton konservi viajn tutvoje ĉifrajn ŝlosilojn surdiske. \n \nBonvolu permesi aliron per la venonta ŝprucpeto, por povi elporti viajn ŝlosilojn permane. Ĉi tiu enhavo estis raportita kiel maltaŭga. @@ -845,7 +1054,7 @@ Elektebloj pri trovado aperos post aldono de retpoŝtadreso. Troveblaj retpoŝtadresoj Vi nun ne uzas identigan servilon. Por trovi kaj troviĝi de jamaj kontaktoj, kiujn vi konas, agordu tian servilon sube. - Vi nun uzas %1$s por trovi kaj troviĝi de jamaj kontaktoj, kiujn vi trovas. + Vi nun uzas %1$s por trovi kaj troviĝi de jamaj kontaktoj, kiujn vi konas. Ŝanĝi identigan servilon Agordi identigan servilon Malkonekti identigan servilon @@ -912,7 +1121,7 @@ Nova ĉambro Rektaj interparoloj Ĉambroj - Antaŭrigardo al ĉambro legebla de ĉiuj ankoraŭ ne estas subtenata de Element + Antaŭrigardo al ĉambro legebla de ĉiuj ankoraŭ ne estas subtenata de ${app_name} Ne eblas antaŭrigardi ĉi tiun ĉambron Ĉiuj komunumoj Bonvolu atendi… @@ -1108,7 +1317,7 @@ \nSekure savkopiu viajn ŝlosilojn por eviti ilian perdon. Neniam perdu ĉifritajn mesaĝojn Neniu salutaĵo de Matrix estas disponebla - Bonvolu forigi la pasfrazon se vi volas, ke Element estigu novan rehavan ŝlosilon. + Bonvolu forigi la pasfrazon se vi volas, ke ${app_name} estigu novan rehavan ŝlosilon. Pasfrazo estas tro malforta Bonvolu enigi pasfrazon Pasfrazo ne akordas @@ -1186,7 +1395,7 @@ \nSe vi ne salutis alian salutaĵon, malatentu ĉi tiun peton. Via nekontrolita salutaĵo «%s» petas ĉifrajn ŝlosilojn. Vi aldonis novan salutaĵon «%s», kiu petas ĉifrajn ŝlosilojn. - Por daŭrigi vi bezonas akcepti la uzokondiĉojn de tiu ĉi servo. + Por daŭrigi vi devas akcepti la uzokondiĉojn de tiu ĉi servo. Ĉi tiu elekteblo postulas aplikaĵon de ekstera liveranto por registri la mesaĝojn. Sendi voĉmesaĝojn Uzi enigan klavon por sendi mesaĝon @@ -1475,17 +1684,17 @@ Datumkonserva reĝimo aplikas sepecialan filtron al sciigoj pri ĉeesto kaj tajpado. Datumkonserva reĝimo Jes, mi volas helpi! - Bonvolu ŝalti analizon por helpi la ni plibonigi ELementon. - Element kolektas sennomajn analizojn por helpi al ni plibonigi la aplikaĵon. + Bonvolu ŝalti analizon por helpi la ni plibonigi ${app_name}. + ${app_name} kolektas sennomajn analizojn por helpi al ni plibonigi la aplikaĵon. Sendi datumojn de analizo Analizo Doni permeson - Element bezonas malpezan fonan konekton por havi dependeblajn sciigojn. -\nLa sekva ekrano petos ĉiam ruli Elementon fone; bonvolu akcepti. + ${app_name} bezonas malpezan fonan konekton por havi dependeblajn sciigojn. +\nLa sekva ekrano petos ĉiam ruli ${app_name} fone; bonvolu akcepti. Fona konekto Elekti alian elekteblon Doni permeson - Element povas ruliĝi fone por mastrumi viajn sciigojn sekure kaj private. Tio povas influi uzadon de la baterio. + ${app_name} povas ruliĝi fone por mastrumi viajn sciigojn sekure kaj private. Tio povas influi uzadon de la baterio. Privateco de sciigoj Administri viajn agordojn de trovado. Trovado @@ -1548,17 +1757,17 @@ Malplia privateco Normala Malatenti optimumigon - Optimumigo de baterio ne influas sur Element. + Optimumigo de baterio ne influas sur ${app_name}. Optimumigo de baterio Malŝalti limigojn - Fonaj limigoj estas ŝaltitaj por Element. + Fonaj limigoj estas ŝaltitaj por ${app_name}. \nAgado de la aplikaĵo estos akre limigita dum ĝi estas fone, kaj tio povus influi sciigojn. \n%1$s - Fonaj limigoj estas malŝaltitaj por Element. Ĉi tiu testo devus esti rulata kun telefonaj datumoj (ne kun Vifio). + Fonaj limigoj estas malŝaltitaj por ${app_name}. Ĉi tiu testo devus esti rulata kun telefonaj datumoj (ne kun Vifio). \n%1$s Kontroli fonajn limigojn Ŝalti ekadon kune kun aparato - La servo ne ekos kiam la aparato reekos, kaj vi ne ricevos sciigojn ĝis vi mem Elementon malfermos. + La servo ne ekos kiam la aparato reekos, kaj vi ne ricevos sciigojn ĝis vi mem ${app_name} malfermos. La servo ekos kiam la aparato reekos. Eki kune kun aparato Servo malsukcesis reeki @@ -1597,19 +1806,19 @@ Ĵetono de FCM sukcese registriĝis ĉe la hejmservilo. Registrado de ĵetono Aldoni konton - [%1$s] -\nTiu ĉi eraro ne dependas de Element. La telefono ne havas konton de Google. Bonvolu malfermi la administrilon de kontoj kaj aldoni konton de Google. - [%1$s] -\nTiu ĉi eraro ne dependas de Element. Ĝi povas okazi pro kelkaj kialoj. Eble ĝi funkcios se vi reprovos poste. Vi ankaŭ povas kontroli, ĉu la servo de Google Play ne estas datume limigita en la sistemaj agordoj, aŭ ĉu la horloĝo de via aparato ĝuste funkcias, aŭ ĉu ĝi ne okazas sur propra ROM. - [%1$s] -\nTiu ĉi eraro ne dependas de Element, kaj laŭ Google ĝi indikas, ke la aparato havas tro multajn aplikaĵojn registritajn je FCM. La eraro nur okazas kiam multegaj aplikaĵoj estas samtempe instalitaj, kaj ne devus koncerni ordinaran uzanton. + [%1$s] +\nTiu ĉi eraro ne dependas de ${app_name}. La telefono ne havas konton de Google. Bonvolu malfermi la administrilon de kontoj kaj aldoni konton de Google. + [%1$s] +\nTiu ĉi eraro ne dependas de ${app_name}. Ĝi povas okazi pro kelkaj kialoj. Eble ĝi funkcios se vi reprovos poste. Vi ankaŭ povas kontroli, ĉu la servo de Google Play ne estas datume limigita en la sistemaj agordoj, aŭ ĉu la horloĝo de via aparato ĝuste funkcias, aŭ ĉu ĝi ne okazas sur propra ROM. + [%1$s] +\nTiu ĉi eraro ne dependas de ${app_name}, kaj laŭ Google ĝi indikas, ke la aparato havas tro multajn aplikaĵojn registritajn je FCM. La eraro nur okazas kiam multegaj aplikaĵoj estas samtempe instalitaj, kaj ne devus koncerni ordinaran uzanton. Malsukcesis akiri ĵetonon de FCM: \n%1$s Ĵetono de FCM sukcese akiriĝis: \n%1$s Ĵetono de Firebase Ripari servojn de Google Play - Element uzas la servojn de Google Play por liveri pasivajn mesaĝojn, sed ili ne ŝajnas ĝuste agorditaj: + ${app_name} uzas la servojn de Google Play por liveri pasivajn mesaĝojn, sed ili ne ŝajnas ĝuste agorditaj: \n%1$s APK de servoj de Google Play estas ĝisdata kaj disponebla. Kontrolo de servoj de Google Play @@ -1619,8 +1828,8 @@ Rimarku, ke iuj specoj de mesaĝoj estas silentaj (sciigas sensone). Propraj agordoj. Ŝalti - Sciigoj ne estas ŝaltitaj por ĉi tiu salutaĵo. -\nBonvolu kontroli la agordojn de Element. + Sciigoj ne estas ŝaltitaj por ĉi tiu salutaĵo. +\nBonvolu kontroli la agordojn de ${app_name}. Sciigoj estas ŝaltitaj por ĉi tiu salutaĵo. Agordoj de salutaĵo. Ŝalti @@ -1646,7 +1855,7 @@ Neniu retpoŝtadreso aldoniĝis al via konto Retpoŝtadresoj Necesas aŭtentikigo - Vi ne povas fari tion per Element por poŝtelefonoj + Vi ne povas fari tion per ${app_name} por poŝtelefonoj Konfirmu vian pasvorton Montri informojn pri aplikaĵo en sistemaj agordoj. Informoj pri aplikaĵo @@ -1764,7 +1973,7 @@ Elekti sonaparaton Malsukcesis fari realtempan konekton. \nBonvolu peti la administranton de via hejmservilo agordi TURN-servilon, por ke vokoj funkciu dependeble. - Malsukcesis voko de Element + Malsukcesis voko de ${app_name} Nur kontaktoj de Matrix Sciigoj Sukceso @@ -1797,20 +2006,20 @@ Hejmekrano Se uzanto lasas aparaton neŝargata kaj senmova por ioma tempo, kun ekrano malaktiva, la aparato eniras dorman reĝimon. Tio malhelpas aplikaĵojn aliri la reton kaj fortenas iliajn taskojn, speguladon, kaj normalajn avertojn. Aldoni al hejmekrano - Uzi implicitan sonoron de Element por envenaj vokoj + Uzi implicitan sonoron de ${app_name} por envenaj vokoj Baskuli filmilon Forgesita numero\? La ligilo estis misformita Ne povas trovi ĉi tiun ĉambron. Certiĝu, ke ĝi ekzistas. Ne povas malfermi ĉambron, de kiu vi forbariĝis. Konfirmu personan identigan numeron por malŝalti ĝin - Persona identiga numero estas postulata je ĉiu malfermo de Element. - Persona identiga numero estas postulata post 2 minutoj de neuzado de Element. + Persona identiga numero estas postulata je ĉiu malfermo de ${app_name}. + Persona identiga numero estas postulata post 2 minutoj de neuzado de ${app_name}. Postuli personan identigan numeron post 2 minutoj Montri nur la nombron de nelegitaj mesaĝoj en simpla sciigo. Montri detalojn kiel nomojn de ĉambroj kaj enhavon de mesaĝoj. Montri enhavon en sciigoj - La persona identiga numero estas la sola maniero malŝlosi Elementon. + La persona identiga numero estas la sola maniero malŝlosi ${app_name}. Ŝalti vivaĵanalizojn de la aparato, kiel ekzemple rekonadon de fingrospuroj aŭ vizaĝo. Ŝalti vivaĵanalizojn Se vi volas restarigi vian personan identigan numeron, tuŝetu je «Forgesita numero» por adiaŭi kaj restarigi. @@ -1845,11 +2054,10 @@ Adresaro Via adresaro malplenas Aldoni per mia adresaro - element - EKSCIU PLION - KOMPRENITE - Ni ĝojas anonci, ke ni ŝanĝis nian nomon! Via aplikaĵo estas ĝisdata kaj vi estas salutinta vian konton. - Riot nun estas Element! + EKSCIU PLION + KOMPRENITE + Ni ĝojas anonci, ke ni ŝanĝis nian nomon! Via aplikaĵo estas ĝisdata kaj vi estas salutinta vian konton. + Riot nun estas Element! Atendante historion de ĉifrado Vi ne povas aliri ĉi tiun mesaĝon, ĉar la sendinto intence ne sendis la ŝlosilojn Vi ne povas aliri ĉi tiun mesaĝon ĉar la sendinto ne fidas vian salutaĵon @@ -1891,11 +2099,11 @@ Uzi %1$s Nun efektivas neniu ligo kun ĉi tiu identigilo. Malsukcesis la ligo. - Pro via privateco, Element nur subtenas sendadon de haketitaj retpoŝtadresoj kaj telefonnumeroj. + Pro via privateco, ${app_name} nur subtenas sendadon de haketitaj retpoŝtadresoj kaj telefonnumeroj. Bonvolu unue akcepti la uzokondiĉojn de la identiga servilo per la agordoj. Bonvolu unue agordi identigan servilon. Ĉi tiu ago ne eblas. La hejmservilo estas eksdata. - Ĉi tiu identiga servilo estas eksdata. Elemento suportas nur version 2 de la API. + Ĉi tiu identiga servilo estas eksdata. ${app_name} suportas nur version 2 de la API. Ĉu malkonektiĝi de la identiga servilo %s\? Malfermi uzokondiĉojn de %s Enlegante disponeblajn lingvojn… @@ -1912,7 +2120,6 @@ Invitante uzantojn… INVITI Aldoni ĉambranojn - Pardonu, ĉi tiu ago ankoraŭ ne eblas por kontoj konektitaj per ununura saluto. Konfirmu vian identecon per kontrolo de ĉi tiu saluto, donante al ĝi aliron al ĉifritaj mesaĝoj. Kontrolu la novan saluton, kiu aliras vian konton: %1$s Rekontrolu ĉiujn viajn salutaĵojn por certigi, ke viaj konto kaj mesaĝoj estas sekuraj @@ -1932,13 +2139,13 @@ Uzi rehavan ŝlosilon Por daŭrigi, necesas via %1$s aŭ via %2$s. Subtenata nur en ĉifritaj ĉambroj - Uzu la plej freŝan version de Element per aliaj viaj aparatoj: + Uzu la plej freŝan version de ${app_name} per aliaj viaj aparatoj: aŭ alian klienton de Matrix kapablan je delegaj subskriboj - Element iOS -\nElement Android - Element Web (por TTT) -\nElement Desktop (por labortablo) - Uzu la plej freŝan Elementon per aliaj viaj aparatoj: Element Web, Element Desktop, Element iOS, Element por Android, aŭ alian klienton de Matrix kapablan je delegaj subskriboj + ${app_name} iOS +\n${app_name} Android + ${app_name} Web (por TTT) +\n${app_name} Desktop (por labortablo) + Uzu la plej freŝan ${app_name} per aliaj viaj aparatoj: ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} por Android, aŭ alian klienton de Matrix kapablan je delegaj subskriboj Agordi novan pasvorton de konto… Ne povis konservi dosieron de vidaŭdaĵo Ne povis aldoni dosieron de vidaŭdaĵo al bildaro @@ -2003,7 +2210,7 @@ Aktualigi Malŝlosi historion de ĉifritaj mesĝoj Ŝlosilpetoj - Element por Android + ${app_name} por Android Ŝlosiloj jam estas ĝisdataj! Evento foriĝis de administranto de la ĉambro, kialo: %1$s Evento foriĝis de uzanto, kialo: %1$s @@ -2166,7 +2373,24 @@ Temo Temo de ĉambro (malnepra) Nomo de ĉambro - Element trovis propran servilan agordaron per la retnomo «%1$s» el via identigilo de uzanto: + ${app_name} trovis propran servilan agordaron per la retnomo «%1$s» el via identigilo de uzanto: \n%2$s Nevalidas hejmservil-serĉanta respondo + Elektu la rolojn bezonatajn por ŝanĝi diversajn partojn de la ĉambro + Permesoj + Montri kaj ĝisdatigi la rolojn bezonatajn por ŝanĝi diversajn partojn de la ĉambro. + Ĉi tiu ĉambro ne estas publika. Vi ne povos re-aliĝi sen invito. + Permesi aliron al viaj kontaktoj. + Por skani rapidrespondan kodon, vi bezonas permesi aliron al filmilo. + Vi paŭzigis la vokon + %s paŭzigis la vokon + Paŭzigi + Daŭrigi + Sendi historion de petoj havigi ŝlosilojn + Neniu pliaj rezultoj + Reiri + Malpublikigi + Aldoni + Ekbabili + Implicita de sistemo \ No newline at end of file diff --git a/vector/src/main/res/values-es-rMX/strings.xml b/vector/src/main/res/values-es-rMX/strings.xml index 6ddb1d53ac..b96e90fbe2 100644 --- a/vector/src/main/res/values-es-rMX/strings.xml +++ b/vector/src/main/res/values-es-rMX/strings.xml @@ -1,5 +1,91 @@ + %1$s: %2$s + %1$s envió una imagen. + + la invitación de %s + %1$s invitó a %2$s + %1$s te invitó + %1$s se unió + %1$s salió + %1$s rechazó la invitación + %1$s quitó a %2$s + %1$s desprohibió a %2$s + %1$s prohibió %2$s + %1$s retiró la invitación de %2$s + %1$s cambió su foto de perfil + %1$s estableció %2$s como su nombre visible + %1$s cambió su nombre visible de %2$s a %3$s + %1$s eliminó su nombre visible (%2$s) + %1$s cambió el tema a: %2$s + %1$s cambió el nombre de la sala a: %2$s + %s comenzó una llamada de video. + %s comenzó una llamada de voz. + %s recibió la llamada. + %s terminó la llamada. + %1$s dejó que %2$s vea el historial del futuro + todos los miembros de la sala, desde su invitación. + todos los miembros de la sala, desde cuando entraron. + todos los miembros de la sala. + todos. + desconocido (%s). + %1$s encendió el cifrado de extremo a extremo (%2$s) + + %1$s solicitó una conferencia VoIP + conferencia VoIP comenzó + conferencia VoIP finalizó + + (foto de perfil también se cambió) + %1$s eliminó el nombre de la sala + %1$s retiró el tema de la sala + %1$s actualizó su perfil %2$s + %1$s envió una invitación a %2$s para entrar a la sala + %1$s aceptó la invitación de %2$s + + ** No se puede descifrar: %s ** + El dispositivo del remitente no nos ha enviado las claves de este mensaje. + + + No se pudo redactar + No se puede enviar el mensaje + + La subida de la imagen falló + + + Error de la red + Error de Matrix + + + + + + + + + No es posible volver a unirse a una sala vacía. + + + Correo electrónico + Número telefónico + + %1$s envió una calcomanía. + + + Invitación de %s + Invitación de Sala + %1$s y %2$s + Sala vacía + + + + %1$s y otro + %1$s y %2$d otros + + + Mensaje eliminado + Mensaje eliminado por %1$s + Mensaje eliminado [motivo: %1$s] + Mensaje eliminado por %1$s [motivo: %2$s] Mensajes Sala @@ -70,7 +156,7 @@ Libreta local de direcciones Solamente contactos Matrix Sin conversaciones - No ha permitido a Element acceder a sus contactos locales + No ha permitido a ${app_name} acceder a sus contactos locales Sin resultados Salas @@ -206,16 +292,16 @@ No pudo grabar video" Información - Element necesita tu permiso para entrar en tu almacenaje de fotos y videos para enviar y guardar archivos.\n\nPor favor permite el acceso en el siguiente mensaje para poder enviar archivos desde su dispostivo. - Element necesita tu permiso para usar tu cámara para tomar fotos y hacer llamadas de video. + ${app_name} necesita tu permiso para entrar en tu almacenaje de fotos y videos para enviar y guardar archivos.\n\nPor favor permite el acceso en el siguiente mensaje para poder enviar archivos desde su dispostivo. + ${app_name} necesita tu permiso para usar tu cámara para tomar fotos y hacer llamadas de video. \n\nPor favor permite el acceso en el siguiente mensaje para poder hacer la llamada. - Element necesita tu permiso para usar tu micrófono para hacer llamadas de voz. + ${app_name} necesita tu permiso para usar tu micrófono para hacer llamadas de voz. \n\nPor favor permite el acceso en el siguiente mensaje para poder hacer la llamada. - Element necesita tu permiso para usar su cámara y micrófono para hacer llamadas de video.\n\nPor favor permite el acceso en el siguiente mensaje para poder hacer la llamada. - Element necesita tu permiso para leer tus contactos y directorio para encontrar a otros usuarios por sus correos electrónicos y números telefónicos.\n\nPor favor permite el acceso en el siguiente mensaje para encontrar usuarios de Element en su directorio. - Element necesita tu permiso para leer los contactos de tu directorio para encontrar otros usuarios de Matrix por sus correos electrónicos y números telefónicos. + ${app_name} necesita tu permiso para usar su cámara y micrófono para hacer llamadas de video.\n\nPor favor permite el acceso en el siguiente mensaje para poder hacer la llamada. + ${app_name} necesita tu permiso para leer tus contactos y directorio para encontrar a otros usuarios por sus correos electrónicos y números telefónicos.\n\nPor favor permite el acceso en el siguiente mensaje para encontrar usuarios de ${app_name} en su directorio. + ${app_name} necesita tu permiso para leer los contactos de tu directorio para encontrar otros usuarios de Matrix por sus correos electrónicos y números telefónicos. -¿Permitir el acceso a Element para leer tus contactos ? +¿Permitir el acceso a ${app_name} para leer tus contactos ? Perdón. Operación no realizada debido a permisos faltantes Guardado @@ -615,14 +701,13 @@ Dispositivos desconocidos: Activar/desactivar Markdown Tema Claro Tema Oscuro - Tema Negro + Tema Negro Detectar eventos Notificaciones ruidosas Notificaciones silenciosas Borrar Debido a que faltan permisos, esta acción no es posible. Informe de error - Tema de Status.im Detalles sobre la comunidad Enviar una calcomanía Licencias de terceros @@ -640,7 +725,7 @@ Dispositivos desconocidos: Llamar de todos modos Verificar dispositivo Llamadas - Usar el tono de llamada normal de Element para llamadas entrantes + Usar el tono de llamada normal de ${app_name} para llamadas entrantes Tono para llamadas entrantes Elegir sonido de llamadas: Razón diff --git a/vector/src/main/res/values-es/strings.xml b/vector/src/main/res/values-es/strings.xml index 8a05b0dfd3..b0357ab34c 100644 --- a/vector/src/main/res/values-es/strings.xml +++ b/vector/src/main/res/values-es/strings.xml @@ -1,5 +1,275 @@ + %1$s: %2$s + %1$s envió una imagen. + la invitación de %s + %1$s invitó a %2$s + %1$s te ha invitado + %1$s se ha unido + %1$s salió + %1$s rechazó la invitación + %1$s expulsó a %2$s + %1$s le quitó el veto a %2$s + %1$s vetó a %2$s + %1$s retiró la invitación de %2$s + %1$s cambió su avatar + %1$s estableció %2$s como su nombre público + %1$s cambió su nombre público de %2$s a %3$s + %1$s eliminó su nombre público (%2$s) + %1$s cambió el tema a: %2$s + %1$s cambió el nombre de la sala a: %2$s + %s realizó una llamada de vídeo. + %s realizó una llamada de voz. + %s contestó la llamada. + %s finalizó la llamada. + %1$s hizo visible el historial futuro de la sala para %2$s + todos los miembros de la sala, desde su invitación. + todos los miembros de la sala, desde el momento en que se unieron. + todos los miembros de la sala. + todos. + desconocido (%s). + %1$s ha activado la encriptación de Extremo-a-Extremo (%2$s) + %1$s solicitó una conferencia de VozIP + Conferencia de VozIP iniciada + Conferencia de VozIP finalizada + (el avatar también se cambió) + %1$s eliminó el nombre de la sala + %1$s eliminó el tema de la sala + %1$s actualizó su perfil %2$s + %1$s invitó a %2$s a unirse a la sala + %1$s aceptó la invitación para %2$s + ** No es posible descifrar: %s ** + El dispositivo emisor no nos ha enviado las claves para este mensaje. + + No se pudo redactar + No es posible enviar el mensaje + No se pudo cargar la imagen + + Error de red + Error de Matrix + + + + + Actualmente no es posible volver a unirse a una sala vacía. + + Dirección de correo electrónico + Número telefónico + %1$s envió una pegatina. + + Invitación de %s + Invitación a Sala + %1$s y %2$s + Sala vacía + + %1$s y 1 otro + %1$s y %2$d otros + + Mensaje eliminado + Mensaje eliminado por %1$s + Mensaje eliminado [motivo: %1$s] + Mensaje eliminado por %1$s [motivo: %2$s] + %1$s ha revocado la invitación a unirse a la sala para %2$s + Sincronización Inicial +\nImportando cuenta… + Sincronización Inicial: +\nImportando Salas + Sincronización Inicial: +\nImportando Comunidades + Sincronización Inicial: +\nImportando Datos de la Cuenta + Enviando mensaje… + Borrar cola de envío + %1$s ha invitado a %2$s. Razón: %3$s + %1$s te ha invitado. Razón: %2$s + %1$s se ha unido. Razón: %2$s + %1$s se ha ido. Razón: %2$s + %1$s ha rechadazo la invitación. Razón: %2$s + %1$s expulsó a %2$s. Razón: %3$s + %1$s ha baneado a %2$s. Razón: %3$s + %1$s ha aceptado la invitación para %2$s. Razón: %3$s + %1$s ha eliminado la dirección principal para esta sala. + %s ha actualizado la sala. + Sincronización Inicial: +\nImportando criptografía + Sincronización Inicial: +\nImportando Salas a las que te has unido + Sincronización Inicial: +\nImportando Salas a las que has sido invitada + Sincronización Inicial: +\nImportando Salas Abandonadas + Invitación de %1$s. Razón: %2$s + %1$s ha desbaneado a %2$s. Razón: %3$s + %1$s envió una invitación a %2$s para que se una a la sala. Razón: %3$s + %1$s revocó la invitación de %2$s para unirse a la sala. Razón: %3$s + %1$s ha retirado la invitación de %2$s. Razón: %3$s + + %1$s ha añadido %2$s como alias de esta sala. + %1$s ha añadido %2$s como alias de esta sala. + + + %1$s ha quitado %2$s como alias de esta sala. + %1$s ha quitado %2$s como alias de esta sala. + + %1$s ha establecido la dirección principal de esta sala a %2$s. + %1$s ha permitido que los invitados se unan a la sala. + %1$s ha impedido que los invitados se unan a la sala. + %1$s ha activado la encriptación extremo a extremo. + %1$s ha activado la encriptación de extremo a extremo (algoritmo no reconocido %2$s). + Enviaste una imagen. + Enviaste un sticker. + Tu invitación + %1$s creó la sala + Creaste la sala + Invitaste a %1$s + Te uniste a la Sala + Dejaste la Sala + Rechazaste la invitación + Tu pateaste a %1$s + Tu desbanaste a %1$s + Usted prohibió a %1$s + Retiró la invitación de %1$s\'s + Cambiaste tu avatar + Establece su nombre de visualización en %1$s + Cambiaste tu nombre para mostrar de %1$s a %2$s + Quitaste tu nombre para mostrar (era %1$s) + Cambiaste el tema a: %1$s + %1$s cambió el avatar de la sala + Cambiaste el avatar de la sala + Cambiaste el nombre de la sala a: %1$s + Hiciste una videollamada. + Hiciste una llamada de voz. + %s envió datos para configurar la llamada. + Enviaste datos para configurar la llamada. + Respondiste la llamada. + Terminaste la llamada. + Hiciste visible el futuro historial de la %1$s + Has activado la encriptación de Extremo-a-Extremo (%1$s) + Has actualizado esta sala. + Solicitaste una conferencia de VozIP + Quitaste el nombre de la sala + Quitaste el tema de la sala + %1$s eliminó el avatar de la sala + Quitaste el avatar de la sala + Actualizaste tu perfil %1$s + Enviaste una invitación a %1$s para unirse a la sala + Revocaste la invitación para que %1$s se una a la sala + Aceptaste la invitación para %1$s + %1$s agrego el widget %2$s + Agregaste el widget %1$s + %1$s eliminó el widget %2$s + Quitaste el widget %1$s + %1$s modifico el widget %2$s + Modificaste el widget %1$s + Administrador + Moderador + Por defecto + Personalizado (%1$d) + Personalizado + Cambiaste el nivel de permisos de %1$s. + %1$s cambió el nivel de permisos de %2$s. + %1$s de %2$s a %3$s + Tu invitación. Razón: %1$s + Invitaste a %1$s. Razón: %2$s + Te uniste a la sala. Razón: %1$s + Dejaste la sala. Razón: %1$s + Rechazaste la invitación. Razón: %1$s + Pateaste a %1$s. Motivo: %2$s + Has desactivado a %1$s. Motivo: %2$s + Prohibiste a %1$s. Motivo: %2$s + Enviaste una invitación a %1$s para unirse a la sala. Motivo: %2$s + Revocaste la invitación para que %1$s se una a la sala. Motivo: %2$s + Aceptaste la invitación para %1$s. Motivo: %2$s + Retiró la invitación de %1$s\'s. Motivo: %2$s + + Agregaste %1$s como dirección para esta sala. + Agregaste %1$s como direcciones para esta sala. + + + Quitaste %1$s como dirección para esta sala. + Quitaste %1$s como direcciones para esta sala. + + %1$s añadió %2$s y eliminó %3$s como alias para esta sala. + Agregaste %1$s y quitaste %2$s como direcciones para esta sala. + Estableciste la dirección principal de esta sala en %1$s. + Quitaste la dirección principal de esta sala. + Ha permitido que los invitados se unan a la sala. + Ha impedido que los invitados se unan a la sala. + Tu has activado la encriptación de Extremo-a-Extremo. + Has activado la encriptación de Extremo-a-Extremo (algoritmo %1$s no reconocido). + Has impedido que invitados se unan a la sala. + Has permitido a invitados unirse aquí. + Te has ido. Razón: %1$s + Has revocado la invitación de %1$s + Has invitado a %1$s + Has actualizado aquí. + Has hecho futuros mensajes visibles a %1$s + Te saliste de la sala + Te uniste + Creaste la conversación + %1$s ha impedido que invitados se unan a la sala. + %1$s ha permitido a invitados a unirse aquí. + %1$s se ha ido. Razón: %2$s + Tu te has unido. Razón: %1$s + %1$s se ha unido. Razón: %2$s + %1$s ha revocado la invitación de %2$s + %1$s ha invitado %2$s + %s ha actualizado aquí. + %1$s ha hecho futuros mensajes visibles a %2$s + %1$s ha salido de la sala + %1$s se ha unido + %1$s ha creado la conversación + Cambiaste el alias de esta sala. + %1$s cambió el alias de esta sala. + Cambiaste los alias principal y alternativos de esta sala. + %1$s cambió los alias principal y alternativos de esta sala. + Cambiaste los alias alternativos de esta sala. + %1$s cambió los alias alternativos de esta sala. + + Eliminaste el alias alternativo %1$s para esta sala. + Eliminaste los alias alternativos %1$s para esta sala. + + + %1$s eliminó el alias alternativo %2$s para esta sala. + %1$s eliminó los alias alternativos %2$s para esta sala. + + + Añadiste el alias alternativo %1$s para esta sala. + Añadiste los alias alternativos %1$s para esta sala. + + + %1$s añadió el alias alternativo %2$s para esta sala. + %1$s añadió los alias alternativos %2$s para esta sala. + + Sala vacía (%s) + + %1$s, %2$s, %3$s y %4$d otro + %1$s, %2$s, %3$s y %4$d otros + + %1$s, %2$s, %3$s y %4$s + %1$s, %2$s y %3$s + 🎉 Todos los servidores tienen prohibido participar! Esta sala ya no puede ser usada. + Sin cambios. + • Los servidores con literales IP coincidentes ahora están prohibidos. + • Los servidores con literales IP coincidentes ahora están permitidos. + • Los servidores con %s coincidentes se han eliminado de la lista de permitidos. + • Los servidores con %s coincidentes ahora están permitidos. + • Los servidores con %s coincidentes se han eliminado de la lista de baneos. + • Los servidores con %s coincidentes ahora están prohibidos. + Has cambiado la lista de control de acceso para esta sala. + %s ha cambiado la lista de control de acceso para esta sala. + • Los servidores con %s coincidentes están permitidos. + • Los servidores con %s coincidentes están prohibidos. + • Los servidores con literales IP coincidentes están prohibidos. + • Los servidores con literales IP coincidentes están permitidos. + Has fijado la lista de control de acceso para esta sala. + %s ha fijado la lista de control de acceso para esta sala. + Has modificado la videoconferencia + Videoconferencia modificada por %1$s + Has terminado la videoconferencia + Videoconferencia terminada por %1$s + Has empezado una videoconferencia + Videoconferencia empezada por %1$s Mensajes Sala @@ -71,7 +341,7 @@ Agenda de contactos local Solo contactos de Matrix No hay conversaciones - No permitiste que Element acceda a tus contactos locales + No permitiste que ${app_name} acceda a tus contactos locales No hay resultados Salas @@ -211,26 +481,26 @@ No se puede grabar vídeo Información - Element necesita permiso para acceder a tu biblioteca de fotos y vídeos para enviar y guardar archivos adjuntos. + ${app_name} necesita permiso para acceder a tu biblioteca de fotos y vídeos para enviar y guardar archivos adjuntos. \n \nPor favor permite el acceso en la próxima ventana emergente para poder enviar archivos desde tu teléfono. - Element necesita permiso para acceder a tu cámara para tomar fotos y realizar llamadas de vídeo. + ${app_name} necesita permiso para acceder a tu cámara para tomar fotos y realizar llamadas de vídeo. " \n \nPor favor permite el acceso en la próxima ventana emergente para poder realizar la llamada." - Element necesita permiso para acceder a tu micrófono para realizar llamadas de voz. + ${app_name} necesita permiso para acceder a tu micrófono para realizar llamadas de voz. " \n \nPor favor permite el acceso en la próxima ventana emergente para poder realizar la llamada." - Element necesita permiso para acceder a tu cámara y micrófono para realizar llamadas de vídeo. + ${app_name} necesita permiso para acceder a tu cámara y micrófono para realizar llamadas de vídeo. \n \nPor favor permite el acceso en las próximas ventanas emergentes para poder realizar la llamada. - Element necesita permiso para acceder a tu agenda de contactos para encontrar otros usuarios de Matrix por sus correos electrónicos y números telefónicos. + ${app_name} necesita permiso para acceder a tu agenda de contactos para encontrar otros usuarios de Matrix por sus correos electrónicos y números telefónicos. -Por favor permite el acceso en la próxima ventana emergente para descubrir usuarios accesibles desde Element en tu agenda de contactos. - Element necesita permiso para acceder a tu agenda de contactos para encontrar otros usuarios de Matrix por sus correos electrónicos y números telefónicos. +Por favor permite el acceso en la próxima ventana emergente para descubrir usuarios accesibles desde ${app_name} en tu agenda de contactos. + ${app_name} necesita permiso para acceder a tu agenda de contactos para encontrar otros usuarios de Matrix por sus correos electrónicos y números telefónicos. \n -\n¿Permitir que Element acceda a tus contactos \? +\n¿Permitir que ${app_name} acceda a tus contactos \? Lo sentimos. Acción no realizada, debido a que faltan permisos Guardado @@ -503,8 +773,8 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua \'%s\' no es un formato de alias válido No tendrás una dirección principal especificada para esta sala. Advertencias de la dirección principal - Establecer como Dirección Principal - Dejar de Establecer como Dirección Principal + Establecer como dirección principal + Dejar de Establecer como dirección principal Copiar ID de Sala Copiar Dirección de Sala La encriptación está habilitada en esta sala. @@ -601,7 +871,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua DIRECTORIO DE USUARIOS (%s) Tema Claro Tema Oscuro - Tema Negro + Tema Negro Sincronizando… Captando eventos Notificaciones ruidosas @@ -782,7 +1052,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Falta un parámetro requerido. Solicitud enviada Conversar - Por favor, inicia Element en otro dispositivo que pueda descifrar el mensaje para que pueda enviar las claves a esta sesión. + Por favor, inicia ${app_name} en otro dispositivo que pueda descifrar el mensaje para que pueda enviar las claves a esta sesión. Licencias de terceros Borrar continuar con… @@ -790,10 +1060,10 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Volver a solicitar las claves de encriptado de tus otras sesiones. Solicitud de clave enviada. Privacidad de Notificaciones - Element puede ejecutarse en segundo plano para gestionar tus notificaciones de forma segura y privada. Esto podría afectar la duración de la batería. + ${app_name} puede ejecutarse en segundo plano para gestionar tus notificaciones de forma segura y privada. Esto podría afectar la duración de la batería. Enviar datos de análisis de estadísticas - Element recopila análisis de estadísticas anónimas para permitirnos mejorar la aplicación. - Por favor, habilita los análisis de estadísticas para ayudarnos a mejorar Element. + ${app_name} recopila análisis de estadísticas anónimas para permitirnos mejorar la aplicación. + Por favor, habilita los análisis de estadísticas para ayudarnos a mejorar ${app_name}. Escribe aquí… Si es posible, por favor escribe la descripción en inglés. Enviar una respuesta cifrada… @@ -862,7 +1132,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Este servidor doméstico ha alcanzado su límite Mensual de Usuarios Activos. Por favor, %s para aumentar este límite. Por favor, %s para continuar utilizando este servicio. - Tema de Status.im Error Versión %s Por favor, crea una frase de contraseña para cifrar las claves exportadas. Necesitarás ingresar la misma frase de contraseña para poder importar las claves. @@ -878,7 +1147,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Aceptar Por favor revisa y acepta las reglas de este servidor doméstico: Llamadas - Usar el tono de llamada normal de Element para llamadas entrantes + Usar el tono de llamada normal de ${app_name} para llamadas entrantes Tono para llamadas entrantes Elegir sonido de llamadas: Llamada de video en proceso… @@ -920,8 +1189,8 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Activar Ajustes de sesión. Las notificaciones están activadas para esta sesión. - Las notificaciones no están habilitadas para esta sesión. -\nPor favor comprueba los ajustes Element. + Las notificaciones no están habilitadas para esta sesión. +\nPor favor comprueba los ajustes ${app_name}. Activar Ajustes personalizados. Ten en cuenta que algunos mensajes son silenciosos (producen una notificación sin sonido). @@ -938,16 +1207,16 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Una o más pruebas han fallado, por favor mándanos un informe de error para que podamos investigar. Copia de seguridad en progreso. Si cierras sesión ahora perderás el acceso a tus mensajes encriptados. La copia de seguridad debería estar activa ahora en todas tus sesiones para evitar la pérdida de acceso a tus mensajes encriptados. - Element usa los servicios de Google Play para entregar mensajes Push pero no parece estar configurado correctamente: + ${app_name} usa los servicios de Google Play para entregar mensajes Push pero no parece estar configurado correctamente: \n%1$s solucionar error con los Servicios de Google Play Token Base Token FCM recuperada correctamente:\n%1$s Error al recuperar token FCM:\n%1$s - [%1$s]\nEste error esta fuera del control de Element y de acuerdo con Google, este error indica que el dispositivo tiene demasiadas apps registradas con FCM. Este error solo ocurre cuando existe un numero demasiado alto de apps por lo que no deberia afectar a un usuario promedio. - [%1$s]\nEste error esta fuera del control de Element. Puede ocurrir por numerosas razones. Probablemente funcione si vuelve a intentarlo mas tarde. También puede comprobar si los Servicios de Google Play están limitados por los ajustes del sistema o si la hora del dispositivo es correcta o si puede pasar en ROM personalizada. - [%1$s] -\nEste error esta fuera del control de Element. No hay cuenta de googled registrada en este dispositivo. Por favor abre el gestor dde cuentas y añade una cuenta de Google. + [%1$s]\nEste error esta fuera del control de ${app_name} y de acuerdo con Google, este error indica que el dispositivo tiene demasiadas apps registradas con FCM. Este error solo ocurre cuando existe un numero demasiado alto de apps por lo que no deberia afectar a un usuario promedio. + [%1$s]\nEste error esta fuera del control de ${app_name}. Puede ocurrir por numerosas razones. Probablemente funcione si vuelve a intentarlo mas tarde. También puede comprobar si los Servicios de Google Play están limitados por los ajustes del sistema o si la hora del dispositivo es correcta o si puede pasar en ROM personalizada. + [%1$s] +\nEste error esta fuera del control de ${app_name}. No hay cuenta de googled registrada en este dispositivo. Por favor abre el gestor dde cuentas y añade una cuenta de Google. Añadir cuenta Token de registro Token FCM registrado correctamente en el Servidor. @@ -976,17 +1245,17 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Error al reiniciar el servicio Inicio automático El servicio funcionará cuando reinicie el dispositivo. - El servicio no se iniciará al reiniciar el dispositivo, no recibirá notificaciones hasta que Element haya sido abierto al menos 1 vez. + El servicio no se iniciará al reiniciar el dispositivo, no recibirá notificaciones hasta que ${app_name} haya sido abierto al menos 1 vez. Activar Inicio automático Comprobar restricciones en segundo plano - Las restricciones de segundo plano están desactivadas para Element. Este debería funcionar con datos móviles (sin WIFI). + Las restricciones de segundo plano están desactivadas para ${app_name}. Este debería funcionar con datos móviles (sin WIFI). \n%1$s - Las restricciones de segundo plano están activadas para Element. + Las restricciones de segundo plano están activadas para ${app_name}. \nLa app estará completamente restringida mientras esté en segundo plano y esto podría afectar a las notificaciones. \n%1$s Desactivar restricciones Optimización de la bateria - A Element no le afecta la Optimización de la bateria. + A ${app_name} no le afecta la Optimización de la bateria. Si un usuario deja el dispositivo desenchufado e inmóvil durante cierto periodo de tiempo con la pantalla apagada, el dispositivo entrará en modo hibernación. Esto evita que las apps accedan a la red y postpone sus tareas, sincronizaciones y alarmas. ignorar optimización Las apps no necesita conectarse al servidor doméstico en segundo plano, esto debería reducir el uso de la batería @@ -1009,8 +1278,8 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Enviar mensaje con intro La tecla Intro enviará el mensaje en vez de añadir un salto de línea Conexión en segundo plano - Element necesita mantener una leve conexión en segundo plano para poder ofrecer notificaciones de confianza. -\nEn la siguiente pantalla se le pedirá permisos para que Element siempre funcione en segundo plano, por favor acepte. + ${app_name} necesita mantener una leve conexión en segundo plano para poder ofrecer notificaciones de confianza. +\nEn la siguiente pantalla se le pedirá permisos para que ${app_name} siempre funcione en segundo plano, por favor acepte. Conceder permiso El modo de guardado de datos aplica un filtro específico para que las actualizaciones de presencia y las notificaciones de escritura sean eliminadas. Ha ocurrido un error mientras se verificaba tu dirección de correo electrónico. @@ -1059,7 +1328,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua No se ha encontrado ningún APK válido de Servicios de Google Play. Las notificaciones podrían no funcionar correctamente. Por favor introduzca una contraseña La contraseña que has introducido es muy débil - Por favor borra la contraseña si quieres que Element genere una clave de recuperación. + Por favor borra la contraseña si quieres que ${app_name} genere una clave de recuperación. No hay ninguna sesión de Matrix disponible Nunca perder los mensajes encriptados Los mensajes en salas encriptadas están asegurados con encriptación Extremo-a-Extremo. Solo los integrantes de la sala y tu podéis leer estos mensajes. @@ -1140,7 +1409,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Firma autocompletar opciones del servidor - Element ha detectado una configuración personalizada del servidor para el dominio de su ID de usuario \"%1$s\": + ${app_name} ha detectado una configuración personalizada del servidor para el dominio de su ID de usuario \"%1$s\": \n%2$s Configuración de uso Origen predeterminado de medios @@ -1221,7 +1490,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Conversaciones Tus conversaciones se mostrarán aquí. Toque + en la derecha para comenzar. Salas - Tus salas se mostrarán aquí + Tus salas se mostrarán aquí. Pulsa el botón + abajo a la derecha para buscar o crear salas propias. Reacciones De acuerdo Me gusta @@ -1239,7 +1508,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Espere por favor… Todas la comunidades Esta sala no se puede previsualizar - La previsualización de salas públicas no es posible todavía con Element + La previsualización de salas públicas no es posible todavía con ${app_name} Salas Chats Nueva sala @@ -1291,10 +1560,10 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Pon un número de teléfono para que las personas que conoces te puedan encontrar. Se usará %s como asistencia cuando el servidor doméstico no la ofrezca (su dirección IP se compartirá durante una llamada) Modo Sincronización en segundo plano - Element se sincronizará en segundo plano de manera que se preserven los recursos del dispositivo (batería). + ${app_name} se sincronizará en segundo plano de manera que se preserven los recursos del dispositivo (batería). \nDependiendo del estado de los recursos del dispositivo, la sincronización puede ser aplazada por el sistema operativo. - Element se sincronizará en segundo plano periódicamente en un momento preciso (configurable). -\nEsto afectará al uso de la radio y la batería, se mostrará una notificación permanente que indica que Element está escuchando a nuevos acontecimientos. + ${app_name} se sincronizará en segundo plano periódicamente en un momento preciso (configurable). +\nEsto afectará al uso de la radio y la batería, se mostrará una notificación permanente que indica que ${app_name} está escuchando a nuevos acontecimientos. No se le notificará de los mensajes entrantes cuando la aplicación esté en segundo plano. Intervalo de sincronización preferido %s @@ -1456,7 +1725,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Este contenido fue reportado como inapropiado. \n \nSi no quieres ver más contenido de este usuario, puedes bloquearlo para ocultar sus mensajes. - Element necesita permiso para guardar tus claves E2E en la memória del dispositivo. + ${app_name} necesita permiso para guardar tus claves E2E en la memória del dispositivo. \n \nPorfavor permite el acceso en el siguiente pop-up para poder exportar tus claves manualmente. No hay conexión de red @@ -1497,7 +1766,6 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Dirección Alojamiento de pago para organizaciones Introduzca la dirección de Modular Element o servidor que quieres usar - Introduzca la dirección del servidor Element al que quieres conectarte Se produjo un error al cargar la página: %1$s (%2$d) La aplicación no es capaz de iniciar sesión en este servidor. Éste solo soporta el acceso mediante: %1$s. \n @@ -1515,7 +1783,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Copiar Correcto Notificaciones - Element Fallo la Llamada + ${app_name} Fallo la Llamada Fallo al intentar establecer conexion. \nTURN Server fallo. Por favor, contacte con el administrador de su Servidor y notifique el fallo. Seleccionar Dispositivo de Sonido @@ -1558,13 +1826,12 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Cargando lenguajes disponibles… Leer los terminos de %s Desconectarse del servidor de Identidad %s\? - Servidor de identidad desactualizado. Element solo soporta API V2. + Servidor de identidad desactualizado. ${app_name} solo soporta API V2. Operación no posible. Servidor desactualizado. Por favor, configure primero un Servidor de Identidad. - Riot ahora es Element! - Entendido - Aprender Mas - Element + Riot ahora es Element! + Entendido + Aprender Mas Buscar en mis contactos Rechazar invitación Confirma PIN para desabilitarlo @@ -1599,7 +1866,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Otras Sesiones Mostrando solo el primer resultado, agregue mas letras… Fallar rápido (Test) - Element puede fallar con más frecuencia cuando ocurre un error inesperado + ${app_name} puede fallar con más frecuencia cuando ocurre un error inesperado Antepone ¯\\_(ツ)_/¯ a un mensaje de texto sin formato Habilitar crifrado Una vez habilitada, la encriptación no se puede deshabilitar. @@ -1661,9 +1928,9 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Nivel Personalizado en %1$s Nivel Personalizado (%1$d) en %2$s Saltar para leer el recibo - Element no maneja eventos de tipo \'%1$s\' - Element no maneja el mensaje de tipo \'%1$s\' - Element encontró un problema al representar el contenido del evento con el ID \'%1$s\' + ${app_name} no maneja eventos de tipo \'%1$s\' + ${app_name} no maneja el mensaje de tipo \'%1$s\' + ${app_name} encontró un problema al representar el contenido del evento con el ID \'%1$s\' Dejar de ignorar Salas recientes Otras salas @@ -1705,7 +1972,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Eliminar… Razón Razón para redactar - Element Android + ${app_name} Android Refrescar Nuevo inicio de sesión detectado . ¿Fue usted\? Toca para revisar y verificar @@ -1913,7 +2180,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua \nVuelva a iniciar sesión para acceder a los datos y mensajes de su cuenta. Perderás el acceso a los mensajes seguros a menos que inicies sesión para recuperar tus claves de encriptación. Borrar datos - La sesión actual es para el usuario %1$s y usted proporciona las credenciales para el usuario %2$s. Esto no está suportado por Element. + La sesión actual es para el usuario %1$s y usted proporciona las credenciales para el usuario %2$s. Esto no está suportado por ${app_name}. \nPrimero borre los datos, luego inicie sesión nuevamente con otra cuenta. Su enlace matrix.to estaba mal formado El modo desarrollador activa funciones ocultas y también puede hacer que la aplicación sea menos estable. ¡Solo para desarrolladores! @@ -2070,13 +2337,13 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Al habilitar esta configuración, se agrega FLAG_SECURE a todas las actividades. Reinicie la aplicación para que el cambio surta efecto. Archivo multimedia agregado a la Galería No se pudo agregar el archivo multimedia a la Galería - Utilice la última versión de Element en sus otros dispositivos, Element Web, Element Desktop, Element iOS, Element para Android u otro cliente Matrix con capacidad de firma cruzada - Elemento Web -\nElemento de escritorio - Elemento iOS -\nElemento Android + Utilice la última versión de ${app_name} en sus otros dispositivos, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} para Android u otro cliente Matrix con capacidad de firma cruzada + ${app_name} Web +\n${app_name} de escritorio + ${app_name} iOS +\${app_name} Android u otro cliente Matrix con capacidad de firma cruzada - Utilice la última versión de Element en sus otros dispositivos: + Utilice la última versión de ${app_name} en sus otros dispositivos: Obliga a descartar la sesión de grupo saliente actual en una sala cifrada Solo se admite en salas cifradas Use su %1$s o use su %2$s para continuar. @@ -2094,10 +2361,9 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Confirme su identidad verificando este inicio de sesión de una de sus otras sesiones, otorgándole acceso a los mensajes encriptados. Confirme su identidad verificando este inicio de sesión, otorgándole acceso a los mensajes encriptados. Marcar como de confianza - Lo sentimos, esta operación aún no es posible para las cuentas conectadas mediante el inicio de sesión único. No pudimos crear tu DM. Marque los usuarios que desea invitar y vuelva a intentarlo. Primero acepta los términos del servidor de identidad en la configuración. - Para su privacidad, Element solo admite el envío de números de teléfono y correos electrónicos de usuario con hash. + Para su privacidad, ${app_name} solo admite el envío de números de teléfono y correos electrónicos de usuario con hash. La asociación ha fallado. No hay asociación actual con este identificador. Su servidor doméstico (%1$s) propone utilizar %2$s para su servidor de identidad @@ -2139,7 +2405,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua No puede acceder a este mensaje porque el remitente no confía en su sesión No puede acceder a este mensaje porque el remitente no envió las claves a propósito Esperando al historial de encriptación - ¡Nos complace anunciar que hemos cambiado de nombre! Tu aplicación está actualizada y accediste a tu cuenta. + ¡Nos complace anunciar que hemos cambiado de nombre! Tu aplicación está actualizada y accediste a tu cuenta. Guardar la clave de recuperación en Agregar desde mi directorio telefónico Tu directorio telefónico está vacío @@ -2200,13 +2466,13 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Hay cambios sin salvar. ¿Descartar los cambios\? La sala todavía no ha sido creada. ¿Cancelar la creación\? El link está malformado - PIN es requerido cada vez que se abre Element. - PIN es necesario después de no usar Element por 2 minutos. + PIN es requerido cada vez que se abre ${app_name}. + PIN es necesario después de no usar ${app_name} por 2 minutos. Requerir PIN después de 2 minutos Sólo mostrar el número de mensajes no leídos en una notificación sencilla. Mostrar detalles, como nombres de salas y contenido de mensajes. Mostrar contenido de notificaciones - Element sólo puede ser desbloqueado vía Código PIN. + ${app_name} sólo puede ser desbloqueado vía Código PIN. Activar biometría de este dispositivo en particular, como huellas dactilares o reconocimiento facial. Activar biometría Configurar protecciones @@ -2251,7 +2517,7 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Permitir acceder a sus contactos. Desautorizado, credenciales de autenticación no autorizadas Limpiar Historial - Element requiere que ingrese sus credenciales para realizar esta acción. + ${app_name} requiere que ingrese sus credenciales para realizar esta acción. Se necesita una nueva autenticación Enlace Matrix ¡Código QR no escaneado! @@ -2267,16 +2533,16 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Agregar un tema %s para dar a saber de qué se trata la sala. Este es el inicio de mensajes con %s. - Iniciar Chat + Empezar a chatear Despublicar - Adicionar + Añadir No tiene permisos para encryptar esta sala. No es un ID matrix valido Mi codigo Compartir mi codigo Escanear QR - 🔐️ Unirme a Element - Hey, contactame por Element:%s + 🔐️ Unirme a ${app_name} + Hey, contactame por ${app_name}:%s Adicionar persona Compartir ese codigo para que puedan contactarloa usted. Crear una converzacion por ID Matrix @@ -2291,15 +2557,36 @@ Por favor permite el acceso en la próxima ventana emergente para descubrir usua Contactos Usuarios conocidos Mostrar efectos de chat - Para escanear el codigo QR , necesita darle permisos a su cámara. + Para leer el código QR , necesita dar permisos de acceso a su cámara. Invitar contactos Modifique los roles y privilegios de la sala. Sala no pública. No puede acceder sin una invitacion. Actualizar sala Cambiar tema Enviar mensajes - Editar historial de visibilidad + Cambiar la visibilidad del historial Editar permisos Cambiar el nombre de la sala - Administración de sala + Permisos de chat + Habilitar cifrado de la sala + Cambiar la dirección principal de la sala + Cambiar el avatar de la sala + Modificar widgets + Notificar a todos los participantes + Eliminar mensajes enviados por otros usuarios + Banear usuarios + Echar usuarios + Modificar ajustes + Invitar usuarios + Rol por defecto + Permisos + Usa el comando /confetti o envía un mensaje que contenga ❄️ o 🎉 + Envía los eventos m.room.server_acl + No tienes permiso para actualizar los roles necesarios para cambiar varias partes de la sala + Seleciona los roles necesarios para cambiar varias partes de la sala + Tú has puesto la llamada en espera + %s ha puesto la llamada en espera + Esperar + Continuar + Volver \ No newline at end of file diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index 539d5d4017..2dd13ede4a 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -1,9 +1,270 @@ + %1$s: %2$s + %1$s saatis pildi. + %1$s saatis kleepsu. + Kasutaja %s kutse + %1$s kutsus kasutajat %2$s + %1$s kutsus sind + %1$s liitus jututoaga + %1$s lahkus jututoast + %1$s lükkas tagasi kutse + %1$s müksas kasutajat %2$s + %1$s võttis tagasi kutse kasutajale %2$s + %1$s muutis oma avatari + %1$s määras oma kuvatavaks nimeks %2$s + %1$s muutis senise kuvatava nime %2$s uueks nimeks %3$s + %1$s eemaldas oma kuvatava nime (%2$s) + %1$s muutis uueks teemaks %2$s + %1$s muutis jututoa uueks nimeks %2$s + %s alustas videokõnet. + %s alustas häälkõnet. + %s vastas kõnele. + %s lõpetas kõne. + %1$s seadistas, et tulevane jututoa ajalugu on nähtav kasutajale %2$s + kõikidele jututoa liikmetele alates kutsumise hetkest. + kõikidele jututoa liikmetele alates liitumise hetkest. + kõikidele jututoa liikmetele. + kõikidele. + teadmata (%s). + %1$s lülitas sisse läbiva krüptimise (%2$s) + %s uuendas seda jututuba. + %1$s saatis VoIP konverentsi kutse + VoIP-konverents algas + VoIP-konverents lõppes + (samuti sai avatar muudetud) + %1$s eemaldas jututoa nime + %1$s eemaldas jututoa teema + Sõnum on eemaldatud + Sõnum on eemaldatud %1$s poolt + Sõnum on eemaldatud [põhjus: %1$s] + Sõnum on eemaldatud %1$s poolt [põhjus: %2$s] + %1$s uuendas oma profiili %2$s + %1$s saatis jututoaga liitumiseks kutse kasutajale %2$s + %1$s võttis tagasi jututoaga liitumise kutse kasutajalt %2$s + %1$s võttis vastu kutse %2$s nimel + ** Ei õnnestu dekrüptida: %s ** + Sõnumi saatja seade ei ole selle sõnumi jaoks saatnud dekrüptimisvõtmeid. + Ei saanud muuta sõnumit + Sõnumi saatmine ei õnnestunud + Pildi üleslaadimine ei õnnestunud + Võrguühenduse viga + Matrix\'i viga + Hetkel ei ole võimalik uuesti liituda tühja jututoaga. + E-posti aadress + Telefoninumber + Kutse kasutajalt %s + Kutse jututuppa + %1$s ja %2$s + + %1$s ja üks muu + %1$s ja %2$d muud + + Tühi jututuba + Alglaadimine: +\nImpordin kontot… + Alglaadimine: +\nImpordin krüptoseadistusi + Alglaadimine: +\nImpordin jututubasid + Alglaadimine: +\nImpordin liitutud jututubasid + Alglaadimine: +\nImpordin kutsutud jututubasid + Alglaadimine: +\nImpordin lahkutud jututubasid + Alglaadimine: +\nImpordin kogukondi + Alglaadimine: +\nImpordin kontoandmeid + Saadan sõnumit… + Tühjenda saatmisjärjekord + Kasutaja %1$s kutse. Põhjus: %2$s + %1$s kutsus kasutajat %2$s. Põhjus: %3$s + %1$s kutsus sind. Põhjus: %2$s + %1$s liitus jututoaga. Põhjus: %2$s + %1$s lahkus jututoast. Põhjus: %2$s + %1$s lükkas kutse tagasi. Põhjus: %2$s + %1$s müksas välja kasutaja %2$s. Põhjus: %3$s + %1$s saatis kasutajale %2$s kutse jututoaga liitumiseks. Põhjus: %3$s + %1$s tühistas kasutajale %2$s saadetud kutse jututoaga liitumiseks. Põhjus: %3$s + %1$s võttis vastu kutse %2$s jututoaga liitumiseks. Põhjus: %3$s + %1$s võttis tagasi kasutajale %2$s saadetud kutse. Põhjus: %3$s + %1$s lülitas sisse läbiva krüptimise. + %1$s lülitas sisse läbiva krüptimise (tundmatu algoritm %2$s). + + %1$s lisas %2$s selle jututoa aadressiks. + %1$s lisas %2$s selle jututoa aadressideks. + + + %1$s eemaldas %2$s kui selle jututoa aadressi. + %1$s eemaldas %2$s selle jututoa aadresside hulgast. + + %1$s lisas %2$s ja eemaldas %3$s selle jututoa aadresside loendist. + %1$s seadistas selle jututoa põhiaadressiks %2$s. + %1$s eemaldas selle jututoa põhiaadressi. + %1$s lubas külalistel selle jututoaga liituda. + %1$s seadistas, et külalised ei või selle jututoaga liituda. + Kasutaja %1$s lõi jututoa + Sina saatsid pildi. + Sina saatsid kleepsu. + Sinu kutse + Sa lõid jututoa + Sina kutsusid kasutajat %1$s + Sina liitusid jututoaga + Sina lahkusid jututoast + Sina lükkasid kutse tagasi + Sina müksasid %1$s välja + %1$s taastas %2$s ligipääsu + Sina taastasid %1$s ligipääsu + %1$s keelas %2$s ligipääsu + Sina keelasid %1$s ligipääsu + Sina võtsid tagasi %1$s kutse + Sina muutsid oma tunnuspilti + Sina määrasid oma kuvatavaks nimeks %1$s + Sina muutsid senise kuvatava nime %1$s uueks nimeks %2$s + Sina eemaldasid oma kuvatava nime (oli %1$s) + Sina muutsid uueks teemaks %1$s + %1$s muutis jututoa tunnuspilti + Sina muutsid jututoa tunnuspilti + Sina muutsid jututoa uueks nimeks %1$s + Sa alustasid videokõnet. + Sa alustasid häälkõnet. + %s saatis info kõne algatamiseks. + Sa saatsid info kõne algatamiseks. + Sa vastasid kõnele. + Sa lõpetasid kõne. + Sa seadistasid, et tulevane jututoa ajalugu on nähtav kasutajale %1$s + Sa lülitasid sisse läbiva krüptimise (%1$s) + Sa uuendasid seda jututuba. + Sa algatasid VoIP rühmakõne + Sa eemaldasid jututoa nime + Sa eemaldasid jututoa teema + %1$s eemaldas jututoa tunnuspildi + Sa eemaldasid jututoa tunnuspildi + Sa uuendasid oma profiili %1$s + Sina saatsid kasutajale %1$s kutse jututoaga liitumiseks + Sina võtsid tagasi jututoaga liitumise kutse kasutajalt %1$s + Sina võtsid vastu kutse %1$s nimel + %1$s lisas %2$s vidina + Sina lisasid %1$s vidina + %1$s eemaldas %2$s vidina + Sina eemdaldasid %1$s vidina + %1$s muutis %2$s vidinat + Sa muutsid %1$s vidinat + Peakasutaja + Moderaator + Tavakasutaja + Kohandatud kasutajaõigused (%1$d) + Kohandatud õigused + Sina muutsid kasutaja %1$s õigusi. + %1$s muutis kasutaja %2$s õigusi. + %1$s õiguste muutus %2$s -> %3$s + Sinu kutse. Põhjus %1$s + Sina kutsusid kasutajat %1$s. Põhjus: %2$s + Sina liitusid jututoaga. Põhjus: %1$s + Sina lahkusid jututoast. Põhjus: %1$s + Sina lükkasid kutse tagasi. Põhjus: %1$s + Sina müksasid kasutaja %1$s välja. Põhjus: %2$s + %1$s taastas ligipääsu kasutajale %2$s. Põhjus: %3$s + Sina taastasid kasutaja %1$s ligipääsu. Põhjus: %2$s + %1$s keelas kasutaja %2$s ligipääsu. Põhjus: %3$s + Sina keelasid kasutaja %1$s ligipääsu. Põhjus: %2$s + Sina saatsid kasutajale %1$s kutse jututoaga liitumiseks. Põhjus: %2$s + Sina võtsid tagasi jututoaga liitumise kutse kasutajalt %1$s. Põhjus: %2$s + Sina võtsid vastu kutse %1$s nimel. Põhjus: %2$s + Sina võtsid tagasi kasutaja %1$s kutse. Põhjus: %2$s + + Sina lisasid %1$s selle jututoa aadressiks. + Sina lisasid %1$s selle jututoa aadressideks. + + + Sina eemaldasid %1$s, kui selle jututoa aadressi. + Sina eemaldasid %1$s selle jututoa aadresside hulgast. + + Sina lisasid %1$s selle jututoa aadressiks ning eemaldasid %2$s aadresside hulgast. + Sina seadistasid selle jututoa põhiaadressiks %1$s. + Sina eemaldasid selle jututoa põhiaadressi. + Sina lubasid külalistel selle jututoaga liituda. + Sina seadistasid, et külalised ei või selle jututoaga liituda. + Sa lülitasid sisse läbiva krüptimise. + Sa lülitasid sisse läbiva krüptimise (kasutusel on tundmatu algoritm %1$s). + Sina seadistasid, et külalised ei või selle jututoaga liituda. + %1$s seadistas, et külalised ei või selle jututoaga liituda. + Sina lubasid külalistel selle jututoaga liituda. + %1$s lubas külalistel selle jututoaga liituda. + Sina lahkusid jututoast. Põhjus: %1$s + %1$s lahkus jututoast. Põhjus: %2$s + Sina liitusid jututoaga. Põhjus: %1$s + %1$s liitus jututoaga. Põhjus: %2$s + Sina võtsid tagasi jututoaga liitumise kutse kasutajalt %1$s + %1$s võttis tagasi jututoaga liitumise kutse kasutajalt %2$s + Sina kutsusid kasutajat %1$s + %1$s kutsus kasutajat %2$s + Sa uuendasid seda jututuba. + %s uuendas seda jututuba. + Sina seadistasid, et tulevased jututoa sõnumid on nähtavad kasutajale %1$s + %1$s seadistas, et tulevased jututoa sõnumid on nähtavad kasutajale %2$s + Sina lahkusid jututoast + %1$s lahkus jututoast + Sina liitusid + %1$s liitus + Sina alustasid vestlust + %1$s alustas vestlust + Tühi jututuba (oli %s) + + %1$s, %2$s, %3$s ja %4$d muu + %1$s, %2$s, %3$s ja %4$d muud + + %1$s, %2$s, %3$s ja %4$s + %1$s, %2$s ja %3$s + 🎉 Kõikide serverite osalemine on keelatud! Seda jututuba ei saa enam kasutada. + Muudatusi ei ole. + • Nüüd on keelatud serverid, mille ip-aadress vastab mustrile. + • Nüüd on lubatud serverid, mille ip-aadress vastab mustrile. + • Server, mille nimes leidub %s, eemaldati lubatud serverite loendist. + • Nüüd on lubatud serverid, mille nimes leidub %s. + • Server, mille nimes leidub %s eemaldati keeluloendist. + • Keelatud on server, mille nimes leidub %s. + Sina muutsid selle jututoa jaoks serverite pääsuloendit. + %s muutis selle jututoa jaoks serverite pääsuloendit. + Sina kirjeldasid selle jututoa jaoks serverite pääsuloendi. + %s kirjeldas selle jututoa jaoks serverite pääsuloendi. + • Keelatud on serverid, mille ip-aadress vastab mustrile. + • Lubatud on serverid, mille ip-aadress vastab mustrile. + • Lubatud on serverid, mille nimes leidub %s. + • Keelatud on serverid, mille nimes leidub %s. + %1$s muutis selle jututoa aadresse. + Sa muutsid selle jututoa põhiaadressi ja täiendavaid aadresse. + %1$s muutis selle jututoa täiendavaid aadresse. + Sa muutsid selle jututoa täiendavaid aadresse. + %1$s muutis selle jututoa põhiaadressi ja täiendavaid aadresse. + + Sa eemaldasid selle jututoa täiendava aadressi %1$s. + Sa eemaldasid selle jututoa täiendavad aadressid %1$s. + + + %1$s eemaldas selle jututoa täiendava aadressi %2$s. + %1$s eemaldas selle jututoa täiendavad aadressid %2$s. + + + Sa lisasid sellele jututoale täiendava aadressi %1$s. + Sa lisasid sellele jututoale täiendavad aadressid %1$s. + + + %1$s lisas sellele jututoale täiendava aadressi %2$s. + %1$s lisas sellele jututoale täiendavad aadressid %2$s. + + Sa muutsid selle jututoa aadresse. + Sina muutsid videokoosolekut + Sina lõpetasid videokoosoleku + %1$s lõpetas videokoosoleku + Sina algatasid videokoosoleku + %1$s algatas videokoosoleku + %1$s muutis videokoosolekut Hele teema Tume teema - Must teema - Status.im teema + Must teema Käivitan teenuse Sünkroniseerin… Kuulan, kas leidub sündmusi @@ -117,7 +378,7 @@ Kasutajate kataloog Vaid need, kellel on Matrixi konto Vestlusi ei leidu - Sa pole Element\'ile andnud ligipääsu kohalikele kontaktidele + Sa pole ${app_name}\'ile andnud ligipääsu kohalikele kontaktidele Tulemusi ei ole Isikutuvastusserver ei ole seadistatud. Jututoad @@ -252,7 +513,7 @@ Kopeeri Õnnestus Teavitused - Kõne ebaõnnestus + Kõne ebaõnnestus Reaalajas ühenduse loomine ei õnnestunud. \nPalu oma koduserveri %@ haldajat, et ta seadistaks kõnede kindlamaks toimimiseks TURN serveri. Vali heliseade @@ -272,7 +533,7 @@ Küsi oma muudest sessioonidest krüptimisvõtmed uuesti. Võtmete jagamise päring on saadetud. Päring on saadetud - Palun käivita Element mõnes muus seadmes, mis suudab neid sõnumeid dekrüptoda ja seega saata krüptovõtmeid siia sessiooni. + Palun käivita ${app_name} mõnes muus seadmes, mis suudab neid sõnumeid dekrüptoda ja seega saata krüptovõtmeid siia sessiooni. Lugemisteatiste loend Gruppide loend @@ -293,7 +554,7 @@ Jututoa nimi Jututoa teema Kõned - Kasuta saabuvate kõnede jaoks Element\'i vaikimisi helinat + Kasuta saabuvate kõnede jaoks ${app_name}\'i vaikimisi helinat Kasuta kõnehõlbustusserverit Saabuva kõne helin Vali helin kõnede jaoks: @@ -315,18 +576,18 @@ Tee foto või video Video salvestamine ei õnnestu Lisateave õiguste kohta - Element vajab õigusi sinu foto- ja videokataloogide lugemiseks ning manuste salvestamiseks. + ${app_name} vajab õigusi sinu foto- ja videokataloogide lugemiseks ning manuste salvestamiseks. \n \nSelleks, et saaksid oma nutiseadmest faile saata palun anna järgmisel lehel vajalikud õigused. - Fotode ja videote salvestamiseks ning videokõnede tegemiseks vajab Element õigusi kasutada sinu kaamerat. + Fotode ja videote salvestamiseks ning videokõnede tegemiseks vajab ${app_name} õigusi kasutada sinu kaamerat. " \n \nKõnede tegemiseks palun anna järgmisel lehel vajalikud õigused." - Kõnede tegemiseks vajab Element õigusi kasutada sinu mikrofoni. + Kõnede tegemiseks vajab ${app_name} õigusi kasutada sinu mikrofoni. " \n \nKõnede tegemiseks palun anna järgmisel lehel vajalikud õigused." - Element vajab videokõnedeks õigusi sinu kaamera ja mikrofoni kasutamiseks. + ${app_name} vajab videokõnedeks õigusi sinu kaamera ja mikrofoni kasutamiseks. \n \nKõnede tegemiseks palun anna järgmisel lehel vajalikud õigused. Vabandust. Kuna vastavaid õigusi ei olnud, siis toimingut ei saanud teha @@ -542,7 +803,7 @@ Palun oota… Kõik kogukonnad Sellel jututoal puudub eelvaade - Element ei toeta veel kõigile nähtavate jututubade eelvaadet + ${app_name} ei toeta veel kõigile nähtavate jututubade eelvaadet Jututoad Isiklikud sõnumid Uus jututuba @@ -588,7 +849,7 @@ Logi sellest sessioonist välja Teave krüptograafia kohta puudub Kuna sina oled selle sessiooni verifitseerinud, siis see sessioon on krüptitud sõnumite saatmiseks usaldusväärne: - See isikutuvastusserver kasutab vana API\'t. Element toetab aga vaid API versiooni 2. + See isikutuvastusserver kasutab vana API\'t. ${app_name} toetab aga vaid API versiooni 2. See tegevus ei ole võimalik. Koduserveri versioon on liiga vana. %d jututuba @@ -625,7 +886,7 @@ Rakenduse teave Näita rakenduse teavet süsteemi seadistustes. Kinnitage oma salasõna - Seda tegevust ei saa teha Element\'i nutirakendusest + Seda tegevust ei saa teha ${app_name}\'i nutirakendusest Autentimine on nõutav Teavituste lisaseadistused Teavituse olulisus sündmuse alusel @@ -638,8 +899,8 @@ Võta kasutusele Sessiooni seadistused. Selles sessioonis on teavitused kasutusel. - Selles sessioonis ei ole teavitusi kasutusel. -\nSeda saad muuta Element\'i seadistuses. + Selles sessioonis ei ole teavitusi kasutusel. +\nSeda saad muuta ${app_name}\'i seadistuses. Võta kasutusele Kohandatud seadistused. Näita ajatempleid 12-tunnises vormingus @@ -747,7 +1008,6 @@ Aadress Tasuline Matrix\'i majutusteenus organisatsioonidele Sisesta Modular Element teenuse või muu serveri aadress, mida sa soovid kasutada - Sisesta serveri või Element\'i aadress, mida sa soovid kasutada Sisesta serveri aadress, mida sa soovid kasutada Lehe laadimisel tekkis viga %1$s (%2$d) See rakendus ei saa sisse logida antud koduserverisse. See koduserver toetab järgmisi sisselogimise tüüp(e): %1$s. @@ -966,7 +1226,7 @@ Palun kontrolli seadistusi Goolge Play teenuste kontrollimine Google Play Services APK on kättesaadav ja uuendatud. - Element kasutab Google Play teenuseid tõuketeavituste edastamiseks, kui see ei tundu olema korrektselt seadistatud: + ${app_name} kasutab Google Play teenuseid tõuketeavituste edastamiseks, kui see ei tundu olema korrektselt seadistatud: \n%1$s Paranda Google Play teenused Firebase tunnusluba @@ -974,12 +1234,12 @@ \n%1$s FCM tunnusloa laadimine ei õnnestunud: \n%1$s - [%1$s] -\nSee viga on väljaspool Element\'i kontrolli ning vastavalt Google infole liiga palju rakendusi kasutavad FCM\'i. Selline olukord peaks tekkima vaid siis kui kasutusel on hiidpalju selliseid rakendusi ning ei peaks mõjutama tavakasutajaid. - [%1$s] -\nSee viga on väljaspool Element\'i kontrolli ning võib juhtuda eri põhjustel. Võib-olla hilisemal proovimisel seda viga enam ei teki, kuid igaks juhuks vaata, et Google Play teenustele ei oleks süsteemi seadetes määratud andmesidepiirangut ning seadme kell on õige. Samuti võib see viga tekkida, kui sa pruugid kohandatud Androidi varianti (custom ROM). - [%1$s] -\nSee viga on väljaspool Element\'i kontrolli. Telefoni ei ole seadistatud Google\'i kontot. Palun ava seadistustes kontohaldur ning lisa üks Google\'i konto. + [%1$s] +\nSee viga on väljaspool ${app_name}\'i kontrolli ning vastavalt Google infole liiga palju rakendusi kasutavad FCM\'i. Selline olukord peaks tekkima vaid siis kui kasutusel on hiidpalju selliseid rakendusi ning ei peaks mõjutama tavakasutajaid. + [%1$s] +\nSee viga on väljaspool ${app_name}\'i kontrolli ning võib juhtuda eri põhjustel. Võib-olla hilisemal proovimisel seda viga enam ei teki, kuid igaks juhuks vaata, et Google Play teenustele ei oleks süsteemi seadetes määratud andmesidepiirangut ning seadme kell on õige. Samuti võib see viga tekkida, kui sa pruugid kohandatud Androidi varianti (custom ROM). + [%1$s] +\nSee viga on väljaspool ${app_name}\'i kontrolli. Telefoni ei ole seadistatud Google\'i kontot. Palun ava seadistustes kontohaldur ning lisa üks Google\'i konto. Lisa Google\'i konto Tunnusloa registreerimine FCM tunnusloa registreerimine koduserveris õnnestus. @@ -995,7 +1255,7 @@ Teenuse uuesti käivitamine ei õnnestunud Käivita teenus seadme käivitamisel Teenus käivitatakse nutiseadme käivitamisel. - Seda teenust ei käivitatata nutiseadme käivitamisel. Sa ei saa teavitusi enne, kui Element on vähemalt korra avatud. + Seda teenust ei käivitatata nutiseadme käivitamisel. Sa ei saa teavitusi enne, kui ${app_name} on vähemalt korra avatud. Käivita teenus nutiseadme käivitamisel Kontrolli taustapiiranguid @@ -1003,7 +1263,7 @@ %d jututuba - %1$s: %d sõnum + %1$s: %2$d sõnum %1$s: %2$d sõnumit @@ -1043,21 +1303,21 @@ Käivita kohandatud vaate asemel süsteemne kaamera vaade. Kasuta reavahetuse klahvi sõnumi saatmiseks Saada häälsõnumeid - Element saab kontrollida teie aadressiraamatut, et leida teisi Matrixi kasutajaid nende e-posti aadressi ja telefoninumbrite põhjal. Kui sa nõustud oma aadressiraamatut sel eesmärgil jagama, luba juurdepääs järgmisel hüpikaknal. - Element saab kontrollida teie aadressiraamatut, et leida teisi Matrixi kasutajaid nende e-posti aadresside ja telefoninumbrite põhjal. + ${app_name} saab kontrollida teie aadressiraamatut, et leida teisi Matrixi kasutajaid nende e-posti aadressi ja telefoninumbrite põhjal. Kui sa nõustud oma aadressiraamatut sel eesmärgil jagama, luba juurdepääs järgmisel hüpikaknal. + ${app_name} saab kontrollida teie aadressiraamatut, et leida teisi Matrixi kasutajaid nende e-posti aadresside ja telefoninumbrite põhjal. \n \nKas sa oled nõus oma aadressiraamatut sel eesmärgil jagama\? Kas sa soovid peita selle kasutaja kõik sõnumid\? \n \nPane tähele, et antud toiming taaskäivitab rakenduse ja see võib võtta veidi aega. - Taustapiirangud on Elemendi jaoks keelatud. Seda testi tuleks läbi viia mobiilse andmeside abil (WIFI puudub). + Taustapiirangud on Elemendi jaoks keelatud. Seda testi tuleks läbi viia mobiilse andmeside abil (WIFI puudub). \n%1$s - Elemendi jaoks on taustpiirangud lubatud. + Elemendi jaoks on taustpiirangud lubatud. \nTöö, mida rakendus proovib teha, on agressiivselt piiratud, kui see on taustal ja see võib mõjutada teavituste kättesaamist. \n%1$s Keela piirangud Aku optimeerimine - Aku optimeerimine ei mõjuta Elementi. + Aku optimeerimine ei mõjuta ${app_name}. Kui kasutaja jätab seadme mõneks ajaks vooluvõrgust välja ja ühele kohale paigale ning ekraan on välja lülitatud, lülitub seade Doze režiimi. See takistab rakendustel juurdepääsu võrgule ja lükkab edasi nende töö, sünkroonimise ja tavalised teated. Eira optimeerimist Tavaline @@ -1087,11 +1347,11 @@ Andmete sünkroniseerimine taustal Andmete taustal sünkroniseerimise režiim Optimeeritud akukestust silmas pidades - Element sünkroniseerib taustal nii, et see arvestab seadme piiratud ressursse (aku). + ${app_name} sünkroniseerib taustal nii, et see arvestab seadme piiratud ressursse (aku). \nSõltuvalt seadme olekust võib operatsioonisüsteem sünkroniseerimist edasi lükata. Optimeeritud reaalajas - Element sünkroniseerib sõnumeid taustal etteantud aja järel (aeg on seadistatav). -\nSee mõjutab seadme saatjat/vastuvõtjat ja akukasutust ning kuvatakse püsiteade, et Element kuulab sündmusi. + ${app_name} sünkroniseerib sõnumeid taustal etteantud aja järel (aeg on seadistatav). +\nSee mõjutab seadme saatjat/vastuvõtjat ja akukasutust ning kuvatakse püsiteade, et ${app_name} kuulab sündmusi. Taustasünkroonimine puudub Kui rakendus töötab taustal, siis sa ei saa saabunud sõnumite kohta teavitusi. Seadistuste uuendamine ei õnnestunud. @@ -1158,17 +1418,17 @@ Leia kasutajaid Halda kasutajate otsingu seadistusi. Teavituste privaatsus - Element võib taustal töötamise ajal hallata sinu teavitusi turvaliselt ja privaatselt. Aga see võib mõjutada akukasutust. + ${app_name} võib taustal töötamise ajal hallata sinu teavitusi turvaliselt ja privaatselt. Aga see võib mõjutada akukasutust. Anna õigused Tee muu valik Taustaühendus - Selleks et teavitused toimiksid korralikult peab Element kasutama vähese kõrvalmõjuga taustaühendust. -\nKui järgmisel lehel sinult küsitakse kas lubada, et Element töötab kogu aeg taustal, siis palun nõustu. + Selleks et teavitused toimiksid korralikult peab ${app_name} kasutama vähese kõrvalmõjuga taustaühendust. +\nKui järgmisel lehel sinult küsitakse kas lubada, et ${app_name} töötab kogu aeg taustal, siis palun nõustu. Anna õigused Analüütika Saada arendajatele analüütikat - Võimaldamaks meil rakendust parandada kogub Element anonüümset teavet rakenduse kasutuse kohta. - Selleks, et saaksime Element\'i paremaks teha, palun luba analüütika. + Võimaldamaks meil rakendust parandada kogub ${app_name} anonüümset teavet rakenduse kasutuse kohta. + Selleks, et saaksime ${app_name}\'i paremaks teha, palun luba analüütika. Jah, ma soovin aidata! Võrguliikluse mahu säästmise režiim Võrguliikluse andmemahu säästmiseks kasutatakse filtrit, mille puhul kasutajate olekuid ei uuendata ja sõnumite kirjutamise teavitusi ei laeta. @@ -1264,7 +1524,7 @@ %d lugemata teavitatud sõnum - %s lugemata teavitatud sõnumit + %d lugemata teavitatud sõnumit Selle valiku kasutamine eeldab kolmanda osapoole rakendust sõnumite salvestamiseks. Jätkamaks pead nõustuma kasutustingimustega. @@ -1382,7 +1642,7 @@ Paroolifraasid ei klappi mitte Palun sisesta paroolifraas Paroolifraas on liiga nõrk - Kui sa soovid, et Element looks taastevõtme, siis palun kustuta paroolifraas. + Kui sa soovid, et ${app_name} looks taastevõtme, siis palun kustuta paroolifraas. Matrix\'i sessioone ei leidu Ära kunagi kaota krüptitud sõnumeid Sõnumid krüptitud jututubades kasutavad läbivat krüptimist. Ainult sinul ja saaja(te)l on võtmed selliste sõnumite lugemiseks. @@ -1467,7 +1727,7 @@ Allkiri Vigane vastus koduserveri tuvastamise päringule Serveriseadistuste automaatne sõnalõpetus - Element tuvastas kohandatud serveriseadistused sinu kasutajanime domeenis „%1$s“: + ${app_name} tuvastas kohandatud serveriseadistused sinu kasutajanime domeenis „%1$s“: \n%2$s Kasuta seadistusi Oled kehtetu või aegunud kasutajanime või salasõna tõttu välja logitud. @@ -1639,7 +1899,7 @@ Muud sessioonid Kuvan vaid esimesi tulemusi, kirjuta natuke pikemalt… Kiire lõppmäng - Teadmata vigade puhul võib Element sagedamini kokku joosta + Teadmata vigade puhul võib ${app_name} sagedamini kokku joosta Lisa ¯\\_(ツ)_/¯ smaili vormindamata teksti algusesse Võta jututoas krüptimine kasutusele Kui krüptimine on juba kasutusele võetud, siis ei saa seda enam eemaldada. @@ -1715,7 +1975,7 @@ Kas katkestame ühenduse isikutuvastusserveriga %s\? Palun esmalt seadista isikutuvastusserver. Palun esmalt nõustu seadistustes isikutuvastusserveri kasutustingimustega. - Sinu privaatsuse nimel saadab Element e-posti aadressid ja telefoninumbrid serverisse vaid räsituna. + Sinu privaatsuse nimel saadab ${app_name} e-posti aadressid ja telefoninumbrid serverisse vaid räsituna. Seoste loomine ei õnnestunud. Selle tunnusega ei ole hetkel ühtegi seost. Sinu koduserver (%1$s) soovitab kasutada sinu isikutuvastusserverina %2$s teenust @@ -1757,11 +2017,10 @@ Sa ei saa seda sõnumit lugeda, kuna saatja ei usalda sinu sessiooni Sa ei saa seda sõnumit lugeda, kuna saatja teadlikult ei saatnud vajalikke võtmeid Ootan krüptimise ajalugu - Riot\'i uus nimi on Element! - Meil on hea meel teatada, et oleme muutnud nime! Sinu rakendus on uuendatud ning sa oled oma kontole sisse logitud. - Selge lugu - Vaata lisateavet - element + Riot\'i uus nimi on Element! + Meil on hea meel teatada, et oleme muutnud nime! Sinu rakendus on uuendatud ning sa oled oma kontole sisse logitud. + Selge lugu + Vaata lisateavet Salvesta taastevõti järgnevalt Lisa telefoniraamatust Sinu telefoniraamat on tühi @@ -1886,7 +2145,7 @@ Haldaja sai nüüd teate, et see sisu ei ole sobilik. \n \nKui sa ei soovi enam näha selle kasutaja sisu, siis sa võid tema sõnumite peitmiseks kasutajat eirata. - Läbiva krüptograafia jaoks vajalike võtmete salvestamiseks kohalikule andmekandjale vaajab Element sinu luba. + Läbiva krüptograafia jaoks vajalike võtmete salvestamiseks kohalikule andmekandjale vaajab ${app_name} sinu luba. \n \nSelleks et saaksid võtmed käsitsi eksportida, siis palun anna selleks järgmises vaates luba. Hetkel puudub võrguühendus @@ -1923,7 +2182,7 @@ \n• Sinu koduserveri haldaja on turvakaalutlustel keelanud sinu ligipääsu. Logi uuesti sisse Sa oled loginud välja - Praegune sessioon kuulub kasutajale %1$s, kuid sina üritad siseneda kasutaajaga %2$s. Sellist võimalust Element hetkel ei toeta. + Praegune sessioon kuulub kasutajale %1$s, kuid sina üritad siseneda kasutaajaga %2$s. Sellist võimalust ${app_name} hetkel ei toeta. \nPalun eemalda kõik andmed ning siis logi sisse muu kontoga. Mõni järgnevatest võib olla sattunud valedesse kätesse: \n @@ -1962,9 +2221,9 @@ Vaikimisi õigused jututoas %1$s Kohandatud õigused (%1$d) jututoas %2$s Hüppa lugemisteatise juurde - Element ei oska käsitleda %1$s-tüüpi sündmusi - Element ei oska käsitleda %1$s-tüüpi sünumeid - Tekkis viga, kui Element üritas töödelda sõnumi %1$s sisu + ${app_name} ei oska käsitleda %1$s-tüüpi sündmusi + ${app_name} ei oska käsitleda %1$s-tüüpi sünumeid + Tekkis viga, kui ${app_name} üritas töödelda sõnumi %1$s sisu Võta vastu Keeldu Lõpeta kõne @@ -2013,7 +2272,7 @@ Kasutaja kustutas sündmuse, põhjusena %1$s Jututoa haldur on sündmust modereerinud, põhjusena %1$s Krüptovõtmed on juba uuendatud! - Element Android + ${app_name} Android Päringud võtmete laadimiseks Võta krüptitud sõnumite ajalugu lukust lahti Värskenda @@ -2071,13 +2330,13 @@ Meediafaili galeriisse lisamine ei õnnestunud Meediafaili salvestamine ei õnnestunud Määra kontole uus salasõna… - Kasuta kõige uuemat Element\'i versioon mõnes muus seadmes, nagu näiteks Element Web, Element Desktop, Element iOS, Element Android. Samuti sobib mõni muu Matrix\'i klient, mis oskab risttunnustamist - Element Web -\nElement Desktop - Element iOS -\nElement Android + Kasuta kõige uuemat ${app_name}\'i versioon mõnes muus seadmes, nagu näiteks ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} Android. Samuti sobib mõni muu Matrix\'i klient, mis oskab risttunnustamist + ${app_name} Web +\n${app_name} Desktop + ${app_name} iOS +\n${app_name} Android või mõnda teist Matrix\'i klienti, mis oskab risttunnustamist - Kasuta oma muus seadmes kõige uuemat Element\'i versiooni: + Kasuta oma muus seadmes kõige uuemat ${app_name}\'i versiooni: Sunnib loobuma praeguse krüptitud jututoa rühmavestluse seansist Funktsionaalsus on toetatud ainult krüptitud jututubades Jätkamiseks kasuta kas oma %1$s või %2$s. @@ -2102,7 +2361,6 @@ \n \nParima turvalisuse nimel kohtuge silmast silma. Kinnita oma isikusamasust verifitseerides seda sisselogimissessiooni. Sellega tagad ligipääsu krüptitud sõnumitele. - Vabandust, selline tegevus pole veel võimalik kasutajakontode puhul, kus kasutatakse ühekordset sisselogimist. Ei ole võimalik avada sellise jututoa vaadet, kus sulle on seatud suhtluskeeld. Ei leia sellist jututuba. Palun kontrolli, et ta ikka olemas on. @@ -2120,13 +2378,13 @@ Kas kustutame %1$s tüüpi kasutajakonto andmed\? \n \nKuna nii mõndagi ootamatut võib juhtuda, siis kasuta seda võimalust mõningase ettevaatusega. - PIN-kood on nõutav alati, kui sa Element\'i avad. - PIN-kood on nõutav, kui sa kahe minuti jooksul pole Element\'i kasutanud. + PIN-kood on nõutav alati, kui sa ${app_name}\'i avad. + PIN-kood on nõutav, kui sa kahe minuti jooksul pole ${app_name}\'i kasutanud. Kahe minuti möödumisel küsi uuesti PIN-koodi Näita vaid napi teavitusena lugemata sõnumite arvu. Näita täpsemat teavet nagu jututoa nimi ja sõnumi sisu. Näita teavitustes sisu - PIN-kood on ainus võimalus, kuidas sa saad Element\'i lukust lahti. + PIN-kood on ainus võimalus, kuidas sa saad ${app_name}\'i lukust lahti. Kasuta selles seadmes leiduvaid biomeetrilise tuvastuse võimalusi nagu sõrmejälgede lugejat või näotuvastust. Kasuta biomeetrilist tuvastust Seadista @@ -2191,8 +2449,8 @@ Kas selleks, et leida tuttavaid, oled sa nõus saatma oma kontaktteavet (telefoninumbreid ja/või e-posti aadresse) siin rakenduses seadistatud isikutuvastusserverile (%1$s)\? \n \nParema turvalisuse nimel me ei saada teavet mitte loetava tekstina, vaid räsina. - 🔐️ Liitu minuga vestlusrakenduses Element - Hei, palun suhtle minuga vestlusrakenduses Element: %s + 🔐️ Liitu minuga vestlusrakenduses ${app_name} + Hei, palun suhtle minuga vestlusrakenduses ${app_name}: %s Kutsu sõpru Lisa inimesi "Teema: " @@ -2316,7 +2574,7 @@ See ei ole avalik jututuba. Ilma kutseta sa ei saa uuesti liituda. Süsteemi vaikeseadistused Autentimine ei õnnestunud - Selle tegevuse jaoks palub Element sul sisestada oma kasutajanime ja salasõna. + Selle tegevuse jaoks palub ${app_name} sul sisestada oma kasutajanime ja salasõna. Palun korda autentimist Risttunnustamise alustamine ei õnnestunud Volitused puuduvad, kasutajakonto ja/või salasõna on valed @@ -2348,4 +2606,59 @@ Pane ootele Jätka Pöördu tagasi + Sündmuse sisu + Olekusündmus on saadetud! + Sündmus on saadetud! + Vigaselt vormistatud sündmus + Sõnumi tüüp puudub + Sisu puudub + Sündmuse sisu + Oleku võti + Tüüp + Saada kohandatud olekusündmus + Muuda sisu + Olekusündmused + Saada olekusündmus + Saada kohandatud sündmus + Uuri jututoa olekut + Arendaja töövahendid + Vaata lugemisteatiseid + Ära teavita + Teavita helita + Teavita heliga + Vea tõttu on sõnum saatmata + Kontrollitud + Sulge emojivalija + Ava emojivalija + Tugev usaldusmäär + Hoiatav usaldusmäär + Vaikmisi usaldusmäär + Valitud + Video + Selles jututoas on ärasaatmata sõnumimustand + Mõned sõnumid on saatmata + Kustuta tunnuspilt + Muuda tunnuspilti + Pilt + Impordi krüptovõti failist + Ava vidinad + Ekraanitõmmis + + %d kirje + %d kirjet + + Üleslaadimispiirang on teadmata. + Sinu koduserver võimaldab kuni suurusega %s failide (meedia, dokumendid, jne) üleslaadimist. + Serveris seadistatud failide üleslaadimise piirang + Serveri versioon + Serveri nimi + Jututoa seadistused + Kas soovid lahkuda praegusest rühmakõnest ja liituda uuega\? + Jututoa versioon + Uus väärtus + Vaheta + Esmane sünkroniseerimine: +\nLaadin andmed alla… + Esmane sünkroniseerimine: +\nOotan serveri vastust… \ No newline at end of file diff --git a/vector/src/main/res/values-eu/strings.xml b/vector/src/main/res/values-eu/strings.xml index cf14fee03f..8963d3e40c 100644 --- a/vector/src/main/res/values-eu/strings.xml +++ b/vector/src/main/res/values-eu/strings.xml @@ -1,6 +1,140 @@ + %1$s: %2$s + %1$s erabiltzaileak irudi bat bidali du. + %s erabiltzailearen gonbidapena + %1$s erabiltzaileak %2$s gonbidatu du + %1$s erabiltzaileak gonbidatu zaitu + %1$s gelara elkartu da + %1$s gelatik atera da + %1$s erabiltzaileak gonbidapena baztertu du + %1$s erabiltzaileak %2$s kanporatu du + %1$s erabiltzaileak debekua kendu dio %2$s erabiltzaileari + %1$s erabiltzaileak %2$s debekatu du + %1$s erabiltzaileak %2$s erabiltzailearen gonbidapena atzera bota du + %1$s erabiltzaileak abatarra aldatu du + %1$s erabiltzaileak bere pantaila-izena aldatu du beste honetara: %2$s + %1$s erabiltzaileak bere pantaila-izena aldatu du, honetatik: %2$s honetara: %3$s + %1$s erabiltzaileak bere pantaila-izena kendu du (%2$s) + %1$s erabiltzaileak mintzagaia honetara aldatu du: %2$s + %1$s erabiltzaileak gelaren izena honetara aldatu du: %2$s + %s erabiltzaileak bideo deia hasi du. + %s erabiltzaileak ahots deia hasi du. + %s erabiltzaileak deia erantzun du. + %s erabiltzaileak deia amaitu du. + %1$s erabiltzaileak gelaren historiala ikusgai jarri du hauentzat: %2$s + gelako kide guztiak, gonbidatu zitzaienetik. + gelako kide guztiak, elkartu zirenetik. + gelako kide guztiak. + edonor. + ezezaguna (%s). + %1$s erabiltzaileak muturretik muturrera zifratzea aktibatu du (%2$s) + + %1$s erabiltzaileak VoIP konferentzia bat eskatu du + VoIP konferentzia hasita + VoIP konferentzia amaituta + + (abatarra ere aldatu da) + %1$s erabiltzaileak gelaren izena kendu du + %1$s erabiltzaileak gelaren mintzagaia kendu du + %1$s erabiltzaileak bere profila eguneratu du %2$s + %1$s erabiltzaileak gelara elkartzeko gonbidapen bat bidali dio %2$s erabiltzaileari + %1$s erabiltzaileak %2$s gelarako gonbidapena onartu du + + ** Ezin izan da deszifratu: %s ** + Igorlearen gailuak ez dizkigu mezu honetarako gakoak bidali. + + Ezin izan da kendu + Ezin izan da mezua bidali + + Huts egin du irudia igotzean + + Sare errorea + Matrix errorea + + Ezin da oraingoz hutsik dagoen gela batetara berriro sartu. + + E-mail helbidea + Telefono zenbakia + + %1$s erabiltzaileak eranskailu bat bidali du. + + %s gelarako gonbidapena + Gela gonbidapena + %1$s eta %2$s + Gela hutsa + + + %1$s eta beste bat + %1$s eta beste %2$d + + + + Mezua kendu da + %1$s erabiltzaileak mezua kendu du + Mezua kendu da [arrazoia: %1$s] + %1$s erabiltzaileak mezua kendu du [arrazoia: %2$s] + + Hasierako sinkronizazioa: +\nKontua inportatzen… + Hasierako sinkronizazioa: +\nZifratzea inportatzen + Hasierako sinkronizazioa: +\nGelak inportatzen + Hasierako sinkronizazioa: +\nElkartutako gelak inportatzen + Hasierako sinkronizazioa: +\nGonbidatutako gelak inportatzen + Hasierako sinkronizazioa: +\nUtzitako gelak inportatzen + Hasierako sinkronizazioa: +\nKomunitateak inportatzen + Hasierako sinkronizazioa: +\nKontuaren datuak inportatzen + + %s erabiltzaileak gela hau eguneratu du. + + Mezua bidaltzen… + Garbitu bidalketa-ilara + + %1$s erabiltzaileak %2$s gelara elkartzeko gonbidapena indargabetu du + %1$s erabiltzailearen gonbidapena. Arrazoia: %2$s + %1$s erabiltzaileak %2$s gonbidatu du. Arrazoia: %3$s + %1$s erabiltzaileak gonbidatu zaitu. Arrazoia: %2$s + %1$s gelara elkartu da. Arrazoia: %2$s + %1$s gelatik atera da. Arrazoia: %2$s + %1$s erabiltzaileak gonbidapena baztertu du. Arrazoia: %2$s + %1$s erabiltzaileak %2$s kanporatu du. Arrazoia: %3$s + %1$s erabiltzaileak debekua kendu dio %2$s erabiltzaileari. Arrazoia: %3$s + %1$s erabiltzaileak %2$s debekatu du. Arrazoia: %3$s + "%1$s erabiltzaileak gelara elkartzeko gonbidapen bat bidali dio %2$s erabiltzaileari. Arrazoia: %3$s" + "%1$s erabiltzaileak %2$s gelara elkartzeko gonbidapena indargabetu du. Arrazoia: %3$s" + "%1$s erabiltzaileak %2$s gelarako gonbidapena onartu du. Arrazoia: %3$s" + "%1$s erabiltzaileak %2$s erabiltzailearen gonbidapena indargabetu du. Arrazoia: %3$s" + + + %1$s erabiltzaileak %2$s gehitu du gela honen helbide gisa. + %1$s erabiltzaileak %2$s gehitu ditu gela honen helbide gisa. + + + + %1$s erabiltzaileak %2$s kendu du gela honen helbide gisa. + %1$s erabiltzaileak %3$s kendu ditu gela honen helbide gisa. + + + %1$s erabiltzaileak %2$s gehitu %3$s eta kendu ditu gela honen helbide gisa. + + %1$s erabiltzaileak %2$s ezarri du gela honen helbide nagusi gisa. + %1$s erabiltzaileak gela honen helbide nagusia kendu du. + + %1$k gonbidatuak gelara sartzea onartu du. + %1%k gonbidatuak gelara sartzea galerazi du. + + %1$s erabiltzaileak muturretik muturrerako zifratzea gaitu du. + %1$s erabiltzaileak muturretik muturrerako zifratzea gaitu du. (%2$s algoritmo ezezaguna). + + %1$s erabiltzaileak gela sortu du Mezuak Gela Ezarpenak @@ -71,7 +205,7 @@ Gailuko helbide liburua Matrixeko kontaktuak besterik ez Elkarrizketarik ez - Ez diozu baimena eman Element aplikazioari zure gailuko kontaktuak atzitzeko + Ez diozu baimena eman Element aplikazioari zure gailuko kontaktuak atzitzeko Emaitzarik ez Gelak @@ -215,15 +349,15 @@ E-mail helbide bat gehitu dezakezu zure profilaren ezarpenetan. Ezin izan da bideoa grabatu Informazioa - Elementek zure kamera atzitzeko baimena behar du argazkiak eta bideoak atera ahal izateko. + Elementek zure kamera atzitzeko baimena behar du argazkiak eta bideoak atera ahal izateko. Baimendu sarbidea hurrengo laster-leihoan deia egin ahal izateko. - Elementek zure mikrofonoa atzitzeko baimena behar du ahots deiak egin ahal izateko. + Elementek zure mikrofonoa atzitzeko baimena behar du ahots deiak egin ahal izateko. Baimendu sarbidea hurrengo laster-leihoan deia egin ahal izateko. - Elementek zure kamera eta mikrofonoa atzitzeko baimenak behar ditu bideo deiak egin ahal izateko. + Elementek zure kamera eta mikrofonoa atzitzeko baimenak behar ditu bideo deiak egin ahal izateko. Baimendu sarbidea hurrengo laster-leihoan deia egin ahal izateko. Ez da ekintza burutu baimenak falta direlako @@ -243,11 +377,11 @@ Baimendu sarbidea hurrengo laster-leihoan deia egin ahal izateko. %s erabiltzaileak gela honetara elkartzera gonbidatu zaitu - Elementek zure argazki eta bideoen liburutegia atzitzeko baimena behar du eranskinak gorde ahal izateko. + ${app_name}ek zure argazki eta bideoen liburutegia atzitzeko baimena behar du eranskinak gorde ahal izateko. Baimendu sarbidea hurrengo laster-leihoan zure telefonotik fitxategiak bidali ahal izateko. - Element-ek zure helbide-liburua egiaztatu dezake Matrix erabiltzaileak bere e-mail helbide edo telefono zenbakiaren bidez aurkitzeko. Honetarako zure helbide-liburua partekatzea onartzen baduzu, sakatu onartu hurrengo laster-leihoan. - Element-ek zure helbide-liburua egiaztatu dezake Matrix erabiltzaileak bere e-mail helbide edo telefono zenbakiaren bidez aurkitzeko. + ${app_name}-ek zure helbide-liburua egiaztatu dezake Matrix erabiltzaileak bere e-mail helbide edo telefono zenbakiaren bidez aurkitzeko. Honetarako zure helbide-liburua partekatzea onartzen baduzu, sakatu onartu hurrengo laster-leihoan. + ${app_name}-ek zure helbide-liburua egiaztatu dezake Matrix erabiltzaileak bere e-mail helbide edo telefono zenbakiaren bidez aurkitzeko. \n \nHonetarako zure helbide-liburua partekatzea onartzen duzu\? @@ -637,7 +771,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Erraldoia Azal argia Azal iluna - Azal beltza + Azal beltza Sinkronizatzen… Entzun gertaerak @@ -828,7 +962,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. • Jakinarazpenek ez dute mezuaren edukia erakutsiko Jakinarazpenen pribatutasuna - Element bigarren planoan aritu daiteke zure jakinarazpenak modu seguru eta pribatuan kudeatzeko. Honek baterian eragina izan lezake. + ${app_name} bigarren planoan aritu daiteke zure jakinarazpenak modu seguru eta pribatuan kudeatzeko. Honek baterian eragina izan lezake. Eman baimena Aukeratu beste zerbait @@ -843,8 +977,8 @@ Baten bat gehitu orain? Desaktibatu nire kontua Bidali analitiketarako datuak - Elementek analitika anonimoak biltzen ditu aplikazioa hobetzeko. - Gaitu analitikak Element hobetzera laguntzeko. + ${app_name}ek analitika anonimoak biltzen ditu aplikazioa hobetzeko. + Gaitu analitikak ${app_name} hobetzera laguntzeko. Bai, lagundu nahi dut! Behar den parametro bat falta da. @@ -872,7 +1006,7 @@ Matrix-eko mezuen ikusgaitasuna e-mail sistemaren antekoa da. Guk zure mezuak ah Gako eskaria bidalita. Eskaria bidalita - Abiatu Element beste mezua deszifratu dezakeen gailu batean, saio honetara gakoak bidali ditzan. + Abiatu ${app_name} beste mezua deszifratu dezakeen gailu batean, saio honetara gakoak bidali ditzan. Idatzi hemen… @@ -974,8 +1108,6 @@ Matrix-eko mezuen ikusgaitasuna e-mail sistemaren antekoa da. Guk zure mezuak ah Errore bat gertatu da - Status.im azala - %s bertsioa Sortu esportatutako gakoak zifratzeko pasaesaldi bat. Pasaesaldi hori gakoak inportatzeko sartu beharko duzu. Sortu pasaesaldia @@ -995,7 +1127,7 @@ Matrix-eko mezuen ikusgaitasuna e-mail sistemaren antekoa da. Guk zure mezuak ah Deitu hala ere Deiak - Erabili Elementen lehenetsitako dei-doinua jasotako deientzat + Erabili ${app_name}en lehenetsitako dei-doinua jasotako deientzat Jasotako deien doinua Hautatu deientzako doinua: @@ -1047,12 +1179,12 @@ Egiaztatu zure kontuaren ezarpenak. SAioaren ezarpenak. Jakinarazpenak aktibatuta daude saio honentzat. - Jakinarazpenak ez daude aktibatuta saio honentzat. Egiaztatu Element ezarpenak. + Jakinarazpenak ez daude aktibatuta saio honentzat. Egiaztatu ${app_name} ezarpenak. Aktibatu Play Services egiaztaketa Google Play Services APK eskuragarri eta egunean dago. - Element-ek Google Play Services erabiltzen du baina antza ez dago ondo konfiguratuta: + ${app_name}-ek Google Play Services erabiltzen du baina antza ez dago ondo konfiguratuta: %1$s Konpondu Play Services @@ -1079,19 +1211,19 @@ Berrabiarazi aplikazioa. Hasi abioan Zerbitzua gailua berrabiaraztean hasiko da. - Zerbitzua ez da hasiko gailua berrabiaraztean, ez duzu jakinarazpenik jasoko Element behin ireki arte. + Zerbitzua ez da hasiko gailua berrabiaraztean, ez duzu jakinarazpenik jasoko ${app_name} behin ireki arte. Gaitu abioan hastea Egiaztatu bigarren planoko murrizketak - Bigarren planoko murrizketak desaktibatuta daude Element-entzat. Proba hau datu mugikorrekin egin behar da (Ez WiFi). + Bigarren planoko murrizketak desaktibatuta daude ${app_name}-entzat. Proba hau datu mugikorrekin egin behar da (Ez WiFi). %1$s - Bigarren planoko murrizketak aktibatuta daude Element-entzat. + Bigarren planoko murrizketak aktibatuta daude ${app_name}-entzat. Aplikazioa egiten saiatzen ari dena agresiboki murriztuko zaio bigarren planoan dagoenean, eta honek jakinarazpenetan eragina izan dezake. %1$s Desaktibatu murrizketak Bateria optimizazioa - Bateria optimizazioak ez du eraginik Element-engan. + Bateria optimizazioak ez du eraginik ${app_name}-engan. Ezikusi optimizazioa Bigaren planoko konexioa @@ -1105,8 +1237,8 @@ Aplikazioa egiten saiatzen ari dena agresiboki murriztuko zaio bigarren planoan Ez da baliozko Google Play Services APK-rik aurkitu. Jakinarazpenak agian ez dira ongi ibiliko. Erabiltzaile batek gailu bat deskonektatuta eta erabili gabe uzten badu denbora batez, pantaila itzalita duela, gailua kuluxka moduan sartzen da. Honek aplikazioak sarera konektatzea eragozten du eta beraien lanak atzeratzen ditu, baita ohiko alarmak. - Element-ek bigarren planoko konexio arin bat behar du jakinarazpen fidagarriak izateko. -Hurrengo pantailan Element-i bigarren planoan aritzeko baimena eskatuko zaizu, onartu ezazu mesedez. + ${app_name}-ek bigarren planoko konexio arin bat behar du jakinarazpen fidagarriak izateko. +Hurrengo pantailan ${app_name}-i bigarren planoan aritzeko baimena eskatuko zaizu, onartu ezazu mesedez. Bide-deia abioan… @@ -1138,7 +1270,7 @@ Hurrengo pantailan Element-i bigarren planoan aritzeko baimena eskatuko zaizu, o Idatzi pasaesaldia Pasaesaldia ahulegia da - Ezabatu pasaesaldia Element aplikazioak berreskuratze gako bat sortu dezan nahi baduzu. + Ezabatu pasaesaldia ${app_name} aplikazioak berreskuratze gako bat sortu dezan nahi baduzu. Ez dago Matrix saiorik eskuragarri Ez galdu inoiz zifratutako mezuak @@ -1178,12 +1310,12 @@ Hurrengo pantailan Element-i bigarren planoan aritzeko baimena eskatuko zaizu, o Kontuan izan mezu mota batzuk isilak izateko ezarri direla (soinurik gabeko jakinarazpena sortuko dute). Jakinarazpen batzuk desgaituta daude zure ezarpen pertsonaletan. Hutsegitea arau pertsonalak kargatzean, saiatu berriro. - [%1$s] -Errore hau Element-en kontroletik kanpo dago eta Google-en arabera, errore honek esan nahi du gailuko aplikazio gehiegik erabiltzen dutela FCM. Errore hau ezohiko aplikazio kopuru bat dagoenean gertatzen da, ez lioke erabiltzaile arrunt bati eragingo. - "[%1$s] -Errore hau Element-en kontroletik kanpo dago. Hainbat arrazoiengatik gerta daiteke eta geroago berriro saiatzen bazara agian badabil, egiaztatu ere Google Play Service-ek ez duela datuen erabilera mugatua sistemaren ezarpenetan, edo zure gailuaren ordua ondo ezarrita dagoela, ROM pertsonalizatuekin gertatu daiteke ere." - [%1$s] -Errore hau Element-en kontroletik kanpo dago. Ez dago Google konturik gailuan. Ireki kontuen kudeatzailea eta gehitu Google kontu bat. + [%1$s] +Errore hau ${app_name}-en kontroletik kanpo dago eta Google-en arabera, errore honek esan nahi du gailuko aplikazio gehiegik erabiltzen dutela FCM. Errore hau ezohiko aplikazio kopuru bat dagoenean gertatzen da, ez lioke erabiltzaile arrunt bati eragingo. + "[%1$s] +Errore hau ${app_name}-en kontroletik kanpo dago. Hainbat arrazoiengatik gerta daiteke eta geroago berriro saiatzen bazara agian badabil, egiaztatu ere Google Play Service-ek ez duela datuen erabilera mugatua sistemaren ezarpenetan, edo zure gailuaren ordua ondo ezarrita dagoela, ROM pertsonalizatuekin gertatu daiteke ere." + [%1$s] +Errore hau ${app_name}-en kontroletik kanpo dago. Ez dago Google konturik gailuan. Ireki kontuen kudeatzailea eta gehitu Google kontu bat. Zifratutako geletako mezuak muturretik muturrera zifratuta daude. Hartzaileak/ek eta zuk eta ez beste inork irakurri ditzakezue mezuok. \n \nEgin zure gakoen babes-kopia segurua mezuak ez galtzeko. @@ -1316,7 +1448,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Baliogabeko hasiera-zerbitzari deskubritze erantzuna Automatikoki osatu zerbitzariaren aukerak - "Element-ek pertsonalizatutako zerbitzari konfigurazio bat antzeman du zure erabiltzaile id-arentzat \"%1$s\" domeinuan: + "${app_name}-ek pertsonalizatutako zerbitzari konfigurazio bat antzeman du zure erabiltzaile id-arentzat \"%1$s\" domeinuan: \n%2$s" Erabili konfigurazioa @@ -1448,7 +1580,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Komunitate guztiak Gela hau ezin da aurreikusi - Munduak irakurtzeko moduko gelaren aurrebista ez da oraindik onartzen Element bezeroan + Munduak irakurtzeko moduko gelaren aurrebista ez da oraindik onartzen ${app_name} bezeroan Gelak Mezu zuzenak @@ -1568,11 +1700,11 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Gehitu identitate-zerbitzari bat zure ezarpenetan ekintza hau burutzeko. Bigarren planoko sinkronizazio modua (Esperimentala) Bateria erabilerarako optimizatua - Element bigarren planoan sinkronizatuko da gailuaren baliabide mugatuen erabilera ahal beste murriztuz (bateria). + ${app_name} bigarren planoan sinkronizatuko da gailuaren baliabide mugatuen erabilera ahal beste murriztuz (bateria). \nZure gailuaren baliabideen egoeraren arabera, sistema eragileak sinkronizazioa atzeratu dezake. Denbora errealerako optimizatua - Element bigarren planoan sinkronizatuko da maiztasun finkoarekin (konfiguragarria). -\nHonek irrati eta bateriaren erabileran eragina izango du, eta Element gertaerei adi dagoela dion jakinarazpen bat bistaratuko da etengabe. + ${app_name} bigarren planoan sinkronizatuko da maiztasun finkoarekin (konfiguragarria). +\nHonek irrati eta bateriaren erabileran eragina izango du, eta ${app_name} gertaerei adi dagoela dion jakinarazpen bat bistaratuko da etengabe. Ez sinkronizatu bigarren planoan Ez zaizu jasotako mezuei buruz jakinaraziko aplikazioa bigarren planoan dagoenean. Huts egin du ezarpenak eguneratzean. @@ -1684,14 +1816,14 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. \n \nEz baduzu erabiltzaile honen eduki gehiago ikusi nahi, bere mezuak ezkutatzeko blokeatu dezakezu - Element-ek zure E2E gakoak diskoan gordetzeko baimena behar du. + ${app_name}-ek zure E2E gakoak diskoan gordetzeko baimena behar du. \n \nBaimendu sarbidea hurrengo laster-leihoan zure gakoak eskuz esportatu ahal izateko. Ez dago sare konexiorik orain Berretsi zure pasahitza - Ezin duzu hau egin mugikorrerako Element erabiliz + Ezin duzu hau egin mugikorrerako ${app_name} erabiliz Autentifikazioa behar da @@ -1775,7 +1907,6 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Helbidea Ordainpeko ostatatzea elkarteentzat Sartu erabili nahi duzun Modular Element edo zerbitzariaren helbidea - Sartu konektatu nahi duzun zerbitzari edo Element-aren helbidea Errore bat gertatu da orria kargatzean: %1$s (%2$d) Aplikazioak ezin du hasiera-zerbitzari honetan saioa hasi. Hasiera-zerbitzariak honako saio mota onartzen du: %1$s. @@ -1895,7 +2026,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. \nHasi saioa berriro zure kontuaren datuak eta mezuak atzitzeko. Zure mezu zifratuetara sarbidea galduko duzu ez baduzu saioa hasten zifratze gakoak berreskuratzeko. Garbitu datuak - Oraingo saioa %1$s erabiltzailearena da eta %2$s erabiltzailearen kredentzialak eman dituzu. Element-k ez du hau onartzen. + Oraingo saioa %1$s erabiltzailearena da eta %2$s erabiltzailearen kredentzialak eman dituzu. ${app_name}-k ez du hau onartzen. \nAurretik garbitu datuak, gero hasi saioa berriro beste kontu batekin. Zure matrix.to esteka gaizki osatua dago @@ -1918,7 +2049,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Soilik lehen emaitzak erakusten, idatzi letra gehiago… Hutsegin-azkar - Element aplikazioa ustekabeko erroreen aurrean maizago kraskatu daiteke + ${app_name} aplikazioa ustekabeko erroreen aurrean maizago kraskatu daiteke "Jarri ¯\\_(ツ)_/¯ testu-soileko mezuaren aurretik" Gaitu zifratzea @@ -2007,9 +2138,9 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Saltatu irakurragirira - Element aplikazioak ez ditu \'%1$s\' motako gertaerak kudeatzen - Element aplikazioak ez ditu \'%1$s\' motako mezuak kudeatzen - Element aplikazioak arazo bat izan du \'%1$s\' id-a duen edukia erakusteko + ${app_name} aplikazioak ez ditu \'%1$s\' motako gertaerak kudeatzen + ${app_name} aplikazioak ez ditu \'%1$s\' motako mezuak kudeatzen + ${app_name} aplikazioak arazo bat izan du \'%1$s\' id-a duen edukia erakusteko Utzi ezikusteari @@ -2139,7 +2270,7 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Gakoak egunean daude jada! - Element Android + ${app_name} Android Gako eskaerak @@ -2281,13 +2412,13 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. %1$s: %2$s %1$s: %2$s %3$s - Erabili azken Element bertsioa zure beste gailuetan, Element Web, Element Desktop, Element iOS, Element Android plataformarako, edo zeharka sinatzeko gaitasuna duen beste Matrix bezero bat - Element Web -\nElement Desktop - Element iOS -\nElement Android + Erabili azken ${app_name} bertsioa zure beste gailuetan, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} Android plataformarako, edo zeharka sinatzeko gaitasuna duen beste Matrix bezero bat + ${app_name} Web +\n${app_name} Desktop + ${app_name} iOS +\n${app_name} Android edo zeharka sinatzeko gaitasuna duen beste Matrix bezero bat - Erabili azken Element bertsioa zure beste gailuetan: + Erabili azken ${app_name} bertsioa zure beste gailuetan: Uneko irteerako talde saioa zifratutako gela batean baztertzera behartzen du Zifratutako gelatan onartzen da soilik Erabili zure %1$s edo %2$s jarraitzeko. @@ -2357,11 +2488,11 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. Ireki %s zerbitzariko baldintzak Deskonektatu %s identitate zerbitzaritik\? - Identitate zerbitzaria zaharkituta dago. Element-k API V2 besterik ez du onartzen. + Identitate zerbitzaria zaharkituta dago. ${app_name}-k API V2 besterik ez du onartzen. Ezin da eragiketa hau burutu. Hasiera-zerbitzaria zaharkituta dago. Konfiguratu identitate-zerbitzari bat aurretik. Onartu identitate-zerbitzariaren baldintzak aurretik zerbitzariaren ezarpenetan. - Zure pribatutasuna babesteko, Element-k erabiltzaileeen e-mail eta telefonoak hasheatuta bidaltzen ditu. + Zure pribatutasuna babesteko, ${app_name}-k erabiltzaileeen e-mail eta telefonoak hasheatuta bidaltzen ditu. Asoziazioak huts egin du. Ez dago asoziaziorik identifikatzaile honekin. diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml index 5418d32c0c..0c7ab7a71c 100644 --- a/vector/src/main/res/values-fa/strings.xml +++ b/vector/src/main/res/values-fa/strings.xml @@ -1,8 +1,225 @@ + %1$s: %2$s + %1$s تصویری فرستاد. + %1$s برچسبی فرستاد. + دعوت %s + ‫%1$s، %2$s را دعوت کرد + %1$s دعوتتان کرد + %1$s به اتاق پیوست + %1$s اتاق را ترک کرد + %1$s دعوت را رد کرد + %1$s، %2$s را اخراج کرد + %1$s، انسداد %2$s را رفع کرد + %1$s، %2$s را مسدود کرد + %1$s دعوت %2$s را نپذیرفت + %1$s تصویرش را عوض کرد + %1$s نام نمایشی خود را به %2$s تنظیم کرد + %1$s نام نمایشیش را از %2$s به %3$s تغییر داد + %1$s نام نمایشیش (%2$s) را پاک کرد + %1$s موضوع را به %2$s تغییر داد + %1$s نام اتاق را به %2$s تغییر داد + %s یک تماس تصویری برقرار کرد. + %s یک تماس صوتی برقرار کرد. + %s تماس را پاسخ داد. + %s به تماس پایان داد. + %1$s تاریخچهٔ آیندهٔ اتاق را برای %2$s نمایان کرد + همهٔ اعضای اتاق، از زمان دعوت شدنشان. + همهٔ اعضای اتاق، از زمان پیوستنشان. + همهٔ اعضای اتاق. + هرکسی. + ناشناخته (%s). + %1$s رمزنگاری سرتاسری را روشن کرد (%2$s) + %s این اتاق را ارتقا داد. + %1$s درخواست یک گردهمایی صوتی داد + گردهمایی صوتی آغاز شد + گردهمایی صوتی پایان یافت + (تصویر هم عوض شد) + %1$s نام اتاق را پاک کرد + %1$s موضوع اتاق را پاک کرد + پیام برداشته شد + پیام به دست %1$s برداشته شد + پیام برداشته شد [دلیل: %1$s] + پیام به دست %1$s برداشته شد [دلیل: %2$s] + %1$s دعوتی برای پیوستن %2$s به اتاق فرستاد + %1$s دعوت پیوستن به اتاق %2$s را باطل کرد + %1$s دعوت برای %2$s را پذیرفت + ** ناتوان در رمزگشایی: %s ** + دستگاه فرستنده، کلیدهای این پیام را برایمان نفرستاده است. + ناتوان در فرستادن پیام + شکست در بارگذاری تصویر + خطای شبکه + خطای ماتریکس + در حال حاضر امکان بازپیوست به اتاقی خالی وجود ندارد‌‌. + نشانی رایانامه + شماره تلفن + دعوت از %s + دعوت اتاق + %1$s و %2$s + + %1$s و ۱ نفر دیگر + %1$s و %2$d نفر دیگر + + اتاق خالی + همگام‌سازی نخستین: +\nدر حال درون‌ریزی حساب… + همگام‌سازی نخستین: +\nدر حال درون‌ریزی رمزنگاری + همگام‌سازی نخستین: +\nدر حال درون‌ریزی اتاق‌ها + همگام‌سازی نخستین: +\nدر حال درون‌ریزی اتاق‌های پیوسته + همگام‌سازی نخستین: +\nدر حال درون‌ریزی اتاق‌های دعوت‌شده + همگام‌سازی نخستین: +\nدر حال درون‌ریزی اتاق‌های ترک‌شده + همگام‌سازی نخستین: +\nدر حال درون‌ریزی انجمن‌ها + همگام‌سازی نخستین: +\nدر حال درون‌ریزی داده‌های حساب + در حال فرستادن پیام… + پاک‌سازی صفِ در حال ارسال + دعوت %1$s. دلیل: %2$s + %1$s، %2$s را دعوت کرد. دلیل: %3$s + %1$s دعوتتان کرد. دلیل: %2$s + %1$s به اتاق پیوست. دلیل: %2$s + %1$s اتاق را ترک کرد. دلیل: %2$s + %1$s دعوت را رد کرد. دلیل: %2$s + %1$s، %2$s را اخراج کرد. دلیل: %3$s + %1$s انسداد %2$s را رفع کرد. دلیل: %3$s + %1$s، %2$s را مسدود کرد. دلیل: %3$s + %1$s دعوتی برای پیوستن %2$s به اتاق فرستاد. دلیل: %3$s + %1$s دعوت %2$s برای پیوستن به اتاق را باطل کرد. دلیل: %3$s + %1$s دعوت برای %2$s را پذیرفت. دلیل: %3$s + %1$s دعوت %2$s را نپذیرفت. دلیل: %3$s + + %1$s، %2$s را به عنوان نشانی‌ای برای این اتاق افزود. + %1$s، %2$s را به عنوان نشانی‌هایی برای این اتاق افزود. + + + %1$s، %2$s را به عنوان نشانی‌ای برای این اتاق پاک کرد. + %1$s، %2$s را به عنوان نشانی‌هایی برای این اتاق پاک کرد. + + %1$s برای نشانی این اتاق، %2$s را افزود و %3$s را پاک کرد. + %1$s نشانی اصلی این اتاق را به %2$s تنظیم کرد. + %1$s نشانی اصلی را برای این اتاق پاک کرد. + %1$s اجازه داد میمهانان به گروه بپیوندند. + %1$s جلوی پیوستن میمهانان به گروه را گرفت. + %1$s رمزنگاری سرتاسری را روشن کرد. + %1$s رمزنگاری سرتاسری را روشن کرد (الگوریتم تشخیص‌داده‌نشده %2$s ). + %1$s اتاق را ایجاد کرد + %1$s نمایه‌اش را به‌روز کرد %2$s + نمی‌توان ویرایش کرد + تصویری فرستادید. + برچسبی فرستادید. + دعوتتان + اتاق را ایجاد کردید + از %1$s دعوت کردید + به اتاق پیوستید + اتاق را ترک کردید + دعوت را رد کردید + %1$s را اخراج کردید + تحریم %1$s را برداشتید + %1$s را تحریم کردید + دعوت %1$s را پس‌گرفتید + آواتارتان را عوض کردید + نام نمایشیتان را به %1$s تغییر دادید + نام نمایشیتان را از %1$s به %2$s تغییر دادید + نام نمایشیتان را برداشتید (%1$s بود) + موضوع را به %1$s تغییر دادید + %1$s آواتار اتاق را تغییر داد + آواتار اتاق را تغییر دادید + نام اتاق را به %1$s تغییر دادید + تماس تصویری گرفتید. + تماس صوتی گرفتید. + %s برای برپایی تماس، داده فرستاد. + برای برپایی تماس، داده فرستادید. + تماس را پاسخ دادید. + به تماس پایان دادید. + تاریخچهٔ آتی اتاق را برای %1$s نمایان کردید + رمزنگاری سرتاسری را روشن کردید (%1$s) + این اتاق را ارتقا دادید. + دارخواست کنفرانس ویپ دادید + نام اتاق را برداشتید + موضوع اتاق را برداشتید + %1$s آواتار اتاق را برداشت + آواتار اتاق را برداشتید + نمایه‌تان را به‌روز کردید %1$s + برای %1$s دعوت پیوستن به اتاق فرستادید + دعوت پیوستن %1$s به اتاق را پس گرفتید + دعوت برای %1$s را پذیرفتید + %1$s ابزارک %2$s را افزود + ابزارک %1$s را افزودید + %1$s ابزارک %2$s را برداشت + ابزارک %1$s را برداشتید + %1$s ابزارک %2$s را دستکاری کرد + ابزارک %1$s را دستکاری کردید + مدیر + ناظم + پیش‌گزیده + سفارشی (%1$d) + سفارشی + سطح قدرت %1$s را تغییر دادید. + %1$s سطح قدرت %2$s را تغییر داد. + %1$s از %2$s به %3$s + دعوتتان. دلیل: %1$s + %1$s را دعوت کردید. دلیل: %2$s + به اتاق پیوستید. دلیل: %1$s + اتاق را ترک کردید. دلیل: %1$s + دعوت را رد کردید. دلیل: %1$s + %1$s را اخراج کردید. دلیل: %2$s + تحریم %1$s را برداشتید. دلیل: %2$s + %1$s را تحریم کردید. دلیل: %2$s + دعوتی به %1$s برای پیوستن به اتاق فرستادید. دلیل: %2$s + دعوت %1$s برای پیوستن به اتاق را پس گرفتید. دلیل: %2$s + دعوت برای %1$s را پذیرفتید. دلیل: %2$s + دعوت %1$s را رد کردید. دلیل: %2$s + + نشانی %1$s را به این اتاق افزودید. + نشانی‌های %1$s را به این اتاق افزودید. + + + نشانی %1$s را از این اتاق برداشتید. + نشانی‌های %1$s را از این اتاق برداشتید. + + نشانی %1$s ار افزوده و %2$s را از این اتاق برداشتید. + نشانی اصلی این اتاق را به %1$s تنظیم کردید. + نشانی اصلی این اتاق را برداشتید. + به میهمانان اجازهٔ پیوستن به گروه دادید. + میمهانان را از پیوستن به گروه بازداشتید. + رمزنگاری سرتاسری را روشن کردید. + رمزنگاری سرتاسری را روشن کردید (الگوریتم ناشناخته %1$s). + مهمان‌ها را از پیوستن به اتاق بازداشتید. + %1$s مهمان‌ها را از پیوستن به اتاق بازداشت. + به مهمان‌ها اجازه دادید به این‌جا بپیوندند. + %1$s به مهمان‌ها اجازه داد به این‌جا بپیوندند. + رفتید. دلیل: %1$s + %1$s رفت. دلیل: %2$s + پیوستید. دلیل: %1$s + %1$sپیوست. دلیل: %2$s + دعوت %1$s را پس گرفتید + %1$s دعوت %2$s را پس گرفت + %1$s را دعوت کردید + %1$s، %2$s را دعوت کرد + این‌جا را ارتقا دادید. + %s این‌جا را ارتقا داد. + پیام‌های آینده را برای %1$s نمایان کردید + %1$s پیام‌های آینده را برای %2$s نمایان کرد + اتاق را ترک کردید + %1$s اتاق را ترک کرد + پیوستید + %1$s پیوست + گفت‌وگو را ایجاد کردید + %1$s گفت‌وگو را ایجاد کرد + + %1$s، %2$s، %3$s و %4$d نفر دیگر + %1$s، %2$s، %3$s و %4$d نفر دیگر + + %1$s، %2$s و %3$s + %1$s، %2$s، %3$s و %4$s زمینهٔ روشن زمینهٔ تیره - زمینهٔ سیاه + زمینهٔ سیاه در حال گوش دادن به رویدادها پیام‌ها اتاق @@ -73,26 +290,26 @@ ساخت حساب ارسال رد شدن - ارسال ایمیل بازنشانی - ایمیل یا نام کاربری + فرستادن رایانامهٔ بازنشانی + رایانامه یا نام کاربری گذرواژه گذرواژه جدید نام کاربری - نشانی ایمیل - نشانی ایمیل (اختیاری) + نشانی رایانامه + نشانی رایانامه (اختیاری) شماره تلفن شماره تلفن (اختیاری) گذرواژه را تکرار کنید گذرواژه جدید خود را تأیید کنید نام کاربری یا گذرواژه نامعتبر است گذرواژه کوتاه است (حداقل ۶) - آدرس ایمیل نامعتبر به نظر می‌رسد + شبیه یک نشانی رایانامهٔ معتبر نیست شماره تلفن نامعتبر به نظر می‌رسد گذرواژه‌ها مطابقت ندارد گذرواژه را فراموش کردید؟ - استفاده از گزینه‌های سفارشی سرور (پیش‌رفته) - برای ادامه‌ی ثبت‌نام، لطفاً ایمیل خود را بررسی کنید - من آدرس ایمیلم را تایید کرده‌ام + استفاده از گزینه‌های سفارشی کارساز (پیش‌رفته) + برای ادامهٔ ثبت‌نام، لطفاً رایانامه‌تان را بررسی کنید + نشانی رایانامه‌ام را تأیید کرده‌ام نمی‌توان وارد شد: خطای شبکه نام کاربری/گذرواژه نامعتبر است این نام کاربری قبلا استفاده شده است @@ -129,7 +346,7 @@ مخاطبین من فهرست کاربران فقط مخاطبین ماتریکس - شما اجازه‌ی دسترسی به مخاطبین را به برنامه نداده‌اید + شما اجازه‌ی دسترسی به مخاطبین را به برنامه نداده‌اید نتیجه‌ای نیست فهرست اتاق‌ها اتاقی نیست @@ -149,8 +366,8 @@ امکان ارسال گزارش اشکال وجود نداشت، دوباره تلاش کنید (%s) پیشرفت (%s%%) ارسال در - نشانی سرور خانه - نشانی سرور هویتی + نشانی کارساز خانگی + نشانی کارساز هویت ارسال صدا آیا مطمئنید می‌خواهید با %s یک گپ جدید را آغاز کنید؟ آیا مطمئنید می‌خواهید که یک تماس صوتی را آغاز کنید؟ @@ -165,12 +382,12 @@ بازگشت به صفحه ورود گذرواژه وارد نشده است شماره تلفن وارد نشده است - نشانی ایمیل وارد نشده است + نشانی رایانامه وارد نشده توکن نامعتبر است - آدرس ایمیل یا شماره تلفن وارد نشده است - این نشانی ایمیل قبلاً ثبت شده است. - سرور خانه: - سرور هویتی: + نشانی رایانامه یا شماره تلفن وارد نشده + این نشانی رایانامه قبلاً ثبت شده. + کارساز خانگی: + کارساز هویت: امکان ورود وجود ندارد %1$dد %2$dث موضوع اتاق @@ -252,10 +469,9 @@ آیا می‌خواهید از حساب کاربری خود خارج شوید؟ علامت‌گذاری به عنوان خوانده شده ورود با سامانه‌های احراز هویت مرکزی - زمینهٔ Status.im در حال راه‌اندازی سرویس - آگاهی‌های پرصدا - آگاهی‌های صامت + اعلان‌های پرصدا + اعلان‌های صامت تاریخچه جزییات انجمن ارسال برچسب @@ -282,12 +498,12 @@ ثبت‌نام با ورود همزمان ایمیل و شماره تلفن در حال حاضر پشتیبانی نمی‌شود. تنها شماره تلفن شما برای حساب‌تان ثبت خواهد شد. \n \nمی‌توانید در ادامه ایمیل خود را در تنظیمات برنامه به پروفایل خود اضافه کنید. - این سرور خانه می‌خواهد مطمئن شود که شما ربات نیستید + این کارساز خانگی می‌خواهد مطمئن شود که روبات نیستید نام کاربری قبلاً استفاده شده است بازدرخواست کلیدهای رمزنگاری از دیگر نشست‌هایتان. درخواست کلید ارسال شد. درخواست ارسال شد - لطفاً المنت را روی افزاره‌ای دیگر که می‌تواند پیام را رمزگشایی کند، اجرا کنید تا بتواند کلیدها را به این نشست بفرستد. + لطفاً المنت را روی افزاره‌ای دیگر که می‌تواند پیام را رمزگشایی کند، اجرا کنید تا بتواند کلیدها را به این نشست بفرستد. فهرست رسیدهای خواندن آیا مطمئن هستید؟ قطع اتصال @@ -327,7 +543,7 @@ اطّلاعات برنامه نمایش اطّلاعات برنامه در تنظیمات سامانه. تأیید گذرواژه‌تان - نمی‌توانید با المنت همراه، این کار را بکنید + نمی‌توانید با المنت همراه، این کار را بکنید نیاز به تأیید هویت است تنظمیات پیش‌رفتهٔ آگاهی آگاهی‌های رفع‌اشکال @@ -338,7 +554,7 @@ آگاهی‌ها برای حسابتان از کار افتاده‌اند. \nلطفاً تتظیمات حساب را بررسی کنید. آگاهی‌ها برای این نشست به کار افتاده‌اند. - آگاهی‌ها برای این نشست به کار نیفتاده‌اند. + آگاهی‌ها برای این نشست به کار نیفتاده‌اند. \nلطفاً تنظیمات المنت را بررسی کنید. برخی آگاهی‌ها در تنظیمات سفارشیتان از کار افتاده‌اند. خدمت آگاهی @@ -473,7 +689,7 @@ لطفاً شکیبایی کنید… تمام اجتماع‌ها این اتاق نمی‌تواند پیش‌نمایش یابد - پیش‌نمایش اتاق‌های قابل خواندن به صورت عمومی هنوز در ریوت‌اکس پشتیبانی نمی‌شود + پیش‌نمایش اتاق‌های قابل خواندن به صورت عمومی هنوز در ریوت‌اکس پشتیبانی نمی‌شود اتاق‌ها پیام‌های مستقیم اتاق جدید @@ -550,40 +766,40 @@ تأیید نشست هیچ ابطال - هیچ سرور هویتی پیکربندی نشده. - تماس بدلیل سرور بد پیکربندی شده شکست خورد + هیچ کارساز هویتی پیکربندی نشده. + تماس به دلیل پیکربندی بد کارساز، شکست خورد از %s استفاده کنید رایانامه‌ای برای بازیابی تنظیم کنید. برای کشف شدن به دست افرادی که می‌شناسید، از رایانامه یا تلفن بعدی استفاده کنید. رایانامه‌ای برای بازیابی تنظیم کنید. برای کشف شدن به دست افرادی که می‌شناسید، از رایانامه یا تلفن بعدی استفاده کنید. - نشانی ایمیل پیوست شده به حساب شما باید وارد شده باشد. + باید نشانی رایانامهٔ پیوسته به حسابتان وارد شود. گذرواژه جدیدی باید وارد شود. - یک ایمیل به %s فرستاده شد. هنگامی که پیوند همراه را دنبال کردید، در زیر کلیک کنید. - تایید نشانی ایمیل ناموفق بود: مطمئن شوید که روی پیوند در ایمیل کلیک کرده‌اید + رایانامه‌ای به %s فرستاده شد. هنگامی که پیوند داخلش را دنبال کردید، پایین را کلیک کنید. + شکست در تأیید نشانی رایانامه: مطمئن شوید که پیوند درون رایانامه را کلیک کرده‌اید گذرواژه بازنشانی شد. \n \nشما از همه نشست‌ها خارج شدید و دیگر آگاهی ها را دریافت نخواهید کرد. برای فعال‌سازی دوباره آگاهی‌ها، در هر دستگاه دوباره وارد شوید. - لطفا سیاست‌های این سرور خانه را بررسی کنید و بپذیرید: + لطفاً سیاست‌های این کارساز خانگی را بررسی کرده و بپذیرید: نشانی باید با http[s]:// آغاز شود نمی‌توان ثبت‌نام کرد: خطای شبکه نمی‎توان ثبت‌نام کرد - نمی‌توان ثبت‌نام کرد : مالکیت ایمیل تایید نشد + نمی‌توان ثبت‌نام کرد : شکست مالکیت رایانامه لطفا یک نشانی معتبر وارد کنید نشانی قابل دسترس نیست، لطفا آن را بررسی کنید این یک نشانی کارساز ماتریکس معتبر نیست - نمی‌توان به این نشانی سرور خانه دست یافت، لطفا آن را بررسی کنید + روی این نشانی نمی‌توان به کارساز خانگی‌ای رسید. لطفاً بررسیش کنید افزاره‌تان از یک قرارداد امنیتی TLS تاریخ‌گذشته که به حمله آسیپ‌پذیر است استفاده می‌کند. برای امنیتتان، نخواهید توانست وصل شوید توکن دسترسی مشخص شده، شناخته نشد JSON ناهنجار شامل یک JSON معتبر نبود درخواست‌های بیش از حد ارسال شده هنوز روی پیوند ایمیل کلیک نشده - استفاده از صدای زنگ پیش‌گزیدهٔ المنت برای تماس‌های ورودی + استفاده از صدای زنگ پیش‌گزیدهٔ المنت برای تماس‌های ورودی صدای زنگ تماس ورودی گزینش صدای زنگ برای تماس‌ها: یک عکس یا ویدیو بگیر نمی‌توان ویدیو ظبط کرد اطلاعات - المنت برای گرفتن عکس و تماس‌های ویدیویی نیاز به اجازه دارد. + المنت برای گرفتن عکس و تماس‌های ویدیویی نیاز به اجازه دارد. بازکردن سرتیتر در حال هم‌گام‌سازی… پریدن به نخستین پیام خوانده نشده. @@ -650,7 +866,7 @@ پذیرش رد قطع - تماس المنت شکست خورد + تماس المنت شکست خورد گزینش افزارهٔ صوتی تلفن بلندگو @@ -762,14 +978,14 @@ خدمت هنگام شروع دوبارهٔ افزاره، شروع خواهد شد. به کار اندازی شروع هنگام راه‌اندازی بررسی محدودیت‌های پس‌زمینه - محدودیت‌های پس‌زمینه برای المنت از کار افتاده‌اند. این آزمون باید با استفاده از دادهٔ همراه (بدون وای‌فای) اجرا شود. + محدودیت‌های پس‌زمینه برای المنت از کار افتاده‌اند. این آزمون باید با استفاده از دادهٔ همراه (بدون وای‌فای) اجرا شود. \n%1$s - محدودیت‌های پس‌زمینه برای النت به کار افتاده‌اند. + محدودیت‌های پس‌زمینه برای النت به کار افتاده‌اند. \nکارهایی که کاره می‌خواهد انجام دهد، هنگامی که در پس‌زمینه است به صورت تهاجمی محدود می‌شوند که می‌تواند روی آگاهی‌ها تأثیر بگذارد. \n%1$s از کار انداختن محدودیت‌ها بهینه‌سازی باتری - المنت تحت تأثیر بهینه‌سازی باتری نیست. + المنت تحت تأثیر بهینه‌سازی باتری نیست. نادیده‌گرفتن بهینه‌سازی عادی محرمانگی کاهش‌یافته @@ -944,7 +1160,7 @@ شناسهٔ کاربریتان شناسهٔ ابزارک شناسهٔ اتاق - متأسّفانه تماس‌های کنفرانسی با جیتسی روی افزاره‌های قدیمی (افزاره‌هایی با سیستم‌عامل اندروید زیر ۵) پشتیبانی نمی‌شود + متأسّفانه تماس‌های کنفرانسی با جیتسی روی دستگاه‌های قدیمی (دستگاه‌هایی با سیستم‌عامل اندروید زیر ۶) پشتیبانی نمی‌شود این ابزارک می‌خواهد از منابع زیر استفاده کند: اجازه انسداد همه @@ -1137,7 +1353,7 @@ نشست جاری فقط نمایش نخستین نتایج. حرف‌های بیش‌تری بنویسید… شکست سریع - المنت ممکن است هنگام رخ دادن خطای نامنتظره،‌بیش‌تر فروبپاشد + المنت ممکن است هنگام رخ دادن خطای نامنتظره،‌بیش‌تر فروبپاشد به کار انداختن رمزنگاری پس از به کار افتادن، رمزنگاری قابل از کار انداختن نیست. ورود نامطمئن @@ -1215,7 +1431,7 @@ مدیر کارسازتان رمزنگاری سرتاسری پیش‌گزیده را در اتاق‌های خصوصی و پیام‌های مستقیم از کار انداخته است. خروج از این نشست تأیید این ورود - ممکن است دیگر کاربران، به آن اعتماد نکنند + شما در حال حاضر در این تماس هستید تکمیل امنیت استفاده از نشستی موجود برای تأییدش که به پیام‌های رمزشده دسترسی می‌دهد. تأیید @@ -1253,7 +1469,7 @@ تأیید برداشت آوردن دلیل - Element Android + ${app_name} Android درخواست‌های کلید قفل‌گشایی از تاریخچهٔ پیام‌های رمزشده نوسازی @@ -1287,9 +1503,9 @@ جلوگیری از نماگرفت کاره به کار انداختن این انتخاب، FLAG_SECURE را به تمامی فعّالیت‌ها می‌افزاید. برای اثرگذاری تغییر، برنامه را دوباره شروع کنید. پروندهٔ رسانه‌ای به جُنگ افزوده شد - المنت وب + المنت وب \nالمنت میزکار - المنت آی‌اواس + المنت آی‌اواس \nالمنت اندروید استفاده از کلید بازیابی رمزشده به دست افزاره‌ای تأییدنشده @@ -1320,9 +1536,8 @@ سپرامنیتی در برابر از دست دادن دسترسی به داده‌ها و پیام‌های رمزشده با پشتیبان گیری از کلیدها روی کارسازتان. نام اتاق موضوع - گرفتم - اطّلاعات بیش‌تر - المنت + گرفتم + اطّلاعات بیش‌تر هشدارهای نشانی اصلی اطّلاعات نشست فرستنده خطای رمزگشایی @@ -1389,7 +1604,7 @@ به کار انداختن ورود چندگانه برای ادامه از %1$s یا %2$sتان استفاده کنید. پشتیبانی‌شده فقط در اتاق‌های رمزشده - از آخرین نگارش المنت روی دیگر افزاره‌تان استفاده کنید: + از آخرین نگارش المنت روی دیگر افزاره‌تان استفاده کنید: یا دیگر کاره‌های ماتریکس دادای قابلیت ورود چندگانه تأیید دستی با متن تأیید ورود جدیدی که به حسابتان دسترسی دارد: %1$s @@ -1398,7 +1613,6 @@ تأیید برهم‌کنشی با اموجی تأیید ورود رمزنشده - متأسّفانه این عملیات هنوز برای حساب‌هایی که با استفاده از ورود یکپارچه وصل شده‌اند، ممکن نیست. نشانه‌گذاری به عنوان مطمئن استفاده از %1$s ناخموش کردن میکروفون @@ -1409,8 +1623,8 @@ ثبت استفاده از یک کلید امنیتی برپا سازی - مشتاقیم اعلام کنیم که ناممان را عوض کردیم! کاره‌تان به‌روز شده و وارد حسابتان شده‌اید. - ریوت اکنون المنت است! + مشتاقیم اعلام کنیم که ناممان را عوض کردیم! کاره‌تان به‌روز شده و وارد حسابتان شده‌اید. + ریوت اکنون المنت است! در انتظار تاریخچهٔ رمزنگاری به خاطر این که فرستنده از قصد کلیدها را نفرستاده است، نمی‌توانید به این پیام دسترسی داشته باشید به خاطر این که نشستتان به دست فرستنده مطمئن نیست، نمی‌توانید به این پیام دسترسی داشته باشید @@ -1438,13 +1652,13 @@ نمی‌توان این اتاق را یافت. مطمئن شوید وجود دارد. نمی‌توان اتاقی را که از آن تحریم شده‌اید، گشود. برای از کار انداختن پین، تأییدش کنید - نیاز به رمز پین، هر بار که المنت را می‌گشایید. - نیاز به رمز پین، ۲ دقیقه پس از استفاده نشدن از المنت. + نیاز به رمز پین، هر بار که المنت را می‌گشایید. + نیاز به رمز پین، ۲ دقیقه پس از استفاده نشدن از المنت. نیاز به پین پس از ۲ دقیقه فقط نمایش تعداد پیام‌های نخوانده در یک آگاهی ساده. نمایش جزییاتی چون نام اتاق‌ها و محتوای پیام. نمایش محتوا در آگاهی‌ها - کد پین، تنها راه قفل‌گشایی المنت است. + کد پین، تنها راه قفل‌گشایی المنت است. به کار انداختن زیست‌سنجی‌های مختص افزاره، مانند اثرانگشت‌ها و تشخیص چهره. به کار انداختن زیست‌سنجی‌ها اگر می‌خواهید پینتان را بازنشانی کنید، فراموشی پین را برای خروج و بازنشانی بزنید. @@ -1478,7 +1692,7 @@ بازنشانی انتخاب گزینه‌ی دیگر مجوز دادن - المنت می تواند در پس‌زمینه اجرا شود تا اعلان های شما را به صورت ایمن و اختصاصی مدیریت کند. این ممکن است بر میزان مصرف باتری شما تأثیر منفی بگذارد. + المنت می تواند در پس‌زمینه اجرا شده تا آگاهی‌هایتان را به صورت ایمن و محرمانه مدیریت کند. ممکن است بر مصرف باتری تأثیر بگذارد. این کار کلید امنیتی قبلی شما را حذف می‌کند. یک کلید امنیتی جدید به صورت تصادفی ایجاد کنید یا یک عبارت امنیتی جدید برای فایل‌های پشتیبان موجود خود تنظیم کنید. فشردن اینتر به جای رفتن به خط بعد، پیام را ارسال خواهد کرد @@ -1492,22 +1706,22 @@ پیش‌نمایشی از آدرس‌های URL در پیام‌ها نمایش داده شود. %s \nبسته به شارژ دستگاه یا وضعیت دستگاه(خاموش بودن صفحه) ممکن است همگام‌سازی به تعویق بیوفتد. - المنت بصورت دوره‌ای و در بازه‌های قابل تنظیم در پس زمینه همگام‌سازی می شود. + المنت بصورت دوره‌ای و در بازه‌های قابل تنظیم در پس زمینه همگام‌سازی می شود. \nاین بر مصرف باتری شما تأثیر می‌گذارد، یک اعلان دائمی نمایش داده می‌شود که المنت برای رویدادها گوش می‌دهد. - المنت در پس زمینه همگام‌سازی می‌کند به گونه ای که منابع محدود دستگاه (باتری) حفظ می‌شود. + المنت در پس زمینه همگام‌سازی می‌کند به گونه ای که منابع محدود دستگاه (باتری) حفظ می‌شود. \nبسته به شارژ گوشی شما، ممکن است همگام‌سازی توسط سیستم‌عامل به تعویق بیوفتد. روشن کردن صفحه برای ۳ ثانیه • آگاهی‌ها محتوای پیام را نشان نخواهند داد • آگاهی‌ها شاکل فراداده و محتوای پیام هستند • محتوای پیام آگاهی به طور ایمن و مستقیم از کارساز خانگی ماتریکس دریافت می‌شود - • اعلان ها فقط حاوی فرا داده هستند - • اعلان ها از طریق سرور Firebase ارسال می شوند + • آگاهی‌ها فقط دارای فراداده هستند + • آگاهی‌ها با پیام‌رسانی ابری Firebase فرستاده می‌شوند اگر دستگاه برای مدتی از شارژر جدا باشد و از دستگاه نیز استفاده نشود، گوشی وارد حالت غیر هوشیار می‌شود. در این حالت از دسترسی برنامه‌ها به اینترنت جلوگیری می‌شود و همگام سازی و هشدارهای استاندارد آن‌ها به تعویق می‌افتد. - این سرویس با ری‌استارت دستگاه شروع نمی‌شود. تا وقتی المنت را یک بار باز نکنید اعلانی دریافت نخواهید کرد. - بر روی اعلان کلیک شد! - لطفا بر روی اعلان کلیک کنید. اگر اعلان را نمی‌بینید، تنظیمات دستگاه را بررسی نمائید. - نمایش اعلان - شما اعلان را مشاهده می‌کنید! کلیک کنید! + خدمت، هنگام شروع دوبارهٔ افزاره اجرا نخواهد شد. تا وقتی یک بار المنت باز نشود، آگاهی‌ها را دریافت نخواهید کرد. + روی آگاهی کلیک شد! + لطفاً روی آگاهی کلیک کنید. اگر آگاهی را نمی‌بینید، لطفاً تنظیمات سامانه را بررسی کنید. + نمایش آگاهی + دارید آگاهی را مشاهده می‌کنید! کلیک کنید! دریافت Push با خطا مواجه شد. نصب مجدد برنامه می‌تواند یکی از راه‌حل‌های احتمالی باشد. برنامه Push دریافت کرد برنامه منتظر دریافت Push است @@ -1517,11 +1731,11 @@ توکن FCM با موفقیت در سرور ثبت شد. ثبت توکن افزودن حساب کاربری - [%1$s] + [%1$s] \nاین خطا از کنترل المنت خارج است. هیچ حساب Google‌ای روی تلفن وجود ندارد. لطفاً مدیریت حساب را در تنظیمات گوشی باز کرده و یک حساب Google اضافه کنید. - [%1$s] + [%1$s] \nاین خطا از کنترل المنت خارج است و به چند دلیل ممکن است رخ داده باشد. امکان دارد در صورت تلاش مجدد مشکل رفع شود، همچنین می‌توانید بررسی کنید که سرویس Google Play در استفاده از اینترنت در تنظیمات گوشی محدودیتی نداشته باشد یا ساعت دستگاه شما درست باشد. همچنین ممکن است به علت استفاده از ROM سفارشی‌شده این خطا رخ داده باشد. - [%1$s] + [%1$s] \nاین خطا از کنترل المنت خارج است و طبق گفته گوگل ، این خطا نشان می دهد که دستگاه بیش از حد مجاز، برنامه های ثبت شده در FCM دارد. این خطا فقط در مواردی رخ می دهد که تعداد زیادی برنامه وجود دارد، بنابراین نباید بر کاربر عادی رخ دهد. بازیابی توکن FCM با مشکل مواجه شد: \n%1$s @@ -1529,11 +1743,11 @@ \n%1$s توکن Firebase مشکل Google Play Services را برطرف کنید - المنت از Google Play Services برای ارسال اعلان‌ها استفاده می‌کند اما به نظر می‌رسد به درستی پیکربندی نشده است: + المنت برای ارسال آگاهی‌ها از خدمات پلی گوگل استفاده می‌کند اما به نظر می‌رسد به درستی پیکربندی نشده است: \n%1$s Google Play Services در دسترس و بروز است. تنظیمات سفارشی بارگذاری نشد، لطفاً دوباره امتحان کنید. - عیب‌یابی اولیه مشکلی را نشان نمی‌دهد. اگر همچنان در دریافت اعلان‌ها مشکل دارید لطفا خطا را گزارش کرده تا آن را بررسی کنیم. + عیب‌یابی اولیه مشکلی را نشان نمی‌دهد. اگر همچنان در دریافت آگاهی‌ها مشکل دارید، لطفا خطا را گزارش کرده تا آن را بررسی کنیم. یک یا چند تست ناموفق بودند، لطفا خطا را گزارش کرده تا آن را بررسی کنیم. یک یا چند تست ناموفق بودند، راه حل(های) پیشنهادی را امتحان کنید. در حال اجرا (%1$d از %2$d) @@ -1556,7 +1770,7 @@ دلیل گزارش این محتوا عضو شد دعوت‌شدگان - شناسه نامعتبر است. باید یک آدرس ایمیل یا شناسه‌ای در قالب \\\'@localpart:domain\\\' وارد نمایید + شناسه بدریخت. باید یک نشانی رایانامه یا شناسهٔ ماتریکسی در قالب \'@localpart:domain\' باشد %d مورد %d مورد @@ -1565,10 +1779,10 @@ افراد اطلاعات اتاق گواهی را تنها در صورتی تایید کنید که اثر انگشت آن با اثر انگشتی که ادمین سرور ارائه کرده‌است برابر باشد. - گواهی سرور تغییر کرده‌است. ممکن است این اتفاق به دلیل تمدید گواهی سرور رخ داده باشد. توصیه می‌شود از ادمین سرور سوال کنید. - گواهی سرور تغییر کرده است. این مورد بسیار نادر است. توصیه می شود گواهی جدید را قبول نکنید. - اگر مدیر سرور گفته است که این مسئله اشکالی ندارد، اطمینان حاصل کنید که اثر انگشت زیر با اثر انگشت ارائه شده توسط آنها مطابقت دارد. - این می‌تواند به این معنی باشد که حمله‌ی مرد میانی رخ داده است و یا اینکه گوشی شما، گواهی سرور را معتبر نمی‌داند. + گواهی از آنی که مورد اطمینان بوده، تغییر کرده. ممکن است کارساز، گواهیش را نوسازی کرده باشد. برای دریافت اثر انگشت مورد انتظار، با مدیر کارساز تماس بگیرید. + گواهی از آنی که مورد اطمینان تلفنتان است، تغییر کرده. این مورد بسیار نامعمول است. توصیه می شود این گواهی جدید را نپذیرید. + اگر مدیر کارساز خبر از مورد انتظار بودنش داده، مطمئن شوید که اثر انگشت زیر با اثر انگشت ارائه شده به دستشان مطابق است. + می‌تواند به این معنی باشد که کسی شدامدتان را بدخواهانه دستکاری کرده یا تلفنتان، به گواهی فراهم‌شده به دست کارساز دوردست، اطمینان ندارد. پیام به دلیل حضور یک دستگاه ناشناس ارسال نشد. %1$s یا %2$s؟ پیام ارسال نشد. %1$s یا %2$s؟ با لغو مسدودیت، کاربر می‌تواند مجددا به اتاق اضافه شود. @@ -1585,31 +1799,31 @@ این دعوت به %s ارسال شده که ارتباطی با این حساب ندارد. \nممکن است بخواهید با حسابی دیگر وارد شده یا این رایانامه را به حسابتان بیفزایید. متاسفانه به دلیل عدم دسترسی، درخواست شما امکان پذیر نمی باشد - المنت می‌تواند با دیدن دفترچه تلفن شما کاربرهای دیگر ماتریکس را بر اساس ایمبل و شماره تلفنشان پیدا کند. + المنت می‌تواند با دیدن دفترچه تلفن شما کاربرهای دیگر ماتریکس را بر اساس ایمبل و شماره تلفنشان پیدا کند. \n \nآیا موافق با اشتراک‌گذاری دفترچه تلفنتان به این منظور هستید؟ - المنت می‌تواند با دیدن دفترچه تلفن شما کاربرهای دیگر ماتریکس را بر اساس ایمبل و شماره تلفنشان پیدا کند. اگر مایل به اشتراک گذاری دفترچه تلفنتان به این منظور هستید لطفا در پنجره‌ی بعد اجازه‌ی این کار را بدهید. - المنت برای برقراری تماس تصویری نیازمند دسترسی به میکروفون و دوربین است. + المنت می‌تواند با دیدن دفترچه تلفن شما کاربرهای دیگر ماتریکس را بر اساس ایمبل و شماره تلفنشان پیدا کند. اگر مایل به اشتراک گذاری دفترچه تلفنتان به این منظور هستید لطفا در پنجره‌ی بعد اجازه‌ی این کار را بدهید. + المنت برای برقراری تماس تصویری نیازمند دسترسی به میکروفون و دوربین است. \n \nلطفا در پنجره های بعدی دسترسی های لازم را بدهید. " \n \nلطفا برای برقراری تماس در پنجره بعدی دسترسی لازم را بدهید." - المنت برای برقراری تماس صوتی نیازمند دسترسی به میکروفون است. + المنت برای برقراری تماس صوتی نیازمند دسترسی به میکروفون است. " \n \nلطفا برای برقراری تماس در پنجره بعدی دسترسی لازم را بدهید." - المنت برای ارسال و ذخیره‌ی فایل‌ها نیاز به دسترسی به گالری شما را دارد. + المنت برای ارسال و ذخیره‌ی فایل‌ها نیاز به دسترسی به گالری شما را دارد. \n \nلطفا در پنجره‌ای که باز می‌شود این دسترسی را بدهید. - هنگامی که سرور شما قابلیت تماس ندارد، از سرور %s استفاده کن - اجازه استفاده از سرور تماس پشتیبان + هنگامی که کارساز خانگیتان قابلیت تماس نداشته باشد، از %s استفاده خواهد شد (نشانی IPتان در طول تماس هم‌رسانی خواهد شد) + اجازه استفاده از کارساز تماس پشتیبان خطای SSL: هویت طرف مقابل تأیید نشد. - اتصال برقرار نشد. -\nلطفا از ادمین سرور بخواهید جهت برقراری مطمئن تماس‌ها، سرور turn را پیکربندی کند. - لطفا از ادمین سرور (%1$s) بخواهید جهت برقراری مطمئن تماس‌ها، turn server را پیکربندی کند. + شکست در برقراری ارتباط همزمان. +\nلطاً از مدیر کارساز بخواهید برای برقراری مطمئن تماس‌ها، کارساز turn را پیکربندی کند. + لطفا از مدیر کارساز خانگیتان (%1$s) بخواهید برای برقراری مطمئن تماس‌ها، کارساز turn را پیکربندی کند. \n -\nبه عنوان جایگزین می‌توانید از سرور عمومی %2$s استفاده کنید، اما این راه مطمئنی نیست چرا که آدرس IP شما در اختیار آن سرور قرار خواهد گرفت. برای مدیریت این بخش می‌توانید به تنظیمات مراجعه نمائید. +\nهمین‌طور می‌توانید از کارساز عمومی %2$s استفاده کنید، گرچه به همان اطمینان نبوده و نشانی IP شما را با آن کارساز هم‌رسانی خواهد کرد. همچنین می‌توانید این بخش را در تنظیمات مدیریت کنید. بعد از راه‌اندازی مجدد، هیچ تاریخچه، پیام، دستگاه تائید شده یا کاربر تائید شده‌ای در حساب شما وجود نخواهد داشت اگر همه چیز را بازنشانی کنید تنها در صورتی این کار را انجام دهید که از هیچ دستگاه دیگری نمی‌توانید این دستگاه را تائید نمائید. @@ -1619,7 +1833,7 @@ نسخه پشتیبان با این کلید بازیابی رمزگشایی نمی‌شود: لطفاً تأیید کنید که کلید بازیابی درست را وارد کرده‌اید. کلید پشتیبان خود را انتخاب کنید، یا با تایپ کردن و یا کپی‌کردن، آن را وارد کنید نشست‌های خارجی را مجبور به ترک گروه می‌کند - از آخرین نسخه‌ی المنت روی دستگاه‌های دیگرتان استفاده کنید: نسخه وب المنت، نسخه دسکتاپ المنت، نسخه IOS المنت و نسخه اندروید المنت + از آخرین نسخه‌ی المنت روی دستگاه‌های دیگرتان استفاده کنید: نسخه وب المنت، نسخه دسکتاپ المنت، نسخه IOS المنت و نسخه اندروید المنت تنظیم گذرواژه جدید… فایل رسانه ذخیره نشد فایل به گالری افزوده نشد @@ -1654,7 +1868,7 @@ انتشار کلید‌های هویتی ایجاد شده در صورتی که %2$s را فراموش کردید از %1$s به عنوان safety net استفاده کنید. این ممکن است چند ثانیه طول بکشد، لطفاً صبور باشید. - یک کلید امنیتی وارد کنید. از این عبارت جهت ذخیره امن کلید‌ها در سمت سرور استفاده می‌شود. + عبارت امنیتی‌ای را که فقط خودتان می‌دانید، وارد کنید. استفاده‌شده برای امن کردن رمزها روی کارسازتان. ترجیحا از گذرواژه حساب خود استفاده نکنید. برای تایید، %s خود را دوباره وارد کنید. افزایش امنیت و رمزگشایی پیام‌های رمزشده و اعتماد به %s. @@ -1694,16 +1908,16 @@ شکلک‌ها را مقایسه کنید، از ترتیب نمایش آنان نیز مطمئن شوید. بهتر است اینکار را به صورت حضوری و یا با استفاده از یک روش ارتباطی مطمئن انجام دهید. برای امنیت بیشتر، %s را با بررسی یک کد یکبارمصرف تایید کنید. - پس از فعال‌شدن ، نمی‌توان رمزگذاری برای یک اتاق را غیرفعال کرد. پیام های ارسالی در یک اتاق رمزگذاری شده توسط سرور قابل مشاهده نیست و فقط توسط اعضای اتاق قابل مشاهده است. فعال کردن رمزنگاری ممکن است از کارکرد بسیاری از ربات ها و پل ها جلوگیری کند. + پس از به‌کار افتادن، نمی‌توان رمزگذاری اتاق را از کار انداخت. پیام‌های ارسالی در اتاقی رمزشده، به دست کارساز قابل مشاهده نبوده و فقط اعضای اتاق قادر به دیدنشان هستند. به‌کار انداختن رمزنگاری ممکن است از کارکرد درست بسیاری از روبات‌ها و پل‌ها جلوگیری کند. رمزگذاری فعال شود؟ به کار انداختن رمزنگاری سرتاسری… شکلک را با رنگ‌بندی رنگین گمان ارسال می کند پیام را با رنگ‌بندی رنگین کمان ارسال می کند این نشست نمی‌تواند تائید را با نشست‌های دیگر شما به اشتراک بگذارد. \nتائید به صورت محلی ذخیره می‌شود و در نسخه‌ی بعدی برنامه به اشتراک گذاشته می‌شود. - المنت هنگام ارائه محتوای رویدادی با شناسه \'%1$s\' با مشکل روبرو شد - المنت پیام‌های \'%1$s\' را پشتیبانی نمی‌کند - المنت رویداد \'%1$s\' را پشتیبانی نمی‌کند + المنت هنگام ارائه محتوای رویدادی با شناسه \'%1$s\' با مشکل روبرو شد + المنت پیام‌های \'%1$s\' را پشتیبانی نمی‌کند + المنت رویداد \'%1$s\' را پشتیبانی نمی‌کند ممکن است یکی از موارد زیر به خطر افتاده باشد: \n \n- سرور میزبان شما @@ -1713,10 +1927,10 @@ برای اطمینان از صحت هویت کاربران، به رنگ آیکون سپر آنان توجه کنید. رنگ سبز به معنای هویت تائید شده‌ی است. برای اطمینان از امنیت اتاق، همه کاربران آن اتاق را تائید کنید. برای امنیت بالا ، از یک روش ارتباطی امن دیگر استفاده کنید یا این کار را حضوری انجام دهید. با تأیید شکلک‌های منحصر به فرد زیر در صفحه نمایش طرف مقابل به همان ترتیب، این کاربر را تأئید کنید. - دامنه ایمیل شما مجاز به ثبت نام در این سرور نیست + دامنهٔ رایانامه‌تان مجاز به ثبت‌نام روی این کارساز نیست ¯\\\\_(ツ)_/¯ را به یک پیام متنی ساده تغییر می دهد لینک مشکل دارد - نشست فعلی مربوط به کاربر %1$s است و شما اطلاعات حساب کاربر %2$s را ارائه داده‌اید. این مورد توسط المنت پشتیبانی نمی‌شود . + نشست فعلی مربوط به کاربر %1$s است و شما اطلاعات حساب کاربر %2$s را ارائه داده‌اید. این مورد توسط المنت پشتیبانی نمی‌شود . \nلطفا ابتدا داده ها را پاک کنید، سپس با یک حساب دیگر وارد برنامه شوید. دسترسی به پیام‌های رمزشده را از دست خواهید داد مگر اینکه برای بازیابی کلیدهای رمزگذاری خود، به حساب خود وارد شوید. آیا تمامی اطلاعات ذخیره‌شده در این دستگاه پاک شود؟ @@ -1733,10 +1947,10 @@ \n• این نشست را در یکی از نشست دیگر خود حذف کرده‌اید. \n \n• ادمین سرور حساب شما را غیرفعال کرده‌است. - سرور معتبر نیست. لطفا شناسه‌کاربری خود را بررسی کنید + ناتوان در یافتن یک کارساز خانگی معتبر. لطفاً شناسه‌تان را بررسی کنید این یک شناسه کاربری معتبر نیست. قالب صحیح: \\\'@user:homeserver.org\\\' اگر گذرواژه خود را نمی‌دانید، برای تنظیم مجدد آن بازگردید. - اگر یک حساب کاربری بر روی یک سرور دارید، از شناسه ماتریکس (به عنوان مثال @user:domain.com) و گذرواژه برای ورود استفاده کنید. + اگر زوی یک کارساز خانگی خسابی برپا کرده‌اید، در پایین از شناسهٔ ماتریکس (مثلاً @user:domain.com) و گذرواژه‌تان استفاده کنید. همچنین اگر قبلاً حساب کاربری داشته و از نام‌کاربری و گذرواژه خود اطلاع دارید، می توانید از این روش استفاده کنید: درخواست های زیادی ارسال شده است. می توانید در %1$d ثانیه دوباره امتحان کنید… @@ -1744,15 +1958,15 @@ این نسخه سرور بسیار قدیمی است. از ادمین خود بخواهید که آن را ارتقا دهد. البته شما می‌توانید ادامه دهید ، اما برخی از ویژگی ها ممکن است به درستی کار نکنند. این نسخه سرور بسیار قدیمی است. از ادمین خود بخواهید که آن را ارتقا دهد. - سرور به روز نشده + کارساز خانگی قدیمی کد وارد شده صحیح نیست. لطفا بررسی فرمائید. ما ایمیلی به %1$s ارسال کردیم. \nلطفاً برای ادامه فرآیند ایجاد حساب‌کاربری بر روی لینک موجود در آن کلیک کنید. لطفا ایمیل خود را بررسی کنید برای ادامه، شرایط را قبول کنید لطفا کپچا را حل کنید - انتخاب سرور دلخواه - انتخاب سرورهای المنت + گزینش یک کارساز خانگی سفارشی + گزینش خدمات ماتریکس المنت انتخاب matrix.org حساب شما هنوز ایجاد نشده‌است. \n @@ -1766,7 +1980,7 @@ گذرواژه شما هنوز تغییر نکرده‌است. \n \nفرآیند تغییر گذرواژه را متوقف می‌کنید؟ - شما از همه نشست‌ها خارج شده‌اید و دیگر اعلان‌ها را دریافت نخواهید کرد. برای فعال کردن مجدد اعلان‌ها، در دستگاه‌های خود وارد حسابتان شوید. + از تمام نشست‌ها خارج شده و دیگر آگاهی‌ای دریافت نخواهید کرد. برای به کار انداختن دوبارهٔ آگاهی‌ها، روی هر دستگاهی، دوباره وارد شوید. ایمیل را تایید کردم برای تایید گذرواژه جدید لینک ارسالی را باز کرده، سپس روی متن زیر کلیک کنید. یک ایمیل تائید به %1$s ارسال شد. @@ -1780,17 +1994,16 @@ برنامه قادر به ایجاد حساب در این سرور نیست. \n \nآیا می خواهید با استفاده از مرورگر حساب کاربری بسازید؟ - متأسفیم، این سرور حساب‌های جدید را نمی پذیرد. + متأسفانه این کارساز، حساب جدید نمی‌پذیرد. برنامه نمی‌تواند به این سرور متصل شود. سرور از این مکانیزم‌(ها) برای ورود پشتیبانی می کند: %1$s. \n \nآیا می خواهید با استفاده از مرورگر وارد شوید؟ هنگام بارگیری صفحه، خطایی روی داد: %1$s (%2$d) - آدرس سرور مورد نظر خود را وارد کنید - آدرس سروری را که می‌‌خواهید به آن متصل شوید، وارد کنید - آدرس سروری را که می‌‌خواهید از آن استفاده کنید، وارد کنید - به میلیون ها نفر در بزرگترین سرور عمومی بپیوندید + نشانی کارسازی که می‌خواهید استفاده کنید را وارد کنید + نشانی کارساز یا المنت ماژولاری که می‌خواهید استفاده کنید را وارد کنید + به میلیون‌ها نفر در بزرگ‌ترین کارساز عمومی بپیوندید درست مانند ایمیل، حساب‌های کاربری یک خانه دارند؛ اگرچه می توانید با هر کسی که دوست دارید، صحبت کنید - یک سرور انتخاب کنید + کارسازی برگزینید شروع کنید تجارب خود را گسترش داده و شخصی‌سازی کنید گفتگوهای خصوصی خود را با رمزگذاری محافظت کنید @@ -1809,7 +2022,7 @@ حذف‌کردن از اولویت پایین اضافه‌کردن به اولویت پایین در حال حاضر اتصال شبکه‌ای وجود ندارد - المنت برای ذخیره کلیدهای رمزنگاری سرتاسر شما بر روی حافظه نیاز به مجوز دارد. + المنت برای ذخیره کلیدهای رمزنگاری سرتاسر شما بر روی حافظه نیاز به مجوز دارد. \n \nلطفاً در پنجره بعدی اجازه دسترسی دهید تا بتوانید کلیدهای خود را به صورت دستی ذخیره کنید. این محتوا به عنوان محتوای نامناسب گزارش شده‌است. @@ -1851,10 +2064,10 @@ کد پیامکی به %s ارسال شده است. لطفاً کد تأیید موجود در آن را وارد کنید. سرور هویت‌سنجی‌ای که انتخاب کرده‌اید هیچگونه شرایط و ضوابطی ندارد. فقط اگر به صاحب سرویس اعتماد دارید ادامه دهید - سرور هویت‌سنجی شرایط و ضوابط استفاده ندارد - آدرس سرور هویت‌سنجی را وارد کنید - اتصال به سرور هویت‌سنجی امکان پذیر نیست - آدرس سرور هویت‌سنجی را وارد کنید + کارساز هویت، شرایط و ضوابط استفاده ندارد + لطفاً نشانی کارساز هویت را وارد کنید + نتوانست به کارساز هویت وصل شود + یک نشانی کارساز هویت وارد کنید ما یک ایمیل تأیید به %s ارسال کردیم، ابتدا ایمیل خود را بررسی کرده و روی لینک تأیید کلیک کنید ما یک ایمیل تأیید به %s ارسال کردیم، ایمیل خود را بررسی کرده و روی لینک تأیید کلیک کنید قطع ارتباط با سرور هویت‌سنجی به این معنی است که توسط کاربران دیگر قابل شناسایی نخواهید بود و نمی توانید دیگران را از طریق ایمیل یا تلفن دعوت کنید. @@ -1927,7 +2140,7 @@ با مقایسه‌کردن یک رشته‌ی متنی کوتاه تایید کنید. شما به دلیل اطلاعات نادرست حساب کاربری یا انقضای نشست از حساب خارج شدید. از پیکربندی استفاده کنید - المنت یک پیکربندی اختصاصی سرور برای دامنه‌ی شناسه‌ی کاربری شما \"%1$s\" تشخیص داده است: + المنت یک پیکربندی اختصاصی سرور برای دامنه‌ی شناسه‌ی کاربری شما \"%1$s\" تشخیص داده است: \n%2$s تکمیل خودکار گزینه‌های مربوط به سرور امضاء @@ -2004,14 +2217,14 @@ \n \nبرای جلوگیری از گم کردن کلیدهایتان، از آن‌ها به صورت امن، پشتیبان بگیرید. هیچ نشست ماتریکسی موجود نیست - اگر می خواهید المنت یک کلید بازیابی ایجاد کند، لطفاً عبارت عبور را حذف کنید. + اگر می خواهید المنت یک کلید بازیابی ایجاد کند، لطفاً عبارت عبور را حذف کنید. عبارت عبور بیش از حد ضعیف است لطفاً عبارت عبوری وارد کنید عبارت عبور، مطابق نبود ورود عبارت عبور تأیید عبارت عبور ایجاد عبارت عبور - APK معتبر Google Play Services پیدا نشد. اعلان‌ها ممکن است به درستی کار نکنند. + بستهٔ اندرویدی معتبر خدمات پلی گوگل پیدا نشد. ممکن است آگاهی‌ها درست کار نکنند. %d+ +%d %1$s: %2$s @@ -2038,7 +2251,7 @@ \nغیرفعال کردن حساب شما به طور پیش فرض باعث نمی شود پیام های ارسالی شما را حذف کنیم . اگر می خواهید پیام های شما را فراموش کنیم ، لطفاً کادر زیر را علامت بزنید. \n \nقابلیت مشاهده پیام در المنت مانند ایمیل است. حذف کردن پیام‌های شما به این معنی است که پیام‌هایی که ارسال کرده‌اید به هیچ کاربر جدید یا ثبت نشده‌ای نمایش داده نمی شود، اما کاربران ثبت‌نام شده که از قبل به این پیام ها دسترسی داشتند همچنان به نسخه خود دسترسی خواهند داشت. - برای ادامه استفاده از سرور %1$s باید شرایط و ضوابط را خوانده و موافقت کنید. + برای ادامهٔ استفاده از کارساز خانگی %1$s باید شرایط و ضوابط را خوانده و بپذیرید. Markdown غیرفعال شده است. Markdown فعال شده است. جهت رفع مشکلات مدیریت برنامه‌های ماتریکس @@ -2141,13 +2354,13 @@ به‌روزرسانی نام عمومی شناسه اطلاعات دستگاه - حالت صرفه‌جویی داده یک فیلتر خاص را اعمال می کند، که در نتیجه‌ی آن به‌روزرسانی‌های وضعیت آنلاین بودن و اعلان‌های تایپ فیلتر می شوند. + حالت صرفه‌جویی داده، پالایهٔ خاصی را اعمال می‌کند که در نتیجهٔ آن، به‌روزرسانی‌های حضور و آگاهی‌های نوشتن، پالوده می‌شوند. حالت صرفه‌جویی در مصرف دیتا بله ، من می خواهم کمک کنم! - لطفاً برای کمک به ما در بهبود المنت، ارسال ناشناس تجزیه و تحلیل را فعال کنید. - المنت برای داشتن اعلان‌های قابل اعتماد نیاز به فعالیت در پس زمینه دارد. + لطفاً برای کمک به ما در بهبود المنت، ارسال ناشناس تجزیه و تحلیل را فعال کنید. + المنت برای داشتن اعلان‌های قابل اعتماد نیاز به فعالیت در پس زمینه دارد. \nدر صفحه بعدی از شما خواسته می شود که المنت همیشه در پس زمینه اجرا شود ، لطفاً آن را بپذیرید. - المنت اطلاعاتی را جمع آوری می کند و با ارسال آنان به صورت ناشناس به ما امکان بهبود برنامه را می‌دهد. + المنت اطلاعاتی را جمع آوری می کند و با ارسال آنان به صورت ناشناس به ما امکان بهبود برنامه را می‌دهد. ارسال داده های تجزیه و تحلیل تجزیه و تحلیل مجوز دادن @@ -2162,7 +2375,7 @@ عبارت رمزی که فقط خودتان می‌دانید را وارد کرده و کلیدی برای پشتیبان تولید کنید. به هنوتم جایگزین، می‌توانید نشامی هر کارساز هویت دیگری را وارد کنید کارساز خانگیتان (%1$s) پیشنهاد استفاده از %2$s برای کارساز هویتتان را می‌دهد - برای محرمانگیتان، المنت تنها از فرستادن شماره تلفن و رایانامه‌های کاربری در هم ریخته پشتیبانی می‌کند. + برای محرمانگیتان، المنت تنها از فرستادن شماره تلفن و رایانامه‌های کاربری در هم ریخته پشتیبانی می‌کند. این عملیات ممکن نیست. کارساز خانگی منقضی شده است. نتوانستیم کاربران را دعوت کنیم. لطفاً کاربرانی که می‌خواهید دعوت کنید را بررسی کرده و دوباره تلاش کنید. نتوانستیم پیامتان را ایجاد کنیم. لطفاً کاربرانی که می‌خواهید دعوت کنید را بررسی کرده و دوباره تلاش کنید. @@ -2187,14 +2400,14 @@ رضایت کاربر فراهم نشده است. لطفاً نخست شرایط کارساز هویت را در تنظیمات بپذیرید. لطفاً نخست کارساز هویتی را پیکربندی کنید. - کارساز هویت منقضی شده اسن. المنت تنها نگارش ۲ از API را پشتیبانی می‌کند. + کارساز هویت منقضی شده اسن. المنت تنها نگارش ۲ از API را پشتیبانی می‌کند. این رمز را افراد هم‌رسانی کرده تا بتوانند برای افزودنتان و شروع گپ، بپویندش. رمزم هم‌رسانی رمزم پویش یک رمز QR این یک رمز QR ماتریکس معتبر نیست - 🔐️ پیوستن به من روی المنت - سلام. روی المنت باهام حرف بزن: %s + 🔐️ پیوستن به من روی المنت + سلام. روی المنت باهام حرف بزن: %s دعوت دوستان افزودن افراد "موضوع: " @@ -2315,4 +2528,137 @@ فرستادن پیام داده با برف فرستادن کاغذ رنگی 🎉 فرستادن برف ❄️ + احراز هویت انجام نشد + المنت برای انجام این عمل نیاز دارد که گذواژه‌ی خود را وارد کنید. + احراز هویت مجدد مورد نیاز است + کاربران + هنگام انتقال تماس خطایی روی داد + انتقال + متصل شوید + + ۱ تماس فعال (%1$s) . ۱ تماس متوقف شده + ۱ تماس فعال (%1$s) . %2$d تماس متوقف شده + + + تماس متوقف شده + %1$d تماس متوقف شده + + تماس فعال (%1$s) + هنگام جستجوی شماره تلفن خطایی روی داد + ‬پد شماره گیری + تماس بگیرید + این تماس پایان یافته است + %1$s تماس را رد کرد + شما این تماس را رد کردید %1$s + شما در حال حاضر در این تماس هستید + خطا در تنظیم امضای متقابل + %1$s یک تماس را شروع کرد + شما یک تماس را شروع کردید + شما تماس را در حالت انتظار قرار داده‌اید + %s تماس را در حالت انتظار قرار داده‌است + حالت انتظار + از سرگیری + غیر مجاز، اطلاعات هویت‌سنجی موجود نمی‌باشد + بازگشت + محتوای رخداد + رخداد وضعیتی ارسال شد! + رخداد ارسال شد! + رخداد معیوب + نوع پیام فراموش شده‌است + بدون محتوا + محتوای رخداد + کلید وضعیت + نوع + ارسال رخداد وضعیت سفارشی + ویرایش محتوا + رخدادهای وضعیتی + ارسال رخداد وضعیتی + ارسال رخداد سفارشی + کاوش وضعیت اتاق + ابزارهای توسعه + مشاهده رسیدهای خوانده‌شده + خبر نده + بدون صدا خبر بده + با صدا خبر بده + پیام به دلیل رخداد خطا ارسال نشد + تیک‌خورده + بستن پنجره ی شکلک‌ها + بازکردن پنجره‌ی شکلک‌ها + سطح اعتماد کامل + سطح اعتماد هشداری + سطح اعتماد پیش‌فرض + انتخاب‌شده + عکس + ویدئو + این اتاق حاوی پیش‌نویس‌هایی است که هنوز ارسال نشده‌اند + بعضی از پیام‌ها هنوز ارسال نشده‌اند + حذف نمایه + تغییر نمایه + واردکردن کلید از فایل + ابزارک‌های باز + اسکرین‌شات + ابتدا مشاوره بگیرید + + %d ورودی + %d ورودی + + این محدودیت ناشناخته است. + سرور شما فایل‌های ضمیمه (پرونده‌ها، فایل‌های چندرسانه‌ای و غیره) تا حجم %s را می‌پذیرد. + محدودیت بارگذاری فایل بر روی سرور + ورژن سرور + نام سرور + تنظیمات اتاق + آیا مایل به ترک جلسه‌ی فعلی و ورود به جلسه‌ی دیگری هستید؟ + ورژن اتاق + مقدار جدید + تعویض + شما نشانی‌های این اتاق را تغییر دادید. + %1$s نشانی‌های این اتاق را تغییر داد. + شما نشانی‌های اصلی و جایگزین این اتاق را تغییر دادید. + %1$s نشانی‌های اصلی و جایگزین این اتاق را تغییر داد. + شما نشانی‌های جایگزین این اتاق را تغییر دادید. + %1$s نشانی‌های جایگزین این اتاق را تغییر داد. + + شما نشانی جایگزین %1$s را برای این اتاق حذف کردید. + شما نشانی‌های جایگزین %1$s را برای این اتاق حذف کردید. + + + %1$s نشانی جایگزین %2$s را برای این اتاق حذف کرد. + %1$s نشانی‌های جایگزین %2$s را برای این اتاق حذف کرد. + + + شما نشانی جایگزین %1$s را برای این اتاق اضافه کردید. + شما نشانی‌های جایگزین %1$s را برای این اتاق اضافه کردید. + + + %1$s یک نشانی جایگزین %2$s را برای این اتاق اضافه کرد. + %1$s نشانی‌های جایگزین %2$s را برای این اتاق اضافه کرد. + + همگام‌سازی اولیه: +\nبارگیری داده‌ها… + همگام‌سازی اولیه: +\nمنتظر پاسخ سرور بمانید… + اتاق خالی (%s بود) + شما جلسه‌ی تصویری را تغییر دادید + جلسه‌ی تصویری توسط %1$s تغییر کرد + شما جلسه‌ی تصویری را شروع کردید + جلسه‌ی تصویری توسط %1$s آغاز گردید + جلسه‌ی تصویری توسط %1$s خاتمه یافت + شما به جلسه‌ی تصویری خاتمه دادید + 🎉 همه‌ی سرورها از مشارکت منع شده‌اند! این اتاق دیگر قابل استفاده نیست. + بدون تغییر. + لیترال‌های آی‌پی برای تطبیق سرور هم‌اکنون ممنوع شد. + لیترال‌های آی‌پی برای تطبیق سرور هم‌اکنون اجازه داده‌شد. + تطبیق سرور %s از لیست موارد مجاز حذف گردید. + تطبیق سرور %s هم‌اکنون اجازه داده‌شد. + تطبیق سرور %s از لیست ممنوعیت‌ها حذف شد. + تطبیق سرور %s هم‌اکنون ممنوع شد. + شما سطح کنترل دسترسی این اتاق را تغییر دادید. + لیترال‌های آی‌پی برای تطبیق سرور اجازه داده شده‌است. + %s سطح کنترل دسترسی‌ها برای این اتاق را بر روی سرور تنظیم کرد. + %s سطح کنترل دسترسی برای این اتاق را تغییر داد. + لیترال‌های آی‌پی برای تطبیق سرور ممنوع است. + تطبیق سرور %s اجازه داده شده‌است. + تطبیق سرور %s ممنوع شده‌است. + شما ACL های سرور را برای این اتاق تنظیم کردید. \ No newline at end of file diff --git a/vector/src/main/res/values-fi/strings.xml b/vector/src/main/res/values-fi/strings.xml index 3b945069f7..1661178b50 100644 --- a/vector/src/main/res/values-fi/strings.xml +++ b/vector/src/main/res/values-fi/strings.xml @@ -1,5 +1,213 @@ + %1$s lähetti kuvan. + Käyttäjän %s kutsu + %1$s kutsui käyttäjän %2$s + %1$s kutsui sinut + %1$s liittyi huoneeseen + %1$s poistui huoneesta + %1$s hylkäsi kutsun + %1$s poisti käyttäjän %2$s + %1$s poisti porttikiellon käyttäjältä %2$s + %1$s antoi porttikiellon käyttäjälle %2$s + %1$s veti takaisin kutsun käyttäjälle %2$s + %1$s vaihtoi profiilikuvaansa + %1$s asetti näyttönimekseen %2$s + %1$s muutti näyttönimensä nimestä %2$s nimeen %3$s + %1$s poisti näyttönimensä (%2$s) + %1$s vaihtoi aiheeksi: %2$s + %1$s vaihtoi huoneen nimeksi %2$s + %s soitti videopuhelun. + %s soitti äänipuhelun. + %s vastasi puheluun. + %s lopetti puhelun. + %1$s muutti tulevan huonehistorian näkyväksi seuraaville: %2$s + kaikki huoneen jäsenet, kutsumisestaan asti. + kaikki huoneen jäsenet, liittymisestään asti. + kaikki huoneen jäsenet. + kaikki. + tuntematon (%s). + %1$s otti käyttöön osapuolten välisen salauksen (%2$s) + %1$s lähetti VoIP-konferenssipyynnön + VoIP-konferenssi alkoi + VoIP-konferenssi päättyi + (myös kuva vaihdettiin) + %1$s poisti huoneen nimen + %1$s poisti huoneen aiheen + %1$s päivitti profiilinsa %2$s + %1$s lähetti liittymiskutsun huoneeseen käyttäjälle %2$s + %1$s hyväksyi kutsun käyttäjän %2$s puolesta + ** Salauksen purku epäonnistui: %s ** + Lähettäjän laite ei ole lähettänyt avaimia tähän viestiin. + Viestin lähetys epäonnistui + Kuvan lataaminen epäonnistui + Verkkovirhe + Matrix-virhe + Tällä hetkellä ei ole mahdollista liittyä uudelleen tyhjään huoneeseen. + Sähköpostiosoite + Puhelinnumero + Takaisinveto epäonnistui + %1$s: %2$s + + Kutsu käyttäjältä %s + + Huonekutsu + %1$s ja %2$s + Tyhjä huone + %1$s lähetti tarran. + + %1$s ja yksi muu + %1$s ja %2$d muuta + + Viesti poistettu + %1$s poisti viestin + Viesti poistettu [syy: %1$s] + %1$s poisti viestin [syy: %2$s] + Alkusynkronointi: +\nTuodaan tiliä… + Alkusynkronointi: +\nTuodaan kryptoa + Alkusynkronointi: +\nTuodaan huoneita + Alkusynkronointi: +\nTuodaan liityttyjä huoneita + Alkusynkronointi: +\nTuodaan kutsuttuja huoneita + Alkusynkronointi: +\nTuodaan poistuttuja huoneita + Alkusynkronointi: +\nTuodaan yhteisöjä + Alkusynkronointi: +\nTuodaan tilin tietoja + %s päivitti tämän huoneen. + Lähetetään viestiä… + Tyhjennä lähetysjono + %1$s veti takaisin käyttäjän %2$s liittymiskutsun huoneeseen + Henkilön %1$s kutsu. Syy: %2$s + %1$s kutsui henkilön %2$s. Syy: %3$s + %1$s kutsui sinut. Syy: %2$s + %1$s liittyi huoneeseen. Syy: %2$s + %1$s poistui huoneesta. Syy: %2$s + %1$s hylkäsi kutsun. Syy: %2$s + %1$s poisti käyttäjän %2$s huoneesta. Syy: %3$s + %1$s poisti porttikiellon käyttäjältä %2$s. Syy: %3$s + %1$s antoi porttikiellon käyttäjälle %2$s. Syy: %3$s + %1$s lähetti kutsun liittyä huoneeseen käyttäjälle %2$s. Syy: %3$s + %1$s kumosi kutsun liittyä huoneeseen käyttäjälle %2$s. Syy: %3$s + %1$s hyväksyi kutsun liityäkseen huoneeseen %2$s. Syy: %3$s + %1$s veti takaisin käyttäjän %2$s kutsun. Syy: %3$s + + %1$s lisäsi tälle huoneelle osoitteen %2$s. + %1$s lisäsi tälle huoneelle osoitteet %2$s. + + + %1$s poisti tältä huoneelta osoitteen %2$s. + %1$s poisti tältä huoneelta osoitteet %3$s. + + %1$s lisäsi tälle huoneelle osoitteen %2$s ja poisti osoitteen %3$s. + %1$s asetti tämän huoneen pääosoitteeksi %2$s. + %1$s poisti tämän huoneen pääosoitteen. + %1$s salli vieraiden liittyä huoneeseen. + %1$s esti vieraita liittymästä huoneeseen. + %1$s laittoi päälle osapuolten välisen salauksen. + %1$s laittoi päälle osapuolisten välisen salauksen (tuntematon algoritmi %2$s). + Hyväksyit käyttäjän %1$s kutsun. Syy: %2$s + Peruutit kutsun liittyä huoneeseen käyttäjältä %1$s. Syy: %2$s + Lähetit kutsun liittyä huoneeseen käyttäjälle %1$s. Syy: %2$s + Estit käyttäjän %1$s. Syy: %2$s + Peruutit eston %1$s. Syy: %2$s + Poistit käyttäjän %1$s. Syy: %2$s + Hylkäsit kutsun. Syy: %1$s + Lähdit. Syy: %1$s + %1$s lähti. Syy: %2$s + Poistuit huoneesta. Syy: %1$s + Liityit. Syy: %1$s + %1$s liittyi. Syy: %2$s + Liityit ryhmään. Syy: %1$s + Kutsuit %1$s. Syy: %2$s + Kutsusi. Syy: %1$s + Tyhjä huone (oli %s) + %1$s, %2$s, %3$s ja %4$s + %1$s, %2$s ja %3$s + Mukautettu + Mukautettu (%1$d) + Oletus + Valvoja + Ylläpitäjä + %1$s muutti %2$s sovelmaa + Poistit %1$s sovelman + %1$s poisti %2$s sovelman + Lisäsit %1$s sovelman + %1$s lisäsi %2$s sovelman + Muutit %1$s sovelmaa + Hyväksyit kutsun henkilölle %1$s + Peruutit kutsun henkilöltä %1$s + %1$s peruutti kutsun henkilöltä %2$s + Peruutit henkilön %1$s kutsun liittyä ryhmään + Kutsuit %1$s + %1$s kutsui %2$s + Lähetit henkilölle %1$s kutsun liittyä huoneeseen + Päivitit profiilisi %1$s + Poistit huoneen profiilikuvan + %1$s poisti huoneen profiilikuvan + Poistit huoneen aiheen + Poistit huoneen nimen + Pyysit ryhmäpuhelua + 🎉 Kaikki palvelimet on estetty osallistumasta! Tätä huonetta ei voi enää käyttää. + Ei muutosta. + • Palvelimet jotka %s poistettiin estolistalta. + • Palvelimen haku %s on nyt kielletty. + • Palvelimen haku %s on sallittu. + • Palvelimen haku %s on kielletty. + %1$s on estänyt vieraita liittymästä huoneeseen. + Estit vieraita liittymästä huoneeseen. + Annoit vieraille luvan liittyä huoneeseen. + Annoit vieraille luvan liittyä tänne. + %1$s on antanut vieraille luvan liittyä tänne. + Poistit tämän huoneen pääosoitteen. + Otit käyttöön päästä päähän -salauksen. + Olet estänyt vieraiden liittymisen huoneeseen. + Otit päästä päähän -salauksen käyttöön (tuntematon algoritmi %1$s). + Päivitit tässä. + %s päivitti täällä. + Päivitit tämän huoneen. + Otit päästä päähän -salauksen käyttöön (%1$s) + Teit tulevista viesteistä näkyviä käyttäjälle %1$s + %1$s teki tulevista viesteistä näkyviä käyttäjälle %2$s + Teit tulevan huonehistorian näkyväksi %1$s + Lopetit puhelun. + Vastasit puheluun. + Lähetit tietoja puhelun valmistelemiseksi. + %s lähetti tietoja puhelun valmistelemiseksi. + Aloitit äänipuhelun. + Aloitit videopuhelun. + Vaihdoit huoneen nimeksi: %1$s + Vaihdoit huoneen profiilikuvaa + %1$s muutti huoneen profiilikuvaa + Vaihdoit aiheen: %1$s + Poistit nimimerkkisi (se oli %1$s) + Vaihdoit nimimerkkisi %1$s nimeen %2$s + Asetit nimimerkiksesi %1$s + Kutsusi + Vaihdoit profiilikuvaasi + Peruutit %1$sn kutsun + Estit %1$s + Poistit eston %1$s + Poistit %1$s + Hylkäsit kutsun + Poistuit huoneesta + %1$s poistui huoneesta + Poistuit huoneesta + Liityit + %1$s liittyi + Liityit huoneeseen + Kutsuit %1$s + Loit keskustelun + %1$s loi keskustelun + Loit huoneen + %1$s loi huoneen + Lähetit tarran. + Lähetit kuvan. Viestit Huone @@ -74,7 +282,7 @@ Paikalliset yhteystiedot Ainoastaan Matrix-yhteyshenkilöt Ei keskusteluita - Et ole sallinut Elementille pääsyä paikallisiin yhteystietoihisi + Et ole sallinut ${app_name}ille pääsyä paikallisiin yhteystietoihisi Ei tuloksia Huoneet @@ -222,22 +430,22 @@ Huomio - Element tarvitsee käyttöluvan mediagalleriaasi lähettäkseen liitteitä.\n\nSalli tiedostojen käyttö seuraavalla näytöllä liittääksesi kuvia ja muita tiedostoja viesteihin. - Element tarvitsee käyttöluvan kameraan ottaakseen kuvia ja suorittakseen videopuheluita. + ${app_name} tarvitsee käyttöluvan mediagalleriaasi lähettäkseen liitteitä.\n\nSalli tiedostojen käyttö seuraavalla näytöllä liittääksesi kuvia ja muita tiedostoja viesteihin. + ${app_name} tarvitsee käyttöluvan kameraan ottaakseen kuvia ja suorittakseen videopuheluita. " \n \nSoittaaksesi videopuhelun, salli seuraavassa ponnahdusikkunassa sovelluksen käyttää kameraa." - Element tarvitsee käyttöluvan mikrofoniin suorittakseen puheluita. + ${app_name} tarvitsee käyttöluvan mikrofoniin suorittakseen puheluita. " \n \nSoittaaksesi äänipuhelun, salli seuraavassa ponnahdusikkunassa sovelluksen käyttää mikrofonia." - Element tarvitsee käyttöluvan kameraan ja mikrofoniin suorittakseen videopuheluita. + ${app_name} tarvitsee käyttöluvan kameraan ja mikrofoniin suorittakseen videopuheluita. \n \nSalli mikrofonin ja kameran käyttö seuraavilla näytöillä aloittaaksesi tämän puhelun. - Element voi tarkistaa yhteystietosi löytääkseen muita Matrixin käyttäjiä sähköpostiosoitteiden ja puhelinnumeroiden perusteella. Jos suostut jakamaan yhteystietosi tätä tarkoitusta varten, salli yhteystietojen käyttö seuraavassa ponnahdusikkunassa. - Element pystyy käyttämään yhteystietojasi, etsiäkseen muita Matrix-käyttäjiä sähköpostiosoitteiden sekä puhelinnumeroiden perusteella. + ${app_name} voi tarkistaa yhteystietosi löytääkseen muita Matrixin käyttäjiä sähköpostiosoitteiden ja puhelinnumeroiden perusteella. Jos suostut jakamaan yhteystietosi tätä tarkoitusta varten, salli yhteystietojen käyttö seuraavassa ponnahdusikkunassa. + ${app_name} pystyy käyttämään yhteystietojasi, etsiäkseen muita Matrix-käyttäjiä sähköpostiosoitteiden sekä puhelinnumeroiden perusteella. \n -\nSaako Element käyttää yhteystietojasi tätä varten\? +\nSaako ${app_name} käyttää yhteystietojasi tätä varten\? Toimenpide epäonnistui puuttuvien käyttölupien takia Tallennettu @@ -613,7 +821,7 @@ Yhteydetön Vaalea teema Tumma teema - Musta teema + Musta teema Synkronoidaan… Kuunnellaan tapahtumia Äänekkäät ilmoitukset @@ -715,7 +923,6 @@ Salasana Kirjoita salasanasi jatkaaksesi: Kirjoita salasanasi. - Status.im-teema Lähetä kirjoitusilmoitukset Näytä lukukuittaukset Näytä liittymiset ja poistumiset @@ -768,12 +975,12 @@ Pyydä salausavaimia uudelleen muista istunnoistasi. Avainpyyntö lähetetty. Pyyntö lähetetty - Käynnistä Element toisella laitteella, joka voi purkaa viestin, jotta se voi lähettää avaimet tähän istuntoon. + Käynnistä ${app_name} toisella laitteella, joka voi purkaa viestin, jotta se voi lähettää avaimet tähän istuntoon. yksi jäsenyysmuutos %d jäsenyysmuutosta - Käytä Elementin oletussoittoääntä saapuville puheluille + Käytä ${app_name}in oletussoittoääntä saapuville puheluille Saapuvien puheluiden soittoääni Videopuhelu menossa… Käyttäjälista @@ -850,8 +1057,8 @@ Ota käyttöön Istunnon asetukset. Ilmoitukset ovat käytössä tässä istunnossa. - Ilmoitukset eivät ole käytössä tässä istunnossa. -\nTarkista Elementin asetukset. + Ilmoitukset eivät ole käytössä tässä istunnossa. +\nTarkista ${app_name}in asetukset. Ota käyttöön Mukautetut asetukset. Huomaathan, että osa viestityypeistä on asetettu olemaan hiljaisia (tuottavat ilmoituksen ilman ääntä). @@ -860,7 +1067,7 @@ Tarkista asetukset Play Services -palvelun tarkistus Google Play Services APK on saatavilla ja ajan tasalla. - Element käyttää Google Play Services -palvelua ilmoitusten välittämiseen, mutta se ei näytä olevan määritetty oikein: + ${app_name} käyttää Google Play Services -palvelua ilmoitusten välittämiseen, mutta se ei näytä olevan määritetty oikein: \n%1$s Korjaa Play Services -palvelu Firebase-tunniste @@ -868,12 +1075,12 @@ \n%1$s FCM-tunnisteen haku epäonnistui: \n%1$s - [%1$s] -\nElement ei voi vaikuttaa tähän virheeseen, ja Googlen mukaan tämä virhe tarkoittaa, että tällä laitteella on liikaa FCM:ään rekisteröityjä sovelluksia. Tämä virhe ilmenee vain tapauksissa, joissa on erittäin paljon FCM:ään rekisteröityjä sovelluksia asennettuna, joten tätä ei pitäisi tapahtua normaalisti. - [%1$s] -\nTämä virhe ei ole Elementin ratkaistavissa. Se voi johtua useasta eri syystä. Ehkä tämä toimii, jos yrität myöhemmin. Voit myös tarkistaa, että Google Play Services -palvelu ei ole rajoitettuna järjestelmäasetuksissa, ja että laitteesi kello on oikein. Tämä voi tapahtua myös mukautetun käyttöjärjestelmän kanssa. - [%1$s] -\nTämä virhe ei ole Elementin ratkaistavissa. Tässä puhelimessa ei ole Google-tiliä. Lisää laitteeseesi Google-tili tätä toimintoa varten. + [%1$s] +\n${app_name} ei voi vaikuttaa tähän virheeseen, ja Googlen mukaan tämä virhe tarkoittaa, että tällä laitteella on liikaa FCM:ään rekisteröityjä sovelluksia. Tämä virhe ilmenee vain tapauksissa, joissa on erittäin paljon FCM:ään rekisteröityjä sovelluksia asennettuna, joten tätä ei pitäisi tapahtua normaalisti. + [%1$s] +\nTämä virhe ei ole ${app_name}in ratkaistavissa. Se voi johtua useasta eri syystä. Ehkä tämä toimii, jos yrität myöhemmin. Voit myös tarkistaa, että Google Play Services -palvelu ei ole rajoitettuna järjestelmäasetuksissa, ja että laitteesi kello on oikein. Tämä voi tapahtua myös mukautetun käyttöjärjestelmän kanssa. + [%1$s] +\nTämä virhe ei ole ${app_name}in ratkaistavissa. Tässä puhelimessa ei ole Google-tiliä. Lisää laitteeseesi Google-tili tätä toimintoa varten. Lisää tili Tunnisteen rekisteröinti FCM-tunniste rekisteröity onnistuneesti kotipalvelimelle. @@ -889,17 +1096,17 @@ Palvelun uudelleenkäynnistäminen epäonnistui Käynnistä laitteen käynnistyessä Palvelu käynnistetään, kun laite käynnistetään uudelleen. - Palvelua ei käynnistetä laitteen uudelleenkäynnistyksen yhteydessä. Et tule saamaan ilmoituksia ennen kuin Element on käynnistetty uudelleen. + Palvelua ei käynnistetä laitteen uudelleenkäynnistyksen yhteydessä. Et tule saamaan ilmoituksia ennen kuin ${app_name} on käynnistetty uudelleen. Ota käyttöön automaattinen käynnistys Tarkista taustapalveluiden rajoitukset - Taustapalveluiden rajoitukset ovat pois käytöstä. Tämä testi tulee ajaa mobiilidatayhteydellä (ilman wlania). + Taustapalveluiden rajoitukset ovat pois käytöstä. Tämä testi tulee ajaa mobiilidatayhteydellä (ilman wlania). \n%1$s - Taustapalveluiden rajoitukset ovat käytössä. -\nTyötä, jota Element yrittää tehdä, rajoitetaan aggressiivisesti, kun se on taustalla, mikä saattaa vaikuttaa ilmoituksiin. + Taustapalveluiden rajoitukset ovat käytössä. +\nTyötä, jota ${app_name} yrittää tehdä, rajoitetaan aggressiivisesti, kun se on taustalla, mikä saattaa vaikuttaa ilmoituksiin. \n%1$s Poista rajoitukset Akunkäytön optimointi - Akunkäytön optimointi ei vaikuta Elementin toimintaan. + Akunkäytön optimointi ei vaikuta ${app_name}in toimintaan. Jos käyttäjä jättää laitteen paikalleen ilman latausjohtoa niin, että näyttö on pois päältä, laite siirtyy torkkutilaan. Tämä estää sovelluksia käyttämästä verkkoyhteyksiä ja lykkää niiden töitä, synkronointeja ja perushälytyksiä. Jätä optimointi huomiotta Normaali @@ -922,15 +1129,15 @@ Ei vaikuta kutsuihin, poistamisiin ja porttikieltoihin. Sisältää hahmokuvat ja näyttönimien vaihdot. Ilmoitusten yksityisyys - Element voi ajaa itseään taustalla hallitakseen sinulle näytettäviä ilmoituksia turvallisesti ja yksityisesti. Tämä voi vaikuttaa akunkäyttöön. + ${app_name} voi ajaa itseään taustalla hallitakseen sinulle näytettäviä ilmoituksia turvallisesti ja yksityisesti. Tämä voi vaikuttaa akunkäyttöön. Anna oikeus Valitse toinen vaihtoehto Taustayhteys - Elementin tarvitsee käyttää taustayhteyttä, jotta se voi näyttää luotettavia ilmoituksia. -\nSeuraavalla ruudulla sinulta kysytään lupaa, jotta Element voi pitää itsensä käynnissä taustalla. + ${app_name}in tarvitsee käyttää taustayhteyttä, jotta se voi näyttää luotettavia ilmoituksia. +\nSeuraavalla ruudulla sinulta kysytään lupaa, jotta ${app_name} voi pitää itsensä käynnissä taustalla. Anna oikeus - Element kerää anonyymiä analytiikkaa sovelluksen parantamiseksi. - Otathan analytiikan käyttöön Elementin parantamiseksi. + ${app_name} kerää anonyymiä analytiikkaa sovelluksen parantamiseksi. + Otathan analytiikan käyttöön ${app_name}in parantamiseksi. Kyllä, haluan auttaa! Datansäästötila ottaa käyttöön erityisen suodattimen, joka poistaa paikallaoloilmoitukset ja kirjoittamisen ilmoitukset. Sähköpostiasi varmennettaessa tapahtui virhe. @@ -1029,7 +1236,7 @@ Salalause ei täsmää Syötä salalause Salalause on liian heikko - Poista salalause, jos haluat Element generoivan palautusavaimen. + Poista salalause, jos haluat ${app_name} generoivan palautusavaimen. Matrix-istuntoa ei ole saatavilla Älä koskaan menetä salattuja viestejä Salatuissa huoneissa viestit ovat suojattuna osapuolten välisellä salauksella. Vain sinä ja vastaanottaja(t) omistavat avaimet näiden viestien lukemiseen. @@ -1145,7 +1352,7 @@ \nJos et asettanut uutta palautustapaa, hyökkääjä saattaa yrittää päästä käsiksi tiliisi. Vaihda tilisi salasana ja aseta uusi palautustapa asetuksissa välittömästi. Epäkelpo kotipalvelimen löytövastaus Automaattitäydennyksen palvelinasetukset - Element löysi mukautetun palvelinasetuksen userId:si domainille ”%1$s”: + ${app_name} löysi mukautetun palvelinasetuksen userId:si domainille ”%1$s”: \n%2$s Käytä asetuksia Alustetaan palvelua @@ -1222,7 +1429,7 @@ Odota… Kaikki yhteisöt Tätä huonetta ei voi esikatsella - Element ei vielä tue täysin julkisen huoneen esikatselua + ${app_name} ei vielä tue täysin julkisen huoneen esikatselua Huoneet Yksityisviestit Uusi huone @@ -1367,11 +1574,11 @@ Kokeile käyttää palvelinta %s Käyttää palvelinta %s apupalvelimena, jos kotipalvelimesi ei tarjoa sellaista (IP-osoitteesi näkyy palvelimelle puhelun aikana) Optimoitu akunkestoa varten - Element synkronoi taustalla laitteen rajallisia resursseja (akkua) säästäen. + ${app_name} synkronoi taustalla laitteen rajallisia resursseja (akkua) säästäen. \nLaitteesi resurssien tilasta riippuen käyttöjärjestelmä saattaa lykätä synkronointia. Optimoitu reaaliaikaa varten - Element synkronoi taustalla täsmällisin aikavälein (säädettävä). -\nTämä vaikuttaa radion ja akun käyttöön. Näet pysyvän ilmoituksen, joka kertoo, että Element kuuntelee tapahtumia. + ${app_name} synkronoi taustalla täsmällisin aikavälein (säädettävä). +\nTämä vaikuttaa radion ja akun käyttöön. Näet pysyvän ilmoituksen, joka kertoo, että ${app_name} kuuntelee tapahtumia. Viestimuokkaukset Ole löydettävissä Tekstiviesti on lähetetty numeroon %s. Syötä sen sisältämä varmistuskoodi. @@ -1473,7 +1680,7 @@ Tämä sisältö on ilmiannettu epäsopivana. \n \nJos et halua nähdä enempää sisältöä tältä käyttäjältä, voit estää hänet piilottaaksesi hänen viestit. - Element tarvitsee oikeuden tallentaakseen osapuolten välisen salauksen avaimesi talteen. + ${app_name} tarvitsee oikeuden tallentaakseen osapuolten välisen salauksen avaimesi talteen. \n \nSalli pääsy tiedostoihin seuraavassa ponnahdusikkunassa, jotta voit viedä avaimesi käsin. Tämä ei ole kelvollinen Matrix-palvelimen osoite @@ -1607,11 +1814,10 @@ \nKirjaudu sisään päästäksesi käsiksi tunnuksesi tietoihin ja viesteihin. Menetät pääsyn salattuihin viesteihisi ellet kirjaudu sisään palauttaaksesi salausavaimesi. Poista tiedot - Nykyinen istunto on käyttäjälle %1$s, ja yritit kirjautuas isään käyttäjälle %2$s. Element ei tue tätä. -\nPoista ensin tietosi ja kirjaudu sen jälkeen toisella tunnuksella. Voit vaihtoehtoisesti käyttää Elementin selainversiota. + Nykyinen istunto on käyttäjälle %1$s, ja yritit kirjautuas isään käyttäjälle %2$s. ${app_name} ei tue tätä. +\nPoista ensin tietosi ja kirjaudu sen jälkeen toisella tunnuksella. Voit vaihtoehtoisesti käyttää ${app_name}in selainversiota. matrix.to-linkkisi oli epämuodostunut Kuvaus on liian lyhyt - Syötä palvelin tai sen Elementin osoite, mihin haluat yhdistää Se voi johtua monesta eri syystä: \n \n• olet vaihtanut salasanasi toisella laitteella @@ -1650,7 +1856,7 @@ Ravista puhelintasi testataksesi tunnistusrajan Ravistus tunnistettu! Näytetään vain ensimmäiset tulokset, kirjoita lisää kirjaimia… - Element voi kaatuilla tavallista useammin odottamattomien virheiden vuoksi + ${app_name} voi kaatuilla tavallista useammin odottamattomien virheiden vuoksi Lisää ¯\\_(ツ)_/¯ tavallisen viestin alkuun Käyttämäsi sähköpostipalvelun ei ole sallittu rekisteröityä tälle palvelimelle Täsmäävät @@ -1700,9 +1906,9 @@ Ylläpitäjä %1$s:ssä Valvoja %1$s:ssä Siirry lukukuittaukseen - Element ei osaa käsitellä tapahtumia joiden tyyppi on \'%1$s\' - Element ei osaa käsitellä viestejä joiden tyyppi on \'%1$s\' - Element ei osannut piirtää tapahtuman jonka tunniste on \'%1$s\' sisältöä + ${app_name} ei osaa käsitellä tapahtumia joiden tyyppi on \'%1$s\' + ${app_name} ei osaa käsitellä viestejä joiden tyyppi on \'%1$s\' + ${app_name} ei osannut piirtää tapahtuman jonka tunniste on \'%1$s\' sisältöä Viimeaikaiset huoneet Muut huoneet Lähettää annetun viestin väritettynä sateenkaaren väreillä @@ -1772,7 +1978,7 @@ Käyttäjä poistanut tapahtuman, syynä: %1$s Tapahtuma moderoitu huoneen ylläpitäjän toimesta, syynä: %1$s Avaimet ovat jo ajan tasalla! - Element Android + ${app_name} Android Avainpyynnöt Päivitä Uusi kirjautuminen. Olitko se sinä\? @@ -1851,7 +2057,7 @@ Kaiutin Puhelin Valitse äänilaite - Element-puhelu epäonnistui + ${app_name}-puhelu epäonnistui Lähetä avaimen jakopyyntöjen historia Ei enempää tuloksia Ilmoitukset @@ -2014,7 +2220,6 @@ Asetukset Äänestys Koodi - element Aihe Rooli KUTSU diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 2d11932681..315e3fe978 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -1,5 +1,239 @@ + %1$s : %2$s + %1$s a envoyé une image. + invitation de %s + %1$s a invité %2$s + %1$s vous a invité + %1$s a rejoint le salon + %1$s est parti du salon + %1$s a rejeté l’invitation + %1$s a expulsé %2$s + %1$s a révoqué le bannissement de %2$s + %1$s a banni %2$s + %1$s a annulé l’invitation de %2$s + %1$s a changé d’avatar + %1$s a modifié son nom d’affichage en %2$s + %1$s a modifié son nom d’affichage de %2$s en %3$s + %1$s a supprimé son nom d’affichage (précédemment %2$s) + %1$s a changé le sujet en : %2$s + %1$s a changé le nom du salon en : %2$s + %s a passé un appel vidéo. + %s a passé un appel audio. + %s a répondu à l’appel. + %s a raccroché. + %1$s a rendu l’historique futur du salon visible pour %2$s + tous les membres du salon, depuis qu’ils ont été invités. + tous les membres du salon, depuis qu’ils l’ont rejoint. + tous les membres du salon. + n’importe qui. + inconnu (%s). + %1$s a activé le chiffrement de bout en bout (%2$s) + %1$s a demandé une téléconférence VoIP + Téléconférence VoIP démarrée + Téléconférence VoIP terminée + (l’avatar a aussi changé) + %1$s a supprimé le nom du salon + %1$s a supprimé le sujet du salon + %1$s a mis à jour son profil %2$s + %1$s a envoyé une invitation à %2$s pour rejoindre le salon + %1$s a accepté l’invitation de %2$s + ** Déchiffrement impossible : %s ** + L’appareil de l’expéditeur ne nous a pas envoyé les clés pour ce message. + Effacement impossible + Envoi du message impossible + L’envoi de l’image a échoué + Erreur de réseau + Erreur de Matrix + Il est impossible pour le moment de revenir dans un salon vide. + Adresse e-mail + Numéro de téléphone + %1$s a envoyé un autocollant. + Invitation de %s + Invitation au salon + Salon vide + %1$s et %2$s + + %1$s et 1 autre + %1$s et %2$d autres + + Message supprimé + Message supprimé par %1$s + Message supprimé [motif : %1$s] + Message supprimé par %1$s [motif : %2$s] + Synchronisation initiale : +\nImportation du compte… + Synchronisation initiale : +\nImportation de la cryptographie + Synchronisation initiale : +\nImportation des salons + Synchronisation initiale : +\nImportation des salons que vous avez rejoints + Synchronisation initiale : +\nImportation des salons où vous avez été invité + Synchronisation initiale : +\nImportation des salons que vous avez quittés + Synchronisation initiale : +\nImportation des communautés + Synchronisation initiale : +\nImportation des données du compte + %s a mis à niveau ce salon. + Envoi du message… + Vider la file d’envoi + %1$s a révoqué l’invitation de %2$s à rejoindre le salon + Invitation de %1$s. Raison : %2$s + %1$s a invité %2$s. Raison : %3$s + %1$s vous a invité. Raison : %2$s + %1$s a rejoint le salon. Raison : %2$s + %1$s est parti du salon. Raison : %2$s + %1$s a refusé l’invitation. Raison : %2$s + %1$s a expulsé %2$s. Raison : %3$s + %1$s a révoqué le bannissement de %2$s. Raison : %3$s + %1$s a banni %2$s. Raison : %3$s + %1$s a envoyé une invitation à %2$s à rejoindre le salon. Raison : %3$s + %1$s a révoqué l’invitation de %2$s à rejoindre le salon. Raison : %3$s + %1$s a accepté l’invitation de %2$s. Raison : %3$s + %1$s a annulé l’invitation de %2$s. Raison : %3$s + + %1$s a ajouté %2$s comme adresse pour ce salon. + %1$s a ajouté %2$s comme adresses pour ce salon. + + + %1$s a supprimé %2$s comme adresse pour ce salon. + %1$s a supprimé %3$s comme adresses pour ce salon. + + %1$s a ajouté %2$s et supprimé %3$s comme adresses pour ce salon. + %1$s a défini %2$s comme adresse principale pour ce salon. + %1$s a supprimé l’adresse principale de ce salon. + %1$s a autorisé les visiteurs à rejoindre le salon. + %1$s a empêché les visiteurs de rejoindre le salon. + %1$s a activé le chiffrement de bout en bout. + %1$s a activé le chiffrement de bout en bout (algorithme %2$s inconnu). + %1$s a créé le salon + Vous avez mis cet endroit à niveau. + %s a mis cet endroit à niveau. + Vous avez mis à niveau ce salon. + Vous avez expulsé %1$s + Vous avez rejeté l’invitation + Vous avez quitté le salon + %1$s a quitté le salon + Vous avez quitté le salon + Vous avez rejoint le salon + %1$s a rejoint le salon + Vous avez rejoint le salon + Vous avez invité %1$s + Vous avez créé la conversation + %1$s a créé la conversation + Vous avez créé le salon + Votre invitation + Vous avez envoyé un autocollant. + Vous avez envoyé une image. + Vous avez activé le chiffrement de bout en bout (algorithme %1$s inconnu). + Vous avez activé le chiffrement de bout en bout. + Vous avez empêché les visiteurs de rejoindre le salon. + %1$s a empêché les visiteurs de rejoindre le salon. + Vous avez empêché les visiteurs de rejoindre le salon. + Vous avez autorisé les visiteurs à venir ici. + %1$s a autorisé les visiteurs à venir ici. + Vous avez autorisé les visiteurs à rejoindre le salon. + Vous avez supprimé l’adresse principale de ce salon. + Vous avez défini %1$s comme adresse principale pour ce salon. + Vous avez ajouté %1$s et supprimé %2$s comme adresses pour ce salon. + + Vous avez supprimé %1$s comme adresse pour ce salon. + Vous avez supprimé %1$s comme adresses pour ce salon. + + + Vous avez ajouté %1$s comme adresse pour ce salon. + Vous avez ajouté %1$s comme adresses pour ce salon. + + Vous avez annulé l’invitation de %1$s. Raison : %2$s + Vous avez accepté l’invitation de %1$s. Raison : %2$s + Vous avez révoqué l’invitation de %1$s à rejoindre le salon. Raison : %2$s + Vous avez envoyé une invitation à %1$s à rejoindre le salon. Raison : %2$s + Vous avez refusé l’invitation. Raison : %1$s + Vous êtes parti. Raison : %1$s + %1$s est parti. Raison : %2$s + Vous êtes parti du salon. Raison : %1$s + %1$s rejoint. Raison : %2$s + Vous avez rejoint. Raison : %1$s + Vous avez rejoint le salon. Raison : %1$s + Vous avez invité %1$s. Raison : %2$s + Votre invitation. Raison : %1$s + %1$s de %2$s à %3$s + %1$s a modifié le rang de %2$s. + Vous avez modifié le rang de %1$s. + Personnalisé + Personnalisé (%1$d) + Défaut + Modérateur + Admin + Vous avez modifié le widget %1$s + %1$s a modifié le widget %2$s + Vous avez supprimé le widget %1$s + %1$s a supprimé le widget %2$s + Vous avez ajouté le widget %1$s + %1$s a ajouté le widget %2$s + Vous avez accepté l’invitation de %1$s + Vous avez révoqué l’invitation de %1$s + %1$s a révoqué l’invitation de %2$s + Vous avez rendu les futurs messages visible pour %1$s + %1$s a rendu les futurs messages visible pour %2$s + Vous avez supprimé l’avatar du salon + %1$s a supprimé l’avatar du salon + Vous avez supprimé le nom du salon + Vous avez demandé une téléconférence VoIP + Vous avez activé le chiffrement de bout en bout (%1$s) + Vous avez rendu l’historique futur du salon visible pour %1$s + Vous avez raccroché. + Vous avez répondu à l’appel. + Vous avez envoyé les données pour configurer l’appel. + %s a envoyé les données pour configurer l’appel. + Vous avez passé un appel audio. + Vous avez passé un appel vidéo. + Vous avez changé le nom du salon en : %1$s + Vous avez modifié l’avatar du salon + %1$s a modifié l’avatar du salon + Vous avez modifié votre nom d’affichage de %1$s en %2$s + Vous avez modifié votre nom d’affichage en %1$s + Vous avez changé votre avatar + Vous avez annulé l’invitation de %1$s + Vous avez changé le sujet en : %1$s + Vous avez supprimé votre nom d’affichage (précédemment %1$s) + Vous avez révoqué l’invitation de %1$s à rejoindre le salon + Vous avez invité %1$s + %1$s a invité %2$s + Vous avez envoyé une invitation à %1$s pour rejoindre le salon + Vous avez mis à jour votre profil %1$s + Vous avez supprimé le sujet du salon + Vous avez banni %1$s. Raison : %2$s + Vous avez révoqué le bannissement de %1$s. Raison : %2$s + Vous avez banni %1$s + Vous avez révoqué le bannissement de %1$s + Vous avez expulsé %1$s. Raison : %2$s + Salon vide (était %s) + + %1$s, %2$s, %3$s et %4$d autre + %1$s, %2$s, %3$s et %4$d autres + + %1$s, %2$s, %3$s et %4$s + %1$s, %2$s et %3$s + 🎉 Tous les serveurs sont interdits de participation ! Ce salon ne peut plus être utilisé. + Aucun changement. + • Les serveurs correspondant à des IP littérales sont maintenant interdits. + • Les serveurs correspondant à %s sont interdits. + • Les serveurs correspondants à des IP littérales sont interdites. + • Les serveurs correspondants à des IP littérales sont autorisés. + • Les serveurs correspondants à des IP littérales sont maintenant autorisés. + • Les serveurs correspondant à %s sont supprimés de la liste autorisée. + • les serveur correspondant à %s sont maintenant autorisés. + • Les serveurs correspondant à %s étaient supprimés de la liste des interdits. + • Les serveurs correspondant à %s sont maintenant interdits. + Vous avez changé les droits ACL du serveur pour ce salon. + %s a changé les droits ACL du serveur pour ce salon. + • Les serveurs correspondant à %s sont autorisés. + Vous avez paramétré les ACL pour ce salon. + %s paramètre les autorisations étendues (ACL) du serveur pour ce salon. Messages Paramètres Informations sur ce participant @@ -21,18 +255,18 @@ Appel en cours Téléconférence en cours. \nLa rejoindre en %1$s ou en %2$s - Audio + audio vidéo Impossible d’initier l’appel, réessayez plus tard En raison de permissions manquantes, certaines fonctionnalités peuvent être absentes… - Vous avez besoin de la permission d’invitation pour initier une téléconférence dans ce salon - Impossible d’initier l’appel + Vous avez besoin de la permission d’invitation pour lancer une téléconférence dans ce salon + Impossible de lancer l’appel Informations sur la session Les téléconférences ne sont pas prises en charge dans les salons chiffrés ou Inviter Se déconnecter - Appel vocal + Appel audio Appel vidéo Recherche globale Tout marquer comme lu @@ -58,7 +292,7 @@ Carnet d’adresses local Contacts Matrix uniquement Aucune discussion - Vous n’avez pas autorisé Element à accéder à vos contacts locaux + Vous n’avez pas autorisé ${app_name} à accéder à votre carnet d’adresses Aucun résultat Salons Répertoire de salons @@ -84,7 +318,7 @@ URL du serveur d’identité Rechercher Nouvelle discussion - Nouvel appel vocal + Nouvel appel audio Nouvel appel vidéo Envoyer des fichiers Prendre une photo ou une vidéo @@ -98,8 +332,8 @@ Mot de passe Nouveau mot de passe Nom d’utilisateur - Adresse électronique - Adresse électronique (facultatif) + Adresse e-mail + Adresse e-mail (facultatif) Numéro de téléphone Numéro de téléphone (facultatif) Répéter le mot de passe @@ -112,24 +346,24 @@ Adresse e-mail ou numéro de téléphone manquant Jeton non valide Les mots de passe ne correspondent pas - Mot de passe oublié ? + Mot de passe oublié \? Utiliser des options de serveur personnalisées (avancé) Nom d’utilisateur déjà utilisé - Serveur d’accueil : - Serveur d’identité : + Serveur d’accueil : + Serveur d’identité : Impossible de s’inscrire - Impossible de s’inscrire : erreur sur le propriétaire de l’adresse e-mail + Impossible de s’inscrire : erreur d’appartenance de l’adresse e-mail Veuillez saisir une URL valide Nom d’utilisateur/mot de passe invalide JSON malformé Ne contient pas de JSON valide Liste des accusés de lecture - Envoyer en + Envoyer en tant que Original Grand Moyen Petit - Annuler le téléchargement ? + Annuler le téléchargement \? Aujourd’hui Hier Nom du salon @@ -140,11 +374,11 @@ Appel… Appel entrant Appel vidéo entrant - Appel vocal entrant + Appel audio entrant Appel en cours… Échec de la connexion Impossible d’initialiser l’appareil photo - Appel répondu ailleurs + Appel décroché ailleurs Impossible d’enregistrer une vidéo Enregistré Enregistrer dans les téléchargements ? @@ -165,7 +399,7 @@ Hors ligne OUTILS DE L’ADMINISTRATEUR APPEL - DISCUSSIONS DIRECTES + Conversations privées SESSIONS Inviter Quitter ce salon @@ -223,7 +457,7 @@ Recherche dans le répertoire… Favori Passer en faible priorité - Discussion directe + Conversation privée Quitter la discussion Abandonner Messages @@ -243,7 +477,7 @@ Informations sur l’application Activer les notifications pour ce compte Activer les notifications pour cette session - Messages dans les discussions directes + Messages dans les conversations privées Messages dans les discussions de groupe Appels entrants Messages envoyés par un robot @@ -277,7 +511,7 @@ Mettre à jour le nom public Vu la dernière fois Authentification - Mot de passe : + Mot de passe : Valider Connecté en tant que Serveur d’accueil @@ -306,7 +540,7 @@ Accès à l’historique du salon N’importe qui Uniquement les membres (depuis qu’ils sont arrivés) - Utilisateurs exclus + Utilisateurs bannis Avancé L’identifiant interne de ce salon Adresses @@ -342,7 +576,7 @@ Exporter Saisir la phrase secrète Confirmer la phrase secrète - Importer les clés E2E des salons + Importer les clés de chiffrement des salons Importer les clés des salons Importer Chiffrer uniquement vers les sessions vérifiées @@ -365,12 +599,12 @@ %d participant %d participants - Veuillez décrire l’erreur. Qu’avez-vous fait ? Quel était le comportement attendu ? Que s’est-il réellement passé ? - Afin de diagnostiquer les problèmes, les journaux de ce client seront envoyés avec ce rapport d’erreur. Ce rapport d’erreur, y compris les journaux et la capture d’écran, ne seront pas visibles publiquement. Si vous préférez envoyer le texte ci-dessus uniquement, veuillez décochez : - Vous semblez secouer le téléphone avec frustration. Souhaitez-vous ouvrir l’écran pour soumettre un rapport d’erreur ? - L’application s’est arrêtée anormalement la dernière fois. Souhaitez-vous ouvrir l’écran de rapport d’anomalie ? - Le rapport d’erreur a bien été envoyé - L’envoi du rapport d’erreur a échoué (%s) + Veuillez décrire l’erreur. Qu’avez-vous fait \? Quel était le comportement attendu \? Que s’est-il réellement passé \? + Afin de diagnostiquer les problèmes, les journaux de ce client seront envoyés avec ce rapport d’erreur. Ce rapport d’erreur, y compris les journaux et la capture d’écran, ne seront pas visibles publiquement. Si vous préférez envoyer le texte ci-dessus uniquement, veuillez décocher : + Vous semblez secouer le téléphone avec agacement. Souhaitez-vous ouvrir soumettre un rapport d’anomalie \? + L’application s’est arrêtée anormalement la dernière fois. Souhaitez-vous ouvrir l’écran de rapport d’anomalie \? + Le rapport d’anomalie a bien été envoyé + L’envoi du rapport d’anomalie a échoué (%s) Les noms d’utilisateurs ne peuvent contenir que des lettres, des nombres, des points, des traits d’union et des tirets bas Cela ne ressemble pas à une adresse e-mail valide Cela ne ressemble pas à un numéro de téléphone valide @@ -381,23 +615,23 @@ \nVous pouvez ajouter votre adresse e-mail à votre profil dans les paramètres. Ce serveur d’accueil souhaite s’assurer que vous n’êtes pas un robot J’ai vérifié mon adresse e-mail - Pour réinitialiser votre mot de passe, saisissez l’adresse e-mail associée à votre compte : + Pour réinitialiser votre mot de passe, saisissez l’adresse e-mail associée à votre compte : L’adresse e-mail liée à votre compte doit être saisie. Un nouveau mot de passe doit être saisi. Un e-mail a été envoyé à %s. Une fois que vous aurez suivi le lien qu’il contient, cliquez ci-dessous. - Impossible de vérifier l’adresse e-mail : assurez-vous d’avoir cliqué sur le lien dans l’e-mail + Impossible de vérifier l’adresse e-mail : assurez-vous d’avoir cliqué sur le lien dans l’e-mail Votre mot de passe a été réinitialisé. \n \nVous avez été déconnecté de toutes les sessions et ne recevrez plus de notifications. Pour réactiver les notifications, reconnectez-vous sur chaque appareil. L’URL doit commencer par http[s]:// - Impossible de se connecter : erreur réseau + Impossible de se connecter : erreur réseau Impossible de se connecter - Impossible de s’inscrire : erreur réseau + Impossible de s’inscrire : erreur réseau Le jeton d’accès fourni n’a pas été reconnu Trop de requêtes ont été envoyées Ce nom d’utilisateur est déjà utilisé Vous n’avez pas encore cliqué sur le lien dans l’e-mail - Annuler l’envoi ? + Annuler l’envoi \? %d s %1$d min %2$d s Quitter @@ -405,57 +639,57 @@ Le correspondant n’a pas décroché. Prendre une photo ou une vidéo Information - Element a besoin d’accéder à vos photos et vidéos pour envoyer et enregistrer des pièces jointes + ${app_name} a besoin d’accéder à vos photos et vidéos pour envoyer et enregistrer des pièces jointes \n -\nVeuillez autoriser l’accès dans la prochaine fenêtre contextuelle pour pouvoir envoyer des fichiers depuis votre téléphone. - Element a besoin d’accéder à votre appareil photo pour prendre des photos et passer des appels vidéo. +\nVeuillez autoriser l’accès dans la prochaine fenêtre pour pouvoir envoyer des fichiers depuis votre téléphone. + ${app_name} a besoin d’accéder à votre appareil photo pour prendre des photos et passer des appels vidéo. " \n -\nVeuillez autoriser l’accès dans la prochaine fenêtre contextuelle pour pouvoir effectuer l’appel." - Element a besoin d’accéder à votre microphone pour passer des appels audio. +\nVeuillez autoriser l’accès dans la prochaine fenêtre pour pouvoir effectuer l’appel." + ${app_name} a besoin d’accéder à votre microphone pour passer des appels audio. " \n \nVeuillez autoriser l’accès dans la prochaine fenêtre contextuelle pour pouvoir effectuer l’appel." - Element a besoin d’accéder à votre appareil photo et à votre microphone pour passer des appels vidéo. + ${app_name} a besoin d’accéder à votre appareil photo et à votre microphone pour passer des appels vidéo. \n -\nVeuillez autoriser l’accès dans les prochaines fenêtres contextuelles pour pouvoir effectuer l’appel. - Element peut accéder à votre carnet d’adresses pour trouver d’autres utilisateurs de Matrix avec leur numéro de téléphone et leur adresse e-mail. Veuillez autoriser l’accès dans la prochaine fenêtre contextuelle pour découvrir les utilisateurs du carnet d’adresses joignables via Element. - Element peut accéder à votre carnet d’adresses pour trouver d’autres utilisateurs de Matrix avec leur adresse e-mail et leur numéro de téléphone. -\n -\nAutorisez-vous l\'accès à vos contacts à cette fin \? - Désolé. L’action n’a pas été réalisée, faute d’autorisations +\nVeuillez autoriser l’accès dans les prochaines fenêtres pour pouvoir effectuer l’appel. + ${app_name} peut accéder à votre carnet d’adresses pour trouver d’autres utilisateurs de Matrix avec leur numéro de téléphone et leur adresse e-mail. Veuillez autoriser l’accès dans la prochaine fenêtre pour découvrir les utilisateurs du carnet d’adresses joignables via ${app_name}. + ${app_name} peut accéder à votre carnet d’adresses pour trouver d’autres utilisateurs de Matrix avec leur adresse e-mail et leur numéro de téléphone. +\n +\nAutorisez-vous l’accès à vos contacts à cette fin \? + Désolé. L’action n’a pas été réalisée faute d’autorisations Aller au premier message non lu. %s vous a invité à rejoindre ce salon Cette invitation a été envoyée à %s, qui n’est pas associé à ce compte. \nVous pouvez vous identifier avec un compte différent ou ajouter cette adresse e-mail à votre compte. - Vous essayez d’accéder à %s. Souhaitez-vous rejoindre le salon pour participer à la discussion ? + Vous essayez d’accéder à %s. Souhaitez-vous rejoindre le salon pour participer à la discussion \? Ceci est un aperçu du salon. Vous ne pouvez pas interagir. - Voulez-vous vraiment quitter le salon ? - Voulez-vous vraiment exclure %s de cette discussion ? + Voulez-vous vraiment quitter le salon \? + Voulez-vous vraiment bannir %s de cette discussion \? Inactif - Masquer tous les messages de cet utilisateur + Ignorer Afficher tous les messages de cet utilisateur Identifiant, nom ou adresse e-mail Vous ne pourrez pas annuler cette modification car vous promouvez l’utilisateur au même rang que le vôtre. \nLe voulez-vous vraiment \? - Voulez-vous vraiment inviter %s à cette discussion ? + Voulez-vous vraiment inviter %s à cette discussion \? Inviter par identifiant Entrez une ou plusieurs adresses e-mail ou identifiants Matrix %s écrit… %1$s et %2$s écrivent… %1$s, %2$s et d’autres écrivent… La connexion au serveur a été perdue. - Messages non envoyés. %1$s ou %2$s maintenant ? - Messages non envoyés car des sessions inconnues sont présentes. %1$s ou %2$s maintenant \? - Vous n’avez pas le droit de poster dans ce salon - Empreinte (%s) : + Messages non envoyés. %1$s ou %2$s maintenant \? + Messages non envoyés car des sessions inconnues sont présentes. %1$s ou %2$s maintenant \? + Vous n’avez pas la permission de poster dans ce salon + Empreinte (%s) : Impossible de vérifier l’identité du serveur distant. Cela pourrait signifier que quelqu’un intercepte malicieusement votre trafic ou que votre téléphone ne fait pas confiance au certificat fourni par le serveur distant. Si l’administrateur du serveur a confirmé que cela était normal, assurez-vous que l’empreinte ci-dessous correspond à l’empreinte fournie par l’administrateur. Le certificat n’est plus celui qui a été approuvé par votre téléphone. Ce comportement est INATTENDU. Il est recommandé de ne PAS ACCEPTER ce nouveau certificat. Le certificat n’est plus celui qui a été approuvé par votre téléphone. Le serveur a peut-être renouvelé son certificat. Contactez l’administrateur du serveur pour lui demander l’empreinte de son certificat. Acceptez le certificat uniquement si l’administrateur du serveur a publié une empreinte correspondant à celle ci-dessus. - Identifiant au mauvais format. Une adresse e-mail ou un identifiant Matrix au format \"@utilisateur:domaine\" est attendu + Identifiant au mauvais format. Une adresse e-mail ou un identifiant Matrix au format « @utilisateur:domaine » est attendu Voulez-vous cacher tous les messages de cet utilisateur \? \n \nVeuillez noter que cette action redémarrera l’application et pourra prendre un certain temps. @@ -471,17 +705,17 @@ Afficher tous les messages de %s \? \n \nVeuillez noter que cette action redémarrera l’application et pourra prendre un certain temps. - Voulez-vous vraiment supprimer cette cible de notification ? - Voulez-vous vraiment supprimer le %1$s %2$s ? + Voulez-vous vraiment supprimer cette cible de notification \? + Voulez-vous vraiment supprimer le %1$s %2$s \? Numéro de téléphone non valide pour le pays sélectionné Nous avons envoyé un SMS avec un code d’activation. Veuillez saisir ce code ci-dessous. Erreur lors de la validation de votre numéro de téléphone - Vignette du salon - Étiqueté : + Photo du salon + Étiqueté comme : Accès et visibilité Lister ce salon dans le répertoire des salons - Qui peut lire l’historique ? - Qui peut accéder à ce salon ? + Qui peut lire l’historique \? + Qui peut accéder à ce salon \? Uniquement les membres (à partir de l’activation de cette option) Uniquement les membres (depuis leur invitation) Pour faire référence à un salon, il doit avoir une adresse. @@ -500,7 +734,7 @@ \n(attention : ne peut plus être désactivé par la suite !) %s a essayé de charger un point précis dans l’historique du salon mais ne l’a pas trouvé. Exporter les clés vers un fichier local - Les clés E2E du salons ont été sauvegardées dans « %s ». + Les clés de chiffrement du salon ont été sauvegardées dans « %s ». \n \nAttention : ce fichier peut être supprimé si l’application est désinstallée. Importer les clés à partir d’un fichier local @@ -513,7 +747,7 @@ \nCela signifie qu’il n’y a aucune garantie que les sessions appartiennent aux utilisateurs qu’elles prétendent. \nNous vous recommandons d’effectuer le processus de vérification pour chaque session avant de continuer, mais vous pouvez renvoyer le message sans vérifier si vous préférez. \n -\nSessions inconnues : +\nSessions inconnues : Le serveur est peut-être indisponible ou surchargé Saisir un serveur d’accueil pour lister ses salons publics Interface utilisateur @@ -545,12 +779,12 @@ Énorme Thème clair Thème sombre - Thème noir + Thème noir Synchronisation… Écoute d’évènements Son de notification Afficher l’horodatage au format 12 heures - Vous avez besoin d’une permission pour gérer les widgets de ce salon + Vous avez besoin de la permission pour gérer les widgets de ce salon La création du widget a échoué Créer des appels en téléconférence avec jitsi Voulez-vous vraiment supprimer le widget de ce salon ? @@ -579,12 +813,12 @@ Statistiques d’utilisation Utiliser la caméra native - Rapport d’erreur - Attention ! + Rapport d’anomalie + Attention ! L’appel en téléconférence est en cours de développement et peut ne pas être fiable. Erreur de commande - Commande non reconnue : %s + Commande non reconnue : %s Désactivé Notification sonore @@ -596,11 +830,11 @@ Inviter Communautés Aucun groupe - Voulez-vous vraiment engager une nouvelle discussion avec %s ? - Voulez-vous vraiment engager un nouvel appel vocal ? - Voulez-vous vraiment engager un nouvel appel vidéo ? + Voulez-vous vraiment engager une nouvelle discussion avec %s \? + Voulez-vous vraiment engager un nouvel appel audio \? + Voulez-vous vraiment engager un nouvel appel vidéo \? Liste des Groupes - Exclure un utilisateur va l\'expulser du salon et l\'empêcher de le rejoindre à nouveau. + Bannir un utilisateur va l’expulser du salon et l’empêcher de le rejoindre à nouveau. Quitter Notification sonore pour chaque message Notification pour chaque message @@ -610,10 +844,10 @@ Aperçu des liens Vibrer lorsque l’on mentionne un utilisateur Notifications - Ce salon n’a de vignettes pour aucune communauté + Ce salon n’a de badge pour aucune communauté Nouvel identifiant de communauté (ex. +foo:matrix.org) Identifiant de communauté invalide - \"%s\" n’est pas un identifiant de communauté valide + « %s » n’est pas un identifiant de communauté valide Créer Créer une communauté Nom de la communauté @@ -632,12 +866,12 @@ Filtrer les salons du groupe L’administrateur de cette communauté n’a pas encore fourni de description. %2$s vous a expulsé de %1$s - %2$s vous a exclus de %1$s - Motif : %1$s + %2$s vous a banni de %1$s + Motif : %1$s Rejoindre Oublier le salon Badge - Secouer avec frustration pour signaler une anomalie + Secouer avec agacement pour signaler une anomalie Actions Synchronisation… @@ -675,8 +909,8 @@ %1$s dans %2$s - %d gadget actif - %d gadgets actifs + %d widgets actif + %d widgets actifs Avatar @@ -689,14 +923,14 @@ Confidentialité des notifications Normal Confidentialité réduite - L\'application a besoin de la permission de fonctionner en arrière-plan + L’application a besoin de la permission de fonctionner en arrière-plan • Les notifications sont envoyées via Firebase Cloud Messaging • Les notifications ne contiennent que des métadonnées • Le contenu du message de notification est issu directement du serveur d’accueil Matrix • Les notifications contiennent des métadonnées et des messages • Les notifications n’afficheront pas le contenu des messages Confidentialité des notifications - Element peut fonctionner en arrière-plan pour gérer vos notifications de façon sécurisée et confidentielle. Cela peut affecter l’utilisation de la batterie. + ${app_name} peut fonctionner en arrière-plan pour gérer vos notifications de façon sécurisée et confidentielle. Cela peut affecter l’utilisation de la batterie. Donner la permission Choisir une autre option Avatar d’avertissement @@ -707,9 +941,9 @@ \nVoulez-vous en ajouter \? Désactiver le compte Désactiver mon compte - Envoyer des données analytiques - Element collecte des données analytiques anonymes pour nous permettre d’améliorer l’application. - Veuillez autoriser la collecte des données pour nous aider à améliorer Element. + Envoyer des statistiques d’utilisation + ${app_name} collecte des données statistiques anonymes pour nous permettre d’améliorer l’application. + Veuillez autoriser la collecte des données pour nous aider à améliorer ${app_name}. Oui, je veux aider ! Un paramètre requis est manquant. Un paramètre n’est pas valide. @@ -722,7 +956,7 @@ \n \nLa visibilité des messages dans Matrix est identique à celle des e-mails. Si nous oublions vos messages, cela signifie que les messages que vous avez envoyés ne seront plus partagés avec les nouveaux utilisateurs ou les utilisateurs non enregistrés, mais les utilisateurs enregistrés qui ont déjà accès à ces messages en conserveront leur copie. Veuillez oublier tous les messages que j’ai envoyé quand mon compte sera désactivé (Avertissement : les futurs utilisateurs verront une version incomplète des conversations) - Pour continuer, veuillez renseigner votre mot de passe : + Pour poursuivre, veuillez renseigner votre mot de passe : Désactiver le compte Licences tierces Télécharger @@ -731,9 +965,9 @@ Redemander les clés de chiffrement à vos autres sessions. Demande de clé envoyée. Demande envoyée - Veuillez lancer Element sur un autre appareil qui peut déchiffrer le message pour qu’il puisse envoyer les clés à cette session. - Tapez ici… - Envoyer votre voix + Veuillez lancer ${app_name} sur un autre appareil qui peut déchiffrer le message pour qu’il puisse envoyer les clés à cette session. + Saisir du texte ici… + Envoyer un message vocal continuer avec… Désolé, aucune application externe n’a été trouvée pour effectuer cette action. Envoyer des messages vocaux @@ -741,26 +975,26 @@ Si possible, veuillez écrire la description en anglais. Envoyer une réponse chiffrée… Envoyer une réponse (non chiffrée)… - Prévisualiser le média avant de l’envoyer + Afficher un aperçu du média avant de l’envoyer Vous n’êtes pour le moment membre d’aucune communauté. Utiliser la touche Entrée du clavier pour envoyer un message Affiche une action Exclus l’utilisateur avec l’identifiant fourni - Révoque l\'exclusion de l’utilisateur avec l’identifiant fourni - Défini le rang d’un utilisateur - Enlève le rang d’opérateur de l’utilisateur avec l’identifiant fourni + Révoque le bannissement de l’utilisateur avec l’identifiant fourni + Définit le rang d’un utilisateur + Rétrograde l’utilisateur avec l’identifiant fourni Invite l’utilisateur avec l’identifiant fourni dans le salon actuel Rejoint le salon avec l’alias fourni Quitte le salon - Défini le sujet du salon + Définit le sujet du salon Expulse l’utilisateur avec l’identifiant fourni - Change le surnom affiché + Change le nom d’affichage Markdown activé/désactivé Pour réparer la gestion des applications Matrix Ce salon a été remplacé et n’est plus actif La conversation continue ici Ce salon est la suite d’une autre conversation - Cliquer ici pour voir les vieux messages + Cliquer ici pour voir les anciens messages En raison de permissions manquantes, cette action n’est pas possible. %d s @@ -810,7 +1044,6 @@ Améliore les performances en ne chargeant les membres des salons qu’au premier affichage. Votre serveur d’accueil ne prend pas encore en charge le chargement en différé des membres des salons. Réessayez ultérieurement. Désolé, une erreur est survenue - Thème Status.im Version %s Veuillez créer une phrase secrète pour chiffrer les clés exportées. Vous devrez saisir cette même phrase secrète afin de pouvoir importer les clés. Créer la phrase secrète @@ -821,7 +1054,7 @@ Toujours Pour les messages et les erreurs Seulement pour les erreurs - %1$s : + %1$s : %1$s : %2$s +%d %d+ @@ -838,7 +1071,7 @@ Afficher les notifications d’arrivée et de départ Les invitations, expulsions et exclusions ne sont pas concernés. Afficher les événements liés au compte - Cela inclut les changements d’avatar et de nom affiché. + Cela inclut les changements d’avatar et de nom d’affichage. Mot de passe Lancer l’appareil photo du système plutôt que l’écran d’appareil photo personnalisé. Cette option nécessite une autre application pour enregistrer les messages. @@ -846,7 +1079,7 @@ Le Markdown a été activé. Le Markdown a été désactivé. Appels - Utiliser la sonnerie par défaut de Element pour les appels entrants + Utiliser la sonnerie par défaut de ${app_name} pour les appels entrants Sonnerie d’appel entrant Sélectionner la sonnerie pour les appels : Accepter @@ -870,12 +1103,12 @@ Activer Paramètres de la session. Les notifications sont activées pour cette session. - Les notifications ne sont pas activées pour cette session. -\nVeuillez vérifier les paramètres de Element. + Les notifications ne sont pas activées pour cette session. +\nVeuillez vérifier les paramètres de ${app_name}. Activer Vérification des services Google Play L’APK des services Google Play est disponible et à jour. - Element utilise les services Google Play pour envoyer les notifications mais ils n’ont pas l’air d’être configurés correctement : + ${app_name} utilise les services Google Play pour envoyer les notifications mais ils n’ont pas l’air d’être configurés correctement : \n%1$s Réparer les services Google Play Jeton Firebase @@ -897,30 +1130,30 @@ Le redémarrage du service a échoué Lancer au démarrage Le service démarrera quand l’appareil sera redémarré. - Le service ne démarrera pas quand l’appareil sera redémarré, vous ne recevrez pas de notifications tant que Element n’aura pas été lancé au moins une fois. + Le service ne démarrera pas quand l’appareil sera redémarré, vous ne recevrez pas de notifications tant que ${app_name} n’aura pas été lancé au moins une fois. Activer le démarrage au démarrage de l’appareil Vérifier les restrictions en arrière-plan - Les restrictions en arrière-plan sont désactivées pour Element. Ce test devrait être lancé en utilisant les données mobiles (pas le Wi-Fi). + Les restrictions en arrière-plan sont désactivées pour ${app_name}. Ce test devrait être lancé en utilisant les données mobiles (pas le Wi-Fi). \n%1$s - Les restrictions en arrière-plan sont activées pour Element. -\nLe travail qu’essayera de faire l’application sera restreint agressivement tant qu’elle sera en arrière-plan et cela pourra affecter les notifications. + Les restrictions en arrière-plan sont activées pour ${app_name}. +\nLes tâches que l’application essaiera d’effectuer seront fortement restreintes tant qu’elle sera en arrière-plan et cela pourra affecter les notifications. \n%1$s Désactiver les restrictions Optimisation de la batterie - Element n’est pas affecté par l’optimisation de la batterie. - Si un utilisateur laisse un appareil débranché et immobile pour une longue durée, avec l’écran éteint, l’appareil entre dans le mode Doze. Cela empêche les applications d’accéder au réseau et reporte leurs travaux, synchronisations et alarmes standard. + ${app_name} n’est pas affecté par l’optimisation de la batterie. + Si un utilisateur laisse un appareil débranché et immobile pour une longue durée, avec l’écran éteint, l’appareil entre en mode veille.. Cela empêche les applications d’accéder au réseau et reporte leurs tâches, synchronisations et alarmes standard. Ignorer l’optimisation Connexion en arrière-plan - Element doit garder une connexion à faible impact en arrière-plan afin d’avoir des notifications fiables. -\nSur l’écran suivant on vous demandera d’autoriser Element à toujours fonctionner en arrière-plan, veuillez accepter. + ${app_name} doit garder une connexion à faible empreinte en arrière-plan afin d’avoir des notifications fiables. +\nSur l’écran suivant on vous demandera d’autoriser ${app_name} à toujours fonctionner en arrière-plan, veuillez accepter. Donner la permission Une erreur est survenue lors de la vérification de votre adresse e-mail. Une erreur est survenue lors de la vérification de votre numéro de téléphone. Informations additionnelles : %s Aucun APK des services Google Play valide n’a été trouvé. Les notifications peuvent ne pas fonctionner correctement. Appel vidéo en cours… - Sauvegarde de clés - Utiliser la sauvegarde de clés + Sauvegarde de clé + Utiliser la sauvegarde de clé La sauvegarde des clés n’est pas terminée, veuillez patienter… Passer Terminé @@ -931,12 +1164,12 @@ Certaines notifications sont désactivées dans vos paramètres personnalisés. Échec du chargement de vos règles personnalisées, veuillez réessayer. Vérifier les paramètres - [%1$s] -\nCette erreur est indépendante de Element et, selon Google, cette erreur indique que l’appareil a enregistré trop d’applications avec FCM. Cette erreur ne survient que s’il y a un nombre d’applications extrême, et ne devrait donc pas affecter un utilisateur normal. - [%1$s] -\nCette erreur est indépendante de Element. Elle peut survenir pour plusieurs raisons. Cela peut fonctionner si vous réessayez plus tard. Vous pouvez aussi vérifier que le Service Google Play n’a pas un usage limité de données dans les paramètres système. Cela peut aussi arriver sur une ROM personnalisée. - [%1$s] -\nCette erreur est indépendante de Element. Il n’y pas de compte Google sur l’appareil. Veuillez ouvrir le gestionnaire de comptes et ajouter un compte Google. + [%1$s] +\nCette erreur est indépendante de ${app_name} et, selon Google, cette erreur indique que l’appareil a enregistré trop d’applications avec FCM. Cette erreur ne survient que s’il y a un nombre d’applications anormalement élevé, et ne devrait donc pas affecter un utilisateur normal. + [%1$s] +\nCette erreur est indépendante de ${app_name}. Elle peut survenir pour plusieurs raisons. Cela peut fonctionner si vous réessayez plus tard. Vous pouvez aussi vérifier que le Service Google Play n’a pas un usage limité de données dans les paramètres système. Cela peut aussi arriver sur une ROM personnalisée. + [%1$s] +\nCette erreur est indépendante de ${app_name}. Il n’y pas de compte Google sur l’appareil. Veuillez ouvrir le gestionnaire de comptes et ajouter un compte Google. Ajouter un compte Configurer les notifications sonores Configurer les notifications d’appel @@ -947,7 +1180,7 @@ Silencieuse Veuillez saisir une phrase secrète La phrase secrète est trop faible - Veuillez supprimer la phrase secrète si vous voulez que Element génère une clé de récupération. + Veuillez supprimer la phrase secrète si vous voulez que ${app_name} génère une clé de récupération. Aucune session Matrix n’est disponible Ne perdez jamais vos messages chiffrés Les messages dans les salons chiffrés sont sécurisés avec un chiffrement de bout en bout. Seuls vous et le(s) destinataire(s) avez les clés pour lire ces messages. @@ -957,7 +1190,7 @@ Terminé Sauvegarder la clé de récupération Enregistrer dans un fichier - La clé de récupération a bien été enregistrée vers « %s ». + La clé de récupération a bien été enregistrée vers « %s ». \n \nAttention : ce fichier pourrait être supprimé si l’application est désinstallée. Veuillez en faire une copie @@ -967,7 +1200,7 @@ Erreur inattendue La sauvegarde a commencé Vos clés de chiffrement sont sauvegardées en arrière-plan sur votre serveur d’accueil. La sauvegarde initiale peut prendre plusieurs minutes. - En êtes-vous certain(e) ? + En êtes-vous sûr \? Vous pourriez perdre l’accès vos messages si vous vous déconnectez ou si vous perdez votre appareil. Récupération de la version de la sauvegarde… Utilisez votre phrase secrète de récupération pour déverrouiller l’historique de vos messages chiffrés @@ -976,14 +1209,14 @@ Utilisez votre clé de récupération pour déverrouiller l’historique de vos messages chiffrés Saisir la clé de récupération Récupération des messages - Vous avez perdu votre clé de récupération ? Vous pouvez en configurer une autre dans les paramètres. + Vous avez perdu votre clé de récupération \? Vous pouvez en configurer une autre dans les paramètres. La sauvegarde n’a pas pu être déchiffrée avec cette phrase secrète. Veuillez vérifier que vous avez saisi la bonne phrase secrète de récupération. - Erreur de réseau : veuillez vérifier votre connexion et réessayer. + Erreur de réseau : veuillez vérifier votre connexion et réessayer. Restauration de la sauvegarde : Déverrouiller l’historique Veuillez saisir une clé de récupération - La sauvegarde n’a pas pu être déchiffrée avec cette clé de récupération : veuillez vérifier que vous avez saisi la bonne clé de récupération. - Sauvegarde restaurée %s ! + La sauvegarde n’a pas pu être déchiffrée avec cette clé de récupération : veuillez vérifier que vous avez saisi la bonne clé de récupération. + Sauvegarde restaurée %s ! Sauvegarde restaurée avec %d clé. Sauvegarde restaurée avec %d clés. @@ -1009,14 +1242,14 @@ Suppression de la sauvegarde… Échec lors de la suppression de la sauvegarde (%s) Supprimer la sauvegarde - Supprimer les clés de chiffrement sauvegardées sur le serveur ? Vous ne pourrez plus utiliser votre clé de récupération pour lire l’historique des messages chiffrés. + Supprimer les clés de chiffrement sauvegardées sur le serveur \? Vous ne pourrez plus utiliser votre clé de récupération pour lire l’historique des messages chiffrés. Vous perdrez vos messages chiffrés si vous vous déconnectez maintenant Sauvegarde de clés en cours. Si vous vous déconnectez maintenant, vous perdrez accès à vos messages chiffrés. La sauvegarde de clés sécurisées devrait être activée pour toutes vos sessions afin d’éviter de perdre l’accès à vos messages chiffrés. Je ne veux pas de mes messages chiffrés Sauvegarde de clés… Utiliser la sauvegarde de clés - En êtes-vous sûr(e) ? + En êtes-vous sûr \? Sauvegarder Vous n’aurez plus accès à vos messages chiffrés, sauf si vous sauvegardez vos clés avant de vous déconnecter. Rester @@ -1077,7 +1310,7 @@ Les mots de passe ne correspondent pas Réponse de découverte du serveur d’accueil non valide Auto-compléter les options du serveur - Element a détecté une configuration de serveur personnalisée pour le domaine de votre identifiant « %1$s » : + ${app_name} a détecté une configuration de serveur personnalisée pour le domaine de votre identifiant « %1$s » : \n%2$s Utiliser la configuration Initialisation du service @@ -1088,7 +1321,7 @@ Choisir Jouer le son de l’obturateur Marquer comme lu - Les applications <b>n’</a>ont <b>pas</b> besoin d’être connectées au serveur d’accueil en arrière-plan, cela devrait diminuer l’utilisation de la batterienot need to connect to the HomeServer in the background, it should reduce battery usage + Les applications n’ont pas besoin d’être connectées au serveur d’accueil en arrière-plan, cela devrait diminuer l’utilisation de la batterie %1$s : %2$d message %1$s : %2$d messages @@ -1103,7 +1336,7 @@ Nouvelle invitation Moi ** Échec de l’envoi − veuillez ouvrir le salon - Désolé, les appels en visioconférence avec Jitsi ne sont pas pris en charge sur les vieux appareils (avec une version d\'Android antérieure à 6.0) + Désolé, les appels en visioconférence avec Jitsi ne sont pas pris en charge sur les anciens appareils (avec une version d\'Android antérieure à 6.0) Vérifier la session adresse IP inconnue Une nouvelle session demande les clés de chiffrement. @@ -1111,8 +1344,8 @@ \nVu : %2$s \nSi vous ne vous êtes pas connecté à une autre session, ignorez cette demande. Une session non vérifiée demande les clés de chiffrement. -\nNom de la session : %1$s -\nVu : %2$s +\nNom de la session : %1$s +\nVu : %2$s \nSi vous ne vous êtes pas connecté à une autre session, ignorez cette demande. Vérifier Partager @@ -1159,12 +1392,12 @@ Remplacer Arrêter Vérification de l’état de la sauvegarde - Vous avez été déconnecté(e) car vos identifiants sont incorrects ou ont expiré. - Éditer + Vous avez été déconnecté car vos identifiants sont incorrects ou ont expiré. + Modifier Répondre Réessayer Vous a envoyé une invitation - Invité(e) par %s + Invité par %s Vous êtes à jour ! Vous n’avez plus de messages non lus Discussions @@ -1174,9 +1407,9 @@ Rejoignez un salon pour commencer à utiliser l’application. Bienvenue chez vous ! Rattrapez votre retard sur vos messages non lus ici - Vos conversations directes seront affichées ici + Vos conversations privées seront affichées ici. Appuyez sur « + » en bas à droite pour en démarrer une. Salons - Vos salons seront affichés ici + Vos salons seront affichés ici. Appuyez sur le « + » en bas à droite pour trouver ceux existant ou en créer de nouveaux. Réactions D’accord J’aime @@ -1192,9 +1425,9 @@ Changer Toutes les communautés Impossible d’avoir un aperçu de ce salon - L’aperçu des salons visibles par tout le monde n’est pas encore pris en charge par Element + L’aperçu des salons visibles par tout le monde n’est pas encore pris en charge par ${app_name} Salons - Messages directs + Conversations privées Nouveau salon CRÉER Nom @@ -1231,7 +1464,7 @@ Merci, la suggestion a bien été envoyée Échec d’envoi de la suggestion (%s) Afficher les évènements cachés dans les discussions - Messages directs + Conversations privées Attente… Chiffrement de la miniature… Envoi de la miniature (%1$s / %2$s) @@ -1239,16 +1472,16 @@ Envoi du fichier (%1$s / %2$s) Téléchargement du fichier %1$s… Le fichier %1$s a été téléchargé ! - (édité) - Éditions de message - Aucune édition trouvée + (modifié) + Modifications de message + Aucune modification trouvée Filtrer les conversations… Vous ne trouvez pas ce que vous cherchez \? Créer un nouveau salon - Envoyer un nouveau message direct + Envoyer un nouveau message privé Voir le répertoire des salons Nom ou identifiant (#exemple:matrix.org) - Activer le balayement pour répondre dans les discussions + Activer le balayage pour répondre dans les l’historique Lien copié dans le presse-papiers Gestionnaire d’intégrations Aucun gestionnaire d’intégrations n’est configuré. @@ -1265,7 +1498,7 @@ Conditions de service Examiner les conditions Être découvrable par les autres - Utiliser des robots, passerelles, widgets et jeux d\'autocollants + Utiliser des robots, passerelles, widgets et jeux d’autocollants Lu à Aucun Révoquer @@ -1286,14 +1519,14 @@ Utilisera %s comme assistant quand votre serveur d’accueil n’en offre pas (votre adresse IP sera partagée lors d’un appel) Ajoutez un serveur d’identité dans vos paramètres pour réaliser cette action. Mode de synchronisation en arrière-plan - Optimisé pour la batterie - Element se synchronisera en arrière-plan de façon à préserver les ressources limitées de l’appareil (batterie). + Optimisé pour préserver la batterie + ${app_name} se synchronisera en arrière-plan de façon à préserver les ressources limitées de l’appareil (batterie). \nSelon l’état des ressources de votre appareil, la synchronisation peut être retardée par le système d’exploitation. Optimisé pour le temps réel - Element se synchronisera en arrière-plan de façon périodique à un moment précis (configurable). -\nCela aura un impact sur l’utilisation de la radio et de la batterie, une notification permanente sera affichée indiquant que Element est à l’écoute des évènements. + ${app_name} se synchronisera en arrière-plan de façon périodique à un moment précis (configurable). +\nCela aura un impact sur l’utilisation des données mobiles et de la batterie, une notification permanente sera affichée indiquant que ${app_name} est à l’écoute des évènements. Aucune synchronisation en arrière-plan - Vous ne serez pas notifié(e) des messages entrants quand l’application est en arrière-plan. + Vous ne serez pas notifié des messages entrants quand l’application est en arrière-plan. Échec de la mise à jour des paramètres. Intervalle de synchronisation préféré %s @@ -1312,11 +1545,11 @@ Vous utilisez actuellement %1$s pour découvrir et être découvrable par les contacts existants que vous connaissez. Vous n’utilisez actuellement aucun serveur d’identité. Pour découvrir et être découvrable par les contacts existants que vous connaissez, configurez-en un ci-dessous. Adresses e-mail découvrables - Les options de découverte apparaîtront quand vous aurez ajouté(e) un e-mail. + Les options de découverte apparaîtront quand vous aurez ajouté un e-mail. Les options de découverte apparaîtront quand vous aurez ajouté un numéro de téléphone. La déconnexion du serveur d’identité signifie que vous ne pourrez plus être découvrable par les autres utilisateurs et que vous ne pourrez plus inviter d’autres personnes par e-mail ou par téléphone. Numéros de téléphone découvrables - Nous vous avons envoyé un e-mail de confirmation à %s, vérifiez vos e-mails et cliquez sur le lien de confirmation + Nous vous avons envoyé un e-mail de confirmation à %s, consultez vos e-mails et cliquez sur le lien de confirmation En attente Renseignez l’URL d’un serveur d’identité Impossible de se connecter au serveur d’identité @@ -1334,7 +1567,7 @@ Ouvrir le menu de navigation Ouvrir le menu de création de salon Fermer le menu de création de salon… - Créer une nouvelle conversation directe + Créer une nouvelle conversation privée Créer un nouveau salon Fermer la bannière de sauvegarde des clés Afficher le mot de passe @@ -1356,7 +1589,7 @@ Galerie Autocollants Impossible de traiter les données de partage - C’est du pourriel + C’est du spam C’est inapproprié Signalement personnalisé… Signaler ce contenu @@ -1364,18 +1597,18 @@ SIGNALER BLOQUER L’UTILISATEUR Contenu signalé - Ce contenu a été signalé. -\n -\nSi vous ne voulez plus voir de contenu de cet utilisateur, vous pouvez l\'ignorer pour masquer ses messages. - Signalé comme pourriel - Ce contenu a été signalé comme pourriel. -\n -\nSi vous ne voulez plus voir de contenu de cet utilisateur, vous pouvez l\'ignorer pour masquer ses messages. + Ce contenu a été signalé. +\n +\nSi vous ne voulez plus voir de contenu de cet utilisateur, vous pouvez l’ignorer pour masquer ses messages. + Signalé comme spam + Ce contenu a été signalé comme spam. +\n +\nSi vous ne voulez plus voir de contenu de cet utilisateur, vous pouvez l’ignorer pour masquer ses messages. Signalé comme inapproprié - Ce contenu a été signalé comme inapproprié. -\n -\nSi vous ne voulez plus voir de contenu de cet utilisateur, vous pouvez l\'ignorer pour masquer ses messages. - Element a besoin de votre permission pour sauvegarder vos clés de chiffrement sur le disque. + Ce contenu a été signalé comme inapproprié. +\n +\nSi vous ne voulez plus voir de contenu de cet utilisateur, vous pouvez l’ignorer pour masquer ses messages. + ${app_name} a besoin de votre permission pour sauvegarder vos clés de chiffrement sur le disque. \n \nAutorisez l’accès dans le prochaine fenêtre pour pouvoir exporter vos clés manuellement. Il n’y a aucune connexion au réseau pour le moment @@ -1383,7 +1616,7 @@ Vous ne pouvez pas faire cela depuis Element mobile Une authentification est nécessaire Intégrations - Utilisez un gestionnaire d’intégrations pour gérer les bots, les passerelles, les widgets et les jeux d\'autocollants. + Utilisez un gestionnaire d’intégrations pour gérer les robots, les passerelles, les widgets et les jeux d’autocollants. \nLes gestionnaires d’intégrations reçoivent des données de configuration et peuvent modifier des widgets, envoyer des invitations de salon et définir des rangs à votre place. Autoriser les intégrations Widget @@ -1396,7 +1629,7 @@ Recharger le widget Ouvrir dans le navigateur Révoquer l’accès pour moi - Votre nom affiché + Votre nom d’affichage L’URL de votre avatar Votre identifiant utilisateur Votre thème @@ -1431,13 +1664,13 @@ Étendez et personnalisez votre expérience Démarrer Sélectionner un serveur - Comme les e-mails, les comptes ont un serveur d\'accueil, même si vous pouvez parler à tout le monde + Tout comme les e-mails, les comptes ont un serveur d’accueil, même si vous pouvez parler à tout le monde Rejoignez des millions de personnes gratuitement sur le plus grand serveur public Hébergement premium pour les organisations En savoir plus Autre Paramètres personnalisés et avancés - Continuer + Poursuivre Se connecter à %1$s Se connecter à Element Matrix Services Se connecter à un serveur personnalisé @@ -1449,37 +1682,36 @@ Adresse Hébergement privé pour les organisations Saisir l’adresse de Element ou du serveur de Modular que vous voulez utiliser - Saisir l’adresse d’un serveur ou d’un Element auquel vous voulez vous connecter - Une erreur est survenue pendant le chargement de la page : %1$s (%2$d) - L’application ne peut pas s’authentifier sur ce serveur d’accueil. Le serveur d’accueil prend en charge le(s) type(s) d’authentification suivant(s) : %1$s. + Une erreur est survenue pendant le chargement de la page : %1$s (%2$d) + L’application ne peut pas s’authentifier sur ce serveur d’accueil. Le serveur d’accueil prend en charge le(s) type(s) d’authentification suivant(s) : %1$s. \n -\nVoulez-vous vous connecter en utilisant un client web \? +\nVoulez-vous vous connecter en utilisant un client web \? Désolé, ce serveur n’accepte pas de nouveau compte. L’application ne peut pas créer de compte sur ce serveur d’accueil. \n -\nVoulez-vous vous inscrire en utilisant un client web \? +\nVoulez-vous vous inscrire en utilisant un client web \? Cet e-mail n’est associé à aucun compte. Réinitialiser le mot de passe sur %1$s Un e-mail de vérification sera envoyé à votre adresse pour confirmer la configuration de votre nouveau mot de passe. Suivant E-mail Nouveau mot de passe - Attention ! + Attention ! Le changement de mot de passe réinitialisera toutes les clés de chiffrement sur toutes vos sessions, rendant l’historique des discussions chiffrées illisible. Configurez la sauvegarde de clés ou exportez vos clés de salon depuis une autre session avant de réinitialiser votre mot de passe. - Continuer + Poursuivre Cet e-mail n’est lié à aucun compte Vérifiez votre boîte de réception Un e-mail de vérification a été envoyé à %1$s. Touchez le lien pour confirmer votre nouveau mot de passe. Après avoir suivi le lien qu’il contient, cliquez ci-dessous. J’ai vérifié mon adresse e-mail - Réussi ! + Succès ! Votre mot de passe a été réinitialisé. Vous avez été déconnecté de toutes les sessions et ne recevrez plus de notification. Pour réactiver les notifications, reconnectez-vous sur chaque appareil. Retourner à l’authentification Attention Votre mot de passe n’a pas encore été changé. \n -\nArrêter le processus de changement \? +\nArrêter le processus de changement \? Définir l’adresse e-mail Définir une adresse e-mail pour récupérer votre compte. Plus tard, vous pourrez éventuellement autoriser des personnes à vous retrouver avec votre adresse e-mail. E-mail @@ -1496,7 +1728,7 @@ Saisir le code Renvoyer Suivant - Les numéros de téléphone internationaux doivent commencer par « + » + Les numéros de téléphone internationaux doivent commencer par « + » Le numéro de téléphone n’a pas l’air d’être valide. Veuillez le vérifier S’inscrire sur %1$s Nom d’utilisateur ou e-mail @@ -1506,7 +1738,7 @@ Attention Votre compte n’est pas encore crée. \n -\nArrêter le processus de création \? +\nArrêter le processus de création \? Sélectionner matrix.org Sélectionner Element Matrix Services Sélectionner un serveur d’accueil personnalisé @@ -1516,20 +1748,20 @@ Nous avons envoyé un e-mail à %1$s. \nCliquez sur le lien qu’il contient pour continuer la création du compte. Le code saisi n’est pas correct. Veuillez vérifier. - Serveur d’accueil trop vieux - Ce serveur d’accueil utilise une version trop ancienne pour s’y connecter. Demandez à l’administrateur de votre serveur d’accueil de le mettre à niveau. + Serveur d’accueil obsolète + Ce serveur d’accueil utilise une version trop ancienne pour s’y connecter. Demandez à l’administrateur de votre serveur d’accueil de le mettre à jour. Trop de requêtes ont été envoyées. Vous pouvez réessayer dans %1$d seconde… Trop de requêtes ont été envoyées. Vous pouvez réessayer dans %1$d secondes… Vu par Vous êtes déconnecté - Cela peut être dû à plusieurs raisons : -\n -\n• Vous avez changé votre mot de passe sur une autre session. -\n -\n• Vous avez supprimé cette session depuis une autre session. -\n + Cela peut être dû à plusieurs raisons : +\n +\n• Vous avez changé votre mot de passe sur une autre session. +\n +\n• Vous avez supprimé cette session depuis une autre session. +\n \n• L’administrateur de votre serveur a invalidé votre accès pour des raisons de sécurité. Se reconnecter Vous êtes déconnecté @@ -1539,16 +1771,16 @@ Se connecter Mot de passe Effacer les données personnelles - Attention : Vos données personnelles (y compris les clés de chiffrement) sont toujours stockées sur cet appareil. + Attention : Vos données personnelles (y compris les clés de chiffrement) sont toujours stockées sur cet appareil. \n \nEffacez-les si vous n’utilisez plus cet appareil ou si vous voulez vous connecter à un autre compte. Effacer toutes les données Effacer les données - Effacer toutes les données stockées sur cet appareil \? + Effacer toutes les données stockées sur cet appareil \? \nReconnectez-vous pour accéder aux données et aux messages de votre compte. Vous perdrez l’accès à vos messages sécurisés sauf si vous vous connectez pour récupérer vos clés de chiffrement. Effacer les données - La session en cours est celle de l’utilisateur %1$s et vous fournissez des identifiants pour l’utilisateur %2$s. Ce n’est pas pris en charge par Element. + La session en cours est celle de l’utilisateur %1$s et vous fournissez des identifiants pour l’utilisateur %2$s. Ce n’est pas pris en charge par ${app_name}. \nEffacez d’abord les données, puis reconnectez-vous avec un autre compte. Votre lien matrix.to était malformé La description est trop courte @@ -1566,7 +1798,7 @@ Autres sessions Seuls les premiers résultats sont affichés, saisissez plus de lettres… Défaillance rapide - Element peut planter plus souvent quand une erreur inattendue survient + ${app_name} peut planter plus souvent quand une erreur inattendue survient Préfixe ¯\\_(ツ)_/¯ à un message en texte brut Activer le chiffrement Une fois qu’il est activé, le chiffrement ne peut pas être désactivé. @@ -1637,9 +1869,9 @@ Modérateur dans %1$s Personnalisé (%1$d) dans %2$s Aller à l’accusé de lecture - Element ne gère pas les évènements de type « %1$s » - Element ne gère pas les messages de type « %1$s » - Element a rencontré un problème lors de l’affichage du contenu de l’évènement ayant pour identifiant « %1$s » + ${app_name} ne gère pas les évènements de type « %1$s » + ${app_name} ne gère pas les messages de type « %1$s » + ${app_name} a rencontré un problème lors de l’affichage du contenu de l’évènement ayant pour identifiant « %1$s » Ne plus ignorer Cette session est incapable de partager cette vérification avec vos autres sessions. \nLa vérification sera sauvegardée localement et partagée dans une version future de l’application. @@ -1647,15 +1879,15 @@ Autres salons Envoie le message fourni coloré comme un arc-en-ciel Envoie la réaction fournie colorée comme un arc-en-ciel - Discussions + Fil de discussion Éditeur de messages Active le chiffrement de bout en bout… Une fois qu’il est activé, le chiffrement ne peut pas être désactivé. Activer le chiffrement \? Une fois qu’il est activé, le chiffrement ne peut pas être désactivé. Les messages envoyés dans les salons chiffrés ne peuvent pas être vus par le serveur, uniquement par les participants du salon. Activer le chiffrement empêchera peut-être les robots et les passerelles de fonctionner correctement. Activer le chiffrement - Pour être sécurisé, vérifiez %s en comparant un code à usage unique. - Pour être sécurisé, faites cela en personne ou utilisez un autre moyen de communication. + Pour plus de sécurité, vérifiez %s en comparant un code à usage unique. + Pour plus de sécurité, faites cela en personne ou utilisez un autre moyen de communication. Comparez les émojis uniques, en vous assurant qu’ils apparaissent dans le même ordre. Comparez le code avec celui qui s’affiche sur l’écran de l’autre utilisateur. Les messages avec cet utilisateur sont chiffrés de bout en bout et ne peuvent pas être lus par des tiers. @@ -1682,7 +1914,7 @@ Vérifier cette session Les autres utilisateurs ne lui font peut-être pas confiance - Compléter la sécurité + Améliorer la sécurité Utilisez une session existante pour vérifier celle-ci, ce qui lui permettra d’avoir accès aux messages chiffrés. Vérifier Vérifié @@ -1700,7 +1932,7 @@ On y est presque ! Est-ce que %s affiche le même bouclier \? Oui Non - La connectivité avec le serveur a été perdue + La connexion avec le serveur a été perdue Nom d’utilisateur Outils de développement Données du compte @@ -1734,7 +1966,7 @@ Évènement supprimé par l’utilisateur, motif : %1$s Évènement modéré par l’administrateur du salon, motif : %1$s Les clés sont déjà à jour ! - Element Android + ${app_name} Android Demandes de clé Déverrouiller l’historique des messages chiffrés Actualiser @@ -1782,7 +2014,7 @@ Configuration de la sauvegarde de clés Votre %2$s et votre %1$s sont bien réglés. \n -\nConservez-les en lieu sûr ! Vous en aurez besoin pour débloquer les messages chiffrés et vos informations sécurisées si vous perdez toutes vos sessions actives. +\nConservez-les en lieu sûr ! Vous en aurez besoin pour accéder aux messages chiffrés et à vos informations sécurisées si vous perdez toutes vos sessions actives. Imprimez-le et conservez-le en lieu sûr Sauvegardez-le sur une clé USB ou un disque de sauvegarde Copiez-le sur votre stockage dans le cloud personnel @@ -1790,10 +2022,10 @@ La configuration d’un mot de passe de messages vous permet des sécuriser et déverrouiller les messages chiffrés et les vérifications. \n \nSi vous ne voulez pas définir un mot de passe de messages, générez plutôt une clé de messages. - La configuration d’une Phrase de récupération vous permet des sécuriser et déverrouiller les messages chiffrés et les vérifications. + La configuration d’une phrase de récupération vous permet des sécuriser et déverrouiller les messages chiffrés et les vérifications. Chiffrement activé Les messages de ce salon sont chiffrés de bout en bout. Apprenez-en plus et vérifiez les utilisateurs sur leur profil. - Chiffrement pas activé + Chiffrement désactivé Le chiffrement utilisé par ce salon n’est pas pris en charge %s a créé et configuré ce salon. On y est presque ! L’autre appareil affiche-t-il le même bouclier \? @@ -1802,8 +2034,8 @@ Échec de l’importation des clés Configuration des notifications Messages contenant @room - Messages chiffrés dans les discussions individuelles - Messages chiffrés dans les discussions de groupe + Messages chiffrés dans les conversations individuelles + Messages chiffrés dans les conversations de groupe Quand les salons sont mis à niveau Résolution de problèmes Définir l’importance des notifications par évènement @@ -1815,7 +2047,7 @@ Utiliser un fichier Entrez %s Phrase de récupération - Ce n\'est pas une clé de récupération valide + Ce n’est pas une clé de récupération valide Veuillez entrer une clé de récupération Vérification de la clé de sauvegarde Vérification de la clé de sauvegarde (%s) @@ -1835,13 +2067,13 @@ Fichier multimédia ajouté à la galerie Impossible d’ajouter le fichier multimédia à la galerie Définir un nouveau mot de passe de compte… - Utilisez la dernière version de Element sur vos autres appareils : Element Web, Element pour Bureau, Element iOS, Element pour Android, ou un autre client Matrix qui prend en charge la signature croisée - Element Web -\nElement pour Bureau - Element iOS -\nElement Android + Utilisez la dernière version de ${app_name} sur vos autres appareils : ${app_name} Web, ${app_name} pour Bureau, ${app_name} iOS, ${app_name} pour Android, ou un autre client Matrix qui prend en charge la signature croisée + ${app_name} Web +\n${app_name} pour Bureau + ${app_name} iOS +\n${app_name} Android ou un autre client Matrix qui prend en charge la signature croisée - Utilisez la dernière version de Element sur vos autres appareils : + Utilisez la dernière version de ${app_name} sur vos autres appareils : Force la session de groupe sortante actuelle dans un salon chiffré à être abandonnée Seulement pris en charge dans les salons chiffrés Utilisez votre %1$s ou votre %2$s pour continuer. @@ -1857,10 +2089,10 @@ Veuillez choisir un nom d’utilisateur. Veuillez choisir un mot de passe. Vérifiez ce lien - Le lien %1$s vous emmène à un autre site : %2$s. + Le lien %1$s vous emmène sur un autre site : %2$s. \n -\nVoulez-vous vraiment continuer \? - Nous n’avons pas pu créer votre conversation directe. Vérifiez les utilisateurs que vous souhaitez inviter et réessayez. +\nVoulez-vous vraiment poursuivre \? + Nous n’avons pas pu créer votre conversation privée. Vérifiez les utilisateurs que vous souhaitez inviter et réessayez. Non chiffré Chiffré par un appareil non vérifié Vérifiez où vous vous êtes connecté @@ -1875,14 +2107,14 @@ Invitation envoyée à %1$s Invitations envoyées à %1$s et %2$s - Invitations envoyées à %1$s et un·e autre + Invitations envoyées à %1$s et un autre Invitations envoyées à %1$s et %2$d autres Nous n’avons pas pu inviter les utilisateurs. Vérifiez les utilisateurs que vous souhaitez inviter et réessayez. Message supprimé Afficher les messages supprimés Afficher un remplaçant pour les messages supprimés - Nous vous avons envoyé un e-mail de confirmation à %s, vérifiez vos e-mails et cliquez sur le lien de confirmation + Nous vous avons envoyé un e-mail de confirmation à %s, consultez vos e-mails et cliquez sur le lien de confirmation Le code de vérification n’est pas correct. MÉDIA Il n’y a aucun média dans ce salon @@ -1892,7 +2124,7 @@ Sinon, si vous avez déjà un compte et que vous connaissez votre identifiant Matrix et votre mot de passe, vous pouvez utiliser cette méthode : Me connecter avec mon identifiant Matrix Se connecter - Si vous avez créé un compte sur un serveur d\'accueil, utilisez ci-dessous votre identifiant Matrix (ex : @utilisateur:domaine.com) et mot de passe. + Si vous avez créé un compte sur un serveur d\'accueil, utilisez ci-dessous votre identifiant Matrix (par ex. : @utilisateur:domaine.com) et mot de passe. Identifiant de l’utilisateur Ce n’est pas un identifiant d’utilisateur valide. Format attendu : « @utilisateur:serveuraccueil.org » Impossible de trouver un serveur d’accueil valide. Veuillez vérifier votre identifiant @@ -1902,11 +2134,11 @@ Chargement des langues disponibles… Ouvrir les termes de %s Se déconnecter du serveur d’identité %s \? - Ce serveur d’identité est obsolète. Element ne supporte que l’API V2. + Ce serveur d’identité est obsolète. ${app_name} ne prend en charge que l’API V2. Cette opération n’est pas possible. Le serveur d’accueil est obsolète. Veuillez d’abord configurer un serveur d’identité. Veuillez d’abord accepter les termes du serveur d’identité dans les paramètres. - Pour votre vie privée, Element prend uniquement en charge l’envoi des adresses e-mail et des numéros de téléphone hachés. + Pour votre vie privée, ${app_name} prend uniquement en charge l’envoi des adresses e-mail et des numéros de téléphone hachés. L’association a échoué. Il n’y a actuellement aucune association avec cet identifiant. Votre serveur d’accueil (%1$s) propose d’utiliser %2$s comme serveur d’identité @@ -1917,16 +2149,16 @@ Lancer Pause Ignorer - Vous n\'avez pas la permission de commencer une téléconférence dans ce salon - Vous n\'avez pas la permission de commencer un appel dans ce salon - Une téléconférence est déjà en cours ! - Commencer une réunion vidéo - Commencer une réunion audio - Les réunions utilisent les règles de sécurités et les permissions de Jitsi. Toutes les personnes actuellement dans ce salon recevrons une invitation à participer à la réunion. + Vous n’avez pas la permission de lancer une téléconférence dans ce salon + Vous n\'avez pas la permission de lancer un appel dans ce salon + Une téléconférence est déjà en cours ! + Commencer une téléconférence vidéo + Commencer une téléconférence audio + Les réunions utilisent les règles de sécurité et les permissions de Jitsi. Toutes les personnes actuellement dans ce salon recevront une invitation à participer à la réunion. Vous ne pouvez pas passer un appel avec vous-même - Vous ne pouvez pas passer un appel avec vous-même, attendez que les participants accepte l\'invitation - Échec de l\'ajout du module d\'information (widget) - Échec de la suppression du module d\'information (widget) + Vous ne pouvez pas passer un appel avec vous-même, attendez que les participants acceptent l’invitation + Échec de l’ajout du widget + Échec de la suppression du widget Accepter Refuser Raccrocher @@ -1934,8 +2166,8 @@ Succès Notifications Impossible d\'établir une connexion en temps réel. -\nVeuillez demander à l\'administrateur de votre serveur domestique de configurer un serveur TURN afin que les appels fonctionnent de manière fiable. - Sélectionner un appareil audio +\nVeuillez demander à l’administrateur de votre serveur d’accueil de configurer un serveur TURN afin que les appels fonctionnent de manière fiable. + Sélectionner un périphérique audio Téléphone Hauts-parleurs Écouteurs @@ -1944,54 +2176,52 @@ Le numéro de téléphone est déjà défini. Erreur SSL : l\'identité du pair n\'a pas été vérifiée. Erreur SSL. - Prévenir les appels accidentels - Demandez une confirmation avant de commencer un appel + Éviter les appels accidentels + Demander une confirmation avant de lancer un appel Appel actif (%s) - Retour à l\'appel - Annuler l\'invitation - Ignorer l\'utilisateur + Retour à l’appel + Annuler l’invitation + Ignorer l’utilisateur Ignorer cet utilisateur aura pour effet de supprimer ses messages des espaces que vous partagez. \n \nVous pouvez annuler cette action à tout moment dans les paramètres généraux. - Annuler l\'invitation - Êtes-vous sûr de vouloir annuler l\'invitation pour cet utilisateur \? - Exclure l\'utilisateur - Motif de l\'exclusion - Ne plus exclure l\'utilisateur + Annuler l’invitation + Êtes-vous sûr de vouloir annuler l’invitation pour cet utilisateur \? + Bannir l’utilisateur + Motif du bannissement + Révoquer le bannissement de l’utilisateur Configuration Activer le microphone Désactiver le microphone - Désolé, cette opération n\'est pas encore possible pour les comptes connectés en Authentification unique (SSO). Confirmez votre identité en vérifiant cet identifiant, lui donnant ainsi accès aux messages chiffrés. Activer la signature croisée %d invitation %d invitations - Exclus par %1$s - Révoquer l\'invitation à %1$s \? - Révoquer l\'invitation - Carnet d\'adresses - Votre carnet d\'adresses est vide + Banni par %1$s + Révoquer l’invitation à %1$s \? + Révoquer l’invitation + Carnet d’adresses + Votre carnet d’adresses est vide Récupération de vos contacts… Rechercher dans mes contacts - Carnet d\'adresse - Votre carnet d\'adresses est vide - Ajouter depuis mon carnet d\'adresses + Carnet d’adresse + Votre carnet d’adresses est vide + Ajouter depuis mon carnet d’adresses Enregistrer la clé de récupération - element - EN SAVOIR PLUS - COMPRIS - Nous sommes heureux de vous annoncer que nous avons un nouveau nom ! Votre application est à jour et vous êtes connectés à votre compte. - Riot est maintenant Element ! - Attente de l\'historique du chiffrement - Impossible d\'accéder à ce message car l\'envoyeur n\'a intentionnellement pas envoyé les clés - Vous ne pouvez pas accéder à ce message car l\'envoyeur n\'a pas confiance en votre session - Impossible d\'accéder à ce message car vous avez été bloqué par l\'envoyeur - À cause du chiffrement de bout en bout, vous pouvez avoir besoin d\'attendre l\'arrivée du message de quelqu\'un car les clés de chiffrement ne vous ont pas été correctement envoyées. + EN SAVOIR PLUS + COMPRIS + Nous sommes heureux de vous annoncer que nous avons un nouveau nom ! Votre application est à jour et vous êtes connectés à votre compte. + Riot est désormais Element ! + Attente de l’historique du chiffrement + Impossible d’accéder à ce message car l’envoyeur n’a intentionnellement pas envoyé les clés + Vous ne pouvez pas accéder à ce message car l’envoyeur n’a pas confiance en votre session + Impossible d’accéder à ce message car vous avez été bloqué par l’envoyeur + À cause du chiffrement de bout en bout, vous pouvez avoir besoin d’attendre l’arrivée du message de quelqu’un car les clés de chiffrement ne vous ont pas été correctement envoyées. Impossible de déchiffrer Attente du message, cela peut prendre du temps - Vous n\'avez pas accès à ce message + Vous n’avez pas accès à ce message Vous avez bien changé les paramètres du salon Sujet Nom du salon @@ -2015,57 +2245,57 @@ \n \nVous pouvez aussi activer la sauvegarde sécurisée et gérer vos clés dans les paramètres. Entrez une phrase de sécurité que seul vous connaissez, celle-ci est utilisée pour sécuriser les mots de passe sur le serveur. - L\'administrateur de votre serveur a désactivé le chiffrement de bout en bout par défaut dans les salons privés et les messages directs. + L\'administrateur de votre serveur a désactivé le chiffrement de bout en bout par défaut dans les salons et conversations privés. Par défaut dans %1$s Paramètres Les messages ici sont chiffrés de bout en bout. \n \nVos messages sont sécurisés avec des verrous et seuls vous et le destinataire en possédez la clé unique pour les déverrouiller. - Boutons de bot + Boutons de robot Autocollants - Ce serveur d\'accueil utilise une ancienne version. Demandez à l\'administrateur de votre serveur d\'accueil de le mettre à jour. Vous pouvez continuer, mais certains fonctionnalités peuvent ne pas fonctionner correctement. - Entrez l\'adresse du serveur que vous voulez utiliser - Sécurité contre la perte d\'accès aux messages et données chiffrées + Ce serveur d\'accueil utilise une version obsolète. Demandez à l’administrateur de votre serveur d\'accueil de le mettre à jour. Vous pouvez continuer, mais certaines fonctionnalités peuvent ne pas fonctionner correctement. + Entrez l’adresse du serveur que vous voulez utiliser + Sécurité contre la perte d’accès aux messages et données chiffrées Activer « Autoriser les intégrations » dans les paramètres pour faire ceci. Afficher les événement des membres du salon Veuillez cliquer sur la notification. Si vous ne voyez pas la notification, veuillez vérifier les paramètres système. Affichage de la notification Vous voyez la notification ! Cliquez-moi dessus ! La notification a été cliquée ! - Appel échoué + Appel échoué Les messages de ce salon sont chiffrés de bout en bout. Vous avez créé et configuré ce salon. - Confirmer le code pour le désactiver - Le code est requis à l\'ouverture d\'Element. - Le code est demandé après 2 minutes d\'inutilisation d\'Element. + Confirmer le code PIN pour le désactiver + Le code est requis à l’ouverture d’${app_name}. + Le code est demandé après 2 minutes d\'inutilisation d’${app_name}. Demander le code après 2 minutes Afficher uniquement le numéro de messages non-lus dans une simple notification. Afficher les détails comme les noms des salons et le contenu du message. Afficher le contenu dans les notifications - Le code est la seule façon de déverrouiller Element. + Le code est la seule façon de déverrouiller ${app_name}. Activer les données biométriques comme les empreintes digitales ou la reconnaissance faciale. Activer les données biométriques - Si vous voulez réinitialiser votre code, appuyez sur Code oublié pour vous déconnecter et le réinitialiser. + Si vous voulez réinitialiser votre code, appuyez sur Code PIN oublié pour vous déconnecter et le réinitialiser. Activer le code Configurer la protection - Protéger l\'accès en utilisant un code et des données biométriques. - Protéger l\'accès + Protéger l’accès en utilisant un code PIN et des données biométriques. + Protéger l’accès Pour réinitialiser votre code, vous devez vous reconnecter et en créer un nouveau. - Nouveau code - Réinitialiser le code - Code oublié \? - Entrez votre code - Impossible de valider le code, veillez en composer un nouveau. - Confirmez le code - Choisissez un code de sécurité - Trop d\'erreurs, vous avez été déconnecté + Nouveau code PIN + Réinitialiser le code PIN + Code PIN oublié \? + Entrez votre code PIN + Impossible de valider le code PIN, veillez en composer un nouveau. + Confirmez le code PIN + Choisissez un code PIN par sécurité + Trop d’erreurs, vous avez été déconnecté Attention ! Dernière tentative avant déconnexion ! Mauvais code, %d tentative restante Mauvais code, %d tentatives restantes - Impossible d\'ouvrir un salon dont vous êtes exclus. - Impossible de trouver ce salon. Assurez-vous qu\'il existe. + Impossible d’ouvrir un salon dont vous êtes banni. + Impossible de trouver ce salon. Assurez-vous qu’il existe. Le lien est malformé Vous avez rendu ce salon public à tous ceux qui en connaissent le lien. Vous avez rendu ceci uniquement accessible par invitation. @@ -2073,21 +2303,21 @@ %1$s a rendu ceci uniquement accessible par invitation. Supprimer des favoris - %1$s, %2$s et %3$d autre lecture - %1$s, %2$s et %3$d autres lectures + %1$s, %2$s et %3$d autre ont lu + %1$s, %2$s et %3$d autres ont lu - Ajouter un onglet dédié aux notifications non-lues sur l\'écran principal. + Ajouter un onglet dédié aux notifications non-lues sur l’écran principal. Le salon a été créé, mais certaines invitations n’ont pas été envoyées pour la raison suivante : \n \n%s Widgets actifs Quitter - Actions d\'administrateur + Actions d’administrateur Les messages ici ne sont pas chiffrés de bout en bout. A réagi avec : %s Sondage Si vous ne connaissez pas votre mot de passe, faites précédent et réinitialisez-le. - Veuillez utiliser le format international (le numéro de téléphone doit commencer avec « + ») + Veuillez utiliser le format international (le numéro de téléphone doit commencer par « + ») Vous n’avez rien changé Ajouter aux favoris Code @@ -2095,7 +2325,7 @@ Activer la sauvegarde sécurisée Sauvegarde sécurisée La clé de récupération a été enregistrée. - Aucun widget n\'est activé + Aucun widget n’est activé Gérer les intégrations VUE %1$s et %2$s @@ -2106,8 +2336,8 @@ Les clés ont bien été exportées - %d utilisateur exclu - %d utilisateurs exclus + %d utilisateur banni + %d utilisateurs bannis Gérer les e-mails et numéros de téléphone liés à votre compte Matrix E-mails et numéros de téléphone @@ -2122,7 +2352,7 @@ Réinitialiser la sauvegarde sécurisée Activer la sauvegarde sécurisée Sauvegarde sécurisée - Ne plus exclure l\'utilisateur lui permettra de rejoindre le salon. + Révoquer le bannissement de l’utilisateur lui permettra de rejoindre le salon. Vous rétrograder vous-même \? Vous ne pourrez pas annuler cette modification car vous vous rétrogradez vous-même, il ne vous sera pas possible de regagner ces privilèges si vous êtes le dernier utilisateur privilégié de ce salon. Rétrograder @@ -2131,7 +2361,7 @@ Protection contre la perte d\'accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur. Activer sur cet appareil Gérer - Inclure les événement d\'invitation/ajout/départ/expulsion/exclusion ainsi que les changements d\'avatar et de nom affiché. + Inclure les événement d’invitation/ajout/départ/expulsion/exclusion ainsi que les changements d’avatar et de nom d’affichage. %d seconde %d secondes @@ -2139,7 +2369,7 @@ Assurez-vous d\'avoir cliqué sur le lien envoyé par e-mail. Supprimer %s \? Numéros de téléphone - Aucune adresse e-mail n\'a été ajoutée à votre compte + Aucune adresse e-mail n’a été ajoutée à votre compte Adresses e-mail Aucun numéro de téléphone n’a été ajouté à votre compte La recherche dans les espaces chiffrés n\'est pas encore prise en charge. @@ -2147,41 +2377,41 @@ Ne plus ignorer cet utilisateur aura pour effet de ré-afficher ses messages. expulser un utilisateur le supprimera de cet espace. \n -\nPour l’empêcher de revenir, vous devez plutôt les exclure. +\nPour l’empêcher de revenir, vous devez plutôt le bannir. Motif d’expulsion Expulser l’utilisateur Ne plus ignorer l’utilisateur Activer la HD Désactiver la HD Arrière - Frontal - Vous n’avez pas la permission de démarrer un appel - Vous n’avez pas la permission de démarrer une téléconférence + Frontale + Vous n’avez pas la permission de lancer un appel + Vous n’avez pas la permission de lancer une téléconférence Réinitialiser - Échec de la révocation de l\'exclusion de l\'utilisateur + Échec de la révocation du bannissement de l’utilisateur Vérifiez vos paramètres pour activer les notifications push Stockez votre clé de sécurité en lieu sûr comme un gestionnaire de mots de passe ou un coffre-fort. Stockez votre clé de sécurité en lieu sûr comme un gestionnaire de mots de passe ou un coffre-fort. Générez une clé de sécurité à stocker en lieu sûr comme un gestionnaire de mots de passe ou un coffre-fort. - Erreur de réception du push. Une solution possible est de réinstaller l\'application. - L\'application reçois le PUSH - L\'application attend le PUSH + Erreur de réception du push. La solution pourrait être de réinstaller l’application. + L’application reçoit le PUSH + L’application attend le PUSH Tester le Push Les notifications push sont désactivées Entrez une phrase de sécurité que seul vous connaissez, celle-ci est utilisée pour sécuriser les mots de passe sur le serveur. Entrez une phrase secrète que seul vous connaissez, et générez une clé de sauvegarde. - Protection contre la perte d\'accès aux messages et données chiffrées en sauvegardant les clés de chiffrage sur votre serveur. + Protection contre la perte d’accès aux messages et données chiffrées en sauvegardant les clés de chiffrement sur votre serveur. - Afficher le périphérique avec lequel vous pouvez dès à présent vérifier - Afficher les %d périphériques avec lesquels vous pouvez dès à présent vérifier + Afficher le périphérique avec lequel vous pouvez vérifier + Afficher les %d périphériques avec lesquels vous pouvez vérifier Supprimer les données du compte de type %1$s \? \n \nÀ utiliser avec précaution, ceci peut entraîner des comportements inattendus. Conclusion de la vérification Annuler les changements - Il y a des modifications non-enregistrées. Annuler les changements \? - Le salon n\'est pas encore créé. Annuler la création du salon \? + Il y a des modifications non-enregistrées. Annuler les changements \? + Le salon n\'est pas encore créé. Annuler la création du salon \? Retirer de la priorité faible Ajouter à la priorité faible Pivoter et rogner @@ -2190,63 +2420,252 @@ Sujet Sujet du salon (facultatif) Nom du salon - Message direct - Inclure l\'historique d\'échange de clés + Conversation privée + Inclure l’historique d’échange de clés Plus aucun résultat - Exporter le rapport d\'audit + Exporter le rapport d’audit %s pour permettre aux gens de connaître le sujet de ce salon. - Ceci est le début de l\'historique de vos messages directs avec %s. + Ceci est le début de l’historique de votre conversation privée avec %s. Ceci est le début de cette conversation. Ceci est le début de %s. - Vous n\'avez pas le droit d\'activer le chiffrement dans ce salon. + Vous n\'avez pas le droit d’activer le chiffrement dans ce salon. Création du salon… Certains caractères sont interdits Veuillez fournir une adresse de salon Cette adresse est déjà utilisée Adresse du salon - Créer une nouvelle conversation directe en scannant un QR Code + Créer une nouvelle conversation privée en scannant un code QR %1$d de %2$d - Créer une nouvelle conversation directe avec un identifiant Matrix - Dans le but de découvrir des contacts que vous connaîtriez, acceptez-vous d\'envoyer vos données de contact (numéros de téléphone et/ou e-mails) au serveur d\'identité configuré (%1$s) \? + Créer une nouvelle conversation privée avec un identifiant Matrix + Dans le but de découvrir des contacts que vous connaîtriez, acceptez-vous d\'envoyer vos données de contact (numéros de téléphone et/ou e-mails) au serveur d’identité configuré (%1$s) \? \n -\nPour une meilleure protection de la vie privée, les données seront condensées (hash) avant l\'envoi. +\nPour une meilleure protection de la vie privée, les données seront condensées (hash) avant l’envoi. Envoyer des e-mails et des numéros de téléphone Autoriser Révoquer mon autorisation - Vous n\'avez pas donné votre autorisation pour envoyer des e-mails et des numéros de téléphone à ce serveur d\'identité pour découvrir d\'autres utilisateurs à partir de vos contacts. - Vous avez donné votre autorisation pour envoyer des e-mails et des numéros de téléphone à ce serveur d\'identité pour découvrir d\'autres utilisateurs à partir de vos contacts. + Vous n’avez pas donné votre autorisation pour envoyer des e-mails et des numéros de téléphone à ce serveur d’identité pour découvrir d\'autres utilisateurs à partir de vos contacts. + Vous avez donné votre autorisation pour envoyer des e-mails et des numéros de téléphone à ce serveur d’identité pour découvrir d\'autres utilisateurs à partir de vos contacts. Envoyer des e-mails et des numéros de téléphone Suggestions Contacts Utilisateurs connus Récent - QR code - Ajouter avec un QR Code + code QR + Ajouter avec un code QR Chercher par nom ou identifiant - Autoriser l\'accès à vos contacts. - Pour scanner un QR code, vous devez autoriser l\'accès à votre appareil photo. - Débuter la discussion + Autoriser l’accès à vos contacts. + Pour scanner un code QR, vous devez autoriser l’accès à votre appareil photo. + Commencer une conversation Lien Matrix Code QR non scanné ! Code QR invalide (URI invalide) ! Impossible avec vous-même ! - Partager par texto + Partager par SMS Rechercher des contacts sur Matrix - Définir l\'avatar - Le consentement de l\'utilisateur n\'a pas été fourni. - Partagez ce code avec des gens pour qu\'ils puissent le scanner pour vous ajouter et commencer à discuter. + Définir l’avatar + Le consentement de l\'utilisateur n’a pas été fourni. + Partagez ce code avec des gens pour qu’ils puissent le scanner pour vous ajouter et commencer à discuter. Mon code Partager mon code Scanner un code QR - Ce n\'est pas un code QR matrix valide - 🔐️ Rejoins-moi sur element - Salut, parle-moi sur Element : %s + Ce n’est pas un code QR matrix valide + 🔐️ Rejoins-moi sur ${app_name} + Salut, parle-moi sur ${app_name} : %s Ajouter des amis - Ajouter des gens + Ajouter des personnes "Sujet : " Ajouter un sujet - Vous devriez l\'activer si le salon n\'est utilisé que pour collaborer avec des équipes internes sur votre serveur d\'accueil. Ceci ne peut pas être changé plus tard. - Bloquer les personnes qui ne sont pas membres de %s de rejoindre ce salon - Masquer les avancés - Afficher les avancés + Vous devriez l’activer si le salon n’est utilisé que pour collaborer avec des équipes internes sur votre serveur d’accueil. Ceci ne peut pas être changé plus tard. + Empêcher les personnes qui ne sont pas membres de %s de rejoindre ce salon + Masquer les paramètres avancés + Afficher les paramètres avancés + Vous ne pouvez pas faire ceci depuis ${app_name} mobile + Contenu de l’événement + Événement d’état envoyé ! + Événement envoyé ! + Événement malformé + Type de message manquant + Pas de contenu + Contenu d’événement + Clé d’état + Type + Envoyer des événements d’état personnalisés + Modifier le contenu + Événements d’état + Envoyer un événement d’état + Envoyer un événement personnalisé + Explorer l’état du salon + Outils de développement + Voir les accusés de réception + Ne pas notifier + Notifier sans son + Notifier avec son + Message non envoyé suite à une erreur + Vérifié + Fermer le sélecteur d’émojis + Ouvrir le sélecteur d’émojis + Reconnu + Douteux + Niveau de confiance par défaut + Sélectionné + Vidéo + Ce salon a des brouillons non envoyés + Certains messages n’ont pas été envoyés + Supprimer l’avatar + Changer l’avatar + Image + Importer la clé depuis le fichier + Ouvrir les widgets + Capture d’écran + Échec d’authentification + ${app_name} requiert que vous saisissiez vos identifiants à nouveau pour effectuer cette action. + Une nouvelle authentification est requise + Utilisateurs + Une erreur s’est produite lors du transfert de l’appel + Transférer + Rejoindre + Consulter d’abord + + 1 appel en cours (%1$d) ⋅ 1 appel en attente + 1 appel en cours (%1$d) ⋅ %2$d appels en attente + + + Appel en attente + %1$d appels en attente + + Appel en cours (%1$s) + Il y a eu une erreur lors de la recherche du numéro de téléphone + Pavé de numérotation + Rappeler + Cet appel est terminé + %1$s a refusé cet appel + Vous avez refusé cet appel %1$s + Vous êtes actuellement dans cet appel + %1$s a lancé un appel + Vous avez lancé un appel + Changer votre code PIN actuel + Changer le code PIN + + %d entrée + %d entrées + + Échec de la mise en place de la signature croisée + envoie de la neige ❄️ + envoie des confettis 🎉 + Envoie le message avec de la neige + Envoie le message avec des confettis + La limite n’est pas connue. + Votre serveur d’accueil accepte les pièces jointes (fichiers, médias, etc.) jusqu’à %s. + Taille maximum pour des envois sur ce serveur + Version du serveur + Nom du serveur + Effacer l’historique + authentification unique + Se connecter avec %s + S’inscrire avec %s + Poursuivre avec %s + Ou + Paramètres du salon + Impossible d’afficher un aperçu du salon. Voulez-vous le rejoindre \? + Ce salon n’est pas accessible en ce moment. +\nRéessayez plus tard, ou demandez à un administrateur de ce salon de vérifier que vous pouvez y accéder. + Partir de la téléconférence actuelle et basculer sur une autre \? + Version du salon + Impossible de récupérer la visibilité du répertoire de salons actuel (%1$s). + Publier ce salon dans le répertoire public de %1$s \? + Dé-publier cette adresse + Publier cette adresse + Ajouter une adresse locale + Ce salon n’a pas d’adresse locale + Définissez des adresses pour ce salon afin que les utilisateurs puissent le trouver via votre serveur d’accueil(%1$s) + Adresse locale + Nouvelle adresse publiée (par ex. #alias:serveur) + Aucune adresse publiée pour le moment. + Aucune adresse publiée pour le moment, ajoutez en une ci-dessous. + Publier ce salon dans le répertoire public de %1$s \? + Supprimer l’adresse « %1$s » \? + Dé-publier l’adresse « %1$s » \? + Publier + Publier une nouvelle adresse manuellement + Autres adresses publiées : + Adresse principale + Ceci est l’adresse principale + Les adresses publiées peuvent être utilisées par n’importe qui pour rejoindre votre salon. Pour pouvoir publier une adresse, elle doit d’abord être définie comme adresse locale. + Adresses publiées + Adresses du salon + Voir et gérer les adresses de ce salon, et sa visibilité dans le répertoire des salons. + Adresses du salon + Accès au salon + Les modifications de visibilité de l’historique ne s’appliqueront qu’aux messages ultérieurs dans ce salon. La visibilité de l’historique actuel demeurera inchangée. + Ajoute un bouton sur le compositeur pour ouvrir le clavier des emojis + Afficher le clavier des emojis + Utilisez la commande /confetti ou envoyez un message contenant ❄️ ou 🎉 + Afficher les animations de conversation + Changer le sujet + Mettre à niveau le salon + Envoyer des événements m.room.server_acl + Changer les permissions + Changer le nom du salon + Changer la visibilité de l’historique + Activer le chiffrement du salon + Changer l’adresse principale du salon + Changer l’avatar du salon + Modifier les widgets + Notifier tout le monde + Supprimer les messages des autres + Bannir des utilisateurs + Expulser des utilisateurs + Mettre à jour les paramètres + Inviter des utilisateurs + Envoyer des messages + Rôle par défaut + Vous n’avez pas la permission de changer les rôles requis pour changer différentes parties du salon + Indiquer les rôles requis pour changer les différentes parties du salon + Permissions + Voir et changer les rôles requis pour changer les différentes parties du salon. + Permissions du salon + Ce salon n’est pas public. Vous ne pourrez pas le rejoindre sans invitation. + Vous avez mis l’appel en attente + %s a mis l’appel en attente + Mettre en attente + Reprendre + Non autorisé, informations d’authentification manquantes + Nouvelle valeur + Revenir + Dé-publier + Changer + Ajouter + Comme le système + Vous avez modifié les adresses de ce salon. + %1$s a modifié les adresses de ce salon. + Vous avez modifié les adresses principale et alternative de ce salon. + %1$s a modifié les adresses principale et alternative de ce salon. + Vous avez modifié les adresses alternatives de ce salon. + %1$s a modifié les adresses alternatives de ce salon. + + Vous avez supprimé l’adresse alternative %2$s de ce salon. + Vous avez supprimé les adresses alternatives %2$s de ce salon. + + + %1$s a supprimé l’adresse alternative %2$s de ce salon. + %1$s a supprimé les adresses alternatives %2$s de ce salon. + + + Vous avez ajouté %2$s comme adresse alternative pour ce salon. + Vous avez ajouté %2$s comme adresses alternatives pour ce salon. + + + %1$s a ajouté %2$s comme adresse alternative pour ce salon. + %1$s a ajouté %2$s comme adresses alternatives pour ce salon. + + Synchronisation initiale : +\nTéléchargement des données… + Synchronisation initiale : +\nEn attente de la réponse du serveur… + Vous avez modifié la téléconférence + %1$s a modifié la téléconférence + Vous avez mis fin à la téléconférence + %1$s a mis fin à la téléconférence + Vous avez démarré la téléconférence + Téléconférence démarrée par %1$s \ No newline at end of file diff --git a/vector/src/main/res/values-fy/strings.xml b/vector/src/main/res/values-fy/strings.xml index bd6631a0d9..0e2bad095a 100644 --- a/vector/src/main/res/values-fy/strings.xml +++ b/vector/src/main/res/values-fy/strings.xml @@ -2,8 +2,7 @@ Ljocht tema Donker tema - Swart tema - Status.im-tema + Swart tema Tsjinst inisjalisearje Syngronisearje… @@ -128,7 +127,7 @@ Brûkerskatalogus Allinnich Matrix-kontakten Gjin petearen - Jo hawwe Element gjin tagong ta jo lokale kontakten jûn + Jo hawwe ${app_name} gjin tagong ta jo lokale kontakten jûn Gjin resultaten Gjin identiteitsserver konfigurearre. diff --git a/vector/src/main/res/values-gl/strings.xml b/vector/src/main/res/values-gl/strings.xml index 2fec2ecf61..bbfe838ca7 100644 --- a/vector/src/main/res/values-gl/strings.xml +++ b/vector/src/main/res/values-gl/strings.xml @@ -1,8 +1,270 @@ + Enderezo de correo + Fallo ao subir a páxina + %1$s: %2$s + %1$s enviou unha imaxe. + %1$s enviou unha icona. + Convite de %s + %1$s convidou a %2$s + %1$s convidouno + %1$s entrou + %1$s saíu + %1$s rexeitou o convite + %1$s expulsou a %2$s + %1$s desbloqueou a %2$s + %1$s bloqueou a %2$s + %1$s cancelou o convite de %2$s + %1$s cambiou o seu avatar + %1$s cambiou o seu nome a %2$s + %1$s cambiou o seu nome de %2$s a %3$s + %1$s borrou o seu nome público (%2$s) + %1$s cambiou o tema desta sala para: %2$s + %1$s cambiou o nome desta sala para: %2$s + %s iniciou unha chamada de vídeo. + %s iniciou unha chamada de voz. + %s respondeu á chamada. + %s terminou a chamada. + %1$s fixo visible os próximos históricos para %2$s + toda a xente que integran esta sala, desde o momento en que foron convidados. + todas a xente da sala, desde o momento en que entraron. + todas os membros da sala. + todos. + descoñecido (%s). + %1$s activou a criptografía par-a-par (%2$s) + %1$s solicitou unha conferencia VoIP + A conferencia VoIP comenzou + A conferencia VoIP terminou + (o avatar tamén foi cambiado) + %1$s borrou o nome da sala + %1$s removeu o tema da sala + %1$s actualizou o seu perfil %2$s + %1$s envioulle un convite a %2$s para que entre na sala + %1$s aceptou o convite para %2$s + ** Imposíbel descifrar: %s ** + O dispositivo do que envía non enviou as chaves desta mensaxe. + Non se puido redactar + Non foi posíbel enviar a mensaxe + Erro da conexión + Erro de Matrix + Aínda non é posíbel volver a entrar nunha sala baleira. + Número de teléfono + %1$s e %2$s + Fixeches unha chamada de audio. + Fixeches unha chamada de vídeo. + Cambiaches o nome da sala a: %1$s + Cambiaches o avatar da sala + %1$s cambiou o avatar da sala + Cambiaches o asunto a: %1$s + Eliminaches o teu nome público (era %1$s) + Cambiaches o teu nome público de %1$s a %2$s + Estableceches o nome público a %1$s + Cambiaches o teu avatar + Retirácheslle o convite a %1$s + Vetaches a %1$s + Readmitiches a %1$s + Expulsaches a %1$s + Rexeitaches o convite + Deixaches a sala + %1$s deixou a sala + Saíches da sala + Unícheste + %1$s iniuse + Unícheste a sala + Convidaches a %1$s + Creaches a conversa + %1$s creou a conversa + Creaches a sala + %1$s creou a sala + O teu convite + Enviaches un adhesivo. + Enviaches unha imaxe. + • Servidores con literais IP están vetados. + • Servidores con IP literais están permitidos. + • Servidores con %s están vetados. + • Servidores con %s están permitidos. + Estableceches os ACLs do servidor para esta sala. + %s estableceu os ACLs do servidor para esta sala. + %s actualizou aquí. + Actualizaches aquí. + Actualizaches esta sala. + %s actualizou esta sala. + Activaches o cifrado extremo-a-extremo (%1$s) + Fixeches visibles as mensaxes futuras para %1$s + %1$s fixo visibles as mensaxes futuras para %2$s + Fixeches visible no futuro o historial da sala para %1$s + Remataches a chamada. + Respondeches á chamada. + Enviaches datos para configurar a chamada. + %s enviou datos para configurar a chamada. + Retiraches o convite de %1$s. Razón: %2$s + %1$s retirou o convite de %2$s. Razón: %3$s + Aceptaches o convite para %1$s. Razón: %2$s + %1$s aceptou o convite para %2$s. Razón: %3$s + Revogaches o convite para que %1$s se una á sala. Razón: %2$s + %1$s revogou o convite para que %2$s se una á sala. Razón: %3$s + Convidaches a %1$s para que se una á sala. Razón: %2$s + %1$s convidou a %2$s para que se una á sala. Razón: %3$s + Vetaches a %1$s. Razón: %2$s + %1$s vetou a %2$s. Razón: %3$s + Retirácheslle o veto a %1$s. Razón: %2$s + %1$s retirou o veto a %2$s. Razón: %3$s + Expulsaches a %1$s. Razón: %2$s + %1$s expulsou a %2$s. Razón: %3$s + Rexeitaches o convite. Razón: %1$s + %1$s rexeitou o convite. Razón: %2$s + Saíches. Razón: %1$s + %1$s saíu. Razón: %2$s + Saíches da sala. Razón: %1$s + %1$s deixou a sala. Razón: %2$s + Unícheste. Razón: %1$s + %1$s uníuse. Razón: %2$s + Unícheste á sala. Razón: %1$s + %1$s uniuse á sala. Razón: %2$s + %1$s convidoute. Razón: %2$s + Convidaches a %1$s. Razón: %2$s + %1$s convidou a %2$s. Razón: %3$s + O teu convite. Razón: %1$s + Convite de %1$s. Razón: %2$s + Baleirar cola de envíos + Enviando mensaxe… + Sincr. inicial: +\nImportando datos da conta + Sincr. inicial: +\nImportando comunidades + Sincr. inicial: +\nImportando salas das que saíches + Sincr. inicial: +\nImportando convites a salas + Sincr. inicial: +\nImportando Salas + Sincr. inicial: +\nImportando salas + Sincr. inicial: +\nImportando cifrado + Sincr. inicial: +\nImportando conta… + Sala baleira (estaba %s) + Sala baleira + + %1$s e 1 máis + %1$s e %2$d outras + + + %1$s, %2$s, %3$s e %4$d máis + %1$s, %2$s, %3$s e %4$d outras + + %1$s, %2$s, %3$s e %4$s + %1$s, %2$s e %3$s + Convite de sala + Convite desde %s + %1$s de %2$s a %3$s + %1$s cambiou de categoría a %2$s. + Cambiaches a categoría de %1$s. + Personalizado + Personalizado (%1$d) + Por defecto + Moderadora + Admin + Modificaches a conferencia de vídeo + Conferencia de vídeo modificada por %1$s + Finalizaches a conferencia de vídeo + Conferencia de vídeo finalizada por %1$s + Iniciaches unha conferencia de vídeo + Conferencia de vídeo iniciada por %1$s + Modificaches o widget %1$s + %1$s modificou o widget %2$s + Eliminaches o widget %1$s + %1$s eliminou o widget %2$s + Engadiches o widget %1$s + %1$s engadiu o widget %2$s + Aceptaches o convite para %1$s + Revogaches o convite para %1$s + %1$s revogou o convite para %2$s + Revogaches o convite para que %1$s se una á sala + %1$s revogou o convite para que %2$s se una á sala + Convidaches a %1$s + %1$s convidou a %2$s + Enviácheslle un convite a %1$s para unirse á sala + Actualizaches o teu perfil %1$s + Mensaxe eliminada por %1$s [razón: %2$s] + Mensaxe eliminada [razón: %1$s] + Mensaxe eliminada por %1$s + Mensaxe eliminada + Eliminaches o avatar da sala + %1$s eliminou o avatar da sala + Eliminaches o asunto da sala + Eliminaches o nome da sala + Solicitaches unha conferencia VoIP + 🎉 Vetouse a participación de tódolos servidores! Xa non se pode utilizar esta sala. + Sen cambio. + • Os servidores con literais IP concordantes están vetados. + • Os servidores cos literais IP concordantes están permitidos. + • Servidores con %s foron eliminados da lista de permitidos. + • Os servidores con %s agora están permitidos. + • Os servidores con %s xa non están la lista de vetados. + • Os servidores con %s están agora vetados. + Cambiaches os ACLs do servidor para esta sala. + %s cambiou os ACLs do servidor para esta sala. + + %1$s engadiu %2$s como enderezo desta sala. + %1$s engadiu %2$s como enderezos desta sala. + + Activaches o cifrado extremo-a-extremo (algoritmo non recoñecido %1$s). + %1$s activou o cifrado extremo-a-extrem (algoritmo non recoñecible %2$s). + Activaches o cifrado extremo-a-extremo. + %1$s activou o cifrado extremo-a-extremo. + Non permites que as convidadas se unan á sala. + %1$s non permite que as usuarias se unan á sala. + Non permites que as convidadas se unan á sala. + %1$s non permite que as convidadas se unan á sala. + Permitiches que as convidadas se unan aquí. + %1$s permitiu que as convidadas se unan aquí. + Permitiches que as convidadas se unan á sala. + %1$s permite que as convidadas se unan á sala. + Cambiaches os enderezos desta sala. + %1$s cambiou os enderezos desta sala. + Cambiaches os enderezos principal e alternativo para esta sala. + %1$s cambiou os enderezos alternativo e principal para esta sala. + Cambiaches os enderezos alternativos para esta sala. + %1$s cambiou os enderezos alternativos para esta sala. + + Eliminaches o enderezo alternativo %1$s para esta sala. + Eliminaches os enderezos alternativos %1$s para esta sala. + + + %1$s eliminou o enderezo alternativo %2$s para esta sala. + %1$s eliminou os enderezos alternativos %2$s para esta sala. + + + Engadiches o enderezo alternativo %1$s para esta sala. + Engadiches os enderezos alternativos %1$s para esta sala. + + + %1$s engadiu o enderezo alternativo %2$s para esta sala. + %1$s engadiu os enderezos alternativos %2$s para esta sala. + + Eliminaches o enderezo principal desta sala. + %1$s eliminou o enderezo principal desta sala. + Estableceches %1$s como enderezo principal desta sala. + %1$s estableceu %2$s como enderezo principal desta sala. + Engadiches %1$s e eliminaches %2$s como enderezos desta sala. + %1$s engadiu %2$s e eliminou %3$s como enderezos desta sala. + + Eliminaches %1$s como enderezo desta sala. + Eliminaches %1$s como enderezos desta sala. + + + %1$s eliminou %2$s como enderezo desta sala. + %1$s eliminou %2$s como enderezos desta sala. + + + Engadiches %1$s como enderezo para esta sala. + Engadiches %1$s como enderezos para esta sala. + Decorado claro Decorado escuro - Decorado negro + Decorado negro Sincronizando… Notificacións con son Notificacións silenciosas @@ -79,7 +341,7 @@ Directorio de usuario Só contactos Matrix Sen conversas - Non lle permitiches a Element acceder ós contactos locais + Non lle permitiches a ${app_name} acceder ós contactos locais Sen resultados Salas Directorio de salas @@ -263,7 +525,7 @@ Desactivar a miña conta Analytics Enviar datos de análises - Element recolle información analítica anónima para permitirnos mellorar o aplicativo. + ${app_name} recolle información analítica anónima para permitirnos mellorar o aplicativo. Si, quero axudar! ID Nome @@ -458,7 +720,7 @@ Unha ligazón de correo na que aínda non se premeu Volver a pedir as chaves de cifrado do outro dispositivo seu. Petición enviada - Inicie Element noutro dispositivo que poida descifrar esta mensaxe e que despois desde alí lle poida enviar as chaves a este dispositivo. + Inicie ${app_name} noutro dispositivo que poida descifrar esta mensaxe e que despois desde alí lle poida enviar as chaves a este dispositivo. 1 cambio de participantes %d cambios de participantes @@ -547,7 +809,7 @@ Obxectivos das notificacións Desactivar conta Segredo das notificacións - Element pode estar agochado e seguir traballando na xestión das notificacións dun xeito seguro e privado (inda que iso podería afectar ao uso da batería). + ${app_name} pode estar agochado e seguir traballando na xestión das notificacións dun xeito seguro e privado (inda que iso podería afectar ao uso da batería). Outorgar permisos Escolla outra opción Accedeuse como @@ -567,6 +829,5 @@ Usar copia da Chave Copia de apoio da chave Iniciando o servizo - Decorado Status.im Por defecto no sistema \ No newline at end of file diff --git a/vector/src/main/res/values-he/strings.xml b/vector/src/main/res/values-he/strings.xml deleted file mode 100644 index 81d89ff563..0000000000 --- a/vector/src/main/res/values-he/strings.xml +++ /dev/null @@ -1,2390 +0,0 @@ - - - התראות - כפתורי ניווט תחתונים - הצלחה - שגיאה - אזהרה - אישור - השבת - העתק ללוח הגזירים - הסר פרסום - הוסף - העתק - סגור - סמן כ\'נקרא\' - תגובה מהירה - היסטורי - סמן הכל כ\'נקרא\' - חיפוש כללי - שיחת וידאו - שיחה קולית - האם אתה בטוח שברצונך לצאת מחשבונך\? - יציאה מהחשבון - פעולות - יציאה - נתק - להסיר - לקבל - יְרִידָה - סקירה - להתעלם - לְהַפִּיל - בוצע - לדלג - לְקַבֵּל - לא מקוון - להזמין - לשלוח בכל מקרה - תתקשר בכל מקרה - שיחות ועידה אינן נתמכות בחדרים מוצפנים - הסרת היישומון נכשלה - הוספת היישומון נכשלה - מידע על מושב - אתה לא יכול להתקשר עם עצמך, לחכות שהמשתתפים יקבלו את ההזמנה - אינך יכול להתקשר עם עצמך - לא ניתן להתחיל להתקשר - הפגישות משתמשות במדיניות האבטחה וההרשאה של Jitsi. כל האנשים שנמצאים כעת בחדר יראו הזמנה להצטרף בזמן שהפגישה שלך מתרחשת. - התחל פגישת שמע - התחל פגישת וידאו - ועידה כבר בעיצומה! - אין לך הרשאה להתחיל שיחה - אין לך הרשאה להתחיל שיחה בחדר זה - אין לך הרשאה להתחיל שיחת ועידה - אין לך הרשאה להתחיל שיחת ועידה בחדר זה - אתה זקוק להרשאה כדי להזמין כדי להתחיל כנס בחדר זה - בגלל הרשאות חסרות, פעולה זו אינה אפשרית. - בגלל הרשאות חסרות, ייתכן שחלק מהתכונות חסרות … - לא יכול להתחיל את השיחה, נסה שוב מאוחר יותר - וידאו - קול - התחל לצ\'וטט - אתחול - השהה - לנגן - שיחה פעילה - דווח על תוכן - התנתק - לבטל - אין - שנה שם - מחק - צפה במקור המפוענח - צפה במקור הדף - קישור קבוע - העבר - מאוחר יותר - ניקוי - דבר - שתף - הורדה - צטט - הסר - שלח שוב - שלח - הישאר - עזיבה - שמירה - ביטול - אוקיי - טוען… - רישיונות צד ג \' - תאבד את הגישה להודעות המוצפנות שלך אלא אם כן תגבה את המפתחות לפני היציאה. - גבה - האם אתה בטוח\? - השתמש בגיבוי מפתח - מגבה מקשים … - אני לא רוצה את ההודעות המוצפנות שלי - גיבוי מפתח מאובטח צריך להיות פעיל בכל ההפעלות שלך כדי למנוע אובדן גישה להודעות המוצפנות שלך. - גיבוי המפתח מתבצע. אם תצא עכשיו תאבד את הגישה להודעות המוצפנות שלך. - אם תצא עכשיו, תאבד את ההודעות המוצפנות שלך - קישור למטריקס - או - פתיחה - כניסה - שחרר - גיבוי המפתחות לא הסתיים, אנא המתן … - אמת מושב - השתמש במפתח גיבוי - גיבוי מפתח - שלח מדבקה - פרטי קהילה - דיווח תקלות - הסטוריה - פרטי משתמש - הגדרות - חדר - הודעות - התראות שקטות - התראות רועשות - האזנה לאירועים - מסנכרן… - אתחול השירות - ערכת נושא Status.im - ערכת נושא שחורה - ערכת נושא כהה - ערכת נושא בהירה - - משתמש %d - %d משתמשים - מעט - אחר - - אין חדרים ציבורים - אין חדרים - רשימת חדרים - חדרים - אין שיחות - אנשי קשר מטריקס בלבד - תיקיית האב של המשתמש - פנקס כתובות מקומי - שיחות - התראות מערכת - בעדיפות נמוכה - הזמנות - סנן שמות מבין רשימת הקהילות - סנן מבין רשימת החדרים - סנן מבין רשימת האנשים - סנן מהמועדפים - סנן שמות חדרים - קהילות - חדרים - לא הוגדר שרת זהות. - אין תוצאות נוספות - אין תוצאות - לא אפשרת לאלמנט לגשת לאנשי הקשר המקומיים שלך - האם אתה בטוח שברצונך להתחיל צ\'אט חדש עם %s\? - שלח קול - התחל שיחת וידאו - התחל שיחה קולית - התחל צ\'אט חדש - חיפוש - קישור לשרת הזיהוי - קישור לשרת הבית - יציאה - כניסה - צור חשבון - שם משתמש - הצטרף אל חדר - קרא - שלח פנימה - לא ניתן היה לשלוח את דוח הבאג (%s) - דוח הבאג נשלח בהצלחה - טלטול זעם כדי לדווח על באג - היישום התרסק בפעם האחרונה. האם ברצונך לפתוח את מסך דוח הקריסה\? - נראה שאתה מטלטל את הטלפון בתסכול. האם ברצונך לפתוח את מסך דוח הבאג\? - על מנת לאבחן בעיות, יומני הלקוח יישלחו עם דוח הבאג הזה. דוח באגים זה, כולל היומנים וצילום המסך, לא יהיה גלוי לציבור. אם אתה מעדיף לשלוח רק את הטקסט למעלה, בטל את הסימון: - תאר את הבעיה שלך כאן - אם אפשר, אנא כתוב את התיאור באנגלית. - אנא תאר את הבאג. מה עשית\? מה ציפית שיקרה\? מה באמת קרה\? - דווח על באג - שלח צילום מסך - שלח היסטוריית בקשות לשיתוף מפתח - שלח יומני תקלות - שלח יומנים - אין קבוצות - קהילות - הזמנה - שם משתמש זה כבר בשימוש - יותר מדי בקשות נשלחו - לא מכיל JSON חוקי - JSON פגום - אסימון הגישה שצוין לא זוהה - שם משתמש / סיסמא שגויים - המכשיר שלך משתמש בפרוטוקול אבטחה TLS מיושן, הפגיע להתקפה, למען ביטחונך לא תוכל להתחבר - שגיאת SSL. - שגיאת SSL: זהות העמית לא אומתה. - לא ניתן להגיע לשרת בית בכתובת אתר זו, אנא בדוק זאת - זו אינה כתובת שרת מטריקס חוקית - לא ניתן להגיע לכתובת אתר זו, אנא בדוק אותה - אנא הכנס כתובת תקינה - לא ניתן להירשם: כשל בבעלות על דוא\"ל - לא ניתן להירשם - לא ניתן להירשם: שגיאת רשת - לא מצליח להתחבר - לא ניתן להתחבר: שגיאת רשת - כתובת האתר חייבת להתחיל ב- http [s]: // - אנא עיין וקבל את המדיניות של שרת בית זה: - הסיסמה שלך אופסה. -\n -\nהוצאת מכל ההפעלות ולא תקבל עוד התראות דחיפה. כדי להפעיל מחדש התראות, התחבר מחדש בכל מכשיר. - אימות כתובת הדוא\"ל נכשל: ודא שלחצת על הקישור בדוא\"ל - דוא\"ל נשלח אל%s. לאחר שתעקוב אחר הקישור שהוא מכיל, לחץ למטה. - יש להזין סיסמה חדשה. - יש להזין את כתובת הדוא\"ל המקושרת לחשבונך. - כדי לאפס את הסיסמה שלך, הזן את כתובת הדוא\"ל המקושרת לחשבונך: - אימתתי את כתובת הדוא\"ל שלי - שרת זיהוי: - שרת הבית: - שם משתמש כבר נמצא בשימוש - שרת בית זה רוצה לוודא שאתה לא רובוט - הרשמה באמצעות דוא\"ל ומספר טלפון בבת אחת עדיין אינה נתמכת עד להתקנת ה- API. רק מספר הטלפון ייקח בחשבון. -\n -\nתוכל להוסיף את הדוא\"ל שלך לפרופיל שלך בהגדרות. - אנא בדוק את הדוא\"ל שלך כדי להמשיך בהרשמה - השתמש באפשרויות שרת מותאמות אישית (מתקדם) - שכחת סיסמה\? - סיסמא אינה תואמת לקודמתה - מטבע אינו חוקי - כתובת דוא\"ל או מספר טלפון חסרים - מספר טלפון חסר - כתובת דוא\"ל חסרה - מספר הטלפון הזה כבר קיים ומעודכן במערכת. - כתובת הדוא\"ל הזו כבר קיימת ומוגדרת במערכת. - זה אינו נראה כמספר טלפון חוקי - זה לא נראה כמו כתובת דוא\"ל חוקית - סיסמה חסרה - סיסמה קצרה מדי (נדרש לפחות 6 תווים) - שמות משתמשים עשויים להכיל רק אותיות, מספרים, נקודות, מקפים וקו תחתון - שם משתמש ו/או סיסמה לא נכונים - אשר את סיסמתך החדשה - חזור על הסיסמה - מספר טלפון (אופציונלי) - מספר טלפון - כתובת דוא\"ל (אופציונלי) - כתובת דוא\"ל - הגדר דוא\"ל לשחזור חשבון. השתמש באימייל או בטלפון מאוחרים יותר כדי שאפשר יהיה לגלות אותו על ידי אנשים שמכירים אותך. - הגדר דוא\"ל לשחזור חשבון. השתמש באימייל או בטלפון מאוחרים יותר כדי שאפשר יהיה לגלות אותו על ידי אנשים שמכירים אותך. - הגדר טלפון, ואחר כך יהיה ניתן לגלות אותו על ידי אנשים שמכירים אותך. - הגדר דוא\"ל לשחזור חשבון, ומאוחר יותר כך שניתן יהיה לגלות אותו על ידי אנשים שמכירים אותך. - שם משתמש - סיסמה חדשה - סיסמה - מייל או שם משתמש - חזור למסך כניסה - שלח מייל איפוס - דלג - הגש - צור חשבון - היכנס באמצעות כניסה יחידה - היכנס - מצטערים, לא נמצאה יישום חיצוני להשלמת פעולה זו. - המשך עם… - כרגע אין לך חבילות מדבקה מופעלות. -\n -\nלהוסיף כמה עכשיו\? - צלם סרטון - צלם תמונה - צלם תמונה או סרטון - שלח סטיקר - שלח קבצים - הפעל מצב HD - כבה מצב HD - אחורה - קדימה - החלף בין מצלמה - אוזניות אלחוטיות - אוזניות - רמקול - טלפון - בחר מכשיר סאונד - נכשל החיבור בזמן אמת. -\nאנא בקש ממנהל שרת הבית שלך להגדיר שרת TURN על מנת שהשיחות יעבדו בצורה אמינה. - שיחת האלמנט נכשלה - אל תשאל אותי שוב - נסה להשתמש ב-%s - השיחה נכשלה עקב שרת שהוגדר כהלכה - האם אתה בטוח שברצונך להתחיל שיחת וידאו\? - האם אתה בטוח שברצונך להתחיל שיחה קולית\? - צ\'ט חדש - הוסף שרת זהות בהגדרות שלך כדי לבצע פעולה זו. - זו תצוגה מקדימה של החדר הזה. אינטראקציות בחדר הושבתו. - חדר - אתה מנסה לגשת ל-%s. האם תרצה להצטרף על מנת להשתתף בדיון\? - הזמנה זו נשלחה אל%s, שאינה משויכת לחשבון זה. -\nייתכן שתרצה להתחבר עם חשבון אחר, או להוסיף דוא\"ל זה לחשבונך. - הוזמנת להצטרף לחדר זה על ידי%s - קפיצה להודעה הראשונה שלא נקראה. - מסנכרן… - פתח כותרת - חברי רשימה - דחייה - תצוגה מקדימה - הצטרף - הסר - המשך - לא - כן - שמור להורדות\? - נשמר - אפשר הרשאה לגשת לאנשי הקשר שלך. - כדי לסרוק קוד QR, עליך לאפשר גישה למצלמה. - מצטער. הפעולה לא בוצעה בגלל הרשאות חסרות - אלמנט יכול לבדוק את פנקס הכתובות שלך כדי למצוא משתמשי מטריקס אחרים על סמך מספרי הדוא\"ל והטלפון שלהם. -\n -\nהאם אתה מסכים לשתף את פנקס הכתובות שלך למטרה זו\? - אלמנט יכול לבדוק את פנקס הכתובות שלך כדי למצוא משתמשי מטריקס אחרים על סמך מספרי הדוא\"ל והטלפון שלהם. אם אתה מסכים לשתף את פנקס הכתובות שלך למטרה זו, אנא הגש גישה בחלון הקופץ הבא. - אלמנט זקוק להרשאה כדי לגשת למצלמה ולמיקרופון שלך כדי לבצע שיחות וידאו. -\n -\nאנא אפשר גישה בחלונות הקופצים הבאים כדי להיות מסוגל לבצע את השיחה. - " -\n -\nאנא אפשר גישה בחלון הקופץ הבא כדי שתוכל לבצע את השיחה." - אלמנט זקוק להרשאה כדי לגשת למיקרופון שלך כדי לבצע שיחות שמע. - " -\n -\nאנא אפשר גישה בחלון הקופץ הבא כדי שתוכל לבצע את השיחה." - אלמנט זקוק להרשאה כדי לגשת למצלמה שלך כדי לצלם תמונות ושיחות וידאו. - אלמנט זקוק להרשאה כדי לגשת לספריית התמונות והווידיאו שלך כדי לשלוח ולשמור קבצים מצורפים. -\n -\nאנא אפשר גישה בחלון הקופץ הבא כדי שתוכל לשלוח קבצים מהטלפון שלך. - מידע - לא ניתן להקליט וידאו - צלם תמונה או סרטון - השיחה נענתה במקום אחר - לא ניתן לאתחל את המצלמה - חיבור המדיה נכשל - הצד המרוחק לא הצליח להרים. - חזור לשיחה - שיחה פעילה (%s) - שיחת וידאו מתבצעת … - במהלך התקשרות… - שיחה קולית נכנסת - שיחת וידאו נכנסת - שיחה נכנסת - מתקשר… - שיחה הסתיימה - שיחה מתחברת … - שיחה מחוברת - שִׂיחָה - בחר רינגטון לשיחות: - רינגטון שיחה נכנסת - ישתמש ב-%s כסיוע כאשר השרת הביתי שלך אינו מציע כזה (כתובת ה- IP שלך תשותף במהלך שיחה) - אפשר שרת עזרה לשיחות - השתמש ברינגטון ברירת המחדל של אלמנט לשיחות נכנסות - בקש אישור לפני שמתחילים בשיחה - מנע שיחה מקרית - שיחות - נושא החדר - שם חדר - היום - אתמול - %1$dm %2$ds - %d s - האם לבטל את ההעלאה\? - האם לבטל את ההורדה\? - קטן - בינוני - גדול - מקור - שלח כ - - שינוי בפרט חברות - שינוי בפרטי חברות - שינוי בפרטי חברות - שינוי בפרטי חברות - - רשימת קבוצות - קרא את רשימת הקבלות - הפעל את Element במכשיר אחר שיכול לפענח את ההודעה כדי שיוכל לשלוח את המפתחות להפעלה זו. - הבקשה נשלחה - בקשת המפתח נשלחה. - בקש מחדש מפתחות הצפנה מהפעלות האחרות שלך. - בטל הכל - שלח מחדש הכל - הודעות לא נשלחו בגלל הימצאות פעילויות לא ידועות. %1$s או %2$s עכשיו\? - הודעות לא נשלחו. %1$s או %2$s עכשיו\? - הקישוריות לשרת אבדה. - שלח תשובה (לא מוצפן) … - יעדי התראות - ניהול מפתחות קריפטוגרפיה - קריפטוגרפיה - השתמש במנהל שילוב לניהול בוטים, גשרים, ווידג\'טים וחבילות מדבקות. -\nמנהלי אינטגרציה מקבלים נתוני תצורה ויכולים לשנות ווידג\'טים, לשלוח הזמנות לחדר ולהגדיר רמות כוח מטעמכם. - אינטגרציות - מתקדם - אחר - משתמשים שמתעלמים מהם - התראות - הגדרות משתמש - נקה מטמון מדיה - נקה את זיכרון המטמון - שמור על מדיה - מדיניות הפרטיות - זכויות יוצרים - התראות צד שלישי - תנאים והגבלות - גרסת olm - גִרְסָה - - %d שנייה - %d שניות - %d שניות - %d שניות - - עיכוב בין כל סינכרון - %s -\nהסנכרון עשוי להידחות בהתאם למשאבים (סוללה) או מצב ההתקן (שינה). - מרווח סינכרון מועדף - פסק-זמן לבקשה לסנכרון - אפשר סנכרון רקע - החל באתחול - עדכון ההגדרות נכשל. - לא תקבל הודעה על הודעות נכנסות כאשר האפליקציה ברקע. - אין סנכרון רקע - אלמנט יסונכרן ברקע מעת לעת בזמן מדויק (ניתן להגדרה). -\nזה ישפיע על השימוש ברדיו ובסוללה, תוצג הודעה קבועה לפיה אלמנט מאזין לאירועים. - מותאם לזמן אמת - אלמנט יסונכרן ברקע באופן שישמור על המשאבים המוגבלים של המכשיר (סוללה). -\nבהתאם למצב משאבי המכשיר שלך, ייתכן שהסנכרון יידחה על ידי מערכת ההפעלה. - מותאם לסוללה - מצב סנכרון רקע - סנכרון רקע - הודעות שנשלחו על ידי בוט - הזמנות לשיחות - כשאני מוזמן לחדר - הודעות בצ\'אטים קבוצתיים - הודעות בצ\'אטים אחד-על-אחד - הודעות שמכילות את שם המשתמש שלי - הודעות שמכילות את שם התצוגה שלי - בחר צבע LED, רטט, צליל … - הגדר התראות שקטות - הגדר התראות על שיחות - הגדר תצורה של התראות רועשות - הדלק את המסך למשך 3 שניות - אפשר התראות עבור מושב זה - אפשר התראות עבור חשבון זה - צליל התראה - • התראות <b> לא יציגו את תוכן ההודעה </ b>not show message content - • התראות מכילות <b> נתוני ליבה והודעות </ b>meta and message data - • תוכן ההודעה של ההודעה <b> ממוקם בצורה מאובטחת ישירות משרת הבית של מטריקס </ b>located securely direct from the Matrix homeserver - • התראות מכילות רק נתוני ליבה - • התראות נשלחות באמצעות Firebase Cloud Messaging - היישומים <b> לא </ b> צריכים להתחבר ל- HomeServer ברקע, זה אמור להפחית את השימוש בסוללהnot need to connect to the HomeServer in the background, it should reduce battery usage - האפליקציה זקוקה לאישורך כדי לפעול ברקע - פרטיות מצומצמת - רגיל - התעלם מאופטימיזציה - אם משתמש משאיר מכשיר מחובר לחשמל ויציב לתקופה מסוימת, כשהמסך כבוי, המכשיר עובר למצב Doze. זה מונע מאפליקציות גישה לרשת ומגדיר את העבודות, הסנכרונים וההתראות הסטנדרטיות שלהם. - אלמנט אינו מושפע מתהליך מיטוב הסוללה. - אופטימיזציה של הסוללה - השבת הגבלות - מגבלות רקע מופעלות עבור Element. -\nהעבודה שהאפליקציה מנסה לעשות תוגבל באגרסיביות בזמן שהיא ברקע, וזה עלול להשפיע על ההודעות. -\n%1$s - מגבלות רקע מושבתות עבור Element. יש להריץ בדיקה זו באמצעות נתונים ניידים (ללא WIFI). -\n%1$s - בדוק מגבלות רקע - הפעל את התחלה לאחר אתחול - השירות לא יופעל עם הפעלת המכשיר מחדש, לא תקבל התראות עד שאלמנט ייפתח לפחות פעם אחת. - השירות יתחיל עם הפעלת המכשיר מחדש. - הפעל לאחר אתחול - השירות נכשל מלעלות מחדש - השירות נסגר והופעל מחדש אוטומטית. - הפעלה מחדש אוטומטית לשירות ההתראות - החל שירות - שירות ההתראות אינו פועל. -\nנסה להפעיל מחדש את היישום. - שירות ההתראות פועל. - שירות התראות - ההודעה נלחצה! - אנא לחץ על ההודעה. אם אינך רואה את ההודעה, אנא בדוק את הגדרות המערכת. - תצוגת התראות - אתה צופה בהודעה! לחץ עלי! - קבלת הדחיפה נכשלה. הפתרון יכול להיות התקנה מחדש של היישום. - בדיקת שליחה בדחיפה (PUSH) - היישום מקבל PUSH - היישום ממתין ל- PUSH - נכשל רישום אסימון FCM ל- HomeServer: -\n%1$s - אסימון FCM נרשם בהצלחה ל- HomeServer. - רישום אסימונים - הוסף חשבון - [%1$s] -\nשגיאה זו אינה בשליטה על אלמנט. אין חשבון Google בטלפון. אנא פתח את מנהל החשבון והוסף חשבון Google. - [%1$s] -\nשגיאה זו אינה בשליטה על אלמנט. זה יכול להתרחש מכמה סיבות. אולי זה יעבוד אם תנסה שוב מאוחר יותר, תוכל גם לבדוק ששירות Google Play אינו מוגבל בשימוש נתונים בהגדרות המערכת, או ששעון המכשיר שלך תקין, או שזה יכול לקרות ב- ROM מותאם אישית. - [%1$s] -\nשגיאה זו איננה בשליטה על Element ולפי גוגל, שגיאה זו מצביעה על כך שלמכשיר יש יותר מדי אפליקציות הרשומות ב- FCM. השגיאה מתרחשת רק במקרים שבהם ישנם מספרים קיצוניים של אפליקציות, כך שהיא לא אמורה להשפיע על המשתמש הממוצע. - נכשל באחזור אסימון FCM: -\n%1$s - אסימון FCM אוחזר בהצלחה: -\n%1$s - אסימון Firebase - תקן שירותי Google Play - אלמנט משתמש בשירותי Google Play כדי להעביר הודעות פוש אך נראה שהוא אינו מוגדר כהלכה: -\n%1$s - ה- APK של שירותי Google Play זמין ומעודכן. - בדיקת שירותי הפעלה - בדוק בהגדרות - טעינת הכללים המותאמים אישית נכשלה, אנא נסה שוב. - חדרים - אין תוצאות - סנן משתמשים מודרים - סנן חברים מהחדר - חפש - בטל הורדה - בטל העלאה - האם ברצונך להסתיר את כל ההודעות ממשתמש זה\? -\nשים לב שפעולה זו תפעיל מחדש את האפליקציה והיא עשויה להימשך זמן מה. - סיבה לדיווח על תוכן זה - הצטרף - מוזמן - תעודת זהות שגויה. צריכה להיות כתובת דוא\"ל או מזהה מטריצה כמו \'@localpart: domain\' - - %d נבחר - %d נבחרים - %d נבחרים - %d נבחרים - - הגדרות - קבצים - אנשים - פרטי החדר - קבל את האישור רק אם מנהל השרת פרסם טביעת אצבע התואמת את זו שלמעלה. - האישור השתנה מאישור מהימן בעבר לאיש מהימן. ייתכן שהשרת חידש את האישור שלו. פנה למנהל השרת לקבלת טביעת האצבע הצפויה. - האישור השתנה מאישור שהטלפון שלך אמין עליו. זה מאוד לא שגרתי. מומלץ לא לקבל את האישור החדש הזה. - אם מנהל השרת אמר שזה צפוי, ודא שטביעת האצבע שלמטה תואמת את טביעת האצבע שמספקת אותם. - יכול להיות שמישהו מיירט את התעבורה שלך בזדון, או שהטלפון שלך לא סומך על האישור שמספק השרת המרוחק. - לא ניתן לאמת את זהות השרת המרוחק. - טביעת אצבע (%s): - התעלם - יציאה - אל תתן אמון - אמון - - הודעה חדשה - הודעות חדשות - הודעות חדשות - הודעות חדשות - - אין לך הרשאה לפרסם בחדר זה - הקובץ לא נמצא - מחק הודעות שלא נשלחו - שלח שוב הודעות שלא נשלחו - שלח תשובה מוצפנת … - שלח הודעה (לא מוצפן) … - שלח הודעה מוצפנת … - %1$s &%2$s ואחרים מקלידים … - %1$s &%2$s מקלידים … - %s מקליד … - חפש - אימייל או מזהה מטריקס - אנא הזן כתובת דוא\"ל אחת או יותר או מזהה מטריקס - הזמן משתמש לפי מזהה - משתמשי מטריקס בלבד - אנשי קשר מקומיים (%d) - <u> הזמן לפי מזהה </ u>Invite by ID - %1$s %2$s - %1$s ו %2$s - "%1$s, " - האם אתה בטוח שברצונך להזמין את%s לצ\'אט זה\? - סיבה - הסרת נידוי ממשתמש יאפשר לו להצטרף שוב לחדר. - איסור על המשתמש יבעט בהם מחדר זה וימנע מהם להצטרף שוב. - הסר נידוי ממשתמש - סיבות לנידוי - נדה משתמש - משתמש מעיף יסיר אותם מחדר זה. -\n -\nכדי למנוע מהם להצטרף שוב, עליך לאסור אותם במקום זאת. - סיבות להעפה - העף משתמש - האם אתה בטוח שברצונך לבטל את ההזמנה עבור משתמש זה\? - בטל הזמנה - הסרת התעלמות - ביטול חתימת משתמש זה יציג את כל ההודעות מהם שוב. - הסרת התעלמות ממשתמש - התעלם - התעלמות ממשתמש זה תסיר את ההודעות שלו מחדרים שאתה משתף. -\n -\nאתה יכול להפוך פעולה זו בכל עת בהגדרות הכלליות. - התעלם ממשתמש - לְהוֹרִיד בְּדַרגָה - לא תוכל לבטל את השינוי הזה מכיוון שאתה מוריד את עצמך בדרגה, אם אתה המשתמש המיועד האחרון בחדר, אי אפשר יהיה להחזיר לו הרשאות. - להוריד את עצמך\? - לא תוכל לבטל את השינוי הזה מכיוון שאתה מקדם את המשתמש לאותה רמת כוח כמוך. -\nהאם אתה בטוח\? - הצג רשימת מושבים - אזכר - מזהה משתמש, שם או דוא\"ל - הפוך למנהל - הפוך למנחה - אפס למשתמש רגיל - העף - הסרת התעלמות - התעלם - הסר מחדר זה - עזוב חדר זה - בטל הזמנה - הזמן - מושבים - הודעות ישירות - שיחה - כלי אדמיניסטרציה - זמין - אופליין - אונליין - צור - חלק מההתראות מושבתות בהגדרות המותאמות אישית שלך. - שים לב שחלק מסוגי ההודעות מוגדרים כשתיקים (יפיקו התראה ללא צליל). - הגדרות מותאמות אישית. - אפשר - התראות אינן מופעלות עבור הפעלה זו. -\nאנא בדוק את הגדרות האלמנט. - התראות מופעלות להפעלה זו. - הגדרות מושב. - אפשר - התראות מושבתות עבור חשבונך. -\nאנא בדוק את הגדרות החשבון. - התראות מופעלות עבור חשבונך. - הגדרות חשבון. - פתח את ההגדרות - התראות מושבתות בהגדרות המערכת. -\nאנא בדוק את הגדרות המערכת. - התראות מופעלות בהגדרות המערכת. - הגדרות מערכת. - בדיקה אחת או יותר נכשלו, אנא שלח דו\"ח שגיאה שיעזור לנו לחקור זאת. - בדיקה אחת או יותר נכשלו, נסה הצעה/ות אלו לתיקון. - אבחון בסיסי תקין. אם עדיין אינך מקבל התראות, אנא שלח דו\"ח שגיאה שיעזור לנו לחקור זאת. - הרץ מבדקים - אבחון לפתרון בעיות - פותר בעיות התראות - פרטיות הודעות - חשיבות ההודעה לפי אירוע - הגדרות התראה מתקדמות - וודא שלחצת על הקישור בהודעת הדוא\"ל ששלחנו אליך. - להסיר את%s\? - מספרי טלפון - לא הוספה כתובת דוא\"ל לחשבונך - כתובות דוא\"ל - נדרש אימות - אינך יכול לעשות זאת ממכשיר נייד - אשר את סיסמתך - הצג את פרטי היישום בהגדרות המערכת. - מידע על האפליקציה - הוסף מספר טלפון - לא הוסף מספר טלפון לחשבונך - מספר טלפון - הוסף כתובת דוא\"ל - כתובת דוא\"ל - שם תצוגה - תמונת פרופיל - מדיניות הפרטיות - זכויות יוצרים - התראות צד שלישי - תנאים והגבלות - גרסה - הגדרות - הודעות - הוסף למסך הבית - שכח - עזוב את השיחה - צ\'אט ישיר - בטל עדיפות - מועדף - השתק - אזכורים בלבד - כל ההודעות - כל ההודעות (קוליות) - מחפש בתיקייה… - - %d חדר - %d חדרים - %d חדרים - %d חדרים - - חפש בתיקיות - הקלד מזהה חדר או כינוי לחדר - הצטרף לחדר - הצטרף לחדר - צור חדר - התחלת שיחת צ\'אט - הזמנות - עדיפות נמוכה - חדרים - מועדפים - תיקייה ראשית - הצטרף - עדיין אין תמיכה בחיפוש בחדרים מוצפנים. - קבצים - אנשים - הודעות - האם אתה בטוח שברצונך להסיר את%s מהצ\'אט הזה\? - האם ברצונך לעזוב את החדר\? - עזוב חדר - - %dd - %dd - %dd - %dd - - - %dh - %dh - %dh - %dh - - - %dm - %dm - %dm - %dm - - - %ds - %ds - %ds - %ds - - חבר אחד - - חבר - חברים - חברים - חברים - - - חבר פעיל - חברים פעילים - חברים פעילים - חברים פעילים - - הוסף חבר - התחל אימות - מושב לא מאומת מבקש מפתחות הצפנה. -\nשם מושב: %1$s -\nנראה לאחרונה: %2$s -\nאם לא נכנסת למפגש אחר, התעלם מבקשה זו. - ההפעלה \'%s\' לא מאומתת מבקשת מפתחות הצפנה. - מושב חדש מבקש מפתחות הצפנה. -\nשם מושב: %1$s -\nנראה לאחרונה: %2$s -\nאם לא נכנסת למפגש אחר, התעלם מבקשה זו. - הוספת מושב חדש \'%s\', המבקש מפתחות הצפנה. - כדי להמשיך עליך לקבל את תנאי השירות הזה. - אפשרות זו מחייבת יישום צד שלישי להקליט את ההודעות. - שלח הודעות קוליות - השתמש במקש הזנת המקלדת כדי לשלוח הודעה - הפעל את מצלמת המערכת במקום את מסך המצלמה המותאם אישית. - השתמש במצלמה מקומית - אין יישומונים פעילים - נהל אינטגרציות - הוסף אפליקציות מטריקס - לא הוגדר מנהל אינטגרציה. - פרמטר אינו חוקי. - פרמטר חובה חסר. - החדר %s אינו גלוי. - חסר זהות משתמש בבקשה. - חסר מספר זהות חדר בבקשה. - אין לך אישור לעשות זאת בחדר זה. - אתה לא בחדר הזה. - רמת הרשאה חייבת להיות חיובית שלמה. - שליחת הבקשה נכשלה. - לא ניתן ליצור יישומון. - קרא מדיה מוגנת DRM - השתמש במיקרופון - השתמש במצלמה - חסום הכל - אפשר - יישומון זה רוצה להשתמש במשאבים הבאים: - מצטערים, שיחות ועידה עם Jitsi אינן נתמכות במכשירים ישנים (מכשירים עם מערכת הפעלה אנדרואיד מתחת ל -5.0) - מזהה חדר - מזהה ישומון - ערכת הנושא שלכם - מזהה המשתמש שלך - כתובת האתר של הדמות שלך - שם התצוגה שלך - בטל גישה עבורי - פתח בדפדפן - טען יישומון מחדש - השימוש בו עשוי לשתף נתונים עם %s: - השימוש בו עשוי להגדיר קובצי cookie ולשתף נתונים עם %s: - ישומון זה התווסף על ידי: - טען ישומון - ישומון - ישומונים פעילים - צפה - - %d יישומון פעיל - %d ישומונים פעילים - %d ישומונים פעילים - %d ישומונים אחרים פעילים - - האם אתה בטוח שברצונך למחוק את היישומון מחדר זה\? - צור שיחות ועידה עם jitsi - יצירת היישומון נכשלה - אתה זקוק להרשאה כדי לנהל יישומונים בחדר זה - ענק - הכי גדול - גדול יותר - גדול - רגיל - קטן - זעיר - גודל גופן - חפש היסטורי - %1$s: %2$s %3$s - %1$s:%2$s - ** השליחה נכשלה - אנא פתח את החדר - אני - הזמנות חדשות - הודעות חדשות - חדר - מאורע חדש - %1$s ו %2$s - %1$s ב %2$s ו %3$s - %1$s ב %2$s - - התראה %1$s: %2$d - התראות %1$s: %2$d - התראות מועטות %1$s: %2$d - התראות אחרות %1$s: %2$d - - - הודעה %1$s: %2$d - הודעות %1$s: %2$d - הודעות מעטות %1$s: %2$d - הודעות אחרות %1$s: %2$d - - - %d הזמנה - %d הזמנות - %d הזמנות מעטות - %d הזמנות אחרות - - - %d חדר - %d חדרים - %d חדרים מועטים - %d חדרים אחרים - - - %d הודעת התראה שלא נקראה - %d הודעות התראה שלא נקראו - %d הודעות התראה מעטות שלא נקראו - %d הודעות התראה אחרות שלא נקראו - - - הודעת התראה %d שלא נקראה - %d הודעות התראה שלא נקראו - %d הודעות התראה מעטות שלא נקראו - %d הודעות התראה אחרות שלא נקראו - - הקלד פה… - כל החדרים המקומיים %s - כל החדרים בשרת %s - כתובת אתר של שרת בית - הקלד שרת בית כדי לרשום ממנו חדרים ציבוריים - ייתכן שהשרת אינו זמין או עומס יתר - בחר מדריך חדרים - חדר זה מכיל פעילויות לא ידועות שלא אומתו. -\nהמשמעות היא שאין ערובה לכך שההפעלות שייכות למשתמשים שהם טוענים להם. -\nאנו ממליצים שתעבור את תהליך האימות של כל מפגש לפני שתמשיך, אך תוכל לשלוח שוב את ההודעה מבלי לאמת אם אתה מעדיף. -\n -\nהפעלות לא ידועות: - החדר מכיל הפעלות לא ידועות - אני מאשר שהמפתחות תואמים - אם הם לא תואמים, אבטחת התקשורת שלך עלולה להיפגע. - אשרו על ידי השוואה בין הדברים הבאים להגדרות המשתמש בפגישה האחרת שלכם: - אמת מושב - הסר מרשימה שחורה - רשימה שחורה - הסר אימות - אמת - ללא - IP לא ידוע - מושב לא ידוע - ברשימה שחורה - מאומת - לא תקין - - מפתח %1$d/%2$d מיובא בהצלחה. - מפתחות %1$d/%2$d יובאו בהצלחה. - מפתחות %1$d/%2$d מעטים יובאו בהצלחה. - מפתחות %1$d/%2$d אחרים יובאו בהצלחה. - - לעולם אל תשלח הודעות מוצפנות להפעלות לא מאומתות מהפגישה זו. - הצפן למפגשים מאומתים בלבד - יבא - ייבא את המפתחות מקובץ מקומי - ייבא מפתחות לחדר - ייבא מפתחות לחדר E2E - נהל גיבוי מפתח - שחזור הודעות מוצפנות - מפתחות יוצאו בהצלחה - מקשי החדר E2E נשמרו ב- \'%s\'. -\n -\nאזהרה: קובץ זה עשוי להימחק אם הסרת ההתקנה של היישום. - אנא צור משפט סיסמה להצפנת המפתחות המיוצאים. יהיה עליך להזין את אותו ביטוי סיסמה כדי שתוכל לייבא את המפתחות. - יצא - יצא מפתחות לקובץ מקומי - יצא מפתחות חדר - ייצא מפתחות חדר E2E - טביעת אצבע Ed25519 - אימות - מזהה מפתח - מזהה מושב - שם ציבורי - השם הציבורי של הפגישה גלוי לאנשים שאיתם אתה מתקשר - שם ציבורי (גלוי לאנשים שאיתם אתה מתקשר) - שם ציבורי - מידע על מושב השולח - שגיאת פענוח - מזהה מושב - מזהה משתמש - אַלגוֹרִיתְם - תביעת מפתח טביעת אצבע של Ed25519 - מפתח זהות Curve25519 - מידע על האירוע - מידע על הצפנה מקצה לקצה - %s ניסתה לטעון נקודה מסוימת בציר הזמן של החדר הזה אך לא הצליחה למצוא אותה. - ערכת נושא - מַדרִיך - אפשר הצפנה -\n(אזהרה: לא ניתן להשבית שוב!) - הצפנה מושבתת בחדר זה. - הצפנה מופעלת בחדר זה. - העתק כתובת חדר - העתק מזהה חדר - ביטול ההגדרה ככתובת הראשית - הגדר ככתובת ראשית - אזהרות כתובת עיקריות - לא תהיה לך כתובת ראשית שצוינה לחדר זה. - \'%s\' אינו פורמט חוקי לכינוי - פורמט כינוי לא חוקי - \'%s\' אינו מזהה קהילה חוקי - מזהה קהילה לא חוקי - מזהה קהילה חדש (למשל + foo: matrix.org) - חדר זה אינו מגלה כישרון בקרב קהילות כלשהן - כתובת חדשה (למשל #foo: matrix.org) - לחדר זה אין כתובות מקומיות - לעולם אל תשלח הודעות מוצפנות להפעלות לא מאומתות בחדר זה מהפגישה זו. - הצפן לביקורים מאומתים בלבד - עליך להתנתק כדי שתוכל לאפשר את ההצפנה. - הצפנה מקצה לקצה פעילה - הצפנה מקצה לקצה - אלה תכונות ניסיוניות שעשויות להישבר בדרכים לא צפויות. השתמש בזהירות. - מעבדות - כתובות - תעודת הזהות הפנימית של החדר הזה - מתקדם - משתמשים אסורים - כל מי שמכיר את הקישור לחדר, כולל אורחים - כל מי שמכיר את הקישור לחדר, מלבד האורחים - רק אנשים שהוזמנו - כדי לקשר לחדר חייבת להיות כתובת. - חברים בלבד (מאז שהצטרפו) - חברים בלבד (מאז שהוזמנו) - חברים בלבד (מאז נקודת הזמן לבחירת אפשרות זו) - כל אדם - לא ניתן לאחזר את הראות הנוכחית של ספריית החדרים (%1$s). - לפרסם את החדר הזה לציבור במדריך החדרים של %1$s\? - בטל את הפרסום של כתובת זו - פרסם כתובת זו - הוסף כתובת מקומית - לחדר זה אין כתובות מקומיות - הגדר כתובות לחדר זה כדי שמשתמשים יוכלו למצוא את החדר הזה דרך שרת הבית שלך (%1$s) - כתובות מקומיות - כתובת שפורסמה חדשה (למשל alias:server#) - עדיין אין כתובות שפורסמו. - עדיין אין כתובות שפורסמו, הוסף כתובת למטה. - פרסם חדר זה כציבורי ברשימת החדרים של \"%1$s\"\? - מחק את הכתובת \"%1$s\"\? - הסר פרסום של הכתובת \"%1$s\"\? - פרסם - פרסם כתובת חדשה באופן ידני - כתובות אחרות שפורסמו: - כתובת ראשית - זו הכתובת העיקרית - כל אחד מכל שרת יכול להשתמש בכתובות שפורסמו כדי להצטרף לחדר שלך. כדי לפרסם כתובת, תחילה יש להגדיר אותה ככתובת מקומית. - כתובות שפורסמו - כתובות חדרים - ראה וניהול כתובות של חדר זה, והנראות שלו בספריית החדרים. - כתובות החדר - גישה לחדר - מי יכול לגשת לחדר הזה\? - שינויים במי שיכול לקרוא היסטוריה יחולו רק על הודעות עתידיות בחדר זה. נראות ההיסטוריה הקיימת לא תשתנה. - מי יכול לקרוא היסטוריה\? - הקריאה בהיסטוריה של החדרים - גישה לחדר - התראות - רשום חדר זה ברשימת החדרים - כניסה ונראות - ללא - עדיפות נמוכה - מועדפים - תוייג כ-: - תגית חדר - נושא - שם חדר - תמונת חדר - לעד - חודש 1 - שבוע 1 - 3 ימים - אינכם חברים בשום קהילה. - כשרון - השמע צליל תריס - בחרו - מקור מדיה ברירת מחדל - בחרו - דחיסת ברירת מחדל - מדיה - מידע נוסף: %s - אירעה שגיאה במהלך אימות מספר הטלפון שלך. - קוד - שגיאה בעת אימות מספר הטלפון שלך - הזן קוד הפעלה - שלחנו SMS עם קוד הפעלה. אנא הזן קוד זה למטה. - אימות טלפון - מספר טלפון לא חוקי עבור המדינה שנבחרה - מספר טלפון - בבקשה בחרו מדינה - מדינה - בחר\\י מדינה - האם אתה בטוח שברצונך להסיר את %1$s %2$s \? - האם אתה בטוח שברצונך להסיר את יעד ההודעות הזה\? - נהל מיילים ומספרי טלפון המקושרים לחשבון מטריקס שלך - דוא\"ל ומספר טלפון - סיסמאות לא תואמות - הצג את כל ההודעות מ- %s\? -\n -\nשים לב שפעולה זו תפעיל מחדש את האפליקציה והיא עשויה להימשך זמן מה. - הסיסמה שלכם עודכנה - הסיסמה אינה תקינה - עדכון הסיסמה נכשל - עדכון סיסמה - אישור סיסמה חדשה - סיסמה חדשה - סיסמה נוכחית - שינוי סיסמה - סיסמה - הסתיים - שמור על מפתח התאוששות שלך במקום כלשהו מאובטח מאוד, כמו מנהל סיסמאות (או כספת) - מפתח השחזור שלך הוא רשת ביטחון - אתה יכול להשתמש בו כדי להחזיר את הגישה להודעות המוצפנות שלך אם תשכח את משפט הסיסמה שלך. -\nשמור על מפתח התאוששות שלך במקום כלשהו מאובטח מאוד, כמו מנהל סיסמאות (או כספת) - המפתחות שלך מגובים. - הצלחה! - (מתקדם) הגדר עם מפתח השחזור - לחלופין, אבטח את הגיבוי שלך באמצעות מפתח שחזור ושמור אותו במקום בטוח. - יוצר גיבוי - הגדר ביטוי - אנו נאחסן עותק מוצפן של המפתחות שלך בשרת הבית שלך. הגן על הגיבוי שלך באמצעות משפט סיסמה כדי לשמור על אבטחתו. -\n -\nליתר ביטחון, זה צריך להיות שונה מסיסמת החשבון שלך. - אבטח את הגיבוי שלך באמצעות משפט סיסמה. - ייצא ידנית מפתחות - (מתקדם) - התחל להשתמש בגיבוי מקשים - הודעות בחדרים מוצפנים מאובטחות באמצעות הצפנה מקצה לקצה. רק אתה והנמען / ים יש את המקשים לקריאת ההודעות האלה. -\n -\nגבה את המפתחות שלך בצורה מאובטחת כדי לא לאבד אותם. - לעולם אל תאבד הודעות מוצפנות - אין מושב מטריקס זמין - אנא מחק את משפט הסיסמה אם ברצונך ש- Element ייצור מפתח שחזור. - משפט הסיסמה חלש מדי - אנא הזן משפט סיסמה - משפט הסיסמה אינו תואם - הזן ביטוי סיסמה - אשר את ביטוי הסיסמה - צור ביטוי סיסמה - לא נמצא APK חוקי של שירותי Google Play. ייתכן שההודעות לא יפעלו כראוי. - %d+ - +%d - %1$s: %2$s - %1$s: - רק עבור שגיאות - עבור הודעות ושגיאות - לעולם - הראה את אזור המידע - כווץ - הרחב - סליחה, שגיאה התרחשה - שרת הבית שלך עדיין לא תומך בטעינה עצלה של חברי החדר. נסה מאוחר יותר. - הגדל את הביצועים רק על ידי חברי חדר העמסה בתצוגה הראשונה. - טעינה עצלה של חברים וחדרים - אנא %s להמשיך להשתמש בשירות זה. - אנא %s כדי להגדיל מגבלה זו. - שרת בית זה הגיע למגבלת המשתמשים הפעילים החודשיים שלו. - שרת בית זה הגיע למגבלת המשתמשים הפעילים החודשיים כך ש חלק מהמשתמשים לא יוכלו להתחבר . - שרת בית זה חרג מאחד ממגבלות המשאבים שלו. - שרת בית זה חרג מאחד ממגבלות המשאבים שלו כך ש משתמשים מסוימים לא יוכלו להתחבר . - פנה למנהל השירות שלך - צור קשר עם מנהל המערכת - לחץ כאן כדי לראות הודעות ישנות יותר ממגבלת המשאבים - לחץ כאן לצפייה בהודעות ישנות יותר - החדר הזה הוא המשך לשיחה אחרת - השיחה נמשכת כאן - חדר זה הוחלף ואינו פעיל יותר - אנא הזינו את סיסמה שלכם. - אהא הזינו שם משתמש. - השבת חשבון - להמשך, הזן את הסיסמה שלך: - אנא שכח את כל ההודעות ששלחתי כאשר חשבוני מושבת (אזהרה: הדבר יגרום למשתמשים עתידיים לראות תצוגה חלקית של השיחות) - זה יהפוך את חשבונך ללא שימוש לצמיתות. לא תוכל להתחבר, ואף אחד לא יוכל לרשום מחדש את אותו מזהה משתמש. הדבר יביא לחשבונך לעזוב את כל החדרים בהם הוא משתתף, והוא יסיר את פרטי חשבונך משרת הזהות שלך. פעולה זו היא בלתי הפיכה . -\n -\nהשבתת חשבונך אינה גורמת לנו כברירת מחדל לשכוח הודעות ששלחת . אם תרצה שנשכח את ההודעות שלך, סמן את התיבה למטה. -\n -\nנראות ההודעות במטריקס דומה לדוא\"ל. המשמעות של שכחת ההודעות שלך היא שהודעות ששלחת לא ישותפו עם משתמשים חדשים או לא רשומים, אך למשתמשים רשומים שכבר יש גישה להודעות אלה עדיין תהיה גישה להעתק שלהם. - השבת חשבון - בדוק כעת - כדי להמשיך להשתמש בשרת הבית %1$s עליך לבדוק ולהסכים לתנאים ולהגבלות. - אווטאר - אוואטר התרעה - אווטאר קבלה - שכח חדר - לָשׁוּב וֵלְהִצְטַרֵף - סיבה: %1$s - חסום על ידי %2$s מ- %1$s - אתה נבעט מ- %1$s על ידי %2$s - מנהל הקהילה לא סיפק תיאור ארוך לקהילה זו. - - חדר %d - %d חדרים - %d חדרים - %d חדרים אחרים - - - חבר %d - %d חברים - %d חברים - %d חברים אחרים - - סנן קבוצות חדרים - סנן חברי קבוצה - הוזמנו - הצתרפו - חדרים - אין משתמשים - חדרים - אנשים - בית - דוגמא - מזהה קהילה - דוגמא - שם הקהילה - צור קהילה - צור - הודעה מוצפנת - רועש - שקט - כבוי - סימון ההפעלה הושבת. - סימון ההפעלה הופעל. - כדי לתקן את ניהול אפליקציות מטריקס - הפעלה / כיבוי של סימון MARKDOWN - משנה את כינוי התצוגה שלך - בועט משתמש עם מזהה נתון - הגדר את נושא החדר - עזוב חדר - מצטרף לחדר עם כינוי נתון - מזמין משתמש עם זיהוי נתון לחדר הנוכחי - משתמש מבוטל עם מזהה נתון - הגדר את רמת ההרשאה של המשתמש - הסר חסימה למשתמש עם מזהה נתון - חסום משתמש עם מזהה נתון - הצג פעולה - הפקודה \"%s\" זקוקה ליותר פרמטרים, או שחלק מהפרמטרים שגויים. - פקודה לא מוכרת: %s - שגיאת פקודה - שיחת ועידה נמצאת בפיתוח ואולי לא אמינה. - אזהרה! - התעלם - התעלם מהבקשה - בקשה לשיתוף מפתח - שיתוף - שתף ללא אימות - אמת - כפתור Enter על המקלדת הרכה ישלח הודעה במקום להוסיף מעבר שורה - שלח הודעה עם Enter - הצג תצוגה מקדימה של מדיה לפני השליחה - רטוט בעת אזכור משתמש - כולל שינויים באווטאר ושמות תצוגה. - הצג אירועי חשבון - הזמנות, בעיטות ואיסורים אינם מושפעים. - הראה אירועי הצטרפות ועזיבה - כולל אירועי הזמנה / הצטרפות / שמאל / בעיטה / איסור ושינוי שם אווטאר / תצוגה. - הצג אירועים של מדינת החברים בחדר - לחץ על אישורי הקריאה לרשימה מפורטת. - הצג קבלות הצג קבלות קריאה - הצג חותמות זמן בפורמט של 12 שעות - הצג חותמות זמן לכל ההודעות - עצב הודעות באמצעות תחביר הסימון לפני שהן נשלחות. זה מאפשר עיצוב מתקדם כגון שימוש בכוכביות להצגת טקסט נטוי. - עיצוב Markdown - הודע למשתמשים אחרים שאתה מקליד. - שלח הודעות הקלדה - תצוגה מקדימה של קישורים בצ\'אט כאשר שרת הבית שלך תומך בתכונה זו. - תצוגה מקדימה של כתובת אתר מוטמעת - מושבים - הצמד חדרים עם הודעות שלא נקראו - הצמד חדרים עם התראות שלא נענו - ארץ ספר הטלפונים - מסך ראשי - הרשאת אנשי קשר - אנשי קשר מקומיים - לעולם אל תאבד הודעות מוצפנות - להגן מפני אובדן גישה להודעות ונתונים מוצפנים - גיבוי מאובטח - התחל להשתמש בגיבוי מפתח - לעולם אל תאבד הודעות מוצפנות - זה היה אני - גיבוי מפתח חדש גיבוי חדש של מפתח הודעות מאובטח. -\n -\nאם לא הגדרת את שיטת השחזור החדשה, ייתכן שתוקף מנסה לגשת לחשבונך. שנה את סיסמת החשבון שלך והגדר מיד שיטת שחזור חדשה בהגדרות. - גיבוי מפתח חדש - מחק גיבוי למחוק את מפתחות ההצפנה המגובים שלך מהשרת\? לא תוכל עוד להשתמש במפתח השחזור שלך כדי לקרוא את היסטוריית ההודעות המוצפנת. - מחק את הגיבוי - בודק מצב גיבוי - מחיקת הגיבוי נכשלה (%s) - מוחק גיבוי … - כדי להשתמש בגיבוי מקשים בהפעלה זו, שחזר באמצעות משפט הסיסמה או מפתח השחזור שלך כעת. - נכשל קבלת פרטי אמון לגיבוי (%s). - לגיבוי יש חתימה לא חוקית מהפעלה %s לא מאומתת - לגיבוי יש חתימה לא חוקית מההפעלה %s המאומתת - לגיבוי יש חתימה חוקית מהפעלה %s לא מאומתת - לגיבוי יש חתימה מהפעלה לא ידועה עם מזהה %s. - לגיבוי יש חתימה חוקית מההפעלה המאומתת %s. - לגיבוי יש חתימה חוקית מהפגישה זו. - לא מגובים את המפתחות שלך מהפגישה זו. - גיבוי המפתח אינו פעיל בהפעלה זו. - גיבוי המפתח הוגדר כהלכה להפעלה זו. - מחק את הגיבוי - שחזר מגיבוי - הצפנת מושב אינה מופעלת - השגת הגרסה האחרונה של מפתחות השחזור (%s) נכשלה. - הגיבוי שוחזר %s! - לא ניתן היה לפענח את הגיבוי באמצעות מפתח שחזור זה: ודא שהזנת את מפתח השחזור הנכון. - אנא הכנס מפתח שחזור - בטל נעילת היסטוריה - מייבא מפתחות … - מוריד מקשים … - מפתח שחזור מחשוב … - שחזור הגיבוי: - שגיאת רשת: אנא בדוק את החיבור שלך ונסה שוב. - לא ניתן לפענח גיבוי באמצעות ביטוי סיסמה זה: אנא ודא שהזנת את ביטוי הסיסמה לשחזור הנכון. - איבדת את מפתח ההתאוששות שלך\? אתה יכול להגדיר אחד חדש בהגדרות. - שחזור הודעות - הזן מפתח שחזור - השתמש במפתח השחזור שלך כדי לפתוח את היסטוריית ההודעות המוצפנות שלך - אינך יודע את ביטוי הסיסמה לשחזור שלך, אתה יכול %s. - השתמש במפתח השחזור שלך - השתמש בביטוי הסיסמה לשחזור כדי לבטל את נעילת היסטוריית ההודעות המוצפנות שלך - מביא גרסת גיבוי … - אתה עלול לאבד גישה להודעות שלך אם אתה מתנתק או מאבד מכשיר זה. - האם אתה בטוח\? - מפתחות ההצפנה שלך מגובים כעת ברקע לשרת הבית שלך. הגיבוי הראשוני עשוי להימשך מספר דקות. - הגיבוי התחיל - שגיאה לא צפויה - מפתח שחזור - יצירת מפתח שחזור באמצעות ביטוי סיסמה, תהליך זה יכול להימשך מספר שניות. - שתף מפתח שחזור עם … - בבקשה צרו העתק - עצור - החלפה - נראה שכבר יש לך גיבוי מפתח הגדרה מהפעלה אחרת. האם אתה רוצה להחליף אותו לזה שאתה יוצר\? - גיבוי כבר קיים בשרת הבית שלך - מפתח השחזור נשמר. - מפתח השחזור נשמר ב- \'%s\'. -\n -\nאזהרה: קובץ זה עשוי להימחק אם הסרת ההתקנה של היישום. - שמירת קובץ בשם - שיתוף - שמור מפתח שחזור - הכנתי עותק - מסקנת אימות - הגיב עם: %s - כפתורי בוט - משאל - מדבקה - קובץ - קול - תמונה. - וידאו. - אחד מהדברים הבאים עלול להתפשר: -\n -\n - שרת הבית שלך -\n - שרת הבית שהמשתמש שאתה מאמת מחובר אליו -\n - שלך, או חיבור האינטרנט של המשתמשים האחרים -\n - שלך, או המכשיר של המשתמשים האחרים - לא מאובטח - חפש את המגן הירוק כדי להבטיחשהמשתמש אמין. סמכו על כל המשתמשים בחדר שיבטיחו שהחדר יהיה מאובטח. - ליתר ביטחון, השתמש באמצעי תקשורת בטוח אחר או עשה זאת באופן אישי. - אמת משתמש זה על ידי אישור שהאימוג\'י הייחודי הבא מופיע על גבי המסך, באותו סדר. - הם לא תואמים - הם מתאימים - כניסה לא בטוחה - דומיין הדוא\"ל שלך אינו מורשה להירשם בשרת זה - יוצר חדר… - תווים מסוימים אינם מורשים - אנא ציינו כתובת לחדר - כתובת זו כבר בשימוש - כתובת חדר - ייתכן שתאפשר זאת אם החדר ישמש רק לשיתוף פעולה עם צוותים פנימיים בשרת הבית שלך. לא ניתן לשנות זאת מאוחר יותר. - חסום כל אחד שאינו חלק מ- %s מלהצטרף אי פעם לחדר זה - הסתר מתקדם - הצג מתקדם - לאחר הפעלתו, לא ניתן להשבית את ההצפנה. - אפשר הצפנה - הוסף לפני ¯ \\ _ (ツ) _ / ¯ להודעת טקסט רגיל - אלמנט עלול לקרוס לעיתים קרובות יותר כאשר מתרחשת שגיאה בלתי צפויה - כישלון-מהיר - מציג רק את התוצאות הראשונות, הקלד עוד אותיות … - פעולות אחרות - פעולה נוכחית - הגדרות - טלטלה זוהתה! - טלטל את הטלפון שלך כדי לבדוק את סף הזיהוי - סף איתור - ראג\'שייק - מצב המפתח מפעיל תכונות נסתרות ועשוי גם להפוך את היישום לפחות יציב. למפתחים בלבד! - מצב מפתח - הגדרות מתקדמות - לראות את כל ההפעלות שלי - סנכרון ראשוני … - התיאור קצר מדי - הקישור שלך ל- matrix.to היה תקין - ההפעלה הנוכחית מיועדת למשתמש %1$s ואתה מספק אישורי משתמש %2$s. זה אינו נתמך על ידי אלמנט. -\nראשית נקה נתונים ואז היכנס שוב לחשבון אחר. - נקה נתונים - תאבד את הגישה להודעות מאובטחות אלא אם תיכנס בכדי לשחזר את מפתחות ההצפנה שלך. - למחוק את כל הנתונים השמורים כעת במכשיר זה\? -\nהיכנס שוב כדי לגשת לנתוני החשבון ולהודעות שלך. - נקה נתונים - נקה את כל הנתונים - אזהרה: הנתונים האישיים שלך (כולל מפתחות הצפנה) עדיין שמורים במכשיר זה. -\n -\nנקה אותה אם סיימת להשתמש במכשיר זה, או אם ברצונך להיכנס לחשבון אחר. - נקה מידע אישי - סיסמה - כניסה - היכנס לשחזור מפתחות הצפנה המאוחסנים אך ורק במכשיר זה. אתה צריך אותם כדי לקרוא את כל ההודעות המאובטחות שלך בכל מכשיר. - מנהל שרת הבית שלך (%1$s) הוציא אותך מחשבונך %2$s (%3$s). - כניסה - התנתקתם - התחבר שוב - זה יכול להיות מסיבות שונות: -\n -\n• שינית את הסיסמה שלך בפגישה אחרת. -\n -\n• מחקת את ההפעלה הזו מהפעלה אחרת. -\n -\n• מנהל השרת שלך ביטל את גישתך מסיבות אבטחה. - התנתקתם - נראה על ידי - לא ניתן למצוא שרת בית חוקי. אנא בדוק את המזהה שלך - זה לא מזהה משתמש חוקי. פורמט צפוי: \'@ user: homeserver.org\' - אם אינך יודע את הסיסמה שלך, חזור לאפס אותה. - מזהה מטריקס - אם אתה מגדיר חשבון בשרת ביתי, השתמש במזהה המטריצה שלך (למשל @user:domain.com) והסיסמה שלך למטה. - היכנס באמצעות מזהה מטריקס - היכנס באמצעות מזהה מטריקס - לחלופין, אם כבר יש לך חשבון ואתה יודע את מזהה המטריצה והסיסמה שלך, תוכל להשתמש בשיטה זו: - שרת בית זה מריץ גרסה ישנה. בקש ממנהל שרת הבית שלך לשדרג. אתה יכול להמשיך, אך ייתכן שתכונות מסוימות לא יפעלו כהלכה. - שרת בית זה מריץ גרסה ישנה מדי מכדי להתחבר אליה. בקש ממנהל שרת הבית שלך לשדרג. - שרת בית מיושן - הקוד שהוזן אינו נכון. בבקשה תבדוק. - פשוט שלחנו אימייל ל- %1$s. -\nאנא לחץ על הקישור שהוא מכיל להמשך יצירת החשבון. - אנא בדוק את הדוא\"ל שלך - קבל תנאים להמשך - אנא בצע את אתגר ה- captcha - בחר שרת בית מותאם אישית - בחר שירותי מטריקס אלמנט - בחר matrix.org - חשבונך טרם נוצר. -\n -\nלהפסיק את תהליך ההרשמה\? - אזהרה - שם המשתמש הזה תפוס - הבא - סיסמה - שם משתמש - שם משתמש או מייל - הירשם ל- %1$s - מספר הטלפון נראה לא חוקי. בבקשה בדקו את זה - מספרי טלפון בינלאומיים חייבים להתחיל עם \'+\' - אנא השתמש בפורמט הבינלאומי (מספר הטלפון חייב להתחיל ב- \'+\') - הבא - שלח שוב - הזן קוד - פשוט שלחנו קוד ל- %1$s. הזן אותו למטה כדי לוודא שאתה זה. - אשרו מספר טלפון - הבא - מספר טלפון (לא חובה) - מספר טלפון - אנא השתמש בפורמט הבינלאומי. - הגדר מספר טלפון כדי לאפשר לאנשים שאתה מכיר לגלות אותך. - הגדר מספר טלפון - הבא - דוא\"ל (לא חובה) - דוא\"ל - הגדר דוא\"ל לשחזור חשבונך. מאוחר יותר, באפשרותך לאפשר לאנשים שאתה מכיר לגלות אותך באמצעות הדוא\"ל שלך. - הגדר כתובת דוא\"ל - הסיסמה שלך טרם שונתה. -\n -\nלהפסיק את תהליך שינוי הסיסמה\? - אזהרה - חזרה לכניסה - הוצאת אותך מכל ההפעלות ולא תקבל עוד התראות דחיפה. כדי להפעיל מחדש התראות, היכנס שוב בכל מכשיר. - הסיסמה שלך אופסה. - הצלחה! - אימתתי את כתובת הדוא\"ל שלי - הקש על הקישור כדי לאשר את הסיסמה החדשה שלך. לאחר שתעקוב אחר הקישור שהוא מכיל, לחץ למטה. - דוא\"ל אימות נשלח אל %1$s. - לבדוק את תיבת הדואר הנכנס שלך - דוא\"ל זה אינו מקושר לשום חשבון - המשך - שינוי הסיסמה שלך יאפס את כל מפתחות ההצפנה מקצה לקצה בכל ההפעלות שלך, מה שהופך את היסטוריית הצ\'אט המוצפנת לבלתי קריאה. הגדר גיבוי מקשים או ייצא את מפתחות החדר שלך מהפעלה אחרת לפני איפוס הסיסמה שלך. - אזהרה! - סיסמה חדשה - דוא\"ל - הבא - דוא\"ל אימות יישלח לתיבת הדואר הנכנס שלך כדי לאשר את הגדרת הסיסמה החדשה שלך. - אפס סיסמה ב- %1$s - דוא\"ל זה אינו משויך לשום חשבון. - היישום אינו מסוגל ליצור חשבון בשרת הבית הזה. -\n -\nהאם אתה רוצה להירשם באמצעות לקוח אינטרנט\? - מצטערים, שרת זה אינו מקבל חשבונות חדשים. - היישום אינו מסוגל להיכנס לשרת ביתי זה. שרת הבית תומך בסוגי הכניסה הבאים: %1$s. -\n -\nהאם אתה רוצה להיכנס באמצעות לקוח אינטרנט\? - אירעה שגיאה בעת טעינת הדף: %1$s (%2$d) - הזן את כתובת השרת שבו ברצונך להשתמש - הזן את כתובת השרת או האלמנט שאליו ברצונך להתחבר - הזן את כתובת האלמנט המודולרי או השרת שבו ברצונך להשתמש - אירוח פרימיום לארגונים - כתובת - כתובת שירותי מטריקס אלמנט - המשך עם SSO - הרשמה - התחברות אל %1$s - התחבר לשרת מותאם אישית - התחבר לשירותי מטריקס אלמנט - התחברות אל %1$s - המשך - התאמה אישית והגדרות מתקדמות - אחר - למד עוד - אירוח פרימיום לארגונים - הצטרף למיליונים בחינם בשרת הציבורי הגדול ביותר - בדיוק כמו דוא\"ל, לחשבונות יש בית אחד, אם כי אתה יכול לדבר עם כל אחד - בחר שרת - להתחיל - הרחב והתאם אישית את החוויה שלך - שמור על שיחות פרטיות באמצעות הצפנה - שוחח עם אנשים ישירות או בקבוצות - זו השיחה שלך. נהל אותה. - הודעות שלא נקראו - ביצעת את ההזמנה הזו בלבד. - %1$s ביצע הזמנה זו בלבד. - הכנת את החדר להזמין בלבד. - %1$s גרם לחדר להזמין בלבד. - הפכת את החדר לציבורי לכל מי שמכיר את הקישור. - %1$s הפך את החדר לציבורי לכל מי שמכיר את הקישור. - לחץ לחיצה ארוכה על חדר כדי לראות אפשרויות נוספות - אתה לא מתעלם מאף משתמש - הקלד מילות מפתח כדי למצוא תגובה. - ספויילר - שולח את ההודעה הנתונה כספוילר - לא ביצעת שינויים - %1$s לא ביצע שינויים - יציאה מהחדר - הסרה מעדיפות נמוכה - הוסף לעדיפות נמוכה - הסרה ממועדפים - הוספה למועדפים - הגדרות - השתקה - אזכורים בלבד - כל ההודעות - כל ההודעות (רועשות) - התעלם ממשתמש זה - אין חיבור רשת כרגע - אלמנט זקוק להרשאה כדי לשמור את מפתחות ה- E2E שלך בדיסק. -\n -\nאנא אפשר גישה בחלון הקופץ הבא כדי שתוכל לייצא את המפתחות שלך באופן ידני. - תוכן זה דווח כבלתי הולם. -\n -\nאם אינך רוצה לראות תוכן נוסף ממשתמש זה, תוכל להתעלם ממנו כדי להסתיר את ההודעות שלו. - דווח כבלתי הולם - תוכן זה דווח כספאם. -\n -\nאם אינך רוצה לראות תוכן נוסף ממשתמש זה, תוכל להתעלם ממנו כדי להסתיר את ההודעות שלו. - דווח כספאם - תוכן זה דווח. -\n -\nאם אינך רוצה לראות תוכן נוסף ממשתמש זה, תוכל להתעלם ממנו כדי להסתיר את ההודעות שלו. - תוכן מדווח - התעלם ממשתמש - דיווח - סיבה לדיווח על תוכן זה - דווח על תוכן זה - דוח מותאם אישית … - זה לא הולם - זה ספאם - אין קבצים בחדר זה - %1$s ב- %2$s - קבצים - אין מדיה בחדר זה - מדיה - %1$d מ- %2$d - לא ניתן היה לטפל בנתוני שיתוף - סובב וחתוך - מדבקה - גלריה - קול - מצלמה - איש קשר - קובץ - הוסף תמונה מ - אירעה שגיאה בעת אחזור הקובץ המצורף. - הקובץ \'%1$s\' (%2$s) גדול מדי להעלאה. המגבלה היא %3$s. - %s נקרא - %1$s ו- %2$s נקראו - %1$s, %2$s ו- %3$s נקראו - קפוץ לתחתית - הסתר סיסמה - הראה סיסמה - סגור את הבאנר לגיבוי המפתחות - צרו חדר חדש - צור שיחה ישירה חדשה על ידי סריקת קוד QR - צור שיחה ישירה חדשה לפי מזהה מטריקס - צור שיחה ישירה חדשה - סגור את תפריט החדר ליצור … - פתח את תפריט יצירת החדר - פתח את מגירת הניווט - שלח קובץ מצורף - נראה שלוקח יותר מדי זמן להגיב לשרת, זה יכול להיגרם מקישוריות לקויה או משגיאה בשרת. נסה שוב בעוד זמן מה. - אנא נסה שוב לאחר שתקבל את התנאים וההגבלות של שרת הבית שלך. - יומני מילוליות יסייעו למפתחים על ידי אספקת יומנים נוספים כאשר אתה שולח RageShake. גם כאשר הוא מופעל, היישום אינו רושם תוכן הודעה או נתונים פרטיים אחרים. - אפשר יומני מילוליות. - הסכים לתנאי השירות של שרת הזהות (%s) כדי לאפשר לעצמך להיות גלוי באמצעות כתובת דוא\"ל או מספר טלפון. - אתה משתף כרגע כתובות דוא\"ל או מספרי טלפון בשרת הזהות %1$s. יהיה עליך להתחבר מחדש ל- %2$s כדי להפסיק לשתף אותם. - קוד האימות אינו נכון. - קוד - הודעת טקסט נשלחה אל %s. אנא הזן את קוד האימות שהוא מכיל. - בשרת הזהות שבחרת אין שום תנאי שירות. המשך רק אם אתה סומך על בעל השירות - לשרת זהות אין תנאי שירות - אנא הזן את כתובת ה- URL של שרת הזהות - לא ניתן היה להתחבר לשרת זהות - הזן כתובת אתר של שרת זהות - על מנת לגלות אנשי קשר קיימים שאתה מכיר, האם אתה מקבל לשלוח את נתוני הקשר שלך (מספרי טלפון ו / או אימיילים) לשרת הזהות המוגדר (%1$s)\? -\n -\nלקבלת פרטיות רבה יותר, הנתונים שנשלחו ייחסמו לפני שנשלחו. - שלח מיילים ומספרי טלפון - תן הסכמה - בטל את הסכמתי - לא נתת את הסכמתך לשלוח מיילים ומספרי טלפון לשרת זהות זה כדי לגלות משתמשים אחרים מאנשי הקשר שלך. - נתת את הסכמתך לשלוח מיילים ומספרי טלפון לשרת זהות זה כדי לגלות משתמשים אחרים מאנשי הקשר שלך. - שלח מיילים ומספרי טלפון - ממתין ל - שלחנו לך אישור דוא\"ל ל- %s, אנא בדוק תחילה את הדוא\"ל שלך ולחץ על קישור האישור - שלחנו לך אישור דוא\"ל ל- %s, בדוק את הדוא\"ל שלך ולחץ על קישור האישור - מספרי טלפון נגלים - ההתנתקות משרת הזהות שלך פירושה שלא תגלה משתמשים אחרים ולא תוכל להזמין אחרים בדוא\"ל או בטלפון. - אפשרויות גילוי יופיעו לאחר הוספת מספר טלפון. - אפשרויות גילוי יופיעו לאחר הוספת דוא\"ל. - כתובות דוא\"ל הניתנות לגילוי - אינך משתמש כרגע בשרת זהות. כדי לגלות ולהיות נגלים על ידי אנשי קשר קיימים שאתה מכיר, הגדר אחד למטה. - אתה משתמש כרגע ב-%1$s כדי לגלות ולהתגלה על ידי אנשי קשר קיימים שאתה מכיר. - שנה שרת זהות - הגדר את שרת הזהות - נתק את שרת הזהות - שרת זהות - קרא ב - השתמש בבוטים, גשרים, ווידג\'טים וחבילות מדבקות - להיות גלוי על ידי אחרים - סקור תנאים - תנאי השירות - הצג היסטוריית עריכה - מצטרף לחדר … - הצעות - אנשי קשר - משתמשים ידועים - לאחרונה - סנן לפי שם משתמש או מזהה … - התחל להקליד כדי להשיג תוצאות - לא נמצאה תוצאה, השתמש בהוסף לפי מזהה מטריצה כדי לחפש בשרת. - יוצר חדר … - קוד QR - הוסף באמצעות קוד QR - הוסף לפי מזהה מטריצה - הקישור הועתק ללוח - הוסף כרטיסייה ייעודית להתראות שלא נקראו על המסך הראשי. - אפשר החלקה כדי להשיב בציר הזמן - חפש לפי שם או תעודת זהות - שם או מזהה (# לדוגמא: matrix.ahava528.com) - צפו בספריית החדרים - שלח הודעה ישירה חדשה - צרו חדר חדש - לא מצליחים למצוא את מבוקשכם\? - סנן שיחות … - לא נמצאו עריכות - עריכת הודעות - (נערך) - הורדת הקובץ %1$s הושלמה! - מוריד קובץ %1$s… - שולח קובץ (%1$s / %2$s) - מצפין קובץ … - שולח תמונה ממוזערת (%1$s / %2$s) - מצפין תמונה ממוזערת … - ממתין… - הודעות ישירות - הצג היסטוריה מלאה בחדרים מוצפנים - הצג אירועים מוסתרים בציר הזמן - ההצעה לא נשלחה (%s) - תודה, ההצעה נשלחה בהצלחה - תאר כאן את הצעתך - אנא כתוב את הצעתך למטה. - תן הצעה - הרשמת אסימון - עזרה ואודות - קול ווידאו - מבנה: - קישור: - שם מושב: - תצוגת שם אפליקציה: - מפתח דחיפה: - זהות אפליקציה: - אין שערי דחיפה רשומים - לא הוגדרו כללי דחיפה - לדחוף כללים - מומחה - אבטחה ופרטיות - העדפות - כללי - תגובות מהירות - אתה כבר צופה בחדר הזה! - הודעות צד שלישי אחרות - גרסת SDK של מטריקס - ייבא מפתחות e2e מהקובץ \"%1$s\". - אירעה שגיאה בקבלת נתוני גיבוי למפתחות - אירעה שגיאה בקבלת פרטי אמון - החדר נוצר, אך כמה הזמנות לא נשלחו מהסיבה הבאה: -\n -\n%s - פרסם חדר זה במדריך החדרים - מדריך חדרים - כל אחד יוכל להצטרף לחדר זה - ציבורי - מנהלים - יוצא מהחדר… - יציאה - יציאה מהחדר - העלאות - התראות - הגדרות - הגדרות חדר - פעולות מנהל - עוד - למד עוד - אבטחה - ההודעות כאן מוצפנות מקצה לקצה. -\n -\nההודעות שלך מאובטחות במנעולים ורק לך ולמקבל יש את המפתחות הייחודיים לפתיחתם. - ההודעות בחדר זה מוצפנות מקצה לקצה. -\n -\nההודעות שלך מאובטחות במנעולים ורק לך ולמקבל יש את המפתחות הייחודיים לפתיחתם. - ההודעות כאן אינן מוצפנות מקצה לקצה. - הודעות בחדר זה אינן מוצפנות מקצה לקצה. - ליתר ביטחון, אמת את %s על ידי בדיקת קוד חד פעמי בשני המכשירים שלך. -\n -\nליתר ביטחון, עשה זאת באופן אישי. - ממתין ל- %s… - %s מאומת - אמת. את %s - תמונת קוד QR - אם אינך יכול לסרוק את הקוד שלמעלה, ודא על ידי השוואה בין מבחר קצר וייחודי של אמוג\'י. - אמת על ידי אימוג\'י - אמת את זה על ידי השוואת אימוג\'ים - אם אינך נמצא באופן אישי, השווה במקום זאת אימוג\'י - לא יכול לסרוק - סרוק את הקוד שלהם - סרוק את הקוד עם מכשיר המשתמש האחר כדי לאמת זה את זה בצורה מאובטחת - את\\ה - אימות ידני - אמת את הפעולה הזו - בקשת אימות - אימות נשלח - קבלתם - %s קיבל - ביטלתם - %s ביטל - ממתין… - הגדרות החדר - נושא - נושא החדר (לא חובה) - שם - שם החדר - צור - חדר חדש - הודעות ישירות - חדרים - לא ניתן להציג תצוגה מקדימה של חדר זה. האם אתה רוצה להצטרף אליו\? - בשלב זה אין גישה לחדר זה. -\nנסה שוב מאוחר יותר, או בקש ממנהל החדר לבדוק אם יש לך גישה. - התצוגה המקדימה של החדר הקריא בעולם עדיין אינה נתמכת ב- Element - לא ניתן להציג תצוגה מקדימה של חדר זה - כל הקהילות - אנא המתינו… - שנה רשת - שנה - אין רשת. אנא בדוק את חיבור האינטרנט שלך. - צור חדר חדש - אירוע לקוי, לא יכול להופיע - נערך לאחרונה על ידי %1$s ב-%2$s - האירוע בהנחיית מנהל החדר - האירוע נמחק על ידי המשתמש - הראה מציין מיקום להודעות שהוסרו - הצג הודעות שנמחקו - הודעה נמחקה - תגובות - צפה בתגובות - הוסף תגובה - אהבתי - מסכים - תגובות - החדרים שלך יוצגו כאן. הקש על + שמאל למטה כדי למצוא את הקיים או התחל כמה משלך. - חדרים - שיחות ההודעה הישירה שלך יוצגו כאן. הקש על + שמאל למטה כדי להתחיל כמה. - שיחות - התעדכן כאן בהודעות שלא נקראו - ברוך הבא הביתה! - אין לך יותר הודעות שלא נקראו - כולכם נתפסתם! - הוזמן על ידי%s - שלחתי לך הזמנה - הצטרף לחדר כדי להתחיל להשתמש באפליקציה. - נסה שוב - השב - עריכה - נראה שאתה מנסה להתחבר לשרת בית אחר. האם אתה רוצה לצאת\? - לא הוגדר שום שרת זהות, הוא נדרש לאפס את הסיסמה שלך. - אינך משתמש באף שרת זהות - שגיאה לא ידועה - חוסר התאמה למשתמש - חוסר התאמה מפתח - התקבלה הודעה לא חוקית - המושב קיבל הודעה לא צפויה - ה- SAS לא התאים - התחייבות החשיש לא התאימה - הפגישה לא יכולה להסכים על הסכם מפתח, שיטת hash, MAC או SAS - המושב לא יודע על אותה עסקה - זמן קצוב לתהליך האימות - המשתמש ביטל את האימות - %s רוצה לאמת את ההפעלה שלך - בקשת אימות - אימות מושב אינטראקטיבי - האימות בוטל. -\nסיבה:%s - הצד השני ביטל את האימות. -\n%s - בקשה בוטלה - אימות מפתח - השתמש באימות מדור קודם. - שום דבר לא מופיע\? לא כל הלקוחות עדיין תומכים באימות אינטראקטיבי. השתמש באימות מדור קודם. - הבנתי - הודעות מאובטחות עם משתמש זה מוצפנות מקצה לקצה ואינן ניתנות לקריאה על ידי צדדים שלישיים. - אימתת בהצלחה את ההפעלה הזו. - מאומת! - ממתין לאישור השותף … - צפה בבקשה - קיבלת בקשת אימות נכנסת. - אמת את ההפעלה על ידי אישור המספרים הבאים מופיעים על גבי המסך של השותף - אמת את ההפעלה על ידי אישור שהאימוג\'י הבא מופיע על גבי המסך של השותף - אימות הפגישה הזו יסמן אותה כאמינה, וגם תסמן את הפגישה שלך כאמינה לשותף. - אמת את ההפעלה הזו כדי לסמן אותה כאמינה. מפגשי אמון של שותפים מעניקים לכם שקט נפשי נוסף בשימוש בהודעות מוצפנות מקצה לקצה. - בקשת אימות נכנסת - התחל לאמת - למען ביטחון מרבי אנו ממליצים לך לעשות זאת באופן אישי או להשתמש באמצעי תקשורת מהימן אחר. - אמת את זה על ידי השוואה של מחרוזת טקסט קצרה. - הוצאת מחשבון בגלל אישורים לא חוקיים או שפג תוקפם. - השתמש בקונפיגורציה - אלמנט זיהה תצורת שרת מותאמת אישית לדומיין userId שלך \"%1$s\": -\n%2$s - השלם אוטומטית אפשרויות שרת - תגובת גילוי שרת בית לא חוקית - חתימה - אלגוריתם - גירסה - כל המקשים מגובים - הגדר גיבוי מאובטח - מגבה את המפתחות שלך. זה עשוי לקחת מספר דקות… - נהל גיבוי מפתח - מקשי הודעות מאובטחים חדשים - השתמש במפתח גיבוי - בטל שינויים - יש שינויים שלא נשמרו. למחוק את השינויים\? - החדר עדיין לא נוצר. לבטל את יצירת החדר\? - הקישור היה לקוי - קוד QR לא נסרק! - קוד QR לא חוקי (URI לא חוקי)! - לא ניתן לשלוח הודעה ישירה לעצמך! - שתף לפי טקסט - לא יכול למצוא את החדר הזה. וודא שהוא קיים. - לא ניתן לפתוח חדר בו נחסמת. - אשר PIN כדי להשבית PIN - שנה את קוד ה- PIN הנוכחי שלך - שנה PIN - קוד PIN נדרש בכל פעם שאתה פותח את Element. - קוד PIN נדרש לאחר שתי דקות של אי שימוש ב- Element. - דרוש מספר PIN לאחר 2 דקות - הצג רק מספר הודעות שלא נקראו בהודעה פשוטה. - הצג פרטים כמו שמות החדרים ותוכן ההודעה. - הצג תוכן בהתראות - קוד PIN הוא הדרך היחידה לפתוח את Element. - אפשר ביומטריה ספציפית למכשירים, כמו טביעות אצבע וזיהוי פנים. - - %2$s חדר נמצא עבור %1$s - %2$s חדרים נמצאו עבור %1$s - %2$s חדרים נמצאו עבור %1$s - %2$s חדרים נמצאו עבור %1$s - - נהל - גיבוי מאובטח - הוסף לחצן במלחין ההודעות כדי לפתוח מקלדת אימוג\'י - הצג מקלדת אימוג\'י - השתמש בפקודה / confetti או שלח הודעה המכילה ❄️ או 🎉 - הצג אפקטים של צ\'אט - פועל … (%1$d מתוך%2$d) - גרסה%s - שנה נושא שיחה - שדרג את החדר - שלח אירועים m.room.server_acl - שנה הרשאות - שנה את שם החדר - שינוי נראות ההיסטוריה - אפשר הצפנת חדרים - שנה את הכתובת הראשית של החדר - שנה אוואטר חדר - שנה יישומונים - הודע לכולם - הסר הודעות שנשלחו על ידי אחרים - נדה משתמשים - בעט החוצה משתמשים - שנה הגדרות - הזמן משתמשם - שלח הודעות - תפקיד ברירת מחדל - אין לך הרשאה לעדכן את התפקידים הנדרשים לשינוי חלקים שונים בחדר - בחר את התפקידים הנדרשים לשינוי חלקים שונים של החדר - הרשאות - צפה ועדכן את התפקידים הנדרשים לשינוי חלקים שונים בחדר. - הרשאות חדרים - מדריך למשתמש (%s) - לפני%1$s%2$s - %1$s עכשיו - חדר זה אינו ציבורי. לא תוכל להצטרף שוב ללא הזמנה. - קישור הדוא\"ל שעדיין לא נלחץ עליו - אנא בקש ממנהל שרת הבית שלך (%1$s) להגדיר שרת TURN כדי שהשיחות יעבדו בצורה אמינה. -\n -\nלחלופין, אתה יכול לנסות להשתמש בשרת הציבורי ב-%2$s, אך זה לא יהיה אמין כל כך, והוא ישתף את כתובת ה- IP שלך עם השרת הזה. תוכל לנהל זאת גם בהגדרות. - (%%%s)התקדמות - אנשים - מועדפים - שיחת ועידה מתמשכת. -\nהצטרף כ- %1$s או %2$s - ברירת מחדל מערכת - קפצו לקבלת קריאה - הודעה ישירה - מותאם אישית (%1$d) ב-%2$s - ברירת מחדל ב-%1$s - מנחה ב-%1$s - מנהל מערכת ב-%1$s - משתמשים - הזמנות - מותאם אישית - מנחים - - אדם אחד - %1$d אנשים - %1$d אנשים - %1$d אנשים - - - יותר מדי בקשות נשלחו. תוכל לנסות שוב בעוד%1$d שנייה … - יותר מדי בקשות נשלחו. תוכלו לנסות שוב בעוד%1$d שניות … - יותר מדי בקשות נשלחו. תוכלו לנסות שוב בעוד%1$d שניות … - יותר מדי בקשות נשלחו. תוכלו לנסות שוב בעוד%1$d שניות … - - נקה היסטוריה - כניסה יחידה - היכנס באמצעות%s - הירשם עם%s - המשך עם%s - או - - משתמש %d קרא - %d משתמשים קראו - %d משתמשים קראו - %d משתמשים קראו - - - %1$s,%2$s ו-%3$d אחרים קראו - %1$s,%2$s ו-%3$d אחרים קוראים - %1$s,%2$s ו-%3$d אחרים קוראים - %1$s,%2$s ו-%3$d אחרים קוראים - - - גיבוי המפתח%d … - גיבוי%d המפתחות … - מגבה%d המפתחות … - מגבה%d המפתחות … - - - %d מפתח חדש נוסף להפעלה זו. - %d מפתחות חדשים נוספו להפעלה זו. - %d מפתחות חדשים נוספו להפעלה זו. - %d מפתחות חדשים נוספו להפעלה זו. - - - שוחזרו גיבויים עם %d מפתח. - שוחזרו גיבויים עם מפתחות%d. - שוחזרו גיבויים עם מפתחות%d. - שוחזרו גיבויים עם מפתחות%d. - - טעינת היישומון נכשלה. -\n%s - - %b משתמש נחסם - %b משתמשים נחסמו - %b משתמשים נחסמו - %b משתמשים אחרים נחסמו - - אירעה שגיאה בעת אימות כתובת הדוא\"ל שלך. - מספר הטלפון הזה כבר נמצא בשימוש. - כתובת דוא\"ל זו לא נמצאה. - כתובת דוא\"ל זו כבר נמצאת בשימוש. - לא ניתן לאמת את כתובת הדוא\"ל. אנא בדוק את הדוא\"ל שלך ולחץ על הקישור שהוא מכיל. לאחר שתסיים, לחץ על המשך. - אנא בדוק את הדוא\"ל שלך ולחץ על הקישור שהוא מכיל. לאחר שתסיים, לחץ על המשך. - אימות בהמתנה - בחר שפה - שפה - ממשק משתמש - הפעל את \'אפשר שילובים\' בהגדרות כדי לעשות זאת. - שילובים מושבתים - מנהל אינטגרציה - אפשר שילובים - שרת הזדהות - שרת ביתי - מחובר כ - הגש - סיסמה: - הזדהות - פעולה זו דורשת אימות נוסף. -\nכדי להמשיך, הזן את הסיסמה שלך. - נראה לאחרונה - עדכן שם ציבורי - שם ציבורי - תעודת זהות - מידע על מושב - מצב שמירת נתונים מחיל מסנן ספציפי כך שמסוננים עדכוני נוכחות והודעות הקלדה. - מצב שמירת נתונים - כן, אני רוצה לעזור! - אנא אפשר ניתוח נתונים כדי לעזור לנו לשפר את Element. - אלמנט אוסף ניתוח אנונימי כדי לאפשר לנו לשפר את היישום. - שלח נתוני ניתוח - ניתוח נתונים - הענק הרשאה - אלמנט צריך לשמור על חיבור רקע בעל השפעה נמוכה על מנת לקבל הודעות אמינות. -\nבמסך הבא תתבקש לאפשר לאלמנט לרוץ תמיד ברקע, אנא קבל. - חיבור ברקע - בחר באפשרות אחרת - מתן הרשאה - אלמנט יכול לרוץ ברקע כדי לנהל את ההתראות שלך בצורה מאובטחת ופרטית. זה עשוי להשפיע על השימוש בסוללה. - פרטיות הודעות - נהל את הגדרות הגילוי שלך. - תַגלִית - הפוך את המשתמש שלי ללא פעיל - השבת את החשבון - זה יחליף את המפתח או את הביטוי הנוכחי שלך. - צור מפתח אבטחה חדש או הגדר ביטוי אבטחה חדש לגיבוי הקיים שלך. - הגן מפני אובדן גישה להודעות ונתונים מוצפנים על ידי גיבוי של מפתחות הצפנה בשרת שלך. - הגדר במכשיר זה - אפס גיבוי מאובטח - הגדר גיבוי מאובטח - אם תבטל, לא תוכל לקרוא הודעות מוצפנות במכשיר החדש שלך, ומשתמשים אחרים לא יסמכו עליו - אם תבטל, לא תוכל לקרוא הודעות מוצפנות במכשיר זה, ומשתמשים אחרים לא יסמכו על כך - ייתכן שחשבונך נפגע - זה לא אני - השתמש בפגישה זו כדי לאמת את הפגישה החדשה שלך, והעניק לה גישה להודעות מוצפנות. - הקש כדי לבדוק ולאמת - כניסה חדשה. זה אתם\? - ריענון - בטל את נעילת היסטוריית ההודעות המוצפנות - ייצוא ביקורת - בקשות מפתח - אלמנט אנדרואיד - המפתחות כבר מעודכנים! - האירוע בהנחיית מנהל החדר, סיבה: %1$s - האירוע נמחק על ידי המשתמש, הסיבה: %1$s - סיבה לניתוח מחדש - כלול סיבה - האם אתה בטוח שברצונך להסיר (למחוק) אירוע זה\? שים לב שאם תמחק שם של חדר או שינוי נושא, זה עלול לבטל את השינוי. - אשר הסרהאשר הסרה - האם אתה רוצה לשלוח את הקובץ המצורף ל- %1$s\? - הסר… - עליך לגשת לאחסון סודי רק ממכשיר מהימן - אזהרה: - הזן ביטוי סיסמא לאחסון סודי - לא ניתן למצוא סודות באחסון - כניסה חדשה - אם אינך יכול לגשת להפעלה קיימת - השתמש בביטוי סיסמה או מפתח שחזור - יוצר סקר פשוט - אפשרות נבחרת - למחוק את נתוני החשבון מסוג %1$s\? -\n -\nהשתמש בזהירות, זה עלול להוביל להתנהגות בלתי צפויה. - נתוני חשבון - אפשר ביומטריה - אם ברצונך לאפס את הקוד שלך, הקש על שכחת קוד כדי לצאת ולאפס. - אפשר PIN - הגדר הגנה - הגן על הגישה באמצעות קוד וביומטריה. - הגן על הגישה - כדי לאפס את הקוד שלך, יהיה עליך להתחבר מחדש וליצור קוד חדש. - קוד חדש - אתחל קוד - שכחתם קוד\? - הכנס את הקוד שלך - אימות ה- PIN נכשל, הקש על קוד חדש. - אשר PIN - השתמש במפתח אבטחה - התקן - הגן מפני אובדן גישה להודעות ונתונים מוצפנים על ידי גיבוי של מפתחות הצפנה בשרת שלך. - - %d הצבעה - %d הצבעות - %d הצבעות - %d הצבעות - - כלי מפתחים - מצב טיסה פועל - הקישוריות לשרת אבדה - לא - כן - כמעט שם! האם%s מציג את אותו מגן\? - קוד QR - אפס מקשים - אתחל את CrossSigning - עד שמשתמש זה בוטח בהפעלה זו, הודעות שנשלחות אליה וממנה מתויגות באזהרות. לחילופין, ניתן לאמת זאת ידנית. - %1$s (%2$s) נכנס באמצעות הפעלה חדשה: - הפעלה זו מהימנה להודעות מאובטחות מכיוון ש-%1$s (%2$s) אימת אותה: - לא מהימן - מהימן - מושבים - קבלת הפעלות נכשלה - אזהרה - מאומת - בצע אימות - השתמש בפגישה קיימת כדי לאמת את זה, והעניק לו גישה להודעות מוצפנות. - אבטחה מלאה - משתמשים אחרים עשויים שלא לסמוך על כך - אמת כניסה זו - - %d מושב פעיל - %d מושבים פעילים - %d מושבים פעילים - %d מושבים פעילים - - אמת את ההפעלה הזו כדי לסמן אותה כאמינה והענק לה גישה להודעות מוצפנות. אם לא נכנסת למפגש זה ייתכן שחשבונך נפגע: - הפגישה הזו מהימנה בהודעות מאובטחות מכיוון שאמתת אותה: - אין מידע קריפטוגרפי זמין - צא מפגישה זו - נהל מושבים - הצג את כל הפעילויות באתר - מושבים אקטיביים - מנהל השרת שלך השבית הצפנה מקצה לקצה כברירת מחדל בחדרים פרטיים ובהודעות ישירות. - חתימה צולבת אינה מופעלת - חתימה צולבת מופעלת. -\nלא סומכים על מקשים - חתימה צולבת מופעלת -\nמקשים מהימנים. -\nמפתחות פרטיים אינם ידועים - חתימה צולבת מופעלת -\nמפתחות פרטיים במכשיר. - חתימה צולבת - ההפעלה החדשה שלך אומתה. יש לו גישה להודעות המוצפנות שלך, ומשתמשים אחרים יראו בכך אמינים. - הודעות עם משתמש זה מוצפנות מקצה לקצה ולא ניתן לקרוא על ידי צדדים שלישיים. - השווה את הקוד לזה שמוצג על מסך המשתמש האחר. - השווה את האימוג\'י הייחודי, וודא שהם מופיעים באותו סדר. - כדי להיות בטוחים, עשו זאת באופן אישי או השתמשו בדרך אחרת לתקשר. - כדי להיות בטוחים, אמת את%s על ידי בדיקת קוד חד פעמי. - אפשר הצפנה - לאחר הפעלתו, לא ניתן להשבית את ההצפנה לחדר. הודעות שנשלחות בחדר מוצפן אינן נראות על ידי השרת, רק על ידי משתתפי החדר. הפעלת הצפנה עשויה למנוע בוטים וגשרים רבים לעבוד כראוי. - לאפשר הצפנה\? - לאחר הפעלתו, לא ניתן להשבית את ההצפנה. - אין לך הרשאה לאפשר הצפנה בחדר זה. - אפשר הצפנה מקצה לקצה … - עורך הודעה - ציר הזמן - שולח את הטקסט הנתון בצבע קשת - שולח את ההודעה הנתונה בצבע קשת - חדרים אחרים - חדרים אחרונים - הפעלה זו אינה יכולה לשתף את האימות הזה עם הפעלות אחרות שלך. -\nהאימות יישמר באופן מקומי וישותף בגרסה עתידית של האפליקציה. - בטל התעלמות - אלמנט נתקל בבעיה בעת הצגת תוכן האירוע עם המזהה \'%1$s\' - %1$s @ %2$s - שולח את ההודעה הנתונה עם קונפטי - תתחיל מחדש ללא היסטוריה, ללא הודעות, מכשירים מאומתים או משתמשים מאומתים - אם תאפס הכל - עשה זאת רק אם אין לך מכשיר אחר שאיתו תוכל לאמת מכשיר זה. - אפס הכל - שכחת או איבדת את כל אפשרויות הגיבוי\? אפס הכל - הגישה לאחסון מאובטח נכשלה - לא ניתן היה לפענח את הגיבוי באמצעות מפתח השחזור הזה: ודא שהזנת את מפתח השחזור הנכון. - בחר במפתח השחזור שלך, או הזן אותו ידנית על ידי הקלדתו או הדבקתו מהלוח שלך - השתמש במפתח השחזור - השתמש ב- %1$s שלך או השתמש ב- %2$s שלך כדי להמשיך. - נתמך רק בחדרים מוצפנים - מכריח את ההפעלה הקבוצתית החוצה הנוכחית בחדר מוצפן להיזרק - השתמש באלמנט האחרון במכשירים האחרים שלך: - או לקוח מטריקס אחר עם יכולת חתימה צולבת - אלמנט iOS -\nאלמנט אנדרואיד - רשת האינטרנט -\nשולחן העבודה של אלמנט - השתמש באלמנט העדכני ביותר במכשירים האחרים שלך, Element Web, Element Desktop, Element iOS, Element for Android, או לקוח מטריקס אחר עם יכולת חתימה צולבת - הגדר סיסמת חשבון חדשה … - לא ניתן היה לשמור את קובץ המדיה - לא ניתן היה להוסיף קובץ מדיה לגלריה - קובץ מדיה נוסף לגלריה - הפעלת הגדרה זו מוסיפה את FLAG_SECURE לכל הפעילויות. הפעל מחדש את היישום כדי שהשינוי ייכנס לתוקף. - מנע צילומי מסך של היישום - מפתח שחזור גיבוי מפתח - אינך יודע את משפט הסיסמה לגיבוי מפתח שלך, אתה יכול %s. - השתמש במפתח השחזור של גיבוי המפתח שלך - הזן את משפט הסיסמה לגיבוי מפתח כדי להמשיך. - %1$s (%2$s) - אחסון סוד הגיבוי המקשים ב- SSSS - יצירת מפתח SSSS ממפתח התאוששות - יוצר מפתח SSSS מביטוי סיסמה (%s) - יצירת מפתח SSSS מביטוי סיסמה - קבלת מפתח עקומה - בודק מפתח גיבוי (%s) - בודק מפתח גיבוי - אנא הכנס מפתח שחזור - זה לא מפתח שחזור תקף - ביטוי סיסמה לשחזור - הזן %s - השתמש בקובץ - הזן את %s שלך כדי להמשיך - אמת את עצמך ואחרים בכדי לשמור על הצ\'אטים שלך - אפשר חתימה צולבת - שדרוג הצפנה זמין - הודעה… - חשבון זה הושבת. - שם משתמש ו / או סיסמה שגויים. הסיסמה שהוזנה מתחילה או מסתיימת ברווחים, אנא בדוק אותה. - שולח הודעה כטקסט רגיל, מבלי לפרש אותה כסימון - הגדר חשיבות התראה לפי אירוע - פתרון בעיות - כאשר משודרגים חדרים - הודעות מוצפנות בצ\'אטים קבוצתיים - הודעות מוצפנות בצ\'אטים אחד לאחד - הודעות המכילות @room - תצורת התראות - ייבוא המפתחות נכשל - ממתין ל-%s … - כמעט שם! מחכה לאישור… - כמעט שם! האם המכשיר השני מציג את אותו מגן\? - "נושא: " - הוספת נושא - %s כדי להודיע לאנשים על מה החדר הזה. - זוהי ההתחלה של היסטוריית ההודעות הישירות שלך עם%s. - זו תחילתה של השיחה הזו. - זו ההתחלה ש ל%s. - הצתרפתם. - %s הצטרף. - יצרת ותגדרת את החדר. - %s יצר את החדר והגדיר אותו. - ההצפנה בה משתמשים בחדר זה אינה נתמכת - ההצפנה לא מופעלת - ההודעות בחדר זה מוצפנות מקצה לקצה. - ההודעות בחדר זה מוצפנות מקצה לקצה. למידע נוסף ואמת משתמשים בפרופיל שלהם. - ההצפנה מופעלת - אם תבטל עכשיו, אתה עלול לאבד הודעות ונתונים מוצפנים אם תאבד את הגישה לכניסות שלך. -\n -\nאתה יכול גם להגדיר גיבוי מאובטח ולנהל את המפתחות שלך בהגדרות. - הגדרת ביטוי סיסמה לשחזור מאפשרת לך לאבטח ולפתוח הודעות מוצפנות ואמון. - הגדרת ביטוי סיסמה לשחזור מאפשרת לך לאבטח ולפתוח הודעות מוצפנות ואמון. -\n -\nאם אינך רוצה להגדיר סיסמת הודעה, צור במקום זאת מפתח הודעה. - אינך יכול לעשות זאת מנייד - העתק אותו לאחסון הענן האישי שלך - שמור אותו במפתח USB או בכונן גיבוי - הדפיסו ואחסנו במקום בטוח - %2$s ו %1$s מוגדרים כעת. -\n -\nתשמור עליהם! תזדקק להם בכדי לפתוח הודעות מוצפנות ומידע מאובטח אם תאבד את כל ההפעלות הפעילות שלך. - הגדרת גיבוי מקשים - סנכרון מפתח חתימה עצמית - סנכרון מפתח משתמש - סנכרון מפתח ראשי - הגדרת מפתח ברירת מחדל של SSSS - יצירת מפתח מאובטח מביטוי סיסמה - פרסום מפתחות זהות שנוצרו - השתמש ב- %1$s זה כרשת ביטחון למקרה שאתה שוכח את %2$s שלך. - סיום - שמור על זה בטוח - סיימתם! - מפתח ההתאוששות שלך - הגדרת התאוששות. - פעולה זו עשויה לארוך מספר שניות, אנא התאזר בסבלנות. - הזן ביטוי אבטחה רק אתה מכיר, המשמש לאבטחת סודות בשרת שלך. - אל תשתמש בסיסמת חשבונך. - הזן שוב את %s שלך כדי לאשר זאת. - אבטח ופתח נעילת הודעות מוצפנות ואמון באמצעות %s. - הזן את ה- %s בכדי להמשיך. - אשר %s - צור מפתח הודעה - הגדר %s - סיסמת חשבון - מפתח הודעה - ביטוי סיסמה לשחזור - האימות בוטל - אמת את המכשירים שלך מההגדרות. - אחד מהדברים הבאים עלול להתפשר: -\n -\n- הסיסמה שלך -\n- שרת הבית שלך -\n- מכשיר זה, או המכשיר האחר -\n- חיבור האינטרנט שמשני המכשירים משתמשים בו -\n -\nאנו ממליצים לך לשנות את הסיסמה ומפתח השחזור שלך בהגדרות באופן מיידי. - לא תאמת את %1$s (%2$s) אם תבטל עכשיו. התחל שוב בפרופיל המשתמש שלהם. - - שלח תמונה בגודל המקורי - שלח תמוננות בגודל המקורי - שלח תמונות בגודל המקורי - שלח תמונות בגודל המקורי - - - %d הצבעה - תוצאות סופיות - %d הצבעות - תוצאות סופיות - %d הצבעעות - תוצאות סופיות - %d הצבעות - תוצאות סופיות - - בחר PIN לאבטחה - שגיאות רבות מדי, יצאת מהחשבון - אַזהָרָה! ניסיון אחרון שנותר לפני היציאה! - - קוד שגוי,%d ניסיון נוסף - קוד שגוי,%d ניסיונות נוספים - קוד שגוי,%d ניסיונות נוספים - קוד שגוי,%d ניסיונות נוספים - - בדוק את ההגדרות שלך כדי לאפשר התראות דחיפה - התראות קופצות מושבתות - נכשל המשתמש לבטל את הסילוק - נחסם על ידי%1$s - לבטל את ההזמנה ל-%1$s\? - בטל הזמנה - חפש אנשי קשר ב-Matrix - אנשי הקשר - ספר אנשי הקשר שלך ריק - מאחזר את אנשי הקשר שלך … - חפש באנשי הקשר שלי - ספר טלפונים - ספר הטלפונים שלך ריק - הוסף מפנקס הטלפונים שלי - שמור מפתח שחזור פנימה - רכיב - למד עוד - הבנת - אנו שמחים לבשר ששינינו שם! האפליקציה שלך מעודכנת ואתה מחובר לחשבונך. - Riot היא עכשיו Element! - ממתין להיסטוריית הצפנה - אינך יכול לגשת להודעה זו מכיוון שהשולח בכוונה לא שלח את המפתחות - אינך יכול לגשת להודעה זו מכיוון שהשולח אינו מהימן על ההפעלה שלך - אינך יכול לגשת להודעה זו מכיוון שנחסמת על ידי השולח - עקב הצפנה מקצה לקצה, ייתכן שיהיה עליך להמתין להגעת ההודעה של מישהו מכיוון שמפתחות ההצפנה לא נשלחו אליך כראוי. - לא ניתן לפענח - בהמתנה להודעה זו, זה עשוי לקחת זמן מה - אינך יכול לגשת להודעה זו - הגדר אווטר - שינית בהצלחה את הגדרות החדר - נושא - שם החדר - אחסן את מפתח האבטחה שלך במקום בטוח, כמו מנהל סיסמאות או כספת. - שמור את מפתח האבטחה שלך - הזן את ביטוי האבטחה שלך שוב כדי לאשר אותו. - ביטוי אבטחה - הזן ביטוי אבטחה רק אתה מכיר, המשמש לאבטחת סודות בשרת שלך. - הגדר ביטוי אבטחה - אחסן את מפתח האבטחה שלך במקום בטוח, כמו מנהל סיסמאות או כספת. - שמור את מפתח האבטחה שלך - הזן ביטוי סודי שרק אתה יודע, וצור מפתח לגיבוי. - השתמש בביטוי אבטחה - צור מפתח אבטחה כדי לאחסן מקום בטוח כמו מנהל סיסמאות או כספת. - הגדר גיבוי מאובטח - הגדר גיבוי מאובטח - הפעל את המצלמה - עצור את המצלמה - בטל את ההשתקה של המיקרופון - השתק את המיקרופון - פתח צ\'אט - תַפְקִיד - הגדר תפקיד - שלח - הזן את כתובת ה- URL של שרת זהות - לחלופין, תוכל להזין כל כתובת אתר אחרת של שרת URL - השתמש ב-%1$s - שרת הבית שלך (%1$s) מציע להשתמש ב-%2$s עבור שרת הזהות שלך - הסכמת המשתמש לא סופקה. - אין קשר נוכחי למזהה זה. - העמותה נכשלה. - למען הפרטיות שלך, אלמנט תומך רק בשליחת הודעות דוא\"ל של משתמשים, בליל ומספר טלפון. - אנא קבל תחילה את התנאים של שרת הזהות בהגדרות. - אנא הגדר תחילה שרת זהות. - פעולה זו אינה אפשרית. שרת הבית מיושן. - שרת זהות זה מיושן .Element תומך רק ב- API V2. - להתנתק משרת הזהות%s\? - תנאים פתוחים של%s - טוען שפות זמינות … - שפות זמינות אחרות - שפה נוכחית - שתף את הקוד הזה עם אנשים כדי שיוכלו לסרוק אותו כדי להוסיף אותך ולהתחיל לשוחח. - הקוד שלי - סרוק קוד QR - לא יכולנו להזמין משתמשים. אנא בדוק את המשתמשים שברצונך להזמין ונסה שוב. - - הזמנות נשלחו אל%1$s ואחד נוסף - הזמנות נשלחו אל%1$s ואחרים - הזמנות נשלחו אל%1$s ואחרים - הזמנות נשלחו אל%1$s ואחריםה - - זה לא קוד QR מטריציוני תקף - הזמנות נשלחו אל%1$s ו-%2$s - ההזמנה נשלחה אל%1$s - 🔐️ הצטרפו אלי באלמנט - היי, דבר איתי באלמנט:%s - להזמין חברים - הזמן משתמשים - מזמין משתמשים … - להזמין - הוסף אנשים - לא הצלחנו ליצור את ה- DM שלך. אנא בדוק את המשתמשים שברצונך להזמין ונסה שוב. - הקישור%1$s מעביר אותך לאתר אחר:%2$s. -\n -\nהאם אתה בטוח שאתה רוצה להמשיך\? - בדוק-פעמיים קישור זה - אנא בחר סיסמה. - אנא בחר שם משתמש. - מצטערים, פעולה זו עדיין אינה אפשרית עבור חשבונות המחוברים באמצעות כניסה יחידה. - סמן כאמין - אשר את זהותך על ידי אימות התחברות זו והעניק לו גישה להודעות מוצפנות. - אימות אינטראקטיבי על ידי Emoji - אמת כניסה - - הראה את המכשיר שאיתו תוכל לאמת כעת - הראה את המכשירים שאיתם תוכל לאמת כעת - הראה את המכשירים שאיתם תוכל לאמת כעת - הראה את המכשירים שאיתם תוכל לאמת כעת - - אמת ידנית באמצעות טקסט - אמת את הכניסה החדשה שניגשת לחשבונך: %1$s - אמת את כל ההפעלות שלך כדי להבטיח שהחשבון וההודעות שלך בטוחים - בדוק היכן נכנסת - מוצפן על ידי מכשיר לא מאומת - לא מוצפן - שולח שלג ❄️ - שולח קונפטי 🎉 - שתף את הקוד שלי - הוסף משתמשים - אשר את זהותך על ידי אימות התחברות זו מאחד מהפגישות האחרות שלך, והעניק לה גישה להודעות מוצפנות. - \ No newline at end of file diff --git a/vector/src/main/res/values-hr/strings.xml b/vector/src/main/res/values-hr/strings.xml index 3feac0f644..ae1e86433d 100644 --- a/vector/src/main/res/values-hr/strings.xml +++ b/vector/src/main/res/values-hr/strings.xml @@ -2,8 +2,7 @@ Svijetla tema Tamna tema - Crna tema - Tema Status.im-a + Crna tema Inicijalizacija servisa Sinkronizacija u tijeku… Osluškivanje događaja @@ -116,7 +115,7 @@ Popis korisnika Samo kontakti u Matrixu Nema razgovora - Niste Elementu omogućili pristup Vašim lokalnim kontaktima + Niste ${app_name}u omogućili pristup Vašim lokalnim kontaktima Nema rezultata Nije podešen poslužitelj identiteta. Sobe @@ -248,7 +247,7 @@ Ponovno zatražite ključeve za šifriranje od Vaših drugih sesija. Zahtjev za ključ je poslan. Zahtjev poslan - Pokrenite Element na nekom drugom uređaju koji može dešifrirati poruku kako bi poslao ključeve ovoj sesiji. + Pokrenite ${app_name} na nekom drugom uređaju koji može dešifrirati poruku kako bi poslao ključeve ovoj sesiji. Popis potvrda o pročitanim porukama Popis grupa @@ -270,7 +269,7 @@ Naziv sobe Tema sobe Pozivi - Koristi zadan zvuk tona Elementa za dolazne pozive + Koristi zadan zvuk tona ${app_name}a za dolazne pozive Dozvoli rezervnog poslužitelja za pozivnog pomoćnika Koristit će se %s kao pomoćnik u slučaju da ga Vaš poslužitelj nema (Vaša IP adresa će biti podijeljena tijekom poziva) Zvuk tona dolaznog poziva @@ -292,22 +291,22 @@ Napravi fotografiju ili video zapis Nije moguće snimiti video zapis Informacije - Element treba dozvolu pristupa Vašoj kolekciji fotografija i video zapisa za slanje i spremanje privitaka. + ${app_name} treba dozvolu pristupa Vašoj kolekciji fotografija i video zapisa za slanje i spremanje privitaka. \n \nOmogućite pristup putem sljedećeg skočnog prozora kako biste mogli slati datoteke s Vašeg uređaja. - Element treba dozvolu pristupa Vašoj kameri za snimanje fotografija i za video pozive. + ${app_name} treba dozvolu pristupa Vašoj kameri za snimanje fotografija i za video pozive. " \n \nOmogućite pristup putem sljedećeg skočnog prozora kako biste mogli uspostaviti poziv." - Element treba dozvolu pristupa Vašem mikrofonu za obavljanje zvučnih poziva. + ${app_name} treba dozvolu pristupa Vašem mikrofonu za obavljanje zvučnih poziva. " \n \nOmogućite pristup putem sljedećeg skočnog prozora kako biste mogli uspostaviti poziv." - Element treba dozvolu pristupa Vašoj kameri i mikrofonu za obavljanje video poziva. + ${app_name} treba dozvolu pristupa Vašoj kameri i mikrofonu za obavljanje video poziva. \n \nOmogućite pristup putem sljedećih skočnih prozora kako biste mogli uspostaviti poziv. - Element može provjeriti Vaš imenik kako bi našao druge korisnike Matrixa temeljem njihove e-pošte i telefonskih brojeva. Ako se slažete podijeliti imenik u ove svrhe, dozvolite pristup putem sljedećeg skočnog prozora. - Element može provjeriti Vaš imenik kako bi našao druge korisnike Matrixa temeljem njihove e-pošte i telefonskih brojeva. + ${app_name} može provjeriti Vaš imenik kako bi našao druge korisnike Matrixa temeljem njihove e-pošte i telefonskih brojeva. Ako se slažete podijeliti imenik u ove svrhe, dozvolite pristup putem sljedećeg skočnog prozora. + ${app_name} može provjeriti Vaš imenik kako bi našao druge korisnike Matrixa temeljem njihove e-pošte i telefonskih brojeva. \n \nŽelite li podijeliti imenik u ove svrhe\? Nažalost, radnja nije izvršena zbog nedostatka dozvola @@ -514,7 +513,7 @@ Prihvatite certifikat samo ako je poslužiteljski administrator objavio otisak prsta koji odgovara gore navedenom otisku. Smanji prioritet Potvrdite Vašu lozinku - Ovo nije moguće napraviti iz mobilne inačice Elementa + Ovo nije moguće napraviti iz mobilne inačice ${app_name}a Potrebna je ovjera Napredne postavke obavijesti Važnost obavijesti po događajima @@ -538,8 +537,8 @@ Uključi Postavke sesije. Obavijesti su uključene za ovu sesiju. - Obavijesti su isključene za ovu sesiju. -\nProvjerite postavke Elementa. + Obavijesti su isključene za ovu sesiju. +\nProvjerite postavke ${app_name}a. Uključi Prilagođene postavke. Uočite da su neke poruke postavljene na tiho (doći će do obavijesti bez zvuka). @@ -548,7 +547,7 @@ Provjeri postavke Provjera Usluga za Play APK Usluga za Google Play je dostupan i ažuriran. - Element koristi Usluge za Google Play kako bi isporučio poruke, no čini se da nisu ispravno podešene. + ${app_name} koristi Usluge za Google Play kako bi isporučio poruke, no čini se da nisu ispravno podešene. \n%1$s Popravi Usluge za Play Firebaseova oznaka @@ -556,12 +555,12 @@ \n%1$s Neuspješno dohvaćanje oznake FCM-a: \n%1$s - [%1$s] -\nElement nema kontrolu nad ovom greškom te prema Googleu ova greška ukazuje da uređaj ima previše prijavljenih aplikacija na FCM-u. Greška se pojavljuje samo u slučajevima u kojima postoji krajnje mnogo aplikacija te to ne bi trebao biti slučaj kod prosječnog korisnika. - [%1$s] -\nElement nema kontrolu nad ovom greškom. Nekoliko je mogućih razloga za grešku. Možda će raditi ako kasnije ponovno pokušate. Također u postavkama sustava možete provjeriti da Usluge za Google Play nisu ograničene u korištenju podatkovnog prometa i da je sat Vašeg uređaja točan. Greška je moguća i na prilagođenim ROM-ovima. - [%1$s] -\nElement nema kontrolu nad ovom greškom. Na uređaju ne postoji račun pri Googleu. Možete otvoriti upravitelja računima i dodati račun pri Googleu. + [%1$s] +\n${app_name} nema kontrolu nad ovom greškom te prema Googleu ova greška ukazuje da uređaj ima previše prijavljenih aplikacija na FCM-u. Greška se pojavljuje samo u slučajevima u kojima postoji krajnje mnogo aplikacija te to ne bi trebao biti slučaj kod prosječnog korisnika. + [%1$s] +\n${app_name} nema kontrolu nad ovom greškom. Nekoliko je mogućih razloga za grešku. Možda će raditi ako kasnije ponovno pokušate. Također u postavkama sustava možete provjeriti da Usluge za Google Play nisu ograničene u korištenju podatkovnog prometa i da je sat Vašeg uređaja točan. Greška je moguća i na prilagođenim ROM-ovima. + [%1$s] +\n${app_name} nema kontrolu nad ovom greškom. Na uređaju ne postoji račun pri Googleu. Možete otvoriti upravitelja računima i dodati račun pri Googleu. Dodaj račun Registracija oznake Oznaka FCM-a je uspješno registrirana pri Vašem poslužitelju. @@ -577,17 +576,17 @@ Neuspjelo ponovno pokretanje servisa Pokreni pri podizanju sustava Servis će se pokrenuti prilikom ponovnog pokretanja uređaja. - Servis se neće pokrenuti sa ponovnim pokretanjem uređaja pa nećete primati obavijesti sve dok ne otvorite Element. + Servis se neće pokrenuti sa ponovnim pokretanjem uređaja pa nećete primati obavijesti sve dok ne otvorite ${app_name}. Omogući pokretanje pri podizanju sustava Provjeri pozadinska ograničenja - Pozadinska su ograničenja onemogućena za Element. Ovaj test trebate izvršiti putem podatkovne veze (bez WIFI-ja). + Pozadinska su ograničenja onemogućena za ${app_name}. Ovaj test trebate izvršiti putem podatkovne veze (bez WIFI-ja). \n%1$s - Pozadinska su ograničenja omogućena za Element. + Pozadinska su ograničenja omogućena za ${app_name}. \nRadnje koje aplikacija pokušava napraviti su bitno ograničene dok je u pozadini i ovo možete utjecati na obavijesti. \n%1$s Onemogući ograničenja Optimiranje baterije - Optimiranje baterije ne utječe na Element. + Optimiranje baterije ne utječe na ${app_name}. Ako korisnik uz ugašen zaslon ostavi uređaj nepriključenog i u mirovanju tijekom nekog vremena, uređaj će ući u način drijemanja. Ovo aplikacijama onemogućuje pristup mreži i odgađa njihove zadatke, sinkronizaciju i uobičajene alarme. Zanemari optimiranje Obično @@ -617,11 +616,11 @@ Pozadinska sinkronizacija Način pozadinske sinkronizacije (eksperimentalno) Optimirano za bateriju - Element će sinkronizirati u pozadini na način koji čuva ograničena sredstva uređaja (baterija). + ${app_name} će sinkronizirati u pozadini na način koji čuva ograničena sredstva uređaja (baterija). \nOvisno o stanju sredstava uređaja, operacijski sustav može odgoditi sinkronizaciju. Optimirano za stvarno vrijeme - Element će u pozadini i periodično u točno određeno vrijeme koje je podesivo vršiti sinkronizaciju. -\nOvo će imati utjecaja na korištenje radijskog sustava i potrošnju baterije. Uočit ćete stalno prikazanu obavijest da Element osluškuje događaje. + ${app_name} će u pozadini i periodično u točno određeno vrijeme koje je podesivo vršiti sinkronizaciju. +\nOvo će imati utjecaja na korištenje radijskog sustava i potrošnju baterije. Uočit ćete stalno prikazanu obavijest da ${app_name} osluškuje događaje. Bez pozadinske sinkronizacije Nećete primati obavijesti o dolaznim porukama kada je aplikacija u pozadini. Neuspjela promjena postavki. @@ -680,17 +679,17 @@ Pronalaženje Upravljajte Vašim postavkama za pronalaženje. Privatnost obavještavanja - Element se može izvršavati u pozadini kako bi sigurno i privatno upravljao Vašim obavijestima. Ovo može utjecati na potrošnju baterije. + ${app_name} se može izvršavati u pozadini kako bi sigurno i privatno upravljao Vašim obavijestima. Ovo može utjecati na potrošnju baterije. Dozvoli Izaberi drugu opciju Pozadinska veza - Element treba održati pozadinsku vezu s malim utjecajem kako bi imao pouzdane obavijesti. -\nNa sljedećem zaslonu potvrdite Elementov zahtjev za stalnim izvršavanjem u pozadini. + ${app_name} treba održati pozadinsku vezu s malim utjecajem kako bi imao pouzdane obavijesti. +\nNa sljedećem zaslonu potvrdite ${app_name}ov zahtjev za stalnim izvršavanjem u pozadini. Dozvoli Analitika Pošalji analitičke podatke - Element skuplja anonimnu analitiku kako bi se unaprijedila aplikacija. - Omogućite analitiku ako želite pomoći unaprijediti Element. + ${app_name} skuplja anonimnu analitiku kako bi se unaprijedila aplikacija. + Omogućite analitiku ako želite pomoći unaprijediti ${app_name}. Da, želim pomoći! Način uštede podataka Način uštede podataka primjenjuje određeno izdvajanje u kojem se ne navode novosti o prisutnosti i obavijesti o tipkanju. @@ -903,7 +902,7 @@ Fraza-lozinka se ne podudara Unesite fraza-lozinku Fraza-lozinka je preslaba - Izbrišite fraza-lozinku ako želite da Element generira ključ za obnovu. + Izbrišite fraza-lozinku ako želite da ${app_name} generira ključ za obnovu. Zahtjev za potvrdom %s želi potvrditi Vašu sesiju Korisnik je prekinuo potvrdu @@ -951,7 +950,7 @@ Pričekajte… Sve zajednice Nije moguće pregledati sobu - Pregled sobe u koju svatko ima uvid još nije podržan u Element-u + Pregled sobe u koju svatko ima uvid još nije podržan u ${app_name}-u Sobe Izravne poruke Nova soba @@ -1234,7 +1233,6 @@ Adresa Plaćeno gošćenje za organizacije Unesite adresu Modular Elementa ili poslužitelja koji želite koristiti - Unesite adresu poslužitelja ili Elementa na koji se želite spojiti Došlo je do greške pri učitavanju stranice: %1$s (%2$d) Aplikacija se ne može prijaviti na ovog poslužitelja. Poslužitelj podržava sljedeće vrste prijava: %1$s. \n @@ -1298,9 +1296,9 @@ Moderator u %1$s Prilagođeno (%1$d) u %2$s Skoči na potvrdu o pročitanoj poruci - Element ne podržava događaje tipa \'%1$s\' - Element ne podržava poruke tipa \'%1$s\' - Element je naišao na problem pri prikazu sadržaja događaja s identitetom \'%1$s\' + ${app_name} ne podržava događaje tipa \'%1$s\' + ${app_name} ne podržava poruke tipa \'%1$s\' + ${app_name} je naišao na problem pri prikazu sadržaja događaja s identitetom \'%1$s\' Ukloni zanemarivanje Nedavne sobe Druge sobe diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index e25626c2e6..0c6558bcc9 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -1,5 +1,197 @@ + %1$s: %2$s + %1$s küldött egy képet. + %s meghívója + %1$s meghívta: %2$s + %1$s meghívott + %1$s belépett a szobába + %1$s kilépett a szobából + %1$s elutasította a meghívást + %1$s kidobta: %2$s + %1$s feloldotta %2$s tiltását + %1$s kitiltotta: %2$s + %1$s visszavonta %2$s meghívását + %1$s megváltoztatta a profilképét + %1$s megváltoztatta a megjelenő nevét erre: %2$s + %1$s megváltoztatta a megjelenítendő nevét erről: %2$s, erre: %3$s + %1$s eltávolította a megjelenítendő nevét (%2$s) + %1$s megváltoztatta a témát erre: %2$s + %1$s megváltoztatta a szoba nevét erre: %2$s + %s videóhívást kezdeményezett. + %s hanghívást indított. + %s fogadta a hívást. + %s befejezte a hívást. + %1$s láthatóvá tette a jövőbeli előzményeket %2$s + a szoba összes tagja számára, a meghívásuk időpontjától kezdve. + a szoba összes tagja számára, a csatlakozásuk időpontjától kezdve. + az összes szobatag számára. + bárki. + ismeretlen (%s). + %1$s bekapcsolta a végpontok közötti titkosítást (%2$s) + %1$s hanghívás konferenciát kérelmezett + Hanghívás konferencia elindult + Hanghívás konferencia befejeződött + (a profilkép is megváltozott) + %1$s eltávolította a szoba nevét + %1$s eltávolította a szoba témáját + %1$s megváltoztatta a(z) %2$s profilját + %1$s meghívót küldött %2$s számára, hogy csatlakozzon a szobához + %1$s elfogadta a meghívót ebbe: %2$s + ** Visszafejtés sikertelen: %s ** + A küldő eszköze nem küldte el a kulcsokat ehhez az üzenethez. + Kitakarás sikertelen + Üzenet küldése sikertelen + Kép feltöltése sikertelen + Hálózati hiba + Matrix hiba + Jelenleg nem lehetséges újracsatlakozni egy üres szobához. + E-mail cím + Telefonszám + %1$s küldött egy matricát. + Meghívó tőle: %s + Meghívó egy szobába + %1$s és %2$s + Üres szoba + + %1$s és 1 másik + %1$s és %2$d másik + + Üzenet eltávolítva + Üzenetet eltávolította: %1$s + Üzenet eltávolítva [ok: %1$s] + Üzenetet eltávolította: %1$s [ok: %2$s] + Induló szinkronizáció: +\nFiók betöltése… + Induló szinkronizáció: +\nTitkosítás betöltése + Induló szinkronizáció: +\nSzobák betöltése + Induló szinkronizáció: +\nCsatlakozott szobák betöltése + Induló szinkronizáció: +\nMeghívott szobák betöltése + Induló szinkronizáció: +\nElhagyott szobák betöltése + Induló szinkronizáció: +\nKözösségek betöltése + Induló szinkronizáció: +\nFiók adatok betöltése + %s frissítette ezt a szobát. + Üzenet küldése… + Küldő sor ürítése + %1$s visszavonta %2$s meghívását, hogy csatlakozzon a szobához + %1$s meghívója. Ok: %2$s + %1$s meghívta őt: %2$s. Ok: %3$s + %1$s meghívott. Ok: %2$s + %1$s belépett a szobába. Mert: %2$s + %1$s kilépett a szobából. Ok: %2$s + %1$s visszautasította a meghívót. Ok: %2$s + %1$s kirúgta őt: %2$s. Ok: %3$s + %1$s visszaengedte őt: %2$s. Ok: %3$s + %1$s kitiltotta őt: %2$s. Ok: %3$s + %1$s meghívót küldött neki: %2$s, hogy lépjen be a szobába. Ok: %3$s + %1$s visszavonta %2$s meghívóját a szobába való belépéshez. Ok: %3$s + %1$s elfogadta a meghívót ide: %2$s. Ok: %3$s + %1$s visszavonta %2$s meghívóját. Ok: %3$s + + %1$s ezt a címet adta a szobához: %2$s. + %1$s ezeket a címeket adta a szobához: %2$s. + + + %1$s ezt a címet törölte a szobából: %3$s. + %1$s ezeket a címeket törölte a szobából: %3$s. + + %1$s a szobához adta ezeket:%2$s és törölte ezeket: %3$s. + %1$s a szoba elsődleges címét erre állította be: %2$s. + %1$s eltávolította a szoba elsődleges címét. + %1$s megengedte a vendégeknek, hogy belépjenek ebbe a szobába. + %1$s megtiltotta a vendégeknek, hogy belépjenek ebbe a szobába. + %1$s bekapcsolta a végpontok közötti titkosítást. + %1$s bekapcsolta a végpontok közötti titkosítást (ismeretlen algoritmus %2$s). + %1$s szobát készített + Fogadtad a hívást. + Befejezted a hívást. + Hívási adatokat küldtél. + %s hívási adatokat küldött. + Hanghívást indítottál. + Videóhívást indítottál. + Megváltoztattad a szoba képét + %1$s megváltoztatta a szoba képét + Megváltoztattad a témát erre: %1$s + Megváltoztattad a profilképed + Visszavontad %1$s meghívóját + Kitiltottad %1$s felhasználót + Visszaengedted %1$s felhasználót + Kirúgtad %1$s felhasználót + Visszautasítottad a meghívót + Elhagytad a szobát + %1$s elhagyta a szobát + Elhagytad a szobát + Csatlakoztál + %1$s csatlakozott + Beléptél a szobába + Meghívtad: %1$s + Létrehoztad a beszélgetést + %1$s létrehozta a beszélgetést + Létrehoztad a szobát + Matricát küldtél. + Képet küldtél. + Saját + Saját (%1$d) + Alapértelmezett + Moderátor + Admin + Ön megváltoztatta a %1$s kisalkalmazást + %1$s megváltoztatta a %2$s kisalkalmazást + Ön eltávolította a %1$s kisalkalmazást + %1$s eltávolította a %2$s kisalkalmazást + Ön hozzáadott egy %1$s kisalkalmazást + %1$s hozzáadott egy %2$s kisalkalmazást + Ön elfogadta a meghívót ehhez: %1$s + Ön visszavonta %1$s felhasználó meghívóját + %1$s visszavonta %2$s felhasználó meghívóját + Ön visszavonta %1$s felhasználó meghívóját + Ön meghívta %1$s felhasználót + %1$s meghívta %2$s felhasználót + Ön meghívót küldött %1$s felhasználónak, hogy csatlakozzon a szobához + Ön frissítette a saját profilját %1$s + Ön eltávolította a szoba képét + %1$s eltávolította a szoba képét + Ön eltávolította a szoba témáját + Ön eltávolította a szoba nevét + Ön videókonferencia kezdeményezését kérte + Ön frissítette ezt a szobát. + %s frissítette a szobát. + Ön frissítette ezt a szobát. + Ön bekapcsolta a végpontok közötti titkosítást (%1$s) + Ön elérhetővé tette a jövőbeni üzeneteket %1$s + Ön elérhetővé tette a jövőbeni üzeneteket %1$s + %1$s elérhetővé tette a jövőbeni üzeneteket %2$s + Ön megváltoztatta a szoba nevét erre: %1$s + Ön eltávolította a saját megjelenített nevét (%1$s volt) + Ön megváltoztatta a saját megjelenítési nevét erről: %1$s, erre: %2$s + Ön beállította a saját megjelenítési nevét erre: %1$s + Az ön meghívása + %1$s felhasználó hozzáférési szintjét erről: %2$s, erre: %3$s + %1$s megváltoztatta %2$s. + Megváltoztattad %1$s hozzáférési szintjét. + 🎉 Minden szerver ki lett tiltva a szobából! Ez a szoba többé nem használható. + Nincs változás. + • Most már tiltva vannak az IP címet hosztnévként használó szerverek. + • Az IP címet hosztnévként használó szerverek most már engedélyezve vannak. + • El lettek távolítva a tiltólistából az erre illeszkedő szerverek: %s + • Most már engedélyezve vannak az erre illeszkedő szerverek: %s + • El lettek távolítva a tiltólistából az erre illeszkedő szerverek: %s + • Most már tiltva vannak az erre a kifejezésre illeszkedő szerverek: %s + Megváltoztattad a szerver ACL-eket ehhez a szobához. + %s megváltoztatta a szerver ACL-eket ehhez a szobához. + • IP címet hosztnévként használó szerverek tiltva vannak. + • IP címet hosztnévként használó szerverek engedélyezve vannak. + • Engedélyezve vannak azok a szerverek, amik illeszkednek erre: %s + • Tiltva vannak azok a szerverek, amik illeszkednek erre: %s + Beállítottad a szerver ACL-eket ehhez a szobához. + %s beállította a szerver ACL-eket ehhez a szobához. Üzenetek Szoba Beállítások @@ -61,7 +253,7 @@ Helyi címjegyzék Csak Matrix névjegyek Nincsenek beszélgetések - Nem adtál hozzáférést a Elementnek a helyi névjegyeidhez + Nem adtál hozzáférést a ${app_name}nek a helyi névjegyeidhez Nincs találat Szobák Szobalista @@ -188,22 +380,22 @@ Kép vagy videó készítése Videorögzítés sikertelen Információ - A Elementnek szüksége van a fénykép- és videótárad elérési engedélyéhez a mellékletek küldéséhez és mentéséhez. + A ${app_name}nek szüksége van a fénykép- és videótárad elérési engedélyéhez a mellékletek küldéséhez és mentéséhez. \n \nEngedélyezd a hozzáférést a következő felugró ablakon, hogy fájlokat tudj küldeni a telefonodról. - Az Elementnek engedélyre van szüksége a kamera eléréséhez, hogy képeket tudj készítsen és videóhívást tudj indítani. + Az ${app_name}nek engedélyre van szüksége a kamera eléréséhez, hogy képeket tudj készítsen és videóhívást tudj indítani. " \n \nEngedélyezd a hozzáférést a következő felugró ablakon, hogy hívást tudj indítani." - A Elementnek engedélyre van szüksége a mikrofon eléréséhez, hogy hanghívás tudjon indítani. + A ${app_name}nek engedélyre van szüksége a mikrofon eléréséhez, hogy hanghívás tudjon indítani. " \n \nEngedélyezd a hozzáférést a következő felugró ablakon, hogy hívást tudj indítani." - A Elementnek engedélyre van szüksége a mikrofonod és kamerád eléréséhez, hogy videohívást tudj indítani. + A ${app_name}nek engedélyre van szüksége a mikrofonod és kamerád eléréséhez, hogy videohívást tudj indítani. \n \nEngedélyezd a hozzáférést a következő felugró ablakon, hogy hívást tudj indítani. - A Element a névjegyekben lévő e-mail és telefonszám alapján képes felkutatni más Matrix felhasználókat. Ha egyetértesz a névjegyek ilyen célú megosztásával, kérlek engedélyezd a hozzáférést a következő felugró üzenetben. - A Element a névjegyekben lévő e-mail és telefonszám alapján képes felkutatni más Matrix felhasználókat. + A ${app_name} a névjegyekben lévő e-mail és telefonszám alapján képes felkutatni más Matrix felhasználókat. Ha egyetértesz a névjegyek ilyen célú megosztásával, kérlek engedélyezd a hozzáférést a következő felugró üzenetben. + A ${app_name} a névjegyekben lévő e-mail és telefonszám alapján képes felkutatni más Matrix felhasználókat. \n \nEgyetértesz a névjegyek ilyen célú megosztásával\? "Elnézést. A művelet nem lett végre hajtva hiányzó engedélyek miatt" @@ -545,7 +737,7 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.Felhasználói címjegyzék Világos téma Sötét téma - Fekete téma + Fekete téma Értesítés hangja Időbélyegek mutatása 12 órás formátumban Engedélyre van szükséged a kisalkalmazások ebben a szobában való kezeléséhez @@ -692,7 +884,7 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.• Az értesítések csak metaadatokat tartalmaznak • Az értesítés tartalma közvetlenül a Matrix szerverről kerül letöltésre Az értesítések meta- és üzenet adatot is tartalmaznak - Element futtatható a háttérben az értesítések biztonságos és titkos kezeléséhez, ami hatással lehet az akkumulátor használatra. + ${app_name} futtatható a háttérben az értesítések biztonságos és titkos kezeléséhez, ami hatással lehet az akkumulátor használatra. Engedély megadása Más lehetőség választása Értesítés adatvédelme @@ -708,8 +900,8 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.Fiók felfüggesztése Saját fiók felfüggesztése Analitikai adatok küldése - Element anonim analitikai adatokat gyűjt, hogy javítani tudjuk az alkalmazást. - Kérlek engedélyezd az analitikai adatok gyűjtését ezzel segítve a Element fejlesztését. + ${app_name} anonim analitikai adatokat gyűjt, hogy javítani tudjuk az alkalmazást. + Kérlek engedélyezd az analitikai adatok gyűjtését ezzel segítve a ${app_name} fejlesztését. Igen, segíteni akarok! A szükséges paraméter hiányzik. Nem érvényes paraméter. @@ -731,7 +923,7 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés Végpontok közötti titkosításhoz használt kulcsok újrakérése a többi munkamenetedtől. Kulcs újrakérve. Kérés elküldve - Índítsd el a Elementet egy olyan eszközön, amely vissza tudja fejteni az üzenetet, hogy elküldhesse a kulcsot ennek a munkamenetnek. + Índítsd el a ${app_name}et egy olyan eszközön, amely vissza tudja fejteni az üzenetet, hogy elküldhesse a kulcsot ennek a munkamenetnek. Ide írj… Hangüzenet küldése tovább ezzel… @@ -810,7 +1002,6 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés Teljesítmény növelése a szoba tagjainak késleltetett betöltésével. A Matrix szervered jelenleg nem támogatja a szoba tagság késleltetett betöltését. Próbáld meg később. Ne haragudj, hiba történt - Status.im téma Verzió: %s Adj meg egy jelmondatot a kimentett kulcsok titkosításához. Ezt a jelmondatot kell majd megadnod a kulcsok betöltéséhez. Jelmondat lekészítése @@ -840,13 +1031,13 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés Fiók események megjelenítése Avatar és név változásokat tartalmaz. Jelszó - Rendszer kamera indítása a Element egyedi kamera alkalmazása helyett. + Rendszer kamera indítása a ${app_name} egyedi kamera alkalmazása helyett. Ehhez az opcióhoz egy harmadik féltől származó alkalmazásra van szükség, hogy felvedd az üzenetet. \"%s\" parancsnak több paraméterre van szüksége vagy valamelyik paraméter hibás. Markdown engedélyezve. Markdown tiltva. Hívások - Az alapértelmezett Element csengőhang használata bejövő hívásokhoz + Az alapértelmezett ${app_name} csengőhang használata bejövő hívásokhoz Bejövő hívás csengőhangja Csengőhang kiválasztása a hívásokhoz: Elfogadás @@ -870,11 +1061,11 @@ Kérlek ellenőrizd a fiókbeállításokat. Engedélyez Munkamenet beállítások. Az értesítések engedélyezve vannak ezen az munkameneten. - Az értesítések tiltva vannak ezen a munkameneten. Kérlek ellenőrizd a Element beállításokat. + Az értesítések tiltva vannak ezen a munkameneten. Kérlek ellenőrizd a ${app_name} beállításokat. Engedélyez Play Szolgáltatások ellenőrzése Google Play Services APK elérhető és a legújabb verziójú. - "Element a Google Play Services-t használja a „push” értesítések fogadásához, de úgy tűnik az nincs megfelelően beállítva: + "${app_name} a Google Play Services-t használja a „push” értesítések fogadásához, de úgy tűnik az nincs megfelelően beállítva: \n%1$s" Play Services javítása Firebase token @@ -896,21 +1087,21 @@ Próbáld újraindítani a szolgáltatást. A szolgáltatást nem sikerült újraindítani Indítás az eszköz indulásakor A szolgáltatás az eszköz újraindulásakor elindul. - A szolgáltatás az eszköz újraindulásakor nem fog elindulni, addig nem kapsz értesítést amíg egyszer el nem indítod a Element-ot. + A szolgáltatás az eszköz újraindulásakor nem fog elindulni, addig nem kapsz értesítést amíg egyszer el nem indítod a ${app_name}-ot. Indulás engedélyezése amikor az eszköz elindul Háttér korlátozások ellenőrzése - A háttér korlátozások nincsenek érvényben a Element-hoz. Ezt a tesztet mobil hálózaton kell elvégezni (WiFi nélkül). + A háttér korlátozások nincsenek érvényben a ${app_name}-hoz. Ezt a tesztet mobil hálózaton kell elvégezni (WiFi nélkül). %1$s - Háttér korlátozások vannak érvényben a Element-hoz. -Bármi amit a Element el akar végezni amíg a háttérben fut, agresszívan korlátozva van. Ez érintheti az értesítéseket is. + Háttér korlátozások vannak érvényben a ${app_name}-hoz. +Bármi amit a ${app_name} el akar végezni amíg a háttérben fut, agresszívan korlátozva van. Ez érintheti az értesítéseket is. %1$s Korlátozások tiltása Akkumulátor optimalizáció - Elementot nem érinti az akkumulátor optimalizáció. + ${app_name}ot nem érinti az akkumulátor optimalizáció. Ha a felhasználó töltés nélkül kikapcsolt képernyővel egy ideig magára hagyja az eszközt, az eszköz „Doze” módba kerül. Ez megakadályozza az alkalmazás számára, hogy hozzáférjen a hálózathoz, nem engedi elvégezni a feladatait, szinkronizációt és az alapértelmezett riasztásait. Optimalizáció figyelmen kívül hagyása Háttér kapcsolat - Az Elementnek szüksége van egy minimális háttér kapcsolat fenntartására ahhoz, hogy az értesítések megbízhatóan megérkezhessenek. A következő képernyőn el kell fogadnod, hogy a Element folyamatosan fusson a háttérben. + Az ${app_name}nek szüksége van egy minimális háttér kapcsolat fenntartására ahhoz, hogy az értesítések megbízhatóan megérkezhessenek. A következő képernyőn el kell fogadnod, hogy a ${app_name} folyamatosan fusson a háttérben. Jogosultság megadása Az e-mail címed ellenőrzésekor hiba történt. A telefonszámod ellenőrzésekor hiba történt. @@ -929,12 +1120,12 @@ Bármi amit a Element el akar végezni amíg a háttérben fut, agresszívan kor Az egyedi beállításaidban néhány értesítés ki van kapcsolva. Az egyedi szabályokat nem sikerült betölteni, kérlek próbáld újra. Beállítások ellenőrzése - [%1$s] -Ez a hiba a Elementon kívül van és a Google szerint ez a hiba azt jelzi, hogy túl sok alkalmazás használja az FCM-et. Ez a hiba akkor szokott előfordulni, ha nagyon sok alkalmazás van ezért egy átlagos felhasználót nem nagyon érinthet. - [%1$s] -Ez a hiba a Elementon kívül van. Több okból is előjöhet. Lehet, ha később próbálod már működni fog, de megnézheted, hogy a Google Play szolgáltatásnak nincs beállítva adathasználati korlátozás a rendszer beállításokban vagy, hogy az eszközöd órája helyesen jár-e de ezt előfordulhat egyedi ROM esetén is. - [%1$s] -Ez a hiba a Elementon kívül van. Nincs Google fiók az eszközön. Kérlek nyisd meg a fiókkezelőt és adj hozzá egy Google fiókot. + [%1$s] +Ez a hiba a ${app_name}on kívül van és a Google szerint ez a hiba azt jelzi, hogy túl sok alkalmazás használja az FCM-et. Ez a hiba akkor szokott előfordulni, ha nagyon sok alkalmazás van ezért egy átlagos felhasználót nem nagyon érinthet. + [%1$s] +Ez a hiba a ${app_name}on kívül van. Több okból is előjöhet. Lehet, ha később próbálod már működni fog, de megnézheted, hogy a Google Play szolgáltatásnak nincs beállítva adathasználati korlátozás a rendszer beállításokban vagy, hogy az eszközöd órája helyesen jár-e de ezt előfordulhat egyedi ROM esetén is. + [%1$s] +Ez a hiba a ${app_name}on kívül van. Nincs Google fiók az eszközön. Kérlek nyisd meg a fiókkezelőt és adj hozzá egy Google fiókot. Fiók hozzáadása Hangos értesítések beállítása Hívás értesítések beállítása @@ -945,7 +1136,7 @@ Ez a hiba a Elementon kívül van. Nincs Google fiók az eszközön. Kérlek nyi Csendes Kérlek adj meg egy jelmondatot A jelmondat túl gyenge - Ha azt szeretnéd, hogy a Element Visszaállítási Kulcsot generáljon akkor kérlek töröld a jelmondatot. + Ha azt szeretnéd, hogy a ${app_name} Visszaállítási Kulcsot generáljon akkor kérlek töröld a jelmondatot. Jelenleg nincs Matrix munkamenet Soha ne veszíts el titkosított üzenetet A titkosított szobákban az üzenetek végponttól-végpontig titkosítva vannak. Csak neked és a címzetteknek vannak meg az üzenet elolvasásához szükséges kulcsok. @@ -1075,7 +1266,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró A jelszavak nem egyeznek meg A Matrix szerver felderítésére érvénytelen válasz érkezett Szerver beállítások automatikus kiegészítése - Element egyedi szerver beállítást észlelt a felhasználói azonosítód domain-jéhez: \"%1$s\": + ${app_name} egyedi szerver beállítást észlelt a felhasználói azonosítód domain-jéhez: \"%1$s\": \n%2$s Beállítás használata Szolgáltatás indítása @@ -1190,7 +1381,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Kérlek várj… Minden közösség Ennek a szobának nincs előnézete - A Element-ben a nyilvános szoba előnézete egyelőre nem támogatott + A ${app_name}-ben a nyilvános szoba előnézete egyelőre nem támogatott Szobák Közvetlen üzenetek Új szoba @@ -1285,11 +1476,11 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró A beállításokban adj hozzá egy azonosítási szervert ehhez a művelethez. Háttér Szinkronizálási Mód (Kísérleti) Optimalizált akkumulátor használat - Element a háttérben úgy szinkronizál, hogy a leginkább kímélje az eszköz korlátozott erőforrásait (akkumulátor). + ${app_name} a háttérben úgy szinkronizál, hogy a leginkább kímélje az eszköz korlátozott erőforrásait (akkumulátor). \nAz eszköz erőforrásainak állapotától függően a szinkronizációt az operációs rendszer elhalaszthatja. Optimalizálás valós idejű használatra - Element a háttérben rendszeresen, pontosan a megadott időközönként, szinkronizálni fog (beállítható). -\nEz befolyásolja a rádió és az akkumulátor használatot, és folyamatosan egy értesítés fog megjelenni arról, hogy a Element figyel a neki küldött eseményekre. + ${app_name} a háttérben rendszeresen, pontosan a megadott időközönként, szinkronizálni fog (beállítható). +\nEz befolyásolja a rádió és az akkumulátor használatot, és folyamatosan egy értesítés fog megjelenni arról, hogy a ${app_name} figyel a neki küldött eseményekre. Nincs szinkroniziálás a háttérben Nem leszel értesítve az érkező üzenetekről, ha az alkalmazás csak a háttérben fut. A beállítások frissítése nem sikerült. @@ -1373,12 +1564,12 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Ez a tartalom nem idevalónak lett bejelentve. \n \n Ha nem akarsz ettől a felhasználótól több üzenetet látni akkor blokkolhatod, hogy az üzenetei ne jelenjenek meg számodra - Elementnak engedélyre van szüksége ahhoz, hogy a végponttól végpontig titkosító kulcsokat a lemezre menthesse. + ${app_name}nak engedélyre van szüksége ahhoz, hogy a végponttól végpontig titkosító kulcsokat a lemezre menthesse. \n \nKérlek a következő felugró ablakban engedélyezd a hozzáférést, hogy a kulcsokat kézzel kimenthesd. Jelenleg nincs hálózati kapcsolat Jelszó megerősítés - Element mobilról ezt nem teheted meg + ${app_name} mobilról ezt nem teheted meg Azonosítás szükséges Integrációk Botok, hidak, kisalkalmazások és matrica csomagok kezeléséhez használj Integrációs Menedzsert. @@ -1448,7 +1639,6 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Cím Prémium szerverüzemeltetés szervezetek részére Add meg az általad használt Modular szerver, vagy a hozzá tartozó Element címét - Add meg a szerver vagy Element címét amihez csatlakozni szeretnél Az oldal betöltésekor hiba történt: %1$s (%2$d) Ne haragudj, ez a szerver nem fogad új fiókokat. Ez az e-mail cím egyik fiókhoz sincs társítva. @@ -1547,7 +1737,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró \nA fiók és az üzeneteid eléréséhez jelentkezz be. Elveszted a hozzáférésedet a titkosított üzeneteidhez ha nem jelentkezel be a titkosítási kulcsok visszaállításához. Adat törlése - A jelenlegi munkamenet %1$s felhasználóhoz tartozik és %2$s azonosítási adatait adtad meg. Ez Element-ben nem támogatott. + A jelenlegi munkamenet %1$s felhasználóhoz tartozik és %2$s azonosítási adatait adtad meg. Ez ${app_name}-ben nem támogatott. \nElőször töröld az adatokat, utána lépj be a másik fiókba! A matrix.to linked hibás A leírás túl rövid @@ -1565,7 +1755,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Más munkamenetek Csak az első találat megmutatása, gépelj több betűt… Összeomlás-hamar - Element a nem várt hibák esetén többször fog összeomlani + ${app_name} a nem várt hibák esetén többször fog összeomlani Hozzáteszi a sima szöveges üzenethez ezt: ¯\\_(ツ)_/¯ Titkosítás engedélyezése Ha egyszer bekapcsolod, már nem lehet kikapcsolni. @@ -1636,9 +1826,9 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Moderátor itt: %1$s Egyedi (%1$d) itt: %2$s Olvasási visszaigazolásra ugrás - Element nem kezeli ezt az eseményt: \'%1$s\' - Element nem kezeli ezt az üzenet típust: \'%1$s\' - Element problémába ütközött az esemény (azon: %1$s) megjelenítésekor + ${app_name} nem kezeli ezt az eseményt: \'%1$s\' + ${app_name} nem kezeli ezt az üzenet típust: \'%1$s\' + ${app_name} problémába ütközött az esemény (azon: %1$s) megjelenítésekor Figyelembe vesz Ez a munkamenet nem tudja megosztani ezt az ellenőrzést a másik munkameneteddel. \nAz ellenőrzés helyileg elmentésre kerül és az alkalmazás jövőbeli verziójával meg lesz osztva. @@ -1733,7 +1923,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Az eseményt a felhasználó törölte, ezért: %1$s Az eseményt a szoba adminisztrátora moderálta, ezért: %1$s A kulcsok már frissek! - Element Android + ${app_name} Android Kulcs kérések Régi titkosított üzenetek feloldása Frissítés @@ -1834,12 +2024,12 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró A média fájl a Galériához hozzáadva A média fájlt nem sikerült hozzáadni a Galériához Új fiók jelszó beállítása… - Element Web -\nElement Desktop - Element iOS -\nElement Android + ${app_name} Web +\n${app_name} Desktop + ${app_name} iOS +\n${app_name} Android "vagy más eszközök közötti hitelesítést támogató Matrix-klienst" - Az Element legújabb kliensét használd a többi eszközödön: + Az ${app_name} legújabb kliensét használd a többi eszközödön: A jelenlegi csoport munkamenet törlését kikényszeríti a titkosított szobában Csak a titkosított szobákban támogatott Használd ezt: %1$s vagy ezt: %2$s a továbblépéshez. @@ -1860,7 +2050,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Kérlek válassz jelszót. Ezt a hivatkozást ellenőrizd le még egyszer A közvetlen beszélgetést nem sikerült létrehozni. Ellenőrizd azokat a felhasználókat akiket meg szeretnél hívni és próbáld újra. - "Használd a legújabb Elementet a többi eszközödön, azaz az Element Webet, az Element Desktopot, az Element for Androidot vagy más eszközök közötti hitelesítést támogató Matrix-klienst" + "Használd a legújabb ${app_name}et a többi eszközödön, azaz az ${app_name} Webet, az ${app_name} Desktopot, az ${app_name} for Androidot vagy más eszközök közötti hitelesítést támogató Matrix-klienst" Erősítsd meg ebben a bejelentkezésben a személyazonosságodat egy másik munkamenetből, hogy hozzáférhess a titkosított üzenetekhez. %1$s hivatkozás egy másik oldalra visz: %2$s. \n @@ -1902,11 +2092,11 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró További elérhető nyelvek Elérhető nyelvek betöltése… Megnyitás: %s feltételek - Ez az azonosítási szerver régi. Element csak az API V2-t támogatja. + Ez az azonosítási szerver régi. ${app_name} csak az API V2-t támogatja. Ez a művelet nem támogatott. A Matrix szerver elavult. Kérlek először állíts be egy azonosítási szervert. Kérlek először fogadd el az azonosítási szerver felhasználási feltételeit a beállításokban. - A biztonságod érdekében Element csak hash-selt e-mail cím és telefonszám küldését támogatja. + A biztonságod érdekében ${app_name} csak hash-selt e-mail cím és telefonszám küldését támogatja. A megfeleltetés sikertelen. Ezzel az azonosítóval jelenleg nincs megfeleltetve semmi. A Matrix szervered (%1$s) ezt az azonosítási szervert javasolja: %2$s @@ -1957,7 +2147,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Nem hívhatod fel saját magad, várj amíg a résztvevők elfogadják a meghívást Kisalkalmazás hozzáadása sikertelen Kisalkalmazás eltávolítása sikertelen - Element hívás sikertelen + ${app_name} hívás sikertelen Nem sikerült felépíteni a valós idejű kapcsolatot. \nKérd meg a Matrix-kiszolgálód rendszergazdáját, hogy állítson be egy TURN-kiszolgálót, hogy a hívások megbízhatóan működjenek. SSL hiba: a partner személyazonossága nem lett megerősítve. @@ -2056,11 +2246,10 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Nem érheted el ezt az üzenetet, mert a feladó nem bízik a munkamenetedben Nem érheted el ezt az üzenetet, mert a feladó szándékosan nem küldte el a kulcsokat Várakozás a titkosítási előzményekre - A Riot mostantól Element! - Örömmel jelentjük be, hogy nevet változtattunk! Az alkalmazás naprakész, és be vagy jelentkezve a fiókodba. - ÉRTEM - TOVÁBBI INFORMÁCIÓK - element + A Riot mostantól Element! + Örömmel jelentjük be, hogy nevet változtattunk! Az alkalmazás naprakész, és be vagy jelentkezve a fiókodba. + ÉRTEM + TOVÁBBI INFORMÁCIÓK Helyreállítási kulcs mentése ide: Hozzáadás a telefonkönyvemből A telefonkönyved üres @@ -2094,7 +2283,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Erősítsd meg a PIN-kódot a PIN-kód kikapcsolásához Részletek mutatása, mint például a szoba neve, vagy az üzenet tartalma. Üzenetek tartalmának mutatása az értesítésekben - Az Element feloldása csak PIN kóddal lehetséges. + Az ${app_name} feloldása csak PIN kóddal lehetséges. Biometrikus azonosítás engedélyezése Védelem beállítása Hozzáférés védése PIN kóddal és biometrikus azonosítással. @@ -2124,8 +2313,8 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Nincs jogosultságod hívást indítani Nincs jogosultságod hívást indítani ebben a szobában Mutasd meg ezt a kódot az ismerőseidnek, hogy be tudják olvasni, és elkezdődhessen a csevegés! - 🔐️ Csatlakozz hozzám Element-en - Hey, beszélgessünk Element-en: %s + 🔐️ Csatlakozz hozzám ${app_name}-en + Hey, beszélgessünk ${app_name}-en: %s Ismerősök meghívása Saját kódom Saját kód megosztása diff --git a/vector/src/main/res/values-id/strings.xml b/vector/src/main/res/values-id/strings.xml deleted file mode 100644 index 24f9cea581..0000000000 --- a/vector/src/main/res/values-id/strings.xml +++ /dev/null @@ -1,1077 +0,0 @@ - - - Pesan - Ruang - Pengaturan - Detail Anggota - OK - Batal - Simpan - Tinggalkan - Kirim - Kutip - Bagikan - Hapus - Ubah Nama - Laporkan konten - Informasi Perangkat - atau - Undang - Panggilan Suara - Panggilan Video - Balasan Cepat - Peringatan - - Konfirmasi - Buka - Tutup - Nonaktifkan - - Favorit - Cari ruang - Cari favorit - Cari orang - Cari ruang - - Direktori Pengguna - Tidak ada hasil - - Ruang umum belum tersedia - Direktori ruang - Kirim log - Deskripsikan kendala Anda di sini - Laporan bug telah berhasil dikirimkan - Baca - - Daftar - Masuk - Copot akun - URL Server Mula - Cari - - Mulai Obrolan Baru - Ambil foto atau video - - Kirim - Password - Password Baru - Kirim Email Untuk Mengatur Ulang - Lewati - Email atau nama pengguna - Kembali ke halaman masuk - Nama pengguna - Alamat email - Alamat Email (pilihan) - Nomor Telpon - Nomor Telpon (piihan) - Ulangi password - Konfirmasi password baru - Kirim Ulang - Teruskan - Tampilkan Sumber - Buat Tautan - Tampilkan Sumber Terdekripsi - Panggilan aktif - Tidak dapat memulai panggilan, coba lagi nanti - Tidak dapat memulai panggilan - Keluar - Offline - - Pencarian global - Tandai semua sudah dibaca - Orang - Ruang - - Undangan - Percakapan - Buku alamat lokal - Prioritas rendah - - Hanya kontak Matrix - Ruang - Laporan bug - "Aplikasi gagal saat terakhir digunakan. Apakah Anda ingin membuka halaman laporan kegagalan?" - - Gabung di Ruang - URL Server Identity - Mulai Panggilan Suara - Masuk - Buat Akun - Mulai Panggilan Video - - Kirim file - Password terlalu pendek (min 6) - Alamat email ini sudah terdefinisi. - Lupa password? - Token tidak berlaku - Sepertinya alamat email tidak benar - Sepertinya nomor telepon tidak benar - Kata sandi tidak cocok - Serve Home ingin memastikan bahwa Anda bukan robot - Server Home: - Saya sudah verifikasi alamat email saya - Kata sandi baru perlu dimasukkan. - URL diawali dengan http[s]:// - Tidak bisa masuk - Tidak bisa registrasi - Masukkan URL yang benar - - Nama pengguna sudah terpakai - Asli - Besar - Sedang - Kecil - - Kemarin - Batalkan unduhan? - Batalkan unggahan? - Hari ini - - Nama ruang - Panggilan terhubung - Menyambungkan panggilan… - Panggilan diakhiri - - Informasi - Tersimpan - Simpan di Downloads? - YA - TIDAK - Lanjut - - Hapus - Gabung - Pratinjau - Tolak - - Nanti - Kirim Saja - Element belum diijinkan untuk mengakses kontak lokal - Kirim log gangguan - Raksasa - Kecil - Normal - Besar - Lebih Besar - Terbesar - Ukuran font - Sangat Kecil - URL server Home - Pilih direktori ruang - Terdapat perangkat tidak diketahui di ruang - Saya verifikasi bahwa kuncinya sesuai - - perangkat tidak diketahui - Terverifikasi - Jejak Percakapan - - Hapus - Panggilan massal sedang berlangsung.\nBergabunglah lewat %1$s atau %2$s. - suara - video - Beberapa fitur tidak dapat digunakan karena aplikasi belum mendapat ijin… - Anda membutuhkan ijin mengundang untuk memulai panggilan massal di ruang ini - Panggilan massal tidak dapat diselenggarakan di ruang terenkripsi - Jejak Percakapan - Gandakan ke clipboard - Tampilan Awal - Belum ada percakapan - Belum ada ruang - - %d pengguna - - - Kirim tampilan layar - Mohon uraikan bug tersebut. Apa yang Anda lakukan? Apa yang Anda harapkan terjadi? Apa yang sebenarnya terjadi? - Log dari klien akan dikirim bersama laporan gangguan ini untuk mendalami kendala yang Anda temukan. Laporan gangguan ini, termasuk log dan rekalayar, tidak akan dilihat oleh khalayak umum. Jika Anda hanya ingin mengirimkan tulisan di atas, silahkan hapus centang: - Sepertinya Anda mengguncang telepon akibat frustrasi. Apakah Anda ingin membuka halaman laporan bug? - Pengiriman laporan bug gagal (%s) - Kemajuan (%s%%) - - Kirim ke - Nama Pengguna - Nama pengguna dan/atau kata sandi salah - Nama pengguna hanya boleh memuat huruf, angka, titik, tanda hubung ( - ), dan garis bawah ( _ ) - Password belum dimasukkan - Alamat email belum dimasukkan - Nomor telpon belum dimasukkan - Alamat email atau nomor telpon belum dimasukkan - Gunakan server lain (lanjutan) - Silahkan periksa email Anda untuk melanjutkan pendaftaran - Pendaftaran dengan email sekaligus nomor telpon belum didukung sampai API dihadirkan. Hanya nomor telpon yang akan digunakan. - -Anda dapat menambah email di profile Anda dalam pengaturan nantinya. - Nama pengguna yang terpakai - Untuk menyetel ulang kata sandi Anda, silahkan masukkan alamat email yang tertaut ke akun Anda: - Anda perlu memasukkan alamat email yang tertaut pada akun. - "Selembar email telah dikirim ke %s. Setelah Anda mengikuti tautan yang termuat di dalamnya, klik yang di bawah." - Verifikasi alamat email gagal: pastikan tautan yang termuat di email telah diklik - Kata sandi Anda telah disetel ulang. - -Anda telah dikeluarkan dari semua perangkat dan tidak lagi menerima pemberitahuan dorongan. Untuk menerima kembali pemberitahuan, masuk kembali dengan tiap perangkat. - - Tidak dapat masuk: Gangguan jaringan - Tidak dapat mendaftar: Gangguan jaringan - Tidak dapat mendaftar : gagal memastikan kepemilikan alamat email - Nama pengguna/kata sandi tidak tepat - Rincian token akses tidak dikenal - JSON amburadul - Tidak berisi JSON yang sah - Pengajuan yang dikirimkan terlalu banyak - Tautan email masih belum diklik - - Baca Daftar Penerimaan - - "Kirim sebagai " - %d d - %1$dm %2$dd - - Topik ruang - - Memanggil… - Panggilan Masuk - Panggilan Video Masuk - Panggilan Suara Masuk - Panggilan Sedang Berlangsung… - - Hubungan Media Gagal - Server Identitas: - Tidak dapat memulai kamera - panggilan terjawab di tempat lain - Ambil gambar atau video - Tidak bisa merekam video - - Element membutuhkan permisi atas akses galeri foto dan video Anda untuk mengirim dan menyimpan lampiran. - -Harap berikan akses pada halaman berikut agar berkas dapat dikirim dari ponsel Anda. - Element membutuhkan izin Anda untuk mengakses kamera untuk mengambil gambar dan melakukan panggilan video. - - -Harap berikan akses pada halaman berikut agar dapat melakukan panggilan. - Element membutuhkan permisi atas akses mikrofon Anda untuk melakukan panggilan audio. - - -Harap berikan akses pada halaman berikut agar dapat melakukan panggilan. - Element membutuhkan permisi atas akses kamera dan mikrofon Anda untuk melakukan panggilan video. - -Harap berikan akses pada halaman selanjutnya untuk melakukan panggilan. - Tema Terang - Tema Kelam - Tema Gelap - - Sedang Sinkronisasi - Pemberitahuan Berisik - Pemberitahuan Tenteram - - Laporan Gangguan - Detail Komunitas - Kirimkan Sticker - - Lisensi Pihak Ketiga - - Memuat… - - Unduh - Bicaralah - Bersihkan - Ini tidak dapat dilakukan karena belum mendapat permisi. - Keluar - Tindakan - Komunitas - - Mencari komunitas - - Peringatan Sistem - - Undang - Komunitas - Tidak ada grup - - Mohon deskripsikan dengan bahasa Inggris apabila memungkinkan. - Guncang perangkat untuk laporan gangguan - - Kirim Pesan Suara - - Apa benar Anda ingin memulai percakapan baru dengan %s? - Apa benar Anda ingin memulai panggilan suara? - Apa benar Anda ingin memulai panggilan video? - - Kirim Sticker - Ambil foto - Ambil video - - Saat ini Anda belum memiliki pak stiker. -\n -\nMau tambah sekarang\? - - lanjutkan dengan… - Maaf, tidak ada aplikasi eksternal yang mendukung apa yang ingin dilakukan. - - Meminta ulang kunci enkripsi dari perangkat Anda yang lain. - - Permintaan kunci terkirim. - - Permintaan terkirim - Jalankan Element di perangkat yang dapat mendekripsi pesan tersebut agar kunci dapat dikirim ke perangkat ini. - - Daftar Grup - - - %d perubahan keanggotaan - - - Panggilan - Element memerlukan permisi untuk mengakses daftar kontak agar dapat mencari pengguna Matrix lain berdasarkan email dan nomor telepon. - -Ijinkan akses lewat halaman selanjutnya untuk menemukan pengguna Element yang terdapat di daftar kontak Anda. - Element memerlukan permisi akses daftar kontak Anda untuk menemukan pengguna Matrix lain berdasarkan email dan nomor telepon mereka. - -Bolehkah Element mengakses daftar kontak Anda? - - "Maaf. Tidak dapat dilakukan karena belum menerima permisi" - - Daftar Anggota - Buka kop - Menyinkronkan… - Arahkan ke pesan pertama yang belum terbaca. - - Anda telah diundang untuk bergabung ke ruang ini oleh %s - Undangan ini dikirim oleh %s, yang tidak terhubung dengan akun ini. -Anda mungkin ingin masuk dengan akun lain, atau tambahkan email ini ke akun Anda. - Anda sedang berupaya untuk mengakses %s. Maukah Anda bergabung untuk berpartisipasi dalam diskusi ini? - Ini adalah pratinjau untuk ruang ini. Interaksi dengan ruang belum dapat dilakukan. - - Percakapan Baru - Tambah anggota - - %d anggota aktif - - - %d anggota - - 1 anggota - - - %dd - - - %dm - - - %dj - - - $dh - - - Tinggalkan ruang - Apa benar Anda ingin meninggalkan ruang ini? - Apa benar Anda ingin mengeluarkan %s dari percakapan ini? - Buat - - Online - Offline - Berdiam Diri - %1$s sekarang - %1$s %2$s yang lalu - - PERALATAN ADMIN - PANGGIL - PERCAKAPAN LANGSUNG - PERANGKAT - - Undang - Tinggalkan ruang ini - Keluarkan dari ruang ini - Larang - Hapus Larangan - Setel ulang ke user biasa - Jadikan moderator - Jadikan admin - Sembunyikan semua pesan dari pengguna ini - Tunjukkan semua pesan dari pengguna ini - ID Pengguna, Nama atau email - Sebut - Tunjukkan Daftar Perangkat - Anda tidak akan dapat membalik perubahan ini karena Anda mengangkat pengguna ini agar memiliki kuasa yang setara dengan Anda. -Yakin? - - Apa benar Anda ingin melarang pengguna ini dari percakapan ini? - - Apa benar Anda ingin mengundang %s ke percakapan ini? - %1$s dan %2$s - %1$s %2$s - - Gagal terjawab oleh pihak lain. - ruang - "%1$s, " - Undang dengan ID - KONTAK LOKAL (%d) - DIREKTORI PENGGUNA (%s) - Pengguna Matrix saja - - Undang pengguna dengan ID - Masukkan satu atau lebih alamat email atau ID Matrix - Email atau ID Matrix - - Cari - %s sedang mengetik… - %1$s & %2$s sedang mengetik… - %1$s & %2$s & lainnya sedang mengetik… - Kirim pesan terenkripsi… - Kirim pesan (tidak terenkripsi)… - Kirim balasan terenkripsi… - Kirim balasan (tidak terenkripsi)… - Sambungan dengan server terputus. - Pesan tidak terkirim. %1$s or %2$s sekarang? - Pesan tidak terkirim akibat kehadiran perangkat tidak dikenal. %1$s or %2$s sekarang? - Kirim ulang semua - Batalkan semua - Kirim ulang pesan yang belum terkirim - Hapus pesan yang belum terkirim - Berkas tidak ditemukan - Anda belum mendapat permisi untuk mengirim di ruang ini - - %d pesan baru - - - Percaya - Tidak percaya - Keluar - Abaikan - Sidik jari (%s): - Tidak dapat memastikan identitas remote server. - Ini bisa terjadi ketika seseorang sedang mensabotase arus data Anda, atau perangkat Anda tidak percaya terhadap sertifikat remote server. - Apabila administrator server telah menyatakan ini memang akan terjadi, pastikan sidik jari berikut cocok dengan sidik jari yang mereka sediakan. - Sertifikat ini tidak lagi sesuai dengan yang dipercayai oleh perangkat Anda sebelumnya. Ini SANGAT JANGGAL. Kami rekomendasikan Anda untuk TIDAK MENERIMA sertifikat baru ini. - Terdapat perubahan sertifikat yang tidak lagi dipercayai perangkat. Server mungkin telah memperbaharui sertifikatnya. Hubungi administrator server untuk pencocokan sidik jari. - Hanya terima sertifikat ini apabila administrator server telah menerbitkan sidik jari yang cocok dengan yang tertera di atas. - - Detail Ruang - Orang - Berkas - Pengaturan - - %d terpilih - - ID tidak sesuai. Seharusnya alamat email atau ID Matrix semisal \'@localport:domain\' - DIUNDANG - BERGABUNG - - Alasan laporan konten ini - Apa benar Anda ingin menyembunyikan semua pesan dari pengguna ini? - -Perhatikan bahwa tindakan ini akan memulai ulang aplikasi dan mungkin cukup memakan waktu. - Batalkan Unggahan - Batalkan Unduhan - - Cari - Saring anggota ruang - Tiada hasil - RUANG - PESAN - ORANG - BERKAS - - GABUNG - DIREKTORI - FAVORIT - RUANG - PRIORITAS RENDAH - UNDANGAN - Mulai percakapan - Buat ruang - Gabung ke ruang - Gabung ke ruang - Ketik id atau alias ruang - - Jelajahi direktori - - %d ruang - - - %1$s ruang ditemukan untuk %2$s - - Mencari direktori… - - Semua pesan (berisik) - Semua pesan - Hanya sebutan - Diamkan - Favorit - Menurunkan prioritas - Percakapan Langsung - Tinggalkan Percakapan - Lupakan - Tambahkan Shortcut pada Homescreen - - Pesan - Pengaturan - Versi - Syarat & ketentuan - Pemberitahuan pihak ketiga - Hak Cipta - Kebijakan Pribadi - - Gambar Profil - Nama Layar - Email - Tambahkan alamat email - Telepon - Tambahkan nomor telepon - Tampilkan info aplikasi dalam pengaturan sistem. - Info aplikasi - - Kerahasiaan pemberitahuan - Normal - Kerahasiaan diperlemah - Aplikasi ini membutuhkan permisi untuk beroperasi di balik layar - • Pemberitahuan dikirim melalui Google Cloud Messaging - • Pemberitahuan hanya memuat meta data - • Isi pesan pemberitahuan tersimpan langsung dengan aman di homeserver Matrix - • Pemberitahuan memuat meta data dan data pesan - • Pemberitahuan tidak akan menunjukkan isi pesan - - Suara pemberitahuan - Perbolehkan pemberitahuan untuk akun ini - Perbolehkan pemberitahuan untuk perangkat ini - Nyalakan layar selama 3 detik - - Pesan yang berisikan nama layarku - Pesan berisikan nama layarku - Pesan percakapan empat mata - Pesan percakapan grup - Kapan saya diundang ke suatu ruang - Undangan panggilan - Pesan yang dikirim bot - - Mulai sedari boot - Sinkronisasi di balik layar - Perbolehkan sinkronisasi di balik layar - Batas waktu permohonan sinkronisasi - Masa tunda sebelum permohonan berikutnya - - Versi - versi olm - Syarat & ketentuan - - %d ruang - - %1$s dalam %2$s - - Cari sejarah - - Anda butuh permisi untuk mengurus widget di ruang ini - Pembuatan widget gagal - Buat panggilan konferensi dengan jitsi - Apa Anda yakin ingin menghapus widget tersebut dari ruang ini? - - %d widget aktif - - - Tidak dapat membuat widget. - Gagal mengirim permohonan. - Tingkat energi harus bilangan positif. - Anda tidak tergabung dengan ruang ini. - Anda tidak memiliki permisi untuk melakukan itu di ruang ini. - Tidak ada room_id dalam permohonan. - Tidak ada user_id dalam permohonan. - Ruang %s tidak terlihat. - Ada parameter penting yang hilang. - Ada parameter yang tidak valid. - Tambahkan apps Matrix - Gunakan kamera bawaan - Gunakan tombol enter keyboard untuk mengirim pesan - Kirim pesan suara - - Anda menambahkan perangkat baru \'%s\', yang sedang meminta kunci enkripsi. - Perangkat Anda yang belum terverifikasi \'%s\' sedang meminta kunci enkripsi. - Mulai verifikasi - Bagikan tanpa verifikasi - Abaikan verifikasi - - Peringatan! - Panggilan konferensi masih sedang pengembangan dan mungkin belum dapat diandalkan. - - Kesalahan perintah - Perintah tak dikenal: %s - Tunjukkan tindakan - Larang user dengan id berikut - Cabut larangan pengguna dengan id berikut - Tentukan tingkat kuasa seorang pengguna - Undang pengguna dengan id berikut bergabung ke ruang ini - Gabung ke ruang dengan alias berikut - Tinggalkan ruang - Tentukan topik ruang - Keluarkan pengguna dengan id berikut - Ubah nama panggilan layar Anda - Mati/Nyalakan markdown - Untuk memperbaiki kepengurusan Apps Matrix - - Mati - Berisik - - Pesan terenkripsi - - Buat - Buat Komunitas - Nama komunitas - Contoh - Id Komunitas - contoh - - Pangkal - Orang - Ruang - Tidak ada pengguna - - Ruang - Telah bergabung - Telah Diundang - Saring anggota grup - Saring ruang grup - - - %d anggota - - - - %d ruang - - Admin komunitas belum menyediakan deskripsi panjang untuk komunitas ini. - - Anda telah dikeluarkan dari %1$s oleh %2$s - Anda telah dilarang dari %1$s oleh %2$s - Alasan: %1$s - Gabung lagi - Lupakan ruang - - Untuk terus menggunakan homeserver %1$s Anda harus membaca dan menyetujui syarat dan ketentuan. - Avatar - - Baca sekarang - - Deaktivasi Akun - Ini akan mengakibatkan akun Anda tidak dapat digunakan secara permanen. Anda tidak akan dapat masuk dan orang lain tidak dapat mendaftar ulang dengan ID pengguna yang sama. Ini akan mengakibatkan akun Anda keluar dari semua ruang di mana Anda berpartisipasi dan menghapus semua detail akun dari identity server Anda. Tindakan ini tidak dapat dibalikkan. - -Mendeaktivasi akun Anda tidak semerta membuat kami melupakan pesan-pesan yang Anda kirim. Jika Anda ingin kami melupakan pesan-pesan Anda, mohon centang kotak berikut. - -Pembacaan pesan di Matrix serupa dengan email. Dengan kami melupakan pesan-pesan Anda berarti pesan-pesan yang Anda kirim tidak akan dibagikan kepada pengguna baru atau yang belum terdaftar, tapi pengguna yang terdaftar dan telah dapat mengakses pesan-pesan tersebut masih bisa membaca rangkap yang mereka simpan. - Mohon lupakan semua pesan yang telah kukirim ketika akunku dideaktivasi (Peringatan: ini akan mengakibatkan pengguna mendatang membaca percakapan yang tidak lengkap) - Untuk melanjutkan, masukkan kata sandi Anda: - Deaktivasi Akun - - Mohon masukkan kata sandi Anda. - Ruang ini telah berubah dan tidak lagi aktif - Percakapan berlanjut di sini - Ruang ini adalah kelanjutan percakapan lain - Klik di sini untuk melihat pesan lama - - Melampaui Batasan Sumber Daya - Kontak Administrator - - kontak administrator layanan Anda - - Homeserver ini telah melampaui salah satu batas sumber dayanya sehingga beberapa pengguna tidak dapat masuk. - Homeserver ini telah melampaui salah satu batasan sumber dayanya. - - Homeserver ini telah mencapai batas Pengguna Aktif Bulanan sehingga beberapa pengguna tidak dapat masuk. - Homeserver ini telah mencapai batas Pengguna Aktif Bulanan. - - Mohon %s untuk meningkatkan batasan ini. - Mohon %s untuk terus menggunakan layanan ini. - - Impor kunci ruang terenkripsi - Impor kunci ruang - Impor kunci dari berkas lokal - Impor - Hanya enkripsi ke perangkat terverifikasi - Jangan kirim pesan terenkripsi ke perangkat yang tidak terverifikasi dari perangkat ini. - - TIDAK terverifikasi - Ter-blacklist - - tidak ada - - Verifikasi - Batalkan verifikasi - Blacklist - Batalkan blacklist - - Verifikasi perangkat - Untuk memastikan perangkat dapat dipercaya, mohon kontak pengguna dengan medium lain (misalnya tatap muka atau panggilan telepon) dan tanya apakah kunci yang mereka lihat di Pengaturan Pengguna untuk perangkat ini cocok dengan kunci berikut: - Apabila cocok, tekan tombol verifikasi berikut. -Apabila tidak, seseorang sedang menyadap perangkat ini dan mungkin perlu diblokir. -Di masa mendatang proses verifikasi ini akan dimutakhirkan. - - Ruang ini terisi oleh perangkat tak dikenal yang belum diverifikasi. -Ini berarti tidak ada jaminan pengguna perangkat tersebut sesuai dengan klaim mereka. -Kami sarankan Anda untuk memverifikasi untuk setiap perangkat terlebih dahulu sebelum melanjutkan, tapi Anda boleh mengirim ulang pesan tanpa verifikasi jika Anda mau. - -Perangkat tak dikenal: - - Server mungkin belum siap atau kelebihan beban - Ketik homeserver yang ingin Anda lihat daftar ruang publiknya - Semua ruang dalam server %s - Semua ruang bawaan %s - - Ketik di sini… - - - %d pesan pemberitahuan yang belum terbaca - - - %d pesan pemberitahuan yang belum terbaca - - Prioritas rendah - Tidak Ada - - Akses dan visibilitas - Daftarkan ruang ini di direktori ruang - Pemberitahuan - Akses Ruang - Singkapan Sejarah Ruang - Siapa yang bisa membaca sejarah? - Siapa yang bisa mengakses ruang ini? - - Siapapun - Hanya anggota (dimulai sejak opsi ini dipilih) - Hanya anggota (dimulai sejak mereka diundang) - Hanya anggota (dimulai sejak mereka bergabung) - - Ruang harus memiliki alamat agar dapat ditautkan. - Hanya orang yang telah diundang - Siapapun yang tahu tautan ruang, selain tamu - Siapapun yang tahu tautan ruang, termasuk tamu - - Pengguna yang dilarang - - Lanjutan - ID internal ruang ini - Alamat - Lab - Ini adalah fitur uji coba dan mungkin rusak tanpa terduga. Hati-hati menggunakannya. - Enkripsi Ujung-ke-Ujung - Enkripsi Ujung-ke-Ujung aktif - Anda perlu keluar dulu untuk mengaktifkan enkripsi. - Enkripsi ke perangkat terverifikasi saja - Jangan mengirim pesan terenkripsi ke perangkat yang belum diverifikasi di ruang ini dengan perangkat ini. - - Ruang ini tidak punya alamat lokal - Alamat baru (misalnya #foo:matrix.org) - - Ruang ini tidak menunjukkan flair untuk komunitas manapun - ID komunitas baru (misalnya +foo:matrix.org) - ID komunitas tidak valid - \'%s\' bukan ID komunitas yang valid - - - Format alias tidak valid - \'%s\' bukanlah format alias yang valid - Anda tidak akan mendapat alamat utama untuk ruang ini. - Peringatan alamat utama - - Tentukan sebagai Alamat Utama - Jangan tentukan sebagai Alamat Utama - Salin ID Ruang - Salin Alamat Ruang - - Enkripsi diaktifkan untuk ruang ini. - Enkripsi dinonaktifkan untuk ruang ini. - Aktifkan enkripsi -(peringatan: tidak lagi bisa dinonaktifkan!) - - Direktori - Tema - - %s sedang mencoba memuat titik tertentu di rentang waktu ruang ini tapi belum dapat menemukannya. - - Informasi enkripsi ujung-ke-ujung - - Informasi peristiwa - Id pengguna - Kunci identitas Curve25519 - Kunci sidik jadi Ed25519 terklaim - Algoritma - ID Sesi - Kesalahan dekripsi - - Informasi perangkat pengirim - Nama perangkat - Nama - ID Perangkat - Kunci perangkat - Verifikasi - Sidik jari Ed25519 - - Ekspor kunci ruang terenkripsi - Ekspor ruang kunci - Ekspor kunci ke berkas lokal - Ekspor - Masukkan kata sandi - Tegaskan kata sandi - Kunci ruang terenkripsi telah disimpan di \'%s\'. - -Peringatan: berkas ini mungkin ikut terhapus jika aplikasi dihapus. - - Mendengarkan peristiwa - Pemberitahuan pihak ketiga - Hak Cipta - Kebijakan Pribadi - Bersihkan cache - Bersihkan cache media - Pertahankan media - - Pengaturan pengguna - Pemberitahuan - Pengguna yang diabaikan - Lainnya - Lanjutan - Kriptografi - Sasaran Pemberitahuan - Kontak lokal - Permisi atas kontak - Negara Nomor Telepon - Tampilan halaman awal - Semat ruang yang pemberitahuannya terlewatkan - Semat ruang yang pesannya belum terbaca - Perangkat - Pratinjau URL dalam obrolan - Tampilkan waktu kirim untuk seluruh pesan - Tampilkan waktu kirim dalam format 12 jam - Bergetar ketika menyebut seorang pengguna - Pratinjau media sebelum dikirim - - Deaktivasi akun - Deaktivasi akunku - - Kerahasiaan Notifikasi - Element dapat beroperasi di balik layar untuk mengurus pemberitahuan Anda dengan aman dan rahasia. Ini dapat mempengaruhi masa tahan baterai. - Kabulkan permisi - Pilih opsi lain - - Analitik - Kirim data analitik - Element mengumpulkan data analitik anonim dalam upaya kami meningkatkan aplikasi. - Mohon aktifkan analitik untuk membantu kami meningkatkan Element. - Ya, saya ingin membantu! - - Mode hemat data - - Rincian perangkat - ID - Nama - Nama Perangkat - Terakhir terlihat - %1$s @ %2$s - Operasi ini membutuhkan otentikasi tambahan. -Untuk melanjutkan, masukkan kata sandi Anda. - Otentikasi - Kata Sandi: - Serahkan - - Masuk sebagai - Home Server - Server Identitas - - Antarmuka pengguna - Bahasa - Pilih bahasa - - Verifikasi Tertunda - Mohon cek email Anda dan klik tautan yang termuat di sana. Setelah itu, klik lanjutkan. - Tidak dapat memverifikasi alamat email. Mohon periksa email Anda dan klik tautan yang termuat di sana. Setelah itu, klik lanjutkan. - Alamat email ini telah digunakan. - Gagal mengirim email: Alamat email ini tidak dapat ditemukan. - Nomor telepon ini telah digunakan. - - Ubah kata sandi - Sandi lama - Sandi baru - Ulangi sandi - Gagal memperbaharui kata sandi - Kata sandi Anda telah diperbaharui - Tunjukkan semua pesan dari %s? - -Tindakan ini akan memulai ulang aplikasi dan mungkin cukup memakan waktu. - - Apa benar Anda ingin menyingkirkan sasaran pemberitahuan ini? - - Apa benar Anda ingin menyingkirkan %1$s %2$s? - - Pilih negara - - Negara - Mohon pilih negara - Nomor telepon - Nomor telepon tidak valid untuk negara yang dipilih - Verifikasi telepon - Kami telah mengirim SMS dengan kode aktivasi. Masukkan kode tersebut ke bawah. - Masukkan kode aktivasi - Ada kesalahan ketika memvalidasi nomor telepon Anda - Kode - - - Flair - Anda belum menjadi anggota komunitas manapun saat ini. - - 3 hari - 1 minggu - 1 bulan - Selamanya - - Foto Ruang - Nama Ruang - Topik - Tanda Ruang - Ditandai sebagai: - - Favorit - Avatar pemberitahu - Avatar penerima - Demosi pengguna dengan id berikut - Tema Status.im - - Tetap Panggil - Terima - - Error - - Mohon telaah dan terima kebijakan homeserver ini: - - Panggilan - Gunakan nada dering semula Element untuk panggilan masuk - Nada dering panggilan masuk - Pilih nada dering untuk panggilan: - - Panggilan Video Sedang Berlangsung… - - Keluarkan - Alasan - - Versi %s - Periksa Keadaan Pemberitahuan - Hasil diagnosa pemeriksaan keadaan - Lansungkan Ujicoba - Berlangsung… (%1$d of %2$d) - Diagnosa dasar berlangsung lancar. Apabila Anda masih belum dapat menerima pemberitahuan, mohon kirim laporan bug untuk kami selidiki. - Satu atau beberapa ujicoba gagal, coba sugesti yang kami tawarkan. - Satu atau beberapa ujicoba gagal, mohon kirim laporan bug untuk kami selidiki. - - Pengaturan Sistem. - Pemberitahuan diperbolehkan dalam pengaturan sistem. - Pemberitahuan tidak diperbolehkan dalam pengaturan sistem. -Silakan periksa pengaturan sistem. - Buka Pengaturan - - Pengaturan Akun. - Pemberitahuan diperbolehkan dalam pengaturan akun Anda. - Pemberitahuan tidak diperbolehkan dalam pengaturan akun Anda. -Mohon periksa pengaturan akun. - Perbolehkan - - Pengaturan Perangkat. - Pemberitahuan diperbolehkan untuk perangkat ini. - Pemberitahuan tidak diperbolehkan untuk perangkat ini. -Mohon periksa pengaturan Element. - Perbolehkan - - Pemeriksaan Layanan Google Play - APK Layanan Google Play ditemukan dan telah diperbaharui. - Element menggunakan Layanan Google Play untuk mendorong pesan tapi tampaknya tidak diatur sebagaimana harusnya. -\n%1$s - Perbaiki Layanan Google Play - - Token Firebase - Sukses mengambil token FCM. -%1$s - Gagal mengambil token FCM. -%1$s - - Pendaftaran Token - Sukses mendaftarkan token FCM di HomeServer. - Gagal mendaftarkan token FCM di HomeServer. -%1$s - - Layanan Pemberitahuan - Layanan Pemberitahuan sedang berjalan. - Layanan Pemberitahuan terhenti. -Coba nyalakan kembali aplikasi. - Mulai Layanan - - Nyalakan Layanan Pemberitahuan dengan Otomatis - Layanan terhenti dan dinyalakan kembali secara otomatis. - Layanan tidak dapat dinyalakan kembali - - Mulai ketika menyalakan perangkat - Layanan akan dimulai ketika perangkat dinyalakan kembali. - Layanan tidak akan mulai ketika perangkat dinyalakan kembali, Anda tidak akan menerima pemberitahuan hingga Anda membuka Element. - Perbolehkan memulai ketika perangkat dinyalakan - - Periksa halangan di balik layar - Halangan di balik layar dimatikan untuk Element. Ujicoba ini harus dijalankan menggunakan jaringan data (bukan WIFI). -%1$s - Halangan di balik layar dinyalakan untuk Element. -Aktivitas yang dilakukan aplikasi ini akan terhalang ketika beroperasi di balik layar, dan ini dapat mempengaruhi pemberitahuan. -%1$s - Matikan penghalang - - Optimisasi Baterai - Element tidak terpengaruh oleh Optimisasi Baterai. - Cadangkan Kunci - Gunakan Cadangan Kunci - - Pencadangan kunci belum selesai, mohon tunggu… - Pesan terenkripsi Anda akan hilang apabila Anda mencopot akun sekarang - Pencadangan kunci sedang berlangsung. Pesan terenkripsi Anda akan hilang apabila Anda mencopot akun sekarang. - Cadangan Kunci Aman harus aktif pada semua perangkat agar terhindar dari hilangnya akses ke pesan yang terenkripsi. - Saya tidak perlu pesan terenkripsi saya - Mencadangkan kunci… - Gunakan Cadangan Kunci - Yakin\? - Cadangkan - Akses ke pesan terenkripsi akan hilang apabila Anda tidak mencadangkan kunci sebelum mencopot akun. - - Lewatkan - Selesai - Hentikan - - Anda yakin ingin mencopot akun\? - Pengaturan Pemberitahuan Lanjutan - Urgensi pemberitahuan lewat kejadian - - Pengaturan Sesukanya. - Perhatikan bahwa sebagian jenis pesan tersetel diam (mengeluarkan pemberitahuan tanpa suara). - Sebagian pemberitahuan dimatikan dalam aturan Anda. - Gagal memuat aturan, mohon coba lagi. - Periksa Aturan - - [%1$s] -\nError ini di luar kendali Element dan menurut Google, error ini muncul ketika terlalu banyak aplikasi terdaftar dengan FCM pada perangkat tersebut. Error ini tidak seharusnya mempengaruhi pengguna biasa. - [%1$s] -\nError ini di luar kendali Element, dan dapat muncul karena berbagai alasan. Coba lagi nanti, atau Anda juga dapat memeriksa apabila penggunaan jaringan data Layanan Google Play tidak terhalang oleh sistem, atau waktu pada perangkat sudah benar, atau ini dapat terjadi pada ROM tidak resmi. - [%1$s] -\nError ini di luar kendali Element. Tidak terdapat akun Google pada perangkat. Mohon buka pengelola akun dan tambahkan akun Google. - Tambah Akun - - Apabila perangkat tidak sedang diisi atau dipergunakan dengan layar dimatikan, perangkat masuk mode Doze. Ini akan menghalangi aplikasi mengakses jaringan dan menunda tugas, sinkronisasi, dan alarm standar. - Abaikan Optimisasi - - Kelola Pemberitahuan Berisik - Kelola Pemberitahuan Panggilan - Kelola Pemberitahuan Diam - Pilih warna LED, getaran, suara… - - - Pengelolaan Kunci Kriptografi - Pratinjau tautan dalam obrolan apabila homeserver mendukung fitur ini. - Kirim pemberitahuan mengetik - Beritahu pengguna lain bahwa Anda sedang mengetik. - Format markdown - Format pesan menggunakan sintaks markdown sebelum dikirim. Ini mengijinkan format lanjutan seperti menggunakan tanda bintang untuk menunjukkan teks miring. - Tunjukkan tanda telah dibaca - Klik tanda telah dibaca untuk daftar yang lebih rinci. - Tunjukkan kejadian bergabung dan meninggalkan - Undangan, pengeluaran, dan larangan tidak terpengaruh. - Tunjukkan kejadian akun - diff --git a/vector/src/main/res/values-id/strings_no_weblate.xml b/vector/src/main/res/values-id/strings_no_weblate.xml deleted file mode 100644 index adab6505cd..0000000000 --- a/vector/src/main/res/values-id/strings_no_weblate.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - in - ID - - \ No newline at end of file diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml index 24f9cea581..af8863355c 100644 --- a/vector/src/main/res/values-in/strings.xml +++ b/vector/src/main/res/values-in/strings.xml @@ -1,5 +1,14 @@ + Undang dari %s + Undangan Ruang + %1$s dan %2$s + + Ruang kosong + + + %1$s dan %2$d yang lain + Pesan Ruang Pengaturan @@ -146,7 +155,7 @@ Nanti Kirim Saja - Element belum diijinkan untuk mengakses kontak lokal + ${app_name} belum diijinkan untuk mengakses kontak lokal Kirim log gangguan Raksasa Kecil @@ -241,23 +250,23 @@ Anda telah dikeluarkan dari semua perangkat dan tidak lagi menerima pemberitahua Ambil gambar atau video Tidak bisa merekam video - Element membutuhkan permisi atas akses galeri foto dan video Anda untuk mengirim dan menyimpan lampiran. + ${app_name} membutuhkan permisi atas akses galeri foto dan video Anda untuk mengirim dan menyimpan lampiran. Harap berikan akses pada halaman berikut agar berkas dapat dikirim dari ponsel Anda. - Element membutuhkan izin Anda untuk mengakses kamera untuk mengambil gambar dan melakukan panggilan video. + ${app_name} membutuhkan izin Anda untuk mengakses kamera untuk mengambil gambar dan melakukan panggilan video. Harap berikan akses pada halaman berikut agar dapat melakukan panggilan. - Element membutuhkan permisi atas akses mikrofon Anda untuk melakukan panggilan audio. + ${app_name} membutuhkan permisi atas akses mikrofon Anda untuk melakukan panggilan audio. Harap berikan akses pada halaman berikut agar dapat melakukan panggilan. - Element membutuhkan permisi atas akses kamera dan mikrofon Anda untuk melakukan panggilan video. + ${app_name} membutuhkan permisi atas akses kamera dan mikrofon Anda untuk melakukan panggilan video. Harap berikan akses pada halaman selanjutnya untuk melakukan panggilan. Tema Terang Tema Kelam - Tema Gelap + Tema Gelap Sedang Sinkronisasi Pemberitahuan Berisik @@ -312,7 +321,7 @@ Harap berikan akses pada halaman selanjutnya untuk melakukan panggilan. Permintaan kunci terkirim. Permintaan terkirim - Jalankan Element di perangkat yang dapat mendekripsi pesan tersebut agar kunci dapat dikirim ke perangkat ini. + Jalankan ${app_name} di perangkat yang dapat mendekripsi pesan tersebut agar kunci dapat dikirim ke perangkat ini. Daftar Grup @@ -321,12 +330,12 @@ Harap berikan akses pada halaman selanjutnya untuk melakukan panggilan. Panggilan - Element memerlukan permisi untuk mengakses daftar kontak agar dapat mencari pengguna Matrix lain berdasarkan email dan nomor telepon. + ${app_name} memerlukan permisi untuk mengakses daftar kontak agar dapat mencari pengguna Matrix lain berdasarkan email dan nomor telepon. -Ijinkan akses lewat halaman selanjutnya untuk menemukan pengguna Element yang terdapat di daftar kontak Anda. - Element memerlukan permisi akses daftar kontak Anda untuk menemukan pengguna Matrix lain berdasarkan email dan nomor telepon mereka. +Ijinkan akses lewat halaman selanjutnya untuk menemukan pengguna ${app_name} yang terdapat di daftar kontak Anda. + ${app_name} memerlukan permisi akses daftar kontak Anda untuk menemukan pengguna Matrix lain berdasarkan email dan nomor telepon mereka. -Bolehkah Element mengakses daftar kontak Anda? +Bolehkah ${app_name} mengakses daftar kontak Anda? "Maaf. Tidak dapat dilakukan karena belum menerima permisi" @@ -846,14 +855,14 @@ Peringatan: berkas ini mungkin ikut terhapus jika aplikasi dihapus. Deaktivasi akunku Kerahasiaan Notifikasi - Element dapat beroperasi di balik layar untuk mengurus pemberitahuan Anda dengan aman dan rahasia. Ini dapat mempengaruhi masa tahan baterai. + ${app_name} dapat beroperasi di balik layar untuk mengurus pemberitahuan Anda dengan aman dan rahasia. Ini dapat mempengaruhi masa tahan baterai. Kabulkan permisi Pilih opsi lain Analitik Kirim data analitik - Element mengumpulkan data analitik anonim dalam upaya kami meningkatkan aplikasi. - Mohon aktifkan analitik untuk membantu kami meningkatkan Element. + ${app_name} mengumpulkan data analitik anonim dalam upaya kami meningkatkan aplikasi. + Mohon aktifkan analitik untuk membantu kami meningkatkan ${app_name}. Ya, saya ingin membantu! Mode hemat data @@ -930,7 +939,6 @@ Tindakan ini akan memulai ulang aplikasi dan mungkin cukup memakan waktu.Avatar pemberitahu Avatar penerima Demosi pengguna dengan id berikut - Tema Status.im Tetap Panggil Terima @@ -940,7 +948,7 @@ Tindakan ini akan memulai ulang aplikasi dan mungkin cukup memakan waktu.Mohon telaah dan terima kebijakan homeserver ini: Panggilan - Gunakan nada dering semula Element untuk panggilan masuk + Gunakan nada dering semula ${app_name} untuk panggilan masuk Nada dering panggilan masuk Pilih nada dering untuk panggilan: @@ -972,13 +980,13 @@ Mohon periksa pengaturan akun. Pengaturan Perangkat. Pemberitahuan diperbolehkan untuk perangkat ini. - Pemberitahuan tidak diperbolehkan untuk perangkat ini. -Mohon periksa pengaturan Element. + Pemberitahuan tidak diperbolehkan untuk perangkat ini. +Mohon periksa pengaturan ${app_name}. Perbolehkan Pemeriksaan Layanan Google Play APK Layanan Google Play ditemukan dan telah diperbaharui. - Element menggunakan Layanan Google Play untuk mendorong pesan tapi tampaknya tidak diatur sebagaimana harusnya. + ${app_name} menggunakan Layanan Google Play untuk mendorong pesan tapi tampaknya tidak diatur sebagaimana harusnya. \n%1$s Perbaiki Layanan Google Play @@ -1005,19 +1013,19 @@ Coba nyalakan kembali aplikasi. Mulai ketika menyalakan perangkat Layanan akan dimulai ketika perangkat dinyalakan kembali. - Layanan tidak akan mulai ketika perangkat dinyalakan kembali, Anda tidak akan menerima pemberitahuan hingga Anda membuka Element. + Layanan tidak akan mulai ketika perangkat dinyalakan kembali, Anda tidak akan menerima pemberitahuan hingga Anda membuka ${app_name}. Perbolehkan memulai ketika perangkat dinyalakan Periksa halangan di balik layar - Halangan di balik layar dimatikan untuk Element. Ujicoba ini harus dijalankan menggunakan jaringan data (bukan WIFI). + Halangan di balik layar dimatikan untuk ${app_name}. Ujicoba ini harus dijalankan menggunakan jaringan data (bukan WIFI). %1$s - Halangan di balik layar dinyalakan untuk Element. + Halangan di balik layar dinyalakan untuk ${app_name}. Aktivitas yang dilakukan aplikasi ini akan terhalang ketika beroperasi di balik layar, dan ini dapat mempengaruhi pemberitahuan. %1$s Matikan penghalang Optimisasi Baterai - Element tidak terpengaruh oleh Optimisasi Baterai. + ${app_name} tidak terpengaruh oleh Optimisasi Baterai. Cadangkan Kunci Gunakan Cadangan Kunci @@ -1046,12 +1054,12 @@ Aktivitas yang dilakukan aplikasi ini akan terhalang ketika beroperasi di balik Gagal memuat aturan, mohon coba lagi. Periksa Aturan - [%1$s] -\nError ini di luar kendali Element dan menurut Google, error ini muncul ketika terlalu banyak aplikasi terdaftar dengan FCM pada perangkat tersebut. Error ini tidak seharusnya mempengaruhi pengguna biasa. - [%1$s] -\nError ini di luar kendali Element, dan dapat muncul karena berbagai alasan. Coba lagi nanti, atau Anda juga dapat memeriksa apabila penggunaan jaringan data Layanan Google Play tidak terhalang oleh sistem, atau waktu pada perangkat sudah benar, atau ini dapat terjadi pada ROM tidak resmi. - [%1$s] -\nError ini di luar kendali Element. Tidak terdapat akun Google pada perangkat. Mohon buka pengelola akun dan tambahkan akun Google. + [%1$s] +\nError ini di luar kendali ${app_name} dan menurut Google, error ini muncul ketika terlalu banyak aplikasi terdaftar dengan FCM pada perangkat tersebut. Error ini tidak seharusnya mempengaruhi pengguna biasa. + [%1$s] +\nError ini di luar kendali ${app_name}, dan dapat muncul karena berbagai alasan. Coba lagi nanti, atau Anda juga dapat memeriksa apabila penggunaan jaringan data Layanan Google Play tidak terhalang oleh sistem, atau waktu pada perangkat sudah benar, atau ini dapat terjadi pada ROM tidak resmi. + [%1$s] +\nError ini di luar kendali ${app_name}. Tidak terdapat akun Google pada perangkat. Mohon buka pengelola akun dan tambahkan akun Google. Tambah Akun Apabila perangkat tidak sedang diisi atau dipergunakan dengan layar dimatikan, perangkat masuk mode Doze. Ini akan menghalangi aplikasi mengakses jaringan dan menunda tugas, sinkronisasi, dan alarm standar. diff --git a/vector/src/main/res/values-is/strings.xml b/vector/src/main/res/values-is/strings.xml index c1c016fed0..99c024c320 100644 --- a/vector/src/main/res/values-is/strings.xml +++ b/vector/src/main/res/values-is/strings.xml @@ -1,8 +1,78 @@ + %1$s: %2$s + %1$s sendi mynd. + %1$s sendi límmerki. + + %s sendi boð um þátttöku + %1$s bauð %2$s + %1$s bauð þér + %1$s gekk í hópinn + %1$s hætti + %1$s hafnaði boðinu + %1$s sparkaði %2$s + %1$s afbannaði %2$s + %1$s bannaði %2$s + %1$s breyttu auðkennismynd sinni + allir meðlimir spjallrásar, síðan þeim var boðið. + allir meðlimir spjallrásar, síðan þeir skráðu sig. + allir meðlimir spjallrásar. + hver sem er. + óþekktur (%s). + VoIP-símafundur hafinn + VoIP-símafundi lokið + + (einnig var skipt um auðkennismynd) + ** Mistókst að afkóða: %s ** + + Gat ekki sent skilaboð + + Gat ekki sent inn mynd + + Villa í netkerfi + Villa í Matrix + + Tölvupóstfang + Símanúmer + + %1$s tók til baka boð frá %2$s + %1$s setti birtingarnafn sitt sem %2$s + %1$s breytti birtingarnafni sínu úr %2$s í %3$s + %1$s fjarlægði birtingarnafn sitt (%2$s) + %1$s breytti umræðuefninu í: %2$s + %1$s breytti heiti spjallrásarinnar í: %2$s + %s hringdi myndsamtal. + %s hringdi raddsamtal. + %s svaraði símtalinu. + %s lauk símtalinu. + %1$s kveikti á enda-í-enda dulritun (%2$s) + + %1$s bað um VoIP-símafund + %1$s fjarlægði heiti spjallrásar + %1$s fjarlægði umfjöllunarefni spjallrásar + %1$s gerði ferilskrá spjallrásar héðan í frá sýnilega fyrir %2$s + %1$s uppfærði notandasniðið sitt %2$s + %1$s sendi boð til %2$s um þátttöku í spjallrásinni + %1$s samþykkti boð um að taka þátt í %2$s + + Tæki sendandans hefur ekki sent okkur dulritunarlyklana fyrir þessi skilaboð. + + Gat ekki ritstýrt + Ekki er í augnablikinu hægt að taka aftur þátt í spjallrás sem er tóm. + + Boð á spjallrás + %1$s og %2$s + + + %1$s og 1 annar + %1$s og %2$d aðrir + + + Tóm spjallrás + Boð frá %s Ljóst þema Dökkt þema - Svart þema + Svart þema Samstilli Hlusta eftir atburðum @@ -686,7 +756,7 @@ Til að halda áfram skaltu setja inn lykilorðið þitt. Ógilt snið samnefnis Netþjónninn gæti verið undir miklu álagi eða ekki til taks Þar sem ýmsar heimildir vantar, eru sumir eiginleikar ekki tiltækir… - Þú heimilaðir Element ekki aðgang að tengiliðum á tækinu + Þú heimilaðir ${app_name} ekki aðgang að tengiliðum á tækinu Hristu ákveðið til að senda villutilkynningu Það tókst að senda villuskýrsluna @@ -708,7 +778,7 @@ Ertu alveg viss? Hlé milli tveggja samstillingarbeiðna Halda gögnum - Element getur keyrt í bakgrunni og stýrt tilkynningum á öruggan hátt (getur haft áhrif á rafhlöðunotkun). + ${app_name} getur keyrt í bakgrunni og stýrt tilkynningum á öruggan hátt (getur haft áhrif á rafhlöðunotkun). Skoðaðu tölvupóstinn þinn og smelltu á tengilinn sem hann inniheldur. Þegar því er lokið skaltu smella á að halda áfram. Tókst ekki að sannreyna tölvupóstfang. Skoðaðu tölvupóstinn þinn og smelltu á tengilinn sem hann inniheldur. Þegar því er lokið skaltu smella á að halda áfram @@ -740,26 +810,26 @@ Ertu alveg viss? Tiltekið aðgangsteikn þekktist ekki Ekki var svarað á fjartengda endanum. - Element þarf heimild til að nota mynda- og myndskeiðasafn svo hægt sé að senda og vista viðhengi. + ${app_name} þarf heimild til að nota mynda- og myndskeiðasafn svo hægt sé að senda og vista viðhengi. Leyfðu aðgang í næsta sprettglugga til þess að geta sent skrár úr símanum. - Element þarf heimild til að nota myndavélina svo hægt sé að taka myndir og hringja myndsímtöl. + ${app_name} þarf heimild til að nota myndavélina svo hægt sé að taka myndir og hringja myndsímtöl. Leyfðu aðgang í næsta sprettglugga til þess að geta hringt. - Element þarf heimild til að nota hljóðnemann svo hægt sé að hringja hljóðsímtöl. + ${app_name} þarf heimild til að nota hljóðnemann svo hægt sé að hringja hljóðsímtöl. Leyfðu aðgang í næsta sprettglugga til þess að geta hringt. - Element þarf heimild til að nota myndavélina og hljóðnemann svo hægt sé að hringja myndsímtöl. + ${app_name} þarf heimild til að nota myndavélina og hljóðnemann svo hægt sé að hringja myndsímtöl. Leyfðu aðgang í næstu sprettgluggum til þess að geta hringt. - Element þarf heimild til að nota tengiliði í nafnaskránni svo hægt sé að finna aðra Matrix-notendur eftir tölvupóstföngum og símanúmerum þeirra. + ${app_name} þarf heimild til að nota tengiliði í nafnaskránni svo hægt sé að finna aðra Matrix-notendur eftir tölvupóstföngum og símanúmerum þeirra. -Leyfðu aðgang í næsta sprettglugga til þess að finna þá notendur í nafnaskránni sem hægt er að hafa samband við úr Element. - Element þarf heimild til að nota tengiliði í nafnaskránni svo hægt sé að finna aðra Matrix-notendur eftir tölvupóstföngum og símanúmerum þeirra. +Leyfðu aðgang í næsta sprettglugga til þess að finna þá notendur í nafnaskránni sem hægt er að hafa samband við úr ${app_name}. + ${app_name} þarf heimild til að nota tengiliði í nafnaskránni svo hægt sé að finna aðra Matrix-notendur eftir tölvupóstföngum og símanúmerum þeirra. -Leyfa Element nota tengiliðina ? +Leyfa ${app_name} nota tengiliðina ? Gera notandaaðgang óvirkann Gera notandaaðganginn minn óvirkann @@ -786,8 +856,8 @@ Leyfa Element nota tengiliðina ? Tölvupósttengill sem ekki er enn búið að smella á Rangt formað auðkenni. Ætti að vera tölvupóstfang eða Matrix-auðkenni á borð við\'@sérheiti:lén\' - Element safnar nafnlausum greiningargögnum til að gera okkur kleift að bæta forritið. - Endilega virkjaðu greiningargögn til að hjálpa okkur að bæta Element. + ${app_name} safnar nafnlausum greiningargögnum til að gera okkur kleift að bæta forritið. + Endilega virkjaðu greiningargögn til að hjálpa okkur að bæta ${app_name}. Til að tengja við spjallrás verður hún að vera með vistfang. Þú ert að reyna að tengjast %s. Myndirðu vilja gerast meðlimur til að geta tekið þátt í samræðunni? Þetta er forskoðun á spjallrásinni. Samskipti spjallrásarinnar hafa verið gerð óvirk. diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index b3e6992439..39ca954053 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -1,5 +1,268 @@ + %1$s: %2$s + %1$s ha inviato un\'immagine. + Invito di %s + %1$s ha invitato %2$s + %1$s ti ha invitato + %1$s è entrato nella stanza + %1$s è uscito dalla stanza + %1$s ha rifiutato l\'invito + %1$s ha buttato fuori %2$s + %1$s ha tolto il bando a %2$s + %1$s ha bandito %2$s + %1$s ha revocato l\'invito per %2$s + %1$s ha modificato il suo avatar + %1$s hanno cambiato il nome visualizzato con %2$s + %1$s ha cambiato il nome visualizzato da %2$s a %3$s + %1$s ha rimosso il nome visibile (%2$s) + %1$s ha cambiato l\'argomento con: %2$s + %1$s ha cambiato il nome della stanza con: %2$s + %s ha iniziato una chiamata video. + %s ha iniziato una chiamata vocale. + %s ha risposto alla chiamata. + %s ha terminato la chiamata. + %1$s ha reso la futura cronologia della stanza visibile a %2$s + tutti i membri della stanza, dal momento del loro invito. + tutti i membri della stanza, dal momento in cui sono entrati. + tutti i membri della stanza. + chiunque. + sconosciuto (%s). + %1$s ha attivato la crittografia end-to-end (%2$s) + %1$s ha richiesto una conferenza VoIP + Conferenza VoIP iniziata + Conferenza VoIP terminata + (anche l\'avatar è cambiato) + %1$s ha rimosso il nome della stanza + %1$s ha rimosso l\'argomento della stanza + %1$s ha aggiornato il profilo %2$s + %1$s ha mandato un invito a %2$s per unirsi alla stanza + %1$s ha accettato l\'invito per %2$s + ** Impossibile decriptare: %s ** + Il dispositivo del mittente non ci ha inviato le chiavi per questo messaggio. + Impossibile revisionare + Impossibile inviare il messaggio + Invio dell\'immagine fallito + Errore di rete + Errore di Matrix + Al momento non è possibile rientrare in una stanza vuota. + Indirizzo email + Numero di telefono + %1$s ha inviato un adesivo. + + Invito da %s + Invito nella stanza + %1$s e %2$s + Stanza vuota + + %1$s e 1 altro + %1$s e %2$d altri + + Messaggio rimosso + Messaggio rimosso da %1$s + Messaggio rimosso [motivo: %1$s] + Messaggio rimosso da %1$s [motivo: %2$s] + Sync iniziale: +\nImportazione account… + Sync iniziale: +\nImportazione cifratura + Sync iniziale: +\nImportazione stanze + Sync iniziale: +\nImportazione stanze partecipate + Sync iniziale: +\nImportazione stanze invitate + Sync iniziale: +\nImportazione stanze lasciate + Sync iniziale: +\nImportazione comunità + Sync iniziale: +\nImportazione dati account + %s ha aggiornato questa stanza. + Invio messaggio in corso … + Cancella la coda di invio + %1$s ha revocato l\'invito a %2$s di unirsi alla stanza + Invito di %1$s. Motivo: %2$s + %1$s ha invitato %2$s. Motivo: %3$s + %1$s ti ha invitato. Motivo: %2$s + %1$s è entrato nella stanza. Motivo: %2$s + %1$s è uscito dalla stanza. Motivo: %2$s + %1$s ha rifiutato l\'invito. Motivo: %2$s + %1$s ha buttato fuori %2$s. Motivo: %3$s + %1$s ha riammesso %2$s. Motivo: %3$s + %1$s ha bandito %2$s. Motivo: %3$s + %1$s ha inviato un invito a %2$s di unirsi alla stanza. Motivo: %3$s + %1$s ha revocato l\'invito a %2$s di unirsi alla stanza. Motivo: %3$s + %1$s ha accettato l\'invito per %2$s. Motivo: %3$s + %1$s ha rifiutato l\'invito di %2$s. Motivo: %3$s + + %1$s ha aggiunto %2$s come indirizzo per questa stanza. + %1$s ha aggiunto %2$s come indirizzi per questa stanza. + + + %1$s ha rimosso %2$s come indirizzo per questa stanza. + %1$s ha rimosso %2$s come indirizzi per questa stanza. + + %1$s ha aggiunto %2$s e rimosso %3$s come indirizzi per questa stanza. + %1$s ha impostato l\'indirizzo principale per questa stanza a %2$s. + %1$s ha rimosso l\'indirizzo principale per questa stanza. + %1$s ha permesso l\'accesso alla stanza per gli ospiti. + %1$s ha impedito l\'accesso alla stanza per gli ospiti. + %1$s ha attivato la cifratura end-to-end. + %1$s ha attivato la cifratura end-to-end (algoritmo %2$s non riconosciuto). + %1$s ha creato la stanza + Hai inviato un\'immagine. + Hai inviato un adesivo. + Il tuo invito + Hai creato la stanza + Hai invitato %1$s + Sei entrato nella stanza + Sei uscito dalla stanza + Hai rifiutato l\'invito + Hai buttato fuori %1$s + Hai riammesso %1$s + Hai bandito %1$s + Hai ritirato l\'invito di %1$s + Hai cambiato il tuo avatar + Hai impostato il tuo nome visualizzato a %1$s + Hai cambiato il tuo nome visualizzato da %1$s a %2$s + Hai rimosso il tuo nome visibile (era %1$s) + Hai cambiato l\'argomento a: %1$s + %1$s ha modificato l\'avatar della stanza + Hai modificato l\'avatar della stanza + Hai cambiato il nome della stanza a: %1$s + Hai iniziato una videochiamata. + Hai iniziato una telefonata. + %s ha inviato dati per impostare la chiamata. + Hai inviato dati per impostare la chiamata. + Hai risposto alla chiamata. + Hai terminato la chiamata. + Hai reso visibile la futura cronologia della stanza a %1$s + Hai attivato la crittografia end-to-end (%1$s) + Hai aggiornato questa stanza. + Hai richiesto una conferenza VoIP + Hai rimosso il nome della stanza + Hai rimosso l\'argomento della stanza + %1$s ha rimosso l\'avatar della stanza + Hai rimosso l\'avatar della stanza + Hai aggiornato il tuo profilo %1$s + Hai mandato un invito a %1$s a unirsi alla stanza + Hai revocato l\'invito per %1$s a unirsi alla stanza + Hai accettato l\'invito per %1$s + %1$s ha aggiunto il widget %2$s + Hai aggiunto il widget %1$s + %1$s ha rimosso il widget %2$s + Hai rimosso il widget %1$s + %1$s ha modificato il widget %2$s + Hai modificato il widget %1$s + Amministratore + Moderatore + Predefinito + Personalizzato (%1$d) + Personalizzato + Hai cambiato il livello di potere di %1$s. + %1$s ha cambiato il livello di potere di %2$s. + %1$s da %2$s a %3$s + Il tuo invito. Motivo: %1$s + Hai invitato %1$s. Motivo: %2$s + Sei entrato nella stanza. Motivo: %1$s + Sei uscito dalla stanza. Motivo: %1$s + Hai rifiutato l\'invito. Motivo: %1$s + Hai buttato fuori %1$s. Motivo: %2$s + Hai riammesso %1$s. Motivo: %2$s + Hai bandito %1$s. Motivo: %2$s + Hai mandato un invito a %1$s a unirsi alla stanza. Motivo: %2$s + Hai revocato l\'invito a %1$s a unirsi alla stanza. Motivo: %2$s + Hai accettato l\'invito per %1$s. Motivo: %2$s + Hai ritirato l\'invito di %1$s. Motivo: %2$s + + Hai aggiunto %1$s come indirizzo per questa stanza. + Hai aggiunto %1$s come indirizzi per questa stanza. + + + Hai rimosso %1$s come indirizzo per questa stanza. + Hai rimosso %1$s come indirizzi per questa stanza. + + Hai aggiunto %1$s e rimosso %2$s come indirizzi per questa stanza. + Hai impostato l\'indirizzo principale per questa stanza a %1$s. + Hai rimosso l\'indirizzo principale per questa stanza. + Hai permesso l\'accesso alla stanza per gli ospiti. + Hai impedito l\'accesso alla stanza per gli ospiti. + Hai attivato la crittografia end-to-end. + Hai attivato la crittografia end-to-end (algoritmo %1$s sconosciuto). + Hai impedito l\'accesso alla stanza agli ospiti. + %1$s ha impedito l\'accesso alla stanza agli ospiti. + Hai permesso l\'accesso agli ospiti. + %1$s ha permesso l\'accesso agli ospiti. + Sei entrato. Motivo: %1$s + Sei uscito. Motivo: %1$s + %1$s è uscito. Motivo: %2$s + %1$s è entrato. Motivo: %2$s + Hai revocato l\'invito per %1$s + %1$s ha revocato l\'invito per %2$s + Hai invitato %1$s + %1$s ha invitato %2$s + Hai aggiornato la stanza. + %s ha aggiornato la stanza. + Hai reso visibili i messaggi futuri a %1$s + %1$s ha reso visibili i messaggi futuri a %2$s + Sei uscito dalla stanza + %1$s è uscito dalla stanza + Sei entrato + %1$s è entrato + Hai creato la discussione + %1$s ha creato la discussione + Stanza vuota (era %s) + + %1$s, %2$s, %3$s e %4$d altro + %1$s, %2$s, %3$s e altri %4$d + + %1$s, %2$s, %3$s e %4$s + %1$s, %2$s e %3$s + 🎉 Tutti i server sono banditi dalla partecipazione! Questa stanza non può più essere usata. + Nessuna modifica. + • I server che corrispondono a IP letterali ora sono banditi. + • I server che corrispondono a IP letterali ora sono permessi. + • I server che corrispondono a %s sono stati rimossi dalla lista dei consentiti. + • I server che corrispondono a %s ora sono permessi. + • I server che corrispondono a %s sono stati rimossi dalla lista di ban. + • I server che corrispondono a %s ora sono banditi. + Hai cambiato le ACL del server per questa stanza. + %s ha cambiato le ACL del server per questa stanza. + • I server che corrispondono a IP letterali sono banditi. + • I server che corrispondono a IP letterali sono permessi. + • I server che corrispondono a %s sono permessi. + • I server che corrispondono a %s sono banditi. + Hai impostato le ACL del server per questa stanza. + %s ha impostato le ACL del server per questa stanza. + Hai cambiato gli indirizzi per questa stanza. + %1$s ha cambiato gli indirizzi per questa stanza. + Hai cambiato gli indirizzi principali ed alternativi per questa stanza. + %1$s ha cambiato gli indirizzi principali ed alternativi per questa stanza. + Hai cambiato gli indirizzi alternativi per questa stanza. + %1$s ha cambiato gli indirizzi alternativi per questa stanza. + + Hai rimosso l\'indirizzo alternativo %1$s per questa stanza. + Hai rimosso gli indirizzi alternativi %1$s per questa stanza. + + + %1$s ha rimosso l\'indirizzo alternativo %2$s per questa stanza. + %1$s ha rimosso gli indirizzi alternativi %2$s per questa stanza. + + + Hai aggiunto l\'indirizzo alternativo %1$s per questa stanza. + Hai aggiunto gli indirizzi alternativi %1$s per questa stanza. + + + %1$s ha aggiunto l\'indirizzo alternativo %2$s per questa stanza. + %1$s ha aggiunto gli indirizzi alternativi %2$s per questa stanza. + + Hai modificato la video conferenza + Video conferenza modificata da %1$s + Hai iniziato la video conferenza + Hai terminato la video conferenza + Video conferenza terminata da %1$s + Video conferenza iniziata da %1$s Messaggi Stanza @@ -73,7 +336,7 @@ Elenco utenti Mostra solo i contatti Matrix Nessuna conversazione - Element non ha avuto l\'autorizzazione ad accedere alla tua Rubrica locale + ${app_name} non ha avuto l\'autorizzazione ad accedere alla tua Rubrica locale Nessun risultato Stanze @@ -90,7 +353,7 @@ Segnala errore Per favore descrivi l\'errore. Cosa stavi facendo\? Cosa ti aspettavi dovesse accadere\? Cosa è effettivamente successo\? Descrivi qui il problema - Per permettere una diagnosi del problema, oltre alla segnalazione errore verranno inviati anche i registri di Element. Rapporto, registri e schermata non saranno resi pubblici. Tuttavia, se preferisci inviare solamente la segnalazione, deseleziona: + Per permettere una diagnosi del problema, oltre alla segnalazione errore verranno inviati anche i registri di ${app_name}. Rapporto, registri e schermata non saranno resi pubblici. Tuttavia, se preferisci inviare solamente la segnalazione, deseleziona: Sembra tu stia scuotendo il dispositivo con rabbia. Vuoi segnalare un errore\? L\'ultima volta l\'applicazione è andata in crash. Vuoi inviare una segnalazione\? La segnalazione errore è stata spedita @@ -216,22 +479,22 @@ Impossibile registrare video Informazione - Element deve essere autorizzato ad accedere alla tua Galleria di foto e video per poter inviare e salvare allegati. + ${app_name} deve essere autorizzato ad accedere alla tua Galleria di foto e video per poter inviare e salvare allegati. \n \nNel prossimo pop-up concedi l\'autorizzazione per poteri inviare file dal tuo dispositivo. - Element deve essere autorizzato ad accedere alla tua fotocamera per poter fare foto e video. + ${app_name} deve essere autorizzato ad accedere alla tua fotocamera per poter fare foto e video. " \n \nNel prossimo pop-up concedi l\'autorizzazione per poter fare la chiamata." - Element deve essere autorizzato ad accedere al microfono e poter così fare chiamate audio. + ${app_name} deve essere autorizzato ad accedere al microfono e poter così fare chiamate audio. " \n \nNel prossimo pop-up concedi l\'autorizzazione per poter fare la chiamata." - Element deve essere autorizzato ad accedere a fotocamera e microfono per poter fare chiamate video. + ${app_name} deve essere autorizzato ad accedere a fotocamera e microfono per poter fare chiamate video. \n \nNel prossimo pop-up concedi le autorizzazioni per poter fare la chiamata. - Element può usare tua Rubrica locale per trovare altri utenti Matrix grazie alle loro email e numeri di telefono. Se ti sta bene comunicare i dati di tutti i tuoi contatti all\'Identity Server, puoi concedere l\'autorizzazione nel prossimo pop-up. - Element può usare tua Rubrica locale per trovare altri utenti Matrix grazie alle loro email e numeri di telefono. + ${app_name} può usare tua Rubrica locale per trovare altri utenti Matrix grazie alle loro email e numeri di telefono. Se ti sta bene comunicare i dati di tutti i tuoi contatti all\'Identity Server, puoi concedere l\'autorizzazione nel prossimo pop-up. + ${app_name} può usare tua Rubrica locale per trovare altri utenti Matrix grazie alle loro email e numeri di telefono. \n \nTi sta bene comunicare i dati di tutti i tuoi contatti per questo scopo\? Purtroppo l\'azione non è stata eseguita poiché mancano i permessi @@ -602,7 +865,7 @@ Enorme Tema Chiaro Tema Scuro - Tema Nero + Tema Nero Sincronizzazione… Suono delle notifiche Mostra gli orari in formato 12 ore @@ -754,7 +1017,7 @@ • Le notifiche contengono metadati e contenuto del messaggio • Le notifiche non mostreranno il contenuto del messaggio Privacy delle notifiche - Element può esser sempre attivo in background in modo da gestire le tue notifiche in modo costante e sicuro. Ciò può influire sulla durata della batteria. + ${app_name} può esser sempre attivo in background in modo da gestire le tue notifiche in modo costante e sicuro. Ciò può influire sulla durata della batteria. Concedi l\'autorizzazione Scegli un\'altra opzione Invia uno sticker @@ -765,8 +1028,8 @@ Disattiva l\'account Disattiva il mio account Invia le statistiche di utilizzo - Element raccoglie statistiche anonime per permettere il miglioramento dell\'applicazione. - Attiva le statistiche per aiutare a migliorare Element. + ${app_name} raccoglie statistiche anonime per permettere il miglioramento dell\'applicazione. + Attiva le statistiche per aiutare a migliorare ${app_name}. Sì, voglio aiutare! Manca un parametro indispensabile. Uno dei parametri non è valido. @@ -788,7 +1051,7 @@ Richiedi di nuovo le chiavi di crittografia dalle tue altre sessioni. La richiesta della chiave è stata inviata. Richiesta inviata - Avvia Element su un altro dispositivo che possa decifrare il messaggio, in modo che possa inviare le chiavi a questa sessione. + Avvia ${app_name} su un altro dispositivo che possa decifrare il messaggio, in modo che possa inviare le chiavi a questa sessione. Digita qui… Invia messaggio vocale prosegui con… @@ -868,7 +1131,6 @@ Il tuo Home Server non supporta ancora il caricamento differito dei membri delle stanze. Prova più avanti. Spiacente, si è verificato un errore Caricamento differito dei membri della stanza - Tema Status.im Versione %s Crea una password per mettere al sicuro le chiavi esportate. La stessa password dovrà essere usata per poter importare le chiavi. Crea una password @@ -904,7 +1166,7 @@ Markdown è stato abilitato. Markdown è stato disabilitato. Chiamate - Usa la suoneria predefinita di Element per le chiamate in arrivo + Usa la suoneria predefinita di ${app_name} per le chiamate in arrivo Suoneria delle chiamate in arrivo Scegli la suoneria per le chiamate: Accetta @@ -928,12 +1190,12 @@ Abilita Impostazioni sessione. Le notifiche sono attive per questa sessione. - Le notifiche non sono attive per questa sessione. -\nControlla le impostazioni di Element. + Le notifiche non sono attive per questa sessione. +\nControlla le impostazioni di ${app_name}. Abilita Esegui un controllo dei servizi L\'APK Google Play Services è disponibile e aggiornato. - Element usa Google Play Services per consegnare i messaggi a comparsa, ma sembra non sia stato configurato correttamente: + ${app_name} usa Google Play Services per consegnare i messaggi a comparsa, ma sembra non sia stato configurato correttamente: \n%1$s Correggi i Play Services Token di Firebase @@ -955,22 +1217,22 @@ L\'avvio del servizio è fallito Esegui all\'avvio Il servizio inizierà quando il dispositivo sarà riavviato. - Il servizio non partirà al riavvio del dispositivo. Non riceverai notifiche finché Element non verrà aperto almeno una volta. + Il servizio non partirà al riavvio del dispositivo. Non riceverai notifiche finché ${app_name} non verrà aperto almeno una volta. Abilita l\'esecuzione all\'avvio Verifica se Element sia stato configurato per funzionare in modo limitato quando lavora in background - Element non funziona senza alcuna restrizione anche quando è eseguito in background. Questo test andrebbe eseguito usando dati mobili (non WIFI). + ${app_name} non funziona senza alcuna restrizione anche quando è eseguito in background. Questo test andrebbe eseguito usando dati mobili (non WIFI). \n%1$s - Element è stato configurato per funzionare in modo limitato quando è eseguito in background. + ${app_name} è stato configurato per funzionare in modo limitato quando è eseguito in background. \nIl funzionamento dell\'App, quando è eseguita in background, è stato fortemente limitato e ciò potrebbe influenzare la ricezione delle notifiche. \n%1$s Non limitare Ottimizzazione della batteria - Element non è influenzato dall\'ottimizzazione della batteria. + ${app_name} non è influenzato dall\'ottimizzazione della batteria. Se si lascia un dispositivo scollegato, fermo e con lo schermo spento, dopo un certo tempo questo entra in modalità Doze. Ciò impedisce alle App di accedere alla rete e ritarda le attività, le sincronizzazioni e la ricezione dei normali allarmi. Ignora l\'ottimizzazione Connessione in background - Per poter ricevere le notifiche in tempo reale, Element deve potersi sempre connettere. Anche quando funziona in background. -\nNella schermata successiva ti verrà chiesto di consentire a Element di funzionare anche quando è in background, accetta per favore. + Per poter ricevere le notifiche in tempo reale, ${app_name} deve potersi sempre connettere. Anche quando funziona in background. +\nNella schermata successiva ti verrà chiesto di consentire a ${app_name} di funzionare anche quando è in background, accetta per favore. Concedi il permesso Si è verificato un errore durante la verifica dell\'indirizzo email. Si è verificato un errore durante la verifica del numero di telefono. @@ -1005,12 +1267,12 @@ Alcune notifiche sono disattivate nelle tue impostazioni personalizzate. Il caricamento delle regole personalizzate è fallito, riprova. Controlla le Impostazioni - [%1$s] -\nQuesto errore non dipende da Element. Secondo Google dipende dal fatto che questo dispositivo ha troppe App registrate con FCM. L\'errore si verifica solo in casi in cui ci sia un numero estremo di app, quindi non dovrebbe affliggere l\'utente medio. - [%1$s] -\nQuesto errore non dipende da Element e può avere diverse cause. Potresti riprovare più tardi o controllare che Google Play Service non abbia configurato nelle Impostazioni di sistema dei limiti di utilizzo di dati. Anche un orologio di sistema regolato male potrebbe esserne la causa. Oppure può verificarsi se hai una ROM customizzata. - [%1$s] -\nQuesto errore non dipende da Element. Non c\'è alcun account Google nel telefono. Apri il gestore di account ed aggiungi un account Google. + [%1$s] +\nQuesto errore non dipende da ${app_name}. Secondo Google dipende dal fatto che questo dispositivo ha troppe App registrate con FCM. L\'errore si verifica solo in casi in cui ci sia un numero estremo di app, quindi non dovrebbe affliggere l\'utente medio. + [%1$s] +\nQuesto errore non dipende da ${app_name} e può avere diverse cause. Potresti riprovare più tardi o controllare che Google Play Service non abbia configurato nelle Impostazioni di sistema dei limiti di utilizzo di dati. Anche un orologio di sistema regolato male potrebbe esserne la causa. Oppure può verificarsi se hai una ROM customizzata. + [%1$s] +\nQuesto errore non dipende da ${app_name}. Non c\'è alcun account Google nel telefono. Apri il gestore di account ed aggiungi un account Google. Aggiungi account Configura le notifiche rumorose Configura le notifiche di chiamata @@ -1029,7 +1291,7 @@ Inserisci un nome utente. Inserisci una password La password è troppo debole - Cancella la password se vuoi che Element generi un codice di recupero. + Cancella la password se vuoi che ${app_name} generi un codice di recupero. Non c\'è alcuna sessione Matrix disponibile Non perdere mai i messaggi cifrati I messaggi nelle stanze cifrate sono protetti con crittografia E2E. Solo tu e il/i destinatario/i avete le chiavi crittografiche per leggere questi messaggi. @@ -1135,7 +1397,7 @@ Firma Risposta Home Server non valida Opzioni autocompletamento server - Element ha rilevato una configurazione server personalizzata per il tuo dominio userId \"%1$s\": + ${app_name} ha rilevato una configurazione server personalizzata per il tuo dominio userId \"%1$s\": \n%2$s Usa configurazione Inizializzazione del servizio @@ -1249,7 +1511,7 @@ Attendere prego… Tutte le comunità Anteprima non disponibile per questa stanza - L\'anteprima di stanze leggibili da tutti non è ancora supportata in Element + L\'anteprima di stanze leggibili da tutti non è ancora supportata in ${app_name} Stanze Messaggi diretti Nuova stanza @@ -1345,11 +1607,11 @@ Per poterlo fare, aggiungi un Identity Server nelle Impostazioni. Modalità sync in background Ottimizzato per la batteria - Element si sincronizzerà in background in modo da non consumare la poca batteria disponibile. + ${app_name} si sincronizzerà in background in modo da non consumare la poca batteria disponibile. \nA seconda del livello della batteria, il sistema operativo potrebbe ritardare la sincronizzazione. Ottimizzato per la performance - Element si sincronizzerà in background ad intervalli regolari (configurabili). -\nCiò avrà un certo impatto sulla quantità di dati e batteria utilizzati. Una notifica sempre accesa comunicherà che Element è attivo. + ${app_name} si sincronizzerà in background ad intervalli regolari (configurabili). +\nCiò avrà un certo impatto sulla quantità di dati e batteria utilizzati. Una notifica sempre accesa comunicherà che ${app_name} è attivo. Nessuna sincronizzazione in background Quando l\'App è in background non ti verranno notificati i messaggi in arrivo. L\'aggiornamento delle impostazioni è fallito. @@ -1433,12 +1695,12 @@ Questo contenuto è stato segnalato come inappropriato. \n \nSe non vuoi più vedere contenuti da questo utente, puoi ignorarlo per nascondere i suoi messaggi. - Element richiede l\'autorizzazione per salvare le tue chiavi crittografiche sul disco. + ${app_name} richiede l\'autorizzazione per salvare le tue chiavi crittografiche sul disco. \n \nPermetti l\'accesso nel prossimo pop-up per poter esportare le chiavi manualmente. In questo momento non c\'è nessuna connessione di rete Conferma la tua password - Non puoi farlo da Element mobile + Non puoi farlo da ${app_name} mobile E\'necessaria l\'autenticazione Integrazioni Usa un Integration Manager per gestire bot, bridge, widget e pacchetti di sticker. @@ -1507,7 +1769,6 @@ Indirizzo Hosting premium per organizzazioni Inserisci l\'indirizzo del Element Modular o del server che vuoi usare - Inserisci l\'indirizzo di un server o di un Element a cui vuoi connetterti Si è verificato un errore caricando la pagina: %1$s (%2$d) L\'applicazione non riesce ad accedere a questo homeserver. L\'homeserver supporta i seguenti tipi di accesso: %1$s. \n @@ -1606,7 +1867,7 @@ \nRiaccedi per avere accesso ai dati dell\'account e ai messaggi. Perderai l\'accesso ai messaggi sicuri a meno che non accedi per recuperare le tue chiavi di cifratura. Elimina i dati - La sessione attuale è per l\'utente %1$s e hai fornito le credenziali per l\'utente %2$s. Ciò non è supportato da Element. + La sessione attuale è per l\'utente %1$s e hai fornito le credenziali per l\'utente %2$s. Ciò non è supportato da ${app_name}. \nPrima elimina i dati, poi accedi di nuovo con un altro account. Il tuo collegamento matrix.to non è corretto La descrizione è troppo breve @@ -1624,7 +1885,7 @@ Altre sessioni Mostrati solo i primi risultati, digita più lettere… Crash facile - Element potrebbe crashare più spesso quando si verifica un errore imprevisto + ${app_name} potrebbe crashare più spesso quando si verifica un errore imprevisto Antepone ¯\\_(ツ)_/¯ ad un messaggio testuale Attiva la cifratura Una volta attivata, la cifratura non può essere disattivata. @@ -1695,9 +1956,9 @@ Moderatore in %1$s Personalizzato (%1$d) in %2$s Vai alla ricevuta di lettura - Element non gestisce eventi del tipo \'%1$s\' - Element non gestisce messaggi del tipo \'%1$s\' - Element ha riscontrato un errore con il rendering del contenuto dell\'evento con id \'%1$s\' + ${app_name} non gestisce eventi del tipo \'%1$s\' + ${app_name} non gestisce messaggi del tipo \'%1$s\' + ${app_name} ha riscontrato un errore con il rendering del contenuto dell\'evento con id \'%1$s\' Non ignorare Questa sessione non riesce a condividere questa verifica con le tue altre sessioni. \nLa verifica sarà salvata in locale e condivisa in una versione futura dell\'app. @@ -1792,7 +2053,7 @@ Evento eliminato da un utente, motivo: %1$s Evento moderato da un admin della stanza, motivo: %1$s Le chiavi sono già aggiornate! - Element Android + ${app_name} Android Richieste di chiavi Sblocca la cronologia dei messaggi cifrati Ricarica @@ -1893,13 +2154,13 @@ File multimediale aggiunto alla galleria Impossibile aggiungere il file multimediale alla galleria Imposta una nuova password dell\'account… - Usa l\'ultima versione di Element sui tuoi altri dispositivi, Element Web, Element Desktop, Element iOS, Element per Android o un altro client Matrix che supporti la firma incrociata - Element Web -\nElement Desktop - Element iOS -\nElement Android + Usa l\'ultima versione di ${app_name} sui tuoi altri dispositivi, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} per Android o un altro client Matrix che supporti la firma incrociata + ${app_name} Web +\n${app_name} Desktop + ${app_name} iOS +\n${app_name} Android o un altro client Matrix che supporti la firma incrociata - Usa l\'ultimo Element sui tuoi altri dispositivi: + Usa l\'ultimo ${app_name} sui tuoi altri dispositivi: Forza l\'attuale sessione di gruppo in uscita in una stanza cifrata ad essere scartata Supportato solo nelle stanze cifrate Usa la tua %1$s o la %2$s per continuare. @@ -1960,11 +2221,11 @@ Caricamento lingue disponibili… Apri condizioni di %s Disconnettere dal server di identitià %s\? - Questo server di identità è obsoleto. Element supporta solo API V2. + Questo server di identità è obsoleto. ${app_name} supporta solo API V2. Questa operazione non è possibile. L\'homeserver è obsoleto. Prima configura un server di identità. Prima accetta le condizioni del server di identità nelle impostazioni. - Per la tua privacy, Element supporta solo l\'invio di email utente e numeri di telefono in formato hash. + Per la tua privacy, ${app_name} supporta solo l\'invio di email utente e numeri di telefono in formato hash. L\'associamento è fallito. Non c\'è alcun associamento attuale con questo identificativo. Il tuo homeserver (%1$s) propone di usare %2$s come tuo server di identità @@ -1978,7 +2239,7 @@ Copia Completato Notifiche - Telefonata di Element fallita + Telefonata di ${app_name} fallita Connessione in tempo reale fallita. \nChiedi all\'amministratore del tuo homeserver di configurare un server TURN per fare funzionare le chiamate. Seleziona dispositivo audio @@ -2091,11 +2352,10 @@ Non puoi accedere a questo messaggio perché la tua sessione non è fidata dal mittente Non puoi accedere a questo messaggio perché il mittente non ha inviato le chiavi di proposito In attesa della cronologia di crittografia - Riot ora si chiama Element! - Siamo entusiasti di annunciare che abbiamo cambiato nome! La tua app è aggiornata e hai fatto l\'accesso al tuo account. - CAPITO - MAGGIORI INFO - element + Riot ora si chiama Element! + Siamo entusiasti di annunciare che abbiamo cambiato nome! La tua app è aggiornata e hai fatto l\'accesso al tuo account. + CAPITO + MAGGIORI INFO Salva chiave di ripristino in Aggiungi dalla mia rubrica La tua rubrica è vuota @@ -2163,7 +2423,6 @@ Codice Si prega di usare il formato internazionale (il numero deve iniziare con \'+\') Conferma la tua identità verificando questo accesso, dandogli l\'accesso ai messaggi cifrati. - Spiacente, questa operazione non è ancora possibile per gli account connessi tramite Single Sign-On. Impossibile aprire una stanza dove sei stato bandito. Impossibile trovare questa stanza. Assicurati che esista. Non hai il permesso di avviare una chiamata in questa stanza @@ -2184,7 +2443,7 @@ Mostra solo il numero di messaggi non letti in una semplice notifica. Mostra dettagli come il nome delle stanze e il contenuto dei messaggi. Mostra il contenuto nelle notifiche - Il codice PIN è l\'unico modo per sbloccare Element. + Il codice PIN è l\'unico modo per sbloccare ${app_name}. Attiva la biometria specifica del dispositivo, come impronte e riconoscimento facciale. Attiva la biometria Configura protezione @@ -2229,8 +2488,8 @@ Non hai il permesso di avviare una chiamata Non hai il permesso di avviare una chiamata di gruppo Reimposta - Il codice PIN è richiesto ogni volta che apri Element. - È necessario il codice PIN dopo 2 minuti di inattività con Element. + Il codice PIN è richiesto ogni volta che apri ${app_name}. + È necessario il codice PIN dopo 2 minuti di inattività con ${app_name}. Richiedi il PIN dopo 2 minuti %s è entrato. L\'applicazione è in attesa del PUSH @@ -2262,8 +2521,8 @@ Condividi il mio codice Scansiona un codice QR Non è un codice QR Matrix valido - 🔐️ Unisciti a me su Element - Ehy, parliamo su Element: %s + 🔐️ Unisciti a me su ${app_name} + Ehy, parliamo su ${app_name}: %s Invita amici Aggiungi persone "Argomento: " @@ -2377,7 +2636,7 @@ Questa stanza non è pubblica. Non potrai rientrare senza un invito. Predefinito di sistema Autenticazione fallita - Element richiede di reinserire le credenziali per eseguire questa azione. + ${app_name} richiede di reinserire le credenziali per eseguire questa azione. Necessario riautenticarsi Utenti Si è verificato un errore trasferendo la chiamata diff --git a/vector/src/main/res/values-iw/strings.xml b/vector/src/main/res/values-iw/strings.xml index 81d89ff563..41d6e147c5 100644 --- a/vector/src/main/res/values-iw/strings.xml +++ b/vector/src/main/res/values-iw/strings.xml @@ -120,8 +120,7 @@ האזנה לאירועים מסנכרן… אתחול השירות - ערכת נושא Status.im - ערכת נושא שחורה + ערכת נושא שחורה ערכת נושא כהה ערכת נושא בהירה @@ -152,7 +151,7 @@ לא הוגדר שרת זהות. אין תוצאות נוספות אין תוצאות - לא אפשרת לאלמנט לגשת לאנשי הקשר המקומיים שלך + לא אפשרת לאלמנט לגשת לאנשי הקשר המקומיים שלך האם אתה בטוח שברצונך להתחיל צ\'אט חדש עם %s\? שלח קול התחל שיחת וידאו @@ -280,7 +279,7 @@ בחר מכשיר סאונד נכשל החיבור בזמן אמת. \nאנא בקש ממנהל שרת הבית שלך להגדיר שרת TURN על מנת שהשיחות יעבדו בצורה אמינה. - שיחת האלמנט נכשלה + שיחת האלמנט נכשלה אל תשאל אותי שוב נסה להשתמש ב-%s השיחה נכשלה עקב שרת שהוגדר כהלכה @@ -310,22 +309,22 @@ אפשר הרשאה לגשת לאנשי הקשר שלך. כדי לסרוק קוד QR, עליך לאפשר גישה למצלמה. מצטער. הפעולה לא בוצעה בגלל הרשאות חסרות - אלמנט יכול לבדוק את פנקס הכתובות שלך כדי למצוא משתמשי מטריקס אחרים על סמך מספרי הדוא\"ל והטלפון שלהם. + אלמנט יכול לבדוק את פנקס הכתובות שלך כדי למצוא משתמשי מטריקס אחרים על סמך מספרי הדוא\"ל והטלפון שלהם. \n \nהאם אתה מסכים לשתף את פנקס הכתובות שלך למטרה זו\? - אלמנט יכול לבדוק את פנקס הכתובות שלך כדי למצוא משתמשי מטריקס אחרים על סמך מספרי הדוא\"ל והטלפון שלהם. אם אתה מסכים לשתף את פנקס הכתובות שלך למטרה זו, אנא הגש גישה בחלון הקופץ הבא. - אלמנט זקוק להרשאה כדי לגשת למצלמה ולמיקרופון שלך כדי לבצע שיחות וידאו. + אלמנט יכול לבדוק את פנקס הכתובות שלך כדי למצוא משתמשי מטריקס אחרים על סמך מספרי הדוא\"ל והטלפון שלהם. אם אתה מסכים לשתף את פנקס הכתובות שלך למטרה זו, אנא הגש גישה בחלון הקופץ הבא. + אלמנט זקוק להרשאה כדי לגשת למצלמה ולמיקרופון שלך כדי לבצע שיחות וידאו. \n \nאנא אפשר גישה בחלונות הקופצים הבאים כדי להיות מסוגל לבצע את השיחה. " \n \nאנא אפשר גישה בחלון הקופץ הבא כדי שתוכל לבצע את השיחה." - אלמנט זקוק להרשאה כדי לגשת למיקרופון שלך כדי לבצע שיחות שמע. + אלמנט זקוק להרשאה כדי לגשת למיקרופון שלך כדי לבצע שיחות שמע. " \n \nאנא אפשר גישה בחלון הקופץ הבא כדי שתוכל לבצע את השיחה." - אלמנט זקוק להרשאה כדי לגשת למצלמה שלך כדי לצלם תמונות ושיחות וידאו. - אלמנט זקוק להרשאה כדי לגשת לספריית התמונות והווידיאו שלך כדי לשלוח ולשמור קבצים מצורפים. + אלמנט זקוק להרשאה כדי לגשת למצלמה שלך כדי לצלם תמונות ושיחות וידאו. + אלמנט זקוק להרשאה כדי לגשת לספריית התמונות והווידיאו שלך כדי לשלוח ולשמור קבצים מצורפים. \n \nאנא אפשר גישה בחלון הקופץ הבא כדי שתוכל לשלוח קבצים מהטלפון שלך. מידע @@ -351,7 +350,7 @@ רינגטון שיחה נכנסת ישתמש ב-%s כסיוע כאשר השרת הביתי שלך אינו מציע כזה (כתובת ה- IP שלך תשותף במהלך שיחה) אפשר שרת עזרה לשיחות - השתמש ברינגטון ברירת המחדל של אלמנט לשיחות נכנסות + השתמש ברינגטון ברירת המחדל של אלמנט לשיחות נכנסות בקש אישור לפני שמתחילים בשיחה מנע שיחה מקרית שיחות @@ -376,7 +375,7 @@ רשימת קבוצות קרא את רשימת הקבלות - הפעל את Element במכשיר אחר שיכול לפענח את ההודעה כדי שיוכל לשלוח את המפתחות להפעלה זו. + הפעל את Element במכשיר אחר שיכול לפענח את ההודעה כדי שיוכל לשלוח את המפתחות להפעלה זו. הבקשה נשלחה בקשת המפתח נשלחה. בקש מחדש מפתחות הצפנה מהפעלות האחרות שלך. @@ -422,10 +421,10 @@ עדכון ההגדרות נכשל. לא תקבל הודעה על הודעות נכנסות כאשר האפליקציה ברקע. אין סנכרון רקע - אלמנט יסונכרן ברקע מעת לעת בזמן מדויק (ניתן להגדרה). + אלמנט יסונכרן ברקע מעת לעת בזמן מדויק (ניתן להגדרה). \nזה ישפיע על השימוש ברדיו ובסוללה, תוצג הודעה קבועה לפיה אלמנט מאזין לאירועים. מותאם לזמן אמת - אלמנט יסונכרן ברקע באופן שישמור על המשאבים המוגבלים של המכשיר (סוללה). + אלמנט יסונכרן ברקע באופן שישמור על המשאבים המוגבלים של המכשיר (סוללה). \nבהתאם למצב משאבי המכשיר שלך, ייתכן שהסנכרון יידחה על ידי מערכת ההפעלה. מותאם לסוללה מצב סנכרון רקע @@ -456,17 +455,17 @@ רגיל התעלם מאופטימיזציה אם משתמש משאיר מכשיר מחובר לחשמל ויציב לתקופה מסוימת, כשהמסך כבוי, המכשיר עובר למצב Doze. זה מונע מאפליקציות גישה לרשת ומגדיר את העבודות, הסנכרונים וההתראות הסטנדרטיות שלהם. - אלמנט אינו מושפע מתהליך מיטוב הסוללה. + אלמנט אינו מושפע מתהליך מיטוב הסוללה. אופטימיזציה של הסוללה השבת הגבלות - מגבלות רקע מופעלות עבור Element. + מגבלות רקע מופעלות עבור Element. \nהעבודה שהאפליקציה מנסה לעשות תוגבל באגרסיביות בזמן שהיא ברקע, וזה עלול להשפיע על ההודעות. \n%1$s - מגבלות רקע מושבתות עבור Element. יש להריץ בדיקה זו באמצעות נתונים ניידים (ללא WIFI). + מגבלות רקע מושבתות עבור Element. יש להריץ בדיקה זו באמצעות נתונים ניידים (ללא WIFI). \n%1$s בדוק מגבלות רקע הפעל את התחלה לאחר אתחול - השירות לא יופעל עם הפעלת המכשיר מחדש, לא תקבל התראות עד שאלמנט ייפתח לפחות פעם אחת. + השירות לא יופעל עם הפעלת המכשיר מחדש, לא תקבל התראות עד שאלמנט ייפתח לפחות פעם אחת. השירות יתחיל עם הפעלת המכשיר מחדש. הפעל לאחר אתחול השירות נכשל מלעלות מחדש @@ -490,11 +489,11 @@ אסימון FCM נרשם בהצלחה ל- HomeServer. רישום אסימונים הוסף חשבון - [%1$s] + [%1$s] \nשגיאה זו אינה בשליטה על אלמנט. אין חשבון Google בטלפון. אנא פתח את מנהל החשבון והוסף חשבון Google. - [%1$s] + [%1$s] \nשגיאה זו אינה בשליטה על אלמנט. זה יכול להתרחש מכמה סיבות. אולי זה יעבוד אם תנסה שוב מאוחר יותר, תוכל גם לבדוק ששירות Google Play אינו מוגבל בשימוש נתונים בהגדרות המערכת, או ששעון המכשיר שלך תקין, או שזה יכול לקרות ב- ROM מותאם אישית. - [%1$s] + [%1$s] \nשגיאה זו איננה בשליטה על Element ולפי גוגל, שגיאה זו מצביעה על כך שלמכשיר יש יותר מדי אפליקציות הרשומות ב- FCM. השגיאה מתרחשת רק במקרים שבהם ישנם מספרים קיצוניים של אפליקציות, כך שהיא לא אמורה להשפיע על המשתמש הממוצע. נכשל באחזור אסימון FCM: \n%1$s @@ -502,7 +501,7 @@ \n%1$s אסימון Firebase תקן שירותי Google Play - אלמנט משתמש בשירותי Google Play כדי להעביר הודעות פוש אך נראה שהוא אינו מוגדר כהלכה: + אלמנט משתמש בשירותי Google Play כדי להעביר הודעות פוש אך נראה שהוא אינו מוגדר כהלכה: \n%1$s ה- APK של שירותי Google Play זמין ומעודכן. בדיקת שירותי הפעלה @@ -620,7 +619,7 @@ שים לב שחלק מסוגי ההודעות מוגדרים כשתיקים (יפיקו התראה ללא צליל). הגדרות מותאמות אישית. אפשר - התראות אינן מופעלות עבור הפעלה זו. + התראות אינן מופעלות עבור הפעלה זו. \nאנא בדוק את הגדרות האלמנט. התראות מופעלות להפעלה זו. הגדרות מושב. @@ -649,7 +648,7 @@ לא הוספה כתובת דוא\"ל לחשבונך כתובות דוא\"ל נדרש אימות - אינך יכול לעשות זאת ממכשיר נייד + אינך יכול לעשות זאת ממכשיר נייד אשר את סיסמתך הצג את פרטי היישום בהגדרות המערכת. מידע על האפליקציה @@ -1072,7 +1071,7 @@ \nגבה את המפתחות שלך בצורה מאובטחת כדי לא לאבד אותם. לעולם אל תאבד הודעות מוצפנות אין מושב מטריקס זמין - אנא מחק את משפט הסיסמה אם ברצונך ש- Element ייצור מפתח שחזור. + אנא מחק את משפט הסיסמה אם ברצונך ש- Element ייצור מפתח שחזור. משפט הסיסמה חלש מדי אנא הזן משפט סיסמה משפט הסיסמה אינו תואם @@ -1317,7 +1316,7 @@ לאחר הפעלתו, לא ניתן להשבית את ההצפנה. אפשר הצפנה הוסף לפני ¯ \\ _ (ツ) _ / ¯ להודעת טקסט רגיל - אלמנט עלול לקרוס לעיתים קרובות יותר כאשר מתרחשת שגיאה בלתי צפויה + אלמנט עלול לקרוס לעיתים קרובות יותר כאשר מתרחשת שגיאה בלתי צפויה כישלון-מהיר מציג רק את התוצאות הראשונות, הקלד עוד אותיות … פעולות אחרות @@ -1334,7 +1333,7 @@ סנכרון ראשוני … התיאור קצר מדי הקישור שלך ל- matrix.to היה תקין - ההפעלה הנוכחית מיועדת למשתמש %1$s ואתה מספק אישורי משתמש %2$s. זה אינו נתמך על ידי אלמנט. + ההפעלה הנוכחית מיועדת למשתמש %1$s ואתה מספק אישורי משתמש %2$s. זה אינו נתמך על ידי אלמנט. \nראשית נקה נתונים ואז היכנס שוב לחשבון אחר. נקה נתונים תאבד את הגישה להודעות מאובטחות אלא אם תיכנס בכדי לשחזר את מפתחות ההצפנה שלך. @@ -1442,7 +1441,6 @@ \nהאם אתה רוצה להיכנס באמצעות לקוח אינטרנט\? אירעה שגיאה בעת טעינת הדף: %1$s (%2$d) הזן את כתובת השרת שבו ברצונך להשתמש - הזן את כתובת השרת או האלמנט שאליו ברצונך להתחבר הזן את כתובת האלמנט המודולרי או השרת שבו ברצונך להשתמש אירוח פרימיום לארגונים כתובת @@ -1492,7 +1490,7 @@ כל ההודעות (רועשות) התעלם ממשתמש זה אין חיבור רשת כרגע - אלמנט זקוק להרשאה כדי לשמור את מפתחות ה- E2E שלך בדיסק. + אלמנט זקוק להרשאה כדי לשמור את מפתחות ה- E2E שלך בדיסק. \n \nאנא אפשר גישה בחלון הקופץ הבא כדי שתוכל לייצא את המפתחות שלך באופן ידני. תוכן זה דווח כבלתי הולם. @@ -1715,7 +1713,7 @@ לא ניתן להציג תצוגה מקדימה של חדר זה. האם אתה רוצה להצטרף אליו\? בשלב זה אין גישה לחדר זה. \nנסה שוב מאוחר יותר, או בקש ממנהל החדר לבדוק אם יש לך גישה. - התצוגה המקדימה של החדר הקריא בעולם עדיין אינה נתמכת ב- Element + התצוגה המקדימה של החדר הקריא בעולם עדיין אינה נתמכת ב- Element לא ניתן להציג תצוגה מקדימה של חדר זה כל הקהילות אנא המתינו… @@ -1792,7 +1790,7 @@ אמת את זה על ידי השוואה של מחרוזת טקסט קצרה. הוצאת מחשבון בגלל אישורים לא חוקיים או שפג תוקפם. השתמש בקונפיגורציה - אלמנט זיהה תצורת שרת מותאמת אישית לדומיין userId שלך \"%1$s\": + אלמנט זיהה תצורת שרת מותאמת אישית לדומיין userId שלך \"%1$s\": \n%2$s השלם אוטומטית אפשרויות שרת תגובת גילוי שרת בית לא חוקית @@ -1818,13 +1816,13 @@ אשר PIN כדי להשבית PIN שנה את קוד ה- PIN הנוכחי שלך שנה PIN - קוד PIN נדרש בכל פעם שאתה פותח את Element. - קוד PIN נדרש לאחר שתי דקות של אי שימוש ב- Element. + קוד PIN נדרש בכל פעם שאתה פותח את Element. + קוד PIN נדרש לאחר שתי דקות של אי שימוש ב- Element. דרוש מספר PIN לאחר 2 דקות הצג רק מספר הודעות שלא נקראו בהודעה פשוטה. הצג פרטים כמו שמות החדרים ותוכן ההודעה. הצג תוכן בהתראות - קוד PIN הוא הדרך היחידה לפתוח את Element. + קוד PIN הוא הדרך היחידה לפתוח את Element. אפשר ביומטריה ספציפית למכשירים, כמו טביעות אצבע וזיהוי פנים. %2$s חדר נמצא עבור %1$s @@ -1973,17 +1971,17 @@ מצב שמירת נתונים מחיל מסנן ספציפי כך שמסוננים עדכוני נוכחות והודעות הקלדה. מצב שמירת נתונים כן, אני רוצה לעזור! - אנא אפשר ניתוח נתונים כדי לעזור לנו לשפר את Element. - אלמנט אוסף ניתוח אנונימי כדי לאפשר לנו לשפר את היישום. + אנא אפשר ניתוח נתונים כדי לעזור לנו לשפר את Element. + אלמנט אוסף ניתוח אנונימי כדי לאפשר לנו לשפר את היישום. שלח נתוני ניתוח ניתוח נתונים הענק הרשאה - אלמנט צריך לשמור על חיבור רקע בעל השפעה נמוכה על מנת לקבל הודעות אמינות. + אלמנט צריך לשמור על חיבור רקע בעל השפעה נמוכה על מנת לקבל הודעות אמינות. \nבמסך הבא תתבקש לאפשר לאלמנט לרוץ תמיד ברקע, אנא קבל. חיבור ברקע בחר באפשרות אחרת מתן הרשאה - אלמנט יכול לרוץ ברקע כדי לנהל את ההתראות שלך בצורה מאובטחת ופרטית. זה עשוי להשפיע על השימוש בסוללה. + אלמנט יכול לרוץ ברקע כדי לנהל את ההתראות שלך בצורה מאובטחת ופרטית. זה עשוי להשפיע על השימוש בסוללה. פרטיות הודעות נהל את הגדרות הגילוי שלך. תַגלִית @@ -2006,7 +2004,7 @@ בטל את נעילת היסטוריית ההודעות המוצפנות ייצוא ביקורת בקשות מפתח - אלמנט אנדרואיד + אלמנט אנדרואיד המפתחות כבר מעודכנים! האירוע בהנחיית מנהל החדר, סיבה: %1$s האירוע נמחק על ידי המשתמש, הסיבה: %1$s @@ -2118,7 +2116,7 @@ הפעלה זו אינה יכולה לשתף את האימות הזה עם הפעלות אחרות שלך. \nהאימות יישמר באופן מקומי וישותף בגרסה עתידית של האפליקציה. בטל התעלמות - אלמנט נתקל בבעיה בעת הצגת תוכן האירוע עם המזהה \'%1$s\' + אלמנט נתקל בבעיה בעת הצגת תוכן האירוע עם המזהה \'%1$s\' %1$s @ %2$s שולח את ההודעה הנתונה עם קונפטי תתחיל מחדש ללא היסטוריה, ללא הודעות, מכשירים מאומתים או משתמשים מאומתים @@ -2133,13 +2131,13 @@ השתמש ב- %1$s שלך או השתמש ב- %2$s שלך כדי להמשיך. נתמך רק בחדרים מוצפנים מכריח את ההפעלה הקבוצתית החוצה הנוכחית בחדר מוצפן להיזרק - השתמש באלמנט האחרון במכשירים האחרים שלך: + השתמש באלמנט האחרון במכשירים האחרים שלך: או לקוח מטריקס אחר עם יכולת חתימה צולבת - אלמנט iOS + אלמנט iOS \nאלמנט אנדרואיד - רשת האינטרנט + רשת האינטרנט \nשולחן העבודה של אלמנט - השתמש באלמנט העדכני ביותר במכשירים האחרים שלך, Element Web, Element Desktop, Element iOS, Element for Android, או לקוח מטריקס אחר עם יכולת חתימה צולבת + השתמש באלמנט העדכני ביותר במכשירים האחרים שלך, Element Web, Element Desktop, Element iOS, Element for Android, או לקוח מטריקס אחר עם יכולת חתימה צולבת הגדר סיסמת חשבון חדשה … לא ניתן היה לשמור את קובץ המדיה לא ניתן היה להוסיף קובץ מדיה לגלריה @@ -2283,11 +2281,10 @@ ספר הטלפונים שלך ריק הוסף מפנקס הטלפונים שלי שמור מפתח שחזור פנימה - רכיב - למד עוד - הבנת - אנו שמחים לבשר ששינינו שם! האפליקציה שלך מעודכנת ואתה מחובר לחשבונך. - Riot היא עכשיו Element! + למד עוד + הבנת + אנו שמחים לבשר ששינינו שם! האפליקציה שלך מעודכנת ואתה מחובר לחשבונך. + Riot היא עכשיו Element! ממתין להיסטוריית הצפנה אינך יכול לגשת להודעה זו מכיוון שהשולח בכוונה לא שלח את המפתחות אינך יכול לגשת להודעה זו מכיוון שהשולח אינו מהימן על ההפעלה שלך @@ -2328,11 +2325,11 @@ הסכמת המשתמש לא סופקה. אין קשר נוכחי למזהה זה. העמותה נכשלה. - למען הפרטיות שלך, אלמנט תומך רק בשליחת הודעות דוא\"ל של משתמשים, בליל ומספר טלפון. + למען הפרטיות שלך, אלמנט תומך רק בשליחת הודעות דוא\"ל של משתמשים, בליל ומספר טלפון. אנא קבל תחילה את התנאים של שרת הזהות בהגדרות. אנא הגדר תחילה שרת זהות. פעולה זו אינה אפשרית. שרת הבית מיושן. - שרת זהות זה מיושן .Element תומך רק ב- API V2. + שרת זהות זה מיושן .Element תומך רק ב- API V2. להתנתק משרת הזהות%s\? תנאים פתוחים של%s טוען שפות זמינות … @@ -2351,8 +2348,8 @@ זה לא קוד QR מטריציוני תקף הזמנות נשלחו אל%1$s ו-%2$s ההזמנה נשלחה אל%1$s - 🔐️ הצטרפו אלי באלמנט - היי, דבר איתי באלמנט:%s + 🔐️ הצטרפו אלי באלמנט + היי, דבר איתי באלמנט:%s להזמין חברים הזמן משתמשים מזמין משתמשים … @@ -2365,7 +2362,6 @@ בדוק-פעמיים קישור זה אנא בחר סיסמה. אנא בחר שם משתמש. - מצטערים, פעולה זו עדיין אינה אפשרית עבור חשבונות המחוברים באמצעות כניסה יחידה. סמן כאמין אשר את זהותך על ידי אימות התחברות זו והעניק לו גישה להודעות מוצפנות. אימות אינטראקטיבי על ידי Emoji diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml index 66a57da12a..13ef9801af 100644 --- a/vector/src/main/res/values-ja/strings.xml +++ b/vector/src/main/res/values-ja/strings.xml @@ -1,5 +1,87 @@ + %1$s: %2$s + %1$sが画像を送信しました。 + %1$sがスタンプを送信しました。 + %sの招待 + %1$sが%2$sを招待しました + %1$sがあなたを招待しました + %1$sが参加しました + %1$sが退出しました + %1$sが招待を断りました + %1$sが%2$sを追放しました + %1$sが%2$sをブロック解除しました + %1$sが%2$sをブロックしました + %1$sが%2$sの招待を撤回しました + %1$sがアバターを変更しました + %1$sが表示名を%2$sに設定しました + %1$sが表示名を%2$sから%3$sに変更しました + %1$sが表示名 (%2$s) を削除しました + %1$sがテーマを%2$sに変更しました + %1$sが部屋名を%2$sに変更しました + %sがビデオ通話を開始しました。 + %sが音声通話を開始しました。 + %sが電話に出ました。 + %sが通話を終了しました。 + %sさんからの招待 + 部屋への招待 + %1$sと%2$s + 空の部屋 + + %1$sと他%2$d名 + + %1$sは、今後の部屋履歴を%2$sに表示させました + 部屋のメンバー全員、招待された時点から。 + 部屋のメンバー全員、参加した時点から。 + 部屋のメンバー全員。 + 誰でも。 + 不明 (%s)。 + %1$s がエンドツーエンド暗号化を有効にしました (%2$s) + %1$s がVoIP会議をリクエストしました + VoIP会議が開始されました + VoIP会議が終了しました + (アバターも変更された) + %1$s が部屋名を削除しました + %1$s がルームトピックを削除しました + %1$s がプロフィール %2$s を更新しました + %1$s は %2$s に部屋に参加するよう招待状を送りました + %1$sは%2$sの招待を受け入れました + ** 解読できません: %s ** + 送信者の端末からこのメッセージのキーが送信されていません。 + 修正できませんでした + メッセージを送信できません + 画像のアップロードに失敗しました + ネットワークエラー + Matrixエラー + 現在空の部屋に再参加することはできません。 + メールアドレス + 電話番号 + ルームのアバターを変更しました + %1$sがルームのアバターを変更しました + トピックを%1$sに変更しました + 表示名を削除しました(%1$sでした) + 表示名を%1$sから%2$sに変更しました + 表示名を%1$sに設定しました + アバターを変更しました + %1$sの招待を取り下げました + %1$sをBANしました + %1$sのBANを解除しました + %1$sを退出させました + 招待を拒否しました + ルームから退出しました + %1$sがルームから退出しました + ルームから退出しました + 参加しました + %1$sが参加しました + ルームに参加しました + %1$sを招待しました + ディスカッションを作成しました + %1$sがディスカッションを作成しました + ルームを作成しました + %1$sがルームを作成しました + 招待 + ステッカーを送信しました。 + 画像を送信しました。 部屋 設定 履歴 @@ -107,7 +189,7 @@ 暗号文を送信… 明るいテーマ 暗いテーマ - 黒いテーマ + 黒いテーマ 同期中… メッセージ メンバー詳細 @@ -272,7 +354,7 @@ ビデオ通話を開始 写真または動画を撮影 初期化メール送信 - 写真撮影やビデオ通話には, Elementアプリに端末のカメラの使用を許可する必要があります. + 写真撮影やビデオ通話には, ${app_name}アプリに端末のカメラの使用を許可する必要があります. 通話を開始できませんでした。後ほど試してください。 権限が無いため、一部の機能を利用できない可能性があります… この部屋で会議を開始するためには招待権限が必要です @@ -280,7 +362,7 @@ ログアウト ホーム 会話なし - 端末の電話帳をElementアプリが読み取ることは許可されていません + 端末の電話帳を${app_name}アプリが読み取ることは許可されていません 結果なし 部屋 部屋一覧 @@ -427,25 +509,25 @@ Matrixの連絡先のみ 通信先が通話の受取に失敗しました。 情報 - Elementは添付ファイルを送信および保存するために写真とビデオライブラリにアクセスするための許可が必要です。 + ${app_name}は添付ファイルを送信および保存するために写真とビデオライブラリにアクセスするための許可が必要です。 あなたの携帯端末からファイルを送信できるようにするには、次のポップアップでアクセスを許可してください。 " \n \n通話をするには、次のポップアップでアクセスできるように設定してください。" - Elementアプリは、音声通話を実行するためにマイクへアクセスするための許可が必要です。 + ${app_name}アプリは、音声通話を実行するためにマイクへアクセスするための許可が必要です。 通話をするには、次のポップアップでアクセスできるようにしてください。 - ビデオ通話を行うには、カメラとマイクにアクセスするための権限がElementアプリに必要です。 + ビデオ通話を行うには、カメラとマイクにアクセスするための権限が${app_name}アプリに必要です。 通話をするには、次のポップアップでのアクセスを許可してください。 - Matrixユーザが電子メールアドレスや電話番号を元に他のユーザを検索するためには、Elementアプリがあなたの端末内電話帳へアクセスする許可が必要です。 + Matrixユーザが電子メールアドレスや電話番号を元に他のユーザを検索するためには、${app_name}アプリがあなたの端末内電話帳へアクセスする許可が必要です。 -Elementからあなた個人の電話帳への検索要求を許可する場合は、次のポップアップでアクセスを許可してください。 - あなた個人の端末内の電話帳に登録されている電子メールアドレス、電話番号を元に、Elementの利用者を検索する場合は、アプリが端末内電話帳へアクセスする許可が必要です。 +${app_name}からあなた個人の電話帳への検索要求を許可する場合は、次のポップアップでアクセスを許可してください。 + あなた個人の端末内の電話帳に登録されている電子メールアドレス、電話番号を元に、${app_name}の利用者を検索する場合は、アプリが端末内電話帳へアクセスする許可が必要です。 -Elementアプリがあなたの電話帳へアクセスすることを許可しますか? +${app_name}アプリがあなたの電話帳へアクセスすることを許可しますか? 申し訳ありません。権限がないために操作が実行されませんでした 発言を通報する 既読 @@ -679,7 +761,7 @@ Elementアプリがあなたの電話帳へアクセスすることを許可し 他のデバイスから 暗号鍵を再度要求 します。 鍵のリクエストが送信されました。 リクエスト送信済 - 鍵をこのデバイスに送信できるように、メッセージを復号化できる他のデバイスでElementを起動してください。 + 鍵をこのデバイスに送信できるように、メッセージを復号化できる他のデバイスで${app_name}を起動してください。 %d 秒 @@ -711,12 +793,12 @@ Elementアプリがあなたの電話帳へアクセスすることを許可し アカウントを停止 自分のアカウントを停止 通知のプライバシー - Elementは通知を安全で内密に扱うため、バックグラウンドで動作できます。これによりバッテリー使用に影響が出ることがあります。 + ${app_name}は通知を安全で内密に扱うため、バックグラウンドで動作できます。これによりバッテリー使用に影響が出ることがあります。 許可を与える 他のオプションを選択 解析データを送信 - Elementはアプリを改善するため、匿名の解析データを収集します。 - Elementを改善するのを助けるため、解析を許可してください。 + ${app_name}はアプリを改善するため、匿名の解析データを収集します。 + ${app_name}を改善するのを助けるため、解析を許可してください。 はい、助けたいです! あなたは現在どのコミュニティーのメンバーでもありません。 ここに入力… @@ -788,7 +870,6 @@ Matrixでのメッセージの可視性は電子メールと同様です。メ あなたのホームサーバは部屋のメンバーの簡易読み込みをサポートしていません。後で試してください。 部屋のメンバーの簡易読み込み 申し訳ありません、エラーが発生しました - Status.im テーマ Version %s エクスポートされた鍵を暗号化するパスフレーズを作成してください。 キーをインポートするには、同じパスフレーズを入力する必要があります。 パスフレーズの作成 @@ -807,7 +888,7 @@ Matrixでのメッセージの可視性は電子メールと同様です。メ 了承 このホームサーバーの方針を閲覧し承認してください: 通話設定画面 - 着信にElementの既定の着信音を使う + 着信に${app_name}の既定の着信音を使う 着信音 着信音を選んでください: 追い出す @@ -1022,8 +1103,8 @@ Matrixでのメッセージの可視性は電子メールと同様です。メ あなたの Matrix アカウントに関連付けられたメールアドレスと電話番号を管理 メールアドレスと電話番号 有効化 - このセッションで通知が無効化されています。 -\nElement の設定をご確認ください。 + このセッションで通知が無効化されています。 +\n${app_name} の設定をご確認ください。 このセッションで通知は有効化されています。 セッション設定 有効化 @@ -1110,7 +1191,7 @@ Matrixでのメッセージの可視性は電子メールと同様です。メ QR コード QR コードによる追加 コードを共有 - Element で会話しましょう: %s + ${app_name} で会話しましょう: %s フレンドを招待 名前または ID で検索 既知のユーザー diff --git a/vector/src/main/res/values-kab/strings.xml b/vector/src/main/res/values-kab/strings.xml index 74075318d4..516ccc1caf 100644 --- a/vector/src/main/res/values-kab/strings.xml +++ b/vector/src/main/res/values-kab/strings.xml @@ -1,8 +1,197 @@ + %1$s: %2$s + %1$s t.yuzen tugna. + Tuzneḍ tugna. + Tinubga n %s + Tinubga-k•m + %1$s yesnulfa-d taxxamt + Tesnulfaḍ-d taxxamt-a + %1$s inced-d %2$s + Tnecdeḍ-d %1$s + %1$s inced-ik-id + %1$s yedda ɣer texxamt + Teddiḍ ɣer texxamt + %1$s yeǧǧa taxxamt + Teǧǧiḍ taxxamt + %1$s yugi/tugi tinubga + Tufiḍ tinubga + %1$s yessufeɣ %2$s + Tessufɣeḍ %1$s + Tbeddleḍ avatar-inek·inem + Anedbal + Aseɣyad + Amezwer + Sagen + %1$s seg %2$s ɣer %3$s + Tegguma ad d-tali tugna + Tansa n yimayl + %1$s azen astiker. + Tuzneḍ amenṭaḍ. + %1$s yekkes agdal i %2$s + Tekkseḍ agdal i %1$s + %1$s igdel %2$s + Tgedleḍ %1$s + %1$s issefsex tinubga n %2$s + Tesfesxeḍ tinubga n %1$s + %1$s ibeddel avatar-is + %1$s isbadu isem-is i d-ittuseknen ɣer %2$s + Tesbaduḍ isem-ik•im i d-ittuseknen ɣer %1$s + %1$s ibeddel isem-is i d-ittuseknen seg %2$s ɣer %3$s + Tbeddleḍ isem-ik•im i d-ittuseknen seg %1$s ɣer %2$s + %1$s yekkes isem-is i d-ittuseknen (yella %2$s) + Tekkseḍ isem-ik·im yettwaskanen (d %1$s) + %1$s isnifel asentel s: %2$s + Tesnifleḍ asentel s: %1$s + %1$s ibeddel avaṭar n texxamt + Tbeddleḍ avaṭar n texxamt + %1$s ibeddel isem n texxamt s: %2$s + Tbeddleḍ isem n texxamt s: %1$s + %s isɛedda siwel s tvidyut. + Tesɛeddaḍ siwel s tvidyut. + %s isɛedda asiwel s taɣect. + Tesɛeddaḍ siwel s taɣect. + %s yuzen isefka i usbadu n usiwel. + Tuzneḍ isefka i usbadu n usiwel. + %s yerra ɣef usiwel. + Terriḍ ɣef usiwel. + %s iḥbes asiwel. + Tḥebseḍ asiwel. + meṛṛa iɛeggalen n texxamt, segmi ara d-ttwanecden. + meṛṛa iɛeggalen n texamt, segmi ara d-rnun. + meṛṛa iɛeggalen n texxamt. + yal yiwen. + arussin (%s). + %1$s isermed awgelhen seg yixef ɣer yixef (%2$s) + Tesremdeḍ awgelhen seg yixef ɣer yixef (%1$s) + %s ileqqem taxxamt-a. + Tleqqmeḍ taxxamt-a. + %1$s isuter-d asarag VoIP + Tsutreḍ-d asarag VoIP + Asarag VoIP yebda + Asarag VoIP yekfa + (avatar daɣen ibeddel) + %1$s yekkes isem n texxamt + Tekkseḍ isem n texxamt + %1$s yekkes asentel n texxamt + Tekkseḍ asentel n texxamt + %1$s yekkes avatar n texxamt + Tekkseḍ avatar n texxamt + Izen ittwakkes + Izen ittwakkes sɣur %1$s + Izen ittwakkes [tamentilt: %1$s] + Izen ittwakkes sɣur %1$s [tamentilt: %2$s] + %1$s ileqqem amaɣnu-ines %2$s + Tleqqmeḍ amaɣnu-inek•inem %1$s + %1$s yuzen tinubga i %2$s akken ad yeddu ɣer texxamt + Tuzneḍ tinubga i %1$s akken ad yeddu ɣer texxamt + %1$s iqbel tinubga i %2$s + Tqebleḍ tinubga i %1$s + %1$s yerna awiǧit %2$s + Terniḍ awiǧit %1$s + %1$s yekkes awiǧit %2$s + Tekkseḍ awiǧit %1$s + %1$s ibeddel awiǧit %2$s + Tbeddleḍ awiǧit %1$s + Sagen (%1$d) + Tbeddleḍ aswir n tezmert n %1$s. + %1$s ibeddel aswir n tezmert n %2$s. + ** Awgelhen d awezɣi: %s ** + Ibenk n umazan ur aɣ-d-yuzin ara tisura i yizen-a. + Tuzna n yizen d tawezɣit + Tuccḍa deg uẓeṭṭa + Tuccḍa deg Matrix + %1$s iga amazray n texxamyt i d-iteddun yettban i %2$s + Tgiḍ amazray n texxamyt i d-iteddun yettban i %1$s + %1$s issefsax tinubga i %2$s i wakken ad d-yekcem ɣer texxamt + Tesfesxeḍ tinubga i %1$s i wakken ad d-yernu ɣer texxamt + D awezɣi tura ad nales ad nuɣal ɣer texxamt tilemt. + Uṭṭun n tiliɣri + Tinubga sɣur %s + Tinubga ɣer texxamt + %1$s d %2$s + + %1$s d 1 wayeḍ + %1$s d %2$d wiyaḍ + + Tremdeḍ awgelhen seg yixef ɣer yixef (alguritm %1$s ur yettwassen ara). + Taxxamt tilemt + Amtawi n tazwara: +\nAktar n umiḍan… + Amtawi n tazwara: +\nAktar n uwgelhen + Amtawi n tazwara: +\nAktar n texxamin + Amtawi n tazwara: +\nAktar n texxamin iɣer terniḍ + Amtawi n tazwara: +\nAktar n texxamin iɣer tettwanecdeḍ + Amtawi n tazwara: +\nAktar n texxamin i teǧǧiḍ + Amtawi n tazwara: +\nAktar n tmezdagnutin + Amtawi n tazwara: +\nAktar n yisefka n umiḍan + Tuzzna n yizen… + Tinubga n %1$s. Tamentilt: %2$s + Tinubga-k•m. Tamentilt: %1$s + %1$s inced %2$s. Tamentilt: %3$s + Tnecdeḍ %1$s. Tamentilt: %2$s + %1$s inced-ik•ikem. Tamentilt: %2$s + %1$s yedda ɣer texxamt. Tamentilt: %2$s + Teddiḍ ɣer texxamt. Tamentilt: %1$s + %1$s yeǧǧa taxxamt. Tamentilt: %2$s + Teǧǧiḍ taxxamt. Tamentilt: %1$s + %1$s yugi tinubga. Tamentilt: %2$s + Tugiḍ tinubga. Tamentilt: %1$s + %1$s yessufeɣ %2$s. Tamentilt: %3$s + Tessufɣeḍ %1$s. Tamentilt: %2$s + %1$s yekkes agdal i %2$s. Tamentilt: %3$s + Tekkseḍ agdal i %1$s. Tamentilt: %2$s + %1$s igdel %2$s. Tamentilt: %3$s + Tgedleḍ %1$s. Tamentilt: %2$s + %1$s yuzen tinubga i %2$s akken ad yeddu ɣer texxamt. Tamentilt: %3$s + Tuzneḍ tinubga i %1$s iwakken ad yeddu ɣer texxamt. Tamentilt: %2$s + %1$s iqbel tinubga i %2$s. Tamentilt: %3$s + Tqebleḍ tinubga i %1$s. Tamentilt: %2$s + %1$s issefsex tinubga n %2$s. Tamentilt: %3$s + Tesfesxeḍ tinubga n %1$s. Tamentilt: %2$s + + %1$s yerna %2$s d tansa i texxamt-a. + %1$s yerna %2$s d tansiwin i texxamt-a. + + + Terniḍ %1$s d tansa i texxamt-a. + Terniḍ %1$s d tansiwin i texxamt-a. + + + %1$s yekkes %2$s am tansa i texxamt-a. + %1$s yekkes %3$s am tansiwin i texxamt-a. + + + Tekkseḍ %1$s am tansa i texxamt-a. + Tekkseḍ %1$s am tansiwin i texxamt-a. + + %1$s yerna %2$s terniḍ tekkseḍ %3$s am tansiwin i texxamt-a. + Terniḍ %1$s terniḍ tekkseḍ %2$s am tansiwin i texxamt-a. + %1$s isbadu %2$s am tansa tagejdant i texxamt-a. + Tesbaduḍ %1$s am tansa tagejdant i texxamt-a. + %1$s yekkes tansa tagejdant i texxamt-a. + Tekkseḍ tansa tagejdant i texxamt-a. + %1$s isireg inebgawen ad ddun ɣer texxamt. + Tsirgeḍ inebgawen ad ddun ɣer texxamt. + %1$s issewḥel inebgawen iwakken ur tteddun ara ɣer texxamt. + Tesweḥleḍ inebgawen iwakken ur tteddun ara ɣer texxamt. + %1$s yermed awgelhen seg yixef ɣer yixef. + Tremdeḍ awgelhen seg yixef ɣer yixef. + %1$s yermed awgelhen seg yixef ɣer yixef (alguritm %2$s ur yettwassen ara). + Sfeḍ tabdart n uraǧu n tuzzna + %1$s issefsex tinubga n %2$s i tmerniwt ɣer texxamt. Tamentilt: %3$s + Tesfesxeḍ tinubga n %1$s i tmerna ɣer texxamt. Tamentilt: %2$s + Yegguma ad yaru Asentel aceɛlal Asentel n yiḍ - Asentel aberkan + Asentel aberkan Awennez n umeẓlu Iznan Taxxamt @@ -411,9 +600,8 @@ Sbadu tafyirt taɣelsant Sekles tasarut-ik·im n tɣellist Isem n texxamt - Tura, Riot d aferdis! + Tura, Riot d aferdis! Sefesex tinnubga - Asentel Status.im Amtawi… Timesliwt i yineḍruyen Ilɣa s tsusmi @@ -480,7 +668,7 @@ Akaram n useqdac Inermisen kan n Matrix Ulac idiwenniyen - Ur teǧǧiḍ ara Element ad yekcem ɣer yinermisen-ik·im idiganen + Ur teǧǧiḍ ara ${app_name} ad yekcem ɣer yinermisen-ik·im idiganen Ulac aqeddac n timagit yettusiwlen. Ulac tixxamin Ulac tixxamin tizuyaz yellan @@ -515,7 +703,7 @@ \nDeg wadeg n wayen, tzemreḍ ad tesqedceḍ aqeddac azayez ɣef %2$s, maca aya ur yettettkal ara fell-as, ad yebḍu tansa-ik·im IP d uqeddac-a. Tzemreḍ ad tesferkeḍ aya deg yiɣewwaren. Ɛreḍ aseqdec n %s Ur iyi-d-ssutur ara tikkelt-nniḍen - Asiwel s Element ur yeddi ara + Asiwel s ${app_name} ur yeddi ara Fren ibenk n yimesli Amennay Kask @@ -761,9 +949,8 @@ Tafyirt n tɣellist Asentel Ur yezmir ara ad yekkes awgelhen - AWI-T - ISSIN UGAR - aferdis + AWI-T + ISSIN UGAR Sekles tasarut n tririt deg Rnu seg yidles n tiliɣri Idles-ik·im n tiliɣri d ilem @@ -1013,11 +1200,11 @@ %1$s (%2$s) Ur yezmir ara ad isekles afaylu n umidya Sbadu awal uffir amaynut n umiḍan… - Element Web -\nElement Desktop - Element iOS -\nElement Android - Seqdec aferdis aneggaru ɣef yibenkan-nniḍen: + ${app_name} Web +\n${app_name} Desktop + ${app_name} iOS +\n${app_name} Android + Seqdec aferdis aneggaru ɣef yibenkan-nniḍen: Yettusefrak kan deg texxamin yettwawgelhen Seqdec %1$s-inek·inem neɣ seqdec %2$s-inek.inem i wakken ad tkemmleḍ. Aḥraz ur yezmir ara ad yekkes awgelhen s tsarut-a n tririt: ttxil-k·m sefqed ma d tasarut n tririt tameɣtut i teskecmeḍ. @@ -1118,7 +1305,7 @@ Ur tezmireḍ ara ad tkecmeḍ ɣer yizen-a acku tettusweḥleḍ sɣur amazan Ur tezmireḍ ara ad tkecmeḍ ɣer yizen-a acku tiɣimit-ik·im ur tt-yeḍmin ara umazan Ur tezmire ara ad tkecmeḍ ɣer yizen-a acku amazan iɛemmed ur d-yuzin ara tisura - S tumert meqqren ara ak-d-nini nbeddel isem! Asnas-ik·im yettwaleqqem, ha-t-an tkecmeḍ ɣer umiḍan-ik·im. + S tumert meqqren ara ak-d-nini nbeddel isem! Asnas-ik·im yettwaleqqem, ha-t-an tkecmeḍ ɣer umiḍan-ik·im. Uṭṭun-a n tilifun yettusbadu yakan. Awal-ik·im uffir yettuwennez. \n @@ -1129,21 +1316,21 @@ Awennez n tkamiṛat d awezɣi tiririt ɣef usiwel seg wadeg-nniḍen Ur yezmir ara ad isekles tavidyut - Element yesra tasiregt n unekcum ɣer temkarḍit-inek·inem n tewlafin d tvidyut i tuzna d usekles n tceqqufin yeddan. + ${app_name} yesra tasiregt n unekcum ɣer temkarḍit-inek·inem n tewlafin d tvidyut i tuzna d usekles n tceqqufin yeddan. \n \nMa ulac aɣilif sireg anekcum deg yisfuyla udhimen i d-iteddun i wakken ad tizmireḍ ad tazneḍ ifuyla seg tiliɣri-inek·inem. " \n \nMa ulac aɣilif sireg anekcum ɣer isfuyla udhimen i d-iteddun i wakken tizmireḍ ad tessiwleḍ." - Element yesra tasiregt n unekcum ɣer usawaḍ-inek·inem i wakken ad iseddu isawalen s umeslaw. + ${app_name} yesra tasiregt n unekcum ɣer usawaḍ-inek·inem i wakken ad iseddu isawalen s umeslaw. " \n \nMa ulac aɣilif sireg anekcum ɣer isfuyla udhimen i d-iteddun i wakken tizmireḍ ad tessiwleḍ." - Element yesra tasiregt n unekcum ɣer temkarḍit-inek·inem n tewlafin d tvidyut i tuzna d usekles n tceqqufin yeddan. + ${app_name} yesra tasiregt n unekcum ɣer temkarḍit-inek·inem n tewlafin d tvidyut i tuzna d usekles n tceqqufin yeddan. \n \n \nMa ulac aɣilif sireg anekcum deg yisfuyla udhimen i d-iteddun i wakken ad tizmireḍ ad tazneḍ ifuyla seg tiliɣri-inek·inem. - Element yezmer ad issenqed adlis-inek·inem n tansiwin i wakken ad d-yaf iseqdacen-nniḍen n Matrix s usenned ɣer yimaylen d wuṭṭunen n tiliɣri nsen. + ${app_name} yezmer ad issenqed adlis-inek·inem n tansiwin i wakken ad d-yaf iseqdacen-nniḍen n Matrix s usenned ɣer yimaylen d wuṭṭunen n tiliɣri nsen. \n \nTebɣiḍ ad tebduḍ adlis-inek·inem n tansiwin i yiswi-a\? Nesḥassef. Tiggawt-a ur tezmir ara ad d-tili imi llant tsirag i ixuṣṣen @@ -1242,7 +1429,7 @@ Tafyirt tuffirt ur temṣada ara Ma ulac aɣilif sekcem tafyirt tuffirt Tafyirt tuffirt ur teǧhid ara aṭas - Ma ulac aɣilif kkes tafyirt tuffirt ma yella tebɣiḍ Element ad isirew tasarut n tririt. + Ma ulac aɣilif kkes tafyirt tuffirt ma yella tebɣiḍ ${app_name} ad isirew tasarut n tririt. Ulac tiɣimit n Matrix i yellan (Leqqayen) Sbadu tafyirt tuffirt @@ -1271,7 +1458,7 @@ Sekcem tasarut tuffirt n uḥraz uffir Ɣur-k·m: Tisur ttwaleqqment yakan! - Element Android + ${app_name} Android Isutar n tsura Ittraju %s… Tifrat n wugur @@ -1279,7 +1466,7 @@ Kcem %s Tuqqna n umidyat ur teddi ara Ṭṭef-d tawlaft neɣ tavidyut - Element yesra tasiregt n unekcum er tkamiat-ik·im i wakken ad d-yeṭṭef tawlafin d yisawalen s tvidyut. + ${app_name} yesra tasiregt n unekcum er tkamiat-ik·im i wakken ad d-yeṭṭef tawlafin d yisawalen s tvidyut. Yal win·tin yessnen aseɣwen n texxamt, slid inebgawen Yal win·tin yessnen aseɣwen n texxamt rnu-d ɣer-sen inebgawen @@ -1387,13 +1574,13 @@ \n \nIlaq-ak·am ad ternuḍ imayl-ik·im ɣer umaɣun-inek·inem deg yiɣewwaren. Ibenk-inek·inem yesseqdac aneggaf n tɣellist TLS aqbur, yemzer i uḍfar s waṭas, i tɣellist-inek·inem ur tettizmireḍ ara a teqqneḍ - Ma ulac aɣilif err Element deg yibenk-nniḍen i izemren ad yekkes awgelhen i yiznan, akken ad yizmir ad yazen tisura ɣer tɣimit-a. - Seqdec taṭenṭunt n Element tamezwert i yisawalin ara d-ikecmen + Ma ulac aɣilif err ${app_name} deg yibenk-nniḍen i izemren ad yekkes awgelhen i yiznan, akken ad yizmir ad yazen tisura ɣer tɣimit-a. + Seqdec taṭenṭunt n ${app_name} tamezwert i yisawalin ara d-ikecmen Ad isseqdec %s d tallalt mi ara yili uqeddac-ik·im agejdan ur d-imudd ara yiwen (tansa-inek·inem IP ad tettwabḍu ayen akk ara yeqqim usiwel) Taṭenṭunt n usiwel i d-ikecmen Fren asṭeṭen i yisawalen: Agalis anmeggag ur yessaweḍ ara ad yerfed. - Matrix yezmer ad isenqed adlis-ik·im n tansiwin i wakken ad yaf iseqdacen-nniḍen n Matrix s ttawil n yimaylen d wuṭṭunen n tiliɣri nsen. Ma yella tqebleḍ ad tebduḍ adlis-ik·im n tansiwin i waya, ma ulac aɣilif sireg anekcum deg yisfuyla udhimen i d-iteddun. + Matrix yezmer ad isenqed adlis-ik·im n tansiwin i wakken ad yaf iseqdacen-nniḍen n Matrix s ttawil n yimaylen d wuṭṭunen n tiliɣri nsen. Ma yella tqebleḍ ad tebduḍ adlis-ik·im n tansiwin i waya, ma ulac aɣilif sireg anekcum deg yisfuyla udhimen i d-iteddun. Rnu aqeddac n timagit deg yiɣewwaren-ik·im i wakken ad tesnetmeḍ tigawt-a. S tidet tebɣiḍ ad teǧǧeḍ taxxamt\? Tebɣiḍ s tidet ad tekkseḍ %s seg udiwenni-a\? @@ -1420,7 +1607,7 @@ Turagin n wis tlata Ulac uṭṭun n tiliɣri i yettwarnan ɣer umiḍan-inek·inem Sken talɣut n usnas deg yiɣewwaren n unagraw. - Ur tezmireḍ ara ad tgeḍ aya seg Element n uziraz + Ur tezmireḍ ara ad tgeḍ aya seg ${app_name} n uziraz Ulac imayl yettwarnan ɣer umiḍan-ik·im Ttkel tettekkaḍ ɣef useɣwen yellan deg yimayl i ak·am-n-uznen. Iɣewwaren n yilɣa leqqayen @@ -1430,13 +1617,13 @@ Ilɣa ttwasensen i umiḍan-inek·inem. \nMa ulac aɣilif senqed iɣewwaren n umiḍan. Ttwaremden yilɣa i tɣimit-a. - Ur ttwaremden ara yilɣa i tɣimit-a. -\nMa ulac aɣilif senqed iɣewwaren n Element. + Ur ttwaremden ara yilɣa i tɣimit-a. +\nMa ulac aɣilif senqed iɣewwaren n ${app_name}. Ẓer belli kra n yiznan yettwarun, ttusbadun ad ilin s tsusmi (ad d-neg alɣu s war imesli). Kra n yilɣa ttusensen deg yiɣewwaren-ik·im udmawanen. Asali n yilugan udmawanen ur yeddi ara, ma ulac aɣilif ɛreḍ tikkelt-nniḍen. Imeẓla APK n Google Play llan rnu d imaynuten. - Element yesseqdac imeẓla n Google Play i wakken ad d-iserreḥ i yiznan push maca ur yettban ara ttusewlen akken iwata: + ${app_name} yesseqdac imeẓla n Google Play i wakken ad d-iserreḥ i yiznan push maca ur yettban ara ttusewlen akken iwata: \n%1$s Ajuṭu FCM yettwasekles akken iwata ɣef uqeddac agejdan. Asekles n ujuṭu FCM ɣef uqeddac agejdan ur yeddi ara. @@ -1449,12 +1636,12 @@ Ameẓlu yettwanɣa syen yules asenker s wudem awurman. Allus n usenker n umeẓlu ur yeddi ara Ameẓlu ad yenker mi ara yales yibenk asenker. - "Ameẓlu ur yettenker ara mi ara yales yibenk asenker, ur d-tremseḍ ara ilɣa alamma yettwaldi Element xerṣum yiwet n tikkelt." + "Ameẓlu ur yettenker ara mi ara yales yibenk asenker, ur d-tremseḍ ara ilɣa alamma yettwaldi ${app_name} xerṣum yiwet n tikkelt." Rmed asenker seg tnekra Senqed ilugan n ugilal - Iluggan n ugilal ttusensen i Element. Asekyed-a ilaq ad yeddu s useqdec n yisefka n uziraz (ulac WIFI). + Iluggan n ugilal ttusensen i ${app_name}. Asekyed-a ilaq ad yeddu s useqdec n yisefka n uziraz (ulac WIFI). \n%1$s - Ilugan n ugilal ttwaremden i Element. + Ilugan n ugilal ttwaremden i ${app_name}. \nAmahil i yettaɛraḍ usnas ad t-yeg yesɛa talast ma mazal-it yella ɣef ugilal, aya yezmer ad d-yawi ugur i yilɣa. \n \n%1$s @@ -1472,7 +1659,7 @@ Iznan ideg yella yisem-iw yettwaskanen Mi ara d-ttunecdeɣ ɣer texxamt Yettusesfer i uẓru - Element ad yemtawi deg ugilal akken ara yeḥrez tilisa n teɣbula n yibenk (aẓru). + ${app_name} ad yemtawi deg ugilal akken ara yeḥrez tilisa n teɣbula n yibenk (aẓru). \nAlmend n waddad n teɣbalut n yibenk-inek·inem, amtawi yezmer ad iɛeṭṭel seg anagraw n wammud. Yettusesfer i wakud ilaw Ur d-tetteṭṭfeḍ ara ulɣu n yiznan i d-ikecmen ma yili asnas ɣef ugilal i yella. @@ -1523,8 +1710,8 @@ Fren taxtiṛit-nniḍen Tuqqna n ugilal Mudd tasiregt - Element ileqqeḍ tasleḍt tudrigt i wakken ad aɣ-iɛawen ad nesnerni asnas. - Ma ulac aɣilif rmed tasleḍt i wakken ad aɣ-ɛiwnent ad nesnerni Element. + ${app_name} ileqqeḍ tasleḍt tudrigt i wakken ad aɣ-iɛawen ad nesnerni asnas. + Ma ulac aɣilif rmed tasleḍt i wakken ad aɣ-ɛiwnent ad nesnerni ${app_name}. Ih, bɣiɣ ad d-muddeɣ tallalt! Askar n usekles n yisefka Leqqem isem azayez @@ -1661,7 +1848,7 @@ Aḥraz n tsura %d… Iɣewwaren n uqeddac ummid awurman - Element yufa-d tawila n uqeddac udmawan i taɣult usulay—inek·inem n uqeddac \"%1$s\": + ${app_name} yufa-d tawila n uqeddac udmawan i taɣult usulay—inek·inem n uqeddac \"%1$s\": \n%2$s Seqdec tawila Tettusuffɣeḍ ssebba n yinekcam arimeɣta neɣ yemmuten. @@ -1775,7 +1962,7 @@ Agbur-a yettwakter-d mačči d win i iwulmen. \n \nMa yella dayen ur tebɣiḍ ara ad twaliḍ agbur-nniḍen sɣur aseqdac-a, tzemreḍ ad t-tesweḥleḍ i wakken ad teffreḍ iznan-ines - Element yesra tasiregt i usekles n tsura-inek·inem E2E ɣef uḍebsi. + ${app_name} yesra tasiregt i usekles n tsura-inek·inem E2E ɣef uḍebsi. \n \nMa ulac aɣilif sireg anekcum ɣef yisfuyla udhimen i d-iteddun i wakken ad tizmireḍ ad tsifḍeḍ tisura-ik·im s ufus. Ulac akk tuqqna n uzeṭṭa i igerrzen akka tura @@ -1788,7 +1975,6 @@ Qqen aqeddac udmawan Tanezduɣt n Premium i tkebbaniyin Sekcem tansa n Element Modular neɣ n uqeddac i tebɣiḍ ad t-tesqedceḍ - Sekcem tansa n uqeddac neɣ n Element i tebɣiḍ ad teqqneḍ ɣer-s Tella-d tuccḍa mi ara d-nessalay asebter: %1$s (%2$d) Asnas ur yezmir ara ad yekcem ɣer uqeddac-a agejdan. Aqeddac agejdan yessefrak anaw-a n unekcum: %1$s. \n @@ -1840,7 +2026,7 @@ \nKcem tikkelt-nniḍen i wakken ad tkecmeḍ ɣer yisefka d yiznan n umiḍan-inek·inem. Aseɣwen-inek·inem n Matrix.to ur yemsil ara akken iwata Ala igmaḍ imezwura i d-yettwaseknen, aru ugar n yisekkilen… - Element yezmer ad yewḥel ugar n tikkal mi ara d-tili tuccḍa ur nettwaṛǧa ara + ${app_name} yezmer ad yewḥel ugar n tikkal mi ara d-tili tuccḍa ur nettwaṛǧa ara Taɣult n yimayl—ik·im ur tesɛi ara azref i wakken ad tettwasekles ɣef uqeddac-a Tuqqna ur nettwattkal ara Senqed aseqdac-a s usentem n yimujit-a asuf i d-yettbanen ɣef ugdil-ines, deg yiwem umsizwer. @@ -1879,9 +2065,9 @@ D amaẓrag deg %1$s Amezwer deg %1$s D udmawan (%1$d) deg %2$s - "Element ur isekker ara ineḍruyen n wanaw \'%1$s\'" - "Element ur isekker ara izen n wanaw \'%1$s\'" - Element yemlal-d ugur mi ara d-yettarra agbur n uneḍru s usulay \'%1$s\' + "${app_name} ur isekker ara ineḍruyen n wanaw \'%1$s\'" + "${app_name} ur isekker ara izen n wanaw \'%1$s\'" + ${app_name} yemlal-d ugur mi ara d-yettarra agbur n uneḍru s usulay \'%1$s\' Tiɣimit-a ulamek ara tebḍu aselken-a akked tqimiyin-nniḍen. \nAselken ad yettwaseklas s wudem adigan syen yettwabḍu deg lqem i d-iteddun n usnas. Tixxamin n melmi kan @@ -2010,21 +2196,20 @@ Armad n uɣewwar-a ad yernu FLAG_SECURE ɣer meṛṛa irmad. Ales asenker n usnas i wakken ad yemmed usnifel. Afaylu n umidyat yettwarna ɣer temsikent D awezɣi ad yernu ufaylu n umidyat ɣer temsikent - Seqdec lqem akk aneggaru n Element ɣef yibenkan-inek·inem-nniḍen: Element Web, Element n tnarit, Element iOS, Element i Android neɣ amsaɣ-nniḍen n Matrix yessefraken azmul anmidag + Seqdec lqem akk aneggaru n ${app_name} ɣef yibenkan-inek·inem-nniḍen: ${app_name} Web, ${app_name} n tnarit, ${app_name} iOS, ${app_name} i Android neɣ amsaɣ-nniḍen n Matrix yessefraken azmul anmidag Fren tasarut-ik·im n tririt, neɣ err-itt s ufus s tira-ines s uasiw neɣ s usenteḍ-ines seg ɣefafus-inek·inem Senqed amyigew s yimujit Sentem timagit-inek·inem s usenqed n yinekcam-a, anef-as ad yekcem ɣer yiznan yettwawgelhen. - Suref-aɣ, tamahelt-a ulamek i tedda akka tura i yimiḍanen i yettwaqqnen s useqdec n unekcum asuf. Senqed tikkelt-nniḍen aseɣwen-a Aseɣwen %1$s ad ak·akem-yawi ɣer usmel-nniḍen: %2$s. \n \nTebɣiḍ s tidet ad tkemmleḍ\? Ffeɣ seg tuqqna n uqeddac n timagit %s\? - Aqeddac-a n timagit iɛedda d aqbur. Element yessafrak kan API V2. + Aqeddac-a n timagit iɛedda d aqbur. ${app_name} yessafrak kan API V2. Tamahekt-a ulamek tedda. Aqeddac agejdan d aqbur. Ma ulac aɣilif qbel deg tazwara swel aqeddac n timagit. Ma ulac aɣilif qbel deg tazwara tiwtilin n uqeddac n timagit deg yiɣewwaren. - I tɣellist n tbaḍnit-ik·im, Element yessefrak kan tuzna n yimaylen d wuṭṭunen n tiliɣri yettudwin i useqdac. + I tɣellist n tbaḍnit-ik·im, ${app_name} yessefrak kan tuzna n yimaylen d wuṭṭunen n tiliɣri yettudwin i useqdac. Assaɣ ur yeddi ara. Akka tura ulac akk assaɣ d unekcam-a. Aqeddac-ik·im agejdan (%1$s) yefka-d takti n useqdec n %2$s d aqeddac-ik·im n timagit @@ -2037,7 +2222,7 @@ Ur tezmireḍ ara ad teldiḍ taxxamt ansi i d-tettwagedleḍ. Ur nessaweḍ ara ad d-naf taxamt-a. Muqel ma tella d tidet. Senqes deg wazal - Element ur t-iḥuza ara usesfer n uẓru. + ${app_name} ur t-iḥuza ara usesfer n uẓru. Tamahelt-a tesra asentem-nniḍen. \nI ukemmel, ma ulac aɣilif sekcem awal-ik·im uffir. %s yettaɛraḍ ad d-isali tazmilt tufrint deg tesnakudt n texxamt-a, maca ur yessaweḍ ara ad tt-naf. @@ -2063,22 +2248,22 @@ Aselken yettubeddel deg ubdil n win yettwamanen deg tiliɣri-inek·inem. Aya MAČČI D AYEN IGERRZEN. Issefk UR TETTAQBALEḌ ARA aselkin-a amaynut. Aselkin yettwabeddel seg win yettwamanen ɣer win ur nettwaman ara. Ahat aqeddac iɛawed-d aselkin-ines. Nermes anedbal n uqeddac ɣef udsil umḍin yetturaǧun. Ur qebbel ara aselkin alamma isuffeɣ-d unedbal n uqeddac adsil umḍin yemṣadan d win yellan ddaw-a. - [%1$s] -\nTuccḍa yekka nnig tezmert n Element, akken i d-yenna Google, tuccḍa-a teskan-d belli ibenk ɣer-s aqettun n yisnasen yettwaskelsen s FCM. Tuccḍa ur d-tettili ara ala ma yilin umiḍan n yisnasen aṭas, ɣef waya ur ilaq ara ad tḥaz aseqdac n tlemmast. - [%1$s] -\nTuccḍa-a tekka nnig tezmert n Element. Aya yezmer ad d-yili seg waṭas n ssebbat. Ahat ad yeddu ma yella tɛerḍeḍ tikkelt-nniḍen ticki, daɣen tzemreḍ ad tesneqdeḍ ma yella ameẓlu Google Play ur yesɛi ara talast deg useqdec n yisefka deg yiɣewwaren n unagraw, neɣ tamrilt n yibenk-inek·inem tṣeḥḥa, neɣ yezmer ad d-yili waya ɣef Rom tudmawant. - [%1$s] -\nTuccḍ-a tekka nnig tezmert n Element. Ulac amiḍan Google ɣe tiliɣri. Ma ulac aɣilif, ldi amsefrak n umiḍan syen rnu amiḍan n Google. + [%1$s] +\nTuccḍa yekka nnig tezmert n ${app_name}, akken i d-yenna Google, tuccḍa-a teskan-d belli ibenk ɣer-s aqettun n yisnasen yettwaskelsen s FCM. Tuccḍa ur d-tettili ara ala ma yilin umiḍan n yisnasen aṭas, ɣef waya ur ilaq ara ad tḥaz aseqdac n tlemmast. + [%1$s] +\nTuccḍa-a tekka nnig tezmert n ${app_name}. Aya yezmer ad d-yili seg waṭas n ssebbat. Ahat ad yeddu ma yella tɛerḍeḍ tikkelt-nniḍen ticki, daɣen tzemreḍ ad tesneqdeḍ ma yella ameẓlu Google Play ur yesɛi ara talast deg useqdec n yisefka deg yiɣewwaren n unagraw, neɣ tamrilt n yibenk-inek·inem tṣeḥḥa, neɣ yezmer ad d-yili waya ɣef Rom tudmawant. + [%1$s] +\nTuccḍ-a tekka nnig tezmert n ${app_name}. Ulac amiḍan Google ɣe tiliɣri. Ma ulac aɣilif, ldi amsefrak n umiḍan syen rnu amiḍan n Google. Ma yella aseqdac yeǧǧa ibenk ur t-isfurek ara rnu i kra n wakud, s ugdil yensan, ibenk ad yekcem deg uskar Doze. Aya ur yettaǧǧa ara isnasen ad kecmen ɣer uzeṭṭa i wakken ad aznen imahilen, amtawi d tesluɣin tiluganin nsen. - Element ad yemtawi ɣef ugilal sya ɣer da deg yiwen n wakud (yettuswal). -\nAya ad iḥaz aseqdec n ṛṛadyu d uẓru, ad yili wulɣu ad d-yettwaskanen i lebda i d-yemmalen belli Element yettɛassa ineḍruyen. + ${app_name} ad yemtawi ɣef ugilal sya ɣer da deg yiwen n wakud (yettuswal). +\nAya ad iḥaz aseqdec n ṛṛadyu d uẓru, ad yili wulɣu ad d-yettwaskanen i lebda i d-yemmalen belli ${app_name} yettɛassa ineḍruyen. Seqdec amsefrak n yimsidaf i usefrek n yibuḍen, n tleggiyin, n yiwiǧiten d yikemmusen n ustiker. \nImsefrak n yimsidaf temmsen-d isefka n twila, syen zemren ad snilen iwiǧiten, ad aznen tinubgiwin ɣer teamin yerna ad sbadun iswiren n tezmert s yisem-ik·im. Msel iznan s useqdec n tseddast n markdown send ad ttwaznen. Aya ad isireg amsal leqqayen am useqdec n yizamulen n yitran i uskan n uḍris uknan. Taqeffalt Kcem n unasiw n useɣzan ad tazen izen ideg ara teg angaz gar yizirigen - Element yezmer ad yeddu deg ugilal i usefrek n yilɣa-inek·inem s wudem aɣelsan, uslig. Aya yezmer ad iḥaz aseqdec n uẓru. - Element yesra ad yeǧǧ tuqqna s usemdu meẓẓiyen ɣef ugilal i wakken ad d-yawi ilɣa yettwamanen. -\nƔef ugdil i d-iteddun, ad tettusnubegteḍ i wakken ad tmuddeḍ tisirag i Element ad yeddu i lebda ɣef ugilal, ttxil-k·m qbel. + ${app_name} yezmer ad yeddu deg ugilal i usefrek n yilɣa-inek·inem s wudem aɣelsan, uslig. Aya yezmer ad iḥaz aseqdec n uẓru. + ${app_name} yesra ad yeǧǧ tuqqna s usemdu meẓẓiyen ɣef ugilal i wakken ad d-yawi ilɣa yettwamanen. +\nƔef ugdil i d-iteddun, ad tettusnubegteḍ i wakken ad tmuddeḍ tisirag i ${app_name} ad yeddu i lebda ɣef ugilal, ttxil-k·m qbel. Askar n usekles n yisefka yessemras imsizdeg afrayan i wakken ileqman n tihawt d yilɣa n tira ad ttwasizedgen. Tigi d timahilin tarmitanin i izemren ad rẓent s wayen ur nettwaṛǧa ara. Seqdec-itent maca ɣur-k·m. Aya ad yerr amiḍan-ik·im ur yettusexdam ara i lebda. Ur tettizmireḍ ara ad tkecmeḍ, ula d amdan-nniḍen ur yettizmir ara ad yales ajerred s usulay-a n useqdac. Aya ad isuffeɣ amiḍan-ik·im seg meṛṛa tixxamin ideg ittekka, yerna ad yekkes akk talqayt n umiḍan-ik·im seg uqeddac n timagit. Ulac tuɣalin ɣer deffir deg tigawt-a. @@ -2095,14 +2280,14 @@ Senqed tiɣimit-a i wakken ad tcerḍeḍ fell-as tettwaḍman. Attkal ɣef tɣimiyin n yimendiden yettakk-ak·am-d lehna n uqerru mi ara tesseqdaceḍ iznan yettwawgelhen seg yixef ɣer yixef. Tiɣimit ur tessaweḍ ara ad teqbel amtawi n tsarut, agbar, MAC neɣ tarrayt SAS Af-d iznan ur nettwaɣra ara da - Taskant n texxamt ara yettwaɣran deg umaḍal ur tettusefrak ara ar tura deg Element + Taskant n texxamt ara yettwaɣran deg umaḍal ur tettusefrak ara ar tura deg ${app_name} Ulac tinezgarin push ikelsen Tuzna n tenfult (%1$s / %2$s) Rmed afraḍ i tririt deg tesnakudt Aqeddac n timagit i tferneḍ ulac ɣer-s akk tiwtilin n yimeẓla. Ur ttkemmil ara ala ma yella tettekleḍ ɣef umeẓlu Iɣmisen ɣezzifen ad ɛawnen ineflayen s umuddu n wugar n yiɣemisen mi ara tazneḍ aneqqis RageShake, ula ma yili yermed asnas ur yettazen ara agbur n yiznan neɣ isefka-nniḍen usligen. Akka d-yettban aqeddac yettaṭṭaf aṭas n wakud ɣef tririt. Yezmer aya yekka-d seg yir tuqqna neɣ seg tuccḍa deg uqeddac. Ma ulac aɣilif ɛreḍ tikkelt-nniḍen ticki. - Tiɣimit-a tamirant n useqdac %1$s ma d kečč·kemm ad tesnetmeḍ inekcam i useqdac %2$s. Aya ur t-yessefrak ara Element. + Tiɣimit-a tamirant n useqdac %1$s ma d kečč·kemm ad tesnetmeḍ inekcam i useqdac %2$s. Aya ur t-yessefrak ara ${app_name}. \nMa ulac aɣilif, deg tazwara sfeḍ isefka, syen kcem tikkelt-nniḍen s umiḍan-nniḍen. Askar n uneflay yermed timahilin i yeffren yerna yezmer daɣen ad yerr asnas ur yerkid ara akken iwata. I yineflayen kan! Abrir arurad @@ -2135,7 +2320,7 @@ Mazal ur tettwarna ara texxamt ar tura. Sefsex timerna n texxamt\? Tangalt QR d tarameɣtut (URI d arameɣtu)! Senfel PIN inek·inem amiran - Tangalt PIN tettusra yal mi ara teldiḍ Element. + Tangalt PIN tettusra yal mi ara teldiḍ ${app_name}. Llan yisenfal ur nettusekles ara. Sefsex isenfal\? Sbadu avaṭar Aseɣwen n Matrix @@ -2172,8 +2357,8 @@ Smiḍen tangalt QR Tansa tamynut i d-yettusuffɣen (am. #alias:server) Isumar - 🔐️ Rnu-d ɣur-i ɣer element - Tangalt PIN d nettat kan i d ttawil s wayes ara teldiḍ Element. + 🔐️ Rnu-d ɣur-i ɣer ${app_name} + Tangalt PIN d nettat kan i d ttawil s wayes ara teldiḍ ${app_name}. Rnu asentel Snubget-d imeddukkal Tangalt-inu @@ -2207,7 +2392,7 @@ %d tinubga %d n tnubgiwin - Tangalt PIN tettusra seld 2 tesdatin n war aseqdec n Element. + Tangalt PIN tettusra seld 2 tesdatin n war aseqdec n ${app_name}. Iznan dagi ur ttwawgelhen ara seg yixef ɣer yixef Tangalt QR ur tettusmiḍen ara! Bḍu tangalt-inu diff --git a/vector/src/main/res/values-ko/strings.xml b/vector/src/main/res/values-ko/strings.xml index c14f0466fa..dbd48a6c67 100644 --- a/vector/src/main/res/values-ko/strings.xml +++ b/vector/src/main/res/values-ko/strings.xml @@ -1,8 +1,104 @@ + %1$s: %2$s + %s님의 초대 + %1$s님이 사진을 보냈습니다. + %1$s님이 스티커를 보냈습니다. + + %1$s님이 %2$s님을 초대했습니다 + %1$s님이 당신을 초대했습니다 + %1$s님이 참가했습니다 + %1$s님이 떠났습니다 + %1$s님이 초대를 거부했습니다 + %1$s님이 %2$s님을 추방했습니다 + %1$s님이 %2$s님의 출입 금지를 풀었습니다 + %1$s님이 %2$s님을 출입 금지했습니다 + %1$s님이 %2$s님의 초대를 취소했습니다 + %1$s님이 아바타를 변경했습니다 + %1$s님이 표시 이름을 %2$s(으)로 설정했습니다 + %1$s님이 표시 이름을 %2$s에서 %3$s(으)로 변경했습니다 + %1$s님이 표시 이름을 삭제했습니다 (%2$s) + %1$s님이 주제를 다음으로 변경했습니다: %2$s + %1$s님이 방 이름을 다음으로 변경했습니다: %2$s + %s님이 영상 통화를 걸었습니다. + %s님이 음성 통화를 걸었습니다. + %s님이 전화를 받았습니다. + %s님이 전화를 끊었습니다. + %1$s님이 이후 %2$s에게 방 기록을 공개했습니다 + 초대된 시점부터 모든 방 구성원 + 들어온 시점부터 모든 방 구성원 + 모든 방 구성원 + 누구나. + 알 수 없음 (%s). + %1$s님이 종단간 암호화를 켰습니다 (%2$s) + %s님이 방을 업그레이드했습니다. + + %1$s님이 VoIP 회의를 요청했습니다 + VoIP 회의가 시작했습니다 + VoIP 회의가 끝났습니다 + + (아바타도 변경됨) + %1$s님이 방 이름을 삭제했습니다 + %1$s님이 방 주제를 삭제했습니다 + 메시지가 삭제되었습니다 + 메시지가 %1$s님에 의해 삭제되었습니다 + 메시지가 삭제되었습니다 [이유: %1$s] + 메시지가 %1$s님에 의해 삭제되었습니다 [이유: %2$s] + %1$s님이 프로필 %2$s을(를) 업데이트했습니다 + %1$s님이 %2$s님에게 방 초대를 보냈습니다 + %1$s님이 %2$s의 초대를 수락했습니다 + + ** 암호를 복호화할 수 없음: %s ** + 발신인의 기기에서 이 메시지의 키를 보내지 않았습니다. + + 검열할 수 없습니다 + 메시지를 보낼 수 없습니다 + + 사진 업로드에 실패했습니다 + + 네트워크 오류 + Matrix 오류 + + 현재 빈 방에 다시 들어갈 수 없습니다. + + 이메일 주소 + 전화번호 + + %s에서 초대함 + 방 초대 + + %1$s님과 %2$s님 + + + %1$s님 외 %2$d명 + + + 빈 방 + + 초기 동기화: +\n계정 가져오는 중… + 초기 동기화: +\n암호 가져오는 중 + 초기 동기화: +\n방 가져오는 중 + 초기 동기화: +\n들어간 방 가져오는 중 + 초기 동기화: +\n초대받은 방 가져오는 중 + 초기 동기화: +\n떠난 방 가져오는 중 + 초기 동기화: +\n커뮤니티 가져오는 중 + 초기 동기화: +\n계정 데이터 가져오는 중 + + 메시지 보내는 중… + 전송 대기 열 지우기 + + %1$s님이 %2$s님에게 방에 참가하라고 보낸 초대를 취소했습니다 밝은 테마 어두운 테마 - 검정 테마 + 검정 테마 동기화 중… 메시지 @@ -111,7 +207,6 @@ 비밀번호 새 비밀번호 사용자 이름 - Status.im 테마 서비스 초기화 중 소리로 알림 @@ -133,7 +228,7 @@ 완료 정말 로그아웃하시겠어요\? 읽음으로 표시 - Element이 연락처에 접근할 수 없게 되어 있습니다 + ${app_name}이 연락처에 접근할 수 없게 되어 있습니다 %d명의 사용자 @@ -265,7 +360,7 @@ 키 요청을 보냈습니다. 요청 보냄 - 다른 기기에서 Element을 설치해서 메시지를 암호화하고 이 기기로 키를 보내도록 합니다. + 다른 기기에서 ${app_name}을 설치해서 메시지를 암호화하고 이 기기로 키를 보내도록 합니다. 읽은 기록 읽기 @@ -293,7 +388,7 @@ 방 주제 전화 - 수신 전화에 Element 기본 벨소리를 사용합니다 + 수신 전화에 ${app_name} 기본 벨소리를 사용합니다 수신 전화 벨소리 전화에 사용할 벨소리를 선택하세요: @@ -317,22 +412,22 @@ 영상을 촬영할 수 없음 정보 - 첨부 파일을 보내고 저장하려면 Element은 영상과 사진 보관함에 접근하는 권한이 필요합니다. + 첨부 파일을 보내고 저장하려면 ${app_name}은 영상과 사진 보관함에 접근하는 권한이 필요합니다. \n \n당신의 휴대 전화에서 파일을 보내려면 다음 팝업에서 접근을 허용해주세요. - 사진을 찍고 영상 통화를 하려면 Element은 카메라에 접근하는 권한이 필요합니다. + 사진을 찍고 영상 통화를 하려면 ${app_name}은 카메라에 접근하는 권한이 필요합니다. " \n \n전화를 하려면 다음 팝업에서 접근을 허용해주세요." - 음성 통화를 하려면 Element은 마이크에 접근하는 권한이 필요합니다. + 음성 통화를 하려면 ${app_name}은 마이크에 접근하는 권한이 필요합니다. " \n \n전화를 하려면 다음 팝업에서 접근을 허용해주세요." - 영상 통화를 하려면 Element은 카메라와 마이크에 접근하는 권한이 필요합니다. + 영상 통화를 하려면 ${app_name}은 카메라와 마이크에 접근하는 권한이 필요합니다. \n \n전화를 하려면 다음 팝업에서 접근을 허용해주세요. - Element은 당신의 연락처를 확인해서 이메일과 전화번호를 기반으로 다른 Matrix 사용자를 찾을 수 있습니다. 이런 이유로 연락처를 공유하는 것을 허용한다면, 다음 팝업에서 접근을 허용해주세요. - "Element은 당신의 연락처를 확인하여 이메일과 전화번호를 기반으로 다른 Matrix 사용자를 찾을 수 있습니다. + ${app_name}은 당신의 연락처를 확인해서 이메일과 전화번호를 기반으로 다른 Matrix 사용자를 찾을 수 있습니다. 이런 이유로 연락처를 공유하는 것을 허용한다면, 다음 팝업에서 접근을 허용해주세요. + "${app_name}은 당신의 연락처를 확인하여 이메일과 전화번호를 기반으로 다른 Matrix 사용자를 찾을 수 있습니다. \n \n이런 이유로 연락처를 공유하는 것을 허용하겠습니까\?" @@ -570,8 +665,8 @@ 기기 설정. 알림이 이 기기에서 켜집니다. - 알림이 이 기기에서 허용되지 않습니다. -\nElement 설정을 확인해주세요. + 알림이 이 기기에서 허용되지 않습니다. +\n${app_name} 설정을 확인해주세요. 켜기 맞춤 설정. @@ -582,7 +677,7 @@ Play 서비스 확인 Google Play 서비스 APK는 최신 버전입니다. - Element은 Google Play 서비스를 사용해 푸시 메시지를 보내지만 올바르게 설정되지 않은 모양입니다: + ${app_name}은 Google Play 서비스를 사용해 푸시 메시지를 보내지만 올바르게 설정되지 않은 모양입니다: \n%1$s Play 서비스 고치기 @@ -591,12 +686,12 @@ \n%1$s FCM 토큰을 검색하는데 실패했습니다: \n%1$s - [%1$s] -\n이 오류는 Element의 통제 밖에 있으며 Google과 관련이 있습니다, 이 오류는 기기가 FCM에 등록된 앱이 너무 많다는 것을 나타냅니다. 오류는 수 많은 앱이 있는 경우에만 발생하고, 일반 사용자에게 영향을 미치지 않아야 합니다. - [%1$s] -\n이 오류는 Element의 통제 밖입니다. 여러 이유로 발생할 수 있습니다. 나중에 다시 시도하면 작동할 지도 모릅니다, 시스템 설정에서 Google Play 서비스의 데이터 사용이 제한되었는지, 기기의 시간은 맞는 지 확인해보세요, 혹은 커스텀 롬 환경에서 발생할 수 있습니다. - [%1$s] -\n이 오류는 Element의 통제 밖에 있습니다. 휴대 전화에 Google 계정이 없습니다. 계정 관리자를 열어 Google 계정을 추가하세요. + [%1$s] +\n이 오류는 ${app_name}의 통제 밖에 있으며 Google과 관련이 있습니다, 이 오류는 기기가 FCM에 등록된 앱이 너무 많다는 것을 나타냅니다. 오류는 수 많은 앱이 있는 경우에만 발생하고, 일반 사용자에게 영향을 미치지 않아야 합니다. + [%1$s] +\n이 오류는 ${app_name}의 통제 밖입니다. 여러 이유로 발생할 수 있습니다. 나중에 다시 시도하면 작동할 지도 모릅니다, 시스템 설정에서 Google Play 서비스의 데이터 사용이 제한되었는지, 기기의 시간은 맞는 지 확인해보세요, 혹은 커스텀 롬 환경에서 발생할 수 있습니다. + [%1$s] +\n이 오류는 ${app_name}의 통제 밖에 있습니다. 휴대 전화에 Google 계정이 없습니다. 계정 관리자를 열어 Google 계정을 추가하세요. 계정 추가 토큰 등록 @@ -616,19 +711,19 @@ 부팅 시 시작 기기가 다시 시작되면 서비스가 시작됩니다. - 기기가 다시 시작될 때 서비스가 시작되지 않습니다, 다시 시작한 후 Element을 한 번이라도 열지 않으면 알림을 받을 수 없습니다. + 기기가 다시 시작될 때 서비스가 시작되지 않습니다, 다시 시작한 후 ${app_name}을 한 번이라도 열지 않으면 알림을 받을 수 없습니다. 부팅 시 시작 활성화 백그라운드 제한 사항 확인 - Element에 대한 백그라운드 제한 사항을 비활성화합니다. 이 테스트는 모바일 데이터를 사용해야 합니다 (WIFI 없음). + ${app_name}에 대한 백그라운드 제한 사항을 비활성화합니다. 이 테스트는 모바일 데이터를 사용해야 합니다 (WIFI 없음). \n%1$s - Element에 대한 백그라운드 제한 사항이 활성화됩니다. + ${app_name}에 대한 백그라운드 제한 사항이 활성화됩니다. \n앱이 백그라운드에서 작업하는 동안 앱이 시도하는 작업은 적극적으로 제한되며, 이는 알림에 영향을 줄 수 있습니다. \n%1$s 제한 사항 비활성화 배터리 최적화 - Element은 배터리 최적화의 영향을 받지 않습니다. + ${app_name}은 배터리 최적화의 영향을 받지 않습니다. 사용자가 기기 화면을 끈 상태로 일정 시간 동안 연결되지 않은 상태로 두면, 기기는 Doze 모드에 들어갑니다. 이렇게 하면 앱이 네트워크에 접근하지 못하고 작업, 동기화 및 표준 경보가 지연됩니다. 최적화 무시하기 @@ -714,19 +809,19 @@ 내 계정 비활성화 알림 개인 정보 - Element은 백그라운드에서 실행되어 알림을 안전하고 은밀하게 관리할 수 있습니다. 이것은 배터리 사용량에 영향을 줄 수 있습니다. + ${app_name}은 백그라운드에서 실행되어 알림을 안전하고 은밀하게 관리할 수 있습니다. 이것은 배터리 사용량에 영향을 줄 수 있습니다. 권한 부여 다른 설정을 선택하세요 백그라운드 연결 - Element은 신뢰가 있는 알림을 위해 낮은 영향의 백그라운드 연결을 유지해야 합니다. -\n다른 화면에서 Element이 항상 백그라운드에서 실행하도록 허용하는 메시지가 표시됩니다, 수락해주세요. + ${app_name}은 신뢰가 있는 알림을 위해 낮은 영향의 백그라운드 연결을 유지해야 합니다. +\n다른 화면에서 ${app_name}이 항상 백그라운드에서 실행하도록 허용하는 메시지가 표시됩니다, 수락해주세요. 권한 부여 정보 분석 정보 분석 데이터 보내기 - Element은 애플리케이션을 개선할 수 있도록 익명의 분석을 수집합니다. - 분석을 활성화해서 Element이 개선할 수 있도록 도와주세요. + ${app_name}은 애플리케이션을 개선할 수 있도록 익명의 분석을 수집합니다. + 분석을 활성화해서 ${app_name}이 개선할 수 있도록 도와주세요. 예, 저도 돕고 싶습니다! 데이터 절약 모드 @@ -1159,7 +1254,7 @@ 암호를 입력하세요 암호가 너무 약합니다 - Element으로 복구 키를 생성하려면 암호를 지워주세요. + ${app_name}으로 복구 키를 생성하려면 암호를 지워주세요. 이용할 수 있는 Matrix 세션이 없음 암호화된 메시지를 잃지 마세요 @@ -1293,7 +1388,7 @@ 잘못된 홈서버 검색 응답 자동 완성 서버 설정 - Element이 userId 도메인 \"%1$s\"에 대한 맞춤 서버 설정을 감지했습니다: + ${app_name}이 userId 도메인 \"%1$s\"에 대한 맞춤 서버 설정을 감지했습니다: \n%2$s 설정 사용 @@ -1383,7 +1478,7 @@ 모든 커뮤니티 이 방은 미리 볼 수 없습니다 - 세계가 읽을 수 있는 방의 미리보기는 아직 ElementX에서 지원하지 않습니다 + 세계가 읽을 수 있는 방의 미리보기는 아직 ${app_name}X에서 지원하지 않습니다 다이렉트 메시지 @@ -1509,11 +1604,11 @@ 이 작업을 하려면 설정에서 ID 서버를 추가하세요. 백그라운드 동기화 모드 (실험적) 배터리에 최적화됨 - Element은 기기의 제한된 자원 (배터리)을 유지하기 위해 백그라운드에서 동기화합니다. + ${app_name}은 기기의 제한된 자원 (배터리)을 유지하기 위해 백그라운드에서 동기화합니다. \n기기 자원 상태에 따라 운영체제에 의해 동기화는 지연될 수 있습니다. 실시간으로 최적화됨 - Element은 (설정할 수 있는) 특정 시간에 주기적으로 백그라운드에거 동기화됩니다. -\n이는 라디오와 배터리 사용에 영향을 주며 Element이 이벤트를 수신하고 있는 상태라는 알림이 영구적으로 표시됩니다. + ${app_name}은 (설정할 수 있는) 특정 시간에 주기적으로 백그라운드에거 동기화됩니다. +\n이는 라디오와 배터리 사용에 영향을 주며 ${app_name}이 이벤트를 수신하고 있는 상태라는 알림이 영구적으로 표시됩니다. 백그라운드 동기화 없음 앱이 백그라운드에 있을 때 수신 메시지의 알림을 받지 않습니다. 설정을 업데이트하는데 실패했습니다. @@ -1614,14 +1709,14 @@ \n \n이 사용자의 내용을 더 이상 보고 싶지 않다면, 사용자를 차단하거나 메시지를 감출 수 있습니다 - Element은 종단간 키를 디스크에 저장하려면 권한이 필요합니다. + ${app_name}은 종단간 키를 디스크에 저장하려면 권한이 필요합니다. \n \n키를 수동으로 내보내려면 다음 팝업에서 접근을 허용해주세요. 현재 네트워크 연결이 없습니다 비밀번호가 정확하지 않습니다 - 라이엇 모바일에서 불가능한 것입니다 + 라이엇 모바일에서 불가능한 것입니다 인증이 요구됩니다 diff --git a/vector/src/main/res/values-lt/strings.xml b/vector/src/main/res/values-lt/strings.xml index a6b3daec93..db63c9385a 100644 --- a/vector/src/main/res/values-lt/strings.xml +++ b/vector/src/main/res/values-lt/strings.xml @@ -1,2 +1,35 @@ - \ No newline at end of file + + %1$s: %2$s + %1$s išsiuntė vaizdą. + %1$s išsiuntė lipduką. + %s pakvietimas + Jūs prisijungėte prie kambario + %1$s prisijungė prie kambario + %1$s pakvietė jus + Jūs pakvietėte %1$s + %1$s pakvietė %2$s + Jūs sukūrėte diskusiją + %1$s sukūrė diskusiją + Jūs sukūrėte kambarį + %1$s sukūrė kambarį + Jūsų pakvietimas + Jūs išsiuntėte lipduką. + Jūs išsiuntėte vaizdą. + Jūs atšaukėte %1$s pakvietimą + %1$s atšaukė %2$s pakvietimą + Jūs užblokavote %1$s + %1$s užblokavo %2$s + Jūs atblokavote %1$s + %1$s atblokavo %2$s + Jūs išmetėte %1$s + %1$s išmetė %2$s + Jūs atmetėte pakvietimą + %1$s atmetė pakvietimą + Jūs išėjote iš kambario + %1$s išėjo iš kambario + Jūs išėjote iš kambario + %1$s išėjo iš kambario + Jūs prisijungėte + %1$s prisijungė + \ No newline at end of file diff --git a/vector/src/main/res/values-lv/strings.xml b/vector/src/main/res/values-lv/strings.xml index 88975c01f4..b5226f43ce 100644 --- a/vector/src/main/res/values-lv/strings.xml +++ b/vector/src/main/res/values-lv/strings.xml @@ -1,5 +1,245 @@ + %1$s: %2$s + %1$s nosūtīja attēlu. + Uzaicinājums no %s + %1$s uzaicināja %2$s + %1$s uzaicināja jūs + %1$s pievienojās + %1$s pameta istabu + %1$s noraidīja uzaicinājumu + %1$s padzina %2$s + %1$s atcēla pieejas liegumu %2$s + %1$s liedza pieeju %2$s + %1$s atsauca %2$s uzaicinājumu + %1$s nomainīja avataru + %1$s uzstādīja parādāmo vārdu uz %2$s + %1$s nomainīja parādāmo vārdu no %2$s uz %3$s + %1$s dzēsa savu parādāmo vārdu (iepriekš %2$s) + %1$s nomainīja tematu uz %2$s + %1$s nomainīja istabas nosaukumu uz %2$s + %s veica video zvanu. + %s veica audio zvanu. + %s atbildēja uz zvanu. + %s beidza zvanu. + %1$s padarīja istabas turpmāko ziņu vēsturi redzamu %2$s + visi istabas biedri no brīža, kad tika uzaicināti. + visi istabas biedri no brīža, kad tika pievienojušies. + visi istabas biedri. + ikviens. + nezināms (%s). + %1$s ieslēdza pilnīgu šifrēšanu (%2$s) + %1$s pieprasīja VoIP konferenci + VoIP konference sākās + VoIP konference beidzās + (arī avatars tika nomainīts) + %1$s dzēsa istabas nosaukumu + %1$s izdzēsa istabas tematu + %1$s atjaunoja savu profilu %2$s + %1$s nosūtīja %2$s uzaicinājumu pievienoties istabai + %1$s pieņēma uzaicinājumu %2$s + ** Neizdodas atšifrēt: %s ** + Sūtītāja ierīce mums nav nenosūtījusi atslēgas priekš šīs ziņas. + Nevarēja rediģēt + Neizdodas nosūtīt ziņu + Neizdevās augšuplādēt attēlu + Tīkla kļūda + Matrix kļūda + Šobrīd nav iespējams atkārtoti pievienoties tukšai istabai. + Epasta adrese + Telefona numurs + Uzaicinājums no %s + Uzaicinājums uz istabu + %1$s un %2$s + Tukša istaba + + %1$s un 1 cits + %1$s un %2$d citi + %1$s un %2$d citu + + Jūs nomainījāt savu parādāmo vārdu no %1$s uz %2$s + Jūs nomainījāt savu parādāmo vārdu uz %1$s + Jūs nomainījāt savu avataru + Jūs atsaucāt %1$s uzaicinājumu + Jūs liedzāt pieeju %1$s + Jūs atcēlāt pieejas liegumu %1$s + Jūs padzināt %1$s + Jūs noraidījāt uzaicinājumu + Jūs pametāt istabu + %1$s pameta istabu + Jūs pametāt istabu + Jūs pievienojāties + %1$s pievienojās istabai + Jūs pievienojāties istabai + Jūs uzaicinājāt %1$s + Jūs izveidojāt diskusiju + %1$s izveidoja diskusiju + Jūs izveidojāt istabu + %1$s izveidoja istabu + Jūsu uzaicinājums + Jūs nosūtījāt uzlīmi. + %1$s nosūtīja uzlīmi. + Jūs nosūtījāt attēlu. + Jūs ieslēdzāt pilnīgu šifrēšanu (neatpazīts algoritms %1$s). + %1$s ieslēdza pilnīgu šifrēšanu (neatpazīts algoritms %2$s). + Jūs ieslēdzāt pilnīgu šifrēšanu. + %1$s ieslēdza pilnīgu šifrēšanu. + Jūs esat novērsis iespēju viesiem pievienoties istabai. + %1$s ir novērsis iespēju viesiem pievienoties istabai. + Jūs esat novērsis iespēju viesiem pievienoties istabai. + %1$s ir novērsis iespēju viesiem pievienoties istabai. + Jūs esat atļāvis viesiem pievienoties istabai. + %1$s ir atļāvis viesiem pievienoties istabai. + Jūs esat atļāvis viesiem pievienoties istabai. + %1$s ir atļāvis viesiem pievienoties istabai. + Jūs nomainījāt adreses šai istabai. + %1$s nomainīja adreses šai istabai. + Jūs nomainījāt galveno un alternatīvās adreses šai istabai. + %1$s nomainīja galveno un alternatīvās adreses šai istabai. + Jūs nomainījāt alternatīvās adreses šai istabai. + %1$s nomainīja alternatīvās adreses šai istabai. + + Jūs izdzēsāt šīs istabas alternatīvo adresi %1$s. + Jūs izdzēsāt šīs istabas alternatīvās adreses %1$s. + Jūs izdzēsāt šīs istabas alternatīvās adreses %1$s. + + + %1$s izdzēsa šīs istabas alternatīvo adresi %2$s. + %1$s izdzēsa šīs istabas alternatīvās adreses %2$s. + %1$s izdzēsa šīs istabas alternatīvās adreses %2$s. + + + Jūs pievienojāt šīs istabas alternatīvo adresi %1$s. + Jūs pievienojāt šīs istabas alternatīvās adreses %1$s. + Jūs pievienojāt šīs istabas alternatīvās adreses %1$s. + + + %1$s pievienoja šīs istabas alternatīvo adresi %2$s. + %1$s pievienoja šīs istabas alternatīvās adreses %2$s. + %1$s pievienoja šīs istabas alternatīvās adreses %2$s. + + Jūs izdzēsāt šis istabas galveno adresi. + %1$s izdzēsa šis istabas galveno adresi. + Jūs iestatījāt %1$s kā šis istabas galveno adresi. + %1$s iestatīja %2$s kā šis istabas galveno adresi. + Jūs pievienojāt %1$s un izdzēsāt %2$s kā šīs istabas adreses. + %1$s pievienoja %2$s un izdzēsa %3$s kā šīs istabas adreses. + + Jūs izdzēsāt %1$s kā šīs istabas adresi. + Jūs izdzēsāt %1$s kā šīs istabas adreses. + Jūs izdzēsāt %1$s kā šīs istabas adreses. + + + %1$s izdzēsa %2$s kā šīs istabas adresi. + %1$s izdzēsa %2$s kā šīs istabas adreses. + %1$s izdzēsa %2$s kā šīs istabas adreses. + + + Jūs pievienojāt %1$s kā šīs istabas adresi. + Jūs pievienojāt %1$s kā šīs istabas adreses. + Jūs pievienojāt %1$s kā šīs istabas adreses. + + + %1$s pievienoja %2$s kā šīs istabas adresi. + %1$s pievienoja %2$s kā šis istabas adreses. + %1$s pievienoja %2$s kā šīs istabas adreses. + + Jūs atsaucāt %1$s uzaicinājumu. Iemesls: %2$s + %1$s atsauca uzaicinājumu %2$s. Iemesls: %3$s + Jūs pieņēmāt uzaicinājumu %1$s. Iemesls: %2$s + %1$s pieņēma uzaicinājumu %2$s. Iemesls: %3$s + Jūs atsaucāt uzaicinājumu %1$s pievienoties istabai. Iemesls: %2$s + %1$s atsauca uzaicinājumu %2$s pievienoties istabai. Iemesls: %3$s + Jūs nosūtījāt uzaicinājumu %1$s pievienoties istabai. Iemesls: %2$s + %1$s nosūtīja uzaicinājumu %2$s pievienoties istabai. Iemesls: %3$s + Jūs liedzāt pieeju %1$s. Iemesls: %2$s + %1$s liedza pieeju %2$s. Iemesls: %3$s + Jūs atcēlāt pieejas liegumu %1$s. Iemesls: %2$s + %1$s atcēla %2$s pieejas liegumu. Iemesls: %3$s + Jūs padzināt %1$s. Iemesls: %2$s + %1$s padzina %2$s. Iemesls: %3$s + Jūs noraidījāt uzaicinājumu. Iemesls: %1$s + %1$s noraidīja uzaicinājumu. Iemesls: %2$s + Jūs izgājāt. Iemesls: %1$s + %1$s izgāja. Iemels: %2$s + Jūs pametāt istabu. Iemesls: %1$s + %1$s pameta istabu. Iemesls: %2$s + Jūs pievienojāties. Iemesls: %1$s + %1$s pievienojās. Iemesls: %2$s + Jūs pievienojāties istabai. Iemesls: %1$s + %1$s pievienojās istabai. Iemesls: %2$s + %1$s uzaicināja jūs. Iemesls: %2$s + Jūs uzaicinājāt %1$s. Iemesls: %2$s + %1$s uzaicināja %2$s. Iemesls: %3$s + Jūsu uzaicinājums. Iemesls: %1$s + %1$s uzaicinājums. Iemesls: %2$s + Notīrīt sūtīšanas rindu + Sūta ziņu… + Sākotnējā sinhronizācija: +\nImportē konta datus + Sākotnējā sinhronizācija: +\nImportē kopienas + Sākotnējā sinhronizācija: +\nImportē pamestās istabas + Sākotnējā sinhronizācija: +\nImportē istabas, uz kurām uzaicināts + Sākotnējā sinhronizācija: +\nImportē istabas, kurās ieiets + Sākotnējā sinhronizācija: +\nImportē istabas + Sākotnējā sinhronizācija: +\nImportē kriptogrāfiju + Sākotnējā sinhronizācija: +\nImportē kontu… + Tukša istaba (bija %s) + + %1$s, %2$s, %3$s un %4$d citi + %1$s, %2$s, %3$s un %4$d cits + %1$s, %2$s, %3$s un %4$d citi + + %1$s, %2$s, %3$s un %4$s + %1$s, %2$s un %3$s + %1$s no %2$s uz %3$s + %1$s nomainīja %2$s pieejas līmeni. + Jūs nomainījāt %1$s pieejas līmeni. + Pielāgots + Pielāgots (%1$d) + Noklusējuma + Moderators + Administrators + Jūs pieņēmāt uzaicinājumu %1$s + Jūs atsaucāt uzaicinājumu %1$s + %1$s atsauca uzaicinājumu %2$s + Jūs atsaucāt uzaicinājumu %1$s pievienoties istabai + %1$s atsauca uzaicinājumu %2$s pievienoties istabai + Jūs uzaicinājāt %1$s + %1$s uzaicināja %2$s + Jūs nosūtījāt %1$s uzaicinājumu pievienoties istabai + Jūs atjaunojāt savu profilu %1$s + %1$s izdzēsa ziņu [iemesls: %2$s] + Ziņa izdzēsta [iemesls: %1$s] + %1$s izdzēsa ziņu + Ziņa izdzēsta + Jūs izdzēsāt istabas avataru + %1$s izdzēsa istabas avataru + Jūs izdzēsāt istabas tematu + Jūs dzēsāt istabas nosaukumu + Jūs pieprasījāt VoIP konferenci + Jūs ieslēdzāt pilnīgu šifrēšanu (%1$s) + Jūs padarījāt turpmākās ziņas redzamas %1$s + %1$s padarīja turpmākās ziņas redzamas %2$s + Jūs padarījāt istabas turpmāko ziņu vēsturi redzamu %1$s + Jūs beidzāt zvanu. + Jūs atbildējāt uz zvanu. + Jūs nosūtījāt datus zvana uzsākšanai. + %s nosūtīja datus zvana uzsākšanai. + Jūs veicāt balss zvanu. + Jūs veicāt video zvanu. + Jūs nomainījāt istabas nosaukumu uz %1$s + Jūs nomainījāt istabas avataru + %1$s nomainīja istabas avataru + Jūs nomainījāt tematu uz %1$s + Jūs dzēsāt savu parādāmo vārdu (iepriekš %1$s) Ziņas Istaba Iestatījumi @@ -63,7 +303,7 @@ Vietējā adrešu grāmata Vienīgi Matrix kontakti Nav sarunu - Tu neesi atļāvis/usi Element piekļūt taviem vietējiem kontaktiem + Tu neesi atļāvis/usi ${app_name} piekļūt taviem vietējiem kontaktiem Nav rezultātu Istabas Istabu katalogs @@ -115,7 +355,7 @@ Lietotājvārds Gaiša tēma Tumša tēma - Melna tēma + Melna tēma Sinhronizācija… Notikumu monitorings Skaņi paziņojumi @@ -216,24 +456,24 @@ Uzņemt foto vai video Neizdodas ierakstīt video Element informācija - Element nepieciešama atļauja piekļūt jūsu fotoattēlu un video bibliotēkai, lai nosūtītu un saglabātu pielikumus. + ${app_name} nepieciešama atļauja piekļūt jūsu fotoattēlu un video bibliotēkai, lai nosūtītu un saglabātu pielikumus. \n \nLūdzu, atļaujiet piekļuvi nākamajā uznirstošajā logā, lai varētu nosūtīt failus no sava tālruņa. - Element-am nepieciešama atļauja piekļūt kamerai, lai uzņemtu foto un nodrošinātu video zvanus. + ${app_name}-am nepieciešama atļauja piekļūt kamerai, lai uzņemtu foto un nodrošinātu video zvanus. " \n \nLūdzu dot piekļuves atļauju nākamajā uznirstošajā logā, lai būtu iespēja veikt zvanus." - Element-am nepieciešama atļauja piekļūt mikrofonam, lai nodrošinātu audio zvanus. + ${app_name}-am nepieciešama atļauja piekļūt mikrofonam, lai nodrošinātu audio zvanus. " \n \nLūdzu dod piekļuves atļauju nākamajā uznirstošajā logā, lai būtu iespēja veikt zvanus." - Element nepieciešama atļauja piekļūt kamerai un mikrofonam, lai veiktu videozvanus. + ${app_name} nepieciešama atļauja piekļūt kamerai un mikrofonam, lai veiktu videozvanus. \n \nLūdzu, dodiet piekļuves atļauju nākamajā uznirstošajā logā, lai būtu iespēja veikt zvanus. - Element-am nepieciešama atļauja piekļūt kontaktiem, lai varētu atrast citus lietotājus tīklā pēc to epasta adreses vai tālruņa #. + ${app_name}-am nepieciešama atļauja piekļūt kontaktiem, lai varētu atrast citus lietotājus tīklā pēc to epasta adreses vai tālruņa #. -Lūdzu dod piekļuves atļauju nākamajā uznirstošajā logā, lai būtu iespēja atrast Tavus kontaktus, kuri ir sasniedzami Elementā. - Element var pārbaudīt jūsu adrešu grāmatu, lai atrastu citus Matrix lietotājus pāc viņu epasta adresēm un tālruņa numuriem. +Lūdzu dod piekļuves atļauju nākamajā uznirstošajā logā, lai būtu iespēja atrast Tavus kontaktus, kuri ir sasniedzami ${app_name}ā. + ${app_name} var pārbaudīt jūsu adrešu grāmatu, lai atrastu citus Matrix lietotājus pāc viņu epasta adresēm un tālruņa numuriem. \n \nVai piekrītat koplietot savu adrešu grāmatu šim nolūkam\? Atvaino… Darbība nav veikta dēļ nepietiekamām piekļuves atļaujām @@ -920,7 +1160,7 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Jūsu kontam nav pievienota neviena epasta adrese Epasta adreses Nepieciešama autentifikācija - Jūs nevarat to izdarīt ar Element mobile + Jūs nevarat to izdarīt ar ${app_name} mobile Apstipriniet paroli Jūsu kontam nav pievienots neviens tālruņa numurs Versija %s @@ -1002,7 +1242,6 @@ Nākotnē šī pārbaudes procedūra plānota sarežģītāka. Palikt Vai tiešām to vēlaties\? Verificēt ierīci - Status.im tēma Sistēmas noklusējuma Pielāgots (%1$d) iekš %2$s Noklusējums iekš %1$s diff --git a/vector/src/main/res/values-ml/strings.xml b/vector/src/main/res/values-ml/strings.xml index 64a5cfbe7b..867f5661c2 100644 --- a/vector/src/main/res/values-ml/strings.xml +++ b/vector/src/main/res/values-ml/strings.xml @@ -19,7 +19,7 @@ സുഹൃത്തുക്കളെ ക്ഷണിക്കുക എന്റെ കോഡ് പങ്കിടുക എന്റെ കോഡ് - 🔐️ element-ൽ എന്നോടൊപ്പം ചേരുക + 🔐️ ${app_name}-ൽ എന്നോടൊപ്പം ചേരുക സമർപ്പിക്കൂ ചാറ്റ് തുറക്കുക ക്യാമറ നിർത്തുക @@ -92,5 +92,324 @@ മുറി സന്ദേശങ്ങൾ നിശബ്‌ദ അറിയിപ്പുകൾ - സമന്വയിപ്പിക്കുന്നു + സമന്വയിപ്പിക്കുന്നു… + ഫോൺ നമ്പർ (നിർബന്ധമല്ല) + ഫോൺ നമ്പർ + ഒഴിവാക്കൂ + സമർപ്പിക്കൂ + അക്കൗണ്ട് സൃഷ്ടിക്കൂ + വീഡിയോ എടുക്കുക + ഫോട്ടോ എടുക്കുക + സ്പീക്കർ + ഫോൺ + എന്നോട് ഇനിയും ചോദിക്കരുത് + പുതിയ ചാറ്റ് ആരംഭിക്കുക + പ്രവേശിക്കൂ + അക്കൗണ്ട് സൃഷ്ടിക്കൂ + ഉപയോക്തൃനാമം + മുറിയിൽ ചേരുക + സ്ക്രീൻഷോട്ട് അയയ്ക്കൂ + ക്ഷണിക്കുക + ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി + നിരസിക്കുക + സ്വീകരിക്കുക + ഒരു കോൾ ആരംഭിക്കാൻ നിങ്ങളെ അനുവദിച്ചിട്ടില്ല + ഒഴിവാക്കൂ + പേരുമാറ്റുക + സംസാരിക്കൂ + നീക്കംചെയ്യൂ + ബാക്കപ്പ് + അംഗ വിശദാംശങ്ങൾ + matrix.org തിരഞ്ഞെടുക്കൂ + അടുത്തത് + ഉപയോക്തൃനാമം + അടുത്തത് + വീണ്ടും അയയ്ക്കൂ + കോഡ് നൽകൂ + ഫോൺ നമ്പർ ഉറപ്പാക്കൂ + അടുത്തത് + ഫോൺ നമ്പർ (നിർബന്ധമല്ല) + ഫോൺ നമ്പർ + ഫോൺ നമ്പർ സജ്ജമാക്കൂ + അടുത്തത് + വിജയകരം! + മുന്നറിയിപ്പ്! + വിലാസം + %s-ൽ തുടരുക + അല്ലെങ്കിൽ + മറ്റുള്ളവ + കൂടുതൽ അറിയുക + ഒരു സെർവർ തിരഞ്ഞെടുക്കുക + തുടരുക + ചരിത്രം മായ്ക്കൂ + അടുത്തത് + മുന്നറിയിപ്പ് + + %d പുതിയ സന്ദേശങ്ങൾ + %d പുതിയ സന്ദേശം + + എല്ലാം റദ്ദാക്കൂ + എല്ലാം വീണ്ടും അയയ്ക്കൂ + ഒരു സന്ദേശം അയക്കൂ (എൻ‌ക്രിപ്റ്റ് ചെയ്യാത്ത)… + %s ടൈപ്പുചെയ്യുന്നു… + തിരയുക + "%1$s, " + അഡ്മിൻ ആക്കൂ + ക്ഷണം റദ്ദാക്കൂ + ക്ഷണിക്കുക + ഇപ്പോൾ %1$s + ഓഫ്‌ലൈൻ + ഓൺ‌ലൈൻ + സൃഷ്ടിക്കൂ + 1 അംഗം + + %d അംഗം + %d അംഗങ്ങൾ + + + %d സജീവ അംഗം + %d സജീവ അംഗങ്ങൾ + + അംഗത്തെ ചേർക്കുക + പുതിയ ചാറ്റ് + ഒരു മുറി + സമന്വയിപ്പിക്കുന്നു… + നിരസിക്കുക + ചേരുക + നീക്കംചെയ്യൂ + തുടരുക + ഇല്ല + അതെ + സംരക്ഷിച്ചു + വിവരം + കോളുകൾ + മുറിയുടെ വിഷയം + മുറിയുടെ പേര് + ഇന്ന് + ഇന്നലെ + അഭ്യർത്ഥന അയച്ചൂ + തിരിച്ചറിയൽ സെർവർ: + ഹോം സെർവർ: + ഈ - മെയില് വിലാസം + പ്രവേശിക്കൂ + ഫോട്ടോ അല്ലെങ്കിൽ വീഡിയോ എടുക്കൂ + സ്റ്റിക്കർ അയയ്ക്കൂ + ഫയലുകൾ അയയ്ക്കൂ + ശബ്‌ദ ഉപകരണം തിരഞ്ഞെടുക്കുക + വീഡിയോ കോൾ ആരംഭിക്കുക + വോയ്സ് കോൾ ആരംഭിക്കുക + പുരോഗതി (%s%%) + നിങ്ങളുടെ പ്രശ്നം ഇവിടെ വിവരിക്കുക + ഗ്രൂപ്പുകളില്ല + മുറികളില്ല + മുറികൾ + ഉറപ്പാക്കൽ + സ്വീകരിക്കുക + പിന്നീട് + വോയ്സ് + Matrix ഉപയോക്താക്കൾ മാത്രം + ക്ഷണം റദ്ദാക്കൂ + സൂചിപ്പിക്കൂ + നേരിട്ടുള്ള സന്ദേശങ്ങൾ + വിളിക്കൂ + അഡ്മിൻ ഉപകരണ്ങ്ങൾ + അംഗങ്ങളെ കാണിക്കൂ + ഒരു ചിത്രം അല്ലെങ്കിൽ വീഡിയോ എടുക്കൂ + കോൾ അവസാനിച്ചൂ + വിളിക്കുന്നൂ… + വിളിക്കൂ + ഡൗൺലോഡ് റദ്ദാക്കണോ\? + ഒരു പുതിയ രഹസ്യവാക്ക് നൽകണം. + ഞാൻ എന്റെ ഈമെയിൽ വിലാസം ഉറപ്പാക്കി + രഹസ്യവാക്ക് മറന്നോ\? + രഹസ്യവാക്കുകൾ പൊരുത്തപെടുന്നില്ല + നിങ്ങളുടെ പുതിയ രഹസ്യവാക്ക് ഉറപ്പാക്കൂ + രഹസ്യവാക്ക് ആവർത്തിക്കൂ + ഈ - മെയിൽ വിലാസം (നിർബന്ധമല്ല) + ക്യാമറ മാറ്റുക + ഉപയോക്തൃനാമം + പുതിയ രഹസ്യവാക്ക് + രഹസ്യവാക്ക് + ഇമെയിൽ അല്ലെങ്കിൽ ഉപയോക്തൃനാമം + തുടരുക… + ${app_name} കോൾ പരാജയപ്പെട്ടു + ശബ്ദം അയയ്ക്കൂ + ഹോം സെർവർ URL + പൊതു മുറിക‍ൾ ഒന്നും ലഭ്യമല്ല + മടങ്ങുക + ഈ മുറിയിൽ ഒരു കോൾ ആരംഭിക്കാൻ നിങ്ങൾക്ക് അനുവാദമില്ല + സജീവ കോൾ + HD ഓൺ ആക്കൂ + HD ഓഫ് ആക്കൂ + %s ഉപയോഗിച്ച് നോക്കൂ + ബഗ്ഗ് റിപ്പോർട്ട് ചെയ്യൂ + + %d ഉപയോക്താവ് + %d ഉപയോക്താക്കൾ + + മുറി നാമങ്ങൾ ഫിൽറ്റർ ചെയ്യൂ + എന്തായാലും അയയ്ക്കൂ + കീ ബാക്കപ്പ് + കറുത്ത തീം + ഡാ൪ക്ക് തീം + ലൈറ്റ് തീം + സേവനം സമാരംഭിക്കുന്നു + സിസ്റ്റം സ്ഥിരസ്ഥിതി + വിഷയം + കോഡ് + രാജ്യം + ഭാഷ + സമർപ്പിക്കൂ + സെഷനുകൾ + വിപുലമായ + മറ്റുള്ളവ + അറിയിപ്പുകൾ + സാധാരണ + ക്രമീകരണങ്ങൾ + സന്ദേശങ്ങൾ + മറക്കൂ + മുറികൾ + ഫയലുകൾ + ആളുകൾ + സന്ദേശങ്ങൾ + മുറികൾ + ചേർന്നു + ക്ഷണിച്ചു + ക്രമീകരണങ്ങൾ + ഫയലുകൾ + ആളുകൾ + അനുമതികൾ + കാരണം + പുറത്താക്കൂ + നിരോധിക്കൂ + പുനഃസജ്ജമാക്കൂ + ഒന്നുമില്ല + സജീവ കോൾ (%1$s) + %1$s ഈ കോൾ നിരസിച്ചു + അത് ഞാൻ ആയിരുന്നു + പൂർത്തിയാക്കൂ + നിങ്ങൾ ചെയ്തു! + %s ഉറപ്പാക്കൂ + പുതിയ പ്രവേശനം. ഇത് നിങ്ങളാണോ\? + തിരയുക + കൂടുതൽ ഫലങ്ങളൊന്നുമില്ല + സിസ്റ്റം അലേർട്ടുകൾ + ഹോം + എന്തായാലും വിളിക്കൂ + ആഗോള തിരയൽ + നിരസിക്കുക + പ്ലേ + പെർമാലിങ്ക് + മൂന്നാം കക്ഷി ലൈസൻസുകൾ + മുന്നറിയിപ്പ് + ഉറപ്പാക്കൂ + ഈ പ്രവേശനം ഉറപ്പാക്കൂ + എല്ലാ സെഷനുകളും കാണിക്കൂ + സജീവ സെഷനുകൾ + എൻ‌ക്രിപ്ഷൻ പ്രാപ്തമാക്കൂ + സമയരേഖ + മറ്റ് മുറികൾ + സമീപകാല മുറികൾ + നേരിട്ടുള്ള സന്ദേശം + %1$s-ലെ അഡ്മിൻ + ഉപയോക്താക്കൾ + അഡ്‌മിനുകൾ + അപ്‌ലോഡുകൾ + + ഒരു വ്യക്തി + %1$d ആളുകൾ + + അറിയിപ്പുകൾ + ക്രമീകരണങ്ങൾ + മുറി ക്രമീകരണങ്ങൾ + അഡ്മിൻ പ്രവർത്തനങ്ങൾ + കൂടുതൽ + കൂടുതൽ അറിയുക + അവരുടെ കോഡ് സ്കാൻ ചെയ്യൂ + നിങ്ങൾ + സ്റ്റിക്കർ + ഫയൽ + ഓഡിയോ + സുരക്ഷിതമല്ല + അവ പൊരുത്തപ്പെടുന്നു + മുറി സൃഷ്ടിക്കുന്നൂ… + മുറിയുടെ വിലാസം + വിപുലമായത് കാണിക്കൂ + വിപുലമായത് കാണിക്കൂ + എൻ‌ക്രിപ്ഷൻ പ്രാപ്തമാക്കൂ + ക്രമീകരണങ്ങൾ + വിപുല ക്രമീകരണങ്ങൾ + എന്റെ എല്ലാ സെഷനുകളും കാണുക + സ്വകാര്യ ഡാറ്റ മായ്ക്കൂ + കണ്ടവർ + ഡാറ്റ മായ്ക്കൂ + എല്ലാ ഡാറ്റയും മായ്ക്കൂ + വിവരണം വളരെ ചെറുതാണ് + മറ്റ് സെഷനുകൾ + നിലവിലെ സെഷൻ + ദയവായി ഒരു മുറിയുടെ വിലാസം നൽകുക + ചിത്രം. + വീഡിയോ. + നിങ്ങൾ സ്വീകരിച്ചു + %s സ്വീകരിച്ചു + നിങ്ങൾ റദ്ദാക്കി + %s റദ്ദാക്കി + കാത്തിരിക്കുന്നൂ… + പ്രവേശന സ്ക്രീനിലേക്ക് മടങ്ങുക + നിങ്ങൾക്ക് ഒരു വിഡിയോ കോൾ ആരംഭിക്കണമെന്ന് ഉറപ്പാണോ\? + തിരിച്ചറിയൽ സെർവറിന്റെ URL + കഴിയുമെങ്കിൽ, വിവരണം ഇംഗ്ലീഷിൽ എഴുതുക. + ആളുകളെ ഫിൽറ്റർ + കീ ബാക്കപ്പ് ഉപയൊഗിക്കുക + കീ ബാക്കപ്പ് പൂർത്തിയായിട്ടില്ല, കാത്തിരിക്കൂ… + ഫോൺ നമ്പറുകൾ + ഈമെയിൽ വിലാസം + അപ്ലിക്കേഷൻ വിവരം + ഫോൺ നമ്പർ ചേർക്കുക + ഫോൺ + ഈ - മെയിൽ വിലാസം ചേർക്കുക + ഈ - മെയിൽ + പ്രദർശന നാമം + പ്രൊഫൈൽ ചിത്രം + സ്വകാര്യതാ നയം + മൂന്നാം കക്ഷി അറിയിപ്പുകൾ + നിബന്ധനകളും വ്യവസ്ഥകളും + പതിപ്പ് %s + പതിപ്പ് + സൂചനകൾ മാത്രം + എല്ലാ സന്ദേശങ്ങളും + + %d മുറി + %d മുറികൾ + + ഒരു മുറിയിൽ ചേരുക + മുറിയിൽ ചേരുക + മുറി സൃഷ്ടിക്കൂ + ചാറ്റ് ആരംഭിക്കുക + ഫലങ്ങളൊന്നുമില്ല + മുറി വിശദാംശങ്ങൾ + വിഷയം മാറ്റുക + മുറിയുടെ പേര് മാറ്റുക + എല്ലാവരേയും അറിയിക്കുക + ഉപയോക്താക്കളെ നിരോധിക്കുക + ഉപയോക്താക്കളെ പുറത്താക്കുക + ക്രമീകരണങ്ങൾ മാറ്റുക + ഉപയോക്താക്കളെ ക്ഷണിക്കുക + സന്ദേശങ്ങൾ അയയ്ക്കൂ + മുറിയുടെ അനുമതികൾ + വിശ്വസിക്കുക + ഫയൽ കണ്ടെത്തിയില്ല + ഒരു മറുപടി അയയ്‌ക്കുക(എൻ‌ക്രിപ്റ്റ് ചെയ്യാത്ത)… + നിരോനിരോധിക്കാനുള്ള കാരണം + ഉപയോക്താവിനെ നിരോധിക്കുക + പുറത്താക്കാനുള്ള കാരണം + ഉപയോക്താവിനെ പുറത്താക്കുക + അവഗണിക്കൂ + ഉപയോക്താവിനെ അവഗണിക്കുക + തരംതാഴ്ത്തുക + സ്വയം തരംതാഴ്ത്തണോ\? + സെഷൻ പട്ടിക കാണിക്കുക + പുറത്തിറങ്ങുക + പുറത്തിറങ്ങുക + കീ ബാക്കപ്പ് ഉപയൊഗിക്കൂ \ No newline at end of file diff --git a/vector/src/main/res/values-nb-rNO/strings.xml b/vector/src/main/res/values-nb-rNO/strings.xml index f84414ced6..a4fd61011d 100644 --- a/vector/src/main/res/values-nb-rNO/strings.xml +++ b/vector/src/main/res/values-nb-rNO/strings.xml @@ -2,7 +2,7 @@ Lyst tema Mørkt tema - Svart tema + Svart tema Klargjør tjenesten Synkroniserer … Meldinger @@ -121,7 +121,7 @@ %dt - 1d + %dd %dd Lag @@ -380,7 +380,6 @@ Ja Advarsel: Bekreft fjerning - Status.im-tema Lytter etter hendelser Verifiser økten Aktiv samtale @@ -407,7 +406,7 @@ Kun nevninger olm-versjon Deaktiver kontoen - Element samler inn anonyme statistikker for å hjelpe oss med å forbedre programmet. + ${app_name} samler inn anonyme statistikker for å hjelpe oss med å forbedre programmet. %1$s @ %2$s Integreringsbehandler Rommets navn @@ -582,7 +581,7 @@ Brukerkatalog Bare matrix-kontakter Ingen samtaler - Du ga ikke Element tilgang til dine lokale kontakter + Du ga ikke ${app_name} tilgang til dine lokale kontakter Ingen identitetsserver konfigurert. Romkatalog Ingen offentlige rom tilgjengelig @@ -596,7 +595,7 @@ Om mulig, vennligst beskriv på engelsk. Forklar problemet ditt her For å diagnotisere feil, logger fra denne klienten vil bli sendt med denne feilmeldingen. Feilmeldingen, som inkluderer loggene og skjermdumper, blir ikke offentlig synlig. Hvis du foretrekker å bare sende teksten over, vennligst fjern merkene fra boksene: - Det ser ut som du rister på telefonen i frustrasjon. Har du list til å åpne feilrapporteringsskjermen\? + Det ser ut som du rister på telefonen i frustrasjon. Har du lyst til å åpne feilrapporteringsskjermen\? Applikasjonen kræsjet sist gang. Har du lyst til å åpne kræsjskjermen\? Sinnarist for å rapportere feil Feilrapport har blitt sendt @@ -628,7 +627,7 @@ Oppringing feilet som følge av feilkonfigurert tjener Prøv med %s Ikke spør meg igjen - Element samtale feilet + ${app_name} samtale feilet Velg lydenhet Telefon Høytaler @@ -851,8 +850,8 @@ Rommets navn Emne Kan ikke dekryptere - SKJØNNER - LÆR MER + SKJØNNER + LÆR MER Telefonkatalogen din er tom Telefonkatalog Søk i mine kontakter @@ -922,9 +921,8 @@ Du får ikke tilgang til denne meldingen fordi økten ikke er klarert av avsenderen Du får ikke tilgang til denne meldingen fordi avsenderen med vilje ikke sendte nøklene Venter på krypteringshistorikk - Riot er nå Element! - Vi er glade for å kunngjøre at vi har byttet navn! Appen din er oppdatert, og du er logget på kontoen din. - element + Riot er nå Element! + Vi er glade for å kunngjøre at vi har byttet navn! Appen din er oppdatert, og du er logget på kontoen din. Lagre gjenopprettingsnøkkel i Henter kontaktene dine… Kontaktboken din er tom @@ -949,13 +947,13 @@ Hvis du vil tilbakestille PIN-koden, trykker du på Glemt PIN-kode for å logge av og tilbakestille. Aktiver biometri Aktiver enhetsspesifikk biometri, som fingeravtrykk og ansiktsgjenkjenning. - PIN-kode er den eneste måten å låse opp Element. + PIN-kode er den eneste måten å låse opp ${app_name}. Vis innhold i varsler Vis detaljer som romnavn og meldingsinnhold. Vis bare antall uleste meldinger i et enkelt varsel. Krev PIN etter 2 minutter - PIN-kode kreves etter 2 minutter uten bruk av Element. - PIN-kode kreves hver gang du åpner Element. + PIN-kode kreves etter 2 minutter uten bruk av ${app_name}. + PIN-kode kreves hver gang du åpner ${app_name}. Endre PIN-kode Endre din nåværende PIN-kode Bekreft PIN for å deaktivere PIN @@ -973,10 +971,10 @@ Du ser på varselet! Klikk på meg! Kunne ikke motta push. Løsningen kan være å installere applikasjonen på nytt. Legg til konto - [%1$s] -\nDenne feilen er utenfor kontroll av Element. Det er ingen Google-konto på telefonen. Åpne kontoadministratoren og legg til en Google-konto. + [%1$s] +\nDenne feilen er utenfor kontroll av ${app_name}. Det er ingen Google-konto på telefonen. Åpne kontoadministratoren og legg til en Google-konto. Fiks Play Services - Element bruker Google Play Services for å levere push-meldinger, men det ser ikke ut til å være konfigurert riktig: + ${app_name} bruker Google Play Services for å levere push-meldinger, men det ser ikke ut til å være konfigurert riktig: \n%1$s Google Play Services APK er tilgjengelig og oppdatert. Sjekk innstillinger @@ -984,8 +982,8 @@ Noen varsler er deaktivert i dine tilpassede innstillinger. Legg merke til at enkelte meldinger er satt til å være lydløse (gir et varsel uten lyd). Egendefinerte innstillinger. - Varsler er ikke aktivert for denne økten. -\nKontroller Elementinnstillingene. + Varsler er ikke aktivert for denne økten. +\nKontroller ${app_name}innstillingene. Varsler er aktivert for denne økten. Sesjonsinnstillinger. Varsler er deaktivert for kontoen din. @@ -1009,7 +1007,7 @@ Ingen e-post er lagt til kontoen din E-post adresser Autentisering er påkrevd - Du kan ikke gjøre dette fra Element mobile + Du kan ikke gjøre dette fra ${app_name} mobile Bekreft passordet ditt Vis applikasjonsinformasjonen i systeminnstillingene. App info @@ -1106,22 +1104,22 @@ Tillat tillatelse til å få tilgang til kontaktene dine. For å skanne en QR-kode, må du gi tilgang til kameraet. Beklager. Handlingen ble ikke utført på grunn av manglende tillatelser - Element kan sjekke adresseboken din for å finne andre Matrix-brukere basert på e-post og telefonnummer. + ${app_name} kan sjekke adresseboken din for å finne andre Matrix-brukere basert på e-post og telefonnummer. \n \nEr du enig i å dele adresseboken for dette formålet\? - Element kan sjekke adresseboken din for å finne andre Matrix-brukere basert på e-post og telefonnummer. Hvis du godtar å dele adresseboken din for dette formålet, vennligst gi tilgang til neste popup. - Element trenger tillatelse for å få tilgang til kameraet og mikrofonen for å utføre videosamtaler. + ${app_name} kan sjekke adresseboken din for å finne andre Matrix-brukere basert på e-post og telefonnummer. Hvis du godtar å dele adresseboken din for dette formålet, vennligst gi tilgang til neste popup. + ${app_name} trenger tillatelse for å få tilgang til kameraet og mikrofonen for å utføre videosamtaler. \n \nTillat tilgang til de neste popup-vinduene for å kunne ringe. " \n \nTillat tilgang i neste popup for å kunne ringe." - Element trenger tillatelse for å få tilgang til mikrofonen din for å utføre lydanrop. + ${app_name} trenger tillatelse for å få tilgang til mikrofonen din for å utføre lydanrop. " \n \nTillat tilgang i neste popup for å kunne ringe." - Element trenger tillatelse for å få tilgang til kameraet ditt for å ta bilder og videosamtaler. - Element trenger tillatelse for å få tilgang til bilde- og videobiblioteket ditt for å sende og lagre vedlegg. + ${app_name} trenger tillatelse for å få tilgang til kameraet ditt for å ta bilder og videosamtaler. + ${app_name} trenger tillatelse for å få tilgang til bilde- og videobiblioteket ditt for å sende og lagre vedlegg. \n \nTillat tilgang i neste popup for å kunne sende filer fra telefonen din. Kan ikke ta opp video @@ -1143,7 +1141,7 @@ Ringetone for innkommende samtaler Vil bruke %s som assistanse når hjemmeserveren din ikke tilbyr en (IP-adressen din blir delt under en samtale) Tillat reservehjelpsserver - Bruk standard Element-ringetone for innkommende anrop + Bruk standard ${app_name}-ringetone for innkommende anrop Be om bekreftelse før du starter en samtale Forhindre utilsiktet samtale Romemne @@ -1153,21 +1151,468 @@ %d medlemskapsendringer Gruppeliste - Start Element på en annen enhet som kan dekryptere meldingen, slik at den kan sende nøklene til denne økten. + Start ${app_name} på en annen enhet som kan dekryptere meldingen, slik at den kan sende nøklene til denne økten. Forespørsel sendt Nøkkelforespørsel sendt. SSL-feil: identiteten til jevnaldrende er ikke bekreftet. Kan ikke nå en hjemmeserver på denne URL-en, sjekk den - Dette er ikke en gyldig Matrix-serveradresse + Dette er ikke en gyldig adresse for en Matrix tjener Denne URL-en er ikke tilgjengelig, sjekk den Kan ikke registrere: e-post eierskap feil Fjern publiseringen Legg til Begynn å chatte - [%1$s] -\nDenne feilen er utenfor kontroll av Element, og ifølge Google indikerer denne feilen at enheten har for mange apper registrert hos FCM. Feilen oppstår bare i tilfeller der det er ekstremt mange apper, så det bør ikke påvirke gjennomsnittsbrukeren. + [%1$s] +\nDenne feilen er utenfor kontroll av ${app_name}, og ifølge Google indikerer denne feilen at enheten har for mange apper registrert hos FCM. Feilen oppstår bare i tilfeller der det er ekstremt mange apper, så det bør ikke påvirke gjennomsnittsbrukeren. Vil du skjule alle meldinger fra denne brukeren\? \n \nMerk at denne handlingen starter appen på nytt, og det kan ta litt tid. Er du sikker på at du vil invitere %s til denne chatten\? + Ekstern vert kunne ikke plukke opp. + Pågående videosamtale… + Pågående samtale… + Brukeren kansellerte verifikasjonen + Ingen identitetsserver er konfigurert, det er nødvendig å tilbakestille passordet ditt. + Det ser ut til at du prøver å koble til en annen hjemmeserver. Vil du logge av\? + Bli med i et rom for å begynne å bruke appen. + Du har ikke flere uleste meldinger + Velkommen hjem! + Dine direktemeldinger vises her. Trykk på + nederst til høyre for å starte noen. + Rommene dine vises her. Trykk på + nederst til høyre for å finne eksisterende eller start din egen. + Godta + Se reaksjoner + Arrangement slettet av bruker + Sist redigert av %1$s på %2$s + Ingen nettverk. Kontroller Internett-tilkoblingen din. + Bytt nettverk + Dette rommet kan ikke forhåndsvises + Dette rommet kan ikke forhåndsvises. Vil du bli med på det\? + OPPRETT + Romnavn + Romemne (valgfritt) + Emne + Hvem som helst vil kunne bli med i dette rommet + Rominnstillinger + Andre tredjepartsmeldinger + Du ser allerede på dette rommet! + Vennligst skriv ditt forslag nedenfor. + Beskriv ditt forslag her + Takk, forslaget er sendt + Vis fullstendig historie i krypterte rom + Krypterer miniatyrbilde… + Laster ned fil %1$s… + Filen %1$s er lastet ned! + Ingen endringer funnet + Finner du ikke det du leter etter\? + Send en ny direkte melding + Søk etter navn eller ID + Aktiver sveip for å svare på tidslinjen + Link kopiert til utklippstavlen + Legg til med matrix-ID + QR kode + Legg til med QR-kode + Oppretter rom… + Ingen resultater funnet, bruk Legg til med matrix-ID for å søke på serveren. + Begynn å skrive for å få resultater + Nylig + Kjente brukere + Kontakter + Forslag + Gjennomgå vilkårene + Vær oppdagelig av andre + Konfigurer identitetsserver + Du bruker for øyeblikket ikke en identitetsserver. For å oppdage og bli oppdaget av eksisterende kontakter du kjenner, konfigurer du en nedenfor. + Hvis du kobler fra identitetsserveren din, vil du ikke kunne oppdages av andre brukere, og du vil ikke kunne invitere andre via e-post eller telefon. + Synlige telefonnumre + Vi sendte deg en bekreftelses-e-post til %s, sjekk e-posten din og klikk på bekreftelseskoblingen + Vi sendte deg en bekreftelses-e-post til %s. Sjekk først e-posten din og klikk på bekreftelseskoblingen + Send e-post og telefonnummer + Du har gitt ditt samtykke til å sende e-post og telefonnummer til denne identitetsserveren for å oppdage andre brukere fra kontaktene dine. + Du har ikke gitt ditt samtykke til å sende e-post og telefonnummer til denne identitetsserveren for å oppdage andre brukere fra kontaktene dine. + Opphev mitt samtykke + Gi samtykke + Send e-post og telefonnummer + Kunne ikke koble til identitetsserveren + Vennligst skriv inn nettadressen til identitetsserveren + Identitetsserveren du har valgt har ingen tjenestevilkår. Fortsett bare hvis du stoler på eieren av tjenesten + En tekstmelding er sendt til %s. Vennligst skriv inn bekreftelseskoden den inneholder. + Kode + Bekreftelseskoden er ikke riktig. + Godta vilkårene for identitetsserveren (%s) for å la deg bli oppdaget via e-postadresse eller telefonnummer. + Prøv på nytt når du har godtatt vilkårene til hjemmeserveren din. + Ser ut som det tar for lang tid å svare på serveren, dette kan skyldes enten dårlig tilkobling eller en feil med serveren. Prøv igjen om en stund. + Åpne menyen for opprett rom + Lukk menyen for opprett rom… + Lag en ny direkte samtale + Lag en ny direkte samtale etter Matrix ID + Opprett en ny direkte samtale ved å skanne en QR-kode + Gå til bunnen + Det oppstod en feil under henting av vedlegget. + Legg til bilde fra + Roter og beskjær + Kunne ikke håndtere delingsdata + %1$d av %2$d + Det er ingen medier i dette rommet + Det er ingen filer i dette rommet + Tilpasset rapport… + Rapporter dette innholdet + Årsak til å rapportere dette innholdet + RAPPORTERE + Innhold rapportert + Dette innholdet ble rapportert. +\n +\nHvis du ikke vil se mer innhold fra denne brukeren, kan du ignorere dem for å skjule meldingene sine. + Rapportert som spam + Dette innholdet ble rapportert som spam. +\n +\nHvis du ikke vil se mer innhold fra denne brukeren, kan du ignorere dem for å skjule meldingene sine. + Rapportert som upassende + Dette innholdet ble rapportert som upassende. +\n +\nHvis du ikke vil se mer innhold fra denne brukeren, kan du ignorere dem for å skjule meldingene sine. + Det er ingen nettverkstilkobling akkurat nå + Alle meldinger (støyende) + Legg til i favoritter + Fjern fra favoritter + Legg til lav prioritet + Fjern fra lav prioritet + %1$s gjorde ingen endringer + Skriv inn nøkkelord for å finne en reaksjon. + %1$s gjorde rommet offentlig for den som kjenner lenken. + Du gjorde rommet offentlig for den som kjenner lenken. + Koble til en tilpasset server + Skriv inn adressen til serveren du vil bruke + Hvis du endrer passordet, tilbakestilles alle krypteringsnøkler fra ende-til-ende på alle øktene dine, noe som gjør kryptert chatlogg uleselig. Konfigurer sikkerhetskopiering av nøkkel eller eksporter romnøklene fra en annen økt før du tilbakestiller passordet. + Du er logget ut av alle økter og vil ikke lenger motta push-varsler. Logg på igjen på hver enhet for å aktivere varsler på nytt. + Passordet ditt er ikke endret ennå. +\n +\nStoppe passordendringsprosessen\? + Kontoen din er ikke opprettet ennå. +\n +\nStoppe registreringsprosessen\? + Velg en tilpasset hjemmeserver + Vennligst utfør captcha-utfordringen + Vi har nettopp sendt en e-post til %1$s. +\nKlikk på lenken den inneholder for å fortsette opprettelsen av kontoen. + Den angitte koden er ikke riktig. Vennligst sjekk. + + Det er sendt for mange forespørsler. Du kan prøve på nytt %1$d sekund… + Det er sendt for mange forespørsler. Du kan prøve på nytt %1$d sekunder… + + Dette er ikke en gyldig brukeridentifikator. Forventet format: \'@bruker:homeserver.org\' + Logg på for å gjenopprette krypteringsnøkler som er lagret eksklusivt på denne enheten. Du trenger dem for å lese alle dine sikre meldinger på hvilken som helst enhet. + Fjern personlige data + Linken din til matrix.to var feil + Beskrivelsen er for kort + Viser bare de første resultatene, skriv flere bokstaver… + Skjul avansert + Vis avansert + Bekreftelse sendt + Du gjorde ingen endringer + Det er samtalen din. Ei det. + Chat med folk direkte eller i grupper + Hold samtaler private med kryptering + Akkurat som e-post har kontoer ett hjem, selv om du kan snakke med hvem som helst + Bli med millioner gratis på den største offentlige serveren + Eller + Fortsett med %s + Registrer deg med %s + Logg inn med %s + Logg på %1$s + Slett logg + Det oppsto en feil under innlasting av siden: %1$s (%2$d) + Beklager, denne tjeneren godtar ikke nye kontoer. + Denne e-postadressen er ikke tilknyttet noen konto. + En bekreftelses-e-post vil bli sendt til innboksen din for å bekrefte innstillingen av ditt nye passord. + Denne e-postadressen er ikke knyttet til noen konto + En bekreftelses-e-post ble sendt til %1$s. + Trykk på lenken for å bekrefte det nye passordet ditt. Når du har fulgt lenken den inneholder, klikker du nedenfor. + Tilbake til Logg inn + Angi en e-post for å gjenopprette kontoen din. Senere, kan du eventuelt la folk du kjenner oppdage deg via e-posten din. + Angi et telefonnummer slik at folk du kjenner kan oppdage deg. + Vennligst bruk det internasjonale formatet. + Vi har nettopp sendt en kode til %1$s. Skriv det inn nedenfor for å bekrefte at det er deg. + Send igjen + Vennligst bruk det internasjonale formatet (telefonnummeret må starte med \'+\') + Internasjonale telefonnumre må starte med \'+\' + Telefonnummeret virker ugyldig. Vennligst sjekk det + Velg matrix.org + Velg Element Matrix Services + Alternativt, hvis du allerede har en konto og du kjenner din Matrix-identifikator og passordet ditt, kan du bruke denne metoden: + Logg på med Matrix ID + Hvis du oppretter en konto på en hjemmeserver, bruker du Matrix-ID (f.eks. @Bruker:domene.com) og passord nedenfor. + Logg på med Matrix ID + Hvis du ikke vet passordet ditt, kan du gå tilbake for å tilbakestille det. + Logg på igjen + Slett data + Vil du slette alle data som er lagret på denne enheten\? +\nLogg på igjen for å få tilgang til kontodataene og meldingene dine. + Du mister tilgangen til sikre meldinger med mindre du logger på for å gjenopprette krypteringsnøklene. + Slett data + Andre økter + Riste oppdaget! + ${app_name} kan krasje oftere når en uventet feil oppstår + Romadresse + Denne adressen er allerede i bruk + Oppgi romadresse + Noen tegn er ikke tillatt + Oppretter rom… + Ikke klarert pålogging + For ytterligere sikkerhet, bruk et annet pålitelig kommunikasjonsmiddel eller gjør dette personlig. + Se etter det grønne skjoldet for å sikre at en bruker er klarert. Stol på alle brukere i et rom for å sikre at rommet er sikkert. + Reagerte med: %s + %s avbrutt + %s akseptert + Skann koden med den andre brukerens enhet for å verifisere hverandre på en sikker måte + Kan ikke skanne + Skann koden deres + Venter på %s… + Meldinger i dette rommet er ikke kryptert fra ende-til-ende. + Meldinger her er ikke kryptert fra ende-til-ende. + Meldinger i dette rommet er kryptert fra ende-til-ende. +\n +\nMeldingene dine er sikret med låser, og bare du og mottakeren har de unike nøklene for å låse dem opp. + Meldinger her er kryptert fra ende-til-ende. +\n +\nMeldingene dine er sikret med låser, og bare du og mottakeren har de unike nøklene for å låse dem opp. + Rominnstillinger + Innstillinger + Forlat + Administratorer + Administrator i %1$s + Moderator i %1$s + Standard i %1$s + Direkte melding + Nylige rom + Andre rom + Aktiver end-to-end-kryptering… + Du har ikke tillatelse til å aktivere kryptering i dette rommet. + Når det er aktivert, kan ikke kryptering for et rom deaktiveres. Meldinger sendt i et kryptert rom kan ikke sees av serveren, bare av deltakerne i rommet. Aktivering av kryptering kan forhindre at mange bots og broer fungerer som de skal. + For å være trygg, gjør dette personlig eller bruk en annen måte å kommunisere på. + Sammenlign den unike emojien, slik at de vises i samme rekkefølge. + Sammenlign koden med den som vises på den andre brukerens skjerm. + Meldinger med denne brukeren er kryptert fra ende-til-ende og kan ikke leses av tredjeparter. + Den nye økten din er nå bekreftet. Den har tilgang til de krypterte meldingene dine, og andre brukere vil se det som pålitelig. + Logg av denne økten + Denne økten er klarert for sikker meldingstjeneste fordi du bekreftet den: + Bekreft denne økten for å merke den som klarert og gi den tilgang til krypterte meldinger. Hvis du ikke logget på denne økten, kan det hende at kontoen din er kompromittert: + Andre brukere stoler kanskje ikke på det + Fullstendig sikkerhet + Bruk en eksisterende økt for å bekrefte denne, og gi den tilgang til krypterte meldinger. + Inntil denne brukeren stoler på denne økten, blir meldinger sendt til og fra den merket med advarsler. Alternativt kan du bekrefte det manuelt. + Tilkoblingen til serveren har gått tapt + Flymodus er på + Kontodata + Vil du sende dette vedlegget til %1$s\? + Inkluder en grunn + ${app_name} Android + Ny pålogging. Var dette deg\? + Trykk for å se gjennom og bekrefte + Bruk denne økten til å bekrefte den nye, og gi den tilgang til krypterte meldinger. + Dette var ikke meg + Kontoen din kan være kompromittert + Hvis du avbryter, vil du ikke kunne lese krypterte meldinger på denne enheten, og andre brukere stoler ikke på det + Hvis du avbryter, vil du ikke kunne lese krypterte meldinger på den nye enheten din, og andre brukere stoler ikke på det + Bekreft enhetene dine fra Innstillinger. + Bekreftelsen avbrutt + Bruker passord + Skriv inn %s for å fortsette. + Ikke bruk kontopassordet ditt. + Skriv inn en sikkerhetsfrase bare du kjenner, brukt til å sikre hemmeligheter på serveren din. + Dette kan ta flere sekunder, vær tålmodig. + Du er ferdig! + Du kan ikke gjøre det fra mobil + Meldinger i dette rommet er kryptert fra ende-til-ende. Lær mer og verifiser brukere i profilen deres. + Meldinger i dette rommet er kryptert fra ende-til-ende. + Kryptering som brukes av dette rommet støttes ikke + %s opprettet og konfigurert rommet. + Du opprettet og konfigurerte rommet. + %s ble med. + Du ble med. + Dette er begynnelsen på %s. + Dette er begynnelsen på denne samtalen. + Dette er begynnelsen på historien om direkte meldinger med %s. + %s for å fortelle folk hva dette rommet handler om. + Legg til et emne + "Emne: " + Nesten der! Viser den andre enheten det samme skjoldet\? + Nesten der! Venter på bekreftelse… + Venter på %s… + Feil brukernavn og/eller passord. Det angitte passordet starter eller slutter med mellomrom, sjekk det. + Denne kontoen har blitt deaktivert. + Beskjed… + Krypteringsoppgradering tilgjengelig + Bekreft deg selv og andre for å sikre chattene dine + Forhindre skjermbilder av applikasjonen + Bruk det nyeste ${app_name} på de andre enhetene dine: + Har du glemt eller mistet alle gjenopprettingsalternativene\? Tilbakestill alt + Tilbakestill alt + Gjør dette bare hvis du ikke har noen annen enhet du kan bekrefte denne enheten med. + Hvis du tilbakestiller alt + Du starter på nytt uten historikk, ingen meldinger, pålitelige enheter eller pålitelige brukere + Kryptert av en ubekreftet enhet + Gjennomgå hvor du er logget inn + Bekreft alle øktene dine for å sikre at kontoen og meldingene dine er trygge + Bekreft den nye påloggingen som får tilgang til kontoen din: %1$s + Bekreft pålogging + Bekreft identiteten din ved å bekrefte denne påloggingen fra en av de andre øktene dine, og gi den tilgang til krypterte meldinger. + Bekreft identiteten din ved å bekrefte denne påloggingen, og gi den tilgang til krypterte meldinger. + Velg et brukernavn. + Velg passord. + Legg til personer + 🔐️ Bli med meg på ${app_name} + Invitasjon sendt til %1$s + Det er ikke en gyldig QR-kode for matrix + Vi kunne ikke invitere brukere. Kontroller brukerne du vil invitere, og prøv på nytt. + Skann en QR-kode + Del koden min + Koden min + Del denne koden med folk slik at de kan skanne den for å legge til deg og begynne å chatte. + Laster inn tilgjengelige språk… + Godta først vilkårene for identitetsserveren i innstillingene. + For ditt privatliv støtter ${app_name} bare sending av hash-bruker-e-post og telefonnummer. + Sett rolle + Åpne chat + Legg til fra telefonboken min + Del på tekst + Du startet en samtale + %1$s startet en samtale + Du er for øyeblikket i denne samtalen + Du avviste denne samtalen %1$s + %1$s avviste denne samtalen + Denne samtalen er avsluttet + Ring tilbake + Det oppsto en feil med å slå opp telefonnummeret + Aktiv samtale (%1$s) + Overfør + Det oppstod en feil under overføring av samtalen + Brukere + ${app_name} krever at du oppgir legitimasjonen din for å utføre denne handlingen. + %1$dm %2$ds + Bakgrunnsforbindelse + ${app_name} kan kjøre i bakgrunnen for å administrere varslene dine sikkert og privat. Dette kan påvirke batteriforbruket. + Dette vil erstatte din nåværende nøkkel eller frase. + Generer en ny sikkerhetsnøkkel eller sett en ny sikkerhetsfrase for din eksisterende sikkerhetskopi. + Beskytt deg mot å miste tilgang til krypterte meldinger og data ved å sikkerhetskopiere krypteringsnøkler på serveren din. + Tilbakestill sikker sikkerhetskopiering + Konfigurer sikker sikkerhetskopiering + Sikker sikkerhetskopiering + Legg til en knapp på meldingskomponisten for å åpne emoji-tastaturet + Vis emoji-tastatur + Enter-knappen på det myke tastaturet vil sende melding i stedet for å legge til en linjeskift + Forhåndsvis medier før sending + Vibrer når du nevner en bruker + Bruk kommandoen /confetti eller send en melding som inneholder ❄️ eller 🎉 + Klikk på lest kvitteringene for en detaljert liste. + Vis tidsstempler for alle meldinger + Formater meldinger med markdown-syntaksen før de sendes. Dette gir avansert formatering, for eksempel å bruke stjerner for å vise kursiv tekst. + La andre brukere vite at du skriver. + Telefonbok land + Kontakter tillatelse + Behold medier + Tredjeparts varsler + + %d sekund + %d sekunder + + Kunne ikke oppdatere innstillingene. + Ingen bakgrunnssynkronisering + Optimalisert for sanntid + Optimalisert for batteri + Bakgrunnssynkronisering + Meldinger sendt av bot + Ring invitasjoner + Når jeg blir invitert til et rom + Velg LED-farge, vibrasjon, lyd… + • Varsler inneholder bare metadata + • Meldinger sendes via Firebase Cloud Messaging + Appen trenger tillatelse for å kjøre i bakgrunnen + Hvis en bruker lar en enhet være frakoblet og stasjonær i en periode, mens skjermen er slått av, går enheten i Døsemodus. Dette forhindrer apper i å få tilgang til nettverket og avviser jobber, synkroniseringer og standardalarmer. + ${app_name} påvirkes ikke av batterioptimalisering. + Meldingen er klikket! + Klikk på varselet. Hvis du ikke ser varselet, må du sjekke systeminnstillingene. + Varslingsvisning + Bytte tema + Oppgrader rommet + Endre tillatelser + Endre romnavn + Endre historie synlighet + Aktiver romkryptering + Endre hovedadresse for rommet + Bytt romavatar + Gi beskjed til alle + Fjern meldinger sendt av andre + Utesteng brukere + Spark brukere + Endre innstillinger + Inviter brukere + Send meldinger + Standard rolle + Du har ikke tillatelse til å oppdatere rollene som kreves for å endre forskjellige deler av rommet + Velg rollene som kreves for å endre forskjellige deler av rommet + Tillatelser + Se og oppdater rollene som kreves for å endre forskjellige deler av rommet. + Romtillatelser + Dette rommet er ikke offentlig. Du vil ikke kunne bli med uten invitasjon. + Du holdt samtalen + %s holdt samtalen + Sett på vent + Gjenoppta + Uautorisert, mangler gyldig autentiseringslegitimasjon + Tilbake + System standard + Filtrer utestengte brukere + Endre widgets + Aktiver analyse for å hjelpe med å forbedre ${app_name}. + Varsel Personvern + Inkluderer avatar og visningsnavnendringer. + Vis kontohendelser + Invitasjoner, spark og utestengelser er ikke påvirket. + Vis delta og forlate arrangementer + Inkluderer invitasjoner/delta/forlot/spark/utesteng hendelser og avatar/visningsnavnendringer. + Vis chateffekter + Vis statens medlemsarrangementer + Vis tidsstempler i 12-timers format + Markdown formatering + Forhåndsvis lenker i chatten når hjemmeserveren din støtter denne funksjonen. + Forhåndsvisning av innebygd URL + Fest rom med uleste meldinger + Fest rom med tapte varsler + Hjemmeskjerm + Varslingsmål + Administrer kryptografinøkler + Bruk en Integration Manager til å administrere roboter, broer, widgets og klistremerkepakker. +\nIntegration Managers mottar konfigurasjonsdata, og kan endre moduler, sende rominvitasjoner og angi strømnivåer på dine vegne. + Forsinkelse mellom hver synkronisering + %s +\nSynkroniseringen kan bli utsatt avhengig av ressursene (batteriet) eller enhetens tilstand (hvilemodus). + Foretrukket synkroniseringsintervall + Tidsavbrudd for synkronisering forespørsel + Aktiver synkronisering i bakgrunnen + Du vil ikke bli varslet om innkommende meldinger når appen er i bakgrunnen. + ${app_name} vil synkroniseres i bakgrunnen med jevne mellomrom på presis tid (konfigurerbar). +\nDette vil påvirke radio og batteribruk, det vises en permanent melding om at ${app_name} lytter etter hendelser. + ${app_name} synkroniseres i bakgrunnen på en måte som bevarer enhetens begrensede ressurser (batteri). +\nAvhengig av enhetens ressurstilstand, kan synkroniseringen bli utsatt av operativsystemet. + Msgs i gruppechatter + Msgs som inneholder brukernavnet mitt + Msgs som inneholder visningsnavnet mitt + Konfigurer stille varsler + Konfigurer anropsvarsler + Konfigurer lyd varsler + • Varsler vil <b>ikke vise meldingsinnhold<b> + Ignorer optimalisering + Aktiver Start ved oppstart + Tjenesten starter når enheten startes på nytt. + Tjenesten kunne ikke startes på nytt + Tjenesten stoppet og startet på nytt automatisk. + Varslingstjeneste automatisk omstart + Start Tjeneste + Varslingstjenesten kjører ikke. +\nPrøv å starte programmet på nytt. + Varslingstjenesten kjører. + Varslingstjeneste + Play Tjenester Sjekk + Søker i katalogen… + INVITASJONER \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values-nb/strings.xml b/vector/src/main/res/values-nb/strings.xml similarity index 90% rename from matrix-sdk-android/src/main/res/values-nb/strings.xml rename to vector/src/main/res/values-nb/strings.xml index 07cf4226e0..3a7caefc55 100644 --- a/matrix-sdk-android/src/main/res/values-nb/strings.xml +++ b/vector/src/main/res/values-nb/strings.xml @@ -8,4 +8,5 @@ Du sendte et bilde. %1$s sendte et bilde. %1$s: %2$s + %1$s skapte rommet \ No newline at end of file diff --git a/vector/src/main/res/values-nl/strings.xml b/vector/src/main/res/values-nl/strings.xml index d15f7870a4..a2e12e99e2 100644 --- a/vector/src/main/res/values-nl/strings.xml +++ b/vector/src/main/res/values-nl/strings.xml @@ -1,5 +1,147 @@ + %1$s: %2$s + %1$s heeft een afbeelding gestuurd. + + Uitnodiging van %s + %1$s heeft %2$s uitgenodigd + %1$s heeft u uitgenodigd + %1$s neemt nu deel aan het gesprek + %1$s heeft het gesprek verlaten + %1$s heeft de uitnodiging geweigerd + %1$s heeft %2$s uit het gesprek verwijderd + %1$s heeft %2$s ontbannen + %1$s heeft %2$s verbannen + %1$s heeft de uitnodiging van %2$s ingetrokken + %1$s heeft zijn/haar avatar aangepast + %1$s heeft zijn/haar naam aangepast naar %2$s + %1$s heeft zijn/haar naam aangepast van %2$s naar %3$s + %1$s heeft zijn/haar naam verwijderd (%2$s) + %1$s heeft het onderwerp veranderd naar: %2$s + %1$s heeft de gespreksnaam veranderd naar: %2$s + %s heeft een video-oproep gemaakt. + %s heeft een spraakoproep gemaakt. + %s heeft de oproep beantwoord. + %s heeft opgehangen. + %1$s heeft de toekomstige gespreksgeschiedenis zichtbaar gemaakt voor %2$s + alle deelnemers aan het gesprek, vanaf het punt dat ze zijn uitgenodigd. + alle deelnemers aan het gesprek, vanaf het punt dat ze zijn toegetreden. + alle deelnemers aan het gesprek. + iedereen. + onbekend (%s). + %1$s heeft eind-tot-eind-versleuteling aangezet (%2$s) + + %1$s heeft een VoIP-vergadering aangevraagd + VoIP-vergadering gestart + VoIP-vergadering gestopt + + (avatar is ook veranderd) + %1$s heeft de gespreksnaam verwijderd + %1$s heeft het gespreksonderwerp verwijderd + %1$s heeft zijn/haar profiel %2$s bijgewerkt + %1$s heeft een uitnodiging naar %2$s gestuurd om het gesprek toe te treden + %1$s heeft de uitnodiging voor %2$s aanvaard + + ** Kan niet ontsleutelen: %s ** + Het apparaat van de afzender heeft geen sleutels voor dit bericht gestuurd. + + + Kon niet verwijderd worden + Kan bericht niet verzenden + + Uploaden van de afbeelding mislukt + + + Netwerkfout + Matrix-fout + + + + + + + Het is momenteel niet mogelijk om een leeg gesprek opnieuw toe te treden. + + + E-mailadres + Telefoonnummer + + %1$s heeft een sticker gestuurd. + + + Uitnodiging van %s + Gespreksuitnodiging + %1$s en %2$s + Leeg gesprek + + + %1$s en 1 andere + %1$s en %2$d anderen + + + + Bericht verwijderd + Bericht verwijderd door %1$s + Bericht verwijderd [reden: %1$s] + Bericht verwijderd door %1$s [reden: %2$s] + + Initiële synchronisatie: +\nAccount wordt geïmporteerd… + Initiële synchronisatie: +\nCrypto wordt geïmporteerd + Initiële synchronisatie: +\nGesprekken worden geïmporteerd + Initiële synchronisatie: +\nDeelgenomen gesprekken worden geïmporteerd + Initiële synchronisatie: +\nUitgenodigde gesprekken worden geïmporteerd + Initiële synchronisatie: +\nVerlaten gesprekken worden geïmporteerd + Initiële synchronisatie: +\nGemeenschappen worden geïmporteerd + Initiële synchronisatie: +\nAccountgegevens worden geïmporteerd + + %s heeft dit gesprek opgewaardeerd. + + Bericht wordt verstuurd… + Uitgaande wachtrij legen + + %1$s heeft de uitnodiging voor %2$s om het gesprek toe te treden ingetrokken + Uitnodiging van %1$s. Reden: %2$s + %1$s heeft %2$s uitgenodigd. Reden: %3$s + %1$s heeft u uitgenodigd. Reden: %2$s + %1$s neemt nu deel. Reden: %2$s + %1$s is weggegaan. Reden: %2$s + %1$s heeft de uitnodiging geweigerd. Reden: %2$s + %1$s heeft %2$s verwijderd. Reden: %3$s + %1$s heeft %2$s ontbannen. Reden: %3$s + %1$s heeft %2$s verbannen. Reden: %3$s + %1$s heeft %2$s een uitnodiging voor het gesprek gestuurd. Reden: %3$s + %1$s heeft de uitnodiging voor %2$s ingetrokken. Reden: %3$s + %1$s heeft de uitnodiging voor %2$s aanvaard. Reden: %3$s + %1$s heeft de uitnodiging van %2$s ingetrokken. Reden: %3$s + + + %1$s heeft %2$s als gespreksadres toegevoegd. + %1$s heeft %2$s als gespreksadressen toegevoegd. + + + + %1$s heeft %2$s als gespreksadres verwijderd. + %1$s heeft %3$s als gespreksadressen verwijderd. + + + %1$s heeft %2$s als gespreksadres toegevoegd en %3$s verwijderd. + + %1$s heeft het hoofdadres voor dit gesprek ingesteld op %2$s. + %1$s heeft het hoofdadres voor dit gesprek verwijderd. + + %1$s heeft gasten de toegang tot het gesprek verleend. + %1$s heeft gasten de toegang tot het gesprek verhinderd. + + %1$s heeft eind-tot-eind-versleuteling ingeschakeld. + %1$s heeft eind-tot-eind-versleuteling ingeschakeld (onbekend algoritme %2$s). Berichten Gesprek @@ -71,7 +213,7 @@ Lokale contactenlijst Alleen Matrix-contacten Geen gesprekken - U heeft Element geen toegang tot uw lokale contacten gegeven + U heeft ${app_name} geen toegang tot uw lokale contacten gegeven Geen resultaten Gesprekken @@ -79,7 +221,7 @@ Geen gesprekken Geen publieke gesprekken beschikbaar - 1 gebruiker + %d gebruiker %d gebruikers Logboek versturen @@ -211,23 +353,22 @@ Kan geen video opnemen" Informatie - Element heeft toegang nodig tot uw mediabestanden om bijlagen te verzenden en op te slaan. + ${app_name} heeft toegang nodig tot uw mediabestanden om bijlagen te verzenden en op te slaan. \n \nVerleen toegang op de volgende pop-up om bestanden vanaf uw telefoon te sturen. - Element heeft toegang nodig tot uw camera om foto’s en video-oproepen te maken. + ${app_name} heeft toegang nodig tot uw camera om foto’s en video-oproepen te maken. " \n \nVerleen toegang op de volgende pop-up om de oproep te maken." - Element heeft toegang nodig tot uw microfoon om spraakoproepen te maken. + ${app_name} heeft toegang nodig tot uw microfoon om spraakoproepen te maken. " \n \nVerleen toegang op de volgende pop-up om de oproep te maken." - Element heeft toegang nodig tot uw camera en microfoon om video-oproepen te maken. + ${app_name} heeft toegang nodig tot uw camera en microfoon om video-oproepen te maken. \n \nVerleen toegang op de volgende pop-ups om de oproep te maken. - Element kan uw adresboek benaderen om andere Matrix-gebruikers te vinden aan de hand van hun e-mailadressen en telefoonnummers. -\nAls u het goed vindt om uw adresboek hiervoor te delen, verleen dan toegang op de volgende pop-up. - Element kan uw adresboek gebruiken om andere Matrix-gebruikers te vinden aan de hand van hun e-mailadressen en telefoonnummers. + ${app_name} kan uw adresboek benaderen om andere Matrix-gebruikers te vinden aan de hand van hun e-mailadressen en telefoonnummers. Als u het goed vindt om uw adresboek hiervoor te delen, verleen dan toegang op de volgende pop-up. + ${app_name} kan uw adresboek gebruiken om andere Matrix-gebruikers te vinden aan de hand van hun e-mailadressen en telefoonnummers. \n \nWilt u uw adresboek hiervoor delen\? Sorry. De actie is niet toegepast vanwege ontbrekende rechten @@ -526,7 +667,7 @@ Informatie over sessie van afzender Publieke naam Publieke naam - ID + Sessie ID Sessiesleutel Verificatie Ed25519-vingerafdruk @@ -600,7 +741,7 @@ Gigantisch Licht thema Donker thema - Zwart thema + Zwart thema Bezig met synchroniseren… Luisteren voor evenementen Meldingsgeluid @@ -660,27 +801,27 @@ Weet u zeker dat u een video-oproep wilt beginnen\? Groepenlijst - 1 verandering in lidmaatschap + %d verandering in lidmaatschap %d veranderingen in lidmaatschap Ledenlijst Opschrift openen Synchroniseren… - 1 actieve deelnemer + %d actieve deelnemer %d actieve deelnemers - 1 deelnemer + %d deelnemer %d deelnemers Weet u zeker dat u deze gebruiker uit dit gesprek wilt verbannen\? - 1 nieuw bericht + %d nieuw bericht %d nieuwe berichten - 1 gesprek + %d gesprek %d gesprekken @@ -701,16 +842,16 @@ Ongeldige gemeenschaps-ID ‘%s’ is geen geldige gemeenschaps-ID - 1 ongelezen bericht waarin u vermeld staat + %d ongelezen bericht waarin u vermeld staat %d ongelezen berichten waarin u vermeld staat - 1 gesprek + %d gesprek %d gesprekken %1$s in %2$s - 1 actieve widget + %d actieve widget %d actieve widgets @@ -739,7 +880,7 @@ Ontvangst-avatar Avatar - 1 ongelezen bericht waarin u vermeld bent + %d ongelezen bericht waarin u vermeld bent %d ongelezen berichten waarin u vermeld bent Vermeldingsavatar @@ -760,12 +901,12 @@ Account deactiveren Mijn account deactiveren Meldingsprivacy - Element kan op de achtergrond werken om uw meldingen veilig en privé te beheren. Dit beïnvloedt mogelijk het accuverbruik. + ${app_name} kan op de achtergrond werken om uw meldingen veilig en privé te beheren. Dit beïnvloedt mogelijk het accuverbruik. Toestemming verlenen Kies een andere optie Statistische gegevens (analytics) versturen - Element verzamelt anonieme statistische gegevens (analytics) om het voor ons mogelijk te maken om de app te verbeteren. - Schakel statistische gegevens in om ons te helpen bij het verbeteren van Element. + ${app_name} verzamelt anonieme statistische gegevens (analytics) om het voor ons mogelijk te maken om de app te verbeteren. + Schakel statistische gegevens in om ons te helpen bij het verbeteren van ${app_name}. Ja, ik wil helpen! Er ontbreekt een vereiste parameter. Er is een parameter ongeldig. @@ -786,7 +927,7 @@ Beveiligingssleutels van uw sessies opnieuw aanvragen. Sleutelaanvraag verstuurd. Aanvraag verstuurd - Start Element op een ander apparaat dat het bericht kan ontsleutelen, zodat het de sleutels naar deze sessie kan sturen. + Start ${app_name} op een ander apparaat dat het bericht kan ontsleutelen, zodat het de sleutels naar deze sessie kan sturen. Typ hier… Wissen Spraakbericht versturen @@ -819,19 +960,19 @@ Deze actie is niet mogelijk wegens ontbrekende rechten. Systeemmeldingen - 1s + %ds %ds - 1m + %dm %dm - 1u + %du %du - 1d + %dd %dd nu %1$s @@ -840,16 +981,16 @@ %1$s en %2$s %1$s %2$s - 1 geselecteerd + %d geselecteerd %d geselecteerd Om Matrix-appbeheer te herstellen - 1 deelnemer + %d deelnemer %d deelnemers - 1 gesprek + %d gesprek %d gesprekken Bronlimiet overschreden @@ -862,12 +1003,11 @@ Gelieve %s om deze limiet te verhogen. Gelieve %s om deze dienst te blijven gebruiken. Foutmelding - Status.im-thema Toch bellen Aanvaarden Gelieve het beleid van deze thuisserver te lezen en aanvaarden: Oproepen - Gebruik de standaardbeltoon van Element voor inkomende oproepen + Gebruik de standaardbeltoon van ${app_name} voor inkomende oproepen Beltoon voor inkomende oproepen Selecteer beltoon voor oproepen: Eruit sturen @@ -929,8 +1069,8 @@ Inschakelen Sessie-instellingen. Meldingen zijn ingeschakeld voor deze sessie. - Meldingen zijn niet ingeschakeld voor deze sessie. -\nGelieve de Element-instellingen te controleren. + Meldingen zijn niet ingeschakeld voor deze sessie. +\nGelieve de ${app_name}-instellingen te controleren. Inschakelen Aangepaste instellingen. Sommige soorten berichten zijn stil (ze geven een geluidsloze melding). @@ -939,7 +1079,7 @@ Instellingen controleren Play-diensten controleren De APK van Google Play Services is beschikbaar en up-to-date. - Element maakt gebruikt van Google Play Services om pushberichten af te leveren, maar dit lijkt niet juist geconfigureerd te zijn: + ${app_name} maakt gebruikt van Google Play Services om pushberichten af te leveren, maar dit lijkt niet juist geconfigureerd te zijn: \n%1$s Play-diensten herstellen Firebase-bewijs @@ -947,12 +1087,12 @@ \n%1$s Het FCM-bewijs is niet opgehaald: \n%1$s - [%1$s] -\nDeze fout is onafhankelijk van Element. Volgens Google betekent deze fout dat het apparaat te veel apps heeft geregistreerd met FCM. De fout treedt enkel op ingeval er een enorm aantal apps is, dus zou dit de gemiddelde gebruiker niet mogen hinderen. - [%1$s] -\nDeze fout is onafhankelijk van Element. Ze kan verschillende oorzaken hebben. Misschien werkt het als u het later opnieuw probeert. U kunt ook controleren of het gegevensverbruik van Google Play Services niet wordt beperkt in de systeeminstellingen, of dat de klok van uw apparaat wel juist staat, of dat het misschien aan een aangepaste ROM ligt. - [%1$s] -\nDeze fout is onafhankelijk van Element. Er is geen Google-account verbonden met de telefoon. Open het accountbeheer en voeg er een Google-account toe. + [%1$s] +\nDeze fout is onafhankelijk van ${app_name}. Volgens Google betekent deze fout dat het apparaat te veel apps heeft geregistreerd met FCM. De fout treedt enkel op ingeval er een enorm aantal apps is, dus zou dit de gemiddelde gebruiker niet mogen hinderen. + [%1$s] +\nDeze fout is onafhankelijk van ${app_name}. Ze kan verschillende oorzaken hebben. Misschien werkt het als u het later opnieuw probeert. U kunt ook controleren of het gegevensverbruik van Google Play Services niet wordt beperkt in de systeeminstellingen, of dat de klok van uw apparaat wel juist staat, of dat het misschien aan een aangepaste ROM ligt. + [%1$s] +\nDeze fout is onafhankelijk van ${app_name}. Er is geen Google-account verbonden met de telefoon. Open het accountbeheer en voeg er een Google-account toe. Account toevoegen Bewijsregistratie FCM-bewijs geregistreerd bij thuisserver. @@ -968,17 +1108,17 @@ Dienst is niet herstart Starten bij opstarten van apparaat De dienst zal starten wanneer het apparaat wordt herstart. - De dienst zal niet starten wanneer het apparaat wordt herstart en u zult geen meldingen ontvangen tot u Element hebt geopend. + De dienst zal niet starten wanneer het apparaat wordt herstart en u zult geen meldingen ontvangen tot u ${app_name} hebt geopend. Starten bij opstarten inschakelen Achtergrondbeperkingen controleren - Achtergrondbeperkingen zijn uitgeschakeld voor Element. Deze test dient uitgevoerd te worden met een mobiele verbinding (geen wifi). + Achtergrondbeperkingen zijn uitgeschakeld voor ${app_name}. Deze test dient uitgevoerd te worden met een mobiele verbinding (geen wifi). \n%1$s - Achtergrondbeperkingen zijn ingeschakeld voor Element. + Achtergrondbeperkingen zijn ingeschakeld voor ${app_name}. \nAl wat de app probeert te doen zal in de achtergrond hevig beperkt worden; dit kan het correct functioneren van meldingen beïnvloeden. \n%1$s Beperkingen uitschakelen Accuoptimalisatie - Element wordt niet beperkt door accuoptimalisatie. + ${app_name} wordt niet beperkt door accuoptimalisatie. Als een gebruiker een apparaat los van de oplader een tijd laat stilliggen, met het scherm uitgeschakeld, gaat het apparaat in slaapmodus. Dit verhindert apps de toegang tot het netwerk, en stelt hun taken, synchronisaties en standaardalarmen uit. Optimalisatie negeren De app heeft geen verbinding met de homeserver nodig in de achtergrond, dit zou het gebruik van de batterij moeten verlagen @@ -990,8 +1130,8 @@ Berichten versturen met Enter De Enter-knop van het toetsenbord zal berichten versturen in plaats van een regeleinde in te voegen Achtergrondverbinding - Element heeft een achtergrondverbinding met lage impact nodig om betrouwbare meldingen te kunnen hebben. -\nOp het volgende scherm zult u gevraagd worden om Element toestemming te verlenen om altijd in de achtergrond te kunnen draaien, gelieve deze toestemming te verlenen. + ${app_name} heeft een achtergrondverbinding met lage impact nodig om betrouwbare meldingen te kunnen hebben. +\nOp het volgende scherm zult u gevraagd worden om ${app_name} toestemming te verlenen om altijd in de achtergrond te kunnen draaien, gelieve deze toestemming te verlenen. Toestemming verlenen Databesparingsmodus past een specifieke filter toe zodat aanwezigheidsupdates en typmeldingen weggefilterd worden. Er is een fout opgetreden bij het verifiëren van uw e-mailadres. @@ -1011,7 +1151,7 @@ Herstel van versleutelde berichten Sleutelback-up beheren - %1$s: 1 bericht + %1$s: %2$d bericht %1$s: %2$d berichten @@ -1050,7 +1190,7 @@ Wachtwoorden komen niet overeen Voer een wachtwoord in Wachtwoord is te zwak - Verwijder het wachtwoord als u wilt dat Element een herstelsleutel genereert. + Verwijder het wachtwoord als u wilt dat ${app_name} een herstelsleutel genereert. Geen Matrix-sessie beschikbaar Verlies nooit uw versleutelde berichten Berichten in versleutelde gesprekken worden beveiligd met eind-tot-eind-versleuteling. Enkel de ontvanger(s) en u hebben de sleutels om deze berichten te lezen. @@ -1137,7 +1277,7 @@ Nieuwe sleutelback-up Er is een nieuwe sleutelback-up voor versleutelde berichten gedetecteerd. \n -\nAls u deze nieuwe herstelmethode niet heeft ingesteld, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel een nieuwe herstelmethode in in de instellingen. +\nAls u deze nieuwe herstelmethode niet heeft ingesteld, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel in de instellingen een nieuwe herstelmethode in. Ik was het Verlies nooit uw versleutelde berichten Begin sleutelback-up te gebruiken @@ -1156,7 +1296,7 @@ Ondertekening Ongeldig thuisserverontdekkingsantwoord Serveropties automatisch aanvullen - Element heeft een aangepaste serverconfiguratie gedetecteerd voor uw gebruikers-ID-domein ‘%1$s’: + ${app_name} heeft een aangepaste serverconfiguratie gedetecteerd voor uw gebruikers-ID-domein ‘%1$s’: \n%2$s Configuratie gebruiken Sorry, vergadergesprekken met Jitsi worden nog niet ondersteund op oudere apparaten (met een Android-versie lager dan 6.0) @@ -1232,13 +1372,13 @@ Zal %s gebruiken om te assisteren in het geval dat uw thuisserver er niet over beschikt (uw IP-adres zal tijdens een oproep gedeeld worden) Voeg een identiteitsserver toe in de instellingen om dit te doen. Bevestig uw wachtwoord - U kunt dit niet doen vanaf de mobiele Element - Synchroniseren op de achtergrond (experimenteel) + U kunt dit niet doen vanaf de mobiele ${app_name} + Synchroniseren op de achtergrond Geoptimaliseerd voor batterij - Element zal op een batterijzuinige manier synchroniseren op de achtergrond. + ${app_name} zal op een batterijzuinige manier synchroniseren op de achtergrond. \nAfhankelijk van de staat van uw apparaat kan het besturingssysteem de synchronisatie uitstellen. Geoptimaliseerd voor snelheid - Element zal periodiek op de achtergrond synchroniseren (configureerbaar). + ${app_name} zal periodiek op de achtergrond synchroniseren (configureerbaar). \nDit heeft een negatieve impact op uw batterij- en datagebruik. Er zal een melding getoond worden ter informatie. Geen achtergrondssynchronisatie U zal geen melding van berichten ontvangen als de app zich in de achtergrond bevindt. @@ -1301,9 +1441,9 @@ Welkom thuis! Ongelezen berichten inhalen Gesprekken - Je directe gesprekken zullen hier worden weergegeven + Je directe gesprekken zullen hier worden weergegeven. Gebruik de + knop om een gesprek te starten. Kamers - Je kamers zullen hier worden weergegeven + Je kamers zullen hier worden weergegeven. Gebruik de + knop rechtsonder om een bestaande kamer te openen of een nieuwe aan te maken. Reacties Bevestigen Leuk vinden @@ -1321,7 +1461,7 @@ Even wachten… Alle Gemeenschappen Dit gesprek kan niet worden voorvertoond - De voorvertoning van wereld-leesbare gesprekken zijn nog niet ondersteund in Element + De voorvertoning van wereld-leesbare gesprekken zijn nog niet ondersteund in ${app_name} Gesprekken Directe Berichten Nieuw Gesprek diff --git a/vector/src/main/res/values-nn/strings.xml b/vector/src/main/res/values-nn/strings.xml index af2c42051f..ed8afce0c9 100644 --- a/vector/src/main/res/values-nn/strings.xml +++ b/vector/src/main/res/values-nn/strings.xml @@ -1,8 +1,72 @@ + %1$s: %2$s + %1$s sende eit bilæte. + %1$s sende eit klistremerke. + %s si innbjoding + %1$s inviterte %2$s + %1$s inviterte deg + %1$s kom inn + %1$s forlot rommet + %1$s sa nei til innbjodingi + %1$s sparka %2$s + %1$s slapp %2$s inn att + %1$s stengde %2$s ute + %1$s tok attende %2$s si innbjoding + %1$s byta avataren sin + %1$s sette visingsnamnet sitt som %2$s + %1$s byta visingsnamnet sitt frå %2$s til %3$s + %1$s tok burt visingsnamnet sitt (%2$s) + %1$s gjorde emnet til: %2$s + %1$s gjorde romnamnet til: %2$s + %s starta ei videosamtala. + %s starta ein talesamtale. + %s tok røyret. + %s la på røyret. + %1$s gjorde den framtidige romsoga synleg for %2$s + alle rommedlemmar, frå då dei vart invitert inn. + alle rommedlemmar, frå då dei kom inn. + alle rommedlemmar. + kven som heldst. + uvisst (%s). + %1$s skrudde ende-til-ende-kryptering på (%2$s) + %1$s bad um ei VoIP-gruppasamtala + VoIP-gruppasamtala er starta + VoIP-gruppasamtala er ferdug + (avataren vart au byta) + %1$s tok burt romnamnet + %1$s tok burt romemnet + %1$s gjorde um på skildringi si %2$s + %1$s inviterte %2$s til rommet + %1$s sa ja til innbjodingi til %2$s + ** Fekk ikkje til å dekryptera: %s ** + Avsendareiningi hev ikkje sendt oss nyklane fyr denna meldingi. + Kunde ikkje gjera um + Fekk ikkje til å senda meldingi + Fekk ikkje til å lasta biletet upp + Noko gjekk gale med netverket + Noko gjekk gale med Matrix + Det lèt seg fyrebils ikkje gjera å fara inn att i eit tomt rom. + Epostadresse + Telefonnummer + Innbjoding frå %s + Rominnbjoding + %1$s og %2$s + + %1$s og 1 til + %1$s og %2$d til + + Tomt rom + Ei melding vart stroki + %1$s strauk meldingi + Meldingi vart stroki [av di: %1$s] + %1$s strauk meldingi [av di: %2$s] + %s oppgraderte rommet. + Nullstill sendingskø + %1$s forlot rommet. Grunn: %2$s Lyst tema Mørkt tema - Svart tema + Svart tema Synkroniserar… Lyttar etter hendingar Bråkete varsel @@ -84,7 +148,7 @@ Brukarkatalog Berre Matrix-kontaktar Ingen samtalar - Du gav ikkje Element tilgang til dei lokale kontaktane dine + Du gav ikkje ${app_name} tilgang til dei lokale kontaktane dine Ingen treff Rom Romkatalog @@ -198,7 +262,7 @@ Etterspør på nytt krypteringsnøkklar frå dei andre einingane dine. Nøkkelførespurnaden er sendt. Førespurnaden er send - Start Element på ein annan eining som kan dekryptere meldingen, slik at den kan sende nøkklane til denne sesjonen + Start ${app_name} på ein annan eining som kan dekryptere meldingen, slik at den kan sende nøkklane til denne sesjonen Les kvitteringsliste Gruppeliste @@ -233,23 +297,23 @@ Ta bilete eller video Kan ikkje spela inn video Info - Element treng tilgang til bilete- og videobiblioteket for å senda og lagra vedlegg. + ${app_name} treng tilgang til bilete- og videobiblioteket for å senda og lagra vedlegg. \n \nGje tilgang i sprettvindauget som kjem for å senda filer frå mobilen. - Element treng tilgang til kameraet ditt for å ta bilete og videosamtalar. + ${app_name} treng tilgang til kameraet ditt for å ta bilete og videosamtalar. " \n \nVer venleg og gje tilgang på sprettvindauget som kjem for å starta samtalen." - Element treng tilgang til mikrofonen din for å utføra talesamtalar. + ${app_name} treng tilgang til mikrofonen din for å utføra talesamtalar. Mediaforbindelsen feila " \n \nGjer vel og gje tilgang på sprettvindauget som kjem for å utføra samtalen." - Element treng tilgang til kameraet og mikrofonen din for å utføra videosamtalar. + ${app_name} treng tilgang til kameraet og mikrofonen din for å utføra videosamtalar. \n \nGjer vel og gjev tilgang på sprettvindauget som kjem for å utføra samtalen. - Element treng tilgang til kontaktliste for å finna andre Matrix-brukarar basert på e-post og telefonnummer. Viss du samtykker til å dele kontaktlista, ver venleg å tillat tilgang på sprettvindauget som kjem på neste skjermbilete. - Element treng tilgang til kontaktliste for å finna andre Matrix-brukarar basert på e-post og telefonnummer. + ${app_name} treng tilgang til kontaktliste for å finna andre Matrix-brukarar basert på e-post og telefonnummer. Viss du samtykker til å dele kontaktlista, ver venleg å tillat tilgang på sprettvindauget som kjem på neste skjermbilete. + ${app_name} treng tilgang til kontaktliste for å finna andre Matrix-brukarar basert på e-post og telefonnummer. \n \nSamtykker du til å dele adresseboka for dette føremålet \? Beklagar. Grunna manglande tilgangar, vart ikkje handlinga utført @@ -474,13 +538,13 @@ Deaktiver konto Deaktiver kontoen min Personvern ved varslingar - Element kan køyra i bakgrunnen for å sikkert og privat halda styr på varsla dine (dette kan påverka batteribruk). + ${app_name} kan køyra i bakgrunnen for å sikkert og privat halda styr på varsla dine (dette kan påverka batteribruk). Gje tillating vel noko anna Statistikk Send statistikkdata - Element samlar anonym statistikk inn for å forbetra applikasjonen. - Ver venleg og skru statistikkinnsamling på for å hjelpa oss med å forbetra Element. + ${app_name} samlar anonym statistikk inn for å forbetra applikasjonen. + Ver venleg og skru statistikkinnsamling på for å hjelpa oss med å forbetra ${app_name}. Ja, eg vil hjelpa til! Datasparingsmodus Informasjon om sesjon @@ -789,7 +853,6 @@ Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine t Heimtenaren har truffe den Månadlege Grensa si for Aktive Brukarar. Ver venleg og %s for å heva grensa. Ver venleg og %s for å halda fram med å bruka tenesten. - Status.im-tema Ring likevel Aksepter Feil @@ -802,7 +865,7 @@ Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine t Venligast sjå over og godta retningslinjene til heimtenaren: Det gjeng ikkje å nå URL-en, gjer vel og sjå til honom Oppringingar - Bruk standard Element-ringetone for innkommande samtalar + Bruk standard ${app_name}-ringetone for innkommande samtalar Ringetone for innkommande samtalar Vel ringetone for samtalar: Ein videosamtale pågår… @@ -829,8 +892,8 @@ Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine t Skru på Sesjonsinnstillingar. Varslingar er aktivert for denne sesjonen. - Varslingar er deaktivert for denne sesjonen. -\nSjekk Element-innstillingane. + Varslingar er deaktivert for denne sesjonen. +\nSjekk ${app_name}-innstillingane. Skru på setter opp tenesta Sikkerheitskopi av nøkkel @@ -872,7 +935,7 @@ Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine t Legg til ein identitetstenar i innstillingane for å utføre denne handlinga. Versjon %s Stadfest ditt passord - Denne handlinga kan ikkje utførast frå Element på mobil + Denne handlinga kan ikkje utførast frå ${app_name} på mobil Authentisering er påkrevd Integrasjonar Bruk ein integrasjonshandterar (Integration Manager) for å handtere botar, bruer, tillegg og klistermerkepakker. @@ -937,7 +1000,7 @@ Meldingssynlegheit på Matrix liknar på epost. At vi gløymer meldingane dine t Trådlaus hovudtelefon Høgtalar Vel eining for lyd - Element-samtalen feila + ${app_name}-samtalen feila Ingen fleire resultat Suksess Legg til diff --git a/vector/src/main/res/values-pl/strings.xml b/vector/src/main/res/values-pl/strings.xml index f69dc1d5d2..72c7faa1ca 100644 --- a/vector/src/main/res/values-pl/strings.xml +++ b/vector/src/main/res/values-pl/strings.xml @@ -1,5 +1,103 @@ + %1$s: %2$s + %1$s wysłał(a) zdjęcie. + + Zaproszenie od %s + %1$s zaprosił(a) %2$s + %1$s zaprosił(a) Cię + %1$s dołączył(a) + %1$s opuścił(a) + %1$s odrzucił(a) zaproszenie + %1$s wyrzucił(a) %2$s + %1$s odblokował(a) %2$s + %1$s zablokował(a) %2$s + %1$s zmienił(a) awatar + %1$s zmienił(a) wyświetlaną nazwę na %2$s + %1$s zmienił(a) wyświetlaną nazwę z %2$s na %3$s + %1$s usunął(-ęła) swoją wyświetlaną nazwę (%2$s) + %1$s zmienił(a) temat na: %2$s + Nie można wysłać wiadomości + + Przesyłanie zdjęcia nie powiodło się + + Błąd sieci + Błąd Matrixa + + Adres e-mail + Numer telefonu + + wszyscy członkowie pokoju. + wszyscy. + %1$s zmienił(a) nazwę pokoju na: %2$s + %s zakończył(a) rozmowę. + %1$s usunął(-ęła) nazwę pokoju + %1$s usunął(-ęła) temat pokoju + %1$s wysłał(a) naklejkę. + + %1$s włączył(a) szyfrowanie end-to-end (%2$s) + + %1$s wycofał(a) zaproszenie %2$s + %s odebrał(a) połączenie. + (awatar też został zmieniony) + + Zaproszenie od %s + Zaproszenie do pokoju + %1$s i %2$s + Pusty pokój + + + %1$s i jeden inny + %1$s i kilku innych + %1$s i %2$d innych + + + + ** Nie można odszyfrować: %s ** + %s wykonał(a) rozmowę wideo. + %s wykonał(a) połączenie głosowe. + %1$s uczynił(a) przyszłą historię pokoju widoczną dla %2$s + wszyscy członkowie pokoju, od momentu w którym zostali zaproszeni. + wszyscy członkowie pokoju, od momentu w którym dołączyli. + nieznane (%s). + %1$s zażądał(a) grupowego połączenia VoIP + Rozpoczęto grupowe połączenie głosowe VoIP + Zakończono grupowe połączenie głosowe VoIP + + %1$s zaktualizował swój profil %2$s + %1$s wysłał(a) zaproszenie do %2$s aby dołączył(a) do tego pokoju + %1$s zaakceptował(a) zaproszenie dla %2$s + + Urządzenie nadawcy nie wysłało nam kluczy do tej wiadomości. + + Nie można zredagować + Obecnie nie jest możliwe ponowne dołączenie do pustego pokoju. + + Wiadomość usunięta + Wiadomość usunięta przez %1$s + Wiadomość usunięta [powód: %1$s] + Wiadomość usunięta przez %1$s [powód: %2$s] + %s zakutalizował(a) ten pokój. + + Synchronizacja początkowa: +\nImportowanie konta… + Synchronizacja początkowa: +\nImportowanie kryptografii + Synchronizacja początkowa: +\nImportowanie Pokoi + Synchronizacja początkowa: +\nImportowanie dołączonych Pokoi + Synchronizacja początkowa: +\nImportowanie zaproszonych Pokoi + Synchronizacja początkowa: +\nImportowanie opuszczonych Pokoi + Synchronizacja początkowa: +\nImportowanie Społeczności + Synchronizacja początkowa: +\nImportowanie danych Konta + + Wysyłanie wiadomości… + Wyczyść kolejkę wysyłania Wiadomości Pokój Ustawienia @@ -65,7 +163,7 @@ Katalog użytkowników Tylko kontakty Matrixa Brak rozmów - Nie udzieliłeś(-aś) uprawnienia na dostęp do listy kontaktów + Nie udzieliłeś(-aś) uprawnienia na dostęp do listy kontaktów Brak wyników Pokoje Katalog pokojów @@ -181,11 +279,11 @@ Zrób zdjęcie lub nagraj film Nie można nagrać filmu Informacja - Element wymaga uprawnienia, aby wysyłać i zapisywać pliki multimedialne. + ${app_name} wymaga uprawnienia, aby wysyłać i zapisywać pliki multimedialne. Przyznaj dostęp w następnym oknie. - Element wymaga uprawnienia, aby wykonywać zdjęcia i nawiązywać połączenia wideo. - Element wymaga uprawnienia, aby przeprowadzić połączenie audio. + ${app_name} wymaga uprawnienia, aby wykonywać zdjęcia i nawiązywać połączenia wideo. + ${app_name} wymaga uprawnienia, aby przeprowadzić połączenie audio. Nie można wykonać operacji, ze względu na brak wymaganych uprawnień Zapisano Zapisać do pobranych? @@ -444,7 +542,7 @@ Zauważ, że ta czynność spowoduje ponowne uruchomienie aplikacji i może to t P O T Ę Ż N Y Jasny motyw Ciemny motyw - Czarny motyw + Czarny motyw Zadzwoń Awatar Powód: %1$s @@ -503,13 +601,13 @@ Możesz dodać adres e-mail do swojego profilu w ustawieniach. " \n \nZezwól na dostęp w następnym oknie aby móc wykonać połączenie." - Element wymaga dostępu do kamery i mikrofonu, aby przeprowadzać rozmowy wideo. + ${app_name} wymaga dostępu do kamery i mikrofonu, aby przeprowadzać rozmowy wideo. Przyznaj dostęp w następnym oknie. - Element może sprawdzić Twoją książkę adresową, aby znajdywać innych użytkowników Matrixa bazując na ich adresie e-mail i numerze telefonu. Jeśli zgadzasz się na udostępnienie Twojej książki adresowej w tym celu, zezwól na dostęp w następnym okienku. - Element wymaga dostępu do kontaktów, aby znajdywać innych użytkowników Matrixa bazując na adresie e-mail i numerze telefonu. + ${app_name} może sprawdzić Twoją książkę adresową, aby znajdywać innych użytkowników Matrixa bazując na ich adresie e-mail i numerze telefonu. Jeśli zgadzasz się na udostępnienie Twojej książki adresowej w tym celu, zezwól na dostęp w następnym okienku. + ${app_name} wymaga dostępu do kontaktów, aby znajdywać innych użytkowników Matrixa bazując na adresie e-mail i numerze telefonu. \n -\nZezwolić Element na dostęp do kontaktów\? +\nZezwolić ${app_name} na dostęp do kontaktów\? Lista uczestników Otwarty nagłówek Synchronizacja… @@ -618,7 +716,7 @@ Jesteś pewien? Poproś ponownie o klucze szyfrujące z innych Twoich sesji. Prośba o klucz wysłana. Prośba wysłana - Uruchom proszę Element na innym urządzeniu, które może odszyfrować wiadomość, aby wysłać klucze do tej sesji. + Uruchom proszę ${app_name} na innym urządzeniu, które może odszyfrować wiadomość, aby wysłać klucze do tej sesji. Prywatność powiadomień Standardowa Zmniejszona prywatność @@ -632,12 +730,12 @@ Jesteś pewien? Dezaktywuj konto Dezaktywuj moje konto Prywatność powiadomień - Element może działać w tle aby bezpiecznie i prywatnie zarządzać Twoimi powiadomieniami. To może mieć wpływ na zużycie baterii. + ${app_name} może działać w tle aby bezpiecznie i prywatnie zarządzać Twoimi powiadomieniami. To może mieć wpływ na zużycie baterii. Nadaj uprawnienie Wybierz inną opcję Wysyłaj dane analityczne - Element zbiera anonimowe informacje które pozwolą ulepszyć aplikację. - Włącz proszę dane analityczne, aby pomóc nam ulepszyć Element. + ${app_name} zbiera anonimowe informacje które pozwolą ulepszyć aplikację. + Włącz proszę dane analityczne, aby pomóc nam ulepszyć ${app_name}. Tak, chcę pomóc! Czy na pewno chcesz usunąć ten cel powiadomień? Aby móc stworzyć link do pokoju musi on mieć swój adres. @@ -774,7 +872,6 @@ Widoczność wiadomości w Matrix jest podobna do wiadomości e-mail. Nasze zapo Kliknij tutaj, aby zobaczyć starsze wiadomości Przepraszamy, wystąpił błąd - Motyw Status.im Z powodu braku uprawnień to działanie nie jest możliwe. Alerty systemowe Jeżeli to możliwe, proszę napisz opis w języku angielskim. @@ -855,7 +952,7 @@ Widoczność wiadomości w Matrix jest podobna do wiadomości e-mail. Nasze zapo %1$s: %2$s +%d %d+ - Użyj domyślnego dzwonka Element dla przychodzących połączeń + Użyj domyślnego dzwonka ${app_name} dla przychodzących połączeń Zadzwoń mimo to Połączenia Wyrzuć @@ -892,7 +989,7 @@ Widoczność wiadomości w Matrix jest podobna do wiadomości e-mail. Nasze zapo Sprawdź ustawienia systemowe. Powiadomienia są wyłączone dla twojego konta. Sprawdź ustawienia konta. - Powiadomienia nie są włączone dla tej sesji. Proszę sprawdź ustawienia Element. + Powiadomienia nie są włączone dla tej sesji. Proszę sprawdź ustawienia ${app_name}. Dodatkowe informacje: %s Wystąpił błąd podczas weryfikowania numeru telefonu. Wystąpił błąd podczas weryfikowania adresu e-mail. @@ -1143,21 +1240,21 @@ Spróbuj uruchomić ponownie aplikację. Niektóre rodzaje wiadomości będą ciche (wygenerują powiadomienie bez dźwięku). Nie udało się wczytać niestandardowych reguł, spróbuj ponowić. Weryfikacja Usług Google - Element używa Usług Google Play do dostarczania wiadomości push. Konfiguracja usług nie wydaje się być prawidłowa: + ${app_name} używa Usług Google Play do dostarczania wiadomości push. Konfiguracja usług nie wydaje się być prawidłowa: \n%1$s Otrzymano token FCM: \n%1$s Niepowodzenie przy pobieraniu tokena FCM: \n%1$s - [%1$s] -\nElement nie ma wpływu na wystąpienie tego problemu. Na tym urządzeniu nie ma konta Google. Otwórz menadżer kont i dodaj konto Google. + [%1$s] +\n${app_name} nie ma wpływu na wystąpienie tego problemu. Na tym urządzeniu nie ma konta Google. Otwórz menadżer kont i dodaj konto Google. Token FCM z powodzeniem zarejestrowany na serwerze domowym. Niepowodzenie przy rejestracji tokena FCM na serwerze domowym: \n%1$s Usługa została zatrzymana i automatycznie uruchomiona ponownie. Usługa nie uruchomiła się ponownie Usługa zostanie uruchomiona przy starcie urządzenia. - Usługa nie zostanie uruchomiona przy starcie urządzenia, nie otrzymasz żadnych powiadomień, dopóki Element nie zostanie uruchomiony. + Usługa nie zostanie uruchomiona przy starcie urządzenia, nie otrzymasz żadnych powiadomień, dopóki ${app_name} nie zostanie uruchomiony. Dla zwiększenia bezpieczeństwa, zalecamy aby wykonać ten krok osobiście lub przez inne zaufane środki komunikacji. Treść została zgłoszona. \n @@ -1174,24 +1271,24 @@ Spróbuj uruchomić ponownie aplikację. Wprowadź adres e-mail, aby możliwe było odzyskiwanie konta. Opcjonalnie użyj adresu e-mail lub numeru telefonu aby móc zostać odkrytym przez znajomych. Pozwól na awaryjny serwer wspomagania połączeń Użyje %s aby wspomagać gdy Twój serwer domowy takiego nie ofertuje (Twój adres IP będzie udostępniony podczas połączenia) - [%1$s] -\nBłąd jest poza kontrolą Element i nawiązując do Google sygnalizuje on, iż urządzenie posiada zbyt wiele aplikacji zarejestrowanych z FCM. Błąd występuje jedynie w przypadku posiadania skrajnie wielu aplikacji, w związku z czym nie powinno dotknąć to normalnego użytkownika. - [%1$s] -\nBłąd jest poza kontrolą Element. Może on występować z wielu powodów. Przypuszczalnie aplikacja powróci do normalnego stanu po spróbowaniu ponownie, chociaż można sprawdzić także w ustawieniach systemu uprawnienia Usług Google Play dotyczące dostępu do sieci, sprawdzić prawidłowość zegaru urządzenia lub też, może być to błąd niestandardowego oprogramowania systemowego. + [%1$s] +\nBłąd jest poza kontrolą ${app_name} i nawiązując do Google sygnalizuje on, iż urządzenie posiada zbyt wiele aplikacji zarejestrowanych z FCM. Błąd występuje jedynie w przypadku posiadania skrajnie wielu aplikacji, w związku z czym nie powinno dotknąć to normalnego użytkownika. + [%1$s] +\nBłąd jest poza kontrolą ${app_name}. Może on występować z wielu powodów. Przypuszczalnie aplikacja powróci do normalnego stanu po spróbowaniu ponownie, chociaż można sprawdzić także w ustawieniach systemu uprawnienia Usług Google Play dotyczące dostępu do sieci, sprawdzić prawidłowość zegaru urządzenia lub też, może być to błąd niestandardowego oprogramowania systemowego. Aktywuj uruchamianie przy starcie systemu - Restrykcje dotyczące działania aplikacji w tle są wyłączone dla Element. Test powinen zostać uruchomiony używając danych komórkowych (bez WIFI). + Restrykcje dotyczące działania aplikacji w tle są wyłączone dla ${app_name}. Test powinen zostać uruchomiony używając danych komórkowych (bez WIFI). \n%1$s - Restrykcje dotyczące działania aplikacji w tle są włączone dla Element. + Restrykcje dotyczące działania aplikacji w tle są włączone dla ${app_name}. \nPraca którą aplikacja próbuje wykonać będzie agresywnie ograniczona podczas działania w tle i może wpłynąć na wyświetlanie powiadomień. \n%1$s - Na Element nie ma wpływu Optymalizacja Baterii. + Na ${app_name} nie ma wpływu Optymalizacja Baterii. Jeżeli użytkownik pozostawi urządzenie odłączone od zasilania oraz nieużywane przez określony okres, z wyłączonym ekranem, urządzenie przejdzie w tryb Doze. Uniemożliwia to aplikacjom dostęp do sieci i opóźnia ich zadania, synchonizację oraz standardowe alarmy. Tryb synchronizacji w tle Zoptymalizowano dla baterii - Element będzie synchronizował się w tle w sposób który oszczędza limitowane zasoby urządzenia (baterię). + ${app_name} będzie synchronizował się w tle w sposób który oszczędza limitowane zasoby urządzenia (baterię). \nW zależności od stanu zasobów urządzenia, synchronizacja może być opóźniania przez system operacyjny. Zopytmalizowano dla działania w czasie rzeczywistym - Element będzie synchornizował się okresowo o ściśle określonym czasie (konfigurowalne). + ${app_name} będzie synchornizował się okresowo o ściśle określonym czasie (konfigurowalne). \nWpłynie to na użycie baterii i sieci, na panelu powiadomień pozostanie wyświetlone stałe powiadomiene o nasłuchiwaniu zdarzeń. Brak synchronizacji w tle Nie będziesz otrzymywać powiadomień o przychodzących wiadomościach gdy aplikacja będzie działać w tle. @@ -1208,8 +1305,8 @@ Spróbuj uruchomić ponownie aplikację. Przycisk enter na klawiaturze programowej wyśle wiadomość zamiast wprowadzania łamanania linii Znajdź Zarządzaj ustawieniami wyszukiwania. - Element potrzebuje utrzymać mało wpływowe połączenie w tle, w celu otrzymywania wiarygodnych powiadomień. -\nNa następnym ekranie zostanie się poproszonym o pozwolenie działania w tle dla Element, proszę zaakceptować. + ${app_name} potrzebuje utrzymać mało wpływowe połączenie w tle, w celu otrzymywania wiarygodnych powiadomień. +\nNa następnym ekranie zostanie się poproszonym o pozwolenie działania w tle dla ${app_name}, proszę zaakceptować. Tryb oszczędzania danych użyje filtra szczegółowego, w związku z czym aktualizacje o obecności i powiadomienia o pisaniu zostaną przefiltrowane. Media Domyślne źródło mediów @@ -1252,7 +1349,7 @@ Spróbuj uruchomić ponownie aplikację. Aby kontynuować, musisz zaakceptować Warunki użytkowania dla tej usługi. Nie znaleziono prawidłowej aplikacji Usługi Google Play. Powiadomienia mogą nie działać prawidłowo. Hasło jest zbyt słabe - Proszę usunąć hasło, jeżeli chcesz aby Element wygenerował klucz odzyskiwania. + Proszę usunąć hasło, jeżeli chcesz aby ${app_name} wygenerował klucz odzyskiwania. Brak dostępnych sesji Matrix Nie utrać zaszyfrowanych wiadomości Wiadomości w pokojach zaszyfrowanych są bezpieczne dzięki szyfrowaniu end-to-end. Jedynie Ty i Twój odbiorca posiadają klucze dla tych wiadomości. @@ -1315,7 +1412,7 @@ Spróbuj uruchomić ponownie aplikację. Nieprawidłowa odpowiedź funkcji autoodkrywania serwera domowego Opcje automatycznego uzupełniania serwerów - Element wykryło niestandardową konfigurację serwera dla Twojej domeny userID \"%1$s\": + ${app_name} wykryło niestandardową konfigurację serwera dla Twojej domeny userID \"%1$s\": \n%2$s Użyj Konfiguracji Zostałeś(-łaś) wylogowana ze względu na nieprawidłowe lub wygasłe dane logowania. @@ -1327,7 +1424,7 @@ Spróbuj uruchomić ponownie aplikację. Wyświetl żądanie Bezpieczne wiadomości od tego użytkownika są zabezpeiczone za pomocą szyfrowania end-to-end i są nie do odczytania przez osoby trzecie. Połączenie nie powiodło się z powodu niewłaściwie skonfigurowanego serwera - Nie możesz tego zrobić z mobilnej aplikacji Element + Nie możesz tego zrobić z mobilnej aplikacji ${app_name} Niektóre powiadomienia są wyłączone w osobistej konfiguracji. Usługi Google Play są aktualne. Automatycznie uruchom ponownie usługę powiadomień @@ -1352,7 +1449,7 @@ Spróbuj uruchomić ponownie aplikację. Twoje rozmowy bezpośrednie będą wyświetlane tutaj. Naciśnij przycisk + żeby rozpocząć nową. Twoje pokoje będą wyświetlane tutaj. Naciśnij przycisk +żeby znaleźć istniejące bądź utworzyć nowy. Nieprawidłowe zdarzenie, nie można wyświetlić - Podgląd globalnego, publicznego pokoju nie jest wciąż wspierany w Element + Podgląd globalnego, publicznego pokoju nie jest wciąż wspierany w ${app_name} Wystąpił błąd podczas otrzymywania zaufanych informacji Wystąpił błąd podczas uzyskiwania danych kluczy kopii zapasowej Importowanie kluczy E2E z pliku \"%1$s\". @@ -1422,7 +1519,7 @@ Spróbuj uruchomić ponownie aplikację. Zawartość została zgłoszona jako niewłaściwa. \n \nJeżeli nie chcesz widzieć treści od tego użytkownika, możesz go zablokować aby ukryć jego wiadomości. - Element potrzebuje uprawnień aby zapisywać klucze E2E na dysku. + ${app_name} potrzebuje uprawnień aby zapisywać klucze E2E na dysku. \n \nPozwól na dostęp w następnym oknie aby móc eksportować klucze ręcznie. Opuść pokój @@ -1458,7 +1555,6 @@ Spróbuj uruchomić ponownie aplikację. Adres Hosting premium dla organizacji Wprowadź adres Element Modular lub serwera którego chcesz użyć - Wprowadź adres serwera lub Element z którym chcesz się połączyć Wystąpił błąd podczas ładowania strony: %1$s (%2$d) Aplikacja nie jest w stanie zalogować się do tego serwera domowego. Serwer domowy obsluguje następujące metody logowania: %1$s. \n @@ -1558,7 +1654,7 @@ Spróbuj uruchomić ponownie aplikację. \nZaloguj się ponownie aby uzyskać dostęp do danych konta i wiadomości. Utracisz dostęp do zaszyfrowanych wiadomości do czasu, aż zalogujesz się aby odzyskać Twoje klucze szyfrujące. Wyczyść dane - Aktualna sesja jest dla użytkownika %1$s, podajesz natomiast dane dla użytkownika %2$s. Nie jest to wspierane przez Element. + Aktualna sesja jest dla użytkownika %1$s, podajesz natomiast dane dla użytkownika %2$s. Nie jest to wspierane przez ${app_name}. \nNa początku usuń dane, następnie zaloguj ponownie na innym koncie. Link matrix.to został zdeformowany Opis zbyt krótki @@ -1572,7 +1668,7 @@ Spróbuj uruchomić ponownie aplikację. Inne sesje Wyświetlanie jedynie początkowych wyników, wprowadź więcej znaków… Bezproblemowy - Element może zawieszać się częściej gdy napotka na niespodziewany błąd + ${app_name} może zawieszać się częściej gdy napotka na niespodziewany błąd Preparuje ¯\\_(ツ)_/¯ dla zwykłej wiadomości tekstowej Aktywuj szyfrowanie Odkąd zostanie włączone, szyfrowanie nie może zostać wyłączone. @@ -1637,9 +1733,9 @@ Spróbuj uruchomić ponownie aplikację. Moderator w %1$s Niestandardowy (%1$d) w %2$s Przeskocz do znacznika odczytania - Element nie obsługuje wydarzeń typu \'%1$s\' - Element nie obsługuje wiadomości typu \'%1$s\' - Element napotkał problem przy wyświetlaniu zawartości wydarzenia z ID \'%1$s\' + ${app_name} nie obsługuje wydarzeń typu \'%1$s\' + ${app_name} nie obsługuje wiadomości typu \'%1$s\' + ${app_name} napotkał problem przy wyświetlaniu zawartości wydarzenia z ID \'%1$s\' Nie ignoruj Sesja nie jest w stanie podzielić się weryfikacją z innymi sesjami. \nWeryfikacja zostanie zapisana lokalnie i udostępniona w przyszłych wersjach aplikacji. @@ -1775,7 +1871,7 @@ Spróbuj uruchomić ponownie aplikację. Przesłane pliki Prośby o klucze Odblokuj historię zaszyfrowanych wiadomości - Element Android + ${app_name} Android Odśwież Użyj tej sesji do weryfikacji nowej, nadając jej dostęp do zaszyfrowanych wiadomości. To nie ja @@ -1809,10 +1905,9 @@ Spróbuj uruchomić ponownie aplikację. Twoja książka telefoniczna jest pusta Dodaj z mojej książki telefonicznej Zapisz klucz odzyskiwania w - element - DOWIEDZ SIĘ WIĘCEJ - Jesteśmy podekscytowani mogąc oznajmić, że zmieniliśmy nazwę! Twoja aplikacja jest aktualna i jesteś zalogowany(-a) do swojego konta. - Riot nazywa się teraz Element! + DOWIEDZ SIĘ WIĘCEJ + Jesteśmy podekscytowani mogąc oznajmić, że zmieniliśmy nazwę! Twoja aplikacja jest aktualna i jesteś zalogowany(-a) do swojego konta. + Riot nazywa się teraz Element! Nie masz dostępu do tej wiadomości ponieważ nadawca celowo nie wysłał jej kluczy Nie masz dostępu do tej wiadomości ponieważ nadawca nie ufa Twojej sesji Nie masz dostępu do tej wiadomości ponieważ zostałeś zablokowany przez jej nadawcę @@ -1845,11 +1940,11 @@ Spróbuj uruchomić ponownie aplikację. Użyj %1$s Użyj %1$s albo %2$s aby kontynuować. Dostępne tylko w pokojach szyfrowanych - Skorzystaj z najnowszych aplikacji Element na innych urządzeniach: - Element iOS -\nElement Android - Element Web -\nElement Desktop + Skorzystaj z najnowszych aplikacji ${app_name} na innych urządzeniach: + ${app_name} iOS +\n${app_name} Android + ${app_name} Web +\n${app_name} Desktop Ustaw nowe hasło do konta… Nie można zapisać pliku multimediów Nie można dodać pliku multimediów do galerii @@ -2173,12 +2268,11 @@ Spróbuj uruchomić ponownie aplikację. Wykorzystaj ten %1$s jako zabezpieczenie na wypadek utraty %2$s. Konfigurowanie odzyskiwania. Nie zweryfikujesz %1$s (%2$s) jeżeli przerwiesz w tym momencie. Zacznij ponownie w ich profilu użytkownika. - ROZUMIEM + ROZUMIEM Zapisz swój Klucz Bezpieczeństwa Fraza Bezpieczeństwa Ustaw Frazę Bezpieczeństwa Wybierz nazwę użytkownika. - Przepraszamy, ta operacja nie jest jeszcze dostępna dla kont wykorzystujących Single Sign-On. Oznacz jako Zaufane Potwierdź swoją tożsamość poprzez zweryfikowanie tego logowania aby uzyskać dostęp do zaszyfrowanych wiadomości. Potwierdź swoją tożsamość poprzez zweryfikowanie tego logowania przy pomocy którejś z pozostałych sesji w celu przyznania dostępu do zaszyfrowanych wiadomości. @@ -2219,7 +2313,7 @@ Spróbuj uruchomić ponownie aplikację. Czy chcesz się zdegradować\? Zezwól na dostęp do Twoich kontaktów. Wybierz urządzenie dźwiękowe - Połączenie Element nieudane + Połączenie ${app_name} nieudane Zrezygnuj Rozpocznij konwersację Łącze Matrix @@ -2235,13 +2329,13 @@ Spróbuj uruchomić ponownie aplikację. Potwierdź PIN aby zablokować kod PIN Zmień swój bieżący kod PIN Zmień kod PIN - Kod PIN jest wymagany za każdym razem kiedy otwierasz Element. - Kod PIN jest wymagany po dwóch minutach nieużywania Element. + Kod PIN jest wymagany za każdym razem kiedy otwierasz ${app_name}. + Kod PIN jest wymagany po dwóch minutach nieużywania ${app_name}. Wymagaj kodu PIN po upływie dwóch minut Wyświetlaj tylko liczbę nieprzeczytanych wiadomości w prostym powiadomieniu. Pokazuj szczegóły takie jak nazwa pokoju lub treść wiadomości. Pokazuj treść w powiadomieniach - Kod PIN jest jedynym sposobem na odblokowanie Element. + Kod PIN jest jedynym sposobem na odblokowanie ${app_name}. Włącz specyficzne dla urządzenia funkcje biometryczne takie jak czytnik odcisków palców bądź rozpoznawanie twarzy. Włącz biometrię Jeżeli chcesz zresetować kod PIN, naciśnij Zapomnij kod PIN aby wylogować i zresetować. @@ -2271,11 +2365,11 @@ Spróbuj uruchomić ponownie aplikację. Użytkownik nie udzielił zgody. Obecnie brak powiązania z tym identyfikatorem. Powiązanie nieudane. - W trosce o Twoją prywatność, Element obsługuje jedynie wysłanie skrótów (hash) adresów e-mail oraz numerów telefonu. + W trosce o Twoją prywatność, ${app_name} obsługuje jedynie wysłanie skrótów (hash) adresów e-mail oraz numerów telefonu. Zaakceptuj najpierw reguły serwera tożsamości w ustawieniach. Najpierw skonfiguruj serwer tożsamości. Ta operacja nie jest możliwa. Ten serwer domowy jest przestarzały. - Ten serwer tożsamości jest przestarzały. Element obsługuje jedynie API V2. + Ten serwer tożsamości jest przestarzały. ${app_name} obsługuje jedynie API V2. Rozłączyć z serwerem tożsamości %s\? Otwórz warunki %s Ładowanie dostępnych języków… @@ -2295,8 +2389,8 @@ Spróbuj uruchomić ponownie aplikację. To nie jest prawidłowy kod QR Matrix Zaproszenia wysłane do %1$s i %2$s Zaproszenie wysłane do %1$s - 🔐️ Dołącz do mnie na Element - Cześć, pogadaj ze mną na Element: %s + 🔐️ Dołącz do mnie na ${app_name} + Cześć, pogadaj ze mną na ${app_name}: %s Zaproś przyjaciół Zaproś użytkowników Zapraszanie użytkowników… diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index cb34acd429..d346cbff34 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -1,5 +1,275 @@ + %1$s: %2$s + %1$s enviou uma foto. + convite de %s + %1$s convidou %2$s + %1$s convidou você + %1$s entrou na sala + %1$s saiu da sala + %1$s recusou o convite + %1$s removeu %2$s + %1$s removeu o banimento de %2$s + %1$s baniu %2$s + %1$s desfez o convite a %2$s + %1$s alterou a foto de perfil + %1$s definiu o nome e sobrenome como %2$s + %1$s alterou o nome e sobrenome de %2$s para %3$s + %1$s removeu o nome e sobrenome (era %2$s) + %1$s alterou a descrição para: %2$s + %1$s alterou o nome da sala para: %2$s + %s iniciou uma chamada de vídeo. + %s iniciou uma chamada de voz. + %s aceitou a chamada. + %s encerrou a chamada. + %1$s deixou o histórico futuro da sala visível para %2$s + todos os participantes da sala, a partir do momento em que foram convidados. + todos os participantes da sala, a partir do momento em que entraram nela. + todos os participantes da sala. + qualquer pessoa. + desconhecido (%s). + %1$s ativou a criptografia de ponta a ponta (%2$s) + %1$s deseja iniciar uma chamada em grupo + Chamada em grupo iniciada + Chamada em grupo encerrada + (a foto de perfil também foi alterada) + %1$s removeu o nome da sala + %1$s removeu a descrição da sala + %1$s atualizou o perfil %2$s + %1$s enviou um convite para %2$s entrar na sala + %1$s aceitou o convite para %2$s + ** Não foi possível descriptografar: %s ** + O aparelho do remetente não nos enviou as chaves para esta mensagem. + + Não foi possível redigir + Não foi possível enviar a mensagem + O envio da imagem falhou + + Erro de conexão à internet + Erro no servidor Matrix + + + + + Atualmente, não é possível entrar novamente em uma sala vazia. + + Endereço de e-mail + Número de telefone + %1$s enviou uma figurinha. + + Convite de %s + Convite para sala + %1$s e %2$s + Sala vazia + + %1$s e 1 outro + %1$s e %2$d outros + + Você enviou uma foto. + Você enviou uma figurinha. + Seu convite + %1$s criou a sala + Você criou a sala + Você convidou %1$s + Você entrou na sala + Você saiu da sala + Você recusou o convite + Você removeu %1$s + Você removeu o banimento de %1$s + Você baniu %1$s + Você desfez o convite a %1$s + Você alterou a sua foto de perfil + Você definiu o seu nome e sobrenome como %1$s + Você alterou o seu nome e sobrenome de %1$s para %2$s + Você removeu o seu nome e sobrenome (era %1$s) + Você alterou a descrição para: %1$s + %1$s alterou a foto da sala + Você alterou a foto da sala + Você alterou o nome da sala para: %1$s + Você iniciou uma chamada de vídeo. + Você iniciou uma chamada de voz. + %s enviou dados para configurar a chamada. + Você enviou dados para configurar a chamada. + Você aceitou a chamada. + Você encerrou a chamada. + Você deixou o histórico futuro da sala visível para %1$s + Você ativou a criptografia de ponta a ponta (%1$s) + %s atualizou esta sala. + Você atualizou esta sala. + Você solicitou uma chamada em grupo + Você removeu o nome da sala + Você removeu a descrição da sala + %1$s removeu a foto da sala + Você removeu a foto da sala + Mensagem apagada + Mensagem apagada por %1$s + Mensagem apagada [motivo: %1$s] + Mensagem apagada por %1$s [motivo: %2$s] + Você atualizou o seu perfil %1$s + Você enviou um convite para %1$s entrar na sala + %1$s cancelou o convite a %2$s para entrar na sala + Você cancelou o convite a %1$s para entrar na sala + Você aceitou o convite para %1$s + %1$s adicionou o widget %2$s + Você adicionou o widget %1$s + %1$s removeu o widget %2$s + Você removeu o widget %1$s + %1$s editou o widget %2$s + Você editou o widget %1$s + Administrador + Moderador + Padrão + Personalizado (%1$d) + Personalizado + Você alterou o nível de permissão de %1$s. + %1$s alterou o nível de permissão de %2$s. + %1$s de %2$s para %3$s + Primeira sincronização: +\nImportando a conta… + Primeira sincronização: +\nImportando as chaves de criptografia + Primeira sincronização: +\nImportando as salas + Primeira sincronização: +\nImportando as salas em que você entrou + Primeira sincronização: +\nImportando as salas em que você foi convidado + Primeira sincronização: +\nImportando as salas em que você saiu + Primeira sincronização: +\nImportando as comunidades + Primeira sincronização: +\nImportando os dados da conta + Enviando mensagem… + Limpar a fila de envio + Convite de %1$s. Motivo: %2$s + O seu convite. Motivo: %1$s + %1$s convidou %2$s. Motivo: %3$s + Você convidou %1$s. Motivo: %2$s + %1$s convidou você. Motivo: %2$s + %1$s entrou na sala. Motivo: %2$s + Você entrou na sala. Motivo: %1$s + %1$s saiu da sala. Motivo: %2$s + Você saiu da sala. Motivo: %1$s + %1$s recusou o convite. Motivo: %2$s + Você recusou o convite. Motivo: %1$s + %1$s removeu %2$s. Motivo: %3$s + Você removeu %1$s. Motivo: %2$s + %1$s removeu o banimento de %2$s. Motivo: %3$s + Você removeu o banimento de %1$s. Motivo: %2$s + %1$s baniu %2$s. Motivo: %3$s + Você baniu %1$s. Motivo: %2$s + %1$s enviou um convite para %2$s entrar na sala. Motivo: %3$s + Você enviou um convite para %1$s entrar na sala. Motivo: %2$s + %1$s revogou o convite para %2$s entrar na sala. Motivo: %3$s + Você revogou o convite para %1$s entrar na sala. Motivo: %2$s + %1$s aceitou o convite para %2$s. Motivo: %3$s + Você aceitou o convite para %1$s. Motivo: %2$s + %1$s desfez o convite de %2$s. Motivo: %3$s + Você desfez o convite de %1$s. Motivo: %2$s + + %1$s adicionou %2$s como um endereço desta sala. + %1$s adicionou %2$s como endereços desta sala. + + + Você adicionou %1$s como um endereço desta sala. + Você adicionou %1$s como endereços desta sala. + + + %1$s removeu %2$s como um endereço desta sala. + %1$s removeu %2$s como endereços desta sala. + + + Você removeu %1$s como um endereço desta sala. + Você removeu %1$s como endereços desta sala. + + %1$s adicionou %2$s e removeu %3$s como endereços desta sala. + Você adicionou %1$s e removeu %2$s como endereços desta sala. + %1$s definiu o endereço principal desta sala como %2$s. + Você definiu o endereço principal desta sala como %1$s. + %1$s removeu o endereço principal desta sala. + Você removeu o endereço principal desta sala. + %1$s permitiu que convidados entrem na sala. + Você permitiu que convidados entrem na sala. + %1$s impediu que convidados entrassem na sala. + Você impediu que convidados entrassem na sala. + %1$s ativou a criptografia de ponta a ponta. + Você ativou a criptografia de ponta a ponta. + %1$s ativou a criptografia de ponta a ponta (algoritmo não reconhecido %2$s). + Você ativou a criptografia de ponta a ponta (algoritmo não reconhecido %1$s). + Você impediu que desconhecidos entrem na sala. + %1$s impediu que desconhecidos entrem na sala. + Você permitiu que desconhecidos entrem aqui. + %1$s permitiu que desconhecidos entrem aqui. + Você saiu. Motivo: %1$s + %1$s saiu. Motivo: %2$s + Você entrou. Motivo: %1$s + %1$s entrou. Motivo: %2$s + Você cancelou o convite para %1$s + %1$s cancelou o convite para %2$s + Você convidou %1$s + %1$s convidou %2$s + Você atualizou esta sala. + %s atualizou esta sala. + Você definiu que as mensagens enviadas a partir do presente momento estarão disponíveis para %1$s + %1$s definiu que as mensagens enviadas a partir do presente momento estarão disponíveis para %2$s + Você saiu da sala + %1$s saiu da sala + Você entrou + %1$s entrou + Você criou a sala + %1$s criou a sala + Sala vazia (era %s) + + %1$s, %2$s, %3$s e %4$d outro + %1$s, %2$s, %3$s e %4$d outros + + %1$s, %2$s, %3$s e %4$s + %1$s, %2$s e %3$s + 🎉 Todos os servidores estão proibidos de participar! Esta sala não pode mais ser usada. + Nenhuma alteração. + • Servidores correspondentes aos IP literais agora estão banidos. + • Servidores correspondentes aos IP literais agora estão permitidos. + • Servidores correspondentes à %s foram removidos da lista de permitidos. + • Servidores correspondentes à %s agora são permitidos. + • Servidores correspondente à %s foram removidos da lista de banidos. + • Servidores correspondentes à %s foram banidos. + Você alterou a lista de controle de acesso (ACL) do servidor para esta sala. + %s alterou a lista de controle de acesso (ACL) do servidor para esta sala. + • Servidores correspondentes aos IP literais estão banidos. + • Servidores correspondentes aos IP literais estão permitidos. + • Servidores correspondentes à %s estão permitidos. + • Servidores correspondentes à %s estão banidos. + Você definiu a lista de controle de acesso (ACL) do servidor para esta sala. + %s definiu a lista de controle de acesso (ACL) do servidor para esta sala. + Você alterou os endereços alternativos desta sala. + %1$s alterou os endereços alternativos desta sala. + + Você removeu o endereço alternativo %1$s para esta sala. + Você removeu os endereços alternativos %1$s para esta sala. + + + %1$s removeu o endereço alternativo %2$s para esta sala. + %1$s removeu os endereços alternativos %2$s para esta sala. + + + Você adicionou o endereço alternativo %1$s para esta sala. + Você adicionou os endereços alternativos %1$s para esta sala. + + + %1$s adicionou o endereço alternativo %2$s para esta sala. + %1$s adicionou os endereços alternativos %2$s para esta sala. + + Você alterou os endereços desta sala. + %1$s alterou os endereços desta sala. + Você alterou os endereços principal e alternativos desta sala. + %1$s alterou os endereços principal e alternativos desta sala. + Você modificou a chamada de vídeo + Chamada de vídeo modificada por %1$s + Você encerrou a chamada de vídeo + Chamada de vídeo encerrada por %1$s + Você começou uma chamada de vídeo + Chamada de vídeo iniciada por %1$s Mensagens Sala @@ -74,7 +344,7 @@ Agenda de endereços local Apenas contatos na Matrix Nenhuma conversa - Você não permitiu que o Element acesse seus contatos locais + Você não permitiu que o ${app_name} acesse seus contatos locais Nenhum resultado Salas @@ -214,22 +484,22 @@ Não é possível gravar vídeo Informação - Element precisa de permissão para acessar sua galeria de fotos e vídeos para enviar e salvar anexos. + ${app_name} precisa de permissão para acessar sua galeria de fotos e vídeos para enviar e salvar anexos. \n \nPor favor, permita o acesso na próxima tela para poder enviar arquivos do seu celular. - Element necessita permissão para acessar sua câmera para poder tirar fotos e fazer chamadas de vídeo. + ${app_name} necessita permissão para acessar sua câmera para poder tirar fotos e fazer chamadas de vídeo. " \n \nPor favor, permita o acesso na próxima tela para fazer a chamada." - Element necessita permissão para acessar seu microfone para realizar chamadas de áudio. + ${app_name} necessita permissão para acessar seu microfone para realizar chamadas de áudio. " \n \nPor favor, permita o acesso na próxima tela para fazer a chamada." - Element necessita permissão para acessar sua câmera e seu microfone para fazer chamadas de vídeo. + ${app_name} necessita permissão para acessar sua câmera e seu microfone para fazer chamadas de vídeo. \n \nPor favor, permita o acesso na próxima tela para fazer a chamada. - Element precisa de permissão para acessar os seus contatos para poder encontrar outros usuários a partir de seus e-mails e números de telefone. Se você concordar em usar a sua lista de contatos para esse propósito, permita o acesso na próxima janela pop-up. - Element precisa de permissão para acessar os seus contatos para poder encontrar outros usuários a partir de seus e-mails e números de telefone. + ${app_name} precisa de permissão para acessar os seus contatos para poder encontrar outros usuários a partir de seus e-mails e números de telefone. Se você concordar em usar a sua lista de contatos para esse propósito, permita o acesso na próxima janela pop-up. + ${app_name} precisa de permissão para acessar os seus contatos para poder encontrar outros usuários a partir de seus e-mails e números de telefone. \n \nVocê concorda em usar a sua lista de contatos para esse propósito\? Desculpe. A ação não foi realizada, por falta de permissão @@ -601,7 +871,7 @@ Gigantesco Tema claro Tema escuro - Tema preto + Tema preto Sincronizando… Escutando eventos Notificações com som @@ -766,7 +1036,7 @@ Solicitar novamente as chaves de criptografia das suas outras sessões.Pedir novamente as chaves de criptografia de seus outros dispositivos. Requisição de chave enviada. Requisição enviada - Por favor, inicie o Element em outro aparelho que possa descriptografar a mensagem, de modo que ele possa enviar as chaves para esta sessão. + Por favor, inicie o ${app_name} em outro aparelho que possa descriptografar a mensagem, de modo que ele possa enviar as chaves para esta sessão. %ds %ds @@ -804,12 +1074,12 @@ Desativar minha conta Desativar minha conta Privacidade das notificações - Element pode funcionar em segundo plano para gerenciar as suas notificações de forma segura e confidencial. Isso poderá impactar o uso da bateria. + ${app_name} pode funcionar em segundo plano para gerenciar as suas notificações de forma segura e confidencial. Isso poderá impactar o uso da bateria. Conceder a permissão Escolha outra opção Enviar dados de uso - Element coleta dados de uso anônimos para nos ajudar a melhorar o aplicativo. - Por favor, ative o envio de dados de uso para nos ajudar a melhorar o Element. + ${app_name} coleta dados de uso anônimos para nos ajudar a melhorar o aplicativo. + Por favor, ative o envio de dados de uso para nos ajudar a melhorar o ${app_name}. Sim, eu quero ajudar! Você não faz parte de alguma comunidade, no momento. Escreva aqui… @@ -864,12 +1134,11 @@ Por favor, %s para que este limite seja aumentado. Por favor, %s para seguir usando este serviço. Crie uma frase secreta para criptografar as chaves exportadas. Você precisará inserir essa frase secreta para importar chaves criptografadas. - Tema Status.im Aceitar Erro Por favor, revise e aceite as políticas deste servidor local: Chamadas - Use o toque padrão do Element para chamadas recebidas + Use o toque padrão do ${app_name} para chamadas recebidas Toque de chamadas recebidas Selecione o toque de chamadas: Motivo @@ -894,12 +1163,12 @@ Configurações da sessão Notificações estão ativadas nesta sessão. Remover da sala - Notificações não estão ativadas nesta sessão. -\nPor favor, revise as configurações do Element. + Notificações não estão ativadas nesta sessão. +\nPor favor, revise as configurações do ${app_name}. Ativar Versão do Google Play Services Google Play Services APK está disponível e atualizado. - Element usa Google Play Services para entregar mensagens push, mas isto não parece estar configurado corretamente: + ${app_name} usa Google Play Services para entregar mensagens push, mas isto não parece estar configurado corretamente: \n%1$s Consertar Play Services Token do Firebase @@ -921,11 +1190,11 @@ Falha ao reiniciar Serviço Começar na inicialização O serviço iniciará quando o aparelho for reiniciado. - O serviço não iniciará enquanto o aparelho não for reiniciado. Você não receberá notificações até que o Element for aberto ao menos uma vez. + O serviço não iniciará enquanto o aparelho não for reiniciado. Você não receberá notificações até que o ${app_name} for aberto ao menos uma vez. Iniciar com o sistema Revisar restrições de segundo plano Otimização de bateria - Element não é afetado pela Otimização de Bateria. + ${app_name} não é afetado pela Otimização de Bateria. Reinicialização Automática do Serviço de Notificações Desativar restrições Ignorar a otimização @@ -939,11 +1208,11 @@ Mostrar eventos da conta Mostrar alterações de foto de perfil e de nome e sobrenome. Conexão em segundo plano - Element precisa manter um baixo impacto na conexão em segundo plano para ter notificações confiáveis. -\nNa próxima tela, você será solicitado a permitir que o Element funcione sempre em segundo plano. Por favor, aceite. - Restrições de segundo plano estão desativadas para o Element. Este teste deve ser realizado usando dados móveis (sem Wi-Fi). + ${app_name} precisa manter um baixo impacto na conexão em segundo plano para ter notificações confiáveis. +\nNa próxima tela, você será solicitado a permitir que o ${app_name} funcione sempre em segundo plano. Por favor, aceite. + Restrições de segundo plano estão desativadas para o ${app_name}. Este teste deve ser realizado usando dados móveis (sem Wi-Fi). \n%1$s - Restrições em segundo plano estão ativadas para o Element. + Restrições em segundo plano estão ativadas para o ${app_name}. \nO aplicativo funciona bastante restringido enquanto está em segundo plano, o que pode afetar as notificações. \n%1$s Formatação de texto @@ -1002,17 +1271,17 @@ Algumas notificações estão desativadas nas suas configurações personalizadas. Falha ao carregar regras personalizadas, tente novamente. Verifique as configurações - [%1$s] -\nEste erro está fora do controle do Element e, de acordo com o Google, esse erro indica que o aparelho tem muitos aplicativos registrados com FCM. O erro só ocorre nos casos em que há números extremos de aplicativos, portanto, isso não deve afetar o usuário comum. + [%1$s] +\nEste erro está fora do controle do ${app_name} e, de acordo com o Google, esse erro indica que o aparelho tem muitos aplicativos registrados com FCM. O erro só ocorre nos casos em que há números extremos de aplicativos, portanto, isso não deve afetar o usuário comum. Bloquear Entre com o login único Este endereço não está acessível. Por favor, verifique-o Seu aparelho está usando um protocolo de segurança TLS desatualizado, vulnerável a ataques. Para sua segurança, você não poderá se conectar - [%1$s] -\nEste erro está fora de controle da Element. Isso pode ocorrer por vários motivos. Talvez funcione se você tentar novamente mais tarde. Você também pode verificar se o uso de dados do Google Play Service está restrito nas configurações do sistema, ou se o relógio do seu aparelho está correto. O erro também pode ocorrer em ROMs personalizadas. + [%1$s] +\nEste erro está fora de controle da ${app_name}. Isso pode ocorrer por vários motivos. Talvez funcione se você tentar novamente mais tarde. Você também pode verificar se o uso de dados do Google Play Service está restrito nas configurações do sistema, ou se o relógio do seu aparelho está correto. O erro também pode ocorrer em ROMs personalizadas. Iniciando o serviço - [%1$s] -\nEste erro está fora de controle do Element. Não há conta do Google no celular. Por favor, abra o gerenciador de contas e adicione uma conta do Google. + [%1$s] +\nEste erro está fora de controle do ${app_name}. Não há conta do Google no celular. Por favor, abra o gerenciador de contas e adicione uma conta do Google. Adicionar Conta Configurar notificações com som Configurar notificações de chamada @@ -1040,7 +1309,7 @@ \nAlternativamente, você pode tentar usar o servidor público em %2$s. No entanto, ele não é tão confiável e compartilhará o seu IP com esse servidor. Você também pode configurar isso nas Configurações. Tente usar %s Não pergunte novamente - A chamada falhou + A chamada falhou Falha ao estabelecer conexão em tempo real. \nPor favor, peça ao administrador do seu servidor para configurar um servidor TURN, de modo que as chamadas funcionem de maneira estável. Selecione a caixa de som @@ -1088,18 +1357,18 @@ Remover banimento do usuário Remover o banimento do usuário permitirá que ele entre novamente na sala. Confirme sua senha - Não pode fazer isto pelo Element app + Não pode fazer isto pelo ${app_name} app Autenticação exigida O aplicativo não precisa de se conectar ao servidor em segundo plano, isto deve reduzir a utilização da bateria Sincronização em segundo plano Optimizado para bateria - Element sincronizará em segundo plano para preservar os recursos limitados do aparelho (bateria). + ${app_name} sincronizará em segundo plano para preservar os recursos limitados do aparelho (bateria). \nDependendo do estado dos recursos do seu aparelho, a sincronização pode ser adiada pelo sistema operacional. Optimizado em tempo real - O Element sincronizará periodicamente em segundo plano, no momento estabelecido (configurável). -\nIsso afetará o uso de dados e da bateria. Haverá uma notificação permanente informando que o Element está sincronizando. + O ${app_name} sincronizará periodicamente em segundo plano, no momento estabelecido (configurável). +\nIsso afetará o uso de dados e da bateria. Haverá uma notificação permanente informando que o ${app_name} está sincronizando. Sem sincronização em segundo plano - Você não será notificado sobre mensagens recebidas quando o Element estiver em segundo plano. + Você não será notificado sobre mensagens recebidas quando o ${app_name} estiver em segundo plano. Não foi possível actualizar a configuração. Intervalo de sincronização preferido %s @@ -1201,7 +1470,7 @@ Digite o nome de usuário. Digite a sua frase secreta A frase secreta é muito fraca - Por favor, apague a frase secreta se desejar que o Element gere uma chave de recuperação. + Por favor, apague a frase secreta se desejar que o ${app_name} gere uma chave de recuperação. Nenhuma sessão Matrix disponível Nunca perca mensagens criptografadas As mensagens em salas criptografadas são protegidas com a criptografia de ponta a ponta. Somente você e o(s) destinatário(s) têm as chaves para ler essas mensagens. @@ -1315,7 +1584,7 @@ Algoritmo Resposta de descoberta inválida no servidor local Completar Automaticamente as Opções do Servidor - Element detectou uma configuração personalizada do servidor para a sua ID de usuário \"%1$s\": + ${app_name} detectou uma configuração personalizada do servidor para a sua ID de usuário \"%1$s\": \n%2$s Usar a Configuração Você foi desligado devido as credenciais inválidas ou caducadas. @@ -1393,7 +1662,7 @@ Por favor, aguarde… Todas as comunidades Esta sala não pode ser visualizada - A visualização da sala global ainda não é suportada por Element + A visualização da sala global ainda não é suportada por ${app_name} Salas Conversas Nova Sala @@ -1541,7 +1810,7 @@ Este conteúdo foi relatado como inadequado. \n \nSe você não quiser ver mais mensagens deste usuário, você pode bloqueá-lo para esconder suas mensagens. - Element precisa de permissão para salvar suas chaves E2E no aparelho. + ${app_name} precisa de permissão para salvar suas chaves E2E no aparelho. \n \nPermita o acesso na próxima janela para poder exportar suas chaves manualmente. Não há conexão de rede no momento @@ -1590,7 +1859,6 @@ Endereço Hospedagem Premium para organizações Digite o endereço de Element Modular ou Servidor que você deseja usar - Digite o endereço do Servidor ou o servidor do Element que você quer entrar Digite o endereço do servidor que você deseja usar Ocorreu um erro ao carregar a página: %1$s (%2$d) O aplicativo não pode entrar neste servidor. O servidor suporta os seguintes tipos de login: %1$s. @@ -1699,7 +1967,7 @@ \nEntre novamente para acessar os dados e mensagens da sua conta. Você perderá o acesso as mensagens seguras a menos que você faça login para recuperar suas chaves de criptografia. Limpar dados - A sessão atual é para o usuário %1$s e você fornece credenciais para o usuário %2$s. Isto não é suportado no Element. + A sessão atual é para o usuário %1$s e você fornece credenciais para o usuário %2$s. Isto não é suportado no ${app_name}. \nPor favor, limpe os dados do aplicativo, depois faça o login novamente em outra conta. Seu link do matrix.to foi malformado A descrição é curta demais @@ -1717,7 +1985,7 @@ Outras sessões Mostrando apenas os primeiros resultados, digite mais letras… Relatar imediatamente as falhas - Element poderá quebrar com mais frequência quando ocorrer um erro inesperado + ${app_name} poderá quebrar com mais frequência quando ocorrer um erro inesperado Adiciona ¯\\_(ツ)_/¯ a uma mensagem de texto Ativar criptografia Uma vez ativada, a criptografia não poderá ser desativada. @@ -1791,9 +2059,9 @@ Padrão em %1$s Personalizado (%1$d) em %2$s Ir para a confirmação de leitura - Element não lida com eventos do tipo \'%1$s\' - Element não lida com mensagens do tipo \'%1$s\' - Element encontrou um problema ao render o conteúdo de um evento com \'%1$s\' ID + ${app_name} não lida com eventos do tipo \'%1$s\' + ${app_name} não lida com mensagens do tipo \'%1$s\' + ${app_name} encontrou um problema ao render o conteúdo de um evento com \'%1$s\' ID Desbloquear Esta sessão não pode compartilhar essa confirmação com suas outras sessões. \nA confirmação será salvada localmente e será compartilhada em uma versão futura do aplicativo. @@ -1889,7 +2157,7 @@ Evento apagado pelo usuário, motivo: %1$s Evento moderado pelo administrador da sala, motivo: %1$s As chaves já estão atualizadas! - Element para Android + ${app_name} para Android A chave pede Desbloquear histórico de mensagens criptografadas Recarregar @@ -1998,13 +2266,13 @@ Não foi possível adicionar o arquivo de mídia à Galeria Não foi possível salvar o arquivo de mídia Definir uma nova senha da conta… - Use o Element mais recente em seus outros aparelhos: Element Web, Element para Computador, Element para iOS, Element para Android, ou outro cliente Matrix capaz de fazer autoverificação - Element Web -\nElement para Computador - Element para iOS -\nElement para Android + Use o ${app_name} mais recente em seus outros aparelhos: ${app_name} Web, ${app_name} para Computador, ${app_name} para iOS, ${app_name} para Android, ou outro cliente Matrix capaz de fazer autoverificação + ${app_name} Web +\n${app_name} para Computador + ${app_name} para iOS +\n${app_name} para Android ou outro cliente da Matrix capaz de fazer autoverificação - Use o Element mais recente em seus outros aparelhos: + Use o ${app_name} mais recente em seus outros aparelhos: Força a atual sessão da comunidade em uma sala criptografada a ser descartada Só é suportado em salas criptografadas Use seu %1$s ou %2$s para continuar. @@ -2037,7 +2305,7 @@ Convites enviados para %1$s e %2$s Convites enviados para %1$s e mais um - Convites enviados para %1$s e %2$s e mais + Convites enviados para %1$s e %2$d mais Não foi possível convidar os usuários. Por favor, verifique os usuários que você deseja convidar e tente novamente. Idioma atual @@ -2045,11 +2313,11 @@ Carregando os idiomas disponíveis… Abra termos de %s Desconectar-se do servidor de identidade %s\? - Este servidor de identidade está desatualizado. Element suporta apenas API V2. + Este servidor de identidade está desatualizado. ${app_name} suporta apenas API V2. Esta operação não é possível. O servidor doméstico está desatualizado. Por favor, primeiro configure um servidor de identidade. Por favor, primeiro aceite os termos do servidor de identidade nas configurações. - Pela sua privacidade, Element apenas suporta o envio dos e-mails e números de telefone de usuários em hash. + Pela sua privacidade, ${app_name} apenas suporta o envio dos e-mails e números de telefone de usuários em hash. A associação falhou. Não há nenhuma associação atual com este identificador. Seu servidor doméstico (%1$s) propõe o uso de %2$s para seu servidor de identidade @@ -2091,11 +2359,10 @@ Você não pode acessar esta mensagem porque a sessão não foi definida como confiável pelo remetente Você não pode acessar esta mensagem porque o remetente intencionalmente não enviou as chaves Aguardando o histórico de criptografia - Riot agora é Element! - Estamos felizes em anunciar que mudamos de nome! Seu aplicativo está atualizado e você está conectado à sua conta. - OK, ENTENDI - APRENDA MAIS - Element + Riot agora é Element! + Estamos felizes em anunciar que mudamos de nome! Seu aplicativo está atualizado e você está conectado à sua conta. + OK, ENTENDI + APRENDA MAIS Salvar chave de recuperação em Adicionar da minha lista de contatos Sua lista de contatos está vazia @@ -2180,14 +2447,13 @@ Remover os dados de %1$s desta conta\? \n \nProssiga com cuidado, pois não há como reverter esta escolha. - Desculpe, esta funcionalidade ainda não está disponível para contas conectadas via acesso único. - O código PIN é solicitado todas as vezes que você abre o Element. - O código PIN é solicitado após 2 minutos sem usar o Element. + O código PIN é solicitado todas as vezes que você abre o ${app_name}. + O código PIN é solicitado após 2 minutos sem usar o ${app_name}. Solicitar o PIN depois de 2 minutos Exibir apenas o número de mensagens não lidas em uma notificação. Exibir o nome das salas e o conteúdo das mensagens. Exibir o conteúdo das mensagens nas notificações - O código PIN é a única maneira de desbloquear o Element. + O código PIN é a única maneira de desbloquear o ${app_name}. Ativa a biometria específica do dispositivo, como impressões digitais e reconhecimento de rosto. Ativar a biometria Configurar a proteção @@ -2267,8 +2533,8 @@ Compartilhar meu código Escanear um código QR Não é um código QR da Matrix válido - 🔐️ Junte-se a mim no Element - Ei, fale comigo no Element: %s + 🔐️ Junte-se a mim no ${app_name} + Ei, fale comigo no ${app_name}: %s Convidar amigos Adicionar pessoas "Descrição:· " @@ -2377,7 +2643,36 @@ Esta sala não é pública. Você não poderá entrar novamente sem um convite. Padrão do sistema Falha ao se autenticar - O Element precisa que você insira suas credenciais para executar esta ação. + O ${app_name} precisa que você insira suas credenciais para executar esta ação. Necessário autenticar-se novamente Não autorizado, sem credenciais de autenticação válidas + Pessoas + Ocorreu um erro ao transferir a chamada + Transferir + Conectar + Consultar primeiro + + 1 chamada em andamento (%1$s) · 1 chamada pausada + 1 chamada em andamento (%1$s) · %2$d chamadas pausadas + + + Chamada pausada + %1$d chamadas pausadas + + Chamada em andamento (%1$s) + Ocorreu um erro ao pesquisar o número de telefone + Teclado de discagem + Ligar de volta + Essa chamada foi encerrada + %1$s recusou essa chamada + Você recusou essa chamada %1$s + Você está nessa chamada + %1$s começou uma chamada + Você começou uma chamada + Falha ao fazer a autoverificação + Você pausou a chamada + %s pausou a chamada + Pausar + Retomar + Voltar \ No newline at end of file diff --git a/vector/src/main/res/values-pt/strings.xml b/vector/src/main/res/values-pt/strings.xml index d2e181dbe7..8220b08dd4 100644 --- a/vector/src/main/res/values-pt/strings.xml +++ b/vector/src/main/res/values-pt/strings.xml @@ -1,5 +1,86 @@ + %1$s: %2$s + %1$s enviou uma imagem. + + convite de %s + %1$s convidou %2$s + %1$s convidou-o + %1$s entrou + %1$s saiu + %1$s recusou o convite + %1$s expulsou %2$s + %1$s des-baniu %2$s + %1$s baniu %2$s + %1$s cancelou o convite de %2$s + %1$s mudou o seu avatar + %1$s definiu seu nome público como %2$s + %1$s alterou seu nome público de %2$s para %3$s + %1$s apagou o seu nome público (%2$s) + %1$s alterou o tópico desta sala para: %2$s + %1$s alterou o nome desta sala para: %2$s + %s iniciou uma chamada de vídeo. + %s iniciou uma chamada de voz. + %s respondeu à chamada. + %s terminou a chamada. + %1$s tornou o histórico futuro desta sala visível para %2$s + todas os membros que integram esta sala, a partir do momento em que foram convidados. + todas os membros da sala, a partir do momento em que entraram. + todas os membros da sala. + todos. + desconhecida (%s). + %1$s ativou a criptografia ponta-a-ponta (%2$s) + + %1$s solicitou uma conferência VoIP + A conferência VoIP começou + A conferência VoIP terminou + + (o avatar também foi alterado) + %1$s removeu o nome da sala + %1$s removeu o tópico da sala + %1$s atualizou o seu perfil %2$s + %1$s enviou um convite para que %2$s se junte à sala + %1$s aceitou o convite para %2$s + + ** Impossível decifrar: %s ** + O dispositivo de quem enviou a mensagem não nos enviou as chaves para esta mensagem. + + + Não foi possível apagar + Não foi possível enviar a mensagem + + O envio da imagem falhou + + + Erro de conexão à Internet + Erro do Matrix + + + + + + + + + Ainda não é possível voltar a entrar numa sala vazia. + + + Endereço de e-mail + Número de telefone + + + Convite de %s + Convite para sala + %1$s e %2$s + Sala vazia + + + %1$s enviou um sticker. + + %s fez o upgrade da sala. + + Mensagem removida + Mensagem removida por %1$s Mensagens Sala @@ -70,7 +151,7 @@ Lista de endereços local Apenas contactos do Matrix Não há conversas - Não permitiu ao Element aceder aos seus contactos locais + Não permitiu ao ${app_name} aceder aos seus contactos locais Sem resultados Salas @@ -210,26 +291,26 @@ A sessão foi terminada em todos os dispositivos e não receberá mais notifica Não foi possível gravar vídeo Informação - O Element necessita de permissão para aceder ao seu armazenamento de fotos e vídeos para poder enviar e guardar anexos. + O ${app_name} necessita de permissão para aceder ao seu armazenamento de fotos e vídeos para poder enviar e guardar anexos. Permita o acesso na próxima janela para poder enviar ficheiros a partir do seu telefone. - O Element necessita de permissão para aceder à sua câmara para poder tirar fotos e fazer chamadas de vídeo. + O ${app_name} necessita de permissão para aceder à sua câmara para poder tirar fotos e fazer chamadas de vídeo. Por favor, permita o acesso na próxima janela para poder realizar a chamada. - Element necessita de permissão para aceder ao seu microfone para realizar chamadas de áudio. + ${app_name} necessita de permissão para aceder ao seu microfone para realizar chamadas de áudio. Por favor, permita acesso na próxima janela para poder efetuar a chamada. - Element necessita de permissão para aceder à sua câmara e ao seu microfone para realizar chamadas de vídeo. + ${app_name} necessita de permissão para aceder à sua câmara e ao seu microfone para realizar chamadas de vídeo. Por favor, permita o acesso na próxima janela para poder efetuar a chamada. - O Element necessita de permissão para aceder à sua lista de contactos para encontrar outros utilizadores Matrix a partir dos seus e-mails e números de telefone. + O ${app_name} necessita de permissão para aceder à sua lista de contactos para encontrar outros utilizadores Matrix a partir dos seus e-mails e números de telefone. -Por favor, permita o acesso na próxima janela para poder encontrar utilizadores na sua lista de contactos que podem ser contactados pelo Element. - O Element necessita de permissão para aceder à sua lista de contactos para encontrar outros utilizadores Matrix a partir dos seus endereços de email e números de telefone. +Por favor, permita o acesso na próxima janela para poder encontrar utilizadores na sua lista de contactos que podem ser contactados pelo ${app_name}. + O ${app_name} necessita de permissão para aceder à sua lista de contactos para encontrar outros utilizadores Matrix a partir dos seus endereços de email e números de telefone. -Permitir ao Element aceder aos seus contactos? +Permitir ao ${app_name} aceder aos seus contactos? Desculpe… A ação não foi realizada, por falta de permissões Guardado @@ -600,7 +681,7 @@ Dispositivos desconhecidos: Limpar cache de multimédia Tema Claro Tema Escuro - Tema Preto + Tema Preto Som de notificação Utilizar formato de 12 horas (ex. 2:30pm) Precisa de permissão para gerir os widgets nesta sala @@ -619,7 +700,6 @@ Dispositivos desconhecidos: Adicionar apps Matrix A sincronizar… À escuta de eventos - Tema Status.im Notificações ruidosas Notificações silenciosas Relatório de bug @@ -657,7 +737,7 @@ Adicionar alguns agora? Pedir de novo as chaves criptográficas aos seus outros dispositivos. Pedido de chaves enviado. Pedido enviado - Por favor abra o Element num dispositivo que consiga decifrar a mensagem, para que esse dispositivo possa enviar as chaves para este dispositivo. + Por favor abra o ${app_name} num dispositivo que consiga decifrar a mensagem, para que esse dispositivo possa enviar as chaves para este dispositivo. Lista de Grupos %d mudança de adesão @@ -738,13 +818,13 @@ Adicionar alguns agora? Desactivar a conta Desactivar a minha conta Privacidade das Notificações - O Element pode executar em segundo plano para gerir as notificações de forma segura e confidencial (isso poderá afectar a utilização da bateria). + O ${app_name} pode executar em segundo plano para gerir as notificações de forma segura e confidencial (isso poderá afectar a utilização da bateria). Conceder permissão Escolha outra opção Estatísticas de uso Enviar dados de análise de estatísticas - O Element recolhe dados anónimos de análise de estatísticas para ajudar a melhorar a aplicação. - Por favor, permita o envio de dados de análise para ajudar-nos a melhorar o Element. + O ${app_name} recolhe dados anónimos de análise de estatísticas para ajudar a melhorar a aplicação. + Por favor, permita o envio de dados de análise para ajudar-nos a melhorar o ${app_name}. Sim, quero ajudar! Insígnias Você não faz, actualmente, parte de qualquer comunidade. @@ -913,7 +993,7 @@ A visibilidade das mensagens no Matrix é parecida com a dos emails. O nosso esq Apagar Backup Por favor veja e aceite, apolice para este servidor Chamadas - Usar toque padrão para chamadas recebidas + Usar toque padrão para chamadas recebidas Toque para chamadas recebidas Selecione toque para chamadas: Chamada de Vídeo em Progresso… @@ -936,7 +1016,7 @@ Se faz favor verifique configurações de conta Activar Configurações de aparelho Notificações estão activadas para este aparelho - Notificações estão desactivadas para este aparelho + Notificações estão desactivadas para este aparelho Por favor, verifique configurações de aplicação Activar Configurações personalizadas @@ -956,7 +1036,7 @@ Por favor, verifique configurações de aplicação Verificar restriçoes de histórico Desactivar restricções Optimização de bateria - Element não é afectado por Optimização de bateria + ${app_name} não é afectado por Optimização de bateria Ignorar Optimização Configurar Notificações de ruido Configurar Notificações de chamadas diff --git a/vector/src/main/res/values-ro/strings.xml b/vector/src/main/res/values-ro/strings.xml index dcb3f33dee..8ed9df6f47 100644 --- a/vector/src/main/res/values-ro/strings.xml +++ b/vector/src/main/res/values-ro/strings.xml @@ -2,8 +2,7 @@ Temă luminoasă Temă întunecată - Temă Neagră - Tema Status.im + Temă Neagră Inițializează serviciu Sincronizează… diff --git a/vector/src/main/res/values-ru/strings.xml b/vector/src/main/res/values-ru/strings.xml index 32039144d6..e401e856ce 100644 --- a/vector/src/main/res/values-ru/strings.xml +++ b/vector/src/main/res/values-ru/strings.xml @@ -1,5 +1,291 @@ + %1$s: %2$s + %1$s отправил(а) изображение. + %s приглашение + %1$s пригласил(а) %2$s + %1$s пригласил(а) вас + %1$s вошёл(ла) в комнату + %1$s покинул(а) комнату + %1$s отклонил(а) приглашение + %1$s выгнан %2$s + %1$s разблокировал(а) %2$s + %1$s заблокировал(а) %2$s + %1$s отозвал(а) приглашение %2$s + %1$s изменил(а) свой аватар + %1$s установил(а) имя %2$s + %1$s изменил(а) имя с %2$s на %3$s + %1$s удалил(а) свое имя (%2$s) + %1$s изменил(а) тему на: %2$s + %1$s изменил(а) название комнаты: %2$s + %s начал(а) видеовызов. + %s начал(а) голосовой вызов. + %s ответил(а) на звонок. + %s завершил(а) вызов. + %1$s сделал(а) будущую историю комнаты видимой %2$s + всем членам, с момента их приглашения. + всем членам, с момента присоединения. + всем членам. + всем. + неизвестно (%s). + %1$s включил(а) сквозное шифрование (%2$s) + %1$s запросил(а) VoIP конференцию + VoIP-конференция начата + VoIP-конференция завершена + (аватар также был изменен) + %1$s удалил(а) название комнаты + %1$s удалил(а) тему комнаты + %1$s обновил(а) свой профиль %2$s + %1$s отправил(а) приглашение %2$s присоединиться к комнате + %1$s принял(а) приглашение от %2$s + ** Невозможно расшифровать: %s ** + Устройство отправителя не предоставило нам ключ для расшифровки этого сообщения. + + Не удалось изменить + Не удалось отправить сообщение + Не удалось загрузить изображение + + Сетевая ошибка + Ошибка Matrix + + + + + В настоящее время невозможно вновь присоединиться к пустой комнате. + + Адрес электронной почты + Номер телефона + %1$s отправил стикер. + + Приглашение от %s + Приглашение в комнату + %1$s и %2$s + Пустая комната + + %1$s и 1 другой + %1$s и %2$d другие + %1$s и %2$d других + + + Сообщение удалено + %1$s удалил(а) сообщение + Сообщение удалено [причина: %1$s] + %1$s удалил(а) сообщение [причина: %2$s] + Начальная синхронизация: +\nИмпорт учетной записи… + Начальная синхронизация: +\nИмпорт криптографии + Начальная синхронизация: +\nИмпорт комнат + Синхронизация начата: +\nИмпорт присоединенных комнат + Синхронизация начата: +\nИмпорт приглашенных комнат + Начальная синхронизация: +\nИмпорт покинутых комнат + Начальная синхронизация: +\nИмпорт сообществ + Начальная синхронизация: +\nИмпорт данных учетной записи + %s обновил эту комнату. + Отправка сообщения… + Очистить очередь отправки + %1$s отозвал приглашение %2$s присоединиться к комнате + Приглашение %1$s. Причина: %2$s + %1$s приглашен %2$s. Причина: %3$s + %1$s пригласил вас. Причина: %2$s + %1$s вошёл(ла) в комнату. Причина: %2$s + %1$s покинул(а) комнату. Причина: %2$s + %1$s отклонил приглашение. Причина: %2$s + %1$s выгнали %2$s. Причина: %3$s + %1$s разблокировано %2$s. Причина: %3$s + %1$s забанен %2$s. Причина: %3$s + %1$s отправил приглашение %2$s в комнату. Причина: %3$s + %1$s отозвал приглашение %2$s присоединиться к комнате. Причина: %3$s + %1$s принял приглашение для %2$s. Причина: %3$s + %1$s отозвал приглашение %2$s. Причина: %3$s + %1$s создал(а) комнату + + %1$s добавил(а) %2$s в качестве адреса для этой комнаты. + %1$s добавил(а) %2$s в качестве адресов для этой комнаты. + %1$s добавил(а) %2$s в качестве адресов для этой комнаты. + + + %1$s удалил(а) адрес %2$s для комнаты. + %1$s удалил(а) адреса %2$s для комнаты. + %1$s удалил(а) адреса %2$s для комнаты. + + %1$s добавил(а) адреса %2$s и удалил(а) %3$s для комнаты. + %1$s сделал(а) %2$s главным адресом комнаты. + %1$s удалил(а) главный адрес комнаты. + %1$s разрешил(а) гостям входить в комнату. + %1$s запретил(а) гостям входить в комнату. + %1$s включил(а) сквозное шифрование. + %1$s включил(а) сквозное шифрование (неизвестный алгоритм %2$s). + Вы отправили изображение. + Вы отправили стикер. + Ваше приглашение + Вы создали комнату + Вы пригласили %1$s + Вы вошли в комнату + Вы покинули комнату + Вы отклонили приглашение + Вы выгнали %1$s + Вы разбанили %1$s + Вы забанили %1$s + Вы отозвали приглашение %1$s + Вы сменили свой аватар + Вы сменили своё отображаемое имя на %1$s + Вы сменили своё отображаемое имя с %1$s на %2$s + Вы удалили своё отображаемое имя (%1$s) + Вы сменили тему на: %1$s + Вы сменили название комнаты на: %1$s + Вы начали видеозвонок. + Вы начали звонок. + Вы ответили на звонок. + Вы закончили звонок. + Вы сделали будущую историю комнаты видимой для %1$s + Вы включили сквозное шифрование (%1$s) + Вы обновили эту комнату. + Вы начали групповой звонок + Вы удалили название комнаты + Вы удалили тему комнаты + Вы обновили свой профиль %1$s + Вы отправили %1$s приглашение в эту комнату + Вы отозвали у %1$s приглашение в эту комнату + Вы приняли приглашение для %1$s + %1$s добавил(а) виджет %2$s + Вы добавили виджет %1$s + %1$s удалил(а) виджет %2$s + Вы удалили виджет %1$s + %1$s изменил(а) виджет %2$s + Вы изменили виджет %1$s + Администратор + Модератор + По умолчанию + Пользовательский (%1$d) + Пользовательский + Вы изменили уровни доступа %1$s. + %1$s изменил(а) уровни доступа %2$s. + %1$s с %2$s на %3$s + Ваше приглашение. Причина: %1$s + Вы пригласили %1$s. Причина: %2$s + Вы вошли в комнату. Причина: %1$s + Вы покинули комнату. Причина: %1$s + Вы отклонили приглашение. Причина: %1$s + Вы выгнали %1$s. Причина: %2$s + Вы разбанили %1$s. Причина: %2$s + Вы забанили %1$s. Причина: %2$s + Вы отправили %1$s приглашение в эту комнату. Причина: %2$s + Вы отозвали у %1$s приглашение в эту комнату. Причина: %2$s + Вы приняли приглашение для %1$s. Причина: %2$s + Вы отозвали приглашение %1$s. Причина: %2$s + + Вы добавили адрес %1$s для этой комнаты. + Вы добавили %1$s в качестве адресов для этой комнаты. + Вы добавили %1$s в качестве адресов для этой комнаты. + + + Вы удалили адрес этой комнаты: %1$s. + Вы удалили адреса этой комнаты: %1$s. + Вы удалили адреса этой комнаты: %1$s. + + Вы добавили адреса %1$s и удалили %2$s для этой комнаты. + Вы задали главный адрес этой комнаты %1$s. + Вы удалили главный адрес этой комнаты. + Вы разрешили гостям входить в комнату. + Вы запретили гостям входить в комнату. + Вы включили сквозное шифрование. + Вы включили сквозное шифрование (неизвестный алгоритм %1$s). + %1$s изменил(а) аватар комнаты + Вы изменили аватар комнаты + %s отправил(а) данные для начала звонка. + Вы отправили данные для начала звонка. + %1$s удалил(а) аватар комнаты + Вы удалили аватар комнаты + Вы запретили гостям входить в комнату. + %1$s запретил(а) гостям входить в комнату. + Вы разрешили гостям присоединяться сюда. + %1$s разрешил(а) гостям присоединиться сюда. + Вы вышли. Причина: %1$s + %1$s вышел(-ла). Причина: %2$s + Вы вошли. Причина: %1$s + %1$s вошел(-ла). Причина: %2$s + Вы отозвали приглашение %1$s + %1$s отозвал(а) приглашение %2$s + Вы пригласили %1$s + %1$s пригласил(а) %2$s + Вы сделали будущие сообщения видимыми для %1$s + %1$s сделал(а) будущие сообщения видимыми для %2$s + Вы покинули комнату + %1$s покинул(а) комнату + Вы вошли + %1$s вошел(ла) + Вы создали обсуждение + %1$s создал(а) обсуждение + Вы обновили эту комнату. + %s обновил(а) эту комнату. + + %1$s, %2$s, %3$s и %4$d другой + %1$s, %2$s, %3$s и %4$d других + %1$s, %2$s, %3$s и %4$d другие + %1$s, %2$s, %3$s и %4$d другие + + %1$s, %2$s, %3$s и %4$s + %1$s, %2$s и %3$s + 🎉 Всем серверам запрещено участвовать! Эта комната больше не может быть использована. + Без изменений. + Пустая комната (была %s) + • Соответствующий сервер %s заблокирован. + • Сервер, соответствующий буквальным IP-адресам, теперь запрещён. + • Сервер, соответствующий буквальным IP-адресам, теперь разрешён. + • Сервер, соответствующий %s, теперь запрещён. + • Сервер, соответствующий %s, теперь разрешён. + • Сервер, соответствующий %s, был удалён из списка блокировки. + • Сервер, соответствующий буквальным IP-адресам, запрещён. + • Сервер, соответствующий буквальным IP-адресам, разрешён. + • Сервер, соответствующий %s, разрешён. + • Сервер, соответствующий %s, был удалён из разрешённого списка. + Вы изменили права доступа сервера (ACL) для этой комнаты. + %s изменил права доступа сервера (ACL) для этой комнаты. + Вы настроили права доступа сервера (ACL) для этой комнаты. + %s устанавливает права доступа сервера (ACL) для этой комнаты. + Вы изменили адреса этой комнаты. + %1$s изменил(а) адреса этой комнаты. + Вы изменили основной и альтернативный адреса этой комнаты. + %1$s изменил(а) основной и альтернативный адреса этой комнаты. + Вы изменили альтернативные адреса для этой комнаты. + %1$s изменил(а) альтернативные адреса для этой комнаты. + + Вы удалили альтернативный адрес %1$s для этой комнаты. + Вы удалили альтернативные адреса %1$s для этой комнаты. + Вы удалили альтернативные адреса %1$s для этой комнаты. + Вы удалили альтернативные адреса %1$s для этой комнаты. + + + %1$s удалил(а) альтернативный адрес %2$s для этой комнаты. + %1$s удалил(а) альтернативные адреса %2$s для этой комнаты. + %1$s удалил(а) альтернативные адреса %2$s для этой комнаты. + %1$s удалил(а) альтернативные адреса %2$s для этой комнаты. + + + Вы добавили альтернативный адрес %1$s для этой комнаты. + Вы добавили альтернативные адреса %1$s для этой комнаты. + Вы добавили альтернативные адреса %1$s для этой комнаты. + Вы добавили альтернативные адреса %1$s для этой комнаты. + + + %1$s добавил(а) альтернативный адрес %2$s для этой комнаты. + %1$s добавил(а) альтернативные адреса %2$s для этой комнаты. + %1$s добавил(а) альтернативные адреса %2$s для этой комнаты. + %1$s добавил(а) альтернативные адреса %2$s для этой комнаты. + + Вы изменили видеоконференцию + %1$s изменил(а) видеоконференцию + Вы завершили видеоконференцию + %1$s завершил(а) видеоконференцию + Вы начали видеоконференцию + %1$s начал(а) видеоконференцию Сообщения Комната @@ -74,7 +360,7 @@ Локальные контакты Только Matrix контакты Нет диалогов - Вы не дали доступ Element к внутренним контактам + Вы не дали доступ ${app_name} к внутренним контактам Нет результатов Комнаты @@ -146,9 +432,9 @@ Забыли пароль? Использовать особые параметры сервера Проверьте email для продолжения регистрации - Регистрация одновременно по email и номеру телефона пока не поддерживается. Только номер телефона будет связан с аккаунтом. - -Вы можете добавить свой email в настройках профиля. + Регистрация одновременно по email и номеру телефона пока не поддерживается. Только номер телефона будет связан с аккаунтом. +\n +\nВы можете добавить свой email в настройках профиля. Проверка не являетесь ли вы роботом Логин уже используется Сервер: @@ -159,7 +445,9 @@ Должен быть введен новый пароль. На адрес %s было отправлено письмо. После перехода по ссылке в письме, нажмите ниже. Не удалось проверить email: убедитесь, что вы перешли по присланной ссылке - Ваш пароль сброшен. Осуществлен выход на всех сессиях - вы не будете получать push уведомления. Для включения push уведомлений заново войдите на каждом из ваших устройств. + Ваш пароль сброшен. +\n +\nОсуществлен выход на всех сессиях - вы не будете получать push уведомления. Для включения push уведомлений заново войдите на каждом из ваших устройств. URL должен начинаться с http[s]:// Сбой входа: сетевая ошибка @@ -214,18 +502,18 @@ Не удалось записать видео" Element Информация - Element нуждается в разрешении на доступ к вашей фото-и видеотеке для отправки и сохранения вложений. + ${app_name} нуждается в разрешении на доступ к вашей фото-и видеотеке для отправки и сохранения вложений. \n \nПожалуйста, разрешите доступ в следующем всплывающем окне, чтобы иметь возможность отправлять файлы с вашего устройства. - Element необходимы разрешения на доступ к вашей камере, чтобы делать фото и совершать видеозвонки. + ${app_name} необходимы разрешения на доступ к вашей камере, чтобы делать фото и совершать видеозвонки. \n\nПожалуйста разрешите доступ в следующем окне, чтобы иметь возможность совершать звонки. - Element необходимы разрешения на доступ к микрофону, чтобы выполнять звонки. + ${app_name} необходимы разрешения на доступ к микрофону, чтобы выполнять звонки. \n\nПожалуйста разрешите доступ в следующем окне, чтобы иметь возможность совершать звонки. - Element необходимы разрешения на доступ к камере и микрофону для видеовызовов. - -Пожалуйста дайте разрешение в следующем окне для звонка. - Element может проверить вашу адресную книгу, чтобы найти других пользователей Matrix по их электронной почте и номерам телефонов. Если вы согласны поделиться своей адресной книгой для этой цели, пожалуйста, откройте доступ на следующем всплывающем окне. - Element может проверить Вашу адресную книгу, чтобы найти других пользователей сети по email или телефонному номеру. + ${app_name} необходимы разрешения на доступ к камере и микрофону для видеовызовов. +\n +\nПожалуйста дайте разрешение в следующем окне для звонка. + ${app_name} может проверить вашу адресную книгу, чтобы найти других пользователей Matrix по их электронной почте и номерам телефонов. Если вы согласны поделиться своей адресной книгой для этой цели, пожалуйста, откройте доступ на следующем всплывающем окне. + ${app_name} может проверить Вашу адресную книгу, чтобы найти других пользователей сети по email или телефонному номеру. \n \nСогласны ли вы поделиться своей адресной книгой для этой цели\? Извините. Действие не выполнено из-за недостаточных разрешений @@ -278,7 +566,8 @@ ID пользователя, имя или email Упомянуть Отобразить список сессий - Вы не сможете отменить это действие, поскольку пользователь получит такой же уровень доступа, как и у вас. Вы уверены? + Вы не сможете отменить это действие, поскольку пользователь получит такой же уровень доступа, как и у вас. +\nВы уверены\? "Вы уверены что хотите пригласить %s в этот чат?" Пригласить по ID @@ -325,9 +614,9 @@ ПРИСОЕДИНИЛИСЬ Причина отчета о контенте - Вы хотите скрыть все сообщения этого пользователя? - -Учтите, что это действие перезапустит приложение и может занять некоторое время. + Вы хотите скрыть все сообщения этого пользователя\? +\n +\nУчтите, что это действие перезапустит приложение и может занять некоторое время. Отменить загрузку Отменить загрузку @@ -416,8 +705,8 @@ Обновить публичное имя Последнее подключение %1$s @ %2$s - Для этой операции требуется дополнительная проверка подлинности. -Чтобы продолжить, введите пароль. + Для этой операции требуется дополнительная проверка подлинности. +\nЧтобы продолжить, введите пароль. Аутентификация Пароль: Отправить @@ -436,9 +725,9 @@ Подтвердите новый пароль Не удалось обновить пароль Пароль был обновлен - Отображать сообщения пользователя %s? - -Учтите, что это действие перезапустит приложение и может занять некоторое время. + Отображать сообщения пользователя %s\? +\n +\nУчтите, что это действие перезапустит приложение и может занять некоторое время. Вы уверены, что хотите удалить устройство для получения уведомлений? Вы уверены, что хотите удалить %1$s %2$s? Выберите страну @@ -533,9 +822,9 @@ Экспорт Введите парольную фразу Подтвердите парольную фразу - E2E ключи комнаты сохранены в \'%s\'. - -Предупреждение: этот файл может быть удален после деинсталляции приложения. + E2E ключи комнаты сохранены в \'%s\'. +\n +\nПредупреждение: этот файл может быть удален после деинсталляции приложения. Импорт E2E ключей комнаты Импорт ключей комнаты Импортировать ключи из локального файла @@ -597,7 +886,7 @@ Сохранить медиа Светлая тема Тёмная тема - Чёрная тема + Чёрная тема Звук уведомлений Показывать метки времени в 12-часовом формате Вам нужно разрешение на управление виджетами в этой комнате @@ -767,21 +1056,21 @@ • Уведомления содержат метаданные и данные сообщения • Уведомления не будут показывать содержимое сообщения Конфиденциальность уведомлений - Element может работать в фоновом режиме для управления конфиденциальностью и безопасностью ваших уведомлений. Это может повлиять на время работы от батареи. + ${app_name} может работать в фоновом режиме для управления конфиденциальностью и безопасностью ваших уведомлений. Это может повлиять на время работы от батареи. Предоставить разрешение Выбрать другой вариант Ограниченная конфиденциальность надежно от Matrix-Homeserver получено Отправить стикер Отправить стикер - У вас сейчас нет доступных стикеров. - -Добавить сейчас? + У вас сейчас нет доступных стикеров. +\n +\nДобавить сейчас\? Деактивация аккаунта Деактивировать мой аккаунт Отправка аналитических данных - Element собирает анонимную аналитику для улучшения приложения. - Пожалуйста, включите аналитику, чтобы помочь нам улучшить Element. + ${app_name} собирает анонимную аналитику для улучшения приложения. + Пожалуйста, включите аналитику, чтобы помочь нам улучшить ${app_name}. Да, я хочу помочь! Обязательный параметр отсутствует. Параметр недействителен. @@ -791,11 +1080,11 @@ Пожалуйста, удалите все сообщения, которые я отправил, после деактивации моего аккаунта (предупреждение: будущие участники увидят неполную историю разговоров) Чтобы продолжить, введите пароль: Деактивировать аккаунт - Это действие сделает вашу учетную запись непригодной для дальнейшего использования. Вы не сможете войти в систему и никто другой не сможет заново зарегистрировать учетную запись с вашим идентификатором. Также, это приведет к тому, что вы покинете все комнаты, в которых участвовали и данные о вашей учетной записи будут удалены с сервера идентификации. Это действие необратимо. - -По умолчанию, деактивация вашей учетной записи не удаляет отправленные вами сообщения. Если вы хотите, чтобы мы удалили все ваши сообщения - поставьте отметку в поле ниже. - -Видимость сообщений в Matrix похожа на электронную почту. Удаление ваших сообщений означает, что отправленные вами сообщения не будут показаны новым или не зарегистрированным пользователям, но те пользователи, которые уже получили эти сообщения - по прежнему будут их видеть. + Это действие сделает вашу учетную запись непригодной для дальнейшего использования. Вы не сможете войти в систему и никто другой не сможет заново зарегистрировать учетную запись с вашим идентификатором. Также, это приведет к тому, что вы покинете все комнаты, в которых участвовали и данные о вашей учетной записи будут удалены с сервера идентификации. Это действие необратимо. +\n +\nПо умолчанию, деактивация вашей учетной записи не удаляет отправленные вами сообщения. Если вы хотите, чтобы мы удалили все ваши сообщения - поставьте отметку в поле ниже. +\n +\nВидимость сообщений в Matrix похожа на электронную почту. Удаление ваших сообщений означает, что отправленные вами сообщения не будут показаны новым или не зарегистрированным пользователям, но те пользователи, которые уже получили эти сообщения - по прежнему будут их видеть. Лицензии сторонних производителей Скачать Говорить @@ -803,7 +1092,7 @@ Перезапросить ключи шифрования у других ваших сессий. Отправлен запрос ключа. Запрос отправлен - Запустите Element на другом устройстве, которое может расшифровать сообщение, для отправки ключа на эту сессию. + Запустите ${app_name} на другом устройстве, которое может расшифровать сообщение, для отправки ключа на эту сессию. Введите здесь… Отправить голосовое сообщение продолжить с… @@ -884,7 +1173,6 @@ Системные оповещения Лимит ресурсов исчерпан Связаться с администратором - Тема status.im Ошибка Версия %s Создать парольную фразу @@ -907,7 +1195,7 @@ Пароль Пожалуйста ознакомьтесь и подтвердите согласие с политикой этого сервера: Вызовы - Использовать стандартную мелодию Element для входящих звонков + Использовать стандартную мелодию ${app_name} для входящих звонков Мелодия звонка Выберите мелодию звонка: Идёт видеозвонок … @@ -937,54 +1225,54 @@ Один или несколько тестов не пройдены, пожалуйста, отправьте отчет об ошибке, чтобы помочь нам исследовать проблему. Настройки системы. Уведомления включены в настройках системы. - Уведомления отключены в настройках системы. -Пожалуйста, проверьте настройки системы. + Уведомления отключены в настройках системы. +\nПожалуйста, проверьте настройки системы. Открыть настройки Настройки аккаунта. Уведомления включены для вашей учетной записи. - Уведомления отключены для вашей учетной записи. -Пожалуйста, проверьте настройки аккаунта. + Уведомления отключены для вашей учетной записи. +\nПожалуйста, проверьте настройки аккаунта. Включить Настройки сессии. Уведомления включены для этой сессии. - Уведомления не включено для этой сессии. -\nПожалуйста, проверьте настройки Element. + Уведомления не включено для этой сессии. +\nПожалуйста, проверьте настройки ${app_name}. Включить Проверка сервисов Play APK Google Play сервисов доступен и обновлён. - Element использует сервисы Google Play для доставки push-сообщений, но не похоже что он настроен правильно: -%1$s + ${app_name} использует сервисы Google Play для доставки push-сообщений, но не похоже что он настроен правильно: +\n%1$s Исправить сервисы Play Токен Firebase Токен FCM успешно получен: -%1$s - Не удалось получить токен FCM: -%1$s +\n%1$s + Не удалось получить токен FCM: +\n%1$s Регистрация токена Токен FCM успешно зарегистрирован на сервере. - Не удалось зарегистрировать токен FCM на сервере: -%1$s + Не удалось зарегистрировать токен FCM на сервере: +\n%1$s Служба уведомлений Служба уведомлений запущена. - Служба уведомлений не запущена. -Попробуйте перезапустить приложение. + Служба уведомлений не запущена. +\nПопробуйте перезапустить приложение. Запустить службу Автоматический перезапуск службы уведомлений Служба была убита и перезапущена автоматически. Не удалось перезапустить службу Запуск при загрузке Служба будет запущена после перезапуска устройства. - При перезагрузке устройства служба не будет запущена , вы не будете получать уведомления, пока Element не будет открыт один раз. + При перезагрузке устройства служба не будет запущена , вы не будете получать уведомления, пока ${app_name} не будет открыт один раз. Включить запуск при загрузке Проверьте фоновые ограничения - Фоновые ограничения отключены для Element. Этот тест должен быть запущен с использованием мобильных данных (без WIFI). -%1$s - Фоновые ограничения включены для Element. -Работа приложения будет жестко ограничена, пока оно находится в фоновом режиме, и это может повлиять на уведомления. -%1$s + Фоновые ограничения отключены для ${app_name}. Этот тест должен быть запущен с использованием мобильных данных (без WIFI). +\n%1$s + Фоновые ограничения включены для ${app_name}. +\nРабота приложения будет жестко ограничена, пока оно находится в фоновом режиме, и это может повлиять на уведомления. +\n%1$s Отключить ограничения Оптимизация батареи - Оптимизация батареи не влияет на Element. + Оптимизация батареи не влияет на ${app_name}. Если пользователь оставляет устройство в отключенном от сети и в неподвижном состоянии в течение некоторого времени при выключенном экране, устройство переходит в режим Doze. Это предотвращает доступ приложений к сети и откладывает выполнение заданий, синхронизацию и передачу стандартных аварийных сигналов. Игнорировать оптимизацию Предпросмотр ссылок в чате, когда ваш домашний сервер поддерживает эту функцию. @@ -995,8 +1283,8 @@ Показывать события о вступлении/выходе Показывать события аккаунта Включает изменения аватара и отображаемого имени. - Необходимо минимизировать влияние на фоновое соединение для надёжности уведомлений. -На следующем экране вам будет предложено разрешить Райоту всегда работать в фоновом режиме, пожалуйста, примите. + Необходимо минимизировать влияние на фоновое соединение для надёжности уведомлений. +\nНа следующем экране вам будет предложено разрешить Райоту всегда работать в фоновом режиме, пожалуйста, примите. Использовать системную камеру вместо камеры Element. Показать информацию %1$s: @@ -1027,7 +1315,7 @@ Беззвучный Пожалуйста, введите парольную фразу Парольная фраза слишком простая - Пожалуйста, удалите парольную фразу, если хотите, чтобы Element сгенерировал ключ восстановления. + Пожалуйста, удалите парольную фразу, если хотите, чтобы ${app_name} сгенерировал ключ восстановления. Matrix сессия недоступна Никогда не теряйте зашифрованных сообщений Сообщения в зашифрованных комнатах защищены сквозным шифрованием. Ключи для прочтения этих сообщений есть только у вас и получателя(ей). @@ -1091,14 +1379,15 @@ Невозможно расшифровать резервную копию с помощью данного пароля: убедитесь, что вы ввели верный пароль. Ключи шифрования копируются на сервер в фоновом режиме. Первое копирование может занять несколько минут. Генерация ключей восстановления с использованием парольной фразы может занять несколько секунд. - Ключ восстановления был сохранен в \'%s\'. - -Предупреждение: этот файл может быть удален при удалении приложения. - [%1$s] -\nЭта ошибка вне контроля Element. На телефоне нет учетной записи Google. Пожалуйста, добавьте аккаунт Google. - [%1$s] -Эта ошибка вне контроля Element. Причины могут быть разными. Возможно, это будет работать, если вы повторите попытку позже, вы также можете проверить, что службы Google Play не ограничены в использовании данных в настройках системы, или что часы вашего устройства установлены правильно, или это может произойти на модифицированных прошивках. - [%1$s] Эта ошибка вне контроля Element, и, по словам Google, эта ошибка означает, что на устройстве слишком много приложений, зарегистрированных в FCM. Ошибка возникает только в тех случаях, когда существует огромное количество приложений, поэтому она не должна влиять на обычного пользователя. + Ключ восстановления был сохранен в \'%s\'. +\n +\nПредупреждение: этот файл может быть удален при удалении приложения. + [%1$s] +\nЭта ошибка вне контроля ${app_name}. На телефоне нет учетной записи Google. Пожалуйста, добавьте аккаунт Google. + [%1$s] +\nЭта ошибка вне контроля ${app_name}. Причины могут быть разными. Возможно, это будет работать, если вы повторите попытку позже, вы также можете проверить, что службы Google Play не ограничены в использовании данных в настройках системы, или что часы вашего устройства установлены правильно, или это может произойти на модифицированных прошивках. + [%1$s] +\nЭта ошибка вне контроля ${app_name}, и, по словам Google, эта ошибка означает, что на устройстве слишком много приложений, зарегистрированных в FCM. Ошибка возникает только в тех случаях, когда существует огромное количество приложений, поэтому она не должна влиять на обычного пользователя. Ваши зашифрованные сообщения будут потеряны, если выйдете сейчас Выполняется резервное копирование ключа. Если выйти сейчас, Вы потеряете доступ к Вашим зашифрованным сообщениям. Мне не нужны мои зашифрованные сообщения @@ -1151,7 +1440,8 @@ Зашифрованная копия ключей будет храниться на вашем сервере. Для безопасности защитите её парольной фразой. \n \nДля максимальной безопасности парольная фраза должна отличаться от пароля вашей учётной записи. - Ключ восстановления — это страховка, вы можете использовать его для восстановления доступа к вашим зашифрованным сообщениям, если забудете вашу парольную фразу. Храните ключ восстановления в надёжном месте, например, в диспетчере паролей (или в сейфе) + Ключ восстановления — это страховка, вы можете использовать его для восстановления доступа к вашим зашифрованным сообщениям, если забудете вашу парольную фразу. +\nХраните ключ восстановления в надёжном месте, например, в диспетчере паролей (или в сейфе) Импортирование ключей… Скачивание ключей… Вычисление ключа восстановления… @@ -1208,7 +1498,7 @@ Игнорировать Ошибка отклика сервера Дополнить параметры сервера - Element обнаружил пользовательскую конфигурацию сервера для вашего userID домена\"%1$s\": + ${app_name} обнаружил пользовательскую конфигурацию сервера для вашего userID домена\"%1$s\": \n%2$s Проверьте, сравнив короткую текстовую строку. Для обеспечения максимальной безопасности мы рекомендуем делать это лично или использовать другие надежные средства связи. @@ -1322,7 +1612,7 @@ Спасибо, предложение было успешно отправлено Предложение не было отправлено (%s) Показать скрытые события в ленте сообщений - Предварительный просмотр открытой комнаты в Element пока не поддерживается + Предварительный просмотр открытой комнаты в ${app_name} пока не поддерживается Диалоги Ждите… Шифрование миниатюры… @@ -1384,10 +1674,10 @@ Будет использовать%s в качестве помощника, если ваш домашний сервер не предлагает его (ваш IP-адрес будет доступен во время разговора) Добавьте идентификационный сервер в свои настройки, чтобы выполнить это действие. Режим фоновой синхронизации - Element будет синхронизироваться в фоновом режиме таким образом, чтобы сохранить ограниченные ресурсы устройства (батарея). + ${app_name} будет синхронизироваться в фоновом режиме таким образом, чтобы сохранить ограниченные ресурсы устройства (батарея). \nВ зависимости от состояния ресурса вашего устройства, синхронизация может быть отложена операционной системой. - Element будет синхронизироваться в фоновом режиме периодически в точное время (настраивается). -\nЭто повлияет на использование радио и батареи, появится постоянное уведомление о том, что Element прислушивается к событиям. + ${app_name} будет синхронизироваться в фоновом режиме периодически в точное время (настраивается). +\nЭто повлияет на использование радио и батареи, появится постоянное уведомление о том, что ${app_name} прислушивается к событиям. Вы не будете уведомлены о входящих сообщениях, когда приложение находится в фоновом режиме. %s \nСинхронизация может быть отложена в зависимости от ресурсов (батареи) или состояния устройства (спящий режим). @@ -1433,7 +1723,7 @@ Открыть в браузере ID виджета Принять - Вы это не можете делать на мобильном Element + Вы это не можете делать на мобильном ${app_name} Этот виджет был добавлен: Ваши тема ID комнаты @@ -1504,6 +1794,7 @@ Введите адрес Modular Element или сервера, который вы хотите использовать Произошла ошибка при загрузке страницы: %1$s (%2$d) Приложение не может войти на этот сервер, так как он поддерживает следующие типы входа: %1$s. +\n \nВы хотите войти с помощью веб-клиента\? Извините, этот сервер не принимает новые учётные записи. Приложение не может создать учётную запись на этом домашнем сервере. @@ -1596,7 +1887,7 @@ \nВойдите заново, чтобы получить доступ к данным своей учётной записи и сообщениям. Вы потеряете доступ к защищённым сообщениям, если не войдёте в систему для восстановления ключей шифрования. Очистить данные - Текущая сессия предназначена для пользователя %1$s, а вы предоставляете учётные данные для пользователя %2$s. Это не поддерживается в Element. + Текущая сессия предназначена для пользователя %1$s, а вы предоставляете учётные данные для пользователя %2$s. Это не поддерживается в ${app_name}. \nПожалуйста, сначала очистите данные, а затем снова войдите под другим аккаунтом. Ваша ссылка на matrix.to неверна Описание слишком короткое @@ -1701,7 +1992,7 @@ Закрыть окно бэкапа ключей %s прочитано Не удалось обработать данные - Element требуются права для сохранения ваших ключей шифрования на диск. + ${app_name} требуются права для сохранения ваших ключей шифрования на диск. \n \nПожалуйста, разрешите доступ в следующем всплывающем окне, чтобы экспортировать ключи вручную. Нет подключения к сети @@ -1710,7 +2001,7 @@ Копировать Выполнено Уведомления - Звонок не состоялся + Звонок не состоялся Не удалось установить соединение реального времени. \nПопросите администратора вашего сервера настроить сервер TURN, чтобы звонки работали надёжно. Выберите звуковое устройство @@ -1789,7 +2080,6 @@ Расширьте и персонализируйте свой опыт использования Присоединяйтесь к миллионам бесплатных на самом большом публичном сервере Войти в %1$s - Введите адрес сервера или Element, к которому вы хотите подключиться Введите адрес сервера, который вы хотите использовать На ваш почтовый ящик будет отправлено письмо с подтверждением установки нового пароля. Я подтвердил свою электронную почту @@ -1810,7 +2100,7 @@ Тряска зафиксирована! Показываем только первые результаты, наберите больше букв… Раннее падение - Element может падать чаще, когда происходит непредвиденная ошибка + ${app_name} может падать чаще, когда происходит непредвиденная ошибка Добавляет смайл ¯\\_(ツ)_/¯ в начало сообщения После включения шифрования оно не может быть отключено. Ваш почтовый домен не имеет права регистрироваться на этом сервере @@ -1866,9 +2156,9 @@ По умолчанию в %1$s Пользовательский (%1$d) в %2$s Перейти к последнему прочтённому им сообщению - Element не обрабатывает события типа \'%1$s\' - Element не обрабатывает сообщения типа \'%1$s\' - Element столкнулся с проблемой при отображении содержимого события с идентификатором \'%1$s\' + ${app_name} не обрабатывает события типа \'%1$s\' + ${app_name} не обрабатывает сообщения типа \'%1$s\' + ${app_name} столкнулся с проблемой при отображении содержимого события с идентификатором \'%1$s\' Перестать игнорировать Эта сессия не может поделиться подтверждением с другими сессиями. \nПодтверждение будет сохранено локально и отправится в будущей версии приложения. @@ -1924,8 +2214,8 @@ Сообщения, содержащие @room Отладка Настройки важности уведомлений для событий - Используйте последнюю версию Element на других ваших устройствах, веб-клиент Element, Element для ПК, Element для iOS, Element для Android или другой клиент Matrix, поддерживающий кросс-подпись - Используйте последнюю версию Element на других ваших устройствах: + Используйте последнюю версию ${app_name} на других ваших устройствах, веб-клиент ${app_name}, ${app_name} для ПК, ${app_name} для iOS, ${app_name} для Android или другой клиент Matrix, поддерживающий кросс-подпись + Используйте последнюю версию ${app_name} на других ваших устройствах: Подтвердите новую сессию вашей учетной записи: %1$s Настроить безопасное резервное копирование Безопасное резервное копирование @@ -1979,7 +2269,7 @@ Событие удалено пользователем, Причина: %1$s Событие модерируется администратором комнаты, Причина: %1$s Ключи успешно обновлены! - Element для Android + ${app_name} для Android Обновить Новый вход в вашу учётную запись. Это были Вы\? Нажмите, чтобы просмотреть и проверить @@ -2052,10 +2342,10 @@ Медиафайл добавлен в галерею Не удалось добавить медиафайл в галерею Не удалось сохранить медиафайл - Веб-Element -\nElement для ПК - Element для iOS -\nElement для Android + Веб-${app_name} +\n${app_name} для ПК + ${app_name} для iOS +\n${app_name} для Android или другой, поддерживаемый кросс-подпись Matrix клиент Принудительно отбрасывает текущую групповую сессию для отправки сообщений в зашифрованную комнату Чтобы продолжить, используйте ваш %1$s или используйте ваш %2$s. @@ -2091,11 +2381,11 @@ Загрузка доступных языков… Посмотреть условия %s Отключиться от сервера идентификации %s\? - Этот сервер идентификации устарел. Element поддерживает только API V2. + Этот сервер идентификации устарел. ${app_name} поддерживает только API V2. Эта операция невозможна. Домашний сервер устарел. Пожалуйста, настройте сначала сервер идентификации. Пожалуйста, примите сначала условия сервера идентификации в настройках. - Для вашей приватности, Element поддерживает отправку адреса электронной почты и номера телефона только в хэшированном виде. + Для вашей приватности, ${app_name} поддерживает отправку адреса электронной почты и номера телефона только в хэшированном виде. Привязка не удалась. Текущая взаимосвязь с этим идентификатором отсутствует. Ваш домашний сервер (%1$s) предлагает использовать %2$s для вашего сервера идентификации @@ -2134,11 +2424,10 @@ Нет доступа к этому сообщению, так как отправитель не доверяет вашей сессии Вы не можете получить доступ к этому сообщению, потому что отправитель намеренно не отправил ключи Ожидание истории шифрования - Riot теперь Element! - Мы рады сообщить, что сменили имя! Ваше приложение обновлено, и вы вошли в свою учетную запись. - ПОНЯТНО - УЗНАТЬ БОЛЬШЕ - element + Riot теперь Element! + Мы рады сообщить, что сменили имя! Ваше приложение обновлено, и вы вошли в свою учетную запись. + ПОНЯТНО + УЗНАТЬ БОЛЬШЕ Сохранить ключ восстановления в Добавить из моей телефонной книги Ваша телефонная книга пуста @@ -2209,7 +2498,6 @@ Код Используйте международный формат (номер телефона должен начинаться с \'+\') Подтвердите свою личность, проверив этот логин, предоставив ему доступ к зашифрованным сообщениям. - К сожалению, эта операция пока недоступна для учетных записей, подключенных с помощью единого входа. Невозможно открыть комнату, в которую вам запрещён доступ. Невозможно найти эту комнату. Убедитесь, что она существует. @@ -2228,13 +2516,13 @@ Удалить данные учетной записи типа %1$s\? \n \nИспользуйте с осторожностью, это может привести к неожиданному поведению. - ПИН-код потребуется каждый раз, когда вы откроете Element. - ПИН-код потребуется через 2 минуты неиспользования Element. + ПИН-код потребуется каждый раз, когда вы откроете ${app_name}. + ПИН-код потребуется через 2 минуты неиспользования ${app_name}. Требовать PIN-код через 2 минуты Отображать только количество непрочитанных сообщений в простом уведомлении. Показывать подробности, такие как названия комнат и содержание сообщений. Показывать содержимое в уведомлениях - PIN-код - единственный способ разблокировать Element. + PIN-код - единственный способ разблокировать ${app_name}. Включить биометрические данные устройства, такие как отпечатки пальцев и распознавание лиц. Включить биометрию Настроить защиту @@ -2314,8 +2602,8 @@ Поделиться моим кодом Сканировать QR-код Это недействительный QR-код matrix - 🔐️ Присоединяйтесь ко мне в Element - Привет, поговори со мной в Element: %s + 🔐️ Присоединяйтесь ко мне в ${app_name} + Привет, поговори со мной в ${app_name}: %s Пригласить друзей Добавить людей "Тема: " @@ -2428,7 +2716,40 @@ Эта комната не публичная. Вы не сможете повторно присоединиться без приглашения. Системная тема Не удалось пройти аутентификацию - Element требует от вас ввести свои учетные данные для выполнения этого действия. + ${app_name} требует от вас ввести свои учетные данные для выполнения этого действия. Требуется повторная аутентификация Не удалось настроить перекрестную подпись + Активный звонок (%1$s) + При поиске номера телефона произошла ошибка + Панель набора номера + Перезвонить + Этот вызов закончился + %1$s отменил(а) этот вызов + Вы отклонили этот вызов %1$s + Вы сейчас в этом вызове + Вы начали вызов + %1$s начал(а) вызов + Вы поставили вызов на удержание + %s поставил вызов на удержание + Удерживать + Возобновить + Пользователи + Произошла ошибка при переводе вызова + Перевод + Соединиться + Сначала спросить + + 1 активный вызов (%1$s) · 1 приостановленный вызов + 1 активный вызов (%1$s) · %2$d приостановленных вызова + 1 активный вызов (%1$s) · %2$d приостановленных вызовов + 1 активный вызов (%1$s) · %2$d приостановленных вызовов + + + Приостановленный вызов + %1$d приостановленных вызова + %1$d приостановленных вызовов + %1$d приостановленных вызовов + + Нет учётных данных, неправильная учётная запись пользователя и/или пароль + Вернуть \ No newline at end of file diff --git a/vector/src/main/res/values-si/strings.xml b/vector/src/main/res/values-si/strings.xml new file mode 100644 index 0000000000..e1939a1ed6 --- /dev/null +++ b/vector/src/main/res/values-si/strings.xml @@ -0,0 +1,8 @@ + + + %1$s: %2$s + පණිවිඩ + සැකසුම් + කාමරය + අඳුරු තේමාව + \ No newline at end of file diff --git a/vector/src/main/res/values-si/strings_no_weblate.xml b/vector/src/main/res/values-si/strings_no_weblate.xml new file mode 100644 index 0000000000..14f7be6a94 --- /dev/null +++ b/vector/src/main/res/values-si/strings_no_weblate.xml @@ -0,0 +1,8 @@ + + + + si + LK + Latn + + \ No newline at end of file diff --git a/vector/src/main/res/values-sk/strings.xml b/vector/src/main/res/values-sk/strings.xml index 1a4418e3a3..e32f6906ec 100644 --- a/vector/src/main/res/values-sk/strings.xml +++ b/vector/src/main/res/values-sk/strings.xml @@ -1,8 +1,214 @@ + %1$s: %2$s + %1$s poslal/a obrázok. + Pozvanie od %s + %1$s pozval/a %2$s + %1$s vás pozval/a + %1$s vstúpil/a do miestnosti + %1$s opustil/a miestnosť + %1$s odmietol/a pozvanie + %1$s vykázal/a %2$s + %1$s povolil/a vstupovať %2$s + %1$s zakázal/a vstupovať %2$s + %1$s vzal/a späť pozvanie %2$s + %1$s si zmenil/a obrázok v profile + %1$s si nastavil/a zobrazované meno %2$s + %1$s si zmenil/a zobrazované meno %2$s na %3$s + %1$s odstránil/a svoje zobrazované meno (%2$s) + %1$s zmenil/a tému na: %2$s + %1$s zmenil/a názov miestnosti na: %2$s + %s uskutočnil/a video hovor. + %s zatelefonoval/a. + %s prijal/a hovor. + %s ukončil/a hovor. + %1$s sprístupnil/a budúcu históriu miestnosti %2$s + pre všetkých členov, od kedy boli pozvaní. + pre všetkých členov, od kedy vstúpili. + pre všetkých členov. + pre každého. + neznámym (%s). + %1$s povolil/a E2E šifrovanie (%2$s) + %1$s požiadal/a o VoIP konferenciu + Začala sa VoIP konferencia + Skončila sa VoIP konferencia + (aj obrázok v profile) + %1$s odstránil/a názov miestnosti + %1$s odstránil/a tému miestnosti + %1$s aktualizoval/a svoj profil %2$s + %1$s pozval/a %2$s vstúpiť do miestnosti + %1$s prijal/a pozvanie pre %2$s + ** Nie je možné dešifrovať: %s ** + Zo zariadenia odosieľateľa nebolo možné získať kľúče potrebné na dešifrovanie tejto správy. + Nie je možné vymazať + Nie je možné odoslať správu + Nepodarilo sa nahrať obrázok + Chyba siete + Chyba Matrix + V súčasnosti nie je možné znovu vstúpiť do prázdnej miestnosti. + Emailová adresa + Telefónne číslo + %1$s poslal/a nálepku. + Pozvanie od %s + Pozvanie do miestnosti + %1$s a %2$s + Prázdna miestnosť + + %1$s a 1 ďalší + %1$s a %2$d ďalší + %1$s a %2$d ďalších + + %s aktualizoval/a túto miestnosť. + Odstránená správa + Odstránená správa používateľom %1$s + Odstránená správa [dôvod: %1$s] + Odstránená správa používateľom %1$s [dôvod: %2$s] + Úvodná synchronizácia: +\nPrebieha import účtu… + Úvodná synchronizácia: +\nPrebieha import šifrovacích kľúčov + Úvodná synchronizácia: +\nPrebieha import miestností + Úvodná synchronizácia: +\nPrebieha import miestností, do ktorých ste vstúpili + Úvodná synchronizácia: +\nPrebieha import pozvaní + Úvodná synchronizácia: +\nPrebieha import opustených miestností + Úvodná synchronizácia: +\nPrebieha import komunít + Úvodná synchronizácia: +\nPrebieha import údajov účtu + Odosielanie správy… + Vymazať správy na odoslanie + %1$s zamietol/a pozvanie používateľa %2$s vstúpiť do miestnosti + Pozvanie od %1$s. Dôvod: %2$s + %1$s pozval/a %2$s. Dôvod: %3$s + %1$s vás pozval/a. Dôvod: %2$s + %1$s vstúpil/a do miestnosti. Dôvod: %2$s + %1$s opustil/a miestnosť. Dôvod: %2$s + %1$s odmietol/a pozvanie. Dôvod: %2$s + %1$s vykázal/a %2$s. Dôvod: %3$s + %1$s povolil/a vstupovať %2$s. Dôvod: %3$s + %1$s zakázal/a vstupovať %2$s. Dôvod: %3$s + %1$s pozval/a %2$s vstúpiť do miestnosti. Dôvod: %3$s + %1$s zamietol/a pozvanie používateľa %2$s vstúpiť do miestnosti. Dôvod: %3$s + %1$s prijal/a pozvanie pre %2$s. Dôvod: %3$s + %1$s vzal/a späť pozvanie %2$s. Dôvod: %3$s + + %1$s pridal/a adresu %2$s pre túto miestnosť. + %1$s pridal/a adresy %2$s pre túto miestnosť. + %1$s pridal/a adresy %2$s pre túto miestnosť. + + + %1$s odstránil/a adresu %2$s pre túto miestnosť. + %1$s odstránil/a adresy %3$s pre túto miestnosť. + %1$s odstránil/a adresy %3$s pre túto miestnosť. + + %1$s pridal/a adresy %2$s a odstránil/a adresy %3$s pre túto miestnosť. + %1$s nastavil/a hlavnú adresu tejto miestnosti %2$s. + %1$s odstránil/a hlavnú adresu tejto miestnosti. + %1$s povolil/a hosťom///návštevníkom prístup do tejto miestnosti. + Poslali ste obrázok. + Poslali ste nálepku. + Pozvanie od vás + %1$s vytvoril/a miestnosť + Vytvorili ste miestnosť + Pozvali ste %1$s + Vstúpili ste do miestnosti + Opustili ste miestnosť + Odmietli ste pozvanie + Vykázali ste %1$s + Povolili ste vstupovať %1$s + Zakázali ste vstupovať %1$s + Vzali ste späť pozvanie %1$s + Zmenili ste si obrázok v profile + Nastavili ste si zobrazované meno %1$s + Zmenili ste si zobrazované meno %1$s na %2$s + Odstránili ste svoje zobrazované meno %1$s + Zmenili ste tému na: %1$s + %1$s zmenil/a obrázok miestnosti + Zmenili ste obrázok miestnosti + Zmenili ste názov miestnosti na: %1$s + Uskutočnili ste video hovor. + Zatelefonovali ste. + %s poslal údaje pre nastavenie hovoru. + Poslali ste údaje na nastavenie hovoru. + Prijali ste hovor. + Ukončili ste hovor. + Sprístupnili ste budúcu históriu miestnosti %1$s + Povolili ste E2E šifrovanie (%1$s) + Aktualizovali ste túto miestnosť. + Požiadali ste o VoIP konferenciu + Odstránili ste názov miestnosti + Odstránili ste tému miestnosti + %1$s odstránil obrázok miestnosti + Odstránili ste obrázok miestnosti + Aktualizovali ste svoj profil %1$s + Pozvali ste %1$s vstúpiť do miestnosti + Zamietli ste pozvanie používateľa %1$s vstúpiť do miestnosti + Prijali ste pozvanie pre %1$s + %1$s pridal/a widget %2$s + Pridali ste widget %1$s + %1$s odstránil/a widget %2$s + Odstránili ste widget %1$s + %1$s upravil/a widget %2$s + Upravili ste widget %1$s + Správca + Moderátor + Predvolený + Vlastná úroveň (%1$d) + Vlastná úroveň + Zmenili ste úroveň moci používateľa %1$s. + %1$s zmenil úroveň moci používateľa %2$s. + %1$s z %2$s na %3$s + Pozvanie od vás. Dôvod: %1$s + Pozvali ste %1$s. Dôvod: %2$s + Vstúpili ste do miestnosti. Dôvod: %1$s + Opustili ste miestnosť. Dôvod: %1$s + Odmietli ste pozvanie. Dôvod: %1$s + Vykázali ste %1$s. Dôvod: %2$s + Povolili ste vstupovať %1$s. Dôvod: %2$s + Zakázali ste vstupovať %1$s. Dôvod: %2$s + Pozvali ste %1$s vstúpiť do miestnosti. Dôvod: %2$s + Zamietli ste pozvanie používateľa %1$s vstúpiť do miestnosti. Dôvod: %2$s + Prijali ste pozvanie pre %1$s. Dôvod: %2$s + Vzali ste späť pozvanie %1$s. Dôvod: %2$s + + Pridali ste adresu %1$s pre túto miestnosť. + Pridali ste adresy %1$s pre túto miestnosť. + Pridali ste adresy %1$s pre túto miestnosť. + + + Odstránili ste adresu %1$s pre túto miestnosť. + Odstránili ste adresy %1$s pre túto miestnosť. + Odstránili ste adresy %1$s pre túto miestnosť. + + Pridali ste %1$s a odstránili adresy %2$s pre túto miestnosť. + Nastavili ste hlavnú adresu tejto miestnosti %1$s. + Odstránili ste hlavnú adresu tejto miestnosti. + Povolili ste hosťom///návštevníkom prístup do tejto miestnosti. + %1$s zakázal/a hosťom///návštevníkom prístup do tejto miestnosti. + Zakázali ste hosťom///návštevníkom prístup do tejto miestnosti. + %1$s povolil/a E2E šifrovanie. + Povolili ste E2E šifrovanie. + %1$s povolil/a E2E šifrovanie (Nerozpoznaný algorytmus %2$s). + Povolili ste E2E šifrovanie (Nerozpoznaný algorytmus %1$s). + nastavili ste na servery pravidlá ACL tejto miestnosti. + %s nastavil(a) na servery pravidlá ACL tejto miestnosti. + Aktualizovali ste sem. + %s aktualizoval(a) sem. + %1$s sprístupnil(a) budúce správy %2$s + Sprístupnili ste budúce správy %1$s + Opustili ste miestnosť + %1$s opustil(a) miestnosť + Vstúpili ste + %1$s vstúpil(a) + Vytvorili ste konverzáciu + %1$s vytvoril(a) konverzáciu Svetlý vzhľad Tmavý vzhľad - Čierny vzhľad + Čierny vzhľad Prebieha synchronizácia… Spracovanie udalostí @@ -83,7 +289,7 @@ Adresár používateľov Len Matrix kontakty Žiadne konverzácie - Aplikácii Element ste nepovolili prístup k lokálnym kontaktom + Aplikácii ${app_name} ste nepovolili prístup k lokálnym kontaktom Žiadne výsledky Miestnosti @@ -231,24 +437,24 @@ Emailovú adresu si môžete k účtu pridať neskôr cez nastavenia. Nie je možné nahrať video Informácia - Aby ste mohli posielať a prijímať súbory, Element potrebuje prístup k fotkám, videám a súborom vo vašom zariadení. + Aby ste mohli posielať a prijímať súbory, ${app_name} potrebuje prístup k fotkám, videám a súborom vo vašom zariadení. Prosím, povoľte prístup na nasledujúcej obrazovke. - Aby ste mohli fotiť obrázky a videá a tiež uskutočňovať video hovory, Element potrebuje prístup k fotoaparátu. + Aby ste mohli fotiť obrázky a videá a tiež uskutočňovať video hovory, ${app_name} potrebuje prístup k fotoaparátu. " \n \nProsím, povoľte prístup na nasledujúcej obrazovke, aby ste mohli uskutočniť hovor." - Aby ste mohli uskutočňovať audio hovory, Element potrebuje prístup k mikrofónu vašeho zariadenia. + Aby ste mohli uskutočňovať audio hovory, ${app_name} potrebuje prístup k mikrofónu vašeho zariadenia. " \n \nProsím, povoľte prístup na nasledujúcej obrazovke, aby ste mohli uskutočniť hovor." - Aby ste mohli uskutočňovať video hovory, Element potrebuje prístup k fotoaparátu a mikrofónu vašeho zariadenia. + Aby ste mohli uskutočňovať video hovory, ${app_name} potrebuje prístup k fotoaparátu a mikrofónu vašeho zariadenia. Prosím, povoľte prístup na nasledujúcich obrazovkách. - Aby ste mohli na Matrixe nájsť vašich známych podľa telefónneho čísla alebo emailovej adresy, Element potrebuje prístup k vašim kontaktom. Ak si prajete zdieľať váš zoznam kontaktov za týmto účelom, prosím, povoľte prístup na nasledujúcej obrazovke. - Aby ste mohli na Matrixe nájsť vašich známych podľa telefónneho čísla alebo emailovej adresy, Element potrebuje prístup k vašim kontaktom. + Aby ste mohli na Matrixe nájsť vašich známych podľa telefónneho čísla alebo emailovej adresy, ${app_name} potrebuje prístup k vašim kontaktom. Ak si prajete zdieľať váš zoznam kontaktov za týmto účelom, prosím, povoľte prístup na nasledujúcej obrazovke. + Aby ste mohli na Matrixe nájsť vašich známych podľa telefónneho čísla alebo emailovej adresy, ${app_name} potrebuje prístup k vašim kontaktom. -Chcete aplikácii Element povoliť prístup k vašim kontaktom? +Chcete aplikácii ${app_name} povoliť prístup k vašim kontaktom? Prepáčte, akcia nebola vykonaná kvôli chýbajúcim oprávneniam @@ -844,7 +1050,7 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác • Súčasťou oznámení nebude zobrazený obsah správ Súkromie oznámení - Element môže fungovať na pozadí aby spracovával vaše upozornenia bezpečne a v súkromí. Môže to ovplyvniť využitie batérie. + ${app_name} môže fungovať na pozadí aby spracovával vaše upozornenia bezpečne a v súkromí. Môže to ovplyvniť využitie batérie. Udeliť oprávnenie Vyberte inú voľbu @@ -859,8 +1065,8 @@ Pozor: tento súbor môže byť automaticky zmazaný po odinštalovaní aplikác Deaktivovať môj účet Odosielať analytické údaje - Element zbiera anonymné analytické údaje, čo nám umožňuje aplikáciu ďalej zlepšovať. - Prosím povoľte odosielanie analytických údajov a pomôžte nám tak vylepšovať Element. + ${app_name} zbiera anonymné analytické údaje, čo nám umožňuje aplikáciu ďalej zlepšovať. + Prosím povoľte odosielanie analytických údajov a pomôžte nám tak vylepšovať ${app_name}. Áno, chcem pomôcť! Chýba zadanie povinného argumentu. @@ -890,7 +1096,7 @@ Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť sp Znovu požiadať o šifrovacie kľúče z vašich ostatných relácií.Znovu požiadať o šifrovacie kľúče z vašich ostatných zariadení. - Prosím spustite Element na inom zariadení, ktoré je schopné dešifrovať túto správu, čím sa automaticky spustí prenos chýbajúcich kľúčov na túto reláciu. + Prosím spustite ${app_name} na inom zariadení, ktoré je schopné dešifrovať túto správu, čím sa automaticky spustí prenos chýbajúcich kľúčov na túto reláciu. Odoslať hlasovú správu @@ -997,8 +1203,6 @@ Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť sp Prepáčte, vyskytla sa chyba - Vzhľad Status.im - Verzia %s Prosím vytvorte si heslo, ktorým zašifrujete exportované kľúče. Toto isté heslo budete musieť zadať aj pri importe kľúčov z uloženého súboru. Vytvoriť heslo @@ -1022,7 +1226,7 @@ Viditeľnosť správ odoslaných cez matrix funguje podobne ako viditeľnosť sp Prosím prečítajte si a odsúhlaste zmluvné podmienky tohoto domovského servera: Hovory - Použiť predvolené zvonenie Element pre prichádzajúce hovory + Použiť predvolené zvonenie ${app_name} pre prichádzajúce hovory Zvonenie pre prichádzajúci hovor Vyberte zvonenie pre prichádzajúce hovory: @@ -1053,13 +1257,13 @@ Prosím, skontrolujte nastavenia účtu. Nastavenia relácií. Oznámenia sú povolené pre túto reláciu. - Oznámenia nie sú povolené pre túto reláciu. -\nProsím, skontrolujte nastavenia Elementu. + Oznámenia nie sú povolené pre túto reláciu. +\nProsím, skontrolujte nastavenia ${app_name}u. Povoliť Kontrola aplikácii Služby Google Play Aplikácia Služby Google Playje k dispozícii a aktualizovaná. - Element používa aplikáciu Služby Google Play na doručovanie oznámení. No zdá sa, že táto nie je správne nakonfigurovaná: + ${app_name} používa aplikáciu Služby Google Play na doručovanie oznámení. No zdá sa, že táto nie je správne nakonfigurovaná: \n%1$s Opraviť Služby Play @@ -1086,19 +1290,19 @@ Prosím skúste reštartovať aplikáciu. Spustenie po zapnutí Služba sa automaticky spustí po reštarte zariadenia. - Služba sa automaticky nespustí po reštarte zariadenia a nedostanete po reštarte žiadne oznámenia, kým nespustíte Element aspoň raz. + Služba sa automaticky nespustí po reštarte zariadenia a nedostanete po reštarte žiadne oznámenia, kým nespustíte ${app_name} aspoň raz. Povoliť spustenie služby po reštarte Kontrola obmedzenia spustenia na pozadí - Obmedzenie spustenia na pozadí nie je aktívne pre Element. Tento test je potrebné spustiť cez mobilné dáta (nie cez wifi). + Obmedzenie spustenia na pozadí nie je aktívne pre ${app_name}. Tento test je potrebné spustiť cez mobilné dáta (nie cez wifi). %1$s - Obmedzenie spustenia na pozadí je aktívne pre Element. -Činnosť aplikácii bude agresívne obmedzovaná operačným systémom, keď je Element na pozadí. Môže to mať negatívny vplyv na doručovanie oznámení. + Obmedzenie spustenia na pozadí je aktívne pre ${app_name}. +Činnosť aplikácii bude agresívne obmedzovaná operačným systémom, keď je ${app_name} na pozadí. Môže to mať negatívny vplyv na doručovanie oznámení. %1$s Deaktivovať obmedzenia Optimalizácia batérie - Chod Element nie je ovplyvnený nastavením optimalizácie batérie. + Chod ${app_name} nie je ovplyvnený nastavením optimalizácie batérie. Ak používateľ na nejaký čas ponechá zariadenie s vypnutou obrazovkou odložené odpojené od napájania, na zariadení sa použije režim Doze. Toto aplikáciám zabráni pristupovať k sieti, pozastaví ich naplánované úlohy, synchronizáciu aj bežné signály. Ignorovať optimalizáciu @@ -1114,8 +1318,8 @@ Prosím skúste reštartovať aplikáciu. Zobrazovať udalosti účtu Zahŕňa zmeny zobrazovaného mena a obrázka v profile. Pripojenie na pozadí - Element potrebuje na pozadí udržovať aktívne nenáročné spojenie, aby spoľahlivo fungovali oznámenia. -Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí pre Element. Prosím povoľte ho. + ${app_name} potrebuje na pozadí udržovať aktívne nenáročné spojenie, aby spoľahlivo fungovali oznámenia. +Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí pre ${app_name}. Prosím povoľte ho. Udeliť oprávnenie Pri pokuse overiť vašu emailovú adresu sa vyskytla chyba. @@ -1168,12 +1372,12 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí Nepodarilo sa načítať pravidlá oznámení. Prosím, skúste znovu. Skontrolovať nastavenia - [%1$s] -\nNa zariadení máte množstvo aplikácií zaregistrovaných na doručovanie okamžitých oznámení cez služby Google play. Konfigurácia Element nemá vplyv na výskyt tejto chyby. Podľa Google sa môže vyskytovať len pri veľmi vysokom počte nainštalovaných aplikácií. Bežní používatelia by týmto nemali byť postihnutí. - [%1$s] -\nKonfigurácia Element nemá vplyv na zobrazenie tejto chyby. Táto chyba sa môže zobraziť z niekoľkých dôvodov. Uistite sa že máte správne nastavený systémový čas a že ste v nastaveniach systému aplikácii služby Google play neobmedzili používanie prístupu na internet. Chyba sa tiež môže zobrazovať na vlastných zostaveniach (ROM), alebo sa chyba môže samovoľne prestať zobrazovať neskôr. - [%1$s] -\nV zariadení nemáte nastavený účet Google. Prosím, pridajte si účet cez správcu účtov. Konfigurácia Element nemá vplyv na zobrazenie tejto chyby. + [%1$s] +\nNa zariadení máte množstvo aplikácií zaregistrovaných na doručovanie okamžitých oznámení cez služby Google play. Konfigurácia ${app_name} nemá vplyv na výskyt tejto chyby. Podľa Google sa môže vyskytovať len pri veľmi vysokom počte nainštalovaných aplikácií. Bežní používatelia by týmto nemali byť postihnutí. + [%1$s] +\nKonfigurácia ${app_name} nemá vplyv na zobrazenie tejto chyby. Táto chyba sa môže zobraziť z niekoľkých dôvodov. Uistite sa že máte správne nastavený systémový čas a že ste v nastaveniach systému aplikácii služby Google play neobmedzili používanie prístupu na internet. Chyba sa tiež môže zobrazovať na vlastných zostaveniach (ROM), alebo sa chyba môže samovoľne prestať zobrazovať neskôr. + [%1$s] +\nV zariadení nemáte nastavený účet Google. Prosím, pridajte si účet cez správcu účtov. Konfigurácia ${app_name} nemá vplyv na zobrazenie tejto chyby. Pridať účet Aplikácia sa nepotrebuje pripájať k domovskému serveru, keď beží na pozadí, čo môže predĺžiť výdrž batérie @@ -1265,7 +1469,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí Úspešné Oznámenia - Element hovor zlyhal + ${app_name} hovor zlyhal Nepodarilo sa uskutočniť spojenie v reálnom čase. \nProsím, požiadajte správcu domovského servera, aby správne nastavil server turn na zaistenie čo najspoľahlivejšej prevádzky hovorov. @@ -1314,17 +1518,17 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí Povolením používateľovi vstupovať zaistíte, aby sa používateľ mohol vrátiť do miestnosti. Potvrdiť vaše heslo - Toto nie je možné urobiť cez mobilnú aplikáciu Element + Toto nie je možné urobiť cez mobilnú aplikáciu ${app_name} Je požadované overenie Režim synchronizácie na pozadí (Experimentálne) Optimalizovaný na využívanie batérie - Element sa bude synchronizovať na pozadí s cieľom ušetriť limitované zdroje (batériu). + ${app_name} sa bude synchronizovať na pozadí s cieľom ušetriť limitované zdroje (batériu). \nV závislosti od kapacity prostriedkov zariadenia môže byť synchronizácia odložená operačným systémom na neskôr. Optimalizovaný na používanie v reálnom čase - Element sa bude pravideľne synchronizovať na pozadí v presne stanovenom čase (nastaviteľné). -\nToto ovplyvní využívanie batérie a prenos údajov, v oznamovacej oblasti sa bude neustále zobrazovať upozornenie, že Element spracúva udalosti. + ${app_name} sa bude pravideľne synchronizovať na pozadí v presne stanovenom čase (nastaviteľné). +\nToto ovplyvní využívanie batérie a prenos údajov, v oznamovacej oblasti sa bude neustále zobrazovať upozornenie, že ${app_name} spracúva udalosti. Žiadna synchronizácia na pozadí Nebudete dostávať oznámenia o prichádzajúcich správach, keď aplikácia pracuje na pozadí. Nepodarilo sa aktualizovať nastavenia. @@ -1426,7 +1630,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí Prosím, zadajte dlhé heslo Dlhé heslo je príliš slabé - Prosím, zmažte dlhé heslo, ak si želáte vygenerovať kľúč obnovenia. + Prosím, zmažte dlhé heslo, ak si želáte vygenerovať kľúč obnovenia. Nie je dostupná žiadna relácia matrix Nikdy nepríďte o šifrované správy @@ -1574,7 +1778,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí Neplatná odpoveď pri zisťovaní domovského servera Automaticky doplniť možnosti servera - Element zistil vlastné nastavenie servera pre vaše ID používateľa a doménu \"%1$s\": + ${app_name} zistil vlastné nastavenie servera pre vaše ID používateľa a doménu \"%1$s\": \n%2$s Použiť nastavenia @@ -1671,7 +1875,7 @@ Na ďalšej obrazovke vás systém požiada o povolenie vždy bežať na pozadí Všetky komunity Nie je možné zobraziť náhľad tejto miestnosti - Nazeranie do verejných miestností nie je zatiaľ podporované + Nazeranie do verejných miestností nie je zatiaľ podporované Miestnosti Priame konverzácie diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml index 27245ea122..90b0e45a9b 100644 --- a/vector/src/main/res/values-sq/strings.xml +++ b/vector/src/main/res/values-sq/strings.xml @@ -1,9 +1,266 @@ + %1$s: %2$s + %1$s dërgoi një figurë. + %1$s ftoi %2$s + %1$s ju ftoi + %1$s hyri në dhomë + %1$s doli nga dhoma + %1$s hodhi tej ftesën + %1$s përzuri %2$s + %1$s dëboi %2$s + %1$s ndryshoi avatarin e vet + %1$s ndryshoi temën në: %2$s + %1$s ndryshoi emrin e dhomës në: %2$s + %s bëri një thirrje video. + %s bëri një thirrje zanore. + %s iu përgjigj thirrjes. + %s e përfundoi thirrjen. + %1$s e bëri historikun e ardhshëm të dhomës të dukshëm për %2$s + për krejt anëtarët e dhomës, prej çastit kur janë ftuar. + për krejt anëtarët e dhomës, prej çastit kur morën pjesë. + krejt anëtarët e dhomës. + cilido. + e panjohur (%s). + %1$s kërkoi një konferencë VoIP + Konferenca VoIP filloi + Konferenca VoIP përfundoi + (u ndryshua edhe avatari) + %1$s hoqi emrin e dhomës + %1$s përditësoi profilin e tij %2$s + %1$s pranoi ftesën tuaj për %2$s + ** S’arrihet të shfshehtëzohet: %s ** + Pajisja e dërguesit nuk na ka dërguar kyçet për këtë mesazh. + S’u redaktua dot + S’arrihet të dërgohet mesazh + Ngarkimi i figurës dështoi + Gabim rrjeti + Gabim Matrix + Hëpërhë s’është e mundur të rihyhet në një dhomë të zbrazët. + Adresë email + Numër telefoni + Ftesë nga %s + Ftesë Dhome + %1$s dhe %2$s + Dhomë e zbrazët + %1$s dërgoi një ngjitës. + Ftesë e %s + %1$s hoqi dëbimin për %2$s + %1$s tërhoqi mbrapsht ftesën për %2$s + %1$s caktoi për veten emër ekrani %2$s + %1$s ndryshoi emrin e tyre në ekran nga %2$s në %3$s + %1$s hoqi emrin e tij në ekran (%2$s) + %1$s aktivizoi fshehtëzim skaj-më-skaj (%2$s) + %1$s hoqi temën e dhomës + %1$s dërgoi një ftesë për %2$s që të marrë pjesë në dhomë + + %1$s dhe 1 tjetër + %1$s dhe %2$d të tjerë + + Mesazhi u hoq + Mesazhi u hoq nga %1$s + Mesazh i hequr [arsye: %1$s] + Mesazh i hequr nga %1$s [arsye: %2$s] + %s e përmirësoi këtë dhomë. + Njëkohësimi Fillestar: +\nPo importohet llogaria… + Njëkohësimi Fillestar: +\nPo importohet kriptografi + Njëkohësimi Fillestar: +\nPo importohen Dhoma + Njëkohësimi Fillestar: +\nPo importohen Dhoma Ku Është Bërë Hyrje + Njëkohësimi Fillestar: +\nPo importohen Dhoma Me Ftesë + Njëkohësimi Fillestar: +\nPo importohen Dhoma të Braktisura + Njëkohësimi Fillestar: +\nPo importohen Bashkësi + Njëkohësimi Fillestar: +\nPo importohet të Dhëna Llogarie + Po dërgohet mesazh… + Spastro radhë pritjeje + %1$s shfuqizoi ftesën për %2$s për pjesëmarrje te dhoma + Ftesë e %1$s. Arsye: %2$s + %1$s ftoi %2$s. Arsye: %3$s + %1$s ju ftoi. Arsye: %2$s + %1$s erdhi në dhomë. Arsye: %2$s + %1$s doli nga dhoma. Arsye: %2$s + %1$s hodhi poshtë ftesën. Arsye: %2$s + %1$s përzuri %2$s. Arsye: %3$s + %1$s hoqi dëbimin për %2$s. Arsye: %3$s + %1$s dëboi %2$s. Arsye: %3$s + %1$s dërgoi një ftesë për %2$s për të ardhur në dhomë. Arsye: %3$s + %1$s shfuqizoi ftesën për %2$s për të ardhur në dhomë. Arsye: %3$s + %1$s pranoi ftesën për %2$s. Arsye: %3$s + %1$s tërhoqi mbrapsht ftesën për %2$s. Arsye: %3$s + + %1$s shtoi %2$s si një adresë për këtë dhomë. + %1$s shtoi %2$s si adresa për këtë dhomë. + + + %1$s hoqi %2$s si adresë për këtë dhomë. + %1$s hoqi %2$s si adresa për këtë dhomë. + + %1$s shtoi %2$s dhe hoqi %3$s si adresa për këtë dhomë. + %1$s caktoi %2$s si adresë kryesore për këtë dhomë. + %1$s hoqi adresën kryesore për këtë dhomë. + %1$s ka lejuar vizitorë të marrin pjesë në dhomë. + %1$s ka penguar vizitorë të marrin pjesë në dhomë. + %1$s aktivizoi fshehtëzim skaj-më-skaj. + %1$s aktivizoi fshehtëzim skaj-më-skaj (algoritëm i papranuar %2$s). + %1$s krijo dhomën + Dërguat një figurë. + Dërguat një ngjitës. + Ftesa juaj + Krijuat dhomën + Ftuat %1$s + Hytë në dhomë + Dolët nga dhoma + Hodhët poshtë ftesën + Përzutë %1$s + Hoqët dëbimin për %1$s + Dëbuat %1$s + Tërhoqët mbrapsht ftesën për %1$s + Ndryshuat avatarin tuaj + Caktuat si emrin tuaj në ekran %1$s + E ndryshuat emrin tuaj në ekran nga %1$s në %2$s + Hoqët emrin tuaj në ekran (qe %1$s) + E ndryshuat temën në: %1$s + %1$s ndryshoi avatarin e dhomës + Ndryshuat avatarin e dhomës + Ndryshuat emrin e dhomës në: %1$s + Filluat një thirrje video. + Filluat një thirrje zanore. + %s dërgoi të dhëna për ujdisjen e thirrjes. + Dërguat të dhëna për ujdisjen e thirrjes. + Iu përgjigjët thirrjes. + E përfunduat thirrjen. + E bëtë historikun e ardhshëm të dhomë të dukshëm për %1$s + Aktivizuat fshehtëzim skaj-më-skaj (%1$s) + Përmirësuat këtë dhomë. + Kërkuat një konferencë VoIP + Hoqët emrin e dhomës + Hoqët temën e dhomës + %1$s hoqi avatarin e dhomës + Hoqët avatarin e dhomës + Përditësuat profilin tuaj %1$s + Dërguat një ftesë te %1$s për të ardhur te dhoma + Shfuqizuat ftesën për ardhjen në dhomë të %1$s + Pranuat ftesën për %1$s + %1$s shtoi widget-in %2$s + Shtuat widget-in %1$s + %1$s hoqi widget-in %2$s + Hoqët widget-in %1$s + %1$s ndryshoi widget-in %2$s + Ndryshuat widget-in %1$s + Përgjegjës + Moderator + Parazgjedhje + Vetjake (%1$d) + Vetjake + Ndryshuat shkallën e pushtetit për %1$s. + %1$s ndryshoi shkallën e pushtetit për %2$s. + %1$s nga %2$s në %3$s + Ftesa juaj. Arsye: %1$s + Ftuat %1$s. Arsye: %2$s + Erdhët në dhomë, Arsye: %1$s + Ikët nga dhoma. Arsye: %1$s + Hodhët poshtë ftesën. Arsye: %1$s + Përzutë %1$s. Arsye: %2$s + Hoqët dëbimin për %1$s. Arsye: %2$s + Dëbuat %1$s. Arsye: %2$s + Dërguat një ftesë për %1$s të vijë në dhomë. Arsye: %2$s + Shfuqizuat ftesën për ardhjen në dhomë të %1$s. Arsye: %2$s + Pranuat ftesën për %1$s. Arsye: %2$s + Tërhoqët mbrapsht ftesën për %1$s. Arsye: %2$s + + Shtuat %1$s si një adresë për këtë dhomë. + Shtuat %1$s si adresa për këtë dhomë. + + + Hoqët %1$s si një adresë për këtë dhomë. + Hoqët %1$s si adresa për këtë dhomë. + + Shtuat %1$s dhe hoqët %2$s si adresa për këtë dhomë. + Caktuat si adresë kryesore për këtë dhomë %1$s. + Hoqët adresën kryesore për këtë dhomë. + Keni lejuar të vijnë mysafirë në dhomë. + U keni penguar mysafirëve të vijnë në dhomë. + Aktivizuat fshehtëzimin skaj-më-skaj. + Aktivizuat fshehtëzimin skaj-më-skaj (algoritëm %1$s i panjohur). + Keni penguar të vijnë në dhomë mysafirë. + %1$s ka penguar të vijnë në dhomë mysafirë. + Keni lejuar të vijnë mysafirë këtu. + %1$s ka lejuar të vijnë këtu mysafirë. + Dolët. Arsye: %1$s + %1$s doli. Arsye: %2$s + Erdhët. Arsye: %1$s + %1$s erdhi. Arsye: %2$s + Shfuqizuat ftesën për %1$s + %1$s shfuqizoi ftesën për %2$s + Ftuat %1$s + %1$s ftoi %2$s + U përmirësuat këtu. + %s këtu u përmirësua. + I bëtë mesazhet e ardhshëm të dukshëm për %1$s + %1$s i bëri mesazhet e ardhshëm të dukshëm për %2$s + Dolët nga dhoma + %1$s doli nga dhoma + Erdhët + %1$s erdhi + Krijuat diskutimin + %1$s krijoi diskutimin + Dhomë e zbrazët (was %s) + + %1$s, %2$s, %3$s dhe %4$d tjetër + %1$s, %2$s, %3$s dhe %4$d të tjerë + + %1$s, %2$s, %3$s dhe %4$s + %1$s, %2$s dhe %3$s + 🎉 U është penguar pjesëmarrja krejt shërbyesve! Kjo dhomë s’mund të përdoret më. + Pa ndryshim. + Ndryshuat ACL-ra shërbyesi për këtë dhomë. + %s ndryshoi ACL-ra shërbyesi për këtë dhomë. + Ujdisët ACL-ra shërbyesi për këtë dhomë. + %s ujdisi ACL-ra shërbyesi për këtë dhomë. + • Shërbyes që kanë përputhje me %s u hoqën nga lista e të lejuarve. + • Shërbyesit që kanë përputhje me %s tani janë të lejuar. + • Shërbyesit që kanë përputhje me %s u hoqën nga lista e ndalimeve. + • Shërbyesit që kanë përputhje me %s tani janë të ndaluar. + • Shërbyesit që kanë përputhje me %s janë të ndaluar. + • Shërbyesit që kanë përputhje me %s janë të ndaluar. + Ndryshuat adresat për këtë dhomë. + %1$s ndryshoi adresat për këtë dhomë. + Ndryshuat adresat kryesore dhe alternative për këtë dhomë. + %1$s ndryshoi adresat kryesore dhe alternative për këtë dhomë. + Ndryshuat adresat alternative për këtë dhomë. + %1$s ndryshoi adresat alternative për këtë dhomë. + + Hoqët adresën alternative %1$s për këtë dhomë. + Hoqët adresat alternative %1$s për këtë dhomë. + + + %1$s hoqët adresën alternative %2$s për këtë dhomë. + %1$s hoqët adresat alternative %2$s për këtë dhomë. + + + Shtuat adresën alternative %1$s për këtë dhomë. + Shtuat adresat alternative %1$s për këtë dhomë. + + + %1$s shtoi adresën alternative %2$s për këtë dhomë. + %1$s shtoi adresat alternative %2$s për këtë dhomë. + + Ndryshuat konferencën video + Konferenca video u ndryshua nga %1$s + Përfunduat konferencën video + Konferenca video u përfundua nga %1$s + Nisët një konferencë video + Konferencë video nisur nga %1$s Temë e Çelët Temë e Errët - Temë e Zezë - Temë Status.im + Temë e Zezë Njoftime të zhurmshme Njoftime të heshtura Mesazhe @@ -617,7 +874,7 @@ Video Ju duhen leje për ftesa, që të nisni një konferencë në këtë dhomë Të parapëlqyer - S’e lejuat Element-in të hyjë në kontaktet tuaja vendore + S’e lejuat ${app_name}-in të hyjë në kontaktet tuaja vendore Ju lutemi, përshkruajeni të metën. Ç’po bënit? Ç’prisnit të ndodhte? Ç’ndodhi në fakt? Duket se po përplasni telefonin nga inati. Do të donit të hapej skena për njoftim të metash? Herën e fundit aplikacioni u vithis. Do të donit të hapej skena e raportimit të vithisjeve? @@ -632,7 +889,7 @@ Fjalëkalimi juaj u ricaktua. \n \nËshtë bërë dalja juaj nga llogaria në krejt sesionet dhe s’do të merrni më njoftime push. Për riaktivizim të njoftimeve, ribëni hyrjen në çdo pajisje. - Ju lutemi, niseni Element-in në një tjetër pajisje që mund të shfshehtëzojë mesazhin, që kështu të mund të dërgojë kyçet te ky sesion. + Ju lutemi, niseni ${app_name}-in në një tjetër pajisje që mund të shfshehtëzojë mesazhin, që kështu të mund të dërgojë kyçet te ky sesion. Lidhja e Medias Dështoi S’regjistrohet dot video Kjo ftesë i qe dërguar %s, që s’është i përshoqëruar me këtë llogari. @@ -700,22 +957,22 @@ U bë lidhja e thirrjes Po bëhet lidhja e thirrjes… Ana e largët dështoi të përgjigjet. - Për të dërguar dhe ruajtur bashkëngjitje, Element-i lyp leje të përdorë mediatekën tuaj. + Për të dërguar dhe ruajtur bashkëngjitje, ${app_name}-i lyp leje të përdorë mediatekën tuaj. \n \nJu lutemi, lejoni përdorimin, që nga flluska pasuese, që të jetë në gjendje të dërgojë kartela që nga telefoni juaj. - Për të bërë foto dhe thirrje video, Element-i lyp leje të përdorë kamerën tuaj. + Për të bërë foto dhe thirrje video, ${app_name}-i lyp leje të përdorë kamerën tuaj. " \n \nJu lutemi, lejoni përdorimin, që nga flluska pasuese, që të jetë në gjendje të bëjë thirrjen." - Për të kryer thirrje audio, Element-i lyp leje të përdorë mikrofonin tuaj. + Për të kryer thirrje audio, ${app_name}-i lyp leje të përdorë mikrofonin tuaj. " \n \nJu lutemi, lejoni përdorimin, që nga flluska pasuese, që të jetë në gjendje të bëjë thirrjen." - Për të kryer thirrje video, Element-i lyp leje të përdorë kamerën dhe mikrofonin tuaj. + Për të kryer thirrje video, ${app_name}-i lyp leje të përdorë kamerën dhe mikrofonin tuaj. \n \nJu lutemi, lejoni përdorimin, që nga flluskat pasuese, që të jetë në gjendje të bëjë thirrjen. - Për të gjetur përdorues të tjerë Matrix, bazuar në email-et apo numrat e tyre të telefonit, Element-i mund të kërkojë në librin tuaj të adresave. Nëse jeni dakord të lejohet hyrja në librin tuaj të adresave për këtë qëllim, ju lutemi, lejojeni hyrjen gjatë flluskës pasuese. - Për të gjetur përdorues të tjerë Matrix, bazuar në email-et apo numrat e tyre të telefonit, Element-i mund të kërkojë në librin tuaj të adresave. + Për të gjetur përdorues të tjerë Matrix, bazuar në email-et apo numrat e tyre të telefonit, ${app_name}-i mund të kërkojë në librin tuaj të adresave. Nëse jeni dakord të lejohet hyrja në librin tuaj të adresave për këtë qëllim, ju lutemi, lejojeni hyrjen gjatë flluskës pasuese. + Për të gjetur përdorues të tjerë Matrix, bazuar në email-et apo numrat e tyre të telefonit, ${app_name}-i mund të kërkojë në librin tuaj të adresave. \n \nJeni dakord të lejohet hyrja në librin tuaj të adresave për këtë qëllim\? Na ndjeni. Veprimi nuk u krye, për shkak lejesh që mungojnë @@ -804,9 +1061,9 @@ Lejojuni përdoruesve të tjerë të dinë se po shtypni. Formatojini mesazhet duke përdorur sintaksën Markdown përpara se të dërgohen. Kjo lejon formatim të thelluar, f.v., përdorimi i yllthit për ta shfaqur tekstin me të pjerrëta. Nuk prek ftesat, përzëniet dhe dëbimet. - Element-i mund të xhirojë në prapaskenë që të administrojë njoftimet tuaja në rrugë të sigurt dhe privatisht. Kjo mund të ndikojë në harxhimin e baterisë. - Element-i grumbullon të dhëna analitike anonime që të na lejojë ta përmirësojmë aplikacionin. - Ju lutemi, aktivizoni analizat që të na ndihmoni të përmirësojmë Element-in. + ${app_name}-i mund të xhirojë në prapaskenë që të administrojë njoftimet tuaja në rrugë të sigurt dhe privatisht. Kjo mund të ndikojë në harxhimin e baterisë. + ${app_name}-i grumbullon të dhëna analitike anonime që të na lejojë ta përmirësojmë aplikacionin. + Ju lutemi, aktivizoni analizat që të na ndihmoni të përmirësojmë ${app_name}-in. Të shfaqen krejt mesazhet prej %s\? \n \nKini parasysh që ky veprim do të sjellë rinisjen e aplikacionit dhe mund të hajë ca kohë. @@ -833,7 +1090,7 @@ Dërgoni një ngjitës vazhdoni me… Thirrje - Për thirrje ardhëse përdor zilen parazgjedhje të Element-it + Për thirrje ardhëse përdor zilen parazgjedhje të ${app_name}-it Zile thirrjesh ardhëse Përzgjidhni zile për thirrjet: Kjo dhomë nuk shfaq simbole për ndonjë bashkësi @@ -861,12 +1118,12 @@ Aktivizoje Rregullime Sesioni. Njoftimet janë të aktivizuara për këtë sesion. - Nuk janë aktivizuar njoftimet për këtë sesion. -\nJu lutemi, kontrolloni rregullimet e Element-it. + Nuk janë aktivizuar njoftimet për këtë sesion. +\nJu lutemi, kontrolloni rregullimet e ${app_name}-it. Aktivizoje Kontroll pë Play Services APK-ja për Google Play Services është e pranishme dhe e përditësuar. - Element-i përdor Google Play Services për të dorëzuar mesazhe push, por s’duket të jetë formësuar saktë: + ${app_name}-i përdor Google Play Services për të dorëzuar mesazhe push, por s’duket të jetë formësuar saktë: \n%1$s Ndreqni Play Services Token Firebase @@ -888,22 +1145,22 @@ S’u arrit të rinisej shërbimi Nise gjatë nisjes së sistemit Shërbimi do të niset kur të riniset pajisja. - Shërbimi s’do të niset kur të riniset pajisja, s’do të merrni njoftime derisa Element-i të jetë hapur një herë. + Shërbimi s’do të niset kur të riniset pajisja, s’do të merrni njoftime derisa ${app_name}-i të jetë hapur një herë. Aktivizo Nisje gjatë nisjes së sistemit Kontrollo kufizime prapaskene - Kufizimet për në prapaskenë janë të çaktivizuar për Element-in. Ky test duhet të xhirojë duke përdorur të dhëna rrjeti celular (jo WIFI). + Kufizimet për në prapaskenë janë të çaktivizuar për ${app_name}-in. Ky test duhet të xhirojë duke përdorur të dhëna rrjeti celular (jo WIFI). \n%1$s - Kufizimet për në prapaskenë janë të aktivizuara për Element-in. + Kufizimet për në prapaskenë janë të aktivizuara për ${app_name}-in. \nPuna që aplikacioni rreket të bëjë do të kufizohet në mënyrë agresive, teksa gjendet në prapaskenë, dhe kjo mund të prekë njoftimet. \n%1$s Çaktivizoji kufizimet Optimizim Baterie - Element-i nuk preket nga Optimizime Baterie. + ${app_name}-i nuk preket nga Optimizime Baterie. Nëse një përdorues e lë një pajisje jo në prizë dhe të palëvizshme për një periudhë, me ekranin të fikur, pajisja kalon nën mënyrën Dremitje. Kjo u parandalon aplikimeve të hyjnë në rrjet dhe shtyn për më vonë punët e tyre, njëkohësimet dhe alarmet standarde. Shpërfille Optimizimin Lidhje Në Prapaskenë - Për t’ju dhënë njoftime të qëndrueshme, Element-i lyp të mbajë në prapaskenë një lidhje me pak ndikim. -\nNë skenën pasuese do t’ju kërkohet të lejoni Element-in të xhirojë në prapaskenë, ju lutemi, pranojeni. + Për t’ju dhënë njoftime të qëndrueshme, ${app_name}-i lyp të mbajë në prapaskenë një lidhje me pak ndikim. +\nNë skenën pasuese do t’ju kërkohet të lejoni ${app_name}-in të xhirojë në prapaskenë, ju lutemi, pranojeni. Akordojini leje Ndodhi një gabim teksa verifikohej adresa juaj email. Ndodhi një gabim teksa verifikohej numri juaj i telefonit. @@ -922,12 +1179,12 @@ Disa njoftime janë të çaktivizuara te rregullimet tuaja vetjake. S’u arrit të ngarkohen rregulla vetjakë, ju lutemi, riprovoni. Kontrolloni Rregullimet - [%1$s] -\nKy gabim është jashtë kontrollit të Element-it dhe, sipas Google-it, ky gabim është shenjë se pajisja ka shumë aplikacione të regjistruar me FCM. Gabimi ndodh vetëm në raste kur ka një numër të skajshëm aplikacionesh, ndaj nuk duhet të prekë përdoruesin mesatar. - [%1$s] -\nKy gabim është jashtë kontrollit të Element-it. Mund të ndodhë për disa arsye. Ndoshta do të funksionojë, nëse riprovoni më vonë, mund të kontrolloni edhe nëse për Google Play Service s’ka kufizime lidhur me përdorimin e të dhënave, te rregullimet e sistemit, ose se ora e pajisjes suaj është e saktë, ose mund të ndodhë në ROM të përshtatur. - [%1$s] -\nKy gabim është jashtë kontrollit të Element-it. S’ka llogari Google te telefoni. Ju lutemi, hapni përgjegjësin e llogarive dhe shtoni një llogari Google. + [%1$s] +\nKy gabim është jashtë kontrollit të ${app_name}-it dhe, sipas Google-it, ky gabim është shenjë se pajisja ka shumë aplikacione të regjistruar me FCM. Gabimi ndodh vetëm në raste kur ka një numër të skajshëm aplikacionesh, ndaj nuk duhet të prekë përdoruesin mesatar. + [%1$s] +\nKy gabim është jashtë kontrollit të ${app_name}-it. Mund të ndodhë për disa arsye. Ndoshta do të funksionojë, nëse riprovoni më vonë, mund të kontrolloni edhe nëse për Google Play Service s’ka kufizime lidhur me përdorimin e të dhënave, te rregullimet e sistemit, ose se ora e pajisjes suaj është e saktë, ose mund të ndodhë në ROM të përshtatur. + [%1$s] +\nKy gabim është jashtë kontrollit të ${app_name}-it. S’ka llogari Google te telefoni. Ju lutemi, hapni përgjegjësin e llogarive dhe shtoni një llogari Google. Shtoni Llogari Formësoni Njoftime të Zhurmshme Formësoni Njoftime Thirrjesh @@ -938,7 +1195,7 @@ Të heshtur Ju lutemi, jepni një frazëkalim Frazëkalimi është shumë i dobët - Ju lutemi, fshini frazëkalimin, nëse doni që Element-i të prodhojë një kyç rimarrjesh. + Ju lutemi, fshini frazëkalimin, nëse doni që ${app_name}-i të prodhojë një kyç rimarrjesh. S’ka sesione Matrix të gatshëm Mos humbni kurrë mesazhe të fshehtëzuar Mesazhet në dhoma të fshehtëzuara sigurohen me fshehtëzim skaj-më-skaj. Vetëm ju dhe marrësi(t) keni kyçet për leximin e këtyre mesazheve. @@ -1068,7 +1325,7 @@ Unë qeshë Përgjigje e pavlefshme zbulimi shërbyesi Home Mundësi Vetëplotësimi Shërbyesi - Element-i pikasi një formësim shërbyesi të përshtatur për përkatësinë tuaj userId \"%1$s\": + ${app_name}-i pikasi një formësim shërbyesi të përshtatur për përkatësinë tuaj userId \"%1$s\": \n%2$s Përdor Formësim Po gatitet shërbimi @@ -1182,7 +1439,7 @@ Ju lutemi, pritni… Krejt Bashkësitë Kjo dhomë s’mund të parashihet - Paraparja e dhomave të lexueshme nga bota nuk mbulohet ende në Element + Paraparja e dhomave të lexueshme nga bota nuk mbulohet ende në ${app_name} Dhoma Mesazhe të Drejtpërdrejtë Dhomë e Re @@ -1274,11 +1531,11 @@ Që të kryhet ky veprim, shtoni një shërbyes identitetesh, që nga rregullimet tuaja. Mënyrë Njëkohësimi Në Prapaskenë E optimizuar për baterinë - Element-i do të bëjë njëkohësim në prapaskenë, në një mënyrë që kursen burimet e kufizuara të pajisjes (baterinë). + ${app_name}-i do të bëjë njëkohësim në prapaskenë, në një mënyrë që kursen burimet e kufizuara të pajisjes (baterinë). \nNë varësi të gjendjes së burimeve tuaja, njëkohësimi mund të shtyhet për më vonë nga sistemi operativ. I optimizuar për kohë të njëmendtë - Element0-i do të bëjë njëkohësim në prapaskenë periodikisht në një kohë të caktuar (e formësueshme). -\nKjo do të ketë ndikim mbi përdorimin e baterisë dhe të transmetimit, do të shfaqet një njoftim i pandërprerë që pohon se Element-i po përgjon për akte. + ${app_name}0-i do të bëjë njëkohësim në prapaskenë periodikisht në një kohë të caktuar (e formësueshme). +\nKjo do të ketë ndikim mbi përdorimin e baterisë dhe të transmetimit, do të shfaqet një njoftim i pandërprerë që pohon se ${app_name}-i po përgjon për akte. Pa njëkohësim në prapraskenë S’do të njoftoheni për mesazhe ardhës, kur aplikacioni gjendet në prapaskenë. S’u arrit të përditësohen rregullime. @@ -1361,12 +1618,12 @@ Kjo lëndë është raportuar si e papërshtatshme. \n \nNëse s’doni të shihni më lëndë nga ky përdorues, mund ta shpërfillni, që të fshihen mesazhet e tij. - Element-i lyp leje për të ruajtur kyçet tuaj E2E në disk. + ${app_name}-i lyp leje për të ruajtur kyçet tuaj E2E në disk. \n \nJu lutemi, lejoni, te flluska pasuese, hyrje për të qenë e mundur të eksportohen kyçet tuaj dorazi. Tani për tani s’la lidhje rrjeti Ripohoni fjalëkalimin tuaj - Këtë s’e bëni dot që nga Element-i për celular + Këtë s’e bëni dot që nga ${app_name}-i për celular Lypset mirëfilltësim Integrime Përdorni një Përgjegjës Integrimesh që të administroni robotë, ura, widget-e dhe paketa ngjitësish. @@ -1436,7 +1693,6 @@ Adresë Strehim me pagesë për ente Jepni adresën e Modular Element-it ose Shërbyesit që doni të përdoret - Jepni adresën e një shërbyesi ose një instance Element me të cilën doni të lidheni Ndodhi një gabim kur ngarkohej faqja: %1$s (%2$d) Aplikacioni s’është në gjendje të bëjë hyrje në llogari në këtë shërbyes Home. Shërbyesi Home mbulon llojet vijuese të hyrjes(ve): %1$s. \n @@ -1535,7 +1791,7 @@ \nQë të mund të hyni te të dhëna të llogarisë tuaj dhe te mesazhe, bëni sërish hyrjen. Do të humbni hyrje te mesazhe të sigurt, veç në hyfshi për të rimarrë kyçet tuaj të fshehtëzimit. Spastro të dhënat - Sesioni i tanishëm është për përdoruesin %1$s dhe ju jepni kredenciale për përdoruesin %2$s. Kjo nuk mbulohet nga Element. + Sesioni i tanishëm është për përdoruesin %1$s dhe ju jepni kredenciale për përdoruesin %2$s. Kjo nuk mbulohet nga ${app_name}. \nJu lutemi, së pari spastroni të dhëna, mandej hyni sërish në një tjetër llogari. Lidhja juaj matrix.to është e keqformuar Përshkrimi është shumë i shkurtër @@ -1554,7 +1810,7 @@ Sesioni i tanishëm Shfaq sesione të tjera Po shfaqen vetëm përfundimet e para, shtypni më shumë shkronja… - Element mund të vithiset më shpesh, kur ndodh një gabim i papritur + ${app_name} mund të vithiset më shpesh, kur ndodh një gabim i papritur Lejoni shërbyes rrugëzgjidhje asistimi thirrjesh Parashtoji ¯\\_(ツ)_/¯ një mesazhi tekst të thjeshtë Aktivizoni fshehtëzim @@ -1668,9 +1924,9 @@ Për siguri ekstra, verifikojeni %s duke parë kontrolluar në të dy pajisjet tuaja një kod njëpërdorimsh. \n \nPër sigurinë maksimale, bëjeni këtë ju vetë. - Element nuk trajton akte të llojit \'%1$s\' - Element nuk trajton mesazhe të llojit \'%1$s\' - Element ndeshi një problem kur vizatohej lëndë e aktit me ID \'%1$s\' + ${app_name} nuk trajton akte të llojit \'%1$s\' + ${app_name} nuk trajton mesazhe të llojit \'%1$s\' + ${app_name} ndeshi një problem kur vizatohej lëndë e aktit me ID \'%1$s\' Ky sesion s’është në gjendje të ndajë këtë verifikim me sesionet tuaj të tjerë. \nVerifikimi do të ruhet lokalisht dhe do të ndahet nën një version të ardhshëm të aplikacionit. Për të qenë i sigurt, verifikoni %s duke kontrolluar një kod njëpërdorimsh. @@ -1723,7 +1979,7 @@ Veprimtari e fshirë nga përdorues, arsye: %1$s Veprimtari e moderuar nga përgjegjësi i dhomës, arsye: %1$s Kyçet janë tashmë të përditësuar! - Element Android + ${app_name} Android Kërkesa Kyçi Shkyçni historik mesazhesh të fshehtëzuar Rifreskoje @@ -1824,13 +2080,13 @@ Te Galeria u shtua kartelë media S’u shtua dot kartelë media te Galeria Caktoni një fjalëkalim të ri llogarie… - Përdorni Element-in më të ri në pajisjet tuaja të tjera, Element Web, Element Desktop, Element iOS, Element për Android, ose një tjetër klient Matrix të aftë për <em>cross-signing</em - Element Web -\nElement Desktop - Element iOS -\nElement Android + Përdorni ${app_name}-in më të ri në pajisjet tuaja të tjera, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} për Android, ose një tjetër klient Matrix të aftë për <em>cross-signing</em + ${app_name} Web +\n${app_name} Desktop + ${app_name} iOS +\n${app_name} Android ose një tjetër klient Matrix i aftë për <em>cross-signing</em - Përdorni Element-in më të ri në pajisjet tuaja të tjera: + Përdorni ${app_name}-in më të ri në pajisjet tuaja të tjera: Mbulohet vetëm për dhoma të fshehtëzuara Përdorni %1$s tuaj ose përdorni %2$s tuaj që të vazhdohet. Përdorni Kyçin Rimarrjesh @@ -1890,7 +2146,7 @@ Gjuhë të tjera të gatshme Po ngarkohen gjuhë të gatshme… Të bëhet shkëputja prej shërbyesit tuaj të identitetit %s\? - Ky shërbyes identitetesh është i vjetruar. Element mbulon vetëm API V2. + Ky shërbyes identitetesh është i vjetruar. ${app_name} mbulon vetëm API V2. Ky veprim s’është i mundshëm. Shërbyesi Home është i vjetruar. Ju lutemi, së pari formësoni një shërbyes identitetesh. Ju lutemi, së pari pranoni te rregullimet termat e shërbyesit të identiteteve. @@ -1921,7 +2177,7 @@ Kopjoje Sukses Njoftime - Thirrja Element Dështoi + Thirrja ${app_name} Dështoi S’u arrit të vendosej lidhje e atypëratyshme. \nQë thirrjet të punojnë mirë, ju lutemi, kërkojini përgjegjësit të shërbyesit tuaj Home të formësojë një shërbyes TURN. Përzgjidhni Pajisje Zëri @@ -2037,8 +2293,7 @@ Kjo llogari është çaktivizuar. S’u ruajt dot kartelë media Ripohoni identitetin tuaj duke verifikuar këto kredenciale hyrjeje, duke i akorduar hyrje te mesazhe të fshehtëzuar. - Na ndjeni, ky veprim s’është ende i mundshëm për llogari të lidhura duke përdorur Hyrje Njëshe. - Për privatësinë tuaj, Element-i mbulon vetëm dërgim email-esh dhe numrash telefoni përdoruesi të koduar. + Për privatësinë tuaj, ${app_name}-i mbulon vetëm dërgim email-esh dhe numrash telefoni përdoruesi të koduar. Caktoni rol Rol Hapni fjalosje @@ -2073,11 +2328,10 @@ S’mund të hapni këtë mesazh, ngaqë sesionit tuaj nuk i zihet besë nga dërguesi S’mund ta hapni këtë mesazh, ngaqë dërguesi qëllimisht nuk ju dërgoi kyçet Po pritet për historik fshehtëzimesh - Riot-i tanimë quhet Element! - Jemi të ngazëllyer t’ju njoftojmë se kemi ndërruar emër! Aplikacioni juaj është i përditësuar dhe jeni i futur në llogarinë tuaj. - E MORA VESH - MËSONI MË TEPËR - element + Riot-i tanimë quhet Element! + Jemi të ngazëllyer t’ju njoftojmë se kemi ndërruar emër! Aplikacioni juaj është i përditësuar dhe jeni i futur në llogarinë tuaj. + E MORA VESH + MËSONI MË TEPËR Ruaje kyçin e rimarrjeve te Shto prej numëratorit tim telefonik Numëratori juaj telefonik është i zbrazët @@ -2112,13 +2366,13 @@ S’mund të hapet një dhomë prej të cilës jeni dëbuar. S’gjendet dot kjo dhomë. Sigurohuni që ekziston. Lidhja qe e keqformësuar - Kodi PIN kërkohet doemos sa herë që hapni Element-in. - Kodi PIN kërkohet doemos pas 2 minutash mospërdorimi të Element-it. + Kodi PIN kërkohet doemos sa herë që hapni ${app_name}-in. + Kodi PIN kërkohet doemos pas 2 minutash mospërdorimi të ${app_name}-it. Kërkoje doemos PIN-in pas 2 minutash Shfaq vetëm numrin e mesazheve të palexuar, në një njoftim të thjeshtë. Shfaq hollësi, të tilla si emra dhomash dhe lëndë mesazhesh. Shfaq lëndë në njoftime - Kodi PIN është rruga e vetme për të shkyçur Element-in. + Kodi PIN është rruga e vetme për të shkyçur ${app_name}-in. Aktivizoni të dhëna biometrike specifike për pajisjen, bie fjala, shenja gishtash dhe njohje fytyre. Aktivizo të dhëna biometrike Formësoni mbrojtjen @@ -2192,8 +2446,8 @@ Ndaje kodin tim me të tjerët Skanoni një kod QR S’është kod QR Matrix i vlefshëm - Takohuni me mua në Element - Hej, bisedoni me mua në Element: %s + Takohuni me mua në ${app_name} + Hej, bisedoni me mua në ${app_name}: %s Ftoni shokë Shtoni persona "Temë: " @@ -2269,4 +2523,76 @@ Ndryshimet se cili mund të lexojë historikun do të aplikohen vetëm për mesazhe të ardhshëm në këtë dhomë. Dukshmëria e historikut ekzistues do të mbesë e pandryshuar. Hiqi botimin Shto + S’u arrit të bëhej mirëfilltësimi + Që të kryejë këtë veprim, ${app_name}-i lyp dhënien prej jush të kredencialeve tuaja. + Lypset Rimirëfilltësim + Përdorues + Ndodhi një gabim teksa shpërngulej thirrja + Shpërngule + Lidhe + Konsultohu së pari + + 1 thirrje aktive (%1$s) · 1 thirrje e ndalur + 1 thirrje aktive (%1$s) · %2$d thirrje të ndalura + + + Thirrja u ndal + U ndalën %1$d thirrje + + Thirrje aktive (%1$s) + Pati një gabim gjatë kërkimit të numrit të telefonit + Pjesa e numrave + Ktheji thirrjen + Kjo thirrje ka përfunduar + %1$s hodhi poshtë këtë thirrje + Hodhët poshtë këtë thirrje %1$s + Gjendeni në këtë thirrje + %1$s nisi një thirrje + Filluat një thirrje + S’u arrit të ujdisej “Cross Signing” + dërgon dëborë ❄️ + dërgon bonbone 🎉 + E dërgon mesazhin e dhënë me dëborë + E dërgon mesazhin e dhënë me bonbone + Aktivizoni Cross Signing + Spastroje historikun + hyrje njëshe + Hyni me %s + Regjistrohuni me %s + Vazhdo me %s + Ose + Shtoni një buton te hartuesi i mesazheve për të hapur tastierën e emoji-ve + Shfaq tastierë emoji-sh + Përdorni urdhrin /confetti ose dërgoni një mesazh që përmban ❄️ ose 🎉 + Shfaq efekte fjalosjeje + Të ndryshojë temë + Të përmirësojë dhomën + Të dërgojë akte m.room.server_acl + Të ndryshojë leje + Të ndryshojë emër dhome + Të ndryshojë dukshmëri historiku + Të aktivizojë fshehtëzim dhome + Të ndryshojë adresë kryesore për dhomën + Të ndryshojë avatar dhome + Të ndryshojë widget-e + Të njoftojë gjithkënd + Të heqë mesazhe dërguar nga të tjerët + Të dëbojë përdorues + Të përzërë përdorues + Të ndryshojë rregullime + Të ftojë përdorues + Të dërgojë mesazhe + Rol parazgjedhje + S’keni leje të përditësoni rolet e domosdoshëm për të ndryshuar anë të ndryshme të dhomës + Të përzgjedhë rolet e domosdoshme për të ndryshuar anë të ndryshme të dhomës + Leje + Të shohë dhe përditësojë role të domosdoshëm për të ndryshuar anë të ndryshme të dhomës. + Leje dhome + Kjo dhomë s’është publike. S’do të jeni në gjendje të rihyni në të pa një ftesë. + E mbajtët thirrjen + %s e mbajti thirrjen + Mbaje + Rimerre + E paautorizuar, i mungojnë kredenciale të vlefshme mirëfilltësimi + Parazgjedhje Sistemi \ No newline at end of file diff --git a/vector/src/main/res/values-sr/strings.xml b/vector/src/main/res/values-sr/strings.xml index 37a3213ce3..2ce03e4a54 100644 --- a/vector/src/main/res/values-sr/strings.xml +++ b/vector/src/main/res/values-sr/strings.xml @@ -1,9 +1,280 @@ + %1$s напусти собу + Ви се придружисте + %1$s се придружи + Ви се придружисте + %1$s се придружи + %1$s позва вас + Ви позвасте корисника %1$s + %1$s позва корисника %2$s + Направили сте дискусију + %1$s: %2$s + Почетна синхронизација: +\nувозим налог… + Празна соба (била је %s) + Празна соба + + %1$s и још %2$d + %1$s и још %2$d + %1$s и још %2$d + + %1$s направи дискусију + Направили сте собу + %1$s направи собу + Ваша позивница + %s шаље позивницу + Послали сте налепницу. + %1$s посла налепницу. + Послали сте слику. + %1$s посла слику. + Изменили сте свој аватар + %1$s измени свој аватар + Повукли сте позивницу за корисника %1$s + %1$s повуче позивницу за корисника %2$s + Забранили сте корисника %1$s + %1$s забрани корисника %2$s + Укинули сте забрану кориснику %1$s + %1$s укину забрану кориснику %2$s + Избацили сте корисника %1$s + %1$s избаци %2$s + Одбили сте позивницу + %1$s одби позивницу + Напустили сте собу + %1$s напусти собу + Напустили сте собу + Укључили сте шифровање с краја на крај (непознат алгоритам %1$s). + %1$s укључи шифровање с краја на крај (непознат алгоритам %2$s). + %1$s искључи шифровање с краја на крај. + Спречили сте да се гости придруже у собу. + Укључили сте шифровање с краја на крај. + Дозволили сте гостима да се придруже соби. + Изменили сте алтернативну адресу за ову собу. + Очисти ред за слање + Шаљем поруку… + + %1$s, %2$s, %3$s и још %4$d + %1$s, %2$s, %3$s и још %4$d + %1$s, %2$s, %3$s и још %4$d + + %1$s, %2$s, %3$s и %4$s + %1$s, %2$s и %3$s + %1$s и %2$s + Број телефона + Адреса е-поште + Тренутно није могуће да се вратите у празну собу. + Грешка Матрикса + Мрежна грешка + Неуспело слање слике + Не могу да пошаљем поруку + Уређај пошиљаоца није нам послао кључеве за ову поруку. + Изменили сте ниво снаге корисника %1$s. + посебно + посебно (%1$d) + подразумевано + модератор + админ + Порука уклоњена [разлог: %1$s] + Поруку уклони %1$s + Порука уклоњена + Уклонили сте аватар собе + %1$s уклони аватар собе + Уклонили сте тему собе + %1$s уклони тему собе + Уклонили сте назив собе + %1$s уклони назив собе + (аватар је такође промењен) + 🎉 Свим серверима је забрањено учествовање! Ова соба се више не може користити. + Без измене. + Надоградили сте ову собу. + непознато (%s). + Учинили сте да од сада, историјат буде видљив за %1$s + %1$s учини да од сада, историјат буде видљив за %2$s + Учинили сте да будуће поруке буду видљиве за %1$s + %1$s учини да будуће поруке буду видљиве за %2$s + свакога. + све чланове. + све чланове, од кад се придруже. + све чланове, од када су позвани. + Завршили сте позив. + %s заврши позив. + Одговорили сте на позив. + %s одговори на позив. + Послали сте податке за поставку позива. + %s посла податке за поставку позива. + Позвали сте гласовним позивом. + %s позва видео позивом. + Позвали сте видео позивом. + Изменили сте аватар собе + Поставили сте своје приказно име на %1$s + %1$s постави своје приказно име на %2$s + + Додали сте %1$s као адресу ове собе. + Додали сте %1$s као адресе ове собе. + Додали сте %1$s као адресе ове собе. + + + %1$s додаде %2$s као адресу ове собе. + %1$s додаде %2$s као адресе ове собе. + %1$s додаде %2$s као адресе ове собе. + + Повукли сте позивницу корисника %1$s. Разлог: %2$s + %1$s повлачи позивницу корисника %2$s. Разлог: %3$s + Прихватили сте позивницу за %1$s. Разлог: %2$s + %1$s прихвата позивницу за %2$s. Разлог:%3$s + Повукли сте позивницу да се %1$s придружи соби. Разлог: %2$s + %1$s повуче позивницу да се %2$s придружи соби. Разлог: %3$s + Послали сте позивницу да се %1$s придружи соби. Разлог: %2$s + %1$s посла позивницу да се %2$s придружи соби. Разлог: %3$s + Забранили сте корисника %1$s. Разлог: %2$s + %1$s забрани корисника %2$s. Разлог: %3$s + Одблокирали сте корисника %1$s. Разлог: %2$s + %1$s одблокира корисника %2$s. Разлог: %3$s + Избацили сте корисника %1$s. Разлог: %2$s + %1$s избаци корисника %2$s. Разлог: %3$s + Одбили сте позивницу. Разлог: %1$s + %1$s одби позивницу. Разлог: %2$s + Изашли сте. Разлог: %1$s + %1$s изађе. Разлог: %2$s + Напустили сте собу. Разлог: %1$s + %1$s напусти собу. Разлог: %2$s + Придружили сте се. Разлог: %1$s + %1$s се придружи. Разлог: %2$s + Придружили сте се соби. Разлог: %1$s + %1$s се придружи соби. Разлог: %2$s + %1$s вас позива. Разлог: %2$s + Позвали сте корисника %1$s. Разлог: %2$s + %1$s позва корисника %2$s. Разлог: %3$s + Ваша позивница. Разлог: %1$s + %1$s - позивница. Разлог: %2$s + Почетна синхронизација: +\nувозим податке о налогу + Почетна синхронизација: +\nувозим заједнице + Почетна синхронизација: +\nувозим напуштене собе + Почетна синхронизација: +\nувозим собе са позивницом + Почетна синхронизација: +\nувозим собе у којима сте + Почетна синхронизација: +\nувоз шифровања + Почетна синхронизација: +\nувозим собе + Позивница за собу + %s вас позива + Не могу да редигујем + ** Не могу да дешифрујем: %s ** + %1$s са %2$s на %3$s + %1$s измени ниво снаге кориснику %2$s. + Изменили сте %1$s виџет + %1$s измени %2$s виџет + Уклонили сте %1$s виџет + %1$s уклони %2$s виџет + Додали сте %1$s виџет + %1$s додаде %2$s виџет + Прихватили сте позивницу за %1$s + %1$s прихвати позивницу за %2$s + Повукли сте позивницу за корисника %1$s + %1$s повуче позивницу за корисника %2$s + Повукли сте позивницу да се %1$s придружи у собу + %1$s повуче позивницу да се %2$s придружи у собу + Позвали сте корисника %1$s + %1$s позва корисника %2$s + Послали сте позивницу да се %1$s придружи у собу + %1$s посла позивницу да се %2$s придружи у собу + Освежили сте свој профил %1$s + %1$s освежи свој профил %2$s + Поруку уклони %1$s [разлог: %2$s] + ВоИП конференција завршена + ВоИП конференција започела + Затражили сте ВоИП конференцију + %1$s затражи ВоИП конференцију + • Сервери који садрже ИП бројеве су сада забрањени. + • Сервери који садрже ИП бројеве су сада дозвољени. + • Сервери који садрже %s су уклоњени са листе дозвољених. + • Сервери који садрже %s су сада дозвољени. + • Сервери који садрже %s су уклоњени са листе забрањених. + • Сервери који садрже %s су сада забрањени. + Изменили сте АЦЛ сервера за ову собу. + %s измени АЦЛ сервера за ову собу. + • Сервери са ИП бројевима су забрањени. + • Сервери са ИП бројевима су дозвољени. + • Сервери који садрже %s су дозвољени. + • Сервери који садрже %s су забрањени. + Поставили сте АЦЛ сервера за ову собу. + %s постави АЦЛ сервера за ову собу. + Надоградили сте овде. + %s надогради овде. + %s надогради ову собу. + Укључили сте шифровање с краја на крај (%1$s) + %1$s укључи шифровање с краја на крај (%2$s) + %s упути видео позив. + Изменили сте назив собе у: %1$s + %1$s измени назив собе у: %2$s + %1$s измени аватар собе + Изменили сте тему на: %1$s + %1$s измени тему на: %2$s + Уклонили сте своје приказно име (било је %1$s) + %1$s уклони своје приказно име (било је %2$s) + Изменили сте приказно име са %1$s на %2$s + %1$s измени приказно име са %2$s на %3$s + %1$s забрани гостима да се придруже у собу. + Забранили сте гостима да се придруже у собу. + %1$s забрани гостима да се придруже у собу. + Дозволили сте гостима да се придруже овде. + %1$s дозволи гостима да се придруже овде. + %1$s дозволи гостима да се придруже у собу. + Изменили сте адресе за ову собу. + %1$s измени адресе за ову собу. + Изменили сте главну и алтернативне адресе за ову собу. + %1$s измени главну и алтернативне адресе за ову собу. + %1$s измени алтернативне адресе за ову собу. + + Уклонили сте алтернативну адресу %1$s за ову собу. + Уклонили сте алтернативне адресе %1$s за ову собу. + Уклонили сте алтернативне адресе %1$s за ову собу. + + + %1$s уклони алтернативну адресу %2$s за ову собу. + %1$s уклони алтернативне адресе %2$s за ову собу. + %1$s уклони алтернативне адресе %2$s за ову собу. + + + Додали сте алтернативну адресу %1$s за ову собу. + Додали сте алтернативне адресе %1$s за ову собу. + Додали сте алтернативне адресе %1$s за ову собу. + + + %1$s додаде алтернативну адресу %2$s за ову собу. + %1$s додаде алтернативне адресе %2$s за ову собу. + %1$s додаде алтернативне адресе %2$s за ову собу. + + Уклонили сте главну адресу за ову собу. + %1$s уклони главну адресу за ову собу. + Поставили сте главну адресу ове собе на %1$s. + %1$s постави главну адресу ове собе на %2$s. + Додали сте %1$s и уклонили %2$s као адресе ове собе. + %1$s додаде %2$s и уклони %3$s као адресе ове собе. + + Уклонили сте %1$s као адресу ове собе. + Уклонили сте %1$s као адресе ове собе. + Уклонили сте %1$s као адресе ове собе. + + + %1$s уклони %2$s као адресу ове собе. + %1$s уклони %2$s као адресе ове собе. + %1$s уклони %2$s као адресе ове собе. + + Изменили сте видео конференцију + %1$s измени видео конференцију + Завршили сте видео конференцију + %1$s заврши видео конференцију + Покренули сте видео конференцију + %1$s покрену видео конференцију светла тема тамна тема - црна тема - Status.im тема + црна тема Иницијализација сервиса Синхронизујем… Бучна обавештења @@ -147,7 +418,7 @@ Нема доступних јавних соба Нема више резултата - Нисте доволили да Елемент приступи вашим контактима + Нисте доволили да Елемент приступи вашим контактима Нема разговора Системска упозорења Заједнице diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index c203e48839..87f7144994 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -1,9 +1,270 @@ + %1$s: %2$s + %1$s skickade en bild. + Du skickade en bild. + %1$s skickade en dekal. + Du skickade en dekal. + Inbjudan från %s + Inbjudan från dig + %1$s skapade rummet + Du skapade rummet + %1$s bjöd in %2$s + Du bjöd in %1$s + %1$s bjöd in dig + %1$s gick med i rummet + Du gick med i rummet + %1$s lämnade rummet + Du lämnade rummet + %1$s avböjde inbjudan + Du avböjde inbjudan + %1$s kickade %2$s + Du kickade %1$s + %1$s avbannade %2$s + Du avbannade %1$s + %1$s avbannade %2$s + Du bannade %1$s + %1$s drog tillbaka inbjudan för %2$s + Du drog tillbaka inbjudan för %1$s + %1$s bytte sin avatar + Du bytte din avatar + %1$s satte sitt visningsnamn till %2$s + Du satte ditt visningsnamn till %1$s + %1$s bytte sitt visningsnamn från %2$s till %3$s + Du bytte ditt visningsnamn från %1$s till %2$s + %1$s tog bort sitt visningsnamn (det var %2$s) + Du tog bort ditt visningsnamn (det var %1$s) + %1$s bytte ämnet till: %2$s + Du bytte ämnet till: %1$s + %1$s bytte rummets avatar + Du bytte rummets avatar + %1$s bytte rummets namn till: %2$s + Du bytte rummets namnet till: %1$s + %s startade ett videosamtal. + Du startade ett videosamtal. + %s startade ett röstsamtal. + Du startade ett röstsamtal. + %s skickade data för att sätta upp samtalet. + Du skickade data för att sätta upp samtalet. + %s svarade på samtalet. + Du svarade på samtalet. + %s avslutade samtalet. + Du avslutade samtalet. + %1$s gjorde framtida rumshistorik synlig för %2$s + Du gjorde framtida rumshistorik synlig för %1$s + alla rumsmedlemmar, från tiden de bjöds in. + alla rumsmedlemmar, från tiden de gick med. + alla rumsmedlemmar. + vem som helst. + okänt (%s). + %1$s aktiverade totalsträckskryptering (%2$s) + Du aktiverade totalsträckskryptering (%1$s) + %s uppgraderade det här rummet. + Du uppgraderade det här rummet. + %1$s begärde ett VoIP-gruppsamtal + Du begärde ett VoIP-gruppsamtal + VoIP-gruppsamtal startat + VoIP-gruppsamtal avslutat + (avataren blev även bytt) + %1$s tog bort rummets namn + Du tog bort rummets namn + %1$s tog bort rummets ämne + Du tog bort rummets ämne + %1$s tog bort rummets avatar + Du tog bort rummets avatar + Meddelande borttaget + Meddelande borttaget av %1$s + Meddelande borttaget [anledning: %1$s] + Meddelande borttaget av %1$s [anledning: %2$s] + %1$s uppdaterade sim profil %2$s + Du uppdaterade din profil %1$s + %1$s bjöd in %2$s att gå med i rummet + Du bjöd in %1$s att gå med i rummet + %1$s drog tillbaka inbjudan för %2$s att gå med i rummet + Du drog tillbaka inbjudan för %1$s att gå med i rummet + %1$s accepterade inbjudan för %2$s + Du accepterade inbjudan för %1$s + %1$s lade till %2$s-widget + Du lade till %1$s-widget + %1$s tog bort %2$s-widget + Du tog bort %1$s-widget + %1$s modifierade %2$s-widget + Du modifierade %1$s-widget + Admin + Moderator + Standard + Anpassad (%1$d) + Anpassad + Du ändrade behörighetsnivå för %1$s. + %1$s ändrade behörighetsnivå för %2$s. + %1$s från %2$s till %3$s + ** Kan inte avkryptera: %s ** + Avsändarens enhet har inte gett oss nycklarna för det här meddelandet. + Kunde inte dölja + Kunde inte skicka meddelandet + Misslyckades att ladda upp bilden + Nätverksfel + Matrixfel + Det går för närvarande inte att gå med i ett tomt rum igen. + E-postadress + Telefonnummer + Inbjudan från %s + Rumsinbjudan + %1$s och %2$s + + %1$s och en till + %1$s och %2$d till + + Tomt rum + Inledande synk: +\nImporterar konto… + Inledande synk: +\nImporterar krypto + Inledande synk: +\nImporterar rum + Inledande synk: +\nImporterar anslutna rum + Inledande synk: +\nImporterar inbjudna rum + Inledande synk: +\nImporterar lämnade rum + Inledande synk: +\nImporterar gemenskaper + Inledande synk: +\nImporterar kontodata + Skickar meddelande… + Rensa sändningskö + Inbjudan från %1$s. Anledning: %2$s + Inbjudan från dig. Anledning: %1$s + %1$s bjöd in %2$s. Anledning: %3$s + Du bjöd in %1$s. Anledning: %2$s + %1$s bjöd in dig. Anledning: %2$s + %1$s gick med i rummet. Anledning: %2$s + Du gick med i rummet. Anledning: %1$s + %1$s lämnade rummet. Anledning: %2$s + Du lämnade rummet. Anledning: %1$s + %1$s avböjde inbjudan. Anledning: %2$s + Du avböjde inbjudan. Anledning: %1$s + %1$s kickade %2$s. Anledning: %3$s + Du kickade %1$s. Anledning: %2$s + %1$s avbannade %2$s. Anledning: %3$s + Du avbannade %1$s. Anledning: %2$s + %1$s bannade %2$s. Anledning: %3$s + Du bannade %1$s. Anledning: %2$s + %1$s bjöd in %2$s att gå med i rummet. Anledning: %3$s + Du bjöd in %1$s att gå med i rummet. Anledning: %2$s + %1$s drog tillbaka inbjudan för %2$s att gå med i rummet. Anledning: %3$s + Du drog tillbaka inbjudan för %1$s att gå med i rummet. Anledning: %2$s + %1$s accepterade inbjudan för %2$s. Anledning: %3$s + Du accepterade inbjudan för %1$s. Anledning: %2$s + %1$s drog tillbaka inbjudan för %2$s. Anledning: %3$s + Du drog tillbaka inbjudan för %1$s. Anledning: %2$s + + %1$s lade till %2$s som en adress för det här rummet. + %1$s lade till %2$s som adresser för det här rummet. + + + Du lade till %1$s som en adress för det här rummet. + Du lade till %1$s som adresser för det här rummet. + + + %1$s tog bort %2$s som en adress för det här rummet. + %1$s tog bort %2$s som adresser för det här rummet. + + + Du tog bort %1$s som en adress för det här rummet. + Du tog bort %1$s som adresser för det här rummet. + + %1$s lade till %2$s och tog bort %3$s som adresser för det här rummet. + Du lade till %1$s och tog bort %2$s som adresser för det här rummet. + %1$s satta huvudadressen för det här rummet till %2$s. + Du satta huvudadressen för det här rummet till %1$s. + %1$s tog bort huvudadressen för det här rummet. + Du tog bort huvudadressen för det här rummet. + %1$s tillät gäster att gå med i rummet. + Du tillät gäster att gå med i rummet. + %1$s hindrade gäster från att gå med i rummet. + Du hindrade gäster från att gå med i rummet. + %1$s aktiverade totalsträckskryptering. + Du aktiverade totalsträckskryptering. + %1$s aktiverade totalsträckskryptering (okänd algoritm %2$s). + Du aktiverade totalsträckskryptering (okänd algoritm %1$s). + Du hindrade gäster från att gå med i rummet. + %1$s hindrade gäster från att gå med i rummet. + Du tillät gäster att gå med här. + %1$s tillät gäster att gå med här. + Du lämnade. Anledning: %1$s + %1$s Lämnade. Anledning: %2$s + Du gick med. Anledning: %1$s + %1$s gick med. Anledning: %2$s + Du drog tillbaka inbjudan för %1$s + %1$s drog tillbaka inbjudan för %2$s + Du bjöd in %1$s + %1$s bjöd in %2$s + Du uppgraderade här. + %s uppgraderade här. + Du gjorde framtida meddelanden synliga för %1$s + %1$s gjorde framtida meddelanden synliga för %2$s + Du lämnade rummet + %1$s lämnade rummet + Du gick med + %1$s gick med + Du skapade diskussionen + %1$s skapade diskussionen + Du ändrade adresserna för det här rummet. + %1$s ändrade adresserna för det här rummet. + Du ändrade huvudadressen och de alternativa adresserna för det här rummet. + %1$s ändrade huvudadressen och de alternativa adresserna för det här rummet. + Du ändrade de alternativa adresserna för det här rummet. + %1$s ändrade de alternativa adresserna för det här rummet. + + Du tog bort den alternativa adressen %1$s för det här rummet. + Du tog bort de alternativa adresserna %1$s för det här rummet. + + + %1$s tog bort den alternativa adressen %2$s för det här rummet. + %1$s tog bort de alternativa adresserna %2$s för det här rummet. + + + Du lade till den alternativa adressen %1$s för det här rummet. + Du lade till de alternativa adresserna %1$s för det här rummet. + + + %1$s lade till den alternativa adressen %2$s för det här rummet. + %1$s lade till de alternativa adresserna %2$s för det här rummet. + + Tomt rum (var %s) + + %1$s, %2$s, %3$s och %4$d till + %1$s, %2$s, %3$s och %4$d till + + %1$s, %2$s, %3$s och %4$s + %1$s, %2$s och %3$s + 🎉 Alla servrar har bannats från att delta! Det här rummet kan inte användas längre. + Ingen ändring. + • Servrar som matchar IP-adresser är nu bannade. + • Servrar som matchar IP-adresser är nu tillåtna. + • Servrar som matchar %s togs bort från tillåtelselistan. + • Servrar som matchar %s är nu tillåtna. + • Servrar som matchar %s togs bort från bannlistan. + • Servrar som matchar %s är nu bannade. + Du ändrade server-ACLer för det här rummet. + %s ändrade server-ACLer för det här rummet. + • Servrar som matchar IP-adresser är tillåtna. + • Servrar som matchar IP-adresser är bannade. + • Servrar som matchar %s är tillåtna. + • Servrar som matchar %s är bannade. + Du satte server-ACLer för det här rummet. + %s satte server-ACLer för det här rummet. + Du ändrade videogruppsamtal + Videogruppsamtal ändrades av %1$s + Du avslutade videogruppsamtal + Videogruppsamtal avslutades av %1$s + Du startade videogruppsamtal + Videogruppsamtal startades av %1$s Ljust tema Mörkt tema - Svart tema - Status.im-tema + Svart tema Initialiserar tjänst Synkroniserar… Lyssnar efter händelser @@ -40,7 +301,7 @@ Skicka Skicka igen Ta bort - Citat + Citera Ladda ner Dela Prata @@ -116,7 +377,7 @@ Användarkatalog Bara Matrix-kontakter Inga konversationer - Du gav inte Element tillgång till dina lokala kontakter + Du gav inte ${app_name} tillgång till dina lokala kontakter Inga resultat Ingen identitetsserver konfigurerad. Rum @@ -251,12 +512,12 @@ Efterfråga krypteringsnycklarna igen från dina andra sessioner. Nyckelförfrågan har skickats. Förfrågan har skickats - Vänligen öppna Element på en annan enhet som kan dekryptera meddelandet så att den kan skicka nycklarna till den här sessionen. + Vänligen öppna ${app_name} på en annan enhet som kan dekryptera meddelandet så att den kan skicka nycklarna till den här sessionen. Läsindikationslista Grupplista %d medlemsskapsändring - %s medlemsskapsändringar + %d medlemsskapsändringar Skicka som Original @@ -272,7 +533,7 @@ Rumsnamn Rumsämne Samtal - Använd förvald Element-ringsignal för inkommande samtal + Använd förvald ${app_name}-ringsignal för inkommande samtal Tillåt reservassistansserver för samtal Kommer att använda %s som reserv när din hemserver inte erbjuder en (din IP-adress kommer att delas under samtalet) Ringsignal för inkommande samtal @@ -294,22 +555,22 @@ Ta en bild eller en video Kan inte spela in video Information - Element behöver tillstånd att komma åt ditt foto- och videobibliotek för att skicka och spara bilagor. + ${app_name} behöver tillstånd att komma åt ditt foto- och videobibliotek för att skicka och spara bilagor. \n \nVänligen ge tillstånd i nästa popup för att kunna skicka filer från din telefon. - Element behöver tillstånd att komma åt din kamera för att kunna ta bilder och hålla videosamtal. + ${app_name} behöver tillstånd att komma åt din kamera för att kunna ta bilder och hålla videosamtal. " \n \nVänligen ge åtkomst i nästa popup för att kunna utföra samtalet." - Element behöver tillstånd att komma åt din mikrofon för hålla röstsamtal. + ${app_name} behöver tillstånd att komma åt din mikrofon för hålla röstsamtal. " \n \nVänligen ge åtkomst i nästa popup för att kunna utföra samtalet." - Element behöver tillstånd att komma åt din kamera och mikrofon för att kunna utföra videosamtal. + ${app_name} behöver tillstånd att komma åt din kamera och mikrofon för att kunna utföra videosamtal. \n \nVänligen ge tillstånd i nästa popup för att kunna utföra samtalet. - Element kan kolla i din adressbok för att hitta andra Matrixanvändare baserat på deras e-postadresser och telefonnummer. Om du går med på att dela din adressbok för detta ändamål, vänligen ge tillstånd i nästa popup. - Element kan kolla i din adressbok för att hitta andra Matrixanvändare baserat på deras e-postadresser och telefonnummer. + ${app_name} kan kolla i din adressbok för att hitta andra Matrixanvändare baserat på deras e-postadresser och telefonnummer. Om du går med på att dela din adressbok för detta ändamål, vänligen ge tillstånd i nästa popup. + ${app_name} kan kolla i din adressbok för att hitta andra Matrixanvändare baserat på deras e-postadresser och telefonnummer. \n \nVill du dela din adressbok för detta ändamål\? Tyvärr. Handlingen utfördes inte på grund av saknade rättigheter @@ -532,8 +793,8 @@ Aviseringar är inaktiverade för ditt konto. \nVänligen kolla kontoinställningarna. Aviseringar är aktiverade för den här sessionen. - Aviseringar är inaktiverade för den här sessionen. -\nVänligen kolla Elementinställningarna. + Aviseringar är inaktiverade för den här sessionen. +\nVänligen kolla ${app_name}inställningarna. Observera att vissa meddelandetyper är satta till tyst (kommer att producera aviseringar utan ljud). Vissa aviseringar är inaktiverade i dina anpassade inställningar. Aviseringstjänst @@ -541,8 +802,8 @@ Aviseringstjänsten körs inte. \nFörsök att starta om appen. Automatisk omstart av aviseringstjänsten - Tjänsten kommer inte att starta när enheten startas om, så du kommer inte att få aviseringar förrens Element har öppnats en gång. - Bakgrundsbegränsningar är aktiverade för Element. + Tjänsten kommer inte att starta när enheten startas om, så du kommer inte att få aviseringar förrens ${app_name} har öppnats en gång. + Bakgrundsbegränsningar är aktiverade för ${app_name}. \nSaker som appen försöker göra kommer att kraftigt begränsas när appen är bakgrunden, och detta kan påverka aviseringar. \n%1$s Om en användare lämnar sin enhet urkopplad och stilla en längre tid, med skärmen av, så går enheten in i Doze-läget. Detta hindrar appar från att komma åt nätverket och skjuter upp deras uppgifter, synkroniseringar och standardlarm. @@ -561,8 +822,8 @@ Meddelanden innehållande mitt användarnamn Meddelanden i direktchattar Meddelanden i gruppchattar - Element kommer att synka i bakgrunden periodiskt vid precisa tider (konfigurerbart). -\nDetta kommer att påverka data- och batterianvändning, och det kommer att visas en permanent avisering som säger att Element lyssnar efter händelser. + ${app_name} kommer att synka i bakgrunden periodiskt vid precisa tider (konfigurerbart). +\nDetta kommer att påverka data- och batterianvändning, och det kommer att visas en permanent avisering som säger att ${app_name} lyssnar efter händelser. Version olm-version Behåll media @@ -582,9 +843,9 @@ Upptäckbarhet Hantera dina upptäckbarhetsinställningar. Aviseringssekretess - Element kan köra i bakgrunden för att hantera dina aviseringar säkert och privat. Detta kan påverka batteritiden. - Element behöver hålla en bakgrundsanslutning med låg påverkan för att ha pålitliga aviseringar. -\nPå nästa skärm kommer du att frågas om du vill tillåta att Element alltid körs i bakgrunden, vänligen acceptera. + ${app_name} kan köra i bakgrunden för att hantera dina aviseringar säkert och privat. Detta kan påverka batteritiden. + ${app_name} behöver hålla en bakgrundsanslutning med låg påverkan för att ha pålitliga aviseringar. +\nPå nästa skärm kommer du att frågas om du vill tillåta att ${app_name} alltid körs i bakgrunden, vänligen acceptera. Inloggad som Hemserver Identitetsserver @@ -725,7 +986,7 @@ \nLogga in igen för att komma åt din kontodata och dina meddelanden. Avancerade inställningar Visar endast de första resultaten, skriv mer… - Element kan krascha mer när ett oväntat fel inträffar + ${app_name} kan krascha mer när ett oväntat fel inträffar Efter aktivering så kan kryptering inte avaktiveras. Din e-postdomän är inte auktoriserad för att registrera på den här servern Meddelanden i det här rummet är inte totalsträckskrypterade. @@ -774,7 +1035,7 @@ Vi kunde inte bjuda in användarna. Vänligen kolla användarna du vill bjuda in och försök igen. Koppla bort från identitetsservern %s\? - Den här identitetsservern är utdaterat. Element stöder endast API V2. + Den här identitetsservern är utdaterat. ${app_name} stöder endast API V2. Vänligen konfigurera en identitetsserver. Vänligen acceptera först identitetsserverns användarvillkor i inställningarna. Din hemserver (%1$s) föreslår att du använder %2$s som din identitetsserver @@ -849,11 +1110,11 @@ Välj en rumskatalog %d oläst aviserat meddelande - %s olästa aviserade meddelanden + %d olästa aviserade meddelanden %d oläst aviserat meddelande - %s olästa aviserade meddelanden + %d olästa aviserade meddelanden %1$s: %2$d meddelande @@ -910,7 +1171,7 @@ Ljud Fil Dekal - Element hanterar inte meddelanden av typen \'%1$s\' + ${app_name} hanterar inte meddelanden av typen \'%1$s\' Skickar det valda meddelandet I regnbågsfärger Meddelanderedigering Meddelandenyckel @@ -947,7 +1208,7 @@ Du kan inte ringa ett samtal till dig själv, vänta tills deltagare accepterar inbjudan Misslyckades att lägga till widget Misslyckades att ta bort widget - Elementsamtal misslyckades + ${app_name}samtal misslyckades Misslyckades att upprätta en realtidsuppkoppling. \nVänligen be administratören för din hemserver att konfigurera en TURN-server för att samtal ska fungera pålitligt. Välj ljudenhet @@ -1052,7 +1313,7 @@ Upphovsrätt Integritetspolicy Telefon - Du kan inte göra detta från element på mobilen + Du kan inte göra detta från ${app_name} på mobilen Autentisering krävs Diagnostik för felsökning Kör tester @@ -1062,7 +1323,7 @@ Misslyckades att ladda anpassade regler, vänligen försök igen. Kolla Play-tjänster APK:n Google Play-tjänster är tillgänglig och uppdaterad. - Element använder Google Play-tjänster för att skicka pushmeddelanden, men den verkar inte vara korrekt konfigurerad: + ${app_name} använder Google Play-tjänster för att skicka pushmeddelanden, men den verkar inte vara korrekt konfigurerad: \n%1$s Fixa Play-tjänster Firebase-token @@ -1070,12 +1331,12 @@ \n%1$s Misslyckades att hämta FCM-token: \n%1$s - [%1$s] -\nDet här felet är ur Elements kontroll, och enligt Google indikerar det här felet att den här enheten har för många appar registrerade med FCM. Felet händer endast i fall då extremt många appar är installerade, så det bör inte påverka normala användare. - [%1$s] -\nDet här felet är ur Elements kontroll. Det kan hända av flera anledningar. Det kanske funkar om du försöker igen senare, du kan kolla så att Google Play-tjänster inte är databegränsad i systeminställningarna, eller att enhetens klocka går rätt, eller så kan det hända på en alternativ ROM. - [%1$s] -\nDet här felet är ur Elements kontroll. Det finns inget Google-konto på telefonen. Vänligen öppna kontohanteraren och lägg till ett Google-konto. + [%1$s] +\nDet här felet är ur ${app_name}s kontroll, och enligt Google indikerar det här felet att den här enheten har för många appar registrerade med FCM. Felet händer endast i fall då extremt många appar är installerade, så det bör inte påverka normala användare. + [%1$s] +\nDet här felet är ur ${app_name}s kontroll. Det kan hända av flera anledningar. Det kanske funkar om du försöker igen senare, du kan kolla så att Google Play-tjänster inte är databegränsad i systeminställningarna, eller att enhetens klocka går rätt, eller så kan det hända på en alternativ ROM. + [%1$s] +\nDet här felet är ur ${app_name}s kontroll. Det finns inget Google-konto på telefonen. Vänligen öppna kontohanteraren och lägg till ett Google-konto. Lägg till konto Token-registrering FCM-token registrerades framgångsrikt på hemservern. @@ -1088,11 +1349,11 @@ Tjänsten kommer att startas när enheten startas om. Aktivera start på boot Kolla bakgrundsrestriktioner - Bakgrundsrestriktioner är inaktiverade för Element. Detta test bör köras med mobildata (inte Wi-Fi). + Bakgrundsrestriktioner är inaktiverade för ${app_name}. Detta test bör köras med mobildata (inte Wi-Fi). \n%1$s Inaktivera restriktioner Batterioptimering - Element påverkas inte av batterioptimering. + ${app_name} påverkas inte av batterioptimering. Ignorera optimering Reducerad sekretess Den här appen behöver behörighet att köra i bakgrunden @@ -1217,7 +1478,7 @@ %1$s, %2$s och %3$d annan har läst %1$s, %2$s och %3$d andra har läst - Element behöver behörighet för att spara dina nycklar för totalsträckskryptering i lagringen. + ${app_name} behöver behörighet för att spara dina nycklar för totalsträckskryptering i lagringen. \n \nVänligen ge tillstånd i nästa popup för att kunna manuellt exportera dina nycklar. Du ignorerar inga användare @@ -1233,7 +1494,7 @@ Varning: Din personliga data (inklusive krypteringsnycklar) lagras fortfarande på den här enheten. \n \nRensa den om du inte ska använda den här enheten längre, eller vill logga in på ett annat konto. - Den nuvarande sessionen är för användaren %1$s och du försedde uppgifter för användaren %2$s. Detta stöds inte av Element. + Den nuvarande sessionen är för användaren %1$s och du försedde uppgifter för användaren %2$s. Detta stöds inte av ${app_name}. \nVänligen rensa först data, och logga sen in på ett annat konto. Se alla mina sessioner Utvecklarläge @@ -1303,16 +1564,16 @@ Återställningsnyckel för säkerhetskopiering Förhindra skärmdumpar av appen Att aktivera den här inställningen lägger till FLAG_SECURE till alla aktiviteter. Starta om appen för att inställningen ska få effekt. - Använd senaste Element på dina andra enheter; Element Web, Element iOS, Element för Android, eller annan Matrixklient som stöder korssignering + Använd senaste ${app_name} på dina andra enheter; ${app_name} Web, ${app_name} iOS, ${app_name} för Android, eller annan Matrixklient som stöder korssignering eller en annan Matrixklient som städer korssignering - Använd senaste Element på dina andra enheter: + Använd senaste ${app_name} på dina andra enheter: Tvingar den nuvarande utgående gruppsessionen i ett krypterat rum att kasseras Säkerhetskopian kunde inte avkrypteras med den här återställningsnyckeln: vänligen verifiera att du skrev in rätt återställningsnyckel. Sätt upp säker säkerhetskopiering Säker säkerhetskopiering Sätt upp Skriv in en hemlig fras endast du känner till, och generera en nyckel för säkerhetskopiering. - Element kommer att synka i bakgrunden på ett sätt som sparar på enhetens begränsade resurser (batteri). + ${app_name} kommer att synka i bakgrunden på ett sätt som sparar på enhetens begränsade resurser (batteri). \nBeroende på din enhets resurser, så kan synkroniseringen bli uppskjuten av operativsystemet. Optimerad för realtid Ingen bakgrundssynk @@ -1343,8 +1604,8 @@ Ge behörighet Statistik Skicka statistikdata - Element samlar in anonym statistik för att låta oss förbättra appen. - Vänligen aktivera statistik för att hjälpa oss att förbättra Element. + ${app_name} samlar in anonym statistik för att låta oss förbättra appen. + Vänligen aktivera statistik för att hjälpa oss att förbättra ${app_name}. Ja, jag vill hjälpa till! Databesparingsläge ID @@ -1583,7 +1844,7 @@ Lösenfrasen matchar inte Vänligen skriv en lösenfras Lösenfrasen är för svag - Vänligen radera lösenfrasen om du vill att Element ska generera en återställningsnyckel. + Vänligen radera lösenfrasen om du vill att ${app_name} ska generera en återställningsnyckel. Sätt lösenfras Skapar säkerhetskopia Framgång ! @@ -1626,7 +1887,7 @@ Signatur Autokomplettera serveralternativ - Element detekterade en anpassad serverkonfiguration för din användar-ID-domän \"%1$s\": + ${app_name} detekterade en anpassad serverkonfiguration för din användar-ID-domän \"%1$s\": \n%2$s Använd konfig Verifiera genom att jämföra en kort textsträng. @@ -1676,7 +1937,7 @@ Ändra Vänligen vänta… Det här rummet kan inte förhandsgranskas - Förhandsgranskning av världsläsbara rum stöds inte än av Element + Förhandsgranskning av världsläsbara rum stöds inte än av ${app_name} Nytt rum SKAPA Namn @@ -1772,7 +2033,6 @@ Adress Premiumservervärd för organisationer Skriv in adressen för den Modular Element eller server du vill använda - Skriv in adressen för en server eller Element du vill ansluta till Skriv in adressen för servern du vill använda Ett fel inträffade vid laddning av sidan: %1$s (%2$d) Appen kan inte logga in på den här hemservern. Hemservern stöder följande inloggningstyp(er): %1$s. @@ -1894,8 +2154,8 @@ Standardbehörig i %1$s Anpassad (%1$d) i %2$s Hoppa till läskvitto - Element hanterar inte händelser av typen \'%1$s\' - Element stötte på ett fel vid rendering av innehållet i händelsen med id \'%1$s\' + ${app_name} hanterar inte händelser av typen \'%1$s\' + ${app_name} stötte på ett fel vid rendering av innehållet i händelsen med id \'%1$s\' Avignorera Skickar den givna emoten i regnbågsfärg Godkänn @@ -1951,7 +2211,7 @@ Händelsen raderades av användaren, anledning: %1$s Händelsen modererades av rumsadministratören. Anledning: %1$s Nycklarna är redan uppdaterade! - Element Android + ${app_name} Android Ladda om Ny inloggning. Var det du\? Tryck för att granska och verifiera @@ -2003,10 +2263,10 @@ Generar SSSS-nyckel baserat på återställningsnyckel Lagrar hemlighet för nyckelsäkerhetskopiering i SSSS %1$s (%2$s) - Element Webb -\nElement Skrivbord - Element iOS -\nElement Android + ${app_name} Webb +\n${app_name} Skrivbord + ${app_name} iOS +\n${app_name} Android Använd din %1$s eller %2$s för att fortsätta. Använd återställningsnyckel Välj din återställningsnyckel eller mata in den manuellt genom att skriva den eller klistra in från klippbordet @@ -2030,7 +2290,7 @@ Inbjudan skickad till %1$s och %2$s Öppna villkor för %s Den här operationen är inte möjlig. Hemservern är utdaterad. - För ditt privatlivs skull stöder Element bara att skicka hashade e-postadresser och telefonnummer. + För ditt privatlivs skull stöder ${app_name} bara att skicka hashade e-postadresser och telefonnummer. Associationen har misslyckats. Det finns ingen nuvarande association med den här identifieraren. Använd %1$s @@ -2056,11 +2316,10 @@ Du ändrade rumsinställningarna framgångsrikt Kan inte avkryptera Väntar på krypteringshistorik - Riot är nu Element! - Vi är glada att meddela att vi har bytt namn! Din app är uppdaterad och du är inloggad på ditt konto. - UPPFATTAT - LÄR DIG MER - element + Riot är nu Element! + Vi är glada att meddela att vi har bytt namn! Din app är uppdaterad och du är inloggad på ditt konto. + UPPFATTAT + LÄR DIG MER Spara återställningsnyckel i Lägg till från min telefonbok Din telefonbok är tom @@ -2102,7 +2361,6 @@ Kod Vänligen använd internationellt format (telefonnumret måste börja med \'+\') Bekräfta din identitet genom att verifiera den här inloggningen, och ge den åtkomst till dina krypterade meddelanden. - Tyvärr stöds den här handlingen inte än för konton anslutna med externt konto. Kan inte öppna ett rum du är bannad från. Kan inte hitta det här rummet. Se till att det existerar. @@ -2121,13 +2379,13 @@ \n \nAnvänd varsamt, det kan leda till oväntat beteende. så kommer du att börja om utan historik, meddelanden, betrodda enheter eller betrodda användare - PIN-kod krävs varje gång du öppnar Element. - PIN-kod krävs efter att du inte har använt Element på 2 minuter. + PIN-kod krävs varje gång du öppnar ${app_name}. + PIN-kod krävs efter att du inte har använt ${app_name} på 2 minuter. Kräv PIN-kod efter 2 minuter Visa bara antal olästa meddelanden i en enkel avisering. Visa detaljer som rumsnamn och meddelandeinnehåll. Visa innehåll i aviseringar - PIN-kod är det enda sättet att låsa upp Element. + PIN-kod är det enda sättet att låsa upp ${app_name}. Aktivera enhetsspecifik biometri, som fingeravtryck och ansiktsigenkänning. Aktivera biometri Ställ in skydd @@ -2208,8 +2466,8 @@ Dela min kod Skanna en QR-kod Det är inte en giltig Matrix-QR-kod - 🔐️ Gå med mig i Element - Hallå, prata med mig i Element: %s + 🔐️ Gå med mig i ${app_name} + Hallå, prata med mig i ${app_name}: %s Bjud in vänner Lägg till personer "Ämne: " @@ -2316,8 +2574,91 @@ Det är rummet är inte offentligt. Du kommer inte kunna gå med igen utan en inbjudan. Systemets förval Misslyckades att autentisera - Element kräver att du anger dina autentiseringsuppgifter innan du gör det här. + ${app_name} kräver att du anger dina autentiseringsuppgifter innan du gör det här. Omautentisering krävs Mislyckades att ställa in korssignering Obehörig, saknar giltiga autentiseringsuppgifter + Användare + Ett fel inträffade när samtalet flyttades + Flytta + Anslut + Rådfråga först + + 1 aktivt samtal (%1$s) - 1 pausat samtal + 1 aktivt samtal (%1$s) - %2$d pausade samtal + + + Pausat samtal + %1$d pausade samtal + + Aktivt samtal (%1$s) + Ett fel inträffade när telefonnumret slogs upp + Knappsats + Ring tillbaka + Det här samtalet har avslutats + %1$s avböjde det här samtalet + Du avböjde det här samtalet %1$s + Du är för närvarande i det här samtalet + %1$s startade ett samtal + Du startade ett samtal + Du parkerade samtalet + %s parkerade samtalet + Parkera + Återuppta + Tillbaka + + %d inmatning + %d inmatningar + + Gränsen är okänd. + Din hemserver accepterar bilagor (filer, media o.s.v.) med en storlek upp till %s. + Serverns filuppladdningsgräns + Serverversion + Servernamn + Rumsinställningar + Lämna det nuvarande gruppsamtalet och byt till det andra\? + Rumsversion + Nytt värde + Byt + Initial synk: +\nLaddar ner data… + Initial synk: +\nVäntar på serversvar… + Visa läskvitton + Avisera inte + Avisera utan ljud + Avisera med ljud + Meddelandet skickades inte på grund av ett fel + Ikryssad + Stäng emojival + Öppna emojival + Betrodd förtroendenivå + Varningsförtroendenivå + Förvald förtroendenivå + Vald + Video + Det här rummet har oskickade utkast + Vissa meddelanden har inte skickats + Radera avatar + Byt avatar + Bild + Importera nyckel från fil + Öppna widgets + Skärmdump + Händelseinnehåll + Lägeshändelse skickad! + Händelse skickad! + Felformaterad händelse + Meddelandetyp saknas + Inget innehåll + Händelseinnehåll + Lägesnyckel + Typ + Skicka anpassad lägeshändelse + Redigera innehåll + Lägeshändelser + Skicka lägeshändelse + Skicka anpassad rumshändelse + Utforska rumsläge + Utvecklingsverktyg \ No newline at end of file diff --git a/vector/src/main/res/values-szl/strings.xml b/vector/src/main/res/values-szl/strings.xml index d24e516fd3..e060344ae4 100644 --- a/vector/src/main/res/values-szl/strings.xml +++ b/vector/src/main/res/values-szl/strings.xml @@ -56,8 +56,7 @@ Nasuchowanie zdarzyń Synchrōnizowanie… Inicjalizacyjo usugi - Tymat Status.im - Czorny tymat + Czorny tymat Ciymny tymat Jasny tymat \ No newline at end of file diff --git a/vector/src/main/res/values-te/strings.xml b/vector/src/main/res/values-te/strings.xml index 1e6e138835..14232e65eb 100644 --- a/vector/src/main/res/values-te/strings.xml +++ b/vector/src/main/res/values-te/strings.xml @@ -1,5 +1,71 @@ + %s\'s ఆహ్వానం + %1$s ఆహ్వానించారు %2$s + %1$s వదిలి వెళారు + %1$s ఆహ్వానాన్ని తిరస్కరించారు + %1$s తన్నాడు %2$s + %1$s నిషేధాన్ని %2$s + %1$s నిషేధించారు %2$s + %1$s ఉపసంహరించుకుంది %2$s\'s ఆహ్వానం + %1$s వారి అవతార్ను మార్చారు + %1$s వారి డిస్ప్లే పేరును ని సెట్ చేసారు %2$s + %1$s వారి ప్రదర్శన పేరును %2$s నుండి %3$s మార్చారు + %1$s వారి ప్రదర్శన పేరుని తీసివేసారు (%2$s) + %1$s అంశం మార్చబడింది:%2$s + %1$s గది పెరు మార్చబడింది %2$s + %s ఒక వీడియో కాల్ని ఉంచింది. + %s వాయిస్ కాల్ని ఉంచారు. + %s కాల్కి సమాధానం ఇచ్చారు. + %s కాల్ ముగిసింది. + %1$s భవిష్యత్ గది చరిత్రను %2$s కి కనిపించేలా చేసింది + పాయింట్నుండి, అన్ని గది సభ్యుల వారు ఆహ్వానించబడ్డారు. + పాయింట్ నుండి, అన్ని గదుల సభ్యుల వారు చేరారు. + అన్ని గదుల సభ్యులు. + ఎవరైనా. + తెలియని (%s). + %1$s ఎండ్-టు-ఎండ్ ఎన్క్రిప్షన్ ఆన్ చెయ్యబడింది (%2$s) + + %1$s వి ఓ ఇ పి సమావేశాన్ని అభ్యర్థించారు + వి ఓ ఇ పి సమావేశం ప్రారంభమైంది + వి ఓ ఇ పి సమావేశం ముగిసింది + + (అవతార్ మార్చబడింది) + %1$s గది పేరు తొలగించబడింది + %1$s గది అంశాన్ని తీసివేసారు + %1$s వారి ప్రొఫైల్ నవీకరించబడింది %2$s + %1$s గదిలో చేరడానికి %2$s కు ఆహ్వానాన్ని పంపారు + %2$sకోసం %1$s ఆహ్వానాన్ని అంగీకరించారు + + ** వ్యక్తీకరించడానికి సాధ్యం కాలేదు: %s ** + ఈ సందేశానికి పంపేవారి పరికరం మాకు కీలను పంపలేదు. + + గది స్క్రీన్ + సందేశం పంపడం సాధ్యం కాలేదు + + చిత్రాన్ని అప్లోడ్ చేయడంలో విఫలమైంది + + సాధారణ లోపాలు + మాట్రిక్స్ లోపం + + మళ్లీ ఖాళీ గది ని చేరడానికి ప్రస్తుతం ఇది సాధ్యం కాదు. + + ఎన్క్రిప్టెడ్ సందేశం + + ఇమెయిల్ చిరునామా + ఫోను నంబరు + + + %1$s: %2$s + %1$s ఒక చిత్రం పంపారు. + + %1$s మిమ్మల్ని ఆహ్వానించారు + %1$s చేరారు + + %s నుండి ఆహ్వానించు + %1$s మరియు %2$s + గదికి ఆహ్వానం + ఖాళీ గది గది అలాగే సభ్యుని వివరాలు @@ -49,7 +115,7 @@ స్థానిక చిరునామా పుస్తకం మ్యాట్రిక్స్ పరిచయాలు మాత్రమే సంభాషణలు లేవు - మీరు మీ స్థానిక పరిచయాలను యాక్సెస్ చేయడానికి రియోట్ను అనుమతించలేదు + మీరు మీ స్థానిక పరిచయాలను యాక్సెస్ చేయడానికి రియోట్ను అనుమతించలేదు ఫలితాలు లేవు గదులు @@ -177,8 +243,8 @@ వీడియో రికార్డ్ చేయలేరు సమాచారం - చిత్రాలను మరియు వీడియో కాల్లను తీయడానికి మీ కెమెరాను ప్రాప్తి చేయడానికి Elementకు అనుమతి అవసరం. - ఆడియో కాల్లను చేయడానికి మీ మైక్రోఫోన్ను ప్రాప్యత చేయడానికి Elementకు అనుమతి అవసరం. + చిత్రాలను మరియు వీడియో కాల్లను తీయడానికి మీ కెమెరాను ప్రాప్తి చేయడానికి ${app_name}కు అనుమతి అవసరం. + ఆడియో కాల్లను చేయడానికి మీ మైక్రోఫోన్ను ప్రాప్యత చేయడానికి ${app_name}కు అనుమతి అవసరం. క్షమించాలి… ఆమోదించని అనుమతుల కారణంగా చర్య చేయలేదు దాయబడినది @@ -481,7 +547,7 @@ ఇంకా నొక్కని ఇ-తపాలా లింగక కెమెరాను ప్రారంభించడం సాధ్యపడదు - అటాచ్మెంట్లు పంపడానికి మరియు సేవ్ చేయడానికి మీ ఫోటో మరియు వీడియో లైబ్రరీని ప్రాప్తి చేయడానికి కలతకు అనుమతి అవసరం. + అటాచ్మెంట్లు పంపడానికి మరియు సేవ్ చేయడానికి మీ ఫోటో మరియు వీడియో లైబ్రరీని ప్రాప్తి చేయడానికి కలతకు అనుమతి అవసరం. \n \nదయచేసి మీ ఫోన్ నుండి ఫైల్లను పంపగల తదుపరి పాప్-అప్లో ప్రాప్యతను అనుమతించండి. " @@ -490,7 +556,7 @@ " \n \nదయచేసి కాల్ చేయడానికి వీలుగా తదుపరి పాప్-అప్లో ప్రాప్యతను అనుమతించండి." - "మీ కెమెరాను మరియు మీ శబ్ద ప్రసారిణి సాంగత్యం చేయడానికి రియోట్కు అనుమతి అవసరం. + "మీ కెమెరాను మరియు మీ శబ్ద ప్రసారిణి సాంగత్యం చేయడానికి రియోట్కు అనుమతి అవసరం. \n \nదయచేసి పిలుపు చేయడానికి వీలుగా తదుపరి పాప్-అప్ల్లో ప్రాప్యతను అనుమతించండి." ప్రత్యేక ప్రదర్శన diff --git a/vector/src/main/res/values-th/strings.xml b/vector/src/main/res/values-th/strings.xml index ed3cd5614c..c677202fe5 100644 --- a/vector/src/main/res/values-th/strings.xml +++ b/vector/src/main/res/values-th/strings.xml @@ -1,14 +1,12 @@ - + + %1$s: %2$s หรือ เปิด ปิด ปิดใช้งาน - คำเตือน - อ่านแล้ว - ข้าม รหัสผ่าน รหัสผ่านใหม่ @@ -28,10 +26,8 @@ ลบ เปลี่ยนชื่อ ข้าม - ส่งสติกเกอร์ กำลังโหลด… - ส่งต่อ ไม่มี รายงานเนื้อหา @@ -44,21 +40,17 @@ ผู้คน ห้อง ชุมชน - การเชิญ การแจ้งเตือนจากระบบ - - คุณไม่ได้อนุญาตให้ Element เข้าถึงรายชื่อผู้ติดต่อในเครื่อง + คุณไม่ได้อนุญาตให้ ${app_name} เข้าถึงรายชื่อผู้ติดต่อในเครื่อง ไม่มีผลลัพธ์ ไม่มีห้อง ผู้ใช้ %d คน - เชิญ ชุมชน ไม่มีกลุ่ม - ถ้าเป็นไปได้ โปรดเขียนคำอธิบายเป็นภาษาอังกฤษ อธิบายปัญหาของคุณที่นี่ ส่งไปยัง @@ -68,11 +60,9 @@ เข้าสู่ระบบ ออกจากระบบ ค้นหา - เริ่มแชทใหม่ ลองโดยใช้ %s ไม่ต้องถามฉันอีก - เลือกอุปกรณ์เสียง โทรศัพท์ ลำโพง @@ -83,7 +73,6 @@ หลัง ปิด HD เปิด HD - ส่งสติกเกอร์ เข้าสู่ระบบ สร้างบัญชี @@ -97,4 +86,182 @@ หมายเลขโทรศัพท์ หมายเลขโทรศัพท์ (ไม่จำเป็น) รหัสผ่านสั้นเกินไป (อย่างน้อย 6 ตัว) - + ข้อมูล + ถ่ายภาพหรือวิดีโอ + กำลังโทร… + โทร + การโทร + ชื่อห้อง + วันนี้ + เมื่อวาน + %1$d นาที %2$d วิ + %d วิ + ขนาดเล็ก + ขนาดกลาง + ขนาดใหญ่ + ต้นฉบับ + ส่งเป็น + รายการกลุ่ม + ชื่อผู้ใช้นี้ถูกใช้ไปแล้ว + ชื่อผู้ใช้/รหัสผ่านไม่ถูกต้อง + ข้อผิดพลาด SSL + ไม่สามารถเข้าสู่ระบบ + ชื่อผู้ใช้ถูกใช้แล้ว + กรุณาตรวจสอบอีเมลเพื่อดำเนินการลงทะเบียนต่อไป + ลืมรหัสผ่าน\? + รหัสผ่านไม่ตรงกัน + ไม่ได้ใส่รหัสผ่าน + ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง + ยืนยันรหัสผ่านใหม่ + ใส่รหัสผ่านอีกครั้ง + ถ่ายวิดีโอ + ถ่ายภาพ + เริ่มการโทรวิดีโอ + เริ่มการโทรเสียง + ความคืบหน้า (%s%%) + ไดเรกทอรีห้อง + ห้อง + ไม่มีผลลัพธ์เพิ่มเติม + ไม่มีการสนทนา + การสนทนา + ลำดับความสำคัญต่ำ + รายการโปรด + ข้อผิดพลาด + สำเร็จ + การยืนยัน + คัดลอกไปยังคลิปบอร์ดแล้ว + เลิกเผยแพร่ + เพิ่ม + คัดลอก + ตอบกลับด่วน + การโทรวิดีโอ + การโทรเสียง + ออกจากระบบ + ออก + วางสาย + ปฏิเสธ + ยอมรับ + ปฏิเสธ + เพิกเฉย + เรียบร้อย + ยอมรับ + ออฟไลน์ + เชิญ + ข้อมูลเซสชั่น + ไม่สามารถเริ่มการโทร + เริ่มการประชุมเสียง + เริ่มการประชุมวิดีโอ + เริ่มสนทนา + รีเซ็ต + ปิดทิ้ง + เลิกเชื่อมต่อ + ดูต้นฉบับที่ถอดรหัสแล้ว + ดูต้นฉบับ + ไว้ภายหลัง + ลบออก + ส่งซ้ำ + อยู่ + สำรองข้อมูล + คุณแน่ใจหรือไม่\? + ข้อมูลชุมชน + ค่าเริ่มต้นของระบบ + เพิ่มที่อยู่อีเมล + หมายเลขโทรศัพท์ + + พบ %1$s ห้องสำหรับ %2$s + + + %d ห้อง + + เข้าร่วม + ยังไม่รองรับการค้นหาในห้องที่เข้ารหัส + ไฟล์ + ผู้คน + ข้อความ + ห้อง + ไม่มีผลลัพธ์ + ค้นหา + เหตุผลที่รายงานเนื้อหานี้ + เชิญแล้ว + + เลือก %d รายการ + + การตั้งค่า + ไฟล์ + ผู้คน + ข้อมูลห้อง + เปลี่ยนหัวข้อ + อัปเกรดห้อง + เปิดใช้การเข้ารหัสห้อง + เปลี่ยนการตั้งค่า + เชิญผู้ใช้ + ส่งข้อความ + ไม่เชื่อถือ + เชื่อถือ + ออกจากระบบ + + %d ข้อความใหม่ + + ส่งข้อความ (ไม่เข้ารหัส)… + ส่งข้อความที่เข้ารหัส… + %1$s และ %2$s และคนอื่น ๆ กำลังพิมพ์… + %1$s และ %2$s กำลังพิมพ์… + %s กำลังพิมพ์… + ค้นหา + %1$s และ %2$s + %1$s %2$s + เหตุผล + เตะ + เลิกแบน + แบน + ออกจากห้องนี้ + เชิญ + ข้อความโดยตรง + โทร + เครื่องมือผู้ดูแล + %1$s %2$s ที่ผ่านมา + %1$s ตอนนี้ + ว่าง + ออฟไลน์ + ออนไลน์ + สร้าง + คุณแน่ใจหรือไม่ว่าต้องการออกจากห้อง + ออกจากห้อง + + %d วิ + + + %d นาที + + + %d ชม. + + + %d วัน + + เพิ่มสมาชิก + แชทใหม่ + ห้อง + ไปที่ข้อความแรกที่ยังไม่ได้อ่าน + แสดงรายชื่อสมาชิก + ปฏิเสธ + ตัวอย่าง + เข้าร่วม + ดำเนินการต่อ + ไม่ + ใช่ + บันทึกแล้ว + ต้องยืนยันว่าต้องการโทรจริง ๆ ก่อนที่จะเริ่มการโทร + ป้องกันการโทรโดยไม่ได้ตั้งใจ + หัวข้อห้อง + ยกเลิกการอัปโหลดหรือไม่\? + ยกเลิกการดาวน์โหลดหรือไม่\? + ส่งคำขอแล้ว + โปรดระบุ URL ที่ถูกต้อง + URL ต้องขึ้นต้นด้วย http[s]:// + ส่งข้อความเสียง + เฉพาะรายชื่อผู้ติดต่อ Matrix + ไม่มีห้องสาธารณะ + ยกเลิก + ระบุทั้งหมดว่าอ่านแล้ว + \ No newline at end of file diff --git a/vector/src/main/res/values-tlh/strings.xml b/vector/src/main/res/values-tlh/strings.xml index 2d0c94a5f1..0f7f1ac8e9 100644 --- a/vector/src/main/res/values-tlh/strings.xml +++ b/vector/src/main/res/values-tlh/strings.xml @@ -2,7 +2,7 @@ tu\'qom wov tu\'qom Hurgh - tu\'qom qIj + tu\'qom qIj vIrapmoHltaH wanI\' vInejtaH diff --git a/vector/src/main/res/values-tr/strings.xml b/vector/src/main/res/values-tr/strings.xml index 2f4c163d6d..13d4a7c313 100644 --- a/vector/src/main/res/values-tr/strings.xml +++ b/vector/src/main/res/values-tr/strings.xml @@ -2,7 +2,7 @@ Açık Tema Koyu Tema - Siyah Tema + Siyah Tema Senkronize ediliyor… Etkinlikler dinleniyor Sesli bildirimler @@ -85,7 +85,7 @@ Kullanıcı sözlüğü Sadece Matrix kullanıcıları Konuşma yok - Element\'in yerel rehbere erişmesine izin vermediniz + ${app_name}\'in yerel rehbere erişmesine izin vermediniz Sonuç yok Odalar Odalar dizini @@ -147,7 +147,6 @@ Şifre Yeni şifre Kullanıcı adı - Status.im Teması Anahtar Yedekleme Anahtar Yedekleme\'yi Kullan Anahtar yedekleme tamamlanmadı, lütfen bekleyiniz… @@ -245,7 +244,7 @@ Diğer oturumlardan şifreleme anahtarlarını tekrar iste. Anahtar isteği gönderildi. İstek gönderildi - Element\'i mesajları çözebilen farklı bir cihazda açarsanız ordan anahtarları bu oturuma gönderebilirsiniz. + ${app_name}\'i mesajları çözebilen farklı bir cihazda açarsanız ordan anahtarları bu oturuma gönderebilirsiniz. Makbuz Listesini Oku Grup Listesi @@ -266,7 +265,7 @@ Oda adı Oda konusu Aramalar - Gelen aramalar için varsayılan Element zil sesini kullan + Gelen aramalar için varsayılan ${app_name} zil sesini kullan Gelen arama zil sesi Aramalar için zil sesi seç: Arama @@ -286,22 +285,22 @@ Resim ya da video çek Video kaydedilemiyor Bilgilendirme - Element\'in ekleri göndermek ya da kaydetmek için galeriye erişmeye ihtiyacı var. + ${app_name}\'in ekleri göndermek ya da kaydetmek için galeriye erişmeye ihtiyacı var. \n \nLütfen çıkacak ekranda telefonunuzdan dosya gönderebilmesine izin verin. - Element\'in resim ya da video çekmek için kameraya erişmeye ihtiyacı var. + ${app_name}\'in resim ya da video çekmek için kameraya erişmeye ihtiyacı var. " \n \nLütfen çıkacak ekranda kameraya erişebilmesine izin verin." - Element\'in sesli arama yapması için mikrofonunuza erişmeye ihtiyacı var. + ${app_name}\'in sesli arama yapması için mikrofonunuza erişmeye ihtiyacı var. " \n \nLütfen çıkacak ekranda mikrofona erişebilmesine izin verin." - Element\'in görüntülü arama yapması için kameranıza ve mikrofonunuza erişmeye ihtiyacı var. + ${app_name}\'in görüntülü arama yapması için kameranıza ve mikrofonunuza erişmeye ihtiyacı var. \n \nLütfen çıkacak ekranda kamera ve mikrofona erişebilmesine izin verin. - Element eposta ve telefon numaralarına göre diğer Matrix kullanıcılarını bulmak için rehberinizi kontrol edebilir. Eğer bu nedenle rehberinizi paylaşmak istiyorsanız, lütfen açılan ekranda erişime izin verin. - Element\'in eposta ve telefon numaralarına göre diğer Matrix kullanıcılarını bulmak için rehberinizi kontrol edebilir. + ${app_name} eposta ve telefon numaralarına göre diğer Matrix kullanıcılarını bulmak için rehberinizi kontrol edebilir. Eğer bu nedenle rehberinizi paylaşmak istiyorsanız, lütfen açılan ekranda erişime izin verin. + ${app_name}\'in eposta ve telefon numaralarına göre diğer Matrix kullanıcılarını bulmak için rehberinizi kontrol edebilir. \n \nRehberinizi bu sebeple paylaşmayı kabul ediyor musunuz\? Üzgünüz. İsteğiniz, yetersiz izinlerden dolayı gerçekleştirilemedi @@ -517,8 +516,8 @@ Etkinleştir Oturum Ayarları. Bildirimler bu oturum için etkinleştirilmiş. - Bildirimler bu oturum için etkin değil. -\nLütfen Element ayarlarını gözden geçirin. + Bildirimler bu oturum için etkin değil. +\nLütfen ${app_name} ayarlarını gözden geçirin. Etkinleştir Özel Ayarlar. Bazı mesajların türü sessize ayarlanmıştır (sessiz bir bildirim gönderecektir). @@ -527,7 +526,7 @@ Ayarları Gözden Geçir Play Hizmetlerini Gözden Geçir Google Play Hizmetleri APK\'sı kullanılabilir ve güncel. - Element bildirimleri göndermek için Google Play Hizmetleri kullanır, ancak düzgün ayarlanmış görünmüyor: + ${app_name} bildirimleri göndermek için Google Play Hizmetleri kullanır, ancak düzgün ayarlanmış görünmüyor: \n%1$s Google Play Hizmetlerini Düzelt Firebase Belirteci @@ -535,12 +534,12 @@ \n%1$s FCM belirtecini alırken hata meydana geldi: \n%1$s - [%1$s] -\nBu hata Element\'in kontrolü dışında Google\'a bağlı ve cihazın çok fazla FCM ile kayıtlı uygulaması olduğunu belirtiyor. Bu hata sadece çok fazla uygulama kullanıldığı zaman olur ve genelde ortalama kullanıcıyı etkilemez. - [%1$s] -\nBu hata Element\'in kontrolü dışında ve birçok nedene bağlı olabilir. Belki sonra denediğin zaman çalışır. Ayrıca Google Play Hizmetlerinin veri kullanımı konusunda sistem ayarlarında kısıtlanmamış ya da cihaz saatinin doğru olduğundan emin olun, bu hata özel ROM\'larda meydana gelebiliyor. - [%1$s] -\nBu hata Element\'in kontrolü dışında. Telefonda hiç Google hesabı yok. Lütfen hesap yöneticisini açın ve bir tane Google hesabı ekleyin. + [%1$s] +\nBu hata ${app_name}\'in kontrolü dışında Google\'a bağlı ve cihazın çok fazla FCM ile kayıtlı uygulaması olduğunu belirtiyor. Bu hata sadece çok fazla uygulama kullanıldığı zaman olur ve genelde ortalama kullanıcıyı etkilemez. + [%1$s] +\nBu hata ${app_name}\'in kontrolü dışında ve birçok nedene bağlı olabilir. Belki sonra denediğin zaman çalışır. Ayrıca Google Play Hizmetlerinin veri kullanımı konusunda sistem ayarlarında kısıtlanmamış ya da cihaz saatinin doğru olduğundan emin olun, bu hata özel ROM\'larda meydana gelebiliyor. + [%1$s] +\nBu hata ${app_name}\'in kontrolü dışında. Telefonda hiç Google hesabı yok. Lütfen hesap yöneticisini açın ve bir tane Google hesabı ekleyin. Hesap ekle Belirteç Kayıtı FCM belirteci başarı ile AnaMakineye kaydedildi. @@ -556,17 +555,17 @@ Hizmet yeniden başlatılamadı Açılışta başlat Hizmet cihaz yeniden başlatıldığında çalıştırılacak. - Hizmet cihaz yeniden başlatılınca çalıştırılmayacak, Element\'i açana kadar bildirimleri almakyacaksın. + Hizmet cihaz yeniden başlatılınca çalıştırılmayacak, ${app_name}\'i açana kadar bildirimleri almakyacaksın. Açılışta başlatı etkinleştir Arkaplan kısıtlamalarını gözden geçir - Arkaplan kısıtlamaları Element için devre dışı. Bu test mobil veri kullanacak (WIFI değil). + Arkaplan kısıtlamaları ${app_name} için devre dışı. Bu test mobil veri kullanacak (WIFI değil). \n%1$s - Arkaplan kısıtlamaları Element için etkinleştirilmiş. + Arkaplan kısıtlamaları ${app_name} için etkinleştirilmiş. \nUygulamanın arkaplanda iken yapmaya çalıştığı şeyler agresif bir biçimde kısıtlanacak ve bu bildirimleri de etkileyebilir. \n%1$s Kısıtlamaları devre dışı bırak Pil Optimizasyonu - Element Pil Optimizasyonundan etkilenmedi. + ${app_name} Pil Optimizasyonundan etkilenmedi. Eğer kullanıcı cihazını prize bağlanmamış sabit ve ekranı kapalı bir şekilde bir süre bırakırsa cihaz Derin uyku moduna geçer. Bu uygulamaların internete erişmesini engeller ve yapılacak işlerini, senkronizasyolarını, alarmını erteler. Optimizasyonu Göz ardı et Normal @@ -640,17 +639,17 @@ Hesabı devre dışı bırak Hesabımı devre dışı bırak Bildirim Gizliliği - Element bildirimlerinizi güvenli ve gizli bir şekilde yönetmek için arkaplanda çalışır. Bu pil kullanımını etkileyebilir. + ${app_name} bildirimlerinizi güvenli ve gizli bir şekilde yönetmek için arkaplanda çalışır. Bu pil kullanımını etkileyebilir. İzin ver Farklı bir seçenek seç Arkaplan Bağlantısı - Element güvenilir bildirimlere sahip olmak için düşük arkaplan bağlatısı yapmaya ihtiyaç duyar. -\nÇıkacak ekranda Element\'in arkaplanda sürekli çalışması için izin istenecek, lütfen kabul edin. + ${app_name} güvenilir bildirimlere sahip olmak için düşük arkaplan bağlatısı yapmaya ihtiyaç duyar. +\nÇıkacak ekranda ${app_name}\'in arkaplanda sürekli çalışması için izin istenecek, lütfen kabul edin. İzin ver Analiz Analiz verilerini gönder - Element uygulamayı geliştirmemiz için anonim analitik veriler toplar. - Lütfen Element\'i geliştirebilmemiz için analizleri etkinleştirin. + ${app_name} uygulamayı geliştirmemiz için anonim analitik veriler toplar. + Lütfen ${app_name}\'i geliştirebilmemiz için analizleri etkinleştirin. Evet, Yardım etmek istiyorum! Veri kaydetme modu Veri kaydetme modu belirli filtreler uygular bu sayede ilerki güncellemeler ve yazıyor bildirimleri filtrelenir. @@ -974,7 +973,7 @@ Parolalar uyuşmuyor Lütfen bir parola girin Parola çok zayıf - Eğer Element\'in kurtarma anahtarı oluşturmasını istiyorsanız lütfen parolayı silin. + Eğer ${app_name}\'in kurtarma anahtarı oluşturmasını istiyorsanız lütfen parolayı silin. Matrix oturumu müsait değil Şifrelenmiş mesajları asla kaybetme Şifrelenmiş odalarda mesajlar uçtan-uca şifreleme ile korunur. Sadece sen ve makbuzcular bu mesajları okumak için anahtara sahip. @@ -1090,11 +1089,11 @@ Anasunucunuz çağrı yardımcı sunucusu vermez ise %s çağrı yardımcı sunucusu olarak kullanılacaktır (Çağrıda IP adresiniz paylaşılacaktır) Bu eylemi gerçekleştirebilmek için ayarlarınızdan bir kimlik sunucusu ekleyin. Şifreni doğrula - Element, cihazın sınırlı kaynaklarını (pil) koruyacak şekilde arka planda senkronize olur. + ${app_name}, cihazın sınırlı kaynaklarını (pil) koruyacak şekilde arka planda senkronize olur. \nCihazınızın kaynak durumuna bağlı olarak, senkronizasyon işletim sistemi tarafından ertelenebilir. Gerçek zamanlı için optimize - Element periyodik olarak belirli bir zamanda (ayarlanabilir) arka planda senkronize olur. -\nBu pil ve radyo kullanımını etkileyecek ve Element\'in olayları dinlediğini belirten kalıcı bir bildirim gösterecektir. + ${app_name} periyodik olarak belirli bir zamanda (ayarlanabilir) arka planda senkronize olur. +\nBu pil ve radyo kullanımını etkileyecek ve ${app_name}\'in olayları dinlediğini belirten kalıcı bir bildirim gösterecektir. Arka plan senkronizasyonu yok Tercih Edilen Senkronize Aralığı %s @@ -1176,7 +1175,7 @@ Yedek durumu kontrol ediliyor Geçersiz anasunucu keşif cevabı Sunucu Ayarlarını Otomatik Doldur - Element userld alan adı için özel sunucu yapılandırması buldu \"%1$s\": + ${app_name} userld alan adı için özel sunucu yapılandırması buldu \"%1$s\": \n%2$s Yapılandırmayı kullan Geçersiz ya da süresi dolmuş girdilerden dolayı çıkış yaptınız. @@ -1251,7 +1250,7 @@ Lütfen bekleyin… Tüm Topluluklar Bu oda önizlenemez - Element henüz herkese-açık odaları önizlemeyi desteklemiyor + ${app_name} henüz herkese-açık odaları önizlemeyi desteklemiyor Odalar Doğrudan Mesajlar Yeni Oda @@ -1265,7 +1264,7 @@ Anahtar yedek verileri alınırken hata oluştu Bu geçerli bir Matrix sunucu adresi değil Bu URL ile ev-sunucusuna erişilemiyor, lütfen kontrol edin - Bunu Element mobil ile yapamazsınız + Bunu ${app_name} mobil ile yapamazsınız Kimlik doğrulama gereklidir Arkaplan Senkronizasyon Modu (Deneysel) Batarya için optimize edildi @@ -1277,7 +1276,7 @@ Kopyala Başarılı Bildirimler - Element Araması Başarısız Oldu + ${app_name} Araması Başarısız Oldu Eş zamanlı bağlantı kurulamadı. \nAramaların hatasız çalışması için snucunuzun yöneticisinden TURN sunucusu ayarlamasını rica edin. Ses Cihazı Seç @@ -1709,4 +1708,8 @@ %1$d/%2$d anahtar başarıyla içe aktarıldı. %1$d/%2$d anahtar başarıyla içe aktarıldı. + Aramayı beklettiniz + %s aramayı bekletti + Beklet + Devam et \ No newline at end of file diff --git a/vector/src/main/res/values-tzm/strings.xml b/vector/src/main/res/values-tzm/strings.xml index 9054e9e2b1..befe8dd878 100644 --- a/vector/src/main/res/values-tzm/strings.xml +++ b/vector/src/main/res/values-tzm/strings.xml @@ -2,7 +2,6 @@ Tisɣal Tuzinin - Asgum Status.im Tisɣal Tisɣal Tisɣal diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index ac06e1ed0a..09aafac703 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -1,9 +1,181 @@ + %1$s: %2$s + %1$s надсилає зображення. + %s запрошення + %1$s запрошує %2$s + + Запрошення від %s + Запрошення до кімнати + %1$s і %2$s + Порожня кімната + %1$s надсилає наліпку. + %1$s запрошує вас + %1$s приєднується + %1$s залишає кімнату + %1$s відхиляє запрошення + %1$s викидає %2$s + %1$s розблоковує %2$s + %1$s блокує %2$s + %1$s відкликає запрошення для %2$s + %1$s змінює свій аватар + %1$s встановлюють собі назву %2$s + %1$s змінює своє ім’я з %2$s на %3$s + %1$s прибирає своє ім’я (%2$s) + %1$s змінює тему на: %2$s + %1$s змінює назву кімнати на: %2$s + %s починає відеовиклик. + %s розпочинає голосовий виклик. + %s відповідає на виклик. + %s завершує дзвінок. + %1$s робить майбутню історію кімнати видимою для %2$s + всіх учасників кімнати, з моменту їх запрошення. + всіх учасників кімнати, з моменту їх приєднання. + всіх учасників кімнати. + будь-кого. + невідомо (%s). + %1$s вмикає наскрізне шифрування (%2$s) + %1$s запросив(ла) VoIP конференцію + VoIP конференція розпочалась + VoIP конференція завершилась + (аватар також змінено) + %1$s прибирає назву кімнати + %1$s прибирає тему кімнати + %1$s оновлює свій профіль %2$s + %1$s надсилає запрошення %2$s приєднатися до кімнати + %1$s приймає запрошення до %2$s + ** Неможливо розшифрувати: %s ** + Пристрій відправника не надіслав нам ключ для цього повідомлення. + Неможливо відредагувати + Не вдалося надіслати повідомлення + Не вдалося завантажити зображення + Помилка мережі + Помилка Matrix + Наразі неможливо переприєднатися до порожньої кімнати. + Адреса електронної пошти + Номер телефону + + %1$s та 1 інший + %1$s та %2$d інші + %1$s та %2$d інших + + + %s оновлює цю кімнату. + Повідомлення вилучено + %1$s вилучає повідомлення + Повідомлення вилучено [причина: %1$s] + Початкове налаштування: +\nІмпортування даних облікового запису + Ви вийшли. Причина: %1$s + %1$s виходить. Причина: %2$s + Ви залишили кімнату. Причина: %1$s + %1$s залишає кімнату. Причина: %2$s + %1$s залишає кімнату + Ви залишили кімнату + Ви залишили кімнату + Ви змінили адреси цієї кімнати. + Ви змінили основну та альтернативну адреси цієї кімнати. + Ви змінили альтернативні адреси для цієї кімнати. + Ви змінили рівень доступу на %1$s. + Ви змінили серверні списки контролю доступу для цієї кімнати. + Ви змінили назву кімнати на: %1$s + Ви змінили світлину кімнати + Ви змінили тему на: %1$s + Ви змінили показуване ім\'я з %1$s на %2$s + Ви змінили світлину профілю + + %1$s, %2$s, %3$s та %4$d інший + %1$s, %2$s, %3$s та %4$d інші + %1$s, %2$s, %3$s та %4$d інших + %1$s, %2$s, %3$s та %4$d інших + + %1$s, %2$s, %3$s та %4$s + %1$s, %2$s та %3$s + Типово + Модератор + Адміністратор + Ви вилучили %1$s віджет + %1$s вилучає %2$s віджет + Ви додали %1$s віджет + %1$s додає %2$s віджет + Ви прийняли запрошення до %1$s + Ви надіслали запрошення для %1$s приєднатися до кімнати + Ви оновили свій профіль %1$s + %1$s вилучає повідомлення [причина: %2$s] + Ви прибрали аватар кімнати + %1$s прибирає аватар кімнати + Ви прибрали тему кімнати + Ви прибрали назву кімнати + %s оновлює кімнату. + Ви оновили цю кімнату. + Ви увімкнули наскрізне шифрування (%1$s) + Ви починаєте голосовий виклик. + Ви починаєте відеовиклик. + %1$s змінює аватар кімнати + Ви прибрали показуване ім\'я (%1$s) + Ви викинули %1$s + %1$s запрошує %2$s + Ви відхилили запрошення + Ви приєдналися + %1$s приєднується + Ви приєдналися до кімнати + Ви запросили %1$s + Ви запросили %1$s + Ви створили обговорення + %1$s створює обговорення + Ви створили кімнату + %1$s створює кімнату + Ваше запрошення + Ви надіслали наліпку. + Ви надіслали зображення. + Ви відхилили запрошення. Причина: %1$s + %1$s відхиляє запрошення. Причина: %2$s + Ви приєдналися. Причина: %1$s + %1$s приєднується. Причина: %2$s + Ви приєднуєтеся до кімнати. Причина: %1$s + %1$s приєднується до кімнати. Причина: %2$s + %1$s запрошує вас. Причина: %2$s + Ви запросили %1$s. Причина: %2$s + %1$s запрошує %2$s. Причина: %3$s + Ваше запрошення. Причина: %1$s + Запрошення від %1$s. Причина: %2$s + Очистити чергу надсилання + Надсилання повідомлень… + Початкова синхронізація: +\nІмпортування спільнот + Початкова синхронізація: +\nІмпортування кімнат, які ви залишили + Початкова синхронізація: +\nІмпортування запрошень до кімнат + Початкова синхронізація: +\nІмпортування кімнат, до яких ви приєдналися + Початкова синхронізація: +\nІмпортування кімнат + Початкова синхронізація: +\nІмпортування криптографічних даних + Початкова синхронізація: +\nІмпортування даних облікового запису… + Порожня кімната (була %s) + Власний + Власний (%1$d) + Ви змінили віджет %1$s + %1$s змінює віджет %2$s + Ви оновили кімнату. + Ви зробили майбутню історію кімнати видимою для %1$s + Ви зробили майбутні повідомлення видимими для %1$s + %1$s робить майбутні повідомлення видимими для %2$s + Ви завершили дзвінок. + Ви відповіли на виклик. + Ви надіслали дані для налаштування виклику. + %s надсилає дані для налаштування виклику. + Ви встановили собі показуване ім\'я %1$s + Ви відкликали запрошення для %1$s + Ви заблокували %1$s + Ви заблокували %1$s Світла Тема Темна Тема - OLED Тема + OLED Тема Синхронізація… Слухати події @@ -57,7 +229,7 @@ Швидка відповідь Відкрити Закрити - Скопійовано у сховок + Скопійовано до буфера обміну Вимкнути Підтвердження @@ -81,7 +253,7 @@ Каталог користувачів Лише Matrix-контакти Немає бесід - Ви не надали Element доступу до контактів + Ви не надали ${app_name} доступу до контактів Немає результатів Кімнати @@ -218,16 +390,16 @@ Не вдалося записати відео" Інформація - Для передачі та збереження вкладень потрібен доступ до медіатеки.\n\nБудь ласка, надайте його у наступному виринаючому вікні, щоб отримати змогу надсилати файли з вашого телефону. - Для зйомки та відеодзвінків необхідно мати доступ до камери. + Для передачі та збереження вкладень потрібен доступ до медіатеки.\n\nБудь ласка, надайте його у наступному виринаючому вікні, щоб отримати змогу надсилати файли з вашого телефону. + Для зйомки та відеодзвінків необхідно мати доступ до камери. \n\nБудь ласка, надайте його у наступному виринаючому вікні, щоб мати змогу здійснювати дзвінки. - Для здійснення аудіодзвінків потрібен доступ до мікрофону. + Для здійснення аудіодзвінків потрібен доступ до мікрофону. \n\nБудь ласка, надайте його у наступному виринаючому вікні, щоб мати змогу здійснити дзвінок. - Для здійснення відеодзвінків потрібен доступ до камери та мікрофону.\n\nБудь ласка, надайте його у наступних виринаючих вікнах, щоб мати змогу їх здійснити. - Element потребує доступу до ваших контактів, щоб знайти інших користувачів Matrix за їх електронними адресами та номерами телефонів. Якщо ви згодні, надайте його у наступному діалоговому вікні, щоб знати, які з контактів теж використовують Element. - Element потребує доступу до ваших контактів, щоб знайти інших користувачів Matrix за електронною поштою чи номерами телефонів. + Для здійснення відеодзвінків потрібен доступ до камери та мікрофону.\n\nБудь ласка, надайте його у наступних виринаючих вікнах, щоб мати змогу їх здійснити. + ${app_name} потребує доступу до ваших контактів, щоб знайти інших користувачів Matrix за їх електронними адресами та номерами телефонів. Якщо ви згодні, надайте його у наступному діалоговому вікні, щоб знати, які з контактів теж використовують ${app_name}. + ${app_name} потребує доступу до ваших контактів, щоб знайти інших користувачів Matrix за електронною поштою чи номерами телефонів. \n -\nНадати Element доступ до ваших контактів\? +\nНадати ${app_name} доступ до ваших контактів\? Вибачте.. Дію не виконано через нестачу дозволів Збережено @@ -504,8 +676,8 @@ Адреси Експериментальні Це експериментальні функції, що можуть несподівано ламатись. Використовуйте з обережністю. - Наскрізне Шифрування - Наскрізне Шифрування увімкнено + Наскрізне шифрування + Наскрізне шифрування увімкнено Вийдіть з облікового запису, щоб отримати змогу увімкнути шифрування. Шифрувати лише до перевірених пристроїв Ніколи не надсилати шифровані повідомлення з цього пристрою неперевіреним пристроям у цій кімнаті. @@ -706,10 +878,9 @@ Так, я бажаю помогти! Настрій Сповіщення - Для відправлення ключа на цей пристрій, запустіть Element на іншому пристрої, що може дешифрувати повідомлення. + Для відправлення ключа на цей пристрій, запустіть ${app_name} на іншому пристрої, що може дешифрувати повідомлення. Вибачте, жодного стороннього застосунку не знайдено для завершення цієї дії. Відправити голосове повідомлення - Status.im Тема Ця дія неможлива через відсутність дозволів. Помилка Системні сповіщення @@ -769,9 +940,9 @@ • Сповіщення не будуть показувати вміст повідомлень Попередній перегляд посилань Попередній перегляд медіа перед відправкою - Element може працювати у фоновому режимі для керування безпекою та конфіденційністю ваших сповіщень. Це може вплинути на час роботи батареї. - Element збирає анонімну аналітику, щоб ми могли вдосконалювати цей додаток. - Будь ласка, увімкніть аналітику, щоб допомагати нам вдосконалювати Element. + ${app_name} може працювати у фоновому режимі для керування безпекою та конфіденційністю ваших сповіщень. Це може вплинути на час роботи батареї. + ${app_name} збирає анонімну аналітику, щоб ми могли вдосконалювати цей додаток. + Будь ласка, увімкніть аналітику, щоб допомагати нам вдосконалювати ${app_name}. Ви наразі не є учасником жодної спільноти. Ця кімната не показує настрій для спільнот Новий ID спільноти (наприклад, +foo:matrix.org) @@ -920,7 +1091,7 @@ Markdown задіяно. Markdown вимкнено. Виклики - Використовувати стандартний рингтон Element для вхідних викликів + Використовувати стандартний рингтон ${app_name} для вхідних викликів Мелодія вхідного виклику Виберіть мелодію викликів: Прийняти @@ -935,7 +1106,7 @@ Прямі чати Відправити нове пряме повідомлення Додає ¯\\_(ツ)_/¯ перед текстовим повідомленням - Element не підтримує повідомлення типу \'%1$s\' + ${app_name} не підтримує повідомлення типу \'%1$s\' Відправляє повідомлення розмальоване веселково Редактор повідомлень Відправляє повідомлення як текст без інтерпретації його як Markdown @@ -1047,8 +1218,8 @@ Номери телефонів Email адреси Скасувати запрошення - 🔐️ Приєднуйтесь до мене в Element - Привіт, поспілкуйся зі мною в Element: %s + 🔐️ Приєднуйтесь до мене в ${app_name} + Привіт, поспілкуйся зі мною в ${app_name}: %s Запросити друзів Всі спільноти Показувати заглушку на місці видалених повідомлень @@ -1066,7 +1237,7 @@ %1$s о %2$s Жодного номера телефону не додано до вашого облікового запису У ваш обліковий запис не додано жодної електронної адреси - Для вашої приватності Element підтримує лише надсилання хешованих електронних адрес користувачів та номера телефону. + Для вашої приватності ${app_name} підтримує лише надсилання хешованих електронних адрес користувачів та номера телефону. Ви не погодилися надіслати електронні адреси та телефонні номери на цей сервер ідентифікації для виявлення інших користувачів із ваших контактів. Ви погодилися надіслати електронні адреси та телефонні номери на цей сервер ідентифікації для виявлення інших користувачів із ваших контактів. Надіслати електронні адреси та номери телефонів @@ -1087,8 +1258,8 @@ Зверніть увагу, що для деяких типів повідомлень встановлено беззвучність (беззвучні сповіщення). Власні налаштування. Увімкнути - Сповіщення не ввімкнено для цього сеансу. -\nПеревірте налаштування Element. + Сповіщення не ввімкнено для цього сеансу. +\nПеревірте налаштування ${app_name}. Сповіщення ввімкнено для цього сеансу. Налаштування сеансу. Увімкнути @@ -1125,7 +1296,7 @@ Видимість Не вдалося встановити зв’язок у режимі реального часу. \nПопросіть адміністратора вашого домашнього сервера налаштувати сервер TURN для надійної роботи викликів. - Element не вдалося здійснити виклик + ${app_name} не вдалося здійснити виклик Попросіть адміністратора вашого домашнього сервера (%1$s) налаштувати сервер TURN для надійної роботи дзвінків. \n \nЯк варіант, ви можете спробувати використати загальнодоступний сервер на рівні %2$s, але це буде не так надійно й він надаватиме вашу IP-адресу цьому серверу. Ви також можете керувати цим у налаштуваннях. @@ -1145,7 +1316,7 @@ Дізнатись більше Безпека Безпека та приватність - Ми раді повідомити, що змінили назву! Ваш застосунок оновлено й ви ввійшли у свій обліковий запис. + Ми раді повідомити, що змінили назву! Ваш застосунок оновлено й ви ввійшли у свій обліковий запис. Зміну параля ще не завершено. \n \nЗупинити змінювання пароля\? @@ -1190,7 +1361,7 @@ \nБезпечно створюйте резервні копії ключів, щоб не втратити їх. Ніколи не втрачайте зашифровані повідомлення Немає доступного сеансу Matrix - Видаліть парольну фразу, якщо хочете, щоб Element створив ключ відновлення. + Видаліть парольну фразу, якщо хочете, щоб ${app_name} створив ключ відновлення. Парольна фраза занадто слабка Введіть парольну фразу Не знайдено дійсного файлу .apk сервісів Google Play. Сповіщення можуть працювати неправильно. @@ -1327,8 +1498,8 @@ Дозволити інтеграції Режим збереження даних застосовує певний фільтр, тому оновлення присутності та сповіщення про введення фільтруються. Надати дозвіл - Для отримання надійних сповіщень Element повинен підтримувати з’єднання у фоновому режимі з незначним споживанням даних. -\nНа наступному екрані вам буде запропоновано дозволити Element завжди працювати у фоновому режимі, погодьтеся. + Для отримання надійних сповіщень ${app_name} повинен підтримувати з’єднання у фоновому режимі з незначним споживанням даних. +\nНа наступному екрані вам буде запропоновано дозволити ${app_name} завжди працювати у фоновому режимі, погодьтеся. Фонове з’єднання Це замінить ваш поточний ключ або фразу. Створіть новий ключ безпеки або встановіть нову фразу безпеки для наявної резервної копії. @@ -1340,7 +1511,7 @@ Безпечне резервне копіювання Включає події запрошення/приєднання/виходу/видалення/заборони та зміни зображень профілю/видимих імен. Показати стан подій учасників кімнати - Управління ключами криптографії + Керування криптографічними ключами Використовуйте Менеджер інтеграції для керування ботами, мостами, віджетами та пакетами наклейок. \nМенеджери інтеграції отримують дані конфігурації та можуть змінювати віджети, надсилати запрошення до кімнати та надавати права від вашого імені. Інтеграції @@ -1356,27 +1527,27 @@ Не вдалося оновити налаштування. Ви не отримуватимете сповіщення про вхідні повідомлення, коли програма перебуває у фоновому режимі. Немає фонової синхронізації - Element періодично синхронізуватиметься у фоновому режимі в певний час (налаштовується). -\nЦе вплине на використання радіо та акумулятора, з’явиться постійне сповіщення про те, що Element очікує на події. + ${app_name} періодично синхронізуватиметься у фоновому режимі в певний час (налаштовується). +\nЦе вплине на використання радіо та акумулятора, з’явиться постійне сповіщення про те, що ${app_name} очікує на події. Оптимізовано для реального часу - Element синхронізується у фоновому режимі так, щоб зберегти обмежені ресурси пристрою (акумулятор). + ${app_name} синхронізується у фоновому режимі так, щоб зберегти обмежені ресурси пристрою (акумулятор). \nЗалежно від стану ресурсів вашого пристрою, синхронізацію може бути відкладено операційною системою. Оптимізовано для батареї Режим фонової синхронізації Застосунки не потребують з\'єднання з HomeServer у фоновому режимі, це має скоротити споживання батареї Нехтувати оптимізацією Якщо користувач залишає пристрій від\'єднаним та нерухомим впродовж певного часу з вимкненим екраном, пристрій переходить у режим дрімання. Це запобігає доступу програм до мережі та відкладає їх завдання, синхронізацію та стандартні сигнали тривоги. - Оптимізація акумулятора не впливає на Element. + Оптимізація акумулятора не впливає на ${app_name}. Оптимізація акумулятора Вимкнути обмеження - Фонові обмеження ввімкнено для Element. + Фонові обмеження ввімкнено для ${app_name}. \nРобота, яку намагається виконати застосунок, буде агресивно обмежена, доки вона перебуває у фоновому режимі й це може вплинути на сповіщення. \n%1$s - Фонові обмеження для Element вимкнено. Цю перевірку варто виконувати з використанням мобільних даних (без Wi-Fi). + Фонові обмеження для ${app_name} вимкнено. Цю перевірку варто виконувати з використанням мобільних даних (без Wi-Fi). \n%1$s Перевірте фонові обмеження Увімкніть Запуск під час завантаження - Служба не запуститься під час перезавантаження пристрою, ви не отримуватимете сповіщень, доки Element не буде відкрито. + Служба не запуститься під час перезавантаження пристрою, ви не отримуватимете сповіщень, доки ${app_name} не буде відкрито. Служба запуститься після перезапуску пристрою. Запускати під час завантаження Помилка перезапуску служби @@ -1400,19 +1571,19 @@ Токен FCM успішно зареєстровано на HomeServer. Реєстрація токена Додати обліковий запис - [%1$s] -\nЦя помилка не підконтрольна Element. На телефоні немає облікового запису Google. Відкрийте менеджер облікових записів і додайте обліковий запис Google. - [%1$s] -\nЦя помилка не підконтрольна Element. Це може статися з кількох причин. Можливо все запрацює, якщо ви спробуєте пізніше, ви також можете перевірити, чи не обмежено використання даних для служби Google Play в налаштуваннях системи, чи правильний годинник вашого пристрою, або це може статися в користувацькому ROM. - [%1$s] -\nЦя помилка не підконтрольна Element й за даними Google, вона вказує на те, що на пристрої зареєстровано забагато програм у FCM. Помилка виникає лише у випадках, коли встановлено надзвичайно багато застосунків, тому вона не повинна впливати на звичайного користувача. + [%1$s] +\nЦя помилка не підконтрольна ${app_name}. На телефоні немає облікового запису Google. Відкрийте менеджер облікових записів і додайте обліковий запис Google. + [%1$s] +\nЦя помилка не підконтрольна ${app_name}. Це може статися з кількох причин. Можливо все запрацює, якщо ви спробуєте пізніше, ви також можете перевірити, чи не обмежено використання даних для служби Google Play в налаштуваннях системи, чи правильний годинник вашого пристрою, або це може статися в користувацькому ROM. + [%1$s] +\nЦя помилка не підконтрольна ${app_name} й за даними Google, вона вказує на те, що на пристрої зареєстровано забагато програм у FCM. Помилка виникає лише у випадках, коли встановлено надзвичайно багато застосунків, тому вона не повинна впливати на звичайного користувача. Не вдалося отримати токен FCM: \n%1$s Токен FCM отримано успішно: \n%1$s Токен Firebase Виправити служби Play - Element використовує сервіси Google Play для доставлення push-сповіщень, але, схоже, його налаштовано неправильно: + ${app_name} використовує сервіси Google Play для доставлення push-сповіщень, але, схоже, його налаштовано неправильно: \n%1$s Відкрити Налаштування Сповіщення вимкнено в налаштуваннях системи. @@ -1424,7 +1595,7 @@ Переконайтеся, що ви натиснули посилання в електронному листі, який ми надіслали вам. Вилучити %s\? Потрібна автентифікація - Це неможливо зробити за допомогою Element mobile + Це неможливо зробити за допомогою ${app_name} mobile Підтвердити пароль Фільтрувати заборонених користувачів Скасування блокування користувача дозволить їм знову приєднатися до кімнати. @@ -1480,4 +1651,55 @@ Адреса Ви можете втратити доступ до своїх повідомлень, якщо вийдете з облікового запису або загубите цей пристрій. Ви впевнені\? + Увімкніть біометричні дані для певного пристрою, такі як відбитки пальців та розпізнавання обличчя. + Увімкнути біометрію + Виберіть PIN-код для безпеки + Підтвердьте PIN-код + Не вдалося підтвердити PIN-код, торкніться нового. + Введіть свій PIN-код + Забули PIN-код\? + Відновити PIN-код + Новий PIN-код + Щоб відновити PIN-код, потрібно буде повторно ввійти в систему та створити новий. + Увімкнути PIN-код + Якщо хочете відновити PIN-код, торкніться «Забули PIN-код», щоб вийти та відновити. + PIN-код — єдиний спосіб розблокувати ${app_name}. + Вимагати PIN-код через 2 хвилини + PIN-код вимагається після 2 хвилин не використання ${app_name}. + PIN-код потрібно вводити за кожного відкриття ${app_name}. + Змінити PIN-код + Зміна поточного PIN-коду + Підтвердьте PIN-код, щоб вимкнути його + Налаштування захисту + Захистіть доступ PIN-кодом та біометричними даними. + Захист доступу + Цей сеанс довірений для безпечного обміну повідомленнями, оскільки ви його підтвердили: + + %d активний сеанс + %d активні сеанси + %d активних сеансів + %d активних сеансів + + Активні сеанси + Переглянути всі сеанси + Показати всі сеанси + Помилка автентифікації + Потрібна повторна автентифікація + Для виконання цієї дії ${app_name} вимагає ввести свої облікові дані. + Якщо скасувати, ви не зможете читати зашифровані повідомлення на новому пристрої, а інші користувачі не довірятимуть йому + Якщо скасувати, ви не зможете читати зашифровані повідомлення на цьому пристрої, а інші користувачі довірятимуть йому + Керування сеансами + Просимо зачекати… + Перевірка входу + Вийти з цього сеансу + Це був не я + Повідомлення в цій кімнаті не захищено наскрізним шифруванням. + Повідомлення тут не захищено наскрізним шифруванням. + Увімкнути наскрізне шифрування… + Повідомлення в цій кімнаті наскрізно зашифровані. + Перевірити цей сеанс + Перевірте цей сеанс, підтвердивши, що на екрані партнера з’являються такі цифри + Перевірте цей сеанс, підтвердивши, що на екрані партнера з’являються ці емоджі + Перевірте цей сеанс, щоб позначити його надійним. Довірені сеанси партнерів дають вам додаткову впевненість під час використання наскрізно зашифрованих повідомлень. + Перевірте цей сеанс, щоб позначити його надійним та надати йому доступ до зашифрованих повідомлень. Якщо ви не входили в цей сеанс, ваш обліковий запис може бути зламано: \ No newline at end of file diff --git a/vector/src/main/res/values-uz/strings.xml b/vector/src/main/res/values-uz/strings.xml new file mode 100644 index 0000000000..b705987cdf --- /dev/null +++ b/vector/src/main/res/values-uz/strings.xml @@ -0,0 +1,111 @@ + + + Koʻtarish + Rad etish + Koʻrib chiqish + Eʼtiborsiz qoldirish + Tugatish + Bajarildi + O\'tkazib yuborish + Qabul qilish + Taklif qilish + yoki + Baribir joʻnatish + Baribir qo\'ng\'iroq qilish + Shifrlangan xonalarda konferents-qo\'ng\'iroqlar qo\'llab-quvvatlanmaydi + Siz o\'zingiz bilan qo\'ng\'iroq qila olmaysiz, ishtirokchilar taklifnomani qabul qilishini kuting + Siz o\'zingiz bilan qo\'ng\'iroq qila olmaysiz + Uchrashuvlarda Jitsi xavfsizlik va ruxsat berish qoidalari qo\'llaniladi. Xonada hozir bo\'lgan barcha odamlar sizning uchrashuvingiz o\'tayotganda qo\'shilishga taklifni ko\'rishadi. + Konferentsiya allaqachon davom etmoqda! + Sizda qo\'ng\'iroqni boshlash uchun ruxsat yo\'q + Ushbu xonada qoʻngʻiroqni amalga oshirishga ruxsatingiz yo‘q + Konferentsiya qo\'ng\'irog\'ini boshlash uchun sizning ruxsatingiz yo\'q + Ushbu xonada konferents-aloqani boshlashga ruxsatingiz yo‘q + Ushbu xonada konferentsiya boshlash uchun taklif qilish uchun sizga ruxsat kerak + Ruxsat yoʻqligi sababli bu harakat amalga oshirilmaydi + Ruxsat yoʻqligi sababli ayrim imkoniyatlar yo‘q bo‘lishi mumkin… + Joriy konferts-aloaqa. +\n%1$s yoki %2$s sifatida qoʻshilish + Chatni boshlash + Qayta oʻrnatish + Bekor qilish + Ijro etmoq + Faol qo\'ng\'iroq + Hisobot mazmuni + Ajratish + Bekor qilish + Yoʻq + Shifrlangan manbani ko‘rish + Manbani ko‘rish + Doimiy aloqa + Oldinga + Keyinroq + Uchinchi tomonlarning litsenziyalari + Chiqishdan oldin kalitlarning zaxira nusxasini yaratmasangiz, shifrlangan xabarlardan foydalanishni yo‘qotishingiz mumkin. + Zaxiraga nusxa olish + Ishonchingiz komilmi\? + Kalitlarni rezervlashdan foydalanish + Kalitlar rezervga olinmoqda… + Shifrlangan xabar kerak emas + Kalitlarni xavfsiz nusxa olish faoliyati shifrlangan xabarlardan foydalanishni yo‘qotmaslik uchun barcha seanslarda faol bo‘lishi kerak. + Kalitni saqlash amalga oshirilmoqda. Ayni paytda chiqsangiz, shifrlangan xabarlaringizni yoʻqotishingiz mumkin. + Kalitlarni arxivlash yakunlanmadi, kuting… + Kalitlarni rezervlashdan foydalanish + Kalitlarni rezervga olish + Hamjamiyat haqida ma’lumot + Ishtirokchi haqida ma’lumot + Sozlamalar + Tovushsiz bildirishnomalar + Shovqinli bildirishnomalar + Hodisalarni tinglash + Xizmat ishga tushirilmoqda + Qop-qora tema + Qora tema + Oq tema + Tizim tanlovi boʻyicha + Agar hozir chiqsangiz shifrlangan xabarlaringizni yoʻqotasiz + Sinxronizatsiya… + Xatolik toʻgʻrisida xabar berish + Loglarni joʻnatish + Xonalar yoʻq + Guruhlar yoʻq + Chaqirish + Boshqa natijalar yoʻq + Natija yoʻq + Faqat Matrix kontaktlari uchun + Xonalar + Xato + Ogohlantirish + Buferga koʻchirildi + Qoʻshish + Offlayn + Vidjetni oʻchirib boʻlmadi + Vidjet qoʻshib boʻlmadi + Sessiya haqida informatsiya + Qoʻngʻiroqni amalga oshirish imkoniyati yoʻq + Audio suhbatni boshlash + Video suhbatni boshlash + Qoʻngʻiroqni amalga oshirish imkoniyati yoʻq, iltimos keyinroq urunib koʻring + Video + Ovoz + Pauza + Qayta nomlash + Oʻchirib tashlash + Tozalash + Gapirish + Tarqatish + Yuklash + Oʻchirish + Qayta joʻnatish + Joʻnatish + Qolish + Chiqish + Saqlash + Bekor qilish + OK + Yuklanmoqda… + Sessiyani verifikatsiya qilish + Stiker joʻnatish + Xabarlar + Xona + \ No newline at end of file diff --git a/vector/src/main/res/values-uz/strings_no_weblate.xml b/vector/src/main/res/values-uz/strings_no_weblate.xml new file mode 100644 index 0000000000..080541f37a --- /dev/null +++ b/vector/src/main/res/values-uz/strings_no_weblate.xml @@ -0,0 +1,8 @@ + + + + uz + UZ + Latn + + \ No newline at end of file diff --git a/vector/src/main/res/values-vi/strings.xml b/vector/src/main/res/values-vi/strings.xml index 1b0dddc4e6..407fd31e8c 100644 --- a/vector/src/main/res/values-vi/strings.xml +++ b/vector/src/main/res/values-vi/strings.xml @@ -22,7 +22,7 @@ Bỏ qua Đã có một cuộc hội thoại đang diễn ra! Không có kết quả nào - Bạn chưa cho phép Element truy cập danh bạ của bạn + Bạn chưa cho phép ${app_name} truy cập danh bạ của bạn Không có cuộc trò chuyện nào Chỉ những liên hệ Matrix Thư mục người dùng @@ -151,7 +151,7 @@ Theo dõi sự kiện Đang đồng bộ hóa… Đang khởi tạo dịch vụ - Nền đen + Nền đen Nền tối Nền sáng Vui lòng kiểm tra email của bạn để tiếp tục quá trình đăng ký @@ -206,7 +206,7 @@ Loa Điện thoại Chọn thiết bị âm thanh - Cuộc gọi Element thất bại + Cuộc gọi ${app_name} thất bại Đừng hỏi lại tôi Hãy thử dùng %s Vui lòng yêu cầu quản trị viên của máy chủ nhà của bạn (%1$s) thiết lập một máy chủ TURN để các cuộc gọi có thể hoạt động […]. @@ -254,7 +254,7 @@ Gọi Chọn nhạc chuông: Nhạc chuông cho cuộc gọi đến - Dùng nhạc chuông mặc định cho cuộc gọi đến + Dùng nhạc chuông mặc định cho cuộc gọi đến Yêu cầu xác nhận trước khi gọi Tránh gọi nhầm Chủ đề của phòng diff --git a/vector/src/main/res/values-vls/strings.xml b/vector/src/main/res/values-vls/strings.xml index 2fc4c40be7..c8190e7a68 100644 --- a/vector/src/main/res/values-vls/strings.xml +++ b/vector/src/main/res/values-vls/strings.xml @@ -1,11 +1,108 @@ + %1$s: %2$s + %1$s èt e fotootje gesteurd. + %1$s èt e sticker gesteurd. + + Uutnodigienge van %s + %1$s èt %2$s uutgenodigd + %1$s èt joun uitgenodigd + %1$s neemt nu deel an ’t gesprek + %1$s èt ’t gesprek verloatn + %1$s èt d’uitnodigienge geweigerd + %1$s èt %2$s uut ’t gesprek verwyderd + %1$s èt %2$s ountbann + %1$s èt %2$s verbann + %1$s èt d’uutnodigienge van %2$s ingetrokkn + %1$s èt zyn/heur avatar angepast + %1$s èt zyn/heur noame angepast noa %2$s + %1$s èt zyn/heur noame angepast van %2$s noa %3$s + %1$s èt zyn/heur noame verwyderd (%2$s) + %1$s èt ’t ounderwerp veranderd noa: %2$s + %1$s èt de gespreksnoame veranderd noa: %2$s + %s èt e video-iproep gemakt. + %s èt e sproakiproep gemakt. + %s èt den iproep beantwoord. + %s èt ipgehangn. + %1$s èt de toekomstige gespreksgeschiedenisse zichtboar gemakt vo %2$s + alle deelnemers an ’t gesprek, vanaf ’t punt dan ze zyn uutgenodigd. + alle deelnemers an ’t gesprek, vanaf ’t punt dan ze zyn toegetreedn. + alle deelnemers an ’t gesprek. + iedereen. + ounbekend (%s). + %1$s èt eind-tout-eind-versleutelienge angezet (%2$s) + + %1$s èt e VoIP-vergoaderienge angevroagd + VoIP-vergoaderienge begunn + VoIP-vergoaderienge gestopt + + (avatar es ook veranderd) + %1$s èt de gespreksnoame verwyderd + %1$s èt ’t gespreksounderwerp verwyderd + Bericht verwyderd + Bericht verwyderd deur %1$s + Bericht verwyderd [reden: %1$s] + Bericht verwyderd deur %1$s [reden: %2$s] + %1$s èt zyn/heur profiel %2$s bygewerkt + %1$s èt een uutnodigienge noa %2$s gesteurd vo ’t gesprek toe te treedn + %1$s èt d’uutnodigienge vo %2$s anveird + + ** Kun nie ountsleuteln: %s ** + ’t Toestel van den afzender èt geen sleutels vo da bericht hier gesteurd. + + Kosteg nie verwyderd wordn + Kosteg ’t bericht nie verzendn + + Iploadn van ’t fotootje es mislukt + + Netwerkfout + Matrix-fout + + ’t Es vo de moment nie meuglik van e leeg gesprek were toe te treedn. + + E-mailadresse + Telefongnumero + + Uutnodigienge van %s + Gespreksuutnodigienge + + %1$s en %2$s + + + %1$s en 1 andere + %1$s en %2$d anderen + + + Leeg gesprek + + Initiële synchronisoasje: +\nAccount wor geïmporteerd… + Initiële synchronisoasje: +\nCrypto wor geïmporteerd + Initiële synchronisoasje: +\nGesprekkn wordn geïmporteerd + Initiële synchronisoasje: +\nDeelgenoomn gesprekken wordn geïmporteerd + Initiële synchronisoasje: +\nUutgenodigde gesprekkn wordn geïmporteerd + Initiële synchronisoasje: +\nVerloatn gesprekkn wordn geïmporteerd + Initiële synchronisoasje: +\nGemeenschappn wordn geïmporteerd + Initiële synchronisoasje: +\nAccountgegeevns wordn geïmporteerd + + %s èt da gesprek hier ipgewoardeerd. + + Bericht wor verstuurd… + Uutgoande wachtreeke leegn + + %1$s èt d’uutnodigienge vo %2$s vo ’t gesprek toe te treedn ingetrokkn Versleuteld bericht Licht thema Dounker thema - Zwart thema - Status.im-thema + Zwart thema Dienst wor geïnitialiseerd Bezig me synchroniseern… diff --git a/vector/src/main/res/values-w480dp/styles.xml b/vector/src/main/res/values-w480dp/styles.xml deleted file mode 100644 index 5f117273a3..0000000000 --- a/vector/src/main/res/values-w480dp/styles.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml index 8bffa6e437..e40e95da82 100644 --- a/vector/src/main/res/values-zh-rCN/strings.xml +++ b/vector/src/main/res/values-zh-rCN/strings.xml @@ -1,5 +1,211 @@ + %1$s 发送了一张图片。 + %s 的邀请 + %1$s 邀请了 %2$s + %1$s 邀请了您 + %1$s 加入了聊天室 + %1$s 离开了聊天室 + %1$s 拒绝了邀请 + %1$s 移除了 %2$s + %1$s 解封了 %2$s + %1$s 封禁了 %2$s + %1$s 更换了他们的头像 + %1$s 将他们的昵称设置为 %2$s + %1$s 把他们的昵称从 %2$s 改为 %3$s + %1$s 移除了他们的昵称 (%2$s) + %1$s 把主题改为: %2$s + %1$s 把聊天室名称改为: %2$s + %s 发起了一次视频通话。 + %s 发起了一次语音通话。 + %s 已接听通话。 + %s 已结束通话。 + 所有聊天室成员,从他们被邀请开始。 + 所有聊天室成员,从他们加入开始。 + 所有聊天室成员。 + 任何人。 + 未知(%s)。 + %1$s 开启了端到端加密(%2$s) + %1$s 请求了一次 VoIP 会议 + VoIP 会议已开始 + VoIP 会议已结束 + (头像也被更改) + %1$s 移除了聊天室名称 + %1$s 移除了聊天室主题 + ** 无法解密:%s ** + 发送者的设备没有向我们发送此消息的密钥。 + 无法发送消息 + 上传图像失败 + 网络错误 + Matrix 错误 + 目前无法重新加入一个空的聊天室。 + 电子邮箱地址 + 手机号码 + %1$s 撤回了对 %2$s 的邀请 + %1$s 让未来的聊天室历史记录对 %2$s 可见 + %1$s 更新了他的个人档案 %2$s + %1$s 向 %2$s 发送了加入聊天室的邀请 + %1$s 接受了 %2$s 的邀请 + 无法撤回 + %1$s:%2$s + %1$s 发送了一张贴纸。 + 空聊天室 + 来自 %s 的邀请 + 聊天室邀请 + %1$s 和 %2$s + + %1$s 与其他 %2$d 位 + + 消息已被移除 + 消息已被 %1$s 移除 + 消息已被移除 [原因: %1$s] + 消息已被 %1$s 移除 [原因: %2$s] + 初始化同步: +\n正在导入账号… + 初始化同步: +\n正在导入加密数据 + 初始化同步: +\n正在导入聊天室 + 初始化同步: +\n正在导入已加入的聊天室 + 初始化同步: +\n正在导入已邀请的聊天室 + 初始化同步: +\n正在导入已离开的聊天室 + 初始化同步: +\n正在导入社区 + 初始化同步: +\n正在导入账号数据 + %s 升级了此聊天室。 + 正在发送消息… + 清除正在发送队列 + %1$s 撤回了对 %2$s 加入聊天室的邀请 + %1$s 的邀请。理由:%2$s + %1$s 邀请了 %2$s。理由:%3$s + %1$s 邀请了您。理由:%2$s + %1$s 加入了聊天室。理由:%2$s + %1$s 离开了聊天室。理由:%2$s + %1$s 已拒绝邀请。理由:%2$s + %1$s 踢走了 %2$s。理由:%3$s + %1$s 解封了 %2$s。理由:%3$s + %1$s 封禁了 %2$s。理由:%3$s + %1$s 已发送邀请给 %2$s 来加入聊天室。理由:%3$s + %1$s 撤销了 %2$s 加入聊天室的邀請。理由:%3$s + %1$s 接受 %2$s 的邀請。理由:%3$s + %1$s 撤回了对 %2$s 的邀请。理由:%3$s + + %1$s 新增了 %2$s 为此聊天室的地址。 + + + %1$s 移除了 %2$s 作为此聊天室额地址。 + + %1$s 为此聊天室新增了 %2$s 并移除 %3$s 地址。 + %1$s 将此聊天室的主地址设为了 %2$s。 + %1$s 为此聊天室移除了主地址。 + %1$s 已允许访客加入聊天室。 + %1$s 已禁止访客加入聊天室。 + %1$s 已开启端到端加密。 + %1$s 已开启端到端加密(无法识别的演算法 %2$s)。 + %1$s 创建了这个聊天室 + 您发送了一张图片。 + 您发送了一张贴纸。 + 您的邀请 + 您创建了这个聊天室 + 您邀请了 %1$s + 您加入了聊天室 + 您离开了聊天室 + 您拒绝了邀请 + 您移除了 %1$s + 您解封了 %1$s + 您封禁了 %1$s + 您撤回了对 %1$s 的邀请 + 您更换了您的头像 + 您将您的昵称设置为 %1$s + 您将您的昵称从 %1$s 改为 %2$s + 您移除了您的昵称 (%1$s) + 您把主题改为:%1$s + %1$s 变更了聊天室头像 + 您变更了聊天室头像 + 您把聊天室名称改为:%1$s + 您发起了一次视频通话。 + 您发起了一次语音通话。 + %s 发送了数据以建立通话。 + 您发送了数据以建立通话。 + 您接听了通话。 + 您结束了通话。 + 您已让未来的聊天室记录对 %1$s 可见 + 您开启了端到端加密(%1$s) + 您升级了此聊天室。 + 您请求了 VoIP 会议 + 您移除了聊天室名称 + 您移除了聊天室主题 + %1$s 移除了聊天室头像 + 您移除了聊天室头像 + 您更新了您的个人档案 %1$s + 您向 %1$s 发送了加入聊天室的邀请 + 您已撤回了对 %1$s 加入聊天室的邀请 + 您接受了 %1$s 的邀请 + %1$s 添加了 %2$s 小部件 + 您添加了 %1$s 小部件 + %1$s 移除了 %2$s 小部件 + 您移除了 %1$s 小部件 + %1$s 修改了 %2$s 小部件 + 您修改了 %1$s 小部件 + 管理员 + 审核员 + 默认 + 自定义(%1$d) + 自定义 + 您更改了%1$s 的权力等级。 + %1$s 更改了 %2$s 的权力等级。 + %1$s 从 %2$s 到 %3$s + 您的邀请。理由:%1$s + 您邀请了 %1$s。理由:%2$s + 您加入了聊天室。理由:%1$s + 您离开了聊天室。理由:%1$s + 您拒绝了邀请。理由:%1$s + 您踢走了 %1$s。理由:%2$s + 您解封了 %1$s。理由:%2$s + 您封禁了 %1$s。理由:%2$s + 您已发送邀请给 %1$s 来加入聊天室。理由:%2$s + 您撤销了 %1$s 加入聊天室的邀请。理由:%2$s + 您接受了 %1$s 的邀请。理由:%2$s + 您撤回了 %1$s 的邀请。理由:%2$s + + 您新增了 %1$s 为此聊天室的地址。 + + + 您移除了此聊天室的 %1$s 地址。 + + 您为此聊天室新增了 %1$s 并移除了 %2$s 地址。 + 您将此聊天室的主地址设为了 %1$s。 + 您移除了此聊天室的主地址。 + 您已允许访客加入聊天室。 + 您已禁止访客加入聊天室。 + 您已开启端到端加密。 + 您已开启端到端加密(无法识别的算法 %1$s)。 + 您已离开。理由:%1$s + %1$s 已离开。理由:%2$s + 您已加入。理由:%1$s + %1$s 已加入。理由:%2$s + 您撤回了对 %1$s 的邀请 + %1$s 撤回了对 %2$s 的邀请 + 您邀请了 %1$s + %1$s 邀请了 %2$s + 您在此处升级。 + %s 在此处升级。 + 您使未来的消息对 %1$s 可见 + %1$s 使未来的消息对 %2$s 可见 + 您离开了聊天室 + %1$s 离开了聊天室 + 您已加入 + %1$s 已加入 + 您创建了讨论 + %1$s 创建了讨论 + 你已阻止客人加入房间。 + %1$s已阻止客人加入房间。 + 你已允许客人加入这里。 + %1$s 已允许客人加入这里。 接受 拒绝 挂断 @@ -189,11 +395,11 @@ %d 秒 通话已连接 通话正在连接… - 为了发送或保存附件,Element 需要访问您的图片和视频库。 + 为了发送或保存附件,${app_name} 需要访问您的图片和视频库。 \n \n请在接下来弹出的窗口中授权允许访问,以便应用能够从您的手机发送文件。 - 为了拍照或进行视频通话,Element 需要访问您的相机。 - 为了进行语音通话,Element 需要访问您的麦克风。 + 为了拍照或进行视频通话,${app_name} 需要访问您的相机。 + 为了进行语音通话,${app_name} 需要访问您的麦克风。 您试图访问聊天室 %s。您是否愿意加入这个聊天室? 管理工具 私聊 @@ -376,7 +582,7 @@ " \n \n请在接下来弹出的窗口中授权允许访问。" - Element需要许可才能访问您的摄像机和麦克风来执行视频通话。 + ${app_name}需要许可才能访问您的摄像机和麦克风来执行视频通话。 \n \n请在接下来弹出的窗口中授权允许访问。 对不起。因为权限不足,操作已取消 @@ -438,10 +644,10 @@ 发送至 已读标签清单 发送为 - Element 需要访问您的通讯录,才能根据电子邮箱地址和手机号码查找其他 Matrix 用户。 + ${app_name} 需要访问您的通讯录,才能根据电子邮箱地址和手机号码查找其他 Matrix 用户。 请在接下来的弹出窗口中授权允许访问。 - Element可以检查您的通讯录,以根据电子邮件和电话号码找到其他Matrix用户。 + ${app_name}可以检查您的通讯录,以根据电子邮件和电话号码找到其他Matrix用户。 \n \n你同意为此目的分享你的通讯录吗\? 空闲 @@ -497,7 +703,7 @@ 只显示 Matrix 联系人 没有对话 没有结果 - 您没有授予 Element 访问本地通讯录的权限 + 您没有授予 ${app_name} 访问本地通讯录的权限 聊天室 聊天室目录 @@ -551,7 +757,7 @@ 巨大 浅色主题 深色主题 - 黑色主题 + 黑色主题 通知声音 使用12小时制显示时间戳 您需要权限来管理这个聊天室的小部件 @@ -681,7 +887,7 @@ %d 条未读消息 通知隐私 - Element 可以在后台运行以安全隐密地管理您的通知(这可能会影响电池消耗)。 + ${app_name} 可以在后台运行以安全隐密地管理您的通知(这可能会影响电池消耗)。 获取权限 选择其他选项 • 通知通过 Firebase Cloud Messaging 发送 @@ -694,11 +900,11 @@ 停用账户 停用我的账户 发送统计分析数据 - Element 会收集匿名统计数据来帮助我们改进程序。 - 请允许资料分析以帮助我们改进 Element。 + ${app_name} 会收集匿名统计数据来帮助我们改进程序。 + 请允许资料分析以帮助我们改进 ${app_name}。 是的,我愿意帮助! 停用账户 - + 这将使您的账户永远不再可用。您将不能登录,或使用相同的用户 ID 重新注册。您的账户将退出所有已加入的聊天室,身份服务器上的账户信息也会被删除。此操作是不可逆的。 停用您的账户不会默认忘记您发送的消息。如果您希望我们忘记您发送的消息,请勾选下面的选择框。 Matrix 中的消息可见性类似于电子邮件。我们忘记您的消息意味着您发送的消息不会被发给新注册或未注册的用户,但是已收到您的消息的注册用户依旧可以看到他们的副本。 请在我停用账户的同时忘记我发送的所有消息(警告:这将导致未来的用户看到残缺的对话) 请输入您的密码以继续: 停用账户 @@ -724,7 +930,7 @@ 从其他设备上 重新请求密钥 已发送密钥共享请求。 已请求 - 请在其他可解密此消息的设备上启动 Element,以便其将密钥发送至当前设备。 + 请在其他可解密此消息的设备上启动 ${app_name},以便其将密钥发送至当前设备。 在此输入… 发送语音消息 请输入您的密码。 @@ -792,13 +998,12 @@ 本服务器已达到每月活跃用户限制。 请 %s 以继续使用本服务。 请 %s 以增加此限制的额度。 - Status.im 主题 仍然呼叫 接受 错误 请审阅并接受此主服务器的政策: 通话 - 为来电使用 Element 的默认铃声 + 为来电使用 ${app_name} 的默认铃声 来电铃声 请选择来电铃声: 移除 @@ -823,12 +1028,12 @@ 启用 设备设置。 已为此设备启用通知。 - 此会话未启用通知。 -\n请检查 Element 设置。 + 此会话未启用通知。 +\n请检查 ${app_name} 设置。 启用 Play 服务检查 Google Play 服务的 APK 文件可用且为最新版本。 - Element 使用 Google Play 服务来推送通知,但它似乎并未正确设置: + ${app_name} 使用 Google Play 服务来推送通知,但它似乎并未正确设置: \n%1$s 修复 Play 服务 Firebase 令牌 @@ -845,7 +1050,7 @@ 通知服务未在运行。 \n请尝试重启本应用程序。 启动服务 - 调用系统相机应用而非使用 Element 内置的相机界面。 + 调用系统相机应用而非使用 ${app_name} 内置的相机界面。 此选项需要第三方应用录制消息。 开机时启动 启用开机时启动 @@ -863,8 +1068,8 @@ 显示账户变动事件 包括头像与显示名称的变动。 后台连接 - Element需要保持低影响的后台连接,以便获得可靠的通知。 -\n下一个屏幕中,系统将提示您允许 Element 始终在后台运行,请点击“允许“。 + ${app_name}需要保持低影响的后台连接,以便获得可靠的通知。 +\n下一个屏幕中,系统将提示您允许 ${app_name} 始终在后台运行,请点击“允许“。 授予权限 在验证您的电子邮件地址时发生了一个错误。 密码 @@ -891,14 +1096,14 @@ 服务被停止,并已自动重启。 服务重启失败 服务将在设备重启后启动。 - 服务不会在设备重启后启动,在您打开 Element 一次之前您将不会收到消息通知。 - 已禁用对 Element 的后台限制。此测试应使用移动数据(非Wi-Fi)进行。 + 服务不会在设备重启后启动,在您打开 ${app_name} 一次之前您将不会收到消息通知。 + 已禁用对 ${app_name} 的后台限制。此测试应使用移动数据(非Wi-Fi)进行。 \n%1$s - 已启用对 Element 的后台限制。 -\nElement 在后台时的工作将被显著地限制,这可能会影响消息通知。 + 已启用对 ${app_name} 的后台限制。 +\n${app_name} 在后台时的工作将被显著地限制,这可能会影响消息通知。 \n%1$s 关闭后台限制 - Element 未被电池优化影响。 + ${app_name} 未被电池优化影响。 如果设备在未充电的情况下关屏静置一段时间,其将进入打盹模式(Doze)。这将阻止应用访问网络并延后其运行、同步、与响铃。 忽略电池优化 请输入用于加密密钥备份的密码。您在恢复此备份时需要使用此密码。 @@ -930,12 +1135,12 @@ 有些通知已在您的自定义设置中被禁用。 自定义规则加载失败,请重试。 检查设置 - [%1$s] -\n此错误不受 Element 控制,根据 Google 的说法,此错误表示该设备在 FCM 中注册了太多应用。该错误仅在应用程序数量极多的情况下发生,因此不应影响普通用户。 - [%1$s] -\n此错误不受 Element 控制。它的发生可能有几个原因。也许您稍后重试就有效了,您也可以检查一下 Google Play 服务是否被系统设置限制了数据使用,或者您的设备时钟是否正确,或者可能发生在自定义的 ROM 中。 - [%1$s] -\n此错误不受 Element 控制。此设备上没有登录 Google 账号。请打开账号管理器并添加一个 Google 账号。 + [%1$s] +\n此错误不受 ${app_name} 控制,根据 Google 的说法,此错误表示该设备在 FCM 中注册了太多应用。该错误仅在应用程序数量极多的情况下发生,因此不应影响普通用户。 + [%1$s] +\n此错误不受 ${app_name} 控制。它的发生可能有几个原因。也许您稍后重试就有效了,您也可以检查一下 Google Play 服务是否被系统设置限制了数据使用,或者您的设备时钟是否正确,或者可能发生在自定义的 ROM 中。 + [%1$s] +\n此错误不受 ${app_name} 控制。此设备上没有登录 Google 账号。请打开账号管理器并添加一个 Google 账号。 添加账号 设置响铃通知 设置电话通知 @@ -949,7 +1154,7 @@ 请输入一个用户名。 请输入密码 密码太弱 - 如果您想要 Element 生成一个恢复密钥,请删除密码。 + 如果您想要 ${app_name} 生成一个恢复密钥,请删除密码。 没有可用的 Matrix 会话 已加密信息永不丢失 加密聊天室中的信息会被端对端加密以确保安全。只有您和拥有密钥的接收方可以读取这些信息。 @@ -1061,7 +1266,7 @@ 密码不匹配 无效的主服务器探测响应 自动完成服务器选项 - Element 侦测到您的 userId 域名 \"%1$s\" 有自定义的服务器设置: + ${app_name} 侦测到您的 userId 域名 \"%1$s\" 有自定义的服务器设置: \n%2$s 使用设置 正在初始化服务 @@ -1187,7 +1392,7 @@ 复制 成功 通知 - Element 呼叫失败 + ${app_name} 呼叫失败 无法建立实时连接。 \n请要求您的家庭服务器管理员配置 TURN 服务器以使通话可靠工作。 选择声音设备 @@ -1228,15 +1433,15 @@ 取消封禁用户 取消封禁用户将允许他们再次加入聊天室。 确认您的密码 - 您无法在 Element 移动版中这么做 + 您无法在 ${app_name} 移动版中这么做 需要身份认证 后台同步模式 电池优化 - Element 将在后台以保留设备有限资源(电池)的方式同步。 + ${app_name} 将在后台以保留设备有限资源(电池)的方式同步。 \n取决于您的设备资源状态,同步可能被操作系统推迟。 实时优化 - Element 将在后台定期准时同步(可配置)。 -\n这将影响网络和电池的使用,将显示一个永久通知表明 Element 正在监听事件。 + ${app_name} 将在后台定期准时同步(可配置)。 +\n这将影响网络和电池的使用,将显示一个永久通知表明 ${app_name} 正在监听事件。 无后台同步 应用在后台时您不会收到消息通知。 更新设置失败。 @@ -1338,7 +1543,7 @@ 格式错误事件,无法显示 无网络。请检查您的网络连接。 更改网络 - Element 尚不支持公开聊天室预览 + ${app_name} 尚不支持公开聊天室预览 私聊消息 新聊天室 公开 @@ -1463,7 +1668,7 @@ 此内容已报告为不合适。 \n \n如果您不希望再看到此用户的更多内容,您可以忽略他们以隐藏他们的消息。 - Element 需要权限在磁盘上保存您的端到端密钥。 + ${app_name} 需要权限在磁盘上保存您的端到端密钥。 \n \n请在下个弹窗中允许访问以便手动导出密钥。 目前没有网络连接 @@ -1509,7 +1714,6 @@ 地址 面向组织的高级托管 输入 Modular Element 或您想使用的服务器地址 - 输入您想要连接的服务器或 Element 的地址 输入您想使用的服务器的地址 载入页面时出错:%1$s (%2$d) 应用无法登录到此家庭服务器。家庭服务器支持以下登录类型:%1$s。 @@ -1616,7 +1820,7 @@ \n再次登入以访问您的帐户数据和消息。 除非您登入以恢复加密密钥,否则您将无法访问安全消息。 清除数据 - 当前会话用于用户 %1$s 而您提供了用户 %2$s 的凭证。Element 不支持此功能。 + 当前会话用于用户 %1$s 而您提供了用户 %2$s 的凭证。${app_name} 不支持此功能。 \n请先清除数据,然后重新登入另一个账户。 您的 matrix.to 链接更是不正确 描述太短 @@ -1634,7 +1838,7 @@ 其他会话 仅显示第一个结果,请输入更多字符… 快速失败 - 发生意外错误时,Element 可能更经常崩溃 + 发生意外错误时,${app_name} 可能更经常崩溃 在明文消息前添加 ¯\\_(ツ)_/¯ 启用加密 一旦启用,加密无法禁用。 @@ -1706,9 +1910,9 @@ %1$s 审查员 %1$s 默认权限 %2$s 自定义权限 (%1$d) - Element 无法处理 \'%1$s\' 类型事件 - Element 无法处理 \'%1$s\' 类型消息 - Element 在渲染 id 为 \'%1$s\' 的事件内容时遇到了一个问题 + ${app_name} 无法处理 \'%1$s\' 类型事件 + ${app_name} 无法处理 \'%1$s\' 类型消息 + ${app_name} 在渲染 id 为 \'%1$s\' 的事件内容时遇到了一个问题 取消忽略 该会话无法与您的其他会话共享此验证。 \n验证将保存在本地,并在此应用的未来版本中共享。 @@ -1798,7 +2002,7 @@ 附加理由 编辑理由 事件被用户删除,理由:%1$s - Element Android + ${app_name} Android 密钥请求 解锁加密消息历史 刷新 @@ -1914,13 +2118,13 @@ 无法添加媒体文件到相册 无法保存媒体文件 选择新的账户密码… - 在你的其他设备上使用最新的Element 网页版、Element 桌面版、Element iOS 版、Element 安卓版,或其他能够交叉签名的 Matrix 客户端 - Element Web -\nElement Desktop - Element iOS -\nElement Android + 在你的其他设备上使用最新的${app_name} 网页版、${app_name} 桌面版、${app_name} iOS 版、${app_name} 安卓版,或其他能够交叉签名的 Matrix 客户端 + ${app_name} Web +\n${app_name} Desktop + ${app_name} iOS +\n${app_name} Android 或其他能够交叉签名的 Matrix 客户端 - 在您的其他设备上使用最新的 Element: + 在您的其他设备上使用最新的 ${app_name}: 强制丢弃加密聊天室中的当前出站群组会话 仅在加密聊天室中支持 使用您的 %1$s 或使用您的 %2$s 继续。 @@ -1952,7 +2156,7 @@ 邀请已发送到 %1$s 邀请已发送到 %1$s 和 %2$s - 邀请已发送到 %1$s 和 %2$s 等 + 邀请已发送到 %1$s 和 %2$d等 我们无法邀请用户,请检查您想要邀请的用户并重试。 当前语言 @@ -1960,11 +2164,11 @@ 正在载入可用语言… 打开 %s 条款 是否从身份服务器 %s 断开? - 身份服务器已过期。Element 仅支持 API V2。 + 身份服务器已过期。${app_name} 仅支持 API V2。 无法执行此操作。家庭服务器已过期。 请先配置身份服务器。 请先在设置中接受身份服务器的条款。 - 为了您的隐私,Element 仅支持发送用户电子邮件和电话号码的哈希值。 + 为了您的隐私,${app_name} 仅支持发送用户电子邮件和电话号码的哈希值。 关联失败。 此标识符无当前关联。 您的家庭服务器 (%1$s) 建议使用 %2$s 作为您的身份服务器 @@ -2006,11 +2210,10 @@ 您无法访问此消息因为您的会话不被发送者信任 您无法访问此消息因为发送者有意不发送密钥 正在等待加密历史 - Riot 现在是 Element! - 我们兴奋地宣布我们改名了!您的应用已经是最新的并且您已登入您的帐户。 - 明白了 - 了解更多 - element + Riot 现在是 Element! + 我们兴奋地宣布我们改名了!您的应用已经是最新的并且您已登入您的帐户。 + 明白了 + 了解更多 将恢复密钥保存到 从我的电话簿添加 您的电话簿是空的 @@ -2075,7 +2278,6 @@ 代码 请使用国际格式(电话号码必须以 ‘+’ 开始) 通过验证此登录确认您的身份,授权它访问加密信息。 - 抱歉,对于连接到单点登录的账户此操作尚不可用。 无法打开您被封禁的聊天室。 无法找到此聊天室。请确认它存在。 您没有权限在此聊天室发起通话 @@ -2092,20 +2294,20 @@ \n \n小心使用,它可能导致意外行为。 链接格式不正确 - 每次打开 Element 都要求 PIN 码。 - 在 2 分钟未使用 Element 后要求 PIN 码。 + 每次打开 ${app_name} 都要求 PIN 码。 + 在 2 分钟未使用 ${app_name} 后要求 PIN 码。 2 分钟后要求 PIN 仅在一个简单通知中显示未读消息内容数量。 显示细节如聊天室名称和消息内容。 在通知中显示内容 - PIN 码是解锁 Element 的唯一方式。 + PIN 码是解锁 ${app_name} 的唯一方式。 启用设备特定的生物特征识别,如指纹和面部识别。 启用生物特征识别 配置保护 使用 PIN 和生物特征识别保护访问。 保护访问 - 显示您现在可以验证的 %d 个设备 + 显示 %d 部设备,这些设备是你现在可以验证的 您将重新启动,没有历史记录,消息,受信任的设备或受信任的用户 如果您重置一切 @@ -2164,4 +2366,109 @@ 发送密钥共享请求历史记录 取消发布 添加 + 设置交叉签名失败 + 发送雪花 ❄️ + 发送撒花 🎉 + 发送带有雪花的给定消息 + 使用 confetti 发送给定消息 + "话题: " + 添加一个话题 + %s 使人们知道此聊天室关于什么。 + 这是您和 %s 的私聊消息历史记录的开始。 + 这是此对话的开始。 + 这是 %s 的开始。 + 导出审计 + 您没有权限在此聊天室启用加密。 + 私聊消息 + 正在创建聊天室… + 一些字符不被允许 + 请提供一个聊天室地址 + 此地址已被使用 + 聊天室地址 + 您可以启用此选项如果此聊天室将仅用于您的主服务器上的内部团队协作。此选项之后无法更改。 + 屏蔽不是 %s 一部分的任何人加入此聊天室 + 隐藏高级 + 显示高级 + 清除历史记录 + 单点登录 + 通过 %s 登录 + 通过 %s 登录 + 以 %s 继续 + + 从低优先级移除 + 添加到低优先级 + %2$d 的 %1$d + 旋转和裁剪 + 添加图像自 + 通过扫描二维码创建新的私聊对话 + 通过 Matrix ID 创建新的私聊对话 + 为发现您已知的现存联系人,您是否接受发送您的联系人数据(电话号码和/或电子邮件)到已配置的身份服务器(%1$s)? +\n +\n为加强隐私,发送的数据将在发送前计算散列值。 + 发送电子邮件和电话号码 + 授予许可 + 撤销我的许可 + 您尚未同意发送电子邮件和电话号码到身份服务器以从您的联系人发现其他用户。 + 您已同意发送电子邮件和电话号码到身份服务器以从您的联系人发现其他用户。 + 发送电子邮件和电话号码 + 建议 + 联系人 + 已知用户 + 最近 + 二维码 + 通过二维码添加 + 通过名称或 ID 搜索 + 聊天室设置 + 主题 + 聊天室话题(可选) + 聊天室名称 + 此聊天室无法预览。您想加入吗? + 此聊天室当前不可访问。请稍候重试,或向聊天室管理员询问以检查您是否拥有访问权限。 + 无法获取当前聊天室目录可见性(%1$s)。 + 是否将此聊天室发布至 %1$s 的聊天室目录中? + 取消发布此地址 + 发布此地址 + 添加本地地址 + 此聊天室没有本地地址 + 为此聊天室设置地址以便用户通过您的主服务器(%1$s)找到此聊天室 + 本地地址 + 新的发布的地址(例如 #alias:server) + 尚无其他已发布地址。 + 还没有别的发布的地址,可在下方添加。 + 是否将此聊天室发布至 %1$s 的聊天室目录中? + 在消息框添加打开表情键盘的按钮 + 显示表情键盘 + 使用 /confetti 命令或发送包含 ❄️ 或 🎉 的消息 + 显示聊天效果 + 更改话题 + 更新聊天室 + 发送 m.room.server_acl 事件 + 更改权限 + 更改聊天室名称 + 更改历史记录可见性 + 启用聊天室加密 + 更改聊天室主地址 + 更改聊天室头像 + 修改小部件 + 通知每个人 + 移除其他人发送的消息 + 封禁用户 + 踢掉用户 + 更改设置 + 邀请用户 + 发送消息 + 默认角色 + 您没有权限更新更改聊天室多个部分所需角色 + 选择更改聊天室各个部分所需的角色 + 权限 + 需要查看和更新角色以更改聊天室多个部分。 + 聊天室权限 + 此聊天室不公开。您没有邀请将无法重新加入。 + 您保持通话 + %s 保持通话 + 保持 + 继续 + 未验证,缺少有效验证凭证 + 返回 + 系统默认 \ No newline at end of file diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index e4368652bf..842700b6eb 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -1,8 +1,260 @@ + %1$s:%2$s + %1$s 傳送了一張圖片。 + %s 的邀請 + %1$s 邀請了 %2$s + %1$s 邀請您 + %1$s 已加入聊天室 + %1$s 已離開聊天室 + %1$s 拒絕邀請 + %1$s 踢出 %2$s + %1$s 解除禁止 %2$s + %1$s 禁止 %2$s + %1$s 收回了對 %2$s 的邀請 + %1$s 變更了他們的大頭貼 + %1$s 設定了他們的顯示名稱為 %2$s + %1$s 變更了他們的顯示名稱從 %2$s 到 %3$s + %1$s 移除了他們的顯示名稱 (%2$s) + %1$s 變更主題為:%2$s + %1$s 變更房間名稱為:%2$s + %s 撥出了視訊通話。 + %s 撥出了語音通話。 + %s 回覆了通話。 + %s 結束通話。 + %1$s 讓房間未來可讓 %2$s 看到歷史紀錄 + 所有的房間成員,從他們被邀請的時間開始。 + 所有的房間成員,從他們加入的時間開始。 + 所有的房間成員。 + 任何人。 + 未知 (%s)。 + %1$s 開啟了端對端加密 (%2$s) + %1$s 請求了 VoIP 會議通話 + VoIP 會議通話已開始 + VoIP 會議通話已結束 + (大頭貼也變更了) + %1$s 移除了房間名稱 + %1$s 移除了房間主題 + %1$s 更新了他們的基本資料 %2$s + %1$s 傳送加入房間的邀請給 %2$s + %1$s 接受 %2$s 的邀請 + ** 無法解密:%s ** + 傳送者的裝置並未在此訊息傳送他們的金鑰。 + 無法編輯 + 無法傳送訊息 + 上傳圖片失敗 + 網路錯誤 + Matrix 錯誤 + 目前無法重新加入空房間。 + 電子郵件 + 電話號碼 + %1$s 傳送了一張貼圖。 + 來自%s 的邀請 + 聊天室邀請 + %1$s 和 %2$s + 空聊天室 + + %1$s 和 和其他 %2$d 個人 + + 訊息已移除 + 訊息已被 %1$s 移除 + 訊息已移除 [理由:%1$s] + 訊息已被 %1$s 移除 [理由:%2$s] + 初始化同步: +\n正在匯入帳號…… + 初始化同步: +\n正在匯入 crypto + 初始化同步: +\n正在匯入聊天室 + 初始化同步: +\n正在匯入已加入的聊天室 + 初始化同步: +\n正在匯入已邀請的聊天室 + 初始化同步: +\n正在匯入已離開的聊天室 + 初始化同步: +\n正在匯入社群 + 初始化同步: +\n正在匯入帳號資料 + %s 已升級此聊天室。 + 正在傳送訊息…… + 清除傳送佇列 + %1$s 撤銷了 %2$s 加入聊天室的邀請 + %1$s 的邀請。理由:%2$s + %1$s 邀請了 %2$s。理由:%3$s + %1$s 邀請了您。理由:%2$s + %1$s 已加入聊天室。理由:%2$s + %1$s 已離開聊天室。理由:%2$s + %1$s 已回絕邀請。理由:%2$s + %1$s 踢走了 %2$s。理由:%3$s + %1$s 取消封鎖了 %2$s。理由:%3$s + %1$s 封鎖了 %2$s。理由:%3$s + %1$s 已傳送邀請給 %2$s 來加入聊天室。理由:%3$s + %1$s 撤銷了 %2$s 加入聊天室的邀請。理由:%3$s + %1$s 接受 %2$s 的邀請。理由:%3$s + %1$s 撤回了對 %2$s 的邀請。理由:%3$s + + %1$s 新增了 %2$s 為此聊天室的地址。 + + + %1$s 移除了此聊天室的 %2$s 地址。 + + %1$s 為此聊天室新增 %2$s 並移除 %3$s 地址。 + %1$s 為此聊天室設定了 %2$s 為主地址。 + %1$s 為此聊天室移除了主要地址。 + %1$s 已允許訪客加入聊天室。 + %1$s 已禁止訪客加入聊天室。 + %1$s 已開啟端到端加密。 + %1$s 已開啟端到端加密(無法識別的演算法 %2$s)。 + %1$s 建立了聊天室 + 您傳送了圖片。 + 您傳送了貼圖。 + 您的邀請 + 您建立了聊天室 + 您邀請了 %1$s + 您加入了聊天室 + 您離開的聊天室 + 您回絕了邀請 + 您踢除了 %1$s + 您取消封鎖了 %1$s + 您封鎖了 %1$s + 您撤銷了 %1$s 的邀請 + 您變更了您的大頭貼 + 您將您的顯示名稱設定為 %1$s + 您將您的顯示名稱從 %1$s 變更為 %2$s + 您移除了您的顯示名稱(其曾為 %1$s) + 您將主題變更為:%1$s + %1$s 變更了聊天室大頭貼 + 您變更了聊天室大頭貼 + 您將聊天室名稱變更為:%1$s + 您發起了視訊通話。 + 您發起了音訊通話。 + %s 傳送了資料以建立通話。 + 您傳送了資料以建立通話。 + 您接了通話。 + 您結束了通話。 + 您已將未來的聊天室歷史設定為對 %1$s 可見 + 您開啟了端到端加密 (%1$s) + 您升級了此聊天室。 + 您請求了 VoIP 會議 + 您移除了聊天室名稱 + 您移除了聊天室主題 + %1$s 移除了聊天室大頭貼 + 您移除了聊天室大頭貼 + 您更新了您的個人檔案 %1$s + 您傳送了邀請給 %1$s 以加入聊天室 + 您已撤銷對 %1$s 加入聊天室的邀請 + 您接受了 %1$s 的邀請 + %1$s 新增了 %2$s 小工具 + 您新增了 %1$s 小工具 + %1$s 移除了 %2$s 小工具 + 您移除了 %1$s 小工具 + %1$s 修改了 %2$s 小工具 + 您修改了 %1$s 小工具 + 管理員 + 板主 + 預設 + 自訂 (%1$d) + 自訂 + 您變更了 %1$s 的權力等級。 + %1$s 變更了 %2$s 的權力等級。 + %1$s 從 %2$s 到 %3$s + 您的邀請。理由:%1$s + 您邀請了 %1$s。理由:%2$s + 您加入了聊天室。理由:%1$s + 您離開了聊天室。理由:%1$s + 您回絕了邀請。理由:%1$s + 您踢除了 %1$s。理由:%2$s + 您取消封鎖了 %1$s。理由:%2$s + 您封鎖了 %1$s。理由:%2$s + 您傳甕了邀請給 %1$s 以加入聊天室。理由:%2$s + 您撤銷了 %1$s 加入聊天室的邀請。理由:%2$s + 您接受了 %1$s 的邀請。理由:%2$s + 您撤回了 %1$s 的邀請。理由:%2$s + + 您為此聊天室新增了 %1$s 作為地址。 + + + 您為此聊天室移除了 %1$s 作為地址。 + + 您為此聊天室新增了 %1$s 並移除了 %2$s 作為地址。 + 您將此聊天室的主要地址設定為 %1$s。 + 您將此聊天室的主要地址移除。 + 您已允許訪客加入聊天室。 + 您已阻止訪客加入聊天室。 + 您開啟了端到端加密。 + 您開啟了端到端加密(無法識別的演算法 %1$s)。 + 您已避免訪客加入此聊天室。 + %1$s 已避免訪客加入此聊天室。 + 您已允許訪客加入這裡。 + %1$s 已允許訪客加入這裡。 + 您已離開。理由:%1$s + %1$s 已離開。理由:%2$s + 您已加入。理由:%1$s + %1$s 已加入。理由:%2$s + 您已撤銷對 %1$s 的邀請 + %1$s 已撤銷對 %2$s 的邀請 + 您已邀請了 %1$s + %1$s 邀請了 %2$s + 您已在此升級。 + %s 已在此升級。 + 您讓未來的訊息對 %1$s 可見 + %1$s 已讓未來的訊息對 %2$s 可見 + 您已離開聊天室 + %1$s 已離開聊天室 + 您已加入 + %1$s 已加入 + 您已建立此討論 + %1$s 已建立此討論 + 空的聊天室(曾為 %s) + + %1$s, %2$s, %3$s 與 %4$d 個其他 + + %1$s, %2$s, %3$s 與 %4$s + %1$s, %2$s 與 %3$s + 🎉 禁止所有伺服器參與!無法再使用此聊天室。 + 無變更。 + • 禁止伺服器符合 IP 文字。 + • 允許伺服器符合 IP 文字。 + • 伺服器符合 %s 已從允許清單中移除。 + • 允許伺服器符合 %s。 + • 伺服器符合 %s 已從禁止清單中移除。 + • 現在禁止伺服器符合 %s。 + 您為此聊天室變更了伺服器 ACL。 + %s 為此聊天是變更了伺服器 ACL。 + • 禁止伺服器符合 IP 文字。 + • 允許伺服器符合 IP 文字。 + • 已允許伺服器符合 %s。 + • 已禁止伺服器符合 %s。 + 您為此聊天是設定了伺服器 ACL。 + %s 為此聊天是設定了伺服器 ACL。 + 您變更了此聊天室的地址。 + %1$s 變更了此聊天室的地址。 + 您為此聊天室變更了主要及備用地址。 + %1$s 為此聊天室變更了主要及備用地址。 + 您為此聊天室變更了備用地址。 + %1$s 變更了此聊天室的備用地址。 + + 您為此聊天室移除了備用地址 %1$s。 + + + %1$s 已為此聊天室移除備用地址 %2$s。 + + + 您為此聊天室新增了備用地址 %1$s。 + + + %1$s 已為此聊天室新增了備用地址 %2$s。 + + 您修改了視訊會議 + %1$s 修改了視訊會議 + 您結束了視訊會議 + %1$s 結束了視訊會議 + 您開始了視訊會議 + 由 %1$s 開始的視訊會議 淺色主題 深色主題 - 黑色主題 + 黑色主題 正在同步…… 聆聽事件 接受 @@ -82,7 +334,7 @@ 使用者目錄 僅 Matrix 聯絡人 沒有對話 - 您沒有允許 Element 存取裝置上的聯絡資訊 + 您沒有允許 ${app_name} 存取裝置上的聯絡資訊 沒有結果 聊天室 聊天室目錄 @@ -219,22 +471,22 @@ 拍照或錄影 無法錄影 資訊 - Element 需要權限來存取你的照片與影片庫,以傳送及儲存附件。 + ${app_name} 需要權限來存取你的照片與影片庫,以傳送及儲存附件。 \n \n請在下個彈跳視窗允許存取,來從手機傳送檔案。 - Element 需要權限存取您的相機,來拍照與視訊通話。 + ${app_name} 需要權限存取您的相機,來拍照與視訊通話。 " \n \n為了要通話,請在下個彈跳視窗中允許存取。" - Element 需要權限來存取麥克風,來撥打語音通話。 + ${app_name} 需要權限來存取麥克風,來撥打語音通話。 " \n \n為了要通話,請在下個彈跳視窗中允許存取。" - Element 需要權限來存取相機及麥克風來撥打視訊通話。 + ${app_name} 需要權限來存取相機及麥克風來撥打視訊通話。 \n \n為了可以正常使用通話功能,請在下個彈跳視窗中允許存取。 - Element 可以檢查您的電話簿並以電子郵件與電話號碼為基礎來尋找其他 Matrix 使用者。如果您同意為此用途分享您的電話簿,請在下一個彈出式視窗中允許存取權限。 - Element 可以檢查您的電話簿並以電子郵件與電話號碼為基礎來尋找其他 Matrix 使用者。 + ${app_name} 可以檢查您的電話簿並以電子郵件與電話號碼為基礎來尋找其他 Matrix 使用者。如果您同意為此用途分享您的電話簿,請在下一個彈出式視窗中允許存取權限。 + ${app_name} 可以檢查您的電話簿並以電子郵件與電話號碼為基礎來尋找其他 Matrix 使用者。 \n \n您同意為此用途分享您的電話簿嗎? 抱歉。由於缺少權限,所以無法執行動作 @@ -346,7 +598,7 @@ 從其他工作階段重新請求金鑰。重新請求金鑰 已發送金鑰分享請求。 已發送請求 - 請在另一個可以解密訊息的裝置上啟動 Element,以便它將金鑰發送到此工作階段。 + 請在另一個可以解密訊息的裝置上啟動 ${app_name},以便它將金鑰發送到此工作階段。 憑證已從以前受信任的更改為不受信任的憑證。伺服器可能已續訂其憑證。請與伺服器管理員聯繫以尋找所需的指紋。 僅當伺服器管理員發佈的指紋與上面的指紋匹配時才接受此憑證。 聊天室詳情 @@ -385,7 +637,7 @@ %d 個聊天室 - 有 %1$d 個聊天室匹配 “%2$s” + %2$s 找到 %1$s 個聊天室 正在搜尋目錄…… 所有訊息(通知並震動) @@ -468,13 +720,13 @@ 停用帳號 停用我的帳號 通知隱私 - Element 可以在後臺安全隱密地管理通知。這可能會影響電池的使用。 + ${app_name} 可以在後臺安全隱密地管理通知。這可能會影響電池的使用。 獲取權限 選擇其他選項 傳送分析資料 傳送分析資料 - Element 會收集匿名分析以讓我們可以改進此應用程式。 - 請允許收集匿名分析以讓我們可以改進此應用程式。 + ${app_name} 會收集匿名分析以讓我們可以改進此應用程式。 + 請允許收集匿名分析以讓我們可以改進此應用程式。 是的,我想要協助! 節省流量模式 工作階段資訊 @@ -789,7 +1041,6 @@ 透過僅載入在第一次看到的地方的聊天室成員來增進效能。 您的家伺服器尚不支援延遲載入聊天室成員。請稍後再試。 抱歉,遇到錯誤 - Status.im 主題 版本 %s 請建立密語以加密您匯出的金鑰。您將需要輸入這些密語以匯入金鑰。 建立密語 @@ -825,7 +1076,7 @@ +%d %d+ 通話 - 為來電使用預設的 Element 鈴聲 + 為來電使用預設的 ${app_name} 鈴聲 來電鈴聲 選取通話鈴聲: 接受 @@ -849,12 +1100,12 @@ 啟用 工作階段設定。 通知已為此工作階段啟用。 - 此工作階段未啟用通知。 -\n請檢查 Element 設定。 + 此工作階段未啟用通知。 +\n請檢查 ${app_name} 設定。 啟用 Play 服務檢查 Google Play 服務 APK 可用且已為最新。 - Element 使用 Google Play 服務來傳遞推送訊息,但它似乎並未正確設定: + ${app_name} 使用 Google Play 服務來傳遞推送訊息,但它似乎並未正確設定: \n%1$s 修復 Play 服務 Firebase 權杖 @@ -876,22 +1127,22 @@ 服務重新啟動失敗 開機時啟動 服務將會在裝置重新啟動時自行啟動。 - 服務不會在裝置重心啟動時自行啟動,您將不能在 Element 開啟前收到通知。 + 服務不會在裝置重心啟動時自行啟動,您將不能在 ${app_name} 開啟前收到通知。 啟用開機時啟動 檢查背景限制 - 背景限制已為 Element 停用。本測試應該使用行動數據執行(不是 WiFi)。 + 背景限制已為 ${app_name} 停用。本測試應該使用行動數據執行(不是 WiFi)。 \n%1$s - 背景限制已為 Element 啟用。 + 背景限制已為 ${app_name} 啟用。 \n應用程式要在背景執行的工作將被嚴格限制,這可能會影響通知功能。 \n %1$s 停用限制 電池最佳化 - Element 不會被電池最佳化影響。 + ${app_name} 不會被電池最佳化影響。 如果使用者不為裝置充電,並讓其靜置一段時間,且將螢幕關閉,裝置將會進入 Doze 模式。這可能會導致應用程式無法存取網路,並延遲它們的工作、同步與標準警報。 忽略最佳化 背景連線 - Element 需要保持最低影響的背景連線以接收可靠的通知。 -\n在下一個畫面,您必須允許 Element 總是在背景執行,請接受。 + ${app_name} 需要保持最低影響的背景連線以接收可靠的通知。 +\n在下一個畫面,您必須允許 ${app_name} 總是在背景執行,請接受。 授予權限 當驗證您的電子郵件地址時遇到錯誤。 當驗證您的手機號碼時遇到錯誤。 @@ -910,12 +1161,12 @@ 有一些通知在您的自訂設定中被停用了。 載入自訂規則失敗,請重試。 檢查設定 - [%1$s] -\n這個錯誤並非 Element 所能控制,而是與 Google 有關,這個錯誤代表裝置註冊了太多使用 FCM 的應用程式。這個錯誤只會發生在有超大量的應用程式的裝置上,所以不應該影響一般的使用者。 - [%1$s] -\n這個錯誤並非 Element 所能控制。可能由多種原因所導致。也可能會在稍後重試時就可以運作,您也可以檢查 Google Play 服務在系統設定中有沒有被限制使用資料,或是您裝置的時鐘是否正確,或是也可能會在自訂的 ROM 上發生。 - [%1$s] -\n這個錯誤並非 Element 所能控制。手機上沒有 Google 帳號。請開啟帳號管理員並新增一個 Google 帳號。 + [%1$s] +\n這個錯誤並非 ${app_name} 所能控制,而是與 Google 有關,這個錯誤代表裝置註冊了太多使用 FCM 的應用程式。這個錯誤只會發生在有超大量的應用程式的裝置上,所以不應該影響一般的使用者。 + [%1$s] +\n這個錯誤並非 ${app_name} 所能控制。可能由多種原因所導致。也可能會在稍後重試時就可以運作,您也可以檢查 Google Play 服務在系統設定中有沒有被限制使用資料,或是您裝置的時鐘是否正確,或是也可能會在自訂的 ROM 上發生。 + [%1$s] +\n這個錯誤並非 ${app_name} 所能控制。手機上沒有 Google 帳號。請開啟帳號管理員並新增一個 Google 帳號。 新增帳號 設定吵鬧的通知 設定通話通知 @@ -926,7 +1177,7 @@ 安靜 請輸入通關密語 通關密語太弱了 - 如果您想要讓 Element 生成復原金鑰的話,請刪除通關密語。 + 如果您想要讓 ${app_name} 生成復原金鑰的話,請刪除通關密語。 沒有可用的 Matrix 工作階段 永不遺失已加密的訊息 在加密聊天室裡的訊息是使用端到端加密。只有您和接收者有金鑰可以閱讀這些訊息。 @@ -1053,7 +1304,7 @@ 密碼不符合 無效的家伺服器探索回應 自動完成伺服器選項 - Element 偵測到您的 userId 網域「%1$s」有自訂的伺服器設定: + ${app_name} 偵測到您的 userId 網域「%1$s」有自訂的伺服器設定: \n%2$s 使用設定 正在初始化服務 @@ -1166,7 +1417,7 @@ 請稍候…… 所有社群 無法預覽此聊天室 - Element 尚不支援預覽所有人皆可讀的聊天室 + ${app_name} 尚不支援預覽所有人皆可讀的聊天室 聊天室 直接訊息 新聊天室 @@ -1261,11 +1512,11 @@ 在您的設定中新增一臺身份識別伺服器以執行此動作。 背景同步模式 為電池最佳化 - Element 將會在背景同步以節省裝置的有限資源(電池)。 + ${app_name} 將會在背景同步以節省裝置的有限資源(電池)。 \n取決於您裝置的資源狀態,作業系統可能會延遲同步。 為即時作業最佳化 - Element 將會精準地定期在背景同步(可設定)。 -\n這會影響到網路與電池的使用,並會顯示指出 Element 正在監聽某事件的永久通知。 + ${app_name} 將會精準地定期在背景同步(可設定)。 +\n這會影響到網路與電池的使用,並會顯示指出 ${app_name} 正在監聽某事件的永久通知。 無背景同步 當應用程式在背景時,您將不會收到訊息通知。 更新設定失敗。 @@ -1348,12 +1599,12 @@ 此內容已被回報為不合適。 \n \n如果您不想要看到從此使用者而來的更多內容,您可以忽略他們以隱藏他們的訊息。 - Element 需要權限以在磁碟上儲存您的 E2E 金鑰。 + ${app_name} 需要權限以在磁碟上儲存您的 E2E 金鑰。 \n \n請在下個彈出視窗中允許存取以讓您可以手動匯出您的金鑰。 目前沒有網路連線 確認您的密碼 - 您無法在行動裝置上的 Element 做這件事 + 您無法在行動裝置上的 ${app_name} 做這件事 需要驗證 整合 使用整合管理員以管理機器人、橋接、小工具與貼紙包。 @@ -1422,7 +1673,6 @@ 位置 組織有專業主機 輸入 Modular Element 或您想要使用的伺服器位置 - 輸入您想要連線的伺服器或 Element 的位置 載入頁面時發生錯誤:%1$s (%2$d) 應用程式無法登入此家伺服器。家伺服器支援以下登入類型:%1$s。 \n @@ -1520,7 +1770,7 @@ \n再次登入以存取您的帳號資料與訊息。 除非您登入以復原您的加密金鑰,否則您將會失去對安全訊息的存取權。 清除資料 - 使用者 %1$s 目前的工作階段與您提供的使用者 %2$s 憑證。Element 並不支援。 + 使用者 %1$s 目前的工作階段與您提供的使用者 %2$s 憑證。${app_name} 並不支援。 \n請先清除您的資料,然後再以其他帳號登入。 您的 matrix.to 連結格式錯誤 描述太短了 @@ -1538,7 +1788,7 @@ 其他工作階段 僅顯示第一個結果,輸入更多字母…… 快速失敗 - 在發生非預期的錯誤時,Element 可能更常當機 + 在發生非預期的錯誤時,${app_name} 可能更常當機 將 ¯\\_(ツ)_/¯ 附加到純文字訊息中 啟用加密 加密一旦啟用就無法停用。 @@ -1608,9 +1858,9 @@ %1$s 中的板主 %2$s 中的自訂 (%1$d) 跳至讀取回條 - Element 無法處理類型為「%1$s」的事件 - Element 無法處理類型為「%1$s」的訊息 - 在彩現 id「%1$s」事件的內容時,Element 遇到問題 + ${app_name} 無法處理類型為「%1$s」的事件 + ${app_name} 無法處理類型為「%1$s」的訊息 + 在彩現 id「%1$s」事件的內容時,${app_name} 遇到問題 取消忽略 此工作階段無法與您其他的工作階段分享此驗證。 \n驗證將會儲存在本機並在未來版本的應用程式中共享。 @@ -1701,7 +1951,7 @@ 被使用者刪除的活動,理由:%1$s 由聊天室管理員管理的活動,理由:%1$s 金鑰已為最新! - Element Android + ${app_name} Android 金鑰請求 解鎖已加密的訊息歷史 重新整理 @@ -1802,13 +2052,13 @@ 媒體檔案已新增至媒體庫中 無法新增媒體檔案到媒體庫中 設定新的帳號密碼…… - 在您的其他裝置上使用最新的 Element、Element Web、Element 桌面版、Element iOS、Element for Android 或其他有交叉簽章功能的 Matrix 客戶端 - Element Web -\nElement 桌面版 - Element iOS -\nElement Android + 在您的其他裝置上使用最新的 ${app_name}、${app_name} Web、${app_name} 桌面版、${app_name} iOS、${app_name} for Android 或其他有交叉簽章功能的 Matrix 客戶端 + ${app_name} Web +\n${app_name} 桌面版 + ${app_name} iOS +\n${app_name} Android 或其他有交叉簽章功能的 Matrix 客戶端 - 在您的其他裝置上使用最新的 Element: + 在您的其他裝置上使用最新的 ${app_name}: 強制丟棄目前在加密聊天室中的外發群組工作階段 僅在加密聊天室中支援 使用您的 %1$s 或使用您的 %2$s 以繼續。 @@ -1868,11 +2118,11 @@ 正在載入可用的語言…… 開啟 %s 的條款 從身份識別伺服器 %s 斷線? - 此身份識別伺服器太舊了。Element 僅支援 API V2。 + 此身份識別伺服器太舊了。${app_name} 僅支援 API V2。 此動作是不可能的。家伺服器太舊了。 請先設定身份識別伺服器。 請先在設定中同意身份識別伺服器的條款。 - 為了保護您的隱私,Element 僅支援傳送雜湊過的使用者電子郵件與電話號碼。 + 為了保護您的隱私,${app_name} 僅支援傳送雜湊過的使用者電子郵件與電話號碼。 關聯失敗。 目前沒有此識別符的關聯。 您的家伺服器 (%1$s) 建議將 %2$s 用於您的身份識別伺服器 @@ -1886,7 +2136,7 @@ 複製 成功 通知 - Element 呼叫失敗 + ${app_name} 呼叫失敗 建立即時連線失敗。 \n請要求您家伺服器的管理員設定 TURN 伺服器以讓通話的運作更可靠。 選取音效裝置 @@ -1998,11 +2248,10 @@ 您無法存取此訊息,因為您的工作階段未被傳送者所信任 您無法存取此訊息,因為傳送者刻意未傳送金鑰 正在等待加密歷史 - Riot 現在是 Element 了! - 我們很高興地我們已變更名稱!您的應用程式是最新的,而您也登入了您的帳號。 - 知道了 - 取得更多資訊 - element + Riot 現在是 Element 了! + 我們很高興地我們已變更名稱!您的應用程式是最新的,而您也登入了您的帳號。 + 知道了 + 取得更多資訊 儲存復原金鑰於 從我的電話簿新增 您的電話簿是空的 @@ -2067,7 +2316,6 @@ 代碼 請使用國際格式(電話號碼必須以 \'+\' 開頭) 透過確認此登入來驗證您的身份,以及授予存取加密訊息的權限。 - 抱歉,對於使用單一登入的帳號,還無法執行此動作。 無法開啟禁止您進入的聊天室。 找不到此聊天室。請確定它存在。 @@ -2084,19 +2332,19 @@ 刪除類型為 %1$s 的帳號資料? \n \n小心使用,它可能會導致意料之外的行為。 - 每次打開 Element 時都需要 PIN 碼。 - 未使用 Element 2分鐘後,要求輸入 PIN 碼。 + 每次打開 ${app_name} 時都需要 PIN 碼。 + 未使用 ${app_name} 2分鐘後,要求輸入 PIN 碼。 2分鐘後要求輸入 PIN 碼 在簡易通知中僅顯示未讀訊息數量。 顯示如聊天是名稱與訊息內容等詳細資訊。 在通知中顯示內容 - PIN 碼是解鎖 Element 的唯一方式。 + PIN 碼是解鎖 ${app_name} 的唯一方式。 啟用特定裝置的生物識別技術,如指紋與臉部辨識。 設定保護 使用 PIN 碼與生物識別技術來保護存取權。 保護存取權 - 顯示您現在可以驗證的 %s 個裝置 + 顯示您現在可以驗證的 %d 個裝置 您將會重新啟動,沒有歷史紀錄,已信任的裝置或已信任的使用者 如果您重設了所有東西 @@ -2105,7 +2353,7 @@ 忘記或遺失所有復原選項?重設所有東西 您已加入。 %s 已加入。 - 此聊天適中的訊息有端到端加密。 + 此聊天室中的訊息有端到端加密。 離開 設定 這裡的訊息有端到端加密。 @@ -2115,7 +2363,7 @@ 此家伺服器正在執行較舊的版本。請要求您的家伺服器管理原升級。您可以繼續,但某些功能可能無法正常運作。 您讓此變為僅邀請。 %1$s 讓此變為僅邀請。 - 在已加密的聊天適中顯示完整歷史紀錄 + 在已加密的聊天室中顯示完整歷史紀錄 %1$s 與 %2$s %1$s 在 %2$s 與 %3$s @@ -2163,8 +2411,8 @@ 分享我的條碼 掃描 QR code 不是有效的 Matrix QR code - 🔐️ 在 Element 上加入我 - 嗨,和我在 Element 上聊天吧:%s + 🔐️ 在 ${app_name} 上加入我 + 嗨,和我在 ${app_name} 上聊天吧:%s 邀請朋友 "主題: " 新增夥伴 @@ -2278,8 +2526,88 @@ 在訊息編輯器上新增按鈕以開啟表情符號鍵盤 顯示表情符號鍵盤 驗證失敗 - Element 需要您輸入您的憑證來執行此動作。 + ${app_name} 需要您輸入您的憑證來執行此動作。 需要重新驗證 未能設定交叉簽章 未授權,缺少有效的身份驗證憑證 + 使用者 + 轉移電話時發生錯誤 + 轉移 + 連線 + 先諮詢 + + 1 個通話中 (%1$s) · %2$d 暫停的通話 + + + %1$d 暫停了通話 + + 通話中 (%1$s) + 查詢電話號碼時發生錯誤 + 撥號鍵盤 + 回撥 + 此通話已結束 + %1$s 婉拒了此通話 + 您婉拒了此通話 %1$s + 您目前在此通話中 + %1$s 開始了通話 + 您開始了通話 + 您保留了通話 + %s 保留了通話 + 保留 + 恢復 + 返回 + 活動內容 + 狀態活動已傳送! + 活動已傳送! + 活動格式錯誤 + 訊息內容遺失 + 無內容 + 活動內容 + 狀態金鑰 + 類型 + 傳送自訂狀態活動 + 編輯內容 + 狀態活動 + 傳送狀態活動 + 傳送自訂活動 + 探索聊天室狀態 + 開發工具 + 檢視讀取回條 + 不通知 + 有聲通知 + 無聲通知 + 由於錯誤而未傳送訊息 + 已檢查 + 關閉表情符號挑選程式 + 開啟表情符號挑選程式 + 可信任的信任等級 + 警告信任等級 + 預設信任等級 + 已選取 + 視訊 + 此聊天室有未傳送的草稿 + 部份訊息未傳送 + 刪除大頭照 + 變更大頭照 + 圖片 + 從檔案匯入金鑰 + 開啟小工具 + 螢幕截圖 + + %d 項目 + + 限制未知。 + 您的家伺服器接受大小最大為 %s 的附件(檔案、媒體等)。 + 伺服器檔案上傳限制 + 伺服器版本 + 伺服器名稱 + 聊天室設定 + 離開目前的會議並切換其他的? + 聊天室版本 + 新值 + 切換 + 初始同步: +\n正在下載資料…… + 初始同步: +\n正在等待伺服器回應…… \ No newline at end of file diff --git a/vector/src/main/res/values/array.xml b/vector/src/main/res/values/array.xml index c2cd0b4cc5..26f7a39bf1 100644 --- a/vector/src/main/res/values/array.xml +++ b/vector/src/main/res/values/array.xml @@ -40,7 +40,7 @@ @string/system_theme @string/light_theme @string/dark_theme - @string/black_them + @string/black_theme diff --git a/vector/src/main/res/values/attrs.xml b/vector/src/main/res/values/attrs.xml index 0b9852634d..ecc64bf07d 100644 --- a/vector/src/main/res/values/attrs.xml +++ b/vector/src/main/res/values/attrs.xml @@ -6,9 +6,6 @@ - - - @@ -19,19 +16,11 @@ - - - - - - - - diff --git a/vector/src/main/res/values/values.xml b/vector/src/main/res/values/attrs_reaction_button.xml similarity index 100% rename from vector/src/main/res/values/values.xml rename to vector/src/main/res/values/attrs_reaction_button.xml diff --git a/vector/src/main/res/values/colors.xml b/vector/src/main/res/values/colors.xml index e4cfa18461..7561e6f843 100644 --- a/vector/src/main/res/values/colors.xml +++ b/vector/src/main/res/values/colors.xml @@ -131,7 +131,6 @@ #FFFF4B55 #FF61708B #1E61708B - #FF368BD6 #FF03B381 #FF368bd6 @@ -156,16 +155,15 @@ 'riotx__' --> - #FFFFFFFF #FF15191E #FF000000 - - #FFF5F7FA - #FF22282F - #FF000000 + + #FFF5F7FA + #FF22282F + #FF000000 @@ -173,21 +171,6 @@ #FF282C35 #FF282C35 - - #FFFFFFFF - #FFEDF3FF - #FFEDF3FF - - - #FFFFFFFF - #FFEDF3FF - #FFEDF3FF - - - #FFFFFFFF - #FF181B21 - #FF181B21 - #FFF3F8FD #FF22262E @@ -198,11 +181,6 @@ #FF181B21 #FF0D0F12 - - #FF171910 - #FFFFFFFF - #FFFFFFFF - #8F97A3 #FFA9B2BC @@ -235,47 +213,17 @@ #FF8F97A3 #FFA9B2BC - - #FF8F97A3 - #FFA9B2BC - #FFA9B2BC - - - #FFF6F7F8 - #FF343446 - #FF343446 - #FF2E3648 #FF2E3648 #FF2E3648 - - #FF2E3648 - #FF0D0E10 - #FF0D0E10 - - - #FFEEEFEF - #FF61708B - #FF61708B - #FF61708B #FF61708B #FF61708B - - @color/white - #FF181B21 - #FF181B21 - - - @color/black - @color/white - @color/white - @color/white #FF181B21 diff --git a/vector/src/main/res/values/dimens.xml b/vector/src/main/res/values/dimens.xml index 06ca39950c..88338f799b 100644 --- a/vector/src/main/res/values/dimens.xml +++ b/vector/src/main/res/values/dimens.xml @@ -13,6 +13,7 @@ 196dp 44dp 72dp + 16dp 40dp 60dp diff --git a/vector/src/main/res/values/donottranslate.xml b/vector/src/main/res/values/donottranslate.xml index ccafa41c9b..d22391ed8c 100755 --- a/vector/src/main/res/values/donottranslate.xml +++ b/vector/src/main/res/values/donottranslate.xml @@ -12,6 +12,6 @@ # - Not implemented yet in Element + Not implemented yet in ${app_name} diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 79f1514b2a..36ee7898e5 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -1,12 +1,320 @@ + %1$s: %2$s + %1$s sent an image. + You sent an image. + %1$s sent a sticker. + You sent a sticker. + + %s\'s invitation + Your invitation + %1$s created the room + You created the room + %1$s created the discussion + You created the discussion + %1$s invited %2$s + You invited %1$s + %1$s invited you + %1$s joined the room + You joined the room + %1$s joined + You joined + %1$s left the room + You left the room + %1$s left the room + You left the room + %1$s rejected the invitation + You rejected the invitation + %1$s kicked %2$s + You kicked %1$s + %1$s unbanned %2$s + You unbanned %1$s + %1$s banned %2$s + You banned %1$s + %1$s withdrew %2$s\'s invitation + You withdrew %1$s\'s invitation + %1$s changed their avatar + You changed your avatar + %1$s set their display name to %2$s + You set your display name to %1$s + %1$s changed their display name from %2$s to %3$s + You changed your display name from %1$s to %2$s + %1$s removed their display name (it was %2$s) + You removed your display name (it was %1$s) + %1$s changed the topic to: %2$s + You changed the topic to: %1$s + %1$s changed the room avatar + You changed the room avatar + %1$s changed the room name to: %2$s + You changed the room name to: %1$s + %s placed a video call. + You placed a video call. + %s placed a voice call. + You placed a voice call. + %s sent data to setup the call. + You sent data to setup the call. + %s answered the call. + You answered the call. + %s ended the call. + You ended the call. + %1$s made future room history visible to %2$s + You made future room history visible to %1$s + %1$s made future messages visible to %2$s + You made future messages visible to %1$s + all room members, from the point they are invited. + all room members, from the point they joined. + all room members. + anyone. + unknown (%s). + %1$s turned on end-to-end encryption (%2$s) + You turned on end-to-end encryption (%1$s) + %s upgraded this room. + You upgraded this room. + %s upgraded here. + You upgraded here. + %s set the server ACLs for this room. + You set the server ACLs for this room. + • Server matching %s are banned. + • Server matching %s are allowed. + • Server matching IP literals are allowed. + • Server matching IP literals are banned. + + %s changed the server ACLs for this room. + You changed the server ACLs for this room. + • Server matching %s are now banned. + • Server matching %s were removed from the ban list. + • Server matching %s are now allowed. + • Server matching %s were removed from the allowed list. + • Server matching IP literals are now allowed. + • Server matching IP literals are now banned. + No change. + 🎉 All servers are banned from participating! This room can no longer be used. + + %1$s requested a VoIP conference + You requested a VoIP conference + VoIP conference started + VoIP conference finished + + (avatar was changed too) + %1$s removed the room name + You removed the room name + %1$s removed the room topic + You removed the room topic + %1$s removed the room avatar + You removed the room avatar + Message removed + Message removed by %1$s + Message removed [reason: %1$s] + Message removed by %1$s [reason: %2$s] + %1$s updated their profile %2$s + You updated your profile %1$s + %1$s sent an invitation to %2$s to join the room + You sent an invitation to %1$s to join the room + %1$s invited %2$s + You invited %1$s + %1$s revoked the invitation for %2$s to join the room + You revoked the invitation for %1$s to join the room + %1$s revoked the invitation for %2$s + You revoked the invitation for %1$s + %1$s accepted the invitation for %2$s + You accepted the invitation for %1$s + + %1$s added %2$s widget + You added %1$s widget + %1$s removed %2$s widget + You removed %1$s widget + %1$s modified %2$s widget + You modified %1$s widget + + Video conference started by %1$s + You started video conference + Video conference ended by %1$s + You ended video conference + Video conference modified by %1$s + You modified video conference + + Admin + Moderator + Default + Custom (%1$d) + Custom + + + You changed the power level of %1$s. + + %1$s changed the power level of %2$s. + + %1$s from %2$s to %3$s + + ** Unable to decrypt: %s ** + The sender\'s device has not sent us the keys for this message. + + + + + Could not redact + Unable to send message + + Failed to upload image + + + Network error + Matrix error + + + + + + + + + It is not currently possible to re-join an empty room. + + + Email address + Phone number + + + Invite from %s + Room Invite + + + %1$s and %2$s + + %1$s, %2$s and %3$s + + %1$s, %2$s, %3$s and %4$s + + + %1$s, %2$s, %3$s and %4$d other + %1$s, %2$s, %3$s and %4$d others + + + %1$s and 1 other + %1$s and %2$d others + + + Empty room + Empty room (was %s) + + Initial Sync:\nWaiting for server response… + Initial Sync:\nDownloading data… + Initial Sync:\nImporting account… + Initial Sync:\nImporting crypto + Initial Sync:\nImporting Rooms + Initial Sync:\nImporting Joined Rooms + Initial Sync:\nImporting Invited Rooms + Initial Sync:\nImporting Left Rooms + Initial Sync:\nImporting Communities + Initial Sync:\nImporting Account Data + + Sending message… + Clear sending queue + + %1$s\'s invitation. Reason: %2$s + Your invitation. Reason: %1$s + %1$s invited %2$s. Reason: %3$s + You invited %1$s. Reason: %2$s + %1$s invited you. Reason: %2$s + %1$s joined the room. Reason: %2$s + You joined the room. Reason: %1$s + %1$s joined. Reason: %2$s + You joined. Reason: %1$s + %1$s left the room. Reason: %2$s + You left the room. Reason: %1$s + %1$s left. Reason: %2$s + You left. Reason: %1$s + %1$s rejected the invitation. Reason: %2$s + You rejected the invitation. Reason: %1$s + %1$s kicked %2$s. Reason: %3$s + You kicked %1$s. Reason: %2$s + %1$s unbanned %2$s. Reason: %3$s + You unbanned %1$s. Reason: %2$s + %1$s banned %2$s. Reason: %3$s + You banned %1$s. Reason: %2$s + %1$s sent an invitation to %2$s to join the room. Reason: %3$s + You sent an invitation to %1$s to join the room. Reason: %2$s + %1$s revoked the invitation for %2$s to join the room. Reason: %3$s + You revoked the invitation for %1$s to join the room. Reason: %2$s + %1$s accepted the invitation for %2$s. Reason: %3$s + You accepted the invitation for %1$s. Reason: %2$s + %1$s withdrew %2$s\'s invitation. Reason: %3$s + You withdrew %1$s\'s invitation. Reason: %2$s + + + %1$s added %2$s as an address for this room. + %1$s added %2$s as addresses for this room. + + + + You added %1$s as an address for this room. + You added %1$s as addresses for this room. + + + + %1$s removed %2$s as an address for this room. + %1$s removed %2$s as addresses for this room. + + + + You removed %1$s as an address for this room. + You removed %1$s as addresses for this room. + + + %1$s added %2$s and removed %3$s as addresses for this room. + You added %1$s and removed %2$s as addresses for this room. + + "%1$s set the main address for this room to %2$s." + "You set the main address for this room to %1$s." + "%1$s removed the main address for this room." + "You removed the main address for this room." + + + %1$s added the alternative address %2$s for this room. + %1$s added the alternative addresses %2$s for this room. + + + + You added the alternative address %1$s for this room. + You added the alternative addresses %1$s for this room. + + + + %1$s removed the alternative address %2$s for this room. + %1$s removed the alternative addresses %2$s for this room. + + + + You removed the alternative address %1$s for this room. + You removed the alternative addresses %1$s for this room. + + + %1$s changed the alternative addresses for this room. + You changed the alternative addresses for this room. + %1$s changed the main and alternative addresses for this room. + You changed the main and alternative addresses for this room. + %1$s changed the addresses for this room. + You changed the addresses for this room. + + "%1$s has allowed guests to join the room." + "You have allowed guests to join the room." + "%1$s has allowed guests to join here." + "You have allowed guests to join here." + "%1$s has prevented guests from joining the room." + "You have prevented guests from joining the room." + "%1$s has prevented guests from joining the room." + "You have prevented guests from joining the room." + + %1$s turned on end-to-end encryption. + You turned on end-to-end encryption. + %1$s turned on end-to-end encryption (unrecognised algorithm %2$s). + You turned on end-to-end encryption (unrecognised algorithm %1$s). System Default Light Theme Dark Theme - Black Theme - Status.im Theme + Black Theme Initializing service @@ -133,6 +441,7 @@ Close Copy Add + Switch Unpublish Copied to clipboard Disable @@ -172,7 +481,8 @@ User directory Matrix contacts only No conversations - You didn’t allow Element to access your local contacts + + You didn’t allow ${app_name} to access your local contacts No results No more results No identity server configured. @@ -187,6 +497,10 @@ %d users + Room directory + Show rooms with explicit content + Show all rooms in the room directory, including rooms with explicit content. + Invite Communities @@ -235,7 +549,8 @@ Try using %s Do not ask me again - Element Call Failed + + ${app_name} Call Failed Failed to establish real time connection.\nPlease ask the administrator of your homeserver to configure a TURN server in order for calls to work reliably. Select Sound Device @@ -344,7 +659,8 @@ Key request sent. Request sent - Please launch Element on another device that can decrypt the message so it can send the keys to this session. + + Please launch ${app_name} on another device that can decrypt the message so it can send the keys to this session. Read Receipts List @@ -385,7 +701,8 @@ Calls Prevent accidental call Ask for confirmation before starting a call - Use default Element ringtone for incoming calls + + Use default ${app_name} ringtone for incoming calls Allow fallback call assist server Will use "%s" as assist when your home server does not offer one (your IP address will be shared during a call) Incoming call ringtone @@ -420,14 +737,20 @@ Information - Element needs permission to access your photo and video library to send and save attachments.\n\nPlease allow access on the next pop-up to be able to send files from your phone. - Element needs permission to access your camera to take pictures and video calls. + + ${app_name} needs permission to access your photo and video library to send and save attachments.\n\nPlease allow access on the next pop-up to be able to send files from your phone. + + ${app_name} needs permission to access your camera to take pictures and video calls. \n\nPlease allow access on the next pop-up to be able to make the call. - Element needs permission to access your microphone to perform audio calls. + + ${app_name} needs permission to access your microphone to perform audio calls. \n\nPlease allow access on the next pop-up to be able to make the call. - Element needs permission to access your camera and your microphone to perform video calls.\n\nPlease allow access on the next pop-ups to be able to make the call. - Element can check your address book to find other Matrix users based on their email and phone numbers. If you agree to share your address book for this purpose, please allow access on the next pop-up. - Element can check your address book to find other Matrix users based on their email and phone numbers.\n\nDo you agree to share your address book for this purpose? + + ${app_name} needs permission to access your camera and your microphone to perform video calls.\n\nPlease allow access on the next pop-ups to be able to make the call. + + ${app_name} can check your address book to find other Matrix users based on their email and phone numbers. If you agree to share your address book for this purpose, please allow access on the next pop-up. + + ${app_name} can check your address book to find other Matrix users based on their email and phone numbers.\n\nDo you agree to share your address book for this purpose? Sorry. Action not performed, due to missing permissions To scan a QR code, you need to allow camera access. @@ -728,7 +1051,8 @@ Application info Show the application info in the system settings. Confirm your password - You can\'t do this from Element mobile + + You can\'t do this from ${app_name} mobile Authentication is required Email addresses @@ -761,7 +1085,8 @@ Session Settings. Notifications are enabled for this session. - Notifications are not enabled for this session.\nPlease check the Element settings. + + Notifications are not enabled for this session.\nPlease check the ${app_name} settings. Enable Custom Settings. @@ -772,15 +1097,19 @@ Play Services Check Google Play Services APK is available and up-to-date. - Element uses Google Play Services to deliver push messages but it doesn’t seem to be configured correctly:\n%1$s + + ${app_name} uses Google Play Services to deliver push messages but it doesn’t seem to be configured correctly:\n%1$s Fix Play Services Firebase Token FCM token successfully retrieved:\n%1$s Failed to retrieved FCM token:\n%1$s - [%1$s]\nThis error is out of control of Element and according to Google, this error indicates that the device has too many apps registered with FCM. The error only occurs in cases where there are extreme numbers of apps, so it should not affect the average user. - [%1$s]\nThis error is out of control of Element. It can occur for several reasons. Maybe it will work if you retry later, you can also check that Google Play Service is not restricted in data usage in the system settings, or that your device clock is correct, or it can happen on custom ROM. - [%1$s]\nThis error is out of control of Element. There is no Google account on the phone. Please open the account manager and add a Google account. + + [%1$s]\nThis error is out of control of ${app_name} and according to Google, this error indicates that the device has too many apps registered with FCM. The error only occurs in cases where there are extreme numbers of apps, so it should not affect the average user. + + [%1$s]\nThis error is out of control of ${app_name}. It can occur for several reasons. Maybe it will work if you retry later, you can also check that Google Play Service is not restricted in data usage in the system settings, or that your device clock is correct, or it can happen on custom ROM. + + [%1$s]\nThis error is out of control of ${app_name}. There is no Google account on the phone. Please open the account manager and add a Google account. Add Account Token Registration @@ -807,16 +1136,20 @@ Start on boot Service will start when the device is restarted. - The service will not start when the device is restarted, you will not receive notifications until Element has been opened once. + + The service will not start when the device is restarted, you will not receive notifications until ${app_name} has been opened once. Enable Start on boot Check background restrictions - Background restrictions are disabled for Element. This test should be run using mobile data (no WIFI).\n%1$s - Background restrictions are enabled for Element.\nWork that the app tries to do will be aggressively restricted while it is in the background, and this could affect notifications.\n%1$s + + Background restrictions are disabled for ${app_name}. This test should be run using mobile data (no WIFI).\n%1$s + + Background restrictions are enabled for ${app_name}.\nWork that the app tries to do will be aggressively restricted while it is in the background, and this could affect notifications.\n%1$s Disable restrictions Battery Optimization - Element is not affected by Battery Optimization. + + ${app_name} is not affected by Battery Optimization. If a user leaves a device unplugged and stationary for a period of time, with the screen off, the device enters Doze mode. This prevents apps from accessing the network and defers their jobs, syncs, and standard alarms. Ignore Optimization @@ -851,9 +1184,11 @@ Background synchronization Background Sync Mode Optimized for battery - Element will sync in background in way that preserves the device’s limited resources (battery).\nDepending on your device resource state, the sync may be deferred by the operating system. + + ${app_name} will sync in background in way that preserves the device’s limited resources (battery).\nDepending on your device resource state, the sync may be deferred by the operating system. Optimized for real time - Element will sync in background periodically at precise time (configurable).\nThis will impact radio and battery usage, there will be a permanent notification displayed stating that Element is listening for events. + + ${app_name} will sync in background periodically at precise time (configurable).\nThis will impact radio and battery usage, there will be a permanent notification displayed stating that ${app_name} is listening for events. No background sync You will not be notified of incoming messages when the app is in background. Failed to update settings. @@ -936,19 +1271,23 @@ Discovery Manage your discovery settings. Notification Privacy - Element can run in the background to manage your notifications securely and privately. This might affect battery usage. + + ${app_name} can run in the background to manage your notifications securely and privately. This might affect battery usage. Grant permission Choose another option Background Connection - Element needs to keep a low impact background connection in order to have reliable notifications.\nOn the next screen you will be prompted to allow Element to always run in background, please accept. + + ${app_name} needs to keep a low impact background connection in order to have reliable notifications.\nOn the next screen you will be prompted to allow ${app_name} to always run in background, please accept. Grant permission Analytics Send analytics data - Element collects anonymous analytics to allow us to improve the application. - Please enable analytics to help us improve Element. + + ${app_name} collects anonymous analytics to allow us to improve the application. + + Please enable analytics to help us improve ${app_name}. Yes, I want to help! Data save mode @@ -1117,6 +1456,7 @@ Advanced This room’s internal ID + Room version Addresses Labs These are experimental features that may break in unexpected ways. Use with caution. @@ -1317,6 +1657,8 @@ Sorry, conference calls with Jitsi are not supported on old devices (devices with Android OS below 6.0) + Leave the current conference and switch to the other one? + This widget wants to use the following resources: Allow Block All @@ -1507,7 +1849,8 @@ - Please delete the passphrase if you want Element to generate a recovery key. + + Please delete the passphrase if you want ${app_name} to generate a recovery key. No Matrix session available Never lose encrypted messages @@ -1649,7 +1992,8 @@ Invalid homeserver discovery response "Autocomplete Server Options - Element detected a custom server configuration for your userId domain \"%1$s\":\n%2$s + + ${app_name} detected a custom server configuration for your userId domain \"%1$s\":\n%2$s Use Config You have been logged out due to invalid or expired credentials. @@ -1707,7 +2051,7 @@ Edit Reply - "Retry" + Retry "Join a room to start using the app." "Sent you an invitation" Invited by %s @@ -1745,7 +2089,8 @@ "All Communities" "This room can't be previewed" - "The preview of world-readable room is not supported yet in Element" + + The preview of world-readable room is not supported yet in ${app_name} This room is not accessible at this time.\nTry again later, or ask a room admin to check if you have access. "This room can't be previewed. Do you want to join it?" "Rooms" @@ -1970,7 +2315,8 @@ "Reported as inappropriate" "This content was reported as inappropriate.\n\nIf you don't want to see any more content from this user, you can ignore them to hide their messages." - Element needs permission to save your E2E keys on disk.\n\nPlease allow access on the next pop-up to be able to export your keys manually. + + ${app_name} needs permission to save your E2E keys on disk.\n\nPlease allow access on the next pop-up to be able to export your keys manually. There is no network connection right now @@ -1986,6 +2332,8 @@ "Add to low priority" "Remove from low priority" "Leave the room" + "Room settings" + "%1$s made no changes" "You made no changes" Sends the given message as a spoiler @@ -2042,7 +2390,6 @@ Address Premium hosting for organisations Enter the address of the Modular Element or Server you want to use - Enter the address of a server or a Element you want to connect to Enter the address of the server you want to use An error occurred when loading the page: %1$s (%2$d) @@ -2161,7 +2508,8 @@ Clear all data currently stored on this device?\nSign in again to access your account data and messages. You’ll lose access to secure messages unless you sign in to recover your encryption keys. Clear data - The current session is for user %1$s and you provide credentials for user %2$s. This is not supported by Element.\nPlease first clear data, then sign in again on another account. + + The current session is for user %1$s and you provide credentials for user %2$s. This is not supported by ${app_name}.\nPlease first clear data, then sign in again on another account. Your matrix.to link was malformed The description is too short @@ -2183,7 +2531,8 @@ Showing only the first results, type more letters… Fail-fast - Element may crash more often when an unexpected error occurs + + ${app_name} may crash more often when an unexpected error occurs Prepends ¯\\_(ツ)_/¯ to a plain-text message @@ -2288,9 +2637,12 @@ Direct message Jump to read receipt - "Element does not handle events of type '%1$s'" - "Element does not handle message of type '%1$s'" - "Element encountered an issue when rendering content of event with id '%1$s'" + + ${app_name} does not handle events of type \'%1$s\' + + ${app_name} does not handle message of type \'%1$s\' + + ${app_name} encountered an issue when rendering content of event with id \'%1$s\' Unignore @@ -2336,6 +2688,12 @@ Manage Sessions Sign out of this session + Server name + Server version + Server file upload limit + Your homeserver accepts attachments (files, media, etc.) with a size up to %s. + The limit is unknown. + No cryptographic information available This session is trusted for secure messaging because you verified it: @@ -2421,7 +2779,8 @@ Keys are already up to date! - Element Android + + ${app_name} Android Key Requests Export Audit @@ -2580,11 +2939,15 @@ Could not save media file Set a new account password… - Use the latest Element on your other devices, Element Web, Element Desktop, Element iOS, Element for Android, or another cross-signing capable Matrix client - Element Web\nElement Desktop - Element iOS\nElement Android + + Use the latest ${app_name} on your other devices, ${app_name} Web, ${app_name} Desktop, ${app_name} iOS, ${app_name} for Android, or another cross-signing capable Matrix client + + ${app_name} Web\n${app_name} Desktop + + ${app_name} iOS\n${app_name} Android or another cross-signing capable Matrix client - Use the latest Element on your other devices: + + Use the latest ${app_name} on your other devices: Forces the current outbound group session in an encrypted room to be discarded Only supported in encrypted rooms @@ -2605,9 +2968,9 @@ Sends the given message with confetti Sends the given message with snow - + sends confetti 🎉 - + sends snow ❄️ Unencrypted @@ -2624,7 +2987,6 @@ Confirm your identity by verifying this login, granting it access to encrypted messages. Mark as Trusted - Sorry, this operation is not possible yet for accounts connected using Single Sign-On. Failed to set up Cross Signing Please choose a username. @@ -2640,8 +3002,10 @@ Inviting users… Invite Users Invite friends - Hey, talk to me on Element: %s - 🔐️ Join me on element + + Hey, talk to me on ${app_name}: %s + + 🔐️ Join me on ${app_name} Invitation sent to %1$s Invitations sent to %1$s and %2$s "It's not a valid matrix QR code" @@ -2662,11 +3026,13 @@ Open terms of %s Disconnect from the identity server %s? - This identity server is outdated. Element support only API V2. + + This identity server is outdated. ${app_name} support only API V2. This operation is not possible. The homeserver is outdated. Please first configure an identity server. Please first accepts the terms of the identity server in the settings. - For your privacy, Element only supports sending hashed user emails and phone number. + + For your privacy, ${app_name} only supports sending hashed user emails and phone number. The association has failed. The is no current association with this identifier. The user consent has not been provided. @@ -2721,13 +3087,10 @@ You cannot access this message because the sender purposely did not send the keys Waiting for encryption history - Riot is now Element! - We’re excited to announce we’ve changed name! Your app is up to date and you’re signed in to your account. - GOT IT - LEARN MORE - - element - + Riot is now Element! + We’re excited to announce we’ve changed name! Your app is up to date and you’re signed in to your account. + GOT IT + LEARN MORE Save recovery key in @@ -2773,13 +3136,16 @@ If you want to reset your PIN, tap Forgot PIN to logout and reset. Enable biometrics Enable device specific biometrics, like fingerprints and face recognition. - PIN code is the only way to unlock Element. + + PIN code is the only way to unlock ${app_name}. Show content in notifications Show details like room names and message content. Only display number of unread messages in a simple notification. Require PIN after 2 minutes - PIN code is required after 2 minutes of not using Element. - PIN code is required every time you open Element. + + PIN code is required after 2 minutes of not using ${app_name}. + + PIN code is required every time you open ${app_name}. Change PIN Change your current PIN Confirm PIN to disable PIN @@ -2831,7 +3197,8 @@ Re-Authentication Needed - Element requires you to enter your credentials to perform this action. + + ${app_name} requires you to enter your credentials to perform this action. Failed to authenticate Screenshot @@ -2872,4 +3239,13 @@ Event sent! State event sent! Event content + + Sending + Sent + Failed + Delete all failed messages + Do you want to cancel sending message? + Messages failed to send + Delete unsent messages + Are you sure you want to delete all unsent messages in this room? diff --git a/vector/src/main/res/values/styles_riot.xml b/vector/src/main/res/values/styles_riot.xml index d81b4cb6e9..89d5ac12e2 100644 --- a/vector/src/main/res/values/styles_riot.xml +++ b/vector/src/main/res/values/styles_riot.xml @@ -97,11 +97,6 @@ 12sp - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vector/src/main/res/values/theme_black.xml b/vector/src/main/res/values/theme_black.xml index e5c6851f40..8a03e29375 100644 --- a/vector/src/main/res/values/theme_black.xml +++ b/vector/src/main/res/values/theme_black.xml @@ -8,27 +8,17 @@ @color/riotx_background_black - @color/riotx_base_black - @color/riotx_base_text_icon_primary_black - @color/riotx_base_text_icon_secondary_black - @color/riotx_search_background_mobile_black + @color/vctr_home_drawer_header_background_black @color/riotx_header_panel_background_black @color/riotx_header_panel_border_mobile_black - @color/riotx_header_panel_text_primary_black @color/riotx_header_panel_text_secondary_black @color/riotx_text_primary_black @color/riotx_text_secondary_black @color/riotx_text_tertiary_black @color/riotx_text_primary_body_contrast_black @color/riotx_android_secondary_black - @color/riotx_search_placeholder_black - @color/riotx_room_highlight_black @color/riotx_unread_room_indent_black - @color/riotx_android_status_bar_black - @color/riotx_line_break_mobile_black @color/riotx_unread_room_badge_black - @color/riotx_fab_secondary_bg_black - @color/riotx_fab_secondary_color_black @color/riotx_fab_label_bg_black @color/riotx_fab_label_stroke_black @color/riotx_fab_label_color_black @@ -41,8 +31,6 @@ @color/riotx_reaction_background_on_black @color/riotx_alerter_background_black - @color/riotx_bottom_nav_icon_color_black - @color/riotx_accent @@ -66,8 +54,6 @@ @style/VectorButtonStyle @style/VectorToolbarStyle - @color/riotx_links - ?colorAccent diff --git a/vector/src/main/res/values/theme_dark.xml b/vector/src/main/res/values/theme_dark.xml index 953691a6b7..5d22683b82 100644 --- a/vector/src/main/res/values/theme_dark.xml +++ b/vector/src/main/res/values/theme_dark.xml @@ -6,27 +6,17 @@