Merge branch 'develop' into feature/initial_sync

This commit is contained in:
ganfra 2019-12-19 17:49:45 +01:00
commit 55748a4af4
64 changed files with 1768 additions and 944 deletions

View File

@ -1,4 +1,25 @@
Changes in RiotX 0.11.0 (2019-XX-XX) Changes in RiotX 0.12.0 (2019-XX-XX)
===================================================
Features ✨:
-
Improvements 🙌:
-
Other changes:
-
Bugfix 🐛:
-
Translations 🗣:
-
Build 🧱:
-
Changes in RiotX 0.11.0 (2019-12-19)
=================================================== ===================================================
Features ✨: Features ✨:
@ -7,6 +28,7 @@ Features ✨:
Improvements 🙌: Improvements 🙌:
- Handle navigation to room via room alias (#201) - Handle navigation to room via room alias (#201)
- Open matrix.to link in RiotX (#57) - Open matrix.to link in RiotX (#57)
- Limit sticker size in the timeline
Other changes: Other changes:
- Use same default room colors than Riot-Web - Use same default room colors than Riot-Web
@ -14,10 +36,9 @@ Other changes:
Bugfix 🐛: Bugfix 🐛:
- Scroll breadcrumbs to top when opened - Scroll breadcrumbs to top when opened
- Render default room name when it starts with an emoji (#477) - Render default room name when it starts with an emoji (#477)
- Do not display " (IRC)") in display names https://github.com/vector-im/riot-android/issues/444 - Do not display " (IRC)" in display names https://github.com/vector-im/riot-android/issues/444
- Fix rendering issue with HTML formatted body
Translations 🗣: - Disable click on Stickers (#703)
-
Build 🧱: Build 🧱:
- Include diff-match-patch sources as dependency - Include diff-match-patch sources as dependency

View File

@ -30,7 +30,7 @@ data class ContentAttachmentData(
val exifOrientation: Int = ExifInterface.ORIENTATION_UNDEFINED, val exifOrientation: Int = ExifInterface.ORIENTATION_UNDEFINED,
val name: String? = null, val name: String? = null,
val path: String, val path: String,
val mimeType: String, val mimeType: String?,
val type: Type val type: Type
) : Parcelable { ) : Parcelable {

View File

@ -25,7 +25,7 @@ data class VideoInfo(
/** /**
* The mimetype of the video e.g. "video/mp4". * The mimetype of the video e.g. "video/mp4".
*/ */
@Json(name = "mimetype") val mimeType: String, @Json(name = "mimetype") val mimeType: String?,
/** /**
* The width of the video in pixels. * The width of the video in pixels.

View File

@ -104,7 +104,7 @@ fun TimelineEvent.getLastMessageContent(): MessageContent? {
root.getClearContent().toModel<MessageStickerContent>() root.getClearContent().toModel<MessageStickerContent>()
} else { } else {
annotations?.editSummary?.aggregatedContent?.toModel() annotations?.editSummary?.aggregatedContent?.toModel()
?: root.getClearContent().toModel() ?: root.getClearContent().toModel()
} }
} }
@ -116,7 +116,7 @@ fun TimelineEvent.getLastMessageBody(): String? {
if (lastMessageContent != null) { if (lastMessageContent != null) {
return lastMessageContent.newContent?.toModel<MessageContent>()?.body return lastMessageContent.newContent?.toModel<MessageContent>()?.body
?: lastMessageContent.body ?: lastMessageContent.body
} }
return null return null

View File

@ -49,7 +49,7 @@ object MXEncryptedAttachments {
* @param mimetype the mime type * @param mimetype the mime type
* @return the encryption file info * @return the encryption file info
*/ */
fun encryptAttachment(attachmentStream: InputStream, mimetype: String): EncryptionResult { fun encryptAttachment(attachmentStream: InputStream, mimetype: String?): EncryptionResult {
val t0 = System.currentTimeMillis() val t0 = System.currentTimeMillis()
val secureRandom = SecureRandom() val secureRandom = SecureRandom()

View File

@ -83,15 +83,13 @@ internal class DefaultFileService @Inject constructor(private val context: Conte
if (elementToDecrypt != null) { if (elementToDecrypt != null) {
Timber.v("## decrypt file") Timber.v("## decrypt file")
MXEncryptedAttachments.decryptAttachment(inputStream, elementToDecrypt) ?: throw IllegalStateException("Decryption error") MXEncryptedAttachments.decryptAttachment(inputStream, elementToDecrypt)
} else { ?: throw IllegalStateException("Decryption error")
inputStream
} }
writeToFile(inputStream, destFile)
destFile
} }
.map { inputStream ->
writeToFile(inputStream, destFile)
destFile
}
} else { } else {
Try.just(destFile) Try.just(destFile)
} }

View File

@ -43,9 +43,9 @@ internal class FileUploader @Inject constructor(@Authenticated
suspend fun uploadFile(file: File, suspend fun uploadFile(file: File,
filename: String?, filename: String?,
mimeType: String, mimeType: String?,
progressListener: ProgressRequestBody.Listener? = null): ContentUploadResponse { progressListener: ProgressRequestBody.Listener? = null): ContentUploadResponse {
val uploadBody = file.asRequestBody(mimeType.toMediaTypeOrNull()) val uploadBody = file.asRequestBody(mimeType?.toMediaTypeOrNull())
return upload(uploadBody, filename, progressListener) return upload(uploadBody, filename, progressListener)
} }

View File

@ -52,7 +52,7 @@ internal class DefaultCreateRoomTask @Inject constructor(private val roomAPI: Ro
apiCall = roomAPI.createRoom(params) apiCall = roomAPI.createRoom(params)
} }
val roomId = createRoomResponse.roomId!! val roomId = createRoomResponse.roomId!!
// Wait for room to come back from the sync (but it can maybe be in the DB is the sync response is received before) // Wait for room to come back from the sync (but it can maybe be in the DB if the sync response is received before)
val rql = RealmQueryLatch<RoomEntity>(realmConfiguration) { realm -> val rql = RealmQueryLatch<RoomEntity>(realmConfiguration) { realm ->
realm.where(RoomEntity::class.java) realm.where(RoomEntity::class.java)
.equalTo(RoomEntityFields.ROOM_ID, roomId) .equalTo(RoomEntityFields.ROOM_ID, roomId)

View File

@ -251,7 +251,7 @@ internal class LocalEchoEventFactory @Inject constructor(
type = MessageType.MSGTYPE_AUDIO, type = MessageType.MSGTYPE_AUDIO,
body = attachment.name ?: "audio", body = attachment.name ?: "audio",
audioInfo = AudioInfo( audioInfo = AudioInfo(
mimeType = attachment.mimeType.takeIf { it.isNotBlank() } ?: "audio/mpeg", mimeType = attachment.mimeType?.takeIf { it.isNotBlank() } ?: "audio/mpeg",
size = attachment.size size = attachment.size
), ),
url = attachment.path url = attachment.path
@ -264,7 +264,7 @@ internal class LocalEchoEventFactory @Inject constructor(
type = MessageType.MSGTYPE_FILE, type = MessageType.MSGTYPE_FILE,
body = attachment.name ?: "file", body = attachment.name ?: "file",
info = FileInfo( info = FileInfo(
mimeType = attachment.mimeType.takeIf { it.isNotBlank() } mimeType = attachment.mimeType?.takeIf { it.isNotBlank() }
?: "application/octet-stream", ?: "application/octet-stream",
size = attachment.size size = attachment.size
), ),

View File

@ -82,4 +82,86 @@
<string name="room_displayname_empty_room">Prázdná místnost</string> <string name="room_displayname_empty_room">Prázdná místnost</string>
<string name="notice_room_update">%s upravil/a tuto místnost.</string>
<string name="notice_event_redacted_with_reason">Zpráva byla smazána [důvod: %1$s]</string>
<string name="notice_event_redacted_by_with_reason">Zpráva smazána [smazal/a %1$s] [důvod: %2$s]</string>
<string name="notice_room_third_party_revoked_invite">"%1$s obnovil/a pozvánku do místnosti pro %2$s"</string>
<string name="verification_emoji_cat">Kočka</string>
<string name="verification_emoji_lion">Lev</string>
<string name="verification_emoji_horse">Kůň</string>
<string name="verification_emoji_unicorn">Jednorožec</string>
<string name="verification_emoji_pig">Prase</string>
<string name="verification_emoji_elephant">Slon</string>
<string name="verification_emoji_rabbit">Králík</string>
<string name="verification_emoji_panda">Panda</string>
<string name="verification_emoji_rooster">Kohout</string>
<string name="verification_emoji_penguin">Tučnák</string>
<string name="verification_emoji_turtle">Želva</string>
<string name="verification_emoji_fish">Ryba</string>
<string name="verification_emoji_octopus">Chobotnice</string>
<string name="verification_emoji_butterfly">Motýl</string>
<string name="verification_emoji_flower">Květina</string>
<string name="verification_emoji_tree">Strom</string>
<string name="verification_emoji_cactus">Kaktus</string>
<string name="verification_emoji_mushroom">Houba</string>
<string name="verification_emoji_globe">Glóbus</string>
<string name="verification_emoji_moon">Měsíc</string>
<string name="verification_emoji_cloud">Mrak</string>
<string name="verification_emoji_fire">Oheň</string>
<string name="verification_emoji_banana">Banán</string>
<string name="verification_emoji_apple">Jablko</string>
<string name="verification_emoji_strawberry">Jahoda</string>
<string name="verification_emoji_corn">Kukuřice</string>
<string name="verification_emoji_pizza">Pizza</string>
<string name="verification_emoji_cake">Dort</string>
<string name="verification_emoji_heart">Srdce</string>
<string name="verification_emoji_smiley">Smajlík</string>
<string name="verification_emoji_robot">Robot</string>
<string name="verification_emoji_hat">Klobouk</string>
<string name="verification_emoji_glasses">Brýle</string>
<string name="verification_emoji_santa">Santa</string>
<string name="verification_emoji_thumbsup">Zvednutý palec</string>
<string name="verification_emoji_umbrella">Deštník</string>
<string name="verification_emoji_hourglass">Přesípací hodiny</string>
<string name="verification_emoji_clock">Hodiny</string>
<string name="verification_emoji_gift">Dárek</string>
<string name="verification_emoji_lightbulb">Žárovka</string>
<string name="verification_emoji_book">Knížka</string>
<string name="verification_emoji_pencil">Tužka</string>
<string name="verification_emoji_paperclip">Sponka</string>
<string name="verification_emoji_scissors">Nůžky</string>
<string name="verification_emoji_lock">Zámek</string>
<string name="verification_emoji_key">Klíč</string>
<string name="verification_emoji_hammer">Kladivo</string>
<string name="verification_emoji_telephone">Telefon</string>
<string name="verification_emoji_flag">Vlajka</string>
<string name="verification_emoji_train">Vlak</string>
<string name="verification_emoji_bicycle">Kolo</string>
<string name="verification_emoji_airplane">Letadlo</string>
<string name="verification_emoji_rocket">Raketa</string>
<string name="verification_emoji_trophy">Pohár</string>
<string name="verification_emoji_ball">Míč</string>
<string name="verification_emoji_guitar">Kytara</string>
<string name="verification_emoji_trumpet">Trumpeta</string>
<string name="verification_emoji_bell">Zvon</string>
<string name="verification_emoji_anchor">Kotva</string>
<string name="verification_emoji_headphone">Sluchátka</string>
<string name="verification_emoji_folder">Složka</string>
<string name="initial_sync_start_importing_account">Úvodní synchronizace:
\nStahuji účet…</string>
<string name="initial_sync_start_importing_account_crypto">Uvodní synchronizace:
\nStahuji klíče</string>
<string name="initial_sync_start_importing_account_rooms">Uvodní synchnizace:
\nStahuji místnost</string>
<string name="initial_sync_start_importing_account_joined_rooms">Uvodní synchronizace:
\nStahuji moje místnosti</string>
<string name="initial_sync_start_importing_account_left_rooms">Uvodní synchonizace:
\nStahuji místnosti, které jsem opustil/a</string>
<string name="initial_sync_start_importing_account_groups">Úvodní sychronizace:
\nImportuji komunity</string>
<string name="initial_sync_start_importing_account_data">Úvodní synchronizace:
\nImportuji data účtu</string>
<string name="event_status_sending_message">Posílám zprávu…</string>
</resources> </resources>

View File

@ -49,7 +49,7 @@
<string name="notice_room_third_party_invite">%1$s님이 %2$s님에게 방 초대를 보냈습니다</string> <string name="notice_room_third_party_invite">%1$s님이 %2$s님에게 방 초대를 보냈습니다</string>
<string name="notice_room_third_party_registered_invite">%1$s님이 %2$s의 초대를 수락했습니다</string> <string name="notice_room_third_party_registered_invite">%1$s님이 %2$s의 초대를 수락했습니다</string>
<string name="notice_crypto_unable_to_decrypt">** 암호를 해독할 수 없음: %s **</string> <string name="notice_crypto_unable_to_decrypt">** 암호를 복호화할 수 없음: %s **</string>
<string name="notice_crypto_error_unkwown_inbound_session_id">발신인의 기기에서 이 메시지의 키를 보내지 않았습니다.</string> <string name="notice_crypto_error_unkwown_inbound_session_id">발신인의 기기에서 이 메시지의 키를 보내지 않았습니다.</string>
<string name="message_reply_to_prefix">관련 대화</string> <string name="message_reply_to_prefix">관련 대화</string>

View File

@ -88,70 +88,70 @@
<string name="notice_event_redacted_by">Správa odstránená používateľom %1$s</string> <string name="notice_event_redacted_by">Správa odstránená používateľom %1$s</string>
<string name="notice_event_redacted_with_reason">Správa odstránená [dôvod: %1$s]</string> <string name="notice_event_redacted_with_reason">Správa odstránená [dôvod: %1$s]</string>
<string name="notice_event_redacted_by_with_reason">Správa odstránená používateľom %1$s [dôvod: %2$s]</string> <string name="notice_event_redacted_by_with_reason">Správa odstránená používateľom %1$s [dôvod: %2$s]</string>
<string name="verification_emoji_dog">Pes</string> <string name="verification_emoji_dog">Hlava psa</string>
<string name="verification_emoji_cat">Mačka</string> <string name="verification_emoji_cat">Hlava mačky</string>
<string name="verification_emoji_lion">Lev</string> <string name="verification_emoji_lion">Hlava leva</string>
<string name="verification_emoji_horse">Kôň</string> <string name="verification_emoji_horse">Kôň</string>
<string name="verification_emoji_unicorn">Jednorožec</string> <string name="verification_emoji_unicorn">Hlava jednorožca</string>
<string name="verification_emoji_pig">Prasa</string> <string name="verification_emoji_pig">Hlava prasaťa</string>
<string name="verification_emoji_elephant">Slon</string> <string name="verification_emoji_elephant">Slon</string>
<string name="verification_emoji_rabbit">Zajac</string> <string name="verification_emoji_rabbit">Hlava zajaca</string>
<string name="verification_emoji_panda">Panda</string> <string name="verification_emoji_panda">Hlava pandy</string>
<string name="verification_emoji_rooster">Kohút</string> <string name="verification_emoji_rooster">Kohút</string>
<string name="verification_emoji_penguin">Tučniak</string> <string name="verification_emoji_penguin">Tučniak</string>
<string name="verification_emoji_turtle">Korytnačka</string> <string name="verification_emoji_turtle">Korytnačka</string>
<string name="verification_emoji_fish">Ryba</string> <string name="verification_emoji_fish">Ryba</string>
<string name="verification_emoji_octopus">Chobotnica</string> <string name="verification_emoji_octopus">Chobotnica</string>
<string name="verification_emoji_butterfly">Motýľ</string> <string name="verification_emoji_butterfly">Motýľ</string>
<string name="verification_emoji_flower">Kvetina</string> <string name="verification_emoji_flower">Tulipán</string>
<string name="verification_emoji_tree">Strom</string> <string name="verification_emoji_tree">Listnatý strom</string>
<string name="verification_emoji_cactus">Kaktus</string> <string name="verification_emoji_cactus">Kaktus</string>
<string name="verification_emoji_mushroom">Hríb</string> <string name="verification_emoji_mushroom">Huba</string>
<string name="verification_emoji_globe">Zemeguľa</string> <string name="verification_emoji_globe">Zemeguľa</string>
<string name="verification_emoji_moon">Mesiac</string> <string name="verification_emoji_moon">Polmesiac</string>
<string name="verification_emoji_cloud">Oblak</string> <string name="verification_emoji_cloud">Oblak</string>
<string name="verification_emoji_fire">Oheň</string> <string name="verification_emoji_fire">Oheň</string>
<string name="verification_emoji_banana">Banán</string> <string name="verification_emoji_banana">Banán</string>
<string name="verification_emoji_apple">Jablko</string> <string name="verification_emoji_apple">Červené jablko</string>
<string name="verification_emoji_strawberry">Jahoda</string> <string name="verification_emoji_strawberry">Jahoda</string>
<string name="verification_emoji_corn">Kukurica</string> <string name="verification_emoji_corn">Kukuričný klas</string>
<string name="verification_emoji_pizza">Pizza</string> <string name="verification_emoji_pizza">Pizza</string>
<string name="verification_emoji_cake">Koláč</string> <string name="verification_emoji_cake">Narodeninová torta</string>
<string name="verification_emoji_heart">Srdce</string> <string name="verification_emoji_heart">Červené</string>
<string name="verification_emoji_smiley">Úsmev</string> <string name="verification_emoji_smiley">Škeriaca sa tvár</string>
<string name="verification_emoji_robot">Robot</string> <string name="verification_emoji_robot">Robot</string>
<string name="verification_emoji_hat">Klobúk</string> <string name="verification_emoji_hat">Cylinder</string>
<string name="verification_emoji_glasses">Okuliare</string> <string name="verification_emoji_glasses">Okuliare</string>
<string name="verification_emoji_wrench">Skrutkovač</string> <string name="verification_emoji_wrench">Francúzsky kľúč</string>
<string name="verification_emoji_santa">Mikuláš</string> <string name="verification_emoji_santa">Santa Claus</string>
<string name="verification_emoji_thumbsup">Palec nahor</string> <string name="verification_emoji_thumbsup">Palec nahor</string>
<string name="verification_emoji_umbrella">Dáždnik</string> <string name="verification_emoji_umbrella">Dáždnik</string>
<string name="verification_emoji_hourglass">Presýpacie hodiny</string> <string name="verification_emoji_hourglass">Presýpacie hodiny</string>
<string name="verification_emoji_clock">Hodiny</string> <string name="verification_emoji_clock">Budík</string>
<string name="verification_emoji_gift">Darček</string> <string name="verification_emoji_gift">Zabalený darček</string>
<string name="verification_emoji_lightbulb">Žiarovka</string> <string name="verification_emoji_lightbulb">Žiarovka</string>
<string name="verification_emoji_book">Kniha</string> <string name="verification_emoji_book">Zatvorená kniha</string>
<string name="verification_emoji_pencil">Ceruzka</string> <string name="verification_emoji_pencil">Ceruzka</string>
<string name="verification_emoji_paperclip">Kancelárska sponka</string> <string name="verification_emoji_paperclip">Sponka na papier</string>
<string name="verification_emoji_scissors">Nožnice</string> <string name="verification_emoji_scissors">Nožnice</string>
<string name="verification_emoji_lock">Zámok</string> <string name="verification_emoji_lock">Zatvorená zámka</string>
<string name="verification_emoji_key">Kľúč</string> <string name="verification_emoji_key">Kľúč</string>
<string name="verification_emoji_hammer">Kladivo</string> <string name="verification_emoji_hammer">Kladivo</string>
<string name="verification_emoji_telephone">Telefón</string> <string name="verification_emoji_telephone">Telefón</string>
<string name="verification_emoji_flag">Vlajka</string> <string name="verification_emoji_flag">Kockovaná zástava</string>
<string name="verification_emoji_train">Vlak</string> <string name="verification_emoji_train">Rušeň</string>
<string name="verification_emoji_bicycle">Bicykel</string> <string name="verification_emoji_bicycle">Bicykel</string>
<string name="verification_emoji_airplane">Lietadlo</string> <string name="verification_emoji_airplane">Lietadlo</string>
<string name="verification_emoji_rocket">Raketa</string> <string name="verification_emoji_rocket">Raketa</string>
<string name="verification_emoji_trophy">Trofej</string> <string name="verification_emoji_trophy">Trofej</string>
<string name="verification_emoji_ball">Lopta</string> <string name="verification_emoji_ball">Futbal</string>
<string name="verification_emoji_guitar">Gitara</string> <string name="verification_emoji_guitar">Gitara</string>
<string name="verification_emoji_trumpet">Trúbka</string> <string name="verification_emoji_trumpet">Trúbka</string>
<string name="verification_emoji_bell">Zvonček</string> <string name="verification_emoji_bell">Zvon</string>
<string name="verification_emoji_anchor">Kotva</string> <string name="verification_emoji_anchor">Kotva</string>
<string name="verification_emoji_headphone">Schlúchadlá</string> <string name="verification_emoji_headphone">Slúchadlá</string>
<string name="verification_emoji_folder">Priečinok</string> <string name="verification_emoji_folder">Fascikel</string>
<string name="verification_emoji_pin">Pin</string> <string name="verification_emoji_pin">Špendlík</string>
<string name="initial_sync_start_importing_account">Úvodná synchronizácia: <string name="initial_sync_start_importing_account">Úvodná synchronizácia:
\nPrebieha import účtu…</string> \nPrebieha import účtu…</string>
@ -173,4 +173,5 @@
<string name="event_status_sending_message">Odosielanie správy…</string> <string name="event_status_sending_message">Odosielanie správy…</string>
<string name="clear_timeline_send_queue">Vymazať správy na odoslanie</string> <string name="clear_timeline_send_queue">Vymazať správy na odoslanie</string>
<string name="notice_room_third_party_revoked_invite">%1$s zamietol pozvanie používateľa %2$s vstúpiť do miestnosti</string>
</resources> </resources>

View File

@ -13,7 +13,7 @@
<string name="notice_room_ban">%1$s 封禁了 %2$s</string> <string name="notice_room_ban">%1$s 封禁了 %2$s</string>
<string name="notice_avatar_url_changed">%1$s 更换了他们的头像</string> <string name="notice_avatar_url_changed">%1$s 更换了他们的头像</string>
<string name="notice_display_name_set">%1$s 将他们的昵称设置为 %2$s</string> <string name="notice_display_name_set">%1$s 将他们的昵称设置为 %2$s</string>
<string name="notice_display_name_changed_from">%1$s 把他的昵称从 %2$s 改为 %3$s</string> <string name="notice_display_name_changed_from">%1$s 把他的昵称从 %2$s 改为 %3$s</string>
<string name="notice_display_name_removed">%1$s 移除了他们的昵称 (%2$s)</string> <string name="notice_display_name_removed">%1$s 移除了他们的昵称 (%2$s)</string>
<string name="notice_room_topic_changed">%1$s 把主题改为: %2$s</string> <string name="notice_room_topic_changed">%1$s 把主题改为: %2$s</string>
<string name="notice_room_name_changed">%1$s 把聊天室名称改为: %2$s</string> <string name="notice_room_name_changed">%1$s 把聊天室名称改为: %2$s</string>
@ -167,4 +167,7 @@
<string name="event_status_sending_message">正在发送消息…</string> <string name="event_status_sending_message">正在发送消息…</string>
<string name="clear_timeline_send_queue">清除正在发送队列</string> <string name="clear_timeline_send_queue">清除正在发送队列</string>
<string name="notice_room_third_party_revoked_invite">%1$s 撤回了对 %2$s 邀请</string>
<string name="verification_emoji_pin">置顶</string>
</resources> </resources>

View File

@ -243,4 +243,18 @@
<string name="event_status_sending_message">Sending message…</string> <string name="event_status_sending_message">Sending message…</string>
<string name="clear_timeline_send_queue">Clear sending queue</string> <string name="clear_timeline_send_queue">Clear sending queue</string>
<string name="notice_room_invite_no_invitee_with_reason">%1$s\'s invitation. Reason: %2$s</string>
<string name="notice_room_invite_with_reason">%1$s invited %2$s. Reason: %3$s</string>
<string name="notice_room_invite_you_with_reason">%1$s invited you. Reason: %2$s</string>
<string name="notice_room_join_with_reason">%1$s joined. Reason: %2$s</string>
<string name="notice_room_leave_with_reason">%1$s left. Reason: %2$s</string>
<string name="notice_room_reject_with_reason">%1$s rejected the invitation. Reason: %2$s</string>
<string name="notice_room_kick_with_reason">%1$s kicked %2$s. Reason: %3$s</string>
<string name="notice_room_unban_with_reason">%1$s unbanned %2$s. Reason: %3$s</string>
<string name="notice_room_ban_with_reason">%1$s banned %2$s. Reason: %3$s</string>
<string name="notice_room_third_party_invite_with_reason">%1$s sent an invitation to %2$s to join the room. Reason: %3$s</string>
<string name="notice_room_third_party_revoked_invite_with_reason">%1$s revoked the invitation for %2$s to join the room. Reason: %3$s</string>
<string name="notice_room_third_party_registered_invite_with_reason">%1$s accepted the invitation for %2$s. Reason: %3$s</string>
<string name="notice_room_withdraw_with_reason">%1$s withdrew %2$s\'s invitation. Reason: %3$s</string>
</resources> </resources>

View File

@ -2,19 +2,6 @@
<resources> <resources>
<string name="notice_room_invite_no_invitee_with_reason">%1$s\'s invitation. Reason: %2$s</string>
<string name="notice_room_invite_with_reason">%1$s invited %2$s. Reason: %3$s</string>
<string name="notice_room_invite_you_with_reason">%1$s invited you. Reason: %2$s</string>
<string name="notice_room_join_with_reason">%1$s joined. Reason: %2$s</string>
<string name="notice_room_leave_with_reason">%1$s left. Reason: %2$s</string>
<string name="notice_room_reject_with_reason">%1$s rejected the invitation. Reason: %2$s</string>
<string name="notice_room_kick_with_reason">%1$s kicked %2$s. Reason: %3$s</string>
<string name="notice_room_unban_with_reason">%1$s unbanned %2$s. Reason: %3$s</string>
<string name="notice_room_ban_with_reason">%1$s banned %2$s. Reason: %3$s</string>
<string name="notice_room_third_party_invite_with_reason">%1$s sent an invitation to %2$s to join the room. Reason: %3$s</string>
<string name="notice_room_third_party_revoked_invite_with_reason">%1$s revoked the invitation for %2$s to join the room. Reason: %3$s</string>
<string name="notice_room_third_party_registered_invite_with_reason">%1$s accepted the invitation for %2$s. Reason: %3$s</string>
<string name="notice_room_withdraw_with_reason">%1$s withdrew %2$s\'s invitation. Reason: %3$s</string>
<string name="no_network_indicator">There is no network connection right now</string>
</resources> </resources>

View File

@ -15,7 +15,7 @@ androidExtensions {
} }
ext.versionMajor = 0 ext.versionMajor = 0
ext.versionMinor = 11 ext.versionMinor = 12
ext.versionPatch = 0 ext.versionPatch = 0
static def getGitTimestamp() { static def getGitTimestamp() {
@ -293,6 +293,7 @@ dependencies {
implementation 'me.gujun.android:span:1.7' implementation 'me.gujun.android:span:1.7'
implementation "io.noties.markwon:core:$markwon_version" implementation "io.noties.markwon:core:$markwon_version"
implementation "io.noties.markwon:html:$markwon_version" implementation "io.noties.markwon:html:$markwon_version"
implementation 'com.googlecode.htmlcompressor:htmlcompressor:1.4'
implementation 'me.saket:better-link-movement-method:2.2.0' implementation 'me.saket:better-link-movement-method:2.2.0'
implementation 'com.google.android:flexbox:1.1.1' implementation 'com.google.android:flexbox:1.1.1'
implementation "androidx.autofill:autofill:$autofill_version" implementation "androidx.autofill:autofill:$autofill_version"

View File

@ -31,4 +31,8 @@
<issue id="ViewConstructor" severity="error" /> <issue id="ViewConstructor" severity="error" />
<issue id="UseValueOf" severity="error" /> <issue id="UseValueOf" severity="error" />
<!-- Ignore error from HtmlCompressor lib -->
<issue id="InvalidPackage">
<ignore path="**/htmlcompressor-1.4.jar"/>
</issue>
</lint> </lint>

View File

@ -359,6 +359,11 @@ SOFTWARE.
<br/> <br/>
Copyright 2018 Kumar Bibek Copyright 2018 Kumar Bibek
</li> </li>
<li>
<b>htmlcompressor</b>
<br/>
Copyright 2017 Sergiy Kovalchuk
</li>
</ul> </ul>
<pre> <pre>
Apache License Apache License

View File

@ -38,6 +38,7 @@ import im.vector.riotx.features.home.AvatarRenderer
import im.vector.riotx.features.home.HomeRoomListDataSource import im.vector.riotx.features.home.HomeRoomListDataSource
import im.vector.riotx.features.home.group.SelectedGroupDataSource import im.vector.riotx.features.home.group.SelectedGroupDataSource
import im.vector.riotx.features.html.EventHtmlRenderer import im.vector.riotx.features.html.EventHtmlRenderer
import im.vector.riotx.features.html.VectorHtmlCompressor
import im.vector.riotx.features.navigation.Navigator import im.vector.riotx.features.navigation.Navigator
import im.vector.riotx.features.notifications.* import im.vector.riotx.features.notifications.*
import im.vector.riotx.features.rageshake.BugReporter import im.vector.riotx.features.rageshake.BugReporter
@ -87,6 +88,8 @@ interface VectorComponent {
fun eventHtmlRenderer(): EventHtmlRenderer fun eventHtmlRenderer(): EventHtmlRenderer
fun vectorHtmlCompressor(): VectorHtmlCompressor
fun navigator(): Navigator fun navigator(): Navigator
fun errorFormatter(): ErrorFormatter fun errorFormatter(): ErrorFormatter

View File

@ -0,0 +1,30 @@
/*
* Copyright 2019 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.riotx.core.epoxy
import com.airbnb.epoxy.EpoxyModelClass
import im.vector.riotx.R
/**
* Item of size (0, 0).
* It can be useful to avoid automatic scroll of RecyclerView with Epoxy controller, when the first valuable item changes.
*/
@EpoxyModelClass(layout = R.layout.item_zero)
abstract class ZeroItem : VectorEpoxyModel<ZeroItem.Holder>() {
class Holder : VectorEpoxyHolder()
}

View File

@ -0,0 +1,31 @@
/*
* Copyright 2019 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.riotx.core.error
import im.vector.riotx.BuildConfig
import timber.log.Timber
/**
* throw in debug, only log in production. As this method does not always throw, next statement should be a return
*/
fun fatalError(message: String) {
if (BuildConfig.DEBUG) {
error(message)
} else {
Timber.e(message)
}
}

View File

@ -222,8 +222,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasScreenInjector {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
Timber.i("onResume Activity ${this.javaClass.simpleName}")
Timber.v("onResume Activity ${this.javaClass.simpleName}")
configurationViewModel.onActivityResumed() configurationViewModel.onActivityResumed()

View File

@ -32,6 +32,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import im.vector.riotx.core.di.DaggerScreenComponent import im.vector.riotx.core.di.DaggerScreenComponent
import im.vector.riotx.core.di.ScreenComponent import im.vector.riotx.core.di.ScreenComponent
import im.vector.riotx.core.utils.DimensionConverter import im.vector.riotx.core.utils.DimensionConverter
import timber.log.Timber
/** /**
* Add MvRx capabilities to bottomsheetdialog (like BaseMvRxFragment) * Add MvRx capabilities to bottomsheetdialog (like BaseMvRxFragment)
@ -80,6 +81,11 @@ abstract class VectorBaseBottomSheetDialogFragment : BottomSheetDialogFragment()
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
} }
override fun onResume() {
super.onResume()
Timber.i("onResume BottomSheet ${this.javaClass.simpleName}")
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return super.onCreateDialog(savedInstanceState).apply { return super.onCreateDialog(savedInstanceState).apply {
val dialog = this as? BottomSheetDialog val dialog = this as? BottomSheetDialog

View File

@ -105,7 +105,7 @@ abstract class VectorBaseFragment : BaseMvRxFragment(), HasScreenInjector {
@CallSuper @CallSuper
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
Timber.v("onResume Fragment ${this.javaClass.simpleName}") Timber.i("onResume Fragment ${this.javaClass.simpleName}")
} }
@CallSuper @CallSuper

View File

@ -0,0 +1,20 @@
/*
* Copyright 2019 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.riotx.core.ui.model
// android.util.Size in API 21+
data class Size(val width: Int, val height: Int)

View File

@ -18,6 +18,7 @@ package im.vector.riotx.features.attachments
import com.kbeanie.multipicker.api.entity.* import com.kbeanie.multipicker.api.entity.*
import im.vector.matrix.android.api.session.content.ContentAttachmentData import im.vector.matrix.android.api.session.content.ContentAttachmentData
import timber.log.Timber
fun ChosenContact.toContactAttachment(): ContactAttachment { fun ChosenContact.toContactAttachment(): ContactAttachment {
return ContactAttachment( return ContactAttachment(
@ -29,6 +30,7 @@ fun ChosenContact.toContactAttachment(): ContactAttachment {
} }
fun ChosenFile.toContentAttachmentData(): ContentAttachmentData { fun ChosenFile.toContentAttachmentData(): ContentAttachmentData {
if (mimeType == null) Timber.w("No mimeType")
return ContentAttachmentData( return ContentAttachmentData(
path = originalPath, path = originalPath,
mimeType = mimeType, mimeType = mimeType,
@ -40,6 +42,7 @@ fun ChosenFile.toContentAttachmentData(): ContentAttachmentData {
} }
fun ChosenAudio.toContentAttachmentData(): ContentAttachmentData { fun ChosenAudio.toContentAttachmentData(): ContentAttachmentData {
if (mimeType == null) Timber.w("No mimeType")
return ContentAttachmentData( return ContentAttachmentData(
path = originalPath, path = originalPath,
mimeType = mimeType, mimeType = mimeType,
@ -51,16 +54,17 @@ fun ChosenAudio.toContentAttachmentData(): ContentAttachmentData {
) )
} }
fun ChosenFile.mapType(): ContentAttachmentData.Type { private fun ChosenFile.mapType(): ContentAttachmentData.Type {
return when { return when {
mimeType.startsWith("image/") -> ContentAttachmentData.Type.IMAGE mimeType?.startsWith("image/") == true -> ContentAttachmentData.Type.IMAGE
mimeType.startsWith("video/") -> ContentAttachmentData.Type.VIDEO mimeType?.startsWith("video/") == true -> ContentAttachmentData.Type.VIDEO
mimeType.startsWith("audio/") -> ContentAttachmentData.Type.AUDIO mimeType?.startsWith("audio/") == true -> ContentAttachmentData.Type.AUDIO
else -> ContentAttachmentData.Type.FILE else -> ContentAttachmentData.Type.FILE
} }
} }
fun ChosenImage.toContentAttachmentData(): ContentAttachmentData { fun ChosenImage.toContentAttachmentData(): ContentAttachmentData {
if (mimeType == null) Timber.w("No mimeType")
return ContentAttachmentData( return ContentAttachmentData(
path = originalPath, path = originalPath,
mimeType = mimeType, mimeType = mimeType,
@ -75,6 +79,7 @@ fun ChosenImage.toContentAttachmentData(): ContentAttachmentData {
} }
fun ChosenVideo.toContentAttachmentData(): ContentAttachmentData { fun ChosenVideo.toContentAttachmentData(): ContentAttachmentData {
if (mimeType == null) Timber.w("No mimeType")
return ContentAttachmentData( return ContentAttachmentData(
path = originalPath, path = originalPath,
mimeType = mimeType, mimeType = mimeType,

View File

@ -68,14 +68,14 @@ class GroupListViewModel @AssistedInject constructor(@Assisted initialState: Gro
} }
private fun observeSelectionState() { private fun observeSelectionState() {
selectSubscribe(GroupListViewState::selectedGroup) { selectSubscribe(GroupListViewState::selectedGroup) { groupSummary ->
if (it != null) { if (groupSummary != null) {
val selectedGroup = _openGroupLiveData.value?.peekContent() val selectedGroup = _openGroupLiveData.value?.peekContent()
// We only wan to open group if the updated selectedGroup is a different one. // We only want to open group if the updated selectedGroup is a different one.
if (selectedGroup?.groupId != it.groupId) { if (selectedGroup?.groupId != groupSummary.groupId) {
_openGroupLiveData.postLiveEvent(it) _openGroupLiveData.postLiveEvent(groupSummary)
} }
val optionGroup = Option.fromNullable(it) val optionGroup = Option.just(groupSummary)
selectedGroupStore.post(optionGroup) selectedGroupStore.post(optionGroup)
} }
} }

View File

@ -19,6 +19,7 @@ package im.vector.riotx.features.home.room.breadcrumbs
import android.view.View import android.view.View
import com.airbnb.epoxy.EpoxyController import com.airbnb.epoxy.EpoxyController
import im.vector.matrix.android.api.util.toMatrixItem import im.vector.matrix.android.api.util.toMatrixItem
import im.vector.riotx.core.epoxy.zeroItem
import im.vector.riotx.core.utils.DebouncedClickListener import im.vector.riotx.core.utils.DebouncedClickListener
import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.AvatarRenderer
import javax.inject.Inject import javax.inject.Inject
@ -45,9 +46,13 @@ class BreadcrumbsController @Inject constructor(
override fun buildModels() { override fun buildModels() {
val safeViewState = viewState ?: return val safeViewState = viewState ?: return
// Add a ZeroItem to avoid automatic scroll when the breadcrumbs are updated from another client
zeroItem {
id("top")
}
// An empty breadcrumbs list can only be temporary because when entering in a room, // An empty breadcrumbs list can only be temporary because when entering in a room,
// this one is added to the breadcrumbs // this one is added to the breadcrumbs
safeViewState.asyncBreadcrumbs.invoke() safeViewState.asyncBreadcrumbs.invoke()
?.forEach { ?.forEach {
breadcrumbsItem { breadcrumbsItem {

View File

@ -86,8 +86,6 @@ import im.vector.riotx.features.autocomplete.command.CommandAutocompletePolicy
import im.vector.riotx.features.autocomplete.user.AutocompleteUserPresenter import im.vector.riotx.features.autocomplete.user.AutocompleteUserPresenter
import im.vector.riotx.features.command.Command import im.vector.riotx.features.command.Command
import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.AvatarRenderer
import im.vector.riotx.features.permalink.NavigateToRoomInterceptor
import im.vector.riotx.features.permalink.PermalinkHandler
import im.vector.riotx.features.home.getColorFromUserId import im.vector.riotx.features.home.getColorFromUserId
import im.vector.riotx.features.home.room.detail.composer.TextComposerAction import im.vector.riotx.features.home.room.detail.composer.TextComposerAction
import im.vector.riotx.features.home.room.detail.composer.TextComposerView import im.vector.riotx.features.home.room.detail.composer.TextComposerView
@ -109,6 +107,8 @@ import im.vector.riotx.features.media.ImageMediaViewerActivity
import im.vector.riotx.features.media.VideoContentRenderer import im.vector.riotx.features.media.VideoContentRenderer
import im.vector.riotx.features.media.VideoMediaViewerActivity import im.vector.riotx.features.media.VideoMediaViewerActivity
import im.vector.riotx.features.notifications.NotificationDrawerManager import im.vector.riotx.features.notifications.NotificationDrawerManager
import im.vector.riotx.features.permalink.NavigateToRoomInterceptor
import im.vector.riotx.features.permalink.PermalinkHandler
import im.vector.riotx.features.reactions.EmojiReactionPickerActivity import im.vector.riotx.features.reactions.EmojiReactionPickerActivity
import im.vector.riotx.features.settings.VectorPreferences import im.vector.riotx.features.settings.VectorPreferences
import im.vector.riotx.features.share.SharedData import im.vector.riotx.features.share.SharedData
@ -426,8 +426,10 @@ class RoomDetailFragment @Inject constructor(
composerLayout.composerRelatedMessageAvatar composerLayout.composerRelatedMessageAvatar
) )
composerLayout.expand { composerLayout.expand {
// need to do it here also when not using quick reply if (isAdded) {
focusComposerAndShowKeyboard() // need to do it here also when not using quick reply
focusComposerAndShowKeyboard()
}
} }
focusComposerAndShowKeyboard() focusComposerAndShowKeyboard()
} }

View File

@ -41,6 +41,7 @@ import im.vector.riotx.core.resources.StringProvider
import im.vector.riotx.features.home.room.detail.timeline.format.NoticeEventFormatter import im.vector.riotx.features.home.room.detail.timeline.format.NoticeEventFormatter
import im.vector.riotx.features.home.room.detail.timeline.item.MessageInformationData import im.vector.riotx.features.home.room.detail.timeline.item.MessageInformationData
import im.vector.riotx.features.html.EventHtmlRenderer import im.vector.riotx.features.html.EventHtmlRenderer
import im.vector.riotx.features.html.VectorHtmlCompressor
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
@ -82,6 +83,7 @@ data class MessageActionState(
class MessageActionsViewModel @AssistedInject constructor(@Assisted class MessageActionsViewModel @AssistedInject constructor(@Assisted
initialState: MessageActionState, initialState: MessageActionState,
private val eventHtmlRenderer: Lazy<EventHtmlRenderer>, private val eventHtmlRenderer: Lazy<EventHtmlRenderer>,
private val htmlCompressor: VectorHtmlCompressor,
private val session: Session, private val session: Session,
private val noticeEventFormatter: NoticeEventFormatter, private val noticeEventFormatter: NoticeEventFormatter,
private val stringProvider: StringProvider private val stringProvider: StringProvider
@ -100,6 +102,7 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted
val quickEmojis = listOf("👍", "👎", "😄", "🎉", "😕", "❤️", "🚀", "👀") val quickEmojis = listOf("👍", "👎", "😄", "🎉", "😕", "❤️", "🚀", "👀")
@JvmStatic
override fun create(viewModelContext: ViewModelContext, state: MessageActionState): MessageActionsViewModel? { override fun create(viewModelContext: ViewModelContext, state: MessageActionState): MessageActionsViewModel? {
val fragment: MessageActionsBottomSheet = (viewModelContext as FragmentViewModelContext).fragment() val fragment: MessageActionsBottomSheet = (viewModelContext as FragmentViewModelContext).fragment()
return fragment.messageActionViewModelFactory.create(state) return fragment.messageActionViewModelFactory.create(state)
@ -167,11 +170,16 @@ class MessageActionsViewModel @AssistedInject constructor(@Assisted
private fun computeMessageBody(timelineEvent: Async<TimelineEvent>): CharSequence? { private fun computeMessageBody(timelineEvent: Async<TimelineEvent>): CharSequence? {
return when (timelineEvent()?.root?.getClearType()) { return when (timelineEvent()?.root?.getClearType()) {
EventType.MESSAGE -> { EventType.MESSAGE,
EventType.STICKER -> {
val messageContent: MessageContent? = timelineEvent()?.getLastMessageContent() val messageContent: MessageContent? = timelineEvent()?.getLastMessageContent()
if (messageContent is MessageTextContent && messageContent.format == MessageType.FORMAT_MATRIX_HTML) { if (messageContent is MessageTextContent && messageContent.format == MessageType.FORMAT_MATRIX_HTML) {
eventHtmlRenderer.get().render(messageContent.formattedBody val html = messageContent.formattedBody
?: messageContent.body) ?.takeIf { it.isNotBlank() }
?.let { htmlCompressor.compress(it) }
?: messageContent.body
eventHtmlRenderer.get().render(html)
} else { } else {
messageContent?.body messageContent?.body
} }

View File

@ -61,6 +61,7 @@ class ViewEditHistoryViewModel @AssistedInject constructor(@Assisted
companion object : MvRxViewModelFactory<ViewEditHistoryViewModel, ViewEditHistoryViewState> { companion object : MvRxViewModelFactory<ViewEditHistoryViewModel, ViewEditHistoryViewState> {
@JvmStatic
override fun create(viewModelContext: ViewModelContext, state: ViewEditHistoryViewState): ViewEditHistoryViewModel? { override fun create(viewModelContext: ViewModelContext, state: ViewEditHistoryViewState): ViewEditHistoryViewModel? {
val fragment: ViewEditHistoryBottomSheet = (viewModelContext as FragmentViewModelContext).fragment() val fragment: ViewEditHistoryBottomSheet = (viewModelContext as FragmentViewModelContext).fragment()
return fragment.viewEditHistoryViewModelFactory.create(state) return fragment.viewEditHistoryViewModelFactory.create(state)

View File

@ -46,6 +46,7 @@ import im.vector.riotx.features.home.room.detail.timeline.tools.createLinkMoveme
import im.vector.riotx.features.home.room.detail.timeline.tools.linkify import im.vector.riotx.features.home.room.detail.timeline.tools.linkify
import im.vector.riotx.features.html.CodeVisitor import im.vector.riotx.features.html.CodeVisitor
import im.vector.riotx.features.html.EventHtmlRenderer import im.vector.riotx.features.html.EventHtmlRenderer
import im.vector.riotx.features.html.VectorHtmlCompressor
import im.vector.riotx.features.media.ImageContentRenderer import im.vector.riotx.features.media.ImageContentRenderer
import im.vector.riotx.features.media.VideoContentRenderer import im.vector.riotx.features.media.VideoContentRenderer
import me.gujun.android.span.span import me.gujun.android.span.span
@ -57,6 +58,7 @@ class MessageItemFactory @Inject constructor(
private val dimensionConverter: DimensionConverter, private val dimensionConverter: DimensionConverter,
private val timelineMediaSizeProvider: TimelineMediaSizeProvider, private val timelineMediaSizeProvider: TimelineMediaSizeProvider,
private val htmlRenderer: Lazy<EventHtmlRenderer>, private val htmlRenderer: Lazy<EventHtmlRenderer>,
private val htmlCompressor: VectorHtmlCompressor,
private val stringProvider: StringProvider, private val stringProvider: StringProvider,
private val imageContentRenderer: ImageContentRenderer, private val imageContentRenderer: ImageContentRenderer,
private val messageInformationDataFactory: MessageInformationDataFactory, private val messageInformationDataFactory: MessageInformationDataFactory,
@ -179,10 +181,16 @@ class MessageItemFactory @Inject constructor(
.playable(messageContent.info?.mimeType == "image/gif") .playable(messageContent.info?.mimeType == "image/gif")
.highlighted(highlight) .highlighted(highlight)
.mediaData(data) .mediaData(data)
.clickListener( .apply {
DebouncedClickListener(View.OnClickListener { view -> if (messageContent.type == MessageType.MSGTYPE_STICKER_LOCAL) {
callback?.onImageMessageClicked(messageContent, data, view) mode(ImageContentRenderer.Mode.STICKER)
})) } else {
clickListener(
DebouncedClickListener(View.OnClickListener { view ->
callback?.onImageMessageClicked(messageContent, data, view)
}))
}
}
} }
private fun buildVideoMessageItem(messageContent: MessageVideoContent, private fun buildVideoMessageItem(messageContent: MessageVideoContent,
@ -227,6 +235,7 @@ class MessageItemFactory @Inject constructor(
attributes: AbsMessageItem.Attributes): VectorEpoxyModel<*>? { attributes: AbsMessageItem.Attributes): VectorEpoxyModel<*>? {
val isFormatted = messageContent.formattedBody.isNullOrBlank().not() val isFormatted = messageContent.formattedBody.isNullOrBlank().not()
return if (isFormatted) { return if (isFormatted) {
// First detect if the message contains some code block(s) or inline code
val localFormattedBody = htmlRenderer.get().parse(messageContent.body) as Document val localFormattedBody = htmlRenderer.get().parse(messageContent.body) as Document
val codeVisitor = CodeVisitor() val codeVisitor = CodeVisitor()
codeVisitor.visit(localFormattedBody) codeVisitor.visit(localFormattedBody)
@ -240,7 +249,8 @@ class MessageItemFactory @Inject constructor(
buildMessageTextItem(codeFormatted, false, informationData, highlight, callback, attributes) buildMessageTextItem(codeFormatted, false, informationData, highlight, callback, attributes)
} }
CodeVisitor.Kind.NONE -> { CodeVisitor.Kind.NONE -> {
val formattedBody = htmlRenderer.get().render(messageContent.formattedBody!!) val compressed = htmlCompressor.compress(messageContent.formattedBody!!)
val formattedBody = htmlRenderer.get().render(compressed)
buildMessageTextItem(formattedBody, true, informationData, highlight, callback, attributes) buildMessageTextItem(formattedBody, true, informationData, highlight, callback, attributes)
} }
} }

View File

@ -36,6 +36,8 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
@EpoxyAttribute @EpoxyAttribute
var playable: Boolean = false var playable: Boolean = false
@EpoxyAttribute @EpoxyAttribute
var mode = ImageContentRenderer.Mode.THUMBNAIL
@EpoxyAttribute
var clickListener: View.OnClickListener? = null var clickListener: View.OnClickListener? = null
@EpoxyAttribute @EpoxyAttribute
lateinit var imageContentRenderer: ImageContentRenderer lateinit var imageContentRenderer: ImageContentRenderer
@ -44,7 +46,7 @@ abstract class MessageImageVideoItem : AbsMessageItem<MessageImageVideoItem.Hold
override fun bind(holder: Holder) { override fun bind(holder: Holder) {
super.bind(holder) super.bind(holder)
imageContentRenderer.render(mediaData, ImageContentRenderer.Mode.THUMBNAIL, holder.imageView) imageContentRenderer.render(mediaData, mode, holder.imageView)
if (!attributes.informationData.sendState.hasFailed()) { if (!attributes.informationData.sendState.hasFailed()) {
contentUploadStateTrackerBinder.bind(attributes.informationData.eventId, mediaData.isLocalFile(), holder.progressLayout) contentUploadStateTrackerBinder.bind(attributes.informationData.eventId, mediaData.isLocalFile(), holder.progressLayout)
} else { } else {

View File

@ -68,6 +68,7 @@ class ViewReactionsViewModel @AssistedInject constructor(@Assisted
companion object : MvRxViewModelFactory<ViewReactionsViewModel, DisplayReactionsViewState> { companion object : MvRxViewModelFactory<ViewReactionsViewModel, DisplayReactionsViewState> {
@JvmStatic
override fun create(viewModelContext: ViewModelContext, state: DisplayReactionsViewState): ViewReactionsViewModel? { override fun create(viewModelContext: ViewModelContext, state: DisplayReactionsViewState): ViewReactionsViewModel? {
val fragment: ViewReactionsBottomSheet = (viewModelContext as FragmentViewModelContext).fragment() val fragment: ViewReactionsBottomSheet = (viewModelContext as FragmentViewModelContext).fragment()
return fragment.viewReactionsViewModelFactory.create(state) return fragment.viewReactionsViewModelFactory.create(state)

View File

@ -37,6 +37,7 @@ class RoomListQuickActionsViewModel @AssistedInject constructor(@Assisted initia
companion object : MvRxViewModelFactory<RoomListQuickActionsViewModel, RoomListQuickActionsState> { companion object : MvRxViewModelFactory<RoomListQuickActionsViewModel, RoomListQuickActionsState> {
@JvmStatic
override fun create(viewModelContext: ViewModelContext, state: RoomListQuickActionsState): RoomListQuickActionsViewModel? { override fun create(viewModelContext: ViewModelContext, state: RoomListQuickActionsState): RoomListQuickActionsViewModel? {
val fragment: RoomListQuickActionsBottomSheet = (viewModelContext as FragmentViewModelContext).fragment() val fragment: RoomListQuickActionsBottomSheet = (viewModelContext as FragmentViewModelContext).fragment()
return fragment.roomListActionsViewModelFactory.create(state) return fragment.roomListActionsViewModelFactory.create(state)

View File

@ -0,0 +1,40 @@
/*
* Copyright 2019 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.riotx.features.html
import com.googlecode.htmlcompressor.compressor.Compressor
import com.googlecode.htmlcompressor.compressor.HtmlCompressor
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class VectorHtmlCompressor @Inject constructor() {
// All default options are suitable so far
private val htmlCompressor: Compressor = HtmlCompressor()
fun compress(html: String): String {
var result = htmlCompressor.compress(html)
// Trim space after <br> and <p>, unfortunately the method setRemoveSurroundingSpaces() from the doc does not exist
result = result.replace("<br> ", "<br>")
result = result.replace("<br/> ", "<br/>")
result = result.replace("<p> ", "<p>")
return result
}
}

View File

@ -31,11 +31,13 @@ import im.vector.matrix.android.internal.crypto.attachments.ElementToDecrypt
import im.vector.riotx.core.di.ActiveSessionHolder import im.vector.riotx.core.di.ActiveSessionHolder
import im.vector.riotx.core.glide.GlideApp import im.vector.riotx.core.glide.GlideApp
import im.vector.riotx.core.glide.GlideRequest import im.vector.riotx.core.glide.GlideRequest
import im.vector.riotx.core.ui.model.Size
import im.vector.riotx.core.utils.DimensionConverter import im.vector.riotx.core.utils.DimensionConverter
import im.vector.riotx.core.utils.isLocalFile import im.vector.riotx.core.utils.isLocalFile
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.min
class ImageContentRenderer @Inject constructor(private val activeSessionHolder: ActiveSessionHolder, class ImageContentRenderer @Inject constructor(private val activeSessionHolder: ActiveSessionHolder,
private val dimensionConverter: DimensionConverter) { private val dimensionConverter: DimensionConverter) {
@ -56,17 +58,18 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder:
enum class Mode { enum class Mode {
FULL_SIZE, FULL_SIZE,
THUMBNAIL THUMBNAIL,
STICKER
} }
fun render(data: Data, mode: Mode, imageView: ImageView) { fun render(data: Data, mode: Mode, imageView: ImageView) {
val (width, height) = processSize(data, mode) val size = processSize(data, mode)
imageView.layoutParams.height = height imageView.layoutParams.width = size.width
imageView.layoutParams.width = width imageView.layoutParams.height = size.height
// a11y // a11y
imageView.contentDescription = data.filename imageView.contentDescription = data.filename
createGlideRequest(data, mode, imageView, width, height) createGlideRequest(data, mode, imageView, size)
.dontAnimate() .dontAnimate()
.transform(RoundedCorners(dimensionConverter.dpToPx(8))) .transform(RoundedCorners(dimensionConverter.dpToPx(8)))
.thumbnail(0.3f) .thumbnail(0.3f)
@ -74,12 +77,12 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder:
} }
fun renderFitTarget(data: Data, mode: Mode, imageView: ImageView, callback: ((Boolean) -> Unit)? = null) { fun renderFitTarget(data: Data, mode: Mode, imageView: ImageView, callback: ((Boolean) -> Unit)? = null) {
val (width, height) = processSize(data, mode) val size = processSize(data, mode)
// a11y // a11y
imageView.contentDescription = data.filename imageView.contentDescription = data.filename
createGlideRequest(data, mode, imageView, width, height) createGlideRequest(data, mode, imageView, size)
.listener(object : RequestListener<Drawable> { .listener(object : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, override fun onLoadFailed(e: GlideException?,
model: Any?, model: Any?,
@ -102,7 +105,7 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder:
.into(imageView) .into(imageView)
} }
private fun createGlideRequest(data: Data, mode: Mode, imageView: ImageView, width: Int, height: Int): GlideRequest<Drawable> { private fun createGlideRequest(data: Data, mode: Mode, imageView: ImageView, size: Size): GlideRequest<Drawable> {
return if (data.elementToDecrypt != null) { return if (data.elementToDecrypt != null) {
// Encrypted image // Encrypted image
GlideApp GlideApp
@ -112,8 +115,9 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder:
// Clear image // Clear image
val contentUrlResolver = activeSessionHolder.getActiveSession().contentUrlResolver() val contentUrlResolver = activeSessionHolder.getActiveSession().contentUrlResolver()
val resolvedUrl = when (mode) { val resolvedUrl = when (mode) {
Mode.FULL_SIZE -> contentUrlResolver.resolveFullSize(data.url) Mode.FULL_SIZE,
Mode.THUMBNAIL -> contentUrlResolver.resolveThumbnail(data.url, width, height, ContentUrlResolver.ThumbnailMethod.SCALE) Mode.STICKER -> contentUrlResolver.resolveFullSize(data.url)
Mode.THUMBNAIL -> contentUrlResolver.resolveThumbnail(data.url, size.width, size.height, ContentUrlResolver.ThumbnailMethod.SCALE)
} }
// Fallback to base url // Fallback to base url
?: data.url ?: data.url
@ -144,23 +148,32 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder:
) )
} }
private fun processSize(data: Data, mode: Mode): Pair<Int, Int> { private fun processSize(data: Data, mode: Mode): Size {
val maxImageWidth = data.maxWidth val maxImageWidth = data.maxWidth
val maxImageHeight = data.maxHeight val maxImageHeight = data.maxHeight
val width = data.width ?: maxImageWidth val width = data.width ?: maxImageWidth
val height = data.height ?: maxImageHeight val height = data.height ?: maxImageHeight
var finalHeight = -1
var finalWidth = -1 var finalWidth = -1
var finalHeight = -1
// if the image size is known // if the image size is known
// compute the expected height // compute the expected height
if (width > 0 && height > 0) { if (width > 0 && height > 0) {
if (mode == Mode.FULL_SIZE) { when (mode) {
finalHeight = height Mode.FULL_SIZE -> {
finalWidth = width finalHeight = height
} else { finalWidth = width
finalHeight = Math.min(maxImageWidth * height / width, maxImageHeight) }
finalWidth = finalHeight * width / height Mode.THUMBNAIL -> {
finalHeight = min(maxImageWidth * height / width, maxImageHeight)
finalWidth = finalHeight * width / height
}
Mode.STICKER -> {
// limit on width
val maxWidthDp = min(dimensionConverter.dpToPx(120), maxImageWidth / 2)
finalWidth = min(dimensionConverter.dpToPx(width), maxWidthDp)
finalHeight = finalWidth * height / width
}
} }
} }
// ensure that some values are properly initialized // ensure that some values are properly initialized
@ -170,6 +183,6 @@ class ImageContentRenderer @Inject constructor(private val activeSessionHolder:
if (finalWidth < 0) { if (finalWidth < 0) {
finalWidth = maxImageWidth finalWidth = maxImageWidth
} }
return Pair(finalWidth, finalHeight) return Size(finalWidth, finalHeight)
} }
} }

View File

@ -19,8 +19,11 @@ package im.vector.riotx.features.navigation
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import androidx.core.app.TaskStackBuilder
import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom import im.vector.matrix.android.api.session.room.model.roomdirectory.PublicRoom
import im.vector.riotx.R import im.vector.riotx.R
import im.vector.riotx.core.di.ActiveSessionHolder
import im.vector.riotx.core.error.fatalError
import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.core.platform.VectorBaseActivity
import im.vector.riotx.core.utils.toast import im.vector.riotx.core.utils.toast
import im.vector.riotx.features.crypto.keysbackup.settings.KeysBackupManageActivity import im.vector.riotx.features.crypto.keysbackup.settings.KeysBackupManageActivity
@ -38,12 +41,18 @@ import im.vector.riotx.features.share.SharedData
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
import androidx.core.app.TaskStackBuilder
@Singleton @Singleton
class DefaultNavigator @Inject constructor() : Navigator { class DefaultNavigator @Inject constructor(
private val sessionHolder: ActiveSessionHolder
) : Navigator {
override fun openRoom(context: Context, roomId: String, eventId: String?, buildTask: Boolean) { override fun openRoom(context: Context, roomId: String, eventId: String?, buildTask: Boolean) {
if (sessionHolder.getSafeActiveSession()?.getRoom(roomId) == null) {
fatalError("Trying to open an unknown room $roomId")
return
}
val args = RoomDetailArgs(roomId, eventId) val args = RoomDetailArgs(roomId, eventId)
val intent = RoomDetailActivity.newIntent(context, args) val intent = RoomDetailActivity.newIntent(context, args)
if (buildTask) { if (buildTask) {

View File

@ -87,9 +87,9 @@ class PermalinkHandler @Inject constructor(private val session: Session,
} }
/** /**
* Open room either joined, or not unknown * Open room either joined, or not
*/ */
private fun openRoom(context: Context, roomId: String?, eventId: String? = null, buildTask: Boolean) { private fun openRoom(context: Context, roomId: String?, eventId: String?, buildTask: Boolean) {
return if (roomId != null && session.getRoom(roomId) != null) { return if (roomId != null && session.getRoom(roomId) != null) {
navigator.openRoom(context, roomId, eventId, buildTask) navigator.openRoom(context, roomId, eventId, buildTask)
} else { } else {

View File

@ -27,7 +27,6 @@ import im.vector.riotx.core.utils.toast
import im.vector.riotx.features.home.LoadingFragment import im.vector.riotx.features.home.LoadingFragment
import im.vector.riotx.features.login.LoginActivity import im.vector.riotx.features.login.LoginActivity
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import kotlinx.android.synthetic.debug.activity_test_material_theme.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import javax.inject.Inject import javax.inject.Inject

View File

@ -77,8 +77,7 @@ class BugReportActivity : VectorBaseActivity() {
override fun onPrepareOptionsMenu(menu: Menu): Boolean { override fun onPrepareOptionsMenu(menu: Menu): Boolean {
menu.findItem(R.id.ic_action_send_bug_report)?.let { menu.findItem(R.id.ic_action_send_bug_report)?.let {
val isValid = bug_report_edit_text.text.toString().trim().length > 10 val isValid = !bug_report_mask_view.isVisible
&& !bug_report_mask_view.isVisible
it.isEnabled = isValid it.isEnabled = isValid
it.icon.alpha = if (isValid) 255 else 100 it.icon.alpha = if (isValid) 255 else 100
@ -90,7 +89,11 @@ class BugReportActivity : VectorBaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.ic_action_send_bug_report -> { R.id.ic_action_send_bug_report -> {
sendBugReport() if (bug_report_edit_text.text.toString().trim().length >= 10) {
sendBugReport()
} else {
bug_report_text_input_layout.error = getString(R.string.bug_report_error_too_short)
}
return true return true
} }
} }
@ -150,7 +153,7 @@ class BugReportActivity : VectorBaseActivity() {
val myProgress = progress.coerceIn(0, 100) val myProgress = progress.coerceIn(0, 100)
bug_report_progress_view.progress = myProgress bug_report_progress_view.progress = myProgress
bug_report_progress_text_view.text = getString(R.string.send_bug_report_progress, "$myProgress") bug_report_progress_text_view.text = getString(R.string.send_bug_report_progress, myProgress.toString())
} }
override fun onUploadSucceed() { override fun onUploadSucceed() {
@ -179,7 +182,7 @@ class BugReportActivity : VectorBaseActivity() {
@OnTextChanged(R.id.bug_report_edit_text) @OnTextChanged(R.id.bug_report_edit_text)
internal fun textChanged() { internal fun textChanged() {
invalidateOptionsMenu() bug_report_text_input_layout.error = null
} }
@OnCheckedChanged(R.id.bug_report_button_include_screenshot) @OnCheckedChanged(R.id.bug_report_button_include_screenshot)

View File

@ -33,6 +33,7 @@ import im.vector.riotx.core.di.ActiveSessionHolder
import im.vector.riotx.core.extensions.toOnOff import im.vector.riotx.core.extensions.toOnOff
import im.vector.riotx.core.utils.getDeviceLocale import im.vector.riotx.core.utils.getDeviceLocale
import im.vector.riotx.features.settings.VectorLocale import im.vector.riotx.features.settings.VectorLocale
import im.vector.riotx.features.settings.VectorPreferences
import im.vector.riotx.features.themes.ThemeUtils import im.vector.riotx.features.themes.ThemeUtils
import im.vector.riotx.features.version.VersionProvider import im.vector.riotx.features.version.VersionProvider
import okhttp3.Call import okhttp3.Call
@ -44,12 +45,15 @@ import okhttp3.Response
import org.json.JSONException import org.json.JSONException
import org.json.JSONObject import org.json.JSONObject
import timber.log.Timber import timber.log.Timber
import java.io.* import java.io.File
import java.io.IOException
import java.io.OutputStreamWriter
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.util.Locale import java.util.*
import java.util.zip.GZIPOutputStream import java.util.zip.GZIPOutputStream
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
import kotlin.collections.ArrayList
/** /**
* BugReporter creates and sends the bug reports. * BugReporter creates and sends the bug reports.
@ -57,6 +61,7 @@ import javax.inject.Singleton
@Singleton @Singleton
class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSessionHolder, class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSessionHolder,
private val versionProvider: VersionProvider, private val versionProvider: VersionProvider,
private val vectorPreferences: VectorPreferences,
private val vectorFileLogger: VectorFileLogger) { private val vectorFileLogger: VectorFileLogger) {
var inMultiWindowMode = false var inMultiWindowMode = false
@ -230,7 +235,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes
.addFormDataPart("matrix_sdk_version", Matrix.getSdkVersion()) .addFormDataPart("matrix_sdk_version", Matrix.getSdkVersion())
.addFormDataPart("olm_version", olmVersion) .addFormDataPart("olm_version", olmVersion)
.addFormDataPart("device", Build.MODEL.trim()) .addFormDataPart("device", Build.MODEL.trim())
.addFormDataPart("lazy_loading", true.toOnOff()) .addFormDataPart("verbose_log", vectorPreferences.labAllowedExtendedLogging().toOnOff())
.addFormDataPart("multi_window", inMultiWindowMode.toOnOff()) .addFormDataPart("multi_window", inMultiWindowMode.toOnOff())
.addFormDataPart("os", Build.VERSION.RELEASE + " (API " + Build.VERSION.SDK_INT + ") " .addFormDataPart("os", Build.VERSION.RELEASE + " (API " + Build.VERSION.SDK_INT + ") "
+ Build.VERSION.INCREMENTAL + "-" + Build.VERSION.CODENAME) + Build.VERSION.INCREMENTAL + "-" + Build.VERSION.CODENAME)

View File

@ -24,9 +24,7 @@ import java.io.File
import java.io.PrintWriter import java.io.PrintWriter
import java.io.StringWriter import java.io.StringWriter
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.*
import java.util.Locale
import java.util.TimeZone
import java.util.logging.* import java.util.logging.*
import java.util.logging.Formatter import java.util.logging.Formatter
import javax.inject.Inject import javax.inject.Inject
@ -83,7 +81,8 @@ class VectorFileLogger @Inject constructor(val context: Context, private val vec
return if (vectorPreferences.labAllowedExtendedLogging()) { return if (vectorPreferences.labAllowedExtendedLogging()) {
false false
} else { } else {
priority < Log.ERROR // Exclude debug and verbose logs
priority <= Log.DEBUG
} }
} }

View File

@ -42,6 +42,7 @@ class EmojiSearchResultViewModel @AssistedInject constructor(
companion object : MvRxViewModelFactory<EmojiSearchResultViewModel, EmojiSearchResultViewState> { companion object : MvRxViewModelFactory<EmojiSearchResultViewModel, EmojiSearchResultViewState> {
@JvmStatic
override fun create(viewModelContext: ViewModelContext, state: EmojiSearchResultViewState): EmojiSearchResultViewModel? { override fun create(viewModelContext: ViewModelContext, state: EmojiSearchResultViewState): EmojiSearchResultViewModel? {
val activity: EmojiReactionPickerActivity = (viewModelContext as ActivityViewModelContext).activity() val activity: EmojiReactionPickerActivity = (viewModelContext as ActivityViewModelContext).activity()
return activity.emojiSearchResultViewModelFactory.create(state) return activity.emojiSearchResultViewModelFactory.create(state)

View File

@ -178,7 +178,9 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState:
copy( copy(
asyncPublicRoomsRequest = Success(data.chunk!!), asyncPublicRoomsRequest = Success(data.chunk!!),
// It's ok to append at the end of the list, so I use publicRooms.size() // It's ok to append at the end of the list, so I use publicRooms.size()
publicRooms = publicRooms.appendAt(data.chunk!!, publicRooms.size), publicRooms = publicRooms.appendAt(data.chunk!!, publicRooms.size)
// Rageshake #8206 tells that we can have several times the same room
.distinctBy { it.roomId },
hasMore = since != null hasMore = since != null
) )
} }

View File

@ -65,7 +65,7 @@ abstract class VectorSettingsBaseFragment : PreferenceFragmentCompat(), HasScree
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
Timber.v("onResume Fragment ${this.javaClass.simpleName}") Timber.i("onResume Fragment ${this.javaClass.simpleName}")
vectorActivity.supportActionBar?.setTitle(titleRes) vectorActivity.supportActionBar?.setTitle(titleRes)
// find the view from parent activity // find the view from parent activity
mLoadingView = vectorActivity.findViewById(R.id.vector_settings_spinner_views) mLoadingView = vectorActivity.findViewById(R.id.vector_settings_spinner_views)

View File

@ -40,6 +40,7 @@ class PushGatewaysViewModel @AssistedInject constructor(@Assisted initialState:
companion object : MvRxViewModelFactory<PushGatewaysViewModel, PushGatewayViewState> { companion object : MvRxViewModelFactory<PushGatewaysViewModel, PushGatewayViewState> {
@JvmStatic
override fun create(viewModelContext: ViewModelContext, state: PushGatewayViewState): PushGatewaysViewModel? { override fun create(viewModelContext: ViewModelContext, state: PushGatewayViewState): PushGatewaysViewModel? {
val fragment: PushGatewaysFragment = (viewModelContext as FragmentViewModelContext).fragment() val fragment: PushGatewaysFragment = (viewModelContext as FragmentViewModelContext).fragment()
return fragment.pushGatewaysViewModelFactory.create(state) return fragment.pushGatewaysViewModelFactory.create(state)

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -82,7 +83,9 @@
android:layout_marginEnd="10dp" android:layout_marginEnd="10dp"
android:layout_marginRight="10dp" android:layout_marginRight="10dp"
android:hint="@string/send_bug_report_placeholder" android:hint="@string/send_bug_report_placeholder"
android:textColorHint="?attr/vctr_default_text_hint_color"> android:textColorHint="?attr/vctr_default_text_hint_color"
app:counterEnabled="true"
app:counterMaxLength="500">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/bug_report_edit_text" android:id="@+id/bug_report_edit_text"

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dp"
android:layout_height="0dp" />

View File

@ -336,12 +336,10 @@
<string name="permissions_rationale_msg_camera_and_audio">ভিডিও কল সম্পাদনের জন্য Riot আপনার ক্যামেরা এবং আপনার মাইক্রোফোন অ্যাক্সেস করার অনুমতির প্রয়োজন। <string name="permissions_rationale_msg_camera_and_audio">ভিডিও কল সম্পাদনের জন্য Riot আপনার ক্যামেরা এবং আপনার মাইক্রোফোন অ্যাক্সেস করার অনুমতির প্রয়োজন।
\n \n
\nকল করতে সক্ষম হতে পরবর্তী পপ আপ অ্যাক্সেস অনুমতি দিন।</string> \nকল করতে সক্ষম হতে পরবর্তী পপ আপ অ্যাক্সেস অনুমতি দিন।</string>
<string name="permissions_rationale_msg_contacts">Riot আপনার ইমেল এবং ফোন নম্বরগুলির উপর ভিত্তি করে অন্যান্য ম্যাট্রিক্স ব্যবহারকারীদের খুঁজে পেতে আপনার ঠিকানা বই পরিচিতিগুলি অ্যাক্সেস করার অনুমতির প্রয়োজন। <string name="permissions_rationale_msg_contacts">রায়ট অন্যান্য ম্যাট্রিক্স ব্যবহারকারীদের তাদের ইমেল এবং ফোন নম্বরগুলির উপর ভিত্তি করে আপনার ঠিকানা বইটি চেক করতে পারে। আপনি যদি এই উদ্দেশ্যে আপনার ঠিকানা বইটি ভাগ করে নিতে সম্মত হন তবে দয়া করে পরবর্তী পপ-আপটিতে অ্যাক্সেসের অনুমতি দিন।</string>
<string name="permissions_msg_contacts_warning_other_androids">রায়ট অন্যান্য ম্যাট্রিক্স ব্যবহারকারীদের তাদের ইমেল এবং ফোন নম্বরগুলির উপর ভিত্তি করে আপনার ঠিকানা বইটি চেক করতে পারে।
\n \n
\nদয়া করে পরবর্তী পপ-আপ অ্যাক্সেসের অনুমতি দিয়ে ঠিকানা বই ব্যবহারকারীদের Riot থেকে অ্যাক্সেসযোগ্য করুন।</string> \nআপনি এই উদ্দেশ্যে আপনার ঠিকানা বই ভাগ করতে সম্মত হন\?</string>
<string name="permissions_msg_contacts_warning_other_androids">Riot কে আপনার ইমেল এবং ফোন নম্বরগুলির উপর ভিত্তি করে অন্যান্য ম্যাট্রিক্স ব্যবহারকারীদের সন্ধান করার জন্য আপনার ঠিকানা বই যোগাযোগ অ্যাক্সেস করার অনুমতির প্রয়োজন।
\n
\nRiot কে আপনার পরিচিতি অ্যাক্সেস করার অনুমতি দেবেন \?</string>
<string name="permissions_action_not_performed_missing_permissions">"দুঃখিত। কর্ম সঞ্চালিত না, অনুপস্থিত অনুমতির জন্য "</string> <string name="permissions_action_not_performed_missing_permissions">"দুঃখিত। কর্ম সঞ্চালিত না, অনুপস্থিত অনুমতির জন্য "</string>
@ -726,7 +724,7 @@
<string name="settings_start_on_boot">বুট করার সময় শুরু</string> <string name="settings_start_on_boot">বুট করার সময় শুরু</string>
<string name="settings_enable_background_sync">ব্যাকগ্রাউন্ড সিঙ্ক সক্ষম করুন</string> <string name="settings_enable_background_sync">ব্যাকগ্রাউন্ড সিঙ্ক সক্ষম করুন</string>
<string name="settings_set_sync_timeout">সিঙ্ক অনুরোধ সময়সীমার</string> <string name="settings_set_sync_timeout">সিঙ্ক অনুরোধ সময়সীমার</string>
<string name="settings_set_sync_delay">প্রতিটি অনুরোধের মধ্যে বিলম্ব</string> <string name="settings_set_sync_delay">প্রতিটি সিঙ্কের মধ্যে বিলম্ব</string>
<string name="settings_second">সেকেন্ড</string> <string name="settings_second">সেকেন্ড</string>
<string name="settings_seconds">সেকেন্ড</string> <string name="settings_seconds">সেকেন্ড</string>
@ -791,10 +789,10 @@
<string name="settings_data_save_mode">ডেটা সংরক্ষণ মোড</string> <string name="settings_data_save_mode">ডেটা সংরক্ষণ মোড</string>
<string name="settings_data_save_mode_summary">ডেটা সংরক্ষণ মোড একটি নির্দিষ্ট ফিল্টার প্রয়োগ করে যাতে উপস্থিতি আপডেট এবং টাইপিং বিজ্ঞপ্তি ফিল্টার করা হয়।</string> <string name="settings_data_save_mode_summary">ডেটা সংরক্ষণ মোড একটি নির্দিষ্ট ফিল্টার প্রয়োগ করে যাতে উপস্থিতি আপডেট এবং টাইপিং বিজ্ঞপ্তি ফিল্টার করা হয়।</string>
<string name="devices_details_dialog_title">যন্ত্র বিবরণ</string> <string name="devices_details_dialog_title">যন্ত্রের তথ্য</string>
<string name="devices_details_id_title">আইডি</string> <string name="devices_details_id_title">আইডি</string>
<string name="devices_details_name_title">নাম</string> <string name="devices_details_name_title">সর্বজনীন নাম</string>
<string name="devices_details_device_name">যন্ত্রের নাম</string> <string name="devices_details_device_name">সর্বজনীন নাম আপডেট করুন</string>
<string name="devices_details_last_seen_title">শেষ দেখা</string> <string name="devices_details_last_seen_title">শেষ দেখা</string>
<string name="devices_details_last_seen_format">%1$s @ %2$s</string> <string name="devices_details_last_seen_format">%1$s @ %2$s</string>
<string name="devices_delete_dialog_text">এই অপারেশন অতিরিক্ত প্রমাণীকরণ প্রয়োজন। <string name="devices_delete_dialog_text">এই অপারেশন অতিরিক্ত প্রমাণীকরণ প্রয়োজন।
@ -942,9 +940,9 @@
<string name="encryption_information_decryption_error">ডিক্রিপশন সমস্যা</string> <string name="encryption_information_decryption_error">ডিক্রিপশন সমস্যা</string>
<string name="encryption_information_sender_device_information">প্রেরক ডিভাইস তথ্য</string> <string name="encryption_information_sender_device_information">প্রেরক ডিভাইস তথ্য</string>
<string name="encryption_information_device_name">যন্ত্রের নাম</string> <string name="encryption_information_device_name">সর্বজনীন নাম</string>
<string name="encryption_information_name">নাম</string> <string name="encryption_information_name">সর্বজনীন নাম</string>
<string name="encryption_information_device_id">ডিভাইস আইডি</string> <string name="encryption_information_device_id">আইডি</string>
<string name="encryption_information_device_key">যন্ত্রের কুঞ্জি</string> <string name="encryption_information_device_key">যন্ত্রের কুঞ্জি</string>
<string name="encryption_information_verification">প্রতিপাদন</string> <string name="encryption_information_verification">প্রতিপাদন</string>
<string name="encryption_information_ed25519_fingerprint">Ed25519 ফিঙ্গারপ্রিন্ট</string> <string name="encryption_information_ed25519_fingerprint">Ed25519 ফিঙ্গারপ্রিন্ট</string>
@ -1098,4 +1096,100 @@
<string name="command_problem_with_parameters">কমান্ড \"%s\" আরও পেরামিটার প্রয়োজন, অথবা কিছু পেরামিটার ভুল।</string> <string name="command_problem_with_parameters">কমান্ড \"%s\" আরও পেরামিটার প্রয়োজন, অথবা কিছু পেরামিটার ভুল।</string>
<string name="command_description_emote">কর্ম প্রদর্শন করে</string> <string name="command_description_emote">কর্ম প্রদর্শন করে</string>
<string name="command_description_ban_user">দেওয়া আইডি সঙ্গে ব্যবহারকারী কে নিষিদ্ধ করে</string> <string name="command_description_ban_user">দেওয়া আইডি সঙ্গে ব্যবহারকারী কে নিষিদ্ধ করে</string>
<string name="none">কোনটা না</string>
<string name="revoke">রদ কর</string>
<string name="disconnect">বিযুক্ত</string>
<string name="review">পর্যালোচনা</string>
<string name="decline">পতন</string>
<string name="people_no_identity_server">কোনও পরিচয় সার্ভার কনফিগার করা নেই।</string>
<string name="call_failed_no_ice_title">ভুল কনফিগার্ড সার্ভারের কারণে কল ব্যর্থ হয়েছে</string>
<string name="call_failed_no_ice_description">কলগুলি নির্ভরযোগ্যভাবে কাজ করার জন্য দয়া করে আপনার হোমসার্ভার (%1$s) এর প্রশাসককে একটি টার্ন সার্ভার কনফিগার করতে বলুন।
\n
\nবিকল্পভাবে, আপনি পাবলিক সার্ভারটি %2$s এ ব্যবহার করার চেষ্টা করতে পারেন, তবে এটি নির্ভরযোগ্য হবে না এবং এটি আপনার সার্ভারের সাথে আপনার আইপি ঠিকানাটি ভাগ করে দেবে। আপনি সেটিংসে এটি পরিচালনা করতে পারেন।</string>
<string name="call_failed_no_ice_use_alt">%s ব্যবহার করার চেষ্টা করুন</string>
<string name="call_failed_dont_ask_again">আবার আমাকে জিজ্ঞাসা করবেন না</string>
<string name="auth_add_email_message_2">অ্যাকাউন্ট পুনরুদ্ধারের জন্য একটি ইমেল সেট করুন এবং পরে আপনাকে চিনে এমন লোকেরা ইচ্ছিকভাবে আবিষ্কারযোগ্য।</string>
<string name="auth_add_phone_message_2">একটি ফোন সেট করুন এবং পরে আপনাকে জারা চেনে সেই লোকেদের দ্বারা বিকল্প হিসাবে আবিষ্কার করার জন্য।</string>
<string name="auth_add_email_phone_message_2">অ্যাকাউন্ট পুনরুদ্ধারের জন্য একটি ইমেল সেট করুন। আপনার পরিচিত লোকদের দ্বারা বিকল্প হিসাবে আবিষ্কারের জন্য পরে ইমেল বা ফোন ব্যবহার করুন।</string>
<string name="auth_add_email_and_phone_message_2">অ্যাকাউন্ট পুনরুদ্ধারের জন্য একটি ইমেল সেট করুন। আপনার পরিচিত লোকদের দ্বারা বিকল্প হিসাবে আবিষ্কারের জন্য পরে ইমেল বা ফোন ব্যবহার করুন।</string>
<string name="login_error_homeserver_not_found">এই ইউআরএলে কোনও হোম সার্ভারে পৌঁছানো যায় না, দয়া করে এটি পরীক্ষা করে দেখুন</string>
<string name="settings_call_ringtone_use_default_stun">ফ্যালব্যাক কল সহায়তা সার্ভারকে অনুমতি দিন</string>
<string name="settings_call_ringtone_use_default_stun_sum">আপনার হোমসার্ভার একটি প্রস্তাব না দিলে সহায়তা হিসাবে %s ব্যবহার করবে (আপনার আইপি ঠিকানা কল করার সময় ভাগ করা হবে)</string>
<string name="invite_no_identity_server_error">এই ক্রিয়াটি সম্পাদন করতে আপনার সেটিংসে একটি পরিচয় সার্ভার যুক্ত করুন।</string>
<string name="settings_add_3pid_confirm_password_title">আপনার পাসওয়ার্ড নিশ্চিত করুন</string>
<string name="settings_add_3pid_flow_not_supported">আপনি রায়ট মোবাইল থেকে এটি করতে পারবেন না</string>
<string name="settings_add_3pid_authentication_needed">প্রমাণীকরণ প্রয়োজন</string>
<string name="settings_background_fdroid_sync_mode">পটভূমি সিঙ্ক মোড (পরীক্ষামূলক)</string>
<string name="settings_background_fdroid_sync_mode_battery">ব্যাটারির জন্য অনুকূলিত</string>
<string name="settings_background_fdroid_sync_mode_battery_description">রায়ট এমনভাবে পটভূমিতে সিঙ্ক হবে যা ডিভাইসের সীমিত সংস্থান (ব্যাটারি) সংরক্ষণ করে।
\nআপনার ডিভাইস রিসোর্স স্থিতির উপর নির্ভর করে সিঙ্কটি অপারেটিং সিস্টেম দ্বারা পিছিয়ে যেতে পারে।</string>
<string name="settings_background_fdroid_sync_mode_real_time">রিয়েল টাইম জন্য অনুকূলিত</string>
<string name="settings_background_fdroid_sync_mode_real_time_description">রায়ট নির্দিষ্ট সময়ে সময়ে পটভূমিতে সিঙ্ক হবে (কনফিগারযোগ্য)।
\nএটি রেডিও এবং ব্যাটারির ব্যবহারকে প্রভাবিত করবে, রায়ট ইভেন্টগুলি শুনছে বলে জানিয়ে একটি স্থায়ী বিজ্ঞপ্তি প্রদর্শিত হবে।</string>
<string name="settings_background_fdroid_sync_mode_disabled">কোনও পটভূমি সিঙ্ক না</string>
<string name="settings_background_fdroid_sync_mode_disabled_description">অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় আপনাকে আগত বার্তাগুলি সম্পর্কে অবহিত করা হবে না।</string>
<string name="settings_background_sync_update_error">সেটিংস আপডেট করতে ব্যর্থ।</string>
<string name="settings_set_workmanager_delay">পছন্দের সিঙ্ক ব্যবধান</string>
<string name="settings_set_workmanager_delay_summary">%s
\nসিঙ্কটি ডিভাইসের সংস্থান (ব্যাটারি) বা অবস্থার (ঘুম) উপর নির্ভর করে পিছিয়ে যেতে পারে।</string>
<string name="settings_integrations">ঐক্যবদ্ধতা</string>
<string name="settings_integrations_summary">বট, সেতু, উইজেট এবং স্টিকার প্যাকগুলি পরিচালনা করতে ইন্টিগ্রেশন ম্যানেজার ব্যবহার করুন।
\nইন্টিগ্রেশন ম্যানেজাররা কনফিগারেশন ডেটা গ্রহণ করে এবং উইজেটগুলি সংশোধন করতে, রুম আমন্ত্রন প্রেরণ করতে এবং আপনার পক্ষে পাওয়ার স্তর নির্ধারণ করতে পারে।</string>
<string name="settings_discovery_category">আবিষ্কার</string>
<string name="settings_discovery_manage">আপনার আবিষ্কারের সেটিংস পরিচালনা করুন।</string>
<string name="settings_integration_allow">সংহতকরণের অনুমতি দিন</string>
<string name="settings_integration_manager">ইন্টিগ্রেশন ম্যানেজার</string>
<string name="encryption_information_device_name_with_warning">সর্বজনীন নাম (যাদের সাথে আপনি যোগাযোগ করেন তাদের কাছে দৃশ্যমান)</string>
<string name="device_name_warning">একটি ডিভাইসের সর্বজনীন নাম আপনি যাদের সাথে যোগাযোগ করেন তাদের কাছে দৃশ্যমান</string>
<string name="room_widget_activity_title">উইজেট</string>
<string name="room_widget_permission_title">উইজেট লোড করুন</string>
<string name="room_widget_permission_added_by">এই উইজেটটি যুক্ত করেছেন:</string>
<string name="room_widget_permission_webview_shared_info_title">এটি ব্যবহার করে কুকিজ সেট করতে পারে এবং %s এর সাথে ডেটা ভাগ করা যায়:</string>
<string name="room_widget_permission_shared_info_title">এটি ব্যবহার করে ডেটা %s এর সাথে ভাগ করে নিতে পারে:</string>
<string name="room_widget_failed_to_load">উইজেট লোড করতে ব্যর্থ।
\n%s</string>
<string name="room_widget_reload">উইজেট পুনরায় লোড করুন</string>
<string name="room_widget_open_in_browser">ব্রাউজারে খুলুন</string>
<string name="room_widget_revoke_access">আমার জন্য অ্যাক্সেস প্রত্যাহার করুন</string>
<string name="room_widget_permission_display_name">আপনার প্রদশনীয় নাম</string>
<string name="room_widget_permission_avatar_url">আপনার অবতার URL</string>
<string name="room_widget_permission_user_id">আপনার ব্যবহারকারীর আইডি</string>
<string name="room_widget_permission_theme">আপনার থিম</string>
<string name="room_widget_permission_widget_id">উইজেট আইডি</string>
<string name="room_widget_permission_room_id">কক্ষের আইডি</string>
<string name="room_widget_resource_permission_title">এই উইজেটটি নিম্নলিখিত সংস্থানগুলি ব্যবহার করতে চায়:</string>
<string name="room_widget_resource_grant_permission">অনুমতি</string>
<string name="room_widget_resource_decline_permission">সব অবরুদ্ধ</string>
<string name="room_widget_webview_access_camera">ক্যামেরা ব্যবহার করুন</string>
<string name="room_widget_webview_access_microphone">মাইক্রোফোন ব্যবহার করুন</string>
<string name="room_widget_webview_read_protected_media">ডিআরএম সুরক্ষিত মিডিয়া পড়ুন</string>
<string name="integration_manager_not_configured">কোনও ইন্টিগ্রেশন ম্যানেজার কনফিগার করা নেই।</string>
<string name="widget_integration_review_terms">চালিয়ে যেতে আপনার এই পরিষেবার শর্তাদি স্বীকার করতে হবে।</string>
<string name="command_description_unban_user">প্রদত্ত আইডি সহ ব্যবহারকারীকে নিষিদ্ধ তালিকা থেকে বের করে</string>
<string name="command_description_op_user">ব্যবহারকারীর পাওয়ার স্তর নির্ধারণ করুন</string>
<string name="command_description_deop_user">প্রদত্ত আইডি সহ ব্যবহারকারীকে ডিওপ করে</string>
<string name="command_description_invite_user">প্রদত্ত আইডি সহ ব্যবহারকারীকে বর্তমান কক্ষ এ আমন্ত্রণ জানায়</string>
<string name="command_description_join_room">প্রদত্ত ওরফে সহ রুমে যোগ দেয়</string>
<string name="command_description_part_room">কক্ষ ছেড়ে দিন</string>
<string name="command_description_topic">রুমের টপিক সেট করুন</string>
<string name="command_description_kick_user">প্রদত্ত আইডি সহ ব্যবহারকারীকে কিক্ করে</string>
<string name="command_description_nick">আপনার প্রদর্শনের ডাকনাম পরিবর্তন করে</string>
<string name="command_description_markdown">অন/অফ মার্কডাউন</string>
<string name="markdown_has_been_enabled">মার্কডাউন সক্ষম করা হয়েছে।</string>
<string name="markdown_has_been_disabled">মার্কডাউন অক্ষম করা হয়েছে।</string>
<string name="notification_off">অফ</string>
</resources> </resources>

View File

@ -28,7 +28,7 @@
<string name="resources_country_code">CZ</string> <string name="resources_country_code">CZ</string>
<string name="forget_room">Zapomenout místnost</string> <string name="forget_room">Zapomenout místnost</string>
<string name="notification_sync_in_progress">Synchronizace</string> <string name="notification_sync_in_progress">Synchronizuji..</string>
<string name="notification_noisy_notifications">Hlasitá oznámení</string> <string name="notification_noisy_notifications">Hlasitá oznámení</string>
<string name="notification_silent_notifications">Tichá oznámení</string> <string name="notification_silent_notifications">Tichá oznámení</string>
@ -46,7 +46,8 @@
<string name="view_decrypted_source">Zobraz dešifrovaný zdroj</string> <string name="view_decrypted_source">Zobraz dešifrovaný zdroj</string>
<string name="report_content">Nahlásit obsah</string> <string name="report_content">Nahlásit obsah</string>
<string name="active_call">Aktivní hovor</string> <string name="active_call">Aktivní hovor</string>
<string name="ongoing_conference_call">Probíhající konferenční hovor.\nPřipojit se %1$s nebo %2$s.</string> <string name="ongoing_conference_call">Probíhající konferenční hovor.
\nPřipojit se jako %1$s nebo %2$s.</string>
<string name="ongoing_conference_call_voice">hlasem</string> <string name="ongoing_conference_call_voice">hlasem</string>
<string name="ongoing_conference_call_video">videem</string> <string name="ongoing_conference_call_video">videem</string>
<string name="cannot_start_call">Nemohu spustit hovor, prosím zkusit později</string> <string name="cannot_start_call">Nemohu spustit hovor, prosím zkusit později</string>
@ -601,4 +602,12 @@ Omlouváme se za způsobené nepříjemnosti.</string>
<string name="settings_notification_advanced_summary">Nastavit důležitost upozornění na základě události, nastavení zvuku, LED, vibrací</string> <string name="settings_notification_advanced_summary">Nastavit důležitost upozornění na základě události, nastavení zvuku, LED, vibrací</string>
<string name="settings_notification_by_event">Důležitost upozornění na základě události</string> <string name="settings_notification_by_event">Důležitost upozornění na základě události</string>
<string name="notification_sync_init">Inicializuji službu</string>
<string name="title_activity_verify_device">Ověřte zařízení</string>
<string name="disconnect">Odpojit</string>
<string name="ignore">Ignorovat</string>
<string name="decline">Odmítnout</string>
<string name="action_mark_room_read">Označit za přečtené</string>
</resources> </resources>

View File

@ -1695,7 +1695,7 @@ Wenn du diese neue Wiederherstellungsmethode nicht eingerichtet hast, kann ein A
<string name="terms_description_for_identity_server">Für andere auffindbar sein</string> <string name="terms_description_for_identity_server">Für andere auffindbar sein</string>
<string name="terms_description_for_integration_manager">Verwenden Sie Bots, Bridges, Widgets und Sticker-Packs</string> <string name="terms_description_for_integration_manager">Verwenden Sie Bots, Bridges, Widgets und Sticker-Packs</string>
<string name="read_at">Lesen Sie bei</string> <string name="read_at">Gelesen von</string>
<string name="identity_server">Identitätsserver</string> <string name="identity_server">Identitätsserver</string>
@ -1708,4 +1708,6 @@ Wenn du diese neue Wiederherstellungsmethode nicht eingerichtet hast, kann ein A
<string name="settings_discovery_enter_identity_server">Gib einen neuen Identitätsserver ein</string> <string name="settings_discovery_enter_identity_server">Gib einen neuen Identitätsserver ein</string>
<string name="settings_discovery_bad_identity_server">Konnte keine Verbindung zum Heimserver herstellen</string> <string name="settings_discovery_bad_identity_server">Konnte keine Verbindung zum Heimserver herstellen</string>
<string name="resources_script">Latn</string>
</resources> </resources>

View File

@ -1568,4 +1568,34 @@ Ten en cuenta que esta acción reiniciará la aplicación y puede tardar algo de
<string name="send_suggestion">Haz una sugerencia</string> <string name="send_suggestion">Haz una sugerencia</string>
<string name="send_suggestion_content">Por favor escriba su sugerencia a continuación.</string> <string name="send_suggestion_content">Por favor escriba su sugerencia a continuación.</string>
<string name="send_suggestion_report_placeholder">Describa su sugerencia aquí</string> <string name="send_suggestion_report_placeholder">Describa su sugerencia aquí</string>
<string name="resources_script">Latn</string>
<string name="none">Ninguno</string>
<string name="revoke">Revocar</string>
<string name="disconnect">Desconectar</string>
<string name="review">Revisar</string>
<string name="decline">Declinar</string>
<string name="people_no_identity_server">No se ha configurado un servidor de identidad.</string>
<string name="call_failed_no_ice_title">La llamada ha fallado por un servidor mal configurado</string>
<string name="call_failed_no_ice_use_alt">Intente usar %s</string>
<string name="call_failed_dont_ask_again">No volver a preguntar</string>
<string name="invite_no_identity_server_error">Para hacer esto, vaya a las opciones y añada un servidor de identidad.</string>
<string name="settings_add_3pid_confirm_password_title">Confirme su contraseña</string>
<string name="settings_add_3pid_flow_not_supported">Eso no se puede hacer en Riot para móvil</string>
<string name="settings_add_3pid_authentication_needed">Se necesita autenticación</string>
<string name="settings_background_fdroid_sync_mode_battery">Optimizado para batería</string>
<string name="settings_background_fdroid_sync_mode_real_time">Optimizado para operar en tiempo real</string>
<string name="settings_background_fdroid_sync_mode_disabled">Sin sincronización en segundo plano</string>
<string name="settings_background_sync_update_error">No se han podido actualizar las opciones.</string>
<string name="settings_integrations">Integraciones</string>
<string name="settings_discovery_category">Descubrimiento</string>
<string name="settings_discovery_manage">Gestione sus preferencias de descubrimiento.</string>
<string name="room_list_catchup_welcome_body">Entérese aquí de los mensajes sin leer</string>
</resources> </resources>

View File

@ -1766,4 +1766,39 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada.</string>
<string name="no_network_indicator">Ez dago sare konexiorik orain</string> <string name="no_network_indicator">Ez dago sare konexiorik orain</string>
<string name="settings_add_3pid_confirm_password_title">Berretsi zure pasahitza</string>
<string name="settings_add_3pid_flow_not_supported">Ezin duzu hau egin mugikorrerako Riot erabiliz</string>
<string name="settings_add_3pid_authentication_needed">Autentifikazioa behar da</string>
<string name="settings_integrations">Integrazioak</string>
<string name="settings_integrations_summary">Erabili integrazio kudeatzaileren bat botak, zubiak, trepetak eta eranskailu multzoak kudeatzeko.
\nIntegrazio kudeatzaileek konfigurazio datuak jasotzen dituzte, eta trepetak aldatu ditzakete, gelarako gonbidapenak bidali, eta botere mailak zure izenean ezarri.</string>
<string name="settings_integration_allow">Baimendu integrazioak</string>
<string name="room_widget_activity_title">Trepeta</string>
<string name="room_widget_permission_title">Kargatu trepeta</string>
<string name="room_widget_permission_added_by">Trepeta hau honek gehitu du:</string>
<string name="room_widget_permission_webview_shared_info_title">Hau erabiltzean cookie-ak ezarri litezke eta %s zerbitzariarekin datuak partekatu:</string>
<string name="room_widget_permission_shared_info_title">Hau erabiltzean %s zerbitzariarekin datuak partekatu litezke:</string>
<string name="room_widget_failed_to_load">Huts egin du trepeta kargatzean.
\n%s</string>
<string name="room_widget_reload">Birkargatu trepeta</string>
<string name="room_widget_open_in_browser">Ireki nabigatzailean</string>
<string name="room_widget_revoke_access">Indargabetu sarbidea niretzat</string>
<string name="room_widget_permission_display_name">Zure pantaila-izena</string>
<string name="room_widget_permission_avatar_url">Zure abatarraren URL-a</string>
<string name="room_widget_permission_user_id">Zure erabiltzaile ID-a</string>
<string name="room_widget_permission_theme">Zure gaia</string>
<string name="room_widget_permission_widget_id">Trepetaren ID-a</string>
<string name="room_widget_permission_room_id">Gelaren ID-a</string>
<string name="room_widget_resource_permission_title">Trepetak honako baliabide hauek erabili nahi ditu:</string>
<string name="room_widget_resource_grant_permission">Baimendu</string>
<string name="room_widget_resource_decline_permission">Blokeatu denak</string>
<string name="room_widget_webview_access_camera">Kamera erabili</string>
<string name="room_widget_webview_access_microphone">Mikrofonoa erabili</string>
<string name="room_widget_webview_read_protected_media">DRM bidez babestutako multimedia irakurri</string>
</resources> </resources>

View File

@ -257,11 +257,11 @@
<string name="permissions_rationale_msg_camera">Riot tarvitsee käyttöluvan kameraan ottaakseen kuvia ja suorittakseen videopuheluita.</string> <string name="permissions_rationale_msg_camera">Riot tarvitsee käyttöluvan kameraan ottaakseen kuvia ja suorittakseen videopuheluita.</string>
<string name="permissions_rationale_msg_camera_explanation">" <string name="permissions_rationale_msg_camera_explanation">"
\n \n
\nSalli kameran käyttö seuraavassa ponnahdusikkunassa soittaaksesi puhelun."</string> \nSoittaaksesi videopuhelun, salli seuraavassa ponnahdusikkunassa sovelluksen käyttää kameraa."</string>
<string name="permissions_rationale_msg_record_audio">Riot tarvitsee käyttöluvan mikrofoniin suorittakseen puheluita.</string> <string name="permissions_rationale_msg_record_audio">Riot tarvitsee käyttöluvan mikrofoniin suorittakseen puheluita.</string>
<string name="permissions_rationale_msg_record_audio_explanation">" <string name="permissions_rationale_msg_record_audio_explanation">"
\n \n
\nSalli mikrofonin käyttö seuraavassa ponnahdusikkunassa soittaaksesi puhelun."</string> \nSoittaaksesi äänipuhelun, salli seuraavassa ponnahdusikkunassa sovelluksen käyttää mikrofonia."</string>
<string name="permissions_rationale_msg_camera_and_audio">Riot tarvitsee käyttöluvan kameraan ja mikrofoniin suorittakseen videopuheluita. <string name="permissions_rationale_msg_camera_and_audio">Riot tarvitsee käyttöluvan kameraan ja mikrofoniin suorittakseen videopuheluita.
\n \n
\nSalli mikrofonin ja kameran käyttö seuraavilla näytöillä aloittaaksesi tämän puhelun.</string> \nSalli mikrofonin ja kameran käyttö seuraavilla näytöillä aloittaaksesi tämän puhelun.</string>
@ -1036,10 +1036,10 @@ Haluatko lisätä paketteja?</string>
\n%1$s</string> \n%1$s</string>
<string name="settings_troubleshoot_test_play_services_quickfix">Korjaa Play Services -palvelu</string> <string name="settings_troubleshoot_test_play_services_quickfix">Korjaa Play Services -palvelu</string>
<string name="settings_troubleshoot_test_fcm_title">Firebase-token</string> <string name="settings_troubleshoot_test_fcm_title">Firebase-tunniste</string>
<string name="settings_troubleshoot_test_fcm_success">FCM-token haettu onnistuneesti: <string name="settings_troubleshoot_test_fcm_success">FCM-tunniste haettu onnistuneesti:
\n%1$s</string> \n%1$s</string>
<string name="settings_troubleshoot_test_fcm_failed">FCM-tokenin haku epäonnistui: <string name="settings_troubleshoot_test_fcm_failed">FCM-tunnisteen haku epäonnistui:
\n%1$s</string> \n%1$s</string>
<string name="settings_troubleshoot_test_fcm_failed_too_many_registration">[%1$s] <string name="settings_troubleshoot_test_fcm_failed_too_many_registration">[%1$s]
\nTämä virhe ei ole Riotin hallinnassa ja Googlen mukaan tämä virhe tarkoittaa, että tällä laitteella on liikaa FCM:ään liittyneitä sovelluksia. Tämä virhe ilmenee vain tapauksissa, jossa on on erittäin paljon sovelluksia asennettuna, joten sen ei pitäisi vaikuttaa normaaliin käyttäjään.</string> \nTämä virhe ei ole Riotin hallinnassa ja Googlen mukaan tämä virhe tarkoittaa, että tällä laitteella on liikaa FCM:ään liittyneitä sovelluksia. Tämä virhe ilmenee vain tapauksissa, jossa on on erittäin paljon sovelluksia asennettuna, joten sen ei pitäisi vaikuttaa normaaliin käyttäjään.</string>
@ -1049,9 +1049,9 @@ Haluatko lisätä paketteja?</string>
\nTämä virhe ei ole Riotin ratkaistavissa. Tässä puhelimessa ei ole Google-tiliä. Lisää laitteeseesi Google-tili tätä toimintoa varten.</string> \nTämä virhe ei ole Riotin ratkaistavissa. Tässä puhelimessa ei ole Google-tiliä. Lisää laitteeseesi Google-tili tätä toimintoa varten.</string>
<string name="settings_troubleshoot_test_fcm_failed_account_missing_quick_fix">Lisää tili</string> <string name="settings_troubleshoot_test_fcm_failed_account_missing_quick_fix">Lisää tili</string>
<string name="settings_troubleshoot_test_token_registration_title">Tokenin rekisteröinti</string> <string name="settings_troubleshoot_test_token_registration_title">Tunnisteen rekisteröinti</string>
<string name="settings_troubleshoot_test_token_registration_success">FCM-token rekisteröity onnistuneesti kotipalvelimelle.</string> <string name="settings_troubleshoot_test_token_registration_success">FCM-tunniste rekisteröity onnistuneesti kotipalvelimelle.</string>
<string name="settings_troubleshoot_test_token_registration_failed">FCM-tokenin rekisteröinti kotipalvelimelle epäonnistui: <string name="settings_troubleshoot_test_token_registration_failed">FCM-tunnisteen rekisteröinti kotipalvelimelle epäonnistui:
\n%1$s</string> \n%1$s</string>
<string name="settings_troubleshoot_test_foreground_service_started_title">Ilmoituspalvelu</string> <string name="settings_troubleshoot_test_foreground_service_started_title">Ilmoituspalvelu</string>
@ -1479,7 +1479,7 @@ Jotta et menetä mitään, automaattiset päivitykset kannattaa pitää käytös
<string name="room_list_catchup_welcome_title">Tervetuloa kotiin!</string> <string name="room_list_catchup_welcome_title">Tervetuloa kotiin!</string>
<string name="room_list_catchup_welcome_body">Löydät täältä lukemattomat viestit</string> <string name="room_list_catchup_welcome_body">Löydät täältä lukemattomat viestit</string>
<string name="room_list_people_empty_title">Keskustelut</string> <string name="room_list_people_empty_title">Keskustelut</string>
<string name="room_list_people_empty_body">Yksityiset keskustelusi näytetään tässä</string> <string name="room_list_people_empty_body">Tässä näytetään yksityiset keskustelusi</string>
<string name="room_list_rooms_empty_title">Huoneet</string> <string name="room_list_rooms_empty_title">Huoneet</string>
<string name="room_list_rooms_empty_body">Huoneesi näytetään tässä</string> <string name="room_list_rooms_empty_body">Huoneesi näytetään tässä</string>
@ -1601,8 +1601,8 @@ Jotta et menetä mitään, automaattiset päivitykset kannattaa pitää käytös
<string name="create_room_directory_title">Huoneluettelo</string> <string name="create_room_directory_title">Huoneluettelo</string>
<string name="create_room_directory_description">Julkaise tämä huone huoneluettelossa</string> <string name="create_room_directory_description">Julkaise tämä huone huoneluettelossa</string>
<string name="alpha_disclaimer_content_line_2_gplay_colored_part">Play Storen kuvaus</string> <string name="alpha_disclaimer_content_line_2_gplay_colored_part">Play Storen kuvauksessa</string>
<string name="settings_push_rules">Push-säännöt</string> <string name="settings_push_rules">Viesti-ilmoitusten säännöt</string>
<string name="riotx_no_registration_notice">%1$s luodaksesi tilin.</string> <string name="riotx_no_registration_notice">%1$s luodaksesi tilin.</string>
<string name="disconnect">Katkaise yhteys</string> <string name="disconnect">Katkaise yhteys</string>
<string name="decline">Kieltäydy</string> <string name="decline">Kieltäydy</string>
@ -1664,7 +1664,7 @@ Jotta et menetä mitään, automaattiset päivitykset kannattaa pitää käytös
<string name="labs_allow_extended_logging">Ota yksityiskohtaiset lokit käyttöön.</string> <string name="labs_allow_extended_logging">Ota yksityiskohtaiset lokit käyttöön.</string>
<string name="error_terms_not_accepted">Yritä uudelleen, kun olet hyväksynyt kotipalvelimesi käyttöehdot.</string> <string name="error_terms_not_accepted">Yritä uudelleen, kun olet hyväksynyt kotipalvelimesi käyttöehdot.</string>
<string name="error_network_timeout">Palvelimen vastaus näyttää viipyvän. Tämä voi johtua kehnosta yhteydestä tai palvelimillamme tapahtuneesta virheestä. Yritä hetken kuluttua uudelleen.</string> <string name="error_network_timeout">Palvelimen vastaus näyttäisi olevan liian hidas. Tämä voi johtua kehnosta yhteydestä tai palvelimella olevasta ongelmasta. Yritä hetken kuluttua uudelleen.</string>
<string name="send_attachment">Lähetä liite</string> <string name="send_attachment">Lähetä liite</string>
@ -1707,6 +1707,148 @@ Jotta et menetä mitään, automaattiset päivitykset kannattaa pitää käytös
<string name="terms_description_for_identity_server">Ole löydettävissä</string> <string name="terms_description_for_identity_server">Ole löydettävissä</string>
<string name="settings_text_message_sent">Tekstiviesti on lähetetty numeroon %s. Syötä sen sisältämä varmistuskoodi.</string> <string name="settings_text_message_sent">Tekstiviesti on lähetetty numeroon %s. Syötä sen sisältämä varmistuskoodi.</string>
<string name="settings_push_rules_no_rules">Push-sääntöjä ei ole määritetty</string> <string name="settings_push_rules_no_rules">Viesti-ilmoitusten sääntöjä ei ole määritetty</string>
<string name="a11y_create_direct_message">Luo uusi yksityiskeskustelu</string> <string name="a11y_create_direct_message">Luo uusi yksityiskeskustelu</string>
<string name="resources_script">Latn</string>
<string name="revoke">Kumoa</string>
<string name="review">Tarkasta</string>
<string name="auth_add_phone_message_2">Aseta puhelinnumerosi, ja voit myöhemmin antaa muiden löytää sinut puhelinnumerosi perusteella.</string>
<string name="auth_add_email_phone_message_2">Aseta sähköpostisi tunnuksen palautusta varten. Myöhemmin voit asettaa sähköpostisi tai puhelinnumerosi löydettäviksi, jotta sinut voi löytää näillä tiedoilla.</string>
<string name="auth_add_email_and_phone_message_2">Aseta sähköpostisi tunnuksen palautusta varten. Myöhemmin voit asettaa sähköpostisi tai puhelinnumerosi löydettäviksi, jotta sinut voi löytää näillä tiedoilla.</string>
<string name="settings_add_3pid_confirm_password_title">Vahvista salasanasi</string>
<string name="settings_add_3pid_flow_not_supported">Et voi tehdä tätä mobiili-Riotista</string>
<string name="settings_add_3pid_authentication_needed">Tunnistautuminen vaaditaan</string>
<string name="settings_integrations">Integraatiot</string>
<string name="settings_integrations_summary">Käytä integraatioiden lähdettä bottien, siltojen ja tarrapakettien hallintaan.
\nIntegraatioiden lähteet vastaanottavat asetusdataa ja voivat muokata sovelmia, lähettää kutsuja huoneeseen ja muokata oikeustasoja puolestasi.</string>
<string name="settings_discovery_category">Käyttäjien etsintä</string>
<string name="settings_discovery_manage">Muokkaa etsinnän asetuksia.</string>
<string name="settings_integration_allow">Salli integraatiot</string>
<string name="settings_integration_manager">Integraatioiden lähde</string>
<string name="room_widget_activity_title">Sovelma</string>
<string name="room_widget_permission_title">Lataa sovelma</string>
<string name="room_widget_permission_added_by">Sovelman lisäsi:</string>
<string name="room_widget_permission_webview_shared_info_title">Sovelman käyttö saattaa asettaa keksejä ja jakaa tietoa kohteen %s kanssa:</string>
<string name="room_widget_permission_shared_info_title">Sovelman käyttö saattaa jakaa tietoa kohteen %s kanssa:</string>
<string name="room_widget_failed_to_load">Sovelman lataus epäonnistui.
\n%s</string>
<string name="room_widget_reload">Lataa sovelma uudelleen</string>
<string name="room_widget_open_in_browser">Avaa selaimessa</string>
<string name="room_widget_revoke_access">Kumoa minun pääsy</string>
<string name="room_widget_permission_display_name">Näyttönimesi</string>
<string name="room_widget_permission_avatar_url">Profiilikuvasi osoite</string>
<string name="room_widget_permission_user_id">Käyttäjätunnisteesi</string>
<string name="room_widget_permission_theme">Teemasi</string>
<string name="room_widget_permission_widget_id">Sovelman tunniste</string>
<string name="room_widget_permission_room_id">Huoneen tunniste</string>
<string name="room_widget_resource_permission_title">Tämä sovelma haluaa käyttää seuraavia resursseja:</string>
<string name="room_widget_resource_grant_permission">Salli</string>
<string name="room_widget_resource_decline_permission">Estä kaikki</string>
<string name="room_widget_webview_access_camera">Käytä kameraa</string>
<string name="room_widget_webview_access_microphone">Käytä mikrofonia</string>
<string name="room_widget_webview_read_protected_media">Lue DRM-suojattua mediaa</string>
<string name="integration_manager_not_configured">Ei integraatioiden lähteitä asetettuna.</string>
<string name="ignore_request_short_label">Huomiotta</string>
<string name="invalid_or_expired_credentials">Olet kirjautunut ulos epäkelpojen tai vanhentuneiden pääsytietojen takia.</string>
<string name="sas_verify_title">Varmenna vertaamalla lyhyttä tekstijonoa.</string>
<string name="sas_incoming_request_description">Varmenna tämä laite merkkaamalla se luotetuksi. Kumppaneiden laitteisiin luottaminen antaa sinulle ylimääräistä mielenrauhaa, kun käytät osapuolten välistä salausta.</string>
<string name="sas_incoming_request_description_2">Tämän laitteen varmentaminen merkkaa sen luotetuksi, ja samoin sinun laitteesi merkataan luotetuksi kumppanisi näkökulmasta.</string>
<string name="sas_emoji_description">Varmenna tämä laite varmistamalla, että seuraava emoji ilmestyy kumppanisi näytölle</string>
<string name="sas_decimal_description">Varmenna tämä laite varmistamalla, että seuraavat numerot ilmestyvät kumppanisi näytölle</string>
<string name="sas_verified_successful_description">Turvalliset viestit tämän käyttäjän kanssa ovat salattuja päästä päähän, eivätkä kolmannet osapuolet voi lukea niitä.</string>
<string name="sas_verifying_keys">Mitään ei tule näytölle\? Kaikki asiakasohjelmat eivät vielä tue interaktiivista varmennusta. Käytä vanhaa varmennustapaa.</string>
<string name="sas_legacy_verification_button_title">Käytä vanhaa varmennustapaa.</string>
<string name="sas_error_m_unknown_method">Laitteet eivät pysty sopimaan avaimista, tiivisteestä, MAC:sta tai SAS-metodista</string>
<string name="sas_error_m_mismatched_commitment">Tiivisteet eivät täsmänneet</string>
<string name="security_warning_identity_server">Vanhoissa Riotin versioissa oli tietoturvaongelma, joka saattoi antaa identiteettipalvelimelle(%1$s) pääsyn tunnukseesi. Jos luotat kohteeseen %2$s, voit jättää tämän huomiotta. Muussa tapauksessa, kirjaudu ulos ja kirjaudu uudelleen Riotiin.
\n
\nLue lisää:
\nhttps://medium.com/@RiotChat/36b4792ea0d6</string>
<string name="action_change">Muuta</string>
<string name="alpha_disclaimer_content_line_2_gplay">Viimeisin ominaisuuslista on aina %1$s. Jos löydät virheitä, lähetäthän virheraportin painikkeella, joka löytyy ylhäällä ja vasemmalla olevasta kotivalikosta, niin korjaamme vian niin nopeasti kuin pystymme.</string>
<string name="alpha_disclaimer_content_line_2_fdroid">Jos löytät virheitä, lähetäthän virheraportin ylhäältä ja vasemmalta löytyvästä kotivalikosta, niin korjaamme ongelman niin nopeasti kuin vain pystymme.</string>
<string name="import_e2e_keys_from_file">Tuo osapuolten välisen salauksen avaimet tiedostosta ”%1$s”.</string>
<string name="settings_expert">Edistynyt</string>
<string name="settings_push_gateway_no_pushers">Ei rekisteröityjä viesti-ilmoitusten yhdyskäytäviä</string>
<string name="push_gateway_item_app_id">app_id:</string>
<string name="push_gateway_item_push_key">push_key:</string>
<string name="push_gateway_item_app_display_name">app_display_name:</string>
<string name="push_gateway_item_device_name">device_name:</string>
<string name="push_gateway_item_format">Formaatti:</string>
<string name="settings_troubleshoot_test_token_registration_quick_fix">Rekisteröi tunniste</string>
<string name="store_riotx_full_description">RiotX on uusi Matrix-protokollaa (Matrix.org) käyttävä ohjelma: avointa ja hajautettua keskustelua tukeva turvallinen verkko. RiotX on täysin uusittu versio Riot Android -ohjelmasta, joka perustuu Matrix Android SDK:n uudelleenkirjoitukseen.
\n
\nHuomaa: tämä on betaversio. RiotX on vielä kehitystyössä, ja siinä on rajoitteita ja (toivottavasti ei kuitenkaan monta) bugeja. Kaikki palaute on tervetullutta!
\n
\nRiotX tukee: • Kirjaudu olemassaolevalle tunnukselle • Luo huoneita ja liity julkisiin huoneisiin • Hyväksy ja hylkää kutsuja • Listaa käyttäjän huoneet • Katso huoneen tietoja • Lähetä tekstiviestejä • Lähetä liitteitä • Lue ja kirjoita viestejä salatuissa huoneissa • Salaus: osapuolten välisen salauksen avaimien varmuuskopiointi, edistynyt laitteiden varmennus, avainten jakopyynnöt ja vastaus • Viesti-ilmoitukset • Vaalea, tumma ja musta teema
\n
\nKaikkia Riotin ominaisuuksia ei ole vielä toteutettu RiotX:ssä. Tärkeimmät puuttuvat (ja pian saapuvat!) ominaisuudet: • Tunnusten luonti • Huoneen asetukset (listaa huoneen jäsenet jne.) • Puhelut • Sovelmat • …</string>
<string name="send_file_step_encrypting_thumbnail">Salataan pikkukuvaa…</string>
<string name="send_file_step_sending_thumbnail">Lähetetään pikkukuvaa (%1$s / %2$s)</string>
<string name="room_directory_search_hint">Nimi tai tunniste (#example:matrix.org)</string>
<string name="add_by_matrix_id">Lisää Matrix-tunnisteella</string>
<string name="direct_room_no_known_users">Tuloksia ei löytynyt. Käytä ”Lisää Matrix-tunnisteella” etsiäksesi palvelimelta.</string>
<string name="direct_room_filter_hint">Suodata käyttäjätunnuksella tai tunnisteella…</string>
<string name="settings_discovery_emails_title">Etsittävät sähköpostiosoitteet</string>
<string name="settings_discovery_no_mails">Vaihtoehdot ilmestyvät, kunhan olet lisännyt sähköpostiosoitteen.</string>
<string name="settings_discovery_no_msisdn">Vaihtoehdot ilmestyvät, kunhan olet lisännyt puhelinnumeron.</string>
<string name="settings_discovery_msisdn_title">Etsittävät puhelinnumerot</string>
<string name="labs_allow_extended_logging_summary">Runsassanaiset lokit auttavat antamalla enemmän tietoa kehittäjille, kun lähetät virheilmoituksen. Vaikka runsaammat lokit ovat käytössä, sovellus ei lähetä viestien sisältöjä tai mitään muuta yksityistä tietoa.</string>
<string name="a11y_open_drawer">Avaa navigaatiovalikko</string>
<string name="a11y_create_menu_open">Avaa huoneen luontivalikko</string>
<string name="a11y_create_menu_close">Sulje huoneen luontivalikko…</string>
<string name="a11y_close_keys_backup_banner">Sulje avainten varmuuskopion mainos</string>
<string name="error_file_too_big">Tiedosto ”%s$s” (%2$s) on liian iso lähetettäväksi. Raja on %3$s.</string>
<string name="attachment_type_contact">Yhteystieto</string>
<string name="attachment_type_audio">Ääni</string>
<string name="error_handling_incoming_share">Jakotiedon käsittely epäonnistui</string>
<string name="report_content_custom">Muokattu ilmianto</string>
<string name="report_content_custom_title">Ilmianna tämä sisältö</string>
<string name="report_content_custom_hint">Sisällön ilmiannon syy</string>
<string name="report_content_custom_submit">ILMIANNA</string>
<string name="block_user">ESTÄ KÄYTTÄJÄ</string>
<string name="content_reported_title">Sisältö ilmiannettu</string>
<string name="content_reported_content">Tämä sisältö on ilmiannettu.
\n
\nJos et halua nähdä enempää sisältöä tältä käyttäjältä, voit estää hänet piilottaaksesi hänen viestit</string>
<string name="content_reported_as_spam_title">Ilmiannettu roskapostina</string>
<string name="content_reported_as_spam_content">Tämä sisältö on ilmiannettu roskapostina.
\n
\nJos et halua nähdä enempää sisältöä tältä käyttäjältä, voit estää hänet piilottaaksesi hänen viestit</string>
<string name="content_reported_as_inappropriate_title">Ilmiannettu epäsopivana</string>
<string name="content_reported_as_inappropriate_content">Tämä sisältö on ilmiannettu epäsopivana.
\n
\nJos et halua nähdä enempää sisältöä tältä käyttäjältä, voit estää hänet piilottaaksesi hänen viestit</string>
<string name="permissions_rationale_msg_keys_backup_export">Riot tarvitsee oikeuden tallentaakseen osapuolten välisen salauksen avaimesi talteen.
\n
\nSalli pääsy tiedostoihin seuraavassa ponnahdusikkunassa, jotta voit viedä avaimesi käsin.</string>
</resources> </resources>

View File

@ -1709,7 +1709,7 @@ Si vous navez pas configuré de nouvelle méthode de récupération, un attaq
<string name="error_terms_not_accepted">Réessayez quand vous aurez accepté les termes et conditions de votre serveur daccueil.</string> <string name="error_terms_not_accepted">Réessayez quand vous aurez accepté les termes et conditions de votre serveur daccueil.</string>
<string name="error_network_timeout">On dirait que le serveur mette trop de temps à répondre. Ça peut être dû à une mauvaise connexion ou à une erreur avec nos serveurs. Réessayez plus tard.</string> <string name="error_network_timeout">On dirait que le serveur met trop de temps à répondre. Ça peut être dû à une mauvaise connexion ou à une erreur avec le serveur. Réessayez plus tard.</string>
<string name="send_attachment">Envoyer une pièce jointe</string> <string name="send_attachment">Envoyer une pièce jointe</string>
@ -1770,4 +1770,39 @@ Si vous navez pas configuré de nouvelle méthode de récupération, un attaq
<string name="no_network_indicator">Il ny a aucune connexion au réseau pour le moment</string> <string name="no_network_indicator">Il ny a aucune connexion au réseau pour le moment</string>
<string name="settings_add_3pid_confirm_password_title">Confirmez votre mot de passe</string>
<string name="settings_add_3pid_flow_not_supported">Vous ne pouvez pas faire cela depuis Riot mobile</string>
<string name="settings_add_3pid_authentication_needed">Une authentification est nécessaire</string>
<string name="settings_integrations">Intégrations</string>
<string name="settings_integrations_summary">Utilisez un gestionnaire dintégrations pour gérer les bots, les passerelles, les widgets et les packs de stickers.
\nLes gestionnaires dintégrations reçoivent des données de configuration et peuvent modifier des widgets, envoyer des invitations de salon et définir des rangs à votre place.</string>
<string name="settings_integration_allow">Autoriser les intégrations</string>
<string name="room_widget_activity_title">Widget</string>
<string name="room_widget_permission_title">Charger un widget</string>
<string name="room_widget_permission_added_by">Ce widget a été ajouté par :</string>
<string name="room_widget_permission_webview_shared_info_title">Son utilisation peut entraîner lutilisation de cookies et le partage de données avec %s :</string>
<string name="room_widget_permission_shared_info_title">Son utilisation peut entraîner le partage de données avec %s :</string>
<string name="room_widget_failed_to_load">Échec de chargement du widget.
\n%s</string>
<string name="room_widget_reload">Recharger le widget</string>
<string name="room_widget_open_in_browser">Ouvrir dans le navigateur</string>
<string name="room_widget_revoke_access">Révoquer laccès pour moi</string>
<string name="room_widget_permission_display_name">Votre nom affiché</string>
<string name="room_widget_permission_avatar_url">LURL de votre avatar</string>
<string name="room_widget_permission_user_id">Votre identifiant utilisateur</string>
<string name="room_widget_permission_theme">Votre thème</string>
<string name="room_widget_permission_widget_id">Lidentifiant du widget</string>
<string name="room_widget_permission_room_id">Lidentifiant du salon</string>
<string name="room_widget_resource_permission_title">Ce widget veut utiliser les ressources suivantes :</string>
<string name="room_widget_resource_grant_permission">Autoriser</string>
<string name="room_widget_resource_decline_permission">Tout bloquer</string>
<string name="room_widget_webview_access_camera">Utiliser la caméra</string>
<string name="room_widget_webview_access_microphone">Utiliser le micro</string>
<string name="room_widget_webview_read_protected_media">Lire des médias protégés par des DRM</string>
</resources> </resources>

View File

@ -1769,4 +1769,40 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró
<string name="no_network_indicator">Jelenleg nincs hálózati kapcsolat</string> <string name="no_network_indicator">Jelenleg nincs hálózati kapcsolat</string>
<string name="settings_add_3pid_confirm_password_title">Jelszó megerősítés</string>
<string name="settings_add_3pid_flow_not_supported">Riot mobilról ezt nem teheted meg</string>
<string name="settings_add_3pid_authentication_needed">Azonosítás szükséges</string>
<string name="settings_integrations">Integrációk</string>
<string name="settings_integrations_summary">Botok, hidak, kisalkalmazások és matrica csomagok kezeléséhez használj Integrációs Menedzsert.
\n
\nIntegrációs Menedzser megkapja a konfigurációt, módosíthat kisalkalmazásokat, szobához meghívót küldhet és a hozzáférési szintet beállíthatja helyetted.</string>
<string name="settings_integration_allow">Integrációk engedélyezése</string>
<string name="room_widget_activity_title">Kisalkalmazás</string>
<string name="room_widget_permission_title">Kisalkalmazás betöltése</string>
<string name="room_widget_permission_added_by">Ezt a kisalkalmazást hozzáadta:</string>
<string name="room_widget_permission_webview_shared_info_title">A használatához lehet, hogy sütiket kell használni és adat lesz megosztva ezzel: %s:</string>
<string name="room_widget_permission_shared_info_title">A használatához lehet, hogy adat lesz megosztva ezzel: %s:</string>
<string name="room_widget_failed_to_load">Kisalkalmazás betöltése sikertelen:
\n%s</string>
<string name="room_widget_reload">Kisalkalmazás újratöltése</string>
<string name="room_widget_open_in_browser">Megnyitás böngészőben</string>
<string name="room_widget_revoke_access">Hozzáférés megvonása magamtól</string>
<string name="room_widget_permission_display_name">Megjelenítési neved</string>
<string name="room_widget_permission_avatar_url">Profilképed URL-je</string>
<string name="room_widget_permission_user_id">Felhasználói azonosítód</string>
<string name="room_widget_permission_theme">Témád</string>
<string name="room_widget_permission_widget_id">Kisalkalmazás azon.</string>
<string name="room_widget_permission_room_id">Szoba azonosító</string>
<string name="room_widget_resource_permission_title">Ez a kisalkalmazás az alábbi erőforrásokat szeretné használni:</string>
<string name="room_widget_resource_grant_permission">Engedélyez</string>
<string name="room_widget_resource_decline_permission">Mind tiltása</string>
<string name="room_widget_webview_access_camera">Kamera használata</string>
<string name="room_widget_webview_access_microphone">Mikrofon használata</string>
<string name="room_widget_webview_read_protected_media">DRM-mel védett média olvasása</string>
</resources> </resources>

View File

@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?>
<resources> <resources>
<string name="resources_language">in</string> <string name="resources_language">id</string>
<string name="resources_country_code">ID</string> <string name="resources_country_code">ID</string>
<string name="title_activity_home">Pesan</string> <string name="title_activity_home">Pesan</string>

File diff suppressed because it is too large Load Diff

View File

@ -1158,7 +1158,7 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
<string name="passphrase_empty_error_message">Ju lutemi, jepni një frazëkalim</string> <string name="passphrase_empty_error_message">Ju lutemi, jepni një frazëkalim</string>
<string name="passphrase_passphrase_too_weak">Frazëkalimi është shumë i dobët</string> <string name="passphrase_passphrase_too_weak">Frazëkalimi është shumë i dobët</string>
<string name="keys_backup_passphrase_not_empty_error_message">Ju lutemi, fshini frazëkalimin, nëse doni që Riot-i të prodhojë një kyç rikthimesh.</string> <string name="keys_backup_passphrase_not_empty_error_message">Ju lutemi, fshini frazëkalimin, nëse doni që Riot-i të prodhojë një kyç rimarrjesh.</string>
<string name="keys_backup_no_session_error">Ska sesione Matrix të gatshëm</string> <string name="keys_backup_no_session_error">Ska sesione Matrix të gatshëm</string>
<string name="keys_backup_setup_step1_title">Mos humbni kurrë mesazhe të fshehtëzuar</string> <string name="keys_backup_setup_step1_title">Mos humbni kurrë mesazhe të fshehtëzuar</string>
@ -1167,16 +1167,16 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
\nBëni një kopjeruajtje të sigurt të kyçeve tuaj, për të shmangur humbjen e tyre.</string> \nBëni një kopjeruajtje të sigurt të kyçeve tuaj, për të shmangur humbjen e tyre.</string>
<string name="keys_backup_setup_step2_button_title">Caktoni Frazëkalim</string> <string name="keys_backup_setup_step2_button_title">Caktoni Frazëkalim</string>
<string name="keys_backup_setup_step3_button_title">U bë</string> <string name="keys_backup_setup_step3_button_title">U bë</string>
<string name="keys_backup_setup_step3_copy_button_title">Ruani Kyç Rikthimesh</string> <string name="keys_backup_setup_step3_copy_button_title">Ruani Kyç Rimarrjesh</string>
<string name="keys_backup_setup_step3_save_button_title">Ruaje si Skedë</string> <string name="keys_backup_setup_step3_save_button_title">Ruaje si Skedë</string>
<string name="recovery_key_export_saved_as_warning">Kyçi i rikthimeve u ruajt te \'%s\'. <string name="recovery_key_export_saved_as_warning">Kyçi i rimarrjeve u ruajt te \'%s\'.
\n \n
\nKujdes: kjo kartelë mund të fshihet, nëse çinstalohet aplikacioni.</string> \nKujdes: kjo kartelë mund të fshihet, nëse çinstalohet aplikacioni.</string>
<string name="keys_backup_setup_step3_please_make_copy">Ju lutemi, bëni një kopje</string> <string name="keys_backup_setup_step3_please_make_copy">Ju lutemi, bëni një kopje</string>
<string name="keys_backup_setup_step3_share_intent_chooser_title">Jepjani kyçin e rikthimeve…</string> <string name="keys_backup_setup_step3_share_intent_chooser_title">Jepjani kyçin e rimarrjeve…</string>
<string name="keys_backup_setup_step3_generating_key_status">Po prodhohet Kyç Rikthimesh duke përdorur frazëkalim, ky proces mund të hajë disa sekonda.</string> <string name="keys_backup_setup_step3_generating_key_status">Po prodhohet Kyç Rimarrjesh duke përdorur frazëkalim, ky proces mund të hajë disa sekonda.</string>
<string name="recovery_key">Kyç Rikthimesh</string> <string name="recovery_key">Kyç Rimarrjesh</string>
<string name="unexpected_error">Gabim i papritur</string> <string name="unexpected_error">Gabim i papritur</string>
<string name="keys_backup_setup_backup_started_title">Nisi Kopjeruajtja</string> <string name="keys_backup_setup_backup_started_title">Nisi Kopjeruajtja</string>
<string name="keys_backup_setup_backup_started_message">Te shërbyesi juaj Home, tani po krijohet në prapaskenë kopjeruajtje e kyçeve tuaj të fshehtëzimit. Kopjeruajtja fillestare mund të dojë disa minuta.</string> <string name="keys_backup_setup_backup_started_message">Te shërbyesi juaj Home, tani po krijohet në prapaskenë kopjeruajtje e kyçeve tuaj të fshehtëzimit. Kopjeruajtja fillestare mund të dojë disa minuta.</string>
@ -1186,23 +1186,23 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
<string name="keys_backup_setup_skip_msg">Nëse dilni nga llogaria, ose nëse humbni pajisjen tuaj, mund të humbni hyrjen në mesazhet tuaj.</string> <string name="keys_backup_setup_skip_msg">Nëse dilni nga llogaria, ose nëse humbni pajisjen tuaj, mund të humbni hyrjen në mesazhet tuaj.</string>
<string name="keys_backup_restore_is_getting_backup_version">Po sillet version kopjeruajtjeje…</string> <string name="keys_backup_restore_is_getting_backup_version">Po sillet version kopjeruajtjeje…</string>
<string name="keys_backup_restore_with_passphrase">Që të shkyçni historikun e mesazheve tuaj të sigurt, përdorni frazëkalimin tuaj të rikthimeve</string> <string name="keys_backup_restore_with_passphrase">Që të shkyçni historikun e mesazheve tuaj të sigurt, përdorni frazëkalimin tuaj të rimarrjeve</string>
<string name="keys_backup_restore_use_recovery_key">përdorni kyçin tuaj të rikthimeve</string> <string name="keys_backup_restore_use_recovery_key">përdorni kyçin tuaj të rimarrjeve</string>
<string name="keys_backup_restore_with_passphrase_helper_with_link">Sdihet frazëkalimi juaj i rikthimeve, mundeni të %s.</string> <string name="keys_backup_restore_with_passphrase_helper_with_link">Sdihet frazëkalimi juaj i rimarrjeve, mundeni të %s.</string>
<string name="keys_backup_restore_with_recovery_key">Përdorni Kyçin tuaj të Rikthimeve për të shkyçur historikun tuaj të mesazheve të sigurt</string> <string name="keys_backup_restore_with_recovery_key">Përdorni Kyçin tuaj të Rimarrjeve për të shkyçur historikun tuaj të mesazheve të sigurt</string>
<string name="keys_backup_restore_key_enter_hint">Jepni Kyç Rikthimesh</string> <string name="keys_backup_restore_key_enter_hint">Jepni Kyç Rimarrjesh</string>
<string name="keys_backup_restore_setup_recovery_key">Rikthim Mesazhesh</string> <string name="keys_backup_restore_setup_recovery_key">Rimarrje Mesazhesh</string>
<string name="keys_backup_restore_with_key_helper">Humbët kyçin tuaj të rikthimeve? Te rregullimet mund të caktoni një të ri.</string> <string name="keys_backup_restore_with_key_helper">Humbët kyçin tuaj të rimarrjeve\? Te rregullimet mund të caktoni një të ri.</string>
<string name="keys_backup_passphrase_error_decrypt">Su shfshehtëzua dot kopjeruajtja me këtë frazëkalim: ju lutemi, verifikoni që dhatë frazëkalimin e duhur të rikthimeve.</string> <string name="keys_backup_passphrase_error_decrypt">Su shfshehtëzua dot kopjeruajtja me këtë frazëkalim: ju lutemi, verifikoni që dhatë frazëkalimin e duhur të rimarrjeve.</string>
<string name="network_error_please_check_and_retry">Gabim lidhjeje: ju lutemi, kontrolloni lidhjen tuaj dhe riprovoni.</string> <string name="network_error_please_check_and_retry">Gabim lidhjeje: ju lutemi, kontrolloni lidhjen tuaj dhe riprovoni.</string>
<string name="keys_backup_restoring_waiting_message">Po rikthehet kopjeruajtja:</string> <string name="keys_backup_restoring_waiting_message">Po rikthehet kopjeruajtja:</string>
<string name="keys_backup_unlock_button">Shkyçeni Historikun</string> <string name="keys_backup_unlock_button">Shkyçeni Historikun</string>
<string name="keys_backup_recovery_code_empty_error_message">Ju lutemi, jepni një kyç rikthimesh</string> <string name="keys_backup_recovery_code_empty_error_message">Ju lutemi, jepni një kyç rimarrjesh</string>
<string name="keys_backup_recovery_code_error_decrypt">Su shfshehtëzua dot kopjeruajtja me këtë kyç: ju lutemi, verifikoni që dhatë kyçin e duhur të rikthimeve.</string> <string name="keys_backup_recovery_code_error_decrypt">Su shfshehtëzua dot kopjeruajtja me këtë kyç: ju lutemi, verifikoni që dhatë kyçin e duhur të rimarrjeve.</string>
<string name="keys_backup_restore_success_title">Kopjeruajtja u Rikthye %s !</string> <string name="keys_backup_restore_success_title">Kopjeruajtja u Rikthye %s !</string>
<string name="keys_backup_restore_success_description">U rikthyen %1$d kyçe sesioni, dhe u shtuan %2$d kyç(e) të rinj që nuk njiheshin nga kjo pajisje</string> <string name="keys_backup_restore_success_description">U rikthyen %1$d kyçe sesioni, dhe u shtuan %2$d kyç(e) të rinj që nuk njiheshin nga kjo pajisje</string>
@ -1239,7 +1239,7 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
<string name="keys_backup_settings_delete_backup_error">Sarrihet të fshihet kopjeruajtje (%s)</string> <string name="keys_backup_settings_delete_backup_error">Sarrihet të fshihet kopjeruajtje (%s)</string>
<string name="keys_backup_settings_delete_confirm_title">Fshije Kopjeruajtjen</string> <string name="keys_backup_settings_delete_confirm_title">Fshije Kopjeruajtjen</string>
<string name="keys_backup_settings_delete_confirm_message">Të fshihen nga shërbyesi kyçet tuaj të kopjeruajtur të fshehtëzimit? Sdo të jeni më në gjendje të përdorni kyçin tuaj të rikthimeve për lexim historiku mesazhesh të fshehtëzuar.</string> <string name="keys_backup_settings_delete_confirm_message">Të fshihen nga shërbyesi kyçet tuaj të kopjeruajtur të fshehtëzimit\? Sdo të jeni më në gjendje të përdorni kyçin tuaj të rimarrjeve për lexim historiku mesazhesh të fshehtëzuar.</string>
<string name="sign_out_bottom_sheet_warning_no_backup">Nëse dilni tani nga llogaria, do të humbni mesazhet tuaj të fshehtëzuar</string> <string name="sign_out_bottom_sheet_warning_no_backup">Nëse dilni tani nga llogaria, do të humbni mesazhet tuaj të fshehtëzuar</string>
<string name="sign_out_bottom_sheet_warning_backing_up">Kopjeruajtja e kyçeve po kryhet. Nëse dilni tani nga llogaria, do të humbni hyrjen te mesazhet tuaj të fshehtëzuar.</string> <string name="sign_out_bottom_sheet_warning_backing_up">Kopjeruajtja e kyçeve po kryhet. Nëse dilni tani nga llogaria, do të humbni hyrjen te mesazhet tuaj të fshehtëzuar.</string>
@ -1257,7 +1257,7 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
<string name="action_sign_out_confirmation_simple">Jeni i sigurt se doni të dilni?</string> <string name="action_sign_out_confirmation_simple">Jeni i sigurt se doni të dilni?</string>
<string name="settings_data_save_mode_summary">Mënyra e ruajtjes së të dhënave aplikon një filtër specifik, që kështu përditësimet rreth pranish dhe njoftime mbi shtypje në tastierë lihen jashtë.</string> <string name="settings_data_save_mode_summary">Mënyra e ruajtjes së të dhënave aplikon një filtër specifik, që kështu përditësimet rreth pranish dhe njoftime mbi shtypje në tastierë lihen jashtë.</string>
<string name="encryption_message_recovery">Rikthim Mesazhesh të Fshehtëzuar</string> <string name="encryption_message_recovery">Rimarrje Mesazhesh të Fshehtëzuar</string>
<string name="error_empty_field_enter_user_name">Ju lutemi, jepni emër përdoruesi.</string> <string name="error_empty_field_enter_user_name">Ju lutemi, jepni emër përdoruesi.</string>
<string name="keys_backup_setup">Fillo të përdorësh Kopjeruajtje Kyçesh</string> <string name="keys_backup_setup">Fillo të përdorësh Kopjeruajtje Kyçesh</string>
<string name="keys_backup_setup_step1_advanced">(Të mëtejshme)</string> <string name="keys_backup_setup_step1_advanced">(Të mëtejshme)</string>
@ -1268,13 +1268,13 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
\n \n
\nPër maksimumin e sigurisë, ky duhet të jetë i ndryshëm nga fjalëkalimi juaj për llogarinë.</string> \nPër maksimumin e sigurisë, ky duhet të jetë i ndryshëm nga fjalëkalimi juaj për llogarinë.</string>
<string name="keys_backup_setup_creating_backup">Po Krijohet Kopjeruajtje</string> <string name="keys_backup_setup_creating_backup">Po Krijohet Kopjeruajtje</string>
<string name="keys_backup_setup_step1_recovery_key_alternative">Ose, sigurojeni kopjeruajtjen tuaj me një Kyç Rikthimesh, duke e ruajtur këtë diku të parrezikuar.</string> <string name="keys_backup_setup_step1_recovery_key_alternative">Ose, sigurojeni kopjeruajtjen tuaj me një Kyç Rimarrjesh, duke e ruajtur këtë diku të parrezikuar.</string>
<string name="keys_backup_setup_step2_skip_button_title">(Të mëtejshme) Rregullojeni me një Kyç Rikthimesh</string> <string name="keys_backup_setup_step2_skip_button_title">(Të mëtejshme) Rregullojeni me një Kyç Rimarrjesh</string>
<string name="keys_backup_setup_step3_success_title">Sukses!</string> <string name="keys_backup_setup_step3_success_title">Sukses!</string>
<string name="keys_backup_setup_step3_text_line1">Kyçet tuaj po kopjeruhen.</string> <string name="keys_backup_setup_step3_text_line1">Kyçet tuaj po kopjeruhen.</string>
<string name="keys_backup_setup_step3_text_line2">Kyçi juaj i rikthimeve është një lloj rrjeti sigurie - mund ta përdorni për të rifituar hyrje te mesazhet tuaj të fshehtëzuar, nëse harroni frazëkalimin tuaj. <string name="keys_backup_setup_step3_text_line2">Kyçi juaj i rimarrjeve është një lloj mase sigurie - mund ta përdorni për të rifituar hyrje te mesazhet tuaj të fshehtëzuar, nëse harroni frazëkalimin tuaj.
\nMbajeni kyçin tuaj të rikthimeve diku shumë të sigurt, bie fjala, nën një përgjegjës fjalëkalimesh (ose në një kasafortë)</string> \nMbajeni kyçin tuaj të rimarrjeve diku shumë të sigurt, bie fjala, nën një përgjegjës fjalëkalimesh (ose në një kasafortë)</string>
<string name="keys_backup_setup_step3_text_line2_no_passphrase">Mbajeni kyçin tuaj të rikthimeve diku në një vend shumë të sigurt, bie fjala, nën një përgjegjës fjalëkalimesh (ose në një kasafortë)</string> <string name="keys_backup_setup_step3_text_line2_no_passphrase">Mbajeni kyçin tuaj të rimarrjeve diku në një vend shumë të sigurt, bie fjala, nën një përgjegjës fjalëkalimesh (ose në një kasafortë)</string>
<string name="keys_backup_setup_step3_button_title_no_passphrase">Bëra një kopje</string> <string name="keys_backup_setup_step3_button_title_no_passphrase">Bëra një kopje</string>
<string name="keys_backup_setup_step3_share_recovery_file">Ndajeni me të tjerë</string> <string name="keys_backup_setup_step3_share_recovery_file">Ndajeni me të tjerë</string>
<string name="keys_backup_banner_setup_line1">Mos humbni kurrë mesazhe të fshehtëzuar</string> <string name="keys_backup_banner_setup_line1">Mos humbni kurrë mesazhe të fshehtëzuar</string>
@ -1310,14 +1310,14 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
<string name="settings_fail_to_update_password_invalid_current_password">Fjalëkalimi sështë i vlefshëm</string> <string name="settings_fail_to_update_password_invalid_current_password">Fjalëkalimi sështë i vlefshëm</string>
<string name="passwords_do_not_match">Fjalëkalimet spërputhen</string> <string name="passwords_do_not_match">Fjalëkalimet spërputhen</string>
<string name="keys_backup_restoring_computing_key_waiting_message">Po përllogariten kyçe rikthimesh…</string> <string name="keys_backup_restoring_computing_key_waiting_message">Po përllogariten kyçe rimarrjesh…</string>
<string name="keys_backup_restoring_downloading_backup_waiting_message">Po shkarkohen kyçe…</string> <string name="keys_backup_restoring_downloading_backup_waiting_message">Po shkarkohen kyçe…</string>
<string name="keys_backup_restoring_importing_keys_waiting_message">Po importohen kyçe…</string> <string name="keys_backup_restoring_importing_keys_waiting_message">Po importohen kyçe…</string>
<string name="keys_backup_settings_untrusted_backup">Që të përdorni Kopjeruajtje Kyçesh në këtë pajisje, rikthejeni tani përmes frazëkalimit tuaj ose kyçit të rikthimeve.</string> <string name="keys_backup_settings_untrusted_backup">Që të përdorni Kopjeruajtje Kyçesh në këtë pajisje, rikthejeni tani përmes frazëkalimit tuaj ose kyçit të rimarrjeve.</string>
<string name="new_recovery_method_popup_title">Kopjeruajtje e Re Kyçesh</string> <string name="new_recovery_method_popup_title">Kopjeruajtje e Re Kyçesh</string>
<string name="new_recovery_method_popup_description">U pikas një kopjeruajtje e re kyçesh mesazhesh të sigurt. <string name="new_recovery_method_popup_description">U pikas një kopjeruajtje e re kyçesh mesazhesh të sigurt.
\n \n
\nNëse metodën e re të rikthimeve nuk e caktuat ju, dikush mund të jetë duke u rrekur të hyjë në llogarinë tuaj. Ndryshoni menjëherë fjalëkalimin e llogarisë tuaj dhe caktoni një metodë të re rikthimesh, te Rregullimet.</string> \nNëse metodën e re të rimarrjeve nuk e caktuat ju, dikush mund të jetë duke u rrekur të hyjë në llogarinë tuaj. Ndryshoni menjëherë fjalëkalimin e llogarisë tuaj dhe caktoni një metodë të re rimarrjesh, te Rregullimet.</string>
<string name="new_recovery_method_popup_was_me">Unë qeshë</string> <string name="new_recovery_method_popup_was_me">Unë qeshë</string>
<string name="autodiscover_invalid_response">Përgjigje e pavlefshme zbulimi shërbyesi Home</string> <string name="autodiscover_invalid_response">Përgjigje e pavlefshme zbulimi shërbyesi Home</string>
<string name="autodiscover_well_known_autofill_dialog_title">Mundësi Vetëplotësimi Shërbyesi</string> <string name="autodiscover_well_known_autofill_dialog_title">Mundësi Vetëplotësimi Shërbyesi</string>
@ -1435,7 +1435,7 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
<string name="room_list_catchup_welcome_title">Mirë se vini në vatër!</string> <string name="room_list_catchup_welcome_title">Mirë se vini në vatër!</string>
<string name="room_list_catchup_welcome_body">Mbaroni punë me mesazhet e palexuara</string> <string name="room_list_catchup_welcome_body">Mbaroni punë me mesazhet e palexuara</string>
<string name="room_list_people_empty_title">Biseda</string> <string name="room_list_people_empty_title">Biseda</string>
<string name="room_list_people_empty_body">Biseda përmes mesazhesh të drejtpërdrejta do të shfaqet këtu</string> <string name="room_list_people_empty_body">Biseda përmes mesazhesh të drejtpërdrejta do të shfaqen këtu</string>
<string name="room_list_rooms_empty_title">Dhoma</string> <string name="room_list_rooms_empty_title">Dhoma</string>
<string name="room_list_rooms_empty_body">Dhomat tuaja do të shfaqen këtu</string> <string name="room_list_rooms_empty_body">Dhomat tuaja do të shfaqen këtu</string>
@ -1601,7 +1601,7 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
<string name="auth_add_email_message_2">Caktoni një email për rimarrje llogarie, dhe më vonë të jetë i zbulueshëm (opsionale) nga persona që ju njohin.</string> <string name="auth_add_email_message_2">Caktoni një email për rimarrje llogarie, dhe më vonë të jetë i zbulueshëm (opsionale) nga persona që ju njohin.</string>
<string name="auth_add_phone_message_2">Caktoni një telefon, dhe më vonë të jetë i zbulueshëm (opsionale) nga persona që ju njohin.</string> <string name="auth_add_phone_message_2">Caktoni një telefon, dhe më vonë të jetë i zbulueshëm (opsionale) nga persona që ju njohin.</string>
<string name="auth_add_email_phone_message_2">Caktoni një email për rimarrje llogarie. Përdoni email ose telefon që të jeni i zbulueshëm (opsionale) nga persona që ju njohin.</string> <string name="auth_add_email_phone_message_2">Caktoni një email për rimarrje llogarie. Përdorni email ose telefon që të jeni i zbulueshëm (opsionale) nga persona që ju njohin.</string>
<string name="auth_add_email_and_phone_message_2">Caktoni një email për rimarrje llogarie. Përdorni email ose telefon që të jeni i zbulueshëm (opsionale) nga persona që ju njohin.</string> <string name="auth_add_email_and_phone_message_2">Caktoni një email për rimarrje llogarie. Përdorni email ose telefon që të jeni i zbulueshëm (opsionale) nga persona që ju njohin.</string>
<string name="login_error_homeserver_not_found">Skapet dot shërbyes Home te kjo URL, ju lutemi, kontrollojeni</string> <string name="login_error_homeserver_not_found">Skapet dot shërbyes Home te kjo URL, ju lutemi, kontrollojeni</string>
<string name="settings_call_ringtone_use_default_stun_sum">Do të përdoret %s si ndihmë kur shërbyesi juaj Home nuk ofron të tillë (gjatë thirrjes, adresa juaj IP do të ndahet me të tjerë)</string> <string name="settings_call_ringtone_use_default_stun_sum">Do të përdoret %s si ndihmë kur shërbyesi juaj Home nuk ofron të tillë (gjatë thirrjes, adresa juaj IP do të ndahet me të tjerë)</string>
@ -1663,7 +1663,7 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
<string name="error_terms_not_accepted">Ju lutemi, riprovoni sapo të keni pranuar termat dhe kushtet e shërbyesit tuaj Home.</string> <string name="error_terms_not_accepted">Ju lutemi, riprovoni sapo të keni pranuar termat dhe kushtet e shërbyesit tuaj Home.</string>
<string name="error_network_timeout">Duket sikur shërbyesit po i duhet shumë kohë për tu përgjigjur,kjo mund të shkaktohet ose nga lidhje e dobët, ose nga një gabim me shërbyesit tanë. Ju lutemi, riprovoni pas pak.</string> <string name="error_network_timeout">Duket sikur shërbyesit po i duhet shumë kohë për tu përgjigjur,kjo mund të shkaktohet ose nga lidhje e dobët, ose nga një gabim me shërbyesin tonë. Ju lutemi, riprovoni pas pak.</string>
<string name="send_attachment">Dërgo bashkëngjitje</string> <string name="send_attachment">Dërgo bashkëngjitje</string>
@ -1721,4 +1721,40 @@ Që të garantoni se sju shpëton gjë, thjesht mbajeni të aktivizuar mekani
<string name="no_network_indicator">Tani për tani sla lidhje rrjeti</string> <string name="no_network_indicator">Tani për tani sla lidhje rrjeti</string>
<string name="settings_add_3pid_confirm_password_title">Ripohoni fjalëkalimin tuaj</string>
<string name="settings_add_3pid_flow_not_supported">Këtë se bëni dot që nga Riot-i për celular</string>
<string name="settings_add_3pid_authentication_needed">Lypset mirëfilltësim</string>
<string name="settings_integrations">Integrime</string>
<string name="settings_integrations_summary">Përdorni një Përgjegjës Integrimesh që të administroni robotë, ura, widget-e dhe paketa ngjitësish.
\nPërgjegjësit e Integrimeve marrin të dhëna formësimi dhe mund të ndryshojnë widget-e, të dërgojnë ftesa për në dhoma dhe të caktojnë shkallë pushteti në emrin tuaj.</string>
<string name="settings_integration_allow">Lejo integrim</string>
<string name="room_widget_activity_title">Widget</string>
<string name="room_widget_permission_title">Ngarko Widget</string>
<string name="room_widget_permission_added_by">Ky <em>widget</em> qe shtuar nga:</string>
<string name="room_widget_permission_webview_shared_info_title">Përdorimi i tij mund të sjellë depozitim <em>cookies</em> dhe ndarje të dhënash me %s:</string>
<string name="room_widget_permission_shared_info_title">Përdorimi i tij mund të sjellë ndarje të dhënash me %s:</string>
<string name="room_widget_failed_to_load">Su arrit të ngarkohej widget.
\n%s</string>
<string name="room_widget_reload">Ringarkoje widget-in</string>
<string name="room_widget_open_in_browser">Hape në shfletues</string>
<string name="room_widget_revoke_access">Shfuqizo hyrje për mua</string>
<string name="room_widget_permission_display_name">Emri juaj në ekran</string>
<string name="room_widget_permission_avatar_url">URL-ja e avatarit tuaj</string>
<string name="room_widget_permission_user_id">ID-ja juaj si përdorues</string>
<string name="room_widget_permission_theme">Tema juaj</string>
<string name="room_widget_permission_widget_id">ID Widget-i</string>
<string name="room_widget_permission_room_id">ID Dhome</string>
<string name="room_widget_resource_permission_title">Ky widget dëshiron të përdorë burimet vijuese:</string>
<string name="room_widget_resource_grant_permission">Lejoje</string>
<string name="room_widget_resource_decline_permission">Bllokoji Krejt</string>
<string name="room_widget_webview_access_camera">Të përdorë kamerën</string>
<string name="room_widget_webview_access_microphone">Të përdorë mikrofonin</string>
<string name="room_widget_webview_read_protected_media">Të lexojë Media të mbrojtur me DRM</string>
<string name="a11y_close_keys_backup_banner">Mbyll banderolë kopjeruajtjeje kyçesh</string>
</resources> </resources>

View File

@ -1471,4 +1471,13 @@ Riot 在后台时的工作将被显著的限制,这可能会影响消息通知
<string name="store_riotx_title">RiotX - -下一代 Matrix 客户端</string> <string name="store_riotx_title">RiotX - -下一代 Matrix 客户端</string>
<string name="edited_suffix">(已编辑)</string> <string name="edited_suffix">(已编辑)</string>
<string name="none"></string>
<string name="revoke">撤消</string>
<string name="disconnect">断开连接</string>
<string name="review">检查</string>
<string name="decline">拒绝</string>
<string name="people_no_identity_server">没有设置身份服务器。</string>
<string name="call_failed_no_ice_title">服务器的错误配置导致通话失败</string>
</resources> </resources>

View File

@ -1660,7 +1660,7 @@ Matrix 中的消息可見度類似于電子郵件。我們忘記您的郵件意
<string name="error_terms_not_accepted">請在您接受您家伺服器的條款與條件前繼續重試。</string> <string name="error_terms_not_accepted">請在您接受您家伺服器的條款與條件前繼續重試。</string>
<string name="error_network_timeout">看起來伺服器回應時間似乎太久了,這可能是不良的網路連線或我們的伺服器錯誤所造成。請稍後再試。</string> <string name="error_network_timeout">看起來伺服器回應時間似乎太久了,這可能是不良的網路連線或伺服器錯誤所造成。請稍後再試。</string>
<string name="send_attachment">傳送附件</string> <string name="send_attachment">傳送附件</string>
@ -1720,4 +1720,41 @@ Matrix 中的消息可見度類似于電子郵件。我們忘記您的郵件意
<string name="no_network_indicator">目前沒有網路連線</string> <string name="no_network_indicator">目前沒有網路連線</string>
<string name="resources_script">Latn</string>
<string name="settings_add_3pid_confirm_password_title">確認您的密碼</string>
<string name="settings_add_3pid_flow_not_supported">您無法在行動裝置上的 Riot 做這件事</string>
<string name="settings_add_3pid_authentication_needed">需要驗證</string>
<string name="settings_integrations">整合</string>
<string name="settings_integrations_summary">使用整合管理員以管理機器人、橋接、小工具與貼紙包。
\n整合管理員可以代表您接收設定資料調整小工具、傳送聊天室邀請並設定權力等級。</string>
<string name="settings_integration_allow">允許整合</string>
<string name="room_widget_activity_title">小工具</string>
<string name="room_widget_permission_title">載入小工具</string>
<string name="room_widget_permission_added_by">此小工具新增由:</string>
<string name="room_widget_permission_webview_shared_info_title">使用它可能會設定 cookies 並與 %s 分享資料:</string>
<string name="room_widget_permission_shared_info_title">使用它可能會與 %s 分享資料:</string>
<string name="room_widget_failed_to_load">載入小工具失敗。
\n%s</string>
<string name="room_widget_reload">重新載入小工具</string>
<string name="room_widget_open_in_browser">在瀏覽器中開啟</string>
<string name="room_widget_revoke_access">撤銷我的存取權限</string>
<string name="room_widget_permission_display_name">您的顯示名稱</string>
<string name="room_widget_permission_avatar_url">您的大頭貼 URL</string>
<string name="room_widget_permission_user_id">您的使用者 ID</string>
<string name="room_widget_permission_theme">您的佈景主題</string>
<string name="room_widget_permission_widget_id">小工具 ID</string>
<string name="room_widget_permission_room_id">聊天室 ID</string>
<string name="room_widget_resource_permission_title">此小工具想要使用下列資源:</string>
<string name="room_widget_resource_grant_permission">允許</string>
<string name="room_widget_resource_decline_permission">阻擋所有</string>
<string name="room_widget_webview_access_camera">使用相機</string>
<string name="room_widget_webview_access_microphone">使用麥克風</string>
<string name="room_widget_webview_read_protected_media">讀取 DRM 保護的媒體</string>
</resources> </resources>

View File

@ -5,7 +5,7 @@
<string name="resources_language">en</string> <string name="resources_language">en</string>
<string name="resources_country_code">US</string> <string name="resources_country_code">US</string>
<!-- Note to translators: Possible values: Latn or Cyrl --> <!-- NOTE TO TRANSLATORS: ONLY POSSIBLE VALUES: Latn OR Cyrl -->
<string name="resources_script">Latn</string> <string name="resources_script">Latn</string>
<!-- theme --> <!-- theme -->
@ -1801,4 +1801,166 @@ Not all features in Riot are implemented in RiotX yet. Main missing (and coming
<string name="no_network_indicator">There is no network connection right now</string> <string name="no_network_indicator">There is no network connection right now</string>
<string name="message_ignore_user">Block user</string>
<string name="room_list_quick_actions_notifications_all_noisy">"All messages (noisy)"</string>
<string name="room_list_quick_actions_notifications_all">"All messages"</string>
<string name="room_list_quick_actions_notifications_mentions">"Mentions only"</string>
<string name="room_list_quick_actions_notifications_mute">"Mute"</string>
<string name="room_list_quick_actions_settings">"Settings"</string>
<string name="room_list_quick_actions_leave">"Leave the room"</string>
<string name="notice_member_no_changes">"%1$s made no changes"</string>
<string name="command_description_spoiler">Sends the given message as a spoiler</string>
<string name="spoiler">Spoiler</string>
<string name="reaction_search_type_hint">Type keywords to find a reaction.</string>
<string name="no_ignored_users">You are not ignoring any users</string>
<string name="help_long_click_on_room_for_more_options">Long click on a room to see more options</string>
<string name="room_join_rules_public">%1$s made the room public to whoever knows the link.</string>
<string name="room_join_rules_invite">%1$s made the room invite only.</string>
<string name="timeline_unread_messages">Unread messages</string>
<string name="login_splash_title">Liberate your communication</string>
<string name="login_splash_text1">Chat with people directly or in groups</string>
<string name="login_splash_text2">Keep conversations private with encryption</string>
<string name="login_splash_text3">Extend &amp; customise your experience</string>
<string name="login_splash_submit">Get started</string>
<string name="login_server_title">Select a server</string>
<string name="login_server_text">Just like email, accounts have one home, although you can talk to anyone</string>
<string name="login_server_matrix_org_text">Join millions free on the largest public server</string>
<string name="login_server_modular_text">Premium hosting for organisations</string>
<string name="login_server_modular_learn_more">Learn more</string>
<string name="login_server_other_title">Other</string>
<string name="login_server_other_text">Custom &amp; advanced settings</string>
<string name="login_continue">Continue</string>
<!-- Replaced string is the homeserver url -->
<string name="login_connect_to">Connect to %1$s</string>
<string name="login_connect_to_modular">Connect to Modular</string>
<string name="login_connect_to_a_custom_server">Connect to a custom server</string>
<!-- Replaced string is the homeserver url -->
<string name="login_signin_to">Sign in to %1$s</string>
<string name="login_signup">Sign Up</string>
<string name="login_signin">Sign In</string>
<string name="login_signin_sso">Continue with SSO</string>
<string name="login_server_url_form_modular_hint">Modular Address</string>
<string name="login_server_url_form_other_hint">Address</string>
<string name="login_server_url_form_modular_text">Premium hosting for organisations</string>
<string name="login_server_url_form_modular_notice">Enter the address of the Modular Riot or Server you want to use</string>
<string name="login_server_url_form_other_notice">Enter the address of a server or a Riot you want to connect to</string>
<string name="login_sso_error_message">An error occurred when loading the page: %1$s (%2$d)</string>
<string name="login_mode_not_supported">The application is not able to signin to this homeserver. The homeserver supports the following signin type(s): %1$s.\n\nDo you want to signin using a web client?</string>
<string name="login_registration_disabled">Sorry, this server isnt accepting new accounts.</string>
<string name="login_registration_not_supported">The application is not able to create an account on this homeserver.\n\nDo you want to signup using a web client?</string>
<string name="login_login_with_email_error">This email is not associated to any account.</string>
<!-- Replaced string is the homeserver url -->
<string name="login_reset_password_on">Reset password on %1$s</string>
<string name="login_reset_password_notice">A verification email will be sent to your inbox to confirm setting your new password.</string>
<string name="login_reset_password_submit">Next</string>
<string name="login_reset_password_email_hint">Email</string>
<string name="login_reset_password_password_hint">New password</string>
<string name="login_reset_password_warning_title">Warning!</string>
<string name="login_reset_password_warning_content">Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.</string>
<string name="login_reset_password_warning_submit">Continue</string>
<string name="login_reset_password_error_not_found">This email is not linked to any account</string>
<string name="login_reset_password_mail_confirmation_title">Check your inbox</string>
<!-- Replaced string is an email -->
<string name="login_reset_password_mail_confirmation_notice">A verification email was sent to %1$s.</string>
<string name="login_reset_password_mail_confirmation_notice_2">Tap on the link to confirm your new password. Once you\'ve followed the link it contains, click below.</string>
<string name="login_reset_password_mail_confirmation_submit">I have verified my email address</string>
<string name="login_reset_password_success_title">Success!</string>
<string name="login_reset_password_success_notice">Your password has been reset.</string>
<string name="login_reset_password_success_notice_2">You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.</string>
<string name="login_reset_password_success_submit">Back to Sign In</string>
<string name="login_reset_password_cancel_confirmation_title">Warning</string>
<string name="login_reset_password_cancel_confirmation_content">Your password is not yet changed.\n\nStop the password change process?</string>
<string name="login_set_email_title">Set email address</string>
<string name="login_set_email_notice">Set an email to recover your account. Later, you can optionally allow people you know to discover you by your email.</string>
<string name="login_set_email_mandatory_hint">Email</string>
<string name="login_set_email_optional_hint">Email (optional)</string>
<string name="login_set_email_submit">Next</string>
<string name="login_set_msisdn_title">Set phone number</string>
<string name="login_set_msisdn_notice">Set a phone number to optionally allow people you know to discover you.</string>
<string name="login_set_msisdn_notice2">Please use the international format.</string>
<string name="login_set_msisdn_mandatory_hint">Phone number</string>
<string name="login_set_msisdn_optional_hint">Phone number (optional)</string>
<string name="login_set_msisdn_submit">Next</string>
<string name="login_msisdn_confirm_title">Confirm phone number</string>
<!-- Template will be replaced by a phone number -->
<string name="login_msisdn_confirm_notice">We just sent a code to %1$s. Enter it below to verify its you.</string>
<string name="login_msisdn_confirm_hint">Enter code</string>
<string name="login_msisdn_confirm_send_again">Send again</string>
<string name="login_msisdn_confirm_submit">Next</string>
<string name="login_msisdn_error_not_international">"International phone numbers must start with '+'"</string>
<string name="login_msisdn_error_other">"Phone number seems invalid. Please check it"</string>
<!-- Replaced string is the homeserver url -->
<string name="login_signup_to">Sign up to %1$s</string>
<string name="login_signup_username_hint">Username or email</string>
<string name="login_signup_password_hint">Password</string>
<string name="login_signup_submit">Next</string>
<string name="login_signup_error_user_in_use">That username is taken</string>
<string name="login_signup_cancel_confirmation_title">Warning</string>
<string name="login_signup_cancel_confirmation_content">Your account is not created yet.\n\nStop the registration process?</string>
<string name="login_a11y_choose_matrix_org">Select matrix.org</string>
<string name="login_a11y_choose_modular">Select modular</string>
<string name="login_a11y_choose_other">Select a custom homeserver</string>
<string name="login_a11y_captcha_container">Please perform the captcha challenge</string>
<string name="login_terms_title">Accept terms to continue</string>
<string name="login_wait_for_email_title">Please check your email</string>
<string name="login_wait_for_email_notice">We just sent an email to %1$s.\nPlease click on the link it contains to continue the account creation.</string>
<string name="login_validation_code_is_not_correct">The entered code is not correct. Please check.</string>
<string name="login_error_outdated_homeserver_title">Outdated homeserver</string>
<string name="login_error_outdated_homeserver_content">This homeserver is running too old a version to connect to. Ask your homeserver admin to upgrade.</string>
<plurals name="login_error_limit_exceeded_retry_after">
<item quantity="one">Too many requests have been sent. You can retry in %1$d second…</item>
<item quantity="other">Too many requests have been sent. You can retry in %1$d seconds…</item>
</plurals>
<string name="seen_by">Seen by</string>
<string name="signed_out_title">Youre signed out</string>
<string name="signed_out_notice">It can be due to various reasons:\n\n• Youve changed your password on another device.\n\n• You have deleted this device from another device.\n\n• The administrator of your server has invalidated your access for security reason.</string>
<string name="signed_out_submit">Sign in again</string>
<string name="soft_logout_title">Youre signed out</string>
<string name="soft_logout_signin_title">Sign in</string>
<!-- Replacement: homeserver url, user display name and userId -->
<string name="soft_logout_signin_notice">Your homeserver (%1$s) admin has signed you out of your account %2$s (%3$s).</string>
<string name="soft_logout_signin_e2e_warning_notice">Sign in to recover encryption keys stored exclusively on this device. You need them to read all of your secure messages on any device.</string>
<string name="soft_logout_signin_submit">Sign in</string>
<string name="soft_logout_signin_password_hint">Password</string>
<string name="soft_logout_clear_data_title">Clear personal data</string>
<string name="soft_logout_clear_data_notice">Warning: Your personal data (including encryption keys) is still stored on this device.\n\nClear it if youre finished using this device, or want to sign in to another account.</string>
<string name="soft_logout_clear_data_submit">Clear all data</string>
<string name="soft_logout_clear_data_dialog_title">Clear data</string>
<string name="soft_logout_clear_data_dialog_content">Clear all data currently stored on this device?\nSign in again to access your account data and messages.</string>
<string name="soft_logout_clear_data_dialog_e2e_warning_content">Youll lose access to secure messages unless you sign in to recover your encryption keys.</string>
<string name="soft_logout_clear_data_dialog_submit">Clear data</string>
<string name="soft_logout_sso_not_same_user_error">The current session is for user %1$s and you provide credentials for user %2$s. This is not supported by RiotX.\nPlease first clear data, then sign in again on another account.</string>
<string name="permalink_malformed">Your matrix.to link was malformed</string>
<string name="bug_report_error_too_short">The description is too short</string>
</resources> </resources>

View File

@ -2,166 +2,7 @@
<resources> <resources>
<!-- Strings not defined in Riot --> <!-- Strings not defined in Riot -->
<string name="message_ignore_user">Block user</string>
<string name="room_list_quick_actions_notifications_all_noisy">"All messages (noisy)"</string>
<string name="room_list_quick_actions_notifications_all">"All messages"</string>
<string name="room_list_quick_actions_notifications_mentions">"Mentions only"</string>
<string name="room_list_quick_actions_notifications_mute">"Mute"</string>
<string name="room_list_quick_actions_settings">"Settings"</string>
<string name="room_list_quick_actions_leave">"Leave the room"</string>
<string name="notice_member_no_changes">"%1$s made no changes"</string>
<string name="command_description_spoiler">Sends the given message as a spoiler</string>
<string name="spoiler">Spoiler</string>
<string name="reaction_search_type_hint">Type keywords to find a reaction.</string>
<string name="no_ignored_users">You are not ignoring any users</string>
<string name="help_long_click_on_room_for_more_options">Long click on a room to see more options</string>
<string name="room_join_rules_public">%1$s made the room public to whoever knows the link.</string>
<string name="room_join_rules_invite">%1$s made the room invite only.</string>
<string name="timeline_unread_messages">Unread messages</string>
<string name="login_splash_title">Liberate your communication</string>
<string name="login_splash_text1">Chat with people directly or in groups</string>
<string name="login_splash_text2">Keep conversations private with encryption</string>
<string name="login_splash_text3">Extend &amp; customise your experience</string>
<string name="login_splash_submit">Get started</string>
<string name="login_server_title">Select a server</string>
<string name="login_server_text">Just like email, accounts have one home, although you can talk to anyone</string>
<string name="login_server_matrix_org_text">Join millions free on the largest public server</string>
<string name="login_server_modular_text">Premium hosting for organisations</string>
<string name="login_server_modular_learn_more">Learn more</string>
<string name="login_server_other_title">Other</string>
<string name="login_server_other_text">Custom &amp; advanced settings</string>
<string name="login_continue">Continue</string>
<!-- Replaced string is the homeserver url -->
<string name="login_connect_to">Connect to %1$s</string>
<string name="login_connect_to_modular">Connect to Modular</string>
<string name="login_connect_to_a_custom_server">Connect to a custom server</string>
<!-- Replaced string is the homeserver url -->
<string name="login_signin_to">Sign in to %1$s</string>
<string name="login_signup">Sign Up</string>
<string name="login_signin">Sign In</string>
<string name="login_signin_sso">Continue with SSO</string>
<string name="login_server_url_form_modular_hint">Modular Address</string>
<string name="login_server_url_form_other_hint">Address</string>
<string name="login_server_url_form_modular_text">Premium hosting for organisations</string>
<string name="login_server_url_form_modular_notice">Enter the address of the Modular Riot or Server you want to use</string>
<string name="login_server_url_form_other_notice">Enter the address of a server or a Riot you want to connect to</string>
<string name="login_sso_error_message">An error occurred when loading the page: %1$s (%2$d)</string>
<string name="login_mode_not_supported">The application is not able to signin to this homeserver. The homeserver supports the following signin type(s): %1$s.\n\nDo you want to signin using a web client?</string>
<string name="login_registration_disabled">Sorry, this server isnt accepting new accounts.</string>
<string name="login_registration_not_supported">The application is not able to create an account on this homeserver.\n\nDo you want to signup using a web client?</string>
<string name="login_login_with_email_error">This email is not associated to any account.</string>
<!-- Replaced string is the homeserver url -->
<string name="login_reset_password_on">Reset password on %1$s</string>
<string name="login_reset_password_notice">A verification email will be sent to your inbox to confirm setting your new password.</string>
<string name="login_reset_password_submit">Next</string>
<string name="login_reset_password_email_hint">Email</string>
<string name="login_reset_password_password_hint">New password</string>
<string name="login_reset_password_warning_title">Warning!</string>
<string name="login_reset_password_warning_content">Changing your password will reset any end-to-end encryption keys on all of your devices, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another device before resetting your password.</string>
<string name="login_reset_password_warning_submit">Continue</string>
<string name="login_reset_password_error_not_found">This email is not linked to any account</string>
<string name="login_reset_password_mail_confirmation_title">Check your inbox</string>
<!-- Replaced string is an email -->
<string name="login_reset_password_mail_confirmation_notice">A verification email was sent to %1$s.</string>
<string name="login_reset_password_mail_confirmation_notice_2">Tap on the link to confirm your new password. Once you\'ve followed the link it contains, click below.</string>
<string name="login_reset_password_mail_confirmation_submit">I have verified my email address</string>
<string name="login_reset_password_success_title">Success!</string>
<string name="login_reset_password_success_notice">Your password has been reset.</string>
<string name="login_reset_password_success_notice_2">You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.</string>
<string name="login_reset_password_success_submit">Back to Sign In</string>
<string name="login_reset_password_cancel_confirmation_title">Warning</string>
<string name="login_reset_password_cancel_confirmation_content">Your password is not yet changed.\n\nStop the password change process?</string>
<string name="login_set_email_title">Set email address</string>
<string name="login_set_email_notice">Set an email to recover your account. Later, you can optionally allow people you know to discover you by your email.</string>
<string name="login_set_email_mandatory_hint">Email</string>
<string name="login_set_email_optional_hint">Email (optional)</string>
<string name="login_set_email_submit">Next</string>
<string name="login_set_msisdn_title">Set phone number</string>
<string name="login_set_msisdn_notice">Set a phone number to optionally allow people you know to discover you.</string>
<string name="login_set_msisdn_notice2">Please use the international format.</string>
<string name="login_set_msisdn_mandatory_hint">Phone number</string>
<string name="login_set_msisdn_optional_hint">Phone number (optional)</string>
<string name="login_set_msisdn_submit">Next</string>
<string name="login_msisdn_confirm_title">Confirm phone number</string>
<!-- Template will be replaced by a phone number -->
<string name="login_msisdn_confirm_notice">We just sent a code to %1$s. Enter it below to verify its you.</string>
<string name="login_msisdn_confirm_hint">Enter code</string>
<string name="login_msisdn_confirm_send_again">Send again</string>
<string name="login_msisdn_confirm_submit">Next</string>
<string name="login_msisdn_error_not_international">"International phone numbers must start with '+'"</string>
<string name="login_msisdn_error_other">"Phone number seems invalid. Please check it"</string>
<!-- Replaced string is the homeserver url -->
<string name="login_signup_to">Sign up to %1$s</string>
<string name="login_signup_username_hint">Username</string>
<string name="login_signup_password_hint">Password</string>
<string name="login_signup_submit">Next</string>
<string name="login_signup_error_user_in_use">That username is taken</string>
<string name="login_signup_cancel_confirmation_title">Warning</string>
<string name="login_signup_cancel_confirmation_content">Your account is not created yet.\n\nStop the registration process?</string>
<string name="login_a11y_choose_matrix_org">Select matrix.org</string>
<string name="login_a11y_choose_modular">Select modular</string>
<string name="login_a11y_choose_other">Select a custom homeserver</string>
<string name="login_a11y_captcha_container">Please perform the captcha challenge</string>
<string name="login_terms_title">Accept terms to continue</string>
<string name="login_wait_for_email_title">Please check your email</string>
<string name="login_wait_for_email_notice">We just sent an email to %1$s.\nPlease click on the link it contains to continue the account creation.</string>
<string name="login_validation_code_is_not_correct">The entered code is not correct. Please check.</string>
<string name="login_error_outdated_homeserver_title">Outdated homeserver</string>
<string name="login_error_outdated_homeserver_content">This homeserver is running too old a version to connect to. Ask your homeserver admin to upgrade.</string>
<plurals name="login_error_limit_exceeded_retry_after">
<item quantity="one">Too many requests have been sent. You can retry in %1$d second…</item>
<item quantity="other">Too many requests have been sent. You can retry in %1$d seconds…</item>
</plurals>
<string name="seen_by">Seen by</string>
<string name="signed_out_title">Youre signed out</string>
<string name="signed_out_notice">It can be due to various reasons:\n\n• Youve changed your password on another device.\n\n• You have deleted this device from another device.\n\n• The administrator of your server has invalidated your access for security reason.</string>
<string name="signed_out_submit">Sign in again</string>
<string name="soft_logout_title">Youre signed out</string>
<string name="soft_logout_signin_title">Sign in</string>
<!-- Replacement: homeserver url, user display name and userId -->
<string name="soft_logout_signin_notice">Your homeserver (%1$s) admin has signed you out of your account %2$s (%3$s).</string>
<string name="soft_logout_signin_e2e_warning_notice">Sign in to recover encryption keys stored exclusively on this device. You need them to read all of your secure messages on any device.</string>
<string name="soft_logout_signin_submit">Sign in</string>
<string name="soft_logout_signin_password_hint">Password</string>
<string name="soft_logout_clear_data_title">Clear personal data</string>
<string name="soft_logout_clear_data_notice">Warning: Your personal data (including encryption keys) is still stored on this device.\n\nClear it if youre finished using this device, or want to sign in to another account.</string>
<string name="soft_logout_clear_data_submit">Clear all data</string>
<string name="soft_logout_clear_data_dialog_title">Clear data</string>
<string name="soft_logout_clear_data_dialog_content">Clear all data currently stored on this device?\nSign in again to access your account data and messages.</string>
<string name="soft_logout_clear_data_dialog_e2e_warning_content">Youll lose access to secure messages unless you sign in to recover your encryption keys.</string>
<string name="soft_logout_clear_data_dialog_submit">Clear data</string>
<string name="soft_logout_sso_not_same_user_error">The current session is for user %1$s and you provide credentials for user %2$s. This is not supported by RiotX.\nPlease first clear data, then sign in again on another account.</string>
<string name="permalink_malformed">Your matrix.to link was malformed</string>
<string name="notification_initial_sync">Initial Sync…</string> <string name="notification_initial_sync">Initial Sync…</string>
</resources> </resources>