Widgets: clean again after Benoit's review

This commit is contained in:
ganfra 2020-06-03 12:00:52 +02:00
parent 53592ac404
commit 0507fa5b0e
42 changed files with 66 additions and 143 deletions

View File

@ -24,6 +24,13 @@ data class MatrixConfiguration(
val cryptoConfig: MXCryptoConfig = MXCryptoConfig(),
val integrationUIUrl: String = "https://scalar.vector.im/",
val integrationRestUrl: String = "https://scalar.vector.im/api",
val integrationWidgetUrls: List<String> = listOf(
"https://scalar.vector.im/_matrix/integrations/v1",
"https://scalar.vector.im/api",
"https://scalar-staging.vector.im/_matrix/integrations/v1",
"https://scalar-staging.vector.im/api",
"https://scalar-staging.riot.im/scalar/api"
),
/**
* Optional proxy to connect to the matrix servers
* You can create one using for instance Proxy(proxyType, InetSocketAddress(hostname, port)

View File

@ -20,6 +20,7 @@ import android.net.Uri
import com.squareup.moshi.JsonClass
import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig.Builder
import im.vector.matrix.android.internal.network.ssl.Fingerprint
import im.vector.matrix.android.internal.util.ensureTrailingSlash
import okhttp3.CipherSuite
import okhttp3.TlsVersion
@ -71,15 +72,11 @@ data class HomeServerConnectionConfig(
throw RuntimeException("Invalid home server URI: " + hsUri)
}
// ensure trailing /
homeServerUri = if (!hsUri.toString().endsWith("/")) {
try {
val url = hsUri.toString()
Uri.parse("$url/")
} catch (e: Exception) {
throw RuntimeException("Invalid home server URI: $hsUri")
}
} else {
hsUri
val hsString = hsUri.toString().ensureTrailingSlash()
homeServerUri = try {
Uri.parse(hsString)
} catch (e: Exception) {
throw RuntimeException("Invalid home server URI: $hsUri")
}
return this
}
@ -97,15 +94,11 @@ data class HomeServerConnectionConfig(
throw RuntimeException("Invalid identity server URI: $identityServerUri")
}
// ensure trailing /
if (!identityServerUri.toString().endsWith("/")) {
try {
val url = identityServerUri.toString()
this.identityServerUri = Uri.parse("$url/")
} catch (e: Exception) {
throw RuntimeException("Invalid identity server URI: $identityServerUri")
}
} else {
this.identityServerUri = identityServerUri
val isString = identityServerUri.toString().ensureTrailingSlash()
this.identityServerUri = try {
Uri.parse(isString)
} catch (e: Exception) {
throw RuntimeException("Invalid identity server URI: $identityServerUri")
}
return this
}

View File

@ -18,6 +18,7 @@ package im.vector.matrix.android.internal.network
import com.squareup.moshi.Moshi
import dagger.Lazy
import im.vector.matrix.android.internal.util.ensureTrailingSlash
import okhttp3.Call
import okhttp3.OkHttpClient
import okhttp3.Request
@ -28,14 +29,8 @@ import javax.inject.Inject
class RetrofitFactory @Inject constructor(private val moshi: Moshi) {
fun create(okHttpClient: Lazy<OkHttpClient>, baseUrl: String): Retrofit {
// ensure trailing /
val safeBaseUrl = if (!baseUrl.endsWith("/")) {
"$baseUrl/"
} else {
baseUrl
}
return Retrofit.Builder()
.baseUrl(safeBaseUrl)
.baseUrl(baseUrl.ensureTrailingSlash())
.callFactory(object : Call.Factory {
override fun newCall(request: Request): Call {
return okHttpClient.get().newCall(request)

View File

@ -19,16 +19,16 @@ package im.vector.matrix.android.internal.session.content
import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig
import im.vector.matrix.android.api.session.content.ContentUrlResolver
import im.vector.matrix.android.internal.network.NetworkConstants
import im.vector.matrix.android.internal.util.ensureTrailingSlash
import javax.inject.Inject
private const val MATRIX_CONTENT_URI_SCHEME = "mxc://"
internal class DefaultContentUrlResolver @Inject constructor(homeServerConnectionConfig: HomeServerConnectionConfig) : ContentUrlResolver {
private val baseUrl = homeServerConnectionConfig.homeServerUri.toString()
private val sep = if (baseUrl.endsWith("/")) "" else "/"
private val baseUrl = homeServerConnectionConfig.homeServerUri.toString().ensureTrailingSlash()
override val uploadUrl = baseUrl + sep + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload"
override val uploadUrl = baseUrl + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload"
override fun resolveFullSize(contentUrl: String?): String? {
return contentUrl
@ -66,7 +66,7 @@ internal class DefaultContentUrlResolver @Inject constructor(homeServerConnectio
serverAndMediaId = serverAndMediaId.substring(0, fragmentOffset)
}
return baseUrl + sep + prefix + serverAndMediaId + params + fragment
return baseUrl + prefix + serverAndMediaId + params + fragment
}
private fun String.isValidMatrixContentUrl(): Boolean {

View File

@ -36,6 +36,7 @@ import im.vector.matrix.android.internal.session.user.accountdata.UpdateUserAcco
import im.vector.matrix.android.internal.task.TaskExecutor
import im.vector.matrix.android.internal.task.launchToCallback
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
import im.vector.matrix.android.internal.util.ensureTrailingSlash
import okhttp3.OkHttpClient
import javax.inject.Inject
@ -55,17 +56,10 @@ internal class DefaultTermsService @Inject constructor(
baseUrl: String,
callback: MatrixCallback<GetTermsResponse>): Cancelable {
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, callback) {
val sep = if (baseUrl.endsWith("/")) "" else "/"
val url = when (serviceType) {
TermsService.ServiceType.IntegrationManager -> "$baseUrl$sep${NetworkConstants.URI_INTEGRATION_MANAGER_PATH}"
TermsService.ServiceType.IdentityService -> "$baseUrl$sep${NetworkConstants.URI_IDENTITY_PATH_V2}"
}
val url = buildUrl(baseUrl, serviceType)
val termsResponse = executeRequest<TermsResponse>(null) {
apiCall = termsAPI.getTerms("${url}terms")
}
GetTermsResponse(termsResponse, getAlreadyAcceptedTermUrlsFromAccountData())
}
}
@ -76,13 +70,7 @@ internal class DefaultTermsService @Inject constructor(
token: String?,
callback: MatrixCallback<Unit>): Cancelable {
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, callback) {
val sep = if (baseUrl.endsWith("/")) "" else "/"
val url = when (serviceType) {
TermsService.ServiceType.IntegrationManager -> "$baseUrl$sep${NetworkConstants.URI_INTEGRATION_MANAGER_PATH}"
TermsService.ServiceType.IdentityService -> "$baseUrl$sep${NetworkConstants.URI_IDENTITY_PATH_V2}"
}
val url = buildUrl(baseUrl, serviceType)
val tokenToUse = token?.takeIf { it.isNotEmpty() } ?: getToken(baseUrl)
executeRequest<Unit>(null) {
@ -112,6 +100,14 @@ internal class DefaultTermsService @Inject constructor(
return token.token
}
private fun buildUrl(baseUrl: String, serviceType: TermsService.ServiceType): String {
val servicePath = when (serviceType) {
TermsService.ServiceType.IntegrationManager -> NetworkConstants.URI_INTEGRATION_MANAGER_PATH
TermsService.ServiceType.IdentityService -> NetworkConstants.URI_IDENTITY_PATH_V2
}
return "${baseUrl.ensureTrailingSlash()}$servicePath"
}
private fun getAlreadyAcceptedTermUrlsFromAccountData(): Set<String> {
return accountDataDataSource.getAccountDataEvent(UserAccountData.TYPE_ACCEPTED_TERMS)
?.content

View File

@ -16,21 +16,20 @@
package im.vector.matrix.android.internal.session.widgets
import im.vector.matrix.android.R
import im.vector.matrix.android.api.MatrixConfiguration
import im.vector.matrix.android.api.session.integrationmanager.IntegrationManagerConfig
import im.vector.matrix.android.api.session.integrationmanager.IntegrationManagerService
import im.vector.matrix.android.api.session.widgets.WidgetURLFormatter
import im.vector.matrix.android.internal.session.SessionScope
import im.vector.matrix.android.internal.session.integrationmanager.IntegrationManager
import im.vector.matrix.android.internal.session.widgets.token.GetScalarTokenTask
import im.vector.matrix.android.internal.util.StringProvider
import java.net.URLEncoder
import javax.inject.Inject
@SessionScope
internal class DefaultWidgetURLFormatter @Inject constructor(private val integrationManager: IntegrationManager,
private val getScalarTokenTask: GetScalarTokenTask,
private val stringProvider: StringProvider
private val matrixConfiguration: MatrixConfiguration
) : IntegrationManagerService.Listener, WidgetURLFormatter {
private lateinit var currentConfig: IntegrationManagerConfig
@ -53,11 +52,10 @@ internal class DefaultWidgetURLFormatter @Inject constructor(private val integra
val preferredConfig = integrationManager.getPreferredConfig()
if (!this::currentConfig.isInitialized || preferredConfig != currentConfig) {
currentConfig = preferredConfig
val defaultWhiteList = stringProvider.getStringArray(R.array.integrations_widgets_urls).asList()
whiteListedUrls = when (preferredConfig.kind) {
IntegrationManagerConfig.Kind.DEFAULT -> defaultWhiteList
IntegrationManagerConfig.Kind.ACCOUNT -> defaultWhiteList + preferredConfig.restUrl
IntegrationManagerConfig.Kind.HOMESERVER -> listOf(preferredConfig.restUrl)
whiteListedUrls = if (matrixConfiguration.integrationWidgetUrls.isEmpty()) {
listOf(preferredConfig.restUrl)
} else {
matrixConfiguration.integrationWidgetUrls
}
}
}

View File

@ -37,3 +37,14 @@ internal fun String.ensureProtocol(): String {
else -> this
}
}
/**
* Ensure string has trailing /
*/
internal fun String.ensureTrailingSlash(): String {
return when {
isEmpty() -> this
!endsWith("/") -> "$this/"
else -> this
}
}

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="integrations_widgets_urls" translatable="false">
<item>https://scalar.vector.im/_matrix/integrations/v1</item>
<item>https://scalar.vector.im/api</item>
<item>https://scalar-staging.vector.im/_matrix/integrations/v1</item>
<item>https://scalar-staging.vector.im/api</item>
<item>https://scalar-staging.riot.im/scalar/api</item>
</string-array>
</resources>

View File

@ -82,12 +82,12 @@
<string name="notice_room_third_party_registered_invite">%1$s accepted the invitation for %2$s</string>
<string name="notice_room_third_party_registered_invite_by_you">You accepted the invitation for %1$s</string>
<string name="notice_widget_added">%1$s widget added by %2$s</string>
<string name="notice_widget_added_by_you">%1$s widget added by you</string>
<string name="notice_widget_removed">%1$s widget removed by %2$s</string>
<string name="notice_widget_removed_by_you">%1$s widget removed by you</string>
<string name="notice_widget_modified">%1$s widget modified by %2$s</string>
<string name="notice_widget_modified_by_you">%1$s widget modified by you</string>
<string name="notice_widget_added">%1$s added %2$s widget</string>
<string name="notice_widget_added_by_you">you added %1$s widget</string>
<string name="notice_widget_removed">%1$s removed %2$s widget</string>
<string name="notice_widget_removed_by_you">you removed %1$s widget</string>
<string name="notice_widget_modified">%1$s modified %2$s widget</string>
<string name="notice_widget_modified_by_you">you modified %1$s widget</string>
<string name="notice_crypto_unable_to_decrypt">** Unable to decrypt: %s **</string>
<string name="notice_crypto_error_unkwown_inbound_session_id">The sender\'s device has not sent us the keys for this message.</string>

View File

@ -88,26 +88,26 @@ class NoticeEventFormatter @Inject constructor(private val sessionHolder: Active
val widgetContent: WidgetContent = event.getClearContent().toModel() ?: return null
val previousWidgetContent: WidgetContent? = event.prevContent.toModel()
return if (widgetContent.isActive()) {
val name = widgetContent.getHumanName()
val widgetName = widgetContent.getHumanName()
if (previousWidgetContent?.isActive().orFalse()) {
if (event.isSentByCurrentUser()) {
sp.getString(R.string.notice_widget_modified_by_you, name, disambiguatedDisplayName)
sp.getString(R.string.notice_widget_modified_by_you, widgetName)
} else {
sp.getString(R.string.notice_widget_modified, name, disambiguatedDisplayName)
sp.getString(R.string.notice_widget_modified, disambiguatedDisplayName, widgetName)
}
} else {
if (event.isSentByCurrentUser()) {
sp.getString(R.string.notice_widget_added_by_you, name, disambiguatedDisplayName)
sp.getString(R.string.notice_widget_added_by_you, widgetName)
} else {
sp.getString(R.string.notice_widget_added, name, disambiguatedDisplayName)
sp.getString(R.string.notice_widget_added, disambiguatedDisplayName, widgetName)
}
}
} else {
val name = previousWidgetContent?.getHumanName()
val widgetName = previousWidgetContent?.getHumanName()
if (event.isSentByCurrentUser()) {
sp.getString(R.string.notice_widget_removed_by_you, name, disambiguatedDisplayName)
sp.getString(R.string.notice_widget_removed_by_you, widgetName)
} else {
sp.getString(R.string.notice_widget_removed, name, disambiguatedDisplayName)
sp.getString(R.string.notice_widget_removed, disambiguatedDisplayName, widgetName)
}
}
}

View File

@ -990,8 +990,6 @@
<item quantity="many">%d رسالة إخطار غير مقروءة</item>
<item quantity="other">%d رسالة إخطار غير مقروءة</item>
</plurals>
<string name="event_formatter_widget_added">أضاف %2$s المستخدم %1$s</string>
<string name="event_formatter_widget_removed">أزال %2$s المستخدم %1$s</string>
<string name="settings_labs_keyboard_options_to_send_message">استخدم مفتاح الإدخال في لوحة المفاتيح لإرسال الرسالة</string>
<string name="command_description_ban_user">يمنع المستخدم حسب المعرّف المعطى</string>
<string name="command_description_unban_user">يُلغي المنع عن المستخدم حسب المعرّف المعطى</string>

View File

@ -648,8 +648,6 @@
<string name="widget_no_power_to_manage">Трябва Ви разрешение, за да управлявате приспособленията в тази стая</string>
<string name="widget_creation_failure">Създаване на приспособлението беше неуспешно</string>
<string name="event_formatter_widget_added">%1$s добавено от %2$s</string>
<string name="event_formatter_widget_removed">%1$s премахнато от %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Създаване на групови разговори с jitsi</string>
<string name="widget_delete_message_confirmation">Сигурни ли сте, че искате да изтриете приспособлението от тази стая?</string>
<plurals name="active_widgets">

View File

@ -1042,8 +1042,6 @@
<string name="widget_no_power_to_manage">আপনি এই রুমে উইজেট পরিচালনা করার অনুমতি প্রয়োজন</string>
<string name="widget_creation_failure">উইজেট এর নির্মাণ ব্যর্থ হয়েছে</string>
<string name="event_formatter_widget_added">%1$s %2$s দ্বারা যোগ করা হয়েছে</string>
<string name="event_formatter_widget_removed">%1$s %2$s দ্বারা সরানো হয়েছে</string>
<string name="settings_labs_create_conference_with_jitsi">Jitsi সঙ্গে কনফারেন্স কল তৈরি করুন</string>
<string name="widget_delete_message_confirmation">আপনি কি এই রুমে উইজেট মুছে ফেলতে চান\?</string>
<plurals name="active_widgets">

View File

@ -738,8 +738,6 @@ Atenció: es podria eliminar aquest fitxer si es desinstal·la l\'aplicació.</s
<!-- Widget-->
<string name="widget_no_power_to_manage">No teniu permisos per a gestionar ginys en aquesta sala</string>
<string name="widget_creation_failure">Ha fallat la creació del giny</string>
<string name="event_formatter_widget_added">%1$s afegit per %2$s</string>
<string name="event_formatter_widget_removed">%1$s retirat per %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Fes conferències amb jitsi</string>
<string name="widget_delete_message_confirmation">Confirmeu que voleu esborrar el giny d\'aquesta sala?</string>

View File

@ -1145,8 +1145,6 @@ Vaši e-mailovou adresu můžete přidat k profilu v nastavení.</string>
<string name="widget_no_power_to_manage">Pro správu widgetů v této místnosti potřebujete oprávnění</string>
<string name="widget_creation_failure">Založení widgetu se nezdařilo</string>
<string name="event_formatter_widget_added">%2$s přidal %1$s</string>
<string name="event_formatter_widget_removed">%2$s odstranil(a) %1$s</string>
<string name="settings_labs_create_conference_with_jitsi">Založit konferenční hovor s jitsi</string>
<string name="widget_delete_message_confirmation">Jste si jisti, že chcete smazat widget z této místnosti\?</string>
<plurals name="active_widgets">

View File

@ -704,8 +704,6 @@ Du kannst sie jetzt aktivieren oder später über das Einstellungsmenü.</string
<string name="widget_no_power_to_manage">Um Widgets in diesem Raum zu verwalten, ist eine Berechtigung erforderlich</string>
<string name="widget_creation_failure">Widget konnte nicht erstellt werden</string>
<string name="event_formatter_widget_added">%1$s hinzugefügt von %2$s</string>
<string name="event_formatter_widget_removed">%1$s entfernt von %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Konferenzgespräche mit jitsi durchführen</string>
<string name="widget_delete_message_confirmation">Soll das Widget wirklich aus diesem Raum gelöscht werden?</string>

View File

@ -735,8 +735,6 @@ Puedes hacerlo ahora o más tarde desde los ajustes de la aplicación.</string>
<string name="widget_no_power_to_manage">Necesitas permiso para gestionar los componentes en esta sala</string>
<string name="widget_creation_failure">La creación del componente falló</string>
<string name="event_formatter_widget_added">%1$s añadido por %2$s</string>
<string name="event_formatter_widget_removed">%1$s eliminado por %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Crear llamadas de conferencia con jitsi</string>
<string name="widget_delete_message_confirmation">¿Seguro que quieres eliminar el widget de esta sala\?</string>

View File

@ -659,8 +659,6 @@ Orain egin dezakezu edo gero aplikazioaren ezarpenetatik.</string>
<string name="widget_no_power_to_manage">Baimena behar duzu gela honetako trepetak kudeatzeko</string>
<string name="widget_creation_failure">Trepetaren sorrerak huts egin du</string>
<string name="event_formatter_widget_added">%1$s gehitu du %2$s erabiltzaileak</string>
<string name="event_formatter_widget_removed">%1$s kendu du %2$s erabiltzaileak</string>
<string name="settings_labs_create_conference_with_jitsi">Sortu konferentzia deiak Jitsi bidez</string>
<string name="widget_delete_message_confirmation">Ziur trepeta ezabatu nahi duzula gela honetatik?</string>

View File

@ -734,8 +734,6 @@
<string name="widget_no_power_to_manage">Tarvitse oikeudet pienoissovellusten hallintaan tässä huoneessa</string>
<string name="widget_creation_failure">Pienoissovelluksen luonti epäonnistui</string>
<string name="event_formatter_widget_added">%2$s lisäsi %1$s:n</string>
<string name="event_formatter_widget_removed">%2$s poisti %1$s:n</string>
<string name="settings_labs_create_conference_with_jitsi">Luo konferenssipuheluita jitsin avulla</string>
<string name="widget_delete_message_confirmation">Haluatko varmasti poistaa pienoissovelluksen tästä huoneesta\?</string>

View File

@ -669,8 +669,6 @@ Vous pouvez le faire maintenant ou plus tard à partir des paramètres de lap
<string name="widget_no_power_to_manage">Vous avez besoin dune permission pour gérer les widgets de ce salon</string>
<string name="widget_creation_failure">La création du widget a échoué</string>
<string name="event_formatter_widget_added">%1$s ajouté par %2$s</string>
<string name="event_formatter_widget_removed">%1$s supprimé par %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Créer des appels en téléconférence avec jitsi</string>
<string name="widget_delete_message_confirmation">Voulez-vous vraiment supprimer le widget de ce salon ?</string>

View File

@ -456,8 +456,6 @@ Pode engadir a dirección de correo na sección de configuración de perfil.</st
<string name="huge">Enorme</string>
<string name="widget_creation_failure">Fallou a creación do trebello</string>
<string name="event_formatter_widget_added">%1$s engadido por %2$s</string>
<string name="event_formatter_widget_removed">%1$s eliminado por %2$s</string>
<plurals name="active_widgets">
<item quantity="one">1 trebello activo</item>
<item quantity="other">%d trebellos activos</item>

View File

@ -660,8 +660,6 @@ Ezt megteheted most vagy később az alkalmazás beállítások alatt.</string>
<string name="widget_no_power_to_manage">Engedélyre van szükséged a kisalkalmazások ebben a szobában való kezeléséhez</string>
<string name="widget_creation_failure">Kisalkalmazás létrehozása sikertelen</string>
<string name="event_formatter_widget_added">%1$s hozzá lett adva %2$s által</string>
<string name="event_formatter_widget_removed">%1$s eltávolításra került %2$s által</string>
<string name="settings_labs_create_conference_with_jitsi">Hozz létre konferencia hívást a jitsi segítségével</string>
<string name="widget_delete_message_confirmation">Biztos vagy benne hogy törölni akarod ezt a kisalkalmazást ebből a szobából?</string>

View File

@ -578,8 +578,6 @@ Perhatikan bahwa tindakan ini akan memulai ulang aplikasi dan mungkin cukup mema
<string name="widget_no_power_to_manage">Anda butuh permisi untuk mengurus widget di ruang ini</string>
<string name="widget_creation_failure">Pembuatan widget gagal</string>
<string name="event_formatter_widget_added">%1$s ditambahkan oleh %2$s</string>
<string name="event_formatter_widget_removed">%1$s disingkirkan oleh %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Buat panggilan konferensi dengan jitsi</string>
<string name="widget_delete_message_confirmation">Apa Anda yakin ingin menghapus widget tersebut dari ruang ini?</string>
<plurals name="active_widgets">

View File

@ -578,8 +578,6 @@ Perhatikan bahwa tindakan ini akan memulai ulang aplikasi dan mungkin cukup mema
<string name="widget_no_power_to_manage">Anda butuh permisi untuk mengurus widget di ruang ini</string>
<string name="widget_creation_failure">Pembuatan widget gagal</string>
<string name="event_formatter_widget_added">%1$s ditambahkan oleh %2$s</string>
<string name="event_formatter_widget_removed">%1$s disingkirkan oleh %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Buat panggilan konferensi dengan jitsi</string>
<string name="widget_delete_message_confirmation">Apa Anda yakin ingin menghapus widget tersebut dari ruang ini?</string>
<plurals name="active_widgets">

View File

@ -654,8 +654,6 @@ Til að halda áfram skaltu setja inn lykilorðið þitt.</string>
</plurals>
<string name="widget_no_power_to_manage">Þú þarft aðgangsheimildir til að sýsla með viðmótshluta á þessari spjallrás</string>
<string name="widget_creation_failure">Gerð viðmótshluta mistókst</string>
<string name="event_formatter_widget_added">%1$s bætt við af %2$s</string>
<string name="event_formatter_widget_removed">%1$s fjarlægt af %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Búa til símafundi með Jitsi</string>
<string name="widget_delete_message_confirmation">Ertu viss um að þú viljir eyða viðmótshlutanum?</string>
<string name="widget_integration_unable_to_create">Gat ekki búið til viðmótshluta.</string>

View File

@ -712,8 +712,6 @@
<string name="settings_notification_ringtone">Suono delle notifiche</string>
<string name="settings_12_24_timestamps">Mostra gli orari in formato 12 ore</string>
<string name="widget_no_power_to_manage">Devi avere il permesso per poter gestire i widget in questa stanza</string>
<string name="event_formatter_widget_added">%1$s aggiunto da %2$s</string>
<string name="event_formatter_widget_removed">%1$s rimosso da %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Avvia una conferenza usando Jitsi</string>
<string name="widget_delete_message_confirmation">Vuoi davvero eliminare questo widget dalla stanza\?</string>

View File

@ -543,10 +543,8 @@ Riotアプリがあなたの電話帳へアクセスすることを許可しま
<string name="widget_integration_missing_room_id">リクエストに room_id がありません。</string>
<string name="widget_integration_failed_to_send_request">リクエストの送信に失敗しました。</string>
<string name="widget_integration_unable_to_create">ウィジェットを作成できません。</string>
<string name="event_formatter_widget_removed">%1$s は %2$s によって削除されました</string>
<string name="widget_no_power_to_manage">この部屋のウィジェットを管理する権限が必要です</string>
<string name="widget_creation_failure">ウィジェットの作成に失敗しました</string>
<string name="event_formatter_widget_added">%1$s は %2$s によって追加されました</string>
<string name="widget_delete_message_confirmation">ウィジェットをこの部屋から削除してもよろしいですか?</string>
<string name="directory_server_fail_to_retrieve_server">サーバーが利用できないか、オーバーロードしている可能性があります</string>
<string name="unknown_devices_alert_message">この部屋は検証されていない不明なデバイスが含まれています。

View File

@ -1010,8 +1010,6 @@
<string name="widget_no_power_to_manage">이 방에서 위젯을 다루려면 권한이 있어야 합니다</string>
<string name="widget_creation_failure">위젯 생성 실패</string>
<string name="event_formatter_widget_added">%1$s을(를) %2$s님이 추가함</string>
<string name="event_formatter_widget_removed">%1$s을(를) %2$s님이 삭제함</string>
<string name="settings_labs_create_conference_with_jitsi">Jitsi로 회의 전화 만들기</string>
<string name="widget_delete_message_confirmation">이 방에서 위젯을 삭제하겠습니까\?</string>
<plurals name="active_widgets">

View File

@ -763,8 +763,6 @@ Nepazīstamas ierīces:</string>
<string name="widget_no_power_to_manage">Tev nepietiek atļauju, lai rīkotos ar vidžetiem šajā istabā</string>
<string name="widget_creation_failure">Vidžeta izveide neizdevās</string>
<string name="event_formatter_widget_added">%1$s pievienoja %2$s</string>
<string name="event_formatter_widget_removed">%1$s noņēma %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Konferences zvaniem izmantot Jitsi</string>
<string name="widget_delete_message_confirmation">Vai tiešām vēlies dzēst vidžetu?</string>
<plurals name="active_widgets">

View File

@ -725,8 +725,6 @@
<string name="widget_no_power_to_manage">U heeft toestemming nodig om widgets in dit gesprek te beheren</string>
<string name="widget_creation_failure">Aanmaken van widget is mislukt</string>
<string name="event_formatter_widget_added">%1$s is toegevoegd door %2$s</string>
<string name="event_formatter_widget_removed">%1$s is verwijderd door %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Vergadergesprekken maken met jitsi</string>
<string name="widget_delete_message_confirmation">Weet u zeker dat u deze widget uit dit gesprek wilt verwijderen\?</string>

View File

@ -789,8 +789,6 @@ For å gå fram, ver venleg og skriv passordet ditt inn.</string>
<string name="widget_no_power_to_manage">Du trenger tillating til å handsama widgetar i dette rommet</string>
<string name="widget_creation_failure">Widget-laging mislukkast</string>
<string name="event_formatter_widget_added">%1$s lagt til av %2$s</string>
<string name="event_formatter_widget_removed">%1$s fjerna av %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Lag konferansesamtalar med Jitsi</string>
<string name="widget_delete_message_confirmation">Er du sikker på at du vil slette widgeten frå dette rommet\?</string>
<plurals name="active_widgets">

View File

@ -844,8 +844,6 @@ Czy chcesz dodać teraz kilka?</string>
<string name="widget_no_power_to_manage">Potrzebujesz uprawnień do zarządzania widżetami w tym pokoju</string>
<string name="widget_creation_failure">Utworzenie widżetu nie powiodło się</string>
<string name="event_formatter_widget_added">%1$s został dodany przez %2$s</string>
<string name="event_formatter_widget_removed">%1$s został usunięty przez %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Utwórz połączenia konferencyjne za pomocą jitsi</string>
<string name="widget_delete_message_confirmation">Czy na pewno chcesz usunąć widżet z tego pokoju?</string>
<string name="widget_integration_unable_to_create">Nie można utworzyć widżetu.</string>

View File

@ -760,8 +760,6 @@ Atenção: este arquivo poderá ser apagado se o aplicativo for desinstalado.</s
<string name="widget_no_power_to_manage">Você necessita ter permissões para poder gerenciar os widgets desta sala</string>
<string name="widget_creation_failure">A criação do widget falhou</string>
<string name="event_formatter_widget_added">%1$s adicionada/o por %2$s</string>
<string name="event_formatter_widget_removed">%1$s removida/o por %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Criar chamadas de conferência com jitsi</string>
<string name="widget_delete_message_confirmation">Você tem certeza que quer apagar este widget desta sala?</string>

View File

@ -722,8 +722,6 @@ Dispositivos desconhecidos:</string>
<string name="widget_no_power_to_manage">Precisa de permissão para gerir os widgets nesta sala</string>
<string name="widget_creation_failure">Criação de widget falhou</string>
<string name="event_formatter_widget_added">%1$s adicionado por %2$s</string>
<string name="event_formatter_widget_removed">%1$s removido por %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Criar chamadas de conferência com o jitsi</string>
<string name="widget_delete_message_confirmation">Tem a certeza que quer remover o widget?</string>

View File

@ -708,8 +708,6 @@
<string name="settings_notification_ringtone">Звук уведомлений</string>
<string name="settings_12_24_timestamps">Показывать метки времени в 12-часовом формате</string>
<string name="event_formatter_widget_added">%1$s добавлен %2$s</string>
<string name="event_formatter_widget_removed">%1$s удален %2$s</string>
<string name="widget_no_power_to_manage">Вам нужно разрешение на управление виджетами в этой комнате</string>
<string name="widget_creation_failure">Создание виджета не удалось</string>

View File

@ -667,8 +667,6 @@ Môžete to urobiť teraz, alebo to môžete urobiť neskôr v časti Nastavenia
<string name="widget_no_power_to_manage">Musíte mať povolenie meniť widgety v tejto miestnosti</string>
<string name="widget_creation_failure">Nie je možné vytvoriť widget</string>
<string name="event_formatter_widget_added">%2$s pridal widget %1$s</string>
<string name="event_formatter_widget_removed">%2$s odstránil widget %1$s</string>
<string name="settings_labs_create_conference_with_jitsi">Konferenčné hovory uskutočňovať použitím jitsi</string>
<string name="widget_delete_message_confirmation">Ste si istí, že chcete odstrániť widget z tejto miestnosti?</string>

View File

@ -624,8 +624,6 @@
<string name="huge">Të stërmëdha</string>
<string name="widget_creation_failure">Krijimi i widget-it dështoi</string>
<string name="event_formatter_widget_added">%1$s u shtua nga %2$s</string>
<string name="event_formatter_widget_removed">%1$s u hoq nga %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Krijoni thirrje konferencë me Jitsi-n</string>
<string name="widget_delete_message_confirmation">Jeni i sigurt se doni të fshihet widget-i nga kjo dhomë?</string>
<string name="widget_integration_unable_to_create">Sarrihet të krijohet widget-i.</string>

View File

@ -1017,8 +1017,6 @@ Eğer yeni kurtarma yöntemini siz ayarlamadıysanız, bir saldırgan hesabını
<string name="widget_no_power_to_manage">Bu odada widgetları yönetebilmek için izine ihtiyacın var</string>
<string name="widget_creation_failure">Widget oluşturma başarısız</string>
<string name="event_formatter_widget_added">%1$s %2$s tarafından eklendi</string>
<string name="event_formatter_widget_removed">%1$s %2$s tarafından kaldırıldı</string>
<string name="settings_labs_create_conference_with_jitsi">Jitsi ile konferans çağrısı oluştur</string>
<string name="widget_delete_message_confirmation">Bu widget\'ı odadan kaldırmak istediğine emin misin\?</string>
<plurals name="active_widgets">

View File

@ -708,8 +708,6 @@
<!-- Widget-->
<string name="widget_no_power_to_manage">Для керування віджетами у цій кімнаті потрібен дозвіл</string>
<string name="widget_creation_failure">Помилка створення віджету</string>
<string name="event_formatter_widget_added">%1$s додано %2$s</string>
<string name="event_formatter_widget_removed">%1$s видалено %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Здійснювати конференц дзвінки через Jitsi</string>
<string name="widget_delete_message_confirmation">Справді бажаєте видалити віджет?</string>

View File

@ -662,8 +662,6 @@
<string name="widget_no_power_to_manage">您需要权限来管理这个聊天室的小部件</string>
<string name="widget_creation_failure">创建小部件失败</string>
<string name="event_formatter_widget_added">%1$s 被 %2$s 添加</string>
<string name="event_formatter_widget_removed">%1$s 被 %2$s 移除</string>
<string name="settings_labs_create_conference_with_jitsi">用 jitsi 创建会议通话</string>
<string name="widget_delete_message_confirmation">您确定要删除这个小部件吗?</string>

View File

@ -784,8 +784,6 @@
<string name="widget_no_power_to_manage">您需要相關權限以管理此聊天室的小部件</string>
<string name="widget_creation_failure">創建小部件失敗</string>
<string name="event_formatter_widget_added">%1$s 已由 %2$s 新增</string>
<string name="event_formatter_widget_removed">%1$s 被 %2$s 移除</string>
<string name="settings_labs_create_conference_with_jitsi">使用 jitsi 建立會議通話</string>
<string name="widget_delete_message_confirmation">您確定要從聊天室刪除小工具嗎?</string>
<plurals name="active_widgets">

View File

@ -1108,9 +1108,6 @@
<!-- Widget-->
<string name="widget_no_power_to_manage">You need permission to manage widgets in this room</string>
<string name="widget_creation_failure">Widget creation has failed</string>
<string name="event_formatter_widget_added">%1$s widget added by %2$s</string>
<string name="event_formatter_widget_removed">%1$s widget removed by %2$s</string>
<string name="event_formatter_widget_modified">%1$s widget modified by %2$s</string>
<string name="settings_labs_create_conference_with_jitsi">Create conference calls with jitsi</string>
<string name="widget_delete_message_confirmation">Are you sure you want to delete the widget from this room?</string>
<plurals name="active_widgets">