Merge pull request #1682 from oxen-io/release/1.20.1

Release/1.20.1
This commit is contained in:
ThomasSession 2024-10-08 09:26:54 +11:00 committed by GitHub
commit cc67ea10ca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
37 changed files with 306 additions and 206 deletions

View File

@ -13,8 +13,8 @@ configurations.forEach {
it.exclude module: "commons-logging" it.exclude module: "commons-logging"
} }
def canonicalVersionCode = 382 def canonicalVersionCode = 383
def canonicalVersionName = "1.20.0" def canonicalVersionName = "1.20.1"
def postFixSize = 10 def postFixSize = 10
def abiPostFix = ['armeabi-v7a' : 1, def abiPostFix = ['armeabi-v7a' : 1,
@ -56,7 +56,7 @@ android {
splits { splits {
abi { abi {
enable true enable !project.hasProperty('huawei') // huawei builds do not need the split variants
reset() reset()
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
universalApk true universalApk true
@ -68,7 +68,7 @@ android {
} }
composeOptions { composeOptions {
kotlinCompilerExtensionVersion '1.5.14' kotlinCompilerExtensionVersion '1.5.15'
} }
defaultConfig { defaultConfig {
@ -118,6 +118,25 @@ android {
} }
} }
signingConfigs {
play {
if (project.hasProperty('SESSION_STORE_FILE')) {
storeFile file(SESSION_STORE_FILE)
storePassword SESSION_STORE_PASSWORD
keyAlias SESSION_KEY_ALIAS
keyPassword SESSION_KEY_PASSWORD
}
}
huawei {
if (project.hasProperty('SESSION_HUAWEI_STORE_FILE')) {
storeFile file(SESSION_HUAWEI_STORE_FILE)
storePassword SESSION_HUAWEI_STORE_PASSWORD
keyAlias SESSION_HUAWEI_KEY_ALIAS
keyPassword SESSION_HUAWEI_KEY_PASSWORD
}
}
}
flavorDimensions "distribution" flavorDimensions "distribution"
productFlavors { productFlavors {
play { play {
@ -129,6 +148,7 @@ android {
buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.ANDROID" buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.ANDROID"
buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl" buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl"
buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"\"' buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"\"'
signingConfig signingConfigs.play
} }
huawei { huawei {
@ -138,6 +158,7 @@ android {
buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.HUAWEI" buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.HUAWEI"
buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl" buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl"
buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"_HUAWEI\"' buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"_HUAWEI\"'
signingConfig signingConfigs.huawei
} }
website { website {
@ -150,13 +171,15 @@ android {
} }
} }
applicationVariants.forEach { variant -> applicationVariants.configureEach { variant ->
variant.outputs.each { output -> variant.outputs.each { output ->
def abiName = output.getFilter("ABI") ?: 'universal' def abiName = output.getFilter("ABI") ?: 'universal'
def postFix = abiPostFix.get(abiName, 0) def postFix = abiPostFix.get(abiName, 0)
def flavour = (variant.flavorName == 'huawei') ? "-huawei" : ""
if (postFix >= postFixSize) throw new AssertionError("postFix is too large") if (postFix >= postFixSize) throw new AssertionError("postFix is too large")
output.outputFileName = output.outputFileName = "session-${variant.versionName}-${abiName}.apk" output.outputFileName = output.outputFileName = "session-${variant.versionName}-${abiName}${flavour}.apk"
output.versionCodeOverride = canonicalVersionCode * postFixSize + postFix output.versionCodeOverride = canonicalVersionCode * postFixSize + postFix
} }
} }
@ -353,15 +376,21 @@ dependencies {
testImplementation 'org.conscrypt:conscrypt-openjdk-uber:2.5.2' // For Robolectric testImplementation 'org.conscrypt:conscrypt-openjdk-uber:2.5.2' // For Robolectric
testImplementation 'app.cash.turbine:turbine:1.1.0' testImplementation 'app.cash.turbine:turbine:1.1.0'
implementation 'com.github.bumptech.glide:compose:1.0.0-alpha.5' // compose
implementation "androidx.compose.ui:ui:$composeVersion" Dependency composeBom = platform('androidx.compose:compose-bom:2024.09.01')
implementation "androidx.compose.animation:animation:$composeVersion" implementation composeBom
implementation "androidx.compose.ui:ui-tooling:$composeVersion" testImplementation composeBom
implementation "androidx.compose.runtime:runtime-livedata:$composeVersion" androidTestImplementation composeBom
implementation "androidx.compose.foundation:foundation-layout:$composeVersion"
implementation "androidx.compose.material3:material3:1.2.1" implementation "androidx.compose.ui:ui"
androidTestImplementation "androidx.compose.ui:ui-test-junit4-android:$composeVersion" implementation "androidx.compose.animation:animation"
debugImplementation "androidx.compose.ui:ui-test-manifest:$composeVersion" implementation "androidx.compose.ui:ui-tooling"
implementation "androidx.compose.runtime:runtime-livedata"
implementation "androidx.compose.foundation:foundation-layout"
implementation "androidx.compose.material3:material3"
androidTestImplementation "androidx.compose.ui:ui-test-junit4-android"
debugImplementation "androidx.compose.ui:ui-test-manifest"
implementation "com.google.accompanist:accompanist-themeadapter-appcompat:0.33.1-alpha" implementation "com.google.accompanist:accompanist-themeadapter-appcompat:0.33.1-alpha"
implementation "com.google.accompanist:accompanist-permissions:0.36.0" implementation "com.google.accompanist:accompanist-permissions:0.36.0"

View File

@ -62,7 +62,10 @@ class SessionDialogBuilder(val context: Context) {
// Main title entry point // Main title entry point
fun title(text: String?) { fun title(text: String?) {
text(text, R.style.TextAppearance_Session_Dialog_Title) { setPadding(dp20, 0, dp20, 0) } text(
text = text,
qaTag = context.getString(R.string.AccessibilityId_modalTitle),
style = R.style.TextAppearance_Session_Dialog_Title) { setPadding(dp20, 0, dp20, 0) }
} }
// Convenience assessor for title that takes a string resource // Convenience assessor for title that takes a string resource
@ -74,18 +77,24 @@ class SessionDialogBuilder(val context: Context) {
fun text(@StringRes id: Int, style: Int? = null) = text(context.getString(id), style) fun text(@StringRes id: Int, style: Int? = null) = text(context.getString(id), style)
fun text(text: CharSequence?, @StyleRes style: Int? = null) { fun text(text: CharSequence?, @StyleRes style: Int? = null) {
text(text, style) { text(text = text, style = style) {
layoutParams = LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT) layoutParams = LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
.apply { updateMargins(dp40, 0, dp40, 0) } .apply { updateMargins(dp40, 0, dp40, 0) }
} }
} }
private fun text(text: CharSequence?, @StyleRes style: Int? = null, modify: TextView.() -> Unit) { private fun text(
text: CharSequence?,
qaTag: String = context.getString(R.string.AccessibilityId_modalMessage),
@StyleRes style: Int? = null,
modify: TextView.() -> Unit
) {
text ?: return text ?: return
TextView(context, null, 0, style ?: R.style.TextAppearance_Session_Dialog_Message) TextView(context, null, 0, style ?: R.style.TextAppearance_Session_Dialog_Message)
.apply { .apply {
setText(text) setText(text)
textAlignment = View.TEXT_ALIGNMENT_CENTER textAlignment = View.TEXT_ALIGNMENT_CENTER
contentDescription = qaTag
modify() modify()
}.let(topView::addView) }.let(topView::addView)
@ -166,7 +175,7 @@ class SessionDialogBuilder(val context: Context) {
textColor?.let{ textColor?.let{
setTextColor(it) setTextColor(it)
} }
contentDescription = resources.getString(contentDescriptionRes) contentDescription = resources.getString(text) // QA now wants the qa tag to mtch the button's text
layoutParams = LinearLayout.LayoutParams(WRAP_CONTENT, dp60, 1f) layoutParams = LinearLayout.LayoutParams(WRAP_CONTENT, dp60, 1f)
setOnClickListener { setOnClickListener {
listener.invoke() listener.invoke()

View File

@ -66,21 +66,21 @@ internal fun StartConversationScreen(
icon = R.drawable.ic_message, icon = R.drawable.ic_message,
modifier = Modifier.contentDescription(R.string.AccessibilityId_messageNew), modifier = Modifier.contentDescription(R.string.AccessibilityId_messageNew),
onClick = delegate::onNewMessageSelected) onClick = delegate::onNewMessageSelected)
Divider(startIndent = LocalDimensions.current.dividerIndent) Divider(startIndent = LocalDimensions.current.minItemButtonHeight)
ItemButton( ItemButton(
textId = R.string.groupCreate, textId = R.string.groupCreate,
icon = R.drawable.ic_group, icon = R.drawable.ic_group,
modifier = Modifier.contentDescription(R.string.AccessibilityId_groupCreate), modifier = Modifier.contentDescription(R.string.AccessibilityId_groupCreate),
onClick = delegate::onCreateGroupSelected onClick = delegate::onCreateGroupSelected
) )
Divider(startIndent = LocalDimensions.current.dividerIndent) Divider(startIndent = LocalDimensions.current.minItemButtonHeight)
ItemButton( ItemButton(
textId = R.string.communityJoin, textId = R.string.communityJoin,
icon = R.drawable.ic_globe, icon = R.drawable.ic_globe,
modifier = Modifier.contentDescription(R.string.AccessibilityId_communityJoin), modifier = Modifier.contentDescription(R.string.AccessibilityId_communityJoin),
onClick = delegate::onJoinCommunitySelected onClick = delegate::onJoinCommunitySelected
) )
Divider(startIndent = LocalDimensions.current.dividerIndent) Divider(startIndent = LocalDimensions.current.minItemButtonHeight)
ItemButton( ItemButton(
textId = R.string.sessionInviteAFriend, textId = R.string.sessionInviteAFriend,
icon = R.drawable.ic_invite_friend, icon = R.drawable.ic_invite_friend,

View File

@ -38,7 +38,6 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.drawToBitmap
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
@ -59,6 +58,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -181,6 +181,7 @@ import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MediaUtil
import org.thoughtcrime.securesms.util.NetworkUtils import org.thoughtcrime.securesms.util.NetworkUtils
import org.thoughtcrime.securesms.util.SaveAttachmentTask import org.thoughtcrime.securesms.util.SaveAttachmentTask
import org.thoughtcrime.securesms.util.drawToBitmap
import org.thoughtcrime.securesms.util.isScrolledToBottom import org.thoughtcrime.securesms.util.isScrolledToBottom
import org.thoughtcrime.securesms.util.isScrolledToWithin30dpOfBottom import org.thoughtcrime.securesms.util.isScrolledToWithin30dpOfBottom
import org.thoughtcrime.securesms.util.push import org.thoughtcrime.securesms.util.push
@ -734,9 +735,10 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
private fun restoreDraftIfNeeded() { private fun restoreDraftIfNeeded() {
val mediaURI = intent.data val mediaURI = intent.data
val mediaType = AttachmentManager.MediaType.from(intent.type) val mediaType = AttachmentManager.MediaType.from(intent.type)
val mimeType = MediaUtil.getMimeType(this, mediaURI)
if (mediaURI != null && mediaType != null) { if (mediaURI != null && mediaType != null) {
if (AttachmentManager.MediaType.IMAGE == mediaType || AttachmentManager.MediaType.GIF == mediaType || AttachmentManager.MediaType.VIDEO == mediaType) { if (mimeType != null && (AttachmentManager.MediaType.IMAGE == mediaType || AttachmentManager.MediaType.GIF == mediaType || AttachmentManager.MediaType.VIDEO == mediaType)) {
val media = Media(mediaURI, MediaUtil.getMimeType(this, mediaURI)!!, 0, 0, 0, 0, Optional.absent(), Optional.absent()) val media = Media(mediaURI, mimeType, 0, 0, 0, 0, Optional.absent(), Optional.absent())
startActivityForResult(MediaSendActivity.buildEditorIntent(this, listOf( media ), viewModel.recipient!!, ""), PICK_FROM_LIBRARY) startActivityForResult(MediaSendActivity.buildEditorIntent(this, listOf( media ), viewModel.recipient!!, ""), PICK_FROM_LIBRARY)
return return
} else { } else {
@ -813,7 +815,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
if (shouldShowLegacy) { if (shouldShowLegacy) {
val txt = Phrase.from(applicationContext, R.string.disappearingMessagesLegacy) val txt = Phrase.from(applicationContext, R.string.disappearingMessagesLegacy)
.put(NAME_KEY, legacyRecipient!!.name) .put(NAME_KEY, legacyRecipient!!.toShortString())
.format() .format()
binding?.outdatedBannerTextView?.text = txt binding?.outdatedBannerTextView?.text = txt
} }
@ -1191,14 +1193,14 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
title(R.string.block) title(R.string.block)
text( text(
Phrase.from(context, R.string.blockDescription) Phrase.from(context, R.string.blockDescription)
.put(NAME_KEY, recipient.name) .put(NAME_KEY, recipient.toShortString())
.format() .format()
) )
dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) { dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) {
viewModel.block() viewModel.block()
// Block confirmation toast added as per SS-64 // Block confirmation toast added as per SS-64
val txt = Phrase.from(context, R.string.blockBlockedUser).put(NAME_KEY, recipient.name).format().toString() val txt = Phrase.from(context, R.string.blockBlockedUser).put(NAME_KEY, recipient.toShortString()).format().toString()
Toast.makeText(context, txt, Toast.LENGTH_LONG).show() Toast.makeText(context, txt, Toast.LENGTH_LONG).show()
if (deleteThread) { if (deleteThread) {
@ -1249,7 +1251,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
title(R.string.blockUnblock) title(R.string.blockUnblock)
text( text(
Phrase.from(context, R.string.blockUnblockName) Phrase.from(context, R.string.blockUnblockName)
.put(NAME_KEY, recipient.name) .put(NAME_KEY, recipient.toShortString())
.format() .format()
) )
dangerButton(R.string.blockUnblock, R.string.AccessibilityId_unblockConfirm) { viewModel.unblock() } dangerButton(R.string.blockUnblock, R.string.AccessibilityId_unblockConfirm) { viewModel.unblock() }
@ -1737,10 +1739,19 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
binding.inputBar.text = "" binding.inputBar.text = ""
binding.inputBar.cancelQuoteDraft() binding.inputBar.cancelQuoteDraft()
binding.inputBar.cancelLinkPreviewDraft() binding.inputBar.cancelLinkPreviewDraft()
// Put the message in the database lifecycleScope.launch(Dispatchers.Default) {
message.id = smsDb.insertMessageOutbox(viewModel.threadId, outgoingTextMessage, false, message.sentTimestamp!!, null, true) // Put the message in the database
// Send it message.id = smsDb.insertMessageOutbox(
MessageSender.send(message, recipient.address) viewModel.threadId,
outgoingTextMessage,
false,
message.sentTimestamp!!,
null,
true
)
// Send it
MessageSender.send(message, recipient.address)
}
// Send a typing stopped message // Send a typing stopped message
ApplicationContext.getInstance(this).typingStatusSender.onTypingStopped(viewModel.threadId) ApplicationContext.getInstance(this).typingStatusSender.onTypingStopped(viewModel.threadId)
return Pair(recipient.address, sentTimestamp) return Pair(recipient.address, sentTimestamp)

View File

@ -35,7 +35,7 @@ class DownloadDialog(private val recipient: Recipient) : DialogFragment() {
title(getString(R.string.attachmentsAutoDownloadModalTitle)) title(getString(R.string.attachmentsAutoDownloadModalTitle))
val explanation = Phrase.from(context, R.string.attachmentsAutoDownloadModalDescription) val explanation = Phrase.from(context, R.string.attachmentsAutoDownloadModalDescription)
.put(CONVERSATION_NAME_KEY, recipient.name) .put(CONVERSATION_NAME_KEY, recipient.toShortString())
.format() .format()
val spannable = SpannableStringBuilder(explanation) val spannable = SpannableStringBuilder(explanation)

View File

@ -1583,6 +1583,7 @@ open class Storage(
if (recipient.isLocalNumber || !recipient.isContactRecipient) return if (recipient.isLocalNumber || !recipient.isContactRecipient) return
configFactory.contacts?.upsertContact(recipient.address.serialize()) { configFactory.contacts?.upsertContact(recipient.address.serialize()) {
this.approved = approved this.approved = approved
this.priority = PRIORITY_VISIBLE
} }
} }

View File

@ -144,14 +144,17 @@ public class ThreadRecord extends DisplayRecord {
.format().toString(); .format().toString();
} else if (MmsSmsColumns.Types.isMessageRequestResponse(type)) { } else if (MmsSmsColumns.Types.isMessageRequestResponse(type)) {
if (lastMessage.getRecipient().getAddress().serialize().equals( try {
TextSecurePreferences.getLocalNumber(context))) { if (lastMessage.getRecipient().getAddress().serialize().equals(
return UtilKt.getSubbedCharSequence( TextSecurePreferences.getLocalNumber(context))) {
context, return UtilKt.getSubbedCharSequence(
R.string.messageRequestYouHaveAccepted, context,
new Pair<>(NAME_KEY, getName()) R.string.messageRequestYouHaveAccepted,
); new Pair<>(NAME_KEY, getName())
);
}
} }
catch (Exception e){} // the above can throw a null exception
return context.getString(R.string.messageRequestsAccepted); return context.getString(R.string.messageRequestsAccepted);
} else if (getCount() == 0) { } else if (getCount() == 0) {

View File

@ -74,12 +74,10 @@ fun DebugMenu(
buttons = listOf( buttons = listOf(
DialogButtonModel( DialogButtonModel(
text = GetString(R.string.cancel), text = GetString(R.string.cancel),
contentDescription = GetString(R.string.cancel),
onClick = { sendCommand(HideEnvironmentWarningDialog) } onClick = { sendCommand(HideEnvironmentWarningDialog) }
), ),
DialogButtonModel( DialogButtonModel(
text = GetString(R.string.ok), text = GetString(R.string.ok),
contentDescription = GetString(R.string.ok),
onClick = { sendCommand(ChangeEnvironment) } onClick = { sendCommand(ChangeEnvironment) }
) )
) )
@ -149,9 +147,11 @@ fun ColumnScope.DebugCell(
) { ) {
Spacer(modifier = Modifier.height(LocalDimensions.current.smallSpacing)) Spacer(modifier = Modifier.height(LocalDimensions.current.smallSpacing))
Cell { Cell(
modifier = modifier
) {
Column( Column(
modifier = modifier.padding(LocalDimensions.current.spacing) modifier = Modifier.padding(LocalDimensions.current.spacing)
) { ) {
Text( Text(
text = title, text = title,

View File

@ -71,6 +71,7 @@ import org.thoughtcrime.securesms.home.search.GlobalSearchViewModel
import org.thoughtcrime.securesms.messagerequests.MessageRequestsActivity import org.thoughtcrime.securesms.messagerequests.MessageRequestsActivity
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.RequestManager import com.bumptech.glide.RequestManager
import org.session.libsession.utilities.truncateIdForDisplay
import org.thoughtcrime.securesms.notifications.PushRegistry import org.thoughtcrime.securesms.notifications.PushRegistry
import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.preferences.SettingsActivity import org.thoughtcrime.securesms.preferences.SettingsActivity
@ -507,7 +508,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
showSessionDialog { showSessionDialog {
title(R.string.block) title(R.string.block)
text(Phrase.from(context, R.string.blockDescription) text(Phrase.from(context, R.string.blockDescription)
.put(NAME_KEY, thread.recipient.name) .put(NAME_KEY, thread.recipient.toShortString())
.format()) .format())
dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) { dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) {
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
@ -518,7 +519,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
} }
} }
// Block confirmation toast added as per SS-64 // Block confirmation toast added as per SS-64
val txt = Phrase.from(context, R.string.blockBlockedUser).put(NAME_KEY, thread.recipient.name).format().toString() val txt = Phrase.from(context, R.string.blockBlockedUser).put(NAME_KEY, thread.recipient.toShortString()).format().toString()
Toast.makeText(context, txt, Toast.LENGTH_LONG).show() Toast.makeText(context, txt, Toast.LENGTH_LONG).show()
} }
cancelButton() cancelButton()
@ -528,7 +529,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
private fun unblockConversation(thread: ThreadRecord) { private fun unblockConversation(thread: ThreadRecord) {
showSessionDialog { showSessionDialog {
title(R.string.blockUnblock) title(R.string.blockUnblock)
text(Phrase.from(context, R.string.blockUnblockName).put(NAME_KEY, thread.recipient.name).format()) text(Phrase.from(context, R.string.blockUnblockName).put(NAME_KEY, thread.recipient.toShortString()).format())
dangerButton(R.string.blockUnblock, R.string.AccessibilityId_unblockConfirm) { dangerButton(R.string.blockUnblock, R.string.AccessibilityId_unblockConfirm) {
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
storage.setBlocked(listOf(thread.recipient), false) storage.setBlocked(listOf(thread.recipient), false)
@ -616,7 +617,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
if (recipient.name != null) { if (recipient.name != null) {
title = getString(R.string.conversationsDelete) title = getString(R.string.conversationsDelete)
message = Phrase.from(this.applicationContext, R.string.conversationsDeleteDescription) message = Phrase.from(this.applicationContext, R.string.conversationsDeleteDescription)
.put(NAME_KEY, recipient.name) .put(NAME_KEY, recipient.toShortString())
.format() .format()
} }
else { else {

View File

@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.home.search
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.BufferOverflow
@ -13,11 +14,13 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.buffer import kotlinx.coroutines.flow.buffer
import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.plus import kotlinx.coroutines.plus
import kotlinx.coroutines.withContext
import org.thoughtcrime.securesms.search.SearchRepository import org.thoughtcrime.securesms.search.SearchRepository
import org.thoughtcrime.securesms.search.model.SearchResult import org.thoughtcrime.securesms.search.model.SearchResult
import javax.inject.Inject import javax.inject.Inject
@ -38,9 +41,14 @@ class GlobalSearchViewModel @Inject constructor(
.buffer(onBufferOverflow = BufferOverflow.DROP_OLDEST) .buffer(onBufferOverflow = BufferOverflow.DROP_OLDEST)
.mapLatest { query -> .mapLatest { query ->
if (query.trim().isEmpty()) { if (query.trim().isEmpty()) {
// searching for 05 as contactDb#getAllContacts was not returning contacts withContext(Dispatchers.Default) {
// without a nickname/name who haven't approved us. // searching for 05 as contactDb#getAllContacts was not returning contacts
GlobalSearchResult(query.toString(), searchRepository.queryContacts("05").first.toList()) // without a nickname/name who haven't approved us.
GlobalSearchResult(
query.toString(),
searchRepository.queryContacts("05").first.toList()
)
}
} else { } else {
// User input delay in case we get a new query within a few hundred ms this // User input delay in case we get a new query within a few hundred ms this
// coroutine will be cancelled and the expensive query will not be run. // coroutine will be cancelled and the expensive query will not be run.

View File

@ -231,8 +231,8 @@ private fun SaveAttachmentWarningDialog(
title = context.getString(R.string.warning), title = context.getString(R.string.warning),
text = context.resources.getString(R.string.attachmentsWarning), text = context.resources.getString(R.string.attachmentsWarning),
buttons = listOf( buttons = listOf(
DialogButtonModel(GetString(R.string.save), GetString(R.string.AccessibilityId_saveAttachment), color = LocalColors.current.danger, onClick = onAccepted), DialogButtonModel(GetString(R.string.save), color = LocalColors.current.danger, onClick = onAccepted),
DialogButtonModel(GetString(android.R.string.cancel), GetString(R.string.AccessibilityId_cancel), dismissOnClick = true) DialogButtonModel(GetString(android.R.string.cancel), dismissOnClick = true)
) )
) )
} }

View File

@ -87,7 +87,7 @@ class MessageRequestsActivity : PassphraseRequiredActionBarActivity(), Conversat
showSessionDialog { showSessionDialog {
title(R.string.block) title(R.string.block)
text(Phrase.from(context, R.string.blockDescription) text(Phrase.from(context, R.string.blockDescription)
.put(NAME_KEY, thread.recipient.name) .put(NAME_KEY, thread.recipient.toShortString())
.format()) .format())
dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) { dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) {
doBlock() doBlock()

View File

@ -85,12 +85,10 @@ internal fun LandingScreen(
buttons = listOf( buttons = listOf(
DialogButtonModel( DialogButtonModel(
text = GetString(R.string.onboardingTos), text = GetString(R.string.onboardingTos),
contentDescription = GetString(R.string.AccessibilityId_onboardingTos),
onClick = openTerms onClick = openTerms
), ),
DialogButtonModel( DialogButtonModel(
text = GetString(R.string.onboardingPrivacy), text = GetString(R.string.onboardingPrivacy),
contentDescription = GetString(R.string.AccessibilityId_onboardingPrivacy),
onClick = openPrivacyPolicy onClick = openPrivacyPolicy
) )
) )

View File

@ -573,13 +573,11 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
buttons = listOf( buttons = listOf(
DialogButtonModel( DialogButtonModel(
text = GetString(R.string.save), text = GetString(R.string.save),
contentDescription = GetString(R.string.AccessibilityId_save),
enabled = state is TempAvatar, enabled = state is TempAvatar,
onClick = saveAvatar onClick = saveAvatar
), ),
DialogButtonModel( DialogButtonModel(
text = GetString(R.string.remove), text = GetString(R.string.remove),
contentDescription = GetString(R.string.AccessibilityId_remove),
color = LocalColors.current.danger, color = LocalColors.current.danger,
enabled = state is UserAvatar || // can remove is the user has an avatar set enabled = state is UserAvatar || // can remove is the user has an avatar set
(state is TempAvatar && state.hasAvatar), (state is TempAvatar && state.hasAvatar),

View File

@ -26,7 +26,10 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import network.loki.messenger.R import network.loki.messenger.R
import org.thoughtcrime.securesms.ui.AlertDialog
import org.thoughtcrime.securesms.ui.Cell import org.thoughtcrime.securesms.ui.Cell
import org.thoughtcrime.securesms.ui.DialogButtonModel
import org.thoughtcrime.securesms.ui.GetString
import org.thoughtcrime.securesms.ui.SessionShieldIcon import org.thoughtcrime.securesms.ui.SessionShieldIcon
import org.thoughtcrime.securesms.ui.components.QrImage import org.thoughtcrime.securesms.ui.components.QrImage
import org.thoughtcrime.securesms.ui.components.SlimOutlineButton import org.thoughtcrime.securesms.ui.components.SlimOutlineButton
@ -45,8 +48,8 @@ import org.thoughtcrime.securesms.ui.theme.monospace
internal fun RecoveryPasswordScreen( internal fun RecoveryPasswordScreen(
mnemonic: String, mnemonic: String,
seed: String? = null, seed: String? = null,
copyMnemonic:() -> Unit = {}, confirmHideRecovery: () -> Unit,
onHide:() -> Unit = {} copyMnemonic:() -> Unit = {}
) { ) {
Column( Column(
verticalArrangement = Arrangement.spacedBy(LocalDimensions.current.smallSpacing), verticalArrangement = Arrangement.spacedBy(LocalDimensions.current.smallSpacing),
@ -57,7 +60,7 @@ internal fun RecoveryPasswordScreen(
.padding(horizontal = LocalDimensions.current.spacing) .padding(horizontal = LocalDimensions.current.spacing)
) { ) {
RecoveryPasswordCell(mnemonic, seed, copyMnemonic) RecoveryPasswordCell(mnemonic, seed, copyMnemonic)
HideRecoveryPasswordCell(onHide) HideRecoveryPasswordCell(confirmHideRecovery = confirmHideRecovery)
} }
} }
@ -151,7 +154,12 @@ private fun RecoveryPassword(mnemonic: String) {
} }
@Composable @Composable
private fun HideRecoveryPasswordCell(onHide: () -> Unit = {}) { private fun HideRecoveryPasswordCell(
confirmHideRecovery:() -> Unit
) {
var showHideRecoveryDialog by remember { mutableStateOf(false) }
var showHideRecoveryConfirmationDialog by remember { mutableStateOf(false) }
Cell { Cell {
Row( Row(
modifier = Modifier.padding(LocalDimensions.current.smallSpacing) modifier = Modifier.padding(LocalDimensions.current.smallSpacing)
@ -176,10 +184,44 @@ private fun HideRecoveryPasswordCell(onHide: () -> Unit = {}) {
.align(Alignment.CenterVertically) .align(Alignment.CenterVertically)
.contentDescription(R.string.AccessibilityId_recoveryPasswordHideRecoveryPassword), .contentDescription(R.string.AccessibilityId_recoveryPasswordHideRecoveryPassword),
color = LocalColors.current.danger, color = LocalColors.current.danger,
onClick = onHide onClick = { showHideRecoveryDialog = true }
) )
} }
} }
// recovery hide dialog
if(showHideRecoveryDialog) {
AlertDialog(
onDismissRequest = { showHideRecoveryDialog = false },
title = stringResource(R.string.recoveryPasswordHidePermanently),
text = stringResource(R.string.recoveryPasswordHidePermanentlyDescription1),
buttons = listOf(
DialogButtonModel(
GetString(R.string.theContinue),
color = LocalColors.current.danger,
onClick = { showHideRecoveryConfirmationDialog = true }
),
DialogButtonModel(GetString(android.R.string.cancel))
)
)
}
// recovery hide confirmation dialog
if(showHideRecoveryConfirmationDialog) {
AlertDialog(
onDismissRequest = { showHideRecoveryConfirmationDialog = false },
title = stringResource(R.string.recoveryPasswordHidePermanently),
text = stringResource(R.string.recoveryPasswordHidePermanentlyDescription2),
buttons = listOf(
DialogButtonModel(
GetString(R.string.yes),
color = LocalColors.current.danger,
onClick = confirmHideRecovery
),
DialogButtonModel(GetString(android.R.string.cancel))
)
)
}
} }
@Preview @Preview
@ -188,6 +230,9 @@ private fun PreviewRecoveryPasswordScreen(
@PreviewParameter(SessionColorsParameterProvider::class) colors: ThemeColors @PreviewParameter(SessionColorsParameterProvider::class) colors: ThemeColors
) { ) {
PreviewTheme(colors) { PreviewTheme(colors) {
RecoveryPasswordScreen(mnemonic = "voyage urban toyed maverick peculiar tuxedo penguin tree grass building listen speak withdraw terminal plane") RecoveryPasswordScreen(
mnemonic = "voyage urban toyed maverick peculiar tuxedo penguin tree grass building listen speak withdraw terminal plane",
confirmHideRecovery = {}
)
} }
} }

View File

@ -24,33 +24,12 @@ class RecoveryPasswordActivity : BaseActionBarActivity() {
RecoveryPasswordScreen( RecoveryPasswordScreen(
mnemonic = mnemonic, mnemonic = mnemonic,
seed = seed, seed = seed,
copyMnemonic = viewModel::copyMnemonic, confirmHideRecovery = {
onHide = ::onHide viewModel.permanentlyHidePassword()
finish()
},
copyMnemonic = viewModel::copyMnemonic
) )
} }
} }
private fun onHide() {
showSessionDialog {
title(R.string.recoveryPasswordHidePermanently)
text(R.string.recoveryPasswordHidePermanentlyDescription1)
dangerButton(R.string.theContinue, R.string.AccessibilityId_theContinue) { onHideConfirm() }
cancelButton()
}
}
private fun onHideConfirm() {
showSessionDialog {
title(R.string.recoveryPasswordHidePermanently)
text(R.string.recoveryPasswordHidePermanentlyDescription2)
cancelButton()
dangerButton(
R.string.yes,
contentDescription = R.string.AccessibilityId_recoveryPasswordHidePermanentlyConfirm
) {
viewModel.permanentlyHidePassword()
finish()
}
}
}
} }

View File

@ -55,7 +55,6 @@ import org.thoughtcrime.securesms.ui.theme.bold
class DialogButtonModel( class DialogButtonModel(
val text: GetString, val text: GetString,
val contentDescription: GetString = text,
val color: Color = Color.Unspecified, val color: Color = Color.Unspecified,
val dismissOnClick: Boolean = true, val dismissOnClick: Boolean = true,
val enabled: Boolean = true, val enabled: Boolean = true,
@ -130,6 +129,7 @@ fun AlertDialog(
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = LocalType.current.h7, style = LocalType.current.h7,
modifier = Modifier.padding(bottom = LocalDimensions.current.xxsSpacing) modifier = Modifier.padding(bottom = LocalDimensions.current.xxsSpacing)
.qaTag(stringResource(R.string.AccessibilityId_modalTitle))
) )
} }
text?.let { text?.let {
@ -152,6 +152,7 @@ fun AlertDialog(
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = textStyle, style = textStyle,
modifier = textModifier modifier = textModifier
.qaTag(stringResource(R.string.AccessibilityId_modalMessage))
) )
} }
content() content()
@ -163,7 +164,7 @@ fun AlertDialog(
text = it.text(), text = it.text(),
modifier = Modifier modifier = Modifier
.fillMaxHeight() .fillMaxHeight()
.contentDescription(it.contentDescription()) .qaTag(it.text.string())
.weight(1f), .weight(1f),
color = it.color, color = it.color,
enabled = it.enabled enabled = it.enabled
@ -201,13 +202,11 @@ fun OpenURLAlertDialog(
buttons = listOf( buttons = listOf(
DialogButtonModel( DialogButtonModel(
text = GetString(R.string.open), text = GetString(R.string.open),
contentDescription = GetString(R.string.AccessibilityId_urlOpenBrowser),
color = LocalColors.current.danger, color = LocalColors.current.danger,
onClick = { context.openUrl(url) } onClick = { context.openUrl(url) }
), ),
DialogButtonModel( DialogButtonModel(
text = GetString(android.R.string.copyUrl), text = GetString(android.R.string.copyUrl),
contentDescription = GetString(R.string.AccessibilityId_copy),
onClick = { onClick = {
context.copyURLToClipboard(url) context.copyURLToClipboard(url)
Toast.makeText(context, R.string.copied, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.copied, Toast.LENGTH_SHORT).show()
@ -297,7 +296,8 @@ fun LoadingDialog(
title?.let { title?.let {
Text( Text(
it, it,
modifier = Modifier.align(Alignment.CenterHorizontally), modifier = Modifier.align(Alignment.CenterHorizontally)
.qaTag(stringResource(R.string.AccessibilityId_modalTitle)),
style = LocalType.current.large style = LocalType.current.large
) )
} }
@ -340,12 +340,10 @@ fun PreviewXCloseDialog() {
buttons = listOf( buttons = listOf(
DialogButtonModel( DialogButtonModel(
text = GetString(R.string.onboardingTos), text = GetString(R.string.onboardingTos),
contentDescription = GetString(R.string.AccessibilityId_onboardingTos),
onClick = {} onClick = {}
), ),
DialogButtonModel( DialogButtonModel(
text = GetString(R.string.onboardingPrivacy), text = GetString(R.string.onboardingPrivacy),
contentDescription = GetString(R.string.AccessibilityId_onboardingPrivacy),
onClick = {} onClick = {}
) )
), ),

View File

@ -275,23 +275,19 @@ fun ItemButton(
onClick: () -> Unit onClick: () -> Unit
) { ) {
TextButton( TextButton(
modifier = modifier.fillMaxWidth() modifier = modifier.fillMaxWidth(),
.height(IntrinsicSize.Min)
.heightIn(min = minHeight)
.padding(horizontal = LocalDimensions.current.xsSpacing),
colors = colors, colors = colors,
onClick = onClick, onClick = onClick,
contentPadding = PaddingValues(),
shape = RectangleShape, shape = RectangleShape,
) { ) {
Box( Box(
modifier = Modifier.fillMaxHeight() modifier = Modifier
.aspectRatio(1f) .padding(horizontal = LocalDimensions.current.xxsSpacing)
.align(Alignment.CenterVertically) .size(minHeight)
) { .align(Alignment.CenterVertically),
icon() content = icon
} )
Spacer(modifier = Modifier.width(LocalDimensions.current.smallSpacing))
Text( Text(
text, text,
@ -315,6 +311,18 @@ fun PreviewItemButton() {
} }
} }
@Preview
@Composable
fun PreviewLargeItemButton() {
PreviewTheme {
LargeItemButton(
textId = R.string.groupCreate,
icon = R.drawable.ic_group,
onClick = {}
)
}
}
@Composable @Composable
fun Cell( fun Cell(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,

View File

@ -3,8 +3,16 @@ package org.thoughtcrime.securesms.ui.components
import android.content.res.Resources import android.content.res.Resources
import android.graphics.Typeface import android.graphics.Typeface
import android.text.Spanned import android.text.Spanned
import android.text.SpannedString import android.text.style.AbsoluteSizeSpan
import android.text.style.* import android.text.style.BulletSpan
import android.text.style.ForegroundColorSpan
import android.text.style.RelativeSizeSpan
import android.text.style.StrikethroughSpan
import android.text.style.StyleSpan
import android.text.style.SubscriptSpan
import android.text.style.SuperscriptSpan
import android.text.style.TypefaceSpan
import android.text.style.UnderlineSpan
import android.util.Log import android.util.Log
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -14,7 +22,6 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.buildAnnotatedString
@ -26,13 +33,9 @@ import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.em import androidx.compose.ui.unit.em
import androidx.core.text.HtmlCompat
import com.squareup.phrase.Phrase
import network.loki.messenger.R
import org.session.libsession.utilities.StringSubstitutionConstants.URL_KEY
// TODO Remove this file once we update to composeVersion=1.7.0-alpha06 fixes https://issuetracker.google.com/issues/139320238?pli=1 // Utilities for AnnotatedStrings,
// which allows Stylized string in string resources // like converting the old view system's SpannableString to AnnotatedString
@Composable @Composable
@ReadOnlyComposable @ReadOnlyComposable
private fun resources(): Resources { private fun resources(): Resources {
@ -40,31 +43,6 @@ private fun resources(): Resources {
return LocalContext.current.resources return LocalContext.current.resources
} }
fun Spanned.toHtmlWithoutParagraphs(): String {
return HtmlCompat.toHtml(this, HtmlCompat.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE)
.substringAfter("<p dir=\"ltr\">").substringBeforeLast("</p>")
}
fun Resources.getText(@StringRes id: Int, vararg args: Any): CharSequence {
val escapedArgs = args.map {
if (it is Spanned) it.toHtmlWithoutParagraphs() else it
}.toTypedArray()
val resource = SpannedString(getText(id))
val htmlResource = resource.toHtmlWithoutParagraphs()
val formattedHtml = String.format(htmlResource, *escapedArgs)
return HtmlCompat.fromHtml(formattedHtml, HtmlCompat.FROM_HTML_MODE_LEGACY)
}
@Composable
fun annotatedStringResource(@StringRes id: Int, vararg formatArgs: Any): AnnotatedString {
val resources = resources()
val density = LocalDensity.current
return remember(id, formatArgs) {
val text = resources.getText(id, *formatArgs)
spannableStringToAnnotatedString(text, density)
}
}
@Composable @Composable
fun annotatedStringResource(@StringRes id: Int): AnnotatedString { fun annotatedStringResource(@StringRes id: Int): AnnotatedString {
val resources = resources() val resources = resources()

View File

@ -15,7 +15,6 @@ data class Dimensions(
val mediumSpacing: Dp = 36.dp, val mediumSpacing: Dp = 36.dp,
val xlargeSpacing: Dp = 64.dp, val xlargeSpacing: Dp = 64.dp,
val dividerIndent: Dp = 60.dp,
val appBarHeight: Dp = 64.dp, val appBarHeight: Dp = 64.dp,
val minItemButtonHeight: Dp = 50.dp, val minItemButtonHeight: Dp = 50.dp,
val minLargeItemButtonHeight: Dp = 60.dp, val minLargeItemButtonHeight: Dp = 60.dp,

View File

@ -128,6 +128,9 @@
<string name="AccessibilityId_messageVoice">Voice message</string> <string name="AccessibilityId_messageVoice">Voice message</string>
<string name="AccessibilityId_deliveryIndicator">Delivered</string> <string name="AccessibilityId_deliveryIndicator">Delivered</string>
<string name="AccessibilityId_message_request_config_message">Message request has been accepted</string> <string name="AccessibilityId_message_request_config_message">Message request has been accepted</string>
<!-- Modals -->
<string name="AccessibilityId_modalTitle">Modal heading</string>
<string name="AccessibilityId_modalMessage">Modal description</string>
<!-- Delete message modal--> <!-- Delete message modal-->
<string name="AccessibilityId_deleteMessageCancel">Cancel deletion</string> <string name="AccessibilityId_deleteMessageCancel">Cancel deletion</string>
<string name="AccessibilityId_deleteMessageEveryone">Delete for everyone</string> <!-- ACL: Perhaps should be "AccessibilityId_clearMessagesForEveryone"? --> <string name="AccessibilityId_deleteMessageEveryone">Delete for everyone</string> <!-- ACL: Perhaps should be "AccessibilityId_clearMessagesForEveryone"? -->

View File

@ -17,11 +17,10 @@ org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M"
gradlePluginVersion=8.5.2 gradlePluginVersion=8.5.2
googleServicesVersion=4.3.12 googleServicesVersion=4.3.12
kotlinVersion=1.9.24 kotlinVersion=1.9.25
android.useAndroidX=true android.useAndroidX=true
appcompatVersion=1.6.1 appcompatVersion=1.6.1
coreVersion=1.13.1 coreVersion=1.13.1
composeVersion=1.6.4
coroutinesVersion=1.6.4 coroutinesVersion=1.6.4
curve25519Version=0.6.0 curve25519Version=0.6.0
jetpackHiltVersion=1.2.0 jetpackHiltVersion=1.2.0

View File

@ -17,6 +17,8 @@
*/ */
package org.session.libsession.utilities.recipients; package org.session.libsession.utilities.recipients;
import static org.session.libsession.utilities.IdUtilKt.truncateIdForDisplay;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;

View File

@ -143,6 +143,7 @@
<string name="callsInProgress">Zəng davam edir</string> <string name="callsInProgress">Zəng davam edir</string>
<string name="callsIncoming">{name} sizə zəng edir</string> <string name="callsIncoming">{name} sizə zəng edir</string>
<string name="callsIncomingUnknown">Gələn zəng</string> <string name="callsIncomingUnknown">Gələn zəng</string>
<string name="callsMicrophonePermissionsRequired"><b>Mikrofon müraciətinə</b> icazə vermədiyiniz üçün <b>{name}</b> edən zəngi buraxdınız.</string>
<string name="callsMissed">Buraxılmış zəng</string> <string name="callsMissed">Buraxılmış zəng</string>
<string name="callsMissedCallFrom">{name} kontaktından buraxılmış zəng</string> <string name="callsMissedCallFrom">{name} kontaktından buraxılmış zəng</string>
<string name="callsNotificationsRequired">Səsli və görüntülü zənglər, cihazınızın sistem ayarlarında bildirişlərin fəallaşdırılmasını tələb edir.</string> <string name="callsNotificationsRequired">Səsli və görüntülü zənglər, cihazınızın sistem ayarlarında bildirişlərin fəallaşdırılmasını tələb edir.</string>
@ -202,6 +203,7 @@
<string name="communityInvitation">İcma dəvəti</string> <string name="communityInvitation">İcma dəvəti</string>
<string name="communityJoin">İcmaya qoşul</string> <string name="communityJoin">İcmaya qoşul</string>
<string name="communityJoinDescription">{community_name} icmasına qoşulmaq istədiyinizə əminsiniz?</string> <string name="communityJoinDescription">{community_name} icmasına qoşulmaq istədiyinizə əminsiniz?</string>
<string name="communityJoinError">İcmaya qoşulma uğursuz oldu</string>
<string name="communityJoinOfficial">Ya da bunlardan birinə qoşulun...</string> <string name="communityJoinOfficial">Ya da bunlardan birinə qoşulun...</string>
<string name="communityJoined">İcmaya qoşuldu</string> <string name="communityJoined">İcmaya qoşuldu</string>
<string name="communityJoinedAlready">Artıq bu icmanın üzvüsünüz.</string> <string name="communityJoinedAlready">Artıq bu icmanın üzvüsünüz.</string>
@ -310,6 +312,7 @@
<string name="disappearingMessagesDeleteType">Silmə növü</string> <string name="disappearingMessagesDeleteType">Silmə növü</string>
<string name="disappearingMessagesDescription">Bu ayar, bu danışıqda hər kəsə aiddir.</string> <string name="disappearingMessagesDescription">Bu ayar, bu danışıqda hər kəsə aiddir.</string>
<string name="disappearingMessagesDescription1">Bu ayar, bu danışıqda göndərdiyiniz mesajlara aiddir.</string> <string name="disappearingMessagesDescription1">Bu ayar, bu danışıqda göndərdiyiniz mesajlara aiddir.</string>
<string name="disappearingMessagesDescriptionGroup">Bu ayar, bu danışıqdakı hər kəsə tətbiq olunur.\nYalnız qrup adminləri bu ayarı dəyişdirə bilər.</string>
<string name="disappearingMessagesDisappear">{disappearing_messages_type} olduqdan {time} sonra yox olur</string> <string name="disappearingMessagesDisappear">{disappearing_messages_type} olduqdan {time} sonra yox olur</string>
<string name="disappearingMessagesDisappearAfterRead">Oxunduqdan sonra yox olur</string> <string name="disappearingMessagesDisappearAfterRead">Oxunduqdan sonra yox olur</string>
<string name="disappearingMessagesDisappearAfterReadDescription">Mesajlar oxunduqdan sonra silinir.</string> <string name="disappearingMessagesDisappearAfterReadDescription">Mesajlar oxunduqdan sonra silinir.</string>
@ -406,6 +409,7 @@
<string name="groupInviteSending">Dəvət göndərilir</string> <string name="groupInviteSending">Dəvət göndərilir</string>
<string name="groupInviteSent">Dəvət göndərildi</string> <string name="groupInviteSent">Dəvət göndərildi</string>
<string name="groupInviteSuccessful">Qrup dəvəti uğurludur</string> <string name="groupInviteSuccessful">Qrup dəvəti uğurludur</string>
<string name="groupInviteVersion">İstifadəçilər dəvətləri qəbul etmək üçün ən son versiyaya sahib olmalıdırlar</string>
<string name="groupInviteYou"><b>Siz</b> qrupa qoşulmağa dəvət edildiniz.</string> <string name="groupInviteYou"><b>Siz</b> qrupa qoşulmağa dəvət edildiniz.</string>
<string name="groupInviteYouAndMoreNew"><b>Siz</b><b> digər {count} nəfər</b> qrupa qoşulmaq üçün dəvət edildiniz.</string> <string name="groupInviteYouAndMoreNew"><b>Siz</b><b> digər {count} nəfər</b> qrupa qoşulmaq üçün dəvət edildiniz.</string>
<string name="groupInviteYouAndOtherNew"><b>Siz</b><b>{other_name}</b> qrupa qoşulmaq üçün dəvət edildiniz.</string> <string name="groupInviteYouAndOtherNew"><b>Siz</b><b>{other_name}</b> qrupa qoşulmaq üçün dəvət edildiniz.</string>
@ -673,9 +677,11 @@
<string name="passwordSet">Parol təyin et</string> <string name="passwordSet">Parol təyin et</string>
<string name="passwordSetDescription">Parolunuz təyin edildi. Lütfən, onu güvəndə saxlayın.</string> <string name="passwordSetDescription">Parolunuz təyin edildi. Lütfən, onu güvəndə saxlayın.</string>
<string name="paste">Yapışdır</string> <string name="paste">Yapışdır</string>
<string name="permissionMusicAudioDenied">Fayl, musiqi və səs göndərə bilməyiniz üçün {app_name} musiqi və səslərə müraciət etməlidir, ancaq bu icazəyə birdəfəlik rədd cavabı verilib. Ayarlar → \"İcazələr\"ə toxunun və \"Musiqi və səs\"i işə salın.</string>
<string name="permissionsAppleMusic">{app_name} media qoşmalarını oxutmaq üçün Apple Music-i istifadə etməlidir.</string> <string name="permissionsAppleMusic">{app_name} media qoşmalarını oxutmaq üçün Apple Music-i istifadə etməlidir.</string>
<string name="permissionsAutoUpdate">Avto-güncəlləmə</string> <string name="permissionsAutoUpdate">Avto-güncəlləmə</string>
<string name="permissionsAutoUpdateDescription">ılışda güncəlləmələri avto-yoxla</string> <string name="permissionsAutoUpdateDescription">ılışda güncəlləmələri avto-yoxla</string>
<string name="permissionsCameraDenied">Foto və video göndərə bilməyiniz üçün {app_name} kameraya müraciət etməlidir, ancaq bu icazəyə birdəfəlik rədd cavabı verilib. Ayarlar → \"İcazələr\"ə toxunun və \"Kamera\"nı işə salın.</string>
<string name="permissionsFaceId">{app_name} tətbiqinin ekran kilidi özəlliyi Face ID istifadə edir.</string> <string name="permissionsFaceId">{app_name} tətbiqinin ekran kilidi özəlliyi Face ID istifadə edir.</string>
<string name="permissionsKeepInSystemTray">Sistem çubuğunda tut</string> <string name="permissionsKeepInSystemTray">Sistem çubuğunda tut</string>
<string name="permissionsKeepInSystemTrayDescription">Pəncərəni bağladıqda {app_name} arxaplanda işləməyə davam edir</string> <string name="permissionsKeepInSystemTrayDescription">Pəncərəni bağladıqda {app_name} arxaplanda işləməyə davam edir</string>
@ -685,7 +691,9 @@
<string name="permissionsMicrophoneAccessRequiredDesktop">{app_name} gizlilik ayarlarında mikrofona müraciəti fəallaşdıra bilərsiniz</string> <string name="permissionsMicrophoneAccessRequiredDesktop">{app_name} gizlilik ayarlarında mikrofona müraciəti fəallaşdıra bilərsiniz</string>
<string name="permissionsMicrophoneAccessRequiredIos">{app_name} zəng etmək və səsli mesajlar yazmaq üçün mikrofona müraciət etməlidir.</string> <string name="permissionsMicrophoneAccessRequiredIos">{app_name} zəng etmək və səsli mesajlar yazmaq üçün mikrofona müraciət etməlidir.</string>
<string name="permissionsMicrophoneDescription">Mikrofona müraciətə icazə verin.</string> <string name="permissionsMicrophoneDescription">Mikrofona müraciətə icazə verin.</string>
<string name="permissionsMusicAudio">Fayl, musiqi və səs göndərə bilməyiniz üçün {app_name} musiqi və səslərə müraciət etməlidir.</string>
<string name="permissionsRequired">İcazə tələb edilir</string> <string name="permissionsRequired">İcazə tələb edilir</string>
<string name="permissionsStorageDenied">Foto və video göndərə bilməyiniz üçün {app_name} foto kitabxanasına müraciət etməlidir, ancaq bu icazəyə birdəfəlik rədd cavabı verilib. Ayarlar → \"İcazələr\"ə toxunun və \"Foto və videolar\"ı işə salın.</string>
<string name="permissionsStorageDeniedLegacy">{app_name}, qoşmaları göndərə və saxlaya bilməyiniz üçün anbara müraciət etməlidir. Ayarlar → İcazələr bölməsinə gedin və \"Anbar\"ı işə salın.</string> <string name="permissionsStorageDeniedLegacy">{app_name}, qoşmaları göndərə və saxlaya bilməyiniz üçün anbara müraciət etməlidir. Ayarlar → İcazələr bölməsinə gedin və \"Anbar\"ı işə salın.</string>
<string name="permissionsStorageSave">{app_name} qoşmaları və medianı saxlamaq üçün anbara müraciət etməlidir.</string> <string name="permissionsStorageSave">{app_name} qoşmaları və medianı saxlamaq üçün anbara müraciət etməlidir.</string>
<string name="permissionsStorageSaveDenied">{app_name} foto və videoları saxlamaq üçün anbara müraciət etməlidir, ancaq bu icazəyə həmişəlik rədd cavabı verilib. Lütfən tətbiq ayarlarına gedin, \"İcazələr\"i seçin və \"Anbar\" icazəsini fəallaşdırın.</string> <string name="permissionsStorageSaveDenied">{app_name} foto və videoları saxlamaq üçün anbara müraciət etməlidir, ancaq bu icazəyə həmişəlik rədd cavabı verilib. Lütfən tətbiq ayarlarına gedin, \"İcazələr\"i seçin və \"Anbar\" icazəsini fəallaşdırın.</string>

View File

@ -755,7 +755,7 @@
<string name="recoveryPasswordErrorMessageIncorrect">Некаторыя з слоў у вашым Recovery password няправільныя. Калі ласка, праверце і паспрабуйце яшчэ раз.</string> <string name="recoveryPasswordErrorMessageIncorrect">Некаторыя з слоў у вашым Recovery password няправільныя. Калі ласка, праверце і паспрабуйце яшчэ раз.</string>
<string name="recoveryPasswordErrorMessageShort">The Recovery Password you entered is not long enough. Please check and try again.</string> <string name="recoveryPasswordErrorMessageShort">The Recovery Password you entered is not long enough. Please check and try again.</string>
<string name="recoveryPasswordErrorTitle">Няправільны Recovery Password</string> <string name="recoveryPasswordErrorTitle">Няправільны Recovery Password</string>
<string name="recoveryPasswordExplanation">Для загрузкі вашага акаўнта ўвядзіце ваш Recovery Password.</string> <string name="recoveryPasswordExplanation">Для загрузкі вашага ўліковага запісу ўвядзіце Recovery Password.</string>
<string name="recoveryPasswordHidePermanently">Схаваць Recovery Password назусім</string> <string name="recoveryPasswordHidePermanently">Схаваць Recovery Password назусім</string>
<string name="recoveryPasswordHidePermanentlyDescription1">Без вашага Recovery password вы не зможаце загрузіць свой уліковы запіс на новыя прылады. \n\nМы настойліва рэкамендуем захаваць ваш Recovery password у надзейным і бяспечным месцы перад прадаўжэннем.</string> <string name="recoveryPasswordHidePermanentlyDescription1">Без вашага Recovery password вы не зможаце загрузіць свой уліковы запіс на новыя прылады. \n\nМы настойліва рэкамендуем захаваць ваш Recovery password у надзейным і бяспечным месцы перад прадаўжэннем.</string>
<string name="recoveryPasswordHidePermanentlyDescription2">Вы ўпэўненыя, што жадаеце пастаянна схаваць ваш канчатковы пароль аднаўлення на гэтай прыладзе? Гэта немагчыма адмяніць.</string> <string name="recoveryPasswordHidePermanentlyDescription2">Вы ўпэўненыя, што жадаеце пастаянна схаваць ваш канчатковы пароль аднаўлення на гэтай прыладзе? Гэта немагчыма адмяніць.</string>

View File

@ -653,7 +653,7 @@
<string name="notificationsSystem">{message_count} nových zpráv v {conversation_count} konverzacích</string> <string name="notificationsSystem">{message_count} nových zpráv v {conversation_count} konverzacích</string>
<string name="notificationsVibrate">Vibrace</string> <string name="notificationsVibrate">Vibrace</string>
<string name="off">Vypnuto</string> <string name="off">Vypnuto</string>
<string name="okay">Okay</string> <string name="okay">OK</string>
<string name="on">Zap.</string> <string name="on">Zap.</string>
<string name="onboardingAccountCreate">Vytvořit účet</string> <string name="onboardingAccountCreate">Vytvořit účet</string>
<string name="onboardingAccountCreated">Účet vytvořen</string> <string name="onboardingAccountCreated">Účet vytvořen</string>
@ -806,7 +806,7 @@
<string name="sessionClearData">Vyčistit data</string> <string name="sessionClearData">Vyčistit data</string>
<string name="sessionConversations">Konverzace</string> <string name="sessionConversations">Konverzace</string>
<string name="sessionHelp">Nápověda</string> <string name="sessionHelp">Nápověda</string>
<string name="sessionInviteAFriend">Pozvat přítele</string> <string name="sessionInviteAFriend">Pozvat přátele</string>
<string name="sessionMessageRequests">Žádosti o komunikaci</string> <string name="sessionMessageRequests">Žádosti o komunikaci</string>
<string name="sessionNotifications">Upozornění</string> <string name="sessionNotifications">Upozornění</string>
<string name="sessionPermissions">Oprávnění</string> <string name="sessionPermissions">Oprávnění</string>
@ -816,7 +816,7 @@
<string name="set">Nastavit</string> <string name="set">Nastavit</string>
<string name="settingsRestartDescription">Pro použití nových nastavení musíte restartovat {app_name}.</string> <string name="settingsRestartDescription">Pro použití nových nastavení musíte restartovat {app_name}.</string>
<string name="share">Sdílet</string> <string name="share">Sdílet</string>
<string name="shareAccountIdDescription">Pozvěte svého přítele nebo přítelkyni ke komunikaci pomocí {app_name} sdílením svého ID účtu.</string> <string name="shareAccountIdDescription">Pozvěte své přátele ke komunikaci pomocí {app_name} sdílením svého ID účtu.</string>
<string name="shareAccountIdDescriptionCopied">Sdílejte se svými přáteli tam, kde s nimi obvykle mluvíte — a pak konverzaci přesuňte sem.</string> <string name="shareAccountIdDescriptionCopied">Sdílejte se svými přáteli tam, kde s nimi obvykle mluvíte — a pak konverzaci přesuňte sem.</string>
<string name="shareExtensionDatabaseError">Při otevírání databáze se vyskytl problém. Prosím, restartujte aplikaci a zkuste to znovu.</string> <string name="shareExtensionDatabaseError">Při otevírání databáze se vyskytl problém. Prosím, restartujte aplikaci a zkuste to znovu.</string>
<string name="shareToSession">Sdílet do {app_name}</string> <string name="shareToSession">Sdílet do {app_name}</string>

View File

@ -146,7 +146,7 @@
<string name="callsMicrophonePermissionsRequired">Du hast einen Anruf von <b>{name}</b> verpasst, weil Du keinen <b>Mikrofonzugriff</b> gewährt hast.</string> <string name="callsMicrophonePermissionsRequired">Du hast einen Anruf von <b>{name}</b> verpasst, weil Du keinen <b>Mikrofonzugriff</b> gewährt hast.</string>
<string name="callsMissed">Verpasster Anruf</string> <string name="callsMissed">Verpasster Anruf</string>
<string name="callsMissedCallFrom">Verpasster Anruf von {name}</string> <string name="callsMissedCallFrom">Verpasster Anruf von {name}</string>
<string name="callsNotificationsRequired">Sprach- und Videoanrufe erfordern Benachrichtigungen, die in den Systemeinstellungen Ihres Geräts aktiviert sind.</string> <string name="callsNotificationsRequired">Sprach- und Videoanrufe erfordern Benachrichtigungen, die in den Systemeinstellungen deines Geräts aktiviert werden können.</string>
<string name="callsPermissionsRequired">Anrufberechtigung erforderlich</string> <string name="callsPermissionsRequired">Anrufberechtigung erforderlich</string>
<string name="callsPermissionsRequiredDescription">Du kannst die Berechtigung für \"Sprach- und Videoanrufe\" in den Datenschutzeinstellungen aktivieren.</string> <string name="callsPermissionsRequiredDescription">Du kannst die Berechtigung für \"Sprach- und Videoanrufe\" in den Datenschutzeinstellungen aktivieren.</string>
<string name="callsReconnecting">Wiederverbinden…</string> <string name="callsReconnecting">Wiederverbinden…</string>
@ -176,7 +176,7 @@
<item quantity="one">Daten konnten nicht von %1$d Serviceknoten gelöscht werden. Service Node ID: %2$s.</item> <item quantity="one">Daten konnten nicht von %1$d Serviceknoten gelöscht werden. Service Node ID: %2$s.</item>
<item quantity="other">Daten konnten nicht von %1$d Serviceknoten gelöscht werden. Service Node IDs: %2$s.</item> <item quantity="other">Daten konnten nicht von %1$d Serviceknoten gelöscht werden. Service Node IDs: %2$s.</item>
</plurals> </plurals>
<string name="clearDataErrorDescriptionGeneric">Ein unbekannter Fehler ist aufgetreten und deine Daten wurden nicht gelöscht. Möchtest du stattdessen Ihre Daten nur von diesem Gerät löschen?</string> <string name="clearDataErrorDescriptionGeneric">Ein unbekannter Fehler ist aufgetreten, und deine Daten wurden nicht gelöscht. Möchtest du stattdessen deine Daten nur von diesem Gerät entfernen?</string>
<string name="clearDevice">Gerät entfernen</string> <string name="clearDevice">Gerät entfernen</string>
<string name="clearDeviceAndNetwork">Geräte- und Netzwerkdaten löschen</string> <string name="clearDeviceAndNetwork">Geräte- und Netzwerkdaten löschen</string>
<string name="clearDeviceAndNetworkConfirm">Bist du sicher, dass du deine Daten aus dem Netzwerk löschen möchtest? Wenn du fortfährst, kannst du deine Nachrichten oder Kontakte nicht wiederherstellen.</string> <string name="clearDeviceAndNetworkConfirm">Bist du sicher, dass du deine Daten aus dem Netzwerk löschen möchtest? Wenn du fortfährst, kannst du deine Nachrichten oder Kontakte nicht wiederherstellen.</string>
@ -243,7 +243,7 @@
<string name="conversationsGroups">Gruppen</string> <string name="conversationsGroups">Gruppen</string>
<string name="conversationsMessageTrimming">Nachrichtenkürzung</string> <string name="conversationsMessageTrimming">Nachrichtenkürzung</string>
<string name="conversationsMessageTrimmingTrimCommunities">Communities kürzen</string> <string name="conversationsMessageTrimmingTrimCommunities">Communities kürzen</string>
<string name="conversationsMessageTrimmingTrimCommunitiesDescription">Löschen Sie Nachrichten aus Community-Gesprächen, die älter als 6 Monate sind und bei denen es mehr als 2.000 Nachrichten gibt.</string> <string name="conversationsMessageTrimmingTrimCommunitiesDescription">Lösche Nachrichten von Community-Konversationen, die älter als 6 Monate sind, und wo es über 2.000 Nachrichten gibt.</string>
<string name="conversationsNew">Neue Unterhaltung</string> <string name="conversationsNew">Neue Unterhaltung</string>
<string name="conversationsNone">Du hast noch keine Unterhaltungen</string> <string name="conversationsNone">Du hast noch keine Unterhaltungen</string>
<string name="conversationsSendWithEnterKey">Mit Eingabetaste senden</string> <string name="conversationsSendWithEnterKey">Mit Eingabetaste senden</string>
@ -331,7 +331,7 @@
<string name="disappearingMessagesTimer">Zeitraum</string> <string name="disappearingMessagesTimer">Zeitraum</string>
<string name="disappearingMessagesTurnedOff"><b>{name}</b> hat verschwindende Nachrichten deaktiviert. Nachrichten verschwinden nicht mehr.</string> <string name="disappearingMessagesTurnedOff"><b>{name}</b> hat verschwindende Nachrichten deaktiviert. Nachrichten verschwinden nicht mehr.</string>
<string name="disappearingMessagesTurnedOffGroup"><b>{name}</b> hat verschwindende Nachrichten <b>deaktiviert</b>.</string> <string name="disappearingMessagesTurnedOffGroup"><b>{name}</b> hat verschwindende Nachrichten <b>deaktiviert</b>.</string>
<string name="disappearingMessagesTurnedOffYou"><b>Sie</b> haben verschwindende Nachrichten <b>deaktiviert</b>. Nachrichten, die Sie senden, verschwinden nicht mehr.</string> <string name="disappearingMessagesTurnedOffYou"><b>Du</b> hast verschwindende Nachrichten <b>deaktiviert</b>. Die von dir gesendeten Nachrichten verschwinden nicht mehr.</string>
<string name="disappearingMessagesTurnedOffYouGroup"><b>Du</b> hast verschwindende Nachrichten <b>deaktiviert</b>.</string> <string name="disappearingMessagesTurnedOffYouGroup"><b>Du</b> hast verschwindende Nachrichten <b>deaktiviert</b>.</string>
<string name="disappearingMessagesTypeRead">gelesen</string> <string name="disappearingMessagesTypeRead">gelesen</string>
<string name="disappearingMessagesTypeSent">gesendet</string> <string name="disappearingMessagesTypeSent">gesendet</string>
@ -478,7 +478,7 @@
<string name="hideOthers">Andere ausblenden</string> <string name="hideOthers">Andere ausblenden</string>
<string name="image">Bild</string> <string name="image">Bild</string>
<string name="incognitoKeyboard">Inkognito-Tastatur</string> <string name="incognitoKeyboard">Inkognito-Tastatur</string>
<string name="incognitoKeyboardDescription">Fordere den Inkognito-Modus an, wenn verfügbar. Dies hängt von der Tastatur ab, die du verwendest, deine Tastatur könnte diese Anfrage ignorieren.</string> <string name="incognitoKeyboardDescription">Fordere den Inkognito-Modus an, wenn verfügbar. Abhängig von der Tastatur, die du verwendest, kann deine Tastatur diese Anfrage ignorieren.</string>
<string name="info">Info</string> <string name="info">Info</string>
<string name="invalidShortcut">Ungültige Verknüpfung</string> <string name="invalidShortcut">Ungültige Verknüpfung</string>
<string name="join">Beitreten</string> <string name="join">Beitreten</string>
@ -540,7 +540,7 @@
<string name="messageEmpty">Diese Nachricht ist leer.</string> <string name="messageEmpty">Diese Nachricht ist leer.</string>
<string name="messageErrorDelivery">Nachrichtenübermittlung gescheitert</string> <string name="messageErrorDelivery">Nachrichtenübermittlung gescheitert</string>
<string name="messageErrorLimit">Nachrichtenlimit erreicht</string> <string name="messageErrorLimit">Nachrichtenlimit erreicht</string>
<string name="messageErrorOld">Eine Nachricht verschlüsselt mit einer alten Version von {app_name} erhalten, die nicht mehr unterstützt wird. Bitte fragen Sie den Absender, auf die neueste Version zu aktualisieren und die Nachricht erneut zu senden.</string> <string name="messageErrorOld">Eine Nachricht wurde mit einer alten Version von {app_name} verschlüsselt, die nicht mehr unterstützt wird. Bitte den Absender, auf die neueste Version zu aktualisieren und die Nachricht erneut zu senden.</string>
<string name="messageErrorOriginal">Originalnachricht nicht gefunden</string> <string name="messageErrorOriginal">Originalnachricht nicht gefunden</string>
<string name="messageInfo">Nachrichten-Info</string> <string name="messageInfo">Nachrichten-Info</string>
<string name="messageMarkRead">Als gelesen markieren</string> <string name="messageMarkRead">Als gelesen markieren</string>
@ -556,14 +556,14 @@
<item quantity="other">Du hast %1$d neue Nachrichten.</item> <item quantity="other">Du hast %1$d neue Nachrichten.</item>
</plurals> </plurals>
<string name="messageReplyingTo">Antwort auf</string> <string name="messageReplyingTo">Antwort auf</string>
<string name="messageRequestGroupInvite"><b>{name}</b> hat Sie eingeladen, der Gruppe <b>{group_name}</b> beizutreten.</string> <string name="messageRequestGroupInvite"><b>{name}</b> hat dich eingeladen, der Gruppe <b>{group_name}</b> beizutreten.</string>
<string name="messageRequestGroupInviteDescription">Das Senden einer Nachricht an diese Gruppe bestätigt automatisch die Gruppeneinladung.</string> <string name="messageRequestGroupInviteDescription">Das Senden einer Nachricht an diese Gruppe bestätigt automatisch die Gruppeneinladung.</string>
<string name="messageRequestPending">Deine Nachrichtenanfrage ist derzeit ausstehend.</string> <string name="messageRequestPending">Deine Nachrichtenanfrage ist derzeit ausstehend.</string>
<string name="messageRequestPendingDescription">Du kannst Sprachnachrichten und Anhänge senden, sobald der Empfänger diese Nachrichtenanfrage genehmigt hat.</string> <string name="messageRequestPendingDescription">Du kannst Sprachnachrichten und Anhänge senden, sobald der Empfänger diese Nachrichtenanfrage genehmigt hat.</string>
<string name="messageRequestYouHaveAccepted">Du hast die Nachrichtenanfrage von <b>{name}</b> angenommen.</string> <string name="messageRequestYouHaveAccepted">Du hast die Nachrichtenanfrage von <b>{name}</b> angenommen.</string>
<string name="messageRequestsAcceptDescription">Das Senden einer Nachricht an dieser Person bestätigt automatisch die Nachrichtenanfrage und gibt deine Account-ID bekannt.</string> <string name="messageRequestsAcceptDescription">Das Senden einer Nachricht an dieser Person bestätigt automatisch die Nachrichtenanfrage und gibt deine Account-ID bekannt.</string>
<string name="messageRequestsAccepted">Deine Nachrichtenanfrage wurde akzeptiert.</string> <string name="messageRequestsAccepted">Deine Nachrichtenanfrage wurde akzeptiert.</string>
<string name="messageRequestsClearAllExplanation">Sind Sie sich sicher, dass Sie alle Nachrichtenanforderungen und Gruppeneinladungen löschen möchten?</string> <string name="messageRequestsClearAllExplanation">Bist du sich sicher, dass du alle Nachrichtenanforderungen und Gruppeneinladungen löschen möchtest?</string>
<string name="messageRequestsCommunities">Community-Nachrichtenanfragen</string> <string name="messageRequestsCommunities">Community-Nachrichtenanfragen</string>
<string name="messageRequestsCommunitiesDescription">Erlaube Nachrichtenanfragen von Community-Unterhaltungen.</string> <string name="messageRequestsCommunitiesDescription">Erlaube Nachrichtenanfragen von Community-Unterhaltungen.</string>
<string name="messageRequestsDelete">Bist du sicher, dass du diese Nachrichtenanfrage löschen möchten?</string> <string name="messageRequestsDelete">Bist du sicher, dass du diese Nachrichtenanfrage löschen möchten?</string>
@ -757,7 +757,7 @@
<string name="scan">Scannen</string> <string name="scan">Scannen</string>
<string name="screenSecurity">Bildschirmschutz</string> <string name="screenSecurity">Bildschirmschutz</string>
<string name="screenshotNotifications">Bildschirmfoto-Benachrichtigungen</string> <string name="screenshotNotifications">Bildschirmfoto-Benachrichtigungen</string>
<string name="screenshotNotificationsDescription">Erhalte eine Benachrichtigung, wenn ein Kontakt ein Bildschirmfoto eines Eins-zu-eins-Chats erstellt.</string> <string name="screenshotNotificationsDescription">Erhalte eine Benachrichtigung, wenn ein Kontakt ein Bildschirmfoto in einer Unterhaltung macht.</string>
<string name="screenshotTaken"><b>{name}</b> hat einen Screenshot gemacht.</string> <string name="screenshotTaken"><b>{name}</b> hat einen Screenshot gemacht.</string>
<string name="search">Suchen</string> <string name="search">Suchen</string>
<string name="searchContacts">Kontakte durchsuchen</string> <string name="searchContacts">Kontakte durchsuchen</string>

View File

@ -21,7 +21,7 @@
<string name="adminPromoteMoreDescription">क्या आप वाकई <b>{name}</b> और <b>{count} अन्य</b> को एडमिन के रूप में बढ़ावा देना चाहते हैं? एडमिन्स को हटाया नहीं जा सकता है।</string> <string name="adminPromoteMoreDescription">क्या आप वाकई <b>{name}</b> और <b>{count} अन्य</b> को एडमिन के रूप में बढ़ावा देना चाहते हैं? एडमिन्स को हटाया नहीं जा सकता है।</string>
<string name="adminPromoteToAdmin">एडमिन में पदोन्नत करें</string> <string name="adminPromoteToAdmin">एडमिन में पदोन्नत करें</string>
<string name="adminPromoteTwoDescription">क्या आप वाकई <b>{name}</b> और <b>{other_name}</b> को एडमिन के रूप में बढ़ावा देना चाहते हैं? एडमिन्स को हटाया नहीं जा सकता है।</string> <string name="adminPromoteTwoDescription">क्या आप वाकई <b>{name}</b> और <b>{other_name}</b> को एडमिन के रूप में बढ़ावा देना चाहते हैं? एडमिन्स को हटाया नहीं जा सकता है।</string>
<string name="adminPromotedToAdmin"><b>{name}</b> को Admin बनाया गया।</string> <string name="adminPromotedToAdmin"><b>{name}</b> को एडमिन बनाया गया।</string>
<string name="adminPromotionFailed">एडमिन पदोन्नति विफल रही</string> <string name="adminPromotionFailed">एडमिन पदोन्नति विफल रही</string>
<string name="adminPromotionFailedDescription">{name} को {group_name} में पदोन्नत करने में विफल</string> <string name="adminPromotionFailedDescription">{name} को {group_name} में पदोन्नत करने में विफल</string>
<string name="adminPromotionFailedDescriptionMultiple">{name} और {count} अन्य को {group_name} में पदोन्नत करने में विफल</string> <string name="adminPromotionFailedDescriptionMultiple">{name} और {count} अन्य को {group_name} में पदोन्नत करने में विफल</string>
@ -33,7 +33,7 @@
<string name="adminRemoveFailed">{name} को एडमिन के रूप में हटाने में विफल।</string> <string name="adminRemoveFailed">{name} को एडमिन के रूप में हटाने में विफल।</string>
<string name="adminRemoveFailedMultiple"><b>{name}</b> और <b>{count} अन्य</b> को व्यवस्थापक पद से हटाने में विफल |</string> <string name="adminRemoveFailedMultiple"><b>{name}</b> और <b>{count} अन्य</b> को व्यवस्थापक पद से हटाने में विफल |</string>
<string name="adminRemoveFailedOther"><b>{name}</b> और <b>{other_name}</b> व्यवस्थापक पद से हटाने में विफल |</string> <string name="adminRemoveFailedOther"><b>{name}</b> और <b>{other_name}</b> व्यवस्थापक पद से हटाने में विफल |</string>
<string name="adminRemovedUser"><b>{name}</b> को Admin से हटा दिया गया।</string> <string name="adminRemovedUser"><b>{name}</b> को एडमिन से हटा दिया गया।</string>
<string name="adminRemovedUserMultiple"><b>{name}</b> और <b>{count} अन्य</b> को व्यवस्थापक पद से हटा दिया गया |</string> <string name="adminRemovedUserMultiple"><b>{name}</b> और <b>{count} अन्य</b> को व्यवस्थापक पद से हटा दिया गया |</string>
<string name="adminRemovedUserOther"><b>{name}</b> and <b>{other_name}</b> को व्यवस्थापक पद से हटा दिया गया |</string> <string name="adminRemovedUserOther"><b>{name}</b> and <b>{other_name}</b> को व्यवस्थापक पद से हटा दिया गया |</string>
<string name="adminSendingPromotion">एडमिन प्रमोशन भेजा जा रहा है</string> <string name="adminSendingPromotion">एडमिन प्रमोशन भेजा जा रहा है</string>
@ -295,7 +295,7 @@
<string name="deleteMessageDevicesAll">सभी उपकरणों पर मिटाएँ</string> <string name="deleteMessageDevicesAll">सभी उपकरणों पर मिटाएँ</string>
<string name="deleteMessageEveryone">सभी के लिए मिटायें |</string> <string name="deleteMessageEveryone">सभी के लिए मिटायें |</string>
<plurals name="deleteMessageFailed"> <plurals name="deleteMessageFailed">
<item quantity="one">संदेश को हटाने में विफल रहा</item> <item quantity="one">संदेश हटाने में विफल</item>
<item quantity="other">संदेशों को हटाने में विफल रहा</item> <item quantity="other">संदेशों को हटाने में विफल रहा</item>
</plurals> </plurals>
<string name="deleteMessagesConfirm">क्या आप वाकई इन संदेशों को मिटाना चाहते हैं?</string> <string name="deleteMessagesConfirm">क्या आप वाकई इन संदेशों को मिटाना चाहते हैं?</string>
@ -421,7 +421,7 @@
<string name="groupMemberLeft"><b>{name}</b> ने समूह छोड़ दिया।</string> <string name="groupMemberLeft"><b>{name}</b> ने समूह छोड़ दिया।</string>
<string name="groupMemberLeftMultiple"><b>{name}</b> और <b>{count} अन्य</b> समूह से निकल गए।</string> <string name="groupMemberLeftMultiple"><b>{name}</b> और <b>{count} अन्य</b> समूह से निकल गए।</string>
<string name="groupMemberLeftTwo"><b>{name}</b> और <b>{other_name}</b> समूह से निकल गए।</string> <string name="groupMemberLeftTwo"><b>{name}</b> और <b>{other_name}</b> समूह से निकल गए।</string>
<string name="groupMemberNew"><b>{name}</b> समूह में शामिल हो गए</string> <string name="groupMemberNew"><b>{name}</b> समूह में शामिल के लिए आमंत्रित किया है</string>
<string name="groupMemberNewHistory"><b>{name}</b> को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।</string> <string name="groupMemberNewHistory"><b>{name}</b> को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।</string>
<string name="groupMemberNewHistoryMultiple"><b>{name}</b> और <b>{count} अन्य</b> को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।</string> <string name="groupMemberNewHistoryMultiple"><b>{name}</b> और <b>{count} अन्य</b> को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।</string>
<string name="groupMemberNewHistoryTwo"><b>{name}</b> और <b>{other_name}</b> को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।</string> <string name="groupMemberNewHistoryTwo"><b>{name}</b> और <b>{other_name}</b> को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।</string>
@ -527,7 +527,7 @@
<string name="membersAddAccountIdOrOns">खाता आईडी या ONS जोड़ें</string> <string name="membersAddAccountIdOrOns">खाता आईडी या ONS जोड़ें</string>
<string name="membersInvite">मित्रों को आमंत्रित करें</string> <string name="membersInvite">मित्रों को आमंत्रित करें</string>
<plurals name="membersInviteSend"> <plurals name="membersInviteSend">
<item quantity="one">आमंत्रण सेंड करें</item> <item quantity="one">आमंत्रण भेजे</item>
<item quantity="other">आमंत्रण सेंड करें</item> <item quantity="other">आमंत्रण सेंड करें</item>
</plurals> </plurals>
<string name="membersInviteShareDescription">क्या आप <b>{name}</b> के साथ समूह संदेश इतिहास साझा करना चाहेंगे?</string> <string name="membersInviteShareDescription">क्या आप <b>{name}</b> के साथ समूह संदेश इतिहास साझा करना चाहेंगे?</string>
@ -684,7 +684,7 @@
<string name="permissionsCameraDenied">{app_name} को फ़ोटो और वीडियो लेने के लिए कैमरा अनुमति की आवश्यकता होती है, लेकिन इसे स्थायी रूप से मना कर दिया गया है। सेटिंग्स → अनुमतियां पर टैप करें और \"कैमरा\" चालू करें।</string> <string name="permissionsCameraDenied">{app_name} को फ़ोटो और वीडियो लेने के लिए कैमरा अनुमति की आवश्यकता होती है, लेकिन इसे स्थायी रूप से मना कर दिया गया है। सेटिंग्स → अनुमतियां पर टैप करें और \"कैमरा\" चालू करें।</string>
<string name="permissionsFaceId">{app_name} पर स्क्रीन लॉक फीचर Face ID का उपयोग करता है।</string> <string name="permissionsFaceId">{app_name} पर स्क्रीन लॉक फीचर Face ID का उपयोग करता है।</string>
<string name="permissionsKeepInSystemTray">सिस्टम ट्रे में रखें</string> <string name="permissionsKeepInSystemTray">सिस्टम ट्रे में रखें</string>
<string name="permissionsKeepInSystemTrayDescription">{app_name} तब भी पृष्ठभूमि में चलता रहता है जब आप विंडो बंद करते हैं</string> <string name="permissionsKeepInSystemTrayDescription">जब आप विंडो बंद करते हैं तो {app_name} पृष्ठभूमि में चलता रहता है</string>
<string name="permissionsLibrary">{app_name} को जारी रखने के लिए फ़ोटो लाइब्रेरी पहुंच की आवश्यकता है। आप iOS सेटिंग्स में पहुंच सक्षम कर सकते हैं।</string> <string name="permissionsLibrary">{app_name} को जारी रखने के लिए फ़ोटो लाइब्रेरी पहुंच की आवश्यकता है। आप iOS सेटिंग्स में पहुंच सक्षम कर सकते हैं।</string>
<string name="permissionsMicrophone">माइक्रोफ़ोन</string> <string name="permissionsMicrophone">माइक्रोफ़ोन</string>
<string name="permissionsMicrophoneAccessRequired">{app_name} को कॉल करने और ऑडियो संदेश भेजने के लिए माइक्रोफ़ोन अनुमति की आवश्यकता है, लेकिन इसे स्थायी रूप से मना कर दिया गया है। सेटिंग्स → अनुमतियां पर टैप करें, और \"माइक्रोफ़ोन\" चालू करें।</string> <string name="permissionsMicrophoneAccessRequired">{app_name} को कॉल करने और ऑडियो संदेश भेजने के लिए माइक्रोफ़ोन अनुमति की आवश्यकता है, लेकिन इसे स्थायी रूप से मना कर दिया गया है। सेटिंग्स → अनुमतियां पर टैप करें, और \"माइक्रोफ़ोन\" चालू करें।</string>
@ -812,7 +812,7 @@
<string name="updateDownloaded">अपडेट इंस्टॉल हो गया, पुनः प्रारंभ करने के लिए क्लिक करें</string> <string name="updateDownloaded">अपडेट इंस्टॉल हो गया, पुनः प्रारंभ करने के लिए क्लिक करें</string>
<string name="updateDownloading">अपडेट डाउनलोड हो रहा है: {percent_loader}%</string> <string name="updateDownloading">अपडेट डाउनलोड हो रहा है: {percent_loader}%</string>
<string name="updateError">अद्यतन नहीं हो रहा</string> <string name="updateError">अद्यतन नहीं हो रहा</string>
<string name="updateErrorDescription">{app_name} अपडेट होने में विफल. कृपया {session_download_url} पर जाएं और नए संस्करण को मैन्युअल रूप से इंस्टॉल करें, फिर इस समस्या के बारे में हमें बताने के लिए हमारे सहायता केंद्र से संपर्क करें |</string> <string name="updateErrorDescription">{app_name} अपडेट होने में विफल. कृपया {session_download_url} पर जाएं और नए संस्करण को मैन्युअल रूप से इंस्टॉल करें, फिर इस समस्या के बारे में हमें हमारे सहायता केंद्र से संपर्क करें |</string>
<string name="updateNewVersion">{app_name} का एक नया संस्करण उपलब्ध है, अपडेट करने के लिए टैप करें</string> <string name="updateNewVersion">{app_name} का एक नया संस्करण उपलब्ध है, अपडेट करने के लिए टैप करें</string>
<string name="updateNewVersionDescription">{app_name} का एक नया संस्करण उपलब्ध है।</string> <string name="updateNewVersionDescription">{app_name} का एक नया संस्करण उपलब्ध है।</string>
<string name="updateReleaseNotes">रिलीज़ नोट्स पे जाइए</string> <string name="updateReleaseNotes">रिलीज़ नोट्स पे जाइए</string>

View File

@ -60,7 +60,7 @@
<string name="attachment">Melléklet</string> <string name="attachment">Melléklet</string>
<string name="attachmentsAdd">Melléklet hozzáadása</string> <string name="attachmentsAdd">Melléklet hozzáadása</string>
<string name="attachmentsAlbumUnnamed">Névtelen album</string> <string name="attachmentsAlbumUnnamed">Névtelen album</string>
<string name="attachmentsAutoDownload">Csatolmányok automatikus letöltése</string> <string name="attachmentsAutoDownload">Mellékletek automatikus letöltése</string>
<string name="attachmentsAutoDownloadDescription">Média és fájlok automatikus letötltése ebből a beszélgetésből.</string> <string name="attachmentsAutoDownloadDescription">Média és fájlok automatikus letötltése ebből a beszélgetésből.</string>
<string name="attachmentsAutoDownloadModalDescription">Szeretnéd automatikusan letölteni az összes fájlt a <b>{conversation_name}</b> beszélgetésből?</string> <string name="attachmentsAutoDownloadModalDescription">Szeretnéd automatikusan letölteni az összes fájlt a <b>{conversation_name}</b> beszélgetésből?</string>
<string name="attachmentsAutoDownloadModalTitle">Automatikus letöltés</string> <string name="attachmentsAutoDownloadModalTitle">Automatikus letöltés</string>
@ -563,7 +563,7 @@
<string name="messageRequestYouHaveAccepted">Elfogadtad <b>{name}</b> üzenetkérését.</string> <string name="messageRequestYouHaveAccepted">Elfogadtad <b>{name}</b> üzenetkérését.</string>
<string name="messageRequestsAcceptDescription">Ha üzenetet küld ennek a felhasználónak, akkor automatikusan elfogadja az üzenetkérelmét és a Felhasználó ID megosztásra kerül.</string> <string name="messageRequestsAcceptDescription">Ha üzenetet küld ennek a felhasználónak, akkor automatikusan elfogadja az üzenetkérelmét és a Felhasználó ID megosztásra kerül.</string>
<string name="messageRequestsAccepted">Az üzenetkérelmedet elfogadták.</string> <string name="messageRequestsAccepted">Az üzenetkérelmedet elfogadták.</string>
<string name="messageRequestsClearAllExplanation">Biztos, hogy törölni akarja az összes üzenetkérelmet és csoportmeghívót?</string> <string name="messageRequestsClearAllExplanation">Biztos, hogy törölni szeretnéd az összes üzenetkérelmet és csoportmeghívót?</string>
<string name="messageRequestsCommunities">Közösségi üzenetkérelmek</string> <string name="messageRequestsCommunities">Közösségi üzenetkérelmek</string>
<string name="messageRequestsCommunitiesDescription">A közösségi beszélgetésekből származó üzenetek engedélyezése.</string> <string name="messageRequestsCommunitiesDescription">A közösségi beszélgetésekből származó üzenetek engedélyezése.</string>
<string name="messageRequestsDelete">Biztos, hogy törölni szeretnéd ezt az üzenetkérelmet?</string> <string name="messageRequestsDelete">Biztos, hogy törölni szeretnéd ezt az üzenetkérelmet?</string>

View File

@ -143,6 +143,7 @@
<string name="callsInProgress">Chiamata in corso</string> <string name="callsInProgress">Chiamata in corso</string>
<string name="callsIncoming">Chiamata in arrivo da {name}</string> <string name="callsIncoming">Chiamata in arrivo da {name}</string>
<string name="callsIncomingUnknown">Chiamata in arrivo</string> <string name="callsIncomingUnknown">Chiamata in arrivo</string>
<string name="callsMicrophonePermissionsRequired">Hai perso una chiamata da <b>{name}</b> perché non hai concesso l\'accesso al <b>microfono</b>.</string>
<string name="callsMissed">Chiamata persa</string> <string name="callsMissed">Chiamata persa</string>
<string name="callsMissedCallFrom">Chiamata persa da {name}</string> <string name="callsMissedCallFrom">Chiamata persa da {name}</string>
<string name="callsNotificationsRequired">Le chiamate vocali e video richiedono che le notifiche siano abilitate nelle impostazioni di sistema del dispositivo.</string> <string name="callsNotificationsRequired">Le chiamate vocali e video richiedono che le notifiche siano abilitate nelle impostazioni di sistema del dispositivo.</string>
@ -202,6 +203,7 @@
<string name="communityInvitation">Invito a una Comunità</string> <string name="communityInvitation">Invito a una Comunità</string>
<string name="communityJoin">Unisciti alla Comunità</string> <string name="communityJoin">Unisciti alla Comunità</string>
<string name="communityJoinDescription">Sei sicuro di voler unirti a {community_name}?</string> <string name="communityJoinDescription">Sei sicuro di voler unirti a {community_name}?</string>
<string name="communityJoinError">Impossibile unirsi alla community</string>
<string name="communityJoinOfficial">Oppure unisciti a uno di questi...</string> <string name="communityJoinOfficial">Oppure unisciti a uno di questi...</string>
<string name="communityJoined">Sei entrato nella Comunità</string> <string name="communityJoined">Sei entrato nella Comunità</string>
<string name="communityJoinedAlready">Fai già parte di questa Comunità.</string> <string name="communityJoinedAlready">Fai già parte di questa Comunità.</string>
@ -407,6 +409,7 @@
<string name="groupInviteSending">Invio invito</string> <string name="groupInviteSending">Invio invito</string>
<string name="groupInviteSent">Invito inviato</string> <string name="groupInviteSent">Invito inviato</string>
<string name="groupInviteSuccessful">Invito al gruppo riuscito</string> <string name="groupInviteSuccessful">Invito al gruppo riuscito</string>
<string name="groupInviteVersion">Gli utenti devono disporre della versione più recente per ricevere gli inviti</string>
<string name="groupInviteYou"><b>Sei stata invitato</b> a unirti al gruppo.</string> <string name="groupInviteYou"><b>Sei stata invitato</b> a unirti al gruppo.</string>
<string name="groupInviteYouAndMoreNew"><b>Tu</b> e <b>{count} altri</b> vi siete uniti al gruppo.</string> <string name="groupInviteYouAndMoreNew"><b>Tu</b> e <b>{count} altri</b> vi siete uniti al gruppo.</string>
<string name="groupInviteYouAndOtherNew"><b>Tu</b> e <b>{other_name}</b> fate ora parte del gruppo.</string> <string name="groupInviteYouAndOtherNew"><b>Tu</b> e <b>{other_name}</b> fate ora parte del gruppo.</string>

View File

@ -36,8 +36,9 @@
<string name="adminRemovedUser"><b>{name}</b> はアドミンから削除されました</string> <string name="adminRemovedUser"><b>{name}</b> はアドミンから削除されました</string>
<string name="adminRemovedUserMultiple"><b>{name}</b><b>{count}名</b> がAdminから削除されました。</string> <string name="adminRemovedUserMultiple"><b>{name}</b><b>{count}名</b> がAdminから削除されました。</string>
<string name="adminRemovedUserOther"><b>{name}</b><b>{other_name}</b> がAdminに昇格しました。</string> <string name="adminRemovedUserOther"><b>{name}</b><b>{other_name}</b> がAdminに昇格しました。</string>
<string name="adminSendingPromotion">管理者への昇進を送信中</string> <string name="adminSendingPromotion">アドミンへの昇進を送信中</string>
<string name="adminSettings">アドミン設定</string> <string name="adminSettings">アドミン設定</string>
<string name="adminTwoPromotedToAdmin"><b>{name}</b><b>{other_name}</b> がアドミンに昇格しました</string>
<string name="andMore">+{count}</string> <string name="andMore">+{count}</string>
<string name="anonymous">匿名</string> <string name="anonymous">匿名</string>
<string name="appearanceAutoDarkMode">オートダークモード</string> <string name="appearanceAutoDarkMode">オートダークモード</string>
@ -150,7 +151,7 @@
<string name="callsPermissionsRequiredDescription">プライバシー設定で「音声とビデオ通話」の許可を有効にできます。</string> <string name="callsPermissionsRequiredDescription">プライバシー設定で「音声とビデオ通話」の許可を有効にできます。</string>
<string name="callsReconnecting">再接続しています...</string> <string name="callsReconnecting">再接続しています...</string>
<string name="callsRinging">呼び出し中...</string> <string name="callsRinging">呼び出し中...</string>
<string name="callsSessionCall">{app_name} Call</string> <string name="callsSessionCall">{app_name} 電話</string>
<string name="callsSettings">通話 (ベータ版)</string> <string name="callsSettings">通話 (ベータ版)</string>
<string name="callsVoiceAndVideo">音声とビデオ通話</string> <string name="callsVoiceAndVideo">音声とビデオ通話</string>
<string name="callsVoiceAndVideoBeta">音声通話とビデオ通話 (ベータ版)</string> <string name="callsVoiceAndVideoBeta">音声通話とビデオ通話 (ベータ版)</string>
@ -236,7 +237,7 @@
<string name="conversationsEmpty">{conversation_name} にはメッセージがありません。</string> <string name="conversationsEmpty">{conversation_name} にはメッセージがありません。</string>
<string name="conversationsEnter">キーを入力</string> <string name="conversationsEnter">キーを入力</string>
<string name="conversationsEnterDescription">会話中のEnterキーの機能</string> <string name="conversationsEnterDescription">会話中のEnterキーの機能</string>
<string name="conversationsEnterNewLine">SHIFT + ENTER 送信, ENTER 改行</string> <string name="conversationsEnterNewLine">シフト + エンター 送信、エンター 改行</string>
<string name="conversationsEnterSends">エンターでメッセージを送信、シフト + エンターで改行を開始</string> <string name="conversationsEnterSends">エンターでメッセージを送信、シフト + エンターで改行を開始</string>
<string name="conversationsGroups">グループ</string> <string name="conversationsGroups">グループ</string>
<string name="conversationsMessageTrimming">メッセージの削減</string> <string name="conversationsMessageTrimming">メッセージの削減</string>
@ -244,10 +245,11 @@
<string name="conversationsMessageTrimmingTrimCommunitiesDescription">6ヶ月以上のコミュニティと2,000以上のメッセージがあるコミュニティからメッセージを削除します。</string> <string name="conversationsMessageTrimmingTrimCommunitiesDescription">6ヶ月以上のコミュニティと2,000以上のメッセージがあるコミュニティからメッセージを削除します。</string>
<string name="conversationsNew">新しい会話</string> <string name="conversationsNew">新しい会話</string>
<string name="conversationsNone">まだ通知はありません</string> <string name="conversationsNone">まだ通知はありません</string>
<string name="conversationsSendWithEnterKey">Enter キーで送信</string> <string name="conversationsSendWithEnterKey">エンターキーで送信</string>
<string name="conversationsSendWithEnterKeyDescription">Enterキーをタップすると、改行ではなく、メッセージが送信されます。</string> <string name="conversationsSendWithEnterKeyDescription">Enterキーをタップすると、改行ではなく、メッセージが送信されます。</string>
<string name="conversationsSettingsAllMedia">すべてのメディア</string> <string name="conversationsSettingsAllMedia">すべてのメディア</string>
<string name="conversationsSpellCheck">スペルチェック</string> <string name="conversationsSpellCheck">スペルチェック</string>
<string name="conversationsSpellCheckDescription">メッセージを入力するときにスペルチェックを有効にします</string>
<string name="conversationsStart">会話を開始する</string> <string name="conversationsStart">会話を開始する</string>
<string name="copied">コピーしました</string> <string name="copied">コピーしました</string>
<string name="copy">コピーする</string> <string name="copy">コピーする</string>
@ -316,8 +318,9 @@
<string name="disappearingMessagesDisappearAfterSendState">送信後に消えます - {time}</string> <string name="disappearingMessagesDisappearAfterSendState">送信後に消えます - {time}</string>
<string name="disappearingMessagesFollowSetting">設定をフォロー</string> <string name="disappearingMessagesFollowSetting">設定をフォロー</string>
<string name="disappearingMessagesFollowSettingOff">送信したメッセージはもう消滅しません。消滅メッセージを<b>オフ</b>にしてもよろしいですか?</string> <string name="disappearingMessagesFollowSettingOff">送信したメッセージはもう消滅しません。消滅メッセージを<b>オフ</b>にしてもよろしいですか?</string>
<string name="disappearingMessagesFollowSettingOn">あなたのメッセージを<b>{time}</b>後に<b>{disappearing_messages_type}</b>消えるように設定しますか?</string> <string name="disappearingMessagesFollowSettingOn">メッセージを<b>{time}</b>後に<b>{disappearing_messages_type}</b>消えるようにセットしますか?</string>
<string name="disappearingMessagesLegacy">{name}は古いクライアントを使用しています。消えるメッセージが期待通りに動作しない場合があります。</string> <string name="disappearingMessagesLegacy">{name}は古いクライアントを使用しています。消えるメッセージが期待通りに動作しない場合があります。</string>
<string name="disappearingMessagesOnlyAdmins">この設定はグループアドミンのみ変更可能です</string>
<string name="disappearingMessagesSent">送信済み</string> <string name="disappearingMessagesSent">送信済み</string>
<string name="disappearingMessagesSet"><b>{name}</b> が {time} になった後、{disappearing_messages_type}メッセージが消えるように設定しました。</string> <string name="disappearingMessagesSet"><b>{name}</b> が {time} になった後、{disappearing_messages_type}メッセージが消えるように設定しました。</string>
<string name="disappearingMessagesSetYou"><b>You</b> は {time} になった後、{disappearing_messages_type}メッセージが消えるように設定しました。</string> <string name="disappearingMessagesSetYou"><b>You</b> は {time} になった後、{disappearing_messages_type}メッセージが消えるように設定しました。</string>
@ -327,7 +330,7 @@
<string name="disappearingMessagesTurnedOffYou"><b>You</b><b>消えるメッセージ</b>をオフにしました。送信されたメッセージは消えなくなります。</string> <string name="disappearingMessagesTurnedOffYou"><b>You</b><b>消えるメッセージ</b>をオフにしました。送信されたメッセージは消えなくなります。</string>
<string name="disappearingMessagesTurnedOffYouGroup"><b>あなた</b> は消えているメッセージを <b>オフ</b>にしました。</string> <string name="disappearingMessagesTurnedOffYouGroup"><b>あなた</b> は消えているメッセージを <b>オフ</b>にしました。</string>
<string name="disappearingMessagesTypeRead">既読</string> <string name="disappearingMessagesTypeRead">既読</string>
<string name="disappearingMessagesTypeSent">送信</string> <string name="disappearingMessagesTypeSent">送信済み</string>
<string name="disappearingMessagesUpdated"><b>{admin_name}</b>が消えるメッセージの設定を更新しました</string> <string name="disappearingMessagesUpdated"><b>{admin_name}</b>が消えるメッセージの設定を更新しました</string>
<string name="disappearingMessagesUpdatedYou"><b>You</b> は消えるメッセージの設定を更新しました</string> <string name="disappearingMessagesUpdatedYou"><b>You</b> は消えるメッセージの設定を更新しました</string>
<string name="dismiss">キャンセル</string> <string name="dismiss">キャンセル</string>
@ -338,7 +341,7 @@
<string name="displayNameErrorNew">表示名を読み込めませんでした。続行するには新しい表示名を入力してください。</string> <string name="displayNameErrorNew">表示名を読み込めませんでした。続行するには新しい表示名を入力してください。</string>
<string name="displayNameNew">新しい表示名を選択してください</string> <string name="displayNameNew">新しい表示名を選択してください</string>
<string name="displayNamePick">表示名を選択してください</string> <string name="displayNamePick">表示名を選択してください</string>
<string name="displayNameSet">表示名を設定</string> <string name="displayNameSet">表示名をセット</string>
<string name="document">ドキュメント</string> <string name="document">ドキュメント</string>
<string name="done">完了</string> <string name="done">完了</string>
<string name="download">ダウンロード</string> <string name="download">ダウンロード</string>
@ -351,11 +354,15 @@
<string name="emojiCategoryFlags">フラグ</string> <string name="emojiCategoryFlags">フラグ</string>
<string name="emojiCategoryFood">食べ物・飲み物</string> <string name="emojiCategoryFood">食べ物・飲み物</string>
<string name="emojiCategoryObjects">オブジェクト</string> <string name="emojiCategoryObjects">オブジェクト</string>
<string name="emojiCategorySmileys">スマイル &amp;amp; 人</string> <string name="emojiCategoryRecentlyUsed">最近使用</string>
<string name="emojiCategorySmileys">スマイリーと人</string>
<string name="emojiCategorySymbols">記号</string> <string name="emojiCategorySymbols">記号</string>
<string name="emojiCategoryTravel">旅行&amp;場所</string> <string name="emojiCategoryTravel">旅行&amp;場所</string>
<string name="emojiReactsClearAll">すべての項目の{emoji}を削除してもよろしいですか?</string> <string name="emojiReactsClearAll">すべての項目の{emoji}を削除してもよろしいですか?</string>
<string name="emojiReactsCoolDown">スローダウンしました。絵文字リアクターが多すぎます。しばらくしてからもう一度試してください。</string> <string name="emojiReactsCoolDown">スローダウンしてください。絵文字リアクションが多すぎます。しばらくしてからもう一度試してください。</string>
<plurals name="emojiReactsCountOthers">
<item quantity="other">%1$d が %2$s をこのメッセージに反応しました</item>
</plurals>
<string name="emojiReactsHoverNameDesktop">{name}が{emoji_name}でリアクションしました</string> <string name="emojiReactsHoverNameDesktop">{name}が{emoji_name}でリアクションしました</string>
<string name="emojiReactsHoverNameTwoDesktop">{name}と{other_name}が{emoji_name}でリアクションしました</string> <string name="emojiReactsHoverNameTwoDesktop">{name}と{other_name}が{emoji_name}でリアクションしました</string>
<string name="emojiReactsHoverTwoNameMultipleDesktop">{name}と<span>{count}その他</span>が{emoji_name}で反応しました</string> <string name="emojiReactsHoverTwoNameMultipleDesktop">{name}と<span>{count}その他</span>が{emoji_name}で反応しました</string>
@ -388,7 +395,7 @@
<string name="groupError">グループエラー</string> <string name="groupError">グループエラー</string>
<string name="groupErrorCreate">グループの作成に失敗しました。インターネット接続を確認して、もう一度やり直してください。</string> <string name="groupErrorCreate">グループの作成に失敗しました。インターネット接続を確認して、もう一度やり直してください。</string>
<string name="groupErrorJoin">{group_name} への参加に失敗しました</string> <string name="groupErrorJoin">{group_name} への参加に失敗しました</string>
<string name="groupInformationSet">Set Group Information</string> <string name="groupInformationSet">グループの詳細をセット</string>
<string name="groupInviteDelete">本当にこのグループ招待を削除しますか?</string> <string name="groupInviteDelete">本当にこのグループ招待を削除しますか?</string>
<string name="groupInviteFailed">招待に失敗しました</string> <string name="groupInviteFailed">招待に失敗しました</string>
<string name="groupInviteFailedMultiple">{name} と他 {count} 人を {group_name} に招待できませんでした</string> <string name="groupInviteFailedMultiple">{name} と他 {count} 人を {group_name} に招待できませんでした</string>
@ -446,13 +453,13 @@
<string name="groupRemovedYou"><b>{group_name}</b>から削除されました。</string> <string name="groupRemovedYou"><b>{group_name}</b>から削除されました。</string>
<string name="groupRemovedYouMultiple"><b>あなた</b><b>{count}名</b> がグループから削除されました。</string> <string name="groupRemovedYouMultiple"><b>あなた</b><b>{count}名</b> がグループから削除されました。</string>
<string name="groupRemovedYouTwo"><b>あなた</b><b>{other_name}</b> がグループから削除されました。</string> <string name="groupRemovedYouTwo"><b>あなた</b><b>{other_name}</b> がグループから削除されました。</string>
<string name="groupSetDisplayPicture">グループのアイコン画像を設定</string> <string name="groupSetDisplayPicture">グループのアイコン画像をセット</string>
<string name="groupUnknown">不明なグループ</string> <string name="groupUnknown">不明なグループ</string>
<string name="groupUpdated">グループが更新されました</string> <string name="groupUpdated">グループが更新されました</string>
<string name="helpFAQ">よくある質問</string> <string name="helpFAQ">よくある質問</string>
<string name="helpHelpUsTranslateSession">{app_name}の翻訳にご協力ください</string> <string name="helpHelpUsTranslateSession">{app_name}の翻訳にご協力ください</string>
<string name="helpReportABug">バグを報告</string> <string name="helpReportABug">バグを報告</string>
<string name="helpReportABugDescription">詳細を共有して、私たちが問題を解決するのを手伝ってください。ログをエクスポートし、{app_name}のヘルプデスクを通じてファイルをアップロードしてください</string> <string name="helpReportABugDescription">詳細を共有して問題解決にご協力ください。ログをエクスポートして、{app_name}のヘルプデスクからファイルをアップロードしてください</string>
<string name="helpReportABugExportLogs">ログのエクスポート</string> <string name="helpReportABugExportLogs">ログのエクスポート</string>
<string name="helpReportABugExportLogsDescription">ログをエクスポートし、{app_name} のヘルプデスクにてファイルをアップロードします。</string> <string name="helpReportABugExportLogsDescription">ログをエクスポートし、{app_name} のヘルプデスクにてファイルをアップロードします。</string>
<string name="helpReportABugExportLogsSaveToDesktop">デスクトップに保存</string> <string name="helpReportABugExportLogsSaveToDesktop">デスクトップに保存</string>
@ -479,12 +486,12 @@
<string name="legacyGroupMemberTwoNew"><b>{name}</b><b>{other_name}</b> がグループに加わりました</string> <string name="legacyGroupMemberTwoNew"><b>{name}</b><b>{other_name}</b> がグループに加わりました</string>
<string name="legacyGroupMemberYouNew"><b>あなた</b>がグループに加わりました</string> <string name="legacyGroupMemberYouNew"><b>あなた</b>がグループに加わりました</string>
<string name="linkPreviews">リンクプレビュー</string> <string name="linkPreviews">リンクプレビュー</string>
<string name="linkPreviewsDescription">サポートされている URL のリンクプレビューを表示します</string> <string name="linkPreviewsDescription">サポートされている URL のリンクプレビューを表示します</string>
<string name="linkPreviewsEnable">リンクプレビューを有効にする</string> <string name="linkPreviewsEnable">リンクプレビューを有効にする</string>
<string name="linkPreviewsErrorLoad">リンクプレビューを読み込めません</string> <string name="linkPreviewsErrorLoad">リンクプレビューを読み込めません</string>
<string name="linkPreviewsErrorUnsecure">セキュアでないリンクのプレビューは読み込めません</string> <string name="linkPreviewsErrorUnsecure">セキュアでないリンクのプレビューは読み込めません</string>
<string name="linkPreviewsFirstDescription">送受信する URL のプレビューを表示します。これは便利ですが、{app_name} はプレビューを生成するためにリンクされた サイトにアクセスする必要があります。 {app_name} の設定でいつでもリンクのプレビューをオフにできます。</string> <string name="linkPreviewsFirstDescription">送受信する URL のプレビューを表示します。これは便利ですが、{app_name} はプレビューを生成するためにリンクされた サイトにアクセスする必要があります。 {app_name} の設定でいつでもリンクのプレビューをオフにできます。</string>
<string name="linkPreviewsSend">リンクプレビューを送る</string> <string name="linkPreviewsSend">リンクプレビューを表示</string>
<string name="linkPreviewsSendModalDescription">リンクのプレビューを送信するとき、完全なメタデータ保護はありません。</string> <string name="linkPreviewsSendModalDescription">リンクのプレビューを送信するとき、完全なメタデータ保護はありません。</string>
<string name="linkPreviewsTurnedOff">リンクプレビューが無効です</string> <string name="linkPreviewsTurnedOff">リンクプレビューが無効です</string>
<string name="linkPreviewsTurnedOffDescription">{app_name}は、送受信するリンクのプレビューを生成するためにリンクされたウェブサイトに接続する必要があります。\n\n{app_name}の設定でプレビューをオンにできます。</string> <string name="linkPreviewsTurnedOffDescription">{app_name}は、送受信するリンクのプレビューを生成するためにリンクされたウェブサイトに接続する必要があります。\n\n{app_name}の設定でプレビューをオンにできます。</string>
@ -516,8 +523,8 @@
<string name="membersInviteShareDescription"><b>{name}</b>にグループメッセージ履歴を共有しますか?</string> <string name="membersInviteShareDescription"><b>{name}</b>にグループメッセージ履歴を共有しますか?</string>
<string name="membersInviteShareDescriptionMultiple"><b>{name}</b><b>{count}人</b>にグループメッセージ履歴を共有しますか?</string> <string name="membersInviteShareDescriptionMultiple"><b>{name}</b><b>{count}人</b>にグループメッセージ履歴を共有しますか?</string>
<string name="membersInviteShareDescriptionTwo"><b>{name}</b><b>{other_name}</b>にグループメッセージ履歴を共有しますか?</string> <string name="membersInviteShareDescriptionTwo"><b>{name}</b><b>{other_name}</b>にグループメッセージ履歴を共有しますか?</string>
<string name="membersInviteShareMessageHistory">Share message history</string> <string name="membersInviteShareMessageHistory">メッセージ履歴を共有</string>
<string name="membersInviteShareNewMessagesOnly">Share new messages only</string> <string name="membersInviteShareNewMessagesOnly">新しいメッセージのみを共有</string>
<string name="membersInviteTitle">招待</string> <string name="membersInviteTitle">招待</string>
<string name="message">メッセージ</string> <string name="message">メッセージ</string>
<string name="messageEmpty">このメッセージは空です。</string> <string name="messageEmpty">このメッセージは空です。</string>
@ -542,7 +549,7 @@
<string name="messageRequestPending">メッセージ・リクエストは現在承認待ちです。</string> <string name="messageRequestPending">メッセージ・リクエストは現在承認待ちです。</string>
<string name="messageRequestPendingDescription">受信者がこのメッセージリクエストを承認すると、音声メッセージと添付ファイルを送信できます.</string> <string name="messageRequestPendingDescription">受信者がこのメッセージリクエストを承認すると、音声メッセージと添付ファイルを送信できます.</string>
<string name="messageRequestYouHaveAccepted"><b>{name}さん</b>のメッセージリクエストを承認しました</string> <string name="messageRequestYouHaveAccepted"><b>{name}さん</b>のメッセージリクエストを承認しました</string>
<string name="messageRequestsAcceptDescription">このユーザーにメッセージを送信すると、自動的にメッセージリクエストが承認され、あなたのAccount IDが公開されます。</string> <string name="messageRequestsAcceptDescription">このユーザーにメッセージを送ると、メッセージリクエストが自動的に承認され、アカウントIDが公開されます。</string>
<string name="messageRequestsAccepted">メッセージ・リクエストが承認されました。</string> <string name="messageRequestsAccepted">メッセージ・リクエストが承認されました。</string>
<string name="messageRequestsClearAllExplanation">本当に全てのメッセージリクエストとグループ招待を消去しますか?</string> <string name="messageRequestsClearAllExplanation">本当に全てのメッセージリクエストとグループ招待を消去しますか?</string>
<string name="messageRequestsCommunities">コミュニティメッセージリクエスト</string> <string name="messageRequestsCommunities">コミュニティメッセージリクエスト</string>
@ -568,7 +575,7 @@
<string name="nicknameDescription"><b>{name}</b>のニックネームを選んでください。これが1対1およびグループ会話で表示されます。</string> <string name="nicknameDescription"><b>{name}</b>のニックネームを選んでください。これが1対1およびグループ会話で表示されます。</string>
<string name="nicknameEnter">ニックネームを入力してください</string> <string name="nicknameEnter">ニックネームを入力してください</string>
<string name="nicknameRemove">ニックネームを削除</string> <string name="nicknameRemove">ニックネームを削除</string>
<string name="nicknameSet">Set Nickname</string> <string name="nicknameSet">ニックネームをセット</string>
<string name="no">いいえ</string> <string name="no">いいえ</string>
<string name="noSuggestions">候補はありません</string> <string name="noSuggestions">候補はありません</string>
<string name="none">なし</string> <string name="none">なし</string>
@ -594,6 +601,7 @@
<string name="notificationsIosRestart">{device}の再起動中にメッセージが届いたかもしれません</string> <string name="notificationsIosRestart">{device}の再起動中にメッセージが届いたかもしれません</string>
<string name="notificationsLedColor">LED色</string> <string name="notificationsLedColor">LED色</string>
<string name="notificationsMentionsOnly">メンションのみ</string> <string name="notificationsMentionsOnly">メンションのみ</string>
<string name="notificationsMessage">メッセージ通知</string>
<string name="notificationsMostRecent">最新の受信: {name}</string> <string name="notificationsMostRecent">最新の受信: {name}</string>
<string name="notificationsMute">ミュート</string> <string name="notificationsMute">ミュート</string>
<string name="notificationsMuteFor">{time_large}間ミュート</string> <string name="notificationsMuteFor">{time_large}間ミュート</string>
@ -630,7 +638,7 @@
<string name="onionRoutingPathDescription">{app_name}は、{app_name}の分散型ネットワークの複数のService Nodeを介してメッセージをバウンスすることにより、IPアドレスを隠します。これが現在の経路です:</string> <string name="onionRoutingPathDescription">{app_name}は、{app_name}の分散型ネットワークの複数のService Nodeを介してメッセージをバウンスすることにより、IPアドレスを隠します。これが現在の経路です:</string>
<string name="onionRoutingPathDestination">目的先</string> <string name="onionRoutingPathDestination">目的先</string>
<string name="onionRoutingPathEntryNode">エントリーノード</string> <string name="onionRoutingPathEntryNode">エントリーノード</string>
<string name="onionRoutingPathServiceNode">Service Node</string> <string name="onionRoutingPathServiceNode">サービスノード</string>
<string name="onionRoutingPathUnknownCountry">国名が不明</string> <string name="onionRoutingPathUnknownCountry">国名が不明</string>
<string name="onsErrorNotRecognized">このONSを認識できませんでした。内容を確認して再度お試しください。</string> <string name="onsErrorNotRecognized">このONSを認識できませんでした。内容を確認して再度お試しください。</string>
<string name="onsErrorUnableToSearch">このONSを検索できませんでした。後でもう一度お試しください。</string> <string name="onsErrorUnableToSearch">このONSを検索できませんでした。後でもう一度お試しください。</string>
@ -642,6 +650,7 @@
<string name="passwordConfirm">パスワードを再確認</string> <string name="passwordConfirm">パスワードを再確認</string>
<string name="passwordCreate">パスワードを作成してください</string> <string name="passwordCreate">パスワードを作成してください</string>
<string name="passwordCurrentIncorrect">現在のパスワードが間違っています。</string> <string name="passwordCurrentIncorrect">現在のパスワードが間違っています。</string>
<string name="passwordDescription">{app_name} のロックを解除するにはパスワードが必要です</string>
<string name="passwordEnter">パスワードを入力してください</string> <string name="passwordEnter">パスワードを入力してください</string>
<string name="passwordEnterCurrent">現在のパスワードを入力してください</string> <string name="passwordEnterCurrent">現在のパスワードを入力してください</string>
<string name="passwordEnterNew">新しいパスワードを入力してください</string> <string name="passwordEnterNew">新しいパスワードを入力してください</string>
@ -653,7 +662,7 @@
<string name="passwordRemove">パスワードを削除</string> <string name="passwordRemove">パスワードを削除</string>
<string name="passwordRemoveDescription">{app_name} のロックを解除するために必要なパスワードを削除します</string> <string name="passwordRemoveDescription">{app_name} のロックを解除するために必要なパスワードを削除します</string>
<string name="passwordRemovedDescription">パスワードを削除しました。</string> <string name="passwordRemovedDescription">パスワードを削除しました。</string>
<string name="passwordSet">パスワードを設定</string> <string name="passwordSet">パスワードをセット</string>
<string name="passwordSetDescription">パスワードが設定されました。安全に保管してください。</string> <string name="passwordSetDescription">パスワードが設定されました。安全に保管してください。</string>
<string name="paste">貼り付け</string> <string name="paste">貼り付け</string>
<string name="permissionMusicAudioDenied">{app_name} は、ファイル、音楽、およびオーディオを送信するために音楽およびオーディオアクセスが必要ですが、それが恒久的に拒否されています。設定に移動して、「権限」を選択し、「音楽およびオーディオ」を有効にしてください。</string> <string name="permissionMusicAudioDenied">{app_name} は、ファイル、音楽、およびオーディオを送信するために音楽およびオーディオアクセスが必要ですが、それが恒久的に拒否されています。設定に移動して、「権限」を選択し、「音楽およびオーディオ」を有効にしてください。</string>
@ -685,20 +694,21 @@
<string name="profile">プロフィール</string> <string name="profile">プロフィール</string>
<string name="profileDisplayPicture">ディスプレイの画像</string> <string name="profileDisplayPicture">ディスプレイの画像</string>
<string name="profileDisplayPictureRemoveError">表示画像の削除に失敗しました。</string> <string name="profileDisplayPictureRemoveError">表示画像の削除に失敗しました。</string>
<string name="profileDisplayPictureSet">ディスプレイの画像を設定</string> <string name="profileDisplayPictureSet">ディスプレイの画像をセット</string>
<string name="profileDisplayPictureSizeError">小さいファイルを選んでください</string> <string name="profileDisplayPictureSizeError">小さいファイルを選んでください</string>
<string name="profileErrorUpdate">プロフィールを更新できませんでした</string> <string name="profileErrorUpdate">プロフィールを更新できませんでした</string>
<string name="promote">昇格</string> <string name="promote">昇格</string>
<string name="qrCode">QR コード</string> <string name="qrCode">QR コード</string>
<string name="qrNotAccountId">このQRコードにはアカウントIDが含まれていません</string> <string name="qrNotAccountId">このQRコードにはアカウントIDが含まれていません</string>
<string name="qrNotRecoveryPassword">このQRコードにはリカバリーパスワードが含まれていません</string> <string name="qrNotRecoveryPassword">このQRコードにはリカバリーパスワードが含まれていません</string>
<string name="qrScan">QRコードを読み取る</string> <string name="qrScan">QRコードをスキャン</string>
<string name="qrView">QRコードを表示</string> <string name="qrView">QRコードを表示</string>
<string name="qrYoursDescription">友達があなたのQRコードをスキャンすることでメッセージを送信できます</string>
<string name="quit">{app_name} を終了</string> <string name="quit">{app_name} を終了</string>
<string name="quitButton">終了</string> <string name="quitButton">終了</string>
<string name="read">既読</string> <string name="read">既読</string>
<string name="readReceipts">既読通知</string> <string name="readReceipts">既読通知</string>
<string name="readReceiptsDescription">送信したすべてのメッセージに対する既読通知を表示します</string> <string name="readReceiptsDescription">送信したすべてのメッセージに対する既読通知を表示します</string>
<string name="received">受信:</string> <string name="received">受信:</string>
<string name="recommended">オススメ</string> <string name="recommended">オススメ</string>
<string name="recoveryPasswordBannerDescription">リカバリーパスワードを保存して、アカウントにアクセスできなくならないようにしてください</string> <string name="recoveryPasswordBannerDescription">リカバリーパスワードを保存して、アカウントにアクセスできなくならないようにしてください</string>
@ -733,8 +743,8 @@
<string name="savedMessages">保存済みのメッセージ</string> <string name="savedMessages">保存済みのメッセージ</string>
<string name="saving">保存中...</string> <string name="saving">保存中...</string>
<string name="scan">スキャン</string> <string name="scan">スキャン</string>
<string name="screenSecurity">スクリーンセキュリティ</string> <string name="screenSecurity">スクリーンセキュリティ</string>
<string name="screenshotNotifications">スクリーンショット撮影時の通知</string> <string name="screenshotNotifications">スクリーンショット通知</string>
<string name="screenshotNotificationsDescription">連絡先が1対1チャットのスクリーンショットを撮ったときに通知を受け取ります</string> <string name="screenshotNotificationsDescription">連絡先が1対1チャットのスクリーンショットを撮ったときに通知を受け取ります</string>
<string name="screenshotTaken"><b>{name}</b>はスクリーンショットを撮りました</string> <string name="screenshotTaken"><b>{name}</b>はスクリーンショットを撮りました</string>
<string name="search">検索</string> <string name="search">検索</string>
@ -768,12 +778,12 @@
<string name="settingsRestartDescription">新しい設定を適用するために {app_name} を再起動する必要があります.</string> <string name="settingsRestartDescription">新しい設定を適用するために {app_name} を再起動する必要があります.</string>
<string name="share">共有</string> <string name="share">共有</string>
<string name="shareAccountIdDescription">友達を{app_name} に招待して、チャットを始めましょう。アカウントIDを共有して招待できます。</string> <string name="shareAccountIdDescription">友達を{app_name} に招待して、チャットを始めましょう。アカウントIDを共有して招待できます。</string>
<string name="shareAccountIdDescriptionCopied">いつもどこでも友達と共有してください — ここで会話を移動します。</string> <string name="shareAccountIdDescriptionCopied">いつでもどこでも友達と共有 — ここで会話を始めましょう</string>
<string name="shareExtensionDatabaseError">データベースを開く際に問題が発生しました。アプリを再起動して再度お試しください。</string> <string name="shareExtensionDatabaseError">データベースを開く際に問題が発生しました。アプリを再起動して再度お試しください。</string>
<string name="shareToSession">{app_name}に共有</string> <string name="shareToSession">{app_name}に共有</string>
<string name="show">表示</string> <string name="show">表示</string>
<string name="showAll">すべて表示</string> <string name="showAll">すべて表示</string>
<string name="showLess">最小化</string> <string name="showLess">少なく表示</string>
<string name="stickers">ステッカー</string> <string name="stickers">ステッカー</string>
<string name="supportGoTo">サポートページへ</string> <string name="supportGoTo">サポートページへ</string>
<string name="systemInformationDesktop">システム情報: {information}</string> <string name="systemInformationDesktop">システム情報: {information}</string>
@ -782,7 +792,7 @@
<string name="theError">エラー</string> <string name="theError">エラー</string>
<string name="tryAgain">再試行</string> <string name="tryAgain">再試行</string>
<string name="typingIndicators">入力中アイコン</string> <string name="typingIndicators">入力中アイコン</string>
<string name="typingIndicatorsDescription">入力中アイコンを表示する</string> <string name="typingIndicatorsDescription">入力中アイコンを表示</string>
<string name="undo">元に戻す</string> <string name="undo">元に戻す</string>
<string name="unknown">不明</string> <string name="unknown">不明</string>
<string name="updateApp">アプリ更新</string> <string name="updateApp">アプリ更新</string>

View File

@ -143,6 +143,7 @@
<string name="callsInProgress">Bangê Bejeziyene</string> <string name="callsInProgress">Bangê Bejeziyene</string>
<string name="callsIncoming">Gerîna hatî ji {name}</string> <string name="callsIncoming">Gerîna hatî ji {name}</string>
<string name="callsIncomingUnknown">Gerîna habe</string> <string name="callsIncomingUnknown">Gerîna habe</string>
<string name="callsMicrophonePermissionsRequired">Te ji telefona ji <b>{name}</b> hatî ma, ji ber ku te destûra <b>gihîna mîkrofonê</b> nedaye.</string>
<string name="callsMissed">Gerîna negerîl</string> <string name="callsMissed">Gerîna negerîl</string>
<string name="callsMissedCallFrom">Gerîna nececawdayî ji {name}</string> <string name="callsMissedCallFrom">Gerîna nececawdayî ji {name}</string>
<string name="callsNotificationsRequired">Lêgerînên Dengî û Vîdeoyî div têgehin Navigationda dê system tê bikeviya nizanaran divê Troll karibe binšiyan</string> <string name="callsNotificationsRequired">Lêgerînên Dengî û Vîdeoyî div têgehin Navigationda dê system tê bikeviya nizanaran divê Troll karibe binšiyan</string>
@ -278,7 +279,7 @@
<string name="deleteAfterLegacyGroupsGroupUpdateErrorTitle">Bi ser neket ku komê biguherînin</string> <string name="deleteAfterLegacyGroupsGroupUpdateErrorTitle">Bi ser neket ku komê biguherînin</string>
<string name="deleteAfterMessageDeletionStandardisationMessageDeletionForbidden">Îzna te tine ye ku mesajên kesên din jê bibî</string> <string name="deleteAfterMessageDeletionStandardisationMessageDeletionForbidden">Îzna te tine ye ku mesajên kesên din jê bibî</string>
<plurals name="deleteMessage"> <plurals name="deleteMessage">
<item quantity="one">Peyama Jê Bibe</item> <item quantity="one">Peyamê Jê Bibe</item>
<item quantity="other">Peyaman Jê Bibe</item> <item quantity="other">Peyaman Jê Bibe</item>
</plurals> </plurals>
<string name="deleteMessageConfirm">Tu piştrast î ku tu dixwazî vê peyamê jê bibî?</string> <string name="deleteMessageConfirm">Tu piştrast î ku tu dixwazî vê peyamê jê bibî?</string>
@ -295,7 +296,7 @@
<string name="deleteMessageEveryone">Ji bo tevan jê bibe</string> <string name="deleteMessageEveryone">Ji bo tevan jê bibe</string>
<plurals name="deleteMessageFailed"> <plurals name="deleteMessageFailed">
<item quantity="one">Bi ser neket ku peyama jê derbike.</item> <item quantity="one">Bi ser neket ku peyama jê derbike.</item>
<item quantity="other">Bi ser neket ku peyam nebe derbike.</item> <item quantity="other">Bi ser neket ku peyaman jê bibe.</item>
</plurals> </plurals>
<string name="deleteMessagesConfirm">Tu piştrast î ku tu dixwazî peyamên van jê bibî?</string> <string name="deleteMessagesConfirm">Tu piştrast î ku tu dixwazî peyamên van jê bibî?</string>
<string name="deleteMessagesDescriptionDevice">Tu piştrast î ku tu dixwazî vê peyaman tenê li ser cîhaza vê peyaman jê bibî?</string> <string name="deleteMessagesDescriptionDevice">Tu piştrast î ku tu dixwazî vê peyaman tenê li ser cîhaza vê peyaman jê bibî?</string>
@ -520,7 +521,7 @@
<item quantity="other">%1$d endam</item> <item quantity="other">%1$d endam</item>
</plurals> </plurals>
<plurals name="membersActive"> <plurals name="membersActive">
<item quantity="one">%1$d endamê aktîf</item> <item quantity="one">%1$d endamê aktîv</item>
<item quantity="other">%1$d endamên aktîf</item> <item quantity="other">%1$d endamên aktîf</item>
</plurals> </plurals>
<string name="membersAddAccountIdOrOns">Add Account ID or ONS</string> <string name="membersAddAccountIdOrOns">Add Account ID or ONS</string>
@ -551,7 +552,7 @@
<string name="messageNewDescriptionDesktop">Bi navê hesabê hevalê xwe Account ID an ONS-ê têlepeqîne.</string> <string name="messageNewDescriptionDesktop">Bi navê hesabê hevalê xwe Account ID an ONS-ê têlepeqîne.</string>
<string name="messageNewDescriptionMobile">Bi navê hesabê hevalê xwe Account ID, ONS an scanê QR code-yê têlepeqîne.</string> <string name="messageNewDescriptionMobile">Bi navê hesabê hevalê xwe Account ID, ONS an scanê QR code-yê têlepeqîne.</string>
<plurals name="messageNewYouveGot"> <plurals name="messageNewYouveGot">
<item quantity="one">Tu peyama nûyeke hatî gotandî hiştî.</item> <item quantity="one">Peyameke te yê nû heye.</item>
<item quantity="other">%1$d peyama nû hîn tuneyê.</item> <item quantity="other">%1$d peyama nû hîn tuneyê.</item>
</plurals> </plurals>
<string name="messageReplyingTo">Cewab didî</string> <string name="messageReplyingTo">Cewab didî</string>
@ -763,7 +764,7 @@
<string name="searchConversation">Li söylek bigerrin</string> <string name="searchConversation">Li söylek bigerrin</string>
<string name="searchEnter">Kerem bike tu li ser Giphy ne girêdane - ne têketina gêrê, usbikirina tambûra têkeve</string> <string name="searchEnter">Kerem bike tu li ser Giphy ne girêdane - ne têketina gêrê, usbikirina tambûra têkeve</string>
<plurals name="searchMatches"> <plurals name="searchMatches">
<item quantity="one">%1$d ji %2$d lihevhatû</item> <item quantity="one">%1$d ji %2$d li hev tê</item>
<item quantity="other">%1$d li li %2$d yên din</item> <item quantity="other">%1$d li li %2$d yên din</item>
</plurals> </plurals>
<string name="searchMatchesNone">Encam peyda nebû</string> <string name="searchMatchesNone">Encam peyda nebû</string>

View File

@ -397,6 +397,9 @@
<string name="groupMemberLeftMultiple"><b>{name}</b> un <b>{count} citi</b> atstāja grupu.</string> <string name="groupMemberLeftMultiple"><b>{name}</b> un <b>{count} citi</b> atstāja grupu.</string>
<string name="groupMemberLeftTwo"><b>{name}</b> un <b>{other_name}</b> atstāja grupu.</string> <string name="groupMemberLeftTwo"><b>{name}</b> un <b>{other_name}</b> atstāja grupu.</string>
<string name="groupMemberNew">Grupai pievienojās <b>{name}</b>.</string> <string name="groupMemberNew">Grupai pievienojās <b>{name}</b>.</string>
<string name="groupMemberNewHistory"><b>{name}</b> uzaicināts pievienoties grupai un sarakstes vēsture tam pieejama.</string>
<string name="groupMemberNewMultiple"><b>{name}</b> un <b>{count} others</b> uzaicināti pievienoties grupai.</string>
<string name="groupMemberNewTwo"><b>{name}</b> un <b>{other_name}</b> uzaicināti pievienoties grupai.</string>
<string name="groupMemberYouLeft"><b>Tu</b> atstāji grupu.</string> <string name="groupMemberYouLeft"><b>Tu</b> atstāji grupu.</string>
<string name="groupMembers">Grupas dalībnieki</string> <string name="groupMembers">Grupas dalībnieki</string>
<string name="groupMembersNone">Šajā grupā nav citu dalībnieku.</string> <string name="groupMembersNone">Šajā grupā nav citu dalībnieku.</string>
@ -494,6 +497,11 @@
<string name="messageInfo">Ziņas informācija</string> <string name="messageInfo">Ziņas informācija</string>
<string name="messageMarkRead">Atzīmēt kā izlasītu</string> <string name="messageMarkRead">Atzīmēt kā izlasītu</string>
<string name="messageMarkUnread">Atzīmēt kā nelasītu</string> <string name="messageMarkUnread">Atzīmēt kā nelasītu</string>
<plurals name="messageNew">
<item quantity="zero">Jauna ziņa</item>
<item quantity="one">Jauna ziņa</item>
<item quantity="other">Jauna ziņa</item>
</plurals>
<string name="messageNewDescriptionDesktop">Sāc jaunu sarunu, ievadot drauga Konta ID vai ONS.</string> <string name="messageNewDescriptionDesktop">Sāc jaunu sarunu, ievadot drauga Konta ID vai ONS.</string>
<string name="messageNewDescriptionMobile">Sāc jaunu sarunu, ievadot drauga Konta ID, ONS vai skenējot viņu QR kodu.</string> <string name="messageNewDescriptionMobile">Sāc jaunu sarunu, ievadot drauga Konta ID, ONS vai skenējot viņu QR kodu.</string>
<plurals name="messageNewYouveGot"> <plurals name="messageNewYouveGot">

View File

@ -531,7 +531,7 @@
<string name="max">Максимальный</string> <string name="max">Максимальный</string>
<string name="media">Медиа</string> <string name="media">Медиа</string>
<plurals name="members"> <plurals name="members">
<item quantity="one">%1$d участник</item> <item quantity="one">%1$d Участник</item>
<item quantity="few">%1$d участника</item> <item quantity="few">%1$d участника</item>
<item quantity="many">%1$d участников</item> <item quantity="many">%1$d участников</item>
<item quantity="other">%1$d участников</item> <item quantity="other">%1$d участников</item>

View File

@ -143,6 +143,7 @@
<string name="callsInProgress">Prebiehajúci hovor</string> <string name="callsInProgress">Prebiehajúci hovor</string>
<string name="callsIncoming">Prichádzajúci hovor od {name}</string> <string name="callsIncoming">Prichádzajúci hovor od {name}</string>
<string name="callsIncomingUnknown">Prichádzajúci hovor</string> <string name="callsIncomingUnknown">Prichádzajúci hovor</string>
<string name="callsMicrophonePermissionsRequired">Zmeškali ste hovor od <b>{name}</b>, pretože ste neudelili <b>prístup k mikrofónu</b>.</string>
<string name="callsMissed">Zmeškaný hovor</string> <string name="callsMissed">Zmeškaný hovor</string>
<string name="callsMissedCallFrom">Zmeškaný hovor od {name}</string> <string name="callsMissedCallFrom">Zmeškaný hovor od {name}</string>
<string name="callsNotificationsRequired">Hlasové a video hovory vyžadujú povolenie upozornení v systémových nastaveniach vášho zariadenia.</string> <string name="callsNotificationsRequired">Hlasové a video hovory vyžadujú povolenie upozornení v systémových nastaveniach vášho zariadenia.</string>

View File

@ -463,9 +463,9 @@
<string name="helpReportABugExportLogs">导出日志</string> <string name="helpReportABugExportLogs">导出日志</string>
<string name="helpReportABugExportLogsDescription">导出您的日志,然后通过{app_name}的帮助服务台上传日志。</string> <string name="helpReportABugExportLogsDescription">导出您的日志,然后通过{app_name}的帮助服务台上传日志。</string>
<string name="helpReportABugExportLogsSaveToDesktop">保存到桌面</string> <string name="helpReportABugExportLogsSaveToDesktop">保存到桌面</string>
<string name="helpReportABugExportLogsSaveToDesktopDescription">将此文件保存到您的桌面,然后与{app_name}开发者分享</string> <string name="helpReportABugExportLogsSaveToDesktopDescription">将此文件保存到您的桌面,然后与{app_name}开发者分享</string>
<string name="helpSupport">支持</string> <string name="helpSupport">支持</string>
<string name="helpWedLoveYourFeedback">感谢您的反馈</string> <string name="helpWedLoveYourFeedback">感谢您的反馈</string>
<string name="hide">隐藏</string> <string name="hide">隐藏</string>
<string name="hideMenuBarDescription">切换系统菜单栏可见性</string> <string name="hideMenuBarDescription">切换系统菜单栏可见性</string>
<string name="hideOthers">隐藏其它</string> <string name="hideOthers">隐藏其它</string>

View File

@ -19,7 +19,7 @@ chmod 600 ssh_key
# Define the output paths # Define the output paths
build_dir="app/build/outputs/apk/play/debug" build_dir="app/build/outputs/apk/play/debug"
target_path="${build_dir}/$(ls ${build_dir} | grep -o 'app-[^[:space:]]*-universal-debug.apk')" target_path="${build_dir}/$(ls ${build_dir} | grep -o 'session-[^[:space:]]*-universal.apk')"
# Validate the paths exist # Validate the paths exist
if [ ! -d $build_path ]; then if [ ! -d $build_path ]; then