Merge branch 'develop' into feature/various_fixes

This commit is contained in:
Benoit Marty 2020-09-23 16:56:13 +02:00 committed by GitHub
commit 1699a57850
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 484 additions and 290 deletions

View File

@ -8,6 +8,9 @@ Improvements 🙌:
- Add "show password" in import Megolm keys dialog
- Visually disable call buttons in menu and prohibit calling when permissions are insufficient (#2112)
- Better management of requested permissions (#2048)
- Add a setting to show timestamp for all messages (#2123)
- Use cache for user color
- Allow using an outdated homeserver, at user's risk (#1972)
Bugfix 🐛:
- Long message cannot be sent/takes infinite time & blocks other messages #1397

View File

@ -17,13 +17,11 @@
package org.matrix.android.sdk.api.auth.data
// Either a list of supported login types, or an error if the homeserver is outdated
sealed class LoginFlowResult {
data class Success(
val supportedLoginTypes: List<String>,
val isLoginAndRegistrationSupported: Boolean,
val homeServerUrl: String
val homeServerUrl: String,
val isOutdatedHomeserver: Boolean
) : LoginFlowResult()
object OutdatedHomeserver : LoginFlowResult()
}

View File

@ -273,16 +273,16 @@ internal class DefaultAuthenticationService @Inject constructor(
}
private suspend fun getLoginFlowResult(authAPI: AuthAPI, versions: Versions, homeServerUrl: String): LoginFlowResult {
return if (versions.isSupportedBySdk()) {
// Get the login flow
val loginFlowResponse = executeRequest<LoginFlowResponse>(null) {
apiCall = authAPI.getLoginFlows()
}
LoginFlowResult.Success(loginFlowResponse.flows.orEmpty().mapNotNull { it.type }, versions.isLoginAndRegistrationSupportedBySdk(), homeServerUrl)
} else {
// Not supported
LoginFlowResult.OutdatedHomeserver
// Get the login flow
val loginFlowResponse = executeRequest<LoginFlowResponse>(null) {
apiCall = authAPI.getLoginFlows()
}
return LoginFlowResult.Success(
loginFlowResponse.flows.orEmpty().mapNotNull { it.type },
versions.isLoginAndRegistrationSupportedBySdk(),
homeServerUrl,
!versions.isSupportedBySdk()
)
}
override fun getRegistrationWizard(): RegistrationWizard {

View File

@ -151,21 +151,21 @@
<string name="notice_power_level_changed">%1$s alterou o nível de permissão de %2$s.</string>
<string name="notice_power_level_diff">%1$s de %2$s para %3$s</string>
<string name="initial_sync_start_importing_account">Primeira sincronização:
<string name="initial_sync_start_importing_account">Primeira sincronização:
\nImportando a conta…</string>
<string name="initial_sync_start_importing_account_crypto">Primeira sincronização:
<string name="initial_sync_start_importing_account_crypto">Primeira sincronização:
\nImportando as chaves de criptografia</string>
<string name="initial_sync_start_importing_account_rooms">Primeira sincronização:
<string name="initial_sync_start_importing_account_rooms">Primeira sincronização:
\nImportando as salas</string>
<string name="initial_sync_start_importing_account_joined_rooms">Primeira sincronização:
<string name="initial_sync_start_importing_account_joined_rooms">Primeira sincronização:
\nImportando as salas em que você entrou</string>
<string name="initial_sync_start_importing_account_invited_rooms">Primeira sincronização:
<string name="initial_sync_start_importing_account_invited_rooms">Primeira sincronização:
\nImportando as salas em que você foi convidado</string>
<string name="initial_sync_start_importing_account_left_rooms">Primeira sincronização:
<string name="initial_sync_start_importing_account_left_rooms">Primeira sincronização:
\nImportando as salas em que você saiu</string>
<string name="initial_sync_start_importing_account_groups">Primeira sincronização:
<string name="initial_sync_start_importing_account_groups">Primeira sincronização:
\nImportando as comunidades</string>
<string name="initial_sync_start_importing_account_data">Primeira sincronização:
<string name="initial_sync_start_importing_account_data">Primeira sincronização:
\nImportando os dados da conta</string>
<string name="event_status_sending_message">Enviando mensagem…</string>

View File

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

View File

@ -27,8 +27,8 @@
<string name="notice_room_ban_by_you">Du bannade %1$s</string>
<string name="notice_room_withdraw">%1$s drog tillbaka inbjudan för %2$s</string>
<string name="notice_room_withdraw_by_you">Du drog tillbaka inbjudan för %1$s</string>
<string name="notice_avatar_url_changed">%1$s ändrade sin avatar</string>
<string name="notice_avatar_url_changed_by_you">Du ändrade din avatar</string>
<string name="notice_avatar_url_changed">%1$s bytte sin avatar</string>
<string name="notice_avatar_url_changed_by_you">Du bytte din avatar</string>
<string name="notice_display_name_set">%1$s satte sitt visningsnamn till %2$s</string>
<string name="notice_display_name_set_by_you">Du satte ditt visningsnamn till %1$s</string>
<string name="notice_display_name_changed_from">%1$s bytte sitt visningsnamn från %2$s till %3$s</string>

View File

@ -27,7 +27,7 @@
<string name="verification_emoji_banana">Banan</string>
<string name="verification_emoji_apple">Äpple</string>
<string name="verification_emoji_strawberry">Jordgubbe</string>
<string name="verification_emoji_corn">Majskolv</string>
<string name="verification_emoji_corn">Majs</string>
<string name="verification_emoji_pizza">Pizza</string>
<string name="verification_emoji_cake">Tårta</string>
<string name="verification_emoji_heart">Hjärta</string>
@ -41,7 +41,7 @@
<string name="verification_emoji_umbrella">Paraply</string>
<string name="verification_emoji_hourglass">Timglas</string>
<string name="verification_emoji_clock">Klocka</string>
<string name="verification_emoji_gift">Paket</string>
<string name="verification_emoji_gift">Present</string>
<string name="verification_emoji_light_bulb">Lampa</string>
<string name="verification_emoji_book">Bok</string>
<string name="verification_emoji_pencil">Penna</string>
@ -52,7 +52,7 @@
<string name="verification_emoji_hammer">Hammare</string>
<string name="verification_emoji_telephone">Telefon</string>
<string name="verification_emoji_flag">Flagga</string>
<string name="verification_emoji_train">Ånglok</string>
<string name="verification_emoji_train">Tåg</string>
<string name="verification_emoji_bicycle">Cykel</string>
<string name="verification_emoji_aeroplane">Flygplan</string>
<string name="verification_emoji_rocket">Raket</string>

View File

@ -7,4 +7,62 @@
<string name="verification_emoji_horse"></string>
<string name="verification_emoji_unicorn">独角兽</string>
<string name="verification_emoji_pig"></string>
<string name="verification_emoji_elephant">大象</string>
<string name="verification_emoji_rabbit">兔子</string>
<string name="verification_emoji_panda">熊猫</string>
<string name="verification_emoji_rooster">公鸡</string>
<string name="verification_emoji_penguin">企鹅</string>
<string name="verification_emoji_turtle">乌龟</string>
<string name="verification_emoji_fish"></string>
<string name="verification_emoji_octopus">章鱼</string>
<string name="verification_emoji_butterfly">蝴蝶</string>
<string name="verification_emoji_flower"></string>
<string name="verification_emoji_tree"></string>
<string name="verification_emoji_cactus">仙人掌</string>
<string name="verification_emoji_mushroom">蘑菇</string>
<string name="verification_emoji_globe">地球</string>
<string name="verification_emoji_moon">月亮</string>
<string name="verification_emoji_cloud"></string>
<string name="verification_emoji_fire"></string>
<string name="verification_emoji_banana">香蕉</string>
<string name="verification_emoji_apple">苹果</string>
<string name="verification_emoji_strawberry">草莓</string>
<string name="verification_emoji_corn">玉米</string>
<string name="verification_emoji_pizza">披萨</string>
<string name="verification_emoji_cake">蛋糕</string>
<string name="verification_emoji_heart"></string>
<string name="verification_emoji_smiley">笑脸</string>
<string name="verification_emoji_robot">机器人</string>
<string name="verification_emoji_hat">帽子</string>
<string name="verification_emoji_glasses">眼镜</string>
<string name="verification_emoji_spanner">扳手</string>
<string name="verification_emoji_santa">圣诞老人</string>
<string name="verification_emoji_thumbs_up"></string>
<string name="verification_emoji_umbrella"></string>
<string name="verification_emoji_hourglass">沙漏</string>
<string name="verification_emoji_clock">时钟</string>
<string name="verification_emoji_gift">礼物</string>
<string name="verification_emoji_light_bulb">灯泡</string>
<string name="verification_emoji_book"></string>
<string name="verification_emoji_pencil">铅笔</string>
<string name="verification_emoji_paperclip">回形针</string>
<string name="verification_emoji_scissors">剪刀</string>
<string name="verification_emoji_lock"></string>
<string name="verification_emoji_key">钥匙</string>
<string name="verification_emoji_hammer">锤子</string>
<string name="verification_emoji_telephone">电话</string>
<string name="verification_emoji_flag">旗帜</string>
<string name="verification_emoji_train">火车</string>
<string name="verification_emoji_bicycle">自行车</string>
<string name="verification_emoji_aeroplane">飞机</string>
<string name="verification_emoji_rocket">火箭</string>
<string name="verification_emoji_trophy">奖杯</string>
<string name="verification_emoji_ball"></string>
<string name="verification_emoji_guitar">吉他</string>
<string name="verification_emoji_trumpet">喇叭</string>
<string name="verification_emoji_bell">铃铛</string>
<string name="verification_emoji_anchor"></string>
<string name="verification_emoji_headphones">耳机</string>
<string name="verification_emoji_folder">文件夹</string>
<string name="verification_emoji_pin">图钉</string>
</resources>

View File

@ -36,6 +36,7 @@ import im.vector.app.features.crypto.verification.IncomingVerificationRequestHan
import im.vector.app.features.grouplist.SelectedGroupDataSource
import im.vector.app.features.home.AvatarRenderer
import im.vector.app.features.home.HomeRoomListDataSource
import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider
import im.vector.app.features.html.EventHtmlRenderer
import im.vector.app.features.html.VectorHtmlCompressor
import im.vector.app.features.login.ReAuthHelper
@ -71,6 +72,8 @@ interface VectorComponent {
fun matrix(): Matrix
fun matrixItemColorProvider(): MatrixItemColorProvider
fun sessionListener(): SessionListener
fun currentSession(): Session

View File

@ -1,39 +0,0 @@
/*
* 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.app.core.utils
import androidx.annotation.ColorRes
import im.vector.app.R
import kotlin.math.abs
@ColorRes
fun getColorFromUserId(userId: String?): Int {
var hash = 0
userId?.toList()?.map { chr -> hash = (hash shl 5) - hash + chr.toInt() }
return when (abs(hash) % 8) {
1 -> R.color.riotx_username_2
2 -> R.color.riotx_username_3
3 -> R.color.riotx_username_4
4 -> R.color.riotx_username_5
5 -> R.color.riotx_username_6
6 -> R.color.riotx_username_7
7 -> R.color.riotx_username_8
else -> R.color.riotx_username_1
}
}

View File

@ -16,13 +16,11 @@
package im.vector.app.features.home
import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.widget.ImageView
import androidx.annotation.AnyThread
import androidx.annotation.UiThread
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap
import com.amulyakhare.textdrawable.TextDrawable
import com.bumptech.glide.request.RequestOptions
@ -33,7 +31,7 @@ import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.glide.GlideApp
import im.vector.app.core.glide.GlideRequest
import im.vector.app.core.glide.GlideRequests
import im.vector.app.core.utils.getColorFromUserId
import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.content.ContentUrlResolver
import org.matrix.android.sdk.api.util.MatrixItem
@ -43,7 +41,8 @@ import javax.inject.Inject
* This helper centralise ways to retrieve avatar into ImageView or even generic Target<Drawable>
*/
class AvatarRenderer @Inject constructor(private val activeSessionHolder: ActiveSessionHolder) {
class AvatarRenderer @Inject constructor(private val activeSessionHolder: ActiveSessionHolder,
private val matrixItemColorProvider: MatrixItemColorProvider) {
companion object {
private const val THUMBNAIL_SIZE = 250
@ -51,8 +50,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
@UiThread
fun render(matrixItem: MatrixItem, imageView: ImageView) {
render(imageView.context,
GlideApp.with(imageView),
render(GlideApp.with(imageView),
matrixItem,
DrawableImageViewTarget(imageView))
}
@ -64,8 +62,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
@UiThread
fun render(matrixItem: MatrixItem, imageView: ImageView, glideRequests: GlideRequests) {
render(imageView.context,
glideRequests,
render(glideRequests,
matrixItem,
DrawableImageViewTarget(imageView))
}
@ -79,7 +76,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
displayName = mappedContact.displayName
)
val placeholder = getPlaceholderDrawable(imageView.context, matrixItem)
val placeholder = getPlaceholderDrawable(matrixItem)
GlideApp.with(imageView)
.load(mappedContact.photoURI)
.apply(RequestOptions.circleCropTransform())
@ -88,11 +85,10 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
}
@UiThread
fun render(context: Context,
glideRequests: GlideRequests,
fun render(glideRequests: GlideRequests,
matrixItem: MatrixItem,
target: Target<Drawable>) {
val placeholder = getPlaceholderDrawable(context, matrixItem)
val placeholder = getPlaceholderDrawable(matrixItem)
buildGlideRequest(glideRequests, matrixItem.avatarUrl)
.placeholder(placeholder)
.into(target)
@ -100,7 +96,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
@AnyThread
@Throws
fun shortcutDrawable(context: Context, glideRequests: GlideRequests, matrixItem: MatrixItem, iconSize: Int): Bitmap {
fun shortcutDrawable(glideRequests: GlideRequests, matrixItem: MatrixItem, iconSize: Int): Bitmap {
return glideRequests
.asBitmap()
.apply {
@ -108,7 +104,7 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
if (resolvedUrl != null) {
load(resolvedUrl)
} else {
val avatarColor = avatarColor(matrixItem, context)
val avatarColor = matrixItemColorProvider.getColor(matrixItem)
load(TextDrawable.builder()
.beginConfig()
.bold()
@ -130,8 +126,8 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
}
@AnyThread
fun getPlaceholderDrawable(context: Context, matrixItem: MatrixItem): Drawable {
val avatarColor = avatarColor(matrixItem, context)
fun getPlaceholderDrawable(matrixItem: MatrixItem): Drawable {
val avatarColor = matrixItemColorProvider.getColor(matrixItem)
return TextDrawable.builder()
.beginConfig()
.bold()
@ -152,11 +148,4 @@ class AvatarRenderer @Inject constructor(private val activeSessionHolder: Active
return activeSessionHolder.getSafeActiveSession()?.contentUrlResolver()
?.resolveThumbnail(avatarUrl, THUMBNAIL_SIZE, THUMBNAIL_SIZE, ContentUrlResolver.ThumbnailMethod.SCALE)
}
private fun avatarColor(matrixItem: MatrixItem, context: Context): Int {
return when (matrixItem) {
is MatrixItem.UserItem -> ContextCompat.getColor(context, getColorFromUserId(matrixItem.id))
else -> ContextCompat.getColor(context, getColorFromRoomId(matrixItem.id))
}
}
}

View File

@ -1,29 +0,0 @@
/*
* 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.app.features.home
import androidx.annotation.ColorRes
import im.vector.app.R
@ColorRes
fun getColorFromRoomId(roomId: String?): Int {
return when ((roomId?.toList()?.sumBy { it.toInt() } ?: 0) % 3) {
1 -> R.color.riotx_avatar_fill_2
2 -> R.color.riotx_avatar_fill_3
else -> R.color.riotx_avatar_fill_1
}
}

View File

@ -70,7 +70,7 @@ class ShortcutsHandler @Inject constructor(
.map { room ->
val intent = RoomDetailActivity.shortcutIntent(context, room.roomId)
val bitmap = try {
avatarRenderer.shortcutDrawable(context, GlideApp.with(context), room.toMatrixItem(), iconSize)
avatarRenderer.shortcutDrawable(GlideApp.with(context), room.toMatrixItem(), iconSize)
} catch (failure: Throwable) {
null
}

View File

@ -97,7 +97,6 @@ import im.vector.app.core.utils.colorizeMatchingText
import im.vector.app.core.utils.copyToClipboard
import im.vector.app.core.utils.createJSonViewerStyleProvider
import im.vector.app.core.utils.createUIHandler
import im.vector.app.core.utils.getColorFromUserId
import im.vector.app.core.utils.isValidUrl
import im.vector.app.core.utils.onPermissionResultAudioIpCall
import im.vector.app.core.utils.onPermissionResultVideoIpCall
@ -127,6 +126,7 @@ import im.vector.app.features.home.room.detail.timeline.action.EventSharedAction
import im.vector.app.features.home.room.detail.timeline.action.MessageActionsBottomSheet
import im.vector.app.features.home.room.detail.timeline.action.MessageSharedActionViewModel
import im.vector.app.features.home.room.detail.timeline.edithistory.ViewEditHistoryBottomSheet
import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider
import im.vector.app.features.home.room.detail.timeline.item.AbsMessageItem
import im.vector.app.features.home.room.detail.timeline.item.MessageFileItem
import im.vector.app.features.home.room.detail.timeline.item.MessageImageVideoItem
@ -217,7 +217,9 @@ class RoomDetailFragment @Inject constructor(
private val vectorPreferences: VectorPreferences,
private val colorProvider: ColorProvider,
private val notificationUtils: NotificationUtils,
private val webRtcPeerConnectionManager: WebRtcPeerConnectionManager) :
private val webRtcPeerConnectionManager: WebRtcPeerConnectionManager,
private val matrixItemColorProvider: MatrixItemColorProvider
) :
VectorBaseFragment(),
TimelineEventController.Callback,
VectorInviteView.Callback,
@ -790,7 +792,7 @@ class RoomDetailFragment @Inject constructor(
// switch to expanded bar
composerLayout.composerRelatedMessageTitle.apply {
text = event.senderInfo.disambiguatedDisplayName
setTextColor(ContextCompat.getColor(requireContext(), getColorFromUserId(event.root.senderId)))
setTextColor(matrixItemColorProvider.getColor(MatrixItem.UserItem(event.root.senderId ?: "@")))
}
val messageContent: MessageContent? = event.getLastMessageContent()

View File

@ -19,18 +19,20 @@ package im.vector.app.features.home.room.detail.timeline
import androidx.annotation.ColorInt
import im.vector.app.R
import im.vector.app.core.resources.ColorProvider
import im.vector.app.core.utils.getColorFromUserId
import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider
import im.vector.app.features.settings.VectorPreferences
import org.matrix.android.sdk.api.session.room.send.SendState
import org.matrix.android.sdk.api.util.MatrixItem
import javax.inject.Inject
class MessageColorProvider @Inject constructor(
private val colorProvider: ColorProvider,
private val matrixItemColorProvider: MatrixItemColorProvider,
private val vectorPreferences: VectorPreferences) {
@ColorInt
fun getMemberNameTextColor(userId: String): Int {
return colorProvider.getColor(getColorFromUserId(userId))
fun getMemberNameTextColor(matrixItem: MatrixItem): Int {
return matrixItemColorProvider.getColor(matrixItem)
}
@ColorInt

View File

@ -0,0 +1,72 @@
/*
* Copyright (c) 2020 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.home.room.detail.timeline.helper
import androidx.annotation.ColorInt
import androidx.annotation.ColorRes
import im.vector.app.R
import im.vector.app.core.resources.ColorProvider
import org.matrix.android.sdk.api.util.MatrixItem
import javax.inject.Inject
import javax.inject.Singleton
import kotlin.math.abs
@Singleton
class MatrixItemColorProvider @Inject constructor(
private val colorProvider: ColorProvider
) {
private val cache = mutableMapOf<String, Int>()
@ColorInt
fun getColor(matrixItem: MatrixItem): Int {
return cache.getOrPut(matrixItem.id) {
colorProvider.getColor(
when (matrixItem) {
is MatrixItem.UserItem -> getColorFromUserId(matrixItem.id)
else -> getColorFromRoomId(matrixItem.id)
}
)
}
}
@ColorRes
private fun getColorFromUserId(userId: String?): Int {
var hash = 0
userId?.toList()?.map { chr -> hash = (hash shl 5) - hash + chr.toInt() }
return when (abs(hash) % 8) {
1 -> R.color.riotx_username_2
2 -> R.color.riotx_username_3
3 -> R.color.riotx_username_4
4 -> R.color.riotx_username_5
5 -> R.color.riotx_username_6
6 -> R.color.riotx_username_7
7 -> R.color.riotx_username_8
else -> R.color.riotx_username_1
}
}
@ColorRes
private fun getColorFromRoomId(roomId: String?): Int {
return when ((roomId?.toList()?.sumBy { it.toInt() } ?: 0) % 3) {
1 -> R.color.riotx_avatar_fill_2
2 -> R.color.riotx_avatar_fill_3
else -> R.color.riotx_avatar_fill_1
}
}
}

View File

@ -21,13 +21,13 @@ package im.vector.app.features.home.room.detail.timeline.helper
import im.vector.app.core.date.DateFormatKind
import im.vector.app.core.date.VectorDateFormatter
import im.vector.app.core.extensions.localDateTime
import im.vector.app.core.resources.ColorProvider
import im.vector.app.features.home.room.detail.timeline.item.E2EDecoration
import im.vector.app.features.home.room.detail.timeline.item.MessageInformationData
import im.vector.app.features.home.room.detail.timeline.item.PollResponseData
import im.vector.app.features.home.room.detail.timeline.item.ReactionInfoData
import im.vector.app.features.home.room.detail.timeline.item.ReadReceiptData
import im.vector.app.features.home.room.detail.timeline.item.ReferencesInfoData
import im.vector.app.features.settings.VectorPreferences
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.EventType
@ -49,7 +49,7 @@ import javax.inject.Inject
class MessageInformationDataFactory @Inject constructor(private val session: Session,
private val roomSummaryHolder: RoomSummaryHolder,
private val dateFormatter: VectorDateFormatter,
private val colorProvider: ColorProvider) {
private val vectorPreferences: VectorPreferences) {
fun create(event: TimelineEvent, nextEvent: TimelineEvent?): MessageInformationData {
// Non nullability has been tested before
@ -81,6 +81,7 @@ class MessageInformationDataFactory @Inject constructor(private val session: Ses
avatarUrl = event.senderInfo.avatarUrl,
memberName = event.senderInfo.disambiguatedDisplayName,
showInformation = showInformation,
forceShowTimestamp = vectorPreferences.alwaysShowTimeStamps(),
orderedReactionList = event.annotations?.reactionsSummary
// ?.filter { isSingleEmoji(it.key) }
?.map {

View File

@ -21,6 +21,8 @@ import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.IdRes
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import com.airbnb.epoxy.EpoxyAttribute
import im.vector.app.R
import im.vector.app.core.utils.DebouncedClickListener
@ -69,8 +71,14 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : AbsBaseMessageItem<H>
holder.avatarImageView.setOnClickListener(null)
holder.memberNameView.setOnClickListener(null)
holder.avatarImageView.visibility = View.GONE
holder.memberNameView.visibility = View.GONE
holder.timeView.visibility = View.GONE
if (attributes.informationData.forceShowTimestamp) {
holder.memberNameView.isInvisible = true
holder.timeView.isVisible = true
holder.timeView.text = attributes.informationData.time
} else {
holder.memberNameView.isVisible = false
holder.timeView.isVisible = false
}
holder.avatarImageView.setOnLongClickListener(null)
holder.memberNameView.setOnLongClickListener(null)
}
@ -85,7 +93,7 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : AbsBaseMessageItem<H>
super.unbind(holder)
}
private fun Attributes.getMemberNameColor() = messageColorProvider.getMemberNameTextColor(informationData.senderId)
private fun Attributes.getMemberNameColor() = messageColorProvider.getMemberNameTextColor(informationData.matrixItem)
abstract class Holder(@IdRes stubId: Int) : AbsBaseMessageItem.Holder(stubId) {
val avatarImageView by bind<ImageView>(R.id.messageAvatarImageView)

View File

@ -32,6 +32,7 @@ data class MessageInformationData(
val avatarUrl: String?,
val memberName: CharSequence? = null,
val showInformation: Boolean = true,
val forceShowTimestamp: Boolean = false,
/*List of reactions (emoji,count,isSelected)*/
val orderedReactionList: List<ReactionInfoData>? = null,
val pollResponseAggregatedSummary: PollResponseData? = null,

View File

@ -53,7 +53,7 @@ class PillImageSpan(private val glideRequests: GlideRequests,
@UiThread
fun bind(textView: TextView) {
tv = WeakReference(textView)
avatarRenderer.render(context, glideRequests, matrixItem, target)
avatarRenderer.render(glideRequests, matrixItem, target)
}
// ReplacementSpan *****************************************************************************
@ -99,7 +99,7 @@ class PillImageSpan(private val glideRequests: GlideRequests,
val icon = try {
avatarRenderer.getCachedDrawable(glideRequests, matrixItem)
} catch (exception: Exception) {
avatarRenderer.getPlaceholderDrawable(context, matrixItem)
avatarRenderer.getPlaceholderDrawable(matrixItem)
}
return ChipDrawable.createFromResource(context, R.xml.pill_view).apply {

View File

@ -42,10 +42,10 @@ import im.vector.app.features.login.terms.LoginTermsFragment
import im.vector.app.features.login.terms.LoginTermsFragmentArgument
import im.vector.app.features.login.terms.toLocalizedLoginTerms
import im.vector.app.features.pin.UnlockedActivity
import kotlinx.android.synthetic.main.activity_login.*
import org.matrix.android.sdk.api.auth.registration.FlowResult
import org.matrix.android.sdk.api.auth.registration.Stage
import org.matrix.android.sdk.api.extensions.tryOrNull
import kotlinx.android.synthetic.main.activity_login.*
import javax.inject.Inject
/**
@ -127,7 +127,7 @@ open class LoginActivity : VectorBaseActivity(), ToolbarConfigurable, UnlockedAc
is LoginViewEvents.OutdatedHomeserver -> {
AlertDialog.Builder(this)
.setTitle(R.string.login_error_outdated_homeserver_title)
.setMessage(R.string.login_error_outdated_homeserver_content)
.setMessage(R.string.login_error_outdated_homeserver_warning_content)
.setPositiveButton(R.string.ok, null)
.show()
Unit

View File

@ -748,34 +748,21 @@ class LoginViewModel @AssistedInject constructor(
else -> LoginMode.Unsupported
}
if (loginMode == LoginMode.Password && !data.isLoginAndRegistrationSupported) {
notSupported()
} else {
// FIXME We should post a view event here normally?
setState {
copy(
asyncHomeServerLoginFlowRequest = Uninitialized,
homeServerUrl = data.homeServerUrl,
loginMode = loginMode,
loginModeSupportedTypes = data.supportedLoginTypes.toList()
)
}
// FIXME We should post a view event here normally?
setState {
copy(
asyncHomeServerLoginFlowRequest = Uninitialized,
homeServerUrl = data.homeServerUrl,
loginMode = loginMode,
loginModeSupportedTypes = data.supportedLoginTypes.toList()
)
}
if ((loginMode == LoginMode.Password && !data.isLoginAndRegistrationSupported)
|| data.isOutdatedHomeserver) {
// Notify the UI
_viewEvents.post(LoginViewEvents.OutdatedHomeserver)
}
}
is LoginFlowResult.OutdatedHomeserver -> {
notSupported()
}
}
}
private fun notSupported() {
// Notify the UI
_viewEvents.post(LoginViewEvents.OutdatedHomeserver)
setState {
copy(
asyncHomeServerLoginFlowRequest = Uninitialized
)
}
}
})

View File

@ -25,16 +25,16 @@ import com.airbnb.mvrx.Uninitialized
import com.airbnb.mvrx.ViewModelContext
import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.extensions.hasUnsavedKeys
import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.login.LoginMode
import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.auth.AuthenticationService
import org.matrix.android.sdk.api.auth.data.LoginFlowResult
import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.util.Cancelable
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.extensions.hasUnsavedKeys
import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.login.LoginMode
import timber.log.Timber
/**
@ -102,7 +102,7 @@ class SoftLogoutViewModel @AssistedInject constructor(
override fun onSuccess(data: LoginFlowResult) {
when (data) {
is LoginFlowResult.Success -> {
is LoginFlowResult.Success -> {
val loginMode = when {
// SSO login is taken first
data.supportedLoginTypes.contains(LoginFlowTypes.SSO) -> LoginMode.Sso
@ -110,29 +110,12 @@ class SoftLogoutViewModel @AssistedInject constructor(
else -> LoginMode.Unsupported
}
if (loginMode == LoginMode.Password && !data.isLoginAndRegistrationSupported) {
notSupported()
} else {
setState {
copy(
asyncHomeServerLoginFlowRequest = Success(loginMode)
)
}
setState {
copy(
asyncHomeServerLoginFlowRequest = Success(loginMode)
)
}
}
is LoginFlowResult.OutdatedHomeserver -> {
notSupported()
}
}
}
private fun notSupported() {
// Should not happen since it's a re-logout
// Notify the UI
setState {
copy(
asyncHomeServerLoginFlowRequest = Fail(IllegalStateException("Should not happen"))
)
}
}
})

View File

@ -13,7 +13,7 @@ Az Element-tel azért válik mindez lehetővé, mert a Matrix hálózatra épül
Az Element a te kezedbe adja az irányítást azáltal, hogy eldöntheted, ki tárolja a beszélgetéseidet. Az Element alkalmazásból több féle szolgáltatót is választhatsz:
1. Regisztrálhatsz ingyen egy fiókot a matrix.org nyilvános szerveren
1. Regisztrálhatsz ingyen egy fiókot a matrix.org nyilvános szerveren, amit a Matrix fejlesztői üzemeltetnek, vagy választhatsz a több ezer, ingyenes szerver közül, amit önkéntesek üzemeltetnek
2. A saját számítógépeden is futtathatsz szervert
3. Előfizethetsz egy saját szerverre az Element Matrix Szolgáltatások platformon

View File

@ -727,7 +727,7 @@ Vaši e-mailovou adresu můžete přidat k profilu v nastavení.</string>
<string name="settings_messages_sent_by_bot">Zprávy poslané botem</string>
<string name="settings_background_sync">Synchronizace na pozadí</string>
<string name="settings_background_fdroid_sync_mode">Režim synchronizace na pozadí (experimentální)</string>
<string name="settings_background_fdroid_sync_mode">Režim synchronizace na pozadí</string>
<string name="settings_background_fdroid_sync_mode_battery">Optimalizován pro baterii</string>
<string name="settings_background_fdroid_sync_mode_battery_description">Element bude synchronizovat na pozadí způsobem, který šetří omezené zdroje zařízení (baterii).
\nV závislosti na stavu zdrojů zařízení může být sync operačním systémem odložen.</string>
@ -2609,4 +2609,18 @@ Vaši e-mailovou adresu můžete přidat k profilu v nastavení.</string>
<string name="auth_pin_confirm_to_disable_title">Pro vypnutí PINu potvrďte PIN</string>
<string name="error_opening_banned_room">Nemohu otevřít místnost, z níž jste byli vykázáni.</string>
<string name="room_error_not_found">Nemohu najít tuto místnost. Ujistěte se, že existuje.</string>
<plurals name="seconds">
<item quantity="one">%d vteřina</item>
<item quantity="few">%d vteřiny</item>
<item quantity="other">%d vteřin</item>
</plurals>
<string name="settings_show_room_member_state_events">Zobrazit stavové události účastníků v místnosti</string>
<string name="settings_show_room_member_state_events_summary">Zahrnuje události pozvat/vstoupit/opustit/vykopnout/vykázat a změny avatara/veřejného jména.</string>
<string name="sent_a_poll">Průzkum</string>
<string name="sent_a_bot_buttons">Tlačítka botů</string>
<string name="sent_a_reaction">Reagovali skrze: %s</string>
<string name="sent_verification_conclusion">Výsledek ověření</string>
<string name="universal_link_malformed">Odkaz byl chybně zformován</string>
</resources>

View File

@ -258,7 +258,7 @@
Bitte erlaube den Zugriff im nächsten Dialog, um den Anruf durchzuführen.</string>
<string name="permissions_rationale_msg_contacts">Element kann dein Adressbuch durchsuchen, um andere Matrix-Nutzer anhand ihrer Email-Adresse und Telefonnummer zu finden. Wenn du der Nutzung deines Adressbuchs zu diesem Zweck zustimmst, erlaube den Zugriff im nächsten Popup-Fenster.</string>
<string name="permissions_msg_contacts_warning_other_androids">Element kann dein Adressbuch durchsuchen, um andere Matrix-Nutzer anhand ihrer Email-Adresse und Telefonnummer zu finden.
<string name="permissions_msg_contacts_warning_other_androids">Element kann dein Adressbuch durchsuchen, um andere Matrix-Nutzer anhand ihrer E-Mail-Adresse und Telefonnummer zu finden.
\nStimmst du der Nutzung deines Adressbuchs zu diesem Zweck zu\?</string>
<string name="permissions_action_not_performed_missing_permissions">Entschuldige. Die Aktion wurde aufgrund fehlender Berechtigungen nicht ausgeführt</string>
@ -1055,7 +1055,7 @@ Achtung: Diese Datei wird vielleicht gelöscht, wenn die App deinstalliert wird.
<string name="x_plus">%d+</string>
<string name="call_anyway">Trotzdem anrufen</string>
<string name="room_participants_action_kick">Kicken</string>
<string name="room_participants_action_kick">Entfernen</string>
<string name="reason_hint">Grund</string>
<string name="settings_inline_url_preview_summary">Linkvorschau im Chat aktivieren, falls dein Home-Server diese Funktion unterstützt.</string>
@ -1342,7 +1342,7 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="keys_backup_banner_in_progress">Sichere Schlüssel…</string>
<string name="keys_backup_info_keys_all_backup_up">Alle Schlüssel gesichert</string>
<string name="keys_backup_info_keys_all_backup_up">Alle Schlüssel sind gesichert</string>
<plurals name="keys_backup_info_keys_backing_up">
<item quantity="one">Sichere %d Schlüssel…</item>
<item quantity="other">Sichere %d Schlüssel…</item>
@ -1669,9 +1669,9 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="settings_add_3pid_authentication_needed">Authentifizierung benötigt</string>
<string name="settings_background_fdroid_sync_mode">Hintergrundsynchronisierungsmodus (experimentell)</string>
<string name="settings_background_fdroid_sync_mode_battery_description">Element wird sich im Hintergrund auf eine Art synchronisieren die Ressourcen des Geräts schont (Akku).
\nAbhängig von dem Ressourcen-Statuses deines Geräts kann dein System die Synchronisierung verschieben.</string>
<string name="settings_background_fdroid_sync_mode">Hintergrund-Synchronisierungsmodus</string>
<string name="settings_background_fdroid_sync_mode_battery_description">Element wird sich im Hintergrund auf eine Art synchronisieren die Ressourcen des Geräts (Akku) schont.
\nAbhängig vom Ressourcen-Status deines Geräts kann dein System die Synchronisierung verschieben.</string>
<string name="settings_background_fdroid_sync_mode_real_time_description">Element wird sich im Hintergrund periodisch zu einem bestimmten Zeitpunkt synchronisieren (konfigurierbar).
\nDies wird Funk- und Akkunutzung beeinflussen. Es wird eine permanente Benachrichtigung geben, die sagt, dass Element auf Ereignisse lauscht.</string>
<string name="settings_set_workmanager_delay_summary">%s
@ -1808,7 +1808,7 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="login_splash_submit">Beginne</string>
<string name="login_server_title">Wähle einen Server</string>
<string name="login_server_text">Genau wie bei Emails haben Accounts ein Zuhause, auch wenn du mit jedem kommunizieren kannst</string>
<string name="login_server_text">Genau wie bei E-Mails haben Accounts ein Zuhause, auch wenn du mit jedem kommunizieren kannst</string>
<string name="login_server_matrix_org_text">Folge Millionen anderen kostenlos auf dem größten öffentlichen Server</string>
<string name="login_server_modular_text">Premium Hosting für Organisationen</string>
<string name="login_server_modular_learn_more">Mehr erfahren</string>
@ -2118,7 +2118,7 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="settings_active_sessions_list">Aktive Sitzungen</string>
<string name="settings_active_sessions_show_all">Zeige alle Sitzungen</string>
<string name="settings_active_sessions_manage">Verwalte Sitzungen</string>
<string name="settings_active_sessions_manage">Sitzungen verwalten</string>
<string name="settings_active_sessions_signout_device">Diese Sitzung abmelden</string>
<string name="settings_failed_to_get_crypto_device_info">Keine kryptografischen Informationen verfügbar</string>
@ -2271,7 +2271,7 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="error_failed_to_import_keys">Import der Schlüssel fehlgeschlagen</string>
<string name="settings_notification_configuration">Benachrichtigungskonfiguration</string>
<string name="settings_messages_at_room">\@raum enthaltende Nachrichten</string>
<string name="settings_messages_at_room">Nachrichten, die @raum enthalten</string>
<string name="settings_messages_in_e2e_group_chat">Verschlüsselte Nachrichten in Gruppenchats</string>
<string name="settings_notification_advanced_summary">Setze die Benachrichtigungspräferenz abhängig vom Ereignistyp</string>
@ -2353,7 +2353,7 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="use_latest_app">Nutze die neueste Version von Element auf deinen anderen Geräten:</string>
<string name="command_description_discard_session">Erzwingt das Verferfen der aktuell ausgehende Gruppensitzung in einem verschlüsseltem Raum</string>
<string name="command_description_discard_session_not_handled">Wird nur in verschlüsselten Räumen unterstützt</string>
<string name="enter_secret_storage_passphrase_or_key">Benutze dein %1$s oder deinen %2$s um fortzufahren.</string>
<string name="enter_secret_storage_passphrase_or_key">Benutze deine %1$s oder deinen %2$s um fortzufahren.</string>
<string name="use_recovery_key">Wiederherstellungsschlüssel verwenden</string>
<string name="enter_secret_storage_input_key">Wähle deinen Wiederherstellungsschüssel, gib ihn ein oder füge ihn aus der Zwischenablage ein</string>
<string name="keys_backup_recovery_key_error_decrypt">Sicherung konnte mit diesem Wiederherstellungsschlüssel nicht entschlüsselt werden. Bitte stelle sicher, dass du den korrekten Wiederherstellungsschlüssel eingegeben hast.</string>
@ -2478,9 +2478,9 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="event_redacted">Nachricht gelöscht</string>
<string name="settings_show_redacted">Zeige gelöschte Nachrichten</string>
<string name="settings_show_redacted_summary">Zeige einen Platzhalter für gelöschte Nachrichten</string>
<string name="labs_show_unread_notifications_as_tab">Füge dedizierten Tab für ungelesene Benachrichtungen zur Hauptansicht hinzu.</string>
<string name="labs_show_unread_notifications_as_tab">Dedizierten Tab für ungelesene Nachrichten zur Hauptansicht hinzufügen</string>
<string name="settings_discovery_confirm_mail_not_clicked">Wir haben dir eine Bestätigungsmail an %s gesendet. Bitte prüfe deine Emails und klicke auf den Bestätigungslink</string>
<string name="settings_discovery_confirm_mail_not_clicked">Wir haben dir eine Bestätigungsmail an %s gesendet. Bitte prüfe deine E-Mails und klicke auf den Bestätigungslink</string>
<string name="settings_text_message_sent_wrong_code">Der Verifizierungscode ist nicht korrekt.</string>
<string name="uploads_media_title">MEDIEN</string>
@ -2497,13 +2497,13 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="login_server_url_form_common_notice">Gib die Adresse des Servers ein, den du benutzen möchtest</string>
<string name="login_connect_using_matrix_id_notice">Wenn du deine Matrixkennung und dein Passwort weißt, kannst du alternativ diese Methode nutzen:</string>
<string name="login_connect_using_matrix_id_submit">Einloggen mit Matrix ID</string>
<string name="login_signin_matrix_id_title">Einloggen mit Matrix ID</string>
<string name="login_signin_matrix_id_notice">Wenn du einen Account auf einem Homeserver eingerichtet hast, benutze deine Matrix ID (z.B. @benutzer@domain.com) und Passwort.</string>
<string name="login_signin_matrix_id_hint">Matrix ID</string>
<string name="login_connect_using_matrix_id_submit">Einloggen mit Matrix-ID</string>
<string name="login_signin_matrix_id_title">Einloggen mit Matrix-ID</string>
<string name="login_signin_matrix_id_notice">Wenn du einen Account auf einem Home-Server eingerichtet hast, benutze deine Matrix-ID (z.B. @benutzer:domain.com) und Passwort.</string>
<string name="login_signin_matrix_id_hint">Matrix-ID</string>
<string name="login_signin_matrix_id_password_notice">Wenn du dein Passwort nicht weißt, gehe zurück um es zurücksetzen zu lassen.</string>
<string name="login_signin_matrix_id_error_invalid_matrix_id">Dies ist keine gültige Benutzerkennung. Erwartetes Format: \'@benutzer:homeserver.org\'</string>
<string name="autodiscover_well_known_error">Es konnte kein gültiger Homeserver gefunden werden. Bitte prüfe deine Kennung</string>
<string name="autodiscover_well_known_error">Es konnte kein gültiger Home-Server gefunden werden. Bitte prüfe deine Kennung</string>
<string name="send_a_sticker">Sticker</string>
@ -2621,7 +2621,7 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="settings_security_pin_code_title">Aktiviere PIN</string>
<string name="settings_security_pin_code_summary">Wenn du deine PIN zurücksetzen möchtest, tippe \"PIN vergessen\" um dich abzumelden und sie anschließend zurückzusetzen.</string>
<string name="auth_pin_confirm_to_disable_title">Bestätige PIN um die PIN zu deaktivieren</string>
<string name="labs_merge_e2e_in_timeline">Fasse \"Nicht entschlüsselbar\"-Fehler im Chatverlauf zu Hinweisen zusammen</string>
<string name="labs_merge_e2e_in_timeline">\"Nicht entschlüsselbar\"-Fehler im Chatverlauf zusammenfassen</string>
<string name="settings_call_show_confirmation_dialog_title">Verhindere versehentliche Anrufe</string>
<string name="settings_call_show_confirmation_dialog_summary">Bitte um Bestätigung, bevor du einen Anruf tätigst</string>
<string name="bottom_sheet_setup_secure_backup_submit">Konfiguration</string>
@ -2673,4 +2673,15 @@ Verwahre deinen Wiederherstellungsschlüssel an einem sehr sicheren Ort wie eine
<string name="error_opening_banned_room">Raum, indem du gebannt wurdest, kann nicht geöffnet werden.</string>
<string name="room_error_not_found">Raum kann nicht gefunden werden. Stelle sicher, dass er existiert.</string>
<plurals name="seconds">
<item quantity="one">%d Sekunde</item>
<item quantity="other">%d Sekunden</item>
</plurals>
<string name="settings_show_room_member_state_events">Zeige Status-Ereignisse der Raum-Mitglieder</string>
<string name="settings_show_room_member_state_events_summary">Bezieht Einladungs-/Beitritts-/Verlassen-/Entfernen-/Verbannen-Ereignisse und Avatar-/Anzeigenamen-Wechsel mit ein.</string>
<string name="sent_a_poll">Umfrage</string>
<string name="sent_a_bot_buttons">Bot-Schaltflächen</string>
<string name="sent_a_reaction">Reagierte mit: %s</string>
<string name="universal_link_malformed">Der Link war nicht korrekt</string>
</resources>

View File

@ -1048,7 +1048,7 @@
\nKas sa oled ikka kindel\?</string>
<string name="room_participants_power_level_demote_warning_title">Kas vähendad enda õigusi\?</string>
<string name="room_participants_power_level_demote_warning_prompt">Kuna sa vähendad enda õigusi, siis sul ei pruugi enam olla võimalik seda muutust tagasi pöörata. Kui sa juhtumisi oled viimane haldusõigustega kasutaja jututoas, siis hiljem on võimatu samu õigusi tagasi saada.</string>
<string name="room_participants_power_level_demote_warning_prompt">Kuna sa vähendad enda õigusi, siis sul ei pruugi hiljem olla võimalik seda muutust tagasi pöörata. Kui sa juhtumisi oled viimane haldusõigustega kasutaja jututoas, siis hiljem on võimatu samu õigusi tagasi saada.</string>
<string name="room_participants_power_level_demote">Vähenda enda õigusi</string>
@ -1277,7 +1277,7 @@
<string name="settings_messages_sent_by_bot">Robotite saadetud sõnumid</string>
<string name="settings_background_sync">Andmete sünkroniseerimine taustal</string>
<string name="settings_background_fdroid_sync_mode">Andmete taustal sünkroniseerimise režiim (katseline)</string>
<string name="settings_background_fdroid_sync_mode">Andmete taustal sünkroniseerimise režiim</string>
<string name="settings_background_fdroid_sync_mode_battery">Optimeeritud akukestust silmas pidades</string>
<string name="settings_background_fdroid_sync_mode_battery_description">Element sünkroniseerib taustal nii, et see arvestab seadme piiratud ressursse (aku).
\nSõltuvalt seadme olekust võib operatsioonisüsteem sünkroniseerimist edasi lükata.</string>
@ -2331,7 +2331,7 @@
<string name="sent_an_audio_file">Helifail</string>
<string name="sent_a_file">Fail</string>
<string name="room_profile_not_encrypted_subtitle">Sõnumid siin jututoas on läbivalt krüptitud.</string>
<string name="room_profile_encrypted_subtitle">Sõnumid siis jututoas kasutavad läbivat krüptimist.
<string name="room_profile_encrypted_subtitle">Sõnumid siin jututoas kasutavad läbivat krüptimist.
\n
\nSinu sõnumid on turvatud ning ainult sinul ja saaja(te)l on unikaalsed võtmed selliste sõnumite lugemiseks.</string>
<string name="room_profile_section_security">Turvalisus</string>
@ -2544,4 +2544,17 @@
<string name="error_opening_banned_room">Ei ole võimalik avada sellise jututoa vaadet, kus sulle on seatud suhtluskeeld.</string>
<string name="room_error_not_found">Ei leia sellist jututuba. Palun kontrolli, et ta ikka olemas on.</string>
<plurals name="seconds">
<item quantity="one">%d sekund</item>
<item quantity="other">%d sekundit</item>
</plurals>
<string name="settings_show_room_member_state_events">Näita jututoa liikmete olekusündmusi</string>
<string name="settings_show_room_member_state_events_summary">Sealhulgas kutsumisi, liitumisi, lahkumisi, müksamisi, keelamisi ning tunnuspildi ja kuvatava nime muutusi.</string>
<string name="sent_a_poll">Küsitlus</string>
<string name="sent_a_bot_buttons">Robotinupud</string>
<string name="sent_a_reaction">Reageeris: %s</string>
<string name="sent_verification_conclusion">Verifitseerimise tulemus</string>
<string name="universal_link_malformed">Link oli vigane</string>
</resources>

View File

@ -2539,4 +2539,14 @@
<string name="settings_developer_mode_summary">Askar n uneflay yermed timahilin i yeffren yerna yezmer daɣen ad yerr asnas ur yerkid ara akken iwata. I yineflayen kan!</string>
<string name="settings_developer_mode_fail_fast_title">Abrir arurad</string>
<plurals name="seconds">
<item quantity="one">%d n tsint</item>
<item quantity="other">%d n tsintin</item>
</plurals>
<string name="settings_show_room_member_state_events">Sken tidyanin n waddad n uɛeggal n texxamt</string>
<string name="sent_a_bot_buttons">Tiqeffalin n uṛubut</string>
<string name="sent_verification_conclusion">Taggrayt n usenqed</string>
<string name="universal_link_malformed">Aseɣwen ur yemsil ara akken iwata</string>
</resources>

View File

@ -164,8 +164,8 @@
<string name="auth_forgot_password">Esqueceu sua senha?</string>
<string name="auth_use_server_options">Use opções para servidor personalizado (avançado)</string>
<string name="auth_email_validation_message">Por favor, verifique o seu e-mail para continuar a inscrição</string>
<string name="auth_threepid_warning_message">Atualmente, registrar-se com e-mail e número de telefone ao mesmo tempo não é possível. Apenas o número de telefone será levado em consideração.
\n
<string name="auth_threepid_warning_message">Atualmente, registrar-se com e-mail e número de telefone ao mesmo tempo não é possível. Apenas o número de telefone será levado em consideração.
\n
\nNo entanto, você pode adicionar o endereço de e-mail ao seu perfil nas configurações.</string>
<string name="auth_recaptcha_message">Este servidor local quer se certificar de que você não é um robô</string>
<string name="auth_username_in_use">Nome de usuário indisponível</string>
@ -177,8 +177,8 @@
<string name="auth_reset_password_missing_password">Uma nova senha precisa ser inserida.</string>
<string name="auth_reset_password_email_validation_message">Um e-mail foi enviado para %s. Após clicar no link contido no e-mail, clique abaixo.</string>
<string name="auth_reset_password_error_unauthorized">Falha ao confirmar o endereço de e-mail: certifique-se de clicar no link do e-mail</string>
<string name="auth_reset_password_success_message">Sua senha foi alterada.
\n
<string name="auth_reset_password_success_message">Sua senha foi alterada.
\n
\nVocê foi desconectado de todas as sessões e não receberá mais notificações. Para reativar as notificações, faça login novamente em cada aparelho.</string>
<!-- Login Screen -->
@ -247,8 +247,8 @@
<!-- permissions Android M -->
<string name="permissions_rationale_popup_title">Informação</string>
<string name="permissions_rationale_msg_storage">Element precisa de permissão para acessar sua galeria de fotos e vídeos para enviar e salvar anexos.
\n
<string name="permissions_rationale_msg_storage">Element precisa de permissão para acessar sua galeria de fotos e vídeos para enviar e salvar anexos.
\n
\nPor favor, permita o acesso na próxima tela para poder enviar arquivos do seu celular.</string>
<string name="permissions_rationale_msg_camera">Element necessita permissão para acessar sua câmera para poder tirar fotos e fazer chamadas de vídeo.</string>
<string name="permissions_rationale_msg_camera_explanation">"
@ -258,12 +258,12 @@
<string name="permissions_rationale_msg_record_audio_explanation">"
\n
\nPor favor, permita o acesso na próxima tela para fazer a chamada."</string>
<string name="permissions_rationale_msg_camera_and_audio">Element necessita permissão para acessar sua câmera e seu microfone para fazer chamadas de vídeo.
\n
<string name="permissions_rationale_msg_camera_and_audio">Element necessita permissão para acessar sua câmera e seu microfone para fazer chamadas de vídeo.
\n
\nPor favor, permita o acesso na próxima tela para fazer a chamada.</string>
<string name="permissions_rationale_msg_contacts">Element precisa de permissão para acessar os seus contatos para poder encontrar outros usuários a partir de seus e-mails e números de telefone. Se você concordar em usar a sua lista de contatos para esse propósito, permita o acesso na próxima janela pop-up.</string>
<string name="permissions_msg_contacts_warning_other_androids">Element precisa de permissão para acessar os seus contatos para poder encontrar outros usuários a partir de seus e-mails e números de telefone.
\n
<string name="permissions_msg_contacts_warning_other_androids">Element precisa de permissão para acessar os seus contatos para poder encontrar outros usuários a partir de seus e-mails e números de telefone.
\n
\nVocê concorda em usar a sua lista de contatos para esse propósito\?</string>
<string name="permissions_action_not_performed_missing_permissions">Desculpe. A ação não foi realizada, por falta de permissão</string>
@ -286,7 +286,7 @@
<!-- Room Preview -->
<string name="room_preview_invitation_format">Você foi convidada(o) a entrar nesta sala por %s</string>
<string name="room_preview_unlinked_email_warning">Este convite foi enviado a %s, que não está associado com esta conta.
<string name="room_preview_unlinked_email_warning">Este convite foi enviado a %s, que não está associado com esta conta.
\nVocê pode querer fazer login com uma conta diferente, ou adicionar este e-mail à sua conta.</string>
<string name="room_preview_try_join_an_unknown_room">Você está tentando acessar %s. Quer entrar na sala para poder participar da conversa?</string>
<string name="room_preview_try_join_an_unknown_room_default">uma sala</string>
@ -507,8 +507,8 @@
<string name="settings_confirm_password">Confirme a nova senha</string>
<string name="settings_fail_to_update_password">Não consegui atualizar a senha</string>
<string name="settings_password_updated">Sua senha foi atualizada</string>
<string name="settings_unignore_user">Mostrar todas as mensagens de %s\?
\n
<string name="settings_unignore_user">Mostrar todas as mensagens de %s\?
\n
\nNote que esta ação irá reiniciar o aplicativo e pode levar algum tempo.</string>
<string name="settings_delete_notification_targets_confirmation">Deseja deixar de notificar este aparelho\?</string>
@ -592,7 +592,7 @@
<string name="room_settings_addresses_e2e_enabled">A criptografia está ativada nesta sala.</string>
<string name="room_settings_addresses_e2e_disabled">A criptografia está desativada nesta sala.</string>
<string name="room_settings_addresses_e2e_encryption_warning">Ativar criptografia·
<string name="room_settings_addresses_e2e_encryption_warning">Ativar criptografia·
\n(atenção: não é possível desativar depois!)</string>
<!-- Directory -->
@ -900,8 +900,8 @@ Atenção: este arquivo poderá ser apagado se o aplicativo for desinstalado.</s
<string name="option_send_voice">Enviar áudio</string>
<string name="option_send_sticker">Enviar uma figurinha</string>
<string name="no_sticker_application_dialog_content">No momento, você não tem nenhum pacote de figurinhas ativado.
\n
<string name="no_sticker_application_dialog_content">No momento, você não tem nenhum pacote de figurinhas ativado.
\n
\nQuer adicionar alguns agora\?</string>
<string name="go_on_with">continuar com…</string>
@ -1002,10 +1002,10 @@ Atenção: este arquivo poderá ser apagado se o aplicativo for desinstalado.</s
<string name="dialog_user_consent_submit">Revisar agora</string>
<string name="deactivate_account_title">Desativar minha conta</string>
<string name="deactivate_account_content">Isso tornará sua conta permanentemente inutilizável. Você não conseguirá efetuar login e ninguém poderá registrar novamente o mesmo ID de usuário. Isso fará com que sua conta saia de todas as salas das quais está participando e removerá os detalhes de sua conta do servidor de identidade. <b>Esta ação é irreversível</b>.
\n
\nDesativar sua conta <b>não faz com que, por padrão, suas mensagens enviadas sejam apagadas</b>. Se você deseja que suas mensagens também sejam apagadas, marque a opção abaixo.
\n
<string name="deactivate_account_content">Isso tornará sua conta permanentemente inutilizável. Você não conseguirá efetuar login e ninguém poderá registrar novamente o mesmo ID de usuário. Isso fará com que sua conta saia de todas as salas das quais está participando e removerá os detalhes de sua conta do servidor de identidade. <b>Esta ação é irreversível</b>.
\n
\nDesativar sua conta <b>não faz com que, por padrão, suas mensagens enviadas sejam apagadas</b>. Se você deseja que suas mensagens também sejam apagadas, marque a opção abaixo.
\n
\nA visibilidade de mensagens na Matrix é semelhante a um e-mail. O fato de apagarmos suas mensagens significa que suas mensagens enviadas não serão compartilhadas com nenhum usuário novo ou ainda não registrado, mas os usuários registrados que já tiveram acesso a essas mensagens ainda terão acesso uma cópia delas.</string>
<string name="deactivate_account_delete_checkbox">Quando minha conta for desativada, apague todas as mensagens que eu enviei (Atenção: isso fará com que futuros usuários tenham uma visão incompleta das conversas)</string>
<string name="deactivate_account_prompt_password">Para continuar, entre com sua senha:</string>
@ -1063,14 +1063,14 @@ Atenção: este arquivo poderá ser apagado se o aplicativo for desinstalado.</s
<string name="settings_troubleshoot_test_account_settings_title">Configurações da conta</string>
<string name="settings_troubleshoot_test_account_settings_success">Notificações estão ativadas para sua conta.</string>
<string name="settings_troubleshoot_test_account_settings_failed">Notificações estão desativadas para sua conta.
<string name="settings_troubleshoot_test_account_settings_failed">Notificações estão desativadas para sua conta.
\nPor favor, revise as configurações da conta.</string>
<string name="settings_troubleshoot_test_account_settings_quickfix">Ativar</string>
<string name="settings_troubleshoot_test_device_settings_title">Configurações da sessão</string>
<string name="settings_troubleshoot_test_device_settings_success">Notificações estão ativadas nesta sessão.</string>
<string name="room_participants_action_kick">Remover da sala</string>
<string name="settings_troubleshoot_test_device_settings_failed">Notificações não estão ativadas nesta sessão.
<string name="settings_troubleshoot_test_device_settings_failed">Notificações não estão ativadas nesta sessão.
\nPor favor, revise as configurações do Element.</string>
<string name="settings_troubleshoot_test_device_settings_quickfix">Ativar</string>
@ -1126,10 +1126,10 @@ Tente reiniciar a aplicação.</string>
<string name="startup_notification_fdroid_battery_optim_title">Conexão em segundo plano</string>
<string name="startup_notification_fdroid_battery_optim_message">Element precisa manter um baixo impacto na conexão em segundo plano para ter notificações confiáveis.
Na próxima tela, você será solicitado a permitir que o Element funcione sempre em segundo plano, por favor aceite.</string>
<string name="settings_troubleshoot_test_bg_restricted_success">Restrições de segundo plano estão desativadas para o Element. Este teste deve ser realizado usando dados móveis (sem Wi-Fi).
<string name="settings_troubleshoot_test_bg_restricted_success">Restrições de segundo plano estão desativadas para o Element. Este teste deve ser realizado usando dados móveis (sem Wi-Fi).
\n%1$s</string>
<string name="settings_troubleshoot_test_bg_restricted_failed">Restrições em segundo plano estão ativadas para o Element.
\nO aplicativo funciona bastante restringido enquanto está em segundo plano, o que pode afetar as notificações.
<string name="settings_troubleshoot_test_bg_restricted_failed">Restrições em segundo plano estão ativadas para o Element.
\nO aplicativo funciona bastante restringido enquanto está em segundo plano, o que pode afetar as notificações.
\n%1$s</string>
<string name="settings_send_markdown">Formatação de texto</string>
<string name="settings_send_markdown_summary">Formatar o texto das mensagens a serem enviadas. Por exemplo: inserir asteriscos antes e depois do texto, mostrará o texto em itálico.</string>
@ -1205,14 +1205,14 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="settings_troubleshoot_test_bing_settings_failed_to_load_rules">Falha ao carregar regras personalizadas, tente novamente.</string>
<string name="settings_troubleshoot_test_bing_settings_quickfix">Verifique as configurações</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]
\nEste erro está fora do controle do Element e, de acordo com o Google, esse erro indica que o aparelho tem muitos aplicativos registrados com FCM. O erro só ocorre nos casos em que há números extremos de aplicativos, portanto, isso não deve afetar o usuário comum.</string>
<string name="ignore">Bloquear</string>
<string name="auth_login_sso">Entre com o login único</string>
<string name="login_error_unknown_host">Este endereço não está acessível. Por favor, verifique-o</string>
<string name="login_error_ssl_handshake">Seu aparelho está usando um protocolo de segurança TLS desatualizado, vulnerável a ataques. Para sua segurança, você não poderá se conectar</string>
<string name="settings_troubleshoot_test_fcm_failed_service_not_available">[%1$s]
<string name="settings_troubleshoot_test_fcm_failed_service_not_available">[%1$s]
\nEste erro está fora de controle da Element. Isso pode ocorrer por vários motivos. Talvez funcione se você tentar novamente mais tarde. Você também pode verificar se o uso de dados do Google Play Service está restrito nas configurações do sistema, ou se o relógio do seu aparelho está correto. O erro também pode ocorrer em ROMs personalizadas.</string>
<string name="notification_sync_init">Iniciando o serviço</string>
<string name="settings_troubleshoot_test_fcm_failed_account_missing">[%1$s]
@ -1257,7 +1257,7 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="call_failed_dont_ask_again">Não pergunte novamente</string>
<string name="call_failed_no_connection">A chamada falhou</string>
<string name="call_failed_no_connection_description">Falha ao estabelecer conexão em tempo real.
<string name="call_failed_no_connection_description">Falha ao estabelecer conexão em tempo real.
\nPor favor, peça ao administrador do seu servidor para configurar um servidor TURN, de modo que as chamadas funcionem de maneira estável.</string>
<string name="call_select_sound_device">Selecione a caixa de som</string>
@ -1317,10 +1317,10 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="settings_notification_privacy_no_background_sync">O aplicativo <b>não</b> precisa de se conectar ao servidor em segundo plano, isto deve reduzir a utilização da bateria</string>
<string name="settings_background_fdroid_sync_mode">Sincronização em segundo plano (Experimental)</string>
<string name="settings_background_fdroid_sync_mode_battery">Optimizado para bateria</string>
<string name="settings_background_fdroid_sync_mode_battery_description">Element sincronizará em segundo plano para preservar os recursos limitados do aparelho (bateria).
<string name="settings_background_fdroid_sync_mode_battery_description">Element sincronizará em segundo plano para preservar os recursos limitados do aparelho (bateria).
\nDependendo do estado dos recursos do seu aparelho, a sincronização pode ser adiada pelo sistema operacional.</string>
<string name="settings_background_fdroid_sync_mode_real_time">Optimizado em tempo real</string>
<string name="settings_background_fdroid_sync_mode_real_time_description">O Element sincronizará periodicamente em segundo plano, no momento estabelecido (configurável).
<string name="settings_background_fdroid_sync_mode_real_time_description">O Element sincronizará periodicamente em segundo plano, no momento estabelecido (configurável).
\nIsso afetará o uso de dados e da bateria. Haverá uma notificação permanente informando que o Element está sincronizando.</string>
<string name="settings_background_fdroid_sync_mode_disabled">Sem sincronização em segundo plano</string>
<string name="settings_background_fdroid_sync_mode_disabled_description">Você não será notificado sobre mensagens recebidas quando o Element estiver em segundo plano.</string>
@ -1328,7 +1328,7 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="settings_set_workmanager_delay">Intervalo de sincronização preferido</string>
<string name="settings_set_workmanager_delay_summary">%s
<string name="settings_set_workmanager_delay_summary">%s
\nA sincronização pode ser adiada dependendo dos recursos (bateria) ou do estado do aparelho (modo de suspensão).</string>
<string name="settings_integrations">Integrações</string>
<string name="settings_integrations_summary">Use o Gerenciador de Integrações para gerenciar bots, pontes, widgets e pacotes de figurinhas.
@ -1405,7 +1405,7 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="room_widget_permission_added_by">Widget adicionado por:</string>
<string name="room_widget_permission_webview_shared_info_title">A sua utilização pode definir cookies e compartilhar dados com %s:</string>
<string name="room_widget_permission_shared_info_title">A sua utilização pode compartilhar dados com %s:</string>
<string name="room_widget_failed_to_load">Falha ao carregar widget.
<string name="room_widget_failed_to_load">Falha ao carregar widget.
\n%s</string>
<string name="room_widget_reload">Recarregar widget</string>
<string name="room_widget_open_in_browser">Abrir no navegador</string>
@ -1430,12 +1430,12 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="integration_manager_not_configured">O gerenciador de integrações não está configurado.</string>
<string name="widget_integration_review_terms">Para continuar, você precisa aceitar os termos de serviço.</string>
<string name="you_added_a_new_device_with_info">Uma nova sessão está solicitando chaves de criptografia. Nome da sessão: %1$s
\nVisto por último às: %2$s
<string name="you_added_a_new_device_with_info">Uma nova sessão está solicitando chaves de criptografia. Nome da sessão: %1$s
\nVisto por último às: %2$s
\nSe você não fez login em outra sessão, ignore essa solicitação.</string>
<string name="your_unverified_device_requesting_with_info">Uma nova sessão está solicitando chaves de criptografia.
\nNome da sessão: %1$s
\nVisto por último às: %2$s
<string name="your_unverified_device_requesting_with_info">Uma nova sessão está solicitando chaves de criptografia.
\nNome da sessão: %1$s
\nVisto por último às: %2$s
\nSe você não fez login em outra sessão, ignore essa solicitação.</string>
<string name="start_verification_short_label">Confirmar</string>
@ -1452,8 +1452,8 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="keys_backup_no_session_error">Nenhuma sessão Matrix disponível</string>
<string name="keys_backup_setup_step1_title">Nunca perca mensagens criptografadas</string>
<string name="keys_backup_setup_step1_description">As mensagens em salas criptografadas são protegidas com a criptografia de ponta a ponta. Somente você e o(s) destinatário(s) têm as chaves para ler essas mensagens.
\n
<string name="keys_backup_setup_step1_description">As mensagens em salas criptografadas são protegidas com a criptografia de ponta a ponta. Somente você e o(s) destinatário(s) têm as chaves para ler essas mensagens.
\n
\nFaça backup de suas chaves de segurança para evitar perdê-las.</string>
<string name="keys_backup_setup">Comece a usar o Backup de Chave</string>
<string name="keys_backup_setup_step1_advanced">(Avançado)</string>
@ -1591,7 +1591,7 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="keys_backup_info_title_algorithm">Algoritmo</string>
<string name="autodiscover_invalid_response">Resposta de descoberta inválida no servidor local</string>
<string name="autodiscover_well_known_autofill_dialog_title">Completar Automaticamente as Opções do Servidor</string>
<string name="autodiscover_well_known_autofill_dialog_message">Element detectou uma configuração personalizada do servidor para a sua ID de usuário \"%1$s\":
<string name="autodiscover_well_known_autofill_dialog_message">Element detectou uma configuração personalizada do servidor para a sua ID de usuário \"%1$s\":
\n%2$s</string>
<string name="autodiscover_well_known_autofill_confirm">Usar a Configuração</string>
@ -1632,8 +1632,8 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="sas_error_m_user">O contato cancelou a confirmação</string>
<string name="sas_error_m_timeout">O tempo de confirmação expirou</string>
<string name="sas_error_m_unknown_transaction">A sessão não sabe sobre essa transacção</string>
<string name="sas_error_m_unknown_method">A sessão não pode chegar a acordo sobre a chave, método hash, MAC, or SAS</string>
<string name="sas_error_m_unknown_transaction">A sessão não sabe sobre essa transação</string>
<string name="sas_error_m_unknown_method">A sessão não concorda com a chave, método hash, MAC, ou SAS</string>
<string name="sas_error_m_mismatched_commitment">O compromisso de hash não coincidiu</string>
<string name="sas_error_m_mismatched_sas">O SAS não corresponde</string>
<string name="sas_error_m_unexpected_message">A sessão recebeu uma mensagem inesperada</string>
@ -1881,8 +1881,8 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
\n
\nSe você não quiser ver mais conteúdo deste usuário, você pode bloqueá-lo para esconder suas mensagens</string>
<string name="permissions_rationale_msg_keys_backup_export">Element precisa de permissão para salvar suas chaves E2E no aparelho.
\n
<string name="permissions_rationale_msg_keys_backup_export">Element precisa de permissão para salvar suas chaves E2E no aparelho.
\n
\nPermita o acesso na próxima janela para poder exportar suas chaves manualmente.</string>
<string name="no_network_indicator">Não há conexão de rede no momento</string>
@ -1945,12 +1945,12 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="login_server_url_form_common_notice">Digite o endereço do servidor que você deseja usar</string>
<string name="login_sso_error_message">Ocorreu um erro ao carregar a página: %1$s (%2$d)</string>
<string name="login_mode_not_supported">O aplicativo não pode entrar neste servidor. O servidor suporta os seguintes tipos de login: %1$s.
\n
<string name="login_mode_not_supported">O aplicativo não pode entrar neste servidor. O servidor suporta os seguintes tipos de login: %1$s.
\n
\nDeseja entrar no servidor usando o Element Web\?</string>
<string name="login_registration_disabled">Desculpe, este servidor não está aceitando novas contas.</string>
<string name="login_registration_not_supported">O aplicativo não pode criar uma conta neste servidor.
\n
<string name="login_registration_not_supported">O aplicativo não pode criar uma conta neste servidor.
\n
\nDeseja criar uma conta no servidor usando o Element Web\?</string>
<string name="login_login_with_email_error">Este e-mail não está associado a nenhuma conta.</string>
@ -1978,8 +1978,8 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="login_reset_password_success_submit">Voltar para Entrar</string>
<string name="login_reset_password_cancel_confirmation_title">Atenção</string>
<string name="login_reset_password_cancel_confirmation_content">Sua senha ainda não foi alterada.
\n
<string name="login_reset_password_cancel_confirmation_content">Sua senha ainda não foi alterada.
\n
\nInterromper a alteração de senha\?</string>
<string name="login_set_email_title">Defina um endereço de e-mail</string>
@ -2023,7 +2023,7 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="login_terms_title">Aceitar termos para continuar</string>
<string name="login_wait_for_email_title">Por favor, verifique seu e-mail</string>
<string name="login_wait_for_email_notice">Acabamos de enviar um e-mail para %1$s.
<string name="login_wait_for_email_notice">Acabamos de enviar um e-mail para %1$s.
\nPor favor, clique no link que ele contém para continuar a criação da conta.</string>
<string name="login_validation_code_is_not_correct">O código digitado não está correto. Por favor, verifique-o.</string>
<string name="login_error_outdated_homeserver_title">Servidor desatualizado</string>
@ -2062,13 +2062,13 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="soft_logout_signin_submit">Entrar</string>
<string name="soft_logout_signin_password_hint">Senha</string>
<string name="soft_logout_clear_data_title">Limpar dados pessoais</string>
<string name="soft_logout_clear_data_notice">Atenção: Seus dados pessoais (incluindo chaves de criptografia) ainda estão armazenados neste aparelho.
\n
<string name="soft_logout_clear_data_notice">Atenção: Seus dados pessoais (incluindo chaves de criptografia) ainda estão armazenados neste aparelho.
\n
\nApague-os quando não usar mais este aparelho, ou se quiser entrar em outra conta.</string>
<string name="soft_logout_clear_data_submit">Limpar todos os dados</string>
<string name="soft_logout_clear_data_dialog_title">Limpar dados</string>
<string name="soft_logout_clear_data_dialog_content">Limpar todos os dados atualmente armazenados neste aparelho\?
<string name="soft_logout_clear_data_dialog_content">Limpar todos os dados atualmente armazenados neste aparelho\?
\nEntre novamente para acessar os dados e mensagens da sua conta.</string>
<string name="soft_logout_clear_data_dialog_e2e_warning_content">Você perderá o acesso as mensagens seguras a menos que você faça login para recuperar suas chaves de criptografia.</string>
<string name="soft_logout_clear_data_dialog_submit">Limpar dados</string>
@ -2113,11 +2113,11 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="verification_green_shield">Procure o escudo verde para garantir que um usuário seja confiável. Confie em todos os usuários numa sala para garantir que a sala é segura.</string>
<string name="verification_conclusion_not_secure">Não seguro</string>
<string name="verification_conclusion_compromised">Um dos seguintes casos pode estar comprometido:
\n
\n·- Seu servidor doméstico
\n·- O servidor do usuário que você está verificando
\n·- A sua, ou a conexão de outros usuários à internet
<string name="verification_conclusion_compromised">Um dos seguintes casos pode estar comprometido:
\n
\n·- Seu servidor doméstico
\n·- O servidor do usuário que você está verificando
\n·- A sua, ou a conexão de outros usuários à internet
\n·- O seu, ou o aparelho dos outros usuários</string>
<string name="sent_a_video">Vídeo.</string>
@ -2153,8 +2153,8 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="verification_verify_user">Confirmar %s</string>
<string name="verification_verified_user">Confirmou %s</string>
<string name="verification_request_waiting_for">Aguardando por %s…</string>
<string name="verification_request_alert_description">Para segurança extra, confirme %s comparando um código único em ambos os aparelhos.
\n
<string name="verification_request_alert_description">Para segurança extra, confirme %s comparando um código único em ambos os aparelhos.
\n
\nPara máxima segurança, faça isso pessoalmente.</string>
<string name="room_profile_not_encrypted_subtitle">As mensagens nesta sala não estão criptografadas de ponta a ponta.</string>
<string name="room_profile_encrypted_subtitle">As mensagens nesta sala estão criptografadas de ponta a ponta.
@ -2193,7 +2193,7 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="unignore">Desbloquear</string>
<string name="verify_cannot_cross_sign">Esta sessão não pode compartilhar essa confirmação com suas outras sessões.
<string name="verify_cannot_cross_sign">Esta sessão não pode compartilhar essa confirmação com suas outras sessões.
\nA confirmação será salvada localmente e será compartilhada em uma versão futura do aplicativo.</string>
<string name="room_list_sharing_header_recent_rooms">Salas recentes</string>
@ -2337,13 +2337,13 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="verify_cancel_self_verification_from_trusted">Se você cancelar, você não poderá ler mensagens criptografadas em seu novo aparelho, e outros usuários não confiarão nele</string>
<string name="verify_cancel_other">Você não confirmará %1$s (%2$s) se cancelar agora. Precisará começar novamente no perfil dele.</string>
<string name="verify_not_me_self_verification">Um dos seguintes casos pode estar comprometido:
\n
\n- Sua senha
\n- Seu servidor doméstico
\n- Este aparelho, ou o outro aparelho
\n- A conexão à internet de qualquer um dos aparelhos que você está usando
\n
<string name="verify_not_me_self_verification">Um dos seguintes casos pode estar comprometido:
\n
\n- Sua senha
\n- Seu servidor doméstico
\n- Este aparelho, ou o outro aparelho
\n- A conexão à internet de qualquer um dos aparelhos que você está usando
\n
\nRecomendamos que você altere imediatamente a sua senha e a chave de recuperação em Configurações.</string>
<string name="verify_cancelled_notice">Confirme seus aparelhos em Configurações.</string>
@ -2466,7 +2466,7 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="change_password_summary">Definir uma nova senha da conta…</string>
<string name="use_other_session_content_description">Use o Element mais recente em seus outros aparelhos: Element Web, Element para Computador, Element para iOS, Element para Android, ou outro cliente Matrix capaz de fazer autoverificação</string>
<string name="app_desktop_web">Element Web
<string name="app_desktop_web">Element Web
\nElement para Computador</string>
<string name="app_ios_android">Element para iOS
\nElement para Android</string>
@ -2495,8 +2495,8 @@ Na próxima tela, você será solicitado a permitir que o Element funcione sempr
<string name="error_empty_field_choose_user_name">Escolha um nome de usuário.</string>
<string name="error_empty_field_choose_password">Escolha uma senha.</string>
<string name="external_link_confirmation_title">Verificar este link</string>
<string name="external_link_confirmation_message">O link %1$s redirecionará você para outro site: %2$s.
\n
<string name="external_link_confirmation_message">O link %1$s redirecionará você para outro site: %2$s.
\n
\nDeseja continuar\?</string>
<string name="create_room_dm_failure">Não foi possível criar sua DM. Por favor, verifique os usuários que você deseja convidar e tente novamente.</string>

View File

@ -1685,7 +1685,7 @@
<string name="settings_discovery_category">Обнаружение</string>
<string name="settings_call_ringtone_use_default_stun_sum">Будет использовать%s в качестве помощника, если ваш домашний сервер не предлагает его (ваш IP-адрес будет доступен во время разговора)</string>
<string name="invite_no_identity_server_error">Добавьте идентификационный сервер в свои настройки, чтобы выполнить это действие.</string>
<string name="settings_background_fdroid_sync_mode">Режим фоновой синхронизации (Экспериментальный)</string>
<string name="settings_background_fdroid_sync_mode">Режим фоновой синхронизации</string>
<string name="settings_background_fdroid_sync_mode_battery_description">Element будет синхронизироваться в фоновом режиме таким образом, чтобы сохранить ограниченные ресурсы устройства (батарея).
\nВ зависимости от состояния ресурса вашего устройства, синхронизация может быть отложена операционной системой.</string>
<string name="settings_background_fdroid_sync_mode_real_time_description">Element будет синхронизироваться в фоновом режиме периодически в точное время (настраивается).
@ -2716,4 +2716,18 @@
<string name="error_opening_banned_room">Невозможно открыть комнату, в которую вам запрещён доступ.</string>
<string name="room_error_not_found">Невозможно найти эту комнату. Убедитесь, что она существует.</string>
<plurals name="seconds">
<item quantity="one">%d секунда</item>
<item quantity="few">%d секунды</item>
<item quantity="many">%d секунд</item>
</plurals>
<string name="settings_show_room_member_state_events">Показать события статуса участников комнаты</string>
<string name="settings_show_room_member_state_events_summary">Включает в себя события приглашения/ присоединения/выхода/исключения/бана и изменение аватара/отображаемого имени.</string>
<string name="sent_a_poll">Голосование</string>
<string name="sent_a_bot_buttons">Кнопки бота</string>
<string name="sent_a_reaction">Отреагировал: %s</string>
<string name="sent_verification_conclusion">Результат проверки</string>
<string name="universal_link_malformed">Ссылка была искажена</string>
</resources>

View File

@ -346,11 +346,11 @@
<string name="permissions_rationale_msg_camera">Element behöver tillstånd att komma åt din kamera för att kunna ta bilder och hålla videosamtal.</string>
<string name="permissions_rationale_msg_camera_explanation">"
\n
\nVänligen ge tillstånd i nästa popup för att kunna utföra samtalet."</string>
\nVänligen ge åtkomst i nästa popup för att kunna utföra samtalet."</string>
<string name="permissions_rationale_msg_record_audio">Element behöver tillstånd att komma åt din mikrofon för hålla röstsamtal.</string>
<string name="permissions_rationale_msg_record_audio_explanation">"
\n
\nVänligen ge tillstånd i nästa popup för att kunna utföra samtalet."</string>
\nVänligen ge åtkomst i nästa popup för att kunna utföra samtalet."</string>
<string name="permissions_rationale_msg_camera_and_audio">Element behöver tillstånd att komma åt din kamera och mikrofon för att kunna utföra videosamtal.
\n
\nVänligen ge tillstånd i nästa popup för att kunna utföra samtalet.</string>
@ -525,7 +525,7 @@
<string name="settings_add_3pid_confirm_password_title">Bekräfta ditt lösenord</string>
<string name="settings_containing_my_display_name">Meddelanden som innehåller mitt visningsnamn</string>
<string name="settings_user_settings">Användarinställningar</string>
<string name="settings_show_avatar_display_name_changes_messages_summary">Innehåller ändringar av avatar eller visningsnamn.</string>
<string name="settings_show_avatar_display_name_changes_messages_summary">Innehåller byten av avatar eller visningsnamn.</string>
<string name="devices_delete_dialog_text">Den här handlingen kräver extra autentisering.
\nFör att fortsätta, skriv in ditt lösenord.</string>
<string name="devices_delete_pswd">Lösenord:</string>
@ -1294,7 +1294,7 @@
<string name="settings_notification_privacy_no_background_sync">Apparna behöver <b>inte</b> ansluta till hemservern i bakgrunden, det bör reducera batterianvändning</string>
<string name="settings_turn_screen_on">Tänd skärmen i 3 sekunder</string>
<string name="settings_background_sync">Bakgrundssynkronisering</string>
<string name="settings_background_fdroid_sync_mode">Bakgrundssynkläge (experimentellt)</string>
<string name="settings_background_fdroid_sync_mode">Bakgrundssynkläge</string>
<string name="settings_background_fdroid_sync_mode_battery">Optimerad för batteri</string>
<string name="settings_app_term_conditions">Användarvillkor</string>
<string name="settings_third_party_notices">Meddelanden från tredje part</string>
@ -2125,7 +2125,7 @@
<string name="login_server_url_form_modular_hint">Element Matrix Services-adress</string>
<string name="login_server_url_form_other_hint">Adress</string>
<string name="login_server_url_form_modular_text">Premiumservervärd för organisationer</string>
<string name="login_server_url_form_modular_notice">Skriv in adressen för Modular Element eller servern du vill använda</string>
<string name="login_server_url_form_modular_notice">Skriv in adressen för den Modular Element eller server du vill använda</string>
<string name="login_server_url_form_other_notice">Skriv in adressen för en server eller Element du vill ansluta till</string>
<string name="login_server_url_form_common_notice">Skriv in adressen för servern du vill använda</string>
@ -2547,4 +2547,17 @@
<string name="error_opening_banned_room">Kan inte öppna ett rum du är bannad från.</string>
<string name="room_error_not_found">Kan inte hitta det här rummet. Se till att det existerar.</string>
<plurals name="seconds">
<item quantity="one">%d sekund</item>
<item quantity="other">%d sekunder</item>
</plurals>
<string name="settings_show_room_member_state_events">Visa statushändelser angående rumsmedlemmar</string>
<string name="settings_show_room_member_state_events_summary">Inkluderar när personer bjuds in, går med, lämnar, kickas, bannas eller byter sin avatar eller sitt namn.</string>
<string name="sent_a_poll">Omröstning</string>
<string name="sent_a_bot_buttons">Bottknappar</string>
<string name="sent_a_reaction">Reagerade med: %s</string>
<string name="sent_verification_conclusion">Verifieringsavslutning</string>
<string name="universal_link_malformed">Länken var felformaterad</string>
</resources>

View File

@ -1539,7 +1539,7 @@ Matrix 中的消息可見度類似于電子郵件。我們忘記您的郵件意
<string name="settings_call_ringtone_use_default_stun">允許汰退呼叫協助伺服器</string>
<string name="settings_call_ringtone_use_default_stun_sum">當您的家伺服器未提供時,將會使用 %s 做為協助(您的 IP 位置將會在通話時被分享)</string>
<string name="invite_no_identity_server_error">在您的設定中新增一臺身份識別伺服器以執行此動作。</string>
<string name="settings_background_fdroid_sync_mode">背景同步模式(實驗性)</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">Element 將會在背景同步以節省裝置的有限資源(電池)。
\n取決於您裝置的資源狀態作業系統可能會延遲同步。</string>
@ -2562,4 +2562,16 @@ Matrix 中的消息可見度類似于電子郵件。我們忘記您的郵件意
<string name="error_opening_banned_room">無法開啟禁止您進入的聊天室。</string>
<string name="room_error_not_found">找不到此聊天室。請確定它存在。</string>
<plurals name="seconds">
<item quantity="other">%d 秒</item>
</plurals>
<string name="settings_show_room_member_state_events">顯示聊天室成員狀態活動</string>
<string name="settings_show_room_member_state_events_summary">包含邀請/加入/離開/踢除/封鎖事件與大頭貼/顯示名稱變更等。</string>
<string name="sent_a_poll">投票</string>
<string name="sent_a_bot_buttons">機器人按鈕</string>
<string name="sent_a_reaction">反應:%s</string>
<string name="sent_verification_conclusion">驗證結論</string>
<string name="universal_link_malformed">連結格式錯誤</string>
</resources>

View File

@ -1988,6 +1988,7 @@
<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>
<string name="login_error_outdated_homeserver_warning_content">This homeserver is running an old version. Ask your homeserver admin to upgrade. You can continue, but some features may not work correctly.</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>

View File

@ -56,8 +56,7 @@
<im.vector.app.core.preference.VectorSwitchPreference
android:key="SETTINGS_ALWAYS_SHOW_TIMESTAMPS_KEY"
android:title="@string/settings_always_show_timestamps"
app:isPreferenceVisible="@bool/false_not_implemented" />
android:title="@string/settings_always_show_timestamps" />
<im.vector.app.core.preference.VectorSwitchPreference
android:key="SETTINGS_12_24_TIMESTAMPS_KEY"