Repo created

This commit is contained in:
Fr4nz D13trich 2025-11-22 13:56:56 +01:00
parent 75dc487a7a
commit 39c29d175b
6317 changed files with 388324 additions and 2 deletions

View file

@ -0,0 +1,28 @@
plugins {
id(ThunderbirdPlugins.Library.androidCompose)
alias(libs.plugins.kotlin.parcelize)
}
android {
// Using "importing" because "import" is not allowed in Java package names (it's fine with Kotlin, though)
namespace = "app.k9mail.feature.settings.importing"
resourcePrefix = "settings_import_"
}
dependencies {
implementation(projects.legacy.core)
implementation(projects.legacy.ui.base)
implementation(projects.core.ui.compose.designsystem)
implementation(projects.core.ui.legacy.designsystem)
implementation(projects.feature.migration.launcher.api)
implementation(projects.feature.account.oauth)
implementation(libs.appauth)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.fragment.compose)
implementation(libs.androidx.constraintlayout)
implementation(libs.fastadapter)
testImplementation(projects.core.logging.testing)
}

View file

@ -0,0 +1,19 @@
{
"data": [
{
"name": "Personal",
"email": "user@domain.example",
"color": "#FF1976D2"
},
{
"name": "Work",
"email": "firstname.lastname@work.example",
"color": "#FFE91E63"
},
{
"name": "Club",
"email": "name@sportsclub.example",
"color": "#FFFFB300"
}
]
}

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<queries>
<!-- Required to be able to access the SettingsProvider of another app -->
<package android:name="com.fsck.k9"/>
<package android:name="net.thunderbird.android"/>
<package android:name="net.thunderbird.android.beta"/>
<package android:name="net.thunderbird.android.daily"/>
</queries>
<application>
<activity
android:name="app.k9mail.feature.settings.import.ui.OAuthFlowActivity"
android:label="@string/settings_import_oauth_sign_in"
/>
<!-- We remove this activity entry to avoid all modules depending on this one having to define an override for
the manifest placeholder 'appAuthRedirectScheme'. The entry is added back in :app:common -->
<activity
android:name="net.openid.appauth.RedirectUriReceiverActivity"
tools:node="remove"
/>
</application>
</manifest>

View file

@ -0,0 +1,12 @@
package app.k9mail.feature.settings.import
interface SettingsImportExternalContract {
/**
* Activate account after server password(s) have been provided on settings import.
*/
interface AccountActivator {
fun enableAccount(accountUuid: String, incomingServerPassword: String?, outgoingServerPassword: String?)
fun enableAccount(accountUuid: String)
}
}

View file

@ -0,0 +1,32 @@
package app.k9mail.feature.settings.import
import app.k9mail.feature.settings.import.ui.AuthViewModel
import app.k9mail.feature.settings.import.ui.ImportAppFetcher
import app.k9mail.feature.settings.import.ui.PickAppViewModel
import app.k9mail.feature.settings.import.ui.SettingsImportViewModel
import org.koin.core.module.dsl.viewModel
import org.koin.dsl.module
val featureSettingsImportModule = module {
factory { ImportAppFetcher(context = get()) }
viewModel {
SettingsImportViewModel(
contentResolver = get(),
settingsImporter = get(),
accountActivator = get(),
migrationManager = get(),
importAppFetcher = get(),
)
}
viewModel {
AuthViewModel(
application = get(),
accountManager = get(),
getOAuthRequestIntent = get(),
)
}
viewModel { PickAppViewModel(importAppFetcher = get()) }
}

View file

@ -0,0 +1,231 @@
package app.k9mail.feature.settings.import.ui
import android.app.Activity
import android.app.Application
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.ActivityResultRegistry
import androidx.activity.result.contract.ActivityResultContract
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.viewModelScope
import app.k9mail.feature.account.oauth.domain.AccountOAuthDomainContract.UseCase.GetOAuthRequestIntent
import app.k9mail.feature.account.oauth.domain.entity.AuthorizationIntentResult
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import net.openid.appauth.AuthState
import net.openid.appauth.AuthorizationException
import net.openid.appauth.AuthorizationResponse
import net.openid.appauth.AuthorizationService
import net.thunderbird.core.android.account.AccountManager
import net.thunderbird.core.android.account.LegacyAccount
import net.thunderbird.core.logging.legacy.Log
private const val KEY_AUTHORIZATION = "app.k9mail_auth"
@Suppress("TooManyFunctions")
internal class AuthViewModel(
application: Application,
private val accountManager: AccountManager,
private val getOAuthRequestIntent: GetOAuthRequestIntent,
) : AndroidViewModel(application) {
private var authService: AuthorizationService? = null
private val authState = AuthState()
private var account: LegacyAccount? = null
private lateinit var resultObserver: AppAuthResultObserver
private val _uiState = MutableStateFlow<AuthFlowState>(AuthFlowState.Idle)
val uiState: StateFlow<AuthFlowState> = _uiState.asStateFlow()
@Synchronized
private fun getAuthService(): AuthorizationService {
return authService ?: AuthorizationService(getApplication<Application>()).also { authService = it }
}
fun init(activityResultRegistry: ActivityResultRegistry, lifecycle: Lifecycle, account: LegacyAccount) {
this.account = account
resultObserver = AppAuthResultObserver(activityResultRegistry)
lifecycle.addObserver(resultObserver)
}
fun authResultConsumed() {
_uiState.update { AuthFlowState.Idle }
}
fun isAuthorized(account: LegacyAccount): Boolean {
val authState = getOrCreateAuthState(account)
return authState.isAuthorized
}
fun isUsingGoogle(account: LegacyAccount): Boolean {
return GoogleOAuthHelper.isGoogle(account.incomingServerSettings.host!!)
}
private fun getOrCreateAuthState(account: LegacyAccount): AuthState {
return try {
account.oAuthState?.let { AuthState.jsonDeserialize(it) } ?: AuthState()
} catch (e: Exception) {
Log.e(e, "Error deserializing AuthState")
AuthState()
}
}
fun login() {
val account = checkNotNull(account)
viewModelScope.launch {
try {
startLogin(account)
} catch (e: ActivityNotFoundException) {
_uiState.update { AuthFlowState.BrowserNotFound }
}
}
}
private suspend fun startLogin(account: LegacyAccount) {
val authRequestIntentResult = withContext(Dispatchers.IO) {
getOAuthRequestIntent.execute(account.incomingServerSettings.host!!, account.email)
}
when (authRequestIntentResult) {
AuthorizationIntentResult.NotSupported -> {
_uiState.update { AuthFlowState.NotSupported }
}
is AuthorizationIntentResult.Success -> resultObserver.login(authRequestIntentResult.intent)
}
}
private fun onLoginResult(authorizationResult: AuthorizationResult?) {
if (authorizationResult == null) {
_uiState.update { AuthFlowState.Canceled }
return
}
authorizationResult.response?.let { response ->
authState.update(authorizationResult.response, authorizationResult.exception)
exchangeToken(response)
}
authorizationResult.exception?.let { authorizationException ->
_uiState.update {
AuthFlowState.Failed(
errorCode = authorizationException.error,
errorMessage = authorizationException.errorDescription,
)
}
}
}
private fun exchangeToken(response: AuthorizationResponse) {
viewModelScope.launch(Dispatchers.IO) {
val authService = getAuthService()
val tokenRequest = response.createTokenExchangeRequest()
authService.performTokenRequest(tokenRequest) { tokenResponse, authorizationException ->
authState.update(tokenResponse, authorizationException)
val account = account!!
account.oAuthState = authState.jsonSerializeString()
viewModelScope.launch(Dispatchers.IO) {
accountManager.saveAccount(account)
}
if (authorizationException != null) {
_uiState.update {
AuthFlowState.Failed(
errorCode = authorizationException.error,
errorMessage = authorizationException.errorDescription,
)
}
} else {
_uiState.update { AuthFlowState.Success }
}
}
}
}
@Synchronized
override fun onCleared() {
authService?.dispose()
authService = null
}
inner class AppAuthResultObserver(private val registry: ActivityResultRegistry) : DefaultLifecycleObserver {
private var authorizationLauncher: ActivityResultLauncher<Intent>? = null
private var authRequestIntent: Intent? = null
override fun onCreate(owner: LifecycleOwner) {
authorizationLauncher = registry.register(KEY_AUTHORIZATION, AuthorizationContract(), ::onLoginResult)
authRequestIntent?.let { intent ->
authRequestIntent = null
login(intent)
}
}
override fun onDestroy(owner: LifecycleOwner) {
authorizationLauncher = null
}
fun login(authRequestIntent: Intent) {
val launcher = authorizationLauncher
if (launcher != null) {
launcher.launch(authRequestIntent)
} else {
this.authRequestIntent = authRequestIntent
}
}
}
}
private class AuthorizationContract : ActivityResultContract<Intent, AuthorizationResult?>() {
override fun createIntent(context: Context, input: Intent): Intent {
return input
}
override fun parseResult(resultCode: Int, intent: Intent?): AuthorizationResult? {
return if (resultCode == Activity.RESULT_OK && intent != null) {
AuthorizationResult(
response = AuthorizationResponse.fromIntent(intent),
exception = AuthorizationException.fromIntent(intent),
)
} else {
null
}
}
}
private data class AuthorizationResult(
val response: AuthorizationResponse?,
val exception: AuthorizationException?,
)
sealed interface AuthFlowState {
object Idle : AuthFlowState
object Success : AuthFlowState
object NotSupported : AuthFlowState
object BrowserNotFound : AuthFlowState
object Canceled : AuthFlowState
data class Failed(val errorCode: String?, val errorMessage: String?) : AuthFlowState {
override fun toString(): String {
return listOfNotNull(errorCode, errorMessage).joinToString(separator = " - ")
}
}
}

View file

@ -0,0 +1,9 @@
package app.k9mail.feature.settings.import.ui
@Deprecated("Could be removed when import uses the new oauth flow")
internal object GoogleOAuthHelper {
fun isGoogle(hostname: String): Boolean {
return hostname.lowercase().endsWith(".gmail.com") ||
hostname.lowercase().endsWith(".googlemail.com")
}
}

View file

@ -0,0 +1,86 @@
package app.k9mail.feature.settings.import.ui
import android.content.Context
import android.content.pm.PackageManager
import androidx.annotation.WorkerThread
internal class ImportAppFetcher(
private val context: Context,
) {
private val packageManager by lazy { context.packageManager }
/**
* Returns `true` if at least one app is installed from which we can import settings.
*/
@WorkerThread
fun isAtLeastOneAppInstalled(): Boolean {
return supportedApps.any { app -> packageManager.isAppInstalled(app.packageName) }
}
@Suppress("SwallowedException")
private fun PackageManager.isAppInstalled(packageName: String): Boolean {
return try {
getApplicationInfo(packageName, 0)
true
} catch (e: PackageManager.NameNotFoundException) {
false
}
}
/**
* Get list of apps from which we can import settings.
*/
@WorkerThread
fun getAppInfoList(): List<AppInfo> {
return supportedApps
.mapNotNull { app -> packageManager.loadAppInfo(app) }
.toList()
}
@Suppress("SwallowedException")
private fun PackageManager.loadAppInfo(app: AppVersion): AppInfo? {
return try {
val packageInfo = getPackageInfo(app.packageName, 0)
val isImportSupported = packageInfo.versionCode >= app.minVersionCode
val applicationInfo = getApplicationInfo(app.packageName, 0)
val appName = packageManager.getApplicationLabel(applicationInfo).toString()
AppInfo(app.packageName, appName, isImportSupported)
} catch (e: PackageManager.NameNotFoundException) {
null
}
}
/**
* Get the list of application IDs of supported apps excluding our own app.
*/
private val supportedApps: Sequence<AppVersion>
get() {
val myPackageName = context.packageName
return SUPPORTED_APPS
.asSequence()
.filterNot { app -> app.packageName == myPackageName }
}
companion object {
private val SUPPORTED_APPS = listOf(
// K-9 Mail
AppVersion("com.fsck.k9", 39005),
// Thunderbird for Android (release)
AppVersion("net.thunderbird.android", 1),
// Thunderbird for Android (beta)
AppVersion("net.thunderbird.android.beta", 4),
// Thunderbird for Android (daily)
AppVersion("net.thunderbird.android.daily", 1),
)
}
}
private data class AppVersion(val packageName: String, val minVersionCode: Int)
internal data class AppInfo(
val packageName: String,
val appName: String,
val isImportSupported: Boolean,
)

View file

@ -0,0 +1,133 @@
package app.k9mail.feature.settings.import.ui
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.ProgressBar
import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import app.k9mail.feature.settings.importing.R
import com.fsck.k9.ui.base.K9Activity
import com.google.android.material.textview.MaterialTextView
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.launch
import net.thunderbird.core.android.account.AccountManager
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
@Deprecated("Remove once import used the new oauth flow")
class OAuthFlowActivity : K9Activity() {
private val authViewModel: AuthViewModel by viewModel()
private val accountManager: AccountManager by inject()
private lateinit var errorText: MaterialTextView
private lateinit var signInButton: Button
private lateinit var signInProgress: ProgressBar
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setLayout(R.layout.account_setup_oauth)
setTitle(R.string.settings_import_oauth_sign_in)
val accountUUid = intent.getStringExtra(EXTRA_ACCOUNT_UUID) ?: error("Missing account UUID")
val account = accountManager.getAccount(accountUUid) ?: error("Account not found")
errorText = findViewById(R.id.error_text)
signInProgress = findViewById(R.id.sign_in_progress)
signInButton = if (authViewModel.isUsingGoogle(account)) {
findViewById(R.id.google_sign_in_button)
} else {
findViewById(R.id.oauth_sign_in_button)
}
signInButton.isVisible = true
signInButton.setOnClickListener { startOAuthFlow() }
savedInstanceState?.let {
val signInRunning = it.getBoolean(STATE_PROGRESS)
signInButton.isVisible = !signInRunning
signInProgress.isVisible = signInRunning
}
authViewModel.init(activityResultRegistry, lifecycle, account)
authViewModel.uiState.observe(this) { state ->
handleUiUpdates(state)
}
}
private fun handleUiUpdates(state: AuthFlowState) {
when (state) {
AuthFlowState.Idle -> {
return
}
AuthFlowState.Success -> {
setResult(RESULT_OK)
finish()
}
AuthFlowState.Canceled -> {
displayErrorText(R.string.settings_import_oauth_error_oauth_flow_canceled)
}
is AuthFlowState.Failed -> {
displayErrorText(R.string.settings_import_oauth_error_oauth_flow_failed, state)
}
AuthFlowState.NotSupported -> {
displayErrorText(R.string.settings_import_oauth_error_oauth_not_supported)
}
AuthFlowState.BrowserNotFound -> {
displayErrorText(R.string.settings_import_oauth_error_browser_not_found)
}
}
authViewModel.authResultConsumed()
}
private fun displayErrorText(errorTextResId: Int, vararg args: Any?) {
signInProgress.isVisible = false
signInButton.isVisible = true
errorText.text = getString(errorTextResId, *args)
}
private fun startOAuthFlow() {
signInButton.isVisible = false
signInProgress.isVisible = true
errorText.text = ""
authViewModel.login()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(STATE_PROGRESS, signInProgress.isVisible)
}
companion object {
private const val EXTRA_ACCOUNT_UUID = "accountUuid"
private const val STATE_PROGRESS = "signInProgress"
fun buildLaunchIntent(context: Context, accountUuid: String): Intent {
return Intent(context, OAuthFlowActivity::class.java).apply {
putExtra(EXTRA_ACCOUNT_UUID, accountUuid)
}
}
}
}
private fun <T> Flow<T>.observe(lifecycleOwner: LifecycleOwner, collector: FlowCollector<T>) {
lifecycleOwner.lifecycleScope.launch {
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
collect(collector)
}
}
}

View file

@ -0,0 +1,151 @@
package app.k9mail.feature.settings.import.ui
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.Group
import androidx.core.os.bundleOf
import androidx.core.view.isGone
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import app.k9mail.feature.settings.importing.R
import com.google.android.material.checkbox.MaterialCheckBox
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textview.MaterialTextView
import com.fsck.k9.ui.base.R as BaseR
class PasswordPromptDialogFragment : DialogFragment() {
private lateinit var accountUuid: String
private var inputOutgoingServerPassword: Boolean = false
private var inputIncomingServerPassword: Boolean = false
private lateinit var dialogView: View
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val arguments = this.arguments ?: error("Fragment arguments missing")
accountUuid = arguments.getString(ARG_ACCOUNT_UUID) ?: error("Missing account UUID")
val accountName = arguments.getString(ARG_ACCOUNT_NAME) ?: error("Missing account name")
val incomingServerName = arguments.getString(ARG_INCOMING_SERVER_NAME)
val outgoingServerName = arguments.getString(ARG_OUTGOING_SERVER_NAME)
inputIncomingServerPassword = arguments.getBoolean(ARG_INPUT_INCOMING_SERVER_PASSWORD)
inputOutgoingServerPassword = arguments.getBoolean(ARG_INPUT_OUTGOING_SERVER_PASSWORD)
if (!inputIncomingServerPassword && !inputOutgoingServerPassword) {
error("Not prompting for any password")
}
dialogView = createView(
accountName,
inputIncomingServerPassword,
incomingServerName,
inputOutgoingServerPassword,
outgoingServerName,
)
return MaterialAlertDialogBuilder(requireContext())
.setView(dialogView)
.setPositiveButton(BaseR.string.okay_action) { _, _ -> deliverPasswordPromptResult() }
.setNegativeButton(BaseR.string.cancel_action, null)
.create()
}
@SuppressLint("InflateParams")
private fun createView(
accountName: String,
inputIncomingServerPassword: Boolean,
incomingServerName: String?,
inputOutgoingServerPassword: Boolean,
outgoingServerName: String?,
): View {
val layoutInflater = LayoutInflater.from(requireContext())
val view = layoutInflater.inflate(R.layout.password_prompt_dialog, null)
val passwordPromptIntro: MaterialTextView = view.findViewById(R.id.passwordPromptIntro)
val incomingServerNameView: MaterialTextView = view.findViewById(R.id.incomingServerName)
val outgoingServerNameView: MaterialTextView = view.findViewById(R.id.outgoingServerName)
val useSamePasswordCheckbox: MaterialCheckBox = view.findViewById(R.id.useSamePasswordCheckbox)
val incomingServerGroup: Group = view.findViewById(R.id.incomingServerGroup)
val outgoingServerGroup: Group = view.findViewById(R.id.outgoingServerGroup)
val quantity = if (inputIncomingServerPassword && inputOutgoingServerPassword) 2 else 1
passwordPromptIntro.text = resources.getQuantityString(
R.plurals.settings_import_password_prompt,
quantity,
accountName,
)
incomingServerNameView.text = getString(R.string.settings_import_server_name_format, incomingServerName)
outgoingServerNameView.text = getString(R.string.settings_import_server_name_format, outgoingServerName)
incomingServerGroup.isGone = !inputIncomingServerPassword
outgoingServerGroup.isGone = !inputOutgoingServerPassword
if (inputIncomingServerPassword && inputOutgoingServerPassword) {
useSamePasswordCheckbox.isChecked = true
outgoingServerGroup.isGone = true
useSamePasswordCheckbox.setOnCheckedChangeListener { _, isChecked ->
outgoingServerGroup.isGone = isChecked
}
} else {
useSamePasswordCheckbox.isGone = true
}
return view
}
private fun deliverPasswordPromptResult() {
val incomingServerPasswordView: TextInputEditText = dialogView.findViewById(R.id.incomingServerPassword)
val outgoingServerPasswordView: TextInputEditText = dialogView.findViewById(R.id.outgoingServerPassword)
val useSamePasswordCheckbox: MaterialCheckBox = dialogView.findViewById(R.id.useSamePasswordCheckbox)
val incomingServerPassword = when {
!inputIncomingServerPassword -> null
else -> incomingServerPasswordView.text.toString()
}
val outgoingServerPassword = when {
!inputOutgoingServerPassword -> null
useSamePasswordCheckbox.isChecked -> incomingServerPassword
else -> outgoingServerPasswordView.text.toString()
}
val resultIntent = PasswordPromptResult(accountUuid, incomingServerPassword, outgoingServerPassword).asIntent()
targetFragment!!.onActivityResult(targetRequestCode, Activity.RESULT_OK, resultIntent)
}
companion object {
private const val ARG_ACCOUNT_UUID = "accountUuid"
private const val ARG_ACCOUNT_NAME = "accountName"
private const val ARG_INPUT_INCOMING_SERVER_PASSWORD = "inputIncomingServerPassword"
private const val ARG_INCOMING_SERVER_NAME = "incomingServerName"
private const val ARG_INPUT_OUTGOING_SERVER_PASSWORD = "inputOutgoingServerPassword"
private const val ARG_OUTGOING_SERVER_NAME = "outgoingServerName"
@Suppress("LongParameterList")
fun create(
accountUuid: String,
accountName: String,
inputIncomingServerPassword: Boolean,
incomingServerName: String?,
inputOutgoingServerPassword: Boolean,
outgoingServerName: String?,
targetFragment: Fragment,
requestCode: Int,
) = PasswordPromptDialogFragment().apply {
arguments = bundleOf(
ARG_ACCOUNT_UUID to accountUuid,
ARG_ACCOUNT_NAME to accountName,
ARG_INPUT_INCOMING_SERVER_PASSWORD to inputIncomingServerPassword,
ARG_INCOMING_SERVER_NAME to incomingServerName,
ARG_INPUT_OUTGOING_SERVER_PASSWORD to inputOutgoingServerPassword,
ARG_OUTGOING_SERVER_NAME to outgoingServerName,
)
setTargetFragment(targetFragment, requestCode)
}
}
}

View file

@ -0,0 +1,29 @@
package app.k9mail.feature.settings.import.ui
import android.content.Intent
internal data class PasswordPromptResult(
val accountUuid: String,
val incomingServerPassword: String?,
val outgoingServerPassword: String?,
) {
fun asIntent() = Intent().apply {
putExtra(EXTRA_ACCOUNT_UUID, accountUuid)
putExtra(EXTRA_INCOMING_SERVER_PASSWORD, incomingServerPassword)
putExtra(EXTRA_OUTGOING_SERVER_PASSWORD, outgoingServerPassword)
}
companion object {
private const val EXTRA_ACCOUNT_UUID = "accountUuid"
private const val EXTRA_INCOMING_SERVER_PASSWORD = "incomingServerPassword"
private const val EXTRA_OUTGOING_SERVER_PASSWORD = "outgoingServerPassword"
fun fromIntent(intent: Intent): PasswordPromptResult {
val accountUuid = intent.getStringExtra(EXTRA_ACCOUNT_UUID) ?: error("Missing account UUID")
val incomingServerPassword = intent.getStringExtra(EXTRA_INCOMING_SERVER_PASSWORD)
val outgoingServerPassword = intent.getStringExtra(EXTRA_OUTGOING_SERVER_PASSWORD)
return PasswordPromptResult(accountUuid, incomingServerPassword, outgoingServerPassword)
}
}
}

View file

@ -0,0 +1,41 @@
package app.k9mail.feature.settings.import.ui
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.TextView
import androidx.core.view.isVisible
import app.k9mail.feature.settings.importing.R
internal class PickAppAdapter(context: Context) : ArrayAdapter<AppInfo>(context, 0) {
private val inflater = LayoutInflater.from(context)
private fun getItemOrThrow(position: Int): AppInfo {
return getItem(position) ?: error("Item at position $position not found")
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = convertView ?: inflater.inflate(R.layout.settings_import_pick_app_list_item, parent, false)
val appNameTextView = view.findViewById<TextView>(R.id.settings_import_app_name)
val appNoteTextView = view.findViewById<View>(R.id.settings_import_app_note)
val item = getItemOrThrow(position)
appNameTextView.text = item.appName
appNoteTextView.isVisible = !item.isImportSupported
view.isEnabled = item.isImportSupported
return view
}
override fun areAllItemsEnabled(): Boolean {
return false
}
override fun isEnabled(position: Int): Boolean {
return getItemOrThrow(position).isImportSupported
}
}

View file

@ -0,0 +1,68 @@
package app.k9mail.feature.settings.import.ui
import android.app.Dialog
import android.content.DialogInterface
import android.content.DialogInterface.OnClickListener
import android.os.Bundle
import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.setFragmentResult
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import app.k9mail.feature.settings.importing.R
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.launch
import org.koin.androidx.viewmodel.ext.android.viewModel
import com.fsck.k9.ui.base.R as BaseR
/**
* A dialog that allows the user to pick an app from which to import settings/accounts.
*/
internal class PickAppDialogFragment : DialogFragment() {
private val viewModel: PickAppViewModel by viewModel()
private var selectedPackageName: String? = null
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val adapter = PickAppAdapter(requireContext())
viewModel.appInfoFlow.observe(this) { appInfoList ->
adapter.clear()
adapter.addAll(appInfoList)
adapter.notifyDataSetChanged()
}
val clickListener = OnClickListener { _, index ->
val packageName = adapter.getItem(index)?.packageName ?: return@OnClickListener
selectedPackageName = packageName
}
return MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.settings_import_pick_app_dialog_title)
.setAdapter(adapter, clickListener)
.setNegativeButton(BaseR.string.cancel_action, null)
.create()
}
override fun onDismiss(dialog: DialogInterface) {
setFragmentResult(FRAGMENT_RESULT_KEY, bundleOf(FRAGMENT_RESULT_APP to selectedPackageName))
super.onDismiss(dialog)
}
companion object {
const val FRAGMENT_RESULT_KEY = "pickApp"
const val FRAGMENT_RESULT_APP = "packageName"
}
}
private fun <T> Flow<T>.observe(lifecycleOwner: LifecycleOwner, collector: FlowCollector<T>) {
lifecycleOwner.lifecycleScope.launch {
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
collect(collector)
}
}
}

View file

@ -0,0 +1,28 @@
package app.k9mail.feature.settings.import.ui
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
internal class PickAppViewModel(
private val importAppFetcher: ImportAppFetcher,
private val backgroundDispatcher: CoroutineDispatcher = Dispatchers.IO,
) : ViewModel() {
private val _appInfoFlow = MutableStateFlow<List<AppInfo>>(emptyList())
val appInfoFlow: StateFlow<List<AppInfo>> = _appInfoFlow
init {
fetchImportApps()
}
private fun fetchImportApps() {
viewModelScope.launch(backgroundDispatcher) {
val appInfoList = importAppFetcher.getAppInfoList()
_appInfoFlow.emit(appInfoList)
}
}
}

View file

@ -0,0 +1,25 @@
package app.k9mail.feature.settings.import.ui
import android.os.Bundle
import androidx.core.os.bundleOf
enum class SettingsImportAction(private val bundleValue: String) {
Overview("overview"),
ScanQrCode("scan_qr_code"),
;
fun toBundle(): Bundle {
return bundleOf(
BUNDLE_KEY_ACTION to bundleValue,
)
}
companion object {
const val BUNDLE_KEY_ACTION = "action"
fun fromBundle(bundle: Bundle): SettingsImportAction {
val actionString = bundle.getString(BUNDLE_KEY_ACTION)
return entries.find { it.bundleValue == actionString } ?: Overview
}
}
}

View file

@ -0,0 +1,317 @@
package app.k9mail.feature.settings.import.ui
import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.result.ActivityResultCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.os.bundleOf
import androidx.core.view.isGone
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.setFragmentResult
import androidx.fragment.app.setFragmentResultListener
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.RecyclerView
import app.k9mail.feature.migration.launcher.api.MigrationManager
import app.k9mail.feature.settings.importing.R
import com.fsck.k9.ui.base.livedata.observeNotNull
import com.google.android.material.button.MaterialButton
import com.google.android.material.textview.MaterialTextView
import com.mikepenz.fastadapter.FastAdapter
import com.mikepenz.fastadapter.adapters.ItemAdapter
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
import com.fsck.k9.ui.base.R as BaseR
class SettingsImportFragment : Fragment() {
private val viewModel: SettingsImportViewModel by viewModel()
private val migrationManager: MigrationManager by inject()
private lateinit var settingsImportAdapter: FastAdapter<ImportListItem<*>>
private lateinit var itemAdapter: ItemAdapter<ImportListItem<*>>
private val pickDocumentCallback = ActivityResultCallback<Uri?> { contentUri ->
if (contentUri != null) {
viewModel.onDocumentPicked(contentUri)
} else {
viewModel.onDocumentPickCanceled()
}
}
private val pickDocumentLauncher = registerForActivityResult(
ActivityResultContracts.GetContent(),
pickDocumentCallback,
)
private val qrCodeScannerLauncher = registerForActivityResult(
migrationManager.getQrCodeActivityResultContract(),
pickDocumentCallback,
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.initialize()
setFragmentResultListener(PickAppDialogFragment.FRAGMENT_RESULT_KEY) { _, result: Bundle ->
val packageName = result.getString(PickAppDialogFragment.FRAGMENT_RESULT_APP)
if (packageName != null) {
viewModel.onAppPicked(packageName)
} else {
viewModel.onAppPickCanceled()
}
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_settings_import, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
if (savedInstanceState != null) {
viewModel.initializeFromSavedState(savedInstanceState)
}
val viewHolder = ViewHolder(view)
initializeSettingsImportList(viewHolder.settingsImportList)
viewHolder.pickDocumentButton.setOnClickListener { viewModel.onPickDocumentButtonClicked() }
viewHolder.scanQrCodeButton.setOnClickListener { viewModel.onScanQrCodeButtonClicked() }
viewHolder.pickAppButton.setOnClickListener { viewModel.onPickAppButtonClicked() }
viewHolder.importButton.setOnClickListener { viewModel.onImportButtonClicked() }
viewHolder.closeButton.setOnClickListener { viewModel.onCloseButtonClicked() }
viewModel.getUiModel().observeNotNull(this) { viewHolder.updateUi(it) }
viewModel.getActionEvents().observeNotNull(this) { handleActionEvents(it) }
arguments?.let { arguments ->
val action = SettingsImportAction.fromBundle(arguments)
viewModel.setAction(action)
}
}
private fun initializeSettingsImportList(recyclerView: RecyclerView) {
itemAdapter = ItemAdapter()
settingsImportAdapter = FastAdapter.with(itemAdapter).apply {
setHasStableIds(true)
onClickListener = { _, _, _, position ->
viewModel.onSettingsListItemClicked(position)
true
}
addEventHook(
ImportListItemClickEvent { position ->
viewModel.onSettingsListItemClicked(position)
},
)
}
recyclerView.adapter = settingsImportAdapter
}
private fun ViewHolder.updateUi(model: SettingsImportUiModel) {
when (model.importButton) {
ButtonState.DISABLED -> {
importButton.isVisible = true
importButton.isEnabled = false
}
ButtonState.ENABLED -> {
importButton.isVisible = true
importButton.isEnabled = true
}
ButtonState.INVISIBLE -> importButton.isInvisible = true
ButtonState.GONE -> importButton.isGone = true
}
closeButton.isGone = model.closeButton == ButtonState.GONE
when (model.closeButtonLabel) {
CloseButtonLabel.OK -> closeButton.setText(BaseR.string.okay_action)
CloseButtonLabel.LATER -> closeButton.setText(R.string.settings_import_later_button)
}
settingsImportList.isVisible = model.isSettingsListVisible
pickDocumentButton.isInvisible = !model.isPickDocumentButtonVisible
pickDocumentButton.isEnabled = model.isPickDocumentButtonEnabled
scanQrCodeButton.isInvisible = !model.isScanQrCodeButtonVisible
scanQrCodeButton.isEnabled = model.isScanQrCodeButtonEnabled
pickAppButton.isInvisible = !model.isPickAppButtonVisible
pickAppButton.isEnabled = model.isPickAppButtonEnabled
loadingProgressBar.isVisible = model.isLoadingProgressVisible
importProgressBar.isVisible = model.isImportProgressVisible
statusText.isVisible = model.statusText != StatusText.HIDDEN
when (model.statusText) {
StatusText.IMPORTING_PROGRESS -> {
statusText.text = getString(R.string.settings_importing)
}
StatusText.IMPORT_SUCCESS -> {
statusText.text = getString(R.string.settings_import_success_generic)
}
StatusText.IMPORT_SUCCESS_PASSWORD_REQUIRED -> {
statusText.text = getString(R.string.settings_import_password_required)
}
StatusText.IMPORT_SUCCESS_AUTHORIZATION_REQUIRED -> {
statusText.text = getString(R.string.settings_import_authorization_required)
}
StatusText.IMPORT_SUCCESS_PASSWORD_AND_AUTHORIZATION_REQUIRED -> {
statusText.text = getString(R.string.settings_import_authorization_and_password_required)
}
StatusText.IMPORT_READ_FAILURE -> {
statusText.text = getString(R.string.settings_import_read_failure)
}
StatusText.IMPORT_PARTIAL_FAILURE -> {
statusText.text = getString(R.string.settings_import_partial_failure)
}
StatusText.IMPORT_FAILURE -> {
statusText.text = getString(R.string.settings_import_failure)
}
StatusText.HIDDEN -> statusText.text = null
}
setSettingsList(model.settingsList, model.isSettingsListEnabled)
}
// TODO: Update list instead of replacing it completely
private fun ViewHolder.setSettingsList(items: List<SettingsListItem>, enable: Boolean) {
val importListItems = items.map { item ->
val checkBoxItem = when (item) {
is SettingsListItem.GeneralSettings -> GeneralSettingsItem(item.importStatus)
is SettingsListItem.Account -> AccountItem(item)
}
checkBoxItem.apply {
isSelected = item.selected
isEnabled = item.enabled && enable
}
}
itemAdapter.set(importListItems)
settingsImportList.isEnabled = enable
}
private fun handleActionEvents(action: Action) {
when (action) {
is Action.Close -> closeImportScreen(action)
is Action.PickDocument -> pickDocument()
is Action.ScanQrCode -> scanQrCode()
is Action.PickApp -> pickApp()
is Action.PasswordPrompt -> showPasswordPrompt(action)
is Action.StartAuthorization -> startAuthorization(action)
}
}
@Suppress("SwallowedException")
private fun closeImportScreen(action: Action.Close) {
setFragmentResult(action.importSuccess)
try {
findNavController().popBackStack()
} catch (e: IllegalStateException) {
// Fragment does not have NavController
}
}
private fun pickDocument() {
pickDocumentLauncher.launch("*/*")
}
private fun scanQrCode() {
qrCodeScannerLauncher.launch(Unit)
}
private fun pickApp() {
PickAppDialogFragment().show(parentFragmentManager, "pick_app")
}
private fun startAuthorization(action: Action.StartAuthorization) {
val intent = OAuthFlowActivity.buildLaunchIntent(
context = requireContext(),
accountUuid = action.accountUuid,
)
startActivityForResult(intent, REQUEST_AUTHORIZATION)
}
private fun showPasswordPrompt(action: Action.PasswordPrompt) {
val dialogFragment = PasswordPromptDialogFragment.create(
action.accountUuid,
action.accountName,
action.inputIncomingServerPassword,
action.incomingServerName,
action.inputOutgoingServerPassword,
action.outgoingServerName,
targetFragment = this,
requestCode = REQUEST_PASSWORD_PROMPT,
)
dialogFragment.show(requireFragmentManager(), null)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
viewModel.saveInstanceState(outState)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
REQUEST_PASSWORD_PROMPT -> handlePasswordPromptResult(resultCode, data)
REQUEST_AUTHORIZATION -> handleAuthorizationResult(resultCode)
}
}
private fun handlePasswordPromptResult(resultCode: Int, data: Intent?) {
if (resultCode == Activity.RESULT_OK) {
val resultIntent = data ?: error("No result intent received")
val result = PasswordPromptResult.fromIntent(resultIntent)
viewModel.onPasswordPromptResult(result)
}
}
private fun handleAuthorizationResult(resultCode: Int) {
if (resultCode == Activity.RESULT_OK) {
viewModel.onReturnAfterAuthorization()
}
}
private fun setFragmentResult(accountImported: Boolean) {
setFragmentResult(
requestKey = FRAGMENT_RESULT_KEY,
result = bundleOf(
FRAGMENT_RESULT_ACCOUNT_IMPORTED to accountImported,
),
)
}
companion object {
private const val REQUEST_PASSWORD_PROMPT = Activity.RESULT_FIRST_USER
private const val REQUEST_AUTHORIZATION = Activity.RESULT_FIRST_USER + 1
const val FRAGMENT_RESULT_KEY = "settings_import"
const val FRAGMENT_RESULT_ACCOUNT_IMPORTED = "accountImported"
}
}
private class ViewHolder(view: View) {
val pickDocumentButton: View = view.findViewById(R.id.pickDocumentButton)
val scanQrCodeButton: View = view.findViewById(R.id.scanQrCodeButton)
val pickAppButton: View = view.findViewById(R.id.pickAppButton)
val importButton: View = view.findViewById(R.id.importButton)
val closeButton: MaterialButton = view.findViewById(R.id.closeButton)
val loadingProgressBar: View = view.findViewById(R.id.loadingProgressBar)
val importProgressBar: View = view.findViewById(R.id.importProgressBar)
val statusText: MaterialTextView = view.findViewById(R.id.statusText)
val settingsImportList: RecyclerView = view.findViewById(R.id.settingsImportList)
}

View file

@ -0,0 +1,104 @@
package app.k9mail.feature.settings.import.ui
import android.view.View
import android.widget.ImageView
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import app.k9mail.feature.settings.importing.R
import com.google.android.material.checkbox.MaterialCheckBox
import com.google.android.material.textview.MaterialTextView
import com.mikepenz.fastadapter.FastAdapter
import com.mikepenz.fastadapter.items.AbstractItem
import com.mikepenz.fastadapter.listeners.ClickEventHook
private const val GENERAL_SETTINGS_ID = 0L
private const val ACCOUNT_ITEMS_ID_OFFSET = 1L
internal abstract class ImportListItem<VH : ImportCheckBoxViewHolder>(
override var identifier: Long,
private val importStatus: ImportStatus,
) : AbstractItem<VH>() {
override fun bindView(holder: VH, payloads: List<Any>) {
super.bindView(holder, payloads)
holder.checkBox.isChecked = isSelected
holder.itemView.isEnabled = isEnabled
holder.checkBox.isEnabled = isEnabled
holder.checkBox.isVisible = importStatus == ImportStatus.NOT_AVAILABLE
holder.statusIcon.isVisible = importStatus != ImportStatus.NOT_AVAILABLE
if (importStatus != ImportStatus.NOT_AVAILABLE) {
val imageLevel = when (importStatus) {
ImportStatus.IMPORT_SUCCESS -> 0
ImportStatus.IMPORT_SUCCESS_PASSWORD_REQUIRED -> 1
ImportStatus.IMPORT_SUCCESS_AUTHORIZATION_REQUIRED -> 2
ImportStatus.NOT_SELECTED -> 3
ImportStatus.IMPORT_FAILURE -> 4
else -> error("Unexpected import status: $importStatus")
}
holder.statusIcon.setImageLevel(imageLevel)
val contentDescriptionStringResId = when (importStatus) {
ImportStatus.IMPORT_SUCCESS -> R.string.settings_import_status_success
ImportStatus.IMPORT_SUCCESS_PASSWORD_REQUIRED -> R.string.settings_import_status_password_required
ImportStatus.IMPORT_SUCCESS_AUTHORIZATION_REQUIRED -> R.string.settings_import_status_log_in_required
ImportStatus.NOT_SELECTED -> R.string.settings_import_status_not_imported
ImportStatus.IMPORT_FAILURE -> R.string.settings_import_status_error
else -> error("Unexpected import status: $importStatus")
}
val context = holder.statusIcon.context
holder.statusIcon.contentDescription = context.getString(contentDescriptionStringResId)
}
}
}
internal open class ImportCheckBoxViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val checkBox: MaterialCheckBox = itemView.findViewById(R.id.checkBox)
val statusIcon: ImageView = itemView.findViewById(R.id.statusIcon)
}
internal class ImportListItemClickEvent(val action: (position: Int) -> Unit) : ClickEventHook<ImportListItem<*>>() {
override fun onBind(viewHolder: RecyclerView.ViewHolder): View? {
return if (viewHolder is ImportCheckBoxViewHolder) viewHolder.checkBox else null
}
override fun onClick(
v: View,
position: Int,
fastAdapter: FastAdapter<ImportListItem<*>>,
item: ImportListItem<*>,
) {
action(position)
}
}
internal class GeneralSettingsItem(importStatus: ImportStatus) :
ImportListItem<ImportCheckBoxViewHolder>(GENERAL_SETTINGS_ID, importStatus) {
override val type = R.id.settings_import_list_general_item
override val layoutRes = R.layout.settings_import_general_list_item
override fun getViewHolder(v: View) = ImportCheckBoxViewHolder(v)
}
internal class AccountViewHolder(view: View) : ImportCheckBoxViewHolder(view) {
val accountDisplayName: MaterialTextView = view.findViewById(R.id.accountDisplayName)
}
internal class AccountItem(account: SettingsListItem.Account) :
ImportListItem<AccountViewHolder>(account.accountIndex + ACCOUNT_ITEMS_ID_OFFSET, account.importStatus) {
private val displayName = account.displayName
override val type = R.id.settings_import_list_account_item
override val layoutRes = R.layout.settings_import_account_list_item
override fun getViewHolder(v: View) = AccountViewHolder(v)
override fun bindView(holder: AccountViewHolder, payloads: List<Any>) {
super.bindView(holder, payloads)
holder.accountDisplayName.text = displayName
}
}

View file

@ -0,0 +1,72 @@
package app.k9mail.feature.settings.import.ui
import android.os.Bundle
import androidx.activity.compose.LocalActivity
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.fragment.app.FragmentActivity
import androidx.fragment.compose.AndroidFragment
import androidx.lifecycle.compose.LocalLifecycleOwner
import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonIcon
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons
import app.k9mail.core.ui.compose.designsystem.organism.TopAppBar
import app.k9mail.core.ui.compose.designsystem.template.Scaffold
import app.k9mail.feature.settings.importing.R
@Composable
fun SettingsImportScreen(
action: SettingsImportAction,
onImportSuccess: () -> Unit,
onBack: () -> Unit,
modifier: Modifier = Modifier,
) {
Scaffold(
topBar = {
TopAppBar(
title = stringResource(R.string.settings_import_title),
navigationIcon = {
ButtonIcon(
onClick = onBack,
imageVector = Icons.Outlined.ArrowBack,
contentDescription = stringResource(androidx.appcompat.R.string.abc_action_bar_up_description),
)
},
)
},
modifier = modifier,
) { innerPadding ->
SettingsImportContent(action, onImportSuccess, onBack, innerPadding)
}
}
@Composable
private fun SettingsImportContent(
action: SettingsImportAction,
onImportSuccess: () -> Unit,
onBack: () -> Unit,
paddingValues: PaddingValues,
) {
val activity = LocalActivity.current as FragmentActivity
activity.supportFragmentManager.setFragmentResultListener(
SettingsImportFragment.FRAGMENT_RESULT_KEY,
LocalLifecycleOwner.current,
) { _, result: Bundle ->
if (result.getBoolean(SettingsImportFragment.FRAGMENT_RESULT_ACCOUNT_IMPORTED, false)) {
onImportSuccess()
} else {
onBack()
}
}
AndroidFragment<SettingsImportFragment>(
arguments = action.toBundle(),
modifier = Modifier
.fillMaxSize()
.padding(paddingValues),
)
}

View file

@ -0,0 +1,243 @@
package app.k9mail.feature.settings.import.ui
import app.k9mail.feature.settings.import.ui.SettingsListItem.GeneralSettings
internal class SettingsImportUiModel {
private var isShowMigrationActions = false
var settingsList: List<SettingsListItem> = emptyList()
var isSettingsListVisible = false
var isSettingsListEnabled = true
var importButton: ButtonState = ButtonState.DISABLED
var closeButton: ButtonState = ButtonState.GONE
var closeButtonLabel: CloseButtonLabel = CloseButtonLabel.OK
var isPickDocumentButtonVisible = true
var isPickDocumentButtonEnabled = true
var isScanQrCodeButtonVisible = isShowMigrationActions
var isScanQrCodeButtonEnabled = true
var isPickAppButtonVisible = isShowMigrationActions
var isPickAppButtonEnabled = false
var isPickAppButtonPermanentlyDisabled = true
var isLoadingProgressVisible = false
var isImportProgressVisible = false
var statusText = StatusText.HIDDEN
val hasImportStarted
get() = importButton == ButtonState.GONE
val hasDocumentBeenRead
get() = isSettingsListVisible
val wasAccountImportSuccessful
get() = hasImportStarted && settingsList.any { it !is GeneralSettings && it.importStatus.isSuccess }
fun enablePickButtons() {
isPickDocumentButtonEnabled = true
isScanQrCodeButtonEnabled = true
maybeEnablePickAppButton()
}
private fun maybeEnablePickAppButton() {
if (!isPickAppButtonPermanentlyDisabled) {
isPickAppButtonEnabled = true
}
}
fun disablePickButtons() {
statusText = StatusText.HIDDEN
isPickDocumentButtonEnabled = false
isScanQrCodeButtonEnabled = false
isPickAppButtonEnabled = false
}
private fun enableImportButton() {
importButton = ButtonState.ENABLED
isImportProgressVisible = false
isSettingsListEnabled = true
}
private fun disableImportButton() {
importButton = ButtonState.DISABLED
isImportProgressVisible = false
}
fun showLoadingProgress() {
isLoadingProgressVisible = true
isPickDocumentButtonVisible = false
isScanQrCodeButtonVisible = false
isPickAppButtonVisible = false
isSettingsListEnabled = false
statusText = StatusText.HIDDEN
}
fun showImportingProgress() {
isImportProgressVisible = true
isSettingsListEnabled = false
importButton = ButtonState.INVISIBLE
statusText = StatusText.IMPORTING_PROGRESS
}
private fun showSuccessText() {
importButton = ButtonState.GONE
closeButton = ButtonState.ENABLED
closeButtonLabel = CloseButtonLabel.OK
isImportProgressVisible = false
isSettingsListEnabled = true
statusText = StatusText.IMPORT_SUCCESS
}
private fun showActionRequiredText(actionText: StatusText) {
importButton = ButtonState.GONE
closeButton = ButtonState.ENABLED
closeButtonLabel = CloseButtonLabel.LATER
isImportProgressVisible = false
isSettingsListEnabled = true
statusText = actionText
}
fun showReadFailureText() {
isLoadingProgressVisible = false
isPickDocumentButtonVisible = true
isPickDocumentButtonEnabled = true
isScanQrCodeButtonVisible = isShowMigrationActions
isScanQrCodeButtonEnabled = true
isPickAppButtonVisible = isShowMigrationActions
maybeEnablePickAppButton()
statusText = StatusText.IMPORT_READ_FAILURE
importButton = ButtonState.DISABLED
}
fun showImportErrorText() {
isLoadingProgressVisible = false
isImportProgressVisible = false
isSettingsListVisible = false
isPickDocumentButtonVisible = true
isPickDocumentButtonEnabled = true
isScanQrCodeButtonVisible = isShowMigrationActions
isScanQrCodeButtonEnabled = true
isPickAppButtonVisible = isShowMigrationActions
maybeEnablePickAppButton()
statusText = StatusText.IMPORT_FAILURE
importButton = ButtonState.DISABLED
}
private fun showPartialImportErrorText() {
importButton = ButtonState.GONE
closeButton = ButtonState.ENABLED
closeButtonLabel = CloseButtonLabel.OK
isImportProgressVisible = false
isSettingsListEnabled = true
statusText = StatusText.IMPORT_PARTIAL_FAILURE
}
fun initializeSettingsList(list: List<SettingsListItem>) {
settingsList = list
isSettingsListVisible = true
isLoadingProgressVisible = false
isPickDocumentButtonVisible = false
isScanQrCodeButtonVisible = false
isPickAppButtonVisible = false
updateImportButtonFromSelection()
}
fun toggleSettingsListItemSelection(position: Int) {
val settingsListItem = settingsList[position]
settingsListItem.selected = !settingsListItem.selected
statusText = StatusText.HIDDEN
updateImportButtonFromSelection()
}
fun setSettingsListState(position: Int, status: ImportStatus) {
settingsList[position].importStatus = status
settingsList[position].enabled = status.isActionRequired
}
private fun updateImportButtonFromSelection() {
if (isImportProgressVisible) return
val atLeastOnceSelected = settingsList.any { it.selected }
if (atLeastOnceSelected) {
enableImportButton()
} else {
disableImportButton()
}
}
fun updateCloseButtonAndImportStatusText() {
val errorsOnly = settingsList.none { it.importStatus.isSuccess }
if (errorsOnly) {
showImportErrorText()
return
}
val passwordsMissing = settingsList.any {
it.importStatus == ImportStatus.IMPORT_SUCCESS_PASSWORD_REQUIRED
}
val authorizationRequired = settingsList.any {
it.importStatus == ImportStatus.IMPORT_SUCCESS_AUTHORIZATION_REQUIRED
}
if (passwordsMissing && authorizationRequired) {
showActionRequiredText(StatusText.IMPORT_SUCCESS_PASSWORD_AND_AUTHORIZATION_REQUIRED)
} else if (passwordsMissing) {
showActionRequiredText(StatusText.IMPORT_SUCCESS_PASSWORD_REQUIRED)
} else if (authorizationRequired) {
showActionRequiredText(StatusText.IMPORT_SUCCESS_AUTHORIZATION_REQUIRED)
} else {
val partialImportError = settingsList.any { it.importStatus == ImportStatus.IMPORT_FAILURE }
if (partialImportError) {
showPartialImportErrorText()
} else {
showSuccessText()
}
}
}
fun showMigrationActions() {
isShowMigrationActions = true
isScanQrCodeButtonVisible = true
isPickAppButtonVisible = true
}
}
sealed class SettingsListItem {
var selected: Boolean = true
var enabled: Boolean = true
var importStatus: ImportStatus = ImportStatus.NOT_AVAILABLE
class GeneralSettings : SettingsListItem()
class Account(val accountIndex: Int, var displayName: String) : SettingsListItem()
}
enum class ImportStatus(val isSuccess: Boolean, val isActionRequired: Boolean) {
NOT_AVAILABLE(isSuccess = false, isActionRequired = false),
NOT_SELECTED(isSuccess = false, isActionRequired = false),
IMPORT_SUCCESS(isSuccess = true, isActionRequired = false),
IMPORT_SUCCESS_PASSWORD_REQUIRED(isSuccess = true, isActionRequired = true),
IMPORT_SUCCESS_AUTHORIZATION_REQUIRED(isSuccess = true, isActionRequired = true),
IMPORT_FAILURE(isSuccess = false, isActionRequired = false),
}
enum class ButtonState {
DISABLED,
ENABLED,
INVISIBLE,
GONE,
}
enum class StatusText {
HIDDEN,
IMPORTING_PROGRESS,
IMPORT_SUCCESS,
IMPORT_SUCCESS_PASSWORD_REQUIRED,
IMPORT_SUCCESS_AUTHORIZATION_REQUIRED,
IMPORT_SUCCESS_PASSWORD_AND_AUTHORIZATION_REQUIRED,
IMPORT_READ_FAILURE,
IMPORT_PARTIAL_FAILURE,
IMPORT_FAILURE,
}
enum class CloseButtonLabel {
OK,
LATER,
}

View file

@ -0,0 +1,622 @@
package app.k9mail.feature.settings.import.ui
import android.content.ContentResolver
import android.net.Uri
import android.os.Bundle
import android.os.Parcelable
import androidx.core.net.toUri
import androidx.core.os.BundleCompat
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.k9mail.feature.migration.launcher.api.MigrationManager
import app.k9mail.feature.settings.import.SettingsImportExternalContract.AccountActivator
import com.fsck.k9.helper.SingleLiveEvent
import com.fsck.k9.helper.measureRealtimeMillisWithResult
import com.fsck.k9.preferences.ImportContents
import com.fsck.k9.preferences.ImportResults
import com.fsck.k9.preferences.SettingsImporter
import com.fsck.k9.ui.base.bundle.getEnum
import com.fsck.k9.ui.base.bundle.putEnum
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.parcelize.Parcelize
import net.thunderbird.core.logging.legacy.Log
private typealias AccountUuid = String
private typealias AccountNumber = Int
internal class SettingsImportViewModel(
private val contentResolver: ContentResolver,
private val settingsImporter: SettingsImporter,
private val accountActivator: AccountActivator,
private val migrationManager: MigrationManager,
private val importAppFetcher: ImportAppFetcher,
private val backgroundDispatcher: CoroutineDispatcher = Dispatchers.IO,
viewModelScope: CoroutineScope = CoroutineScope(Dispatchers.Main.immediate + SupervisorJob()),
) : ViewModel(viewModelScope) {
private val uiModelLiveData = MutableLiveData<SettingsImportUiModel>()
private val actionLiveData = SingleLiveEvent<Action>()
private var isInitialized = false
private var action = SettingsImportAction.Overview
private var wasActionHandled = false
private val uiModel = SettingsImportUiModel()
private var accountsMap: MutableMap<AccountNumber, AccountUuid> = mutableMapOf()
private val accountStateMap: MutableMap<AccountNumber, AccountState> = mutableMapOf()
private var contentUri: Uri? = null
private var currentlyAuthorizingAccountUuid: String? = null
private val containsGeneralSettings: Boolean
get() = uiModel.settingsList.any { it is SettingsListItem.GeneralSettings }
private val includeGeneralSettings: Boolean
get() = uiModel.settingsList.first { it is SettingsListItem.GeneralSettings }.selected
private val generalSettingsImportStatus
get() = uiModel.settingsList.first { it is SettingsListItem.GeneralSettings }.importStatus
private val selectedAccounts: Set<AccountUuid>
get() {
return uiModel.settingsList.asSequence()
.filterIsInstance<SettingsListItem.Account>()
.filter { it.selected }
.map {
accountsMap[it.accountIndex] ?: error("Unknown account index: ${it.accountIndex}")
}
.toSet()
}
fun initialize() {
if (isInitialized) return
if (migrationManager.isFeatureIncluded()) {
updateUiModel {
showMigrationActions()
}
checkForImportApps()
}
isInitialized = true
}
private fun checkForImportApps() {
viewModelScope.launch {
val isAtLeastOneAppInstalled = withContext(backgroundDispatcher) {
importAppFetcher.isAtLeastOneAppInstalled()
}
updateUiModel {
if (isAtLeastOneAppInstalled) {
isPickAppButtonPermanentlyDisabled = false
isPickAppButtonEnabled = isPickDocumentButtonEnabled
}
}
}
}
fun getActionEvents(): LiveData<Action> = actionLiveData
fun getUiModel(): LiveData<SettingsImportUiModel> {
if (uiModelLiveData.value == null) {
uiModelLiveData.value = uiModel
}
return uiModelLiveData
}
@Suppress("LongMethod")
fun initializeFromSavedState(savedInstanceState: Bundle) {
wasActionHandled = true
contentUri = BundleCompat.getParcelable(savedInstanceState, STATE_CONTENT_URI, Uri::class.java)
currentlyAuthorizingAccountUuid = savedInstanceState.getString(STATE_CURRENTLY_AUTHORIZING_ACCOUNT_UUID)
updateUiModel {
isSettingsListVisible = savedInstanceState.getBoolean(STATE_SETTINGS_LIST_VISIBLE)
isSettingsListEnabled = savedInstanceState.getBoolean(STATE_SETTINGS_LIST_ENABLED)
importButton = savedInstanceState.getEnum(STATE_IMPORT_BUTTON, ButtonState.DISABLED)
closeButton = savedInstanceState.getEnum(STATE_CLOSE_BUTTON, ButtonState.DISABLED)
closeButtonLabel = savedInstanceState.getEnum(STATE_CLOSE_BUTTON_LABEL, CloseButtonLabel.OK)
isPickDocumentButtonVisible = savedInstanceState.getBoolean(STATE_PICK_DOCUMENT_BUTTON_VISIBLE)
isPickDocumentButtonEnabled = savedInstanceState.getBoolean(STATE_PICK_DOCUMENT_BUTTON_ENABLED)
isScanQrCodeButtonVisible = savedInstanceState.getBoolean(STATE_SCAN_QR_CODE_BUTTON_VISIBLE)
isScanQrCodeButtonEnabled = savedInstanceState.getBoolean(STATE_SCAN_QR_CODE_BUTTON_ENABLED)
isLoadingProgressVisible = savedInstanceState.getBoolean(STATE_LOADING_PROGRESS_VISIBLE)
isImportProgressVisible = savedInstanceState.getBoolean(STATE_IMPORT_PROGRESS_VISIBLE)
statusText = savedInstanceState.getEnum(STATE_STATUS_TEXT, StatusText.HIDDEN)
if (!hasDocumentBeenRead) return@updateUiModel
val generalSettingsItem = if (savedInstanceState.getBoolean(STATE_CONTAINS_GENERAL_SETTINGS)) {
val includeGeneralSettings = savedInstanceState.getBoolean(STATE_INCLUDE_GENERAL_SETTINGS)
val generalSettingsImportState = savedInstanceState.getEnum(
STATE_GENERAL_SETTINGS_IMPORT_STATUS,
ImportStatus.NOT_AVAILABLE,
)
SettingsListItem.GeneralSettings().apply {
selected = includeGeneralSettings
importStatus = generalSettingsImportState
enabled = !hasImportStarted
}
} else {
null
}
val savedAccountList = savedInstanceState.getParcelableArrayList<SavedAccountState>(STATE_ACCOUNT_LIST)!!
savedAccountList.forEach { saved ->
accountsMap[saved.accountIndex] = saved.accountUuid
accountStateMap[saved.accountIndex] = AccountState(
saved.incomingServerName,
saved.outgoingServerName,
saved.incomingServerPasswordNeeded,
saved.outgoingServerPasswordNeeded,
)
}
val accountSettingsItems = savedAccountList.map { saved ->
SettingsListItem.Account(saved.accountIndex, saved.displayName).apply {
selected = saved.selected
importStatus = saved.importStatus
enabled = if (hasImportStarted) {
saved.importStatus == ImportStatus.IMPORT_SUCCESS_PASSWORD_REQUIRED
} else {
true
}
}
}
settingsList = if (generalSettingsItem != null) {
listOf(generalSettingsItem) + accountSettingsItems
} else {
accountSettingsItems
}
}
}
fun saveInstanceState(outState: Bundle) {
with(uiModel) {
outState.putBoolean(STATE_SETTINGS_LIST_VISIBLE, isSettingsListVisible)
outState.putBoolean(STATE_SETTINGS_LIST_ENABLED, isSettingsListEnabled)
outState.putEnum(STATE_IMPORT_BUTTON, importButton)
outState.putEnum(STATE_CLOSE_BUTTON, closeButton)
outState.putEnum(STATE_CLOSE_BUTTON_LABEL, closeButtonLabel)
outState.putBoolean(STATE_PICK_DOCUMENT_BUTTON_VISIBLE, isPickDocumentButtonVisible)
outState.putBoolean(STATE_PICK_DOCUMENT_BUTTON_ENABLED, isPickDocumentButtonEnabled)
outState.putBoolean(STATE_SCAN_QR_CODE_BUTTON_VISIBLE, isScanQrCodeButtonVisible)
outState.putBoolean(STATE_SCAN_QR_CODE_BUTTON_ENABLED, isScanQrCodeButtonEnabled)
outState.putBoolean(STATE_LOADING_PROGRESS_VISIBLE, isLoadingProgressVisible)
outState.putBoolean(STATE_IMPORT_PROGRESS_VISIBLE, isImportProgressVisible)
outState.putEnum(STATE_STATUS_TEXT, statusText)
outState.putString(STATE_CURRENTLY_AUTHORIZING_ACCOUNT_UUID, currentlyAuthorizingAccountUuid)
if (hasDocumentBeenRead) {
val containsGeneralSettings = this@SettingsImportViewModel.containsGeneralSettings
outState.putBoolean(STATE_CONTAINS_GENERAL_SETTINGS, containsGeneralSettings)
if (containsGeneralSettings) {
outState.putBoolean(STATE_INCLUDE_GENERAL_SETTINGS, includeGeneralSettings)
outState.putEnum(STATE_GENERAL_SETTINGS_IMPORT_STATUS, generalSettingsImportStatus)
}
outState.putParcelableArrayList(STATE_ACCOUNT_LIST, createSavedAccountList())
}
}
outState.putParcelable(STATE_CONTENT_URI, contentUri)
}
fun setAction(action: SettingsImportAction) {
this.action = action
if (!wasActionHandled) {
wasActionHandled = true
when (action) {
SettingsImportAction.Overview -> Unit
SettingsImportAction.ScanQrCode -> onScanQrCodeButtonClicked()
}
}
}
fun onPickDocumentButtonClicked() {
updateUiModel {
disablePickButtons()
}
sendActionEvent(Action.PickDocument)
}
fun onScanQrCodeButtonClicked() {
updateUiModel {
disablePickButtons()
}
sendActionEvent(Action.ScanQrCode)
}
fun onPickAppButtonClicked() {
updateUiModel {
disablePickButtons()
}
sendActionEvent(Action.PickApp)
}
fun onDocumentPickCanceled() {
if (action == SettingsImportAction.ScanQrCode) {
sendActionEvent(Action.Close(importSuccess = false))
} else {
updateUiModel {
enablePickButtons()
}
}
}
fun onDocumentPicked(contentUri: Uri) {
updateUiModel {
showLoadingProgress()
}
startReadSettingsFile(contentUri)
}
fun onAppPickCanceled() {
updateUiModel {
enablePickButtons()
}
}
fun onAppPicked(packageName: String) {
updateUiModel {
showLoadingProgress()
}
startReadSettingsFile("content://$packageName.settings/".toUri())
}
fun onImportButtonClicked() {
updateUiModel {
showImportingProgress()
}
startImportSettings()
}
fun onCloseButtonClicked() {
sendActionEvent(Action.Close(importSuccess = uiModel.wasAccountImportSuccessful))
}
fun onSettingsListItemClicked(position: Int) {
val settingsListItem = uiModel.settingsList[position]
when (settingsListItem.importStatus) {
ImportStatus.NOT_AVAILABLE -> updateUiModel {
toggleSettingsListItemSelection(position)
}
ImportStatus.IMPORT_SUCCESS_AUTHORIZATION_REQUIRED -> {
startAuthorization(settingsListItem as SettingsListItem.Account)
}
ImportStatus.IMPORT_SUCCESS_PASSWORD_REQUIRED -> {
showPasswordPromptDialog(settingsListItem as SettingsListItem.Account)
}
else -> Unit
}
}
fun onPasswordPromptResult(result: PasswordPromptResult) {
updateUiModel {
val index = getListIndexOfAccount(result.accountUuid)
setSettingsListState(index, ImportStatus.IMPORT_SUCCESS)
updateCloseButtonAndImportStatusText()
}
viewModelScope.launch(backgroundDispatcher) {
withContext(NonCancellable) {
with(result) {
accountActivator.enableAccount(accountUuid, incomingServerPassword, outgoingServerPassword)
}
}
}
}
fun onReturnAfterAuthorization() {
currentlyAuthorizingAccountUuid?.let { accountUuid ->
currentlyAuthorizingAccountUuid = null
updateUiModel {
val index = getListIndexOfAccount(accountUuid)
setSettingsListState(index, ImportStatus.IMPORT_SUCCESS)
updateCloseButtonAndImportStatusText()
}
viewModelScope.launch(backgroundDispatcher) {
withContext(NonCancellable) {
accountActivator.enableAccount(accountUuid)
}
}
}
}
private fun getListIndexOfAccount(accountUuid: String): Int {
return uiModel.settingsList.indexOfFirst {
it is SettingsListItem.Account && accountsMap[it.accountIndex] == accountUuid
}
}
private fun startReadSettingsFile(contentUri: Uri) {
this.contentUri = contentUri
viewModelScope.launch {
try {
val (elapsed, contents) = measureRealtimeMillisWithResult {
withContext(backgroundDispatcher) {
readSettings(contentUri)
}
}
if (elapsed < MIN_PROGRESS_DURATION) {
delay(MIN_PROGRESS_DURATION - elapsed)
}
accountsMap = contents.accounts
.asSequence()
.mapIndexed { index, account -> index to account.uuid }
.toMap(mutableMapOf())
val items = mutableListOf<SettingsListItem>()
if (contents.globalSettings) {
items.add(SettingsListItem.GeneralSettings())
}
contents.accounts.mapIndexedTo(items) { index, accountDescription ->
SettingsListItem.Account(index, accountDescription.name)
}
updateUiModel {
initializeSettingsList(items)
}
} catch (e: Exception) {
Log.e(e, "Error reading settings file")
updateUiModel {
showReadFailureText()
}
}
}
}
private fun startImportSettings() {
val contentUri = this.contentUri ?: error("contentUri is missing")
viewModelScope.launch {
try {
val containsGeneralSettings = this@SettingsImportViewModel.containsGeneralSettings
val importGeneralSettings = containsGeneralSettings && includeGeneralSettings
val importAccounts = selectedAccounts.toList()
val (elapsed, importResults) = measureRealtimeMillisWithResult {
withContext(backgroundDispatcher) {
importSettings(contentUri, importGeneralSettings, importAccounts)
}
}
if (elapsed < MIN_PROGRESS_DURATION) {
delay(MIN_PROGRESS_DURATION - elapsed)
}
updateUiModel {
if (containsGeneralSettings) {
setGeneralSettingsImportStatus(importResults, importGeneralSettings)
}
setAccountsImportStatus(importResults)
updateCloseButtonAndImportStatusText()
}
} catch (e: Exception) {
Log.e(e, "Error importing settings")
updateUiModel {
showImportErrorText()
}
}
}
}
private fun SettingsImportUiModel.setGeneralSettingsImportStatus(
importResults: ImportResults,
importGeneralSettings: Boolean,
) {
val importStatus = when {
importResults.globalSettings -> ImportStatus.IMPORT_SUCCESS
importGeneralSettings -> ImportStatus.IMPORT_FAILURE
else -> ImportStatus.NOT_SELECTED
}
setSettingsListState(0, importStatus)
}
private fun SettingsImportUiModel.setAccountsImportStatus(importResults: ImportResults) {
val failedToImport = importResults.erroneousAccounts.map { it.uuid }.toHashSet()
settingsList.forEachIndexed { index, listItem ->
if (listItem !is SettingsListItem.Account) return@forEachIndexed
val accountIndex = listItem.accountIndex
val accountUuid = accountsMap[accountIndex]
if (accountUuid in failedToImport) {
setSettingsListState(index, ImportStatus.IMPORT_FAILURE)
} else {
val accountPair = importResults.importedAccounts.firstOrNull { it.original.uuid == accountUuid }
if (accountPair != null) {
accountsMap[accountIndex] = accountPair.imported.uuid
listItem.displayName = accountPair.imported.name
if (accountPair.authorizationNeeded) {
setSettingsListState(index, ImportStatus.IMPORT_SUCCESS_AUTHORIZATION_REQUIRED)
} else if (accountPair.incomingPasswordNeeded || accountPair.outgoingPasswordNeeded) {
accountStateMap[accountIndex] = AccountState(
accountPair.incomingServerName,
accountPair.outgoingServerName,
accountPair.incomingPasswordNeeded,
accountPair.outgoingPasswordNeeded,
)
setSettingsListState(index, ImportStatus.IMPORT_SUCCESS_PASSWORD_REQUIRED)
} else {
setSettingsListState(index, ImportStatus.IMPORT_SUCCESS)
}
} else {
setSettingsListState(index, ImportStatus.NOT_SELECTED)
}
}
}
}
private fun readSettings(contentUri: Uri): ImportContents {
val inputStream = contentResolver.openInputStream(contentUri)
?: error("Failed to open settings file for reading: $contentUri")
return inputStream.use {
settingsImporter.getImportStreamContents(inputStream)
}
}
private suspend fun importSettings(
contentUri: Uri,
generalSettings: Boolean,
accounts: List<AccountUuid>,
): ImportResults {
val inputStream = contentResolver.openInputStream(contentUri)
?: error("Failed to open settings file for reading: $contentUri")
return inputStream.use {
settingsImporter.importSettings(inputStream, generalSettings, accounts)
}
}
private fun startAuthorization(settingsListItem: SettingsListItem.Account) {
val accountIndex = settingsListItem.accountIndex
val accountUuid = accountsMap[accountIndex]!!
currentlyAuthorizingAccountUuid = accountUuid
sendActionEvent(Action.StartAuthorization(accountUuid))
}
private fun showPasswordPromptDialog(settingsListItem: SettingsListItem.Account) {
val accountIndex = settingsListItem.accountIndex
val accountUuid = accountsMap[accountIndex]!!
val accountState = accountStateMap[accountIndex]!!
sendActionEvent(
Action.PasswordPrompt(
accountUuid,
settingsListItem.displayName,
accountState.incomingServerPasswordNeeded,
accountState.incomingServerName,
accountState.outgoingServerPasswordNeeded,
accountState.outgoingServerName,
),
)
}
private fun updateUiModel(block: SettingsImportUiModel.() -> Unit) {
uiModel.block()
uiModelLiveData.value = uiModel
}
private fun sendActionEvent(action: Action) {
actionLiveData.value = action
}
private fun createSavedAccountList(): ArrayList<SavedAccountState> {
return uiModel.settingsList
.asSequence()
.filterIsInstance<SettingsListItem.Account>()
.map { accountItem ->
val accountIndex = accountItem.accountIndex
val accountState = accountStateMap[accountIndex]
SavedAccountState(
accountIndex = accountIndex,
displayName = accountItem.displayName,
accountUuid = accountsMap[accountIndex]!!,
selected = accountItem.selected,
importStatus = accountItem.importStatus,
incomingServerName = accountState?.incomingServerName,
outgoingServerName = accountState?.outgoingServerName,
incomingServerPasswordNeeded = accountState?.incomingServerPasswordNeeded ?: false,
outgoingServerPasswordNeeded = accountState?.outgoingServerPasswordNeeded ?: false,
)
}
.toCollection(ArrayList(uiModel.settingsList.size - 1))
}
companion object {
private const val MIN_PROGRESS_DURATION = 500L
private const val STATE_SETTINGS_LIST_VISIBLE = "settingsListVisible"
private const val STATE_SETTINGS_LIST_ENABLED = "settingsListEnabled"
private const val STATE_IMPORT_BUTTON = "importButton"
private const val STATE_CLOSE_BUTTON = "closeButton"
private const val STATE_CLOSE_BUTTON_LABEL = "closeButtonLabel"
private const val STATE_PICK_DOCUMENT_BUTTON_VISIBLE = "pickDocumentButtonVisible"
private const val STATE_PICK_DOCUMENT_BUTTON_ENABLED = "pickDocumentButtonEnabled"
private const val STATE_SCAN_QR_CODE_BUTTON_VISIBLE = "scanQrCodeButtonVisible"
private const val STATE_SCAN_QR_CODE_BUTTON_ENABLED = "scanQrCodeButtonEnabled"
private const val STATE_LOADING_PROGRESS_VISIBLE = "loadingProgressVisible"
private const val STATE_IMPORT_PROGRESS_VISIBLE = "importProgressVisible"
private const val STATE_STATUS_TEXT = "statusText"
private const val STATE_CONTAINS_GENERAL_SETTINGS = "containsGeneralSettings"
private const val STATE_INCLUDE_GENERAL_SETTINGS = "includeGeneralSettings"
private const val STATE_CONTENT_URI = "contentUri"
private const val STATE_GENERAL_SETTINGS_IMPORT_STATUS = "generalSettingsImportStatus"
private const val STATE_ACCOUNT_LIST = "accountList"
private const val STATE_CURRENTLY_AUTHORIZING_ACCOUNT_UUID = "currentlyAuthorizingAccountUuid"
}
}
sealed class Action {
class Close(val importSuccess: Boolean) : Action()
object PickDocument : Action()
object ScanQrCode : Action()
object PickApp : Action()
class StartAuthorization(val accountUuid: String) : Action()
class PasswordPrompt(
val accountUuid: String,
val accountName: String,
val inputIncomingServerPassword: Boolean,
val incomingServerName: String?,
val inputOutgoingServerPassword: Boolean,
val outgoingServerName: String?,
) : Action()
}
private class AccountState(
val incomingServerName: String?,
val outgoingServerName: String?,
val incomingServerPasswordNeeded: Boolean,
val outgoingServerPasswordNeeded: Boolean,
)
@Suppress("LongParameterList")
@Parcelize
private class SavedAccountState(
val accountIndex: Int,
val displayName: String,
val accountUuid: String,
val selected: Boolean,
val importStatus: ImportStatus,
val incomingServerName: String?,
val outgoingServerName: String?,
val incomingServerPasswordNeeded: Boolean,
val outgoingServerPasswordNeeded: Boolean,
) : Parcelable

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 949 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:drawable="@drawable/settings_import_button_google_signin_dark_disabled" />
<item android:state_pressed="true" android:drawable="@drawable/settings_import_button_google_signin_dark_pressed" />
<item android:state_focused="true" android:drawable="@drawable/settings_import_button_google_signin_dark_focus" />
<item android:drawable="@drawable/settings_import_button_google_signin_dark_normal" />
</selector>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/ic_check_circle"
android:maxLevel="0"
android:minLevel="0"
/>
<item
android:drawable="@drawable/ic_key"
android:maxLevel="1"
android:minLevel="1"
/>
<item
android:drawable="@drawable/ic_login"
android:maxLevel="2"
android:minLevel="2"
/>
<item
android:drawable="@drawable/ic_block"
android:maxLevel="3"
android:minLevel="3"
/>
<item
android:drawable="@drawable/ic_error"
android:maxLevel="4"
android:minLevel="4"
/>
</level-list>

View file

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="app.k9mail.feature.settings.import.ui.OAuthFlowActivity"
tools:ignore="ResourceName"
>
<include layout="@layout/toolbar" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fadingEdge="none"
android:padding="16dp"
android:scrollbarStyle="outsideInset"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_horizontal"
android:orientation="vertical"
>
<com.google.android.material.textview.MaterialTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:text="@string/settings_import_oauth_description"
android:textAppearance="?attr/textAppearanceBodyLarge"
/>
<com.google.android.material.button.MaterialButton
android:id="@+id/oauth_sign_in_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/settings_import_oauth_sign_in"
android:visibility="gone"
/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/google_sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/settings_import_button_google_signin_dark"
android:text="@string/settings_import_oauth_sign_in_with_google"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="14sp"
android:visibility="gone"
tools:visibility="visible"
/>
<ProgressBar
android:id="@+id/sign_in_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
/>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/error_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:textAppearance="?attr/textAppearanceBodyLarge"
tools:text="@string/settings_import_oauth_error_browser_not_found"
/>
</LinearLayout>
</ScrollView>
</LinearLayout>

View file

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="app.k9mail.feature.settings.import.ui.SettingsImportFragment"
tools:ignore="ResourceName"
>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/settingsImportList"
android:layout_width="match_parent"
android:layout_height="0dp"
android:visibility="gone"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toTopOf="@+id/bottomBar"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible"
tools:listitem="@layout/settings_import_account_list_item"
tools:itemCount="3"
/>
<com.google.android.material.button.MaterialButton
android:id="@+id/pickDocumentButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="@string/settings_import_pick_document_button"
app:layout_constraintBottom_toTopOf="@+id/scanQrCodeButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/settingsImportList"
/>
<com.google.android.material.button.MaterialButton
android:id="@+id/scanQrCodeButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="@string/settings_import_scan_qr_code_button"
app:layout_constraintBottom_toTopOf="@+id/pickAppButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pickDocumentButton"
/>
<com.google.android.material.button.MaterialButton
android:id="@+id/pickAppButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="@string/settings_import_pick_app_button"
app:layout_constraintBottom_toTopOf="@+id/settingsImportList"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/scanQrCodeButton"
/>
<ProgressBar
android:id="@+id/loadingProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="32dp"
android:layout_height="32dp"
android:indeterminate="true"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/pickDocumentButton"
app:layout_constraintEnd_toEndOf="@+id/pickDocumentButton"
app:layout_constraintStart_toStartOf="@+id/pickDocumentButton"
app:layout_constraintTop_toTopOf="@+id/pickDocumentButton"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/bottomBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="8dp"
android:minHeight="56dp"
app:layout_constraintBottom_toBottomOf="parent"
tools:ignore="UnusedAttribute"
>
<com.google.android.material.button.MaterialButton
android:id="@+id/importButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="4dp"
android:enabled="false"
android:text="@string/settings_import_button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/buttonBarrier"
/>
<com.google.android.material.button.MaterialButton
android:id="@+id/closeButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="4dp"
android:text="@string/okay_action"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/buttonBarrier"
/>
<androidx.constraintlayout.widget.Barrier
android:id="@+id/buttonBarrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="left"
/>
<ProgressBar
android:id="@+id/importProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="32dp"
android:layout_height="32dp"
android:indeterminate="true"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/importButton"
app:layout_constraintEnd_toEndOf="@+id/importButton"
app:layout_constraintStart_toStartOf="@+id/importButton"
app:layout_constraintTop_toTopOf="@+id/importButton"
/>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/statusText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/buttonBarrier"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Importing…"
tools:visibility="visible"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="app.k9mail.feature.settings.import.ui.PasswordPromptDialogFragment"
tools:ignore="ResourceName"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/passwordPromptIntro"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:text="To be able to use the account &quot;Test&quot; you need to provide the server passwords."
android:textAppearance="?android:attr/textAppearanceMedium"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/incomingServerPasswordLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/passwordPromptIntro"
app:passwordToggleEnabled="true"
>
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/incomingServerPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/settings_import_incoming_server_password_hint"
android:inputType="textPassword"
/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/incomingServerName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Server: imap.server.example"
android:textAppearance="?attr/textAppearanceBodyMedium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/incomingServerPasswordLayout"
/>
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/useSamePasswordCheckbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:checked="true"
android:text="@string/settings_import_use_same_password_for_outgoing_server"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/incomingServerName"
/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/outgoingServerPasswordLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/useSamePasswordCheckbox"
app:passwordToggleEnabled="true"
>
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/outgoingServerPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/settings_import_outgoing_server_password_hint"
android:inputType="textPassword"
/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/outgoingServerName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Server: smtp.server.example"
android:textAppearance="?attr/textAppearanceBodyMedium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/outgoingServerPasswordLayout"
/>
<androidx.constraintlayout.widget.Group
android:id="@+id/incomingServerGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:constraint_referenced_ids="incomingServerPasswordLayout,incomingServerName"
/>
<androidx.constraintlayout.widget.Group
android:id="@+id/outgoingServerGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:constraint_referenced_ids="outgoingServerPasswordLayout,outgoingServerName"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

View file

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
>
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:focusable="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="&#x200B;"
/>
<ImageView
android:id="@+id/statusIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:contentDescription="@null"
android:focusable="false"
app:srcCompat="@drawable/settings_import_import_status"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/accountDisplayName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:duplicateParentState="true"
android:textAppearance="?attr/textAppearanceTitleMedium"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="@sample/accounts.json/data/name"
/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="72dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
>
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:focusable="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<ImageView
android:id="@+id/statusIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:contentDescription="@null"
android:focusable="false"
app:srcCompat="@drawable/settings_import_import_status"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:duplicateParentState="true"
android:text="@string/settings_import_general_settings_item"
android:textAppearance="?attr/textAppearanceTitleMedium"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline"
app:layout_constraintTop_toTopOf="parent"
/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="72dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="56dp"
android:orientation="vertical"
android:paddingHorizontal="24dp"
android:paddingVertical="8dp"
>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/settings_import_app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:textAppearance="?attr/textAppearanceBodyLarge"
tools:text="K-9 Mail"
/>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/settings_import_app_note"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:text="@string/settings_import_app_version_not_supported"
android:textAppearance="?attr/textAppearanceBodyMedium"
android:visibility="gone"
tools:visibility="visible"
/>
</LinearLayout>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">استيراد الإعدادات</string>
<string name="settings_import_pick_document_button">اختيار ملف</string>
<string name="settings_import_button">استيراد</string>
<string name="settings_import_success_generic">تم استيراد الإعدادات بنجاح </string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">الرجاء إدخال كلمات المرور </string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">الرجاء تسجيل الدخول </string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">الرجاء تسجيل الدخول وإدخال كلمات المرور </string>
<string name="settings_import_failure">فشل استيراد الإعدادات </string>
<string name="settings_import_read_failure">فشلت قراءة ملف الإعدادات </string>
<string name="settings_import_partial_failure">فشل استيراد بعض الإعدادات </string>
<string name="settings_import_status_success">تم الاستيراد بنجاح </string>
<string name="settings_import_status_password_required">كلمة المرور مطلوبة </string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">تسجيل الدخول مطلوب </string>
<string name="settings_import_status_not_imported">غير مستورد </string>
<string name="settings_import_status_error">فشل الاستيراد </string>
<string name="settings_import_later_button">لاحقًا</string>
<string name="settings_importing">استيراد الإعدادات…</string>
<string name="settings_import_incoming_server_password_hint">كلمة مرور الخادم الواردة </string>
<string name="settings_import_outgoing_server_password_hint">كلمة مرور خادم البريد الصادر </string>
<string name="settings_import_use_same_password_for_outgoing_server">استخدم نفس كلمة المرور لخادم البريد الصادر </string>
<string name="settings_import_server_name_format">اسم الخادم: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">لاستخدام حساب البريد الإلكتروني هذا ، تحتاج إلى تسجيل الدخول ومنح التطبيق حق الوصول إلى رسائل البريد الإلكتروني الخاصة بك.</string>
<string name="settings_import_oauth_sign_in">تسجيل الدخول</string>
<string name="settings_import_oauth_sign_in_with_google">تسجيل الدخول بأستخدام جوجل</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">تم إلغاء التفويض </string>
<string name="settings_import_oauth_error_oauth_flow_failed">فشل التفويض مع الخطأ التالي: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 غير مدعوم حاليًا مع هذا الموفر. </string>
<string name="settings_import_oauth_error_browser_not_found">تعذر على التطبيق العثور على متصفح لاستخدامه لمنح حق الوصول إلى حسابك.</string>
<string name="settings_import_general_settings_item">الإعدادات العامة</string>
<string name="settings_import_scan_qr_code_button">مسح رمز الاستجابة السريعة</string>
<string name="settings_import_pick_app_button">الاستيراد من تطبيق</string>
<string name="settings_import_pick_app_dialog_title">الاستيراد من التطبيق</string>
<string name="settings_import_app_version_not_supported">إصدار التطبيق غير مدعوم.</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Імпартаваць налады</string>
<string name="settings_import_pick_document_button">Абраць файл</string>
<string name="settings_import_button">Імпарт</string>
<string name="settings_import_success_generic">Налады паспяхова імпартаваныя</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Калі ласка, увядзіце пароль</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Увайдзіце</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Увайдзіце і ўвядзіце пароль</string>
<string name="settings_import_failure">Не ўдалося імпартаваць налады</string>
<string name="settings_import_read_failure">Не ўдалося прачытаць файл налад</string>
<string name="settings_import_partial_failure">Не ўдалося імпартаваць некаторыя налады</string>
<string name="settings_import_status_success">Паспяхова імпартавана</string>
<string name="settings_import_status_password_required">Патрабуецца пароль</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Неабходна ўвайсці</string>
<string name="settings_import_status_not_imported">Не імпартавана</string>
<string name="settings_import_status_error">Не ўдалося імпартаваць</string>
<string name="settings_import_later_button">Пазней</string>
<string name="settings_importing">Імпарт налад…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Каб мець магчымасць выкарыстоўваць акаўнт \"<xliff:g id="account">%s</xliff:g>\", вам неабходна ўвесці пароль для сервера.</item>
<item quantity="few">Каб мець магчымасць выкарыстоўваць акаўнт \"<xliff:g id="account">%s</xliff:g>\", вам неабходна ўвесці паролі для сервера.</item>
<item quantity="many">Каб мець магчымасць выкарыстоўваць акаўнт \"<xliff:g id="account">%s</xliff:g>\", вам неабходна ўвесці паролі для сервера.</item>
<item quantity="other">Каб мець магчымасць выкарыстоўваць акаўнт \"<xliff:g id="account">%s</xliff:g>\", вам неабходна ўвесці паролі для сервера.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Пароль для сервера ўваходнай пошты</string>
<string name="settings_import_outgoing_server_password_hint">Пароль для сервера выходнай пошты</string>
<string name="settings_import_use_same_password_for_outgoing_server">Выкарыстоўваць той жа пароль для сервера выходнай пошты</string>
<string name="settings_import_server_name_format">Назва сервера: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Каб выкарыстоўваць гэты акаўнт электроннай пошты, вам трэба ўвайсці і даць праграме доступ да вашай электроннай пошты.</string>
<string name="settings_import_oauth_sign_in">Увайсці</string>
<string name="settings_import_oauth_sign_in_with_google">Увайсці з дапамогай Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Аўтарызацыя скасаваная</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Не ўдалося выканаць аўтарызацыю праз наступную памылку: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">На дадзены момант OAuth 2.0 не падтрымліваецца гэтай службай.</string>
<string name="settings_import_oauth_error_browser_not_found">Праграме не ўдалося знайсці браўзер, каб даць доступ да вашага акаўнта.</string>
<string name="settings_import_general_settings_item">Асноўныя налады</string>
<string name="settings_import_pick_app_button">Імпартаваць з праграмы</string>
<string name="settings_import_pick_app_dialog_title">Імпартаваць з праграмы</string>
<string name="settings_import_scan_qr_code_button">Сканаваць QR-код</string>
<string name="settings_import_app_version_not_supported">Версія праграмы не падтрымліваецца.</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Внасяне на настройки</string>
<string name="settings_import_pick_document_button">Избор на файл</string>
<string name="settings_import_button">Внасяне</string>
<string name="settings_import_success_generic">Успешно импортирани настройки</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Моля, въведете пароли</string>
<string name="settings_import_authorization_required">Моля, впишете се</string>
<string name="settings_import_authorization_and_password_required">Моля, впишете се и въведете паролите си</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_failure">Импортирането на настройките не бе успешно</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_read_failure">Файлът за настройки не бе прочетен</string>
<string name="settings_import_partial_failure">Импортирането на някои настройки не бе успешно</string>
<string name="settings_import_status_success">Успешно импортиране</string>
<string name="settings_import_status_password_required">Изисква се парола</string>
<string name="settings_import_status_log_in_required">Необходимо е вписване</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_not_imported">Не се импортира</string>
<string name="settings_import_status_error">Неуспешно импортиране</string>
<string name="settings_import_later_button">По късно</string>
<string name="settings_importing">Настройки на внасянето…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">За да можете да използвате профила \"<xliff:g id="account">%s</xliff:g>\" трябва да предоставите паролата на сървъра.</item>
<item quantity="other">За да можете да използвате профила \"<xliff:g id="account">%s</xliff:g>\" трябва да предоставите паролите на сървъра.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Парола за входящ сървър</string>
<string name="settings_import_outgoing_server_password_hint">Парола за изходящ сървър</string>
<string name="settings_import_use_same_password_for_outgoing_server">Използвай същата парола като на изходящия сървър</string>
<string name="settings_import_server_name_format">Име на сървър: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">За да използвате този профил, трябва да се впишете и да разрешите на приложението достъп до имейлите си.</string>
<string name="settings_import_oauth_sign_in">Вписване</string>
<string name="settings_import_oauth_sign_in_with_google">Вписване чрез Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Разрешение отменено</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Разрешаването се провали и даде следната грешка: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 с този доставчик не се поддържа в момента.</string>
<string name="settings_import_oauth_error_browser_not_found">Приложението не успя да открие браузър, който да използва за разрешаване на достъп до акаунта Ви.</string>
<string name="settings_import_general_settings_item">Общи настройки</string>
<string name="settings_import_scan_qr_code_button">Сканиране на QR кода</string>
<string name="settings_import_pick_app_button">Внасяне от приложението</string>
<string name="settings_import_pick_app_dialog_title">Внасяне от приложението</string>
<string name="settings_import_app_version_not_supported">Тази версия не се поддържа.</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Enporzhiañ an arventennoù</string>
<string name="settings_import_button">Enporzhiañ</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_importing">Och enporzhiañ an arventennoù…</string>
<string name="settings_import_general_settings_item">Arventennoù hollek</string>
<string name="settings_import_pick_document_button">Dibab ur fichennaoueg</string>
<string name="settings_import_failure">C\'hwitet eo enporzhiañ an arventennoù</string>
<string name="settings_import_pick_app_button">Enporzhiañ diwar an arload</string>
<string name="settings_import_pick_app_dialog_title">Enporzhiañ diwar an arload</string>
<string name="settings_import_success_generic">Enporzhiet eo bet an arventennoù gant berzh</string>
<string name="settings_import_password_required">Lakait gerioù-tremen mar plij</string>
<string name="settings_import_authorization_required">Kevreit mar plij</string>
<string name="settings_import_authorization_and_password_required">Mar plij, kevreit ha lakait ho gerioù-tremen</string>
</resources>

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_pick_document_button">Odaberi datoteku</string>
<string name="settings_import_password_required">Molimo unesite lozinke</string>
<string name="settings_import_authorization_required">Molimo prijavite se</string>
<string name="settings_import_authorization_and_password_required">Molimo prijavite se i unesite lozinke</string>
<string name="settings_import_failure">Uvoz postavki nije uspio</string>
<string name="settings_import_read_failure">Čitanje datoteke postavki nije uspjelo</string>
<string name="settings_import_status_success">Uspješno uvezeno</string>
<string name="settings_import_status_password_required">Lozinka neophodna</string>
<string name="settings_import_status_not_imported">Nije uvezeno</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Da bi bili u mogućnosti da koristite račun \"<xliff:g id="account">%s</xliff:g>\" potrebno je da unesete lozinku.</item>
<item quantity="few">Da bi bili u mogućnosti da koristite račun \"<xliff:g id="account">%s</xliff:g>\" potrebno je da unesete lozinke.</item>
<item quantity="other">Da bi bili u mogućnosti da koristite račun \"<xliff:g id="account">%s</xliff:g>\" potrebno je da unesete lozinke.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Lozinka dolaznog servera</string>
<string name="settings_import_outgoing_server_password_hint">Lozinka odlaznog servera</string>
<string name="settings_import_use_same_password_for_outgoing_server">Koristi istu loziku za odlazni server</string>
<string name="settings_import_server_name_format">Naziv servera: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Kako bi koristili ovaj mejl račun kroz K-9 Mail, morate se prijaviti i dodijeliti dozvolu aplikaciji da pristupi vašim mejlovima.</string>
<string name="settings_import_oauth_sign_in">Prijavite se</string>
<string name="settings_import_oauth_sign_in_with_google">Prijavite se pomoću Google-a</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorizacija otkazana</string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 trenutno nije podržan od strane ovog provajdera.</string>
<string name="settings_import_oauth_error_browser_not_found">Aplikacija nije pronašla pretraživač pomoću kojeg bi dali pristup vašem računu.</string>
<string name="settings_import_title">Uvoz postavki</string>
<string name="settings_import_button">Uvoz</string>
<string name="settings_import_success_generic">Postavke su uspješno uvezene</string>
<string name="settings_import_partial_failure">Uvoz nekih postavki nije uspio</string>
<string name="settings_import_status_log_in_required">Prijavljivanje neophodno</string>
<string name="settings_import_later_button">Kasnije</string>
<string name="settings_import_status_error">Uvoz nije uspio</string>
<string name="settings_importing">Uvozim postavke…</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorizacija neuspješna iz sljedećeg razloga: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_general_settings_item">Opšta podešavanja</string>
</resources>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importa la configuració</string>
<string name="settings_import_pick_document_button">Seleccioneu un fitxer</string>
<string name="settings_import_button">Importar</string>
<string name="settings_import_success_generic">La configuració s\'ha importat correctament</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Si us plau, escriviu les contrasenyes</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Si us plau, inicieu la sessió</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Si us plau, inicieu la sessió i proporcioneu les contrasenyes</string>
<string name="settings_import_failure">Ha fallat la importació de la configuració</string>
<string name="settings_import_read_failure">Ha fallat llegir els fitxer de configuració</string>
<string name="settings_import_partial_failure">Ha fallat importar alguns paràmetres</string>
<string name="settings_import_status_success">Importació correcta</string>
<string name="settings_import_status_password_required">Cal la contrasenya</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Cal iniciar la sessió</string>
<string name="settings_import_status_not_imported">No importat</string>
<string name="settings_import_status_error">Ha fallat la importació</string>
<string name="settings_import_later_button">Més tard</string>
<string name="settings_importing">S\'està important la configuració…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Per poder fer servir el compte <xliff:g id="account">%s</xliff:g> heu de proporcionar la contrasenya del servidor.</item>
<item quantity="many">Per poder fer servir el compte <xliff:g id="account">%s</xliff:g> heu de proporcionar les contrasenyes del servidor.</item>
<item quantity="other">Per poder fer servir el compte <xliff:g id="account">%s</xliff:g> heu de proporcionar les contrasenyes del servidor.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Contrasenya del servidor d\'entrada</string>
<string name="settings_import_outgoing_server_password_hint">Contrasenya del servidor de sortida</string>
<string name="settings_import_use_same_password_for_outgoing_server">Feu servir la mateixa contrasenya per al servidor de sortida</string>
<string name="settings_import_server_name_format">Nom del servidor: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Per fer servir aquest compte de correu electrònic, heu d\'iniciar-hi la sessió i concedir a l\'aplicació accés als vostres correus electrònics.</string>
<string name="settings_import_oauth_sign_in">Inicia la sessió</string>
<string name="settings_import_oauth_sign_in_with_google">Inicia la sessió amb Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorització cancel·lada</string>
<string name="settings_import_oauth_error_oauth_flow_failed">L\'autorització ha fallat amb l\'error següent: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">Actualment, OAuth 2.0 no és compatible amb aquest proveïdor.</string>
<string name="settings_import_oauth_error_browser_not_found">L\'aplicació no ha trobat cap navegador per utilitzar-lo per concedir accés al compte.</string>
<string name="settings_import_general_settings_item">Configuració general</string>
<string name="settings_import_pick_app_button">Importar des de l\'aplicació</string>
<string name="settings_import_pick_app_dialog_title">Importar des de l\'aplicació</string>
<string name="settings_import_scan_qr_code_button">Escaneja el codi QR</string>
<string name="settings_import_app_version_not_supported">La versió de l\'aplicació no és compatible.</string>
</resources>

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Impurtà i parametri</string>
<string name="settings_import_pick_document_button">Selezziunà un schedariu</string>
<string name="settings_import_button">Impurtà</string>
<string name="settings_import_success_generic">I parametri sò stati impurtati currettamente</string>
<string name="settings_import_authorization_required">Cunnittitevi</string>
<string name="settings_import_authorization_and_password_required">Cunnittitevi è stampittate e parolle dintesa</string>
<string name="settings_import_failure">Fiascu per impurtà i parametri</string>
<string name="settings_import_read_failure">Fiascu di lettura di u schedariu di parametri</string>
<string name="settings_import_partial_failure">Fiascu per impurtà certi parametri</string>
<string name="settings_import_status_success">Impurtatu currettamente</string>
<string name="settings_import_status_password_required">A parolla dintesa hè richiesta</string>
<string name="settings_import_status_not_imported">Micca impurtatu</string>
<string name="settings_import_status_error">Fiascu à limpurtazione</string>
<string name="settings_import_later_button">Dopu</string>
<string name="settings_importing">Impurtazione di i parametri…</string>
<string name="settings_import_incoming_server_password_hint">Parolla dintesa di u servitore dentrata</string>
<string name="settings_import_outgoing_server_password_hint">Parolla dintesa di u servitore desciuta</string>
<string name="settings_import_use_same_password_for_outgoing_server">Impiegà a listessa parolla dintesa per u servitore desciuta</string>
<string name="settings_import_oauth_error_browser_not_found">Lappiecazione ùn pò micca truvà un navigatore à impiegà per cuncede laccessu à u vostru contu.</string>
<string name="settings_import_general_settings_item">Parametri generali</string>
<string name="settings_import_password_required">Stampittate e parolle dintesa</string>
<string name="settings_import_status_log_in_required">A cunnessione hè richiesta</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Per pudè impiegà u contu \"<xliff:g id="account">%s</xliff:g>\" ci vole à pruvede a parolla dintesa di u servitore.</item>
<item quantity="other">Per pudè impiegà u contu \"<xliff:g id="account">%s</xliff:g>\" ci vole à pruvede e parolle dintesa di u servitore.</item>
</plurals>
<string name="settings_import_server_name_format">Nome di u servitore : <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Per impiegà stu contu, ci vole à cunnettesi è cuncede à lappiecazione laccessu à a vostra messaghjeria.</string>
<string name="settings_import_oauth_sign_in">Cunnettesi</string>
<string name="settings_import_oauth_sign_in_with_google">Cunnettesi cù Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorizazione abbandunata</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Fiascu di lautorizazione cù quellu sbagliu : <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">Attualmente, OAuth 2.0 ùn hè micca accettatu cù stu furnidore.</string>
<string name="settings_import_pick_app_button">Impurtà da lappiecazione</string>
<string name="settings_import_pick_app_dialog_title">Impurtà da lappiecazione</string>
<string name="settings_import_scan_qr_code_button">Leghje un codice QR</string>
<string name="settings_import_app_version_not_supported">A versione di lappiecazione ùn hè micca accettata.</string>
</resources>

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importovat nastavení</string>
<string name="settings_import_pick_document_button">Vybrat soubor</string>
<string name="settings_import_button">Import</string>
<string name="settings_import_success_generic">Nastavení úspěšně importována</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Zadejte hesla</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Přihlaste se</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Přihlaste se a zadejte hesla</string>
<string name="settings_import_failure">Nepodařilo se importovat nastavení</string>
<string name="settings_import_read_failure">Nepodařilo se číst soubor s nastaveními</string>
<string name="settings_import_partial_failure">Nepodařilo se naimportovat některá nastavení</string>
<string name="settings_import_status_success">Úspěšně naimportováno</string>
<string name="settings_import_status_password_required">Vyžadováno hesl</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Je vyžadováno přihlášení se</string>
<string name="settings_import_status_not_imported">Nenaimportováno</string>
<string name="settings_import_status_error">Nezdar při importu</string>
<string name="settings_import_later_button">Později</string>
<string name="settings_importing">Importování nastavení…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Abyste mohli používat účet „<xliff:g id="account">%s</xliff:g>“, je třeba zadat heslo k serveru.</item>
<item quantity="few">Abyste mohli používat účty „<xliff:g id="account">%s</xliff:g>“, je třeba zadat heslo k serveru.</item>
<item quantity="many">Abyste mohli používat účty „<xliff:g id="account">%s</xliff:g>“, je třeba zadat heslo k serveru.</item>
<item quantity="other">Abyste mohli používat účty „<xliff:g id="account">%s</xliff:g>“, je třeba zadat heslo k serveru.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Heslo pro server pro příchozí</string>
<string name="settings_import_outgoing_server_password_hint">Heslo pro server pro odchozí</string>
<string name="settings_import_use_same_password_for_outgoing_server">Použít stejné heslo jako pro server pro odchozí</string>
<string name="settings_import_server_name_format">Název serveru: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Pokud chcete tento e-mailový účet používat, je třeba se přihlásit a udělit přístup k e-mailům.</string>
<string name="settings_import_oauth_sign_in">Přihlásit se</string>
<string name="settings_import_oauth_sign_in_with_google">Přihlásit se prostřednictvím Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Ověření zrušeno</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Ověření se nezdařilo s následující chybou: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 není v současnosti tímto poskytovatelem podporováno.</string>
<string name="settings_import_oauth_error_browser_not_found">Aplikaci se nepodařilo najít webový prohlížeč, který použít pro udělení přístupu k vašemu účtu.</string>
<string name="settings_import_general_settings_item">Hlavní nastavení</string>
<string name="settings_import_pick_app_button">Importovat z aplikace</string>
<string name="settings_import_pick_app_dialog_title">Importovat z aplikace</string>
<string name="settings_import_scan_qr_code_button">Naskenovat QR kód</string>
<string name="settings_import_app_version_not_supported">Verze aplikace není podporována.</string>
</resources>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Mewnforio gosodiadau</string>
<string name="settings_import_pick_document_button">Dewis ffeil</string>
<string name="settings_import_button">Mewnforio</string>
<string name="settings_import_success_generic">Mewnforiwyd gosodiadau yn llwyddiannus</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Rho gyfrineiriau</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Mewngofnodwch</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Mewngofnodwch a rhoi cyfrineiriau</string>
<string name="settings_import_failure">Methwyd â mewnforio gosodiadau</string>
<string name="settings_import_read_failure">Methwyd â darllen ffeil gosodiadau</string>
<string name="settings_import_partial_failure">Methwyd â mewnforio rhai gosodiadau</string>
<string name="settings_import_status_success">Mewnforiwyd yn llwyddiannus</string>
<string name="settings_import_status_password_required">Angen cyfrinair</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Angen mewngofnodi</string>
<string name="settings_import_status_not_imported">Heb mewnforio</string>
<string name="settings_import_status_error">Gwall mewnforio</string>
<string name="settings_import_later_button">Yn hwyrach</string>
<string name="settings_importing">Yn mewnforio gosodiadau…</string>
<plurals name="settings_import_password_prompt">
<item quantity="zero">I fedru defnyddio\'r cyfrif \"<xliff:g id="account">%s</xliff:g>\" mae\'n rhaid rhoi cyfrinair y gweinydd.</item>
<item quantity="one">I fedru defnyddio\'r cyfrif \"<xliff:g id="account">%s</xliff:g>\" mae\'n rhaid rhoi cyfrinair y gweinydd.</item>
<item quantity="two">I fedru defnyddio\'r cyfrif \"<xliff:g id="account">%s</xliff:g>\" mae\'n rhaid rhoi cyfrineiriau\'r gweinydd.</item>
<item quantity="few">I fedru defnyddio\'r cyfrif \"<xliff:g id="account">%s</xliff:g>\" mae\'n rhaid rhoi cyfrineiriau\'r gweinydd.</item>
<item quantity="many">I fedru defnyddio\'r cyfrif \"<xliff:g id="account">%s</xliff:g>\" mae\'n rhaid rhoi cyfrineiriau\'r gweinydd.</item>
<item quantity="other">I fedru defnyddio\'r cyfrif \"<xliff:g id="account">%s</xliff:g>\" mae\'n rhaid rhoi cyfrineiriau\'r gweinydd.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Cyfrinair gweinydd derbyn</string>
<string name="settings_import_outgoing_server_password_hint">Cyfrinair gweinydd anfon</string>
<string name="settings_import_use_same_password_for_outgoing_server">Defnyddio\'r un cyfrinair i\'r gweinydd anfon</string>
<string name="settings_import_server_name_format">Enw gweinydd: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">I ddefnyddio\'r cyfrif e-bost hwn, rhaid mewngofnodi a rhoi caniatâd i\'r ap gael mynediad at dy negeseuon e-bost.</string>
<string name="settings_import_oauth_sign_in">Mewngofnodi</string>
<string name="settings_import_oauth_sign_in_with_google">Mewngofnodi gyda Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Diddymwyd awdurdodi</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Methodd awdurdodi gyda\'r gwall hwn: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">Ni chefnogir OAuth 2.0 ar hyn o bryd gyda\'r darparydd hwn.</string>
<string name="settings_import_oauth_error_browser_not_found">Methodd yr ap hwn ddod o hyd i borwr i\'w ddefnyddio i roi mynediad at dy gyfrif.</string>
<string name="settings_import_general_settings_item">Gosodiadau cyffredinol</string>
<string name="settings_import_scan_qr_code_button">Sganiwch y cod QR</string>
<string name="settings_import_pick_app_button">Mewnforio o\'r ap</string>
<string name="settings_import_pick_app_dialog_title">Mewnforio o\'r ap</string>
<string name="settings_import_app_version_not_supported">Nid yw\'r fersiwn yma o\'r ap yn cael ei gefnogi.</string>
</resources>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importér opsætning</string>
<string name="settings_import_pick_document_button">Vælg fil</string>
<string name="settings_import_button">Importer</string>
<string name="settings_import_success_generic">Importerede indstillinger</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Indtast venligst kodeord</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Log venligst ind</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Log ind og indtast adgangskoder</string>
<string name="settings_import_failure">Importen af indstillinger fejlede</string>
<string name="settings_import_read_failure">Indlæsning af fil med indstillinger mislykkedes</string>
<string name="settings_import_partial_failure">Import af nogle indstillinger fejlede</string>
<string name="settings_import_status_success">Importeret korrrekt</string>
<string name="settings_import_status_password_required">Kodeord påkrævet</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Log-ind er påkrævet</string>
<string name="settings_import_status_not_imported">Ikke importeret</string>
<string name="settings_import_status_error">Import fejlede</string>
<string name="settings_import_later_button">Senere</string>
<string name="settings_importing">Importerer opsætning…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">For at bruge kontoen \"<xliff:g id="account">%s</xliff:g>\" er du nødt til at angive adgangskoden for serveren.</item>
<item quantity="other">For at bruge kontoen \"<xliff:g id="account">%s</xliff:g>\" er du nødt til at angive adgangskoderne for serveren.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Indgående server adgangskode</string>
<string name="settings_import_outgoing_server_password_hint">Udgående server adgangskode</string>
<string name="settings_import_use_same_password_for_outgoing_server">Brug samme adgangskode for udgående server</string>
<string name="settings_import_server_name_format">Server navn: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_sign_in">Log ind</string>
<string name="settings_import_oauth_sign_in_with_google">Log ind med Google</string>
<string name="settings_import_general_settings_item">Generelt</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Einstellungen importieren</string>
<string name="settings_import_pick_document_button">Datei auswählen</string>
<string name="settings_import_button">Importieren</string>
<string name="settings_import_success_generic">Einstellungen erfolgreich importiert</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Bitte gib die Passwörter ein</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Bitte melde dich an</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Bitte melde dich an und gib deine Passwörter ein</string>
<string name="settings_import_failure">Einstellungen konnten nicht importiert werden</string>
<string name="settings_import_read_failure">Einstellungsdatei konnte nicht gelesen werden</string>
<string name="settings_import_partial_failure">Einige Einstellungen konnten nicht importiert werden</string>
<string name="settings_import_status_success">Erfolgreich importiert</string>
<string name="settings_import_status_password_required">Passwort erforderlich</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Anmeldung erforderlich</string>
<string name="settings_import_status_not_imported">Nicht importiert</string>
<string name="settings_import_status_error">Importfehler</string>
<string name="settings_import_later_button">Später</string>
<string name="settings_importing">Einstellungen werden importiert…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Um das Konto \"<xliff:g id="account">%s</xliff:g>\" nutzen zu können, musst du das Serverpasswort eingeben.</item>
<item quantity="other">Um das Konto \"<xliff:g id="account">%s</xliff:g>\" nutzen zu können, musst du die Serverpasswörter eingeben.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Passwort des Posteingangsservers</string>
<string name="settings_import_outgoing_server_password_hint">Passwort des Postausgangsservers</string>
<string name="settings_import_use_same_password_for_outgoing_server">Gleiches Passwort für den Postausgangsserver verwenden</string>
<string name="settings_import_server_name_format">Servername: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Um dieses E-Mail-Konto zu verwenden, musst du dich anmelden und der App Zugriff auf deine E-Mails gewähren.</string>
<string name="settings_import_oauth_sign_in">Anmelden</string>
<string name="settings_import_oauth_sign_in_with_google">Mit Google anmelden</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorisierung aufgehoben</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorisierung ist aufgrund des folgenden Fehlers fehlgeschlagen: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 wird von diesem Anbieter derzeit nicht unterstützt.</string>
<string name="settings_import_oauth_error_browser_not_found">Die App konnte keinen Browser finden, der für den Zugriff auf dein Konto verwendet werden kann.</string>
<string name="settings_import_general_settings_item">Allgemeine Einstellungen</string>
<string name="settings_import_pick_app_button">Aus App importieren</string>
<string name="settings_import_pick_app_dialog_title">Aus App importieren</string>
<string name="settings_import_scan_qr_code_button">QR-Code scannen</string>
<string name="settings_import_app_version_not_supported">App-Version nicht unterstützt.</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Εισαγωγή ρυθμίσεων</string>
<string name="settings_import_pick_document_button">Επιλογή αρχείου</string>
<string name="settings_import_button">Εισαγωγή</string>
<string name="settings_import_success_generic">Οι ρυθμίσεις έχουν εισαχθεί με επιτυχία</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Εισαγάγετε τους κωδικούς πρόσβασης</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Πραγματοποιήστε σύνδεση</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Πραγματοποιήστε σύνδεση και εισαγάγετε τους κωδικούς πρόσβασης</string>
<string name="settings_import_failure">Αποτυχία εισαγωγής ρυθμίσεων</string>
<string name="settings_import_read_failure">Αποτυχία ανάγνωσης αρχείου ρυθμίσεων</string>
<string name="settings_import_partial_failure">Αποτυχία εισαγωγής ορισμένων ρυθμίσεων</string>
<string name="settings_import_status_success">Επιτυχής εισαγωγή</string>
<string name="settings_import_status_password_required">Απαιτείται κωδικός πρόσβασης</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Απαιτείται σύνδεση</string>
<string name="settings_import_status_not_imported">Δεν έχει εισαχθεί</string>
<string name="settings_import_status_error">Αποτυχία εισαγωγής</string>
<string name="settings_import_later_button">Αργότερα</string>
<string name="settings_importing">Εισαγωγή ρυθμίσεων…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Για να μπορέσετε να χρησιμοποιήσετε τον λογαριασμό \"<xliff:g id="account">%s</xliff:g>\", θα χρειαστεί να παράσχετε τον κωδικό πρόσβασης του διακομιστή.</item>
<item quantity="other">Για να μπορέσετε να χρησιμοποιήσετε τον λογαριασμό \"<xliff:g id="account">%s</xliff:g>\", θα χρειαστεί να παράσχετε τους κωδικούς πρόσβασης του διακομιστή.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Κωδικός πρόσβασης διακομιστή εισερχομένων</string>
<string name="settings_import_outgoing_server_password_hint">Κωδικός πρόσβασης διακομιστή εξερχομένων</string>
<string name="settings_import_use_same_password_for_outgoing_server">Χρήση του ίδιου κωδικού πρόσβασης για τον διακομιστή εξερχομένων</string>
<string name="settings_import_server_name_format">Όνομα διακομιστή: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Για να χρησιμοποιήσετε αυτόν τον λογαριασμό email, θα χρειαστεί να πραγματοποιήσετε σύνδεση και να παραχωρήσετε στην εφαρμογή πρόσβαση στα email σας.</string>
<string name="settings_import_oauth_sign_in">Σύνδεση</string>
<string name="settings_import_oauth_sign_in_with_google">Σύνδεση μέσω Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Η ταυτοποίηση ακυρώθηκε</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Η ταυτοποίηση απέτυχε με το εξής σφάλμα: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">Το OAuth 2.0 δεν υποστηρίζεται προς το παρόν από αυτόν τον πάροχο.</string>
<string name="settings_import_oauth_error_browser_not_found">Η εφαρμογή δεν μπόρεσε να εντοπίσει κάποιο πρόγραμμα περιήγησης για την παραχώρηση πρόσβασης στον λογαριασμό σας.</string>
<string name="settings_import_general_settings_item">Γενικές ρυθμίσεις</string>
<string name="settings_import_scan_qr_code_button">Σαρώστε τον κωδικό QR</string>
<string name="settings_import_pick_app_dialog_title">Εισαγωγή από εφαρμογή</string>
<string name="settings_import_pick_app_button">Εισαγωγή από εφαρμογή</string>
<string name="settings_import_app_version_not_supported">Η έκδοση της εφαρμογής δεν υποστηρίζεται.</string>
</resources>

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Import settings</string>
<string name="settings_import_pick_document_button">Select file</string>
<string name="settings_import_button">Import</string>
<string name="settings_import_success_generic">Settings successfully imported</string>
<string name="settings_import_password_required">Please enter passwords</string>
<string name="settings_import_authorization_required">Please sign in</string>
<string name="settings_import_authorization_and_password_required">Please sign in and enter passwords</string>
<string name="settings_import_failure">Failed to import settings</string>
<string name="settings_import_read_failure">Failed to read settings file</string>
<string name="settings_import_partial_failure">Failed to import some settings</string>
<string name="settings_import_status_success">Imported successfully</string>
<string name="settings_import_status_password_required">Password required</string>
<string name="settings_import_status_log_in_required">Sign-in required</string>
<string name="settings_import_status_not_imported">Not imported</string>
<string name="settings_import_status_error">Import failure</string>
<string name="settings_import_later_button">Later</string>
<string name="settings_importing">Importing settings…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">To be able to use the account \"<xliff:g id="account">%s</xliff:g>\" you need to provide the server password.</item>
<item quantity="other">To be able to use the account \"<xliff:g id="account">%s</xliff:g>\" you need to provide the server passwords.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Incoming server password</string>
<string name="settings_import_outgoing_server_password_hint">Outgoing server password</string>
<string name="settings_import_use_same_password_for_outgoing_server">Use same password for outgoing server</string>
<string name="settings_import_server_name_format">Server name: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">To use this email account with K-9 Mail, you need to sign in and grant the app access to your emails.</string>
<string name="settings_import_oauth_sign_in">Sign in</string>
<string name="settings_import_oauth_sign_in_with_google">Sign in with Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Authorisation cancelled</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Authorisation failed with the following error: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 is currently not supported with this provider.</string>
<string name="settings_import_oauth_error_browser_not_found">The app couldn\'t find a browser to use for granting access to your account.</string>
<string name="settings_import_general_settings_item">General settings</string>
<string name="settings_import_scan_qr_code_button">Scan QR code</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Enporti agordojn</string>
<string name="settings_import_pick_document_button">Elekti dosieron</string>
<string name="settings_import_button">Enporti</string>
<string name="settings_import_success_generic">Sukcese enportis agordojn</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Bonvolu entajpi pasvortojn</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_failure">Fiaskis enporti agordojn</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_read_failure">Fiaskis legi dosieron kun agordoj</string>
<string name="settings_import_partial_failure">Fiaskis enporti iujn agordojn</string>
<string name="settings_import_status_success">Sukcesis enporti</string>
<string name="settings_import_status_password_required">Postulas pasvorton</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_not_imported">Ne enportita</string>
<string name="settings_import_status_error">Fiaskis enporti</string>
<string name="settings_import_later_button">Poste</string>
<string name="settings_importing">Enportado de agordoj…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Por uzi la konton “<xliff:g id="account">%s</xliff:g>” vi devas enigi pasvorton.</item>
<item quantity="other">Por uzi la konton “<xliff:g id="account">%s</xliff:g>” vi devas enigi pasvortojn.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Pasvorto de enira servo</string>
<string name="settings_import_outgoing_server_password_hint">Pasvorto de elira servo</string>
<string name="settings_import_use_same_password_for_outgoing_server">Uzi la saman pasvorton por elira servilo</string>
<string name="settings_import_server_name_format">Nomo de servilo: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_general_settings_item">Ĝeneralaj agordoj</string>
<string name="settings_import_oauth_sign_in">Ensaluti</string>
<string name="settings_import_pick_app_button">Enporti el apo</string>
<string name="settings_import_pick_app_dialog_title">Enport el apo</string>
<string name="settings_import_oauth_sign_in_with_google">Ensaluti per Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Permeso nuligita</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Permeso fiaskis kun tiu ĉi eraro: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_browser_not_found">La apo ne povis trovi retumilon por permesi alireblon al via konto.</string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 estas nune ne subtenata kun tiu ĉi provizanto.</string>
<string name="settings_import_scan_qr_code_button">Skani QR kodon</string>
<string name="settings_import_authorization_required">Bonvolu ensaluti</string>
<string name="settings_import_authorization_and_password_required">Bonvolu ensaluti kaj enigi viajn pasvortojn</string>
<string name="settings_import_status_log_in_required">Ensalutado postulata</string>
<string name="settings_import_app_version_not_supported">Versio apon ne subtenata.</string>
<string name="settings_import_oauth_description">Por uzi tiun ĉi retpoŝtkonton, vi bezonas ensaluti kaj doni al la apo alireblon al viaj retmesaĝoj.</string>
</resources>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importar ajustes</string>
<string name="settings_import_pick_document_button">Seleccionar archivo</string>
<string name="settings_import_button">Importar</string>
<string name="settings_import_success_generic">Los ajustes se han importado correctamente</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Introduce tus contraseñas</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Iniciar sesión</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Inicia sesión escribiendo tu contraseña</string>
<string name="settings_import_failure">La importación de ajustes ha fallado</string>
<string name="settings_import_read_failure">Fallo al leer el archivo de ajustes</string>
<string name="settings_import_partial_failure">La importación de algunos ajustes ha fallado</string>
<string name="settings_import_status_success">Importado correctamente</string>
<string name="settings_import_status_password_required">Se necesita una contraseña</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Es necesario iniciar sesión</string>
<string name="settings_import_status_not_imported">No importado</string>
<string name="settings_import_status_error">La importación ha fallado</string>
<string name="settings_import_later_button">Más tarde</string>
<string name="settings_importing">Importando ajustes…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Para poder usar la cuenta \"<xliff:g id="account">%s</xliff:g>\" es necesario proporcionar la contraseña del servidor.</item>
<item quantity="many">Para poder usar la cuenta \"<xliff:g id="account">%s</xliff:g>\" es necesario proporcionar las contraseñas del servidor.</item>
<item quantity="other">Para poder usar la cuenta \"<xliff:g id="account">%s</xliff:g>\" es necesario proporcionar las contraseñas del servidor.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Contraseña del servidor de correo entrante</string>
<string name="settings_import_outgoing_server_password_hint">Contraseña del servidor de correo saliente</string>
<string name="settings_import_use_same_password_for_outgoing_server">Usar la misma contraseña para el servidor de correo saliente</string>
<string name="settings_import_server_name_format">Nombre del servidor: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Para utilizar esta cuenta de correo electrónico, tienes que iniciar sesión y conceder a la aplicación acceso a tus correos electrónicos.</string>
<string name="settings_import_oauth_sign_in">Iniciar sesión</string>
<string name="settings_import_oauth_sign_in_with_google">Iniciar sesión con Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">See ha cancelado la autorización</string>
<string name="settings_import_oauth_error_oauth_flow_failed">La autorización ha fallado con el error: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">El servidor no parece que sea compatible con OAuth 2.0.</string>
<string name="settings_import_oauth_error_browser_not_found">La aplicación no ha encontrado ningún navegador que se pueda utilizar para iniciar sesión en tu cuenta.</string>
<string name="settings_import_general_settings_item">Ajustes generales</string>
<string name="settings_import_pick_app_button">Importar desde la aplicación</string>
<string name="settings_import_pick_app_dialog_title">Importar desde la aplicación</string>
<string name="settings_import_scan_qr_code_button">Escanear el código QR</string>
<string name="settings_import_app_version_not_supported">Versión de la aplicación no compatible.</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Impordi seadistused</string>
<string name="settings_import_pick_document_button">Vali fail</string>
<string name="settings_import_button">Impordi</string>
<string name="settings_import_success_generic">Seadistused on edukalt imporditud</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Palun sisesta salasõnad</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Palun logi sisse</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Palun logi sisse ja sisesta salasõnad</string>
<string name="settings_import_failure">Seadistuste importimine ei õnnestunud</string>
<string name="settings_import_read_failure">Seadistuste faili lugemine ei õnnestunud</string>
<string name="settings_import_partial_failure">Mõnede seadistuste importimine ei õnnestunud</string>
<string name="settings_import_status_success">Importimine õnnestus</string>
<string name="settings_import_status_password_required">Salasõna on vajalik</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Sisselogimine on nõutav</string>
<string name="settings_import_status_not_imported">Ei imporditud</string>
<string name="settings_import_status_error">Importimise viga</string>
<string name="settings_import_later_button">Hiljem</string>
<string name="settings_importing">Seadistused on importimisel…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one"><xliff:g id="account">%s</xliff:g>“ konto kasutamiseks palun sisesta serveri salasõna.</item>
<item quantity="other"><xliff:g id="account">%s</xliff:g>“ konto kasutamiseks palun sisesta serveri salasõnad.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Saabuvaid kirju teenindava serveri salasõna</string>
<string name="settings_import_outgoing_server_password_hint">Väljuvaid kirju teenindava serveri salasõna</string>
<string name="settings_import_use_same_password_for_outgoing_server">Kasuta sama salasõna ka väljuvate kirjade serveri tarbeks</string>
<string name="settings_import_server_name_format">Serveri nimi: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Kui soovid kasutada seda e-posti teenust, siis logi teenusesse ja anna sellele rakendusele õigus lugeda e-kirju.</string>
<string name="settings_import_oauth_sign_in">Logi sisse</string>
<string name="settings_import_oauth_sign_in_with_google">Logi sisse kasutades Google\'i teenuseid</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autentimine on katkenud</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autentimine ei õnnestunud ja tekkis järgnev viga: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">See teenusepakkuja ei võimalda OAuth 2.0 kasutamist.</string>
<string name="settings_import_oauth_error_browser_not_found">Rakendus ei suutnud tuvastada veebibrauserit, mida saaks sinu kontole ligipääsu lubamiseks kasutada.</string>
<string name="settings_import_general_settings_item">Üldised seadistused</string>
<string name="settings_import_pick_app_button">Impordi rakendusest</string>
<string name="settings_import_pick_app_dialog_title">Impordi rakendusest</string>
<string name="settings_import_scan_qr_code_button">Skaneeri QR-koodi</string>
<string name="settings_import_app_version_not_supported">Sellest rakenduse versioonist pole importimine toetatud.</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Inportatu ezarpenak</string>
<string name="settings_import_pick_document_button">Hautatu fitxategia</string>
<string name="settings_import_button">Inportatu</string>
<string name="settings_import_success_generic">Ezarpenak ongi inportatu dira</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Sartu pasahitzak</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Mesedez saioa hasi</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Mesedez saioa hasi eta sartu pasahitza</string>
<string name="settings_import_failure">Ezin izan dira ezarpenak inportatu</string>
<string name="settings_import_read_failure">Ezin izan da ezarpenen fitxategia irakurri</string>
<string name="settings_import_partial_failure">Ezin izan dira ezarpen batzuk inportatu</string>
<string name="settings_import_status_success">Ongi inportatuta</string>
<string name="settings_import_status_password_required">Pasahitza derrigorrezkoa</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Saio-haztea beharrezkoa</string>
<string name="settings_import_status_not_imported">Inportatu gabe</string>
<string name="settings_import_status_error">Inportazio hutsegitea</string>
<string name="settings_import_later_button">Geroago</string>
<string name="settings_importing">Ezarpenak inportatzen…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">\"<xliff:g id="account">%s</xliff:g>\" kontua erabili ahal izateko zerbitzari-pasahitza eman behar duzu.</item>
<item quantity="other">\"<xliff:g id="account">%s</xliff:g>\" kontua erabili ahal izateko zerbitzari-pasahitzak eman behar dituzu.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Sarrerako zerbitzariaren pasahitza</string>
<string name="settings_import_outgoing_server_password_hint">Irteerako zerbitzariaren pasahitza</string>
<string name="settings_import_use_same_password_for_outgoing_server">Erabili pasahitz bera irteera zerbitzariarentzat</string>
<string name="settings_import_server_name_format">Zerbitzari-izena: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Posta elektronikoko kontu hau erabiltzeko, saioa hasi eta aplikazioari zure mezu elektronikoetarako sarbidea eman behar diozu.</string>
<string name="settings_import_oauth_sign_in">Saioa hasi</string>
<string name="settings_import_oauth_sign_in_with_google">Saioa hasi Googlerekin</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">baimena bertan behera utzi da</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Baimenak huts egin du errore honekin: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 une honetan ez dago hornitzaile honekin onartuta.</string>
<string name="settings_import_oauth_error_browser_not_found">Aplikazioak ezin izan du zure konturako sarbidea erabiltzeko arakatzailerik aurkitu.</string>
<string name="settings_import_general_settings_item">Ezarpen orokorrak</string>
<string name="settings_import_pick_app_button">Inportatu aplikaziotik</string>
<string name="settings_import_pick_app_dialog_title">Inportatu aplikaziotik</string>
<string name="settings_import_scan_qr_code_button">Eakaneatu QR kodea</string>
<string name="settings_import_app_version_not_supported">Aplikazioaren bertsioa ez da onartzen.</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">درون‌برد تنظیمات</string>
<string name="settings_import_pick_document_button">انتخاب پرونده</string>
<string name="settings_import_button">درون‌برد</string>
<string name="settings_import_success_generic">درون‌برد تنظیمات موفقیت‌آمیز بود</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">لطفاً گذرواژه‌ها را وارد کنید</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">لطفا وارد شوید</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">لطفا وارد شوید و رمز را وارد کنید</string>
<string name="settings_import_failure">درون‌برد تنظیمات ناموفق بود</string>
<string name="settings_import_read_failure">خواندن پروندهٔ تنظیمات ناموفق بود</string>
<string name="settings_import_partial_failure">درون‌برد برخی تنظیمات ناموفق بود</string>
<string name="settings_import_status_success">درون‌برد موفقیت‌آمیز بود</string>
<string name="settings_import_status_password_required">گذرواژه لازم است</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">ورود نیاز است</string>
<string name="settings_import_status_not_imported">درون‌برد نشده</string>
<string name="settings_import_status_error">شکست درون‌برد</string>
<string name="settings_import_later_button">بعداً</string>
<string name="settings_importing">در حال درون‌برد تنظیمات…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">برای اینکه بتوانید از حساب «<xliff:g id="account">%s</xliff:g>» استفاده کنید، باید گذرواژهٔ میزبان را ارائه نمایید.</item>
<item quantity="other">برای اینکه بتوانید از حساب «<xliff:g id="account">%s</xliff:g>» استفاده کنید، باید گذرواژه‌های کارساز را ارائه نمایید.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">گذرواژهٔ کارساز ورودی</string>
<string name="settings_import_outgoing_server_password_hint">گذرواژهٔ کارساز خروجی</string>
<string name="settings_import_use_same_password_for_outgoing_server">برای کارساز خروجی از همان گذرواژه استفاده کن</string>
<string name="settings_import_server_name_format">نام کارساز:<xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">برای استفاده‌ از این حساب باید وارد شده و اجازهٔ دسترسی به رایانامه‌هایتان را به برنامه بدهید.</string>
<string name="settings_import_oauth_sign_in">ورود</string>
<string name="settings_import_oauth_sign_in_with_google">ورود با حساب گوگل</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">مجوزدهی لغو شد</string>
<string name="settings_import_oauth_error_oauth_flow_failed">مجوزدهی به علت این خطا ناتمام ماند: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 فعلا توسط این ارائه دهنده پشتیبانی نمی‌شود.</string>
<string name="settings_import_oauth_error_browser_not_found">برنامه نمی تواند مرورگری را پیدا کند تا دسترسی به حسابتان را بگیرد.</string>
<string name="settings_import_general_settings_item">تنظیمات کلی</string>
<string name="settings_import_pick_app_button">درون‌ریزی از برنامه</string>
<string name="settings_import_pick_app_dialog_title">درون‌ریزی از برنامه</string>
<string name="settings_import_app_version_not_supported">نگارش برنامه پشتیبانی نمی‌شود.</string>
<string name="settings_import_scan_qr_code_button">پویش رمزینه</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Tuo asetukset</string>
<string name="settings_import_pick_document_button">Valitse tiedosto</string>
<string name="settings_import_button">Tuo</string>
<string name="settings_import_success_generic">Asetusten tuonti onnistui</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Anna salasanat</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Kirjaudu sisään</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Kirjaudu sisään ja anna salasanat</string>
<string name="settings_import_failure">Asetusten tuonti epäonnistui</string>
<string name="settings_import_read_failure">Asetustiedoston lukeminen epäonnistui</string>
<string name="settings_import_partial_failure">Joidenkin asetusten tuonti epäonnistui</string>
<string name="settings_import_status_success">Tuonti onnistui</string>
<string name="settings_import_status_password_required">Salasana vaaditaan</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Sisäänkirjautuminen vaaditaan</string>
<string name="settings_import_status_not_imported">Ei tuotu</string>
<string name="settings_import_status_error">Tuontivirhe</string>
<string name="settings_import_later_button">Myöhemmin</string>
<string name="settings_importing">Tuodaan asetuksia…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Jotta voit käyttää tiliä \"<xliff:g id="account">%s</xliff:g>\", sinun on annettava palvelimen salasana.</item>
<item quantity="other">Jotta voit käyttää tiliä \"<xliff:g id="account">%s</xliff:g>\", sinun on annettava palvelimien salasanat.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Saapuvan postin palvelimen salasana</string>
<string name="settings_import_outgoing_server_password_hint">Lähtevän postin palvelimen salasana</string>
<string name="settings_import_use_same_password_for_outgoing_server">Käytä samaa salasanaa lähtevälle palvelimelle</string>
<string name="settings_import_server_name_format">Palvelimen nimi: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Jotta voit käyttää tätä tiliä, sinun tulee kirjautua sisään ja antaa sovellukselle oikeus päästä sähköposteihisi.</string>
<string name="settings_import_oauth_sign_in">Kirjaudu sisään</string>
<string name="settings_import_oauth_sign_in_with_google">Kirjaudu sisään Googlella</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Valtuutus peruttu</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Valtuutus epäonnistui, virhe: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 ei ole tällä hetkellä tuettu tämän palvelutarjoajan kohdalla.</string>
<string name="settings_import_oauth_error_browser_not_found">Sovellus ei löytänyt selainta käytettäväksi pääsyn antamiseksi tälle tilille.</string>
<string name="settings_import_general_settings_item">Yleiset asetukset</string>
<string name="settings_import_app_version_not_supported">Sovelluksen versio ei ole tuettu.</string>
<string name="settings_import_scan_qr_code_button">Skannaa QR-koodi</string>
<string name="settings_import_pick_app_button">Tuo sovelluksesta</string>
<string name="settings_import_pick_app_dialog_title">Tuo sovelluksesta</string>
</resources>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importer les paramètres</string>
<string name="settings_import_pick_document_button">Sélectionner un fichier</string>
<string name="settings_import_button">Importation</string>
<string name="settings_import_success_generic">Les paramètres ont été importés</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Saisissez vos mots de passe</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Connectez-vous</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Connectez-vous et saisissez les mots de passe</string>
<string name="settings_import_failure">Échec dimportation des paramètres</string>
<string name="settings_import_read_failure">Échec de lecture du fichier de paramètres</string>
<string name="settings_import_partial_failure">Échec dimportation de certains paramètres</string>
<string name="settings_import_status_success">A été importé</string>
<string name="settings_import_status_password_required">Le mot de passe est requis</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">La connexion est requise</string>
<string name="settings_import_status_not_imported">Na pas été importé</string>
<string name="settings_import_status_error">Échec dimportation</string>
<string name="settings_import_later_button">Plus tard</string>
<string name="settings_importing">Importation des paramètres…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Pour utiliser le compte « <xliff:g id="account">%s</xliff:g> », vous devez indiquer le mot de passe du serveur.</item>
<item quantity="many">Pour utiliser le compte « <xliff:g id="account">%s</xliff:g> », vous devez indiquer les mots de passe des serveurs.</item>
<item quantity="other">Pour utiliser le compte « <xliff:g id="account">%s</xliff:g> », vous devez indiquer les mots de passe des serveurs.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Mot de passe du serveur entrant</string>
<string name="settings_import_outgoing_server_password_hint">Mot de passe du serveur sortant</string>
<string name="settings_import_use_same_password_for_outgoing_server">Utiliser le même mot de passe pour le serveur sortant</string>
<string name="settings_import_server_name_format">Nom du serveur : <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Pour utiliser ce compte de courriel, vous devez vous connecter et accorder à lappli laccès à vos courriels.</string>
<string name="settings_import_oauth_sign_in">Connexion</string>
<string name="settings_import_oauth_sign_in_with_google">Connexion avec Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Lautorisation a été annulée</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Échec dautorisation avec lerreur suivante :<xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 nest actuellement pas pris en charge par ce service.</string>
<string name="settings_import_oauth_error_browser_not_found">Lappli na pas trouvé de navigateur pour accorder laccès à votre compte.</string>
<string name="settings_import_general_settings_item">Paramètres généraux</string>
<string name="settings_import_pick_app_button">Importer dune appli</string>
<string name="settings_import_pick_app_dialog_title">Importer dune appli</string>
<string name="settings_import_scan_qr_code_button">Lire un code QR</string>
<string name="settings_import_app_version_not_supported">La version de lappli nest pas prise en charge.</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Ynstellingen ymportearje</string>
<string name="settings_import_pick_document_button">Bestân selektearje</string>
<string name="settings_import_button">Ymportearje</string>
<string name="settings_import_success_generic">Ynstellingen mei sukses ymportearre</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Fier de wachtwurden yn</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Oanmelde</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Meld jo oan en fier it wachtwurd yn</string>
<string name="settings_import_failure">Ynstellingen ymportearje mislearre</string>
<string name="settings_import_read_failure">Lêzen fan ynstellingenbestân mislearre</string>
<string name="settings_import_partial_failure">Ymportearjen fan guon ynstellingen mislearre</string>
<string name="settings_import_status_success">Mei sukses ymportearre</string>
<string name="settings_import_status_password_required">Wachtwurd fereaske</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Oanmelden fereaske</string>
<string name="settings_import_status_not_imported">Net ymportearre</string>
<string name="settings_import_status_error">Ymportearjen mislearre</string>
<string name="settings_import_later_button">Letter</string>
<string name="settings_importing">Ynstellingen ymportearje…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Om de account <xliff:g id="account">%s</xliff:g> te brûken moatte jo it wachtwurd fan de server opjaan.</item>
<item quantity="other">Om de account <xliff:g id="account">%s</xliff:g> te brûken moatte jo de wachtwurden fan de server opjaan.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Wachtwurd ynkommende server</string>
<string name="settings_import_outgoing_server_password_hint">Wachtwurd útgeande server</string>
<string name="settings_import_use_same_password_for_outgoing_server">Brûk itselde wachtwurd foar de útgeande server</string>
<string name="settings_import_server_name_format">Servernamme: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Om dizze e-mailaccount te brûken, moatte jo jo oanmelde om de app tagong te jaan ta jo e-mailberjochten.</string>
<string name="settings_import_oauth_sign_in">Oanmelde</string>
<string name="settings_import_oauth_sign_in_with_google">Oanmelde mei Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorisaasje annulearre</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorisaasje is mislearre mei de folgjende flater: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 wurdt op dit stuit net stipe troch dizze provider.</string>
<string name="settings_import_oauth_error_browser_not_found">Dizze app kin gjin browser fine. In browser is nedich om tagong te jaan ta jo account.</string>
<string name="settings_import_general_settings_item">Algemiene ynstellingen</string>
<string name="settings_import_pick_app_button">Ymportearje fan app út</string>
<string name="settings_import_pick_app_dialog_title">Ymportearje fan app út</string>
<string name="settings_import_scan_qr_code_button">QR-koade scanne</string>
<string name="settings_import_app_version_not_supported">App-ferzje net stipe.</string>
</resources>

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Socruithe a allmhairiú</string>
<string name="settings_import_button">Iompórtáil</string>
<string name="settings_import_status_log_in_required">Tá síniú isteach ag teastáil</string>
<string name="settings_import_status_not_imported">Gan iompórtáil</string>
<string name="settings_import_status_error">Teip iompórtála</string>
<string name="settings_import_later_button">Níos déanaí</string>
<string name="settings_importing">Socruithe á n-iompórtáil…</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Cealaíodh an t-údarú</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Theip ar údarú leis an earráid seo a leanas: <xliff:g id="error"> %s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">Ní thacaítear le OAuth 2.0 leis an soláthraí seo faoi láthair.</string>
<string name="settings_import_general_settings_item">Socruithe ginearálta</string>
<string name="settings_import_pick_app_button">Iompórtáil ó aip</string>
<string name="settings_import_pick_document_button">Roghnaigh comhad</string>
<string name="settings_import_scan_qr_code_button">Scan an cód QR</string>
<string name="settings_import_success_generic">D\'éirigh le hiompórtáil na socruithe</string>
<string name="settings_import_authorization_required">Sínigh isteach le do thoil</string>
<string name="settings_import_pick_app_dialog_title">Iompórtáil ó aip</string>
<string name="settings_import_password_required">Cuir isteach pasfhocail le do thoil</string>
<string name="settings_import_authorization_and_password_required">Sínigh isteach agus cuir isteach pasfhocail</string>
<string name="settings_import_failure">Theip ar iompórtáil na socruithe</string>
<string name="settings_import_partial_failure">Theip ar iompórtáil roinnt socruithe</string>
<string name="settings_import_status_password_required">Pasfhocal ag teastáil</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Chun gur féidir leat an cuntas \"<xliff:g id="account">%s</xliff:g>\" a úsáid, ní mór duit pasfhocal an fhreastalaí a sholáthar.</item>
<item quantity="two">Chun gur féidir leat an cuntas \"<xliff:g id="account">%s</xliff:g>\" a úsáid, ní mór duit pasfhocail an fhreastalaí a sholáthar.</item>
<item quantity="few">Chun gur féidir leat an cuntas \"<xliff:g id="account">%s</xliff:g>\" a úsáid, ní mór duit pasfhocail an fhreastalaí a sholáthar.</item>
<item quantity="many">Chun gur féidir leat an cuntas \"<xliff:g id="account">%s</xliff:g>\" a úsáid, ní mór duit pasfhocail an fhreastalaí a sholáthar.</item>
<item quantity="other">Chun gur féidir leat an cuntas \"<xliff:g id="account">%s</xliff:g>\" a úsáid, ní mór duit pasfhocail an fhreastalaí a sholáthar.</item>
</plurals>
<string name="settings_import_status_success">D\'éirigh le hiompórtáil</string>
<string name="settings_import_read_failure">Theip ar an gcomhad socruithe a léamh</string>
<string name="settings_import_incoming_server_password_hint">Pasfhocal freastalaí isteach</string>
<string name="settings_import_use_same_password_for_outgoing_server">Úsáid an pasfhocal céanna don fhreastalaí amach</string>
<string name="settings_import_outgoing_server_password_hint">Pasfhocal freastalaí amach</string>
<string name="settings_import_server_name_format">Ainm an fhreastalaí: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_sign_in">Sínigh isteach</string>
<string name="settings_import_oauth_sign_in_with_google">Sínigh isteach le Google</string>
<string name="settings_import_oauth_error_browser_not_found">Níorbh fhéidir leis an aip brabhsálaí a aimsiú le húsáid chun rochtain a dheonú ar do chuntas.</string>
<string name="settings_import_oauth_description">Chun an cuntas ríomhphoist seo a úsáid, ní mór duit síniú isteach agus rochtain a thabhairt don aip ar do ríomhphoist.</string>
<string name="settings_import_app_version_not_supported">Ní thacaítear leis an leagan aipe.</string>
</resources>

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Ion-phortaich na roghainnean</string>
<string name="settings_import_button">Ion-phortaich</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_importing">Ag ion-phortadh nan roghainnean…</string>
<string name="settings_import_general_settings_item">Roghainnean coitcheann</string>
<string name="settings_import_success_generic">Chaidh na roghainnean ion-phortadh</string>
<string name="settings_import_failure">Cha b urrainn dhuinn na roghainnean ion-phortadh</string>
<string name="settings_import_use_same_password_for_outgoing_server">Cleachd an aon fhacal-faire dhan fhrithealaiche a-mach</string>
<string name="settings_import_server_name_format">Ainm an fhrithealaiche: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Sguireadh dhen ùghdarrachadh</string>
<string name="settings_import_oauth_sign_in_with_google">Clàraich a-steach le Google</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Dhfhàillig an t-ùghdarrachadh leis a mhearachd a leanas: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_pick_app_dialog_title">Ion-phortaich io aplacaid</string>
<string name="settings_import_authorization_and_password_required">Clàraich a-steach is cuir a-steach na faclan-faire</string>
<string name="settings_import_pick_document_button">Tagh faidhle</string>
<string name="settings_import_status_log_in_required">Feumaidh tu clàradh a-steach</string>
<string name="settings_import_later_button">Uaireigin eile</string>
<string name="settings_import_oauth_description">Feumaidh tu clàradh a-steach is cead-inntrigidh dhan phost-d agad a thoirt dhan aplacaid mus urrainn dhut an cunntas puist-d seo a chleachdadh.</string>
<string name="settings_import_app_version_not_supported">Chan eil taic ri tionndadh na h-aplacaid.</string>
<string name="settings_import_status_error">Dhfhàillig an t-ion-phortadh</string>
<string name="settings_import_oauth_error_oauth_not_supported">Chan eil an solaraiche seo a cur taic ri OAuth 2.0 aig an àm seo.</string>
<string name="settings_import_scan_qr_code_button">Sganaich an còd QR</string>
<string name="settings_import_pick_app_button">Ion-phortaich io aplacaid</string>
<string name="settings_import_password_required">Cuir a-steach na faclan-faire</string>
<string name="settings_import_authorization_required">Clàraich a-steach</string>
<string name="settings_import_read_failure">Cha b urrainn dhuinn faidhle nan roghainnean a leughadh</string>
<string name="settings_import_partial_failure">Cha b urrainn dhuinn cuid dhe na roghainnean ion-phortadh</string>
<string name="settings_import_status_success">Chaidh an ion-phortadh</string>
<string name="settings_import_status_password_required">Tha feum air facal-faire</string>
<string name="settings_import_status_not_imported">Cha deach ion-phortadh</string>
<string name="settings_import_incoming_server_password_hint">Facal-faire an fhrithealaiche a-steach</string>
<string name="settings_import_outgoing_server_password_hint">Facal-faire an fhrithealaiche a-mach</string>
<string name="settings_import_oauth_sign_in">Clàraich a-steach</string>
<string name="settings_import_oauth_error_browser_not_found">Cha dfhuair an aplacaid lorg air brabhsair sam bith a chleachadh e airson cead-inntrigidh dhan chunntas agad a thoirt seachad.</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Feumaidh tu facal-faire an fhrithealaiche a thoirt seachad mus urrainn dhut an cunntas “<xliff:g id="account">%s</xliff:g>” a chleachdadh.</item>
<item quantity="two">Feumaidh tu facal-faire an fhrithealaiche a thoirt seachad mus urrainn dhut an cunntas “<xliff:g id="account">%s</xliff:g>” a chleachdadh.</item>
<item quantity="few">Feumaidh tu facal-faire an fhrithealaiche a thoirt seachad mus urrainn dhut an cunntas “<xliff:g id="account">%s</xliff:g>” a chleachdadh.</item>
<item quantity="other">Feumaidh tu facal-faire an fhrithealaiche a thoirt seachad mus urrainn dhut an cunntas “<xliff:g id="account">%s</xliff:g>” a chleachdadh.</item>
</plurals>
</resources>

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importar axustes</string>
<string name="settings_import_pick_document_button">Seleccionar ficheiro</string>
<string name="settings_import_button">Importar</string>
<string name="settings_import_success_generic">Configuración importada con éxito</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Insira os contrasinais</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_failure">Ocorreu un erro ao importar a configuración</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_read_failure">Ocorreu un erro ao ler o ficheiro de configuracións</string>
<string name="settings_import_partial_failure">Ocorreu un erro ao importar algúns axustes</string>
<string name="settings_import_status_success">Importado con éxito</string>
<string name="settings_import_status_password_required">Requírese contrasinal</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_not_imported">Non importado</string>
<string name="settings_import_status_error">Erro da importación</string>
<string name="settings_import_later_button">Máis tarde</string>
<string name="settings_importing">Importando axustes…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Para poder usar a conta \"<xliff:g id="account">%s</xliff:g>\" cómpre proporcionar o contrasinal do servidor.</item>
<item quantity="other">Para poder usar a conta \"<xliff:g id="account">%s</xliff:g>\" cómpre proporcionar os contrasinais do servidor.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Contrasinal do servidor entrante</string>
<string name="settings_import_outgoing_server_password_hint">Contrasinal do servidor saínte</string>
<string name="settings_import_use_same_password_for_outgoing_server">Use o mesmo contrasinal para o servidor de saída</string>
<string name="settings_import_server_name_format">Nome do servidor: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_general_settings_item">Configuración Xeral</string>
<string name="settings_import_authorization_required">Inicie sesión</string>
<string name="settings_import_authorization_and_password_required">Inicie sesión e insira contrasinal</string>
<string name="settings_import_oauth_sign_in_with_google">Iniciar sesión con Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorización cancelada</string>
<string name="settings_import_status_log_in_required">Requírese inicio de sesión</string>
<string name="settings_import_oauth_description">Para usar esta conta de correo con K-9 Mail, é preciso iniciar sesión e permitirlle á app acceso aos correos.</string>
<string name="settings_import_oauth_sign_in">Iniciar sesión</string>
<string name="settings_import_oauth_error_oauth_flow_failed">A autorización fallou co seguinte erro: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 non é soportado actualmente con este provedor.</string>
<string name="settings_import_oauth_error_browser_not_found">A aplicación non puido atopar un navegador web para iniciar sesión na túa conta.</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">सेटिंग्स को आयात करें</string>
<string name="settings_import_pick_document_button">फ़ाईल पसंद करें</string>
<string name="settings_import_pick_app_dialog_title">ऐप से आयात करें</string>
<string name="settings_import_authorization_and_password_required">कृपया साइन इन करें और पासवर्ड दर्ज करें</string>
<string name="settings_import_partial_failure">कुछ सेटिंग आयात करने में विफल</string>
<string name="settings_import_server_name_format">सर्वर नाम: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_flow_canceled">प्राधिकरण रद्द कर दिया गया</string>
<string name="settings_import_pick_app_button">ऐप से आयात करें</string>
<string name="settings_import_status_error">आयात विफलता</string>
<string name="settings_import_incoming_server_password_hint">इनकमिंग सर्वर पासवर्ड</string>
<string name="settings_import_outgoing_server_password_hint">आउटगोइंग सर्वर पासवर्ड</string>
<string name="settings_import_general_settings_item">सामान्य सेटिंग्स</string>
<string name="settings_import_scan_qr_code_button">क्यू आर कोड स्कैन करें</string>
<string name="settings_import_button">आयात करें</string>
<string name="settings_import_success_generic">सेटिंग सफलतापूर्वक आयातित की गईं</string>
<string name="settings_import_password_required">कृपया पासवर्ड दर्ज करें</string>
<string name="settings_import_authorization_required">साइन इन करें</string>
<string name="settings_import_failure">सेटिंग आयात करने में विफल</string>
<string name="settings_import_read_failure">सेटिंग फ़ाइल पढ़ने में विफल</string>
<string name="settings_import_status_success">सफलतापूर्वक आयातित</string>
<string name="settings_import_status_password_required">पासवर्ड आवश्यक है</string>
<string name="settings_import_status_log_in_required">साइन इन आवश्यक</string>
<string name="settings_import_status_not_imported">आयातित नहीं</string>
<string name="settings_import_later_button">बाद में</string>
<string name="settings_importing">सेटिंग्स आयात की जा रही हैं…</string>
<string name="settings_import_use_same_password_for_outgoing_server">आउटगोइंग सर्वर के लिए समान पासवर्ड का उपयोग करें</string>
<string name="settings_import_oauth_sign_in">साइन इन करें</string>
<string name="settings_import_oauth_sign_in_with_google">गूगल से साइन इन करें</string>
<string name="settings_import_oauth_error_oauth_flow_failed">निम्न त्रुटि के साथ प्राधिकरण विफल हुआ: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">ओआथ 2.0 वर्तमान में इस प्रदाता के साथ समर्थित नहीं है।</string>
<string name="settings_import_oauth_error_browser_not_found">ऐप को आपके खाते तक पहुंच प्रदान करने के लिए कोई ब्राउज़र नहीं मिला।</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">\"<xliff:g id="account">%s</xliff:g>\" खाते का उपयोग करने के लिए आपको सर्वर पासवर्ड प्रदान करना होगा।</item>
<item quantity="other">\"<xliff:g id="account">%s</xliff:g>\" खाते का उपयोग करने के लिए आपको सर्वर पासवर्ड प्रदान करना होगा।</item>
</plurals>
<string name="settings_import_oauth_description">इस ईमेल खाते का उपयोग करने के लिए, आपको साइन इन करना होगा और ऐप को अपने ईमेल तक पहुंच प्रदान करनी होगी।</string>
<string name="settings_import_app_version_not_supported">ऐप्प संस्करण समर्थित नहीं है।</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Uvoz postavki</string>
<string name="settings_import_pick_document_button">Odaberi datoteku</string>
<string name="settings_import_button">Uvezi</string>
<string name="settings_import_success_generic">Postavke su uspješno uvezene</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Molimo unesite lozinke</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_failure">Uvoz postavki nije uspio</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_read_failure">Čitanje datoteke postavki nije uspjelo</string>
<string name="settings_import_partial_failure">Uvoz nekih postavki nije uspio</string>
<string name="settings_import_status_success">Uspješno uvezeno</string>
<string name="settings_import_status_password_required">Lozinka obavezna</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_not_imported">Nije uvezeno</string>
<string name="settings_import_status_error">Uvoz nije uspio</string>
<string name="settings_import_later_button">Kasnije</string>
<string name="settings_importing">Uvoz postavki…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Da biste mogli koristiti račun \"<xliff:g id="account">%s</xliff:g>\" trebate unijeti lozinku za poslužitelj.</item>
<item quantity="few">Da biste mogli koristiti račun\"<xliff:g id="account">%s</xliff:g>\" trebate unijeti lozinke za poslužitelj.</item>
<item quantity="other">Da biste mogli koristiti račun \"<xliff:g id="account">%s</xliff:g>\" trebate unijeti lozinke za poslužitelj.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Lozinka dolaznog poslužitelja</string>
<string name="settings_import_outgoing_server_password_hint">Lozinka odlaznog poslužitelja</string>
<string name="settings_import_use_same_password_for_outgoing_server">Koristi istu lozinku za odlazni poslužitelj</string>
<string name="settings_import_server_name_format">Naziv servera: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_general_settings_item">Opće postavke</string>
<string name="settings_import_oauth_sign_in">Prijavite se</string>
<string name="settings_import_pick_app_button">Uvezi iz aplikacije</string>
<string name="settings_import_status_log_in_required">Prijava je obavezna</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorizacija nije uspjela sa sljedećom pogreškom: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_authorization_required">Molimo Vas prijavite se</string>
<string name="settings_import_pick_app_dialog_title">Uvezi iz aplikacije</string>
<string name="settings_import_oauth_description">Za korištenje ovog računa e-pošte trebate se prijaviti i omogućiti aplikaciji pristup vašim emailovima.</string>
<string name="settings_import_oauth_sign_in_with_google">Prijavite se s Googleom</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorizacija poništena</string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 trenutačno nije podržan kod ovog pružatelja usluga e-pošte.</string>
<string name="settings_import_oauth_error_browser_not_found">Aplikacija nije mogla pronaći preglednik za davanje pristupa vašem računu.</string>
<string name="settings_import_scan_qr_code_button">Skeniraj QR kod</string>
<string name="settings_import_authorization_and_password_required">Molimo Vas prijavite se i unesite lozinke</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Beállítások importálása</string>
<string name="settings_import_pick_document_button">Fájl kiválasztása</string>
<string name="settings_import_button">Importálás</string>
<string name="settings_import_success_generic">A beállítások sikeresen importálva</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Adja meg a jelszavakat</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Jelentkezzen be</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Jelentkezzen be, és adja meg a jelszavakat</string>
<string name="settings_import_failure">Nem sikerült importálni a beállításokat</string>
<string name="settings_import_read_failure">Nem sikerült beolvasni a beállítási fájlt</string>
<string name="settings_import_partial_failure">Nem sikerült importálni néhány beállítást</string>
<string name="settings_import_status_success">Sikeresen importálva</string>
<string name="settings_import_status_password_required">Jelszó szükséges</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Bejelentkezés szükséges</string>
<string name="settings_import_status_not_imported">Nincs importálva</string>
<string name="settings_import_status_error">Importálási hiba</string>
<string name="settings_import_later_button">Később</string>
<string name="settings_importing">Beállítások importálása…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Ahhoz, hogy képes legyen használni a(z) „<xliff:g id="account">%s</xliff:g>” fiókot, meg kell adnia a kiszolgáló jelszavát.</item>
<item quantity="other">Ahhoz, hogy képes legyen használni a(z) „<xliff:g id="account">%s</xliff:g>” fiókot, meg kell adnia a kiszolgáló jelszavait.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Bejövő kiszolgáló jelszava</string>
<string name="settings_import_outgoing_server_password_hint">Kimenő kiszolgáló jelszava</string>
<string name="settings_import_use_same_password_for_outgoing_server">Ugyanazon jelszó használata a kimenő kiszolgálónál</string>
<string name="settings_import_server_name_format">Kiszolgáló neve: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Ezen e-mail-fiók használatához be kell jelentkeznie, és hozzáférést kell adnia az alkalmazásnak az e-mailjeihez.</string>
<string name="settings_import_oauth_sign_in">Bejelentkezés</string>
<string name="settings_import_oauth_sign_in_with_google">Bejelentkezés Google használatával</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">A jogosultság-ellenőrzés megszakítva</string>
<string name="settings_import_oauth_error_oauth_flow_failed">A jogosultság-ellenőrzés a következő hibával sikertelen: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">Az OAuth 2.0 jelenleg nem támogatott ezzel a szolgáltatóval.</string>
<string name="settings_import_oauth_error_browser_not_found">Az alkalmazás nem talált böngészőt a fiókhoz történő hozzáférés megadásához való használathoz.</string>
<string name="settings_import_general_settings_item">Általános beállítások</string>
<string name="settings_import_pick_app_button">Importálás alkalmazásból</string>
<string name="settings_import_pick_app_dialog_title">Importálás alkalmazásból</string>
<string name="settings_import_scan_qr_code_button">QR-kód beolvasása</string>
<string name="settings_import_app_version_not_supported">Nem támogatott alkalmazásverzió.</string>
</resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!--Might be displayed in the message list widget when the list is scrolled and new data can't be fetched fast enough-->
<string name="settings_import_general_settings_item">Ընդհանուր կարգաւորումներ</string>
</resources>

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Impor pengaturan</string>
<string name="settings_import_pick_document_button">Pilih berkas</string>
<string name="settings_import_button">Impor</string>
<string name="settings_import_success_generic">Pengaturan berhasil diimpor</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Silakan masukkan kata sandi</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_failure">Gagal mengimpor pengaturan</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_read_failure">Gagal membaca berkas pengaturan</string>
<string name="settings_import_partial_failure">Ada pengaturan yang gagal diimpor</string>
<string name="settings_import_status_success">Berhasil diimpor</string>
<string name="settings_import_status_password_required">Kata sandi diperlukan</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_not_imported">Tidak diimpor</string>
<string name="settings_import_status_error">Pengimporan gagal</string>
<string name="settings_import_later_button">Nanti</string>
<string name="settings_importing">Mengimpor pengaturan…</string>
<plurals name="settings_import_password_prompt">
<item quantity="other">Agar dapat menggunakan akun \"<xliff:g id="account">%s</xliff:g>\", Anda perlu memberikan kata sandi peladen.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Kata sandi peladen yang masuk</string>
<string name="settings_import_outgoing_server_password_hint">Kata sandi peladen yang keluar</string>
<string name="settings_import_use_same_password_for_outgoing_server">Gunakan kata sandi yang sama untuk peladen yang keluar</string>
<string name="settings_import_server_name_format">Nama peladen: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_general_settings_item">Pengaturan umum</string>
<string name="settings_import_authorization_required">Silakan masuk</string>
<string name="settings_import_authorization_and_password_required">Silakan masuk dan masukkan kata sandi</string>
<string name="settings_import_status_log_in_required">Proses masuk diperlukan</string>
<string name="settings_import_oauth_description">Agar dapat menggunakan akun surel ini, Anda perlu masuk dan memberikan akses aplikasi ke surel Anda.</string>
<string name="settings_import_oauth_sign_in">Masuk</string>
<string name="settings_import_oauth_sign_in_with_google">Masuk dengan Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Otorisasi dibatalkan</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Otorisasi gagal dengan galat sebagai berikut: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 saat ini tidak didukung oleh penyedia ini.</string>
<string name="settings_import_oauth_error_browser_not_found">Aplikasi ini tidak dapat menemukan peramban yang bisa digunakan untuk memberikan akses ke akun Anda.</string>
<string name="settings_import_pick_app_dialog_title">Impor dari aplikasi</string>
<string name="settings_import_pick_app_button">Impor dari aplikasi</string>
<string name="settings_import_scan_qr_code_button">Pindai kode Respons Cepat (QR)</string>
<string name="settings_import_app_version_not_supported">Versi ini tidak didukung.</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Flytja inn stillingar</string>
<string name="settings_import_pick_document_button">Velja skrá</string>
<string name="settings_import_button">Flytja inn</string>
<string name="settings_import_success_generic">Tókst að flytja inn stillingar</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required"> Settu inn lykilorðin</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Skráðu þig inn</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required"> Skráðu þig inn og settu inn lykilorð</string>
<string name="settings_import_failure">Mistókst að flytja inn stillingar</string>
<string name="settings_import_read_failure">Mistókst að lesa stillingaskrá</string>
<string name="settings_import_partial_failure">Mistókst að flytja inn sumar stillingar</string>
<string name="settings_import_status_success">Innflutningur tókst</string>
<string name="settings_import_status_password_required">Lykilorðs er krafist</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Innskráningar krafist</string>
<string name="settings_import_status_not_imported">Ekki flutt inn</string>
<string name="settings_import_status_error">Innflutningur mistókst</string>
<string name="settings_import_later_button">Síðar</string>
<string name="settings_importing">Flytja inn stillingar…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Til að geta notað aðganginn \"<xliff:g id="account">%s</xliff:g>\" verður þú að gefa upp lykilorðið á þjóninum.</item>
<item quantity="other">Til að geta notað aðganginn \"<xliff:g id="account">%s</xliff:g>\" verður þú að gefa upp lykilorðin á þjóninum.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Lykilorð móttöku-póstþjóns</string>
<string name="settings_import_outgoing_server_password_hint">Lykilorð sendinga-póstþjóns</string>
<string name="settings_import_use_same_password_for_outgoing_server">Nota sama lykilorð fyrir sendinga-póstþjóninn</string>
<string name="settings_import_server_name_format">Heiti póstþjóns: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Til að nota þennan tölvupóstaðgang, þarftu að skrá þig inn og veita forritinu heimild inn á tölvupóstinn þinn.</string>
<string name="settings_import_oauth_sign_in">Skrá inn</string>
<string name="settings_import_oauth_sign_in_with_google">Skrá inn með Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Hætt við auðkenningu</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Auðkenning mistókst með eftirfarandi villuboðum: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 er ekki stutt í augnablikinu hjá þessari þjónustuveitu.</string>
<string name="settings_import_oauth_error_browser_not_found">Forritið fann engan vafra til að nota til að fá aðgang að notandaaðgangnum þinum.</string>
<string name="settings_import_general_settings_item">Almennar stillingar</string>
<string name="settings_import_pick_app_button">Flytja inn úr forriti</string>
<string name="settings_import_app_version_not_supported">Útgáfa forrits ekki studd.</string>
<string name="settings_import_scan_qr_code_button">Skannaðu QR-kóða</string>
<string name="settings_import_pick_app_dialog_title">Flytja inn úr forriti</string>
</resources>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importa impostazioni</string>
<string name="settings_import_pick_document_button">Seleziona file</string>
<string name="settings_import_button">Importa</string>
<string name="settings_import_success_generic">Impostazioni importate correttamente</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Inserisci le password</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Accedi</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Accedi e inserisci le password</string>
<string name="settings_import_failure">Importazione impostazioni non riuscita</string>
<string name="settings_import_read_failure">Lettura file impostazioni non riuscita</string>
<string name="settings_import_partial_failure">Importazione di alcune impostazioni non riuscita</string>
<string name="settings_import_status_success">Importazione completata correttamente</string>
<string name="settings_import_status_password_required">Password richiesta</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Accesso richiesto</string>
<string name="settings_import_status_not_imported">Non importate</string>
<string name="settings_import_status_error">Importazione non riuscita</string>
<string name="settings_import_later_button">Più tardi</string>
<string name="settings_importing">Importazione impostazioni…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Per poter utilizzare l\'account \"<xliff:g id="account">%s</xliff:g>\" devi fornire la password del server.</item>
<item quantity="many">Per poter utilizzare l\'account \"<xliff:g id="account">%s</xliff:g>\" devi fornire le password del server.</item>
<item quantity="other">Per poter utilizzare l\'account \"<xliff:g id="account">%s</xliff:g>\" devi fornire le password del server.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Password server in arrivo</string>
<string name="settings_import_outgoing_server_password_hint">Password server in uscita</string>
<string name="settings_import_use_same_password_for_outgoing_server">Usa stessa password per server in uscita</string>
<string name="settings_import_server_name_format">Nome server: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Per poter usare questo account email, devi accedere e autorizzare l\'accesso dell\'applicazione alla tua posta.</string>
<string name="settings_import_oauth_sign_in">Accedi</string>
<string name="settings_import_oauth_sign_in_with_google">Accedi con Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorizzazione annullata</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorizzazione non riuscita con il seguente errore: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 non è supportato da questo provider di posta.</string>
<string name="settings_import_oauth_error_browser_not_found">L\' applicazione non trova un browser per richiedere l\'accesso al tuo account.</string>
<string name="settings_import_general_settings_item">Impostazioni generali</string>
<string name="settings_import_pick_app_button">Importa dall\'applicazione</string>
<string name="settings_import_pick_app_dialog_title">Importa dall\'applicazione</string>
<string name="settings_import_scan_qr_code_button">Scansiona il QRcode</string>
<string name="settings_import_app_version_not_supported">Versione dell\'app non supportata</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">יבא הגדרות</string>
<string name="settings_import_pick_document_button">בחר קובץ</string>
<string name="settings_import_button">יבא</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_later_button">מאוחר יותר</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_importing">מייבא הגדרות…</string>
<!--Might be displayed in the message list widget when the list is scrolled and new data can't be fetched fast enough-->
<string name="settings_import_general_settings_item">הגדרות כלליות</string>
<string name="settings_import_success_generic">הגדרות יובאו בהצלחה</string>
<string name="settings_import_password_required">נא להכניס סיסמאות</string>
<string name="settings_import_authorization_required">נא להתחבר</string>
<string name="settings_import_failure">יבוא הגדרות נכשל</string>
<string name="settings_import_read_failure">קריאת קובץ הגדרות נכשלה</string>
<string name="settings_import_partial_failure">יבוא חלק מההגדרות נכשל</string>
<string name="settings_import_status_success">יובא בהצלחה</string>
<string name="settings_import_status_password_required">דרושה סיסמה</string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 כרגע לא נתמך עם הספק הזה.</string>
<string name="settings_import_authorization_and_password_required">נא להתחבר ולהכניס סיסמאות</string>
<string name="settings_import_oauth_error_browser_not_found">היישומון לא הצליח למצוא דפדפן להשתמש בו על מנת לתת גישה לחשבון שלך.</string>
<string name="settings_import_status_log_in_required">דרושה התחברות</string>
<string name="settings_import_outgoing_server_password_hint">סיסמת שרת יוצא</string>
<string name="settings_import_use_same_password_for_outgoing_server">השתמש באותה סיסמה לשרת יוצא</string>
<string name="settings_import_oauth_description">כדי להשתמש בחשבון הדוא\"ל הזה, יש צורך להתחבר ולתת ליישומון גישה לדוא\"ל שלך.</string>
<string name="settings_import_oauth_sign_in">התחבר</string>
<string name="settings_import_oauth_error_oauth_flow_failed">תהליך האישור נכשל עם השגיאה שלהלן: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_status_not_imported">לא יובא</string>
<string name="settings_import_status_error">יבוא נכשל</string>
<string name="settings_import_incoming_server_password_hint">סיסמת שרת נכנס</string>
<string name="settings_import_server_name_format">שם שרת: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_sign_in_with_google">התחבר עם Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">תהליך האישור בוטל</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">על מנת להשתמש בחשבון \"<xliff:g id="account">%s</xliff:g>\" עליך לספק את סיסמת השרת.</item>
<item quantity="two">על מנת להשתמש בחשבונות \"<xliff:g id="account">%s</xliff:g>\" עליך לספק את סיסמאות השרת.</item>
<item quantity="other">על מנת להשתמש בחשבונות \"<xliff:g id="account">%s</xliff:g>\" עליך לספק את סיסמאות השרת.</item>
</plurals>
<string name="settings_import_pick_app_button">ייבא מיישום</string>
<string name="settings_import_pick_app_dialog_title">ייבא מיישום</string>
<string name="settings_import_scan_qr_code_button">סרוק ברקוד QR</string>
<string name="settings_import_app_version_not_supported">גירסאת האפליקציה לא נתמכת.</string>
</resources>

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">設定をインポート</string>
<string name="settings_import_pick_document_button">ファイルを選択</string>
<string name="settings_import_button">インポート</string>
<string name="settings_import_success_generic">設定を正常にインポートしました</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">パスワードを入力してください</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">ログインしてください</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">ログインしてパスワードを入力してください</string>
<string name="settings_import_failure">設定のインポートに失敗しました</string>
<string name="settings_import_read_failure">設定ファイルの読み込みに失敗しました</string>
<string name="settings_import_partial_failure">一部の設定のインポートに失敗しました</string>
<string name="settings_import_status_success">正常にインポートしました</string>
<string name="settings_import_status_password_required">パスワードが必要です</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">ログインが必要です</string>
<string name="settings_import_status_not_imported">インポートされませんでした</string>
<string name="settings_import_status_error">インポート失敗</string>
<string name="settings_import_later_button">後で</string>
<string name="settings_importing">設定をインポート中…</string>
<plurals name="settings_import_password_prompt">
<item quantity="other">アカウント \"<xliff:g id="account">%s</xliff:g>\" を使用できるようにするには、サーバーのパスワードを入力する必要があります。</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">受信サーバーのパスワード</string>
<string name="settings_import_outgoing_server_password_hint">送信サーバーのパスワード</string>
<string name="settings_import_use_same_password_for_outgoing_server">送信サーバーに同じパスワードを使用する</string>
<string name="settings_import_server_name_format">サーバー名: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">このメールアカウントを使用するには、ログインしてアプリにメールへのアクセスを許可する必要があります。</string>
<string name="settings_import_oauth_sign_in">ログイン</string>
<string name="settings_import_oauth_sign_in_with_google">Google でログイン</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">認証がキャンセルされました</string>
<string name="settings_import_oauth_error_oauth_flow_failed">以下のエラーにより認証に失敗しました: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">現在、このプロバイダーは OAuth 2.0 に対応していません。</string>
<string name="settings_import_oauth_error_browser_not_found">アカウントへのアクセス権付与に必要なブラウザーアプリが見つかりませんでした。</string>
<string name="settings_import_general_settings_item">一般設定</string>
<string name="settings_import_pick_app_button">アプリからインポート</string>
<string name="settings_import_pick_app_dialog_title">アプリからインポート</string>
<string name="settings_import_scan_qr_code_button">QR コードをスキャン</string>
<string name="settings_import_app_version_not_supported">対応していないバージョンのアプリです。</string>
</resources>

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">პარამეტრების იმპორტირება</string>
<string name="settings_import_button">იმპორტი</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_importing">პარამეტრების იმპორტირება…</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<plurals name="settings_import_password_prompt">
<item quantity="one">ანგარიშის „<xliff:g id="account">%s</xliff:g>“ გამოსაყენებლად, საჭიროა სერვერის პაროლის მითითება.</item>
<item quantity="other">ანგარიშის „<xliff:g id="account">%s</xliff:g>“ გამოსაყენებლად, საჭიროა სერვერის პაროლის მითითება.</item>
</plurals>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_incoming_server_password_hint">შემავალი სერვერის პაროლი</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_outgoing_server_password_hint">გამავალი სერვერის პაროლი</string>
<string name="settings_import_use_same_password_for_outgoing_server">იმავე პაროლის გამოყენება გამავალი სერვერისთვის</string>
<string name="settings_import_server_name_format">სერვერის სახელი: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_general_settings_item">ზოგადი პარამეტრები</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_import_title">Баптауларды импорттау</string>
<string name="settings_import_pick_document_button">Файлды таңдау</string>
<string name="settings_import_scan_qr_code_button">QR кодын сканерлеу</string>
<string name="settings_import_button">Импорттау</string>
</resources>

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">설정 가져오기</string>
<string name="settings_import_button">가져오기</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_importing">설정 가져오는 중…</string>
<string name="settings_import_general_settings_item">일반 설정</string>
<string name="settings_import_password_required">비밀번호를 입력하세요</string>
<string name="settings_import_failure">설정을 가져오지 못했습니다</string>
<string name="settings_import_read_failure">설정 파일을 읽지 못했습니다</string>
<string name="settings_import_partial_failure">일부 설정을 가져오지 못했습니다</string>
<string name="settings_import_status_success">성공적으로 가져왔습니다</string>
<string name="settings_import_use_same_password_for_outgoing_server">발신 서버에 동일한 비밀번호 사용하기</string>
<string name="settings_import_server_name_format">서버 이름: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">이 이메일 계정을 사용하려면 로그인하고 앱에 액세스 권한을 부여해야 합니다.</string>
<string name="settings_import_oauth_sign_in">로그인</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">인증 취소됨</string>
<string name="settings_import_pick_document_button">파일 선택</string>
<string name="settings_import_success_generic">설정을 성공적으로 가져왔습니다</string>
<string name="settings_import_status_error">가져오기 실패</string>
<string name="settings_import_outgoing_server_password_hint">발신 서버 비밀번호</string>
<string name="settings_import_incoming_server_password_hint">수신 서버 비밀번호</string>
<string name="settings_import_oauth_sign_in_with_google">Google로 로그인</string>
<string name="settings_import_oauth_error_oauth_flow_failed">다음 오류로 인증에 실패했습니다: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_status_password_required">비밀번호 필요함</string>
<string name="settings_import_later_button">나중에</string>
<string name="settings_import_oauth_error_oauth_not_supported">현재 이 제공자에서는 OAuth 2.0이 지원되지 않습니다.</string>
<string name="settings_import_status_log_in_required">로그인 필요함</string>
<string name="settings_import_oauth_error_browser_not_found">계정에 대한 액세스 권한을 부여하는 데 사용할 브라우저를 찾을 수 없습니다.</string>
<string name="settings_import_authorization_and_password_required">로그인 후 비밀번호를 입력하십시오.</string>
<string name="settings_import_authorization_required">로그인이 필요합니다.</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importuoti nustatymus</string>
<string name="settings_import_pick_document_button">Pasirinkti failą</string>
<string name="settings_import_button">Importuoti</string>
<string name="settings_import_success_generic">Nustatymai sėkmingai importuoti</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Prašome įvesti slaptažodžius</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Prašome prisijungti</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Prašome prisijungti ir įvesti slaptažodžius</string>
<string name="settings_import_failure">Nepavyko importuoti nustatymų</string>
<string name="settings_import_read_failure">Nepavyko nuskaityti nustatymų failo</string>
<string name="settings_import_partial_failure">Nepavyko importuoti kai kurių nustatymų</string>
<string name="settings_import_status_success">Sėkmingai importuota</string>
<string name="settings_import_status_password_required">Būtinas slaptažodis</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Reikalingas prisijungimas</string>
<string name="settings_import_status_not_imported">Neimportuota</string>
<string name="settings_import_status_error">Importo sutrikimas</string>
<string name="settings_import_later_button">Vėliau</string>
<string name="settings_importing">Importuojami nustatymai…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Kad galėtumėte naudotis paskyra \"<xliff:g id="account">%s</xliff:g>\", turite nurodyti serverio slaptažodį.</item>
<item quantity="few">Kad galėtumėte naudotis paskyra \"<xliff:g id="account">%s</xliff:g>\", turite nurodyti serverio slaptažodžius.</item>
<item quantity="many">Kad galėtumėte naudotis paskyra \"<xliff:g id="account">%s</xliff:g>\", turite nurodyti serverio slaptažodžius.</item>
<item quantity="other">Kad galėtumėte naudotis paskyra \"<xliff:g id="account">%s</xliff:g>\", turite nurodyti serverio slaptažodžius.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Gaunamo serverio slaptažodis</string>
<string name="settings_import_outgoing_server_password_hint">Siunčiamo serverio slaptažodis</string>
<string name="settings_import_use_same_password_for_outgoing_server">Naudoti tą patį slaptažodį siunčiamajame serveryje</string>
<string name="settings_import_server_name_format">Serverio pavadinimas: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Norėdami naudoti šią el. pašto paskyrą su K-9 Mail, turite prisijungti ir suteikti programėlei prieigą prie savo el. laiškų.</string>
<string name="settings_import_oauth_sign_in">Prisijungti</string>
<string name="settings_import_oauth_sign_in_with_google">Prisijungti su Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Leidimas atšauktas</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorizavimas nepavyko su šia klaida: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">Šiuo metu šis teikėjas nepalaiko OAuth 2.0.</string>
<string name="settings_import_oauth_error_browser_not_found">Programai nepavyko rasti naršyklės, kurią naudoti suteikiant prieigą prie paskyros.</string>
<string name="settings_import_general_settings_item">Bendri nustatymai</string>
<string name="settings_import_pick_app_button">Importuoti iš programos</string>
<string name="settings_import_scan_qr_code_button">Skenuoti QR kodą</string>
</resources>

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importēt K-9 iestatījumus</string>
<string name="settings_import_pick_document_button">Izvēlēties failu</string>
<string name="settings_import_button">Importēt</string>
<string name="settings_import_success_generic">Iestatījumi veiksmīgi importēti</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Lūdzu ievadiet paroles</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Lūdzu, ierakstieties!</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Lūdzu, ierakstieties un ievadiet paroles!</string>
<string name="settings_import_failure">Neizdevās importēt iestatījumus</string>
<string name="settings_import_read_failure">Neizdevās nolasīt iestatījumu failu</string>
<string name="settings_import_partial_failure">Neizdevās importēt dažus iestatījumus</string>
<string name="settings_import_status_success">Imports veiksmīgs</string>
<string name="settings_import_status_password_required">Nepieciešama parole</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Nepieciešams ierakstīties</string>
<string name="settings_import_status_not_imported">Nav importēts</string>
<string name="settings_import_status_error">Imports neizdevās</string>
<string name="settings_import_later_button">Vēlāk</string>
<string name="settings_importing">Importē iestatījumus…</string>
<plurals name="settings_import_password_prompt">
<item quantity="zero">Lai lietotu kontu \"<xliff:g id="account">%s</xliff:g>\", jāievada servera parole.</item>
<item quantity="one">Lai lietotu kontu \"<xliff:g id="account">%s</xliff:g>\", jāievada servera parole.</item>
<item quantity="other">Lai lietotu kontu \"<xliff:g id="account">%s</xliff:g>\", jāievada servera paroles.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Ienākošā servera parole</string>
<string name="settings_import_outgoing_server_password_hint">Izejošā servera parole</string>
<string name="settings_import_use_same_password_for_outgoing_server">Izmantot to pašu paroli izejošajam serverim</string>
<string name="settings_import_server_name_format">Servera nosaukums: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Lai K-9 programmā lietotu šo e-pasta kontu, Jums jāierakstās un jādod atļauja K-9 piekļūt e-pastiem.</string>
<string name="settings_import_oauth_sign_in">Ierakstīties</string>
<string name="settings_import_oauth_sign_in_with_google">Ierakstīties ar Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorizācija atcelta</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorizācija atcelta šādas kļūdas dēļ: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">Šis epasta pakalpojumu sniedzējs OAuth 2.0 nenodrošina.</string>
<string name="settings_import_oauth_error_browser_not_found">Lietotnei neizdevās atrast pārlūku, lai ar tā starpniecību iegūtu piekļuvi Jūsu kontam.</string>
<string name="settings_import_general_settings_item">Vispārējie iestatījumi</string>
</resources>

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">ക്രമീകരണങ്ങൾ ഇംപോർട്ട് ചെയ്യുക</string>
<string name="settings_import_pick_document_button">ഫയൽ തിരഞ്ഞെടുക്കുക</string>
<string name="settings_import_button">ഇംപോർട്ട്</string>
<string name="settings_import_success_generic">ക്രമീകരണങ്ങൾ വിജയകരമായി ഇംപോർട്ട് ചെയ്തു</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">ദയവായി രഹസ്യവാക്കുകൾ നൽകുക</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_failure">ക്രമീകരണങ്ങൾ ഇംപോർട്ടുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_read_failure">ക്രമീകരണ ഫയൽ വായിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="settings_import_partial_failure">ചില ക്രമീകരണങ്ങൾ ഇംപോർട്ട് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="settings_import_status_success">വിജയകരമായി ഇംപോർട്ട് ചെയ്തു</string>
<string name="settings_import_status_password_required">രഹസ്യവാചകം ആവശ്യമാണ്</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_not_imported">ഇംപോർട്ട് ചെയ്തിട്ടില്ല</string>
<string name="settings_import_status_error">ഇംപോർട്ട് തകരാർ</string>
<string name="settings_import_later_button">പിന്നീട്</string>
<string name="settings_importing">ക്രമീകരണങ്ങൾ ഇംപോർട്ട് ചെയ്യുന്നു…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">\"<xliff:g id="account">%s</xliff:g>\" അക്കൗണ്ട് ഉപയോഗിക്കാൻ നിങ്ങൾ സെർവർ രഹസ്യവാചകം നൽകേണ്ടതുണ്ട്.</item>
<item quantity="other">\"<xliff:g id="account">%s</xliff:g>\" അക്കൗണ്ട് ഉപയോഗിക്കാൻ നിങ്ങൾ സെർവർ രഹസ്യവാചകങ്ങൾ നൽകേണ്ടതുണ്ട്.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">ഇൻകമിംഗ് സെർവർ രഹസ്യവാചകം</string>
<string name="settings_import_outgoing_server_password_hint">ഔട്ട്‌ഗോയിംഗ് സെർവർ രഹസ്യവാചകം</string>
<string name="settings_import_use_same_password_for_outgoing_server">ഔട്ട്‌ഗോയിംഗ് സെർവറിനായി സമാന രഹസ്യവാചകം ഉപയോഗിക്കുക</string>
<string name="settings_import_server_name_format">സെർവർ നാമം: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_general_settings_item">പൊതുവായ ക്രമീകരണങ്ങൾ</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importer innstillinger</string>
<string name="settings_import_pick_document_button">Velg fil</string>
<string name="settings_import_button">Importér</string>
<string name="settings_import_success_generic">Innstillinger korrekt importert</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Vennligst skriv inn passord</string>
<string name="settings_import_authorization_required">Logg inn</string>
<string name="settings_import_authorization_and_password_required">Logg inn og skriv inn passord</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_failure">Import av innstillinger mislyktes</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_read_failure">Klarte ikke avlese innstillingsfil</string>
<string name="settings_import_partial_failure">Klarte ikke importere noen innstillinger</string>
<string name="settings_import_status_success">Importert korrekt</string>
<string name="settings_import_status_password_required">Passord påkreves</string>
<string name="settings_import_status_log_in_required">Innlogging påkreves</string>
<string name="settings_import_status_not_imported">Ikke importert</string>
<string name="settings_import_status_error">Feil ved importering</string>
<string name="settings_import_later_button">Senere</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_importing">Importerer innstillinger …</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">For å bruke <xliff:g id="account">%s</xliff:g>-kontoen må du angi tjenerpassordet.</item>
<item quantity="other">For å bruke <xliff:g id="account">%s</xliff:g>-kontoen må du angi tjenerpassordene.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Passord for innkommende tjener</string>
<string name="settings_import_outgoing_server_password_hint">Passord for utgående tjener</string>
<string name="settings_import_use_same_password_for_outgoing_server">Bruk samme passord for utgående tjener</string>
<string name="settings_import_server_name_format">Tjenernavn: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Logg inn og gi programmet tilgang til e-postene dine for å bruke denne e-postkontoen.</string>
<string name="settings_import_oauth_sign_in">Logg inn</string>
<string name="settings_import_oauth_sign_in_with_google">Logg inn med Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorisering avbrutt</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorisering mislyktes med følgende feil: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 støttes ikke med denne tilbyderen.</string>
<string name="settings_import_oauth_error_browser_not_found">Kunne ikke finne nettleser å bruke for å innvilge tilgang til kontoen din.</string>
<string name="settings_import_general_settings_item">Generelle innstillinger</string>
<string name="settings_import_pick_app_button">Importér fra app</string>
<string name="settings_import_pick_app_dialog_title">Importér fra app</string>
<string name="settings_import_scan_qr_code_button">Skann QR-kode</string>
<string name="settings_import_app_version_not_supported">Appversjonen støttes ikke.</string>
</resources>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Instellingen importeren</string>
<string name="settings_import_pick_document_button">Bestand selecteren</string>
<string name="settings_import_button">Importeren</string>
<string name="settings_import_success_generic">Instellingen met succes geïmporteerd</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Voer de wachtwoorden in</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Aanmelden</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Meld u aan en voer de wachtwoorden in</string>
<string name="settings_import_failure">Instellingen importeren mislukt</string>
<string name="settings_import_read_failure">Lezen van instellingenbestand mislukt</string>
<string name="settings_import_partial_failure">Importeren van sommige instellingen mislukt</string>
<string name="settings_import_status_success">Met succes geïmporteerd</string>
<string name="settings_import_status_password_required">Wachtwoord vereist</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Aanmelden vereist</string>
<string name="settings_import_status_not_imported">Niet geïmporteerd</string>
<string name="settings_import_status_error">Importeren mislukt</string>
<string name="settings_import_later_button">Later</string>
<string name="settings_importing">Instellingen importeren…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Om de account <xliff:g id="account">%s</xliff:g> te gebruiken moet u het wachtwoord van de server opgeven.</item>
<item quantity="other">Om de account <xliff:g id="account">%s</xliff:g> te gebruiken moet u de wachtwoorden van de server opgeven.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Wachtwoord inkomende server</string>
<string name="settings_import_outgoing_server_password_hint">Wachtwoord uitgaande server</string>
<string name="settings_import_use_same_password_for_outgoing_server">Gebruik hetzelfde wachtwoord voor de uitgaande server</string>
<string name="settings_import_server_name_format">Servernaam: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Om deze e-mailaccount te gebruiken, moet u aanmelden om de app toegang te geven tot uw e-mailberichten.</string>
<string name="settings_import_oauth_sign_in">Aanmelden</string>
<string name="settings_import_oauth_sign_in_with_google">Aanmelden met Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorisatie geannuleerd</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorisatie is mislukt met de volgende foutmelding: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 wordt momenteel niet ondersteund door deze provider.</string>
<string name="settings_import_oauth_error_browser_not_found">Deze app kan geen browser vinden. Een browser is nodig om toegang te krijgen tot uw account.</string>
<string name="settings_import_general_settings_item">Algemene instellingen</string>
<string name="settings_import_pick_app_button">Importeren vanuit app</string>
<string name="settings_import_pick_app_dialog_title">Importeren vanuit app</string>
<string name="settings_import_scan_qr_code_button">QR-code scannen</string>
<string name="settings_import_app_version_not_supported">App-versie niet ondersteund.</string>
</resources>

View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importer innstillingar</string>
<string name="settings_import_button">Importer</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_importing">Importerer innstillingar …</string>
<string name="settings_import_general_settings_item">Generelle innstilingar</string>
<string name="settings_import_pick_document_button">Vel fil</string>
<string name="settings_import_scan_qr_code_button">Skann QR-kode</string>
<string name="settings_import_use_same_password_for_outgoing_server">Bruk same passord for utgåande tenar</string>
<string name="settings_import_outgoing_server_password_hint">Utgåande tenar-passord</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorisering mislukka med følgjande feil: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_success_generic">Vellykka import av innstillingar</string>
<string name="settings_import_pick_app_button">Importer frå app</string>
<string name="settings_import_pick_app_dialog_title">Importer frå app</string>
<string name="settings_import_authorization_required">Ver vennleg og logg inn</string>
<string name="settings_import_authorization_and_password_required">Logg inn, og fyll inn passord</string>
<string name="settings_import_status_success">Vellukka import</string>
<string name="settings_import_later_button">Seinare</string>
<string name="settings_import_server_name_format">Servernamn: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_sign_in">Logg inn</string>
<string name="settings_import_oauth_sign_in_with_google">Logg inn med Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorisering kansellert</string>
<string name="settings_import_oauth_error_browser_not_found">Appen kunne ikkje finne ein nettlesar for å gje tilgjenge til kontoen din.</string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 er ikkje støtta med denne tilbydaren enno.</string>
<string name="settings_import_password_required">Ver vennleg og skriv inn passord</string>
<string name="settings_import_failure">Importering av innstillingar feila</string>
<string name="settings_import_read_failure">Kunne ikkje lese innstillingsfil</string>
<string name="settings_import_partial_failure">Kunne ikkje importere nokre innstillingar</string>
<string name="settings_import_status_password_required">Passord påkravd</string>
<string name="settings_import_status_log_in_required">Innlogging påkravd</string>
<string name="settings_import_status_not_imported">Ikkje importert</string>
<string name="settings_import_status_error">Feil under import</string>
<string name="settings_import_incoming_server_password_hint">Innkommande tenar-passord</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">For å vere i stand til å bruke kontoen \"<xliff:g id="account">%s</xliff:g>\" må du angje tenar-passordet.</item>
<item quantity="other">For å vere i stand til å bruke kontoen \"<xliff:g id="account">%s</xliff:g>\" må du angje tenar-passorda.</item>
</plurals>
<string name="settings_import_oauth_description">For å bruke denne e-postkontoen, må du logge inn, og gje tilgjenge til e-postane dine.</string>
<string name="settings_import_app_version_not_supported">App-versjon er ikkje støtta.</string>
</resources>

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importuj ustawienia</string>
<string name="settings_import_pick_document_button">Wybierz plik</string>
<string name="settings_import_button">Importuj</string>
<string name="settings_import_success_generic">Ustawienia zostały zaimportowane</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Proszę podać hasła</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Zaloguj się</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Zaloguj się i podaj hasła</string>
<string name="settings_import_failure">Import ustawień się nie powiódł</string>
<string name="settings_import_read_failure">Odczyt pliku ustawień się nie powiódł</string>
<string name="settings_import_partial_failure">Import niektórych ustawień się nie powiódł</string>
<string name="settings_import_status_success">Zaimportowano z powodzeniem</string>
<string name="settings_import_status_password_required">Hasło wymagane</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Wymagane jest zalogowanie się</string>
<string name="settings_import_status_not_imported">Niezaimportowane</string>
<string name="settings_import_status_error">Import zakończony niepowodzeniem</string>
<string name="settings_import_later_button">Później</string>
<string name="settings_importing">Importowanie ustawień…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Aby móc skorzystać z konta „<xliff:g id="account">%s</xliff:g>”, trzeba podać hasło.</item>
<item quantity="few">Aby móc skorzystać z konta „<xliff:g id="account">%s</xliff:g>”, trzeba podać hasła.</item>
<item quantity="many">Aby móc skorzystać z konta „<xliff:g id="account">%s</xliff:g>”, trzeba podać hasła.</item>
<item quantity="other">Aby móc skorzystać z konta „<xliff:g id="account">%s</xliff:g>”, trzeba podać hasła.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Hasło serwera poczty przychodzącej</string>
<string name="settings_import_outgoing_server_password_hint">Hasło serwera poczty wychodzącej</string>
<string name="settings_import_use_same_password_for_outgoing_server">Użyj tego samego hasła dla serwera poczty wychodzącej</string>
<string name="settings_import_server_name_format">Nazwa serwera: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Aby używać tego konta e-mail, musisz się zalogować i przyznać aplikacji dostęp do swoich e-maili.</string>
<string name="settings_import_oauth_sign_in">Zaloguj się</string>
<string name="settings_import_oauth_sign_in_with_google">Zaloguj się przez Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autoryzacja anulowana</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autoryzacja nie powiodła się z powodu następującego błędu: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">Ten dostawca nie obsługuje obecnie protokołu OAuth 2.0.</string>
<string name="settings_import_oauth_error_browser_not_found">Aplikacja nie mogła znaleźć przeglądarki, za pomocą której można uzyskać dostęp do Twojego konta.</string>
<string name="settings_import_general_settings_item">Ustawienia ogólne</string>
<string name="settings_import_pick_app_button">Importuj z aplikacji</string>
<string name="settings_import_pick_app_dialog_title">Importuj z aplikacji</string>
<string name="settings_import_scan_qr_code_button">Zeskanuj kod QR</string>
<string name="settings_import_app_version_not_supported">Wersja aplikacji nie jest obsługiwana.</string>
</resources>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importar configurações</string>
<string name="settings_import_pick_document_button">Selecionar arquivo</string>
<string name="settings_import_button">Importar</string>
<string name="settings_import_success_generic">As configurações foram importadas com sucesso</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Por favor, digite as senhas</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Por favor, faça sua autenticação</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Por favor, faça sua autenticação e digite as senha</string>
<string name="settings_import_failure">Não foi possível importar as configurações</string>
<string name="settings_import_read_failure">Não foi possível ler o arquivo de configurações</string>
<string name="settings_import_partial_failure">Não foi possível importar algumas configurações</string>
<string name="settings_import_status_success">Importado com sucesso</string>
<string name="settings_import_status_password_required">É necessária a senha</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">É necessário fazer a sua autenticação</string>
<string name="settings_import_status_not_imported">Não importado</string>
<string name="settings_import_status_error">Falha na importação</string>
<string name="settings_import_later_button">Mais tarde</string>
<string name="settings_importing">Importando configurações…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Para usar a conta \"<xliff:g id="account">%s</xliff:g>\", você precisa fornecer a senha do servidor.</item>
<item quantity="many">Para usar a conta \"<xliff:g id="account">%s</xliff:g>\", você precisa fornecer as senhas do servidor.</item>
<item quantity="other">Para usar a conta \"<xliff:g id="account">%s</xliff:g>\", você precisa fornecer as senhas do servidor.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Senha do servidor de recebimento</string>
<string name="settings_import_outgoing_server_password_hint">Senha do servidor de envio</string>
<string name="settings_import_use_same_password_for_outgoing_server">Usar a mesma senha para o servidor de envio</string>
<string name="settings_import_server_name_format">Nome do servidor: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Para usar essa conta de e-mail, você precisa autenticar-se e fornecer acesso ao app dos seus e-mails.</string>
<string name="settings_import_oauth_sign_in">Autenticar-se</string>
<string name="settings_import_oauth_sign_in_with_google">Autenticar-se com o Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorização cancelada</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Ocorreu o seguinte erro com a autorização: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 não é suportado atualmente neste provedor.</string>
<string name="settings_import_oauth_error_browser_not_found">O aplicativo não conseguiu encontrar um navegador para usar para conceder acesso à sua conta.</string>
<string name="settings_import_general_settings_item">Configurações gerais</string>
<string name="settings_import_pick_app_button">Importar de app</string>
<string name="settings_import_pick_app_dialog_title">Importar do app</string>
<string name="settings_import_scan_qr_code_button">Ler código QR</string>
<string name="settings_import_app_version_not_supported">Versão do app não suportada.</string>
</resources>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importar configurações</string>
<string name="settings_import_pick_document_button">Selecionar ficheiro</string>
<string name="settings_import_button">Importar</string>
<string name="settings_import_success_generic">Configurações importadas com sucesso</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Por favor inserir palavras-passe</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Por favor, inicie sessão</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Por favor, inicie sessão e insira palavras-passe</string>
<string name="settings_import_failure">Falha na importação de configurações</string>
<string name="settings_import_read_failure">Falha na leitura do ficheiro de configurações</string>
<string name="settings_import_partial_failure">Falha na importação de algumas configurações</string>
<string name="settings_import_status_success">A importação foi bem sucedida</string>
<string name="settings_import_status_password_required">Necessária palavra-passe</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Sessão iniciada necessária</string>
<string name="settings_import_status_not_imported">Não importado</string>
<string name="settings_import_status_error">Falha na importação</string>
<string name="settings_import_later_button">Posteriormente</string>
<string name="settings_importing">A importar configurações…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Para poder utilizar a conta \"<xliff:g id="account">%s</xliff:g>\" tem de fornecer a palavra-chave do servidor.</item>
<item quantity="many">Para poder utilizar a conta \"<xliff:g id="account">%s</xliff:g>\" tem de fornecer as palavras-chave dos servidors.</item>
<item quantity="other">Para poder utilizar a conta \"<xliff:g id="account">%s</xliff:g>\" tem de fornecer as senhas do servidor.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Palavra-passe do servidor de entrada</string>
<string name="settings_import_outgoing_server_password_hint">Palavra-passe do servidor de saída</string>
<string name="settings_import_use_same_password_for_outgoing_server">Utilizar a mesma palavra-passe para o servidor de saída</string>
<string name="settings_import_server_name_format">Nome do servidor <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Para usar essa conta de e-mail, precisa autenticar-se e fornecer acesso à app dos seus e-mails.</string>
<string name="settings_import_oauth_sign_in">Iniciar sessão</string>
<string name="settings_import_oauth_sign_in_with_google">Iniciar sessão com o Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorização cancelada</string>
<string name="settings_import_oauth_error_oauth_flow_failed">A autorização falhou com o seguinte erro: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 não é, de momento, suportado com este provedor.</string>
<string name="settings_import_oauth_error_browser_not_found">A aplicação não conseguiu encontrar um navegador para usar na concessão do acesso à sua conta.</string>
<string name="settings_import_general_settings_item">Configurações gerais</string>
<string name="settings_import_pick_app_button">Importar de app</string>
<string name="settings_import_pick_app_dialog_title">Importar da app</string>
<string name="settings_import_scan_qr_code_button">Ler código QR</string>
<string name="settings_import_app_version_not_supported">Versão do app não suportada.</string>
</resources>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importare parametri</string>
<string name="settings_import_pick_document_button">Selectează fișier</string>
<string name="settings_import_button">Importă</string>
<string name="settings_import_success_generic">Parametrii au fost importați cu succes</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Introdu parolele</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Conectează-te</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Conectează-te și introdu parolele</string>
<string name="settings_import_failure">Importarea parametrilor a eșuat</string>
<string name="settings_import_read_failure">Citirea fișierului cu setări a eșuat</string>
<string name="settings_import_partial_failure">Importarea unor parametri a eșuat</string>
<string name="settings_import_status_success">Importat cu succes</string>
<string name="settings_import_status_password_required">Parola este necesară</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Înregistrarea este necesară</string>
<string name="settings_import_status_not_imported">Nu a fost importat</string>
<string name="settings_import_status_error">Eșec la import</string>
<string name="settings_import_later_button">Mai târziu</string>
<string name="settings_importing">Se importă parametrii…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Pentru a putea folosi contul \"<xliff:g id="account">%s</xliff:g>\" trebuie să specifici parola de server.</item>
<item quantity="few">Pentru a putea folosi contul \"<xliff:g id="account">%s</xliff:g>\" trebuie să specifici parolele de server.</item>
<item quantity="other">Pentru a putea folosi contul \"<xliff:g id="account">%s</xliff:g>\" trebuie să specifici parolele de server.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Parola serverului de primire</string>
<string name="settings_import_outgoing_server_password_hint">Parola serverului de expediere</string>
<string name="settings_import_use_same_password_for_outgoing_server">Folosește aceeași parolă pentru serverul de expediere</string>
<string name="settings_import_server_name_format">Nume server: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Pentru a utiliza acest cont de e-mail, trebuie să te conectezi și să acorzi aplicației acces la e-mailuri.</string>
<string name="settings_import_oauth_sign_in">Conectează-te</string>
<string name="settings_import_oauth_sign_in_with_google">Conectează-te cu Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorizație anulată</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Autorizarea a eșuat cu următoarea eroare: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 nu este acceptat în prezent cu acest furnizor.</string>
<string name="settings_import_oauth_error_browser_not_found">Aplicația nu a putut găsi un navigator web pe care să îl folosească pentru a acorda acces la cont.</string>
<string name="settings_import_general_settings_item">Preferințe generale</string>
<string name="settings_import_pick_app_button">Import din aplicație</string>
<string name="settings_import_pick_app_dialog_title">Import din aplicație</string>
<string name="settings_import_scan_qr_code_button">Scanează codul QR</string>
<string name="settings_import_app_version_not_supported">Versiunea aplicației nu este compatibilă.</string>
</resources>

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Импорт настроек</string>
<string name="settings_import_pick_document_button">Выбрать файл</string>
<string name="settings_import_button">Импорт</string>
<string name="settings_import_success_generic">Настройки успешно импортированы</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Пожалуйста, введите пароли</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_authorization_required">Пожалуйста, войдите в систему</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_authorization_and_password_required">Пожалуйста, войдите в систему и введите пароль</string>
<string name="settings_import_failure">Не удалось импортировать настройки</string>
<string name="settings_import_read_failure">Не удалось прочесть файл настроек</string>
<string name="settings_import_partial_failure">Не удалось импортировать некоторые настройки</string>
<string name="settings_import_status_success">Успешный импорт</string>
<string name="settings_import_status_password_required">Требуется пароль</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_log_in_required">Требуется вход в систему</string>
<string name="settings_import_status_not_imported">Не импортировано</string>
<string name="settings_import_status_error">Импорт не удался</string>
<string name="settings_import_later_button">Позже</string>
<string name="settings_importing">Импорт настроек…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Чтобы использовать ящик \"<xliff:g id="account">%s</xliff:g>\", необходимо ввести пароль.</item>
<item quantity="few">Чтобы использовать ящик \"<xliff:g id="account">%s</xliff:g>\", необходимо ввести пароли.</item>
<item quantity="many">Чтобы использовать ящик \"<xliff:g id="account">%s</xliff:g>\", необходимо ввести пароли.</item>
<item quantity="other">Чтобы использовать ящик \"<xliff:g id="account">%s</xliff:g>\", необходимо ввести пароли.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Пароль входящего сервера</string>
<string name="settings_import_outgoing_server_password_hint">Пароль исходящего сервера</string>
<string name="settings_import_use_same_password_for_outgoing_server">Использовать тот же пароль для исходящего сервера</string>
<string name="settings_import_server_name_format">Названия серверов: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_oauth_description">Чтобы использовать эту учётную запись электронной почты, вам необходимо войти в систему и предоставить приложению доступ к вашим электронным письмам.</string>
<string name="settings_import_oauth_sign_in">Войти</string>
<string name="settings_import_oauth_sign_in_with_google">Войти с помощью Google</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Авторизация отменена</string>
<string name="settings_import_oauth_error_oauth_flow_failed">Авторизация завершилась ошибкой со следующей ошибкой: <xliff:g id="error">%s</xliff:g></string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 в настоящее время не поддерживается этим поставщиком.</string>
<string name="settings_import_oauth_error_browser_not_found">Приложению не удалось найти браузер, чтобы дать доступ к вашей учётной записи.</string>
<string name="settings_import_general_settings_item">Основные</string>
<string name="settings_import_pick_app_button">Импорт из приложения</string>
<string name="settings_import_pick_app_dialog_title">Импорт из приложения</string>
<string name="settings_import_scan_qr_code_button">Сканировать QR-код</string>
<string name="settings_import_app_version_not_supported">Версия приложения не поддерживается.</string>
</resources>

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="settings_import_title">Importovať nastavenia</string>
<string name="settings_import_pick_document_button">Vybrať súbor</string>
<string name="settings_import_button">Importovať</string>
<string name="settings_import_success_generic">Nastavenia úspešne importované</string>
<!--Displayed after importing accounts when one or multiple accounts require entering a password-->
<string name="settings_import_password_required">Zadajte heslá</string>
<!--Displayed after importing accounts when some accounts require entering a password and some to use the OAuth authorization flow-->
<string name="settings_import_failure">Import nastavení zlyhal</string>
<!--Displayed after importing accounts when one or multiple accounts require to use the OAuth authorization flow-->
<string name="settings_import_read_failure">Nepodarilo sa prečítať súbor s nastaveniami</string>
<string name="settings_import_partial_failure">Import časti nastavení zlyhal</string>
<string name="settings_import_status_success">Import prebehol úspešne</string>
<string name="settings_import_status_password_required">Vyžadované heslo</string>
<!--Content description for the icon that is displayed next to an imported account that requires sign-in-->
<string name="settings_import_status_not_imported">Nenaimportované</string>
<string name="settings_import_status_error">Zlyhanie pri importe</string>
<string name="settings_import_later_button">Neskôr</string>
<string name="settings_importing">Importovanie nastavení…</string>
<plurals name="settings_import_password_prompt">
<item quantity="one">Pred používaním účtu \"<xliff:g id="account">%s</xliff:g>\" je potrebné zadať heslo na server.</item>
<item quantity="few">Pred používaním účtu \"<xliff:g id="account">%s</xliff:g>\" je potrebné zadať heslo na server.</item>
<item quantity="many">Pred používaním účtov \"<xliff:g id="account">%s</xliff:g>\" je potrebné zadať heslo na server.</item>
<item quantity="other">Pred používaním účtov „<xliff:g id="account">%s</xliff:g>“ je potrebné zadať heslo na server.</item>
</plurals>
<string name="settings_import_incoming_server_password_hint">Heslo na server na príjem</string>
<string name="settings_import_outgoing_server_password_hint">Heslo na server na odosielanie</string>
<string name="settings_import_use_same_password_for_outgoing_server">Použiť rovnaké heslo ako na server na odosielanie </string>
<string name="settings_import_server_name_format">Názov serveru: <xliff:g id="hostname">%s</xliff:g></string>
<string name="settings_import_general_settings_item">Všeobecné nastavenia</string>
<string name="settings_import_oauth_error_oauth_not_supported">OAuth 2.0 nie je momentálne podporovaný poskytovateľ.</string>
<string name="settings_import_authorization_and_password_required">Prosím prihláste sa a zadajte heslo</string>
<string name="settings_import_pick_app_button">Importujte z aplikácie</string>
<string name="settings_import_pick_app_dialog_title">Importovať z aplikácie</string>
<string name="settings_import_status_log_in_required">Potrebné prihlásenie</string>
<string name="settings_import_oauth_sign_in">Prihlásenie</string>
<string name="settings_import_oauth_sign_in_with_google">Prihlásenie prostredníctvom Google</string>
<string name="settings_import_scan_qr_code_button">Skenovať QR kód</string>
<string name="settings_import_authorization_required">Prosím prihláste sa</string>
<string name="settings_import_oauth_error_oauth_flow_canceled">Autorizácia zrušená</string>
<string name="settings_import_app_version_not_supported">Verzia aplikácie nie je podporovaná.</string>
</resources>

Some files were not shown because too many files have changed in this diff Show more