diff --git a/AUTHORS.md b/AUTHORS.md
index 823dbc7311..ad20133d83 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -39,7 +39,7 @@ We do not forget all translators, for their work of translating Element into man
Feel free to add your name below, when you contribute to the project!
-Name | Matrix ID | GitHub
---------|---------------------|--------------------------------------
-gjpower | @gjpower:matrix.org | [gjpower](https://github.com/gjpower)
-
+Name | Matrix ID | GitHub
+----------|-----------------------------|--------------------------------------
+gjpower | @gjpower:matrix.org | [gjpower](https://github.com/gjpower)
+TR_SLimey | @tr_slimey:an-atom-in.space | [TR-SLimey](https://github.com/TR-SLimey)
diff --git a/CHANGES.md b/CHANGES.md
index 9a4e63cf06..c3469f0661 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -2,7 +2,9 @@ Changes in Element 1.0.11 (2020-XX-XX)
===================================================
Features ✨:
- -
+ - Create DMs with users by scanning their QR code (#2025)
+ - Add Invite friends quick invite actions (#2348)
+ - Add friend by scanning QR code, show your code to friends (#2025)
Improvements 🙌:
- New room creation tile with quick action (#2346)
@@ -13,6 +15,7 @@ Improvements 🙌:
- Room creation form: add advanced section to disable federation (#1314)
- Move "Enable Encryption" from room setting screen to room profile screen (#2394)
- Home empty screens quick design update (#2347)
+ - Improve Invite user screen (seamless search for matrix ID)
Bugfix 🐛:
- Fix crash on AttachmentViewer (#2365)
@@ -24,6 +27,8 @@ Bugfix 🐛:
- Try to fix cropped image in timeline (#2126)
- Registration: annoying error message scares every new user when they add an email (#2391)
- Fix jitsi integration for those with non-vanilla dialler frameworks
+ - Update profile has no effect if user is in zero rooms
+ - Fix issues with matrix.to deep linking (#2349)
Translations 🗣:
-
diff --git a/fastlane/metadata/android/ca/changelogs/40100100.txt b/fastlane/metadata/android/ca/changelogs/40100100.txt
new file mode 100644
index 0000000000..70b786d12e
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40100100.txt
@@ -0,0 +1 @@
+// TODO
diff --git a/fastlane/metadata/android/ca/full_description.txt b/fastlane/metadata/android/ca/full_description.txt
new file mode 100644
index 0000000000..b45a5488ea
--- /dev/null
+++ b/fastlane/metadata/android/ca/full_description.txt
@@ -0,0 +1,30 @@
+Element és un nou tipus d'aplicació de missatgeria i col·laboració que:
+
+1. Et dóna a tu el control per preservar la teva privadesa
+2. Et permet comunicar-te amb qualsevol persona de la xarxa Matrix i, fins i tot més enllà gràcies a integracions amb altres aplicacions com Slack
+3. Et protegeix de la publicitat, l'obtenció no desitjada de dades i dels navegadors amb accés controlat
+4. T'assegura a tu mitjançant l'encriptació d'extrem a extrem i amb signatures creuades per verificar els altres
+
+Element és completament diferent a les altres aplicacions de missatgeria i col·laboració ja que és descentralitzat i de codi obert.
+
+Element et deixa triar l'allotjament perquè disposis de privadesa, propietat i control de les teves dades i converses. Et dóna accés a una xarxa oberta perquè no et quedis únicament parlant amb els usuaris d'Element.
+
+Element pot fer tot això ja que opera sobre Matrix - l'estàndard per a les comunicacions obertes i descentralitzades.
+
+Element et dóna el control perquè et deixa escollir qui vols que allotgi les teves converses. Des de l'aplicació d'Element, pots triar l'allotjament de diferents maneres:
+
+1. Crea un compte gratuït al servidor públic de matrix.org allotjat pels desenvolupadors de Matrix o tria'n un entre els milers de servidors públics creats per voluntaris
+2. Allotja tu mateix el teu compte en el teu propi servidor
+3. Registra el compte en un servidor personalitzat subscrivint-te a la plataforma d'Element Matrix Services (EMS)
+
+Per què escollir Element?
+
+PROPIETAT DE LES TEVES DADES: Tu decideixes a on desar les teves dades i missatges. Tu les controles i n'ets el propietari, no una mega-corporació que s'aprofita de les teves dades o les cedeix a tercers.
+
+MISSATGERIA I COL·LABORACIÓ OBERTA: Pots parlar amb qualsevol que estigui a la xarxa Matrix, ja sigui amb Element o amb qualsevol altre aplicació Matrix, fins i tot encara que utilitzin sistemes de missatgeria diferents com Slack, IRC o XMPP.
+
+SUPER-SEGUR: Encriptació d'extrem a extrem real (només qui està conversant pot desxifrar els missatges), i amb signatures creuades per a verificar els dispositius dels participants en les converses.
+
+COMUNICACIÓ COMPLETA: Missatgeria, veu i video-trucades, compartició de fitxers, compartició de pantalla i un munt d'integracions, bots i ginys. Crea sales, comunitats, mantén-te en contacte i enllesteix el que et proposes.
+
+A TOT ARREU: Mantingues el contacte des de qualsevol lloc on siguis, amb un historial de missatges totalment sincronitzat entre tots els teus dispositius i també a la web: https://app.element.io.
diff --git a/fastlane/metadata/android/ca/short_description.txt b/fastlane/metadata/android/ca/short_description.txt
new file mode 100644
index 0000000000..1e842ec64e
--- /dev/null
+++ b/fastlane/metadata/android/ca/short_description.txt
@@ -0,0 +1 @@
+Xat i VoIP segurs i descentralitzats. Protegeix les teves dades de tercers.
diff --git a/fastlane/metadata/android/ca/title.txt b/fastlane/metadata/android/ca/title.txt
new file mode 100644
index 0000000000..adc831006a
--- /dev/null
+++ b/fastlane/metadata/android/ca/title.txt
@@ -0,0 +1 @@
+Element (anteriorment Riot.im)
diff --git a/fastlane/metadata/android/de/changelogs/40100100.txt b/fastlane/metadata/android/de/changelogs/40100100.txt
new file mode 100644
index 0000000000..70b786d12e
--- /dev/null
+++ b/fastlane/metadata/android/de/changelogs/40100100.txt
@@ -0,0 +1 @@
+// TODO
diff --git a/fastlane/metadata/android/es/changelogs/40100100.txt b/fastlane/metadata/android/es/changelogs/40100100.txt
new file mode 100644
index 0000000000..70b786d12e
--- /dev/null
+++ b/fastlane/metadata/android/es/changelogs/40100100.txt
@@ -0,0 +1 @@
+// TODO
diff --git a/fastlane/metadata/android/es/full_description.txt b/fastlane/metadata/android/es/full_description.txt
index 860a1f19c3..8c9915a735 100644
--- a/fastlane/metadata/android/es/full_description.txt
+++ b/fastlane/metadata/android/es/full_description.txt
@@ -1,30 +1,30 @@
Element es un nuevo tipo de aplicación de mensajería y colaboración que:
-1. Le da el control para preservar su privacidad
-2. Le permite comunicarse con cualquier persona en la red Matrix e incluso más allá al integrarse con aplicaciones como Slack.
-3. Te protege de la publicidad, la minería de datos y los jardines vallados.
-4. Lo protege a través del cifrado de un extremo a otro, con firma cruzada para verificar a otros
+1. Te da el control para preservar su privacidad
+2. Te permite comunicarse con cualquier persona en la red Matrix e incluso más allá al integrarse con aplicaciones como Slack
+3. Te protege de la publicidad, la minería de datos y los jardines vallados
+4. Te protege a través de encriptación de Extremo-a-Extremo, con firma cruzada para verificar a otros
Element es completamente diferente de otras aplicaciones de mensajería y colaboración porque es descentralizado y de código abierto.
-Element le permite autohospedarse, o elegir un host, para que tenga privacidad, propiedad y control de sus datos y conversaciones. Te da acceso a una red abierta; para que no se quede atascado hablando solo con otros usuarios de Element. Y es muy seguro.
+Element te permite tener su propio servidor privado, o elegir uno público, para que tenga privacidad, posesión, y control de sus datos y conversaciones. Te da acceso a una red abierta; para que no se quede atrapado hablando solo con otros usuarios de Element. Y es muy seguro.
Element puede hacer todo esto porque opera en Matrix, el estándar para la comunicación abierta y descentralizada.
-Element te da el control permitiéndote elegir quién aloja tus conversaciones. Desde la aplicación Element, puede elegir hospedar de diferentes maneras:
+Element te da el control permitiéndote elegir quién aloja tus conversaciones. Desde la aplicación Element, puedes elegir hospedar de diferentes maneras:
-1. Obtenga una cuenta gratuita en el servidor público de matrix.org alojado por los desarrolladores de Matrix, o elija entre miles de servidores públicos alojados por voluntarios
-2. Autohospede su cuenta ejecutando un servidor en su propio hardware
-3. Regístrese para obtener una cuenta en un servidor personalizado simplemente suscribiéndose a la plataforma de alojamiento de Element Matrix Services
+1. Obtén una cuenta gratuita en el servidor público de matrix.org alojado por los desarrolladores de Matrix, o elije entre miles de servidores públicos alojados por voluntarios
+2. Autohospeda tu cuenta con un servidor en tu propio hardware
+3. Regístrate para obtener una cuenta en un servidor personalizado simplemente suscribiéndote a la plataforma de alojamiento de Element Matrix Services
¿Por qué elegir Element?
-POSEE SUS DATOS: Tú decides dónde guardar tus datos y mensajes. Usted es el propietario y lo controla, no algún MEGACORP que extraiga sus datos o dé acceso a terceros.
+TOMA POSESIÓN DE TUS DATOS: Tú decides dónde guardar tus datos y mensajes. Tú eres el propietario y quien lo controla, no alguna MEGACORP que extrae tu datos o da acceso a terceros.
-MENSAJERÍA ABIERTA Y COLABORACIÓN: Puede chatear con cualquier otra persona en la red de Matrix, ya sea que estén usando Element u otra aplicación de Matrix, e incluso si están usando un sistema de mensajería diferente como Slack, IRC o XMPP.
+MENSAJERÍA ABIERTA Y COLABORACIÓN: Puede chatear con cualquier otra persona en la red de Matrix, tanto si usan Element u otra aplicación de Matrix, e incluso si están usando un sistema de mensajería diferente como Slack, IRC o XMPP.
-SUPER SEGURO: Cifrado real de extremo a extremo (solo aquellos en la conversación pueden descifrar mensajes) y firma cruzada para verificar los dispositivos de los participantes de la conversación.
+SUPER SEGURO: Encriptación de Extremo-a-Extremo real (solo aquellos en la conversación pueden descifrar mensajes) y firma cruzada para verificar los dispositivos de los participantes de la conversación.
-COMUNICACIÓN COMPLETA: Mensajería, llamadas de voz y video, uso compartido de archivos, uso compartido de pantalla y un montón de integraciones, bots y widgets. Construya salas, comunidades, manténgase en contacto y haga las cosas.
+COMUNICACIÓN COMPLETA: Mensajería, llamadas de voz y video, uso compartido de archivos, uso compartido de pantalla y un montón de integraciones, bots y widgets. Crea salas, comunidades, mantente en contacto y organízate con eficacia.
-EN TODAS PARTES: Manténgase en contacto donde quiera que esté con un historial de mensajes totalmente sincronizado en todos sus dispositivos y en la web en https://app.element.io.
+EN TODAS PARTES: Mantente en contacto donde quiera que estés con un historial de mensajes totalmente sincronizado en todos sus dispositivos y en la web en https://app.element.io.
diff --git a/fastlane/metadata/android/es/short_description.txt b/fastlane/metadata/android/es/short_description.txt
index 0562213351..473228e0df 100644
--- a/fastlane/metadata/android/es/short_description.txt
+++ b/fastlane/metadata/android/es/short_description.txt
@@ -1 +1 @@
-Chat y VoIP descentralizados seguros. Mantenga sus datos a salvo de terceros.
+Chat y VoIP descentralizados y seguros. Mantén tus datos a salvo de terceros.
diff --git a/fastlane/metadata/android/es/title.txt b/fastlane/metadata/android/es/title.txt
index adc831006a..971e5cf146 100644
--- a/fastlane/metadata/android/es/title.txt
+++ b/fastlane/metadata/android/es/title.txt
@@ -1 +1 @@
-Element (anteriorment Riot.im)
+Element (previamente Riot.im)
diff --git a/fastlane/metadata/android/fa/changelogs/40100100.txt b/fastlane/metadata/android/fa/changelogs/40100100.txt
new file mode 100644
index 0000000000..6123bfc7fc
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40100100.txt
@@ -0,0 +1 @@
+// برای انجام
diff --git a/fastlane/metadata/android/it/changelogs/40100100.txt b/fastlane/metadata/android/it/changelogs/40100100.txt
new file mode 100644
index 0000000000..0c7cc8cc6c
--- /dev/null
+++ b/fastlane/metadata/android/it/changelogs/40100100.txt
@@ -0,0 +1 @@
+// DA FARE
diff --git a/fastlane/metadata/android/nb/short_description.txt b/fastlane/metadata/android/nb/short_description.txt
new file mode 100644
index 0000000000..b7cad4c849
--- /dev/null
+++ b/fastlane/metadata/android/nb/short_description.txt
@@ -0,0 +1 @@
+Sikker desentralisert chat & VoIP. Beskytt dataene dine fra tredjeparter.
diff --git a/fastlane/metadata/android/nb/title.txt b/fastlane/metadata/android/nb/title.txt
new file mode 100644
index 0000000000..aacee5be54
--- /dev/null
+++ b/fastlane/metadata/android/nb/title.txt
@@ -0,0 +1 @@
+Element (tidligere Riot.im)
diff --git a/fastlane/metadata/android/pt_BR/changelogs/40100100.txt b/fastlane/metadata/android/pt_BR/changelogs/40100100.txt
new file mode 100644
index 0000000000..02cfd45a87
--- /dev/null
+++ b/fastlane/metadata/android/pt_BR/changelogs/40100100.txt
@@ -0,0 +1 @@
+// A FAZER
diff --git a/fastlane/metadata/android/sv/changelogs/40100100.txt b/fastlane/metadata/android/sv/changelogs/40100100.txt
new file mode 100644
index 0000000000..6da756aca9
--- /dev/null
+++ b/fastlane/metadata/android/sv/changelogs/40100100.txt
@@ -0,0 +1 @@
+// ATT GÖRA
diff --git a/fastlane/metadata/android/zh_Hant/changelogs/40100100.txt b/fastlane/metadata/android/zh_Hant/changelogs/40100100.txt
new file mode 100644
index 0000000000..3c21bcbeb6
--- /dev/null
+++ b/fastlane/metadata/android/zh_Hant/changelogs/40100100.txt
@@ -0,0 +1 @@
+// 待辦事項
diff --git a/fastlane/metadata/android/zh_Hant/full_description.txt b/fastlane/metadata/android/zh_Hant/full_description.txt
new file mode 100644
index 0000000000..2fdf6fa478
--- /dev/null
+++ b/fastlane/metadata/android/zh_Hant/full_description.txt
@@ -0,0 +1,30 @@
+Element 是一種新型態的即時通訊軟體與協作應用程式:
+
+1. 自己的隱私自己掌控
+2. 讓您與任何在 Matrix 網路中的人通訊,甚至可與如 Slack 等的應用程式整合
+3. 保護您免受廣告、資料採礦與圍牆花園的侵害
+4. 透過端到端加密保護您,並使用交叉簽章來驗證其他人
+
+Element 是去中心化且開放原始碼的應用程式,因此與其他即時通訊與協作軟體完全不同。
+
+Element 讓您可以自架(或是自行選擇服務提供者)所以您擁有您資料與對話的隱私、所有權與控制權。它讓您可以存取開放的網路;因此,您不僅可以與其他 Matrix 使用者聊天。而且非常安全。
+
+Element 能作到這些事情是因為它在 Matrix 上執行,這是一個開放的去中心化通訊的標準。
+
+Element 讓您選擇您要在哪裡託管您的對話來將控制權還給您。在 Element 應用程式中,您可以選擇其他方式來託管:
+
+1. 在由 Matrix 開發者架設的 matrix.org 公開伺服器上取得免費的帳號,或是從數千個由志願者所架設的公開伺服器中選擇
+2. 在您自己的硬體上自行架設伺服器並建立帳號
+3. 訂閱 Element Matrix 服務託管平台並在自訂伺服氣上註冊帳號
+
+為何選擇 Element?
+
+擁有您的資料:您決定您的資料與訊息要放在哪裡。您擁有並控制它,而非某些科技巨頭會挖掘您的資料並將其售予第三方。
+
+開放的即時通訊與協作:您可以與 Matrix 網路中的任何人聊天,不管他們是使用 Element 或其他 Matrix 應用程式都可以,或甚至是其他的訊息系統,如 Slack、IRC 或 XMPP 也都可以。
+
+超級安全:即時的端到端加密(僅有參與對話的人可以解密訊息),以及交叉簽章以驗證對話參與者的裝置。
+
+完整通訊:即時通訊、語音與視訊通話、檔案分享、畫面分享與超多的整合、機器人與小工具。建立聊天室、保持聯繫並完成工作。
+
+無論您身在何處:無論您身在何處,都可以透過 https://app.element.io 來在所有裝置與網路上保持訊息歷史同步。
diff --git a/fastlane/metadata/android/zh_Hant/short_description.txt b/fastlane/metadata/android/zh_Hant/short_description.txt
new file mode 100644
index 0000000000..23bb82c04e
--- /dev/null
+++ b/fastlane/metadata/android/zh_Hant/short_description.txt
@@ -0,0 +1 @@
+安全的去中心化聊天與 VoIP。確保您的資料不受第三方的影響。
diff --git a/fastlane/metadata/android/zh_Hant/title.txt b/fastlane/metadata/android/zh_Hant/title.txt
new file mode 100644
index 0000000000..3be2260b73
--- /dev/null
+++ b/fastlane/metadata/android/zh_Hant/title.txt
@@ -0,0 +1 @@
+Element(曾名為 Riot.im)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt
index 645fb55bb9..48705ee7b7 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt
@@ -27,7 +27,7 @@ interface LoginWizard {
* @param password the password field
* @param deviceName the initial device name
* @param callback the matrix callback on which you'll receive the result of authentication.
- * @return return a [Cancelable]
+ * @return a [Cancelable]
*/
fun login(login: String,
password: String,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt
index 2cfc4b731f..ab85f979bf 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt
@@ -35,6 +35,11 @@ interface UserService {
*/
fun getUser(userId: String): User?
+ /**
+ * Try to resolve user from known users, or using profile api
+ */
+ fun resolveUser(userId: String, callback: MatrixCallback)
+
/**
* Search list of users on server directory.
* @param search the searched term
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultVerificationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultVerificationService.kt
index 29ddd92213..a92f5c5bf1 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultVerificationService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/DefaultVerificationService.kt
@@ -1204,7 +1204,7 @@ internal class DefaultVerificationService @Inject constructor(
Timber.i("## Requesting verification to user: $otherUserId with device list $otherDevices")
val targetDevices = otherDevices ?: cryptoStore.getUserDevices(otherUserId)
- ?.values?.map { it.deviceId } ?: emptyList()
+ ?.values?.map { it.deviceId }.orEmpty()
val requestsForUser = pendingRequests.getOrPut(otherUserId) { mutableListOf() }
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/DefaultProfileService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/DefaultProfileService.kt
index 8d09277295..5265e4f17d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/DefaultProfileService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/DefaultProfileService.kt
@@ -31,6 +31,7 @@ import org.matrix.android.sdk.internal.database.model.PendingThreePidEntity
import org.matrix.android.sdk.internal.database.model.UserThreePidEntity
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.session.content.FileUploader
+import org.matrix.android.sdk.internal.session.user.UserStore
import org.matrix.android.sdk.internal.task.TaskExecutor
import org.matrix.android.sdk.internal.task.configureWith
import org.matrix.android.sdk.internal.task.launchToCallback
@@ -49,6 +50,7 @@ internal class DefaultProfileService @Inject constructor(private val taskExecuto
private val finalizeAddingThreePidTask: FinalizeAddingThreePidTask,
private val deleteThreePidTask: DeleteThreePidTask,
private val pendingThreePidMapper: PendingThreePidMapper,
+ private val userStore: UserStore,
private val fileUploader: FileUploader) : ProfileService {
override fun getDisplayName(userId: String, matrixCallback: MatrixCallback>): Cancelable {
@@ -70,17 +72,17 @@ internal class DefaultProfileService @Inject constructor(private val taskExecuto
}
override fun setDisplayName(userId: String, newDisplayName: String, matrixCallback: MatrixCallback): Cancelable {
- return setDisplayNameTask
- .configureWith(SetDisplayNameTask.Params(userId = userId, newDisplayName = newDisplayName)) {
- callback = matrixCallback
- }
- .executeBy(taskExecutor)
+ return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.io, matrixCallback) {
+ setDisplayNameTask.execute(SetDisplayNameTask.Params(userId = userId, newDisplayName = newDisplayName))
+ userStore.updateDisplayName(userId, newDisplayName)
+ }
}
override fun updateAvatar(userId: String, newAvatarUri: Uri, fileName: String, matrixCallback: MatrixCallback): Cancelable {
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, matrixCallback) {
val response = fileUploader.uploadFromUri(newAvatarUri, fileName, "image/jpeg")
setAvatarUrlTask.execute(SetAvatarUrlTask.Params(userId = userId, newAvatarUrl = response.contentUri))
+ userStore.updateAvatar(userId, response.contentUri)
}
}
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 df2d238c05..783aa53ddf 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
@@ -103,7 +103,7 @@ internal class DefaultTimelineService @AssistedInject constructor(@Assisted priv
.sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.ASCENDING)
.findAll()
?.mapNotNull { timelineEventMapper.map(it).takeIf { it.root.isImageMessage() || it.root.isVideoMessage() } }
- ?: emptyList()
+ .orEmpty()
}
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomTypingUsersHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomTypingUsersHandler.kt
index 1655e551f1..f4f3e6ce43 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomTypingUsersHandler.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomTypingUsersHandler.kt
@@ -28,7 +28,7 @@ internal class RoomTypingUsersHandler @Inject constructor(@UserId private val us
fun handle(realm: Realm, roomId: String, ephemeralResult: RoomSyncHandler.EphemeralResult?) {
val roomMemberHelper = RoomMemberHelper(realm, roomId)
- val typingIds = ephemeralResult?.typingUserIds?.filter { it != userId } ?: emptyList()
+ val typingIds = ephemeralResult?.typingUserIds?.filter { it != userId }.orEmpty()
val senderInfo = typingIds.map { userId ->
val roomMemberSummaryEntity = roomMemberHelper.getLastRoomMember(userId)
SenderInfo(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/typing/DefaultTypingUsersTracker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/typing/DefaultTypingUsersTracker.kt
index 2b7ff2624a..c5c3fc4b59 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/typing/DefaultTypingUsersTracker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/typing/DefaultTypingUsersTracker.kt
@@ -37,6 +37,6 @@ internal class DefaultTypingUsersTracker @Inject constructor() : TypingUsersTrac
}
override fun getTypingUsers(roomId: String): List {
- return typingUsers[roomId] ?: emptyList()
+ return typingUsers[roomId].orEmpty()
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/DefaultUserService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/DefaultUserService.kt
index d2eb7a14ef..1740956915 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/DefaultUserService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/DefaultUserService.kt
@@ -19,10 +19,13 @@ package org.matrix.android.sdk.internal.session.user
import androidx.lifecycle.LiveData
import androidx.paging.PagedList
import org.matrix.android.sdk.api.MatrixCallback
+import org.matrix.android.sdk.api.session.profile.ProfileService
import org.matrix.android.sdk.api.session.user.UserService
import org.matrix.android.sdk.api.session.user.model.User
import org.matrix.android.sdk.api.util.Cancelable
+import org.matrix.android.sdk.api.util.JsonDict
import org.matrix.android.sdk.api.util.Optional
+import org.matrix.android.sdk.internal.session.profile.GetProfileInfoTask
import org.matrix.android.sdk.internal.session.user.accountdata.UpdateIgnoredUserIdsTask
import org.matrix.android.sdk.internal.session.user.model.SearchUserTask
import org.matrix.android.sdk.internal.task.TaskExecutor
@@ -32,12 +35,40 @@ import javax.inject.Inject
internal class DefaultUserService @Inject constructor(private val userDataSource: UserDataSource,
private val searchUserTask: SearchUserTask,
private val updateIgnoredUserIdsTask: UpdateIgnoredUserIdsTask,
+ private val getProfileInfoTask: GetProfileInfoTask,
private val taskExecutor: TaskExecutor) : UserService {
override fun getUser(userId: String): User? {
return userDataSource.getUser(userId)
}
+ override fun resolveUser(userId: String, callback: MatrixCallback) {
+ val known = getUser(userId)
+ if (known != null) {
+ callback.onSuccess(known)
+ } else {
+ val params = GetProfileInfoTask.Params(userId)
+ getProfileInfoTask
+ .configureWith(params) {
+ this.callback = object : MatrixCallback {
+ override fun onSuccess(data: JsonDict) {
+ callback.onSuccess(
+ User(
+ userId,
+ data[ProfileService.DISPLAY_NAME_KEY] as? String,
+ data[ProfileService.AVATAR_URL_KEY] as? String)
+ )
+ }
+
+ override fun onFailure(failure: Throwable) {
+ callback.onFailure(failure)
+ }
+ }
+ }
+ .executeBy(taskExecutor)
+ }
+ }
+
override fun getUserLive(userId: String): LiveData> {
return userDataSource.getUserLive(userId)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserStore.kt
index 5c8cbd08b1..c030872dad 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserStore.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserStore.kt
@@ -18,12 +18,15 @@ package org.matrix.android.sdk.internal.session.user
import com.zhuinden.monarchy.Monarchy
import org.matrix.android.sdk.internal.database.model.UserEntity
+import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.util.awaitTransaction
import javax.inject.Inject
internal interface UserStore {
suspend fun createOrUpdate(userId: String, displayName: String? = null, avatarUrl: String? = null)
+ suspend fun updateAvatar(userId: String, avatarUrl: String? = null)
+ suspend fun updateDisplayName(userId: String, displayName: String? = null)
}
internal class RealmUserStore @Inject constructor(@SessionDatabase private val monarchy: Monarchy) : UserStore {
@@ -34,4 +37,20 @@ internal class RealmUserStore @Inject constructor(@SessionDatabase private val m
it.insertOrUpdate(userEntity)
}
}
+
+ override suspend fun updateAvatar(userId: String, avatarUrl: String?) {
+ monarchy.awaitTransaction { realm ->
+ UserEntity.where(realm, userId).findFirst()?.let {
+ it.avatarUrl = avatarUrl ?: ""
+ }
+ }
+ }
+
+ override suspend fun updateDisplayName(userId: String, displayName: String?) {
+ monarchy.awaitTransaction { realm ->
+ UserEntity.where(realm, userId).findFirst()?.let {
+ it.displayName = displayName ?: ""
+ }
+ }
+ }
}
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 22bdd2c6e4..329903f15b 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
@@ -138,7 +138,7 @@ internal class WidgetManager @Inject constructor(private val integrationManager:
): LiveData> {
val widgetsAccountData = accountDataDataSource.getLiveAccountDataEvent(UserAccountDataTypes.TYPE_WIDGETS)
return Transformations.map(widgetsAccountData) {
- it.getOrNull()?.mapToWidgets(widgetTypes, excludedTypes) ?: emptyList()
+ it.getOrNull()?.mapToWidgets(widgetTypes, excludedTypes).orEmpty()
}
}
diff --git a/matrix-sdk-android/src/main/res/values-ca/strings.xml b/matrix-sdk-android/src/main/res/values-ca/strings.xml
index 2dc2206c8c..8ba8c9acfd 100644
--- a/matrix-sdk-android/src/main/res/values-ca/strings.xml
+++ b/matrix-sdk-android/src/main/res/values-ca/strings.xml
@@ -1,79 +1,217 @@
-
+
%1$s: %2$s%1$s ha enviat una imatge.
-
- %1s ha sortit
- %1s ha entrat
+ %1$s ha marxat de la sala
+ %1$s s\'ha unit a la salaNúmero de telèfon
-
Correu electrònic
- Missatge encriptat
-
- la invitació de %s
+ Missatge xifrat
+ invitació de %s%1$s ha convidat a %2$s
- %1$s us ha convidat
+ %1$s t\'ha convidat%1$s ha rebutjat la invitació
- %1$s ha fet fora a %2$s
-
-
- %1$s ha canviat el seu nom visible de %2$s a %3$s
- %1$s ha eliminat el seu nom visible (%2$s)
+ %1$s ha expulsat %2$s
+ %1$s ha canviat el seu nom de visualització de %2$s a %3$s
+ %1$s ha eliminat el seu nom de visualització (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 contestat la trucada.
+ %s ha respost a la trucada.%s ha finalitzat la trucada.
- tots el membres de la sala, des del punt en què són convidats.
- tots els membres de la sala.
+ tots el participants de la sala, des de que són convidats.
+ tots els participants de la sala.desconegut (%s).
- %1$s ha activat l\'encriptació d\'extrem a extrem (%2$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 readmès a %2$s
- %1$s ha vetat a %2$s
+ %1$s ha tret el veto a %2$s
+ %1$s ha vetat %2$s%1$s ha retirat la invitació de %2$s%1$s ha canviat el seu avatar
- %1$s ha permès a %2$s veure l\'historial que es generi a partir d\'ara
- tots els membres de la sala, des del punt en què hi entrin.
+ %1$s ha establert la visibilitat de l\'historial 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
- S\'ha finalitzat la conferència de veu IP
-
- (s\'ha canviat també l\'avatar)
+ Ha finalitzat la conferència VoIP
+ (també ha canviat l\'avatar)%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 per a entrar a la sala
- %1$s ha acceptat la invitació per a %2$s
-
- ** No s\'ha pogut desencriptar: %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 redactarNo s\'ha pogut enviar el missatge
-
No s\'ha pogut pujar la imatge
-
- S\'ha produït un error de xarxa
- S\'ha produït un error de Matrix
-
- Actualment no es pot tornar a entrar a una sala buida.
-
- %1$s a canviat el seu nom visible a %2$s
- %s ha iniciat una trucada de vídeo.
- %s ha iniciat una trucada de veu.
-
+ 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 nom de visualització a %2$s
+ %s ha realitzat una videotrucada.
+ %s ha realitzat una trucada de veu.
- Convidat per %s
- Convideu a la sala
+ Invitació de %s
+ Convida a la sala%1$s i %2$sSala 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 l\'adreça %2$s d\'aquesta sala.
+ %1$s ha eliminat les adreces %3$s 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 veto a %1$s. Motiu: %2$s
+ %1$s ha tret el veto 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 l\'avatar de la sala
+ %1$s ha eliminat l\'avatar 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\'historial 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 l\'avatar de la sala
+ %1$s ha canviat l\'avatar de la sala
+ Has canviat el tema a: %1$s
+ Has eliminat el teu nom de visualització (era %1$s)
+ Has canviat el teu nom de visualització de %1$s a %2$s
+ Has canviat el teu nom de visualització a %1$s
+ Has canviat el teu avatar
+ Has retirat la invitació de %1$s
+ Has tret el veto 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.
+
\ No newline at end of file
diff --git a/matrix-sdk-android/src/main/res/values-es/strings.xml b/matrix-sdk-android/src/main/res/values-es/strings.xml
index e2d09c7857..3648ca3a72 100644
--- a/matrix-sdk-android/src/main/res/values-es/strings.xml
+++ b/matrix-sdk-android/src/main/res/values-es/strings.xml
@@ -1,9 +1,7 @@
-
+
-
%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
@@ -30,61 +28,44 @@
todos los miembros de la sala.todos.desconocido (%s).
- %1$s activó el cifrado de extremo a extremo (%2$s)
-
+ %1$s ha activado la encriptación de Extremo-a-Extremo (%2$s)%1$s solicitó una conferencia de vozIPconferencia de vozIP iniciadaconferencia 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 redactarNo es posible enviar el mensaje
-
No se pudo cargar la imagen
-
Error de redError de Matrix
-
-
-
-
Actualmente no es posible volver a unirse a una sala vacía.
-
- Mensaje cifrado
-
+ Mensaje encriptadoDirección de correo electrónicoNúmero telefónico
-
%1$s envió una pegatina.
-
Invitación de %sInvitación a Sala%1$s y %2$sSala vacía
-
%1$s y 1 otro%1$s y %2$d otros
-
-
Mensaje eliminadoMensaje eliminado por %1$sMensaje eliminado [motivo: %1$s]
@@ -98,10 +79,8 @@
\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
@@ -111,9 +90,7 @@
%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íaSincronización Inicial:
@@ -127,32 +104,25 @@
%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 habitación.
- %1$s ha quitado %2$s como alias de esta habitación.
+ %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 habitación
- Tu creaste la habitación
+ %1$s creó la sala
+ Creaste la salaInvitaste a %1$sTe uniste a la SalaDejaste la Sala
@@ -167,8 +137,8 @@
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 habitación
- Cambiaste el nombre de la habitación a: %1$s
+ Cambiaste el avatar de la sala
+ Cambiaste el nombre de la sala a: %1$sHiciste una videollamada.Hiciste una llamada de voz.%s envió datos para configurar la llamada.
@@ -176,40 +146,35 @@
Respondiste la llamada.Terminaste la llamada.Hiciste visible el futuro historial de la %1$s
- Activó el cifrado de un extremo a otro (%1$s)
- Has mejorado esta habitación.
-
+ Has activado la encriptación de Extremo-a-Extremo (%1$s)
+ Has actualizado esta sala.Solicitaste una conferencia de VoIPQuitaste el nombre de la salaQuitaste el tema de la sala
- %1$s eliminó el avatar de la habitación
- Quitaste el avatar de la habitación
+ %1$s eliminó el avatar de la sala
+ Quitaste el avatar de la salaActualizaste tu perfil %1$sEnviaste una invitación a %1$s para unirse a la salaRevocaste la invitación para que %1$s se una a la salaAceptaste la invitación para %1$s
-
%1$s agrego el widget %2$sAgregaste el widget %1$s%1$s eliminó el widget %2$sQuitaste el widget %1$s%1$s modifico el widget %2$sModificaste el widget %1$s
-
AdministradorModeradorPor defectoPersonalizado (%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
- "nvitaste a %1$s. Razón: %2$s"
- Te uniste a la habitación. Razón: %1$s
- Dejaste la habitació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$sRechazaste la invitación. Razón: %1$sPateaste a %1$s. Motivo: %2$sHas desactivado a %1$s. Motivo: %2$s
@@ -218,27 +183,42 @@
Revocaste la invitación para que %1$s se una a la sala. Motivo: %2$sAceptaste la invitación para %1$s. Motivo: %2$sRetiró 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 agregó %2$s y eliminó %3$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.
-
- Activó el cifrado de extremo a extremo.
- Activó el cifrado de un extremo a otro (algoritmo %1$s no reconocido).
-
-
+ 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-fa/strings.xml b/matrix-sdk-android/src/main/res/values-fa/strings.xml
index 042fda7ddd..11a786f5ac 100644
--- a/matrix-sdk-android/src/main/res/values-fa/strings.xml
+++ b/matrix-sdk-android/src/main/res/values-fa/strings.xml
@@ -181,8 +181,8 @@
نشانیهای %1$s را به این اتاق افزودید.
- نشانی %1$s ار از این اتاق برداشتید.
- نشانیهای %1$s ار از این اتاق برداشتید.
+ نشانی %1$s را از این اتاق برداشتید.
+ نشانیهای %1$s را از این اتاق برداشتید.نشانی %1$s ار افزوده و %2$s را از این اتاق برداشتید.نشانی اصلی این اتاق را به %1$s تنظیم کردید.
diff --git a/matrix-sdk-android/src/main/res/values-hu/strings.xml b/matrix-sdk-android/src/main/res/values-hu/strings.xml
index 4aade76c55..49238ee8ff 100644
--- a/matrix-sdk-android/src/main/res/values-hu/strings.xml
+++ b/matrix-sdk-android/src/main/res/values-hu/strings.xml
@@ -22,10 +22,10 @@
%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 számára
- az összes szobatag, onnantól, hogy meg lettek hívva.
- az összes szobatag, onnantól, hogy csatlakoztak.
- az összes szobatag.
+ %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)
@@ -139,4 +139,40 @@
Létrehoztad a szobátMatricá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
\ 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
index 366c743494..add19edfaf 100644
--- a/matrix-sdk-android/src/main/res/values-ja/strings.xml
+++ b/matrix-sdk-android/src/main/res/values-ja/strings.xml
@@ -1,10 +1,8 @@
-
+
-
%1$s: %2$s%1$sが画像を送信しました。%1$sがスタンプを送信しました。
-
%sの招待%1$sが%2$sを招待しました%1$sがあなたを招待しました
@@ -29,11 +27,9 @@
部屋への招待%1$sと%2$s空の部屋
-
%1$sと他%2$d名
-
%1$sは、今後の部屋履歴を%2$sに表示させました部屋のメンバー全員、招待された時点から。部屋のメンバー全員、参加した時点から。
@@ -41,34 +37,50 @@
誰でも。不明 (%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/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt
index 1c05a5d529..6b30700116 100644
--- a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt
+++ b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt
@@ -310,7 +310,10 @@ class UiAllScreensSanityTest {
clickOn(R.id.createChatRoomButton)
withIdlingResource(activityIdlingResource(CreateDirectRoomActivity::class.java)) {
- assertDisplayed(R.id.addByMatrixId)
+ onView(withId(R.id.userListRecyclerView))
+ .perform(waitForView(withText(R.string.qr_code)))
+ onView(withId(R.id.userListRecyclerView))
+ .perform(waitForView(withText(R.string.invite_friends)))
}
closeSoftKeyboard()
diff --git a/vector/src/debug/res/layout/activity_debug_menu.xml b/vector/src/debug/res/layout/activity_debug_menu.xml
index 458b44fd05..9a95085a07 100644
--- a/vector/src/debug/res/layout/activity_debug_menu.xml
+++ b/vector/src/debug/res/layout/activity_debug_menu.xml
@@ -72,7 +72,7 @@
android:id="@+id/debug_qr_code"
android:layout_width="200dp"
android:layout_height="200dp"
- tools:src="@tools:sample/avatars" />
+ tools:src="@drawable/ic_qr_code_add" />
diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml
index fb4764b3be..e9bd03cb4b 100644
--- a/vector/src/main/AndroidManifest.xml
+++ b/vector/src/main/AndroidManifest.xml
@@ -81,7 +81,8 @@
android:resource="@xml/shortcuts" />
-
+
-
+
-
@@ -229,6 +229,7 @@
+
diff --git a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
index acdad5407c..32c98922fb 100644
--- a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
+++ b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt
@@ -111,8 +111,8 @@ import im.vector.app.features.settings.threepids.ThreePidsSettingsFragment
import im.vector.app.features.share.IncomingShareFragment
import im.vector.app.features.signout.soft.SoftLogoutFragment
import im.vector.app.features.terms.ReviewTermsFragment
-import im.vector.app.features.userdirectory.KnownUsersFragment
-import im.vector.app.features.userdirectory.UserDirectoryFragment
+import im.vector.app.features.usercode.ShowUserCodeFragment
+import im.vector.app.features.userdirectory.UserListFragment
import im.vector.app.features.widgets.WidgetFragment
@Module
@@ -255,13 +255,8 @@ interface FragmentModule {
@Binds
@IntoMap
- @FragmentKey(UserDirectoryFragment::class)
- fun bindUserDirectoryFragment(fragment: UserDirectoryFragment): Fragment
-
- @Binds
- @IntoMap
- @FragmentKey(KnownUsersFragment::class)
- fun bindKnownUsersFragment(fragment: KnownUsersFragment): Fragment
+ @FragmentKey(UserListFragment::class)
+ fun bindUserListFragment(fragment: UserListFragment): Fragment
@Binds
@IntoMap
@@ -582,4 +577,9 @@ interface FragmentModule {
@IntoMap
@FragmentKey(SearchFragment::class)
fun bindSearchFragment(fragment: SearchFragment): Fragment
+
+ @Binds
+ @IntoMap
+ @FragmentKey(ShowUserCodeFragment::class)
+ fun bindShowUserCodeFragment(fragment: ShowUserCodeFragment): Fragment
}
diff --git a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt
index fde40f9195..818a32fca3 100644
--- a/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt
+++ b/vector/src/main/java/im/vector/app/core/di/ScreenComponent.kt
@@ -50,6 +50,7 @@ import im.vector.app.features.invite.InviteUsersToRoomActivity
import im.vector.app.features.invite.VectorInviteView
import im.vector.app.features.link.LinkHandlerActivity
import im.vector.app.features.login.LoginActivity
+import im.vector.app.features.matrixto.MatrixToBottomSheet
import im.vector.app.features.media.BigImageViewerActivity
import im.vector.app.features.media.VectorAttachmentViewerActivity
import im.vector.app.features.navigation.Navigator
@@ -72,6 +73,7 @@ import im.vector.app.features.share.IncomingShareActivity
import im.vector.app.features.signout.soft.SoftLogoutActivity
import im.vector.app.features.terms.ReviewTermsActivity
import im.vector.app.features.ui.UiStateRepository
+import im.vector.app.features.usercode.UserCodeActivity
import im.vector.app.features.widgets.WidgetActivity
import im.vector.app.features.widgets.permissions.RoomWidgetPermissionBottomSheet
import im.vector.app.features.workers.signout.SignOutBottomSheetDialogFragment
@@ -140,6 +142,7 @@ interface ScreenComponent {
fun inject(activity: VectorAttachmentViewerActivity)
fun inject(activity: VectorJitsiActivity)
fun inject(activity: SearchActivity)
+ fun inject(activity: UserCodeActivity)
/* ==========================================================================================
* BottomSheets
@@ -158,6 +161,7 @@ interface ScreenComponent {
fun inject(bottomSheet: RoomWidgetsBottomSheet)
fun inject(bottomSheet: CallControlsBottomSheet)
fun inject(bottomSheet: SignOutBottomSheetDialogFragment)
+ fun inject(bottomSheet: MatrixToBottomSheet)
/* ==========================================================================================
* Others
diff --git a/vector/src/main/java/im/vector/app/core/di/ViewModelModule.kt b/vector/src/main/java/im/vector/app/core/di/ViewModelModule.kt
index 836dab00c5..7ae8bc9c2e 100644
--- a/vector/src/main/java/im/vector/app/core/di/ViewModelModule.kt
+++ b/vector/src/main/java/im/vector/app/core/di/ViewModelModule.kt
@@ -35,7 +35,7 @@ import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedA
import im.vector.app.features.reactions.EmojiChooserViewModel
import im.vector.app.features.roomdirectory.RoomDirectorySharedActionViewModel
import im.vector.app.features.roomprofile.RoomProfileSharedActionViewModel
-import im.vector.app.features.userdirectory.UserDirectorySharedActionViewModel
+import im.vector.app.features.userdirectory.UserListSharedActionViewModel
@Module
interface ViewModelModule {
@@ -87,8 +87,8 @@ interface ViewModelModule {
@Binds
@IntoMap
- @ViewModelKey(UserDirectorySharedActionViewModel::class)
- fun bindUserDirectorySharedActionViewModel(viewModel: UserDirectorySharedActionViewModel): ViewModel
+ @ViewModelKey(UserListSharedActionViewModel::class)
+ fun bindUserListSharedActionViewModel(viewModel: UserListSharedActionViewModel): ViewModel
@Binds
@IntoMap
diff --git a/vector/src/main/java/im/vector/app/core/epoxy/CheckBoxItem.kt b/vector/src/main/java/im/vector/app/core/epoxy/CheckBoxItem.kt
new file mode 100644
index 0000000000..2f32fafa9e
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/core/epoxy/CheckBoxItem.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2020 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.epoxy
+
+import android.widget.CompoundButton
+import com.airbnb.epoxy.EpoxyAttribute
+import com.airbnb.epoxy.EpoxyModelClass
+import com.google.android.material.checkbox.MaterialCheckBox
+import im.vector.app.R
+
+@EpoxyModelClass(layout = R.layout.item_checkbox)
+abstract class CheckBoxItem : VectorEpoxyModel() {
+
+ @EpoxyAttribute
+ var checked: Boolean = false
+
+ @EpoxyAttribute lateinit var title: String
+
+ @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
+ var checkChangeListener: CompoundButton.OnCheckedChangeListener? = null
+
+ override fun bind(holder: Holder) {
+ super.bind(holder)
+ holder.checkbox.isChecked = checked
+ holder.checkbox.text = title
+ holder.checkbox.setOnCheckedChangeListener(checkChangeListener)
+ }
+
+ class Holder : VectorEpoxyHolder() {
+ val checkbox by bind(R.id.checkbox)
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/core/extensions/EditText.kt b/vector/src/main/java/im/vector/app/core/extensions/EditText.kt
index 355dd8442f..05b70def3d 100644
--- a/vector/src/main/java/im/vector/app/core/extensions/EditText.kt
+++ b/vector/src/main/java/im/vector/app/core/extensions/EditText.kt
@@ -26,7 +26,7 @@ import androidx.annotation.DrawableRes
import im.vector.app.R
import im.vector.app.core.platform.SimpleTextWatcher
-fun EditText.setupAsSearch(@DrawableRes searchIconRes: Int = R.drawable.ic_filter,
+fun EditText.setupAsSearch(@DrawableRes searchIconRes: Int = R.drawable.ic_search,
@DrawableRes clearIconRes: Int = R.drawable.ic_x_gray) {
addTextChangedListener(object : SimpleTextWatcher() {
override fun afterTextChanged(s: Editable) {
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 79021902c4..f58f0b87ae 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
@@ -587,6 +587,16 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector {
}
}
+ fun showSnackbar(message: String, @StringRes withActionTitle: Int?, action: (() -> Unit)?) {
+ coordinatorLayout?.let {
+ Snackbar.make(it, message, Snackbar.LENGTH_LONG).apply {
+ withActionTitle?.let {
+ setAction(withActionTitle, { action?.invoke() })
+ }
+ }.show()
+ }
+ }
+
/* ==========================================================================================
* User Consent
* ========================================================================================== */
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 ff1055fa44..4c6aa51348 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
@@ -29,6 +29,7 @@ import android.os.Build
import android.os.Environment
import android.provider.Browser
import android.provider.MediaStore
+import android.provider.Settings
import android.webkit.MimeTypeMap
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
@@ -448,6 +449,19 @@ fun openPlayStore(activity: Activity, appId: String = BuildConfig.APPLICATION_ID
}
}
+fun openAppSettingsPage(activity: Activity) {
+ try {
+ activity.startActivity(
+ Intent().apply {
+ action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
+ addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ data = Uri.fromParts("package", activity.packageName, null)
+ })
+ } catch (activityNotFoundException: ActivityNotFoundException) {
+ activity.toast(R.string.error_no_external_application_found)
+ }
+}
+
/**
* Ask the user to select a location and a file name to write in
*/
diff --git a/vector/src/main/java/im/vector/app/core/utils/PermissionsTools.kt b/vector/src/main/java/im/vector/app/core/utils/PermissionsTools.kt
index 44fc6afa4e..606321fff2 100644
--- a/vector/src/main/java/im/vector/app/core/utils/PermissionsTools.kt
+++ b/vector/src/main/java/im/vector/app/core/utils/PermissionsTools.kt
@@ -30,6 +30,7 @@ import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import im.vector.app.R
+import im.vector.app.core.platform.VectorBaseActivity
import timber.log.Timber
// Android M permission request code management
@@ -284,6 +285,12 @@ private fun checkPermissions(permissionsToBeGrantedBitMap: Int,
return isPermissionGranted
}
+fun VectorBaseActivity.onPermissionDeniedSnackbar(@StringRes rationaleMessage: Int) {
+ showSnackbar(getString(rationaleMessage), R.string.settings) {
+ openAppSettingsPage(this)
+ }
+}
+
/**
* Helper method used in [.checkPermissions] to populate the list of the
* permissions to be granted (permissionsListToBeGrantedOut) and the list of the permissions already denied (permissionAlreadyDeniedListOut).
diff --git a/vector/src/main/java/im/vector/app/core/utils/SystemUtils.kt b/vector/src/main/java/im/vector/app/core/utils/SystemUtils.kt
index d228adab12..2348b07c7b 100644
--- a/vector/src/main/java/im/vector/app/core/utils/SystemUtils.kt
+++ b/vector/src/main/java/im/vector/app/core/utils/SystemUtils.kt
@@ -136,13 +136,19 @@ fun startSharePlainTextIntent(fragment: Fragment,
activityResultLauncher: ActivityResultLauncher?,
chooserTitle: String?,
text: String,
- subject: String? = null) {
+ subject: String? = null,
+ extraTitle: String? = null) {
val share = Intent(Intent.ACTION_SEND)
share.type = "text/plain"
share.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
// Add data to the intent, the receiving app will decide what to do with it.
share.putExtra(Intent.EXTRA_SUBJECT, subject)
share.putExtra(Intent.EXTRA_TEXT, text)
+
+ extraTitle?.let {
+ share.putExtra(Intent.EXTRA_TITLE, it)
+ }
+
val intent = Intent.createChooser(share, chooserTitle)
try {
if (activityResultLauncher != null) {
diff --git a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt
index 23d21f5240..6c3ec06f75 100644
--- a/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/contactsbook/ContactsBookFragment.kt
@@ -30,10 +30,10 @@ import im.vector.app.core.extensions.configureWith
import im.vector.app.core.extensions.hideKeyboard
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.features.userdirectory.PendingInvitee
-import im.vector.app.features.userdirectory.UserDirectoryAction
-import im.vector.app.features.userdirectory.UserDirectorySharedAction
-import im.vector.app.features.userdirectory.UserDirectorySharedActionViewModel
-import im.vector.app.features.userdirectory.UserDirectoryViewModel
+import im.vector.app.features.userdirectory.UserListAction
+import im.vector.app.features.userdirectory.UserListSharedAction
+import im.vector.app.features.userdirectory.UserListSharedActionViewModel
+import im.vector.app.features.userdirectory.UserListViewModel
import kotlinx.android.synthetic.main.fragment_contacts_book.*
import org.matrix.android.sdk.api.session.identity.ThreePid
import org.matrix.android.sdk.api.session.user.model.User
@@ -46,16 +46,16 @@ class ContactsBookFragment @Inject constructor(
) : VectorBaseFragment(), ContactsBookController.Callback {
override fun getLayoutResId() = R.layout.fragment_contacts_book
- private val viewModel: UserDirectoryViewModel by activityViewModel()
+ private val viewModel: UserListViewModel by activityViewModel()
// Use activityViewModel to avoid loading several times the data
private val contactsBookViewModel: ContactsBookViewModel by activityViewModel()
- private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel
+ private lateinit var sharedActionViewModel: UserListSharedActionViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- sharedActionViewModel = activityViewModelProvider.get(UserDirectorySharedActionViewModel::class.java)
+ sharedActionViewModel = activityViewModelProvider.get(UserListSharedActionViewModel::class.java)
setupRecyclerView()
setupFilterView()
setupConsentView()
@@ -110,7 +110,7 @@ class ContactsBookFragment @Inject constructor(
private fun setupCloseView() {
phoneBookClose.debouncedClicks {
- sharedActionViewModel.post(UserDirectorySharedAction.GoBack)
+ sharedActionViewModel.post(UserListSharedAction.GoBack)
}
}
@@ -122,13 +122,13 @@ class ContactsBookFragment @Inject constructor(
override fun onMatrixIdClick(matrixId: String) {
view?.hideKeyboard()
- viewModel.handle(UserDirectoryAction.SelectPendingInvitee(PendingInvitee.UserPendingInvitee(User(matrixId))))
- sharedActionViewModel.post(UserDirectorySharedAction.GoBack)
+ viewModel.handle(UserListAction.SelectPendingInvitee(PendingInvitee.UserPendingInvitee(User(matrixId))))
+ sharedActionViewModel.post(UserListSharedAction.GoBack)
}
override fun onThreePidClick(threePid: ThreePid) {
view?.hideKeyboard()
- viewModel.handle(UserDirectoryAction.SelectPendingInvitee(PendingInvitee.ThreePidPendingInvitee(threePid)))
- sharedActionViewModel.post(UserDirectorySharedAction.GoBack)
+ viewModel.handle(UserListAction.SelectPendingInvitee(PendingInvitee.ThreePidPendingInvitee(threePid)))
+ sharedActionViewModel.post(UserListSharedAction.GoBack)
}
}
diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
index 10ab1673e4..6fafe0b977 100644
--- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomActivity.kt
@@ -37,28 +37,31 @@ import im.vector.app.core.extensions.exhaustive
import im.vector.app.core.platform.SimpleFragmentActivity
import im.vector.app.core.platform.WaitingViewData
import im.vector.app.core.utils.PERMISSIONS_FOR_MEMBERS_SEARCH
+import im.vector.app.core.utils.PERMISSIONS_FOR_TAKING_PHOTO
+import im.vector.app.core.utils.PERMISSION_REQUEST_CODE_LAUNCH_CAMERA
import im.vector.app.core.utils.PERMISSION_REQUEST_CODE_READ_CONTACTS
import im.vector.app.core.utils.allGranted
import im.vector.app.core.utils.checkPermissions
+import im.vector.app.core.utils.onPermissionDeniedSnackbar
import im.vector.app.features.contactsbook.ContactsBookFragment
import im.vector.app.features.contactsbook.ContactsBookViewModel
-import im.vector.app.features.userdirectory.KnownUsersFragment
-import im.vector.app.features.userdirectory.KnownUsersFragmentArgs
-import im.vector.app.features.userdirectory.UserDirectoryFragment
-import im.vector.app.features.userdirectory.UserDirectorySharedAction
-import im.vector.app.features.userdirectory.UserDirectorySharedActionViewModel
-import im.vector.app.features.userdirectory.UserDirectoryViewModel
+import im.vector.app.features.userdirectory.UserListFragment
+import im.vector.app.features.userdirectory.UserListFragmentArgs
+import im.vector.app.features.userdirectory.UserListSharedAction
+import im.vector.app.features.userdirectory.UserListSharedActionViewModel
+import im.vector.app.features.userdirectory.UserListViewModel
+import im.vector.app.features.userdirectory.UserListViewState
import kotlinx.android.synthetic.main.activity.*
import org.matrix.android.sdk.api.failure.Failure
import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure
import java.net.HttpURLConnection
import javax.inject.Inject
-class CreateDirectRoomActivity : SimpleFragmentActivity() {
+class CreateDirectRoomActivity : SimpleFragmentActivity(), UserListViewModel.Factory {
private val viewModel: CreateDirectRoomViewModel by viewModel()
- private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel
- @Inject lateinit var userDirectoryViewModelFactory: UserDirectoryViewModel.Factory
+ private lateinit var sharedActionViewModel: UserListSharedActionViewModel
+ @Inject lateinit var userListViewModelFactory: UserListViewModel.Factory
@Inject lateinit var createDirectRoomViewModelFactory: CreateDirectRoomViewModel.Factory
@Inject lateinit var contactsBookViewModelFactory: ContactsBookViewModel.Factory
@Inject lateinit var errorFormatter: ErrorFormatter
@@ -68,31 +71,34 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
injector.inject(this)
}
+ override fun create(initialState: UserListViewState): UserListViewModel {
+ return userListViewModelFactory.create(initialState)
+ }
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
toolbar.visibility = View.GONE
- sharedActionViewModel = viewModelProvider.get(UserDirectorySharedActionViewModel::class.java)
+
+ sharedActionViewModel = viewModelProvider.get(UserListSharedActionViewModel::class.java)
sharedActionViewModel
.observe()
- .subscribe { sharedAction ->
- when (sharedAction) {
- UserDirectorySharedAction.OpenUsersDirectory ->
- addFragmentToBackstack(R.id.container, UserDirectoryFragment::class.java)
- UserDirectorySharedAction.Close -> finish()
- UserDirectorySharedAction.GoBack -> onBackPressed()
- is UserDirectorySharedAction.OnMenuItemSelected -> onMenuItemSelected(sharedAction)
- UserDirectorySharedAction.OpenPhoneBook -> openPhoneBook()
+ .subscribe { action ->
+ when (action) {
+ UserListSharedAction.Close -> finish()
+ UserListSharedAction.GoBack -> onBackPressed()
+ is UserListSharedAction.OnMenuItemSelected -> onMenuItemSelected(action)
+ UserListSharedAction.OpenPhoneBook -> openPhoneBook()
+ UserListSharedAction.AddByQrCode -> openAddByQrCode()
}.exhaustive
}
.disposeOnDestroy()
if (isFirstCreation()) {
addFragment(
R.id.container,
- KnownUsersFragment::class.java,
- KnownUsersFragmentArgs(
+ UserListFragment::class.java,
+ UserListFragmentArgs(
title = getString(R.string.fab_menu_create_chat),
- menuResId = R.menu.vector_create_direct_room,
- isCreatingRoom = true
+ menuResId = R.menu.vector_create_direct_room
)
)
}
@@ -101,6 +107,12 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
}
}
+ private fun openAddByQrCode() {
+ if (checkPermissions(PERMISSIONS_FOR_TAKING_PHOTO, this, PERMISSION_REQUEST_CODE_LAUNCH_CAMERA, 0)) {
+ addFragment(R.id.container, CreateDirectRoomByQrCodeFragment::class.java)
+ }
+ }
+
private fun openPhoneBook() {
// Check permission first
if (checkPermissions(PERMISSIONS_FOR_MEMBERS_SEARCH,
@@ -116,15 +128,23 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
if (allGranted(grantResults)) {
if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) {
doOnPostResume { addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) }
+ } else if (requestCode == PERMISSION_REQUEST_CODE_LAUNCH_CAMERA) {
+ addFragment(R.id.container, CreateDirectRoomByQrCodeFragment::class.java)
+ }
+ } else {
+ if (requestCode == PERMISSION_REQUEST_CODE_LAUNCH_CAMERA) {
+ onPermissionDeniedSnackbar(R.string.permissions_denied_qr_code)
+ } else if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) {
+ onPermissionDeniedSnackbar(R.string.permissions_denied_add_contact)
}
}
}
- private fun onMenuItemSelected(action: UserDirectorySharedAction.OnMenuItemSelected) {
+ private fun onMenuItemSelected(action: UserListSharedAction.OnMenuItemSelected) {
if (action.itemId == R.id.action_create_direct_room) {
viewModel.handle(CreateDirectRoomAction.CreateRoomAndInviteSelectedUsers(
action.invitees,
- action.existingDmRoomId
+ null
))
}
}
@@ -178,6 +198,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
}
companion object {
+
fun getIntent(context: Context): Intent {
return Intent(context, CreateDirectRoomActivity::class.java)
}
diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomByQrCodeFragment.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomByQrCodeFragment.kt
new file mode 100644
index 0000000000..3fee3a3285
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomByQrCodeFragment.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2020 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.createdirect
+
+import android.widget.Toast
+import com.airbnb.mvrx.activityViewModel
+import com.google.zxing.Result
+import com.google.zxing.ResultMetadataType
+import im.vector.app.R
+import im.vector.app.core.extensions.hideKeyboard
+import im.vector.app.core.platform.VectorBaseFragment
+import im.vector.app.core.utils.PERMISSIONS_FOR_TAKING_PHOTO
+import im.vector.app.core.utils.checkPermissions
+import im.vector.app.core.utils.registerForPermissionsResult
+import im.vector.app.features.userdirectory.PendingInvitee
+import kotlinx.android.synthetic.main.fragment_qr_code_scanner.*
+import me.dm7.barcodescanner.zxing.ZXingScannerView
+import org.matrix.android.sdk.api.session.permalinks.PermalinkData
+import org.matrix.android.sdk.api.session.permalinks.PermalinkParser
+import org.matrix.android.sdk.api.session.user.model.User
+import javax.inject.Inject
+
+class CreateDirectRoomByQrCodeFragment @Inject constructor() : VectorBaseFragment(), ZXingScannerView.ResultHandler {
+
+ private val viewModel: CreateDirectRoomViewModel by activityViewModel()
+
+ override fun getLayoutResId() = R.layout.fragment_qr_code_scanner
+
+ private val openCameraActivityResultLauncher = registerForPermissionsResult { allGranted ->
+ if (allGranted) {
+ startCamera()
+ }
+ }
+
+ private fun startCamera() {
+ // Start camera on resume
+ scannerView.startCamera()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ view?.hideKeyboard()
+ // Register ourselves as a handler for scan results.
+ scannerView.setResultHandler(this)
+ // Start camera on resume
+ if (checkPermissions(PERMISSIONS_FOR_TAKING_PHOTO, requireActivity(), openCameraActivityResultLauncher)) {
+ startCamera()
+ }
+ }
+
+ override fun onPause() {
+ super.onPause()
+ // Unregister ourselves as a handler for scan results.
+ scannerView.setResultHandler(null)
+ // Stop camera on pause
+ scannerView.stopCamera()
+ }
+
+ // Copied from https://github.com/markusfisch/BinaryEye/blob/
+ // 9d57889b810dcaa1a91d7278fc45c262afba1284/app/src/main/kotlin/de/markusfisch/android/binaryeye/activity/CameraActivity.kt#L434
+ private fun getRawBytes(result: Result): ByteArray? {
+ val metadata = result.resultMetadata ?: return null
+ val segments = metadata[ResultMetadataType.BYTE_SEGMENTS] ?: return null
+ var bytes = ByteArray(0)
+ @Suppress("UNCHECKED_CAST")
+ for (seg in segments as Iterable) {
+ bytes += seg
+ }
+ // byte segments can never be shorter than the text.
+ // Zxing cuts off content prefixes like "WIFI:"
+ return if (bytes.size >= result.text.length) bytes else null
+ }
+
+ private fun addByQrCode(value: String) {
+ val mxid = (PermalinkParser.parse(value) as? PermalinkData.UserLink)?.userId
+
+ if (mxid === null) {
+ Toast.makeText(requireContext(), R.string.invalid_qr_code_uri, Toast.LENGTH_SHORT).show()
+ requireActivity().finish()
+ } else {
+ val existingDm = viewModel.session.getExistingDirectRoomWithUser(mxid)
+ // The following assumes MXIDs are case insensitive
+ if (mxid.equals(other = viewModel.session.myUserId, ignoreCase = true)) {
+ Toast.makeText(requireContext(), R.string.cannot_dm_self, Toast.LENGTH_SHORT).show()
+ requireActivity().finish()
+ } else {
+ // Try to get user from known users and fall back to creating a User object from MXID
+ val qrInvitee = if (viewModel.session.getUser(mxid) != null) viewModel.session.getUser(mxid)!! else User(mxid, null, null)
+
+ viewModel.handle(
+ CreateDirectRoomAction.CreateRoomAndInviteSelectedUsers(setOf(PendingInvitee.UserPendingInvitee(qrInvitee)), existingDm)
+ )
+ }
+ }
+ }
+
+ override fun handleResult(result: Result?) {
+ if (result === null) {
+ Toast.makeText(requireContext(), R.string.qr_code_not_scanned, Toast.LENGTH_SHORT).show()
+ requireActivity().finish()
+ } else {
+ val rawBytes = getRawBytes(result)
+ val rawBytesStr = rawBytes?.toString(Charsets.ISO_8859_1)
+ val value = rawBytesStr ?: result.text
+ addByQrCode(value)
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt
index be9449b77a..d074c93587 100644
--- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt
@@ -38,7 +38,7 @@ import org.matrix.android.sdk.rx.rx
class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted
initialState: CreateDirectRoomViewState,
private val rawService: RawService,
- private val session: Session)
+ val session: Session)
: VectorViewModel(initialState) {
@AssistedInject.Factory
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 32a4af1b1b..7dde0edf32 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
@@ -18,6 +18,7 @@ package im.vector.app.features.home
import android.content.Context
import android.content.Intent
+import android.net.Uri
import android.os.Bundle
import android.os.Parcelable
import android.view.MenuItem
@@ -38,8 +39,12 @@ import im.vector.app.core.extensions.replaceFragment
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.core.utils.toast
import im.vector.app.features.disclaimer.showDisclaimerDialog
+import im.vector.app.features.matrixto.MatrixToBottomSheet
import im.vector.app.features.notifications.NotificationDrawerManager
+import im.vector.app.features.permalink.NavigationInterceptor
+import im.vector.app.features.permalink.PermalinkHandler
import im.vector.app.features.popup.DefaultVectorAlert
import im.vector.app.features.popup.PopupAlertManager
import im.vector.app.features.popup.VerificationVectorAlert
@@ -50,10 +55,12 @@ import im.vector.app.features.themes.ThemeUtils
import im.vector.app.features.workers.signout.ServerBackupStatusViewModel
import im.vector.app.features.workers.signout.ServerBackupStatusViewState
import im.vector.app.push.fcm.FcmHelper
+import io.reactivex.android.schedulers.AndroidSchedulers
import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.activity_home.*
import kotlinx.android.synthetic.main.merge_overlay_waiting_view.*
import org.matrix.android.sdk.api.session.InitialSyncProgressService
+import org.matrix.android.sdk.api.session.permalinks.PermalinkService
import org.matrix.android.sdk.api.util.MatrixItem
import timber.log.Timber
import javax.inject.Inject
@@ -64,7 +71,8 @@ data class HomeActivityArgs(
val accountCreation: Boolean
) : Parcelable
-class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDetectorSharedViewModel.Factory, ServerBackupStatusViewModel.Factory {
+class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDetectorSharedViewModel.Factory, ServerBackupStatusViewModel.Factory,
+ NavigationInterceptor {
private lateinit var sharedActionViewModel: HomeSharedActionViewModel
@@ -82,6 +90,7 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDet
@Inject lateinit var popupAlertManager: PopupAlertManager
@Inject lateinit var shortcutsHandler: ShortcutsHandler
@Inject lateinit var unknownDeviceViewModelFactory: UnknownDeviceDetectorSharedViewModel.Factory
+ @Inject lateinit var permalinkHandler: PermalinkHandler
private val drawerListener = object : DrawerLayout.SimpleDrawerListener() {
override fun onDrawerStateChanged(newState: Int) {
@@ -145,6 +154,28 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDet
shortcutsHandler.observeRoomsAndBuildShortcuts()
.disposeOnDestroy()
+
+ if (isFirstCreation()) {
+ handleIntent(intent)
+ }
+ }
+
+ private fun handleIntent(intent: Intent?) {
+ intent?.dataString?.let { deepLink ->
+ if (!deepLink.startsWith(PermalinkService.MATRIX_TO_URL_BASE)) return@let
+
+ permalinkHandler.launch(this, deepLink,
+ navigationInterceptor = this,
+ buildTask = true)
+ // .delay(500, TimeUnit.MILLISECONDS)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe { isHandled ->
+ if (!isHandled) {
+ toast(R.string.permalink_malformed)
+ }
+ }
+ .disposeOnDestroy()
+ }
}
private fun renderState(state: HomeActivityViewState) {
@@ -270,6 +301,7 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDet
if (intent?.getParcelableExtra(MvRx.KEY_ARG)?.clearNotification == true) {
notificationDrawerManager.clearAllEvents()
}
+ handleIntent(intent)
}
override fun onDestroy() {
@@ -313,11 +345,11 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDet
bugReporter.openBugReportScreen(this, false)
return true
}
- R.id.menu_home_filter -> {
+ R.id.menu_home_filter -> {
navigator.openRoomsFiltering(this)
return true
}
- R.id.menu_home_setting -> {
+ R.id.menu_home_setting -> {
navigator.openSettings(this)
return true
}
@@ -334,6 +366,18 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDet
}
}
+ override fun navToMemberProfile(userId: String, deepLink: Uri): Boolean {
+ val listener = object : MatrixToBottomSheet.InteractionListener {
+ override fun navigateToRoom(roomId: String) {
+ navigator.openRoom(this@HomeActivity, roomId)
+ }
+ }
+ // TODO check if there is already one??
+ MatrixToBottomSheet.withLink(deepLink.toString(), listener)
+ .show(supportFragmentManager, "HA#MatrixToBottomSheet")
+ return true
+ }
+
companion object {
fun newIntent(context: Context, clearNotification: Boolean = false, accountCreation: Boolean = false): Intent {
val args = HomeActivityArgs(
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDrawerFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDrawerFragment.kt
index e267248fc3..1a60d8e219 100644
--- a/vector/src/main/java/im/vector/app/features/home/HomeDrawerFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/HomeDrawerFragment.kt
@@ -18,15 +18,19 @@ package im.vector.app.features.home
import android.os.Bundle
import android.view.View
+import androidx.core.app.ActivityOptionsCompat
+import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
import im.vector.app.BuildConfig
import im.vector.app.R
import im.vector.app.core.extensions.observeK
import im.vector.app.core.extensions.replaceChildFragment
import im.vector.app.core.platform.VectorBaseFragment
+import im.vector.app.core.utils.startSharePlainTextIntent
import im.vector.app.features.grouplist.GroupListFragment
import im.vector.app.features.settings.VectorPreferences
import im.vector.app.features.settings.VectorSettingsActivity
+import im.vector.app.features.usercode.UserCodeActivity
import im.vector.app.features.workers.signout.SignOutUiWorker
import kotlinx.android.synthetic.main.fragment_home_drawer.*
import org.matrix.android.sdk.api.session.Session
@@ -75,6 +79,32 @@ class HomeDrawerFragment @Inject constructor(
SignOutUiWorker(requireActivity()).perform()
}
+ homeDrawerQRCodeButton.debouncedClicks {
+ UserCodeActivity.newIntent(requireContext(), sharedActionViewModel.session.myUserId).let {
+ val options =
+ ActivityOptionsCompat.makeSceneTransitionAnimation(
+ requireActivity(),
+ homeDrawerHeaderAvatarView,
+ ViewCompat.getTransitionName(homeDrawerHeaderAvatarView) ?: ""
+ )
+ startActivity(it, options.toBundle())
+ }
+ }
+
+ homeDrawerInviteFriendButton.debouncedClicks {
+ session.permalinkService().createPermalink(sharedActionViewModel.session.myUserId)?.let { permalink ->
+ val text = getString(R.string.invite_friends_text, permalink)
+
+ startSharePlainTextIntent(
+ fragment = this,
+ activityResultLauncher = null,
+ chooserTitle = getString(R.string.invite_friends),
+ text = text,
+ extraTitle = getString(R.string.invite_friends_rich_title)
+ )
+ }
+ }
+
// Debug menu
homeDrawerHeaderDebugView.isVisible = BuildConfig.DEBUG && vectorPreferences.developerMode()
homeDrawerHeaderDebugView.debouncedClicks {
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeSharedActionViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeSharedActionViewModel.kt
index 58747a4c18..b695f48ee5 100644
--- a/vector/src/main/java/im/vector/app/features/home/HomeSharedActionViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/HomeSharedActionViewModel.kt
@@ -17,6 +17,7 @@
package im.vector.app.features.home
import im.vector.app.core.platform.VectorSharedActionViewModel
+import org.matrix.android.sdk.api.session.Session
import javax.inject.Inject
-class HomeSharedActionViewModel @Inject constructor() : VectorSharedActionViewModel()
+class HomeSharedActionViewModel @Inject constructor(val session: Session) : VectorSharedActionViewModel()
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 e289234e7a..3f5e476a5e 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
@@ -1460,7 +1460,7 @@ class RoomDetailFragment @Inject constructor(
return false
}
- override fun navToMemberProfile(userId: String): Boolean {
+ override fun navToMemberProfile(userId: String, deepLink: Uri): Boolean {
openRoomMemberProfile(userId)
return true
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/filtered/FilteredRoomFooterItem.kt b/vector/src/main/java/im/vector/app/features/home/room/filtered/FilteredRoomFooterItem.kt
index 0884844777..42bef2ddae 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/filtered/FilteredRoomFooterItem.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/filtered/FilteredRoomFooterItem.kt
@@ -22,7 +22,7 @@ import com.airbnb.epoxy.EpoxyModelClass
import im.vector.app.R
import im.vector.app.core.epoxy.VectorEpoxyHolder
import im.vector.app.core.epoxy.VectorEpoxyModel
-import im.vector.app.features.home.room.list.widget.FabMenuView
+import im.vector.app.features.home.room.list.widget.NotifsFabMenuView
@EpoxyModelClass(layout = R.layout.item_room_filter_footer)
abstract class FilteredRoomFooterItem : VectorEpoxyModel() {
@@ -46,7 +46,7 @@ abstract class FilteredRoomFooterItem : VectorEpoxyModel(R.id.roomFilterFooterOpenRoomDirectory)
}
- interface FilteredRoomFooterItemListener : FabMenuView.Listener {
+ interface FilteredRoomFooterItemListener : NotifsFabMenuView.Listener {
fun createRoom(initialName: String)
}
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
index c9c9011de4..b4f525c119 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
@@ -45,7 +45,7 @@ import im.vector.app.features.home.room.list.actions.RoomListActionsArgs
import im.vector.app.features.home.room.list.actions.RoomListQuickActionsBottomSheet
import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedAction
import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedActionViewModel
-import im.vector.app.features.home.room.list.widget.FabMenuView
+import im.vector.app.features.home.room.list.widget.NotifsFabMenuView
import im.vector.app.features.notifications.NotificationDrawerManager
import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.fragment_room_list.*
@@ -66,8 +66,7 @@ class RoomListFragment @Inject constructor(
val roomListViewModelFactory: RoomListViewModel.Factory,
private val notificationDrawerManager: NotificationDrawerManager,
private val sharedViewPool: RecyclerView.RecycledViewPool
-
-) : VectorBaseFragment(), RoomSummaryController.Listener, OnBackPressed, FabMenuView.Listener {
+) : VectorBaseFragment(), RoomSummaryController.Listener, OnBackPressed, NotifsFabMenuView.Listener {
private var modelBuildListener: OnModelBuildFinishedListener? = null
private lateinit var sharedActionViewModel: RoomListQuickActionsSharedActionViewModel
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/widget/FabMenuView.kt b/vector/src/main/java/im/vector/app/features/home/room/list/widget/NotifsFabMenuView.kt
similarity index 88%
rename from vector/src/main/java/im/vector/app/features/home/room/list/widget/FabMenuView.kt
rename to vector/src/main/java/im/vector/app/features/home/room/list/widget/NotifsFabMenuView.kt
index f9058840d2..7c96f40dbf 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/widget/FabMenuView.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/widget/NotifsFabMenuView.kt
@@ -22,15 +22,15 @@ import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.view.isVisible
import com.google.android.material.floatingactionbutton.FloatingActionButton
import im.vector.app.R
-import kotlinx.android.synthetic.main.motion_fab_menu_merge.view.*
+import kotlinx.android.synthetic.main.motion_notifs_fab_menu_merge.view.*
-class FabMenuView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null,
- defStyleAttr: Int = 0) : MotionLayout(context, attrs, defStyleAttr) {
+class NotifsFabMenuView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0) : MotionLayout(context, attrs, defStyleAttr) {
var listener: Listener? = null
init {
- inflate(context, R.layout.motion_fab_menu_merge, this)
+ inflate(context, R.layout.motion_notifs_fab_menu_merge, this)
}
override fun onFinishInflate() {
diff --git a/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewModel.kt b/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewModel.kt
index f6c60f6a6d..fe7a8006e0 100644
--- a/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewModel.kt
@@ -28,7 +28,7 @@ import im.vector.app.core.platform.EmptyViewEvents
import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.raw.wellknown.getElementWellknown
import im.vector.app.features.raw.wellknown.isE2EByDefault
-import im.vector.app.features.userdirectory.KnownUsersFragment
+import im.vector.app.features.userdirectory.UserListFragment
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.extensions.tryOrNull
@@ -50,7 +50,7 @@ class HomeServerCapabilitiesViewModel @AssistedInject constructor(
companion object : MvRxViewModelFactory {
@JvmStatic
override fun create(viewModelContext: ViewModelContext, state: HomeServerCapabilitiesViewState): HomeServerCapabilitiesViewModel? {
- val fragment: KnownUsersFragment = (viewModelContext as FragmentViewModelContext).fragment()
+ val fragment: UserListFragment = (viewModelContext as FragmentViewModelContext).fragment()
return fragment.homeServerCapabilitiesViewModelFactory.create(state)
}
diff --git a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt
index 087b7c2f55..65f547a662 100644
--- a/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/invite/InviteUsersToRoomActivity.kt
@@ -21,6 +21,7 @@ import android.content.Intent
import android.os.Bundle
import android.os.Parcelable
import android.view.View
+import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import com.airbnb.mvrx.MvRx
import com.airbnb.mvrx.viewModel
@@ -29,7 +30,6 @@ import im.vector.app.core.di.ScreenComponent
import im.vector.app.core.error.ErrorFormatter
import im.vector.app.core.extensions.addFragment
import im.vector.app.core.extensions.addFragmentToBackstack
-import im.vector.app.core.extensions.exhaustive
import im.vector.app.core.platform.SimpleFragmentActivity
import im.vector.app.core.platform.WaitingViewData
import im.vector.app.core.utils.PERMISSIONS_FOR_MEMBERS_SEARCH
@@ -39,12 +39,12 @@ import im.vector.app.core.utils.checkPermissions
import im.vector.app.core.utils.toast
import im.vector.app.features.contactsbook.ContactsBookFragment
import im.vector.app.features.contactsbook.ContactsBookViewModel
-import im.vector.app.features.userdirectory.KnownUsersFragment
-import im.vector.app.features.userdirectory.KnownUsersFragmentArgs
-import im.vector.app.features.userdirectory.UserDirectoryFragment
-import im.vector.app.features.userdirectory.UserDirectorySharedAction
-import im.vector.app.features.userdirectory.UserDirectorySharedActionViewModel
-import im.vector.app.features.userdirectory.UserDirectoryViewModel
+import im.vector.app.features.userdirectory.UserListFragment
+import im.vector.app.features.userdirectory.UserListFragmentArgs
+import im.vector.app.features.userdirectory.UserListSharedAction
+import im.vector.app.features.userdirectory.UserListSharedActionViewModel
+import im.vector.app.features.userdirectory.UserListViewModel
+import im.vector.app.features.userdirectory.UserListViewState
import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.activity.*
import org.matrix.android.sdk.api.failure.Failure
@@ -54,11 +54,11 @@ import javax.inject.Inject
@Parcelize
data class InviteUsersToRoomArgs(val roomId: String) : Parcelable
-class InviteUsersToRoomActivity : SimpleFragmentActivity() {
+class InviteUsersToRoomActivity : SimpleFragmentActivity(), UserListViewModel.Factory {
private val viewModel: InviteUsersToRoomViewModel by viewModel()
- private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel
- @Inject lateinit var userDirectoryViewModelFactory: UserDirectoryViewModel.Factory
+ private lateinit var sharedActionViewModel: UserListSharedActionViewModel
+ @Inject lateinit var userListViewModelFactory: UserListViewModel.Factory
@Inject lateinit var inviteUsersToRoomViewModelFactory: InviteUsersToRoomViewModel.Factory
@Inject lateinit var contactsBookViewModelFactory: ContactsBookViewModel.Factory
@Inject lateinit var errorFormatter: ErrorFormatter
@@ -68,32 +68,40 @@ class InviteUsersToRoomActivity : SimpleFragmentActivity() {
injector.inject(this)
}
+ override fun create(initialState: UserListViewState): UserListViewModel {
+ return userListViewModelFactory.create(initialState)
+ }
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
toolbar.visibility = View.GONE
- sharedActionViewModel = viewModelProvider.get(UserDirectorySharedActionViewModel::class.java)
+
+ sharedActionViewModel = viewModelProvider.get(UserListSharedActionViewModel::class.java)
sharedActionViewModel
.observe()
.subscribe { sharedAction ->
when (sharedAction) {
- UserDirectorySharedAction.OpenUsersDirectory ->
- addFragmentToBackstack(R.id.container, UserDirectoryFragment::class.java)
- UserDirectorySharedAction.Close -> finish()
- UserDirectorySharedAction.GoBack -> onBackPressed()
- is UserDirectorySharedAction.OnMenuItemSelected -> onMenuItemSelected(sharedAction)
- UserDirectorySharedAction.OpenPhoneBook -> openPhoneBook()
- }.exhaustive
+ UserListSharedAction.Close -> finish()
+ UserListSharedAction.GoBack -> onBackPressed()
+ is UserListSharedAction.OnMenuItemSelected -> onMenuItemSelected(sharedAction)
+ UserListSharedAction.OpenPhoneBook -> openPhoneBook()
+ // not exhaustive because it's a sharedAction
+ else -> {
+ }
+ }
}
.disposeOnDestroy()
if (isFirstCreation()) {
+ val args: InviteUsersToRoomArgs? = intent.extras?.getParcelable(MvRx.KEY_ARG)
addFragment(
R.id.container,
- KnownUsersFragment::class.java,
- KnownUsersFragmentArgs(
+ UserListFragment::class.java,
+ UserListFragmentArgs(
title = getString(R.string.invite_users_to_room_title),
menuResId = R.menu.vector_invite_users_to_room,
- excludedUserIds = viewModel.getUserIdsOfRoomMembers()
+ excludedUserIds = viewModel.getUserIdsOfRoomMembers(),
+ existingRoomId = args?.roomId
)
)
}
@@ -101,6 +109,12 @@ class InviteUsersToRoomActivity : SimpleFragmentActivity() {
viewModel.observeViewEvents { renderInviteEvents(it) }
}
+ private fun onMenuItemSelected(action: UserListSharedAction.OnMenuItemSelected) {
+ if (action.itemId == R.id.action_invite_users_to_room_invite) {
+ viewModel.handle(InviteUsersToRoomAction.InviteSelectedUsers(action.invitees))
+ }
+ }
+
private fun openPhoneBook() {
// Check permission first
if (checkPermissions(PERMISSIONS_FOR_MEMBERS_SEARCH,
@@ -117,12 +131,8 @@ class InviteUsersToRoomActivity : SimpleFragmentActivity() {
if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) {
doOnPostResume { addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java) }
}
- }
- }
-
- private fun onMenuItemSelected(action: UserDirectorySharedAction.OnMenuItemSelected) {
- if (action.itemId == R.id.action_invite_users_to_room_invite) {
- viewModel.handle(InviteUsersToRoomAction.InviteSelectedUsers(action.invitees))
+ } else {
+ Toast.makeText(baseContext, R.string.missing_permissions_error, Toast.LENGTH_SHORT).show()
}
}
diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToAction.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToAction.kt
new file mode 100644
index 0000000000..e1c6800494
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToAction.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2020 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.matrixto
+
+import im.vector.app.core.platform.VectorViewModelAction
+import org.matrix.android.sdk.api.util.MatrixItem
+
+sealed class MatrixToAction : VectorViewModelAction {
+ data class StartChattingWithUser(val matrixItem: MatrixItem) : MatrixToAction()
+}
diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt
new file mode 100644
index 0000000000..69f30bb470
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheet.kt
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2020 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.matrixto
+
+import android.os.Bundle
+import android.os.Parcelable
+import android.view.View
+import androidx.core.view.isInvisible
+import androidx.core.view.isVisible
+import com.airbnb.mvrx.Fail
+import com.airbnb.mvrx.Loading
+import com.airbnb.mvrx.MvRx
+import com.airbnb.mvrx.Success
+import com.airbnb.mvrx.Uninitialized
+import com.airbnb.mvrx.fragmentViewModel
+import com.airbnb.mvrx.withState
+import im.vector.app.R
+import im.vector.app.core.di.ScreenComponent
+import im.vector.app.core.extensions.setTextOrHide
+import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
+import im.vector.app.features.home.AvatarRenderer
+import kotlinx.android.parcel.Parcelize
+import kotlinx.android.synthetic.main.bottom_sheet_matrix_to_card.*
+import javax.inject.Inject
+
+class MatrixToBottomSheet : VectorBaseBottomSheetDialogFragment() {
+
+ @Parcelize
+ data class MatrixToArgs(
+ val matrixToLink: String
+ ) : Parcelable
+
+ @Inject lateinit var avatarRenderer: AvatarRenderer
+
+ @Inject
+ lateinit var matrixToBottomSheetViewModelFactory: MatrixToBottomSheetViewModel.Factory
+
+ override fun injectWith(injector: ScreenComponent) {
+ injector.inject(this)
+ }
+
+ private var interactionListener: InteractionListener? = null
+
+ override fun getLayoutResId() = R.layout.bottom_sheet_matrix_to_card
+
+ private val viewModel by fragmentViewModel(MatrixToBottomSheetViewModel::class)
+
+ interface InteractionListener {
+ fun navigateToRoom(roomId: String)
+ }
+
+ override fun invalidate() = withState(viewModel) { state ->
+ super.invalidate()
+ when (val item = state.matrixItem) {
+ Uninitialized -> {
+ matrixToCardContentLoading.isVisible = false
+ matrixToCardUserContentVisibility.isVisible = false
+ }
+ is Loading -> {
+ matrixToCardContentLoading.isVisible = true
+ matrixToCardUserContentVisibility.isVisible = false
+ }
+ is Success -> {
+ matrixToCardContentLoading.isVisible = false
+ matrixToCardUserContentVisibility.isVisible = true
+ matrixToCardNameText.setTextOrHide(item.invoke().displayName)
+ matrixToCardUserIdText.setTextOrHide(item.invoke().id)
+ avatarRenderer.render(item.invoke(), matrixToCardAvatar)
+ }
+ is Fail -> {
+ // TODO display some error copy?
+ dismiss()
+ }
+ }
+
+ when (state.startChattingState) {
+ Uninitialized -> {
+ matrixToCardButtonLoading.isVisible = false
+ matrixToCardSendMessageButton.isVisible = false
+ }
+ is Success -> {
+ matrixToCardButtonLoading.isVisible = false
+ matrixToCardSendMessageButton.isVisible = true
+ }
+ is Fail -> {
+ matrixToCardButtonLoading.isVisible = false
+ matrixToCardSendMessageButton.isVisible = true
+ // TODO display some error copy?
+ dismiss()
+ }
+ is Loading -> {
+ matrixToCardButtonLoading.isVisible = true
+ matrixToCardSendMessageButton.isInvisible = true
+ }
+ }
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ matrixToCardSendMessageButton.debouncedClicks {
+ withState(viewModel) {
+ it.matrixItem.invoke()?.let { item ->
+ viewModel.handle(MatrixToAction.StartChattingWithUser(item))
+ }
+ }
+ }
+
+ viewModel.observeViewEvents {
+ when (it) {
+ is MatrixToViewEvents.NavigateToRoom -> {
+ interactionListener?.navigateToRoom(it.roomId)
+ dismiss()
+ }
+ MatrixToViewEvents.Dismiss -> dismiss()
+ }
+ }
+ }
+
+ companion object {
+ fun withLink(matrixToLink: String, listener: InteractionListener?): MatrixToBottomSheet {
+ return MatrixToBottomSheet().apply {
+ arguments = Bundle().apply {
+ putParcelable(MvRx.KEY_ARG, MatrixToBottomSheet.MatrixToArgs(
+ matrixToLink = matrixToLink
+ ))
+ }
+ interactionListener = listener
+ }
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetState.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetState.kt
new file mode 100644
index 0000000000..9b1ce9fea8
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetState.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2020 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.matrixto
+
+import com.airbnb.mvrx.Async
+import com.airbnb.mvrx.MvRxState
+import com.airbnb.mvrx.Uninitialized
+import org.matrix.android.sdk.api.util.MatrixItem
+
+data class MatrixToBottomSheetState(
+ val deepLink: String,
+ val matrixItem: Async = Uninitialized,
+ val startChattingState: Async = Uninitialized
+) : MvRxState {
+
+ constructor(args: MatrixToBottomSheet.MatrixToArgs) : this(
+ deepLink = args.matrixToLink
+ )
+}
diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
new file mode 100644
index 0000000000..6e8a530c9a
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2020 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.matrixto
+
+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.Uninitialized
+import com.airbnb.mvrx.ViewModelContext
+import com.squareup.inject.assisted.Assisted
+import com.squareup.inject.assisted.AssistedInject
+import im.vector.app.R
+import im.vector.app.core.extensions.exhaustive
+import im.vector.app.core.platform.VectorViewModel
+import im.vector.app.core.resources.StringProvider
+import im.vector.app.features.raw.wellknown.getElementWellknown
+import im.vector.app.features.raw.wellknown.isE2EByDefault
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import org.matrix.android.sdk.api.extensions.tryOrNull
+import org.matrix.android.sdk.api.raw.RawService
+import org.matrix.android.sdk.api.session.Session
+import org.matrix.android.sdk.api.session.permalinks.PermalinkData
+import org.matrix.android.sdk.api.session.permalinks.PermalinkParser
+import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
+import org.matrix.android.sdk.api.session.user.model.User
+import org.matrix.android.sdk.api.util.toMatrixItem
+import org.matrix.android.sdk.internal.util.awaitCallback
+
+class MatrixToBottomSheetViewModel @AssistedInject constructor(
+ @Assisted initialState: MatrixToBottomSheetState,
+ private val session: Session,
+ private val stringProvider: StringProvider,
+ private val rawService: RawService) : VectorViewModel(initialState) {
+
+ @AssistedInject.Factory
+ interface Factory {
+ fun create(initialState: MatrixToBottomSheetState): MatrixToBottomSheetViewModel
+ }
+
+ init {
+ setState {
+ copy(matrixItem = Loading())
+ }
+ viewModelScope.launch(Dispatchers.IO) {
+ resolveLink(initialState)
+ }
+ }
+
+ private suspend fun resolveLink(initialState: MatrixToBottomSheetState) {
+ val permalinkData = PermalinkParser.parse(initialState.deepLink)
+ if (permalinkData is PermalinkData.FallbackLink) {
+ setState {
+ copy(
+ matrixItem = Fail(IllegalArgumentException(stringProvider.getString(R.string.permalink_malformed))),
+ startChattingState = Uninitialized
+ )
+ }
+ return
+ }
+
+ when (permalinkData) {
+ is PermalinkData.UserLink -> {
+ val user = resolveUser(permalinkData.userId)
+ setState {
+ copy(
+ matrixItem = Success(user.toMatrixItem()),
+ startChattingState = Success(Unit)
+ )
+ }
+ }
+ is PermalinkData.RoomLink -> {
+ // not yet supported
+ _viewEvents.post(MatrixToViewEvents.Dismiss)
+ }
+ is PermalinkData.GroupLink -> {
+ // not yet supported
+ _viewEvents.post(MatrixToViewEvents.Dismiss)
+ }
+ is PermalinkData.FallbackLink -> {
+ _viewEvents.post(MatrixToViewEvents.Dismiss)
+ }
+ }
+ }
+
+ private suspend fun resolveUser(userId: String): User {
+ return tryOrNull {
+ awaitCallback {
+ session.resolveUser(userId, it)
+ }
+ }
+ // Create raw user in case the user is not searchable
+ ?: User(userId, null, null)
+ }
+
+ companion object : MvRxViewModelFactory {
+ override fun create(viewModelContext: ViewModelContext, state: MatrixToBottomSheetState): MatrixToBottomSheetViewModel? {
+ val fragment: MatrixToBottomSheet = (viewModelContext as FragmentViewModelContext).fragment()
+
+ return fragment.matrixToBottomSheetViewModelFactory.create(state)
+ }
+ }
+
+ override fun handle(action: MatrixToAction) {
+ when (action) {
+ is MatrixToAction.StartChattingWithUser -> handleStartChatting(action)
+ }.exhaustive
+ }
+
+ private fun handleStartChatting(action: MatrixToAction.StartChattingWithUser) {
+ val mxId = action.matrixItem.id
+ val existing = session.getExistingDirectRoomWithUser(mxId)
+ if (existing != null) {
+ // navigate to this room
+ _viewEvents.post(MatrixToViewEvents.NavigateToRoom(existing))
+ } else {
+ setState {
+ copy(startChattingState = Loading())
+ }
+ // we should create the room then navigate
+ viewModelScope.launch(Dispatchers.IO) {
+ val adminE2EByDefault = rawService.getElementWellknown(session.myUserId)
+ ?.isE2EByDefault()
+ ?: true
+
+ val roomParams = CreateRoomParams()
+ .apply {
+ invitedUserIds.add(mxId)
+ setDirectMessage()
+ enableEncryptionIfInvitedUsersSupportIt = adminE2EByDefault
+ }
+
+ val roomId = try {
+ awaitCallback { session.createRoom(roomParams, it) }
+ } catch (failure: Throwable) {
+ setState {
+ copy(startChattingState = Fail(Exception(stringProvider.getString(R.string.invite_users_to_room_failure))))
+ }
+ return@launch
+ }
+ setState {
+ // we can hide this button has we will navigate out
+ copy(startChattingState = Uninitialized)
+ }
+ _viewEvents.post(MatrixToViewEvents.NavigateToRoom(roomId))
+ }
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToViewEvents.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToViewEvents.kt
new file mode 100644
index 0000000000..f9491fd361
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToViewEvents.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2020 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.matrixto
+
+import im.vector.app.core.platform.VectorViewEvents
+
+sealed class MatrixToViewEvents : VectorViewEvents {
+ data class NavigateToRoom(val roomId: String) : MatrixToViewEvents()
+ object Dismiss : MatrixToViewEvents()
+}
diff --git a/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandler.kt b/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandler.kt
index 11c55f6a73..f1149d8990 100644
--- a/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandler.kt
+++ b/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandler.kt
@@ -63,13 +63,14 @@ class PermalinkHandler @Inject constructor(private val activeSessionHolder: Acti
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.flatMap { permalinkData ->
- handlePermalink(permalinkData, context, navigationInterceptor, buildTask)
+ handlePermalink(permalinkData, deepLink, context, navigationInterceptor, buildTask)
}
.onErrorReturnItem(false)
}
private fun handlePermalink(
permalinkData: PermalinkData,
+ rawLink: Uri,
context: Context,
navigationInterceptor: NavigationInterceptor?,
buildTask: Boolean
@@ -96,7 +97,7 @@ class PermalinkHandler @Inject constructor(private val activeSessionHolder: Acti
Single.just(true)
}
is PermalinkData.UserLink -> {
- if (navigationInterceptor?.navToMemberProfile(permalinkData.userId) != true) {
+ if (navigationInterceptor?.navToMemberProfile(permalinkData.userId, rawLink) != true) {
navigator.openRoomMemberProfile(userId = permalinkData.userId, roomId = null, context = context, buildTask = buildTask)
}
Single.just(true)
@@ -175,7 +176,7 @@ interface NavigationInterceptor {
/**
* Return true if the navigation has been intercepted
*/
- fun navToMemberProfile(userId: String): Boolean {
+ fun navToMemberProfile(userId: String, deepLink: Uri): Boolean {
return false
}
}
diff --git a/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandlerActivity.kt b/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandlerActivity.kt
index e005dd06c5..e8064aaec5 100644
--- a/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandlerActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandlerActivity.kt
@@ -23,11 +23,9 @@ import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.di.ScreenComponent
import im.vector.app.core.extensions.replaceFragment
import im.vector.app.core.platform.VectorBaseActivity
-import im.vector.app.core.utils.toast
+import im.vector.app.features.home.HomeActivity
import im.vector.app.features.home.LoadingFragment
import im.vector.app.features.login.LoginActivity
-import io.reactivex.android.schedulers.AndroidSchedulers
-import java.util.concurrent.TimeUnit
import javax.inject.Inject
class PermalinkHandlerActivity : VectorBaseActivity() {
@@ -45,23 +43,28 @@ class PermalinkHandlerActivity : VectorBaseActivity() {
if (isFirstCreation()) {
replaceFragment(R.id.simpleFragmentContainer, LoadingFragment::class.java)
}
+ handleIntent()
+ }
+
+ private fun handleIntent() {
// If we are not logged in, open login screen.
// In the future, we might want to relaunch the process after login.
if (!sessionHolder.hasActiveSession()) {
startLoginActivity()
return
}
- val uri = intent.dataString
- permalinkHandler.launch(this, uri, buildTask = true)
- .delay(500, TimeUnit.MILLISECONDS)
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe { isHandled ->
- if (!isHandled) {
- toast(R.string.permalink_malformed)
- }
- finish()
- }
- .disposeOnDestroy()
+ // We forward intent to HomeActivity (singleTask) to avoid the dueling app problem
+ // https://stackoverflow.com/questions/25884954/deep-linking-and-multiple-app-instances
+ intent.setClass(this, HomeActivity::class.java)
+ intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
+ startActivity(intent)
+
+ finish()
+ }
+
+ override fun onNewIntent(intent: Intent?) {
+ super.onNewIntent(intent)
+ handleIntent()
}
private fun startLoginActivity() {
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 42b17b4dad..c58e255bcc 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
@@ -204,9 +204,9 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState:
Timber.w("Try to join an already joining room. Should not happen")
return@withState
}
- val viaServers = state.roomDirectoryData.homeServer?.let {
- listOf(it)
- } ?: emptyList()
+ val viaServers = state.roomDirectoryData.homeServer
+ ?.let { listOf(it) }
+ .orEmpty()
session.joinRoom(action.roomId, viaServers = viaServers, callback = object : MatrixCallback {
override fun onSuccess(data: Unit) {
// We do not update the joiningRoomsIds here, because, the room is not joined yet regarding the sync data.
diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryItem.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryItem.kt
index 8f57acee47..7b2e329b6a 100644
--- a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryItem.kt
+++ b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryItem.kt
@@ -62,7 +62,7 @@ abstract class RoomDirectoryItem : VectorEpoxyModel()
holder.avatarView.isInvisible = directoryAvatarUrl.isNullOrBlank() && includeAllNetworks
holder.nameView.text = directoryName
- holder.descritionView.setTextOrHide(directoryDescription)
+ holder.descriptionView.setTextOrHide(directoryDescription)
}
class Holder : VectorEpoxyHolder() {
@@ -70,6 +70,6 @@ abstract class RoomDirectoryItem : VectorEpoxyModel()
val avatarView by bind(R.id.itemRoomDirectoryAvatar)
val nameView by bind(R.id.itemRoomDirectoryName)
- val descritionView by bind(R.id.itemRoomDirectoryDescription)
+ val descriptionView by bind(R.id.itemRoomDirectoryDescription)
}
}
diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt
index 2e91091443..e29c197ab8 100644
--- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt
+++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt
@@ -79,6 +79,17 @@ class RoomMemberProfileController @Inject constructor(
divider = false,
action = { callback?.onIgnoreClicked() }
)
+ if (!state.isMine) {
+ buildProfileSection(stringProvider.getString(R.string.room_profile_section_more))
+
+ buildProfileAction(
+ id = "direct",
+ editable = false,
+ title = stringProvider.getString(R.string.room_member_open_or_create_dm),
+ dividerColor = dividerColor,
+ action = { callback?.onOpenDmClicked() }
+ )
+ }
}
private fun buildRoomMemberActions(state: RoomMemberProfileViewState) {
diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
index d60b5580fa..e994a3c3ec 100644
--- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileFragment.kt
@@ -294,12 +294,20 @@ class RoomMemberProfileFragment @Inject constructor(
}
private fun handleShareRoomMemberProfile(permalink: String) {
- startSharePlainTextIntent(
- fragment = this,
- activityResultLauncher = null,
- chooserTitle = null,
- text = permalink
- )
+ val view = layoutInflater.inflate(R.layout.dialog_share_qr_code, null)
+ val qrCode = view.findViewById(R.id.itemShareQrCodeImage)
+ qrCode.setData(permalink)
+ AlertDialog.Builder(requireContext())
+ .setView(view)
+ .setNeutralButton(R.string.ok, null)
+ .setPositiveButton(R.string.share_by_text) { _, _ ->
+ startSharePlainTextIntent(
+ fragment = this,
+ activityResultLauncher = null,
+ chooserTitle = null,
+ text = permalink
+ )
+ }.show()
}
private fun onAvatarClicked(view: View, userMatrixItem: MatrixItem) {
diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsHelpAboutFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsHelpAboutFragment.kt
index 861e0dea1f..c9160b8ebc 100644
--- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsHelpAboutFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsHelpAboutFragment.kt
@@ -16,15 +16,13 @@
package im.vector.app.features.settings
-import android.content.Intent
-import android.net.Uri
-import android.provider.Settings
import androidx.preference.Preference
import im.vector.app.BuildConfig
import im.vector.app.R
import im.vector.app.core.preference.VectorPreference
import im.vector.app.core.utils.copyToClipboard
import im.vector.app.core.utils.displayInWebView
+import im.vector.app.core.utils.openAppSettingsPage
import im.vector.app.core.utils.openUrlInChromeCustomTab
import im.vector.app.features.version.VersionProvider
import im.vector.app.openOssLicensesMenuActivity
@@ -42,18 +40,7 @@ class VectorSettingsHelpAboutFragment @Inject constructor(
// preference to start the App info screen, to facilitate App permissions access
findPreference(APP_INFO_LINK_PREFERENCE_KEY)!!
.onPreferenceClickListener = Preference.OnPreferenceClickListener {
- activity?.let {
- val intent = Intent().apply {
- action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
- addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
-
- val uri = Uri.fromParts("package", requireContext().packageName, null)
-
- data = uri
- }
- it.applicationContext.startActivity(intent)
- }
-
+ activity?.let { openAppSettingsPage(it) }
true
}
diff --git a/vector/src/main/java/im/vector/app/features/usercode/QRCodeBitmapDecodeHelper.kt b/vector/src/main/java/im/vector/app/features/usercode/QRCodeBitmapDecodeHelper.kt
new file mode 100644
index 0000000000..178a283d2c
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/usercode/QRCodeBitmapDecodeHelper.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2020 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.usercode
+
+import android.graphics.Bitmap
+import com.google.zxing.BarcodeFormat
+import com.google.zxing.BinaryBitmap
+import com.google.zxing.DecodeHintType
+import com.google.zxing.LuminanceSource
+import com.google.zxing.MultiFormatReader
+import com.google.zxing.RGBLuminanceSource
+import com.google.zxing.ReaderException
+import com.google.zxing.Result
+import com.google.zxing.common.HybridBinarizer
+
+// Some helper code from BinaryEye
+object QRCodeBitmapDecodeHelper {
+
+ private val multiFormatReader = MultiFormatReader()
+ private val decoderHints = mapOf(DecodeHintType.POSSIBLE_FORMATS to listOf(BarcodeFormat.QR_CODE))
+
+ fun decodeQRFromBitmap(bitmap: Bitmap): Result? =
+ decode(bitmap, false) ?: decode(bitmap, true)
+
+ private fun decode(bitmap: Bitmap, invert: Boolean = false): Result? {
+ val pixels = IntArray(bitmap.width * bitmap.height)
+ return decode(pixels, bitmap, invert)
+ }
+
+ private fun decode(
+ pixels: IntArray,
+ bitmap: Bitmap,
+ invert: Boolean = false
+ ): Result? {
+ val width = bitmap.width
+ val height = bitmap.height
+ if (bitmap.config != Bitmap.Config.ARGB_8888) {
+ bitmap.copy(Bitmap.Config.ARGB_8888, true)
+ } else {
+ bitmap
+ }.getPixels(pixels, 0, width, 0, 0, width, height)
+ return decodeLuminanceSource(
+ RGBLuminanceSource(width, height, pixels),
+ invert
+ )
+ }
+
+ private fun decodeLuminanceSource(
+ source: LuminanceSource,
+ invert: Boolean
+ ): Result? {
+ return decodeLuminanceSource(
+ if (invert) {
+ source.invert()
+ } else {
+ source
+ }
+ )
+ }
+
+ private fun decodeLuminanceSource(source: LuminanceSource): Result? {
+ val bitmap = BinaryBitmap(HybridBinarizer(source))
+ return try {
+ multiFormatReader.decode(bitmap, decoderHints)
+ } catch (e: ReaderException) {
+ null
+ } finally {
+ multiFormatReader.reset()
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/usercode/ScanUserCodeFragment.kt b/vector/src/main/java/im/vector/app/features/usercode/ScanUserCodeFragment.kt
new file mode 100644
index 0000000000..782d7e1c04
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/usercode/ScanUserCodeFragment.kt
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2020 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.usercode
+
+import android.Manifest
+import android.app.Activity
+import android.content.pm.PackageManager
+import android.os.Bundle
+import android.view.View
+import android.widget.Toast
+import androidx.core.content.ContextCompat
+import com.airbnb.mvrx.activityViewModel
+import com.google.zxing.Result
+import com.google.zxing.ResultMetadataType
+import im.vector.app.R
+import im.vector.app.core.extensions.registerStartForActivityResult
+import im.vector.app.core.platform.VectorBaseFragment
+import im.vector.app.core.utils.PERMISSIONS_FOR_TAKING_PHOTO
+import im.vector.app.core.utils.checkPermissions
+import im.vector.app.core.utils.registerForPermissionsResult
+import im.vector.lib.multipicker.MultiPicker
+import im.vector.lib.multipicker.utils.ImageUtils
+import kotlinx.android.synthetic.main.fragment_qr_code_scanner_with_button.*
+import me.dm7.barcodescanner.zxing.ZXingScannerView
+import org.matrix.android.sdk.api.extensions.tryOrNull
+import javax.inject.Inject
+
+class ScanUserCodeFragment @Inject constructor()
+ : VectorBaseFragment(),
+ ZXingScannerView.ResultHandler {
+
+ override fun getLayoutResId() = R.layout.fragment_qr_code_scanner_with_button
+
+ val sharedViewModel: UserCodeSharedViewModel by activityViewModel()
+
+ var autoFocus = true
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ userCodeMyCodeButton.debouncedClicks {
+ sharedViewModel.handle(UserCodeActions.SwitchMode(UserCodeState.Mode.SHOW))
+ }
+
+ userCodeOpenGalleryButton.debouncedClicks {
+ MultiPicker.get(MultiPicker.IMAGE).single().startWith(pickImageActivityResultLauncher)
+ }
+ }
+
+ private val openCameraActivityResultLauncher = registerForPermissionsResult { allGranted ->
+ if (allGranted) {
+ startCamera()
+ } else {
+ // For now just go back
+ sharedViewModel.handle(UserCodeActions.SwitchMode(UserCodeState.Mode.SHOW))
+ }
+ }
+
+ private val pickImageActivityResultLauncher = registerStartForActivityResult { activityResult ->
+ if (activityResult.resultCode == Activity.RESULT_OK) {
+ MultiPicker
+ .get(MultiPicker.IMAGE)
+ .getSelectedFiles(requireActivity(), activityResult.data)
+ .firstOrNull()
+ ?.contentUri
+ ?.let { uri ->
+ // try to see if it is a valid matrix code
+ val bitmap = ImageUtils.getBitmap(requireContext(), uri)
+ ?: return@let Unit.also {
+ Toast.makeText(requireContext(), getString(R.string.qr_code_not_scanned), Toast.LENGTH_SHORT).show()
+ }
+ handleResult(tryOrNull { QRCodeBitmapDecodeHelper.decodeQRFromBitmap(bitmap) })
+ }
+ }
+ }
+
+ private fun startCamera() {
+ userCodeScannerView.startCamera()
+ userCodeScannerView.setAutoFocus(autoFocus)
+ userCodeScannerView.debouncedClicks {
+ this.autoFocus = !autoFocus
+ userCodeScannerView.setAutoFocus(autoFocus)
+ }
+ }
+
+ override fun onStart() {
+ super.onStart()
+ if (checkPermissions(PERMISSIONS_FOR_TAKING_PHOTO, requireActivity(), openCameraActivityResultLauncher)) {
+ startCamera()
+ }
+ }
+
+ override fun onResume() {
+ super.onResume()
+ // Register ourselves as a handler for scan results.
+ userCodeScannerView.setResultHandler(this)
+ if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA)) {
+ startCamera()
+ }
+ }
+
+ override fun onPause() {
+ super.onPause()
+ userCodeScannerView.setResultHandler(null)
+ // Stop camera on pause
+ userCodeScannerView.stopCamera()
+ }
+
+ override fun handleResult(result: Result?) {
+ if (result === null) {
+ Toast.makeText(requireContext(), R.string.qr_code_not_scanned, Toast.LENGTH_SHORT).show()
+ requireActivity().finish()
+ } else {
+ val rawBytes = getRawBytes(result)
+ val rawBytesStr = rawBytes?.toString(Charsets.ISO_8859_1)
+ val value = rawBytesStr ?: result.text
+ sharedViewModel.handle(UserCodeActions.DecodedQRCode(value))
+ }
+ }
+
+ // Copied from https://github.com/markusfisch/BinaryEye/blob/
+ // 9d57889b810dcaa1a91d7278fc45c262afba1284/app/src/main/kotlin/de/markusfisch/android/binaryeye/activity/CameraActivity.kt#L434
+ private fun getRawBytes(result: Result): ByteArray? {
+ val metadata = result.resultMetadata ?: return null
+ val segments = metadata[ResultMetadataType.BYTE_SEGMENTS] ?: return null
+ var bytes = ByteArray(0)
+ @Suppress("UNCHECKED_CAST")
+ for (seg in segments as Iterable) {
+ bytes += seg
+ }
+ // byte segments can never be shorter than the text.
+ // Zxing cuts off content prefixes like "WIFI:"
+ return if (bytes.size >= result.text.length) bytes else null
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/usercode/ShowUserCodeFragment.kt b/vector/src/main/java/im/vector/app/features/usercode/ShowUserCodeFragment.kt
new file mode 100644
index 0000000000..db6d636b9a
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/usercode/ShowUserCodeFragment.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2020 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.usercode
+
+import android.os.Bundle
+import android.view.View
+import com.airbnb.mvrx.activityViewModel
+import com.airbnb.mvrx.withState
+import im.vector.app.R
+import im.vector.app.core.extensions.setTextOrHide
+import im.vector.app.core.platform.VectorBaseFragment
+import im.vector.app.core.utils.PERMISSIONS_FOR_TAKING_PHOTO
+import im.vector.app.core.utils.checkPermissions
+import im.vector.app.core.utils.registerForPermissionsResult
+import im.vector.app.core.utils.startSharePlainTextIntent
+import im.vector.app.features.home.AvatarRenderer
+import kotlinx.android.synthetic.main.fragment_user_code_show.*
+import javax.inject.Inject
+
+class ShowUserCodeFragment @Inject constructor(
+ private val avatarRenderer: AvatarRenderer
+) : VectorBaseFragment() {
+
+ override fun getLayoutResId() = R.layout.fragment_user_code_show
+
+ val sharedViewModel: UserCodeSharedViewModel by activityViewModel()
+
+ private val openCameraActivityResultLauncher = registerForPermissionsResult { allGranted ->
+ if (allGranted) {
+ doOpenQRCodeScanner()
+ } else {
+ sharedViewModel.handle(UserCodeActions.CameraPermissionNotGranted)
+ }
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ showUserCodeClose.debouncedClicks {
+ sharedViewModel.handle(UserCodeActions.DismissAction)
+ }
+ showUserCodeScanButton.debouncedClicks {
+ if (checkPermissions(PERMISSIONS_FOR_TAKING_PHOTO, requireActivity(), openCameraActivityResultLauncher)) {
+ doOpenQRCodeScanner()
+ }
+ }
+ showUserCodeShareButton.debouncedClicks {
+ sharedViewModel.handle(UserCodeActions.ShareByText)
+ }
+
+ sharedViewModel.observeViewEvents {
+ if (it is UserCodeShareViewEvents.SharePlainText) {
+ startSharePlainTextIntent(
+ fragment = this,
+ activityResultLauncher = null,
+ chooserTitle = it.title,
+ text = it.text,
+ extraTitle = it.richPlainText
+ )
+ }
+ }
+ }
+
+ private fun doOpenQRCodeScanner() {
+ sharedViewModel.handle(UserCodeActions.SwitchMode(UserCodeState.Mode.SCAN))
+ }
+
+ override fun invalidate() = withState(sharedViewModel) { state ->
+ state.matrixItem?.let { avatarRenderer.render(it, showUserCodeAvatar) }
+ state.shareLink?.let { showUserCodeQRImage.setData(it) }
+ showUserCodeCardNameText.setTextOrHide(state.matrixItem?.displayName)
+ showUserCodeCardUserIdText.setTextOrHide(state.matrixItem?.id)
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeActions.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeActions.kt
new file mode 100644
index 0000000000..3411fe3d7f
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeActions.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2020 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.usercode
+
+import im.vector.app.core.platform.VectorViewModelAction
+import org.matrix.android.sdk.api.util.MatrixItem
+
+sealed class UserCodeActions : VectorViewModelAction {
+ object DismissAction : UserCodeActions()
+ data class SwitchMode(val mode: UserCodeState.Mode) : UserCodeActions()
+ data class DecodedQRCode(val code: String) : UserCodeActions()
+ data class StartChattingWithUser(val matrixItem: MatrixItem) : UserCodeActions()
+ object CameraPermissionNotGranted : UserCodeActions()
+ object ShareByText : UserCodeActions()
+}
diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt
new file mode 100644
index 0000000000..547e2d939f
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeActivity.kt
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2020 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.usercode
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.os.Parcelable
+import android.widget.Toast
+import androidx.core.app.ActivityCompat
+import androidx.core.view.isVisible
+import androidx.fragment.app.Fragment
+import com.airbnb.mvrx.MvRx
+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.extensions.commitTransaction
+import im.vector.app.core.extensions.exhaustive
+import im.vector.app.core.platform.VectorBaseActivity
+import im.vector.app.core.utils.onPermissionDeniedSnackbar
+import im.vector.app.features.matrixto.MatrixToBottomSheet
+import kotlinx.android.parcel.Parcelize
+import kotlinx.android.synthetic.main.activity_simple.*
+import javax.inject.Inject
+import kotlin.reflect.KClass
+
+class UserCodeActivity
+ : VectorBaseActivity(), UserCodeSharedViewModel.Factory, MatrixToBottomSheet.InteractionListener {
+
+ @Inject lateinit var viewModelFactory: UserCodeSharedViewModel.Factory
+
+ val sharedViewModel: UserCodeSharedViewModel by viewModel()
+
+ @Parcelize
+ data class Args(
+ val userId: String
+ ) : Parcelable
+
+ override fun getLayoutRes() = R.layout.activity_simple
+
+ override fun injectWith(injector: ScreenComponent) {
+ injector.inject(this)
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ if (isFirstCreation()) {
+ // should be there early for shared element transition
+ showFragment(ShowUserCodeFragment::class, Bundle.EMPTY)
+ }
+
+ sharedViewModel.selectSubscribe(this, UserCodeState::mode) { mode ->
+ when (mode) {
+ UserCodeState.Mode.SHOW -> showFragment(ShowUserCodeFragment::class, Bundle.EMPTY)
+ UserCodeState.Mode.SCAN -> showFragment(ScanUserCodeFragment::class, Bundle.EMPTY)
+ is UserCodeState.Mode.RESULT -> {
+ showFragment(ShowUserCodeFragment::class, Bundle.EMPTY)
+ MatrixToBottomSheet.withLink(mode.rawLink, this).show(supportFragmentManager, "MatrixToBottomSheet")
+ }
+ }
+ }
+
+ sharedViewModel.observeViewEvents {
+ when (it) {
+ UserCodeShareViewEvents.Dismiss -> ActivityCompat.finishAfterTransition(this)
+ UserCodeShareViewEvents.ShowWaitingScreen -> simpleActivityWaitingView.isVisible = true
+ UserCodeShareViewEvents.HideWaitingScreen -> simpleActivityWaitingView.isVisible = false
+ is UserCodeShareViewEvents.ToastMessage -> Toast.makeText(this, it.message, Toast.LENGTH_LONG).show()
+ is UserCodeShareViewEvents.NavigateToRoom -> navigator.openRoom(this, it.roomId)
+ UserCodeShareViewEvents.CameraPermissionNotGranted -> onPermissionDeniedSnackbar(R.string.permissions_denied_qr_code)
+ else -> {
+ }
+ }
+ }
+ }
+
+ private fun showFragment(fragmentClass: KClass, bundle: Bundle) {
+ if (supportFragmentManager.findFragmentByTag(fragmentClass.simpleName) == null) {
+ supportFragmentManager.commitTransaction {
+ setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out)
+ replace(R.id.simpleFragmentContainer,
+ fragmentClass.java,
+ bundle,
+ fragmentClass.simpleName
+ )
+ }
+ }
+ }
+
+ override fun navigateToRoom(roomId: String) {
+ navigator.openRoom(this, roomId)
+ }
+
+ override fun onBackPressed() = withState(sharedViewModel) {
+ when (it.mode) {
+ UserCodeState.Mode.SHOW -> super.onBackPressed()
+ is UserCodeState.Mode.RESULT,
+ UserCodeState.Mode.SCAN -> sharedViewModel.handle(UserCodeActions.SwitchMode(UserCodeState.Mode.SHOW))
+ }.exhaustive
+ }
+
+ override fun create(initialState: UserCodeState) =
+ viewModelFactory.create(initialState)
+
+ companion object {
+ fun newIntent(context: Context, userId: String): Intent {
+ return Intent(context, UserCodeActivity::class.java).apply {
+ putExtra(MvRx.KEY_ARG, Args(userId))
+ }
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeShareViewEvents.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeShareViewEvents.kt
new file mode 100644
index 0000000000..67a1ab8a6c
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeShareViewEvents.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2020 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.usercode
+
+import im.vector.app.core.platform.VectorViewEvents
+
+sealed class UserCodeShareViewEvents : VectorViewEvents {
+ object Dismiss : UserCodeShareViewEvents()
+ object ShowWaitingScreen : UserCodeShareViewEvents()
+ object HideWaitingScreen : UserCodeShareViewEvents()
+ data class ToastMessage(val message: String) : UserCodeShareViewEvents()
+ data class NavigateToRoom(val roomId: String) : UserCodeShareViewEvents()
+ object CameraPermissionNotGranted : UserCodeShareViewEvents()
+ data class SharePlainText(val text: String, val title: String, val richPlainText: String) : UserCodeShareViewEvents()
+}
diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt
new file mode 100644
index 0000000000..45b6f0ee65
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2020 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.usercode
+
+import androidx.lifecycle.viewModelScope
+import com.airbnb.mvrx.ActivityViewModelContext
+import com.airbnb.mvrx.FragmentViewModelContext
+import com.airbnb.mvrx.MvRxViewModelFactory
+import com.airbnb.mvrx.ViewModelContext
+import com.squareup.inject.assisted.Assisted
+import com.squareup.inject.assisted.AssistedInject
+import im.vector.app.R
+import im.vector.app.core.platform.VectorViewModel
+import im.vector.app.core.resources.StringProvider
+import im.vector.app.features.raw.wellknown.getElementWellknown
+import im.vector.app.features.raw.wellknown.isE2EByDefault
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import org.matrix.android.sdk.api.extensions.tryOrNull
+import org.matrix.android.sdk.api.raw.RawService
+import org.matrix.android.sdk.api.session.Session
+import org.matrix.android.sdk.api.session.permalinks.PermalinkData
+import org.matrix.android.sdk.api.session.permalinks.PermalinkParser
+import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
+import org.matrix.android.sdk.api.session.user.model.User
+import org.matrix.android.sdk.api.util.toMatrixItem
+import org.matrix.android.sdk.internal.util.awaitCallback
+
+class UserCodeSharedViewModel @AssistedInject constructor(
+ @Assisted val initialState: UserCodeState,
+ private val session: Session,
+ private val stringProvider: StringProvider,
+ private val rawService: RawService) : VectorViewModel(initialState) {
+
+ companion object : MvRxViewModelFactory {
+ override fun create(viewModelContext: ViewModelContext, state: UserCodeState): UserCodeSharedViewModel? {
+ val factory = when (viewModelContext) {
+ is FragmentViewModelContext -> viewModelContext.fragment as? Factory
+ is ActivityViewModelContext -> viewModelContext.activity as? Factory
+ }
+ return factory?.create(state) ?: error("You should let your activity/fragment implements Factory interface")
+ }
+ }
+
+ init {
+ val user = session.getUser(initialState.userId)
+ setState {
+ copy(
+ matrixItem = user?.toMatrixItem(),
+ shareLink = session.permalinkService().createPermalink(initialState.userId)
+ )
+ }
+ }
+
+ @AssistedInject.Factory
+ interface Factory {
+ fun create(initialState: UserCodeState): UserCodeSharedViewModel
+ }
+
+ override fun handle(action: UserCodeActions) {
+ when (action) {
+ UserCodeActions.DismissAction -> _viewEvents.post(UserCodeShareViewEvents.Dismiss)
+ is UserCodeActions.SwitchMode -> setState { copy(mode = action.mode) }
+ is UserCodeActions.DecodedQRCode -> handleQrCodeDecoded(action)
+ is UserCodeActions.StartChattingWithUser -> handleStartChatting(action)
+ UserCodeActions.CameraPermissionNotGranted -> _viewEvents.post(UserCodeShareViewEvents.CameraPermissionNotGranted)
+ UserCodeActions.ShareByText -> handleShareByText()
+ }
+ }
+
+ private fun handleShareByText() {
+ session.permalinkService().createPermalink(session.myUserId)?.let { permalink ->
+ val text = stringProvider.getString(R.string.invite_friends_text, permalink)
+ _viewEvents.post(UserCodeShareViewEvents.SharePlainText(
+ text,
+ stringProvider.getString(R.string.invite_friends),
+ stringProvider.getString(R.string.invite_friends_rich_title)
+ ))
+ }
+ }
+
+ private fun handleStartChatting(withUser: UserCodeActions.StartChattingWithUser) {
+ val mxId = withUser.matrixItem.id
+ val existing = session.getExistingDirectRoomWithUser(mxId)
+ setState {
+ copy(mode = UserCodeState.Mode.SHOW)
+ }
+ if (existing != null) {
+ // navigate to this room
+ _viewEvents.post(UserCodeShareViewEvents.NavigateToRoom(existing))
+ } else {
+ // we should create the room then navigate
+ _viewEvents.post(UserCodeShareViewEvents.ShowWaitingScreen)
+ viewModelScope.launch(Dispatchers.IO) {
+ val adminE2EByDefault = rawService.getElementWellknown(session.myUserId)
+ ?.isE2EByDefault()
+ ?: true
+
+ val roomParams = CreateRoomParams()
+ .apply {
+ invitedUserIds.add(mxId)
+ setDirectMessage()
+ enableEncryptionIfInvitedUsersSupportIt = adminE2EByDefault
+ }
+
+ val roomId =
+ try {
+ awaitCallback { session.createRoom(roomParams, it) }
+ } catch (failure: Throwable) {
+ _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.invite_users_to_room_failure)))
+ return@launch
+ } finally {
+ _viewEvents.post(UserCodeShareViewEvents.HideWaitingScreen)
+ }
+ _viewEvents.post(UserCodeShareViewEvents.NavigateToRoom(roomId))
+ }
+ }
+ }
+
+ private fun handleQrCodeDecoded(action: UserCodeActions.DecodedQRCode) {
+ val linkedId = PermalinkParser.parse(action.code)
+ if (linkedId is PermalinkData.FallbackLink) {
+ _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_a_valid_qr_code)))
+ return
+ }
+ _viewEvents.post(UserCodeShareViewEvents.ShowWaitingScreen)
+ viewModelScope.launch(Dispatchers.IO) {
+ when (linkedId) {
+ is PermalinkData.RoomLink -> {
+ // not yet supported
+ _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_implemented)))
+ }
+ is PermalinkData.UserLink -> {
+ val user = tryOrNull {
+ awaitCallback {
+ session.resolveUser(linkedId.userId, it)
+ }
+ }
+ // Create raw Uxid in case the user is not searchable
+ ?: User(linkedId.userId, null, null)
+
+ setState {
+ copy(
+ mode = UserCodeState.Mode.RESULT(user.toMatrixItem(), action.code)
+ )
+ }
+ }
+ is PermalinkData.GroupLink -> {
+ // not yet supported
+ _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_implemented)))
+ }
+ is PermalinkData.FallbackLink -> {
+ // not yet supported
+ _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_implemented)))
+ }
+ }
+ _viewEvents.post(UserCodeShareViewEvents.HideWaitingScreen)
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeState.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeState.kt
new file mode 100644
index 0000000000..c26da7c0a4
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeState.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2020 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.usercode
+
+import com.airbnb.mvrx.MvRxState
+import org.matrix.android.sdk.api.util.MatrixItem
+
+data class UserCodeState(
+ val userId: String,
+ val matrixItem: MatrixItem? = null,
+ val shareLink: String? = null,
+ val mode: Mode = Mode.SHOW
+) : MvRxState {
+ sealed class Mode {
+ object SHOW : Mode()
+ object SCAN : Mode()
+ data class RESULT(val matrixItem: MatrixItem, val rawLink: String) : Mode()
+ }
+
+ constructor(args: UserCodeActivity.Args) : this(
+ userId = args.userId
+ )
+}
diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/ActionItem.kt b/vector/src/main/java/im/vector/app/features/userdirectory/ActionItem.kt
new file mode 100644
index 0000000000..afbc523db2
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/userdirectory/ActionItem.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2020 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.userdirectory
+
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.annotation.DrawableRes
+import com.airbnb.epoxy.EpoxyAttribute
+import com.airbnb.epoxy.EpoxyModelClass
+import im.vector.app.R
+import im.vector.app.core.epoxy.VectorEpoxyHolder
+import im.vector.app.core.epoxy.VectorEpoxyModel
+import im.vector.app.core.extensions.setTextOrHide
+import im.vector.app.core.utils.DebouncedClickListener
+
+@EpoxyModelClass(layout = R.layout.item_contact_action)
+abstract class ActionItem : VectorEpoxyModel() {
+
+ @EpoxyAttribute var title: CharSequence? = null
+ @EpoxyAttribute @DrawableRes var actionIconRes: Int? = null
+ @EpoxyAttribute var clickAction: View.OnClickListener? = null
+
+ override fun bind(holder: Holder) {
+ super.bind(holder)
+ holder.view.setOnClickListener(clickAction?.let { DebouncedClickListener(it) })
+ // If name is empty, use userId as name and force it being centered
+ holder.actionTitleText.setTextOrHide(title)
+ if (actionIconRes != null) {
+ holder.actionTitleImageView.setImageResource(actionIconRes!!)
+ } else {
+ holder.actionTitleImageView.setImageDrawable(null)
+ }
+ }
+
+ class Holder : VectorEpoxyHolder() {
+ val actionTitleText by bind(R.id.actionTitleText)
+ val actionTitleImageView by bind(R.id.actionIconImageView)
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/ContactDetailItem.kt b/vector/src/main/java/im/vector/app/features/userdirectory/ContactDetailItem.kt
new file mode 100644
index 0000000000..ee96c34f45
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/userdirectory/ContactDetailItem.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2020 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.userdirectory
+
+import android.widget.TextView
+import com.airbnb.epoxy.EpoxyAttribute
+import com.airbnb.epoxy.EpoxyModelClass
+import im.vector.app.R
+import im.vector.app.core.epoxy.ClickListener
+import im.vector.app.core.epoxy.VectorEpoxyHolder
+import im.vector.app.core.epoxy.VectorEpoxyModel
+import im.vector.app.core.epoxy.onClick
+import im.vector.app.core.extensions.setTextOrHide
+
+@EpoxyModelClass(layout = R.layout.item_contact_detail)
+abstract class ContactDetailItem : VectorEpoxyModel() {
+
+ @EpoxyAttribute lateinit var threePid: String
+ @EpoxyAttribute var matrixId: String? = null
+ @EpoxyAttribute var clickListener: ClickListener? = null
+
+ override fun bind(holder: Holder) {
+ super.bind(holder)
+ holder.view.onClick(clickListener)
+ holder.nameView.text = threePid
+ holder.matrixIdView.setTextOrHide(matrixId)
+ }
+
+ class Holder : VectorEpoxyHolder() {
+ val nameView by bind(R.id.contactDetailName)
+ val matrixIdView by bind(R.id.contactDetailMatrixId)
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/ContactItem.kt b/vector/src/main/java/im/vector/app/features/userdirectory/ContactItem.kt
new file mode 100644
index 0000000000..d9f424d961
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/userdirectory/ContactItem.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2020 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.userdirectory
+
+import android.widget.ImageView
+import android.widget.TextView
+import com.airbnb.epoxy.EpoxyAttribute
+import com.airbnb.epoxy.EpoxyModelClass
+import im.vector.app.R
+import im.vector.app.core.contacts.MappedContact
+import im.vector.app.core.epoxy.VectorEpoxyHolder
+import im.vector.app.core.epoxy.VectorEpoxyModel
+import im.vector.app.features.home.AvatarRenderer
+
+@EpoxyModelClass(layout = R.layout.item_contact_main)
+abstract class ContactItem : VectorEpoxyModel() {
+
+ @EpoxyAttribute lateinit var avatarRenderer: AvatarRenderer
+ @EpoxyAttribute lateinit var mappedContact: MappedContact
+
+ override fun bind(holder: Holder) {
+ super.bind(holder)
+ // If name is empty, use userId as name and force it being centered
+ holder.nameView.text = mappedContact.displayName
+ avatarRenderer.render(mappedContact, holder.avatarImageView)
+ }
+
+ class Holder : VectorEpoxyHolder() {
+ val nameView by bind(R.id.contactDisplayName)
+ val avatarImageView by bind(R.id.contactAvatar)
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/DirectoryUsersController.kt b/vector/src/main/java/im/vector/app/features/userdirectory/DirectoryUsersController.kt
deleted file mode 100644
index e68d9855dd..0000000000
--- a/vector/src/main/java/im/vector/app/features/userdirectory/DirectoryUsersController.kt
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2020 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.userdirectory
-
-import com.airbnb.epoxy.EpoxyController
-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.epoxy.noResultItem
-import im.vector.app.core.error.ErrorFormatter
-import im.vector.app.core.resources.StringProvider
-import im.vector.app.features.home.AvatarRenderer
-import org.matrix.android.sdk.api.MatrixPatterns
-import org.matrix.android.sdk.api.session.Session
-import org.matrix.android.sdk.api.session.user.model.User
-import org.matrix.android.sdk.api.util.toMatrixItem
-import javax.inject.Inject
-
-class DirectoryUsersController @Inject constructor(private val session: Session,
- private val avatarRenderer: AvatarRenderer,
- private val stringProvider: StringProvider,
- private val errorFormatter: ErrorFormatter) : EpoxyController() {
-
- private var state: UserDirectoryViewState? = null
-
- var callback: Callback? = null
-
- init {
- requestModelBuild()
- }
-
- fun setData(state: UserDirectoryViewState) {
- this.state = state
- requestModelBuild()
- }
-
- override fun buildModels() {
- val currentState = state ?: return
- val hasSearch = currentState.directorySearchTerm.isNotBlank()
- when (val asyncUsers = currentState.directoryUsers) {
- is Uninitialized -> renderEmptyState(false)
- is Loading -> renderLoading()
- is Success -> renderSuccess(
- computeUsersList(asyncUsers(), currentState.directorySearchTerm),
- currentState.getSelectedMatrixId(),
- hasSearch
- )
- is Fail -> renderFailure(asyncUsers.error)
- }
- }
-
- /**
- * Eventually add the searched terms, if it is a userId, and if not already present in the result
- */
- private fun computeUsersList(directoryUsers: List, searchTerms: String): List {
- return directoryUsers +
- searchTerms
- .takeIf { terms -> MatrixPatterns.isUserId(terms) && !directoryUsers.any { it.userId == terms } }
- ?.let { listOf(User(it)) }
- .orEmpty()
- }
-
- private fun renderLoading() {
- loadingItem {
- id("loading")
- }
- }
-
- private fun renderFailure(failure: Throwable) {
- errorWithRetryItem {
- id("error")
- text(errorFormatter.toHumanReadable(failure))
- listener { callback?.retryDirectoryUsersRequest() }
- }
- }
-
- private fun renderSuccess(users: List,
- selectedUsers: List,
- hasSearch: Boolean) {
- if (users.isEmpty()) {
- renderEmptyState(hasSearch)
- } else {
- renderUsers(users, selectedUsers)
- }
- }
-
- private fun renderUsers(users: List, selectedUsers: List) {
- for (user in users) {
- if (user.userId == session.myUserId) {
- continue
- }
- val isSelected = selectedUsers.contains(user.userId)
- userDirectoryUserItem {
- id(user.userId)
- selected(isSelected)
- matrixItem(user.toMatrixItem())
- avatarRenderer(avatarRenderer)
- clickListener { _ ->
- callback?.onItemClick(user)
- }
- }
- }
- }
-
- private fun renderEmptyState(hasSearch: Boolean) {
- val noResultRes = if (hasSearch) {
- R.string.no_result_placeholder
- } else {
- R.string.direct_room_start_search
- }
- noResultItem {
- id("noResult")
- text(stringProvider.getString(noResultRes))
- }
- }
-
- interface Callback {
- fun onItemClick(user: User)
- fun retryDirectoryUsersRequest()
- }
-}
diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/KnownUsersController.kt b/vector/src/main/java/im/vector/app/features/userdirectory/KnownUsersController.kt
deleted file mode 100644
index 4fbb9bbb41..0000000000
--- a/vector/src/main/java/im/vector/app/features/userdirectory/KnownUsersController.kt
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2020 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.userdirectory
-
-import com.airbnb.epoxy.EpoxyModel
-import com.airbnb.epoxy.paging.PagedListEpoxyController
-import com.airbnb.mvrx.Async
-import com.airbnb.mvrx.Incomplete
-import com.airbnb.mvrx.Uninitialized
-import im.vector.app.R
-import im.vector.app.core.epoxy.EmptyItem_
-import im.vector.app.core.epoxy.loadingItem
-import im.vector.app.core.epoxy.noResultItem
-import im.vector.app.core.resources.StringProvider
-import im.vector.app.core.utils.createUIHandler
-import im.vector.app.features.home.AvatarRenderer
-import org.matrix.android.sdk.api.session.Session
-import org.matrix.android.sdk.api.session.user.model.User
-import org.matrix.android.sdk.api.util.toMatrixItem
-import javax.inject.Inject
-
-class KnownUsersController @Inject constructor(private val session: Session,
- private val avatarRenderer: AvatarRenderer,
- private val stringProvider: StringProvider) : PagedListEpoxyController(
- modelBuildingHandler = createUIHandler()
-) {
-
- private var selectedUsers: List = emptyList()
- private var users: Async> = Uninitialized
- private var isFiltering: Boolean = false
-
- var callback: Callback? = null
-
- init {
- requestModelBuild()
- }
-
- fun setData(state: UserDirectoryViewState) {
- this.isFiltering = !state.filterKnownUsersValue.isEmpty()
- val newSelection = state.getSelectedMatrixId()
- this.users = state.knownUsers
- if (newSelection != selectedUsers) {
- this.selectedUsers = newSelection
- requestForcedModelBuild()
- }
- submitList(state.knownUsers())
- }
-
- override fun buildItemModel(currentPosition: Int, item: User?): EpoxyModel<*> {
- return if (item == null) {
- EmptyItem_().id(currentPosition)
- } else {
- val isSelected = selectedUsers.contains(item.userId)
- UserDirectoryUserItem_()
- .id(item.userId)
- .selected(isSelected)
- .matrixItem(item.toMatrixItem())
- .avatarRenderer(avatarRenderer)
- .clickListener { _ ->
- callback?.onItemClick(item)
- }
- }
- }
-
- override fun addModels(models: List>) {
- if (users is Incomplete) {
- renderLoading()
- } else if (models.isEmpty()) {
- renderEmptyState()
- } else {
- var lastFirstLetter: String? = null
- for (model in models) {
- if (model is UserDirectoryUserItem) {
- if (model.matrixItem.id == session.myUserId) continue
- val currentFirstLetter = model.matrixItem.firstLetterOfDisplayName()
- val showLetter = !isFiltering && currentFirstLetter.isNotEmpty() && lastFirstLetter != currentFirstLetter
- lastFirstLetter = currentFirstLetter
-
- UserDirectoryLetterHeaderItem_()
- .id(currentFirstLetter)
- .letter(currentFirstLetter)
- .addIf(showLetter, this)
-
- model.addTo(this)
- } else {
- continue
- }
- }
- }
- }
-
- private fun renderLoading() {
- loadingItem {
- id("loading")
- }
- }
-
- private fun renderEmptyState() {
- noResultItem {
- id("noResult")
- text(stringProvider.getString(R.string.direct_room_no_known_users))
- }
- }
-
- interface Callback {
- fun onItemClick(user: User)
- }
-}
diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/UserDirectoryFragment.kt b/vector/src/main/java/im/vector/app/features/userdirectory/UserDirectoryFragment.kt
deleted file mode 100644
index 70ea9141e7..0000000000
--- a/vector/src/main/java/im/vector/app/features/userdirectory/UserDirectoryFragment.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2020 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.userdirectory
-
-import android.os.Bundle
-import android.view.View
-import com.airbnb.mvrx.activityViewModel
-import com.airbnb.mvrx.withState
-import com.jakewharton.rxbinding3.widget.textChanges
-import im.vector.app.R
-import im.vector.app.core.extensions.cleanup
-import im.vector.app.core.extensions.configureWith
-import im.vector.app.core.extensions.hideKeyboard
-import im.vector.app.core.extensions.setupAsSearch
-import im.vector.app.core.extensions.showKeyboard
-import im.vector.app.core.platform.VectorBaseFragment
-import kotlinx.android.synthetic.main.fragment_user_directory.*
-import org.matrix.android.sdk.api.session.user.model.User
-import javax.inject.Inject
-
-class UserDirectoryFragment @Inject constructor(
- private val directRoomController: DirectoryUsersController
-) : VectorBaseFragment(), DirectoryUsersController.Callback {
-
- override fun getLayoutResId() = R.layout.fragment_user_directory
- private val viewModel: UserDirectoryViewModel by activityViewModel()
-
- private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- sharedActionViewModel = activityViewModelProvider.get(UserDirectorySharedActionViewModel::class.java)
- setupRecyclerView()
- setupSearchByMatrixIdView()
- setupCloseView()
- }
-
- override fun onDestroyView() {
- userDirectoryRecyclerView.cleanup()
- directRoomController.callback = null
- super.onDestroyView()
- }
-
- private fun setupRecyclerView() {
- directRoomController.callback = this
- userDirectoryRecyclerView.configureWith(directRoomController)
- }
-
- private fun setupSearchByMatrixIdView() {
- userDirectorySearchById.setupAsSearch(searchIconRes = 0)
- userDirectorySearchById
- .textChanges()
- .subscribe {
- viewModel.handle(UserDirectoryAction.SearchDirectoryUsers(it.toString()))
- }
- .disposeOnDestroyView()
- userDirectorySearchById.showKeyboard(andRequestFocus = true)
- }
-
- private fun setupCloseView() {
- userDirectoryClose.debouncedClicks {
- sharedActionViewModel.post(UserDirectorySharedAction.GoBack)
- }
- }
-
- override fun invalidate() = withState(viewModel) {
- directRoomController.setData(it)
- }
-
- override fun onItemClick(user: User) {
- view?.hideKeyboard()
- viewModel.handle(UserDirectoryAction.SelectPendingInvitee(PendingInvitee.UserPendingInvitee(user)))
- sharedActionViewModel.post(UserDirectorySharedAction.GoBack)
- }
-
- override fun retryDirectoryUsersRequest() {
- val currentSearch = userDirectorySearchById.text.toString()
- viewModel.handle(UserDirectoryAction.SearchDirectoryUsers(currentSearch))
- }
-}
diff --git a/vector/src/main/java/im/vector/app/features/userdirectory/UserDirectoryViewModel.kt b/vector/src/main/java/im/vector/app/features/userdirectory/UserDirectoryViewModel.kt
deleted file mode 100644
index 0a24b85ce2..0000000000
--- a/vector/src/main/java/im/vector/app/features/userdirectory/UserDirectoryViewModel.kt
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2020 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.userdirectory
-
-import androidx.fragment.app.FragmentActivity
-import arrow.core.Option
-import com.airbnb.mvrx.ActivityViewModelContext
-import com.airbnb.mvrx.FragmentViewModelContext
-import com.airbnb.mvrx.MvRxViewModelFactory
-import com.airbnb.mvrx.ViewModelContext
-import com.jakewharton.rxrelay2.BehaviorRelay
-import com.squareup.inject.assisted.Assisted
-import com.squareup.inject.assisted.AssistedInject
-import im.vector.app.core.extensions.exhaustive
-import im.vector.app.core.extensions.toggle
-import im.vector.app.core.platform.VectorViewModel
-import im.vector.app.features.createdirect.CreateDirectRoomActivity
-import im.vector.app.features.invite.InviteUsersToRoomActivity
-import io.reactivex.Single
-import io.reactivex.android.schedulers.AndroidSchedulers
-import org.matrix.android.sdk.api.session.Session
-import org.matrix.android.sdk.api.util.toMatrixItem
-import org.matrix.android.sdk.rx.rx
-import java.util.concurrent.TimeUnit
-
-private typealias KnowUsersFilter = String
-private typealias DirectoryUsersSearch = String
-
-class UserDirectoryViewModel @AssistedInject constructor(@Assisted
- initialState: UserDirectoryViewState,
- private val session: Session)
- : VectorViewModel(initialState) {
-
- @AssistedInject.Factory
- interface Factory {
- fun create(initialState: UserDirectoryViewState): UserDirectoryViewModel
- }
-
- private val knownUsersFilter = BehaviorRelay.createDefaultContrasenyaInformació addicional: %s
-
S\'ha habilitat el Markdown.S\'ha inhabilitat el Markdown.
-
Avatar de recepcióAvatar de notificacióMostra l\'àrea d\'informacióSemprePer als missatges i errorsNomés per als errors
-
%1$s:%1$s: %2$s+%d%d+No s\'ha trobat cap APK de Google Play Services vàlid. Les notificacions poden no funcionar correctament.
-
- Còpia de seguretat de la clau
- Empra una còpia de seguretat de la clau
-
+ Còpia de seguretat de les claus
+ Utilitza la còpia de seguretat de les clausOmetFet
-
Paràmetres avançats de notificacionsImportància de les notificacions per esdeveniment
-
Diagnostica les notificacionsDiagnòstic de la resolució de problemes
- Ha fallat una o més proves, envieu un informe d\'error per ajudar-nos a investigar-ho.
-
+ Ha fallat una o més proves, envia un informe d\'errors per ajudar-nos a investigar-ho.Les notificacions no són permeses per a aquest dispositiu.
Comproveu els paràmetres del Element.Paràmetres personalitzats.
@@ -1122,7 +949,6 @@ Comproveu els paràmetres del Element.Algunes notificacions estan inhabilitades als vostres paràmetres personalitzats.No s\'ha pogut carregar les regles personalitzades, torneu-ho a provar.Comproveu els paràmetres
-
Comprovació dels serveis de PlayL\'APK dels serveis de Google Play és disponible i al dia.El Element empra els serveis de Google Play per a lliurar les notificacions, però no sembla que estiguen configurats correctament.
@@ -1135,54 +961,41 @@ Comproveu els paràmetres del Element.[%1$s]
Aquest error és fora del control del 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 no hauria d\'afectar un usuari normal.Afegeix un compte
-
Registre del testimoniS\'ha registrat correctament el testimoni FCM al servidor base.No s\'ha pogut registrar el testimoni FCM al servidor base.
\n%1$s
-
Reinici automàtic del servei de notificacionsEl servei s\'ha parat i tornat a iniciar automàticament.No s\'ha pogut iniciar el servei
-
El servei s\'iniciarà quan s\'iniciï el dispositiu.El servei no s\'iniciarà quan el dispositiu s\'iniciï, per la qual cosa no rebreu notificacions fins que el Element s\'haja obert una vegada.Habilita l\'inici durant l\'arrencada
-
Comprova les restriccions del rerefonsIgnora l\'optimització
-
- Configura les notificacions sorolloses
- Configura les notificacions de les trucades
+ Configura les notificacions amb so
+ Configura les notificacions de trucadaConfigura les notificacions silenciosesSeleccioneu el color de LED, la vibració, so…
-
-
Gestió de claus criptogràfiquesMostra les confirmacions de lecturaFeu clic en les confirmacions de lectura per obtenir una llista detallada.Concedeix el permís
-
S\'ha produït un error en verificar la vostra adreça de correu electrònic.
-
S\'ha produït un error en verificar el vostre número de telèfon.Gestiona les còpies de seguretat de la clau
-
Inicia la càmera del sistema en lloc de la pantalla personalitzada de la càmera.Aquesta opció requereix una aplicació de tercers per enregistrar els missatges.
-
L\'ordre «%s» necessita més paràmetres, o alguns paràmetres no són correctes.SilenciósIntroduïu una frase de pasLa frase de pas és massa feble
-
Suprimiu la frase de pas si voleu que el Element 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 assegurats amb xifratge punt a punt. Només tu i els destinaris tenen les claus per a llegir aquests missatges.
-
-Feu una còpia de seguretat de manera segura per evitar perdre-les.
+ Els missatges en sales encriptades estan assegurats amb encriptació d\'extrem a extrem. Només tu i el/s destinatari/s tenen les claus per a llegir aquests missatges.
+\n
+\nFes una còpia de seguretat de les teves claus per evitar perdre\'ls.Estableix la frase de pasFetDesa la clau de recuperació
@@ -1190,7 +1003,6 @@ Feu una còpia de seguretat de manera segura per evitar perdre-les.S\'ha desat la clau de recuperació a «%s».
Avís: és possible que calgui suprimir el fitxer si es desinstal·la l\'aplicació.
-
Feu una còpiaComparteix la clau de recuperació amb…Clau de recuperació
@@ -1198,20 +1010,16 @@ Avís: és possible que calgui suprimir el fitxer si es desinstal·la l\'aplicac
S\'ha iniciat la còpia de seguretatN\'esteu segur?És possible que perdeu l\'accés als vostres missatges si sortiu de la sessió o perdeu el dispositiu.
-
S\'està recuperant la versió de la còpia de seguretat…Empreu la vostra frase de pas de recuperació per desblocar el vostre historial de missatges xifratempreu la clau de recuperacióSi no coneixeu la vostra contrasenya de recuperació, podeu %s.
-
Empreu la vostra clau de recuperació per desblocar el vostre historial de missatges xifratIntroduïu la clau de recuperació
-
Recuperació de missatges
-
Heu perdut la vostra clau de recuperació? Podeu establir una nova a les preferències.
- "[%1$s]
-Aquest error és fora del control del Element. Pot ocórrer per diferents raons. És possible que funcioni si ho torneu a provar més endavant. També podeu comprovar que el servei de Google Play no està restringit a l\'ús de dades a les preferències del sistema, o que el rellotge del dispositiu marca l\'hora correcta. També pot passar amb ROM personalitzades."
+ [%1$s]
+\nAquest error està fora del control d\'Element. Pot ser causat 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 amb ROMs personalitzades.[%1$s]
Aquest error és fora del control del Element. No hi ha cap compte de Google al telèfon. Obrir el gestor de comptes i afegiu un compte de Google.Les restriccions de rerefons són inhabilitades per al Element. Aquesta prova s\'hauria d\'executar emprant dades mòbils (sense wifi).
@@ -1220,20 +1028,14 @@ Aquest error és fora del control del Element. No hi ha cap compte de Google al
Les tasques que l\'aplicació intenta fer estaran restringides agressivament mentre estigui al rerefons, i això pot afectar les notificacions.
%1$sSi un usuari deixa un dispositiu sense endollar i immòbil durant un període de temps, amb la pantalla apagada, el dispositiu entra en el mode d\'estalvi d\'energia. Això impedeix les aplicacions d\'accedir a la xarxa i ajorna les seves tasques, sincronitzacions i alarmes estàndard.
-
-
S\'està generant la clau de recuperació emprant una frase de pas. Aquest procés pot trigar uns segons.Les vostres claus de xifratge s\'estan emmagatzemant al rerefons al vostre servidor base. La còpia inicial pot trigar alguns minuts.
-
-
No s\'ha pogut desxifrar la còpia de seguretat amb aquesta frase de pas: verifiqueu que la frase de pas que heu introduït és la correcta.Error de xarxa: comproveu la vostra connectivitat i torneu-ho a provar.
-
S\'està restaurant la còpia de seguretat:Desbloca l\'historialIntroduïu una clau de recuperacióNo s\'ha pogut desxifrar la còpia de seguretat amb aquesta clau de recuperació: verifiqueu que heu introduït la clau correcta.
-
S\'ha restaurat la còpia de seguretat %s!S\'ha restaurat una còpia amb %d clau.
@@ -1243,24 +1045,16 @@ Les tasques que l\'aplicació intenta fer estaran restringides agressivament men
S\'ha afegit %d clau nova a aquest dispositiu.S\'ha afegit %d claus noves a aquest dispositiu.
-
No s\'ha pogut obtenir la versió de les claus de recuperació més recents (%s).La criptografia de la sessió no és activa
-
-
Restaura des de la còpia de seguretatSuprimeix la còpia de seguretat
-
S\'ha configurat la còpia de seguretat de la clau correctament per a aquest dispositiu.La còpia de seguretat de la clau no és activa en aquest dispositiu.No s\'està fent còpia de seguretat de les vostres claus en aquest dispositiu.
-
-
S\'està suprimint la còpia de seguretat…No s\'ha pogut suprimir la còpia de seguretat (%s)
-
Suprimeix la còpia de seguretat
-
La còpia de seguretat té una signatura d\'un dispositiu desconegut amb ID %s.La còpia de seguretat té una signatura vàlida d\'aquest dispositiu.La còpia de seguretat té una signatura vàlida del dispositiu verificat %s.
@@ -1268,28 +1062,23 @@ Les tasques que l\'aplicació intenta fer estaran restringides agressivament men
La còpia de seguretat té una signatura no vàlida del dispositiu verificat %sLa còpia de seguretat té una signatura no vàlida del dispositiu no verificat %sNo s\'ha pogut obtenir la informació de confiança per a la còpia de seguretat (%s).
-
Voleu suprimir la còpia de les vostres claus de xifratge del servidor? Ja no podreu emprar la vostra clau de recuperació per llegir el vostre historial de missatges xifrats.
-
- La còpia de seguretat de les claus no ha finalitzat, espereu…
- Perdreu els vostres missatges xifrats si sortiu ara
- S\'està fent la còpia de seguretat de les claus. Si sortiu ara, perdreu accés als vostres missatges xifrats.
+ La còpia de seguretat de les claus no ha finalitzat, espera…
+ Si tanques sessió ara, perdràs els teus missatges xifrats
+ S\'està fent la còpia de seguretat de les claus. Si tanques sessió ara, perdràs els teus missatges xifrats.No vull els meus missatges xifrats
- S\'està fent una còpia de les claus…
- Empra la còpia de la clau
- N\'esteu segur?
- Fes una còpia
- Roman
+ Fent còpia de seguretat de les claus…
+ Utilitza la còpia de seguretat de les claus
+ N\'estàs segur\?
+ Còpia de seguretat
+ Queda\'tAvorta
-
- Esteu segurs que voleu sortir de la sessió\?
-
+ Estàs segur que vols tancar la sessió\?Recuperació de missatges xifratsIntroduïu un nom d\'usuari.Comenceu a emprar la còpia de la clau(Avançat)Exporta les claus manualment
-
Assegureu la vostra còpia amb una frase de pas.S\'està creant una còpia de seguretatO, assegureu la vostra còpia amb una clau de recuperació, desant-la en un lloc segur.
@@ -1300,35 +1089,27 @@ Les tasques que l\'aplicació intenta fer estaran restringides agressivament men
ComparteixNo perdeu mai els missatges xifratsComenceu a emprar la còpia de seguretat de les claus
-
No perdeu mai els missatges xifratsEmpra la còpia de seguretat de la clau
-
Claus de missatges xifrats novesGestiona en la còpia de la clau
-
S\'està fent una còpia de seguretat de les claus…
-
S\'ha fet una còpia de seguretat de totes les clausS\'està fent una còpia de seguretat d\'%d clau…S\'està fent una còpia de seguretat de %d claus…
-
VersióAlgoritmeSignatura
-
He sigut joCòpia de seguretat nova de la clau
- Per evitar la pèrdua d\'accés als vostres missatges encriptats, hauríeu d\'activar la còpia de seguretat encriptada a tots els vostres dispositius.
- Perdreu accés als vostres missatges encriptats si no feu una còpia de seguretat de les vostres claus abans de sortir de la sessió.
-
+ Per evitar la pèrdua d\'accés als teus missatges xifrats, hauries d\'activar la còpia de seguretat segura a totes les teves sessions.
+ Perdràs l\'accés als teus missatges xifrats si no fas una còpia de seguretat de les teves claus abans de tancar la sessió.Es desarà una còpia encriptada de les vostres claus al vostre servidor base. Protegiu la vostra còpia de seguretat amb una contrasenya per tal de mantenir-la segura.
\n
\nPer màxima seguretat, aquesta contrasenya hauria de ser diferent de la contrasenya del vostre compte.El mode d\'estalvi de dades aplica un filtre específic que evita l\'enviament de notificacions de presència i d\'escriptura.
-
En cas que oblideu la vostra contrasenya, la vostra clau de recuperació és un últim recurs per recuperar l\'accés als vostres missatges xifrats.
\nDeseu aquesta clau de recuperació en un lloc molt segur, com ara un gestor de contrasenyes o una caixa fortaDeseu la vostra clau de recuperació en un lloc molt segur, com ara un gestor de contrasenyes o una caixa forta
@@ -1339,19 +1120,16 @@ Les tasques que l\'aplicació intenta fer estaran restringides agressivament men
S\'ha trobat una còpia de seguretat nova de la clau.
\n
\nSi no heu configurat el mètode de recuperació nou, un atacant podria estar intentant accedir al vostre compte. Canvieu la contrasenya del vostre compte i configureu-hi un mètode de recuperació nou immediatament a la configuració.
- Inicialitzar servei
- Ignorar
-
- Iniciar sessió amb Single Sign-on
+ Inicialitzant servei
+ Ignora
+ Inicia sessió amb la inscripció única (SSO)Aquesta URL no està disponible , si us plau verifiqueu-laEl vostre dispositiu està usant una versió obsoleta del protocol de seguretat TLS, vulnerable a atacs. Per a la vostra seguretat no us podreu connectarEnvieu un missatge amb EnterLa tecla Enter del teclat virtual enviarà un missatge en comptes d\'afegir un salt de línia
-
Actualitzar la contrasenyaLa contrasenya no és vàlidaLes contrasenyes no coincideixen
-
MedisCompressió estàndardEscollir
@@ -1359,34 +1137,27 @@ Les tasques que l\'aplicació intenta fer estaran restringides agressivament men
EscollirResposta no vàlida en descobrir homeserversUsar Config
-
- Verificar dispositiu
-
- Marcar com a llegit
+ Verifica sessió
+ Marca-ho com a llegitLes app no necessita connectar-se al HomeServer en segon pla, hauria de reduir el consum de bateriaAdministrador d\'integracions
-
Reproduir el so de disparador
-
IP desconeguda
- %1$s: 1 missatge
+ %1$s: %2$d missatge%1$s: %2$d missatges%d notificacion%d notificacions
-
Nou esdevenimentSalaMissatges nousNova invitacióJo
- ** Error en enviar - Si us plau obriu la sala
-
- Ho sentim, els dispositius amb SO Android inferior a 5.0 no suporten trucades multi-usuari amb Jitsi
-
+ ** No s\'ha pogut enviar - si us plau, obre la sala
+ Ho sentim, les videoconferències amb Jitsi no són compatibles amb dispositius antics (dispositius amb Android inferior a 5.0)No heu configurat cap administrador d\'integracions.Un nou dispositiu està sol·licitant claus d\'encriptació.
\nNom del dispositiu: %1$s
@@ -1396,56 +1167,45 @@ Les tasques que l\'aplicació intenta fer estaran restringides agressivament men
\nNom del dispositiu: %1$s
\nVist per última vegada: %2$s
\nSi no heu iniciat sessió en un altre dispositiu, ignoreu la sol·licitud.
-
VerificarCompartirSol·licitud de compartició de clauIgnorar
-
Ja existeix una còpia de seguretat al vostre HomeServerSembla que ja heu configurat una còpia de seguretat de claus des d\'un altre dispositiu. Voleu reemplaçar-la amb la que esteu creant\?ReemplaçarAturar
-
Comprovant l\'estat de la còpia de seguretatOpcions d\'autocompleció del servidorElement ha detectat una configuració de servidor personalitzat pel domini del seu identificador d\'usuari \"%1$s\":
\n%2$sUs heu desconnectat a causa de credencials incorrectes o caducades.
-
Verificar comparant una cadena de text curta.Per la màxima seguretat us recomanem fer això en persona o usar un altre medi de comunicació confiable.Començar la verificacióSol·licitud de verificació entrantVerificar aquest dispositiu per marcar-lo com a confiable. Confiar en dispositius d\'amistats us dona un alleujament addicional quan useu missatges encriptats end-to-end.Verificant aquest dispositiu el marcareu com a confiable, i també marcareu el vostre dispositiu com a confiable pel vostre company.
-
Verificar aquest dispositiu confirmant els següents emojis que apareguin a la pantalla del vostre companyVerificar aquest dispositiu confirmant els següents números que sortiran a la pantalla del vostre company
-
Heu rebut una sol·licitud de verificació entrant.Veure sol·licitudEsperant que el vostre company confirmi…
-
Verificat!Heu verificat aquest dispositiu amb èxit.Els missatges segurs amb aquest usuari estan encriptats end-to-end i no serà possible llegir-los per tercers.Entesos
-
No surt res\? Encara no tots els clients suporten la verificació interactiva. Useu el mètode de verificació antic.Useu el mètode antic de verificació.
-
Verificació de clauSol·licitud cancel·ladaL\'altre part ha cancel·lat la verificació.
\n%sS\'ha cancel·lat la verificació.
\nMotiu: %s
-
Verificació de dispositiu interactivaSol·licitud de verificació%s vol verificar el vostre dispositiu
-
L\'usuari ha cancel·lat la verificacióEl marge de temps pel procés de verificació ha expiratEl dispositiu no coneix la transacció
@@ -1457,71 +1217,161 @@ Les tasques que l\'aplicació intenta fer estaran restringides agressivament men
La clau no coincideixL\'usuari no coincideixError desconegut
-
-
EditarRespondre
-
Tornar-ho a provarUnir-se a una sala per començar usant l\'app.Se t\'ha enviat una invitacióConvidat per %s
-
Esteu al dia!
- No teniu més missatges sense llegir
+ No tens més missatges sense llegirBenvingut a casa!Posar-se al dia dels missatges sense llegirConversesEls vostres missatges directes es mostraran aquíSalesLes vostres sales es mostraran aquí
-
ReaccionsConfirmarM\'agradaAfegir reaccióVeure reaccionsReaccions
-
Esdeveniment eliminat per l\'usuariEsdeveniment moderat per l\'administrador de la salaÚltima edició per %1$s el %2$s
-
-
Esdeveniment mal format, no es pot mostrar
- Crear sala nova
+ Crea sala novaNo hi ha xarxa. Si us plau comproveu la vostra connexió a internet.CanviarCanviar de xarxaEspereu, si us plau…Totes les comunitats
-
Aquesta sala no es pot pre-visualitzar
- Element encara no suporta la pre-visualització de sales llegibles per tothom
-
+ Element encara no admet la pre-visualització de les sales llegibles per tothomSalesMissatges directes
-
Sala novaCREAR
- Nom de la sala
+ NomPúblicQualsevol podrà unir-se a aquesta salaDirectori de salesPublicar aquesta sala al directori de sales
-
Hi ha hagut un error rebent informació de confançaHi ha hagut un error rebent dades de la còpia de seguretat de les claus
-
Importar claus e2e des del fitxer \"%1$s\".
-
Versió de l\'SDK de MatrixJa esteu veient aquesta sala!
-
Reaccions ràpides
-
GeneralPreferènciesSeguretat i privadesaExpert
-
+ 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.
+ Només admès en sales xifrades
+ El xifrat que utilitza aquesta sala no és compatible
+ No pots fer això des del mòbil
+ L\'aplicació no ha pogut crear un compte en aquest servidor.
+\n
+\nVols registrar-te utilitzant un client web\?
+ 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
+ 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.
+ Mostra detalls com per exemple noms de sala i contingut dels missatges.
+ No hem pogut convidar els usuaris. Comprova els usuaris que vols convidar i torna-ho a provar.
+ Estàs segur que vols eliminar aquest esdeveniment\? Tingues en compte que, si suprimeixes un nom de sala o es canvia el tema, podria ser que es revertís.
+ Una vegada activada, l\'encriptació d\'una sala no es pot desactivar. El servidor no pot llegir els missatges enviats en una sala encriptada, només els poden llegir els participants. Habilitar l\'encriptació pot fer que molts bots i enllaços no funcionin correctament.
+ Una vegada activada, l\'encriptació no es pot desactivar.
+ Notificacions
+ Els missatges d\'aquí no estan encriptats d\'extrem a extrem.
+ Els missatges d\'aquesta sala no estan encriptats d\'extrem a extrem.
+ Una vegada activada, l\'encriptació no es pot desactivar.
+ Si canvies la contrasenya es restabliran les claus d\'encriptació d\'extrem a extrem de totes les teves sessions de manera que l\'historial del xat no es podrà llegir. Configura una còpia de seguretat de les claus o exporta les teves claus de sala d\'una altra sessió abans de fer el canvi de contrasenya.
+ Has fet la sala accessible per a qualsevol que tingui l\'enllaç.
+ %1$s ha fet la sala accessible per a qualsevol que tingui l\'enllaç.
+ Silencia
+ Només mencions
+ Tots els missatges
+ Tots els missatges (amb so)
+ En aquesta sala no hi ha mitjans
+ En aquesta sala no hi ha fitxers
+ No s\'ha trobat cap resultat, utilitza Afegeix amb ID de matrix per a cercar al servidor.
+ La sala ha estat creada però algunes invitacions no s\'han enviat pel motiu següent:
+\n
+\n%s
+ No hi ha ginys actius
+ %1$s s %2$s i %3$s
+ Si deixes d\'ignorar aquest usuari, tornaràs a veure tots els seus missatges.
+ Deixa d\'ignorar
+ Si ignores aquest usuari s\'eliminaran els seus missatges de les sales que compartiu.
+\n
+\nPots desfer aquest canvi en qualsevol moment a la configuració general.
+ Ignora usuari
+ No podràs desfer aquest canvi ja que t\'estàs baixant de rang, si ets l\'últim usuari de la sala amb privilegis, et serà impossible recuperar-los.
+ No s\'ha configurat cap servidor d\'identitat.
+ Sense més resultats
+ Notificacions
+ Èxit
+ Copia
+ Penja
+ Rebutja
+ Accepta
+ Rebutja
+ No s\'ha pogut eliminar el giny
+ No s\'ha pogut afegir el giny
+ No pots iniciar una trucada amb tu mateix, espera que els participants acceptin la invitació
+ No pots iniciar una trucada amb tu mateix
+ Les reunions utilitzen les polítiques de seguretat i permisos de Jitsi. Tots els participants que es trobin dins sala veuran una invitació per unir-se mentre la teva reunió estigui en curs.
+ Inicia una reunió d\'àudio
+ Inicia una reunió de vídeo
+ Ja hi ha una conferència en curs!
+ No tens permís per iniciar una trucada
+ No tens permís per iniciar una trucada en aquesta sala
+ No tens permís per iniciar una conferència
+ No tens permís per iniciar una videoconferència en aquesta sala
+ Reinicia
+ Omet
+ Atura
+ Desconnecta
+ Revoca
+ Cap
+ Latn
+ Trucada activa (%s)
+ Demana confirmació abans d\'iniciar una trucada
+ Evita trucada accidental
+ La descripció és massa curta
+ Envia l\'historial de sol·licituds de compartició de claus
+ Revisa
+ Reprodueix
+ Activa l\'HD
+ Desactiva l\'HD
+ Posterior
+ Frontal
+ Commuta la càmera
+ Auriculars sense fils
+ Auriculars
+ Altaveu
+ Mòbil
+ Selecciona el dispositiu d\'àudio
+ No m\'ho tornis a preguntar
+ Prova fent servir %s
+ La crida ha fallat per culpa d\'una mala configuració del servidor
+ Correu electrònic
+ Confirma la teva contrasenya
+ Motiu del veto
+ Veta usuari
+ Cancel·la invitació
+ Cancel·la invitació
+ Torna a la trucada
+ Error SSL.
+ La trucada d\'Element ha fallat
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml
index 702e380e17..75ee23cb12 100644
--- a/vector/src/main/res/values-de/strings.xml
+++ b/vector/src/main/res/values-de/strings.xml
@@ -2244,4 +2244,8 @@
RaumeinstellungenRaum-Thema (optional)Raumname
+ Prüfung exportieren
+ Direktnachricht
+ Geschichte der Anfragen von Schlüsselfreigaben senden
+ Keine weiteren Ergebnisse
\ No newline at end of file
diff --git a/vector/src/main/res/values-es/strings.xml b/vector/src/main/res/values-es/strings.xml
index c5ca0d5f1a..a26c4c91d6 100644
--- a/vector/src/main/res/values-es/strings.xml
+++ b/vector/src/main/res/values-es/strings.xml
@@ -1,17 +1,15 @@
-
+
esES
-
MensajesSalaAjustesDetalles de MiembroHistórico
-
CorrectoCancelar
@@ -26,7 +24,7 @@
ReenviarEnlace PermanenteVer Fuente
- Ver Fuente Descifrada
+ Ver Fuente DesencriptadaEliminarRenombrarReportar contenido
@@ -35,16 +33,15 @@
\nUnirse como %1$s o %2$sVozVídeo
- No se puedo iniciar la llamada, por favor inténtelo de nuevo más tarde
- Debido a que faltan permisos, pueden faltar algunas características…
+ No se puede iniciar la llamada, por favor inténtelo de nuevo más tarde
+ Debido a permisos insuficientes, pueden faltar algunas funciones…Necesitas permiso para invitar a iniciar una conferencia en esta salaNo se puede iniciar la llamadaDetalles de la sesión
- No se admiten llamadas de conferencia en salas cifradas
+ No se admiten llamadas de conferencia en salas encriptadasEnviar de Todos ModosoInvitar
-
Cerrar sesiónLlamada de Voz
@@ -57,27 +54,22 @@
CerrarCopiado al portapapelesDeshabilitar
-
ConfirmaciónAdvertencia
-
InicioFavoritosPersonasSalas
-
Filtrar salasFiltrar favoritosFiltrar personasFiltrar salas
-
InvitacionesPrioridad baja
-
ConversacionesAgenda de contactos local
@@ -85,17 +77,15 @@
No hay conversacionesNo permitiste que Element acceda a tus contactos localesNo hay resultados
-
SalasDirectorio de salasNo hay salasNo hay salas públicas disponibles
- 1 usuario
+ %d usuario%d usuarios
-
Enviar registrosEnviar registros de fallasEnviar captura de pantalla
@@ -108,10 +98,8 @@
No se pudo enviar el informe de error (%s)Progreso (%s%%)La aplicación falló en la última sesión. ¿Te gustaría enviar un informe de error\?
-
Enviar enLeído
-
Unirse a la SalaNombre de usuarioCrear cuenta
@@ -120,14 +108,11 @@
URL del Servidor DomésticoURL del Servidor de IdentidadBuscar
-
Iniciar Nueva ConversaciónIniciar Llamada de VozIniciar Llamada de Vídeo
-
Enviar archivosTomar foto o vídeo
-
Iniciar sesiónCrear cuenta
@@ -161,8 +146,8 @@
Utilizar opciones personalizadas del servidor (avanzado)Por favor consulta tu correo electrónico para continuar con el registroTodavía no es posible registrarse con correo electrónico y número telefónico a la vez, hasta que exista la API. Solo se tendrá en cuenta el número telefónico.
-
-Puedes añadir tu correo electrónico a tu perfil en ajustes.
+\n
+\nPuedes añadir tu correo electrónico a tu perfil en ajustes.Este Servidor Doméstico quiere asegurarse de que no eres un robotNombre de usuario en usoServidor Doméstico:
@@ -176,7 +161,6 @@ Puedes añadir tu correo electrónico a tu perfil en ajustes.
Tu contraseña fue restablecida.
\n
\nSe ha cerrado sesión en todas tus sesiones y ya no recibirás notificaciones push. Para volver a habilitar las notificaciones, vuelve a iniciar sesión en cada dispositivo.
-
La URL debe comenzar con http[s]://No es posible iniciar sesión: Error de red
@@ -185,7 +169,6 @@ Puedes añadir tu correo electrónico a tu perfil en ajustes.
No es posible registrarseNo es posible registrarse : falló la propiedad del correo electrónicoPor favor introduce una URL válida
-
Nombre de usuario/contraseña inválidosNo se reconoció el código de acceso especificadoJSON mal formado
@@ -193,36 +176,27 @@ Puedes añadir tu correo electrónico a tu perfil en ajustes.
Se enviaron demasiadas solicitudesEste nombre de usuario ya está en usoEl enlace del correo electrónico que aún no se ha seguido
-
-
Lista de Recibos de Lectura
-
-
Enviar como OriginalGrandeMedianoPequeño
-
"¿Cancelar la descarga?¿Cancelar la subida?%d s
- %1$dm %2$ds
-
+ %1$dmin %2$dsegAyerHoy
-
-
Nombre de la salaTema de la sala
-
Llamada conectadaConectando llamada…
@@ -232,21 +206,18 @@ Puedes añadir tu correo electrónico a tu perfil en ajustes.
Llamada de Vídeo EntranteLlamada de Voz EntranteLlamada En Curso…
-
El lado remoto no contestó.Falló la Conexión de MediosNo se puede iniciar la cámarallamada contestada en otra parte
-
Tomar una foto o un vídeoNo se puede grabar vídeo
-
InformaciónElement necesita permiso para acceder a tu biblioteca de fotos y vídeos para enviar y guardar archivos adjuntos.
-
-Por favor permite el acceso en la próxima ventana emergente para poder enviar archivos desde tu teléfono.
+\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."
\n
@@ -256,61 +227,51 @@ Por favor permite el acceso en la próxima ventana emergente para poder enviar a
\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.
-
-Por favor permite el acceso en las próximas ventanas emergentes para poder realizar la llamada.
+\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.
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.
-
-¿Permitir que Element acceda a tus 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.
+\n
+\n¿Permitir que Element acceda a tus contactos \?Lo sentimos. Acción no realizada, debido a que faltan permisos
-
Guardado¿Guardar en descargas?SÍNOContinuar
-
EliminarUnirseVista PreviaRechazar
-
Ir al primer mensaje no leído.
-
Has sido invitado por %s a unirte a esta salaEsta invitación fue enviada a %s, que no esta asociado a esta cuenta.
-Quizás quieras iniciar sesión con otra cuenta, o añadir este correo electrónico a esta cuenta.
+\nQuizás quieras iniciar sesión con otra cuenta, o añadir este correo electrónico a esta cuenta.
Estás intentando acceder a %s. ¿Quieres unirte para participar en la discusión?una salaEsta es una vista previa de esta sala. Las interacciones dentro de la sala se han deshabilitado.
-
Nueva ConversaciónAñadir miembro1 miembro
-
Salir de la sala¿Seguro que quieres salir de la sala?¿Seguro que quieres eliminar a %s de esta conversación?Crear
-
En líneaDesconectadoEn reposo
-
HERRAMIENTAS DE ADMINISTRACIÓNLLAMARCONVERSACIONES DIRECTASSESIONES
-
InvitarSalir de esta salaEliminar de esta sala
@@ -324,26 +285,22 @@ Quizás quieras iniciar sesión con otra cuenta, o añadir este correo electrón
ID de Usuario, Nombre o correo electrónicoMencionarMostrar Lista de Sesiones
- No podrás deshacer este cambio porque estás promoviendo al usuario para tener el mismo nivel de autoridad que tú.
-¿Estás seguro?
-
+ No podrás deshacer este cambio porque estás ascendiendo al usuario al mismo nivel de autoridad que tú.
+\n¿Estás seguro\?¿Seguro que quieres invitar a %s a esta conversación?
-
Invitar por IDCONTACTOS LOCALES (%d)Solo usuarios de Matrix
-
Invitar usuario por IDPor favor, ingresa una o más direcciones de correo electrónico o ID de MatrixCorreo electrónico o ID de Matrix
-
Buscar%s está escribiendo…%1$s y %2$s están escribiendo…%1$s y %2$s y otros están escribiendo…
- Enviar un mensaje cifrado…
+ Enviar un mensaje encriptado…Enviar un mensaje (sin cifrar)…Se perdió la conexión con el servidor.Los mensajes no se enviaron. ¿%1$s o %2$s ahora?
@@ -354,7 +311,6 @@ Quizás quieras iniciar sesión con otra cuenta, o añadir este correo electrón
Eliminar mensajes no enviadosArchivo no encontradoNo tienes permiso para publicar en esta sala
-
ConfiarNo confiar
@@ -367,7 +323,6 @@ Quizás quieras iniciar sesión con otra cuenta, o añadir este correo electrón
El certificado cambió de uno que era confiable para tu teléfono. Esto es MUY INUSUAL. Se recomienda NO ACEPTAR este nuevo certificado.El certificado cambió de uno que era confiable a uno que no es confiable. El servidor puede haber renovado su certificado. Contacta al administrador del servidor para obtener la huella digital.Solo acepta el certificado si el administrador del servidor ha publicado una huella digital que coincide con la anterior.
-
Detalles de SalaPersonas
@@ -376,15 +331,13 @@ Quizás quieras iniciar sesión con otra cuenta, o añadir este correo electrón
ID mal formada. Debería ser una dirección de correo electrónico o una ID de Matrix como \'@partelocal:dominio\'INVITADOSSE UNIERON
-
Motivo para reportar este contenido
- ¿Quieres ocultar todos los mensajes de este usuario?
-
-Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de tiempo.
+ ¿Quieres ocultar todos los mensajes de este usuario\?
+\n
+\nTen en cuenta que esta acción reiniciará la aplicación y puede tardar algo de tiempo.Cancelar SubidaCancelar Descarga
-
BuscarFiltrar miembros de la sala
@@ -393,7 +346,6 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
MENSAJESPERSONASARCHIVOS
-
UNIRSEDIRECTORIO
@@ -406,18 +358,15 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
Unirse a la salaUnirse a una salaEscribe una ID o alias de sala
-
Explorar directorioBuscando directorio…
-
Agregar a FavoritosDejar de priorizarConversación DirectaSalir de la ConversaciónOlvidar
-
MensajesAjustes
@@ -426,9 +375,7 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
Avisos de tercerosDerechos de autorPolítica de privacidad
-
-
Imagen de PerfilNombre PúblicoCorreo Electrónico
@@ -437,22 +384,18 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
Añadir número telefónicoMostrar la pantalla de información de la aplicación de los ajustes del sistema.Información de la aplicación
-
Habilitar notificaciones para esta cuentaHabilitar notificaciones para esta sesiónEnciende la pantalla por 3 segundos
-
Mensajes en conversaciones uno a unoMensajes en conversaciones en grupoCuando soy invitado a una salaInvitaciones de llamadaMensajes enviados por bot
-
Sincronización en segundo planoHabilitar sincronización en segundo planoVenció el tiempo de espera para la solicitud de sincronizaciónRetraso entre cada sincronización
-
Versiónversión de olmTérminos y condiciones
@@ -461,8 +404,6 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
Política de privacidadBorrar caché
-
-
Ajustes de usuarioNotificacionesUsuarios ignorados
@@ -484,39 +425,31 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
Visto por última vez%1$s @ %2$sEsta operación requiere autenticación adicional.
-Para continuar, ingresa tu contraseña por favor.
+\nPara continuar, introduce tu contraseña por favor.
AutenticaciónContraseña:Enviar
-
Sesión iniciada comoServidor DomésticoServidor de Identidad
-
Verificación PendientePor favor, consulta tu correo electrónico y haz clic en el enlace que contiene. Una vez hecho esto, haz clic en continuar.No es posible verificar la dirección de correo electrónico. Por favor, consulta tu correo electrónico y haz clic en el enlace que contiene. Una vez hecho esto, haz clic en continuar.
-
Esta dirección de correo electrónico ya está en uso.No se encontró esta dirección de correo electrónico.Este número telefónico ya está en uso.
-
Cambiar contraseñaContraseña actualContraseña nuevaConfirmar contraseñaNo se pudo actualizar la contraseñaTu contraseña ha sido actualizada
- ¿Mostrar todos los mensajes de %s?
-
-Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de tiempo.
-
+ ¿Mostrar todos los mensajes de %s\?
+\n
+\nTen en cuenta que esta acción reiniciará la aplicación y puede tomar algo de tiempo.¿Seguro que quieres eliminar este objetivo de notificaciones?
-
¿Seguro que quieres eliminar los %1$s %2$s?
-
Elige un país
-
PaísPor favor, elige un paísNúmero telefónico
@@ -526,21 +459,17 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
Ingresa un código de activaciónError en la validación de tu número telefónicoCódigo
-
-
Imagen de SalaNombre de SalaTemaEtiqueta de SalaEtiquetado como:
-
Agregar a FavoritosPrioridad bajaNinguno
-
Acceso y visibilidadListar esta sala en el directorio de salas
@@ -548,70 +477,57 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
Legibilidad del Historial de la Sala¿Quién puede leer el historial?¿Quién puede acceder a esta sala?
-
TodosSolo miembros (desde el momento en que se selecciona esta opción)Solo miembros (desde que fueron invitados)Solo miembros (desde que se unieron)
-
Para crear un enlace a una sala, debe tener una dirección.Solo personas que han sido invitadasCualquier persona que conozca el enlace a esta sala, excepto invitadosCualquier persona que conozca el enlace a esta sala, incluyendo invitados
-
Usuarios vetados
-
AvanzadoLa ID interna de esta salaDireccionesLaboratoriosEstas son funcionalidades experimentales que pueden romperse de maneras inesperadas. Utilizar con precaución.
- Cifrado de Extremo a Extremo
- El Cifrado de Extremo a Extremo está activo
- Necesitas cerrar sesión para poder habilitar el cifrado.
+ Encriptación de Extremo a Extremo
+ La encriptación de Extremo a Extremo está activa
+ Necesitas cerrar sesión para poder habilitar la encriptación.Cifrar solo a sesiones verificadas
- Nunca enviar mensajes cifrados a sesiones sin verificar en esta sala desde esta sesión.
-
+ Nunca enviar mensajes encriptados a sesiones sin verificar en esta sala desde esta sesión.Esta sala no tiene direcciones localesDirección nueva (ej. #foo:matrix.org)
-
Formato de alias inválido\'%s\' no es un formato de alias válidoNo tendrás una dirección principal especificada para esta sala.Advertencias de la dirección principal
-
Establecer como Dirección PrincipalDejar de Establecer como Dirección PrincipalCopiar ID de SalaCopiar Dirección de Sala
-
- El cifrado está habilitado en esta sala.
- El cifrado está deshabilitado en esta sala.
- Habilitar cifrado
-(advertencia: ¡no se puede volver a deshabilitar!)
-
+ La encriptación está habilitada en esta sala.
+ La encriptación está deshabilitada en esta sala.
+ Habilitar encriptado
+\n(advertencia: ¡no se puede volver a deshabilitar!)Directorio
-
%s estaba intentando cargar un momento específico en la línea de tiempo de esta sala pero no pudo encontrarlo.
-
- Información de cifrado de extremo a extremo
-
+ Información de encriptación Extremo-a-ExtremoInformación de eventosID de UsuarioClave de identidad Curve25519Clave de huella digital Ed25519 reclamadaAlgoritmoID de Sesión
- Error de descifrado
-
+ Error de desencriptaciónInformación de la sesión emisoraNombre públicoNombre público
@@ -619,45 +535,41 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
Clave de sesiónVerificaciónHuella digital Ed25519
-
- Exportar claves de salas con Cifrado de Extremo a Extremo
+ Exportar claves de salas con encriptación Extremo-a-ExtremoExportar claves de salaExportar las claves a un archivo localExportarIngresar frase de contraseñaConfirmar frase de contraseña
- Las claves de salas con Cifrado de Extremo a Extremo se guardaron en \'%s\'.
-
-Advertencia: este archivo puede ser eliminado si la aplicación se desinstala.
-
- Importar claves de salas con Cifrado de Extremo a Extremo
+ Las claves de salas con encriptado de Extremo-a-Extremo se guardaron en \'%s\'.
+\n
+\nAdvertencia: este archivo puede ser eliminado si la aplicación se desinstala.
+ Importar claves de salas con encriptación Extremo-a-ExtremoImportar claves de salaImportar las claves desde un archivo localImportarCifrar solo a sesiones verificadas
- Nunca enviar mensajes cifrados a sesiones sin verificar desde esta sesión.
-
+ Nunca enviar mensajes encriptados a sesiones sin verificar desde esta sesión.SIN VerificarVerificadoProhibido
-
sesión desconocidaninguno
-
VerificarAnular VerificaciónProhibirDejar de Prohibir
-
Verificar sesiónPara verificar que esta sesión es confiable, por favor contacta a su dueño por algún otro medio (ej. cara a cara o por teléfono) y pregúntale si la clave que ve en sus Ajustes de Usuario para esta sesión coincide con la clave a continuación:Si coincide, presione el botón de verificar a continuación. Si no coincide, entonces alguien está interceptando esta sesión y probablemente debería prohibirlo. En el futuro, este proceso de verificación será más sofisticado.Verifico que las claves coinciden
-
La sala contiene sesiones desconocidas
- Esta sala contiene sesiones desconocidas que no han sido verificados. Esto significa que no hay garantía de que las sesiones pertenezcan a los usuarios a los que dicen pertenecer. Recomendamos que pases por el proceso de verificación para cada sesión antes de continuar. Puedes reenviar el mensaje sin verificarlas si prefieres. Sesiones desconocidas:
-
+ Esta sala contiene sesiones desconocidas que no han sido verificadas.
+\nEsto significa que no hay garantía de que las sesiones pertenezcan a los usuarios a los que dicen pertenecer.
+\nRecomendamos que hagas el proceso de verificación por cada sesión antes de continuar. Pero puedes reenviar el mensaje sin verificarlas si prefieres.
+\n
+\nSesiones desconocidas:Selecciona un directorio de salasEl servidor puede estar no disponible o sobrecargado
@@ -665,35 +577,27 @@ Advertencia: este archivo puede ser eliminado si la aplicación se desinstala.
URL del Servidor DomésticoTodas las salas en el servidor %sTodas las salas nativas de %s
-
Buscar en el historialInterfaz de usuarioIdiomaElige idioma
-
Iniciar en el arranqueBorrar caché de mediosGuardar medios
-
Mostrar marcas temporales de todos los mensajes
-
3 días1 semana1 mesPara siempre
-
Desconectado
-
Modo de ahorro de datos
-
Tamaño de letraPequeñoNormalGrandeMayorTema
-
DiminutoMás GrandeEnorme
@@ -702,30 +606,23 @@ Advertencia: este archivo puede ser eliminado si la aplicación se desinstala.
Tema ClaroTema OscuroTema Negro
-
Sincronizando…
- Detectar eventos
+ Captando eventosNotificaciones ruidosasNotificaciones silenciosas
-
Informe de error
-
Tomar fotoTomar vídeo
-
LlamarSonido de notificaciónMensajes que contienen mi nombre públicoMensajes que contienen mi nombre de usuarioMostrar marcas temporales en formato de 12 horas
-
Análisis de Estadísticas
-
Necesitas permiso para gestionar los componentes en esta salaLa creación del componente fallóCrear llamadas de conferencia con jitsi¿Seguro que quieres eliminar el widget de esta sala\?
-
No es posible crear el componente.El envío de la solicitud falló.
@@ -737,60 +634,43 @@ Advertencia: este archivo puede ser eliminado si la aplicación se desinstala.
La sala %s no está visible.Añadir aplicaciones de MatrixUtilizar cámara nativa
-
- Añadiste una nueva sesión \'%s\', que está solicitando claves de cifrado.
- Tu sesión sin verificar \'%s\' está solicitando claves de cifrado.
+ Has añadido una nueva sesión \'%s\', que está solicitando claves de encriptación.
+ Tu sesión sin verificar \'%s\' está solicitando claves de encriptación.Iniciar verificaciónCompartir sin verificarIgnorar solicitud
-
¡Advertencia!Las llamadas de conferencia están en desarrollo y pueden no ser confiables.
-
Error de comandoComando no reconocido: %s
-
DesactivadoRuidoso
-
- Mensaje cifrado
-
+ Mensaje encriptadoDetalles de comunidad
-
Cargando…
-
SalirComunidades
-
Filtrar comunidades
-
InvitarComunidadesNo hay grupos
-
¿Seguro que quieres iniciar una nueva conversación con %s?¿Seguro que quieres iniciar una llamada de voz?¿Seguro que quieres iniciar una llamada de vídeo?
-
Lista de Grupos
-
El usuario baneado lo echará de esta sala y evitará que se unan nuevamente.
-
Todos los mensajes (ruidoso)Todos los mensajesSolo mencionesSilenciar
- Añadir un Atajo a la Pantalla de Inicio
-
+ Añadir a la Pantalla de InicioVistas previas de URL en líneaVibrar al mencionar un usuario
-
Insignia
-
NotificacionesEsta sala no está mostrando insignias para ninguna comunidadNueva ID de comunidad (ej. +foo:matrix.org)
@@ -798,48 +678,40 @@ Advertencia: este archivo puede ser eliminado si la aplicación se desinstala.
Olvidar salaVolver a unirse\'%s\' no es una ID de comunidad válida
-
-
CrearCrear ComunidadNombre de comunidadEjemploID de Comunidadejemplo
-
InicioPersonasSalasNo hay usuarios
-
SalasSe unióInvitadoFiltrar miembros del grupoFiltrar salas del grupo
-
Has sido expulsado de %1$s por %2$sHas sido vetado de %1$s por %2$sMotivo: %1$sEl administrador de la comunidad no ha redactado una descripción larga para esta comunidad.
-
Agitar con rabia para reportar un error
-
AccionesListar miembrosSincronizando…
- 1 miembro
+ %d miembro%d miembros
- 1 mensaje nuevo
+ %d mensaje nuevo%d mensajes nuevos
-
- 1 sala
+ %d sala%d salas
@@ -847,58 +719,50 @@ Advertencia: este archivo puede ser eliminado si la aplicación se desinstala.
%1$s salas encontradas para %2$s
- 1 sala
+ %d sala%d salas
- 1 cambio de membresía
+ %d cambio de membresía%d cambios de membresía
-
Abrir título
- 1 miembro activo
+ %d miembro activo%d miembros activos
- 1 mensaje sin leer
+ %d mensaje sin leer%d mensajes sin leer
- 1 mensaje notificado sin leer
+ %d mensaje notificado sin leer%d mensajes notificados sin leer%1$s en %2$s
-
- 1 componente activo
+ %d componente activo%d componentes activos
-
Enviar una pegatina
-
Actualmente no tienes ningún paquete de pegatinas habilitado.
\n
\n¿Añadir algunos ahora\?
-
Desactivar CuentaAvatar
-
Avatar de reciboAvatar de avisoPara continuar utilizando el servidor doméstico %1$s, debes revisar y aceptar los términos y condiciones.Revisar ahora
-
Esto hará que tu cuenta quede permanentemente inutilizable. No podrás iniciar sesión, y nadie podrá volver a registrar la misma ID de usuario. Esto hará que tu cuenta salga de todas las salas en las cuales participa, y eliminará los datos de tu cuenta de tu servidor de identidad. Esta acción es irreversible.
-
-Desactivar tu cuenta no hace que por defecto olvidemos los mensajes que has enviado. Si quieres que olvidemos tus mensajes, por favor marca la casilla a continuación.
-
-La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Que olvidemos tus mensajes implica que los mensajes que hayas enviado no se compartirán con ningún usuario nuevo o no registrado, pero aquellos usuarios registrados que ya tengan acceso a estos mensajes seguirán teniendo acceso a su copia.
+\n
+\nDesactivar tu cuenta no hace que por defecto olvidemos los mensajes que has enviado. Si quieres que olvidemos tus mensajes, por favor marca la casilla a continuación.
+\n
+\nLa visibilidad de mensajes en Matrix es similar a la del correo electrónico. Que olvidemos tus mensajes implica que los mensajes que hayas enviado no se compartirán con ningún usuario nuevo o no registrado, pero aquellos usuarios registrados que ya tengan acceso a estos mensajes seguirán teniendo acceso a su copia.
Por favor, olvida todos los mensajes enviados al desactivar mi cuenta (Advertencia: esto provocará que los usuarios futuros vean conversaciones incompletas)Para continuar, ingresa tu contraseña por favor:Desactivar Cuenta
-
Privacidad de notificacionesNormalPrivacidad reducida
@@ -908,51 +772,37 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
• El contenido del mensaje de la notificación está ubicado de forma segura directamente desde el servidor doméstico de Matrix• Las notificaciones contienen datos de mensajes y metadatos• Las notificaciones no mostrarán el contenido del mensaje
-
Desactivar cuentaDesactivar mi cuenta
-
DescargarSí, ¡quiero ayudar!
-
Conceder permisoEnviar audio
-
Enviar pegatinaUn parámetro no es válido.Ingresa tu contraseña por favor.
-
Enviar mensaje de voz
-
Elige otra opción
-
Falta un parámetro requerido.Solicitud enviadaConversarPor favor, inicia Element en otro dispositivo que pueda descifrar el mensaje para que pueda enviar las claves a esta sesión.
-
Licencias de terceros
-
Borrarcontinuar con…Lo sentimos, no se encontró ninguna aplicación externa para completar esta acción.
-
- Volver a solicitar las claves de cifrado de tus otras sesiones.
-
+ Volver a solicitar las claves de encriptado de tus otras sesiones.Solicitud de clave enviada.
-
Privacidad de NotificacionesElement 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ísticasElement 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.Escribe aquí…
-
Si es posible, por favor escribe la descripción en inglés.Enviar una respuesta cifrada…Enviar una respuesta (sin cifrar)…Actualmente no eres miembro de ninguna comunidad.
-
Utilizar la tecla Intro del teclado para enviar mensajesMuestra la acciónVeta al usuario con la ID dada
@@ -966,73 +816,58 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Cambia tu apodo públicoActivar/Desactivar markdownPara reparar la gestión de las Aplicaciones de Matrix
-
Vista previa de medios antes de enviar
-
Esta sala ha sido reemplazada y ya no está activaLa conversación continúa aquíEsta sala es una continuación de otra conversaciónHaz clic aquí para ver mensajes más antiguos
-
Degrada al usuario con la ID dadaAlertas de Sistema
-
- Debido a que faltan permisos, esta acción no es posible.
+ Debido a permisos insuficientes, esta acción no es posible.
- 1s
+ $d%ds
- 1m
- %dm
+ %dmin
+ %dmins
- 1h
+ %dh%dh
- 1d
+ %dd%dd
-
%1$s ahorahace %1$s %2$s
-
"%1$s, "%1$s y %2$s%1$s %2$s
-
- 1 seleccionado
+ $d seleccionado%d seleccionados
- 1 miembro
+ %d miembro%d miembros
-
- 1 sala
+ %d sala%d salasLímite de Recursos ExcedidoContacta al Administrador
-
contacta al administrador de tu servicio
-
Este servidor doméstico ha excedido uno de sus límites de recursos, por lo que algunos usuarios no podrán iniciar sesión.Este servidor doméstico ha excedido uno de sus límites de recursos.
-
Este servidor doméstico ha alcanzado su límite Mensual de Usuarios Activos, por lo que algunos usuarios no podrán iniciar sesión.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 %sPor 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.Crear frase de contraseña
@@ -1040,27 +875,19 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Utiliza carga diferida para los miembros de la salaAumenta el rendimiento cargando los miembros de la sala solo en la primera vista.Tu servidor doméstico aún no admite la carga diferida de los miembros de la sala. Prueba más tarde.
-
Disculpas, ocurrió un error
-
expandircolapsar
-
- llamar de cada manera
+ Llamar de todos modosAceptar
-
Por favor revisa y acepta las reglas de este servidor doméstico:
-
LlamadasUsar el tono de llamada normal de Element para llamadas entrantesTono para llamadas entrantesElegir sonido de llamadas:
-
Llamada de video en proceso…
-
ExpulsarRazón
-
Diagnóstico de fallasDiagnóstico de erroresIniciar pruebas
@@ -1068,51 +895,43 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Iniciando servicioCopia de seguridad de la claveUsar copia de seguridad de la clave
-
La copia de seguridad de la clave no ha finalizado, por favor espere…
- No quiero mis mensajes cifrados
+ No quiero mis mensajes encriptadosCreando copia de seguridad de las claves…Usar copia de seguridad de la clave¿Estás seguro\?Copia de seguridad
- Perderá el acceso a sus mensajes cifrados si cierra sesión sin hacer una copia de seguridad de sus claves.
-
+ Perderá el acceso a sus mensajes encriptados si cierra sesión sin hacer una copia de seguridad de sus claves.QuedarseSaltarHechoCancelarIgnorar
-
Marcar como leídoIniciar sesión con single-sign-onTu dispositivo usa una versión anticuada e insegura del protocolo de seguridad TLS. Por tu seguridad no puedes conectarteAjustes avanzados de notificacionesImportancia de notificación por evento
-
Ajustes de sistema.Las notificaciones están activadas en los ajustes de sistema.Las notificaciones están desactivadas en los ajustes del sistema.
\nPor favor comprueba los ajustes de sistema.Abrir ajustes
-
Ajustes de cuenta.Las notificaciones están activadas para tu cuenta.Las notificaciones están desactivadas para tu cuenta.
\nPor favor comprueba los ajustes de cuenta.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.Activar
-
Ajustes personalizados.Ten en cuenta que algunos mensajes son silenciosos (producen una notificación sin sonido).Algunas notificaciones están desactivadas en tus ajustes personalizados.Error al cargar reglas personalizadas, por favor prueba de nuevo.Comprueba ajustes
-
Prueba de servicios Google PlayAPK de servicios de Google Play esta disponible y actualizado.Al cerrar la sesión se perderán los mensajes encriptados
@@ -1121,13 +940,11 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
El diagnóstico base se ha completado con éxito. Si aun no recibes notificaciones, por favor mándanos un informe de error.Una o más pruebas han fallado, por favor prueba las soluciones propuestas.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 del 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:
\n%1$ssolucionar error con los Servicios de Google Play
-
Token BaseToken FCM recuperada correctamente:\n%1$sError al recuperar token FCM:\n%1$s
@@ -1135,45 +952,36 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
[%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.
- añadir cuenta
-
+ Añadir cuentaToken de registroToken FCM registrado correctamente en el Servidor.Error al registrar el token FCM en el Servidor
\n%1$s
-
Servicio de notificacionesEl servicio de notificaciones esta funcionando.El servicio de notificaciones no esta funcionando.
\nIntente reiniciar la aplicación.Borrando copia de seguridad…Error al borrar la copia de seguridad (%s)
-
Borrar copia de seguridadnueva copia de seguridadEse era yo
- nunca se pierden mensajes cifrados
- Configurar copia de seguridad de las claves de cifrado
-
- Nunca pierdas mensajes cifrados
- Nuevos mensajes clave cifrados
+ Nunca pierda mensajes encriptados
+ Configurar copia de seguridad de las claves de encriptado
+ Nunca pierdas mensajes encriptados
+ Nuevas claves de encriptación de mensajesGestionar Copia de Seguridad
-
Guardando copia de seguridad…
-
VersiónAlgoritmoReinicio automático del servicio de notificacionesEmpezar servicio
-
El servicio se ha apagado y reiniciado automáticamente.Error al reiniciar el servicio
-
Inicio automáticoEl 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.
- activar Inicio automático
-
+ Activar Inicio automáticoComprobar restricciones en segundo planoLas restricciones de segundo plano están desactivadas para Element. Este debería funcionar con datos móviles (sin WIFI).
\n%1$s
@@ -1181,19 +989,15 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
\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 bateriaA Element 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íaConfigurar notificaciones de sonidoConfigurar notificaciones de llamadaConfigurar notificaciones silenciadaselegir Color de las luces LED, vibración. sonido…
-
-
Administrar Claves de la criptografíaMostrar vistas previas de enlaces en el chat cuando el servidor doméstico soporte esta característica.Enviar notificaciones de escritura
@@ -1208,82 +1012,65 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Incluye cambios en el avatar y en el nombre.Enviar mensaje con introLa tecla Intro enviará el mensaje en vez de añadir un salto de línea
-
Conexión en segundo planoElement 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.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.
-
ContraseñaActualizar contraseñaLa contraseña no es válidaLa contraseña no es correcta
-
Ha ocurrido un error tratando de verificar su número de teléfono.Información adicional: %s
-
MediaCompresión predeterminadaSeleccionarSeleccionar
- Recuperación de mensajes cifrados
+ Recuperación de mensajes encriptadosGestionar copia de seguridad clave
-
- %1$s: 1 mensaje
+ %1$s: %2$d mensaje%1$s: %2$d mensajes%d notificación%d notificaciones
-
Nuevo eventoSalaNuevos mensajesNueva invitaciónYo** Error al enviar - por favor abra la sala
-
- "Lo sentimos, las llamadas grupales con Jitsi no se pueden mantener en dispositivos antiguos (dispositivos con Android inferior a 5.0)"
-
+ Lo sentimos, las llamadas de grupo con Jitsi no están soportadas en dispositivos antiguos (dispositivos con Android inferior a 5.0)Iniciar la cámara del sistema en lugar de la pantalla de cámara personalizada.Esta opción requiere una aplicación de terceros para grabar los mensajes.
-
El comando \"%s\" necesita mas parámetros o algunos parámetros son incorrectos.Markdown activado.Markdown desactivado.
-
SilenciosoPor favor introduzca un nombre de usuario.Mostrar el área de informaciónSiemprePara mensajes y erroresSolo para errores
-
%1$s:%1$s: %2$s+%d%d+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ñaLa 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.No hay ninguna sesión de Matrix disponible
-
- Nunca se pierden los mensajes cifrados
- Los mensajes en salas cifradas están asegurados con cifrado de extremo a extremo. Solo los integrantes de la sala y tu podéis leer estos mensajes.
+ 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.
\n
\nAsegúrate de guardar bien tus claves para evitar perderlas.(Avanzado)Exportar claves manualmente
-
Asegura tu copia de seguridad con una contraseña.Almacenaremos una copia cifrada de tus claves en tu servidor. Protege tu copia de seguridad con una contraseña para mantenerla segura.
\n
@@ -1291,10 +1078,10 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Introduce una contraseñaCreando copia de seguridadO, asegura tu copia de seguridad con una clave de recuperación, guardándola en algún lugar seguro.
- "(Avanzado) preparar clave de recuperación"
+ (Avanzado) Establecer clave de recuperaciónCompletado!Tus claves se están guardando.
- Tu clave de recuperación es una red de seguridad - Puedes usarla para recuperar el acceso a tus mensajes cifrados si olvidas tu contraseña.
+ Tu clave de recuperación es una red de seguridad - puedes usarla para recuperar el acceso a tus mensajes encriptados si olvidas tu contraseña.
\nMantén tu clave de recuperación en algún lugar muy seguro como un administrador de contraseñas (o en una caja fuerte)Mantén tu clave de recuperación en algún lugar muy seguro como un administrador de contraseñas (o en una caja fuerte)Hecho
@@ -1305,7 +1092,6 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
La clave de recuperación ha sido guardada en \'%s\'.
\n
\nAtención: Este archivo podría borrarse si la aplicación es desinstalada.
-
Por favor, haga una copiaCompartir clave de recuperación con…Generando clave de recuperación usando una contraseña, este proceso puede tardar varios segundos.
@@ -1313,24 +1099,17 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Error inesperadoCopia de seguridad iniciadaTus claves cifradas están siendo guardadas en segundo plano en tu servidor. La copia de seguridad inicial podría tardar varios minutos.
-
-
Estás seguro\?Podrías perder el acceso a tus mensajes si te desconectas o pierdes este dispositivo.
-
- Utiliza tu clave de recuperación para desbloquear tu historial de mensajes cifrados
+ Utiliza tu clave de recuperación para desbloquear tu historial de mensajes encriptadosUtiliza tu clave de recuperaciónNo sabes tu clave de recuperación\? puedes %s.
-
- Utiliza tu clave de recuperación para desbloquear tu historial de mensajes cifrados
+ Utiliza tu clave de recuperación para desbloquear tu historial de mensajes encriptadosIntroduzca la clave de recuperación
-
Mensaje de recuperación
-
Has perdido tu clave de recuperación\? Puedes crear una nueva en ajustes.La copia de seguridad no se ha podido descifrar con esta contraseña: por favor verificar que has introducido la contraseña de recuperación correcta.Error de red: por favor comprueba tu conexión y vuelve a intentarlo.
-
Restaurando copia de seguridad:Creando clave de recuperación…Descargando claves…
@@ -1338,7 +1117,6 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Desbloquear historialPor favor introduce una clave de recuperaciónLa copia de seguridad no se ha podido descifrar con esta contraseña: por favor verificar que has introducido la contraseña de recuperación correcta.
-
Copia de seguridad restaurada %s !Copia de seguridad restaurada con la clave %d.
@@ -1348,111 +1126,87 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Se ha añadido %d como clave a esta sesión.Se han añadido %d como claves a esta sesión.
-
Error al recuperar la ultima versión de las claves (%s).La sesión crypto no esta activada
-
-
Restaurada desde copia de seguridadBorrar copia de seguridad
-
La copia de seguridad ha sido correctamente activada para esta sesión.La copia de seguridad ha sido correctamente desactivada para esta sesión.Tus claves no están siendo guardadas en esta sesión.
-
La copia de seguridad tiene una firma de una sesión desconocida con el ID %s.La copia de seguridad tiene una firma valida de esta sesión.La copia de seguridad tiene una firma válida para la sesión verificada %s.Usar copia de seguridad de la clave
-
Todas las claves guardadasCargando %d de la clave…Cargando %d de las claves…
-
Firma
-
autocompletar opciones del servidorElement ha detectado una configuración personalizada del servidor para el dominio de su ID de usuario \"%1$s\":
\n%2$sConfiguración de uso
-
Origen predeterminado de medios
- Configurar copia de seguridad de las claves de cifrado
+ Configurar copia de seguridad de las claves de encriptaciónObteniendo una versión de copia de seguridad…La copia de seguridad tiene una firma valida de la sesión no verificada %sLa copia de seguridad tiene una firma inválida de la sesión verificada %sLa copia de seguridad tiene una firma inválida de la sesión no verificada %sError al conseguir información de confianza para la copia de seguridad (%s).
-
Para usar la copia de seguridad de la clave en esta sesión introduzca su contraseña o su clave de recuperación ahora.
- Desea borrar sus claves cifradas guardadas del servidor\? No podrás usar tu clave de recuperación para leer el historial de mensajes cifrados.
-
+ Deseas borrar tus claves de encriptación guardadas en el servidor\? No podrás usar tu clave de recuperación para leer el historial de mensajes encriptados.Una nueva copia de seguridad de mensajes ha sido detectada.
\n
\nSi no ha establecido un nuevo método de recuperación, alguien podría estar intentando acceder a su cuenta. Cambie su contraseña y establezca un nuevo método de recuperación inmediatamente en ajustes.Respuesta inválida del descubrimiento del servidor domésticoReproducir sonido de cámara
-
Verificar sesión
-
ip desconocida
- Una nueva sesión solicita claves de cifrado.
-\nSesión: %1$s
-\nVisto por última vez: %2$s
+ Una nueva sesión solicita claves de encriptación.
+\nSesión: %1$s
+\nVisto por última vez: %2$s
\nSi no has iniciado sesión en otro dispositivo ignora esta solicitud.
- Una sesión no verificada solicita claves de cifrado.
-\nSesión: %1$s
-\nVisto por última vez: %2$s
+ Una sesión no verificada solicita claves de encriptación.
+\nSesión: %1$s
+\nVisto por última vez: %2$s
\nSi no has iniciado sesión en otro dispositivo ignora esta solicitud.
-
VerificarCompartirPetición de compartición de claveIgnorar
-
Ya existe una copia de respaldo en tu servidorParece que ya habías configurado una copia de seguridad para las claves en otra sesión. ¿Quieres reemplazarla por la nueva que has creado\?ReemplazarParar
-
Comprobando copias de respaldoTu sesión ha terminado por credenciales caducadas o inválidas.
-
Verificar comparando un texto corto.Para más seguridad, te recomendamos que hagas esto en persona o por otros medios confiables.Empezar verificaciónSolicitud de verificación
- Verifica esta sesión para marcarla como confiable. Confiar en sesiones de otros te da aún más tranquilidad cuando usas cifrado de mensajes de punto a punto.
+ Verifica esta sesión para marcarla de confianza. Marcar sesiones de otros como de confianza te da aún más tranquilidad cuando usas encriptacion de Extremo-a-Extremo.Verificar esta sesión la marcará como confiable, y también marcará como confiable tu sesión para la contraparte.
-
Verifica esta sesión confirmando los emojis que aparecen en la pantalla de la contraparteVerifica esta sesión confirmando que los siguietes números aparecen en la pantalla de la contraparte
-
Se ha recibido una solicitud de verificación.Ver solicitudEsperando confirmación de la contraparte…
-
¡Verificado!Has verificado correctamente esta sesión.
- Los mensajes con este usuario están cifrados punto a punto y no son legible por terceros.
+ Los mensajes con este usuario están encriptados de Extremo-a-Extremo y no son legibles por terceros.Ok
-
¿No aparece nada\? No todas las aplicaciones cliente soportan verificación interactiva. Usa la verificación clásica.Usar verificación clásica.
-
Verificación de claveSolicitud canceladaLa contraparte canceló la verificación.
\n%sLa verificación ha sido cancelada.
\nRazón: %s
-
Verificación de sesión interactivaSolicitud de verificación%s quiere verificar tu sesión
-
El usuario canceló la verificaciónLa verificación ha superado el límite de esperaLa sesión recibió un mensaje inesperado
@@ -1460,35 +1214,27 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Error en claveError en usuarioError desconocido
-
-
EditarResponder
-
ReintentarUnirse a una sala y empezar a usar la app.Alguien te envió una invitaciónInvitado por %s
-
No tienes más mensajes sin leer¡Bienvenido!ConversacionesTus conversaciones directas (1 a 1) se mostrarán aquíSalasTus salas se mostrarán aquí
-
ReaccionesDe acuerdoMe gustaAñadir reacciónVer reaccionesReacciones
-
Evento borrado por el usuarioEvento moderado por el administrador de la salaÚltima edición por %1$s on %2$s
-
-
Evento con error, no se puede mostrarCrear salaNo hay red, por favor comprueba tu conexión a internet.
@@ -1496,24 +1242,19 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Cambiar redEspere por favor…Todas la comunidades
-
Esta sala no se puede previsualizarLa previsualización de salas públicas no es posible todavía con Element
-
SalasMensajes directos
-
Nueva salaCREAR
- Nombre de la sala
+ NombrePúblicoCualquiera puede unirse a esta salaDirectorio de salasPublicar esta sala en el directorio de salas
-
Error obteniendo información de confiabilidadError obteniendo claves para copias de respaldo
-
!Estás al día!PreferenciasSeguridad & Privacidad
@@ -1522,31 +1263,23 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Por favor escriba su sugerencia a continuación.Describa su sugerencia aquíLatn
-
NingunoRevocarDesconectarRevisarDeclinar
-
No se ha configurado un servidor de identidad.
-
La llamada ha fallado por un servidor mal configuradoIntente usar %sNo volver a preguntar
-
Para hacer esto, vaya a las opciones y añada un servidor de identidad.Confirme su contraseñaEso no se puede hacer en Element para móvilSe necesita autenticación
-
-
Optimizado para bateríaOptimizado para operar en tiempo realSin sincronización en segundo planoNo se han podido actualizar las opciones.
-
-
IntegracionesDescubrimientoGestione sus preferencias de descubrimiento.
@@ -1562,7 +1295,7 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
El SAS no coincidió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 (Experimental)
+ Modo Sincronización en segundo planoElement 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).
@@ -1575,7 +1308,6 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
\nLos Gestores de Integración reciben los datos de configuración y pueden modificar los widgets, enviar invitaciones a salas y establecer niveles de poder en su nombre.Permitir integracionesAdiministrador de integraciones
-
Nombre público (visible por las personas con quien te comuniques)Un nombre de sesión público es visible por las personas con quién te comunicasWidget
@@ -1588,110 +1320,77 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Recargar widgetAbrir en el navegadorRevocar acceso para mi
-
Tu nombre visibleLa URL de tu avatarTu ID de usuariaTu temaID de WidgetID de Sala
-
-
Este widget quiere usar los siguientes recursos:PermitirBloquear todosUsar la cámaraUsar el micrófonoLeer medios protegidos por DRM
-
No se ha configurado ningún administrador de integraciones.Para continuar es necesario que aceptes los Términos de este servicio.
-
La sesión no sabe nada de esa transacciónLa sesión no puede acordar el acuerdo de llaves, hash, MAC o método SASEl compromiso hash no ha coincididoNo estás usando ningún Servidor de IdentidadNo hay ningún Servidor de Identidad configurado, esto es requerido para restablecer tu contraseña.
-
Parece que estás intentando conectarte a otro servidor doméstico. ¿Quieres cerrar sesión\?
-
Importar llaves E2E des del fichero \"%1$s\".
-
Versión del SDK de MatrixOtros avisos de terceros¡Ya estas viendo esta sala!
-
Reacciones rápidas
-
CuentaExpertoReglas PushNo hay reglas push definidasNo hay salidas push registradas
-
app_id:push_key:app_display_name:Url:Formato:
-
Ayuda y Acerca de
-
-
Registrar token
-
Gracias, la sugerencia ha sido enviada correctamenteEl envio de la sugerencia ha fallado (%s)
-
Mostrar eventos ocultos en la línea de tiempo
-
Mensajes Directos
-
Esperando…Cifrando la miniatura…Enviando miniatura (%1$s / %2$s)Cifrando el archivo…Enviando el archivo (%1$s / %2$s)
-
Descargando archivo %1$s…¡El archivo %1$s ha sido descargado!
-
(editado)
-
-
Modificación de mensajesNo se han encontrado modificaciones
-
Filtrar conversaciones…¿No encuentras lo que buscas\?Crear una nueva salaEnviar un nuevo mensaje directoVer el directorio de la sala
-
Nombre o ID (#ejemplo:servidor.org)
-
Habilitar \"desplazar para contestar\" en la línea de tiempo
-
Enlace copiado al portapapeles
-
Agregar por ID de matrixCreando sala…No se ha encontrado ningún resultado, utiliza \"Agregar usando ID de matrix\" para buscar en el servidor.Empieza a escribir para ver resultadosFiltrar por usuario o ID…
-
Entrando en la sala…
-
Ver historial de modificaciones
-
Términos de ServicioRevisar TérminosSer descubierta por otrosUtiliza Bots, puentes, widgets y packs de stickers
-
Leer en
-
-
Servidor de identidadDesconectar servidor de identidadConfigurar servidor de identidad
@@ -1705,27 +1404,19 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Teléfonos para ser descubiertoTe hemos enviado un correo de confirmación a %s, comprueba tu correo y haz click en el enlace de confirmaciónPendiente
-
Entra en un nuevo servidor de identidadNo se ha podido conectar al servidor de identidadPorfavor entra la url del servidor de identidadEl servidor de identidad no tiene términos de servicioEl servidor de identidad que has escojido no tiene términos de servicio. Solo continúa si confias en el propietario del servicioUn mensaje de texto ha sido enviado a %s. Porfavor escribe el código de verificación que contiene.
-
Actualmente estás compartiendo direcciones de correo electrónico o números de teléfono en el servidor de identidad %1$s. Necesitarás reconectarte a %2$s para dejar de compartirlos.Acepte los términos de servicio del servidor de identidad (%s) para permitir que sea descubierto por correo electrónico o número de teléfono.
-
Habilitar registros extensos.Los logs extensivos ayudarán a los desarrolladores proporcionando más información cuando envíes un \"RageShake\" (Sacudir el dispositivo). Incluso cuando esto está habilitado, la aplicación no registra el contenido de los mensajes ni ningún otro dato privado.
-
-
Por favor, vuelva a intentarlo una vez que haya aceptado los términos y condiciones de su servidor.
-
Parece que el servidor está tardando demasiado en responder, esto puede ser causado por una mala conectividad o un error con el servidor. Por favor, inténtelo de nuevo en un rato.
-
Enviar el archivo adjunto
-
Abrir el cajón de navegaciónAbrir el menú de creación de salaCerrar el menú de creación de sala…
@@ -1735,17 +1426,14 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Mostrar contraseñaEsconder contraseñaSaltar al final
-
Leído por %1$s, %2$s y %3$sLeído por %1$s y %2$sLeído por %s
- Leído por 1 usuario
- Leído por %d usuarias
+ Leído por %d usuario
+ Leído por %d usuarios
-
El archivo \'%1$s\' (%2$s) es demasiado grande para ser subido. El límite es %3$s.
-
Ha ocurrido un error recuperando el archivo adjunto.ArchivoContacto
@@ -1754,7 +1442,6 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
GaleríaPegatinaNo se han podido compartir los datos
-
Es spamEs inapropiadoReporte personalizado…
@@ -1762,28 +1449,23 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Razón por la que se ha reportado el contenidoREPORTARBLOQUEAR USUARIO
-
Contenido reportado
- El contenido ha sido reportado
+ El contenido ha sido reportado.
\n
-\nSi no quieres ver más contenido de este usuario, puedes bloquearlo para ocultar sus mensajes
+\nSi no quieres ver más contenido de este usuario, puedes bloquearlo para ocultar sus mensajes.Reportar como spamEste contenido ha sido reportado como spam.
\n
-\nSi no quieres ver más contenido de este usuario, puedes bloquearlo para ocultar sus mensajes
+\nSi no quieres ver más contenido de este usuario, puedes bloquearlo para ocultar sus mensajes.Reportado como inapropiadoEste contenido fue reportado como inapropiado.
\n
-\nSi no quieres ver más contenido de este usuario, puedes bloquearlo para ocultar sus mensajes
-
+\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.
\n
\nPorfavor permite el acceso en el siguiente pop-up para poder exportar tus claves manualmente.
-
No hay conexión de red
-
Ignorar usuario
-
Todos los mensajes (sonido)Todos los mensajesSolo menciones
@@ -1794,29 +1476,22 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Envía el mensaje como spoilerRevelaciónEscribe las palabras clave para encontrar una reacción.
-
No hay usuarios ignorados
-
Mantén pulsada una sala para ver más opciones
-
-
%1$s ha hecho la sala pública para cualquier persona con el link.%1$s: Ahora la sala solo es accesible por invitación.Mensajes no leídos
-
- Es tu conversación. Me pertenece.
+ Es tu conversación. Sé su dueño.Envía mensajes a personas o gruposMantén las conversaciones privadas con encriptaciónExtiende y personaliza tu experienciaEmpieza
-
Selecciona un servidorComo el correo electrónico, las cuentas tienen un hogar, aunque se puede hablar con cualquieraAlojamiento de pago para organizacionesSaber másOtroAjustes avanzados y de personalización
-
ContinuarConectarse a %1$sConectarse a Element Matrix Services
@@ -1828,34 +1503,26 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Alojamiento de pago para organizacionesIntroduzca la dirección de Modular Element o servidor que quieres usarIntroduzca 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. Este solo soporta el acceso mediante: %1$s.
+ La aplicación no es capaz de iniciar sesión en este servidor. Éste solo soporta el acceso mediante: %1$s.
\n
-\n¿Quieres acceder usando un cliente web\?"
+\n¿Quieres acceder usando un cliente web\?Lo sentimos, este servidor no acepta nuevas cuentas.La aplicación no fue capaz de crear una cuenta en este servidor.
\n
\n¿Quieres registrarte usando un cliente web\?
-
La dirección de coreo electrónico no está asociada a ninguna cuenta.
-
Reiniciar contraseña en %1$s¡Las claves ya están al día!
-
ReproducirPausarDescartar
-
-
CopiarCorrecto
-
NotificacionesElement Fallo la LlamadaFallo al intentar establecer conexion.
\nTURN Server fallo. Por favor, contacte con el administrador de su Servidor y notifique el fallo.
-
Seleccionar Dispositivo de SonidoTelefonoAltavoz
@@ -1866,22 +1533,20 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
TraceraApagar HDActivar HD
-
Error SSl: la identidad del par no a sido verificada.Error SSL.Permitir servidor de asistencia de llamadasLlamada activa (%s)Regresar a la llamada
-
Cancelar invitaciónIgnorar UsuarioCancelar InvitacionPor favor, elija un nombre de usuario.Por favor, elija una contraseña.Verifica este enlace
- Este link %1$s loredirecciona a otro sitio %2$s. .
-\nEsta seguro de continuar\?
-
+ Este link %1$s lo redirecciona a otro sitio %2$s.
+\n
+\n¿Está seguro de continuar\?Adicionar miembrosINVITARInvitando usuarios…
@@ -1893,11 +1558,9 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Invitaciones enviadas a %$s y a %2$d másNo se pudo invitar el usuario. Por favor, intente nuevamente.
-
Idioma actualOtros idiomas disponiblesCargando lenguajes disponibles…
-
Leer los terminos de %sDesconectarse del servidor de Identidad %s\?Servidor de identidad desactualizado. Element solo soporta API V2.
@@ -1906,20 +1569,17 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Riot ahora es Element!EntendidoAprender Mas
-
Element
-
-
Buscar en mis contactosRechazar invitaciónConfirma PIN para desabilitarloNo posee permisos para iniciar una conferencia en esta salaConferencia en progreso!
- Iniciar Video Conferencia
- Iniciar Audio Conferencia
- No puedes hacer una llamada contigo mismo
- No puedes hacer una llamada contigo mismo, espera a que los participantes acepten la invitación
- Fallo al adicionar Widget
+ Iniciar Videoconferencia
+ Iniciar Audioconferencia
+ No puedes hacer llamarte a tí mismo
+ No puedes hacer llamarte a tí mismo, espera a que los participantes acepten la invitación
+ Fallo al añadir WidgetFallo al eliminar WidgetConfirmar llamadaPedir confirmacion antes de iniciar una llamda
@@ -1928,14 +1588,10 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Rason de baneoDesbanear usuarioDesbanear usuario y permitir entrar a la sala nuevamente.
-
nombre_session:Adicionar pestaña dedicada para notificaciones no leidas en la pantalla principal.
-
Descripcion muy corta
-
Sincronización inicial…
-
Mostrar todas mis sessionesOpciones AvanzadasModo Desarrollador
@@ -1946,33 +1602,25 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
AjustesSesión ActualOtras 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
-
Antepone ¯\\_(ツ)_/¯ a un mensaje de texto sin formato
-
Habilitar encriptacion
- Una vez habilitada, el cifrado no se puede deshabilitar.
-
+ Una vez habilitada, la encriptación no se puede deshabilitar.Su dominio de correo electrónico no está autorizado para registrarse en este servidor
-
Inicio de sesión no confiableCoincidenNo coincidenVerifique a este usuario confirmando que el siguiente emoji único aparece en su pantalla, en el mismo orden.Para mayor seguridad, use otro medio de comunicación confiable o hágalo en persona.Busque el escudo verde para asegurarse de que se confía en un usuario. Confíe en todos los usuarios de una sala para asegurarse de que la sala sea segura.
-
No seguroVideo.Imagen.AudioArchivo
- Sticker
-
+ PegatinaEsperando…%s canceladaCancelado por usted
@@ -1982,25 +1630,19 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Solicitud de verificaciónVerifica esta SesionVerificar manualmente
-
Usted
-
Escanee el código con el dispositivo del otro usuario para verificarse mutuamente de forma seguraEscanear códigoError al escanearSi no estás en persona, compara los emojis
-
Verificar comparando emojis
-
Verificar por emojisSi no puede escanear el código anterior, verifique comparando una selección breve y única de emoji.
-
Imagen de código QR
-
Verificar %sVerificado %sEsperando por %s…
- Los mensages en esta sala no están encriptados punto a punto.
+ Los mensajes en esta sala no están encriptados de Extremo-a-Extremo.SeguridadSaber masMas
@@ -2014,141 +1656,103 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Archivos, Medias y DocumentosAbandonar SalaSaliendo de la sala…
-
AdministradoresModeradoresNivel PersonalizadoInvitadosUsuarios
-
Administrador en %1$sModerador en %1$sNivel Personalizado en %1$sNivel 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\'
-
Dejar de ignorar
-
Salas recientesOtras salas
-
Envía el mensaje dado en coloresLínea de tiempo
-
Editor de mensage
-
Encriptar (end-to-end)
- Una vez habilitado, el cifrado no se puede deshabilitar.
-
+ Una vez habilitada, la encriptación no se puede deshabilitar.Encriptar \?
- Habilitar el cifrado
-
+ Habilitar la encriptaciónFirma cruzadaFirma cruzada no habilitada
-
Sesiones ActivasMostrar todas las SesionesAdministrar SesionesCerrar Sesión
-
Verificar este inicio de sesiónOtros usuarios pueden no confiar en la sesionCompletar Seguridad
-
VerificarVerificadaPrecaucion
-
Error al obtener sesionesSesionesConfirmadoNo es confiable
-
Inicializar Firmas CruzadasRestablecer claves
-
Codigo QR
-
CorrectoNo
-
Sin conexiónModo Avión Activado
-
Herramientas de desarrolloDatos de cuentaSeleccionar OpcionNuevo inicio de sesión
-
Advertencia:Remover…RazónRazón para redactar
-
Element Android
-
Refrescar
-
Nuevo inicio de sesión detectado . ¿Fue usted\?Toca para revisar y verificarEste no era yoSu cuenta puede estar comprometida
-
Verificación cancelada
-
Frase de contraseña de recuperaciónClave de mensajeContraseña de la cuenta
-
¡Listo!
- Cifrado habilitado
+ Encriptación habilitadaSala creada y configurada por usted.
-
Esperando por %s…
-
Ajuste de NotificacionesMensaje…
-
Introduza su %s para continuarUsar archivo
-
No se pudo guardar el archivo multimediaVerificar SesiónConfirmar PINResetear PINNuevo PIN
- Para resetear su PIN, debe iniciar sección y crear uno nuevo.
+ Para resetear su PIN, debe iniciar sesión y crear uno nuevo.Establecer PINSi decea resetear su PIN, toque Olvidé PIN para cerrar sesión y restablecer.Numeros telefonicosCorreos y numeros telefonicosAdministre el correo y numero telefonico de su cuenta
-
Mostrar mensages eliminadosIndicar marca de mensaje eliminadoARCHIVOSNo se han subido archivos a la sala
-
Establecer notificaciones por eventos
-
Establecer una nueva contraseña…
-
Las reuniones utilizan políticas de seguridad y permisos de Jitsi. Todas las personas que se encuentren actualmente en la sala verán una invitación para unirse mientras se lleva a cabo la reunión.AceptarDeclinarColgar
-
Este número de teléfono ya está definido.¿Degradarte\?No podrá deshacer este cambio ya que se está degradando, si es el último usuario privilegiado en la sala, será imposible recuperar los privilegios.Degradar
-
-
Si ignora a este usuario, se eliminarán sus mensajes de las salas que comparte.
\n
\n Puede revertir esta acción en cualquier momento en la configuración general.
@@ -2164,56 +1768,42 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
No se ha agregado ningún correo electrónico a su cuenta¿Elimina %s\?Asegúrese de haber hecho clic en el enlace del correo electrónico que le enviamos.
-
Copia de seguridad seguraGestionarConfigurar copia de seguridad seguraRestablecer copia de seguridad seguraConfigurar en este dispositivo
- Protéjase contra la pérdida de acceso a los mensajes y datos cifrados haciendo una copia de seguridad de las claves de cifrado en su servidor.
+ Protéjase contra la pérdida de acceso a los mensajes y datos encriptados haciendo una copia de seguridad de las claves de encriptado en su servidor.Genere una nueva llave de seguridad o establezca una nueva frase de seguridad para su copia de seguridad existente.Esto reemplazará su clave o frase actual.
-
Las integraciones están deshabilitadasHabilite \'Permitir integraciones\' en Configuración para hacer esto.
-
%d usuario prohibido%d usuarios prohibidos
-
Claves exportadas correctamente
-
%1$d/%2$d clave importada con éxito.%1$d/%2$d claves importadas con éxito.
-
%1$s: %2$s%1$s: %2$s %3$s
-
VERWidgets activos
-
-
Gestionar integracionesSin widgets activosLa clave de recuperación se ha guardada.
-
Copia de seguridad segura
- Protéjase contra la pérdida de acceso a mensajes y datos cifrados
-
+ Protéjase contra la pérdida de acceso a mensajes y datos encriptadosConfigurar copia de seguridad segura
-
Mensaje borradoSe ha creado la sala, pero algunas invitaciones no se han enviado por el siguiente motivo:
\n
\n%s
-
Le enviamos un correo electrónico de confirmación %s, primero revise su correo electrónico y haga clic en el enlace de confirmaciónCódigoEl código de verificación no es correcto.
-
%1$s, %2$s y %3$d otra lectura%1$s, %2$s y %3$d otras lecturas
@@ -2226,101 +1816,83 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
No hiciste cambiosHiciste que la sala fuera pública para quien conozca el enlace.Hiciste la sala solo por invitación.
- Únase a millones gratis en el servidor público más grande
+ Únase gratis a millones en el servidor público más grandeContinuar con SSO
-
Dirección de servicios de Element MatrixIngrese la dirección del servidor que desea utilizar
-
Se enviará un correo electrónico de verificación a su bandeja de entrada para confirmar la configuración de su nueva contraseña.
- Próximo
+ SiguienteEmailNueva contraseña
-
¡Advertencia!
- Cambiar su contraseña restablecerá cualquier clave de cifrado de extremo a extremo en todas sus sesiones, haciendo ilegible el historial de chat cifrado. Configure Key Backup o exporte las llaves de su sala desde otra sesión antes de restablecer su contraseña.
+ Cambiar su contraseña restablecerá cualquier clave de encriptado de Extremo-a-Extremo en todas sus sesiones, haciendo ilegible el historial de chat encriptado. Configure la Copia de seguridad de claves o exporte las claves de su sala desde otra sesión antes de restablecer su contraseña.Seguir
-
Este correo electrónico no está vinculado a ninguna cuenta
-
Revisa tu correoSe envió un correo electrónico de verificación a %1$s.Toque el enlace para confirmar su nueva contraseña. Una vez que haya seguido el enlace que contiene, haga clic a continuación.He verificado mi dirección de correo electrónico
-
¡Éxito!Tu contraseña ha sido restablecida.Ha cerrado sesión en todas las sesiones y ya no recibirá notificaciones automáticas. Para volver a habilitar las notificaciones, inicie sesión nuevamente en cada dispositivo.Volver a Iniciar sesión
-
Advertenciau contraseña aún no ha cambiado.
\n
\n¿Detener el proceso de cambio de contraseña\?
-
Establecer dirección de correo electrónicoConfigure un correo electrónico para recuperar su cuenta. Más tarde, opcionalmente, puede permitir que las personas que conoce lo descubran mediante su correo electrónico.Correo electrónicoEmail (opcional)
- Próximo
-
+ SiguienteEstablecer número de teléfonoConfigure un número de teléfono para permitir que las personas que conoce lo descubran opcionalmente.Utilice el formato internacional.Número de teléfonoNumero de teléfono (opcional)
- Próximo
-
+ SiguienteConfirmar número de teléfonoAcabamos de mandar un codigo a %1$s. Ingréselo a continuación para verificar que es usted.Introduzca el códigoEnviar de nuevo
- Próximo
-
+ SiguienteUtilice el formato internacional (el número de teléfono debe comenzar con \'+\')Los números de teléfono internacionales deben comenzar con \'+\'El número de teléfono parece no válido. Compruébelo por favor
-
Inscribirse a %1$sNombre de usuario o correo electrónicoNombre de usuarioContraseña
- Próximo
+ SiguienteEse nombre de usuario está siendo usadoAdvertenciaTu cuenta aún no está creada.
\n
\n ¿Detener el proceso de registro\?
-
Seleccione matrix.orgSeleccionar servicios de matriz de elementosSeleccione un servidor doméstico personalizadoRealiza el desafío de captchaAcepta los términos para continuar
-
Por favor revise su correo electrónicoAcabamos de enviar un correo electrónico a %1$s.
\nHaga clic en el enlace que contiene para continuar con la creación de la cuenta.El código introducido no es correcto. Por favor, compruebe.Servidor doméstico obsoletoEste servidor doméstico está ejecutando una versión demasiado antigua para conectarse. Pídale al administrador de su servidor doméstico que actualice.
-
Se han enviado demasiadas solicitudes. Puedes volver a intentarlo en %1$d segundo…Se han enviado demasiadas solicitudes. Puedes volver a intentarlo en %1$d segundos…
-
Alternativamente, si ya tiene una cuenta y conoce su identificador Matrix y su contraseña, puede usar este método:Iniciar sesión con Matrix IDIniciar sesión con Matrix IDSi configura una cuenta en un servidor doméstico, use su ID de Matrix (por ejemplo, @user: dominio.com) y contraseña a continuación.ID de MatrixSi no conoce su contraseña, vuelva a restablecerla.
- "Este no es un identificador de usuario válido. Formato esperado: \'@user:homeserver.org\'"
+ Éste no es un identificador de usuario válido. Formato esperado: \'@user:homeserver.org\'No se pudo encontrar un servidor de inicio válido. Por favor verifique su identificador
-
Visto por
-
Estás desconectadoPuede deberse a varias razones:
\n
@@ -2330,54 +1902,48 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
\n
\n• El administrador de su servidor ha invalidado su acceso por motivos de seguridad.Iniciar sesión de nuevo
-
Estás desconectadoRegistrarse
- "El administrador de su servidor doméstico (%1$s) ha cerrado la sesión de su cuenta %2$s (%3$s)."
- Inicie sesión para recuperar las claves de cifrado almacenadas exclusivamente en este dispositivo. Los necesita para leer todos sus mensajes seguros en cualquier dispositivo.
+ El administrador de su servidor privado (%1$s) ha cerrado la sesión de su cuenta %2$s (%3$s).
+ Inicie sesión para recuperar las claves de encriptación almacenadas exclusivamente en este dispositivo. Los necesita para leer todos sus mensajes seguros en cualquier dispositivo.RegistrarseContraseñaBorrar datos personales
- Advertencia: sus datos personales (incluidas las claves de cifrado) todavía se almacenan en este dispositivo.
+ Advertencia: sus datos personales (incluidas las claves de encriptación) todavía están almacenadas en este dispositivo.
\n
\nBórrelo si terminó de usar este dispositivo o si desea iniciar sesión en otra cuenta.Borrar todos los datos
-
Borrar datos¿Borrar todos los datos almacenados actualmente en este dispositivo\?
\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 cifrado.
+ 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 es compatible con Element. Primero borre los datos, luego inicie sesión nuevamente con otra cuenta.
-
+ 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.
+\nPrimero borre los datos, luego inicie sesión nuevamente con otra cuenta.Su enlace matrix.to estaba mal formadoEl modo desarrollador activa funciones ocultas y también puede hacer que la aplicación sea menos estable. ¡Solo para desarrolladores!
- Uno de los siguientes puede verse comprometido:
-\n- Tu servidor doméstico
-\n- El servidor doméstico al que está conectado el usuario que estás verificando
-\n- La suya o la conexión a Internet de otros usuarios
-\n- El suyo o el dispositivo de otros usuarios
-
+ Uno de los siguientes puede verse comprometido:
+\n
+\n- Tu servidor privado
+\n- El servidor privado al que está conectado el usuario que estás verificando
+\n- Su conexión a internet o la de otros usuarios
+\n- Su dispositivo o el de otros usuariosPara mayor seguridad, verifique %s verificando un código único en ambos dispositivos.
\n
\nPara máxima seguridad, hágalo en persona.
- Los mensajes de esta sala están cifrados de extremo a extremo.
+ Los mensajes de esta sala están encriptados de Extremo-a-Extremo.
\n
\nSus mensajes están protegidos con candados y solo usted y el destinatario tienen las claves únicas para desbloquearlos.Esta sesión no puede compartir esta verificación con sus otras sesiones.
\nLa verificación se guardará localmente y se compartirá en una versión futura de la aplicación.
-
Envía el emote dado coloreado como un arcoíris
-
- Una vez habilitado, el cifrado de una sala no se puede deshabilitar. Los mensajes enviados en una sala cifrada no pueden ser vistos por el servidor, solo por los participantes de la sala. Habilitar el cifrado puede evitar que muchos bots y puentes funcionen correctamente.
+ Una vez habilitado, la encriptación de una sala no se puede deshabilitar. Los mensajes enviados en una sala encriptada no pueden ser vistos por el servidor, solo por los participantes de la sala. Habilitar la encriptación puede impedir que muchos bots y puentes funcionen correctamente.Para estar seguro, verifique %s comprobando un código de un solo uso.Para estar seguro, hágalo en persona o use otra forma de comunicarse.
-
Compare los emoji únicos, asegurándose de que aparezcan en el mismo orden.Compare el código con el que se muestra en la pantalla del otro usuario.Los mensajes con este usuario están encriptados de extremo a extremo y no pueden ser leídos por terceros.
- Su nueva sesión ahora está verificada. Tiene acceso a sus mensajes cifrados y otros usuarios lo verán como de confianza.
-
+ Su nueva sesión ahora está verificada. Tiene acceso a sus mensajes encriptados y otros usuarios lo verán como de confianza.La firma cruzada está habilitada
\n Claves privadas en el dispositivo.La firma cruzada está habilitada
@@ -2385,25 +1951,18 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
\nNo se conocen las claves privadasLa firma cruzada está habilitada.
\nLas claves no son de confianza
- El administrador de su servidor ha desactivado el cifrado de extremo a extremo de forma predeterminada en salas privadas y mensajes directos.
+ El administrador de su servidor ha desactivado la encriptación de Extremo-a-Extremo de forma predeterminada en salas privadas y mensajes directos.No hay información criptográfica disponible
-
Esta sesión es confiable para mensajería segura porque usted la verificó:Verifique esta sesión para marcarla como confiable y otorgarle acceso a mensajes encriptados. Si no inició sesión en esta sesión, su cuenta puede verse comprometida:
-
%d sesión activa%d sesiones activas
-
- Utilice una sesión existente para verificar esta, otorgándole acceso a los mensajes cifrados.
-
-
- "Esta sesión es confiable para mensajería segura porque %1$s (%2$s) la verificó:"
+ Utilice una sesión existente para verificar ésta, otorgándole acceso a los mensajes encriptados.
+ Esta sesión es de confianza para mensajería segura porque %1$s (%2$s) la ha verificado:%1$s (%2$s) iniciado sesión con una nueva sesión:Hasta que este usuario confíe en esta sesión, los mensajes enviados hacia y desde ella se etiquetan con advertencias. Alternativamente, puede verificarlo manualmente.
-
-
¡Casi ahí! ¿Es %s muestra el mismo escudo\?%d voto
@@ -2416,31 +1975,24 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Crea una encuesta simpleUse una contraseña o clave de recuperaciónSi no puede acceder a una sesión existente
-
No puedo encontrar secretos almacenadosIngrese la contraseña de almacenamiento secretaSolo debe acceder al almacenamiento secreto desde un dispositivo confiable
-
¿Quieres enviar este adjunto a %1$s\?Enviar imagen con el tamaño originalEnvía imágenes con el tamaño original
-
Confirmar eliminación¿Está seguro de que desea eliminar (eliminar) este evento\? Tenga en cuenta que si elimina el nombre de una sala o el cambio de tema, podría deshacer el cambio.Evento eliminado por el usuario, motivo: %1$sEvento moderado por el administrador de la sala, motivo: %1$s
-
Solicitudes clave
-
- Desbloquear el historial de mensajes cifrados
-
+ Desbloquear el historial de mensajes encriptadosUtilice esta sesión para verificar su nuevo, otorgándole acceso a mensajes encriptados.Si cancela, no podrá leer mensajes encriptados en este dispositivo y otros usuarios no confiarán en élSi cancela, no podrá leer mensajes encriptados en su nuevo dispositivo y otros usuarios no confiarán en élNo verificarás %1$s (%2$s) si cancelas ahora. Comience de nuevo en su perfil de usuario.
-
Uno de los siguientes puede verse comprometido:
\n
\n- Tu contraseña
@@ -2449,29 +2001,21 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
\n- La conexión a Internet que está usando cualquiera de los dispositivos
\n
\nLe recomendamos que cambie su contraseña y clave de recuperación en Configuración de inmediato.
-
Verifique sus dispositivos desde Configuración.Establecer un %sGenerar una clave de mensaje
-
Confirmar %s
-
- "Ingrese su %s para continuar."
-
- Proteja y desbloquee los mensajes cifrados y confíe en %s.
+ Ingrese su %s para continuar.
+ Proteja y desbloquee los mensajes encriptados y confíe en %s.Ingrese su %s nuevamente para confirmarlo.No use la contraseña de su cuenta.
-
Ingrese una frase de seguridad que solo usted conozca, que se usa para proteger secretos en su servidor.
-
Esto puede tardar varios segundos, tenga paciencia.Configurando la recuperación.Tu clave de recuperaciónManténlo seguroTerminar
-
Utilice este %1$s como red de seguridad en caso de que olvide su %2$s.
-
Publicar claves de identidad creadasGenerando clave segura a partir de frase de contraseñaDefinición de la clave predeterminada de SSSS
@@ -2479,54 +2023,42 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Sincronización de la clave de usuarioSincronización de la clave de autofirmaConfiguración de copia de seguridad de claves
-
-
Tus %2$s y %1$s ahora están configurados.
\n
-\n¡Mantenlos a salvo! Los necesitará para desbloquear mensajes cifrados y proteger la información si pierde todas sus sesiones activas.
-
+\n¡Mantenlos a salvo! Los necesitará para desbloquear mensajes encriptados y proteger la información si pierde todas sus sesiones activas.Imprímelo y guárdalo en un lugar seguroGuárdelo en una llave USB o unidad de respaldoCópielo en su almacenamiento personal en la nube
-
No puedes hacer eso desde el móvil
-
- Establecer una frase de contraseña de recuperación le permite proteger y desbloquear mensajes cifrados y de confianza.
+ Establecer una frase de contraseña de recuperación le permite proteger y desbloquear mensajes encriptados y de confianza.
\n
\nSi no desea establecer una contraseña de mensaje, genere una clave de mensaje.
- Establecer una frase de contraseña de recuperación le permite proteger y desbloquear mensajes cifrados y de confianza.
- Si cancela ahora, puede perder mensajes y datos cifrados si pierde el acceso a sus inicios de sesión.
+ Establecer una frase de contraseña de recuperación le permite proteger y desbloquear mensajes encriptados y de confianza.
+ Si cancela ahora, puede perder mensajes y datos encriptados si pierde el acceso a sus inicios de sesión.
\n
\nTambién puede configurar la Copia de seguridad segura y administrar sus claves en Configuración.
-
- Los mensajes de esta sala están cifrados de extremo a extremo. Obtenga más información y verifique a los usuarios en su perfil.
- Cifrado no habilitado
- El cifrado utilizado por esta sala no es compatible
-
+ Los mensajes de esta sala están encriptados de Extremo-a-Extremo. Obtenga más información y verifique a los usuarios en su perfil.
+ Encriptación no habilitada
+ La encriptación usada por esta sala no es compatible%s creado y configurado la sala.¡Casi ahí! ¿El otro dispositivo muestra el mismo escudo\?¡Casi ahí! Esperando confirmación…No se pudieron importar las claves
-
Mensajes que contienen @room
- Mensajes cifrados en chats uno a uno
- Mensajes cifrados en chats grupales
+ Mensajes encriptados en chats 1:1
+ Mensajes encriptados en chats de grupoCuando las salas son actualizadasSolucionar problemasEnvía un mensaje como texto estándar, sin interpretarlo como Markdown
-
Nombre de usuario y / o contraseña incorrectos. La contraseña ingresada comienza o termina con espacios, verifíquela.Esta cuenta ha sido desactivada.
-
Mejora de encriptación disponibleHabilitar la firma cruzadaVerifíquese a usted mismo y a los demás para mantener sus chats seguros
-
Entrar %sFrase de contraseña de recuperaciónNo es una clave de recuperación válidaPor favor introduce una clave de recuperación
-
Comprobando la clave de respaldoComprobando la clave de respaldo (%s)Obteniendo clave de curva
@@ -2535,15 +2067,12 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Generando clave SSSS a partir de clave de recuperaciónAlmacenar el secreto de la copia de seguridad de claves en SSSS%1$s (%2$s)
-
Ingrese su Frase de contraseña de respaldo de clave para continuar.use su clave de recuperación de Key BackupNo conoces tu frase de contraseña de copia de seguridad clave, puedes %s.Clave de recuperación de copia de seguridad
-
Evitar capturas de pantalla de la aplicaciónAl 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íaNo se pudo agregar el archivo multimedia a la GaleríaUtilice 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
@@ -2560,28 +2089,22 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Seleccione su clave de recuperación o introdúzcala manualmente escribiéndola o pegándola desde su portapapelesLa copia de seguridad no se pudo descifrar con esta clave de recuperación: verifique que ingresó la clave de recuperación correcta.No se pudo acceder al almacenamiento seguro
-
Sin encriptar
- Cifrado por un dispositivo no verificado
+ Encriptado por un dispositivo no verificadoRevise dónde inició sesiónVerifique todas sus sesiones para asegurarse de que su cuenta y sus mensajes estén segurosVerifique el nuevo inicio de sesión accediendo a su cuenta: %1$s
-
Verificar manualmente por textoVerificación interactiva por emoji
- Confirme su identidad verificando este inicio de sesión de una de sus otras sesiones, otorgándole acceso a los mensajes cifrados.
- Confirme su identidad verificando este inicio de sesión, otorgándole acceso a los mensajes cifrados.
+ 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.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 identidadUtilizar %1$sAlternativamente, puede ingresar cualquier otra URL del servidor de identidad
@@ -2594,56 +2117,44 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
Activar el sonido del micrófonoDetén la cámaraEnciende la cámara
-
Configurar copia de seguridad segura
-
Respaldo seguro
- Protéjase contra la pérdida de acceso a los mensajes y datos cifrados haciendo una copia de seguridad de las claves de cifrado en su servidor.
+ Protéjase contra la pérdida de acceso a los mensajes y datos encriptados haciendo una copia de seguridad de las claves de encriptación en su servidor.PrepararUsa una llave de seguridadGenere una clave de seguridad para almacenar en un lugar seguro, como un administrador de contraseñas o una caja fuerte.Utilice una frase de seguridadIngrese una frase secreta que solo usted conozca y genere una clave de respaldo.
-
Guarde su llave de seguridadGuarde su llave de seguridad en un lugar seguro, como un administrador de contraseñas o una caja fuerte.
-
Establecer una frase de seguridadIngrese una frase de seguridad que solo usted conozca, que se usa para proteger secretos en su servidor.Frase de seguridadIngrese su Frase de seguridad nuevamente para confirmarla.
-
Guarde su llave de seguridadGuarde su llave de seguridad en un lugar seguro, como un administrador de contraseñas o una caja fuerte.
-
Nombre de la SalaTemaCambiaste la configuración de la sala con éxito
-
No puedes acceder a este mensajeEsperando este mensaje, esto puede tardar un pocoNo se puede descifrar
- Debido al cifrado de extremo a extremo, es posible que deba esperar a que llegue el mensaje de alguien porque las claves de cifrado no se le enviaron correctamente.
+ Debido a la encriptación de Extremo-a-Extremo, es posible que deba esperar a que llegue el mensaje de alguien porque las claves de encriptación no se le enviaron correctamente.No puede acceder a este mensaje porque ha sido bloqueado por el remitenteNo puede acceder a este mensaje porque el remitente no confía en su sesiónNo puede acceder a este mensaje porque el remitente no envió las claves a propósito
- Esperando el historial de cifrado
-
+ Esperando al historial de encriptación¡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ónicoTu directorio telefónico está vacíoDirectorio telefónicoRecuperando tus contactos…Tu libro de contactos está vacíoLibro de contactos
-
¿Revocar la invitación a %1$s\?
-
Prohibido por %1$sNo se pudo anular la prohibición del usuario
-
Las notificaciones push están deshabilitadasRevise su configuración para habilitar las notificaciones push
@@ -2653,9 +2164,92 @@ La visibilidad de mensajes en Matrix es similar a la del correo electrónico. Qu
¡Advertencia! ¡Último intento restante antes de cerrar sesión!Demasiados errores, se ha desconectadoElija un PIN por seguridad
- No se pudo validar el PIN, toque uno nuevo.
+ No se pudo validar el PIN, por favor introduzca uno nuevo.Introduce tu PIN¿Olvidó su PIN\?No se puede abrir una sala en la que está prohibido.No puedo encontrar esta sala. Asegúrate de que exista.
-
+ Los mensajes en esta sala están encriptados punto-a-punto.
+ Mensaje directo
+ Salir
+ Preferencias
+ Los mensajes aquí están encriptados de Extremo-a-Extremo.
+\n
+\nTus mensajes están asegurados con un candado. Solo tú y tú destinatario tenéis las llaves especiales para desencriptarlos.
+ Los mensajes aquí no están encriptados de Extremo-a-Extremo.
+ Botones de Bot
+ Encuesta
+ Remover de Baja prioridad
+ Añadir a Baja prioridad
+ Rotar y recortar
+
+ % segundo
+ %d segundos
+
+ Por favor, haz click en la notificación. Si no la ves, por favor revisa las preferencias del sistema.
+ Mostrar notificación
+ ¡Estás viendo la notificación! ¡Haz click en mí!
+ Fallo al recibir Push. La solución puede ser el reinstalar la aplicación.
+ La aplicación está recibiendo PUSH
+ La aplicación está esperando al PUSH
+ Probar Push
+ Búsquedas en salas encriptadas todavía no están soportadas.
+ Filtrar usuarios excluidos
+ Enviar la historia de peticiones de claves compartidas
+ No hay más resultados
+ No posee permisos para iniciar una llamada
+ No posee permisos para iniciar una llamada en esta sala
+ No posee permisos para iniciar una conferencia
+ Resetear
+ Descartar cambios
+ 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.
+ 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 via Código PIN.
+ Activar biometría de este dispositivo en particular, como huellas dactilares o reconocimiento facial.
+ Activar biometría
+ Configurar protecciones
+ Restringir acceso usando PIN y biométricos.
+ Restringir acceso
+
+ Mostrar el dispositivo con el que puede verificar ahora
+ Mostrar %d dispositivos con los que puede verificar ahora
+
+ Reiniciará sin historia, mensajes, dispositivos o usuarios verificados
+ Si resetea todo
+ Solo haga esto si no tiene otro dispositivo con el que verificar éste.
+ Resetear todo
+ ¿Ha perdido o olvidado todas las opciones de recuperación\? Resetear todo
+ Tú te has unido.
+ %s se ha unido.
+ Exportar inspección
+ ¿Borrar los datos de cuenta de typo %1$s\?
+\n
+\nPrecaución, puede causar funcionamiento inesperado.
+ Resultado de la verificación
+ Reaccionó con: %s
+ Este servidor particular usa una versión antigua. Pregunta a su administrador si puede actualizarlo. Puedes continuar usándolo, pero algunas características pueden no funcionar.
+ Tú has configurado como sólo con invitación.
+ %1$s ha configurado como sólo con invitación.
+ Añadir imagen de
+ Mostrar la historia completa en salas encriptadas
+ Ajustes de la sala
+ Tema
+ Tema de la sala (opcional)
+ Nombre de la sala
+ %1$s y %2$s
+ %1$s en %2$s y %3$s
+
+ %d invitación
+ %d invitaciones
+
+ Incluye invitar/unirse/expulsar/prohibir/mostrar cambios de nombre.
+ Mostrar eventos de los miembros de la sala
+ ¡La notificación ha sido cliqueada!
+
\ 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 73a5a0dff8..152f5f03e2 100644
--- a/vector/src/main/res/values-et/strings.xml
+++ b/vector/src/main/res/values-et/strings.xml
@@ -2187,4 +2187,8 @@
Jututoa seadistusedTeemaJututoa teema (kui soovid)
+ Ekspordi rakenduse taustakontrolli andmed
+ Otsevestlus
+ Lisa kaasa võtmevahetusega seotud päringute ajalugu
+ Rohkem otsingutulemusi pole
\ No newline at end of file
diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml
index e22d517789..ae3292bb2c 100644
--- a/vector/src/main/res/values-fa/strings.xml
+++ b/vector/src/main/res/values-fa/strings.xml
@@ -421,8 +421,8 @@
%d اتاق
- %d اعلان
- %d اعلانها
+ %d آگاهی
+ %d آگاهیزمینهتانافزودن کارههای ماتریکس
@@ -894,12 +894,12 @@
ممکن است کارساز در دسترس نبوده یا شلوغ باشداینجا بنویسید…
- %d اعلان خواندهنشده
- %d اعلانهای خواندهنشده
+ %d پیام آگاهی نخوانده
+ %d پیام آگاهی نخوانده
- %d اعلان خواندهنشده
- %d اعلانهای خواندهنشده
+ %d پیام آگاهی نخوانده
+ %d پیام آگاهی نخوانده%1$s: %2$d پیام
@@ -1021,7 +1021,7 @@
ورود کلید بازیابیبازیابی پیاممحاسبهٔ کلید بازیابی…
- لطفاًیک کلید بازیابی وارد کنید
+ لطفاً یک کلید بازیابی وارد کنیدمن بودمهرگز پیامهای رمزشده را از دست ندهیدشروع با استفاده از پشتیبان کلید
@@ -1334,8 +1334,8 @@
اطّلاعات رویداداطّلاعات رمزنگاری سرتاسریشاخه
- فعالکردن رمزنگاری
-\n(هشدار: نمیتواند دوباره غیر فعال شود!)
+ به کار انداختن رمزنگاری.
+\n(هشدار: نمیتواند دوباره از کار بیفتد!)رمزنگاری در این اتاق از کار افتاده است.رونوشت از نشانی اتاقرونوشت از شناسهٔ اتاق
@@ -1500,9 +1500,9 @@
المنت در پس زمینه همگامسازی میکند به گونه ای که منابع محدود دستگاه (باتری) حفظ میشود.
\nبسته به شارژ گوشی شما، ممکن است همگامسازی توسط سیستمعامل به تعویق بیوفتد.روشن کردن صفحه برای ۳ ثانیه
- • محتوای پیام در اعلانها نمایش داده نمیشوند
- • اعلان ها حاوی فرا داده و محتوای پیام هستند
- • محتوای پیام اعلان به طور ایمن و مستقیم از سرور هیوا دریافت میشود
+ • آگاهیها محتوای پیام را نشان نخواهند داد
+ • آگاهیها شاکل فراداده و محتوای پیام هستند
+ • محتوای پیام آگاهی به طور ایمن و مستقیم از کارساز خانگی ماتریکس دریافت میشود• اعلان ها فقط حاوی فرا داده هستند• اعلان ها از طریق سرور Firebase ارسال می شونداگر دستگاه برای مدتی از شارژر جدا باشد و از دستگاه نیز استفاده نشود، گوشی وارد حالت غیر هوشیار میشود. در این حالت از دسترسی برنامهها به اینترنت جلوگیری میشود و همگام سازی و هشدارهای استاندارد آنها به تعویق میافتد.
@@ -1543,11 +1543,11 @@
تستها را اجرا کندر حال تشخیص مشکلمطمئن شوید لینک فعالسازیای را که به ایمیل شما ارسال شده، باز کردهاید.
- %s حذف شود؟
- شماره تلفنهای شما
- هیچ آدرس ایمیلی تا کنون به حساب کاربری شما افزوده نشده است
- آدرس ایمیلهای شما
- هیچ شماره تلفنی تا کنون به اکانت شما افزوده نشده است
+ برداشتن %s؟
+ شماره تلفنها
+ هیچ رایانامهای به حسابتان افزوده نشده
+ نشانیهای رایانامه
+ هیچ شماره تلفنی به حسابتان افزوده نشدهقابلیت جستجو در اتاقهای رمزشده هنوز پیادهسازی نشده است.نتیجهای در پی نداشتفیلترکردن کاربران مسدود شده
@@ -1565,7 +1565,7 @@
%d موردپروندهها
- اعضا
+ افراداطلاعات اتاقگواهی را تنها در صورتی تایید کنید که اثر انگشت آن با اثر انگشتی که ادمین سرور ارائه کردهاست برابر باشد.گواهی سرور تغییر کردهاست. ممکن است این اتفاق به دلیل تمدید گواهی سرور رخ داده باشد. توصیه میشود از ادمین سرور سوال کنید.
@@ -1585,8 +1585,8 @@
شما نمیتوانید این تغییر را بازگردانید. زیرا در حال ارتقای سطح کاربر دیگر به سطح خودتان هستید.
\nآیا مطمئن هستید؟شما در حال دسترسی به %s هستید. آیا می خواهید به این اتاق بپیوندید؟
- این دعوت به %s ارسال شده است، که هیچ ارتباطی با اکانت شما ندارد.
-\nممکن است بخواهید با اکانت دیگری وارد شوید یا این ایمیل را به اکانت خود اضافه کنید.
+ این دعوت به %s ارسال شده که ارتباطی با این حساب ندارد.
+\nممکن است بخواهید با حسابی دیگر وارد شده یا این رایانامه را به حسابتان بیفزایید.متاسفانه به دلیل عدم دسترسی، درخواست شما امکان پذیر نمی باشدهیوا میتواند با دیدن دفترچه تلفن شما کاربرهای دیگر هیوا را بر اساس ایمبل و شماره تلفنشان پیدا کند.
\n
@@ -1648,7 +1648,7 @@
%2$s و %1$s شما تنظیم شد.
\n
\nآنها را در جای مطمئن و امن نگهداری کنید! درصورتی که همهی نشستهای خود را از دست بدهید، به این دو جهت رمزگشایی پیامهای رمزشدهی قبلی و اطلاعات امن نیاز دارید.
- تنظیم پشتیبانگیری از کلید
+ برپایی پشتیبانگیری از کلیدهمگامسازی کلید Self Signingهمگامسازی کلید کاربرهمگامسازی کلید اصلی
@@ -1724,9 +1724,9 @@
دسترسی به پیامهای رمزشده را از دست خواهید داد مگر اینکه برای بازیابی کلیدهای رمزگذاری خود، به حساب خود وارد شوید.آیا تمامی اطلاعات ذخیرهشده در این دستگاه پاک شود؟
\nبرای دسترسی به اطلاعات و پیامهای حساب خود، دوباره وارد شوید.
- هشدار: اطلاعات شخصی شما (شامل کلیدهای رمزنگاری) همچنان روی این دستگاه ذخیره شدهاند.
+ هشدار: دادههای شخصیتان (شامل کلیدهای رمزنگاری) همچنان روی این افزاره ذخیره شدهاند.
\n
-\nاگر نمیخواهید از این دستگاه استفاده کنید، یا میخواهید با اکانت دیگری وارد شوید، این اطلاعات را حذف کنید.
+\nاگر کارتان با این افزاره تمام شده یا میخواهید به حساب دیگری وارد شوید، پاکشان کنید.برای بازیابی کلیدهای رمزگذاری ذخیره شده در این دستگاه، وارد حساب خود شوید. شما برای خواندن همه پیامهای رمزشدهی خود در هر دستگاهی به این کلیدها نیاز دارید.ادمین سرور (%1$s) شما را از حسابتان خارج کردهاست %2$s (%3$s).این می تواند به دلایل مختلف باشد:
@@ -1888,7 +1888,7 @@
توضیح در مورد اتاق (اختیاری)نام اتاقپیام پاک شد
- به نظر میرسد که شما در حال تلاش برای اتصال به یک سرور دیگر هستید. آیا می خواهید از اکانت خود خارج شوید؟
+ به نظر میرسد تلاش میکنید تا به کارساز خانگی دیگری وصل شوید. میخواهید خارج شوید؟برای بازنشانی گذرواژهی خود نیاز به پیکربندی سرور هویتسنجی دارید.شما از سرور هویتسنجی استفاده نمیکنیدخطای نامشخص
@@ -1899,30 +1899,30 @@
SAS تطابق نداشتHash تطابق نداشتنشست نمی تواند در مورد روشهای فرآیند تائید: hash ، MAC یا روش SAS به توافق برسد
- نشست از آن تعامل اطلاعی ندارد
- زمان فرآیند تائید به پایان رسید
- کاربر فرآیند تائید را لغو کرد
- %s میخواهد نشست شما را تائید کند
- درخواست فرآیند تائید
- تائید تعاملی نشست
- فرآیند تائید لغو شد.
+ نشست، اطّلاعی از آن تعامل ندارد
+ زمان فرایند تأیید به پایان رسید
+ کاربر تأیید را لغو کرد
+ %s میخواهد نشستتان را تأیید کند
+ درخواست تأیید
+ تأیید تعاملی نشست
+ تأیید لغو شد.
\nدلیل: %s
- طرف مقابل فرآیند تائید را لغو کرد.
+ طرف مقابل تأیید را لغو کرد.
\n%s
- از روش قدیمی برای فرآیند تائید استفاده کنید.
- چیزی نمایش داده نشدهاست؟ هنوز تمام کلاینتها از امکان تائید به روش تعاملی پشتیبانی نمیکنند. از تائید به روش قدیمی استفاده کنید.
- شما با موفقیت این نشست را تائید کردید.
- منتظر تائید طرف مقابل…
- شما یک درخواست فرآیند تأئید داخلی دریافت کرده اید.
- این نشست را با تصدیق اعداد زیر که روی صفحهی طرف مقابل نیز ظاهر شدهاست، تائید کنید
- با تأئید یکسان بودن شکلکهای زیر در صفحه طرف مقابل، این نشست را تأئید کنید
- با تأئید این نشست، آن را به عنوان معتمد علامتگذاری میکنیم و همچنین نشست خود را به عنوان معتمد برای طرف مقابل علامتگذاری می کنیم.
- فرآیند تائید کلید
+ استفاده از تأیید قدیمی.
+ چیزی ظاهر نمیشود؟ هنوز تمامی کارخواهها از تأیید تعاملی پشتیبانی نمیکنند. از تأیید قدیمی استفاده کنید.
+ این نشست را با موفّقیت تأیید کردید.
+ منتظر تأیید طرف مقابل…
+ درخواست تأییدی دریافت کردید.
+ با تأیید ظاهر شدن عددهای زیر روی صفحهٔ طرف مقابل، این نشست را تأیید کنید
+ با تأیید ظاهر شدن شکلکهای زیر روی صفحهٔ طرف مقابل، این نشست را تأیید کنید
+ تأیید این نشست، آن را برای خودتان و طرف مقابل، به عنوان مطمئن علامت خواهد زد.
+ تأیید کلیدنمایش درخواستدرخواست لغو شدفهمیدم
- محتوای گفتگوی امن شما با این کاربر رمزنگاری سرتاسر شده و امکان دسترسی به آنها توسط فرد سومی مقدور نیست.
- نشست تائید شد!
+ پیامهای امن با این کاربر به صورت سرتاسری رمزنگاری شده و قابل خوانده شدن به دست دیگران نیست.
+ تأییدشده!این نشست را تأیید کنید تا به عنوان معتمد علامتگذاری شود. اعتماد به نشستها هنگام استفاده از پیام های رمزشده به صورت سرتاسر ، به شما اطمینان بیشتری از امنیت گفتگوها میدهد.درخواست فرآیند تأیید داخلیشروع فرآیند تایید کردن
@@ -1975,17 +1975,17 @@
پشتیبان با %d کلید بازیابی شد.پشتیبان با %d کلید بازیابی شد.
- رمزگشایی با این کلید بازیابی امکانپذیر نیست: لطفاً بررسی کنید که کلید بازیابی را به درستی وارد کردهاید.
- رمزگشایی پیامهای قبلی
- بارگذاری کلیدها…
- در حال دریافت کلیدهای بازیابی…
- بازیابی نسخه پشتیبان:
+ پشتیبان نتپانست با این کلید بازیابی رمزگشایی شود: لطفاً تأیید کنید که کلید بازیابی درستی را وارد کردهاید.
+ قفلگشایی تاریخچه
+ بارگذاری کردن کلیدها…
+ بارگیری کردن کلیدها…
+ بازیابی پشتیبان:خطای شبکه: لطفاً اتصال خود را بررسی کنید و دوباره امتحان کنید.رمزگشایی با این کلید امنیتی امکانپذیر نیست: لطفاً بررسی کنید که کلید امنیتی را به درستی وارد کردهاید.کلید بازیابی خود را گم کردهاید؟ میتوانید کلید جدیدی را در تنظیمات تنظیم کنید.از کلید بازیابی برای رمزگشایی پیامهای رمزشدهی قبلی خود استفاده کنیدکلید امنیتی خود را نمیدانید؟ شما میتوانید %s.
- از کلید امنیتی برای رمزگشایی پیامهای رمزشدهی قبلی خود استفاده کنید
+ برای قفلگشایی تاریخچهٔ پیامهای رمزشدهتان از عبارت عبور بازیابیتان استفاده کنیداگر از دستگاه خارج شوید یا دستگاه خود را از دست دهید، ممکن است امکان دسترسی به پیام های خود را نداشته باشید.کلیدهای رمزگذاری شما اکنون در پس زمینه در حال پشتیبانگیری بر روی سرور است. تهیه نسخهی پشتیبان اولیه ممکن است چند دقیقه طول بکشد.در حال تولید کلید پشتیبان با استفاده از کلید امنیتی، این ممکن است چند ثانیه زمان ببرد.
@@ -2003,17 +2003,17 @@
ما یک نسخه رمزگذاری شده از کلیدهای شما را در سرور ذخیره خواهیم کرد. با استفاده از کلید امنیتی قوی، از نسخهی پشتیبان خود محافظت کنید.
\n
\nبرای حداکثر امنیت، کلید امنیتی باید با رمز ورود حساب شما متفاوت باشد.
- پیامهای موجود در اتاق های رمزگذاری شده به صورت سرتاسری رمز و ایمن میشوند. کلیدهای این پیامها فقط در دسترس شما و گیرنده(ها) میباشد.
+ پیامها در اتاقهای رمزشده، با رمزنگاری سرتاسری امن شدهاند. فقط شما و گیرنده(ها) کلیدهای خواندم این پیامها را دارید.
\n
-\nبرای جلوگیری از از دست دادن کلیدهای خود به طور ایمن از آنها پشتیبان تهیه کنید.
+\nبرای جلوگیری از گم کردن کلیدهایتان، از آنها به صورت امن، پشتیبان بگیرید.هیچ نشست ماتریکسی موجود نیست
- اگر می خواهید المنت یک کلید بازیابی ایجاد کند، لطفاً کلید امنیتی را حذف کنید.
- کلید امنیتی بسیار ضعیف است
- لطفا کلید امنیتی را وارد کنید
- کلید امنیتی یکسان نبود
- ورود کلید امنیتی
- تائید کلید امنیتی
- ایجاد کلید امنیتی
+ اگر می خواهید المنت یک کلید بازیابی ایجاد کند، لطفاً عبارت عبور را حذف کنید.
+ عبارت عبور بیش از حد ضعیف است
+ لطفاً عبارت عبوری وارد کنید
+ عبارت عبور، مطابق نبود
+ ورود عبارت عبور
+ تأیید عبارت عبور
+ ایجاد عبارت عبورAPK معتبر Google Play Services پیدا نشد. اعلانها ممکن است به درستی کار نکنند.%d++%d
@@ -2048,12 +2048,12 @@
فعال و غیرفعال کردن markdownنام مستعار شما را تغییر میدهداخراج کاربر با شناسه داده شده
- بیشتر دربارهی اتاق توضیح دهید
+ تنظیم موضوع اتاقترک اتاقبا نام مستعار دادهشده به اتاق بپیوندیدکاربر با شناسه داده شده را به این اتاق دعوت می کندکاربر با شناسه داده شده را غیرفعال میکند
- سطح اختیارات و دسترسی کاربر را مشخص میکند
+ سطح قدرت کاربر را تعریف میکندکاربر با شناسه داده شده را رفع مسدودیت می کندکاربر با شناسه داده شده را مسدود می کندنمایش اقدام
@@ -2061,10 +2061,10 @@
دستور ناشناخته: %sخطا در اجرای دستورقابلیت همایش تصویری در حال توسعه بوده و ممکن است به درستی کار نکند.
- یک نشست تایید نشده، درخواست کلیدهای رمزنگاری را دارد.
+ یک نشست تایید نشده، کلیدهای رمزنگاری را درخواست میکند.
\nنام نشست: %1$s
\nآخرین بازدید: %2$s
-\nاگر در دستگاه دیگری وارد اکانت خود نشدهاید این درخواست را نادیده بگیرید.
+\nاگر به نشست دیگری وارد نشدهاید، این درخواست را نادیده بگیرید.نشست تایید نشدهی شما \\\'%s\\\' درخواست کلیدهای رمزنگاری را دارد.نشست جدید درخواست دریافت کلیدهای رمزنگاری را دارد.
\nنام نشست: %1$s
@@ -2080,7 +2080,7 @@
%d دعوت%d دعوت
- آدرس سرور
+ نشانی کارساز خانگیاین اتاق شامل نشستهای تایید نشده هستند.
\nهیچ تضمینی وجود ندارد این نشستهای تائیدنشده متعلق به کاربرانی باشد که فکر میکنید.
\nتوضیه میشود افراد نشستهای خود را تائید کنند. هر چند در صورتی که تمایلی به این کار ندارید، همچنان میتوانید پیام ارسال کنید.
@@ -2105,27 +2105,27 @@
این اتاق در هیچ اجتماع خاصی قرار نگرفتهاستهر کسی که لینک اتاق را دارد ( حتی اگر کاربر مهمان باشد)هر کسی که لینک اتاق را دارد (به جز کاربران مهمان)
- تنها افرادی که دعوت شدهاند
- برای لینک دادن به یک اتاق، آن اتاق باید آدرس داشته باشد.
+ تنها کسانی که دعوت شدهاند
+ برای پیوند به یک اتاق، باید نشانی داشته باشد.اجتماع
- پخش صدای شاتر دوربین
- انتخاب کنید
- منبع پیشفرض رسانه
- انتخاب کنید
+ پخش صدای شاتر
+ گزینش
+ منبع رسانهٔ پیشگزیده
+ گزینشفشرده سازی پیشفرضرسانهاطلاعات اضافه: %sخطایی هنگام تایید شماره تلفن رخ داده است.
- کد
+ رمزخطایی هنگام تایید شماره تلفن رخ داده است
- کد فعالسازی را وارد کنید
+ رمز فعّالسازیای را وارد کنیدما یک پیام کوتاه با کد فعالسازی ارسال کردهایم. لطفاً این کد را در زیر وارد کنید.تایید شماره تلفنشماره تلفن نامعتبر برای کشور مورد نظرشماره تلفن
- لطفا یک کشور را انتخاب نمائید
+ لطفاً کشوری را برگزینیدکشور
- انتخاب کشور
+ گزینش یک کشورآیا از حذف %1$s %2$s مطمئن هستید؟خطایی در هنگام تایید ایمیل شما رخ داده است.این شماره تلفن قبلا استفاده شدهاست.
@@ -2154,4 +2154,9 @@
ارسال داده های تجزیه و تحلیلتجزیه و تحلیلمجوز دادن
+ تخصیص شکست خورد.
+ قطع اتّصال از کارساز هویت %s؟
+ پیام مستقیم
+ ارسال تاریخچهٔ درخواستهای همرسانی کلید
+ نتایج بیشتری نیست
\ No newline at end of file
diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml
index 50793add88..d6258d45bd 100644
--- a/vector/src/main/res/values-fr/strings.xml
+++ b/vector/src/main/res/values-fr/strings.xml
@@ -25,7 +25,7 @@
Appel en coursTéléconférence en cours.
\nLa rejoindre en %1$s ou en %2$s
- vocal
+ AudiovidéoImpossible d’initier l’appel, réessayez plus tardEn raison de permissions manquantes, certaines fonctionnalités peuvent être absentes…
@@ -2037,7 +2037,7 @@
Affichage de la notificationVous voyez la notification ! Cliquez-moi dessus !La notification a été cliquée !
- Échec de l\'appel Element
+ 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
@@ -2089,7 +2089,7 @@
QuitterActions d\'administrateurLes messages ici ne sont pas chiffrés de bout en bout.
- Réagis avec : %s
+ A réagi avec : %sSondageSi 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 « + »)
@@ -2195,4 +2195,8 @@
SujetSujet du salon (facultatif)Nom du salon
+ Message direct
+ Inclure l\'historique d\'échange de clés
+ Plus aucun résultat
+ Exporter le rapport d\'audit
\ No newline at end of file
diff --git a/vector/src/main/res/values-gl/strings.xml b/vector/src/main/res/values-gl/strings.xml
index 6ef0b9437d..45a6091093 100644
--- a/vector/src/main/res/values-gl/strings.xml
+++ b/vector/src/main/res/values-gl/strings.xml
@@ -1,16 +1,13 @@
-
+
glES
-
Tema claroTema escuroTema negro
-
- Sincronizando
+ Sincronizando…Notificacións con sonNotificacións silenciosas
-
MensaxesSalaConfiguración
@@ -18,9 +15,7 @@
HistóricoInformar de errosDetalles da comunidade
-
Cargando…
-
AceptarCancelarGardar
@@ -40,7 +35,8 @@
A escoita de eventosAdianteInformar sobre contido
- Conferencia en curso.\nÚnase con %1$s ou %2$s.
+ Conferencia en curso.
+\nÚnete con %1$s ou %2$svozvídeoNon se pode iniciar a chamada, inténteo máis tarde
@@ -53,7 +49,6 @@
ouConvidarFóra de liña
-
SaírAcciónsSaír
@@ -67,53 +62,43 @@
PecharCopiado ao portaretallosDesactivar
-
ConfirmaciónAviso
-
InicioFavoritasXenteSalasComunidades
-
Buscar salasBuscar favoritasBuscar a xenteBuscar salasBuscar comunidades
-
ConvitesBaixa prioridade
-
ConversasAxenda de enderezos localDirectorio de usuarioSó contactos MatrixSen conversas
- "Non lle permitiu acceder aos contactos locais a Element "
+ Non lle permitiches a Element acceder ós contactos locaisSen resultados
-
SalasDirectorio de salasSen salasSen salas públicas accesiblesEnviar unha icona
-
Licenzas de terceiras partes
-
DescargarFalarLimpar
- 1 usuario
- %d usuarios
+ 1 usuaria
+ %d usuarias
-
ConvidarComunidadesSen grupos
-
Enviar informesEnviar informes de fallosEnviar captura de pantalla
@@ -126,10 +111,8 @@
Enviouse o informe de erros correctamenteHoubo un problema enviando o informe de erros (%s)Progreso (%s%%)
-
Enviar aLer
-
Unirse a salaNome de usuarioRexistrar
@@ -138,25 +121,20 @@
URL do servidor localURL do servidor de identidadeBuscar
-
Iniciar conversaIniciar chamada de vozIniciar videochamada
-
Seguro que quere comezar a conversar con %s?Seguro que quere comezar unha chamada de audio?Seguro que quere comezar unha chamada de vídeo?
-
Enviar ficheirosEnviar iconasSacar unha foto ou vídeoSacar fotoSacar vídeo
-
- Non ten ningún paquete de iconas activado.
-
-Quere engadir algún?
-
+ Non tes paquetes de pegatinas activados.
+\n
+\nQueres engadir algún\?AccederRexistrarseEnviar
@@ -187,9 +165,9 @@ Quere engadir algún?Esqueceu o contrasinal?Usar configuracións de servidor personalizadas (avanzado)Comprobe o seu correo para continuar co rexistro
- O rexistro tanto co correo como co número non se acepta dentro desta api. Só se vai a ter en conta o número de teléfono.
-
-Pode engadir a dirección de correo na sección de configuración de perfil.
+ O rexistro simultáneo co email e o número de teléfono non está soportado ata que o api exista. Só se terá en conta o número de teléfono.
+\n
+\nPoderás engadir o teu email ó perfil nos axustes.Este servidor local quere asegurarse de que non é un robotNome de usuario empregadoServidor local:
@@ -200,22 +178,16 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Debe introducir un novo contrasinal.Fallo na verificación do enderezo de correo: asegúrese de ter picado na ligazón do correoPetición de chave enviada.
-
Enviar comoOnteHoxe
-
ChamarContinuar
-
EliminarRexeitar
-
Ir á primeira mensaxe non lida.
-
Deixar a salaCrear
-
En liñaFóra de liñaEn pausa
@@ -235,13 +207,11 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Non ten permiso para comentar nesta sala1 mensaxe nova
- %d mensaxe nova
+ %d mensaxes novas
-
ConfiarDesconectarIgnorar
-
XenteFicheirosConfiguracións
@@ -252,14 +222,12 @@ Pode engadir a dirección de correo na sección de configuración de perfil.MENSAXESXENTEFICHEIROS
-
ConvitesIniciar conversaCrear salaUnirse á salaUnirse á salaBuscando cartafol…
-
Todas as mensaxes (alto)Todas as mensaxesSó mencións
@@ -274,20 +242,17 @@ Pode engadir a dirección de correo na sección de configuración de perfil.VersiónCopyrightPolítica de privacidade
-
Correo electrónicoEngadir enderezo correo electrónicoTeléfonoEngada número de teléfonoActivar notificacións para esta contaMensaxes enviadas por bot
-
Versiónversións anterioresLimpar o cachéLimpar o caché de imaxesManter as imaxes
-
Configuracións dos usuariosNotificaciónsOutro
@@ -296,14 +261,12 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Dispositivos
Activar por defecto as vistas previas en liña de URLMostrar sempre marcas de tempo
- "Mostrar marcas de tempo con formato 12 horas (ex. 2:30pm)"
+ Mostrar marcas de tempo con formato 12-horasDesactivar a miña conta
-
AnalyticsEnviar datos de análisesElement recolle información analítica anónima para permitirnos mellorar o aplicativo.
- Si, quero axuda
-
+ Si, quero axudar!IDNomeNome do dispositivo
@@ -312,55 +275,42 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Autenticación
Contrasinal:Enviar
-
Idioma da InterfaceVerificación pendenteComprobe o seu correo electrónico e pulse na ligazón que contén. Unha vez feito iso prema continuar.
- Xa se está a usar este correo
- Xa se está a usar este teléfono
-
+ Xa se está a usar este correo.
+ Xa se está a usar este teléfono.novo contrasinalconfirmar o contrasinalEscolla un país
-
PaísNúmero de teléfonoVerificación do teléfonoCódigo
-
-
Aura
-
3 días1 semana1 mesPara sempre
-
Foto da salaNome da salaAsuntoEtiqueta de salaMarcado como:
-
FavoritaPrioridade baixaNingún
-
NotificaciónsQuen pode ler o histórico?Quen pode acceder a esta sala?
-
CalqueraSó membros (desde o momento en que se selecciona esta opción)Só membros (desde que foron convidados)Só membros (desde que se uniron)
-
Só persoas que foron convidadasCalquera que coñeza o enderezo da sala, aparte das convidadasCalquera que coñeza a ligazón a sala, incluíndo as convidadas
-
Usuarios excluídos
-
AvanzadoEnderezosLabs
@@ -369,12 +319,9 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Formato de alias non válido
Copiar a ID da salaCopiar a dirección da sala
-
DirectorioTema
-
Información do cifrado extremo-a-extremo
-
Información do eventoID de usuarioChave de identidade Curve25519
@@ -382,15 +329,13 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Algoritmo
ID de sesiónFallo ao descifrar
-
Información do dispositivo do remitenteNome do dispositivoNome
- ID de dispositivo
+ ID de sesiónChave do dispositivoValidaciónpegada Ed25519
-
Exportar chaves E2E da salaExportar chaves da salaExportar
@@ -399,49 +344,40 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Importar chaves E2E da sala
Importar chaves de salaImportar
- Nunca enviar mensaxes cifradas aos dispositivos que non estean verificados neste dispositivo
-
+ Non enviar mensaxes cifradas desde esta sesión a sesións non verificadas.SEN VerificarVerificadosOmitidos
-
dispositivo descoñecidoningún
-
VerificarRetirar verificaciónPor na lista negraQuitar da lista negra
-
Verificar dispositivoCertifico que coinciden as chaves
-
A sala contén dispositivos descoñecidosEscoller unha sala principalO servidor podería non estar dispoñible ou sobrecargadoEscriba un servidor local para saber cales son todas súas as salas públicasURL do servidor local
- "Todas as salas do servidor %s "
+ Todas as salas do servidor %sTodas as salas de %s nativas
-
Escriba aquí…
-
- 1 notificación sen ler
+ %d notificación sen ler%d notificacións sen ler
- 1 notificación sen ler
+ %d notificación sen ler%d notificacións sen ler
- 1 sala
+ %d sala%d salas%1$s en %2$s
-
Buscar no histórico
-
Tamaño da letraAnanaPequena
@@ -450,13 +386,11 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Máis grande
Aínda máis grandeEnorme
-
Fallou a creación do trebello
- 1 trebello activo
- %d trebellos activos
+ %d widget activo
+ %d widgets activos
-
Non se puido crear o trebello.Fallo ao enviar a petición.O nivel de poder ten que ser un enteiro positivo.
@@ -469,63 +403,47 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Hai un parámetro que non é válido.
Engadir aplicacións de MatrixUsar a cámara nativa
-
Iniciar verificaciónCompartir sen verificarIgnorar petición
-
Aviso!As chamadas de reunión poderían non ser totalmente estables xa que están en desenvolvemento.
-
Erro na ordeComandos que non se recoñecen: %s
-
OffRuidoso
-
Mensaxe cifrada
-
CrearCrear comunidadeNome da comunidadeExemploID da comunidadeexemplo
-
InicioXenteSalasSen usuarios
-
SalasUniuseConvidadaFiltrar os membros do grupoFiltrar as salas dos grupos
-
O administrador da comunidade non fixo unha descrición longa desta comunidade.
-
Foi expulsado de %1$s por %2$sFoi bloqueado de %1$s por %2$sMotivo: %1$sVolver a unirseEsquecer sala
-
Avatar de recepciónAvatar de avisoAvatar
-
Revisar agora
-
Desactivar contaPara continuar introduza o seu contrasinal:Desactivar conta
-
Enviar voz
-
continuar con…Non se atopou unha aplicación que poida completar iso.
-
Enviouse un correo a %s. Unha vez abra a ligazón que contén prema abaixo.A URL ten que comezar con http[s]://Non se puido acceder: erro da rede
@@ -534,51 +452,40 @@ Pode engadir a dirección de correo na sección de configuración de perfil.Non se puido rexistrar
Non se puido rexistrar: erro coa propiedade do correo electrónicoIntroduza unha URL válida
-
Usuario/contrasinal incorrectoJSON con defectosNon contiña unha JSON correctaEnviáronse demasiadas peticiónsEste nome de usuario xa se está a usarUnha ligazón de correo na que aínda non se premeu
-
Volver a pedir as chaves de cifrado do outro dispositivo seu.
-
Petición enviadaInicie Element noutro dispositivo que poida descifrar esta mensaxe e que despois desde alí lle poida enviar as chaves a este dispositivo.
-
- 1 cambio de membros
- %d cambio de membros
+ 1 cambio de participantes
+ %d cambios de participantes
-
Autor InicialMedianoPequeno
-
Cancelar a descarga?Cancelar a subida?%d s%1$dm %2$ds
-
Nome da salaTema da sala
-
Chamada establecidaChamada finalizadaChamando…Chamada entranteVideochamada entranteChamada de audio entrante
- Chamada en activo
-
+ Chamada activa…Fallou a conexión desde o outro lado.Non se deu iniciado a cámarachamara respondida noutro lugar
-
Saque unha foto ou videoNon foi posible gravar vídeo
-
InformaciónGardadoGardar nas descargas?
@@ -586,11 +493,10 @@ Pode engadir a dirección de correo na sección de configuración de perfil.NON
UnirseVista previa
- O convite envióuselle a %s, mais non é alguén que estea asociado con esta conta.
-Seguramente queira conectarse cunha conta distinta, ou engadir este correo a súa conta.
+ Este convite enviouse a %s, que non está asociada a esta conta.
+\nPodes conectarte cunha conta diferente, ou engadir este email á túa conta.unha salaEsta é unha vista previa desta sala. Desactiváronse as interaccións coa sala.
-
Nova conversaEngadir membro
@@ -598,14 +504,12 @@ Seguramente queira conectarse cunha conta distinta, ou engadir este correo a sú
%d participantes activos
- 1 membro
- %d membros
+ 1 participante
+ %d participantes1 membro
-
ChamarDISPOSITIVOS
-
Deixar a salaBorrar desta salaMensaxes non enviadas. %1$s ou %2$s agora?
@@ -613,10 +517,8 @@ Seguramente queira conectarse cunha conta distinta, ou engadir este correo a sú
Pegada (%s):CONVIDADOUNIUSE
-
Cancelar a subidaCancelar a descarga
-
UNIRSEDIRECTORIOFAVORITOS
@@ -636,7 +538,6 @@ Seguramente queira conectarse cunha conta distinta, ou engadir este correo a sú
• O contido da mensaxe das notificacións está provén dun xeito seguro e directo do servidor local de Matrix• As notificacións conteñen metadatos e os datos da mensaxe• As notificacións non van a mostrar o contido da mensaxe
-
Son das notificaciónsActivar notificacións para este dispositivoPetición de sincronización esgotada
@@ -651,22 +552,17 @@ Seguramente queira conectarse cunha conta distinta, ou engadir este correo a sú
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).Outorgar permisosEscolla outra opción
-
Accedeuse comoServidor de identidade
-
Seguro que quere eliminar este tipo de notificacións?
-
O ID interno desta sala éPrecisa saír da aplicación primeiro para poder activar o cifrado.Nunca enviar mensaxes cifradas aos dispositivos que non estean verificados nesta sala desde este dispositivo.
-
O cifrado está activado nesta sala.
- " Para verificar que se pode confiar neste dispositivo, contacte co seu dono utilizando algún outro medio (ex. en persoa ou chamada de teléfono) e pregúntelle se a clave que ven nos axustes de usuario do se dispositivo coincide coa clave inferior:"
+ Comfirma comparando o seguinte cos Axustes de Usuaria na túa outra sesión:Engadiu un novo dispositivo «%s» que está a solicitar as chaves de cifrado.O seu dispositivo sen verificar «%s» está solicitando as chaves de cifrado.Para continuar usando o servidor %1$s ten que revisar primeiro os seus termos e condicións.Esquezan todas as mensaxes que eu enviara no momento en que elimine a miña conta. (Aviso: iso suporá que os seguintes participantes só verán unha versión incompleta das conversas.)Introduza o seu contrasinal.
-
-
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml
index d9e29c37bf..60171a30d1 100644
--- a/vector/src/main/res/values-hu/strings.xml
+++ b/vector/src/main/res/values-hu/strings.xml
@@ -188,7 +188,7 @@
A hívott fél nem vette fel.Médiacsatlakozás sikertelenA kamera nem készíthető elő
- a hívást máshol vették fel
+ a hívás más eszközön lett felvéveKép vagy videó készítéseVideorögzítés sikertelenInformáció
@@ -206,8 +206,8 @@
A Elementnek 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ókar. 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ókar.
+ 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.
\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"
@@ -424,7 +424,7 @@ Vedd figyelembe, hogy az alkalmazás újraindul ami sok időt vehet igénybe."<
Alacsony prioritásúSemmiHozzáférés és láthatóság
- Listázza ezt a szobát a szobák könyvtárba
+ Listázza ezt a szobát a szoba listábanSzoba hozzáfárésSzoba előzmény olvashatóságaKi tud előzményt olvasni?
@@ -505,7 +505,7 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.Eltávolítás feketelistárólMunkamenet hitelesítéseHogy ellenőrizni lehessen, hogy ez a munkamenet megbízható, kérlek használj más kommunikáció módot a tulajdonossal (pl.: személyesen vagy telefonon keresztül) és kérdezd meg hogy a kulcs amit lát a Felhasználói Beállítások alatt megegyezik-e az alábbi kulccsal:
- Ha egyezik, nyomja meg a hitelesítés gombot. Ha nem, akkor valaki más elfogta ezt a munkamenetet és érdemes lenne tiltólistára tenni. A jövőben ez a hitelesítési mód kényelmesebbé lesz téve.
+ Ha nem egyeznek, akkor a kommunikáció biztonsága kompromittálva lehet. A jövőben ez a hitelesítési mód kényelmesebbé lesz téve.Hitelesítem, hogy a kulcsok egyeznekSzoba ismeretlen munkameneteket tartalmazEz a szoba ismeretlen munkameneteket tartalmaz.
@@ -515,7 +515,7 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törli.
Válassz egy szoba könyvtáratA szerver lehet nem elérhető vagy túltöltött
- Írj be egy Matrix szervert hogy listázza belőle a nyilvános szobákat
+ Írj be egy Matrix szervert, az ott található nyilvános szobák listázásáhozMatrix szerver URLÖsszes szoba a %s szerverenÖsszes anyanyelvi %s szoba
@@ -763,7 +763,7 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés
Matrix-kisalkalmazás-token törléseEz a szoba le lett cserélve és már nem aktívA beszélgetés itt folytatódik
- Ez a szoba a folytatása egy másik beszélgetésnek
+ Ez a szoba egy másik beszélgetés folytatásaRégebbi üzenetek megjelenítéséhez kattints ideA műveletet a hiányzó engedélyek miatt nem lehet végrehajtani.
@@ -803,7 +803,7 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés
Erőforrás korlát túllépveKapcsolatfelvétel az adminisztrátorralvedd fel a kapcsolatot a szolgáltatás adminisztrátorával
- Ez a Matrix szerver túllépte valamely erőforrás korlátot így néhány felhasználó nem tud bejelentkezni.
+ Ez a Matrix szerver túllépte valamely erőforrás korlátot így néhány felhasználó nem tud majd bejelentkezni.Ez a Matrix szerver túllépte egyik erőforrás korlátját. Ez a Matrix szerver elérte a havi aktív felhasználói korlátját így néhány felhasználó nem tud bejelentkezni.Ez a Matrix szerver elérte a havi aktív felhasználói korlátját.
@@ -963,9 +963,9 @@ Helyezd biztonságba a kulcsokat, hogy ne vesszenek el.A Visszaállítási Kulcs ide lett mentve: \'%s\'.
Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törlik.
- Kérlek készíts egy másolatot
+ Kérlek, készíts egy másolatot!Visszaállítási Kulcs megosztása…
- Visszaállítási Kulcs készítése jelmondatból, ez néhány másodpercet is igénybe vehet.
+ Visszaállítási Kulcs készítése jelmondatból, ez néhány másodpercet igénybe vehet.Visszaállítási KulcsVáratlan hibaMentés elkezdődött
@@ -1032,9 +1032,9 @@ Figyelmeztetés: ez a fájl törlésre kerülhet, ha az alkalmazást törlik.(Haladó)
Kulcsok kimentése kézzelVédd a mentésedet jelmondattal.
- "A kulcsaid másolatait titkosítva a Matrix szerverünkön fogjuk tárolni. Védd a mentést jelszóval a biztonság érdekében.
-
-A maximális biztonság eléréséhez, használja más jelmondatot mint amit a felhasználói fiókhoz használtál."
+ A kulcsaid másolatait titkosítva a Matrix szervereden fogjuk tárolni. Védd jelszóval a mentést, a biztonság érdekében.
+\n
+\nA maximális biztonság eléréséhez, használj más jelszót, mint amit a bejelentkezéshez használtál.Mentés készítéseVagy védd a mentésedet egy Visszaállítási Kulccsal amit tárolj biztonságos helyen.(Haladó) Beállítás Visszaállítási Kulccsal
@@ -1043,7 +1043,7 @@ A maximális biztonság eléréséhez, használja más jelmondatot mint amit a f
A Visszaállítási Kulcs egy biztosíték amit használhatsz a titkosított üzenet hozzáférések visszaállítására, ha a jelmondatot elfelejtetted.
A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókezelő (vagy széf)A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókezelő (vagy széf)
- Készítettem másolatot
+ Készítettem egy másolatotMegosztásSoha ne veszíts el titkosított üzenetetKulcs Mentés használatának megkezdése
@@ -1127,7 +1127,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Ellenőrzési kérés érkezettMunkamenet ellenőrzése és beállítás megbízhatónak. A partnerek munkameneteiben való megbízás megnyugtató lehet, ha végponttól végpontig titkosítást használsz.A munkamenet ellenőrzése megbízhatónak fogja jelezni az eszközt és a partnernél a te munkamenetedet szintén megbízhatónak fogja jelezni.
- Munkamenet ellenőrzése az alábbi emodzsik a partner képernyőjén való megjelenésének megerősítésével történik
+ Munkamenet ellenőrzése azáltal, hogy összehasonlítjátok, hogy a másik felhasználó képernyőjén is ugyan azok az emojik jelennek-e meg.Munkamenet ellenőrzése az alábbi számok a partner képernyőjén való megjelenésének megerősítésével történikBejövő ellenőrzési kérés érkezett.Kérés megjelenítése
@@ -1307,7 +1307,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
A munkamenet nyilvános neve látható azoknál akikkel beszélgetszNem használsz Azonosítási SzervertNincs beállítva azonosítási szerver amire a jelszó visszaállításához szükség van.
- Úgy látszik másik matrix szerverhez szeretnél csatlakozni. Kijelentkezel\?
+ Úgy tűnik, másik Matrix szerverhez szeretnél csatlakozni. Ki szeretnél jelentkezni\?Azonosítási szerverAzonosítási szerverről lecsatlakozásAzonosítási szerver beállítása
@@ -1430,18 +1430,18 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
%1$s hozzáférhetővé tette a szobát bárkinek, aki ismeri a linket.%1$s beállította, hogy a szobába csak meghívóval lehessen belépni.Olvasatlan üzenetek
- Szabadítsd fel a kommunikációdat.
+ A te beszélgetésed. Vedd birtokba!Beszélgess másokkal közvetlenül vagy csoportosanBeszélgess bizalmasan, titkosítást használvaBővítsd és szabd testre a élménytKezdj nekiVálassz szervertHasonlóan az e-mailhez, egy fiókod van, de bárkivel tudsz beszélgetni
- Milliók csatlakoznak ingyen a legnagyobb nyilvános szerveren
- Prémium üzemeltetés szervezetek részére
+ Csatlakozz a milliónyi felhasználóhoz a legnagyobb nyilvános szerveren
+ Prémium szerver üzemeltetés szervezetek részéreTudj meg többet
- Más
- Személyre szabott szerver cím beállítása
+ Egyéni
+ Másik szerver cím megadásaFolytatásCsatlakozás ide: %1$sCsatlakozás Element Matrix Services hoz
@@ -1452,7 +1452,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
SSO-val való folytatásElement Matrix Services CímCím
- Prémium üzemeltetés szervezetek részére
+ Prémium szerverüzemeltetés szervezetek részéreAdd meg az általad használt Modular szerver, vagy a hozzá tartozó Element címétAdd meg a szerver vagy Element címét amihez csatlakozni szeretnélAz oldal betöltésekor hiba történt: %1$s (%2$d)
@@ -1529,13 +1529,13 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Látták:Kijelentkeztél
- A következő okok miatt lehet:
-\n
-\n• Másik munkamenetedben megváltoztattad a jelszavadat.
-\n
-\n• Törölted ezt a munkamenetedet egy másik munkamenetből.
-\n
-\n• A matrix szerver adminisztrátora biztonsági okokból érvénytelenítette a hozzáférésed.
+ A következő okok miatt lehet:
+\n
+\n• Másik munkamenetedben megváltoztattad a jelszavadat.
+\n
+\n• Törölted ezt a munkamenetedet egy másik munkamenetből.
+\n
+\n• Az általad használt Matrix szerver adminisztrátora biztonsági okokból érvénytelenítette a hozzáférésed.Lépj be újraKijelentkeztélBejelentkezés
@@ -1546,7 +1546,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Személyes adatok törléseFigyelmeztetés: A személyes adataid (beleértve a titkosító kulcsokat is) továbbra is az eszközön vannak tárolva.
\n
-\nHa az eszközt nem használod tovább vagy másik fiókba szeretnél bejelentkezni, töröld őket.
+\nHa az eszközt nem használod tovább, vagy másik fiókba szeretnél bejelentkezni, töröld őket.
Minden adat törléseAdat törléseBiztos vagy benne, hogy minden az eszközön tárolt adatot törölni szeretnél\?
@@ -1554,7 +1554,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
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éseA jelenlegi munkamenet %1$s felhasználóhoz tartozik és %2$s azonosítási adatait adtad meg. Ez Element-ben nem támogatott.
-\nElőször töröld az adatokat, majd a másik felhasználói fiókba lépj be.
+\nElőször töröld az adatokat, utána lépj be a másik fiókba!A matrix.to linked hibásA leírás túl rövidElső szinkronizáció…
@@ -1579,7 +1579,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Megbízhatatlan belépésEgyeznekNem egyeznek
- Hitelesítheted a felhasználót, ha megerősíted, hogy az alábbi egyedi emodzsik azok amik ugyanabban a sorrendben megjelentek a képernyőjén.
+ Hitelesítheted a felhasználót, ha megerősíted, hogy ugyan azok az emojik jelennek meg az ő képernyőjén is, ugyan abban a sorrendben.A legnagyobb biztonság érdekében használj megbízható kommunikációs csatornát vagy tedd meg személyesen.Keresd a zöld pajzsot, hogy biztos lehess abban, hogy a felhasználó megbízható. Bízz meg a szoba minden felhasználójában, hogy a szoba biztonságos lehessen.Nem biztonságos
@@ -1607,9 +1607,9 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
Kód beolvasásaNem lehet beolvasniHa nem vagy ott személyesen akkor inkább hasonlítsd össze az emodzsikat
- Ellenőrzés emodzsikkal
+ Ellenőrzés emojik összehasonlításávalEllenőrzés emodzsival
- Ha az alábbi kódot nem tudod beolvasni, ellenőrizd a rövid egyedi emodzsik összehasonlításával.
+ Ha az alábbi kódot nem tudod beolvasni, ellenőrizd a felhasználót néhány egyedi emoji összehasonlításával.QR kód képEllenőrzés: %sEllenőrizve: %s
@@ -1797,7 +1797,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
\nHa nem akarsz Üzenet Jelszót beállítani, hozz létre inkább Üzenet Kulcsot.
Az Visszaállítási Jelmondat beállításával biztonságba helyezheted és hozzáférhetsz a titkosított üzeneteidhez valamint a bizalomhoz.Titkosítás bekapcsolva
- Ebben a szobában az üzenetek végpontok között titkosítottak. További információkért és ellenőrzéshez nyisd meg a felhasználók profilját.
+ Ebben a szobában az üzenetek végpontok között titkosítottak. További információkért és ellenőrzéshez nyisd meg a felhasználók profiljait!Titkosítás nincs engedélyezveA szobában használt titkosítás nem támogatott%s elkészítette és beállította a szobát.
diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml
index ae1fed2d19..d7eb7a29d4 100644
--- a/vector/src/main/res/values-it/strings.xml
+++ b/vector/src/main/res/values-it/strings.xml
@@ -2250,4 +2250,8 @@
ArgomentoArgomento stanza (facoltativo)Nome stanza
+ Esporta revisione
+ Messaggio diretto
+ Invia cronologia di richieste condivisione chiave
+ Nessun altro risultato
\ No newline at end of file
diff --git a/vector/src/main/res/values-ja/strings.xml b/vector/src/main/res/values-ja/strings.xml
index 6a48529dbe..e764f5001b 100644
--- a/vector/src/main/res/values-ja/strings.xml
+++ b/vector/src/main/res/values-ja/strings.xml
@@ -806,7 +806,7 @@ Matrixでのメッセージの可視性は電子メールと同様です。メ
畳むメッセージとエラーの場合とにかく通話する
- 受け取る
+ 了承このホームサーバーの方針を閲覧し承認してください:通話設定画面着信にElementの既定の着信音を使う
@@ -1045,4 +1045,57 @@ Matrixでのメッセージの可視性は電子メールと同様です。メ
他の利用可能な言語メッセージエディタ環境設定
+ このデバイスを設定
+ セキュアバックアップをリセット
+ セキュアバックアップを設定
+ 管理
+ セキュアバックアップ
+ 部屋を作成中…
+ 招待されています
+ %s からの招待
+ このセッションは正常に検証されました。
+ 概ね完了しました。%s の画面にも同じシールドアイコンが表示されていますか?
+ 相手のユーザーのデバイスのコードをスキャンし、相互に安全性を検証します。
+ 相手のコードをスキャン
+ スキャンできません
+ 断る
+ 検証リクエスト
+ 通話の開始前に確認する
+ 意図しない通話を阻止する
+ お使いの端末は脆弱性のある古いTLSセキュリティプロトコルを使用しています、このセキュリティでは接続できません
+ SSLエラー
+ SSLエラー:相手のアイデンティティが認証されていません。
+ このURLからホームサーバーに接続できませんでした、ご確認ください
+ 有効なMatrixサーバーアドレスではありません
+ このURLは検索結果に表示できません、ご確認ください
+ この電話番号はすでに使用されています。
+ 復旧用のメールアドレスを設定します。後からオプションでメールアドレスや電話番号を使用して知人に見つけてもらえるようにできます。
+ シングルサインオンを使用してサインインする
+ HDを使用する
+ HDを使用しない
+ 背面
+ 前面
+ カメラの切り替え
+ ワイヤレスヘッドセット
+ ヘッドセット
+ スピーカー
+ 電話
+ サウンドデバイスを選択
+ リアルタイム接続を確立できませんでした。
+\nホームサーバーの管理者に、通話が正常に動作するためにTURNを設定するようご連絡ください。
+ 再び表示しない
+ アイデンティティサーバーが設定されていません。
+ 終了
+ 拒否
+ 承諾
+ 中止
+ ウィジェットを削除できませんでした
+ ウィジェットを追加できませんでした
+ ビデオ通話を開始
+ 会議が進行中です!
+ 通話を開始する権限がありません
+ このルームで通話を開始する権限がありません
+ グループ通話を開始する権限がありません
+ リセット
+ なし
\ 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 48f9e87737..c6275dd936 100644
--- a/vector/src/main/res/values-nb-rNO/strings.xml
+++ b/vector/src/main/res/values-nb-rNO/strings.xml
@@ -1,9 +1,8 @@
-
+
nbNOLatn
-
Lyst temaMørkt temaSvart tema
@@ -18,7 +17,6 @@
Send et klistremerkeEr du sikker\?Laster…
-
OKLukkLagre
@@ -51,7 +49,6 @@
IgnorerGjennomgangAvslå
-
AvsluttHandlingerLogg ut
@@ -59,15 +56,12 @@
LukkKopiert til utklippstavleSlå av
-
AdvarselFeil
-
HjemFolkRomSamfunn
-
InvitasjonerLavprioritetIngen treff
@@ -76,12 +70,9 @@
InviterSamfunnIngen grupper
-
Meld fra om en bugFremgang (%s%%)
-
Les
-
Bli med i rommetBrukernavnOpprett konto
@@ -89,10 +80,8 @@
Logg utIdentitetstjener-URLSøk
-
Ta et bildeSpill inn en video
-
Logg innOpprett kontoSend
@@ -106,26 +95,21 @@
Glemt passord\?Jeg har verifisert E-postadressen minVennligst skriv inn en gyldig URL
-
OriginalStoreMediumSmå
-
I gårI dag
-
InformasjonLagretJANEIFortsett
-
FjernBli medForhåndsvisningAvvis
-
Synkroniserer …1sek
@@ -143,9 +127,7 @@
1d%dd
-
Lag
-
TilkobletFrakobletRolig
@@ -154,7 +136,6 @@
Opphev utestengelseSpark ut%1$s %2$s
-
SøkFilen ble ikke funnetStol på
@@ -164,10 +145,8 @@
FilerInstillingerBLE MED
-
Avbryt opplastningAvbryt nedlasting
-
Ingen treffROMROM
@@ -184,14 +163,10 @@
E-postTelefonÅpne Innstillinger
-
Slå på
-
Slå på
-
VanligVarslingslyd
-
VersjonOpphavsrettighetRetningslinjer for personvern
@@ -206,14 +181,12 @@
AnalyserSend analytiske dataJa, jeg vil hjelpe til!
-
IDOffentlig navnSist settAutentiseringPassord:Send
-
Logget inn somIdentitetstjenerBrukergrensesnitt
@@ -224,7 +197,6 @@
Nytt passordBekreft nytt passordPassordene er ikke like
-
LandTelefonnummerKode
@@ -236,20 +208,16 @@
1 uke1 månedFor alltid
-
EmneLavprioritetIngen
-
VarslerAlleBannlyste brukere
-
AvansertAdresserMappeTema
-
HendelsesinformasjonBruker-IDAlgoritme
@@ -261,14 +229,11 @@
EksporterImporterSvartelistet
-
ingen
-
BekreftSvartelisteHjemmetjener-URLSkriv her …
-
RomMegSkriftstørrelse
@@ -278,40 +243,31 @@
StørreDet størsteEnorm
-
Åpne i nettleserDin bruker-IDDitt temaModul-IDRom-ID
-
-
TillatBekreftDelIgnorer
-
AvLagEksempeleksempel
-
HjemFolkBle medInvitertBli med igjenGlem rommet
-
Profilbilde
-
Deaktiver kontoenDeaktiver kontoen
-
Vennligst skriv inn et brukernavn.utvidskjul
-
Alltid%1$s:%1$s: %2$s
@@ -321,7 +277,6 @@
Lagre som filErstattStopp
-
Uventet feilEr du sikker\?Aldri mist krypterte beskjeder
@@ -329,23 +284,17 @@
VersjonAlgoritmeSignatur
-
Verifisert!Jeg forstår
-
VerifiseringsforespørselUkjent feil
-
RedigerSvar
-
Prøv igjenInvitert av %s
-
ReaksjonerLikerReaksjoner
-
EndreVennligst vent …Nytt rom
@@ -355,20 +304,14 @@
Sikkerhet og personvernEkspertFormat:
-
Stemme og videoHjelp/Om
-
-
Vis skjulte hendelser i tidslinjen
-
Venter …(redigert)
-
Vilkår for brukBytt ut identitetstjenerVenter
-
Opprett et nytt romVis passordSkjul passord
@@ -385,54 +328,41 @@
Registrer degLogg innFortsett med SSO
-
NesteE-postNytt passord
-
Fortsett
-
Jeg har verifisert E-postadressen min
-
Suksess!Passordet ditt har blitt tilbakestilt.AdvarselE-postE-post (valgfritt)Neste
-
TelefonnummerNeste
-
Skriv inn kodeNeste
-
BrukernavnPassordNesteAdvarselVennligst sjekk eposten dinSett av
-
Logg påLogg påPassordInstillingerGjeldende øktFøyer til ¯\\_(ツ)_/¯ på en råtekstmelding
-
Video.Bilde.LydFil
-
Du avbrøtDu aksepterteVerifiseringsforespørsel
-
-
Du
-
Verifiser %sVerifiserte %sSikkerhet
@@ -444,24 +374,18 @@
TilpassetInvitasjonerBrukere
-
Opphev ignorering
-
Tidslinje
-
Vil du skru på kryptering\?BekreftAdvarsel
-
SesjonerJaAdvarsel:Bekreft fjerningStatus.im-tema
-
Lytter etter hendelserVerifiser økten
-
Aktiv samtaleSend loggbøkerSend tilbakestillings-E-post
@@ -474,7 +398,6 @@
%d medlemmer1 medlem
-
%1$s nå%s skriver …Søk
@@ -490,15 +413,12 @@
Element samler inn anonyme statistikker for å hjelpe oss med å forbedre programmet.%1$s @ %2$sIntegreringsbehandler
-
Rommets navnHvem kan lese historikken\?Hvem kan gå inn i dette rommet\?
-
Kun medlemmer (f.o.m. da denne innstillingen ble valgt)Kun medlemmer (f.o.m. da de ble invitert)Kun medlemmer (f.o.m. de ble med)
-
Kun folk som har blitt invitertDette rommet viser ikke merkeskilter for noen samfunnKopier rommets ID
@@ -513,7 +433,6 @@
1 rom%d rom
-
%1$s: 1 melding%1$s: %2$d meldinger
@@ -522,7 +441,6 @@
%d varsel%d varsler
-
Ny hendelseNye meldingerNy invitasjon
@@ -531,8 +449,6 @@
1 aktiv modul%d aktive moduler
-
-
ModulLast inn modulDitt visningsnavn
@@ -545,21 +461,17 @@
Velg rommets temaStilleBråkete
-
Kryptert melding
-
Opprett et samfunnSamfunnsnavnSamfunns-IDRomIngen brukere
-
Rom1 medlem%d medlemmer
-
1 rom%d rom
@@ -571,57 +483,45 @@
Begynn å bruke NøkkelsikkerhetskopieringDet var megBegynn å bruke Nøkkelsikkerhetskopiering
-
Sendte deg en invitasjonRomOpprett et nytt romRomDirektemeldinger
-
Rommets navnURL:Direktemeldinger
-
MeldingsredigeringerFiltrer samtaler …Opprett et nytt romBlir med i rommet …
-
IdentitetstjenerSkriv inn en ny identitetstjenerSend vedlegg
-
KlistremerkeDet er søppelpostAlle meldingerKun nevningerForlat rommetUleste meldinger
-
Kom i gang
-
Velg en tjenerTilbakestill passordet på %1$sAdvarsel!Velg en E-postadresseVelg et telefonnummerGodkjenn vilkårene for å fortsette
-
Avanserte innstillingerUtviklermodusDersom dette først har blitt skrudd på, kan kryptering aldri bli skrudd av.
-
De samsvarerIkke sikkerVenter …Verifiser denne øktenQR-kodebilde
-
Forlat rommetForlater rommet …
-
Dersom dette først har blitt skrudd på, kan kryptering aldri bli skrudd av.
-
Aktive økterVis alle økterBehandle økter
@@ -629,18 +529,13 @@
VerifisertBetroddIkke betrodd
-
QR-kode
-
Nei
-
UtviklerverktøyNy innlogging
-
Fjern …Bråkete notifikasjonerStille notifikasjoner
-
SamfunnsdetaljerSikkerhetskopiering av nøklerBruk sikkerhetskopiering av nøkler
@@ -653,9 +548,7 @@
Bruk sikkerhetskopiering av nøklerSikkerhetskopiDu kommer til å miste tilgang til dine enkrypterte meldinger med mindre du sikkerhetskopierer nøklene dine før du logger av.
-
Tredjepartslinsenser
-
BliSnakkSe dekryptert kilde
@@ -686,9 +579,7 @@
Filtrer folkFiltrer romnavnFiltrer samfunnsnavn
-
Systemadvarsler
-
SamtalerLokal adressebokBrukerkatalog
@@ -696,14 +587,12 @@
Ingen samtalerDu ga ikke Element tilgang til dine lokale kontakterIngen identitetsserver konfigurert.
-
RomkatalogIngen offentlige rom tilgjengelig
- 1 bruker
+ %d bruker%d brukere
-
Send kjæsjloggSend skjermbildeVennligst forklar feilen. Hva gjorde du\? Hva forventet du at skulle skje\? Hva skjedde i stedet\?
@@ -713,7 +602,6 @@
Det ser ut som du rister på telefonen i frustrasjon. Har du list til å åpne feilrapporteringsskjermen\?Applikasjonen kræsjet sist gang. Har du lyst til å åpne kræsjskjermen\?Sinnarist for å rapportere feil
-
Feilrapport har blitt sendtfeilrapporten feilet å sendes (%s)Send inn i
@@ -721,17 +609,13 @@
Start ny chatStart lydsamtaleStart videosamtale
-
Send lydopptak
-
Er du sikker på du vil starte en samtale med %s\?Er du sikker på du vil starte en lydsamtale\?Er du sikker på du vil starte en videosamtale\?Spill avPauseAvslå
-
-
Du har ikke rettigheter til å starte en konferansesamtale i dette rommetDet pågår allerede en konferanse!Start videomøte
@@ -743,12 +627,10 @@
Kunne ikke fjerne utvidelseKopierSuksess
-
VarslerOppringing feilet som følge av feilkonfigurert tjenerPrøv med %sIkke spør meg igjen
-
Element samtale feiletVelg lydenhetTelefon
@@ -760,17 +642,14 @@
BakSlå HD avSlå HD på
-
Send filerSend klistremerkeTa bilde eller videoDu har ingen pakker med klistremerker slått på.
\n
\nLegge til noen nå\?
-
fortsett med…Dessverre, kunne ikke finne en passende ekstern applikasjon for å utføre denne handlingen.
-
Logg på med single sign-onE-post eller brukernavnBrukernavn
@@ -797,7 +676,6 @@
Forlat rommet%1$s for %2$s siden
-
DirektemeldingerForlat dette rommetFjern fra dette rommet
@@ -805,9 +683,7 @@
Utnevn til adminIgnorer brukerIgnorer
-
Opphev ignorering
-
Bannlys bruker"%1$s, "%1$s og %2$s
@@ -818,7 +694,6 @@
1 ny melding%d nye meldinger
-
Romdetaljer1 valgt
@@ -827,13 +702,11 @@
INVITERTMELDINGERFILER
-
Opprett et romBli med i rommetBli med i et romBetingelser og vilkårPersonvernregler
-
Legg til E-postadresseLegg til telefonnummerAvanserte varselsinnstillinger
@@ -841,7 +714,6 @@
Kontoinnstillinger.Start ved systemoppstartSkru av restriksjoner
-
BatterioptimaliseringRedusert privatlivSkru på varsler for denne kontoen
@@ -850,7 +722,6 @@
Start ved systemoppstartBetingelser og vilkårTøm mediemellomlager
-
BrukerinnstillingerIgnorerte brukereIntegreringer
@@ -863,23 +734,19 @@
Behandle dine oppdagelsesinnstillinger.Gi tillatelseVelg et annet alternativ
-
Gi tillatelse
-
DatasparingsmodusØktinformasjonHjemmetjenerTillat integreringerIntegreringer er skrudd avVelg språk
-
Verifisering avventerDenne E-postadressen ble ikke funnet.Oppdater passordTelefonverifiseringStandardkomprimeringMerket som:
-
Tilgang og synlighetRomtilgangPunkt-til-punkt-kryptering
@@ -891,10 +758,7 @@
%1$s i %2$s%1$s: %2$s%1$s: %2$s %3$s
-
Aktive moduler
-
-
Last inn modulen på nyttBruk kameraetBruk mikrofonen
@@ -903,25 +767,20 @@
Vennligst skriv inn passordet ditt.Samtalen fortsetter herKontakt administrator
-
Beklager, det oppstod en feil
-
Opprett en passordfraseBekreft passordfrasenSkriv inn passordfrasePassordfrasen samsvarer ikkeVennligst skriv inn en passordfrasePassordfrasen er for svak
-
(Avansert)Velg passordfraseSuksess!GjenopprettingsnøkkelSkriv inn gjenopprettingsnøkkelen
-
Gjenopprett fra sikkerhetskopiSlett sikkerhetskopien
-
Slett sikkerhetskopienBegynn verifiseringDu bruker ikke noen identitetstjenere
@@ -931,35 +790,24 @@
Vis fjernede meldingerVis en stattholder for fjernede meldingerAlle samfunn
-
Rom-arkivMatrix SDK-versjonHurtigreaksjoner
-
Send inn et forslagKrypterer filen …Navn eller ID (#example:matrix.org)
-
Filtrer etter brukernavn eller ID …
-
Vis redigeringshistorikk
-
MEDIAFILER%1$s, kl. %2$sDet er upassendeIGNORER BRUKER
-
Ignorer bruker
-
SpoilerDu ignorerer ikke noen brukere
-
Langklikk på et rom for å se flere innstillinger
-
-
Tilpassede og avanserte innstillinger
-
Koble til %1$sAdresseSjekk innboksen din
@@ -972,19 +820,14 @@
Du er logget avDu er logget avTøm alle data
-
Se alle mine økterSkru på krypteringDe samsvarer ikkeKlistremerke
-
Skru på kryptering
-
Oppdater
-
Din gjenopprettingsnøkkelAvslutt
-
Kryptering er skrudd påKryptering er ikke skrudd påMedlinger som inneholder @room
@@ -993,9 +836,7 @@
Når rom blir oppgradertFeilsøk%1$s (%2$s)
-
Velg et nytt kontopassord …
-
UkryptertLegg til medlemmerInviterer brukere …
@@ -1009,14 +850,12 @@
Opphev demping av mikrofonenStopp kameraetStart kameraet
-
Sett oppRommets navnEmneKan ikke dekryptereSKJØNNERLÆR MER
-
Telefonkatalogen din er tomTelefonkatalogSøk i mine kontakter
@@ -1025,4 +864,53 @@
Skriv inn PIN-koden dinGlemt PIN-koden\?Skru på PIN-kode
-
+ Sjekk e-postadressen din for å fortsette registreringen
+ Dette telefonnummeret er allerede definert.
+ Denne e-postadressen er allerede definert.
+ Passordet er for kort (min 6)
+ Brukernavn kan bare inneholde bokstaver, tall, prikker, bindestrek og understreker
+ Feil brukernavn og/eller passord
+ Angi en e-post for kontogjenoppretting. Bruk senere e-post eller telefon for å være mulig å oppdage av folk som kjenner deg.
+ Angi en e-post for kontogjenoppretting. Bruk senere e-post eller telefon for å være mulig å oppdage av folk som kjenner deg.
+ Sett en telefon, og senere for å bli valgbar for personer som kjenner deg.
+ Angi en e-post for gjenoppretting av kontoen, og senere for å være mulig å oppdage for folk som kjenner deg.
+ Send historikk om forespørsel om nøkkelandel
+ Ingen flere resultater
+ Legg på
+ Avslå
+ Godta
+ Du har ikke tillatelse til å starte en samtale
+ Du har ikke tillatelse til å starte en samtale i dette rommet
+ Du har ikke tillatelse til å starte en konferansesamtale
+ Tilbakestill
+ Ugyldig brukernavn/passord
+ Denne enheten bruker en utdatert TLS sikkerhetsprotokoll som er sårbar for angrep, for din egen sikkerhet får du ikke kople til serveren
+ Klarte ikke registrere bruker
+ Klarte ikke registrere bruker: Nettverksfeil
+ Klarte ikke logge inn
+ Klarte ikke logge inn: Nettverksfeil
+ Vennligst les og aksepter reglene for denne hjemmetjeneren:
+ Passordet ditt har blitt tilbakestilt.
+\n
+\nAlle øktene dine har blitt logget ut og får ikke lenger push-notifikasjoner. For å skru på notifikasjoner igjen, logg inn på enhetene på nytt.
+ Klarte ikke verifisere e-postadressen: Pass på at du har klikket på lenken i e-posten
+ En e-post har blitt sendt til %s. Etter du har fulgt lenken i den kan du klikke nedenfor.
+ Du må skrive et nytt passord.
+ Du må skrive inn e-postadressen som er knyttet til din konto.
+ For å tilbakestille passordet, skriv inn e-postadressen som er knyttet til kontoen din:
+ Denne hjemmetjeneren vil vite om du er en robot
+ Registrering med e-post og telefonummer samtidig fungerer ikke enda. Bare telefonummeret kommer til å bli registrert.
+\n
+\nDu kan legge e-postadressen din til i instillinger.
+ Bruk egendefinerte tjenerinstillinger (avansert)
+ Klarte ikke å starte en sanntidskopling.
+\nVennligst be hjemmetjeneradministratoren din om å sette opp en TURN server så samtaler blir mer stabile.
+ Vennligst be administratoren for hjemmetjeneren din (%1$s) til å sette opp en TURN tjener for at telefonsamtaler skal fungere ordentlig.
+\n
+\nAlternativt kan du prøve å bruke den offentlige tjeneren på %2$s, men dette vil ikke være like stabilt, og det vil dele IP-adressen din med den serveren. Du kan styre dette i instillinger.
+ e-postlenken har ikke blitt trykket på enda
+ Dette brukernavnet er allerede brukt
+ Inneholdt ikke gyldig JSON
+ Ugyldig JSON
+ Biletten din ble ikke gjenkjent
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml
index 55e904bc2e..c040882e80 100644
--- a/vector/src/main/res/values-pt-rBR/strings.xml
+++ b/vector/src/main/res/values-pt-rBR/strings.xml
@@ -361,7 +361,7 @@
Digite o ide ou o apelido de uma salaPesquisar na lista pública
- Buscando no diretório…
+ Buscando na lista…FavoritarDespriorizar
@@ -516,7 +516,7 @@
Ativar criptografia·
\n(atenção: não é possível desativar depois!)
- Diretório
+ Lista%s tentou carregar um trecho específico da conversa desta sala, mas não conseguiu.
@@ -573,15 +573,15 @@
Escolha uma lista pública de salasO servidor pode estar indisponível ou sobrecarregado
- Entre com um servidor principal (homeserver) a partir do qual serão listadas as salas públicas
+ Digite um servidor local, a partir do qual serão listadas as salas públicasEndereço do servidor principalTodas as salas com o servidor %sTodas as salas nativas em %sPesquisar no histórico
- Desconectado
+ OfflineLista de usuários
- LISTA DE USUÁRIAS(OS) (%s)
+ LISTA DE USUÁRIOS (%s)Iniciar com o sistemaEsvaziar o cache de mídiaManter mídia
@@ -1407,7 +1407,7 @@
PúblicoQualquer pessoa poderá entrar nesta salaLista de Salas
- Publicar esta sala na lista das salas
+ Publicar esta sala na lista de salasOcorreu um erro ao receber informações de confiançaOcorreu um erro ao obter dados de backup de chavesImportar as chaves de arquivo \"%1$s\".
@@ -1452,7 +1452,7 @@
Não consegue encontrar o que você está procurando\?Criar uma sala novaEnviar nova mensagem
- Veja lista das salas
+ Veja lista de salasNome ou ID (#example:matrix.org)Ativar o recurso de deslizar para responder nas conversasAdicione uma aba dedicada para notificações não lidas na tela principal.
@@ -2250,4 +2250,8 @@
DescriçãoDescrição da sala (opcional)Nome da sala
+ Enviar histórico de solicitações do compartilhamento de chaves
+ Não há mais resultados
+ Exportar auditoria
+ Enviar mensagem
\ No newline at end of file
diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml
index 81d64d9669..ce76f7c387 100644
--- a/vector/src/main/res/values-sq/strings.xml
+++ b/vector/src/main/res/values-sq/strings.xml
@@ -2177,4 +2177,8 @@
SubjektSubjekt dhome (në daçi)Emër dhome
+ Eksporto Auditim
+ Mesazh i drejtpërdrejtë
+ Dërgo historik kërkesash për dhënie kyçesh
+ S’ka më përfundime
\ No newline at end of file
diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml
index 97075ac975..4f71783b20 100644
--- a/vector/src/main/res/values-sv/strings.xml
+++ b/vector/src/main/res/values-sv/strings.xml
@@ -2187,4 +2187,8 @@
RumsinställningarRumsämne (valfritt)Rumsnamn
+ Exportera granskning
+ Direktmeddelande
+ Skicka historik över nyckeldelningsförfrågningar
+ Inga fler resultat
\ No newline at end of file
diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml
index 22ebb6c885..fdc69678fd 100644
--- a/vector/src/main/res/values-uk/strings.xml
+++ b/vector/src/main/res/values-uk/strings.xml
@@ -1002,4 +1002,20 @@
Резервне копіювання ключів…Якщо вийти зараз, ви втратите свої зашифровані повідомленняПеревірка сеансу
+ Стікер
+ Галерея
+ Файл
+ Додати зображення з
+ Контакт
+ Камера
+ Аудіо
+ Створити нову кімнату
+ Кімнати
+ Пошук в зашифрованих кімнатах не підтримується на даний момент.
+ Запитувати підтвердження перед початком дзвінку
+ Запобігати випадковим дзвінкам
+ Мені не потрібні мої зашифровані повідомлення
+ Скасувати зміни
+ SSL помилка.
+ Ви не можете здійснити дзвінок із самим собою, дочекайтесь, доки інші учасники приймуть ваше запрошення
\ 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 17bf14161c..bcb449cabb 100644
--- a/vector/src/main/res/values-zh-rCN/strings.xml
+++ b/vector/src/main/res/values-zh-rCN/strings.xml
@@ -186,14 +186,16 @@
此主服务器想确认您不是机器人一封电子邮件已发送至 %s。点击了其中的链接后,请点击下面。电子邮箱地址验证失败:请确保您已点击邮件中的链接
- 密码已重置。 您已从所有设备注销并且不再接受推送通知。要重新启用通知,请重新在相应设备上登录。
+ 密码已重置。
+\n
+\n您已经退出所有会话,将不再收到推送通知。要重新启用通知,请在每台设备上重新登录。原始%d 秒通话已连接通话正在连接…
- 为了发送或保存附件,Element 需要访问您的图片和视频库。
-
-请在接下来弹出的窗口中授权允许访问。
+ 为了发送或保存附件,Element 需要访问您的图片和视频库。
+\n
+\n请在接下来弹出的窗口中授权允许访问,以便应用能够从您的手机发送文件。为了拍照或进行视频通话,Element 需要访问您的相机。为了进行语音通话,Element 需要访问您的麦克风。您试图访问聊天室 %s。您是否愿意加入这个聊天室?
@@ -238,9 +240,9 @@
设置已邀请已加入
- 您要隐藏所有来自这个用户的消息吗?
-
-注意,此操作会重启应用并将花费一些时间。
+ 您要隐藏所有来自这个用户的消息吗?
+\n
+\n注意,此操作会重启应用并将花费一些时间。取消上传取消下载收藏夹
@@ -268,13 +270,13 @@
通知已忽略的用户通讯录权限
- 这个操作需要额外的身份认证。
-请输入您的密码以继续。
+ 这个操作需要额外的身份认证。
+\n请输入您的密码以继续。身份认证当前密码
- 是否重新显示所有来自 %s 的消息?
-
-注意,此操作会重启应用并将花费一些时间。
+ 是否重新显示所有来自 %s 的消息?
+\n
+\n注意,此操作会重启应用并将花费一些时间。选择国家国家请选择一个国家
@@ -309,8 +311,8 @@
“%s” 不是有效的别名格式这个聊天室已启用加密。这个聊天室已禁用加密。
- 启用加密
-(警告:无法再禁用!)
+ 启用加密
+\n(警告:无法再禁用!)目录端对端加密信息事件信息
@@ -353,9 +355,9 @@
问题反馈发送失败(%s)阅读无效令牌
- 在出现相应的 API 前,暂不支持同时使用电子邮箱地址与手机号码注册。只有手机号码会被添加到此帐户。
-
-您可在设置中将电子邮箱添加到你的账户。
+ api存在之前,不支持同时通过电子邮件和电话号码进行注册。我们只考虑电话号码。
+\n
+\n您可以在设置中添加您的电子邮件到您的个人资料。用户名已被使用无法注册:电子邮箱所有权验证失败无法识别指定的访问令牌
@@ -378,17 +380,18 @@
"
\n
\n请在接下来弹出的窗口中授权允许访问。"
- 为了进行视频通话,Element 需要访问您的相机和麦克风。
-
-请在接下来弹出的窗口中授权允许访问。
+ Element需要许可才能访问您的摄像机和麦克风来执行视频通话。
+\n
+\n请在接下来弹出的窗口中授权允许访问。对不起。因为权限不足,操作已取消保存至下载?移除
- 此邀请已发送至未与此账户关联的 %s。 您可能希望用一个不同的账户登录,或者把这个电子邮箱加入到这个账户。
+ 此邀请已发送至未与此账户关联的 %s。
+\n您可能希望用一个不同的账户登录,或者把这个电子邮箱加入到你的账户。这是此聊天室的预览。与聊天室的交互已禁用。通话
- 您将不能撤销这个修改,因为您正在让这个用户和您拥有相同的特权级别。
-您确定吗?
+ 您将不能撤销这个修改,因为您正在让这个用户和您拥有相同的特权级别。
+\n您确定吗?这可能意味着有人在恶意劫持您的通讯,或者您的手机不信任远程服务器的数字证书。如果服务器管理员说这是正常的,请确保以下的指纹与管理员提供的指纹相符。报告这个内容的原因
@@ -442,9 +445,9 @@
Element 需要访问您的通讯录,才能根据电子邮箱地址和手机号码查找其他 Matrix 用户。
请在接下来的弹出窗口中授权允许访问。
- Element 需要访问您的通讯录,才能根据电子邮箱地址和手机号码查找其他 Matrix 用户。
-
-允许 Element 访问您的通讯录?
+ Element可以检查您的通讯录,以根据电子邮件和电话号码找到其他Matrix用户。
+\n
+\n你同意为此目的分享你的通讯录吗\?空闲仅 Matrix 用户您的手机信任的证书已被更改。这非常反常。建议您不要接受此新证书。
@@ -472,9 +475,7 @@
%s 已尝试在这个聊天室的时间线上加载一个特定的时间点,但无法找到它。公开名称为验证此设备是否可信,请通过其他方式(例如面对面交换或拨打电话)与其拥有者联系,并询问他们该设备的用户设置中的密钥是否与以下密钥匹配:
- 如果匹配,请点击下面的验证按钮。
-\n如果不匹配,那么这可能说明其他人正在盗用此设备,而您应当将其拉入黑名单。
-\n未来,这个验证过程将会变得更加精致、巧妙一些。
+ 如果它们不匹配,您通信的安全性可能会受到影响。这个聊天室包含未经验证的未知设备。
\n这意味着无法保证该设备属于其声称的用户。
\n我们建议您在继续操作之前,先验证每个设备,但如果您愿意也可以不验证而重新发送消息。
@@ -701,11 +702,7 @@
请允许资料分析以帮助我们改进 Element。是的,我愿意帮助!停用账户
- 这将使您的账户永远不再可用。您将不能登录,或使用相同的用户 ID 重新注册。您的账户将退出所有已加入的聊天室,身份服务器上的账户信息也会被删除。此操作是不可逆的。
-
-停用您的账户不会默认忘记您发送的消息。如果您希望我们忘记您发送的消息,请勾选下面的选择框。
-
-Matrix 中的消息可见性类似于电子邮件。我们忘记您的消息意味着您发送的消息不会被发给新注册或未注册的用户,但是已收到您的消息的注册用户依旧可以看到他们的副本。
+ 请在我停用账户的同时忘记我发送的所有消息(警告:这将导致未来的用户看到残缺的对话)请输入您的密码以继续:停用账户
@@ -821,17 +818,17 @@ Matrix 中的消息可见性类似于电子邮件。我们忘记您的消息意
系统设置。通知已在系统设置中启用。通知已在系统设置中禁用。
-请检查系统设置。
+\n请检查系统设置。打开设置帐号设置。您的帐号已启用通知。
- 您的帐号已禁用通知。
-请检查帐号设置。
+ 您的账户已禁用通知。
+\n请检查账户设置。启用设备设置。已为此设备启用通知。
- 已为此设备禁用通知。
-请检查 Element 设置。
+ 此会话未启用通知。
+\n请检查 Element 设置。启用Play 服务检查Google Play 服务的 APK 文件可用且为最新版本。
@@ -840,17 +837,17 @@ Matrix 中的消息可见性类似于电子邮件。我们忘记您的消息意
修复 Play 服务Firebase 令牌成功获取 FCM Token:
-%1$s
- FCM Token 获取失败:
-%1$s
+\n%1$s
+ FCM Token 获取失败:
+\n%1$s注册 TokenFCM Token 已成功注册至主服务器。
- 将 FCM Token 注册至主服务器时失败:
-%1$s
+ 未能将FCM Token 注册到主服务器:
+\n %1$s通知服务通知服务正在运行。
- 通知服务尚未运行。
-请尝试重启本应用程序。
+ 通知服务未在运行。
+\n请尝试重启本应用程序。启动服务调用系统相机应用而非使用 Element 内置的相机界面。此选项需要第三方应用录制消息。
@@ -870,8 +867,8 @@ Matrix 中的消息可见性类似于电子邮件。我们忘记您的消息意
显示账户变动事件包括头像与显示名称的变动。后台连接
- Element需要保持一个低影响的后台连接才能保证可靠的通知。
-在下一个弹出窗口中,系统将提示您允许 Element 始终在后台运行,请点击“允许“。
+ Element需要保持低影响的后台连接,以便获得可靠的通知。
+\n下一个屏幕中,系统将提示您允许 Element 始终在后台运行,请点击“允许“。授予权限在验证您的电子邮件地址时发生了一个错误。密码
@@ -899,11 +896,11 @@ Matrix 中的消息可见性类似于电子邮件。我们忘记您的消息意
服务重启失败服务将在设备重启后启动。服务不会在设备重启后启动,在您打开 Element 一次之前您将不会收到消息通知。
- 对 Element 的后台限制已被关闭。此测试应在移动数据(无Wi-Fi)环境下进行。
-%1$s
- 对 Element 的后台限制已开启。
-Element 在后台时的工作将被显著的限制,这可能会影响消息通知。
-%1$s
+ 已禁用对 Element 的后台限制。此测试应使用移动数据(非Wi-Fi)进行。
+\n%1$s
+ 已启用对 Element 的后台限制。
+\nElement 在后台时的工作将被显著地限制,这可能会影响消息通知。
+\n%1$s关闭后台限制Element 未被电池优化影响。如果设备在未充电的情况下关屏静置一段时间,其将进入打盹模式(Doze)。这将阻止应用访问网络并延后其运行、同步、与响铃。
@@ -1371,7 +1368,7 @@ Element 在后台时的工作将被显著的限制,这可能会影响消息通
正在加密文件…正在发送文件 (%1$s / %2$s)正在下载文件 %1$s…
- "文件 %1$s 已下载!"
+ 文件%1$s 已被下载!消息编辑未找到编辑过滤对话…
@@ -1922,7 +1919,7 @@ Element 在后台时的工作将被显著的限制,这可能会影响消息通
无法添加媒体文件到相册无法保存媒体文件选择新的账户密码…
- 在您的其他设备上使用最新的 Element,Element Web,Element Desktop,Element iOS,Element for Android,或其他能够交叉签名的 Matrix 客户端
+ 在您的其他设备上使用最新的 Element、Element Web、Element Desktop、Element iOS、Element for Android,或其他能够交叉签名的 Matrix 客户端Element Web
\nElement DesktopElement iOS
diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml
index 6dc811aa28..8d019a7635 100644
--- a/vector/src/main/res/values-zh-rTW/strings.xml
+++ b/vector/src/main/res/values-zh-rTW/strings.xml
@@ -2149,4 +2149,8 @@
主題聊天室主題(選擇性)聊天是名稱
+ 匯出審核
+ 直接訊息
+ 傳送金鑰共享請求歷史
+ 沒有更多結果
\ No newline at end of file
diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml
index 9f2f473f94..2cb6eb9af9 100644
--- a/vector/src/main/res/values/strings.xml
+++ b/vector/src/main/res/values/strings.xml
@@ -79,6 +79,7 @@
PauseDismissReset
+ Start Chatting
@@ -424,6 +425,8 @@
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?Sorry. Action not performed, due to missing permissions
+ To scan a QR code, you need to allow camera access.
+ Allow permission to access your contacts.Saved
@@ -1754,6 +1757,7 @@
View the room directoryName or ID (#example:matrix.org)
+ Search by name or IDEnable swipe to reply in timelineAdd a dedicated tab for unread notifications on main screen.
@@ -1761,10 +1765,16 @@
Link copied to clipboardAdd by matrix ID
+ Add by QR code
+ QR code"Creating room…""No result found, use Add by matrix ID to search on server.""Start typing to get results""Filter by username or ID…"
+ Recent
+ Known Users
+ Contacts
+ Suggestions"Joining room…"
@@ -1828,6 +1838,8 @@
Open the create room menuClose the create room menu…Create a new direct conversation
+ Create a new direct conversation by Matrix ID
+ Create a new direct conversation by scanning a QR codeCreate a new roomClose keys backup bannerShow password
@@ -2537,14 +2549,23 @@
INVITEInviting users…Invite Users
+ Invite friends
+ Hey, talk to me on Element: %s
+ 🔐️ Join me on elementInvitation sent to %1$sInvitations sent to %1$s and %2$s
+ "It's not a valid matrix QR code"Invitations sent to %1$s and one moreInvitations sent to %1$s and %2$d moreWe could not invite users. Please check the users you want to invite and try again.
+ Scan a QR code
+ Share my code
+ My code
+ Share this code with people so they can scan it to add you and start chatting.
+
Current languageOther available languagesLoading available languages…
@@ -2669,9 +2690,17 @@
Can\'t open a room where you are banned from.Can\'t find this room. Make sure it exists.
+
+ Share by text
+ Cannot DM yourself!
+ Invalid QR code (Invalid URI)!
+ QR code not scanned!
+
The link was malformedThe room is not yet created. Cancel the room creation?There are unsaved changes. Discard the changes?Discard changes
+
+ Matrix Link
diff --git a/vector/src/main/res/values/style_snackbar.xml b/vector/src/main/res/values/style_snackbar.xml
index 7e0dbc0e0b..3a826a6dda 100644
--- a/vector/src/main/res/values/style_snackbar.xml
+++ b/vector/src/main/res/values/style_snackbar.xml
@@ -2,13 +2,15 @@
-
+
diff --git a/vector/src/main/res/xml/motion_scene_fab_menu.xml b/vector/src/main/res/xml/motion_scene_notifs_fab_menu.xml
similarity index 100%
rename from vector/src/main/res/xml/motion_scene_fab_menu.xml
rename to vector/src/main/res/xml/motion_scene_notifs_fab_menu.xml