mirror of
https://github.com/oxen-io/session-android.git
synced 2024-12-24 16:57:50 +00:00
commit
231360dd1c
@ -13,8 +13,8 @@ configurations.forEach {
|
||||
it.exclude module: "commons-logging"
|
||||
}
|
||||
|
||||
def canonicalVersionCode = 382
|
||||
def canonicalVersionName = "1.20.0"
|
||||
def canonicalVersionCode = 383
|
||||
def canonicalVersionName = "1.20.1"
|
||||
|
||||
def postFixSize = 10
|
||||
def abiPostFix = ['armeabi-v7a' : 1,
|
||||
@ -56,7 +56,7 @@ android {
|
||||
|
||||
splits {
|
||||
abi {
|
||||
enable true
|
||||
enable !project.hasProperty('huawei') // huawei builds do not need the split variants
|
||||
reset()
|
||||
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
||||
universalApk true
|
||||
@ -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"
|
||||
productFlavors {
|
||||
play {
|
||||
@ -129,6 +148,7 @@ android {
|
||||
buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.ANDROID"
|
||||
buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl"
|
||||
buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"\"'
|
||||
signingConfig signingConfigs.play
|
||||
}
|
||||
|
||||
huawei {
|
||||
@ -138,6 +158,7 @@ android {
|
||||
buildConfigField "org.session.libsession.utilities.Device", "DEVICE", "org.session.libsession.utilities.Device.HUAWEI"
|
||||
buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl"
|
||||
buildConfigField 'String', 'PUSH_KEY_SUFFIX', '\"_HUAWEI\"'
|
||||
signingConfig signingConfigs.huawei
|
||||
}
|
||||
|
||||
website {
|
||||
@ -150,13 +171,15 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
applicationVariants.forEach { variant ->
|
||||
applicationVariants.configureEach { variant ->
|
||||
variant.outputs.each { output ->
|
||||
def abiName = output.getFilter("ABI") ?: 'universal'
|
||||
def postFix = abiPostFix.get(abiName, 0)
|
||||
|
||||
def flavour = (variant.flavorName == 'huawei') ? "-huawei" : ""
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
@ -62,7 +62,10 @@ class SessionDialogBuilder(val context: Context) {
|
||||
|
||||
// Main title entry point
|
||||
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
|
||||
@ -74,18 +77,24 @@ class SessionDialogBuilder(val context: Context) {
|
||||
fun text(@StringRes id: Int, style: Int? = null) = text(context.getString(id), style)
|
||||
|
||||
fun text(text: CharSequence?, @StyleRes style: Int? = null) {
|
||||
text(text, style) {
|
||||
text(text = text, style = style) {
|
||||
layoutParams = LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
|
||||
.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
|
||||
TextView(context, null, 0, style ?: R.style.TextAppearance_Session_Dialog_Message)
|
||||
.apply {
|
||||
setText(text)
|
||||
textAlignment = View.TEXT_ALIGNMENT_CENTER
|
||||
contentDescription = qaTag
|
||||
modify()
|
||||
}.let(topView::addView)
|
||||
|
||||
@ -166,7 +175,7 @@ class SessionDialogBuilder(val context: Context) {
|
||||
textColor?.let{
|
||||
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)
|
||||
setOnClickListener {
|
||||
listener.invoke()
|
||||
|
@ -38,7 +38,6 @@ import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.platform.ViewCompositionStrategy
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.drawToBitmap
|
||||
import androidx.core.view.isGone
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.fragment.app.DialogFragment
|
||||
@ -59,6 +58,7 @@ import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.collectLatest
|
||||
import kotlinx.coroutines.flow.receiveAsFlow
|
||||
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.NetworkUtils
|
||||
import org.thoughtcrime.securesms.util.SaveAttachmentTask
|
||||
import org.thoughtcrime.securesms.util.drawToBitmap
|
||||
import org.thoughtcrime.securesms.util.isScrolledToBottom
|
||||
import org.thoughtcrime.securesms.util.isScrolledToWithin30dpOfBottom
|
||||
import org.thoughtcrime.securesms.util.push
|
||||
@ -734,9 +735,10 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
||||
private fun restoreDraftIfNeeded() {
|
||||
val mediaURI = intent.data
|
||||
val mediaType = AttachmentManager.MediaType.from(intent.type)
|
||||
val mimeType = MediaUtil.getMimeType(this, mediaURI)
|
||||
if (mediaURI != null && mediaType != null) {
|
||||
if (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())
|
||||
if (mimeType != null && (AttachmentManager.MediaType.IMAGE == mediaType || AttachmentManager.MediaType.GIF == mediaType || AttachmentManager.MediaType.VIDEO == mediaType)) {
|
||||
val media = Media(mediaURI, mimeType, 0, 0, 0, 0, Optional.absent(), Optional.absent())
|
||||
startActivityForResult(MediaSendActivity.buildEditorIntent(this, listOf( media ), viewModel.recipient!!, ""), PICK_FROM_LIBRARY)
|
||||
return
|
||||
} else {
|
||||
@ -813,7 +815,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
||||
if (shouldShowLegacy) {
|
||||
|
||||
val txt = Phrase.from(applicationContext, R.string.disappearingMessagesLegacy)
|
||||
.put(NAME_KEY, legacyRecipient!!.name)
|
||||
.put(NAME_KEY, legacyRecipient!!.toShortString())
|
||||
.format()
|
||||
binding?.outdatedBannerTextView?.text = txt
|
||||
}
|
||||
@ -1191,14 +1193,14 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
||||
title(R.string.block)
|
||||
text(
|
||||
Phrase.from(context, R.string.blockDescription)
|
||||
.put(NAME_KEY, recipient.name)
|
||||
.put(NAME_KEY, recipient.toShortString())
|
||||
.format()
|
||||
)
|
||||
dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) {
|
||||
viewModel.block()
|
||||
|
||||
// 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()
|
||||
|
||||
if (deleteThread) {
|
||||
@ -1249,7 +1251,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
||||
title(R.string.blockUnblock)
|
||||
text(
|
||||
Phrase.from(context, R.string.blockUnblockName)
|
||||
.put(NAME_KEY, recipient.name)
|
||||
.put(NAME_KEY, recipient.toShortString())
|
||||
.format()
|
||||
)
|
||||
dangerButton(R.string.blockUnblock, R.string.AccessibilityId_unblockConfirm) { viewModel.unblock() }
|
||||
@ -1737,10 +1739,19 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
||||
binding.inputBar.text = ""
|
||||
binding.inputBar.cancelQuoteDraft()
|
||||
binding.inputBar.cancelLinkPreviewDraft()
|
||||
// Put the message in the database
|
||||
message.id = smsDb.insertMessageOutbox(viewModel.threadId, outgoingTextMessage, false, message.sentTimestamp!!, null, true)
|
||||
// Send it
|
||||
MessageSender.send(message, recipient.address)
|
||||
lifecycleScope.launch(Dispatchers.Default) {
|
||||
// Put the message in the database
|
||||
message.id = smsDb.insertMessageOutbox(
|
||||
viewModel.threadId,
|
||||
outgoingTextMessage,
|
||||
false,
|
||||
message.sentTimestamp!!,
|
||||
null,
|
||||
true
|
||||
)
|
||||
// Send it
|
||||
MessageSender.send(message, recipient.address)
|
||||
}
|
||||
// Send a typing stopped message
|
||||
ApplicationContext.getInstance(this).typingStatusSender.onTypingStopped(viewModel.threadId)
|
||||
return Pair(recipient.address, sentTimestamp)
|
||||
|
@ -35,7 +35,7 @@ class DownloadDialog(private val recipient: Recipient) : DialogFragment() {
|
||||
title(getString(R.string.attachmentsAutoDownloadModalTitle))
|
||||
|
||||
val explanation = Phrase.from(context, R.string.attachmentsAutoDownloadModalDescription)
|
||||
.put(CONVERSATION_NAME_KEY, recipient.name)
|
||||
.put(CONVERSATION_NAME_KEY, recipient.toShortString())
|
||||
.format()
|
||||
val spannable = SpannableStringBuilder(explanation)
|
||||
|
||||
|
@ -144,14 +144,17 @@ public class ThreadRecord extends DisplayRecord {
|
||||
.format().toString();
|
||||
|
||||
} else if (MmsSmsColumns.Types.isMessageRequestResponse(type)) {
|
||||
if (lastMessage.getRecipient().getAddress().serialize().equals(
|
||||
TextSecurePreferences.getLocalNumber(context))) {
|
||||
return UtilKt.getSubbedCharSequence(
|
||||
context,
|
||||
R.string.messageRequestYouHaveAccepted,
|
||||
new Pair<>(NAME_KEY, getName())
|
||||
);
|
||||
try {
|
||||
if (lastMessage.getRecipient().getAddress().serialize().equals(
|
||||
TextSecurePreferences.getLocalNumber(context))) {
|
||||
return UtilKt.getSubbedCharSequence(
|
||||
context,
|
||||
R.string.messageRequestYouHaveAccepted,
|
||||
new Pair<>(NAME_KEY, getName())
|
||||
);
|
||||
}
|
||||
}
|
||||
catch (Exception e){} // the above can throw a null exception
|
||||
|
||||
return context.getString(R.string.messageRequestsAccepted);
|
||||
} else if (getCount() == 0) {
|
||||
|
@ -74,12 +74,10 @@ fun DebugMenu(
|
||||
buttons = listOf(
|
||||
DialogButtonModel(
|
||||
text = GetString(R.string.cancel),
|
||||
contentDescription = GetString(R.string.cancel),
|
||||
onClick = { sendCommand(HideEnvironmentWarningDialog) }
|
||||
),
|
||||
DialogButtonModel(
|
||||
text = GetString(R.string.ok),
|
||||
contentDescription = GetString(R.string.ok),
|
||||
onClick = { sendCommand(ChangeEnvironment) }
|
||||
)
|
||||
)
|
||||
|
@ -71,6 +71,7 @@ import org.thoughtcrime.securesms.home.search.GlobalSearchViewModel
|
||||
import org.thoughtcrime.securesms.messagerequests.MessageRequestsActivity
|
||||
import com.bumptech.glide.Glide
|
||||
import com.bumptech.glide.RequestManager
|
||||
import org.session.libsession.utilities.truncateIdForDisplay
|
||||
import org.thoughtcrime.securesms.notifications.PushRegistry
|
||||
import org.thoughtcrime.securesms.permissions.Permissions
|
||||
import org.thoughtcrime.securesms.preferences.SettingsActivity
|
||||
@ -507,7 +508,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
|
||||
showSessionDialog {
|
||||
title(R.string.block)
|
||||
text(Phrase.from(context, R.string.blockDescription)
|
||||
.put(NAME_KEY, thread.recipient.name)
|
||||
.put(NAME_KEY, thread.recipient.toShortString())
|
||||
.format())
|
||||
dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) {
|
||||
lifecycleScope.launch(Dispatchers.IO) {
|
||||
@ -518,7 +519,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
|
||||
}
|
||||
}
|
||||
// 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()
|
||||
}
|
||||
cancelButton()
|
||||
@ -528,7 +529,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
|
||||
private fun unblockConversation(thread: ThreadRecord) {
|
||||
showSessionDialog {
|
||||
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) {
|
||||
lifecycleScope.launch(Dispatchers.IO) {
|
||||
storage.setBlocked(listOf(thread.recipient), false)
|
||||
@ -616,7 +617,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
|
||||
if (recipient.name != null) {
|
||||
title = getString(R.string.conversationsDelete)
|
||||
message = Phrase.from(this.applicationContext, R.string.conversationsDeleteDescription)
|
||||
.put(NAME_KEY, recipient.name)
|
||||
.put(NAME_KEY, recipient.toShortString())
|
||||
.format()
|
||||
}
|
||||
else {
|
||||
|
@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.home.search
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.channels.BufferOverflow
|
||||
@ -13,11 +14,13 @@ import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.buffer
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.mapLatest
|
||||
import kotlinx.coroutines.flow.merge
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.plus
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.thoughtcrime.securesms.search.SearchRepository
|
||||
import org.thoughtcrime.securesms.search.model.SearchResult
|
||||
import javax.inject.Inject
|
||||
@ -38,9 +41,14 @@ class GlobalSearchViewModel @Inject constructor(
|
||||
.buffer(onBufferOverflow = BufferOverflow.DROP_OLDEST)
|
||||
.mapLatest { query ->
|
||||
if (query.trim().isEmpty()) {
|
||||
// searching for 05 as contactDb#getAllContacts was not returning contacts
|
||||
// without a nickname/name who haven't approved us.
|
||||
GlobalSearchResult(query.toString(), searchRepository.queryContacts("05").first.toList())
|
||||
withContext(Dispatchers.Default) {
|
||||
// searching for 05 as contactDb#getAllContacts was not returning contacts
|
||||
// without a nickname/name who haven't approved us.
|
||||
GlobalSearchResult(
|
||||
query.toString(),
|
||||
searchRepository.queryContacts("05").first.toList()
|
||||
)
|
||||
}
|
||||
} else {
|
||||
// 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.
|
||||
|
@ -231,8 +231,8 @@ private fun SaveAttachmentWarningDialog(
|
||||
title = context.getString(R.string.warning),
|
||||
text = context.resources.getString(R.string.attachmentsWarning),
|
||||
buttons = listOf(
|
||||
DialogButtonModel(GetString(R.string.save), GetString(R.string.AccessibilityId_saveAttachment), color = LocalColors.current.danger, onClick = onAccepted),
|
||||
DialogButtonModel(GetString(android.R.string.cancel), GetString(R.string.AccessibilityId_cancel), dismissOnClick = true)
|
||||
DialogButtonModel(GetString(R.string.save), color = LocalColors.current.danger, onClick = onAccepted),
|
||||
DialogButtonModel(GetString(android.R.string.cancel), dismissOnClick = true)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
@ -87,7 +87,7 @@ class MessageRequestsActivity : PassphraseRequiredActionBarActivity(), Conversat
|
||||
showSessionDialog {
|
||||
title(R.string.block)
|
||||
text(Phrase.from(context, R.string.blockDescription)
|
||||
.put(NAME_KEY, thread.recipient.name)
|
||||
.put(NAME_KEY, thread.recipient.toShortString())
|
||||
.format())
|
||||
dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) {
|
||||
doBlock()
|
||||
|
@ -85,12 +85,10 @@ internal fun LandingScreen(
|
||||
buttons = listOf(
|
||||
DialogButtonModel(
|
||||
text = GetString(R.string.onboardingTos),
|
||||
contentDescription = GetString(R.string.AccessibilityId_onboardingTos),
|
||||
onClick = openTerms
|
||||
),
|
||||
DialogButtonModel(
|
||||
text = GetString(R.string.onboardingPrivacy),
|
||||
contentDescription = GetString(R.string.AccessibilityId_onboardingPrivacy),
|
||||
onClick = openPrivacyPolicy
|
||||
)
|
||||
)
|
||||
|
@ -573,13 +573,11 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
|
||||
buttons = listOf(
|
||||
DialogButtonModel(
|
||||
text = GetString(R.string.save),
|
||||
contentDescription = GetString(R.string.AccessibilityId_save),
|
||||
enabled = state is TempAvatar,
|
||||
onClick = saveAvatar
|
||||
),
|
||||
DialogButtonModel(
|
||||
text = GetString(R.string.remove),
|
||||
contentDescription = GetString(R.string.AccessibilityId_remove),
|
||||
color = LocalColors.current.danger,
|
||||
enabled = state is UserAvatar || // can remove is the user has an avatar set
|
||||
(state is TempAvatar && state.hasAvatar),
|
||||
|
@ -26,7 +26,10 @@ import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.unit.dp
|
||||
import network.loki.messenger.R
|
||||
import org.thoughtcrime.securesms.ui.AlertDialog
|
||||
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.components.QrImage
|
||||
import org.thoughtcrime.securesms.ui.components.SlimOutlineButton
|
||||
@ -45,8 +48,8 @@ import org.thoughtcrime.securesms.ui.theme.monospace
|
||||
internal fun RecoveryPasswordScreen(
|
||||
mnemonic: String,
|
||||
seed: String? = null,
|
||||
copyMnemonic:() -> Unit = {},
|
||||
onHide:() -> Unit = {}
|
||||
confirmHideRecovery: () -> Unit,
|
||||
copyMnemonic:() -> Unit = {}
|
||||
) {
|
||||
Column(
|
||||
verticalArrangement = Arrangement.spacedBy(LocalDimensions.current.smallSpacing),
|
||||
@ -57,7 +60,7 @@ internal fun RecoveryPasswordScreen(
|
||||
.padding(horizontal = LocalDimensions.current.spacing)
|
||||
) {
|
||||
RecoveryPasswordCell(mnemonic, seed, copyMnemonic)
|
||||
HideRecoveryPasswordCell(onHide)
|
||||
HideRecoveryPasswordCell(confirmHideRecovery = confirmHideRecovery)
|
||||
}
|
||||
}
|
||||
|
||||
@ -151,7 +154,12 @@ private fun RecoveryPassword(mnemonic: String) {
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun HideRecoveryPasswordCell(onHide: () -> Unit = {}) {
|
||||
private fun HideRecoveryPasswordCell(
|
||||
confirmHideRecovery:() -> Unit
|
||||
) {
|
||||
var showHideRecoveryDialog by remember { mutableStateOf(false) }
|
||||
var showHideRecoveryConfirmationDialog by remember { mutableStateOf(false) }
|
||||
|
||||
Cell {
|
||||
Row(
|
||||
modifier = Modifier.padding(LocalDimensions.current.smallSpacing)
|
||||
@ -176,10 +184,44 @@ private fun HideRecoveryPasswordCell(onHide: () -> Unit = {}) {
|
||||
.align(Alignment.CenterVertically)
|
||||
.contentDescription(R.string.AccessibilityId_recoveryPasswordHideRecoveryPassword),
|
||||
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
|
||||
@ -188,6 +230,9 @@ private fun PreviewRecoveryPasswordScreen(
|
||||
@PreviewParameter(SessionColorsParameterProvider::class) colors: ThemeColors
|
||||
) {
|
||||
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 = {}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -24,33 +24,12 @@ class RecoveryPasswordActivity : BaseActionBarActivity() {
|
||||
RecoveryPasswordScreen(
|
||||
mnemonic = mnemonic,
|
||||
seed = seed,
|
||||
copyMnemonic = viewModel::copyMnemonic,
|
||||
onHide = ::onHide
|
||||
confirmHideRecovery = {
|
||||
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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -55,7 +55,6 @@ import org.thoughtcrime.securesms.ui.theme.bold
|
||||
|
||||
class DialogButtonModel(
|
||||
val text: GetString,
|
||||
val contentDescription: GetString = text,
|
||||
val color: Color = Color.Unspecified,
|
||||
val dismissOnClick: Boolean = true,
|
||||
val enabled: Boolean = true,
|
||||
@ -130,6 +129,7 @@ fun AlertDialog(
|
||||
textAlign = TextAlign.Center,
|
||||
style = LocalType.current.h7,
|
||||
modifier = Modifier.padding(bottom = LocalDimensions.current.xxsSpacing)
|
||||
.qaTag(stringResource(R.string.AccessibilityId_modalTitle))
|
||||
)
|
||||
}
|
||||
text?.let {
|
||||
@ -152,6 +152,7 @@ fun AlertDialog(
|
||||
textAlign = TextAlign.Center,
|
||||
style = textStyle,
|
||||
modifier = textModifier
|
||||
.qaTag(stringResource(R.string.AccessibilityId_modalMessage))
|
||||
)
|
||||
}
|
||||
content()
|
||||
@ -163,7 +164,7 @@ fun AlertDialog(
|
||||
text = it.text(),
|
||||
modifier = Modifier
|
||||
.fillMaxHeight()
|
||||
.contentDescription(it.contentDescription())
|
||||
.qaTag(it.text.string())
|
||||
.weight(1f),
|
||||
color = it.color,
|
||||
enabled = it.enabled
|
||||
@ -201,13 +202,11 @@ fun OpenURLAlertDialog(
|
||||
buttons = listOf(
|
||||
DialogButtonModel(
|
||||
text = GetString(R.string.open),
|
||||
contentDescription = GetString(R.string.AccessibilityId_urlOpenBrowser),
|
||||
color = LocalColors.current.danger,
|
||||
onClick = { context.openUrl(url) }
|
||||
),
|
||||
DialogButtonModel(
|
||||
text = GetString(android.R.string.copyUrl),
|
||||
contentDescription = GetString(R.string.AccessibilityId_copy),
|
||||
onClick = {
|
||||
context.copyURLToClipboard(url)
|
||||
Toast.makeText(context, R.string.copied, Toast.LENGTH_SHORT).show()
|
||||
@ -297,7 +296,8 @@ fun LoadingDialog(
|
||||
title?.let {
|
||||
Text(
|
||||
it,
|
||||
modifier = Modifier.align(Alignment.CenterHorizontally),
|
||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||
.qaTag(stringResource(R.string.AccessibilityId_modalTitle)),
|
||||
style = LocalType.current.large
|
||||
)
|
||||
}
|
||||
@ -340,12 +340,10 @@ fun PreviewXCloseDialog() {
|
||||
buttons = listOf(
|
||||
DialogButtonModel(
|
||||
text = GetString(R.string.onboardingTos),
|
||||
contentDescription = GetString(R.string.AccessibilityId_onboardingTos),
|
||||
onClick = {}
|
||||
),
|
||||
DialogButtonModel(
|
||||
text = GetString(R.string.onboardingPrivacy),
|
||||
contentDescription = GetString(R.string.AccessibilityId_onboardingPrivacy),
|
||||
onClick = {}
|
||||
)
|
||||
),
|
||||
|
@ -128,6 +128,9 @@
|
||||
<string name="AccessibilityId_messageVoice">Voice message</string>
|
||||
<string name="AccessibilityId_deliveryIndicator">Delivered</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-->
|
||||
<string name="AccessibilityId_deleteMessageCancel">Cancel deletion</string>
|
||||
<string name="AccessibilityId_deleteMessageEveryone">Delete for everyone</string> <!-- ACL: Perhaps should be "AccessibilityId_clearMessagesForEveryone"? -->
|
||||
|
@ -17,6 +17,8 @@
|
||||
*/
|
||||
package org.session.libsession.utilities.recipients;
|
||||
|
||||
import static org.session.libsession.utilities.IdUtilKt.truncateIdForDisplay;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
|
@ -143,6 +143,7 @@
|
||||
<string name="callsInProgress">Zəng davam edir</string>
|
||||
<string name="callsIncoming">{name} sizə zəng edir</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="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>
|
||||
@ -202,6 +203,7 @@
|
||||
<string name="communityInvitation">İcma dəvəti</string>
|
||||
<string name="communityJoin">İcmaya qoşul</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="communityJoined">İcmaya qoşuldu</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="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="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="disappearingMessagesDisappearAfterRead">Oxunduqdan sonra yox olur</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="groupInviteSent">Dəvət göndərildi</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="groupInviteYouAndMoreNew"><b>Siz</b> və <b> digər {count} nəfər</b> qrupa qoşulmaq üçün dəvət edildiniz.</string>
|
||||
<string name="groupInviteYouAndOtherNew"><b>Siz</b> və <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="passwordSetDescription">Parolunuz təyin edildi. Lütfən, onu güvəndə saxlayın.</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="permissionsAutoUpdate">Avto-güncəlləmə</string>
|
||||
<string name="permissionsAutoUpdateDescription">Açı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="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>
|
||||
@ -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="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="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="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="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>
|
||||
|
@ -755,7 +755,7 @@
|
||||
<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="recoveryPasswordErrorTitle">Няправільны Recovery Password</string>
|
||||
<string name="recoveryPasswordExplanation">Для загрузкі вашага акаўнта ўвядзіце ваш Recovery Password.</string>
|
||||
<string name="recoveryPasswordExplanation">Для загрузкі вашага ўліковага запісу ўвядзіце Recovery Password.</string>
|
||||
<string name="recoveryPasswordHidePermanently">Схаваць Recovery Password назусім</string>
|
||||
<string name="recoveryPasswordHidePermanentlyDescription1">Без вашага Recovery password вы не зможаце загрузіць свой уліковы запіс на новыя прылады. \n\nМы настойліва рэкамендуем захаваць ваш Recovery password у надзейным і бяспечным месцы перад прадаўжэннем.</string>
|
||||
<string name="recoveryPasswordHidePermanentlyDescription2">Вы ўпэўненыя, што жадаеце пастаянна схаваць ваш канчатковы пароль аднаўлення на гэтай прыладзе? Гэта немагчыма адмяніць.</string>
|
||||
|
@ -653,7 +653,7 @@
|
||||
<string name="notificationsSystem">{message_count} nových zpráv v {conversation_count} konverzacích</string>
|
||||
<string name="notificationsVibrate">Vibrace</string>
|
||||
<string name="off">Vypnuto</string>
|
||||
<string name="okay">Okay</string>
|
||||
<string name="okay">OK</string>
|
||||
<string name="on">Zap.</string>
|
||||
<string name="onboardingAccountCreate">Vytvořit účet</string>
|
||||
<string name="onboardingAccountCreated">Účet vytvořen</string>
|
||||
@ -806,7 +806,7 @@
|
||||
<string name="sessionClearData">Vyčistit data</string>
|
||||
<string name="sessionConversations">Konverzace</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="sessionNotifications">Upozornění</string>
|
||||
<string name="sessionPermissions">Oprávnění</string>
|
||||
@ -816,7 +816,7 @@
|
||||
<string name="set">Nastavit</string>
|
||||
<string name="settingsRestartDescription">Pro použití nových nastavení musíte restartovat {app_name}.</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="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>
|
||||
|
@ -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="callsMissed">Verpasster Anruf</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="callsPermissionsRequiredDescription">Du kannst die Berechtigung für \"Sprach- und Videoanrufe\" in den Datenschutzeinstellungen aktivieren.</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="other">Daten konnten nicht von %1$d Serviceknoten gelöscht werden. Service Node IDs: %2$s.</item>
|
||||
</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="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>
|
||||
@ -243,7 +243,7 @@
|
||||
<string name="conversationsGroups">Gruppen</string>
|
||||
<string name="conversationsMessageTrimming">Nachrichtenkürzung</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="conversationsNone">Du hast noch keine Unterhaltungen</string>
|
||||
<string name="conversationsSendWithEnterKey">Mit Eingabetaste senden</string>
|
||||
@ -331,7 +331,7 @@
|
||||
<string name="disappearingMessagesTimer">Zeitraum</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="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="disappearingMessagesTypeRead">gelesen</string>
|
||||
<string name="disappearingMessagesTypeSent">gesendet</string>
|
||||
@ -478,7 +478,7 @@
|
||||
<string name="hideOthers">Andere ausblenden</string>
|
||||
<string name="image">Bild</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="invalidShortcut">Ungültige Verknüpfung</string>
|
||||
<string name="join">Beitreten</string>
|
||||
@ -540,7 +540,7 @@
|
||||
<string name="messageEmpty">Diese Nachricht ist leer.</string>
|
||||
<string name="messageErrorDelivery">Nachrichtenübermittlung gescheitert</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="messageInfo">Nachrichten-Info</string>
|
||||
<string name="messageMarkRead">Als gelesen markieren</string>
|
||||
@ -556,14 +556,14 @@
|
||||
<item quantity="other">Du hast %1$d neue Nachrichten.</item>
|
||||
</plurals>
|
||||
<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="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="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="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="messageRequestsCommunitiesDescription">Erlaube Nachrichtenanfragen von Community-Unterhaltungen.</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="screenSecurity">Bildschirmschutz</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="search">Suchen</string>
|
||||
<string name="searchContacts">Kontakte durchsuchen</string>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<string name="adminPromoteMoreDescription">क्या आप वाकई <b>{name}</b> और <b>{count} अन्य</b> को एडमिन के रूप में बढ़ावा देना चाहते हैं? एडमिन्स को हटाया नहीं जा सकता है।</string>
|
||||
<string name="adminPromoteToAdmin">एडमिन में पदोन्नत करें</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="adminPromotionFailedDescription">{name} को {group_name} में पदोन्नत करने में विफल</string>
|
||||
<string name="adminPromotionFailedDescriptionMultiple">{name} और {count} अन्य को {group_name} में पदोन्नत करने में विफल</string>
|
||||
@ -33,7 +33,7 @@
|
||||
<string name="adminRemoveFailed">{name} को एडमिन के रूप में हटाने में विफल।</string>
|
||||
<string name="adminRemoveFailedMultiple"><b>{name}</b> और <b>{count} अन्य</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="adminRemovedUserOther"><b>{name}</b> and <b>{other_name}</b> को व्यवस्थापक पद से हटा दिया गया |</string>
|
||||
<string name="adminSendingPromotion">एडमिन प्रमोशन भेजा जा रहा है</string>
|
||||
@ -295,7 +295,7 @@
|
||||
<string name="deleteMessageDevicesAll">सभी उपकरणों पर मिटाएँ</string>
|
||||
<string name="deleteMessageEveryone">सभी के लिए मिटायें |</string>
|
||||
<plurals name="deleteMessageFailed">
|
||||
<item quantity="one">संदेश को हटाने में विफल रहा</item>
|
||||
<item quantity="one">संदेश हटाने में विफल</item>
|
||||
<item quantity="other">संदेशों को हटाने में विफल रहा</item>
|
||||
</plurals>
|
||||
<string name="deleteMessagesConfirm">क्या आप वाकई इन संदेशों को मिटाना चाहते हैं?</string>
|
||||
@ -421,7 +421,7 @@
|
||||
<string name="groupMemberLeft"><b>{name}</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="groupMemberNew"><b>{name}</b> समूह में शामिल हो गए।</string>
|
||||
<string name="groupMemberNew"><b>{name}</b> समूह में शामिल के लिए आमंत्रित किया है।</string>
|
||||
<string name="groupMemberNewHistory"><b>{name}</b> को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।</string>
|
||||
<string name="groupMemberNewHistoryMultiple"><b>{name}</b> और <b>{count} अन्य</b> को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।</string>
|
||||
<string name="groupMemberNewHistoryTwo"><b>{name}</b> और <b>{other_name}</b> को समूह में शामिल होने के लिए आमंत्रित किया गया। चैट इतिहास साझा किया गया।</string>
|
||||
@ -527,7 +527,7 @@
|
||||
<string name="membersAddAccountIdOrOns">खाता आईडी या ONS जोड़ें</string>
|
||||
<string name="membersInvite">मित्रों को आमंत्रित करें</string>
|
||||
<plurals name="membersInviteSend">
|
||||
<item quantity="one">आमंत्रण सेंड करें</item>
|
||||
<item quantity="one">आमंत्रण भेजे</item>
|
||||
<item quantity="other">आमंत्रण सेंड करें</item>
|
||||
</plurals>
|
||||
<string name="membersInviteShareDescription">क्या आप <b>{name}</b> के साथ समूह संदेश इतिहास साझा करना चाहेंगे?</string>
|
||||
@ -684,7 +684,7 @@
|
||||
<string name="permissionsCameraDenied">{app_name} को फ़ोटो और वीडियो लेने के लिए कैमरा अनुमति की आवश्यकता होती है, लेकिन इसे स्थायी रूप से मना कर दिया गया है। सेटिंग्स → अनुमतियां पर टैप करें और \"कैमरा\" चालू करें।</string>
|
||||
<string name="permissionsFaceId">{app_name} पर स्क्रीन लॉक फीचर Face ID का उपयोग करता है।</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="permissionsMicrophone">माइक्रोफ़ोन</string>
|
||||
<string name="permissionsMicrophoneAccessRequired">{app_name} को कॉल करने और ऑडियो संदेश भेजने के लिए माइक्रोफ़ोन अनुमति की आवश्यकता है, लेकिन इसे स्थायी रूप से मना कर दिया गया है। सेटिंग्स → अनुमतियां पर टैप करें, और \"माइक्रोफ़ोन\" चालू करें।</string>
|
||||
@ -812,7 +812,7 @@
|
||||
<string name="updateDownloaded">अपडेट इंस्टॉल हो गया, पुनः प्रारंभ करने के लिए क्लिक करें</string>
|
||||
<string name="updateDownloading">अपडेट डाउनलोड हो रहा है: {percent_loader}%</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="updateNewVersionDescription">{app_name} का एक नया संस्करण उपलब्ध है।</string>
|
||||
<string name="updateReleaseNotes">रिलीज़ नोट्स पे जाइए</string>
|
||||
|
@ -60,7 +60,7 @@
|
||||
<string name="attachment">Melléklet</string>
|
||||
<string name="attachmentsAdd">Melléklet hozzáadása</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="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>
|
||||
@ -563,7 +563,7 @@
|
||||
<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="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="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>
|
||||
|
@ -143,6 +143,7 @@
|
||||
<string name="callsInProgress">Chiamata in corso</string>
|
||||
<string name="callsIncoming">Chiamata in arrivo da {name}</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="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>
|
||||
@ -202,6 +203,7 @@
|
||||
<string name="communityInvitation">Invito a una Comunità</string>
|
||||
<string name="communityJoin">Unisciti alla Comunità</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="communityJoined">Sei entrato nella Comunità</string>
|
||||
<string name="communityJoinedAlready">Fai già parte di questa Comunità.</string>
|
||||
@ -407,6 +409,7 @@
|
||||
<string name="groupInviteSending">Invio invito</string>
|
||||
<string name="groupInviteSent">Invito inviato</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="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>
|
||||
|
@ -36,8 +36,9 @@
|
||||
<string name="adminRemovedUser"><b>{name}</b> はアドミンから削除されました</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="adminSendingPromotion">管理者への昇進を送信中</string>
|
||||
<string name="adminSendingPromotion">アドミンへの昇進を送信中</string>
|
||||
<string name="adminSettings">アドミン設定</string>
|
||||
<string name="adminTwoPromotedToAdmin"><b>{name}</b> と <b>{other_name}</b> がアドミンに昇格しました</string>
|
||||
<string name="andMore">+{count}</string>
|
||||
<string name="anonymous">匿名</string>
|
||||
<string name="appearanceAutoDarkMode">オートダークモード</string>
|
||||
@ -150,7 +151,7 @@
|
||||
<string name="callsPermissionsRequiredDescription">プライバシー設定で「音声とビデオ通話」の許可を有効にできます。</string>
|
||||
<string name="callsReconnecting">再接続しています...</string>
|
||||
<string name="callsRinging">呼び出し中...</string>
|
||||
<string name="callsSessionCall">{app_name} Call</string>
|
||||
<string name="callsSessionCall">{app_name} 電話</string>
|
||||
<string name="callsSettings">通話 (ベータ版)</string>
|
||||
<string name="callsVoiceAndVideo">音声とビデオ通話</string>
|
||||
<string name="callsVoiceAndVideoBeta">音声通話とビデオ通話 (ベータ版)</string>
|
||||
@ -236,7 +237,7 @@
|
||||
<string name="conversationsEmpty">{conversation_name} にはメッセージがありません。</string>
|
||||
<string name="conversationsEnter">キーを入力</string>
|
||||
<string name="conversationsEnterDescription">会話中のEnterキーの機能</string>
|
||||
<string name="conversationsEnterNewLine">SHIFT + ENTER 送信, ENTER 改行</string>
|
||||
<string name="conversationsEnterNewLine">シフト + エンター 送信、エンター 改行</string>
|
||||
<string name="conversationsEnterSends">エンターでメッセージを送信、シフト + エンターで改行を開始</string>
|
||||
<string name="conversationsGroups">グループ</string>
|
||||
<string name="conversationsMessageTrimming">メッセージの削減</string>
|
||||
@ -244,10 +245,11 @@
|
||||
<string name="conversationsMessageTrimmingTrimCommunitiesDescription">6ヶ月以上のコミュニティと2,000以上のメッセージがあるコミュニティからメッセージを削除します。</string>
|
||||
<string name="conversationsNew">新しい会話</string>
|
||||
<string name="conversationsNone">まだ通知はありません</string>
|
||||
<string name="conversationsSendWithEnterKey">Enter キーで送信</string>
|
||||
<string name="conversationsSendWithEnterKey">エンターキーで送信</string>
|
||||
<string name="conversationsSendWithEnterKeyDescription">Enterキーをタップすると、改行ではなく、メッセージが送信されます。</string>
|
||||
<string name="conversationsSettingsAllMedia">すべてのメディア</string>
|
||||
<string name="conversationsSpellCheck">スペルチェック</string>
|
||||
<string name="conversationsSpellCheckDescription">メッセージを入力するときにスペルチェックを有効にします</string>
|
||||
<string name="conversationsStart">会話を開始する</string>
|
||||
<string name="copied">コピーしました</string>
|
||||
<string name="copy">コピーする</string>
|
||||
@ -316,8 +318,9 @@
|
||||
<string name="disappearingMessagesDisappearAfterSendState">送信後に消えます - {time}</string>
|
||||
<string name="disappearingMessagesFollowSetting">設定をフォロー</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="disappearingMessagesOnlyAdmins">この設定はグループアドミンのみ変更可能です</string>
|
||||
<string name="disappearingMessagesSent">送信済み</string>
|
||||
<string name="disappearingMessagesSet"><b>{name}</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="disappearingMessagesTurnedOffYouGroup"><b>あなた</b> は消えているメッセージを <b>オフ</b>にしました。</string>
|
||||
<string name="disappearingMessagesTypeRead">既読</string>
|
||||
<string name="disappearingMessagesTypeSent">送信</string>
|
||||
<string name="disappearingMessagesTypeSent">送信済み</string>
|
||||
<string name="disappearingMessagesUpdated"><b>{admin_name}</b>が消えるメッセージの設定を更新しました</string>
|
||||
<string name="disappearingMessagesUpdatedYou"><b>You</b> は消えるメッセージの設定を更新しました</string>
|
||||
<string name="dismiss">キャンセル</string>
|
||||
@ -338,7 +341,7 @@
|
||||
<string name="displayNameErrorNew">表示名を読み込めませんでした。続行するには新しい表示名を入力してください。</string>
|
||||
<string name="displayNameNew">新しい表示名を選択してください</string>
|
||||
<string name="displayNamePick">表示名を選択してください</string>
|
||||
<string name="displayNameSet">表示名を設定</string>
|
||||
<string name="displayNameSet">表示名をセット</string>
|
||||
<string name="document">ドキュメント</string>
|
||||
<string name="done">完了</string>
|
||||
<string name="download">ダウンロード</string>
|
||||
@ -351,11 +354,15 @@
|
||||
<string name="emojiCategoryFlags">フラグ</string>
|
||||
<string name="emojiCategoryFood">食べ物・飲み物</string>
|
||||
<string name="emojiCategoryObjects">オブジェクト</string>
|
||||
<string name="emojiCategorySmileys">スマイル &amp; 人</string>
|
||||
<string name="emojiCategoryRecentlyUsed">最近使用</string>
|
||||
<string name="emojiCategorySmileys">スマイリーと人</string>
|
||||
<string name="emojiCategorySymbols">記号</string>
|
||||
<string name="emojiCategoryTravel">旅行&場所</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="emojiReactsHoverNameTwoDesktop">{name}と{other_name}が{emoji_name}でリアクションしました</string>
|
||||
<string name="emojiReactsHoverTwoNameMultipleDesktop">{name}と<span>{count}その他</span>が{emoji_name}で反応しました</string>
|
||||
@ -388,7 +395,7 @@
|
||||
<string name="groupError">グループエラー</string>
|
||||
<string name="groupErrorCreate">グループの作成に失敗しました。インターネット接続を確認して、もう一度やり直してください。</string>
|
||||
<string name="groupErrorJoin">{group_name} への参加に失敗しました</string>
|
||||
<string name="groupInformationSet">Set Group Information</string>
|
||||
<string name="groupInformationSet">グループの詳細をセット</string>
|
||||
<string name="groupInviteDelete">本当にこのグループ招待を削除しますか?</string>
|
||||
<string name="groupInviteFailed">招待に失敗しました</string>
|
||||
<string name="groupInviteFailedMultiple">{name} と他 {count} 人を {group_name} に招待できませんでした</string>
|
||||
@ -446,13 +453,13 @@
|
||||
<string name="groupRemovedYou"><b>{group_name}</b>から削除されました。</string>
|
||||
<string name="groupRemovedYouMultiple"><b>あなた</b> と <b>{count}名</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="groupUpdated">グループが更新されました</string>
|
||||
<string name="helpFAQ">よくある質問</string>
|
||||
<string name="helpHelpUsTranslateSession">{app_name}の翻訳にご協力ください</string>
|
||||
<string name="helpReportABug">バグを報告</string>
|
||||
<string name="helpReportABugDescription">詳細を共有して、私たちが問題を解決するのを手伝ってください。ログをエクスポートし、{app_name}のヘルプデスクを通じてファイルをアップロードしてください。</string>
|
||||
<string name="helpReportABugDescription">詳細を共有して問題解決にご協力ください。ログをエクスポートして、{app_name}のヘルプデスクからファイルをアップロードしてください</string>
|
||||
<string name="helpReportABugExportLogs">ログのエクスポート</string>
|
||||
<string name="helpReportABugExportLogsDescription">ログをエクスポートし、{app_name} のヘルプデスクにてファイルをアップロードします。</string>
|
||||
<string name="helpReportABugExportLogsSaveToDesktop">デスクトップに保存</string>
|
||||
@ -479,12 +486,12 @@
|
||||
<string name="legacyGroupMemberTwoNew"><b>{name}</b> と <b>{other_name}</b> がグループに加わりました</string>
|
||||
<string name="legacyGroupMemberYouNew"><b>あなた</b>がグループに加わりました</string>
|
||||
<string name="linkPreviews">リンクプレビュー</string>
|
||||
<string name="linkPreviewsDescription">サポートされている URL のリンクプレビューを表示します。</string>
|
||||
<string name="linkPreviewsDescription">サポートされている URL のリンクプレビューを表示します</string>
|
||||
<string name="linkPreviewsEnable">リンクプレビューを有効にする</string>
|
||||
<string name="linkPreviewsErrorLoad">リンクプレビューを読み込めません</string>
|
||||
<string name="linkPreviewsErrorUnsecure">セキュアでないリンクのプレビューは読み込めません</string>
|
||||
<string name="linkPreviewsFirstDescription">送受信する URL のプレビューを表示します。これは便利ですが、{app_name} はプレビューを生成するためにリンクされた サイトにアクセスする必要があります。 {app_name} の設定でいつでもリンクのプレビューをオフにできます。</string>
|
||||
<string name="linkPreviewsSend">リンクプレビューを送る</string>
|
||||
<string name="linkPreviewsSend">リンクプレビューを表示</string>
|
||||
<string name="linkPreviewsSendModalDescription">リンクのプレビューを送信するとき、完全なメタデータ保護はありません。</string>
|
||||
<string name="linkPreviewsTurnedOff">リンクプレビューが無効です</string>
|
||||
<string name="linkPreviewsTurnedOffDescription">{app_name}は、送受信するリンクのプレビューを生成するためにリンクされたウェブサイトに接続する必要があります。\n\n{app_name}の設定でプレビューをオンにできます。</string>
|
||||
@ -516,8 +523,8 @@
|
||||
<string name="membersInviteShareDescription"><b>{name}</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="membersInviteShareMessageHistory">Share message history</string>
|
||||
<string name="membersInviteShareNewMessagesOnly">Share new messages only</string>
|
||||
<string name="membersInviteShareMessageHistory">メッセージ履歴を共有</string>
|
||||
<string name="membersInviteShareNewMessagesOnly">新しいメッセージのみを共有</string>
|
||||
<string name="membersInviteTitle">招待</string>
|
||||
<string name="message">メッセージ</string>
|
||||
<string name="messageEmpty">このメッセージは空です。</string>
|
||||
@ -542,7 +549,7 @@
|
||||
<string name="messageRequestPending">メッセージ・リクエストは現在承認待ちです。</string>
|
||||
<string name="messageRequestPendingDescription">受信者がこのメッセージリクエストを承認すると、音声メッセージと添付ファイルを送信できます.</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="messageRequestsClearAllExplanation">本当に全てのメッセージリクエストとグループ招待を消去しますか?</string>
|
||||
<string name="messageRequestsCommunities">コミュニティメッセージリクエスト</string>
|
||||
@ -568,7 +575,7 @@
|
||||
<string name="nicknameDescription"><b>{name}</b>のニックネームを選んでください。これが1対1およびグループ会話で表示されます。</string>
|
||||
<string name="nicknameEnter">ニックネームを入力してください</string>
|
||||
<string name="nicknameRemove">ニックネームを削除</string>
|
||||
<string name="nicknameSet">Set Nickname</string>
|
||||
<string name="nicknameSet">ニックネームをセット</string>
|
||||
<string name="no">いいえ</string>
|
||||
<string name="noSuggestions">候補はありません</string>
|
||||
<string name="none">なし</string>
|
||||
@ -594,6 +601,7 @@
|
||||
<string name="notificationsIosRestart">{device}の再起動中にメッセージが届いたかもしれません</string>
|
||||
<string name="notificationsLedColor">LED色</string>
|
||||
<string name="notificationsMentionsOnly">メンションのみ</string>
|
||||
<string name="notificationsMessage">メッセージ通知</string>
|
||||
<string name="notificationsMostRecent">最新の受信: {name}</string>
|
||||
<string name="notificationsMute">ミュート</string>
|
||||
<string name="notificationsMuteFor">{time_large}間ミュート</string>
|
||||
@ -630,7 +638,7 @@
|
||||
<string name="onionRoutingPathDescription">{app_name}は、{app_name}の分散型ネットワークの複数のService Nodeを介してメッセージをバウンスすることにより、IPアドレスを隠します。これが現在の経路です:</string>
|
||||
<string name="onionRoutingPathDestination">目的先</string>
|
||||
<string name="onionRoutingPathEntryNode">エントリーノード</string>
|
||||
<string name="onionRoutingPathServiceNode">Service Node</string>
|
||||
<string name="onionRoutingPathServiceNode">サービスノード</string>
|
||||
<string name="onionRoutingPathUnknownCountry">国名が不明</string>
|
||||
<string name="onsErrorNotRecognized">このONSを認識できませんでした。内容を確認して再度お試しください。</string>
|
||||
<string name="onsErrorUnableToSearch">このONSを検索できませんでした。後でもう一度お試しください。</string>
|
||||
@ -642,6 +650,7 @@
|
||||
<string name="passwordConfirm">パスワードを再確認</string>
|
||||
<string name="passwordCreate">パスワードを作成してください</string>
|
||||
<string name="passwordCurrentIncorrect">現在のパスワードが間違っています。</string>
|
||||
<string name="passwordDescription">{app_name} のロックを解除するにはパスワードが必要です</string>
|
||||
<string name="passwordEnter">パスワードを入力してください</string>
|
||||
<string name="passwordEnterCurrent">現在のパスワードを入力してください</string>
|
||||
<string name="passwordEnterNew">新しいパスワードを入力してください</string>
|
||||
@ -653,7 +662,7 @@
|
||||
<string name="passwordRemove">パスワードを削除</string>
|
||||
<string name="passwordRemoveDescription">{app_name} のロックを解除するために必要なパスワードを削除します</string>
|
||||
<string name="passwordRemovedDescription">パスワードを削除しました。</string>
|
||||
<string name="passwordSet">パスワードを設定</string>
|
||||
<string name="passwordSet">パスワードをセット</string>
|
||||
<string name="passwordSetDescription">パスワードが設定されました。安全に保管してください。</string>
|
||||
<string name="paste">貼り付け</string>
|
||||
<string name="permissionMusicAudioDenied">{app_name} は、ファイル、音楽、およびオーディオを送信するために音楽およびオーディオアクセスが必要ですが、それが恒久的に拒否されています。設定に移動して、「権限」を選択し、「音楽およびオーディオ」を有効にしてください。</string>
|
||||
@ -685,20 +694,21 @@
|
||||
<string name="profile">プロフィール</string>
|
||||
<string name="profileDisplayPicture">ディスプレイの画像</string>
|
||||
<string name="profileDisplayPictureRemoveError">表示画像の削除に失敗しました。</string>
|
||||
<string name="profileDisplayPictureSet">ディスプレイの画像を設定</string>
|
||||
<string name="profileDisplayPictureSet">ディスプレイの画像をセット</string>
|
||||
<string name="profileDisplayPictureSizeError">小さいファイルを選んでください</string>
|
||||
<string name="profileErrorUpdate">プロフィールを更新できませんでした</string>
|
||||
<string name="promote">昇格</string>
|
||||
<string name="qrCode">QR コード</string>
|
||||
<string name="qrNotAccountId">このQRコードにはアカウントIDが含まれていません</string>
|
||||
<string name="qrNotRecoveryPassword">このQRコードにはリカバリーパスワードが含まれていません</string>
|
||||
<string name="qrScan">QRコードを読み取る</string>
|
||||
<string name="qrScan">QRコードをスキャン</string>
|
||||
<string name="qrView">QRコードを表示</string>
|
||||
<string name="qrYoursDescription">友達があなたのQRコードをスキャンすることでメッセージを送信できます</string>
|
||||
<string name="quit">{app_name} を終了</string>
|
||||
<string name="quitButton">終了</string>
|
||||
<string name="read">既読</string>
|
||||
<string name="readReceipts">既読通知</string>
|
||||
<string name="readReceiptsDescription">送信したすべてのメッセージに対する既読通知を表示します。</string>
|
||||
<string name="readReceiptsDescription">送信したすべてのメッセージに対する既読通知を表示します</string>
|
||||
<string name="received">受信:</string>
|
||||
<string name="recommended">オススメ</string>
|
||||
<string name="recoveryPasswordBannerDescription">リカバリーパスワードを保存して、アカウントにアクセスできなくならないようにしてください</string>
|
||||
@ -733,8 +743,8 @@
|
||||
<string name="savedMessages">保存済みのメッセージ</string>
|
||||
<string name="saving">保存中...</string>
|
||||
<string name="scan">スキャン</string>
|
||||
<string name="screenSecurity">スクリーン・セキュリティ</string>
|
||||
<string name="screenshotNotifications">スクリーンショット撮影時の通知</string>
|
||||
<string name="screenSecurity">スクリーンセキュリティ</string>
|
||||
<string name="screenshotNotifications">スクリーンショット通知</string>
|
||||
<string name="screenshotNotificationsDescription">連絡先が1対1チャットのスクリーンショットを撮ったときに通知を受け取ります</string>
|
||||
<string name="screenshotTaken"><b>{name}</b>はスクリーンショットを撮りました</string>
|
||||
<string name="search">検索</string>
|
||||
@ -768,12 +778,12 @@
|
||||
<string name="settingsRestartDescription">新しい設定を適用するために {app_name} を再起動する必要があります.</string>
|
||||
<string name="share">共有</string>
|
||||
<string name="shareAccountIdDescription">友達を{app_name} に招待して、チャットを始めましょう。アカウントIDを共有して招待できます。</string>
|
||||
<string name="shareAccountIdDescriptionCopied">いつもどこでも友達と共有してください — ここで会話を移動します。</string>
|
||||
<string name="shareAccountIdDescriptionCopied">いつでもどこでも友達と共有 — ここで会話を始めましょう</string>
|
||||
<string name="shareExtensionDatabaseError">データベースを開く際に問題が発生しました。アプリを再起動して再度お試しください。</string>
|
||||
<string name="shareToSession">{app_name}に共有</string>
|
||||
<string name="show">表示</string>
|
||||
<string name="showAll">すべて表示</string>
|
||||
<string name="showLess">最小化</string>
|
||||
<string name="showLess">少なく表示</string>
|
||||
<string name="stickers">ステッカー</string>
|
||||
<string name="supportGoTo">サポートページへ</string>
|
||||
<string name="systemInformationDesktop">システム情報: {information}</string>
|
||||
@ -782,7 +792,7 @@
|
||||
<string name="theError">エラー</string>
|
||||
<string name="tryAgain">再試行</string>
|
||||
<string name="typingIndicators">入力中アイコン</string>
|
||||
<string name="typingIndicatorsDescription">入力中アイコンを表示する</string>
|
||||
<string name="typingIndicatorsDescription">入力中アイコンを表示</string>
|
||||
<string name="undo">元に戻す</string>
|
||||
<string name="unknown">不明</string>
|
||||
<string name="updateApp">アプリ更新</string>
|
||||
|
@ -143,6 +143,7 @@
|
||||
<string name="callsInProgress">Bangê Bejeziyene</string>
|
||||
<string name="callsIncoming">Gerîna hatî ji {name}</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="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>
|
||||
@ -278,7 +279,7 @@
|
||||
<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>
|
||||
<plurals name="deleteMessage">
|
||||
<item quantity="one">Peyama Jê Bibe</item>
|
||||
<item quantity="one">Peyamê Jê Bibe</item>
|
||||
<item quantity="other">Peyaman Jê Bibe</item>
|
||||
</plurals>
|
||||
<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>
|
||||
<plurals name="deleteMessageFailed">
|
||||
<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>
|
||||
<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>
|
||||
@ -520,7 +521,7 @@
|
||||
<item quantity="other">%1$d endam</item>
|
||||
</plurals>
|
||||
<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>
|
||||
</plurals>
|
||||
<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="messageNewDescriptionMobile">Bi navê hesabê hevalê xwe Account ID, ONS an scanê QR code-yê têlepeqîne.</string>
|
||||
<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>
|
||||
</plurals>
|
||||
<string name="messageReplyingTo">Cewab didî</string>
|
||||
@ -763,7 +764,7 @@
|
||||
<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>
|
||||
<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>
|
||||
</plurals>
|
||||
<string name="searchMatchesNone">Encam peyda nebû</string>
|
||||
|
@ -397,6 +397,9 @@
|
||||
<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="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="groupMembers">Grupas dalībnieki</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="messageMarkRead">Atzīmēt kā izlasī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="messageNewDescriptionMobile">Sāc jaunu sarunu, ievadot drauga Konta ID, ONS vai skenējot viņu QR kodu.</string>
|
||||
<plurals name="messageNewYouveGot">
|
||||
|
@ -531,7 +531,7 @@
|
||||
<string name="max">Максимальный</string>
|
||||
<string name="media">Медиа</string>
|
||||
<plurals name="members">
|
||||
<item quantity="one">%1$d участник</item>
|
||||
<item quantity="one">%1$d Участник</item>
|
||||
<item quantity="few">%1$d участника</item>
|
||||
<item quantity="many">%1$d участников</item>
|
||||
<item quantity="other">%1$d участников</item>
|
||||
|
@ -143,6 +143,7 @@
|
||||
<string name="callsInProgress">Prebiehajúci hovor</string>
|
||||
<string name="callsIncoming">Prichádzajúci hovor od {name}</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="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>
|
||||
|
@ -463,9 +463,9 @@
|
||||
<string name="helpReportABugExportLogs">导出日志</string>
|
||||
<string name="helpReportABugExportLogsDescription">导出您的日志,然后通过{app_name}的帮助服务台上传日志。</string>
|
||||
<string name="helpReportABugExportLogsSaveToDesktop">保存到桌面</string>
|
||||
<string name="helpReportABugExportLogsSaveToDesktopDescription">将此文件保存到您的桌面,然后与{app_name}开发者分享。</string>
|
||||
<string name="helpReportABugExportLogsSaveToDesktopDescription">将此文件保存到您的桌面,然后与{app_name}开发者分享</string>
|
||||
<string name="helpSupport">支持</string>
|
||||
<string name="helpWedLoveYourFeedback">感谢您的反馈。</string>
|
||||
<string name="helpWedLoveYourFeedback">感谢您的反馈</string>
|
||||
<string name="hide">隐藏</string>
|
||||
<string name="hideMenuBarDescription">切换系统菜单栏可见性</string>
|
||||
<string name="hideOthers">隐藏其它</string>
|
||||
|
@ -19,7 +19,7 @@ chmod 600 ssh_key
|
||||
|
||||
# Define the output paths
|
||||
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
|
||||
if [ ! -d $build_path ]; then
|
||||
|
Loading…
x
Reference in New Issue
Block a user