mirror of
https://github.com/bitfireAT/davx5-ose.git
synced 2026-01-27 08:08:29 -05:00
Compare commits
5 Commits
reuse-http
...
main-ose
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63a5359c06 | ||
|
|
89a7cd2885 | ||
|
|
db25570581 | ||
|
|
3de34e53d0 | ||
|
|
af084fb5d0 |
@@ -18,8 +18,8 @@ android {
|
||||
defaultConfig {
|
||||
applicationId = "at.bitfire.davdroid"
|
||||
|
||||
versionCode = 405080003
|
||||
versionName = "4.5.8"
|
||||
versionCode = 405090000
|
||||
versionName = "4.5.9-alpha.1"
|
||||
|
||||
base.archivesName = "davx5-ose-$versionName"
|
||||
|
||||
@@ -160,6 +160,7 @@ dependencies {
|
||||
implementation(libs.compose.accompanist.permissions)
|
||||
implementation(platform(libs.androidx.compose.bom))
|
||||
implementation(libs.androidx.compose.material3)
|
||||
implementation(libs.androidx.compose.material3.adaptive)
|
||||
implementation(libs.androidx.compose.materialIconsExtended)
|
||||
debugImplementation(libs.androidx.compose.ui.tooling)
|
||||
implementation(libs.androidx.compose.ui.toolingPreview)
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui
|
||||
|
||||
import android.content.Context
|
||||
import at.bitfire.davdroid.di.IoDispatcher
|
||||
import at.bitfire.davdroid.ui.about.AboutModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import dagger.hilt.android.testing.HiltAndroidRule
|
||||
import dagger.hilt.android.testing.HiltAndroidTest
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.test.runTest
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Before
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import java.util.logging.Logger
|
||||
import javax.inject.Inject
|
||||
|
||||
@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
|
||||
@HiltAndroidTest
|
||||
class AboutModelTest {
|
||||
|
||||
@get:Rule
|
||||
val hiltRule = HiltAndroidRule(this)
|
||||
|
||||
@Inject
|
||||
@ApplicationContext
|
||||
lateinit var context: Context
|
||||
|
||||
@Inject
|
||||
@IoDispatcher
|
||||
lateinit var ioDispatcher: CoroutineDispatcher
|
||||
|
||||
@Inject
|
||||
lateinit var logger: Logger
|
||||
|
||||
// Model instance created once and reused across tests
|
||||
private lateinit var model: AboutModel
|
||||
|
||||
@Before
|
||||
fun setup() {
|
||||
hiltRule.inject()
|
||||
|
||||
// Create the model using injected dependencies
|
||||
model = AboutModel(context, ioDispatcher, logger)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun test_loadTransifexTranslators() = runTest {
|
||||
// Check that the function doesn't crash
|
||||
val translators = model.loadTransifexTranslators()
|
||||
|
||||
// And that it's not empty
|
||||
assertTrue(translators.isNotEmpty())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun test_loadWeblateTranslators() = runTest {
|
||||
// Check that the function doesn't crash
|
||||
val translators = model.loadWeblateTranslators()
|
||||
|
||||
// And that it's not empty
|
||||
assertTrue(translators.isNotEmpty())
|
||||
}
|
||||
|
||||
}
|
||||
@@ -83,7 +83,7 @@
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".ui.AboutActivity"
|
||||
android:name=".ui.about.AboutActivity"
|
||||
android:label="@string/navigation_drawer_about"
|
||||
android:parentActivityName=".ui.AccountsActivity"/>
|
||||
|
||||
|
||||
1
app/src/main/assets/weblate-translators.json
Normal file
1
app/src/main/assets/weblate-translators.json
Normal file
File diff suppressed because one or more lines are too long
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.di
|
||||
|
||||
import android.content.Context
|
||||
import at.bitfire.cert4android.CustomCertManager
|
||||
import at.bitfire.cert4android.CustomCertStore
|
||||
import at.bitfire.cert4android.SettingsProvider
|
||||
import at.bitfire.davdroid.BuildConfig
|
||||
import at.bitfire.davdroid.settings.Settings
|
||||
import at.bitfire.davdroid.settings.SettingsManager
|
||||
import at.bitfire.davdroid.ui.ForegroundTracker
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import okhttp3.internal.tls.OkHostnameVerifier
|
||||
import java.util.Optional
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
/**
|
||||
* cert4android integration module
|
||||
*/
|
||||
class CustomCertManagerModule {
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun customCertManager(
|
||||
@ApplicationContext context: Context,
|
||||
settings: SettingsManager
|
||||
): Optional<CustomCertManager> =
|
||||
if (BuildConfig.allowCustomCerts)
|
||||
Optional.of(
|
||||
CustomCertManager(
|
||||
certStore = CustomCertStore.getInstance(context),
|
||||
settings = object : SettingsProvider {
|
||||
|
||||
override val appInForeground: Boolean
|
||||
get() = ForegroundTracker.inForeground.value
|
||||
|
||||
override val trustSystemCerts: Boolean
|
||||
get() = !settings.getBoolean(Settings.DISTRUST_SYSTEM_CERTIFICATES)
|
||||
|
||||
}
|
||||
))
|
||||
else
|
||||
Optional.empty()
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun customHostnameVerifier(
|
||||
customCertManager: Optional<CustomCertManager>
|
||||
): Optional<CustomCertManager.HostnameVerifier> =
|
||||
if (BuildConfig.allowCustomCerts && customCertManager.isPresent) {
|
||||
val hostnameVerifier = customCertManager.get().HostnameVerifier(OkHostnameVerifier)
|
||||
Optional.of(hostnameVerifier)
|
||||
} else
|
||||
Optional.empty()
|
||||
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
/*
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.network
|
||||
|
||||
import javax.net.ssl.HostnameVerifier
|
||||
import javax.net.ssl.SSLSocketFactory
|
||||
import javax.net.ssl.X509TrustManager
|
||||
|
||||
class ConnectionSecurityContext(
|
||||
val sslSocketFactory: SSLSocketFactory?,
|
||||
val trustManager: X509TrustManager?,
|
||||
val hostnameVerifier: HostnameVerifier?,
|
||||
val disableHttp2: Boolean
|
||||
)
|
||||
@@ -1,75 +0,0 @@
|
||||
/*
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.network
|
||||
|
||||
import at.bitfire.cert4android.CustomCertManager
|
||||
import com.google.common.cache.Cache
|
||||
import com.google.common.cache.CacheBuilder
|
||||
import java.security.KeyStore
|
||||
import java.util.Optional
|
||||
import java.util.logging.Level
|
||||
import java.util.logging.Logger
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
import javax.net.ssl.KeyManager
|
||||
import javax.net.ssl.SSLContext
|
||||
import javax.net.ssl.TrustManagerFactory
|
||||
import javax.net.ssl.X509TrustManager
|
||||
import kotlin.jvm.optionals.getOrNull
|
||||
|
||||
/**
|
||||
* Caching provider for [SSLContext].
|
||||
*/
|
||||
@Singleton
|
||||
class ConnectionSecurityManager @Inject constructor(
|
||||
private val customHostnameVerifier: Optional<CustomCertManager.HostnameVerifier>,
|
||||
customTrustManager: Optional<CustomCertManager>,
|
||||
private val keyManagerFactory: ClientCertKeyManager.Factory,
|
||||
private val logger: Logger,
|
||||
) {
|
||||
|
||||
private val contextCache: Cache<Optional<String>, ConnectionSecurityContext> = CacheBuilder.newBuilder()
|
||||
.build()
|
||||
private val trustManager = customTrustManager.getOrNull() ?: defaultTrustManager()
|
||||
|
||||
fun getContext(certificateAlias: String?) =
|
||||
// cache SSLContext by certificate alias
|
||||
contextCache.get(Optional.ofNullable(certificateAlias)) {
|
||||
val clientKeyManager = certificateAlias?.let { getClientKeyManager(it) }
|
||||
|
||||
val sslContext = SSLContext.getInstance("TLS").apply {
|
||||
init(
|
||||
/* km = */ if (clientKeyManager != null) arrayOf(clientKeyManager) else null,
|
||||
/* tm = */ arrayOf(trustManager),
|
||||
/* random = */ null
|
||||
)
|
||||
}
|
||||
|
||||
ConnectionSecurityContext(
|
||||
sslSocketFactory = sslContext.socketFactory,
|
||||
trustManager = trustManager,
|
||||
hostnameVerifier = customHostnameVerifier.getOrNull(),
|
||||
disableHttp2 = certificateAlias != null
|
||||
)
|
||||
}
|
||||
|
||||
fun getClientKeyManager(alias: String): KeyManager? =
|
||||
try {
|
||||
val manager = keyManagerFactory.create(alias)
|
||||
logger.fine("Using certificate $alias for authentication")
|
||||
|
||||
manager
|
||||
} catch (e: IllegalArgumentException) {
|
||||
logger.log(Level.SEVERE, "Couldn't create KeyManager for certificate $alias", e)
|
||||
null
|
||||
}
|
||||
|
||||
private fun defaultTrustManager(): X509TrustManager {
|
||||
val factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
|
||||
factory.init(null as KeyStore?)
|
||||
return factory.trustManagers.filterIsInstance<X509TrustManager>().first()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,16 +5,22 @@
|
||||
package at.bitfire.davdroid.network
|
||||
|
||||
import android.accounts.Account
|
||||
import android.content.Context
|
||||
import androidx.annotation.WorkerThread
|
||||
import at.bitfire.cert4android.CustomCertManager
|
||||
import at.bitfire.cert4android.CustomCertStore
|
||||
import at.bitfire.dav4jvm.okhttp.BasicDigestAuthHandler
|
||||
import at.bitfire.dav4jvm.okhttp.UrlUtils
|
||||
import at.bitfire.davdroid.BuildConfig
|
||||
import at.bitfire.davdroid.di.IoDispatcher
|
||||
import at.bitfire.davdroid.settings.AccountSettings
|
||||
import at.bitfire.davdroid.settings.Credentials
|
||||
import at.bitfire.davdroid.settings.Settings
|
||||
import at.bitfire.davdroid.settings.SettingsManager
|
||||
import at.bitfire.davdroid.ui.ForegroundTracker
|
||||
import com.google.common.net.HttpHeaders
|
||||
import com.google.errorprone.annotations.MustBeClosed
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.client.engine.okhttp.OkHttp
|
||||
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
|
||||
@@ -29,13 +35,20 @@ import okhttp3.Interceptor
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Protocol
|
||||
import okhttp3.brotli.BrotliInterceptor
|
||||
import okhttp3.internal.tls.OkHostnameVerifier
|
||||
import okhttp3.logging.HttpLoggingInterceptor
|
||||
import java.net.InetSocketAddress
|
||||
import java.net.Proxy
|
||||
import java.security.KeyStore
|
||||
import java.util.concurrent.TimeUnit
|
||||
import java.util.logging.Level
|
||||
import java.util.logging.Logger
|
||||
import javax.inject.Inject
|
||||
import javax.net.ssl.HostnameVerifier
|
||||
import javax.net.ssl.KeyManager
|
||||
import javax.net.ssl.SSLContext
|
||||
import javax.net.ssl.TrustManagerFactory
|
||||
import javax.net.ssl.X509TrustManager
|
||||
|
||||
/**
|
||||
* Builder for the HTTP client.
|
||||
@@ -47,9 +60,10 @@ import javax.inject.Inject
|
||||
*/
|
||||
class HttpClientBuilder @Inject constructor(
|
||||
private val accountSettingsFactory: AccountSettings.Factory,
|
||||
private val connectionSecurityManager: ConnectionSecurityManager,
|
||||
@ApplicationContext private val context: Context,
|
||||
defaultLogger: Logger,
|
||||
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
|
||||
private val keyManagerFactory: ClientCertKeyManager.Factory,
|
||||
private val oAuthInterceptorFactory: OAuthInterceptor.Factory,
|
||||
private val settingsManager: SettingsManager
|
||||
) {
|
||||
@@ -269,29 +283,72 @@ class HttpClientBuilder @Inject constructor(
|
||||
}
|
||||
|
||||
private fun buildConnectionSecurity(okBuilder: OkHttpClient.Builder) {
|
||||
// Allow cleartext and TLS 1.2+
|
||||
// allow cleartext and TLS 1.2+
|
||||
okBuilder.connectionSpecs(listOf(
|
||||
ConnectionSpec.CLEARTEXT,
|
||||
ConnectionSpec.MODERN_TLS
|
||||
))
|
||||
|
||||
/* Set SSLSocketFactory, TrustManager and HostnameVerifier (if needed).
|
||||
* We shouldn't create these things here, because
|
||||
*
|
||||
* a. it involves complex logic that should be the responsibility of a dedicated class, and
|
||||
* b. we need to cache the instances because otherwise, HTTPS connection are not used
|
||||
* correctly. okhttp checks the SSLSocketFactory/TrustManager of a connection in the pool
|
||||
* and creates a new connection when they have changed. */
|
||||
val securityContext = connectionSecurityManager.getContext(certificateAlias)
|
||||
// client certificate
|
||||
val clientKeyManager: KeyManager? = certificateAlias?.let { alias ->
|
||||
try {
|
||||
val manager = keyManagerFactory.create(alias)
|
||||
logger.fine("Using certificate $alias for authentication")
|
||||
|
||||
if (securityContext.disableHttp2)
|
||||
okBuilder.protocols(listOf(Protocol.HTTP_1_1))
|
||||
// HTTP/2 doesn't support client certificates (yet)
|
||||
// see https://datatracker.ietf.org/doc/draft-ietf-httpbis-secondary-server-certs/
|
||||
okBuilder.protocols(listOf(Protocol.HTTP_1_1))
|
||||
|
||||
if (securityContext.sslSocketFactory != null && securityContext.trustManager != null)
|
||||
okBuilder.sslSocketFactory(securityContext.sslSocketFactory, securityContext.trustManager)
|
||||
manager
|
||||
} catch (e: IllegalArgumentException) {
|
||||
logger.log(Level.SEVERE, "Couldn't create KeyManager for certificate $alias", e)
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
if (securityContext.hostnameVerifier != null)
|
||||
okBuilder.hostnameVerifier(securityContext.hostnameVerifier)
|
||||
// select trust manager and hostname verifier depending on whether custom certificates are allowed
|
||||
val customTrustManager: X509TrustManager?
|
||||
val customHostnameVerifier: HostnameVerifier?
|
||||
|
||||
if (BuildConfig.allowCustomCerts) {
|
||||
// use cert4android for custom certificate handling
|
||||
customTrustManager = CustomCertManager(
|
||||
certStore = CustomCertStore.getInstance(context),
|
||||
trustSystemCerts = !settingsManager.getBoolean(Settings.DISTRUST_SYSTEM_CERTIFICATES),
|
||||
appInForeground = ForegroundTracker.inForeground
|
||||
)
|
||||
// allow users to accept certificates with wrong host names
|
||||
customHostnameVerifier = customTrustManager.HostnameVerifier(OkHostnameVerifier)
|
||||
|
||||
} else {
|
||||
// no custom certificates, use default trust manager and hostname verifier
|
||||
customTrustManager = null
|
||||
customHostnameVerifier = null
|
||||
}
|
||||
|
||||
// change settings only if we have at least only one custom component
|
||||
if (clientKeyManager != null || customTrustManager != null) {
|
||||
val trustManager = customTrustManager ?: defaultTrustManager()
|
||||
|
||||
// use trust manager and client key manager (if defined) for TLS connections
|
||||
val sslContext = SSLContext.getInstance("TLS")
|
||||
sslContext.init(
|
||||
/* km = */ if (clientKeyManager != null) arrayOf(clientKeyManager) else null,
|
||||
/* tm = */ arrayOf(trustManager),
|
||||
/* random = */ null
|
||||
)
|
||||
okBuilder.sslSocketFactory(sslContext.socketFactory, trustManager)
|
||||
}
|
||||
|
||||
// also add the custom hostname verifier (if defined)
|
||||
if (customHostnameVerifier != null)
|
||||
okBuilder.hostnameVerifier(customHostnameVerifier)
|
||||
}
|
||||
|
||||
private fun defaultTrustManager(): X509TrustManager {
|
||||
val factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
|
||||
factory.init(null as KeyStore?)
|
||||
return factory.trustManagers.filterIsInstance<X509TrustManager>().first()
|
||||
}
|
||||
|
||||
private fun buildProxy(okBuilder: OkHttpClient.Builder) {
|
||||
|
||||
@@ -52,6 +52,7 @@ import androidx.compose.ui.unit.dp
|
||||
import androidx.core.net.toUri
|
||||
import at.bitfire.davdroid.BuildConfig
|
||||
import at.bitfire.davdroid.R
|
||||
import at.bitfire.davdroid.ui.about.AboutActivity
|
||||
import at.bitfire.davdroid.ui.webdav.WebdavMountsActivity
|
||||
import kotlinx.coroutines.launch
|
||||
import java.net.URI
|
||||
|
||||
@@ -20,6 +20,7 @@ import at.bitfire.davdroid.repository.PreferenceRepository
|
||||
import at.bitfire.davdroid.settings.Settings
|
||||
import at.bitfire.davdroid.settings.SettingsManager
|
||||
import at.bitfire.davdroid.sync.TasksAppManager
|
||||
import at.bitfire.davdroid.ui.intro.BackupsPage
|
||||
import at.bitfire.davdroid.ui.intro.BatteryOptimizationsPageModel
|
||||
import at.bitfire.davdroid.ui.intro.OpenSourcePage
|
||||
import at.bitfire.davdroid.util.PermissionUtils
|
||||
@@ -33,6 +34,7 @@ import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.stateIn
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
@@ -98,11 +100,12 @@ class AppSettingsModel @Inject constructor(
|
||||
UiUtils.updateTheme(context)
|
||||
}
|
||||
|
||||
fun resetHints() {
|
||||
fun resetHints() = runBlocking(ioDispatcher) {
|
||||
settings.remove(BackupsPage.Model.SETTING_BACKUPS_ACCEPTED)
|
||||
settings.remove(BatteryOptimizationsPageModel.HINT_BATTERY_OPTIMIZATIONS)
|
||||
settings.remove(BatteryOptimizationsPageModel.HINT_AUTOSTART_PERMISSION)
|
||||
settings.remove(TasksModel.HINT_OPENTASKS_NOT_INSTALLED)
|
||||
settings.remove(OpenSourcePage.Model.SETTING_NEXT_DONATION_POPUP)
|
||||
settings.remove(TasksModel.HINT_OPENTASKS_NOT_INSTALLED)
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2,57 +2,44 @@
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui
|
||||
package at.bitfire.davdroid.ui.about
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.activity.viewModels
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.foundation.pager.HorizontalPager
|
||||
import androidx.compose.foundation.pager.rememberPagerState
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||
import androidx.compose.material.icons.filled.Home
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.Tab
|
||||
import androidx.compose.material3.TabRow
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalUriHandler
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import at.bitfire.davdroid.BuildConfig
|
||||
import at.bitfire.davdroid.R
|
||||
import at.bitfire.davdroid.di.IoDispatcher
|
||||
import at.bitfire.davdroid.ui.AppTheme
|
||||
import at.bitfire.davdroid.ui.ExternalUris.withStatParams
|
||||
import at.bitfire.davdroid.ui.composable.PixelBoxes
|
||||
import com.mikepenz.aboutlibraries.Libs
|
||||
import com.mikepenz.aboutlibraries.ui.compose.LibraryDefaults
|
||||
import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer
|
||||
@@ -62,27 +49,15 @@ import dagger.Module
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import dagger.hilt.android.components.ActivityComponent
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.json.JSONObject
|
||||
import java.text.Collator
|
||||
import java.util.LinkedList
|
||||
import java.util.Locale
|
||||
import java.util.Optional
|
||||
import java.util.logging.Level
|
||||
import java.util.logging.Logger
|
||||
import javax.inject.Inject
|
||||
import kotlin.jvm.optionals.getOrNull
|
||||
|
||||
@AndroidEntryPoint
|
||||
class AboutActivity: AppCompatActivity() {
|
||||
|
||||
val model by viewModels<Model>()
|
||||
val model by viewModels<AboutModel>()
|
||||
|
||||
@Inject
|
||||
lateinit var licenseInfoProvider: Optional<AppLicenseInfoProvider>
|
||||
@@ -112,10 +87,12 @@ class AboutActivity: AppCompatActivity() {
|
||||
},
|
||||
actions = {
|
||||
IconButton(onClick = {
|
||||
uriHandler.openUri(ExternalUris.Homepage.baseUrl
|
||||
.buildUpon()
|
||||
.withStatParams(javaClass.simpleName)
|
||||
.build().toString())
|
||||
uriHandler.openUri(
|
||||
at.bitfire.davdroid.ui.ExternalUris.Homepage.baseUrl
|
||||
.buildUpon()
|
||||
.withStatParams(javaClass.simpleName)
|
||||
.build().toString()
|
||||
)
|
||||
}) {
|
||||
Icon(
|
||||
Icons.Default.Home,
|
||||
@@ -167,8 +144,12 @@ class AboutActivity: AppCompatActivity() {
|
||||
when (index) {
|
||||
0 -> AboutApp(licenseInfoProvider = licenseInfoProvider.getOrNull())
|
||||
1 -> {
|
||||
val translations = model.translations.collectAsStateWithLifecycle(emptyList())
|
||||
TranslatorsGallery(translations.value)
|
||||
val weblateTranslators by model.weblateTranslators.collectAsStateWithLifecycle("")
|
||||
val transifexTranslators by model.transifexTranslators.collectAsStateWithLifecycle("")
|
||||
TranslationsTab(
|
||||
weblateTranslators = weblateTranslators,
|
||||
transifexTranslators = transifexTranslators
|
||||
)
|
||||
}
|
||||
|
||||
2 -> LibrariesContainer(
|
||||
@@ -191,57 +172,6 @@ class AboutActivity: AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@HiltViewModel
|
||||
class Model @Inject constructor(
|
||||
@ApplicationContext val context: Context,
|
||||
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
|
||||
private val logger: Logger
|
||||
): ViewModel() {
|
||||
|
||||
data class Translation(
|
||||
val language: String,
|
||||
val translators: Set<String>
|
||||
)
|
||||
|
||||
val translations: Flow<List<Translation>> = flow {
|
||||
val translations = loadTranslations()
|
||||
emit(translations)
|
||||
}
|
||||
|
||||
private suspend fun loadTranslations(): List<Translation> = withContext(ioDispatcher) {
|
||||
try {
|
||||
context.resources.assets.open("translators.json").use { stream ->
|
||||
val jsonTranslations = JSONObject(stream.readBytes().decodeToString())
|
||||
val result = LinkedList<Translation>()
|
||||
for (langCode in jsonTranslations.keys()) {
|
||||
val jsonTranslators = jsonTranslations.getJSONArray(langCode)
|
||||
val translators = Array<String>(jsonTranslators.length()) { idx ->
|
||||
jsonTranslators.getString(idx)
|
||||
}
|
||||
|
||||
val langTag = langCode.replace('_', '-')
|
||||
val language = Locale.forLanguageTag(langTag).displayName
|
||||
result += Translation(language, translators.toSet())
|
||||
}
|
||||
|
||||
// sort translations by localized language name
|
||||
val collator = Collator.getInstance()
|
||||
result.sortWith { o1, o2 ->
|
||||
collator.compare(o1.language, o2.language)
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logger.log(Level.WARNING, "Couldn't load translators", e)
|
||||
emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
interface AppLicenseInfoProvider {
|
||||
@Composable
|
||||
fun LicenseInfo()
|
||||
@@ -254,107 +184,4 @@ class AboutActivity: AppCompatActivity() {
|
||||
fun appLicenseInfoProvider(): AppLicenseInfoProvider
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Composable
|
||||
fun AboutApp(licenseInfoProvider: AboutActivity.AppLicenseInfoProvider? = null) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.padding(8.dp)
|
||||
.fillMaxWidth()
|
||||
.verticalScroll(rememberScrollState())) {
|
||||
Image(
|
||||
UiUtils.adaptiveIconPainterResource(R.mipmap.ic_launcher),
|
||||
contentDescription = stringResource(R.string.app_name),
|
||||
modifier = Modifier
|
||||
.size(128.dp)
|
||||
.align(Alignment.CenterHorizontally)
|
||||
)
|
||||
Text(
|
||||
stringResource(R.string.app_name),
|
||||
style = MaterialTheme.typography.headlineMedium,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(8.dp)
|
||||
)
|
||||
|
||||
Text(
|
||||
stringResource(R.string.about_version, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
|
||||
Text(
|
||||
stringResource(R.string.about_copyright),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(vertical = 8.dp)
|
||||
)
|
||||
|
||||
Text(
|
||||
stringResource(R.string.about_license_info_no_warranty),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(top = 8.dp)
|
||||
)
|
||||
|
||||
PixelBoxes(
|
||||
arrayOf(Color(0xFFFCF434), Color.White, Color(0xFF9C59D1), Color.Black),
|
||||
modifier = Modifier
|
||||
.align(Alignment.CenterHorizontally)
|
||||
.padding(16.dp)
|
||||
)
|
||||
|
||||
licenseInfoProvider?.LicenseInfo()
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
fun AboutApp_Preview() {
|
||||
AboutApp(licenseInfoProvider = object : AboutActivity.AppLicenseInfoProvider {
|
||||
@Composable
|
||||
override fun LicenseInfo() {
|
||||
Text("Some flavored License Info")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@Composable
|
||||
fun TranslatorsGallery(
|
||||
translations: List<AboutActivity.Model.Translation>
|
||||
) {
|
||||
val collator = Collator.getInstance()
|
||||
LazyColumn(Modifier.padding(8.dp)) {
|
||||
items(translations) { translation ->
|
||||
Text(
|
||||
translation.language,
|
||||
style = MaterialTheme.typography.headlineMedium,
|
||||
modifier = Modifier.padding(vertical = 4.dp)
|
||||
)
|
||||
Text(
|
||||
translation.translators
|
||||
.sortedWith { a, b -> collator.compare(a, b) }
|
||||
.joinToString(" · "),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
modifier = Modifier.padding(bottom = 16.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
fun TranslatorsGallery_Sample() {
|
||||
TranslatorsGallery(listOf(
|
||||
AboutActivity.Model.Translation("Some Language", setOf("User 1", "User 2")),
|
||||
AboutActivity.Model.Translation("Another Language", setOf("User 3", "User 4"))
|
||||
))
|
||||
}
|
||||
95
app/src/main/kotlin/at/bitfire/davdroid/ui/about/AboutApp.kt
Normal file
95
app/src/main/kotlin/at/bitfire/davdroid/ui/about/AboutApp.kt
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui.about
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import at.bitfire.davdroid.BuildConfig
|
||||
import at.bitfire.davdroid.R
|
||||
import at.bitfire.davdroid.ui.composable.PixelBoxes
|
||||
|
||||
@Composable
|
||||
fun AboutApp(licenseInfoProvider: AboutActivity.AppLicenseInfoProvider? = null) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.padding(8.dp)
|
||||
.fillMaxWidth()
|
||||
.verticalScroll(rememberScrollState())) {
|
||||
Image(
|
||||
at.bitfire.davdroid.ui.UiUtils.adaptiveIconPainterResource(R.mipmap.ic_launcher),
|
||||
contentDescription = stringResource(R.string.app_name),
|
||||
modifier = Modifier
|
||||
.size(128.dp)
|
||||
.align(Alignment.CenterHorizontally)
|
||||
)
|
||||
Text(
|
||||
stringResource(R.string.app_name),
|
||||
style = MaterialTheme.typography.headlineMedium,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(8.dp)
|
||||
)
|
||||
|
||||
Text(
|
||||
stringResource(R.string.about_version, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
|
||||
Text(
|
||||
stringResource(R.string.about_copyright),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(vertical = 8.dp)
|
||||
)
|
||||
|
||||
Text(
|
||||
stringResource(R.string.about_license_info_no_warranty),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(top = 8.dp)
|
||||
)
|
||||
|
||||
PixelBoxes(
|
||||
arrayOf(Color(0xFFFCF434), Color.White, Color(0xFF9C59D1), Color.Black),
|
||||
modifier = Modifier
|
||||
.align(Alignment.CenterHorizontally)
|
||||
.padding(16.dp)
|
||||
)
|
||||
|
||||
licenseInfoProvider?.LicenseInfo()
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
fun AboutApp_Preview() {
|
||||
AboutApp(licenseInfoProvider = object : AboutActivity.AppLicenseInfoProvider {
|
||||
@Composable
|
||||
override fun LicenseInfo() {
|
||||
Text("Some flavored License Info")
|
||||
}
|
||||
})
|
||||
}
|
||||
105
app/src/main/kotlin/at/bitfire/davdroid/ui/about/AboutModel.kt
Normal file
105
app/src/main/kotlin/at/bitfire/davdroid/ui/about/AboutModel.kt
Normal file
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui.about
|
||||
|
||||
import android.content.Context
|
||||
import android.icu.text.ListFormatter
|
||||
import android.os.Build
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import androidx.lifecycle.ViewModel
|
||||
import at.bitfire.davdroid.di.IoDispatcher
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.serialization.ExperimentalSerializationApi
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.decodeFromStream
|
||||
import java.text.Collator
|
||||
import java.util.logging.Level
|
||||
import java.util.logging.Logger
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
@OptIn(ExperimentalSerializationApi::class)
|
||||
class AboutModel @Inject constructor(
|
||||
@ApplicationContext val context: Context,
|
||||
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
|
||||
private val logger: Logger
|
||||
): ViewModel() {
|
||||
|
||||
@Serializable
|
||||
data class WeblateTranslator(
|
||||
val email: String,
|
||||
val username: String,
|
||||
val full_name: String
|
||||
)
|
||||
|
||||
private val collator = Collator.getInstance()
|
||||
private val json = Json { ignoreUnknownKeys = true }
|
||||
|
||||
val transifexTranslators = flow {
|
||||
val translators = loadTransifexTranslators().sortedWith(collator)
|
||||
emit(formatList(translators))
|
||||
}.flowOn(ioDispatcher)
|
||||
|
||||
val weblateTranslators = flow {
|
||||
val translators = loadWeblateTranslators().sortedWith(collator)
|
||||
emit(formatList(translators))
|
||||
}.flowOn(ioDispatcher)
|
||||
|
||||
|
||||
@VisibleForTesting
|
||||
internal fun loadTransifexTranslators(): Set<String> =
|
||||
try {
|
||||
context.resources.assets.open("transifex-translators.json").use { stream ->
|
||||
// format: {"de_AT":["userA","userB"], ...}
|
||||
val langTranslators = json.decodeFromStream<Map<String, List<String>>>(stream)
|
||||
|
||||
// ignore languages and put user names into set
|
||||
langTranslators.values.flatten().toSet()
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logger.log(Level.WARNING, "Couldn't load Transifex translators", e)
|
||||
emptySet()
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
internal fun loadWeblateTranslators(): Set<String> =
|
||||
try {
|
||||
context.resources.assets.open("weblate-translators.json").use { stream ->
|
||||
val langTranslators = json.decodeFromStream<List<Map<String, List<WeblateTranslator>>>>(stream)
|
||||
langTranslators.map { languageAndTranslators ->
|
||||
languageAndTranslators.values.map { translators ->
|
||||
// Ricki did the migration from Weblate to Transifex, so the user is shown as
|
||||
// contributor for many languages. Should be filtered out.
|
||||
translators
|
||||
.filter { it.email != "hirner@bitfire.at" }
|
||||
.map { it.username }
|
||||
}.flatten()
|
||||
}.flatten().toSet()
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logger.log(Level.WARNING, "Couldn't load Weblate translators", e)
|
||||
emptySet()
|
||||
}
|
||||
|
||||
|
||||
// helper to format lists in a localized way
|
||||
|
||||
private val listFormatter: ListFormatter? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
ListFormatter.getInstance()
|
||||
} else
|
||||
null
|
||||
|
||||
private fun formatList(list: List<String>): String =
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && listFormatter != null)
|
||||
listFormatter.format(list)
|
||||
else
|
||||
list.joinToString(", ")
|
||||
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui.about
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.tooling.preview.PreviewScreenSizes
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.window.core.layout.WindowSizeClass
|
||||
import at.bitfire.davdroid.R
|
||||
import at.bitfire.davdroid.ui.composable.WebViewCompat
|
||||
|
||||
@Composable
|
||||
fun TranslationsTab(
|
||||
weblateTranslators: String,
|
||||
transifexTranslators: String,
|
||||
windowSizeClass: WindowSizeClass = currentWindowAdaptiveInfo().windowSizeClass
|
||||
) {
|
||||
Column(Modifier
|
||||
.padding(8.dp)
|
||||
.verticalScroll(rememberScrollState())) {
|
||||
|
||||
val sideBySide = windowSizeClass.isWidthAtLeastBreakpoint(WindowSizeClass.WIDTH_DP_MEDIUM_LOWER_BOUND)
|
||||
if (sideBySide)
|
||||
Row {
|
||||
Translations_Engage(
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(end = 8.dp)
|
||||
)
|
||||
Translations_Translators(
|
||||
weblateTranslators = weblateTranslators,
|
||||
transifexTranslators = transifexTranslators,
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(start = 8.dp)
|
||||
)
|
||||
}
|
||||
else
|
||||
Column {
|
||||
Translations_Translators(
|
||||
weblateTranslators,
|
||||
transifexTranslators,
|
||||
modifier = Modifier.padding(bottom = 16.dp)
|
||||
)
|
||||
Translations_Engage()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun Translations_Translators(
|
||||
weblateTranslators: String,
|
||||
transifexTranslators: String,
|
||||
modifier: Modifier
|
||||
) {
|
||||
Column(modifier) {
|
||||
Text(
|
||||
text = stringResource(R.string.about_translations_thanks),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
modifier = Modifier.padding(bottom = 8.dp)
|
||||
)
|
||||
|
||||
Text(
|
||||
text = stringResource(R.string.about_translations_over_weblate),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
modifier = Modifier.padding(vertical = 4.dp)
|
||||
)
|
||||
Text(
|
||||
text = weblateTranslators,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
modifier = Modifier.padding(bottom = 8.dp)
|
||||
)
|
||||
|
||||
Text(
|
||||
text = stringResource(R.string.about_translations_over_transifex),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
modifier = Modifier.padding(vertical = 4.dp)
|
||||
)
|
||||
Text(
|
||||
text = transifexTranslators,
|
||||
style = MaterialTheme.typography.bodyMedium
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun Translations_Engage(modifier: Modifier = Modifier) {
|
||||
WebViewCompat(
|
||||
url = "https://hosted.weblate.org/engage/davx5/",
|
||||
modifier = modifier
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
@PreviewScreenSizes
|
||||
fun TranslationsTab_Previews() {
|
||||
TranslationsTab(
|
||||
weblateTranslators = "User A, User B, and User C",
|
||||
transifexTranslators = "User A and User D"
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui.composable
|
||||
|
||||
import android.content.Intent
|
||||
import android.view.ViewGroup
|
||||
import android.webkit.WebResourceRequest
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.viewinterop.AndroidView
|
||||
import io.ktor.http.HttpHeaders
|
||||
|
||||
@Composable
|
||||
fun WebViewCompat(
|
||||
url: String,
|
||||
modifier: Modifier = Modifier,
|
||||
layoutParams: ViewGroup.LayoutParams = ViewGroup.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
) {
|
||||
AndroidView(
|
||||
modifier = modifier,
|
||||
factory = { context ->
|
||||
WebView(context).apply {
|
||||
this.layoutParams = layoutParams
|
||||
webViewClient = object : WebViewClient() {
|
||||
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
|
||||
val intent = Intent(Intent.ACTION_VIEW, request.url)
|
||||
context.startActivity(intent)
|
||||
return true
|
||||
}
|
||||
}
|
||||
loadUrl(url, mapOf(
|
||||
HttpHeaders.AcceptLanguage to Locale.current.toLanguageTag()
|
||||
))
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
135
app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BackupsPage.kt
Normal file
135
app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BackupsPage.kt
Normal file
@@ -0,0 +1,135 @@
|
||||
/*
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui.intro
|
||||
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.outlined.Backup
|
||||
import androidx.compose.material3.Checkbox
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import at.bitfire.davdroid.R
|
||||
import at.bitfire.davdroid.settings.SettingsManager
|
||||
import at.bitfire.davdroid.ui.AppTheme
|
||||
import at.bitfire.davdroid.ui.composable.CardWithImage
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
|
||||
class BackupsPage @Inject constructor(
|
||||
val settingsManager: SettingsManager
|
||||
): IntroPage() {
|
||||
|
||||
override fun getShowPolicy(): ShowPolicy =
|
||||
if (Model.backupsAccepted(settingsManager))
|
||||
ShowPolicy.DONT_SHOW
|
||||
else
|
||||
ShowPolicy.SHOW_ALWAYS
|
||||
|
||||
@Composable
|
||||
override fun ComposePage() {
|
||||
val model = hiltViewModel<Model>()
|
||||
val accepted by model.backupsAcceptedFlow.collectAsStateWithLifecycle(false)
|
||||
BackupsPage(
|
||||
accepted = accepted,
|
||||
updateAccepted = model::setBackupsAccepted
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@HiltViewModel
|
||||
class Model @Inject constructor(
|
||||
private val settings: SettingsManager
|
||||
): ViewModel() {
|
||||
|
||||
val backupsAcceptedFlow = settings.getBooleanFlow(SETTING_BACKUPS_ACCEPTED, false)
|
||||
|
||||
fun setBackupsAccepted(accepted: Boolean) {
|
||||
settings.putBoolean(SETTING_BACKUPS_ACCEPTED, accepted)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
/** boolean setting (default: false) */
|
||||
const val SETTING_BACKUPS_ACCEPTED = "intro_backups_accepted"
|
||||
|
||||
fun backupsAccepted(settingsManager: SettingsManager): Boolean =
|
||||
settingsManager.getBooleanOrNull(SETTING_BACKUPS_ACCEPTED) ?: false
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BackupsPage(
|
||||
accepted: Boolean,
|
||||
updateAccepted: (Boolean) -> Unit
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.verticalScroll(rememberScrollState())
|
||||
.padding(8.dp)
|
||||
) {
|
||||
CardWithImage(
|
||||
title = stringResource(R.string.intro_backups_title),
|
||||
icon = Icons.Outlined.Backup,
|
||||
modifier = Modifier.padding(vertical = 8.dp)
|
||||
) {
|
||||
Text(
|
||||
text = stringResource(R.string.intro_backups_important),
|
||||
modifier = Modifier.padding(bottom = 8.dp)
|
||||
)
|
||||
Text(
|
||||
text = stringResource(R.string.intro_backups_something_wrong, stringResource(R.string.app_name))
|
||||
)
|
||||
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier.padding(top = 8.dp, bottom = 16.dp)
|
||||
) {
|
||||
Checkbox(
|
||||
checked = accepted,
|
||||
onCheckedChange = updateAccepted
|
||||
)
|
||||
Text(
|
||||
text = stringResource(R.string.intro_backups_accept),
|
||||
style = MaterialTheme.typography.bodyLarge,
|
||||
modifier = Modifier
|
||||
.clickable { updateAccepted(!accepted) }
|
||||
.padding(start = 8.dp)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun BackupsPagePreview() {
|
||||
AppTheme {
|
||||
BackupsPage(
|
||||
accepted = true,
|
||||
updateAccepted = {}
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -49,6 +49,7 @@ import at.bitfire.davdroid.ui.ExternalUris.withStatParams
|
||||
import at.bitfire.davdroid.ui.UiUtils.haveCustomTabs
|
||||
import at.bitfire.davdroid.ui.composable.Assistant
|
||||
import at.bitfire.davdroid.ui.composable.ProgressBar
|
||||
import io.ktor.http.HttpHeaders
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
object NextcloudLogin : LoginType {
|
||||
@@ -94,7 +95,7 @@ object NextcloudLogin : LoginType {
|
||||
browser.intent.data = loginUri
|
||||
browser.intent.putExtra(
|
||||
Browser.EXTRA_HEADERS,
|
||||
bundleOf("Accept-Language" to Locale.current.toLanguageTag())
|
||||
bundleOf(HttpHeaders.AcceptLanguage to Locale.current.toLanguageTag())
|
||||
)
|
||||
checkResultCallback.launch(browser.intent)
|
||||
} else {
|
||||
|
||||
@@ -1,406 +1,436 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!--common strings-->
|
||||
<!--common strings-->
|
||||
<string name="account_invalid">Account inesistente (o cancellato)</string>
|
||||
<string name="account_title_address_book">Rubrica DAVx⁵</string>
|
||||
<string name="dialog_delete">Cancella</string>
|
||||
<string name="dialog_remove">Elimina</string>
|
||||
<string name="dialog_deny">Annulla</string>
|
||||
<string name="dialog_enable">Attiva</string>
|
||||
<string name="field_required">Questo campo è necessario</string>
|
||||
<string name="help">Aiuto</string>
|
||||
<string name="options_menu">Menu opzioni</string>
|
||||
<string name="share">Condividi</string>
|
||||
<string name="sync_started">Sincronizzazione avviata</string>
|
||||
<string name="database_destructive_migration_title">Database danneggiato</string>
|
||||
<string name="database_destructive_migration_text">Tutti gli account sono stati rimossi localmente.</string>
|
||||
<string name="notification_channel_debugging">Debugging</string>
|
||||
<string name="notification_channel_general">Altri messaggi importanti</string>
|
||||
<string name="notification_channel_status">Messaggi di stato a bassa priorità</string>
|
||||
<string name="notification_channel_sync">Sincronizzazione</string>
|
||||
<string name="notification_channel_sync_errors">Errori di sincronizzazione</string>
|
||||
<string name="notification_channel_sync_errors_desc">Errori importanti che bloccano la sincronizzazione, come risposte inattese del server</string>
|
||||
<string name="notification_channel_sync_warnings">Avvisi di sincronizzazione</string>
|
||||
<string name="notification_channel_sync_warnings_desc">Problemi di sincronizzazione non gravi come alcuni file non validi</string>
|
||||
<string name="notification_channel_sync_io_errors">Errori di Rete e di I/O</string>
|
||||
<string name="notification_channel_sync_io_errors_desc">Timeouts, problemi di connessione, ecc. (spesso temporanei)</string>
|
||||
<!--IntroActivity-->
|
||||
<string name="account_title_address_book">Rubrica DAVx⁵</string>
|
||||
<string name="dialog_delete">Cancella</string>
|
||||
<string name="dialog_remove">Elimina</string>
|
||||
<string name="dialog_deny">Annulla</string>
|
||||
<string name="dialog_enable">Attiva</string>
|
||||
<string name="field_required">Questo campo è richiesto</string>
|
||||
<string name="help">Aiuto</string>
|
||||
<string name="options_menu">Menu opzioni</string>
|
||||
<string name="share">Condividi</string>
|
||||
<string name="sync_started">Sincronizzazione avviata/in attesa</string>
|
||||
<string name="database_destructive_migration_title">Database danneggiato</string>
|
||||
<string name="database_destructive_migration_text">Tutti gli account sono stati rimossi localmente.</string>
|
||||
<string name="notification_channel_debugging">Debugging</string>
|
||||
<string name="notification_channel_general">Altri messaggi importanti</string>
|
||||
<string name="notification_channel_status">Messaggi di stato a bassa priorità</string>
|
||||
<string name="notification_channel_sync">Sincronizzazione</string>
|
||||
<string name="notification_channel_sync_errors">Errori di sincronizzazione</string>
|
||||
<string name="notification_channel_sync_errors_desc">Errori importanti che bloccano la sincronizzazione, come risposte inattese del server</string>
|
||||
<string name="notification_channel_sync_warnings">Avvisi di sincronizzazione</string>
|
||||
<string name="notification_channel_sync_warnings_desc">Problemi di sincronizzazione non gravi come alcuni file non validi</string>
|
||||
<string name="notification_channel_sync_io_errors">Errori di Rete e di I/O</string>
|
||||
<string name="notification_channel_sync_io_errors_desc">Timeout, problemi di connessione, ecc. (spesso temporanei)</string>
|
||||
<!--IntroActivity-->
|
||||
<string name="intro_slogan1">Tuoi i dati. Tua la scelta.</string>
|
||||
<string name="intro_slogan2">Riprendi il controllo.</string>
|
||||
<string name="intro_battery_title">Intervalli di sincronizzazione regolari.</string>
|
||||
<string name="intro_battery_text">Per sincronizzare i dati a intervalli regolari, %s deve essere autorizzato a girare in background. Altrimenti Android può mettere in pausa gli aggiornamenti in qualunque momento.</string>
|
||||
<string name="intro_battery_dont_show">Non ho bisogno di sincronizzare a intervalli di tempo regolari.*</string>
|
||||
<string name="intro_autostart_title">%s compatibilità</string>
|
||||
<string name="intro_autostart_dont_show">Ho settato le impostazioni richieste. Non ricordarmelo più.</string>
|
||||
<string name="intro_leave_unchecked">* Lascia smarcato per fartelo ricordare dopo. Può essere reimpostato nelle impostazione dell\'app %s.</string>
|
||||
<string name="intro_more_info">Maggiori informazioni</string>
|
||||
<string name="intro_tasks_jtx_info"><![CDATA[Supporta la sincronizzazione di Attività, Diari e Note.]]></string>
|
||||
<string name="intro_tasks_title">Supporto per le attività</string>
|
||||
<string name="intro_tasks_text1">Se le attività sono supportate dal tuo server, possono essere sincronizzate con una app per attività supportata:</string>
|
||||
<string name="intro_tasks_opentasks">OpenTasks</string>
|
||||
<string name="intro_tasks_opentasks_info">Non sembra essere più sviluppato - non raccomandato.</string>
|
||||
<string name="intro_tasks_tasks_org">Tasks.org</string>
|
||||
<string name="intro_tasks_no_app_store">Nessun app store disponibile</string>
|
||||
<string name="intro_tasks_dont_show">Non ho bisogno del supporto alle attività.*</string>
|
||||
<string name="intro_open_source_title">Software open-source</string>
|
||||
<string name="intro_open_source_text">Siamo felici che tu usi %s, che è un software open source. Lo sviluppo, la manutenzione e il supporto sono compiti duri. Per piacere prendi in considerazione di dare una mano (puoi farlo in molti modi) o una donazione. Sarebbe davvero apprezzato!</string>
|
||||
<string name="intro_open_source_details">Come aiutare/donare</string>
|
||||
<!--PermissionsActivity-->
|
||||
<string name="intro_slogan2">Riprendi il controllo.</string>
|
||||
<string name="intro_battery_title">Intervalli di sincronizzazione regolari.</string>
|
||||
<string name="intro_battery_text">Per sincronizzare i dati a intervalli regolari, %s deve essere autorizzato a girare in background. Altrimenti Android può mettere in pausa gli aggiornamenti in qualunque momento.</string>
|
||||
<string name="intro_battery_dont_show">Non ho bisogno di sincronizzare a intervalli di tempo regolari.*</string>
|
||||
<string name="intro_autostart_title">%s compatibilità</string>
|
||||
<string name="intro_autostart_dont_show">Ho fatto le impostazioni richieste. Non ricordarmelo più.*</string>
|
||||
<string name="intro_leave_unchecked">* Lascia smarcato per fartelo ricordare dopo. Può essere reimpostato nelle impostazione dell\'app %s.</string>
|
||||
<string name="intro_more_info">Maggiori informazioni</string>
|
||||
<string name="intro_tasks_jtx_info"><![CDATA[Supporta la sincronizzazione di Attività, Diari e Note.]]></string>
|
||||
<string name="intro_tasks_title">Supporto delle attività</string>
|
||||
<string name="intro_tasks_text1">Se le attività sono supportate dal tuo server, possono essere sincronizzate con una app per attività fra quelle supportate:</string>
|
||||
<string name="intro_tasks_opentasks">OpenTasks</string>
|
||||
<string name="intro_tasks_opentasks_info">Non sembra essere più sviluppata - non raccomandata.</string>
|
||||
<string name="intro_tasks_tasks_org">Tasks.org</string>
|
||||
<string name="intro_tasks_no_app_store">Nessun app store disponibile</string>
|
||||
<string name="intro_tasks_dont_show">Non ho bisogno del supporto delle attività.*</string>
|
||||
<string name="intro_open_source_title">Software open-source</string>
|
||||
<string name="intro_open_source_text">Siamo felici che tu usi %s, che è un software open source. Lo sviluppo, la manutenzione e il supporto sono un duro lavoro. Per piacere prendi in considerazione di dare una mano (puoi farlo in molti modi) o una donazione. Lo apprezzeremmo davvero!</string>
|
||||
<string name="intro_open_source_details">Come contribuire/donare</string>
|
||||
<!--PermissionsActivity-->
|
||||
<string name="permissions_title">Autorizzazioni</string>
|
||||
<string name="permissions_text">%s richiede autorizzazioni per funzionare correttamente.</string>
|
||||
<string name="permissions_all_title">Tutti i seguenti</string>
|
||||
<string name="permissions_all_status_off">Usare questo per abilitare tutte le funzioni (consigliato)</string>
|
||||
<string name="permissions_all_status_on">Concedi tutte le autorizzazioni</string>
|
||||
<string name="permissions_contacts_title">Autorizzazioni per i contatti</string>
|
||||
<string name="permissions_contacts_status_off">Non sincronizzare i contatti (sconsigliato)</string>
|
||||
<string name="permissions_contacts_status_on">Possibilità di sincronizzare i contatti</string>
|
||||
<string name="permissions_calendar_title">Autorizzazioni per il calendario</string>
|
||||
<string name="permissions_calendar_status_off">Non sincronizzare il calendario (sconsigliato)</string>
|
||||
<string name="permissions_calendar_status_on">Permette di sincronizzare il calendario</string>
|
||||
<string name="permissions_notification_title">Autorizza notifiche</string>
|
||||
<string name="permissions_notification_status_off">Notifiche disabilitate (non consigliato)</string>
|
||||
<string name="permissions_notification_status_on">Notifiche attive</string>
|
||||
<string name="permissions_opentasks_title">Autorizzazioni di OpenTasks</string>
|
||||
<string name="permissions_tasksorg_title">Autorizzazioni delle attività</string>
|
||||
<string name="permissions_tasks_status_on">Permette di sincronizzare le attività</string>
|
||||
<string name="permissions_autoreset_title">Mantieni autorizzazioni</string>
|
||||
<string name="permissions_autoreset_status_off">Le autorizzazioni possono essere reimpostate automaticamente (sconsigliato)</string>
|
||||
<string name="permissions_autoreset_status_on">Le autorizzazioni non si reimposteranno automaticamente</string>
|
||||
<string name="permissions_autoreset_instruction">Fai click su Autorizzazioni > deseleziona \"Rimuovi autorizzazioni se l\'app non è in uso\"</string>
|
||||
<string name="permissions_app_settings_hint">Se uno slider non funziona, vai a impostazioni app/ autorizzazioni.</string>
|
||||
<string name="permissions_app_settings">Impostazioni app</string>
|
||||
<!--WifiPermissionsActivity-->
|
||||
<string name="permissions_text">%s ha bisogno di autorizzazioni per funzionare correttamente.</string>
|
||||
<string name="permissions_all_title">Autorizza tutto</string>
|
||||
<string name="permissions_all_status_off">Usa questo per abilitare tutte le funzioni (consigliato)</string>
|
||||
<string name="permissions_all_status_on">Concedi tutte le autorizzazioni</string>
|
||||
<string name="permissions_contacts_title">Autorizzazioni d\'accesso ai contatti</string>
|
||||
<string name="permissions_contacts_status_off">Non sincronizzare i contatti (sconsigliato)</string>
|
||||
<string name="permissions_contacts_status_on">Sincronizzazione della rubrica dei contatti possibile</string>
|
||||
<string name="permissions_calendar_title">Autorizzazioni per l\'accesso al calendario</string>
|
||||
<string name="permissions_calendar_status_off">Non sincronizzare il calendario (sconsigliato)</string>
|
||||
<string name="permissions_calendar_status_on">Sincronizzazione del calendario possibile</string>
|
||||
<string name="permissions_notification_title">Autorizza notifiche</string>
|
||||
<string name="permissions_notification_status_off">Notifiche disabilitate (non consigliato)</string>
|
||||
<string name="permissions_notification_status_on">Notifiche attivate</string>
|
||||
<string name="permissions_opentasks_title">Autorizzazioni di OpenTasks</string>
|
||||
<string name="permissions_tasksorg_title">Autorizzazioni delle attività</string>
|
||||
<string name="permissions_tasks_status_on">Sincronizzazione di attività possibile</string>
|
||||
<string name="permissions_autoreset_title">Mantieni le autorizzazioni</string>
|
||||
<string name="permissions_autoreset_status_off">Le autorizzazioni possono essere reinizializzate automaticamente (sconsigliato)</string>
|
||||
<string name="permissions_autoreset_status_on">Le autorizzazioni non si reinizializzeranno automaticamente</string>
|
||||
<string name="permissions_autoreset_instruction">Fai click su Autorizzazioni > deseleziona \"Gestisci l\'app se inutilizzata\"</string>
|
||||
<string name="permissions_app_settings_hint">Se uno pulsante non è utilizzabile, vai in impostazioni app/ autorizzazioni.</string>
|
||||
<string name="permissions_app_settings">Impostazioni app</string>
|
||||
<!--WifiPermissionsActivity-->
|
||||
<string name="wifi_permissions_label">Autorizzazioni per WiFi SSID</string>
|
||||
<string name="wifi_permissions_intro">Per poter accedere al nome dell\'attuale nome del WIFI (SSID), devono essere soddfsfatte queste condizioni:</string>
|
||||
<string name="wifi_permissions_location_permission">Autorizzazione precisa della localizzazione</string>
|
||||
<string name="wifi_permissions_location_permission_on">Garantire l\'autorizzazione della posizione</string>
|
||||
<string name="wifi_permissions_location_permission_off">Negare l\'autorizzazione della posizione</string>
|
||||
<string name="wifi_permissions_background_location_permission">Autorizzazione della posizione in background</string>
|
||||
<string name="wifi_permissions_background_location_permission_label">Permettere sempre</string>
|
||||
<string name="wifi_permissions_background_location_permission_on">Permessi di localizzazione impostati a: %s</string>
|
||||
<string name="wifi_permissions_background_location_permission_off">Permessi di localizzazione non impostati a: %s</string>
|
||||
<string name="wifi_permissions_location_enabled">Posizione sempre disabilitata</string>
|
||||
<string name="wifi_permissions_location_enabled_on">Servizio di posizione abiltato</string>
|
||||
<string name="wifi_permissions_location_enabled_off">Servizio di posizione disabilitato</string>
|
||||
<!--AboutActivity-->
|
||||
<string name="wifi_permissions_intro">Per poter accedere al nome (SSID) della rete WIFI attuale, devono essere soddisfatte queste condizioni:</string>
|
||||
<string name="wifi_permissions_location_permission">Autorizzazione per la localizzazione precisa</string>
|
||||
<string name="wifi_permissions_location_permission_on">Autorizzazione alla localizzazione concessa</string>
|
||||
<string name="wifi_permissions_location_permission_off">Autorizzazione alla localizzazione negata</string>
|
||||
<string name="wifi_permissions_background_location_permission">Autorizzazione alla localizzazione in background</string>
|
||||
<string name="wifi_permissions_background_location_permission_label">Permetti sempre</string>
|
||||
<string name="wifi_permissions_background_location_permission_on">Permessi di localizzazione impostati su: %s</string>
|
||||
<string name="wifi_permissions_background_location_permission_off">Permessi di localizzazione non impostati a: %s</string>
|
||||
<string name="wifi_permissions_location_enabled">Posizione sempre disabilitata</string>
|
||||
<string name="wifi_permissions_location_enabled_on">Il servizio di localizzazione è attivato</string>
|
||||
<string name="wifi_permissions_location_enabled_off">Il servizio di localizzazione è disabilitato</string>
|
||||
<!--AboutActivity-->
|
||||
<string name="about_translations">Traduzioni</string>
|
||||
<string name="about_libraries">Librerie</string>
|
||||
<string name="about_version">Versione %1$s (%2$d)</string>
|
||||
<string name="about_copyright">© Ricki Hirner, Bernhard Stockmann (bitfire web engineering GmbH) e contibutori</string>
|
||||
<string name="about_license_info_no_warranty">Il programma è distribuito SENZA ALCUNA GARANZIA. È software libero e può essere redistribuito sotto alcune condizioni.</string>
|
||||
<!--global settings-->
|
||||
<string name="about_libraries">Librerie</string>
|
||||
<string name="about_version">Versione %1$s (%2$d)</string>
|
||||
<string name="about_copyright">© Ricki Hirner, Bernhard Stockmann (bitfire web engineering GmbH) e contibutori</string>
|
||||
<string name="about_license_info_no_warranty">Il programma è distribuito SENZA ALCUNA GARANZIA. È software libero e può essere redistribuito sotto alcune condizioni.</string>
|
||||
<!--global settings-->
|
||||
<string name="logging_couldnt_create_file">Impossibile creare il file di log</string>
|
||||
<string name="logging_notification_text">Adesso l\'accesso all\' %s delle attività </string>
|
||||
<string name="logging_notification_view_share">Visualizza/condividi</string>
|
||||
<string name="logging_notification_disable">Disabilita</string>
|
||||
<!--AccountsScreen-->
|
||||
<string name="navigation_drawer_subtitle">CalDAV/CardDAV adattatore di sincronizzazione</string>
|
||||
<string name="navigation_drawer_about">Informazioni / Licenza</string>
|
||||
<string name="navigation_drawer_beta_feedback">Feedback sulla beta</string>
|
||||
<string name="install_browser">Installare un browser Web</string>
|
||||
<string name="navigation_drawer_settings">Impostazioni</string>
|
||||
<string name="navigation_drawer_news_updates">Notizie & aggiornamenti</string>
|
||||
<string name="navigation_drawer_tools">Strumenti</string>
|
||||
<string name="navigation_drawer_external_links">Link esterni</string>
|
||||
<string name="navigation_drawer_website">Sito web</string>
|
||||
<string name="navigation_drawer_manual">Manuale</string>
|
||||
<string name="navigation_drawer_faq">Domande Frequenti</string>
|
||||
<string name="navigation_drawer_community">Comunità</string>
|
||||
<string name="navigation_drawer_support_project">Supporta il progetto</string>
|
||||
<string name="navigation_drawer_contribute">Come contribuire</string>
|
||||
<string name="navigation_drawer_privacy_policy">Politica sulla riservatezza</string>
|
||||
<string name="accounts_sync_all">Sincronizzazione di tutti gli account</string>
|
||||
<!--Sync warnings-->
|
||||
<string name="sync_warning_no_notification_permission">Notifiche non attive. Non sarai avvisato di eventuali errori di sincronizzazione</string>
|
||||
<string name="sync_warning_manage_connections">Gestione connessioni</string>
|
||||
<string name="sync_warning_datasaver_enabled">Risparmio dati attivo. La sincronizzazione in background è limitata,</string>
|
||||
<string name="sync_warning_battery_saver_enabled">Risparmio energetico attivo. La sincronizzazione in background è limitata,</string>
|
||||
<string name="sync_warning_manage_battery_saver">Gestisci risparmio energetico</string>
|
||||
<string name="sync_warning_low_storage">Spazio di memorizzazione scarso. Androin non salverà immediatamente i cambiamente, ma alla prossima sincronizzazione programmata.</string>
|
||||
<string name="sync_warning_manage_storage">Gestisci spazio di memorizzazione</string>
|
||||
<!--RefreshCollectionsWorker-->
|
||||
<string name="logging_notification_text">Adesso tutte le attività di %s saranno registrate</string>
|
||||
<string name="logging_notification_view_share">Visualizza/condividi</string>
|
||||
<string name="logging_notification_disable">Disabilita</string>
|
||||
<!--AccountsScreen-->
|
||||
<string name="navigation_drawer_subtitle">Adattatore di sincronizzazione CalDAV/CardDAV</string>
|
||||
<string name="navigation_drawer_about">Informazioni / Licenza</string>
|
||||
<string name="navigation_drawer_beta_feedback">Feedback sulla beta</string>
|
||||
<string name="install_browser">Installare un browser Web</string>
|
||||
<string name="navigation_drawer_settings">Impostazioni</string>
|
||||
<string name="navigation_drawer_news_updates">Notizie & aggiornamenti</string>
|
||||
<string name="navigation_drawer_tools">Strumenti</string>
|
||||
<string name="navigation_drawer_external_links">Link esterni</string>
|
||||
<string name="navigation_drawer_website">Sito web</string>
|
||||
<string name="navigation_drawer_manual">Manuale</string>
|
||||
<string name="navigation_drawer_faq">Domande Frequenti</string>
|
||||
<string name="navigation_drawer_community">Comunità</string>
|
||||
<string name="navigation_drawer_support_project">Sostieni il progetto</string>
|
||||
<string name="navigation_drawer_contribute">Come contribuire</string>
|
||||
<string name="navigation_drawer_privacy_policy">Politica sulla riservatezza</string>
|
||||
<string name="accounts_sync_all">Sincronizzazione di tutti gli account</string>
|
||||
<!--Sync warnings-->
|
||||
<string name="sync_warning_no_notification_permission">Notifiche disattivate. Non sarai avvisato di eventuali errori di sincronizzazione</string>
|
||||
<string name="sync_warning_manage_connections">Gestione connessioni</string>
|
||||
<string name="sync_warning_datasaver_enabled">Risparmio dati attivo. La sincronizzazione in background è limitata.</string>
|
||||
<string name="sync_warning_battery_saver_enabled">Risparmio energetico attivo. La sincronizzazione in background è limitata.</string>
|
||||
<string name="sync_warning_manage_battery_saver">Gestisci risparmio energetico</string>
|
||||
<string name="sync_warning_low_storage">Spazio di memorizzazione scarso. Android non salverà immediatamente i cambiamenti, ma alla prossima sincronizzazione programmata.</string>
|
||||
<string name="sync_warning_manage_storage">Gestisci spazio di memorizzazione</string>
|
||||
<!--RefreshCollectionsWorker-->
|
||||
<string name="refresh_collections_worker_refresh_failed">Impossibile trovare il servizio</string>
|
||||
<string name="refresh_collections_worker_refresh_couldnt_refresh">Impossibile aggiornare la lista delle raccolte</string>
|
||||
<!--Foreground service used by WorkManager on Android <12-->
|
||||
<string name="refresh_collections_worker_refresh_couldnt_refresh">Impossibile aggiornare la lista delle raccolte</string>
|
||||
<!--Foreground service used by WorkManager on Android <12-->
|
||||
<string name="foreground_service_notify_title">Esecuzione in primo piano</string>
|
||||
<string name="foreground_service_notify_text">Su alcuni dispositivi, questo è necessario per la sincronizzazione automatica.</string>
|
||||
<!--AppSettingsActivity-->
|
||||
<string name="foreground_service_notify_text">Su alcuni dispositivi, questo è necessario per la sincronizzazione automatica.</string>
|
||||
<!--AppSettingsActivity-->
|
||||
<string name="app_settings">Impostazioni</string>
|
||||
<string name="app_settings_debug">Debug</string>
|
||||
<string name="app_settings_show_debug_info">Mostra informazioni di debug</string>
|
||||
<string name="app_settings_logging">Log completo</string>
|
||||
<string name="app_settings_logging_off">Log disabilitato</string>
|
||||
<string name="app_settings_battery_optimization">Ottimizzazione batteria</string>
|
||||
<string name="app_settings_connection">Connessione</string>
|
||||
<string name="app_settings_proxy">Tipo di proxy</string>
|
||||
<string-array name="app_settings_proxy_types">
|
||||
<item>Predefinito di sistema</item>
|
||||
<item>Nessun proxy</item>
|
||||
<item>HTTP</item>
|
||||
<item>SOCKS (per Orbot)</item>
|
||||
</string-array>
|
||||
<string name="app_settings_proxy_host">Nome host proxy</string>
|
||||
<string name="app_settings_proxy_port">Porta proxy</string>
|
||||
<string name="app_settings_security">Sicurezza</string>
|
||||
<string name="app_settings_security_app_permissions">Autorizzazioni app</string>
|
||||
<string name="app_settings_security_app_permissions_summary">Controlla le autorizzazioni per la sincronizzazione</string>
|
||||
<string name="app_settings_distrust_system_certs">Non ti fidare dei certificati di sistema</string>
|
||||
<string name="app_settings_distrust_system_certs_on">Le CA di sistema e quelle aggiunte dall\'utente non sono affidabili</string>
|
||||
<string name="app_settings_distrust_system_certs_off">Le CA di sistema e quelle aggiunte dall\'utente sono affidabili (raccomandato)</string>
|
||||
<string name="app_settings_reset_certificates">Reimposta la fiducia in tutti i certificati</string>
|
||||
<string name="app_settings_reset_certificates_summary">Reimposta la fiducia nei certificati aggiunti</string>
|
||||
<string name="app_settings_reset_certificates_success">Sono stati cancellati tutti i certificati aggiunti</string>
|
||||
<string name="app_settings_user_interface">Interfaccia utente</string>
|
||||
<string name="app_settings_notification_settings">Impostazioni di notifica</string>
|
||||
<string name="app_settings_notification_settings_summary">Gestisci i canali di notifica e le loro impostazioni</string>
|
||||
<string name="app_settings_theme_title">Seleziona il tema</string>
|
||||
<string-array name="app_settings_theme_names">
|
||||
<item> Sistema predefinito </item>
|
||||
<item> Luce </item>
|
||||
<item> Buio </item>
|
||||
</string-array>
|
||||
<string name="app_settings_reset_hints">Reimposta i suggerimenti</string>
|
||||
<string name="app_settings_reset_hints_summary">Riabilita i suggerimenti precedentemente disabilitati</string>
|
||||
<string name="app_settings_reset_hints_success">I suggerimenti verranno mostrati</string>
|
||||
<string name="app_settings_integration">Integrazione</string>
|
||||
<string name="app_settings_tasks_provider">Funzioni dell\'applicazione</string>
|
||||
<string name="app_settings_tasks_provider_none">Nessuna applicazione compatibile con e funzionalità trovata</string>
|
||||
<!--AccountScreen-->
|
||||
<string name="app_settings_debug">Debug</string>
|
||||
<string name="app_settings_show_debug_info">Mostra informazioni di debug</string>
|
||||
<string name="app_settings_logging">Log completo</string>
|
||||
<string name="app_settings_logging_off">Log disabilitato</string>
|
||||
<string name="app_settings_battery_optimization">Ottimizzazione batteria</string>
|
||||
<string name="app_settings_connection">Connessione</string>
|
||||
<string name="app_settings_proxy">Tipo di proxy</string>
|
||||
<string-array name="app_settings_proxy_types">
|
||||
<item>Predefinito di sistema</item>
|
||||
<item>Nessun proxy</item>
|
||||
<item>HTTP</item>
|
||||
<item>SOCKS (per Orbot)</item>
|
||||
</string-array>
|
||||
<string name="app_settings_proxy_host">Nome host proxy</string>
|
||||
<string name="app_settings_proxy_port">Porta proxy</string>
|
||||
<string name="app_settings_security">Sicurezza</string>
|
||||
<string name="app_settings_security_app_permissions">Autorizzazioni app</string>
|
||||
<string name="app_settings_security_app_permissions_summary">Controlla le autorizzazioni per la sincronizzazione</string>
|
||||
<string name="app_settings_distrust_system_certs">Non ti fidare dei certificati di sistema</string>
|
||||
<string name="app_settings_distrust_system_certs_on">Le CA di sistema e quelle aggiunte dall\'utente non sono affidabili</string>
|
||||
<string name="app_settings_distrust_system_certs_off">Le CA di sistema e quelle aggiunte dall\'utente sono affidabili (raccomandato)</string>
|
||||
<string name="app_settings_reset_certificates">Reimposta la fiducia in tutti i certificati</string>
|
||||
<string name="app_settings_reset_certificates_summary">Reimposta la fiducia nei certificati aggiunti</string>
|
||||
<string name="app_settings_reset_certificates_success">Sono stati cancellati tutti i certificati aggiunti</string>
|
||||
<string name="app_settings_user_interface">Interfaccia utente</string>
|
||||
<string name="app_settings_notification_settings">Impostazioni di notifica</string>
|
||||
<string name="app_settings_notification_settings_summary">Gestisci i canali di notifica e le loro impostazioni</string>
|
||||
<string name="app_settings_theme_title">Seleziona il tema</string>
|
||||
<string-array name="app_settings_theme_names">
|
||||
<item> Sistema predefinito </item>
|
||||
<item> Luce </item>
|
||||
<item> Buio </item>
|
||||
</string-array>
|
||||
<string name="app_settings_reset_hints">Reimposta i suggerimenti</string>
|
||||
<string name="app_settings_reset_hints_summary">Riabilita i suggerimenti precedentemente disabilitati</string>
|
||||
<string name="app_settings_reset_hints_success">I suggerimenti verranno mostrati</string>
|
||||
<string name="app_settings_integration">Integrazione</string>
|
||||
<string name="app_settings_tasks_provider">Funzioni dell\'applicazione</string>
|
||||
<string name="app_settings_tasks_provider_none">Nessuna applicazione compatibile con e funzionalità trovata</string>
|
||||
<!--AccountScreen-->
|
||||
<string name="account_carddav">CardDAV</string>
|
||||
<string name="account_caldav">CalDAV</string>
|
||||
<string name="account_webcal">Webcal</string>
|
||||
<string name="account_missing_permissions">Per sincronizzare questi dati sono richiesti permessi aggiuntivi.</string>
|
||||
<string name="account_manage_permissions">Gestisci permessi</string>
|
||||
<string name="account_synchronize_now">Sincronizza adesso</string>
|
||||
<string name="account_settings">Impostazioni account</string>
|
||||
<string name="account_rename">Rinomina account</string>
|
||||
<string name="account_rename_new_name_description">Dati locali non salvati potrebbero venir persi. Dopo il cambio nome è necessaria la ri-sincronizzazione.</string>
|
||||
<string name="account_rename_new_name">Nuovo nome account</string>
|
||||
<string name="account_rename_rename">Rinomina</string>
|
||||
<string name="account_rename_exists_already">Nome account già usato</string>
|
||||
<string name="account_rename_couldnt_rename">Impossibile rinominare l\'account</string>
|
||||
<string name="account_delete">Elimina account</string>
|
||||
<string name="account_delete_confirmation_title">Cancellare l\'account?</string>
|
||||
<string name="account_delete_confirmation_text">Tutte le copie locali delle rubriche, dei calendari e degli elenchi attività verranno eliminate.</string>
|
||||
<string name="account_synchronize_this_collection">Sincronizza questa raccolta</string>
|
||||
<string name="account_read_only">sola lettura</string>
|
||||
<string name="account_calendar">calendario</string>
|
||||
<string name="account_contacts">contatti</string>
|
||||
<string name="account_journal">diario</string>
|
||||
<string name="account_task_list">attività</string>
|
||||
<string name="account_only_personal">Mostra solo personale</string>
|
||||
<string name="account_refresh_collections">Aggiorna lista</string>
|
||||
<string name="account_webcal_external_app">Sottoscrizioni al Webcal possono essere sincronizzate con applicazioni esterne.</string>
|
||||
<string name="account_no_webcal_handler_found">Non ho trovato nessuna applicazione abilitata per Webcal</string>
|
||||
<string name="account_install_icsx5">Installa ICSx⁵</string>
|
||||
<!--AddAccountActivity-->
|
||||
<string name="account_caldav">CalDAV</string>
|
||||
<string name="account_webcal">Webcal</string>
|
||||
<string name="account_missing_permissions">Per sincronizzare questi dati sono richiesti permessi aggiuntivi.</string>
|
||||
<string name="account_manage_permissions">Gestisci permessi</string>
|
||||
<string name="account_synchronize_now">Sincronizza adesso</string>
|
||||
<string name="account_settings">Impostazioni account</string>
|
||||
<string name="account_rename">Rinomina account</string>
|
||||
<string name="account_rename_new_name_description">Dati locali non salvati potrebbero venir persi. Dopo il cambio nome è necessaria la ri-sincronizzazione.</string>
|
||||
<string name="account_rename_new_name">Nuovo nome account</string>
|
||||
<string name="account_rename_rename">Rinomina</string>
|
||||
<string name="account_rename_exists_already">Nome account già usato</string>
|
||||
<string name="account_rename_couldnt_rename">Impossibile rinominare l\'account</string>
|
||||
<string name="account_delete">Elimina account</string>
|
||||
<string name="account_delete_confirmation_title">Cancellare l\'account?</string>
|
||||
<string name="account_delete_confirmation_text">Tutte le copie locali delle rubriche, dei calendari e degli elenchi attività verranno eliminate.</string>
|
||||
<string name="account_synchronize_this_collection">Sincronizza questa raccolta</string>
|
||||
<string name="account_read_only">sola lettura</string>
|
||||
<string name="account_calendar">calendario</string>
|
||||
<string name="account_contacts">contatti</string>
|
||||
<string name="account_journal">diario</string>
|
||||
<string name="account_task_list">attività</string>
|
||||
<string name="account_only_personal">Mostra solo personale</string>
|
||||
<string name="account_refresh_collections">Aggiorna lista</string>
|
||||
<string name="account_webcal_external_app">Sottoscrizioni al Webcal possono essere sincronizzate con applicazioni esterne.</string>
|
||||
<string name="account_no_webcal_handler_found">Non ho trovato nessuna applicazione abilitata per Webcal</string>
|
||||
<string name="account_install_icsx5">Installa ICSx⁵</string>
|
||||
<!--AddAccountActivity-->
|
||||
<string name="login_title">Aggiungi account</string>
|
||||
<string name="login_generic_login">Login generico</string>
|
||||
<string name="login_provider_login">Login del Provider</string>
|
||||
<string name="login_continue">Continua</string>
|
||||
<string name="login_login">Login</string>
|
||||
<string name="login_type_email">Accedi con indirizzo email</string>
|
||||
<string name="login_email_address">Indirizzo email</string>
|
||||
<string name="login_email_address_error">È necessario un indirizzo email valido</string>
|
||||
<string name="login_email_address_info"><![CDATA[Viene usato il dominio dell\'email come URL base. <a href="%s">I servizi sono individuati </a> usando record DNS e le URL well-known.]]></string>
|
||||
<string name="login_password">Password</string>
|
||||
<string name="login_password_hide">Nascondi password</string>
|
||||
<string name="login_password_show">Mostra password</string>
|
||||
<string name="login_type_url">Accedi con URL e nome utente</string>
|
||||
<string name="login_user_name">Nome utente</string>
|
||||
<string name="login_base_url">Base URL</string>
|
||||
<string name="login_base_url_info"><![CDATA[La URL base viene controllata direttamente, ma <a href="%s">i servizi sono individuati anche </a> usando record DNS records e le URL well-known.]]></string>
|
||||
<string name="login_select_certificate">Seleziona certificato</string>
|
||||
<string name="login_add_account">Aggiungi account</string>
|
||||
<string name="login_account_name">Nome account</string>
|
||||
<string name="login_account_avoid_apostrophe">L\'uso degli apostrofi (\') potrebbe causare problemi su alcuni dispositivi.</string>
|
||||
<string name="login_account_name_info">Inserisci il tuo indirizzo email come nome dell\'account in quanto Android userà il nome dell\'account nel campo ORGANIZER degli eventi creati. Non è possibile avere due account con nome uguale.</string>
|
||||
<string name="login_account_contact_group_method">Metodo del contact group:</string>
|
||||
<string name="login_account_name_required">Richiesto il nome dell\'account</string>
|
||||
<string name="login_account_name_already_taken">Nome account già usato</string>
|
||||
<string name="login_type_advanced">Login avanzato</string>
|
||||
<string name="login_client_certificate_selected">Certificato client: %s</string>
|
||||
<string name="login_no_certificate_found">Nessun certificato trovato</string>
|
||||
<string name="login_install_certificate">Installa il certificato</string>
|
||||
<string name="login_type_google">Contatti Google / Calendario</string>
|
||||
<string name="login_google_account">Account Google</string>
|
||||
<string name="login_google">Accedi con Google</string>
|
||||
<string name="login_google_client_id">ID Client (facoltativo)</string>
|
||||
<string name="login_google_client_limited_use"><![CDATA[%1$s è conforme alla <a href="%2$s">Google API Services User Data Policy</a>, incluso il Limited Use requirements.]]></string>
|
||||
<string name="login_oauth_couldnt_obtain_auth_code">Non posso ottenere il codice di autorizzazione</string>
|
||||
<string name="login_type_nextcloud">Nextcloud</string>
|
||||
<string name="login_nextcloud_login_with_nextcloud">Accedi con Nextcloud</string>
|
||||
<string name="login_nextcloud_login_flow_text">Questo aprirà la pagina di login di Nextcloud nel browser.</string>
|
||||
<string name="login_nextcloud_login_flow_server_address">Indirizzo del server Nextcloud</string>
|
||||
<string name="login_nextcloud_login_flow_sign_in">Iscriviti</string>
|
||||
<string name="login_nextcloud_login_flow_no_login_url">Non posso ottenere l\'URL di login</string>
|
||||
<string name="login_nextcloud_login_flow_no_login_data">Non posso ottenere i dati di login</string>
|
||||
<string name="login_configuration_detection">Rilevazione configurazione</string>
|
||||
<string name="login_querying_server">Attendere, invio richiesta al server…</string>
|
||||
<string name="login_no_service">Impossibile trovare servizi CalDAV o CardDAV.</string>
|
||||
<string name="login_no_service_info">L\'URL base non sembra essere un URL CalDAV/CardDAV accessibile e i servizi di individuazione hanno fallito.</string>
|
||||
<string name="login_check_credentials">Controlla attentamente i dati di autenticazione (normalmente username e password).</string>
|
||||
<string name="login_logs_available">Informazioni tecniche aggiuntive sono reperibili nei log.</string>
|
||||
<string name="login_view_logs">Vedi i registri</string>
|
||||
<!--AccountSettingsActivity-->
|
||||
<string name="login_generic_login">Login generico</string>
|
||||
<string name="login_provider_login">Login del Provider</string>
|
||||
<string name="login_continue">Continua</string>
|
||||
<string name="login_login">Login</string>
|
||||
<string name="login_type_email">Accedi con indirizzo email</string>
|
||||
<string name="login_email_address">Indirizzo email</string>
|
||||
<string name="login_email_address_error">È necessario un indirizzo email valido</string>
|
||||
<string name="login_email_address_info"><![CDATA[Viene usato il dominio dell\'email come URL base. <a href="%s">I servizi sono individuati </a> usando record DNS e le URL well-known.]]></string>
|
||||
<string name="login_password">Password</string>
|
||||
<string name="login_password_hide">Nascondi password</string>
|
||||
<string name="login_password_show">Mostra password</string>
|
||||
<string name="login_type_url">Accedi con URL e nome utente</string>
|
||||
<string name="login_user_name">Nome utente</string>
|
||||
<string name="login_base_url">Base URL</string>
|
||||
<string name="login_base_url_info"><![CDATA[La URL base viene controllata direttamente, ma <a href="%s">i servizi sono individuati anche </a> usando record DNS records e le URL well-known.]]></string>
|
||||
<string name="login_select_certificate">Seleziona certificato</string>
|
||||
<string name="login_add_account">Aggiungi account</string>
|
||||
<string name="login_account_name">Nome account</string>
|
||||
<string name="login_account_avoid_apostrophe">L\'uso degli apostrofi (\') potrebbe causare problemi su alcuni dispositivi.</string>
|
||||
<string name="login_account_name_info">Inserisci il tuo indirizzo email come nome dell\'account in quanto Android userà il nome dell\'account nel campo ORGANIZER degli eventi creati. Non è possibile avere due account con nome uguale.</string>
|
||||
<string name="login_account_contact_group_method">Metodo del contact group:</string>
|
||||
<string name="login_account_name_required">Richiesto il nome dell\'account</string>
|
||||
<string name="login_account_name_already_taken">Nome account già usato</string>
|
||||
<string name="login_type_advanced">Login avanzato</string>
|
||||
<string name="login_client_certificate_selected">Certificato client: %s</string>
|
||||
<string name="login_no_certificate_found">Nessun certificato trovato</string>
|
||||
<string name="login_install_certificate">Installa il certificato</string>
|
||||
<string name="login_type_google">Contatti Google / Calendario</string>
|
||||
<string name="login_google_account">Account Google</string>
|
||||
<string name="login_google">Accedi con Google</string>
|
||||
<string name="login_google_client_id">ID Client (facoltativo)</string>
|
||||
<string name="login_google_client_limited_use"><![CDATA[%1$s è conforme alla <a href="%2$s">Google API Services User Data Policy</a>, incluso il Limited Use requirements.]]></string>
|
||||
<string name="login_oauth_couldnt_obtain_auth_code">Non posso ottenere il codice di autorizzazione</string>
|
||||
<string name="login_type_nextcloud">Nextcloud</string>
|
||||
<string name="login_nextcloud_login_with_nextcloud">Accedi con Nextcloud</string>
|
||||
<string name="login_nextcloud_login_flow_text">Questo aprirà la pagina di login di Nextcloud nel browser.</string>
|
||||
<string name="login_nextcloud_login_flow_server_address">Indirizzo del server Nextcloud</string>
|
||||
<string name="login_nextcloud_login_flow_sign_in">Iscriviti</string>
|
||||
<string name="login_nextcloud_login_flow_no_login_url">Non posso ottenere l\'URL di login</string>
|
||||
<string name="login_nextcloud_login_flow_no_login_data">Non posso ottenere i dati di login</string>
|
||||
<string name="login_configuration_detection">Rilevazione configurazione</string>
|
||||
<string name="login_querying_server">Attendere, invio richiesta al server…</string>
|
||||
<string name="login_no_service">Impossibile trovare servizi CalDAV o CardDAV.</string>
|
||||
<string name="login_no_service_info">L\'URL base non sembra essere un URL CalDAV/CardDAV accessibile e i servizi di individuazione hanno fallito.</string>
|
||||
<string name="login_check_credentials">Controlla attentamente i dati di autenticazione (normalmente username e password).</string>
|
||||
<string name="login_logs_available">Informazioni tecniche aggiuntive sono reperibili nei log.</string>
|
||||
<string name="login_view_logs">Vedi i registri</string>
|
||||
<!--AccountSettingsActivity-->
|
||||
<string name="settings_sync">Sincronizzazione</string>
|
||||
<string name="settings_sync_interval_contacts">Intervallo sincr. Contatti</string>
|
||||
<string name="settings_sync_summary_manually">Solo manualmente</string>
|
||||
<string name="settings_sync_summary_periodically" tools:ignore="PluralsCandidate">Ogni %d minuti e a seguito di ogni cambiamento locale</string>
|
||||
<string name="settings_sync_interval_calendars">Intervallo sincr. calendari</string>
|
||||
<string name="settings_sync_interval_tasks">Intervallo sincr. attività</string>
|
||||
<string-array name="settings_sync_interval_names">
|
||||
<item>Solo manualmente</item>
|
||||
<item>Ogni 15 minuti</item>
|
||||
<item>Ogni 30 minuti</item>
|
||||
<item>Ogni ora</item>
|
||||
<item>Ogni 2 ore</item>
|
||||
<item>Ogni 4 ore</item>
|
||||
<item>Una volta al giorno</item>
|
||||
</string-array>
|
||||
<string name="settings_sync_wifi_only">Sincr. solo tramite WiFi</string>
|
||||
<string name="settings_sync_wifi_only_on">La sincronizzazione è limitata alle connessioni WiFi</string>
|
||||
<string name="settings_sync_wifi_only_off">Il tipo di connessione non è preso in considerazione</string>
|
||||
<string name="settings_sync_wifi_only_ssids">Restrizione SSID WiFi</string>
|
||||
<string name="settings_sync_wifi_only_ssids_on">Sincronizzeremo solo oltre %s</string>
|
||||
<string name="settings_sync_wifi_only_ssids_off">Verranno utilizzate tutte le connessioni WIFI </string>
|
||||
<string name="settings_sync_wifi_only_ssids_message">Nomi (SSID) delle reti WiFi autorizzate separati da virgola (lascia vuoto per autorizzarle tutte)</string>
|
||||
<string name="settings_sync_wifi_only_ssids_permissions_required">Le restrizioni del SSID WIFI richiedono ulteriori impostazioni</string>
|
||||
<string name="settings_sync_wifi_only_ssids_permissions_action">Riuscire</string>
|
||||
<string name="settings_ignore_vpns">La VPN richiede connessione internet</string>
|
||||
<string name="settings_ignore_vpns_on">La VPN senza una connessione internet validata non è sufficiente per lanciare la sincronizzazione (raccomandato)</string>
|
||||
<string name="settings_ignore_vpns_off">La VPN senza una connessione internet validata è sufficiente per lanciare la sincronizzazione</string>
|
||||
<string name="settings_authentication">Autenticazione</string>
|
||||
<string name="settings_username">Nome utente</string>
|
||||
<string name="settings_new_password">Nuova password</string>
|
||||
<string name="settings_password_summary">Aggiorna la password come sul tuo server.</string>
|
||||
<string name="settings_certificate_alias">Certificato client</string>
|
||||
<string name="settings_certificate_alias_empty">Nessun certificato disponibile o selezionato</string>
|
||||
<string name="settings_certificate_install">Installa il certificato</string>
|
||||
<string name="settings_caldav">CalDAV</string>
|
||||
<string name="settings_sync_time_range_past">Limite di tempo per gli eventi trascorsi</string>
|
||||
<string name="settings_sync_time_range_past_none">Verranno sincronizzati tutti gli eventi</string>
|
||||
<plurals name="settings_sync_time_range_past_days">
|
||||
<item quantity="one">Eventi più vecchi di un giorno saranno ignorati</item>
|
||||
<item quantity="many">Eventi più vecchi di %d giorni saranno ignorati</item>
|
||||
<item quantity="other">Eventi più vecchi di %d giorni saranno ignorati</item>
|
||||
</plurals>
|
||||
<string name="settings_sync_time_range_past_message">Eventi più vecchi di questo numero di giorni verranno ignorati(può anche essere 0). Lasciare in bianco per sincronizzare tutti gli eventi.</string>
|
||||
<string name="settings_default_alarm">Promemoria predefinito</string>
|
||||
<plurals name="settings_default_alarm_on">
|
||||
<item quantity="one">Promemoria predefinito un minuto prima dell\'evento</item>
|
||||
<item quantity="many">Promemoria predefinito %d minuti prima dell\'evento</item>
|
||||
<item quantity="other">Promemoria predefinito %d minuti prima dell\'evento</item>
|
||||
</plurals>
|
||||
<string name="settings_default_alarm_off">Nessun promemoria di default creato</string>
|
||||
<string name="settings_default_alarm_message">Indicare il numero di minuti che si desidera per il promemoria predefinito.
|
||||
<string name="settings_sync_interval_contacts">Intervallo sincr. Contatti</string>
|
||||
<string name="settings_sync_summary_manually">Solo manualmente</string>
|
||||
<string name="settings_sync_summary_periodically" tools:ignore="PluralsCandidate">Ogni %d minuti e a seguito di ogni cambiamento locale</string>
|
||||
<string name="settings_sync_interval_calendars">Intervallo sincr. calendari</string>
|
||||
<string name="settings_sync_interval_tasks">Intervallo sincr. attività</string>
|
||||
<string-array name="settings_sync_interval_names">
|
||||
<item>Solo manualmente</item>
|
||||
<item>Ogni 15 minuti</item>
|
||||
<item>Ogni 30 minuti</item>
|
||||
<item>Ogni ora</item>
|
||||
<item>Ogni 2 ore</item>
|
||||
<item>Ogni 4 ore</item>
|
||||
<item>Una volta al giorno</item>
|
||||
</string-array>
|
||||
<string name="settings_sync_wifi_only">Sincr. solo tramite WiFi</string>
|
||||
<string name="settings_sync_wifi_only_on">La sincronizzazione è limitata alle connessioni WiFi</string>
|
||||
<string name="settings_sync_wifi_only_off">Il tipo di connessione non è preso in considerazione</string>
|
||||
<string name="settings_sync_wifi_only_ssids">Restrizione SSID WiFi</string>
|
||||
<string name="settings_sync_wifi_only_ssids_on">Sincronizzeremo solo oltre %s</string>
|
||||
<string name="settings_sync_wifi_only_ssids_off">Verranno utilizzate tutte le connessioni WIFI </string>
|
||||
<string name="settings_sync_wifi_only_ssids_message">Nomi (SSID) delle reti WiFi autorizzate separati da virgola (lascia vuoto per autorizzarle tutte)</string>
|
||||
<string name="settings_sync_wifi_only_ssids_permissions_required">Le restrizioni del SSID WIFI richiedono ulteriori impostazioni</string>
|
||||
<string name="settings_sync_wifi_only_ssids_permissions_action">Riuscire</string>
|
||||
<string name="settings_ignore_vpns">La VPN richiede connessione internet</string>
|
||||
<string name="settings_ignore_vpns_on">La VPN senza una connessione internet validata non è sufficiente per lanciare la sincronizzazione (raccomandato)</string>
|
||||
<string name="settings_ignore_vpns_off">La VPN senza una connessione internet validata è sufficiente per lanciare la sincronizzazione</string>
|
||||
<string name="settings_authentication">Autenticazione</string>
|
||||
<string name="settings_username">Nome utente</string>
|
||||
<string name="settings_new_password">Nuova password</string>
|
||||
<string name="settings_password_summary">Aggiorna la password come sul tuo server.</string>
|
||||
<string name="settings_certificate_alias">Certificato client</string>
|
||||
<string name="settings_certificate_alias_empty">Nessun certificato disponibile o selezionato</string>
|
||||
<string name="settings_certificate_install">Installa il certificato</string>
|
||||
<string name="settings_caldav">CalDAV</string>
|
||||
<string name="settings_sync_time_range_past">Limite di tempo per gli eventi trascorsi</string>
|
||||
<string name="settings_sync_time_range_past_none">Verranno sincronizzati tutti gli eventi</string>
|
||||
<plurals name="settings_sync_time_range_past_days">
|
||||
<item quantity="one">Eventi più vecchi di un giorno saranno ignorati</item>
|
||||
<item quantity="many">Eventi più vecchi di %d giorni saranno ignorati</item>
|
||||
<item quantity="other">Eventi più vecchi di %d giorni saranno ignorati</item>
|
||||
</plurals>
|
||||
<string name="settings_sync_time_range_past_message">Eventi più vecchi di questo numero di giorni verranno ignorati(può anche essere 0). Lasciare in bianco per sincronizzare tutti gli eventi.</string>
|
||||
<string name="settings_default_alarm">Promemoria predefinito</string>
|
||||
<plurals name="settings_default_alarm_on">
|
||||
<item quantity="one">Promemoria predefinito un minuto prima dell\'evento</item>
|
||||
<item quantity="many">Promemoria predefinito %d minuti prima dell\'evento</item>
|
||||
<item quantity="other">Promemoria predefinito %d minuti prima dell\'evento</item>
|
||||
</plurals>
|
||||
<string name="settings_default_alarm_off">Nessun promemoria di default creato</string>
|
||||
<string name="settings_default_alarm_message">Indicare il numero di minuti che si desidera per il promemoria predefinito.
|
||||
Lasciare vuoto per non creare un promemoria predefinito.</string>
|
||||
<string name="settings_manage_calendar_colors">Cambia il colore del calendario</string>
|
||||
<string name="settings_manage_calendar_colors_on">I colori del calendario sono resettati ad ogni sincronizzazione</string>
|
||||
<string name="settings_manage_calendar_colors_off">I colori del calendario possono essere scelti da altre applicazioni</string>
|
||||
<string name="settings_event_colors">Supporto colore dell\'evento</string>
|
||||
<string name="settings_event_colors_on">I colori degli eventi sono sincronizzati</string>
|
||||
<string name="settings_event_colors_off">I colori degli eventi non sono sicnronizzati</string>
|
||||
<string name="settings_carddav">CardDAV</string>
|
||||
<string name="settings_contact_group_method">Organizzazione dei gruppi di contatto</string>
|
||||
<string-array name="settings_contact_group_method_entries">
|
||||
<item>I gruppi sono vCards separate</item>
|
||||
<item>I gruppi sono categorie per ogni contatto</item>
|
||||
</string-array>
|
||||
<!--CreateAddressBookScreen, CreateCalendarScreen-->
|
||||
<string name="settings_manage_calendar_colors">Cambia il colore del calendario</string>
|
||||
<string name="settings_manage_calendar_colors_on">I colori del calendario sono resettati ad ogni sincronizzazione</string>
|
||||
<string name="settings_manage_calendar_colors_off">I colori del calendario possono essere scelti da altre applicazioni</string>
|
||||
<string name="settings_event_colors">Supporto colore dell\'evento</string>
|
||||
<string name="settings_event_colors_on">I colori degli eventi sono sincronizzati</string>
|
||||
<string name="settings_event_colors_off">I colori degli eventi non sono sicnronizzati</string>
|
||||
<string name="settings_carddav">CardDAV</string>
|
||||
<string name="settings_contact_group_method">Organizzazione dei gruppi di contatto</string>
|
||||
<string-array name="settings_contact_group_method_entries">
|
||||
<item>I gruppi sono vCards separate</item>
|
||||
<item>I gruppi sono categorie per ogni contatto</item>
|
||||
</string-array>
|
||||
<!--CreateAddressBookScreen, CreateCalendarScreen-->
|
||||
<string name="create_addressbook">Crea rubrica</string>
|
||||
<string name="create_addressbook_maybe_not_supported">La creazione di rubriche tramitte CardDAV potrebbe non essere supportata dal server.</string>
|
||||
<string name="create_calendar">Crea calendario</string>
|
||||
<string name="create_calendar_time_zone_none">—</string>
|
||||
<string name="create_calendar_type">Possibili voci del calendario</string>
|
||||
<string name="create_calendar_type_vevent">Eventi</string>
|
||||
<string name="create_calendar_type_vtodo">Attività</string>
|
||||
<string name="create_calendar_type_vjournal">Note / diario</string>
|
||||
<string name="create_calendar_maybe_not_supported">La creazione do calendari tramite CalDAV potrebbe non essere supportata dal server.</string>
|
||||
<string name="create_collection_color">Colore</string>
|
||||
<string name="create_collection_display_name">Titolo</string>
|
||||
<string name="create_collection_home_set">Percorso di archiviazione</string>
|
||||
<string name="create_collection_create">Crea</string>
|
||||
<!--CollectionScreen-->
|
||||
<string name="create_addressbook_maybe_not_supported">La creazione di rubriche tramitte CardDAV potrebbe non essere supportata dal server.</string>
|
||||
<string name="create_calendar">Crea calendario</string>
|
||||
<string name="create_calendar_time_zone_none">—</string>
|
||||
<string name="create_calendar_type">Possibili voci del calendario</string>
|
||||
<string name="create_calendar_type_vevent">Eventi</string>
|
||||
<string name="create_calendar_type_vtodo">Attività</string>
|
||||
<string name="create_calendar_type_vjournal">Note / diario</string>
|
||||
<string name="create_calendar_maybe_not_supported">La creazione do calendari tramite CalDAV potrebbe non essere supportata dal server.</string>
|
||||
<string name="create_collection_color">Colore</string>
|
||||
<string name="create_collection_display_name">Titolo</string>
|
||||
<string name="create_collection_home_set">Percorso di archiviazione</string>
|
||||
<string name="create_collection_create">Crea</string>
|
||||
<!--CollectionScreen-->
|
||||
<string name="collection_datatype_contacts">contatti</string>
|
||||
<string name="collection_datatype_tasks">attività</string>
|
||||
<string name="collection_delete">Elimina raccolta</string>
|
||||
<string name="collection_delete_warning">Questa raccolta (%s) e tutti i suoi dati saranno rimossi definitivamente, sia localmente che sul server.</string>
|
||||
<string name="collection_synchronization">Sincronizzazione</string>
|
||||
<string name="collection_synchronization_on">Sincronizzazione attivata</string>
|
||||
<string name="collection_synchronization_off">Sincronizzazione disattivata</string>
|
||||
<string name="collection_read_only">Sola lettura</string>
|
||||
<string name="collection_read_only_by_server">Sola lettura (dal server)</string>
|
||||
<string name="collection_read_only_forced">Sola lettura (locale)</string>
|
||||
<string name="collection_read_write">Lettura/scrittura</string>
|
||||
<string name="collection_title">Titolo</string>
|
||||
<string name="collection_description">Descrizione</string>
|
||||
<string name="collection_owner">Proprietario</string>
|
||||
<string name="collection_push_support">Supporto push</string>
|
||||
<string name="collection_last_sync">Ultima sincronizzazione %s</string>
|
||||
<string name="collection_url">Indirizzo (URL)</string>
|
||||
<!--debugging and DebugInfoActivity-->
|
||||
<string name="collection_datatype_tasks">attività</string>
|
||||
<string name="collection_delete">Elimina raccolta</string>
|
||||
<string name="collection_delete_warning">Questa raccolta (%s) e tutti i suoi dati saranno rimossi definitivamente, sia localmente che sul server.</string>
|
||||
<string name="collection_synchronization">Sincronizzazione</string>
|
||||
<string name="collection_synchronization_on">Sincronizzazione attivata</string>
|
||||
<string name="collection_synchronization_off">Sincronizzazione disattivata</string>
|
||||
<string name="collection_read_only">Sola lettura</string>
|
||||
<string name="collection_read_only_by_server">Sola lettura (dal server)</string>
|
||||
<string name="collection_read_only_forced">Sola lettura (locale)</string>
|
||||
<string name="collection_read_write">Lettura/scrittura</string>
|
||||
<string name="collection_title">Titolo</string>
|
||||
<string name="collection_description">Descrizione</string>
|
||||
<string name="collection_owner">Proprietario</string>
|
||||
<string name="collection_push_support">Supporto push</string>
|
||||
<string name="collection_last_sync">Ultima sincronizzazione %s</string>
|
||||
<string name="collection_url">Indirizzo (URL)</string>
|
||||
<!--debugging and DebugInfoActivity-->
|
||||
<string name="debug_info_title">Informazioni di debug</string>
|
||||
<string name="debug_info_archive_caption">Archivio ZIP</string>
|
||||
<string name="debug_info_archive_subtitle">Contiene informazioni sui debug e sugli accessi</string>
|
||||
<string name="debug_info_archive_text">Condividi l\'archivio per trasferirlo ad un computer, per inviarlo tramite email o per fissarlo ad un ticket di supporto.</string>
|
||||
<string name="debug_info_archive_share">Condividi l\'archivio</string>
|
||||
<string name="debug_info_attached">Informazioni sul debug fissate a questo messaggio (richiede un supporto di fissaggio dell\'applicazione di supporto). </string>
|
||||
<string name="debug_info_http_error">Errore HTTP</string>
|
||||
<string name="debug_info_server_error">Errore del Server</string>
|
||||
<string name="debug_info_webdav_error">Errore WebDAV</string>
|
||||
<string name="debug_info_io_error">Errore I/O</string>
|
||||
<string name="debug_info_view_details">Vedi dettagli</string>
|
||||
<string name="debug_info_subtitle">Sono state raccolte informazioni di debug</string>
|
||||
<string name="debug_info_involved_caption">Fonti coinvolte</string>
|
||||
<string name="debug_info_involved_subtitle">Collegate con il problema</string>
|
||||
<string name="debug_info_involved_remote">Fonti remote:</string>
|
||||
<string name="debug_info_involved_local">Fonti locali:</string>
|
||||
<string name="debug_info_logs_caption">Registri</string>
|
||||
<string name="debug_info_logs_subtitle">Sono disponibili registri verbali</string>
|
||||
<string name="debug_info_logs_view">Vedi i registri</string>
|
||||
<string name="debug_info_copy_remote_url">Copia URL</string>
|
||||
<!--ExceptionInfoFragment-->
|
||||
<string name="debug_info_archive_caption">Archivio ZIP</string>
|
||||
<string name="debug_info_archive_subtitle">Contiene informazioni sui debug e sugli accessi</string>
|
||||
<string name="debug_info_archive_text">Condividi l\'archivio per trasferirlo ad un computer, per inviarlo tramite email o per fissarlo ad un ticket di supporto.</string>
|
||||
<string name="debug_info_archive_share">Condividi l\'archivio</string>
|
||||
<string name="debug_info_attached">Informazioni sul debug fissate a questo messaggio (richiede un supporto di fissaggio dell\'applicazione di supporto). </string>
|
||||
<string name="debug_info_http_error">Errore HTTP</string>
|
||||
<string name="debug_info_server_error">Errore del Server</string>
|
||||
<string name="debug_info_webdav_error">Errore WebDAV</string>
|
||||
<string name="debug_info_io_error">Errore I/O</string>
|
||||
<string name="debug_info_view_details">Vedi dettagli</string>
|
||||
<string name="debug_info_subtitle">Sono state raccolte informazioni di debug</string>
|
||||
<string name="debug_info_involved_caption">Fonti coinvolte</string>
|
||||
<string name="debug_info_involved_subtitle">Collegate con il problema</string>
|
||||
<string name="debug_info_involved_remote">Fonti remote:</string>
|
||||
<string name="debug_info_involved_local">Fonti locali:</string>
|
||||
<string name="debug_info_logs_caption">Registri</string>
|
||||
<string name="debug_info_logs_subtitle">Sono disponibili registri verbali</string>
|
||||
<string name="debug_info_logs_view">Vedi i registri</string>
|
||||
<string name="debug_info_copy_remote_url">Copia URL</string>
|
||||
<!--ExceptionInfoFragment-->
|
||||
<string name="exception">Si è verificato un errore.</string>
|
||||
<string name="exception_httpexception">Si è verificato un errore HTTP.</string>
|
||||
<string name="exception_ioexception">Si è verificato un errore di I/O.</string>
|
||||
<string name="exception_show_details">Mostra dettagli</string>
|
||||
<!--WebDAV accounts-->
|
||||
<string name="exception_httpexception">Si è verificato un errore HTTP.</string>
|
||||
<string name="exception_ioexception">Si è verificato un errore di I/O.</string>
|
||||
<string name="exception_show_details">Mostra dettagli</string>
|
||||
<!--WebDAV accounts-->
|
||||
<string name="webdav_mounts_title">Installazioni WebDAV</string>
|
||||
<string name="webdav_mounts_quota_used_available">Quantità utilizzata: %1$s / disponibile: %2$s</string>
|
||||
<string name="webdav_mounts_share_content">Condividi i contenuti</string>
|
||||
<string name="webdav_mounts_unmount">Disinstallazioni</string>
|
||||
<string name="webdav_add_mount_title">Aggiungi installazioni WedDAV</string>
|
||||
<string name="webdav_mounts_empty">Accedi direttamente ai tuoi file nel cloud aggiungendo un supporto WebDAV!</string>
|
||||
<string name="webdav_add_mount_display_name">Nome del display</string>
|
||||
<string name="webdav_add_mount_url">URL WebDVA</string>
|
||||
<string name="webdav_add_mount_url_invalid">URL non valido</string>
|
||||
<string name="webdav_add_mount_authentication">Autenticazione</string>
|
||||
<string name="webdav_add_mount_username">Nome utente</string>
|
||||
<string name="webdav_add_mount_password">Password</string>
|
||||
<string name="webdav_add_mount_add">Aggiungi installazioni</string>
|
||||
<string name="webdav_add_mount_no_support">Nessun servizio WebDAV a questo URL</string>
|
||||
<string name="webdav_remove_mount_title">Rimuovi punto di mont</string>
|
||||
<string name="webdav_remove_mount_text">I dettagli della connessione saranno perduti, ma nessun file verrà cancellato.</string>
|
||||
<string name="webdav_notification_access">File di accesso WebDAV</string>
|
||||
<string name="webdav_notification_download">File di download WebDAV</string>
|
||||
<string name="webdav_notification_upload">Caricare file WebDAV</string>
|
||||
<string name="webdav_provider_root_title">Installazione WebDAV</string>
|
||||
<!--sync-->
|
||||
<string name="webdav_mounts_quota_used_available">Quantità utilizzata: %1$s / disponibile: %2$s</string>
|
||||
<string name="webdav_mounts_share_content">Condividi i contenuti</string>
|
||||
<string name="webdav_mounts_unmount">Disinstallazioni</string>
|
||||
<string name="webdav_add_mount_title">Aggiungi installazioni WedDAV</string>
|
||||
<string name="webdav_mounts_empty">Accedi direttamente ai tuoi file nel cloud aggiungendo un supporto WebDAV!</string>
|
||||
<string name="webdav_add_mount_display_name">Nome del display</string>
|
||||
<string name="webdav_add_mount_url">URL WebDVA</string>
|
||||
<string name="webdav_add_mount_url_invalid">URL non valido</string>
|
||||
<string name="webdav_add_mount_authentication">Autenticazione</string>
|
||||
<string name="webdav_add_mount_username">Nome utente</string>
|
||||
<string name="webdav_add_mount_password">Password</string>
|
||||
<string name="webdav_add_mount_add">Aggiungi installazioni</string>
|
||||
<string name="webdav_add_mount_no_support">Nessun servizio WebDAV a questo URL</string>
|
||||
<string name="webdav_remove_mount_title">Rimuovi punto di mont</string>
|
||||
<string name="webdav_remove_mount_text">I dettagli della connessione saranno perduti, ma nessun file verrà cancellato.</string>
|
||||
<string name="webdav_notification_access">File di accesso WebDAV</string>
|
||||
<string name="webdav_notification_download">File di download WebDAV</string>
|
||||
<string name="webdav_notification_upload">Caricare file WebDAV</string>
|
||||
<string name="webdav_provider_root_title">Installazione WebDAV</string>
|
||||
<!--sync-->
|
||||
<string name="sync_error_permissions">Autorizzazioni DAVx⁵</string>
|
||||
<string name="sync_error_permissions_text">Autorizzazioni addizionali richieste</string>
|
||||
<string name="sync_error_tasks_too_old">%s troppo vecchio</string>
|
||||
<string name="sync_error_tasks_required_version">Versione minima richiesta %1$s</string>
|
||||
<string name="sync_error_authentication_failed">Autenticazione fallita (controlla credenziali login)</string>
|
||||
<string name="sync_error_io">Errore di rete o di I/O – %s</string>
|
||||
<string name="sync_error_http_dav">Errore server HTTP – %s</string>
|
||||
<string name="sync_error_local_storage">Errore di archiviazione locale – %s</string>
|
||||
<string name="sync_invalid_contact">Contatto non valido ricevuto dal server</string>
|
||||
<string name="sync_invalid_event">Evento non valido ricevuto dal server</string>
|
||||
<string name="sync_invalid_task">Attività non valida ricevuta dal server</string>
|
||||
<string name="sync_invalid_resources_ignoring">Una o più risorse non valide ignorate</string>
|
||||
<!--widgets-->
|
||||
<string name="sync_error_permissions_text">Autorizzazioni addizionali richieste</string>
|
||||
<string name="sync_error_tasks_too_old">%s troppo vecchio</string>
|
||||
<string name="sync_error_tasks_required_version">Versione minima richiesta %1$s</string>
|
||||
<string name="sync_error_authentication_failed">Autenticazione fallita (controlla credenziali login)</string>
|
||||
<string name="sync_error_io">Errore di rete o di I/O – %s</string>
|
||||
<string name="sync_error_http_dav">Errore server HTTP – %s</string>
|
||||
<string name="sync_error_local_storage">Errore di archiviazione locale – %s</string>
|
||||
<string name="sync_invalid_contact">Contatto non valido ricevuto dal server</string>
|
||||
<string name="sync_invalid_event">Evento non valido ricevuto dal server</string>
|
||||
<string name="sync_invalid_task">Attività non valida ricevuta dal server</string>
|
||||
<string name="sync_invalid_resources_ignoring">Una o più risorse non valide ignorate</string>
|
||||
<!--widgets-->
|
||||
<string name="widget_sync_all">Sincronizza tutto</string>
|
||||
<string name="widget_sync_all_accounts">Sincronizzazione di tutti gli account</string>
|
||||
<!--cert4android-->
|
||||
<string name="widget_sync_all_accounts">Sincronizzazione di tutti gli account</string>
|
||||
<!--cert4android-->
|
||||
<string name="account_prefs_use_app">Non modificare il tuo account da qui! Usa piuttosto l\'app per configurare direttamente il tuo account.</string>
|
||||
<string name="navigate_up">Torna su</string>
|
||||
<string name="intro_autostart_text">Il firmware di certi specifici produttori potrebbe bloccare la sincronizzazione. Se a te capita, puoi solo risolverlo manualmente.</string>
|
||||
<string name="intro_tasks_jtx">jtx Board</string>
|
||||
<string name="intro_tasks_tasks_org_info"><![CDATA[Alcune funzionalità <a href="https://www.davx5.com/faq/tasks/advanced-task-features"> non sono supportate</a>.]]></string>
|
||||
<string name="intro_open_source_dont_show">Non ricordarmelo</string>
|
||||
<plurals name="intro_open_source_dont_show_months">
|
||||
<item quantity="one">%d mese</item>
|
||||
<item quantity="many">%d mesi</item>
|
||||
<item quantity="other">%d mesi</item>
|
||||
</plurals>
|
||||
<string name="intro_next">Avanti</string>
|
||||
<string name="permissions_jtx_title">Autorizzazioni jtx Board</string>
|
||||
<string name="permissions_tasks_status_off">Nessuna pianificazione di sincronizzazione</string>
|
||||
<string name="wifi_permissions_background_location_disclaimer">%s utilizza i dati di localizzazione (solo SSID WiFi) unicamente per limitare la sincronizzazione a uno specifico SSID WiFi. Ciò avverrà anche quando la sincronizzazione viene eseguita in background.</string>
|
||||
<string name="wifi_permissions_background_location_disclaimer2">Tutti i dati di localizzazione (il solo SSID WiFi) sono usati solo localmente e non vengono spediti da nessuna parte.</string>
|
||||
<string name="navigation_drawer_managed">Per le organizzazioni</string>
|
||||
<string name="account_list_welcome">Benvenuti in DAVx⁵!</string>
|
||||
<string name="account_list_empty">Connettiti al tuo server per tenere i tuoi calendari e contatti della rubrica sempre sincronizzati.</string>
|
||||
<string name="sync_warning_no_internet">La sincronizzazione automatica non è attiva (nessuna connessione Internet verificata)</string>
|
||||
<string name="sync_warning_manage_datasaver">Gestione del risparmio dati</string>
|
||||
<string name="sync_warning_calendar_storage_disabled_title">Fornitore di calendari mancante</string>
|
||||
<string name="sync_warning_calendar_storage_disabled_description">Hai disabilitato l\'app di sistema: \"Archiviazione calendario\"?</string>
|
||||
<string name="sync_warning_contacts_storage_disabled_title">Fornitore dei contatti mancante</string>
|
||||
<string name="sync_warning_contacts_storage_disabled_description">Hai disabilitato l\'app di sistema: \"Archiviazione contatti\"?</string>
|
||||
<string name="sync_warning_manage_apps">Gestione app</string>
|
||||
<string name="app_settings_show_debug_info_details">Vedi/condividi i dettagli di configurazione e i log</string>
|
||||
<string name="app_settings_logging_on">Il logging è attivo. Puoi vedere i log come parte delle informazioni di debug.</string>
|
||||
<string name="app_settings_battery_optimization_exempted">Nessuna restrizione (consigliato)</string>
|
||||
<string name="app_settings_battery_optimization_optimized">Restrizioni all\'uso della batteria attivate (non consigliato)</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,486 +1,486 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!--common strings-->
|
||||
<!--common strings-->
|
||||
<string name="account_invalid">Contul nu (mai) există</string>
|
||||
<string name="account_title_address_book">Agenda DAVx⁵</string>
|
||||
<string name="account_prefs_use_app">Nu schimba contul aici! Utilizează direct aplicația pentru a gestiona conturile în schimb.</string>
|
||||
<string name="dialog_delete">Șterge</string>
|
||||
<string name="dialog_remove">Elimină</string>
|
||||
<string name="dialog_deny">Anulează</string>
|
||||
<string name="dialog_enable">Activează</string>
|
||||
<string name="field_required">Acest câmp este obligatoriu</string>
|
||||
<string name="help">Ajutor</string>
|
||||
<string name="navigate_up">Navigare în sus</string>
|
||||
<string name="options_menu">Meniul Opțiuni</string>
|
||||
<string name="share">Distribuie</string>
|
||||
<string name="sync_started">Sincronizare începută/pusă în coadă</string>
|
||||
<string name="database_destructive_migration_title">Bază de date deteriorată</string>
|
||||
<string name="database_destructive_migration_text">Toate conturile au fost eliminate local.</string>
|
||||
<string name="notification_channel_debugging">Depanare</string>
|
||||
<string name="notification_channel_general">Alte mesaje importante</string>
|
||||
<string name="notification_channel_status">Mesaje de stare cu prioritate redusă</string>
|
||||
<string name="notification_channel_sync">Sincronizare</string>
|
||||
<string name="notification_channel_sync_errors">Erori de sincronizare</string>
|
||||
<string name="notification_channel_sync_errors_desc">Erori importante care opresc sincronizarea, cum ar fi răspunsurile neașteptate ale serverului</string>
|
||||
<string name="notification_channel_sync_warnings">Avertismente de sincronizare</string>
|
||||
<string name="notification_channel_sync_warnings_desc">Probleme de sincronizare non-fatale, cum ar fi anumite fișiere nevalide</string>
|
||||
<string name="notification_channel_sync_io_errors">Erori de rețea și I/O</string>
|
||||
<string name="notification_channel_sync_io_errors_desc">Expirare, probleme de conexiune etc. (adesea temporare)</string>
|
||||
<!--IntroActivity-->
|
||||
<string name="account_title_address_book">Agenda DAVx⁵</string>
|
||||
<string name="account_prefs_use_app">Nu schimba contul aici! Utilizează direct aplicația pentru a gestiona conturile în schimb.</string>
|
||||
<string name="dialog_delete">Șterge</string>
|
||||
<string name="dialog_remove">Elimină</string>
|
||||
<string name="dialog_deny">Anulează</string>
|
||||
<string name="dialog_enable">Activează</string>
|
||||
<string name="field_required">Acest câmp este obligatoriu</string>
|
||||
<string name="help">Ajutor</string>
|
||||
<string name="navigate_up">Navigare în sus</string>
|
||||
<string name="options_menu">Meniul Opțiuni</string>
|
||||
<string name="share">Distribuie</string>
|
||||
<string name="sync_started">Sincronizare începută/pusă în coadă</string>
|
||||
<string name="database_destructive_migration_title">Bază de date deteriorată</string>
|
||||
<string name="database_destructive_migration_text">Toate conturile au fost eliminate local.</string>
|
||||
<string name="notification_channel_debugging">Depanare</string>
|
||||
<string name="notification_channel_general">Alte mesaje importante</string>
|
||||
<string name="notification_channel_status">Mesaje de stare cu prioritate redusă</string>
|
||||
<string name="notification_channel_sync">Sincronizare</string>
|
||||
<string name="notification_channel_sync_errors">Erori de sincronizare</string>
|
||||
<string name="notification_channel_sync_errors_desc">Erori importante care opresc sincronizarea, cum ar fi răspunsurile neașteptate ale serverului</string>
|
||||
<string name="notification_channel_sync_warnings">Avertismente de sincronizare</string>
|
||||
<string name="notification_channel_sync_warnings_desc">Probleme de sincronizare non-fatale, cum ar fi anumite fișiere nevalide</string>
|
||||
<string name="notification_channel_sync_io_errors">Erori de rețea și I/O</string>
|
||||
<string name="notification_channel_sync_io_errors_desc">Expirare, probleme de conexiune etc. (adesea temporare)</string>
|
||||
<!--IntroActivity-->
|
||||
<string name="intro_slogan1">Datele tale. Alegerea ta.</string>
|
||||
<string name="intro_slogan2">Preia controlul.</string>
|
||||
<string name="intro_battery_title">Intervale regulate de sincronizare</string>
|
||||
<string name="intro_battery_text">Pentru sincronizare la intervale regulate, %s trebuie să aibă voie să ruleze în fundal. În caz contrar, Android poate întrerupe sincronizarea în orice moment.</string>
|
||||
<string name="intro_battery_dont_show">Nu am nevoie de intervale regulate de sincronizare.*</string>
|
||||
<string name="intro_autostart_title">Compatibilitate %s </string>
|
||||
<string name="intro_autostart_text">Firmware-ul specific vendorului poate bloca sincronizarea. Dacă ești afectat, poți rezolva acest lucru manual.</string>
|
||||
<string name="intro_autostart_dont_show">Am făcut setările necesare. Nu-mi mai aminti.*</string>
|
||||
<string name="intro_leave_unchecked">* Lasă nebifat pentru a fi reamintit mai târziu. Poate fi resetat în setările aplicației / %s.</string>
|
||||
<string name="intro_more_info">Mai multe informații</string>
|
||||
<string name="intro_tasks_jtx">Placă de bază jtx</string>
|
||||
<string name="intro_tasks_jtx_info"><![CDATA[Acceptă sincronizarea sarcinilor, jurnalelor și notelor.]]></string>
|
||||
<string name="intro_tasks_title">Suport pentru sarcini</string>
|
||||
<string name="intro_tasks_text1">Dacă sarcinile sunt acceptate de server, acestea pot fi sincronizate cu o aplicație de sarcini acceptată:</string>
|
||||
<string name="intro_tasks_opentasks">OpenTasks</string>
|
||||
<string name="intro_tasks_opentasks_info">Nu pare a mai fi dezvoltat – nu este recomandat.</string>
|
||||
<string name="intro_tasks_tasks_org">Tasks.org</string>
|
||||
<string name="intro_tasks_tasks_org_info"><![CDATA[Unele caracteristici <a href="https://www.davx5.com/faq/tasks/advanced-task-features">nu sunt acceptate</a>.]]></string>
|
||||
<string name="intro_tasks_no_app_store">Nu există un magazin de aplicații disponibil</string>
|
||||
<string name="intro_tasks_dont_show">Nu am nevoie de suport pentru sarcini.*</string>
|
||||
<string name="intro_open_source_title">Software cu sursă deschisă</string>
|
||||
<string name="intro_open_source_text">Ne bucurăm că utilizezi %s, care este un software open-source. Dezvoltarea, întreținerea și suportul sunt o muncă grea. Ia în considerare contribuția (există mai multe moduri) sau o donație. Ar fi foarte apreciat!</string>
|
||||
<string name="intro_open_source_details">Cum să contribui/donezi</string>
|
||||
<string name="intro_open_source_dont_show">Nu-mi aminti</string>
|
||||
<plurals name="intro_open_source_dont_show_months">
|
||||
<item quantity="one">%d lună</item>
|
||||
<item quantity="few">%d luni</item>
|
||||
<item quantity="other">%d luni</item>
|
||||
</plurals>
|
||||
<string name="intro_next">Înainte</string>
|
||||
<!--PermissionsActivity-->
|
||||
<string name="intro_slogan2">Preia controlul.</string>
|
||||
<string name="intro_battery_title">Intervale regulate de sincronizare</string>
|
||||
<string name="intro_battery_text">Pentru sincronizare la intervale regulate, %s trebuie să aibă voie să ruleze în fundal. În caz contrar, Android poate întrerupe sincronizarea în orice moment.</string>
|
||||
<string name="intro_battery_dont_show">Nu am nevoie de intervale regulate de sincronizare.*</string>
|
||||
<string name="intro_autostart_title">Compatibilitate %s </string>
|
||||
<string name="intro_autostart_text">Firmware-ul specific vendorului poate bloca sincronizarea. Dacă ești afectat, poți rezolva acest lucru manual.</string>
|
||||
<string name="intro_autostart_dont_show">Am făcut setările necesare. Nu-mi mai aminti.*</string>
|
||||
<string name="intro_leave_unchecked">* Lasă nebifat pentru a fi reamintit mai târziu. Poate fi resetat în setările aplicației / %s.</string>
|
||||
<string name="intro_more_info">Mai multe informații</string>
|
||||
<string name="intro_tasks_jtx">Placă de bază jtx</string>
|
||||
<string name="intro_tasks_jtx_info"><![CDATA[Acceptă sincronizarea sarcinilor, jurnalelor și notelor.]]></string>
|
||||
<string name="intro_tasks_title">Suport pentru sarcini</string>
|
||||
<string name="intro_tasks_text1">Dacă sarcinile sunt acceptate de server, acestea pot fi sincronizate cu o aplicație de sarcini acceptată:</string>
|
||||
<string name="intro_tasks_opentasks">OpenTasks</string>
|
||||
<string name="intro_tasks_opentasks_info">Nu pare a mai fi dezvoltat – nu este recomandat.</string>
|
||||
<string name="intro_tasks_tasks_org">Tasks.org</string>
|
||||
<string name="intro_tasks_tasks_org_info"><![CDATA[Unele caracteristici <a href="https://www.davx5.com/faq/tasks/advanced-task-features">nu sunt acceptate</a>.]]></string>
|
||||
<string name="intro_tasks_no_app_store">Nu există un magazin de aplicații disponibil</string>
|
||||
<string name="intro_tasks_dont_show">Nu am nevoie de suport pentru sarcini.*</string>
|
||||
<string name="intro_open_source_title">Software cu sursă deschisă</string>
|
||||
<string name="intro_open_source_text">Ne bucurăm că utilizezi %s, care este un software open-source. Dezvoltarea, întreținerea și suportul sunt o muncă grea. Ia în considerare contribuția (există mai multe moduri) sau o donație. Ar fi foarte apreciat!</string>
|
||||
<string name="intro_open_source_details">Cum să contribui/donezi</string>
|
||||
<string name="intro_open_source_dont_show">Nu-mi aminti</string>
|
||||
<plurals name="intro_open_source_dont_show_months">
|
||||
<item quantity="one">%d lună</item>
|
||||
<item quantity="few">%d luni</item>
|
||||
<item quantity="other">%d luni</item>
|
||||
</plurals>
|
||||
<string name="intro_next">Înainte</string>
|
||||
<!--PermissionsActivity-->
|
||||
<string name="permissions_title">Permisiuni</string>
|
||||
<string name="permissions_text">%s necesită permisiuni pentru a funcționa corect.</string>
|
||||
<string name="permissions_all_title">Toate cele de mai jos</string>
|
||||
<string name="permissions_all_status_off">Utilizează aceasta pentru a activa toate funcțiile (recomandat)</string>
|
||||
<string name="permissions_all_status_on">Toate permisiunile sunt acordate</string>
|
||||
<string name="permissions_contacts_title">Permisiuni Contacte</string>
|
||||
<string name="permissions_contacts_status_off">Fără sincronizare de contacte (nu este recomandat)</string>
|
||||
<string name="permissions_contacts_status_on">Este posibilă sincronizarea contactelor</string>
|
||||
<string name="permissions_calendar_title">Permisiuni pentru calendar</string>
|
||||
<string name="permissions_calendar_status_off">Fără sincronizare calendar (nu este recomandat)</string>
|
||||
<string name="permissions_calendar_status_on">Sincronizarea calendarului este posibilă</string>
|
||||
<string name="permissions_notification_title">Permisiune de notificare</string>
|
||||
<string name="permissions_notification_status_off">Notificări dezactivate (nu este recomandat)</string>
|
||||
<string name="permissions_notification_status_on">Notificări activate</string>
|
||||
<string name="permissions_jtx_title">Permisiuni pentru jtx Board</string>
|
||||
<string name="permissions_opentasks_title">Permisiuni OpenTasks</string>
|
||||
<string name="permissions_tasksorg_title">Permisiuni pentru sarcini</string>
|
||||
<string name="permissions_tasks_status_off">Nicio sincronizare a sarcinilor</string>
|
||||
<string name="permissions_tasks_status_on">Este posibilă sincronizarea sarcinilor</string>
|
||||
<string name="permissions_autoreset_title">Păstrează permisiunile</string>
|
||||
<string name="permissions_autoreset_status_off">Permisiunile pot fi resetate automat (nu este recomandat)</string>
|
||||
<string name="permissions_autoreset_status_on">Permisiunile nu vor fi resetate automat</string>
|
||||
<string name="permissions_autoreset_instruction">Clic pe Permisiuni > debifează „Elimină permisiunile dacă aplicația nu este utilizată”</string>
|
||||
<string name="permissions_app_settings_hint">Dacă un comutator nu funcționează, utilizează setările/permisiunile aplicației.</string>
|
||||
<string name="permissions_app_settings">Setările aplicației</string>
|
||||
<!--WifiPermissionsActivity-->
|
||||
<string name="permissions_text">%s necesită permisiuni pentru a funcționa corect.</string>
|
||||
<string name="permissions_all_title">Toate cele de mai jos</string>
|
||||
<string name="permissions_all_status_off">Utilizează aceasta pentru a activa toate funcțiile (recomandat)</string>
|
||||
<string name="permissions_all_status_on">Toate permisiunile sunt acordate</string>
|
||||
<string name="permissions_contacts_title">Permisiuni Contacte</string>
|
||||
<string name="permissions_contacts_status_off">Fără sincronizare de contacte (nu este recomandat)</string>
|
||||
<string name="permissions_contacts_status_on">Este posibilă sincronizarea contactelor</string>
|
||||
<string name="permissions_calendar_title">Permisiuni pentru calendar</string>
|
||||
<string name="permissions_calendar_status_off">Fără sincronizare calendar (nu este recomandat)</string>
|
||||
<string name="permissions_calendar_status_on">Sincronizarea calendarului este posibilă</string>
|
||||
<string name="permissions_notification_title">Permisiune de notificare</string>
|
||||
<string name="permissions_notification_status_off">Notificări dezactivate (nu este recomandat)</string>
|
||||
<string name="permissions_notification_status_on">Notificări activate</string>
|
||||
<string name="permissions_jtx_title">Permisiuni pentru jtx Board</string>
|
||||
<string name="permissions_opentasks_title">Permisiuni OpenTasks</string>
|
||||
<string name="permissions_tasksorg_title">Permisiuni pentru sarcini</string>
|
||||
<string name="permissions_tasks_status_off">Nicio sincronizare a sarcinilor</string>
|
||||
<string name="permissions_tasks_status_on">Este posibilă sincronizarea sarcinilor</string>
|
||||
<string name="permissions_autoreset_title">Păstrează permisiunile</string>
|
||||
<string name="permissions_autoreset_status_off">Permisiunile pot fi resetate automat (nu este recomandat)</string>
|
||||
<string name="permissions_autoreset_status_on">Permisiunile nu vor fi resetate automat</string>
|
||||
<string name="permissions_autoreset_instruction">Clic pe Permisiuni > debifează „Elimină permisiunile dacă aplicația nu este utilizată”</string>
|
||||
<string name="permissions_app_settings_hint">Dacă un comutator nu funcționează, utilizează setările/permisiunile aplicației.</string>
|
||||
<string name="permissions_app_settings">Setările aplicației</string>
|
||||
<!--WifiPermissionsActivity-->
|
||||
<string name="wifi_permissions_label">Permisiuni SSID WiFi</string>
|
||||
<string name="wifi_permissions_intro">Pentru a putea accesa numele actual WiFi (SSID), trebuie îndeplinite următoarele condiții:</string>
|
||||
<string name="wifi_permissions_location_permission">Permisiune de locație precisă</string>
|
||||
<string name="wifi_permissions_location_permission_on">Permisiunea de locație acordată</string>
|
||||
<string name="wifi_permissions_location_permission_off">Permisiunea de locație refuzată</string>
|
||||
<string name="wifi_permissions_background_location_permission">Permisiunea de locație în fundal</string>
|
||||
<string name="wifi_permissions_background_location_permission_label">Permite tot timpul</string>
|
||||
<string name="wifi_permissions_background_location_permission_on">Permisiunea locației setată la: %s</string>
|
||||
<string name="wifi_permissions_background_location_permission_off">Permisiunea de locație nu este setată la: %s</string>
|
||||
<string name="wifi_permissions_background_location_disclaimer">%s folosește datele locației (doar WiFi SSID) numai pentru a restricționa sincronizarea la un anumit SSID WiFi. Acest lucru se va întâmpla chiar și atunci când sincronizarea rulează în fundal.</string>
|
||||
<string name="wifi_permissions_background_location_disclaimer2">Toate datele locației (doar WiFi SSID) sunt folosite doar local și nu sunt trimise nicăieri.</string>
|
||||
<string name="wifi_permissions_location_enabled">Locația este întotdeauna activată</string>
|
||||
<string name="wifi_permissions_location_enabled_on">Serviciul de localizare este activat</string>
|
||||
<string name="wifi_permissions_location_enabled_off">Serviciul de localizare este dezactivat</string>
|
||||
<!--AboutActivity-->
|
||||
<string name="wifi_permissions_intro">Pentru a putea accesa numele actual WiFi (SSID), trebuie îndeplinite următoarele condiții:</string>
|
||||
<string name="wifi_permissions_location_permission">Permisiune de locație precisă</string>
|
||||
<string name="wifi_permissions_location_permission_on">Permisiunea de locație acordată</string>
|
||||
<string name="wifi_permissions_location_permission_off">Permisiunea de locație refuzată</string>
|
||||
<string name="wifi_permissions_background_location_permission">Permisiunea de locație în fundal</string>
|
||||
<string name="wifi_permissions_background_location_permission_label">Permite tot timpul</string>
|
||||
<string name="wifi_permissions_background_location_permission_on">Permisiunea locației setată la: %s</string>
|
||||
<string name="wifi_permissions_background_location_permission_off">Permisiunea de locație nu este setată la: %s</string>
|
||||
<string name="wifi_permissions_background_location_disclaimer">%s folosește datele locației (doar WiFi SSID) numai pentru a restricționa sincronizarea la un anumit SSID WiFi. Acest lucru se va întâmpla chiar și atunci când sincronizarea rulează în fundal.</string>
|
||||
<string name="wifi_permissions_background_location_disclaimer2">Toate datele locației (doar WiFi SSID) sunt folosite doar local și nu sunt trimise nicăieri.</string>
|
||||
<string name="wifi_permissions_location_enabled">Locația este întotdeauna activată</string>
|
||||
<string name="wifi_permissions_location_enabled_on">Serviciul de localizare este activat</string>
|
||||
<string name="wifi_permissions_location_enabled_off">Serviciul de localizare este dezactivat</string>
|
||||
<!--AboutActivity-->
|
||||
<string name="about_translations">Traduceri</string>
|
||||
<string name="about_libraries">Biblioteci</string>
|
||||
<string name="about_version">Versiune %1$s (%2$d)</string>
|
||||
<string name="about_copyright">© Ricki Hirner, Bernhard Stockmann (inginerie web bitfire GmbH) și contribuitori</string>
|
||||
<string name="about_license_info_no_warranty">Acest program vine cu ABSOLUT NICIO GARANȚIE. Este software gratuit și ești binevenit să îl redistribui în anumite condiții.</string>
|
||||
<!--global settings-->
|
||||
<string name="about_libraries">Biblioteci</string>
|
||||
<string name="about_version">Versiune %1$s (%2$d)</string>
|
||||
<string name="about_copyright">© Ricki Hirner, Bernhard Stockmann (inginerie web bitfire GmbH) și contribuitori</string>
|
||||
<string name="about_license_info_no_warranty">Acest program vine cu ABSOLUT NICIO GARANȚIE. Este software gratuit și ești binevenit să îl redistribui în anumite condiții.</string>
|
||||
<!--global settings-->
|
||||
<string name="logging_couldnt_create_file">Nu s-a putut crea fișierul jurnal</string>
|
||||
<string name="logging_notification_text">Acum se înregistrează toate activitățile %s</string>
|
||||
<string name="logging_notification_view_share">Vizualizare/distribuire</string>
|
||||
<string name="logging_notification_disable">Dezactivează</string>
|
||||
<!--AccountsScreen-->
|
||||
<string name="logging_notification_text">Acum se înregistrează toate activitățile %s</string>
|
||||
<string name="logging_notification_view_share">Vizualizare/distribuire</string>
|
||||
<string name="logging_notification_disable">Dezactivează</string>
|
||||
<!--AccountsScreen-->
|
||||
<string name="navigation_drawer_subtitle">Adaptor de sincronizare CalDAV/CardDAV</string>
|
||||
<string name="navigation_drawer_about">Despre / Licență</string>
|
||||
<string name="navigation_drawer_beta_feedback">Feedback beta</string>
|
||||
<string name="install_browser">Instalează un browser web</string>
|
||||
<string name="navigation_drawer_settings">Setări</string>
|
||||
<string name="navigation_drawer_news_updates">Știri și actualizări</string>
|
||||
<string name="navigation_drawer_tools">Instrumente</string>
|
||||
<string name="navigation_drawer_external_links">Link-uri externe</string>
|
||||
<string name="navigation_drawer_website">Pagină web</string>
|
||||
<string name="navigation_drawer_manual">Manual</string>
|
||||
<string name="navigation_drawer_faq">Întrebări frecvente</string>
|
||||
<string name="navigation_drawer_managed">Pentru organizații</string>
|
||||
<string name="navigation_drawer_community">Comunitate</string>
|
||||
<string name="navigation_drawer_support_project">Susține proiectul</string>
|
||||
<string name="navigation_drawer_contribute">Cum să contribui</string>
|
||||
<string name="navigation_drawer_privacy_policy">Politica de confidențialitate</string>
|
||||
<string name="account_list_welcome">Bun venit la DAVx⁵!</string>
|
||||
<string name="account_list_empty">Conectează-te la server și păstrează calendarele și contactele sincronizate.</string>
|
||||
<string name="accounts_sync_all">Sincronizează toate conturile</string>
|
||||
<!--Sync warnings-->
|
||||
<string name="navigation_drawer_about">Despre / Licență</string>
|
||||
<string name="navigation_drawer_beta_feedback">Feedback beta</string>
|
||||
<string name="install_browser">Instalează un browser web</string>
|
||||
<string name="navigation_drawer_settings">Setări</string>
|
||||
<string name="navigation_drawer_news_updates">Știri și actualizări</string>
|
||||
<string name="navigation_drawer_tools">Instrumente</string>
|
||||
<string name="navigation_drawer_external_links">Link-uri externe</string>
|
||||
<string name="navigation_drawer_website">Pagină web</string>
|
||||
<string name="navigation_drawer_manual">Manual</string>
|
||||
<string name="navigation_drawer_faq">Întrebări frecvente</string>
|
||||
<string name="navigation_drawer_managed">Pentru organizații</string>
|
||||
<string name="navigation_drawer_community">Comunitate</string>
|
||||
<string name="navigation_drawer_support_project">Susține proiectul</string>
|
||||
<string name="navigation_drawer_contribute">Cum să contribui</string>
|
||||
<string name="navigation_drawer_privacy_policy">Politica de confidențialitate</string>
|
||||
<string name="account_list_welcome">Bun venit la DAVx⁵!</string>
|
||||
<string name="account_list_empty">Conectează-te la server și păstrează calendarele și contactele sincronizate.</string>
|
||||
<string name="accounts_sync_all">Sincronizează toate conturile</string>
|
||||
<!--Sync warnings-->
|
||||
<string name="sync_warning_no_notification_permission">Notificări dezactivate. Nu vei fi notificat despre erorile de sincronizare.</string>
|
||||
<string name="sync_warning_no_internet">Sincronizarea automată nu este activă (fără conexiune la internet verificată).</string>
|
||||
<string name="sync_warning_manage_connections">Gestionează conexiunile</string>
|
||||
<string name="sync_warning_datasaver_enabled">Economizorul de date este activat. Sincronizarea în fundal este restricționată.</string>
|
||||
<string name="sync_warning_manage_datasaver">Gestionează economizorul de date</string>
|
||||
<string name="sync_warning_battery_saver_enabled">Economisirea bateriei este activată. Sincronizarea poate fi restricționată.</string>
|
||||
<string name="sync_warning_manage_battery_saver">Gestionează economisirea bateriei</string>
|
||||
<string name="sync_warning_low_storage">Spațiu de depozitare redus. Android nu va sincroniza modificările locale imediat, ci în timpul următoarei sincronizări obișnuite.</string>
|
||||
<string name="sync_warning_manage_storage">Gestionează stocarea</string>
|
||||
<string name="sync_warning_calendar_storage_disabled_title">Furnizorul de calendar lipsește</string>
|
||||
<string name="sync_warning_calendar_storage_disabled_description">Ai dezactivat aplicația de sistem „Stocare Calendar”?</string>
|
||||
<string name="sync_warning_contacts_storage_disabled_title">Furnizorul de contacte lipsește</string>
|
||||
<string name="sync_warning_contacts_storage_disabled_description">Ai dezactivat aplicația de sistem „Stocare Contacte”?</string>
|
||||
<string name="sync_warning_manage_apps">Gestionează aplicațiile</string>
|
||||
<!--RefreshCollectionsWorker-->
|
||||
<string name="sync_warning_no_internet">Sincronizarea automată nu este activă (fără conexiune la internet verificată).</string>
|
||||
<string name="sync_warning_manage_connections">Gestionează conexiunile</string>
|
||||
<string name="sync_warning_datasaver_enabled">Economizorul de date este activat. Sincronizarea în fundal este restricționată.</string>
|
||||
<string name="sync_warning_manage_datasaver">Gestionează economizorul de date</string>
|
||||
<string name="sync_warning_battery_saver_enabled">Economisirea bateriei este activată. Sincronizarea poate fi restricționată.</string>
|
||||
<string name="sync_warning_manage_battery_saver">Gestionează economisirea bateriei</string>
|
||||
<string name="sync_warning_low_storage">Spațiu de depozitare redus. Android nu va sincroniza modificările locale imediat, ci în timpul următoarei sincronizări obișnuite.</string>
|
||||
<string name="sync_warning_manage_storage">Gestionează stocarea</string>
|
||||
<string name="sync_warning_calendar_storage_disabled_title">Furnizorul de calendar lipsește</string>
|
||||
<string name="sync_warning_calendar_storage_disabled_description">Ai dezactivat aplicația de sistem „Stocare Calendar”?</string>
|
||||
<string name="sync_warning_contacts_storage_disabled_title">Furnizorul de contacte lipsește</string>
|
||||
<string name="sync_warning_contacts_storage_disabled_description">Ai dezactivat aplicația de sistem „Stocare Contacte”?</string>
|
||||
<string name="sync_warning_manage_apps">Gestionează aplicațiile</string>
|
||||
<!--RefreshCollectionsWorker-->
|
||||
<string name="refresh_collections_worker_refresh_failed">Detectarea serviciului a eșuat</string>
|
||||
<string name="refresh_collections_worker_refresh_couldnt_refresh">Lista de colecții nu a putut fi actualizată</string>
|
||||
<!--Foreground service used by WorkManager on Android <12-->
|
||||
<string name="refresh_collections_worker_refresh_couldnt_refresh">Lista de colecții nu a putut fi actualizată</string>
|
||||
<!--Foreground service used by WorkManager on Android <12-->
|
||||
<string name="foreground_service_notify_title">Rulează în prim-plan</string>
|
||||
<string name="foreground_service_notify_text">Pe unele dispozitive, acest lucru este necesar pentru sincronizarea automată.</string>
|
||||
<!--AppSettingsActivity-->
|
||||
<string name="foreground_service_notify_text">Pe unele dispozitive, acest lucru este necesar pentru sincronizarea automată.</string>
|
||||
<!--AppSettingsActivity-->
|
||||
<string name="app_settings">Setări</string>
|
||||
<string name="app_settings_debug">Depanare</string>
|
||||
<string name="app_settings_show_debug_info">Afișează informațiile de depanare</string>
|
||||
<string name="app_settings_show_debug_info_details">Vizualizează/partajează detaliile de configurare și jurnalele</string>
|
||||
<string name="app_settings_logging">Jurnalizare detaliată</string>
|
||||
<string name="app_settings_logging_on">Înregistrarea este activă. Poți vizualiza jurnalele ca parte a informațiilor de depanare.</string>
|
||||
<string name="app_settings_logging_off">Înregistrarea este dezactivată</string>
|
||||
<string name="app_settings_battery_optimization">Optimizarea bateriei</string>
|
||||
<string name="app_settings_battery_optimization_exempted">Aplicația este exclusă (recomandat)</string>
|
||||
<string name="app_settings_battery_optimization_optimized">Se aplică restricții pentru baterie (nu este recomandat)</string>
|
||||
<string name="app_settings_connection">Conexiune</string>
|
||||
<string name="app_settings_proxy">Tip proxy</string>
|
||||
<string-array name="app_settings_proxy_types">
|
||||
<item>Implicit</item>
|
||||
<item>Fără proxy</item>
|
||||
<item>HTTP</item>
|
||||
<item>SOCKS (pentru Orbot)</item>
|
||||
</string-array>
|
||||
<string name="app_settings_proxy_host">Nume gazdă proxy</string>
|
||||
<string name="app_settings_proxy_port">Port proxy</string>
|
||||
<string name="app_settings_security">Securitate</string>
|
||||
<string name="app_settings_security_app_permissions">Permisiunile aplicației</string>
|
||||
<string name="app_settings_security_app_permissions_summary">Examinează permisiunile necesare pentru sincronizare</string>
|
||||
<string name="app_settings_distrust_system_certs">Nu avea încredere în certificatele de sistem</string>
|
||||
<string name="app_settings_distrust_system_certs_on">CA de sistem și de utilizator nu vor fi de încredere</string>
|
||||
<string name="app_settings_distrust_system_certs_off">CA de sistem și de utilizator vor fi de încredere (recomandat)</string>
|
||||
<string name="app_settings_distrust_system_certs_dialog_message">Dacă această setare este activă, certificatele de sistem nu sunt considerate ca fiind de încredere. Aceasta înseamnă că va trebui să accepți manual fiecare certificat (de asemenea, atunci când serverul își reînnoiește certificatul) sau configurarea contului și sincronizarea nu va funcționa.</string>
|
||||
<string name="app_settings_reset_certificates">Resetează certificatele de (ne)încredere</string>
|
||||
<string name="app_settings_reset_certificates_summary">Resetează încrederea tuturor certificatelor personalizate</string>
|
||||
<string name="app_settings_reset_certificates_success">Toate certificatele personalizate au fost șterse</string>
|
||||
<string name="app_settings_user_interface">Interfață de utilizator</string>
|
||||
<string name="app_settings_notification_settings">Setări de notificare</string>
|
||||
<string name="app_settings_notification_settings_summary">Gestionează canalele de notificare și setările acestora</string>
|
||||
<string name="app_settings_theme_title">Selectează tema</string>
|
||||
<string-array name="app_settings_theme_names">
|
||||
<item>Ca în sistem</item>
|
||||
<item>Luminoasă</item>
|
||||
<item>Întunecată</item>
|
||||
</string-array>
|
||||
<string name="app_settings_reset_hints">Resetează sugestiile</string>
|
||||
<string name="app_settings_reset_hints_summary">Reactivează sugestiile care au fost respinse anterior</string>
|
||||
<string name="app_settings_reset_hints_success">Toate sugestiile vor fi afișate din nou</string>
|
||||
<string name="app_settings_integration">Integrare</string>
|
||||
<string name="app_settings_tasks_provider">Aplicația de sarcini</string>
|
||||
<string name="app_settings_tasks_provider_none">Nu a fost găsită nicio aplicație de sarcini compatibilă</string>
|
||||
<string name="app_settings_unifiedpush">UnifiedPush (experimental)</string>
|
||||
<string name="app_settings_unifiedpush_disable">Nimic (dezactivare Push)</string>
|
||||
<string name="app_settings_unifiedpush_choose_distributor">Alege un distribuitor</string>
|
||||
<string name="app_settings_unifiedpush_no_distributor">Nu este instalat un distribuitor push</string>
|
||||
<string name="app_settings_unifiedpush_no_endpoint">Niciun punct final configurat</string>
|
||||
<string name="app_settings_unifiedpush_ready">Gata să primească mesaje push peste %s</string>
|
||||
<string name="app_settings_unifiedpush_distributor_fcm">FCM (Google Play)</string>
|
||||
<string name="app_settings_unifiedpush_encrypted">Mesajele push sunt întotdeauna criptate.</string>
|
||||
<!--AccountScreen-->
|
||||
<string name="app_settings_debug">Depanare</string>
|
||||
<string name="app_settings_show_debug_info">Afișează informațiile de depanare</string>
|
||||
<string name="app_settings_show_debug_info_details">Vizualizează/partajează detaliile de configurare și jurnalele</string>
|
||||
<string name="app_settings_logging">Jurnalizare detaliată</string>
|
||||
<string name="app_settings_logging_on">Înregistrarea este activă. Poți vizualiza jurnalele ca parte a informațiilor de depanare.</string>
|
||||
<string name="app_settings_logging_off">Înregistrarea este dezactivată</string>
|
||||
<string name="app_settings_battery_optimization">Optimizarea bateriei</string>
|
||||
<string name="app_settings_battery_optimization_exempted">Aplicația este exclusă (recomandat)</string>
|
||||
<string name="app_settings_battery_optimization_optimized">Se aplică restricții pentru baterie (nu este recomandat)</string>
|
||||
<string name="app_settings_connection">Conexiune</string>
|
||||
<string name="app_settings_proxy">Tip proxy</string>
|
||||
<string-array name="app_settings_proxy_types">
|
||||
<item>Implicit</item>
|
||||
<item>Fără proxy</item>
|
||||
<item>HTTP</item>
|
||||
<item>SOCKS (pentru Orbot)</item>
|
||||
</string-array>
|
||||
<string name="app_settings_proxy_host">Nume gazdă proxy</string>
|
||||
<string name="app_settings_proxy_port">Port proxy</string>
|
||||
<string name="app_settings_security">Securitate</string>
|
||||
<string name="app_settings_security_app_permissions">Permisiunile aplicației</string>
|
||||
<string name="app_settings_security_app_permissions_summary">Examinează permisiunile necesare pentru sincronizare</string>
|
||||
<string name="app_settings_distrust_system_certs">Nu avea încredere în certificatele de sistem</string>
|
||||
<string name="app_settings_distrust_system_certs_on">CA de sistem și de utilizator nu vor fi de încredere</string>
|
||||
<string name="app_settings_distrust_system_certs_off">CA de sistem și de utilizator vor fi de încredere (recomandat)</string>
|
||||
<string name="app_settings_distrust_system_certs_dialog_message">Dacă această setare este activă, certificatele de sistem nu sunt considerate ca fiind de încredere. Aceasta înseamnă că va trebui să accepți manual fiecare certificat (de asemenea, atunci când serverul își reînnoiește certificatul) sau configurarea contului și sincronizarea nu va funcționa.</string>
|
||||
<string name="app_settings_reset_certificates">Resetează certificatele de (ne)încredere</string>
|
||||
<string name="app_settings_reset_certificates_summary">Resetează încrederea tuturor certificatelor personalizate</string>
|
||||
<string name="app_settings_reset_certificates_success">Toate certificatele personalizate au fost șterse</string>
|
||||
<string name="app_settings_user_interface">Interfață de utilizator</string>
|
||||
<string name="app_settings_notification_settings">Setări de notificare</string>
|
||||
<string name="app_settings_notification_settings_summary">Gestionează canalele de notificare și setările acestora</string>
|
||||
<string name="app_settings_theme_title">Selectează tema</string>
|
||||
<string-array name="app_settings_theme_names">
|
||||
<item>Ca în sistem</item>
|
||||
<item>Luminoasă</item>
|
||||
<item>Întunecată</item>
|
||||
</string-array>
|
||||
<string name="app_settings_reset_hints">Resetează sugestiile</string>
|
||||
<string name="app_settings_reset_hints_summary">Reactivează sugestiile care au fost respinse anterior</string>
|
||||
<string name="app_settings_reset_hints_success">Toate sugestiile vor fi afișate din nou</string>
|
||||
<string name="app_settings_integration">Integrare</string>
|
||||
<string name="app_settings_tasks_provider">Aplicația de sarcini</string>
|
||||
<string name="app_settings_tasks_provider_none">Nu a fost găsită nicio aplicație de sarcini compatibilă</string>
|
||||
<string name="app_settings_unifiedpush">UnifiedPush (experimental)</string>
|
||||
<string name="app_settings_unifiedpush_disable">Nimic (dezactivare Push)</string>
|
||||
<string name="app_settings_unifiedpush_choose_distributor">Alege un distribuitor</string>
|
||||
<string name="app_settings_unifiedpush_no_distributor">Nu este instalat un distribuitor push</string>
|
||||
<string name="app_settings_unifiedpush_no_endpoint">Niciun punct final configurat</string>
|
||||
<string name="app_settings_unifiedpush_ready">Gata să primească mesaje push peste %s</string>
|
||||
<string name="app_settings_unifiedpush_distributor_fcm">FCM (Google Play)</string>
|
||||
<string name="app_settings_unifiedpush_encrypted">Mesajele push sunt întotdeauna criptate.</string>
|
||||
<!--AccountScreen-->
|
||||
<string name="account_invalid_account">Contul a fost eliminat</string>
|
||||
<string name="account_carddav">CardDAV</string>
|
||||
<string name="account_caldav">CalDAV</string>
|
||||
<string name="account_webcal">Webcal</string>
|
||||
<string name="account_missing_permissions">Sunt necesare permisiuni suplimentare pentru a sincroniza aceste colecții.</string>
|
||||
<string name="account_manage_permissions">Gestionează permisiunile</string>
|
||||
<string name="account_synchronize_now">Sincronizează acum</string>
|
||||
<string name="account_settings">Setările contului</string>
|
||||
<string name="account_rename">Redenumește contul</string>
|
||||
<string name="account_rename_new_name_description">Datele locale nesalvate pot fi respinse. Resincronizarea este necesară după redenumire.</string>
|
||||
<string name="account_rename_new_name">Nume cont nou</string>
|
||||
<string name="account_rename_rename">Redenumește</string>
|
||||
<string name="account_rename_exists_already">Numele contului este deja luat</string>
|
||||
<string name="account_rename_couldnt_rename">Nu s-a putut redenumi contul</string>
|
||||
<string name="account_delete">Șterge contul</string>
|
||||
<string name="account_delete_confirmation_title">Chiar ștergi contul?</string>
|
||||
<string name="account_delete_confirmation_text">Toate copiile locale ale agendelor, calendarelor și listelor de sarcini vor fi șterse.</string>
|
||||
<string name="account_synchronize_this_collection">sincronizează această colecție</string>
|
||||
<string name="account_read_only">numai pentru citire</string>
|
||||
<string name="account_calendar">calendar</string>
|
||||
<string name="account_contacts">contacte</string>
|
||||
<string name="account_journal">jurnal</string>
|
||||
<string name="account_task_list">sarcini</string>
|
||||
<string name="account_only_personal">Afișează numai personal</string>
|
||||
<string name="account_refresh_collections">Actualizează lista</string>
|
||||
<string name="account_webcal_external_app">Abonamentele Webcal pot fi sincronizate cu aplicații externe.</string>
|
||||
<string name="account_no_webcal_handler_found">Nu a fost găsită nicio aplicație compatibilă cu Webcal</string>
|
||||
<string name="account_install_icsx5">Instalează ICSx⁵</string>
|
||||
<!--AddAccountActivity-->
|
||||
<string name="account_carddav">CardDAV</string>
|
||||
<string name="account_caldav">CalDAV</string>
|
||||
<string name="account_webcal">Webcal</string>
|
||||
<string name="account_missing_permissions">Sunt necesare permisiuni suplimentare pentru a sincroniza aceste colecții.</string>
|
||||
<string name="account_manage_permissions">Gestionează permisiunile</string>
|
||||
<string name="account_synchronize_now">Sincronizează acum</string>
|
||||
<string name="account_settings">Setările contului</string>
|
||||
<string name="account_rename">Redenumește contul</string>
|
||||
<string name="account_rename_new_name_description">Datele locale nesalvate pot fi respinse. Resincronizarea este necesară după redenumire.</string>
|
||||
<string name="account_rename_new_name">Nume cont nou</string>
|
||||
<string name="account_rename_rename">Redenumește</string>
|
||||
<string name="account_rename_exists_already">Numele contului este deja luat</string>
|
||||
<string name="account_rename_couldnt_rename">Nu s-a putut redenumi contul</string>
|
||||
<string name="account_delete">Șterge contul</string>
|
||||
<string name="account_delete_confirmation_title">Chiar ștergi contul?</string>
|
||||
<string name="account_delete_confirmation_text">Toate copiile locale ale agendelor, calendarelor și listelor de sarcini vor fi șterse.</string>
|
||||
<string name="account_synchronize_this_collection">sincronizează această colecție</string>
|
||||
<string name="account_read_only">numai pentru citire</string>
|
||||
<string name="account_calendar">calendar</string>
|
||||
<string name="account_contacts">contacte</string>
|
||||
<string name="account_journal">jurnal</string>
|
||||
<string name="account_task_list">sarcini</string>
|
||||
<string name="account_only_personal">Afișează numai personal</string>
|
||||
<string name="account_refresh_collections">Actualizează lista</string>
|
||||
<string name="account_webcal_external_app">Abonamentele Webcal pot fi sincronizate cu aplicații externe.</string>
|
||||
<string name="account_no_webcal_handler_found">Nu a fost găsită nicio aplicație compatibilă cu Webcal</string>
|
||||
<string name="account_install_icsx5">Instalează ICSx⁵</string>
|
||||
<!--AddAccountActivity-->
|
||||
<string name="login_title">Adaugă contul</string>
|
||||
<string name="login_privacy_hint"><![CDATA[Toate datele vor fi transferate numai între server și dispozitiv. %1$s nu le voi trimite altundeva. Vezi <a href="%2$s">Politica de confidențialitate</a>.]]></string>
|
||||
<string name="login_generic_login">Autentificare generică</string>
|
||||
<string name="login_provider_login">Autentificare specifică furnizorului</string>
|
||||
<string name="login_continue">Continuă</string>
|
||||
<string name="login_login">Autentificare</string>
|
||||
<string name="login_type_email">Conectează-te cu adresa de e-mail</string>
|
||||
<string name="login_email_address">Adresa de e-mail</string>
|
||||
<string name="login_email_address_error">Este necesară o adresă de e-mail validă</string>
|
||||
<string name="login_email_address_info"><![CDATA[Domeniul de e-mail este folosit ca URL de bază. <a href="%s">Serviciile sunt descoperite</a> folosind înregistrări DNS și adrese URL bine-cunoscute.]]></string>
|
||||
<string name="login_password">Parolă</string>
|
||||
<string name="login_password_hide">Ascunde parola</string>
|
||||
<string name="login_password_show">Afișează parola</string>
|
||||
<string name="login_password_optional">Parolă (opțional)</string>
|
||||
<string name="login_type_url">Conecteează-te cu adresa URL și numele de utilizator</string>
|
||||
<string name="login_user_name">Nume de utilizator</string>
|
||||
<string name="login_user_name_optional">Nume de utilizator (opțional)</string>
|
||||
<string name="login_base_url">Adresa URL de bază</string>
|
||||
<string name="login_base_url_info"><![CDATA[Adresa URL de bază va fi verificată direct, dar <a href="%s">serviciile sunt de asemenea descoperite</a> folosind înregistrări DNS și adrese URL bine-cunoscute.]]></string>
|
||||
<string name="login_select_certificate">Selectează certificatul</string>
|
||||
<string name="login_add_account">Adaugă contul</string>
|
||||
<string name="login_account_name">Nume de cont</string>
|
||||
<string name="login_account_avoid_apostrophe">Utilizarea apostrofelor (\') pare să cauzeze probleme pe unele dispozitive.</string>
|
||||
<string name="login_account_name_info">Utilizează adresa de e-mail ca nume de cont, deoarece Android va folosi numele contului ca câmp ORGANIZATOR pentru evenimentele pe care le creezi. Nu poți avea două conturi cu același nume.</string>
|
||||
<string name="login_account_contact_group_method">Metoda de grupare a contactelor:</string>
|
||||
<string name="login_account_name_required">Numele contului este necesar</string>
|
||||
<string name="login_account_name_already_taken">Numele contului este deja luat</string>
|
||||
<string name="login_account_not_added">Contul nu a putut fi adăugat</string>
|
||||
<string name="login_finish">Finalizează</string>
|
||||
<string name="login_type_advanced">Autentificare avansată</string>
|
||||
<string name="login_no_client_certificate_optional">Fără certificat de client (opțional)</string>
|
||||
<string name="login_client_certificate_selected">Certificat de client: %s</string>
|
||||
<string name="login_no_certificate_found">Nu a fost găsit niciun certificat</string>
|
||||
<string name="login_install_certificate">Instalare certificat</string>
|
||||
<string name="login_fastmail">Fastmail</string>
|
||||
<string name="login_fastmail_account">Cont Fastmail</string>
|
||||
<string name="login_fastmail_sign_in">Conectează-te cu Fastmail</string>
|
||||
<string name="login_type_google">Contacte Google / Calendar</string>
|
||||
<string name="login_google_account">Cont Google</string>
|
||||
<string name="login_google">Conectează-te cu Google</string>
|
||||
<string name="login_google_client_id">ID client (opțional)</string>
|
||||
<string name="login_google_client_privacy_policy"><![CDATA[%1$s transferă datele din Agendă Google și din Calendar numai pentru sincronizare cu acest dispozitiv. Vezi <a href="%2$s">Politica de confidențialitate</a> pentru detalii.]]></string>
|
||||
<string name="login_google_client_limited_use"><![CDATA[%1$s respectă <a href="%2$s">Politica privind datele utilizatorilor serviciilor API Google</a>, inclusiv cerințele de utilizare limitată.]]></string>
|
||||
<string name="login_oauth_couldnt_obtain_auth_code">Nu s-a putut obține codul de autorizare</string>
|
||||
<string name="login_type_nextcloud">Nextcloud</string>
|
||||
<string name="login_nextcloud_login_with_nextcloud">Conectare cu Nextcloud</string>
|
||||
<string name="login_nextcloud_login_flow_text">Aceasta va porni fluxul de conectare Nextcloud într-un browser web.</string>
|
||||
<string name="login_nextcloud_login_flow_server_address">Adresa serverului Nextcloud</string>
|
||||
<string name="login_nextcloud_login_flow_sign_in">Conectare</string>
|
||||
<string name="login_nextcloud_login_flow_no_login_url">Nu s-a putut obține adresa URL de conectare</string>
|
||||
<string name="login_nextcloud_login_flow_no_login_data">Nu s-au putut obține datele de conectare</string>
|
||||
<string name="login_configuration_detection">Detectarea configurației</string>
|
||||
<string name="login_querying_server">Se interoghează serverul…</string>
|
||||
<string name="login_no_service">Nu s-a putut găsi serviciul CalDAV sau CardDAV.</string>
|
||||
<string name="login_no_service_info">Adresa URL de bază nu pare să fie o adresă URL CalDAV/CardDAV accesibilă, iar detectarea serviciului nu a avut succes.</string>
|
||||
<string name="login_see_tested_services"><![CDATA[Consultă manualul furnizorului de servicii, <a href="%s">lista de servicii testate</a> și adresele lor URL de bază.]]></string>
|
||||
<string name="login_check_credentials">Verifică, de asemenea, și autentificarea (de obicei, numele de utilizator și parola).</string>
|
||||
<string name="login_logs_available">Informații tehnice suplimentare sunt disponibile în jurnale.</string>
|
||||
<string name="login_view_logs">Vezi jurnalele</string>
|
||||
<!--AccountSettingsActivity-->
|
||||
<string name="login_privacy_hint"><![CDATA[Toate datele vor fi transferate numai între server și dispozitiv. %1$s nu le voi trimite altundeva. Vezi <a href="%2$s">Politica de confidențialitate</a>.]]></string>
|
||||
<string name="login_generic_login">Autentificare generică</string>
|
||||
<string name="login_provider_login">Autentificare specifică furnizorului</string>
|
||||
<string name="login_continue">Continuă</string>
|
||||
<string name="login_login">Autentificare</string>
|
||||
<string name="login_type_email">Conectează-te cu adresa de e-mail</string>
|
||||
<string name="login_email_address">Adresa de e-mail</string>
|
||||
<string name="login_email_address_error">Este necesară o adresă de e-mail validă</string>
|
||||
<string name="login_email_address_info"><![CDATA[Domeniul de e-mail este folosit ca URL de bază. <a href="%s">Serviciile sunt descoperite</a> folosind înregistrări DNS și adrese URL bine-cunoscute.]]></string>
|
||||
<string name="login_password">Parolă</string>
|
||||
<string name="login_password_hide">Ascunde parola</string>
|
||||
<string name="login_password_show">Afișează parola</string>
|
||||
<string name="login_password_optional">Parolă (opțional)</string>
|
||||
<string name="login_type_url">Conecteează-te cu adresa URL și numele de utilizator</string>
|
||||
<string name="login_user_name">Nume de utilizator</string>
|
||||
<string name="login_user_name_optional">Nume de utilizator (opțional)</string>
|
||||
<string name="login_base_url">Adresa URL de bază</string>
|
||||
<string name="login_base_url_info"><![CDATA[Adresa URL de bază va fi verificată direct, dar <a href="%s">serviciile sunt de asemenea descoperite</a> folosind înregistrări DNS și adrese URL bine-cunoscute.]]></string>
|
||||
<string name="login_select_certificate">Selectează certificatul</string>
|
||||
<string name="login_add_account">Adaugă contul</string>
|
||||
<string name="login_account_name">Nume de cont</string>
|
||||
<string name="login_account_avoid_apostrophe">Utilizarea apostrofelor (\') pare să cauzeze probleme pe unele dispozitive.</string>
|
||||
<string name="login_account_name_info">Utilizează adresa de e-mail ca nume de cont, deoarece Android va folosi numele contului ca câmp ORGANIZATOR pentru evenimentele pe care le creezi. Nu poți avea două conturi cu același nume.</string>
|
||||
<string name="login_account_contact_group_method">Metoda de grupare a contactelor:</string>
|
||||
<string name="login_account_name_required">Numele contului este necesar</string>
|
||||
<string name="login_account_name_already_taken">Numele contului este deja luat</string>
|
||||
<string name="login_account_not_added">Contul nu a putut fi adăugat</string>
|
||||
<string name="login_finish">Finalizează</string>
|
||||
<string name="login_type_advanced">Autentificare avansată</string>
|
||||
<string name="login_no_client_certificate_optional">Fără certificat de client (opțional)</string>
|
||||
<string name="login_client_certificate_selected">Certificat de client: %s</string>
|
||||
<string name="login_no_certificate_found">Nu a fost găsit niciun certificat</string>
|
||||
<string name="login_install_certificate">Instalare certificat</string>
|
||||
<string name="login_fastmail">Fastmail</string>
|
||||
<string name="login_fastmail_account">Cont Fastmail</string>
|
||||
<string name="login_fastmail_sign_in">Conectează-te cu Fastmail</string>
|
||||
<string name="login_type_google">Contacte Google / Calendar</string>
|
||||
<string name="login_google_account">Cont Google</string>
|
||||
<string name="login_google">Conectează-te cu Google</string>
|
||||
<string name="login_google_client_id">ID client (opțional)</string>
|
||||
<string name="login_google_client_privacy_policy"><![CDATA[%1$s transferă datele din Agendă Google și din Calendar numai pentru sincronizare cu acest dispozitiv. Vezi <a href="%2$s">Politica de confidențialitate</a> pentru detalii.]]></string>
|
||||
<string name="login_google_client_limited_use"><![CDATA[%1$s respectă <a href="%2$s">Politica privind datele utilizatorilor serviciilor API Google</a>, inclusiv cerințele de utilizare limitată.]]></string>
|
||||
<string name="login_oauth_couldnt_obtain_auth_code">Nu s-a putut obține codul de autorizare</string>
|
||||
<string name="login_type_nextcloud">Nextcloud</string>
|
||||
<string name="login_nextcloud_login_with_nextcloud">Conectare cu Nextcloud</string>
|
||||
<string name="login_nextcloud_login_flow_text">Aceasta va porni fluxul de conectare Nextcloud într-un browser web.</string>
|
||||
<string name="login_nextcloud_login_flow_server_address">Adresa serverului Nextcloud</string>
|
||||
<string name="login_nextcloud_login_flow_sign_in">Conectare</string>
|
||||
<string name="login_nextcloud_login_flow_no_login_url">Nu s-a putut obține adresa URL de conectare</string>
|
||||
<string name="login_nextcloud_login_flow_no_login_data">Nu s-au putut obține datele de conectare</string>
|
||||
<string name="login_configuration_detection">Detectarea configurației</string>
|
||||
<string name="login_querying_server">Se interoghează serverul…</string>
|
||||
<string name="login_no_service">Nu s-a putut găsi serviciul CalDAV sau CardDAV.</string>
|
||||
<string name="login_no_service_info">Adresa URL de bază nu pare să fie o adresă URL CalDAV/CardDAV accesibilă, iar detectarea serviciului nu a avut succes.</string>
|
||||
<string name="login_see_tested_services"><![CDATA[Consultă manualul furnizorului de servicii, <a href="%s">lista de servicii testate</a> și adresele lor URL de bază.]]></string>
|
||||
<string name="login_check_credentials">Verifică, de asemenea, și autentificarea (de obicei, numele de utilizator și parola).</string>
|
||||
<string name="login_logs_available">Informații tehnice suplimentare sunt disponibile în jurnale.</string>
|
||||
<string name="login_view_logs">Vezi jurnalele</string>
|
||||
<!--AccountSettingsActivity-->
|
||||
<string name="settings_sync">Sincronizare</string>
|
||||
<string name="settings_sync_interval_contacts">Interval de sincronizare a contactelor</string>
|
||||
<string name="settings_sync_summary_manually">Doar manual</string>
|
||||
<string name="settings_sync_summary_periodically" tools:ignore="PluralsCandidate">La fiecare %d minute + imediat la modificări locale</string>
|
||||
<string name="settings_sync_interval_calendars">Interval de sincronizare a calendarelor</string>
|
||||
<string name="settings_sync_interval_tasks">Interval de sincronizare a sarcinilor</string>
|
||||
<string-array name="settings_sync_interval_names">
|
||||
<item>Doar manual</item>
|
||||
<item>La fiecare 15 minute</item>
|
||||
<item>La fiecare 30 de minute</item>
|
||||
<item>La fiecare oră</item>
|
||||
<item>La fiecare 2 ore</item>
|
||||
<item>La fiecare 4 ore</item>
|
||||
<item>O dată pe zi</item>
|
||||
</string-array>
|
||||
<string name="settings_sync_wifi_only">Sincronizare numai prin WiFi</string>
|
||||
<string name="settings_sync_wifi_only_on">Sincronizarea este limitată la conexiunile WiFi</string>
|
||||
<string name="settings_sync_wifi_only_off">Tipul de conexiune nu este luat în considerare</string>
|
||||
<string name="settings_sync_wifi_only_ssids">Restricție SSID WiFi</string>
|
||||
<string name="settings_sync_wifi_only_ssids_on">Se va sincroniza numai prin %s</string>
|
||||
<string name="settings_sync_wifi_only_ssids_off">Toate conexiunile WiFi vor fi utilizate</string>
|
||||
<string name="settings_sync_wifi_only_ssids_message">Nume separate prin virgulă (SSID) ale rețelelor WiFi permise (lasă necompletat pentru toate)</string>
|
||||
<string name="settings_sync_wifi_only_ssids_permissions_required">Restricția SSID WiFi necesită setări suplimentare</string>
|
||||
<string name="settings_sync_wifi_only_ssids_permissions_action">Gestionează</string>
|
||||
<string name="settings_ignore_vpns">VPN necesită internetul de bază</string>
|
||||
<string name="settings_ignore_vpns_on">VPN fără conexiune validată la Internet nu este suficient pentru a rula sincronizarea (recomandat)</string>
|
||||
<string name="settings_ignore_vpns_off">VPN fără conexiune validată la Internet este suficient pentru a rula sincronizarea</string>
|
||||
<string name="settings_authentication">Autentificare</string>
|
||||
<string name="settings_username">Nume de utilizator</string>
|
||||
<string name="settings_password">Parolă sau parola aplicației</string>
|
||||
<string name="settings_app_password_hint"><![CDATA[Poate preferi să utilizezi <a href="%1$s">parola aplicației</a>.]]></string>
|
||||
<string name="settings_new_password">Parolă nouă</string>
|
||||
<string name="settings_password_summary">Actualizează parola în funcție de server.</string>
|
||||
<string name="settings_reauthorize_oauth">Autorizează din nou (OAuth)</string>
|
||||
<string name="settings_reauthorize_oauth_summary">Utilizează atunci când accesul a fost revocat</string>
|
||||
<string name="settings_reauthorize_oauth_success">Autorizare cu succes</string>
|
||||
<string name="settings_certificate_alias">Certificat de client</string>
|
||||
<string name="settings_certificate_alias_empty">Niciun certificat disponibil sau selectat</string>
|
||||
<string name="settings_certificate_install">Instalare certificat</string>
|
||||
<string name="settings_caldav">CalDAV</string>
|
||||
<string name="settings_sync_time_range_past">Limită de timp pentru evenimentele din trecut</string>
|
||||
<string name="settings_sync_time_range_past_none">Toate evenimentele vor fi sincronizate</string>
|
||||
<plurals name="settings_sync_time_range_past_days">
|
||||
<item quantity="one">Evenimentele cu mai mult de o zi în trecut vor fi ignorate</item>
|
||||
<item quantity="few">Evenimentele cu peste %d zile în trecut vor fi ignorate</item>
|
||||
<item quantity="other">Evenimentele cu peste %d zile în trecut vor fi ignorate</item>
|
||||
</plurals>
|
||||
<string name="settings_sync_time_range_past_message">Evenimentele care depășesc acest număr de zile în trecut vor fi ignorate (poate fi 0). Lasă necompletat pentru a sincroniza toate evenimentele.</string>
|
||||
<string name="settings_default_alarm">Memento implicit</string>
|
||||
<plurals name="settings_default_alarm_on">
|
||||
<item quantity="one">Memento implicit cu un minut înainte de eveniment</item>
|
||||
<item quantity="few">Memento implicit cu %d minute înainte de eveniment</item>
|
||||
<item quantity="other">Memento implicit cu %d minute înainte de eveniment</item>
|
||||
</plurals>
|
||||
<string name="settings_default_alarm_off">Nu sunt create mementouri implicite</string>
|
||||
<string name="settings_default_alarm_message">Dacă vor fi create memento-uri implicite pentru evenimente fără memento: numărul dorit de minute înainte de eveniment. Lasă necompletat pentru a dezactiva memento-urile implicite.</string>
|
||||
<string name="settings_manage_calendar_colors">Gestionează culorile calendarului</string>
|
||||
<string name="settings_manage_calendar_colors_on">Culorile calendarului sunt resetate la fiecare sincronizare</string>
|
||||
<string name="settings_manage_calendar_colors_off">Culorile calendarului pot fi setate de alte aplicații</string>
|
||||
<string name="settings_event_colors">Suport pentru culoarea evenimentului</string>
|
||||
<string name="settings_event_colors_on">Culorile evenimentelor sunt sincronizate</string>
|
||||
<string name="settings_event_colors_off">Culorile evenimentelor nu sunt sincronizate</string>
|
||||
<string name="settings_carddav">CardDAV</string>
|
||||
<string name="settings_contact_group_method">Metoda de grupare a contactelor</string>
|
||||
<string-array name="settings_contact_group_method_entries">
|
||||
<item>Grupurile sunt vCard-uri separate</item>
|
||||
<item>Grupurile sunt categorii per-contact</item>
|
||||
</string-array>
|
||||
<!--CreateAddressBookScreen, CreateCalendarScreen-->
|
||||
<string name="settings_sync_interval_contacts">Interval de sincronizare a contactelor</string>
|
||||
<string name="settings_sync_summary_manually">Doar manual</string>
|
||||
<string name="settings_sync_summary_periodically" tools:ignore="PluralsCandidate">La fiecare %d minute + imediat la modificări locale</string>
|
||||
<string name="settings_sync_interval_calendars">Interval de sincronizare a calendarelor</string>
|
||||
<string name="settings_sync_interval_tasks">Interval de sincronizare a sarcinilor</string>
|
||||
<string-array name="settings_sync_interval_names">
|
||||
<item>Doar manual</item>
|
||||
<item>La fiecare 15 minute</item>
|
||||
<item>La fiecare 30 de minute</item>
|
||||
<item>La fiecare oră</item>
|
||||
<item>La fiecare 2 ore</item>
|
||||
<item>La fiecare 4 ore</item>
|
||||
<item>O dată pe zi</item>
|
||||
</string-array>
|
||||
<string name="settings_sync_wifi_only">Sincronizare numai prin WiFi</string>
|
||||
<string name="settings_sync_wifi_only_on">Sincronizarea este limitată la conexiunile WiFi</string>
|
||||
<string name="settings_sync_wifi_only_off">Tipul de conexiune nu este luat în considerare</string>
|
||||
<string name="settings_sync_wifi_only_ssids">Restricție SSID WiFi</string>
|
||||
<string name="settings_sync_wifi_only_ssids_on">Se va sincroniza numai prin %s</string>
|
||||
<string name="settings_sync_wifi_only_ssids_off">Toate conexiunile WiFi vor fi utilizate</string>
|
||||
<string name="settings_sync_wifi_only_ssids_message">Nume separate prin virgulă (SSID) ale rețelelor WiFi permise (lasă necompletat pentru toate)</string>
|
||||
<string name="settings_sync_wifi_only_ssids_permissions_required">Restricția SSID WiFi necesită setări suplimentare</string>
|
||||
<string name="settings_sync_wifi_only_ssids_permissions_action">Gestionează</string>
|
||||
<string name="settings_ignore_vpns">VPN necesită internetul de bază</string>
|
||||
<string name="settings_ignore_vpns_on">VPN fără conexiune validată la Internet nu este suficient pentru a rula sincronizarea (recomandat)</string>
|
||||
<string name="settings_ignore_vpns_off">VPN fără conexiune validată la Internet este suficient pentru a rula sincronizarea</string>
|
||||
<string name="settings_authentication">Autentificare</string>
|
||||
<string name="settings_username">Nume de utilizator</string>
|
||||
<string name="settings_password">Parolă sau parola aplicației</string>
|
||||
<string name="settings_app_password_hint"><![CDATA[Poate preferi să utilizezi <a href="%1$s">parola aplicației</a>.]]></string>
|
||||
<string name="settings_new_password">Parolă nouă</string>
|
||||
<string name="settings_password_summary">Actualizează parola în funcție de server.</string>
|
||||
<string name="settings_reauthorize_oauth">Autorizează din nou (OAuth)</string>
|
||||
<string name="settings_reauthorize_oauth_summary">Utilizează atunci când accesul a fost revocat</string>
|
||||
<string name="settings_reauthorize_oauth_success">Autorizare cu succes</string>
|
||||
<string name="settings_certificate_alias">Certificat de client</string>
|
||||
<string name="settings_certificate_alias_empty">Niciun certificat disponibil sau selectat</string>
|
||||
<string name="settings_certificate_install">Instalare certificat</string>
|
||||
<string name="settings_caldav">CalDAV</string>
|
||||
<string name="settings_sync_time_range_past">Limită de timp pentru evenimentele din trecut</string>
|
||||
<string name="settings_sync_time_range_past_none">Toate evenimentele vor fi sincronizate</string>
|
||||
<plurals name="settings_sync_time_range_past_days">
|
||||
<item quantity="one">Evenimentele cu mai mult de o zi în trecut vor fi ignorate</item>
|
||||
<item quantity="few">Evenimentele cu peste %d zile în trecut vor fi ignorate</item>
|
||||
<item quantity="other">Evenimentele cu peste %d zile în trecut vor fi ignorate</item>
|
||||
</plurals>
|
||||
<string name="settings_sync_time_range_past_message">Evenimentele care depășesc acest număr de zile în trecut vor fi ignorate (poate fi 0). Lasă necompletat pentru a sincroniza toate evenimentele.</string>
|
||||
<string name="settings_default_alarm">Memento implicit</string>
|
||||
<plurals name="settings_default_alarm_on">
|
||||
<item quantity="one">Memento implicit cu un minut înainte de eveniment</item>
|
||||
<item quantity="few">Memento implicit cu %d minute înainte de eveniment</item>
|
||||
<item quantity="other">Memento implicit cu %d minute înainte de eveniment</item>
|
||||
</plurals>
|
||||
<string name="settings_default_alarm_off">Nu sunt create mementouri implicite</string>
|
||||
<string name="settings_default_alarm_message">Dacă vor fi create memento-uri implicite pentru evenimente fără memento: numărul dorit de minute înainte de eveniment. Lasă necompletat pentru a dezactiva memento-urile implicite.</string>
|
||||
<string name="settings_manage_calendar_colors">Gestionează culorile calendarului</string>
|
||||
<string name="settings_manage_calendar_colors_on">Culorile calendarului sunt resetate la fiecare sincronizare</string>
|
||||
<string name="settings_manage_calendar_colors_off">Culorile calendarului pot fi setate de alte aplicații</string>
|
||||
<string name="settings_event_colors">Suport pentru culoarea evenimentului</string>
|
||||
<string name="settings_event_colors_on">Culorile evenimentelor sunt sincronizate</string>
|
||||
<string name="settings_event_colors_off">Culorile evenimentelor nu sunt sincronizate</string>
|
||||
<string name="settings_carddav">CardDAV</string>
|
||||
<string name="settings_contact_group_method">Metoda de grupare a contactelor</string>
|
||||
<string-array name="settings_contact_group_method_entries">
|
||||
<item>Grupurile sunt vCard-uri separate</item>
|
||||
<item>Grupurile sunt categorii per-contact</item>
|
||||
</string-array>
|
||||
<!--CreateAddressBookScreen, CreateCalendarScreen-->
|
||||
<string name="create_addressbook">Creează agendă de adrese</string>
|
||||
<string name="create_addressbook_maybe_not_supported">Crearea agendei prin CardDAV poate să nu fie acceptată de server.</string>
|
||||
<string name="create_calendar">Creează un calendar</string>
|
||||
<string name="create_calendar_time_zone_optional">Fus orar implicit (opțional)</string>
|
||||
<string name="create_calendar_time_zone_none">—</string>
|
||||
<string name="create_calendar_type">Posibile intrări din calendar</string>
|
||||
<string name="create_calendar_type_vevent">Evenimente</string>
|
||||
<string name="create_calendar_type_vtodo">Sarcini</string>
|
||||
<string name="create_calendar_type_vjournal">Note/jurnal</string>
|
||||
<string name="create_calendar_maybe_not_supported">Crearea calendarului prin CalDAV poate să nu fie acceptată de server.</string>
|
||||
<string name="create_collection_color">Culoare</string>
|
||||
<string name="create_collection_display_name">Titlu</string>
|
||||
<string name="create_collection_home_set">Locația de stocare</string>
|
||||
<string name="create_collection_description_optional">Descriere (opțional)</string>
|
||||
<string name="create_collection_create">Crează</string>
|
||||
<!--CollectionScreen-->
|
||||
<string name="create_addressbook_maybe_not_supported">Crearea agendei prin CardDAV poate să nu fie acceptată de server.</string>
|
||||
<string name="create_calendar">Creează un calendar</string>
|
||||
<string name="create_calendar_time_zone_optional">Fus orar implicit (opțional)</string>
|
||||
<string name="create_calendar_time_zone_none">—</string>
|
||||
<string name="create_calendar_type">Posibile intrări din calendar</string>
|
||||
<string name="create_calendar_type_vevent">Evenimente</string>
|
||||
<string name="create_calendar_type_vtodo">Sarcini</string>
|
||||
<string name="create_calendar_type_vjournal">Note/jurnal</string>
|
||||
<string name="create_calendar_maybe_not_supported">Crearea calendarului prin CalDAV poate să nu fie acceptată de server.</string>
|
||||
<string name="create_collection_color">Culoare</string>
|
||||
<string name="create_collection_display_name">Titlu</string>
|
||||
<string name="create_collection_home_set">Locația de stocare</string>
|
||||
<string name="create_collection_description_optional">Descriere (opțional)</string>
|
||||
<string name="create_collection_create">Crează</string>
|
||||
<!--CollectionScreen-->
|
||||
<string name="collection_datatype_contacts">contacte</string>
|
||||
<string name="collection_datatype_events">evenimente</string>
|
||||
<string name="collection_datatype_tasks">sarcini</string>
|
||||
<string name="collection_delete">Șterge colecția</string>
|
||||
<string name="collection_delete_warning">Această colecție (%s) și toate datele sale vor fi șterse definitiv, atât local, cât și de pe server.</string>
|
||||
<string name="collection_synchronization">Sincronizare</string>
|
||||
<string name="collection_synchronization_on">Sincronizarea este activată</string>
|
||||
<string name="collection_synchronization_off">Sincronizarea este dezactivată</string>
|
||||
<string name="collection_read_only">Numai citire</string>
|
||||
<string name="collection_read_only_by_server">Numai citire (de pe server)</string>
|
||||
<string name="collection_read_only_by_setting">Numai citire (după politică)</string>
|
||||
<string name="collection_read_only_forced">Numai citire (doar local)</string>
|
||||
<string name="collection_read_write">Citire/scriere</string>
|
||||
<string name="collection_title">Titlu</string>
|
||||
<string name="collection_description">Descriere</string>
|
||||
<string name="collection_owner">Proprietar</string>
|
||||
<string name="collection_push_support">Suport Push</string>
|
||||
<string name="collection_push_web_push">Serverul informează despre suportul Push</string>
|
||||
<string name="collection_push_subscribed_at">Abonat la %1$s, expiră la %2$s</string>
|
||||
<string name="collection_last_sync">Ultima sincronizare (%s)</string>
|
||||
<string name="collection_url">Adresă (URL)</string>
|
||||
<!--debugging and DebugInfoActivity-->
|
||||
<string name="collection_datatype_events">evenimente</string>
|
||||
<string name="collection_datatype_tasks">sarcini</string>
|
||||
<string name="collection_delete">Șterge colecția</string>
|
||||
<string name="collection_delete_warning">Această colecție (%s) și toate datele sale vor fi șterse definitiv, atât local, cât și de pe server.</string>
|
||||
<string name="collection_synchronization">Sincronizare</string>
|
||||
<string name="collection_synchronization_on">Sincronizarea este activată</string>
|
||||
<string name="collection_synchronization_off">Sincronizarea este dezactivată</string>
|
||||
<string name="collection_read_only">Numai citire</string>
|
||||
<string name="collection_read_only_by_server">Numai citire (de pe server)</string>
|
||||
<string name="collection_read_only_by_setting">Numai citire (după politică)</string>
|
||||
<string name="collection_read_only_forced">Numai citire (doar local)</string>
|
||||
<string name="collection_read_write">Citire/scriere</string>
|
||||
<string name="collection_title">Titlu</string>
|
||||
<string name="collection_description">Descriere</string>
|
||||
<string name="collection_owner">Proprietar</string>
|
||||
<string name="collection_push_support">Suport Push</string>
|
||||
<string name="collection_push_web_push">Serverul informează despre suportul Push</string>
|
||||
<string name="collection_push_subscribed_at">Abonat la %1$s, expiră la %2$s</string>
|
||||
<string name="collection_last_sync">Ultima sincronizare (%s)</string>
|
||||
<string name="collection_url">Adresă (URL)</string>
|
||||
<!--debugging and DebugInfoActivity-->
|
||||
<string name="debug_info_title">Informații de depanare</string>
|
||||
<string name="debug_info_archive_caption">Arhivă ZIP</string>
|
||||
<string name="debug_info_archive_subtitle">Conține informații de depanare și jurnale</string>
|
||||
<string name="debug_info_archive_text">Partajează arhiva pentru a o transfera pe un computer, pentru a o trimite prin e-mail sau pentru a o atașa la un bilet de asistență.</string>
|
||||
<string name="debug_info_archive_share">Partajează arhiva</string>
|
||||
<string name="debug_info_attached">Informații de depanare atașate la acest mesaj (necesită suport pentru atașamentele aplicației care primește).</string>
|
||||
<string name="debug_info_http_error">Eroare HTTP</string>
|
||||
<string name="debug_info_server_error">Eroare de server</string>
|
||||
<string name="debug_info_webdav_error">Eroare WebDAV</string>
|
||||
<string name="debug_info_io_error">Eroare I/O</string>
|
||||
<string name="debug_info_http_403_description">Solicitarea a fost respinsă de server.</string>
|
||||
<string name="debug_info_http_404_description">Resursa solicitată nu (mai) există.</string>
|
||||
<string name="debug_info_http_405_description">Serverul nu permite tipul de operare solicitat.</string>
|
||||
<string name="debug_info_http_5xx_description">A apărut o problemă la nivelul serverului. Contactează asistența serverului.</string>
|
||||
<string name="debug_info_unexpected_error">A apărut o eroare neașteptată. Vezi informațiile de depanare pentru detalii.</string>
|
||||
<string name="debug_info_view_details">Vezi detaliile</string>
|
||||
<string name="debug_info_subtitle">Au fost colectate informații de depanare</string>
|
||||
<string name="debug_info_involved_caption">Resurse implicate</string>
|
||||
<string name="debug_info_involved_subtitle">Legat de problema</string>
|
||||
<string name="debug_info_involved_remote">Resursa de la distanță:</string>
|
||||
<string name="debug_info_involved_local">Resursa locală:</string>
|
||||
<string name="debug_info_logs_caption">Jurnale</string>
|
||||
<string name="debug_info_logs_subtitle">Jurnalele detaliate sunt disponibile</string>
|
||||
<string name="debug_info_logs_view">Vezi jurnalele</string>
|
||||
<string name="debug_info_copy_remote_url">Copiază adresa URL</string>
|
||||
<string name="debug_info_view_local_resource">Inspectează resursa</string>
|
||||
<string name="debug_info_privacy_warning_title">Notificare de confidențialitate</string>
|
||||
<string name="debug_info_privacy_warning_description">Jurnalele și informațiile de depanare pot conține informații private. Fii conștient de acest lucru atunci când îl publici.</string>
|
||||
<string name="debug_info_can_not_view_resource">Nu se poate vizualiza resursa</string>
|
||||
<!--ExceptionInfoFragment-->
|
||||
<string name="debug_info_archive_caption">Arhivă ZIP</string>
|
||||
<string name="debug_info_archive_subtitle">Conține informații de depanare și jurnale</string>
|
||||
<string name="debug_info_archive_text">Partajează arhiva pentru a o transfera pe un computer, pentru a o trimite prin e-mail sau pentru a o atașa la un bilet de asistență.</string>
|
||||
<string name="debug_info_archive_share">Partajează arhiva</string>
|
||||
<string name="debug_info_attached">Informații de depanare atașate la acest mesaj (necesită suport pentru atașamentele aplicației care primește).</string>
|
||||
<string name="debug_info_http_error">Eroare HTTP</string>
|
||||
<string name="debug_info_server_error">Eroare de server</string>
|
||||
<string name="debug_info_webdav_error">Eroare WebDAV</string>
|
||||
<string name="debug_info_io_error">Eroare I/O</string>
|
||||
<string name="debug_info_http_403_description">Solicitarea a fost respinsă de server.</string>
|
||||
<string name="debug_info_http_404_description">Resursa solicitată nu (mai) există.</string>
|
||||
<string name="debug_info_http_405_description">Serverul nu permite tipul de operare solicitat.</string>
|
||||
<string name="debug_info_http_5xx_description">A apărut o problemă la nivelul serverului. Contactează asistența serverului.</string>
|
||||
<string name="debug_info_unexpected_error">A apărut o eroare neașteptată. Vezi informațiile de depanare pentru detalii.</string>
|
||||
<string name="debug_info_view_details">Vezi detaliile</string>
|
||||
<string name="debug_info_subtitle">Au fost colectate informații de depanare</string>
|
||||
<string name="debug_info_involved_caption">Resurse implicate</string>
|
||||
<string name="debug_info_involved_subtitle">Legat de problema</string>
|
||||
<string name="debug_info_involved_remote">Resursa de la distanță:</string>
|
||||
<string name="debug_info_involved_local">Resursa locală:</string>
|
||||
<string name="debug_info_logs_caption">Jurnale</string>
|
||||
<string name="debug_info_logs_subtitle">Jurnalele detaliate sunt disponibile</string>
|
||||
<string name="debug_info_logs_view">Vezi jurnalele</string>
|
||||
<string name="debug_info_copy_remote_url">Copiază adresa URL</string>
|
||||
<string name="debug_info_view_local_resource">Inspectează resursa</string>
|
||||
<string name="debug_info_privacy_warning_title">Notificare de confidențialitate</string>
|
||||
<string name="debug_info_privacy_warning_description">Jurnalele și informațiile de depanare pot conține informații private. Fii conștient de acest lucru atunci când îl publici.</string>
|
||||
<string name="debug_info_can_not_view_resource">Nu se poate vizualiza resursa</string>
|
||||
<!--ExceptionInfoFragment-->
|
||||
<string name="exception">A avut loc o eroare.</string>
|
||||
<string name="exception_httpexception">A apărut o eroare HTTP.</string>
|
||||
<string name="exception_ioexception">A apărut o eroare I/O.</string>
|
||||
<string name="exception_show_details">Afișează detaliile</string>
|
||||
<!--WebDAV accounts-->
|
||||
<string name="exception_httpexception">A apărut o eroare HTTP.</string>
|
||||
<string name="exception_ioexception">A apărut o eroare I/O.</string>
|
||||
<string name="exception_show_details">Afișează detaliile</string>
|
||||
<!--WebDAV accounts-->
|
||||
<string name="webdav_mounts_title">Montări WebDAV</string>
|
||||
<string name="webdav_mounts_quota_used_available">Cotă utilizată: %1$s / disponibilă: %2$s</string>
|
||||
<string name="webdav_mounts_share_content">Partajează conținutul</string>
|
||||
<string name="webdav_mounts_unmount">Demontează</string>
|
||||
<string name="webdav_add_mount_title">Adaugă o montare WebDAV</string>
|
||||
<string name="webdav_mounts_empty">Accesează direct fișierele din cloud adăugând o montare WebDAV!</string>
|
||||
<string name="webdav_add_mount_empty_more_info"><![CDATA[Vezi manualul pentru a afla <a href="%1$s">cum funcționează montările WebDAV</a>.]]></string>
|
||||
<string name="webdav_add_mount_display_name">Numele afișat</string>
|
||||
<string name="webdav_add_mount_url">URL WebDAV</string>
|
||||
<string name="webdav_add_mount_url_invalid">URL greșit</string>
|
||||
<string name="webdav_add_mount_mountpoint_displayname">Punctul de montare și numele de afișare</string>
|
||||
<string name="webdav_add_mount_authentication">Autentificare</string>
|
||||
<string name="webdav_add_mount_username">Nume de utilizator</string>
|
||||
<string name="webdav_add_mount_password">Parolă</string>
|
||||
<string name="webdav_add_mount_username_optional">Nume de utilizator (opțional)</string>
|
||||
<string name="webdav_add_mount_password_optional">Parolă (opțional)</string>
|
||||
<string name="webdav_add_mount_add">Adaugă montare</string>
|
||||
<string name="webdav_add_mount_no_support">Niciun serviciu WebDAV la această adresă URL</string>
|
||||
<string name="webdav_remove_mount_title">Elimină punctul de montare</string>
|
||||
<string name="webdav_remove_mount_text">Detaliile conexiunii se vor pierde, dar niciun fișier nu va fi șters.</string>
|
||||
<string name="webdav_notification_access">Se accesează fișierul WebDAV</string>
|
||||
<string name="webdav_notification_download">Se descarcă fișierul WebDAV</string>
|
||||
<string name="webdav_notification_upload">Se actualizează fișierul WebDAV</string>
|
||||
<string name="webdav_provider_root_title">Montare WebDAV</string>
|
||||
<!--sync-->
|
||||
<string name="webdav_mounts_quota_used_available">Cotă utilizată: %1$s / disponibilă: %2$s</string>
|
||||
<string name="webdav_mounts_share_content">Partajează conținutul</string>
|
||||
<string name="webdav_mounts_unmount">Demontează</string>
|
||||
<string name="webdav_add_mount_title">Adaugă o montare WebDAV</string>
|
||||
<string name="webdav_mounts_empty">Accesează direct fișierele din cloud adăugând o montare WebDAV!</string>
|
||||
<string name="webdav_add_mount_empty_more_info"><![CDATA[Vezi manualul pentru a afla <a href="%1$s">cum funcționează montările WebDAV</a>.]]></string>
|
||||
<string name="webdav_add_mount_display_name">Numele afișat</string>
|
||||
<string name="webdav_add_mount_url">URL WebDAV</string>
|
||||
<string name="webdav_add_mount_url_invalid">URL greșit</string>
|
||||
<string name="webdav_add_mount_mountpoint_displayname">Punctul de montare și numele de afișare</string>
|
||||
<string name="webdav_add_mount_authentication">Autentificare</string>
|
||||
<string name="webdav_add_mount_username">Nume de utilizator</string>
|
||||
<string name="webdav_add_mount_password">Parolă</string>
|
||||
<string name="webdav_add_mount_username_optional">Nume de utilizator (opțional)</string>
|
||||
<string name="webdav_add_mount_password_optional">Parolă (opțional)</string>
|
||||
<string name="webdav_add_mount_add">Adaugă montare</string>
|
||||
<string name="webdav_add_mount_no_support">Niciun serviciu WebDAV la această adresă URL</string>
|
||||
<string name="webdav_remove_mount_title">Elimină punctul de montare</string>
|
||||
<string name="webdav_remove_mount_text">Detaliile conexiunii se vor pierde, dar niciun fișier nu va fi șters.</string>
|
||||
<string name="webdav_notification_access">Se accesează fișierul WebDAV</string>
|
||||
<string name="webdav_notification_download">Se descarcă fișierul WebDAV</string>
|
||||
<string name="webdav_notification_upload">Se actualizează fișierul WebDAV</string>
|
||||
<string name="webdav_provider_root_title">Montare WebDAV</string>
|
||||
<!--sync-->
|
||||
<string name="sync_error_permissions">Permisiuni DAVx⁵</string>
|
||||
<string name="sync_error_permissions_text">Sunt necesare permisiuni suplimentare</string>
|
||||
<string name="sync_error_tasks_too_old">%s prea vechi</string>
|
||||
<string name="sync_error_tasks_required_version">Versiunea minimă necesară: %1$s</string>
|
||||
<string name="sync_error_authentication_failed">Autentificare eșuată (verifică datele de conectare)</string>
|
||||
<string name="sync_error_io">Eroare de rețea sau I/O – %s</string>
|
||||
<string name="sync_error_http_dav">Eroare de server HTTP – %s</string>
|
||||
<string name="sync_error_local_storage">Eroare de stocare locală – %s</string>
|
||||
<string name="sync_error_retry_limit_reached">Eroare soft (încercări maxime atinse)</string>
|
||||
<string name="sync_invalid_contact">S-a primit contact nevalid de la server</string>
|
||||
<string name="sync_invalid_event">S-a primit eveniment nevalid de la server</string>
|
||||
<string name="sync_invalid_task">S-a primit sarcină nevalidă de la server</string>
|
||||
<string name="sync_invalid_resources_ignoring">Ignorarea uneia sau mai multor resurse nevalide</string>
|
||||
<string name="sync_notification_pending_push_title">Sincronizare în așteptare</string>
|
||||
<string name="sync_notification_pending_push_message">Datele de la distanță s-au schimbat</string>
|
||||
<!--widgets-->
|
||||
<string name="sync_error_permissions_text">Sunt necesare permisiuni suplimentare</string>
|
||||
<string name="sync_error_tasks_too_old">%s prea vechi</string>
|
||||
<string name="sync_error_tasks_required_version">Versiunea minimă necesară: %1$s</string>
|
||||
<string name="sync_error_authentication_failed">Autentificare eșuată (verifică datele de conectare)</string>
|
||||
<string name="sync_error_io">Eroare de rețea sau I/O – %s</string>
|
||||
<string name="sync_error_http_dav">Eroare de server HTTP – %s</string>
|
||||
<string name="sync_error_local_storage">Eroare de stocare locală – %s</string>
|
||||
<string name="sync_error_retry_limit_reached">Eroare soft (încercări maxime atinse)</string>
|
||||
<string name="sync_invalid_contact">S-a primit contact nevalid de la server</string>
|
||||
<string name="sync_invalid_event">S-a primit eveniment nevalid de la server</string>
|
||||
<string name="sync_invalid_task">S-a primit sarcină nevalidă de la server</string>
|
||||
<string name="sync_invalid_resources_ignoring">Ignorarea uneia sau mai multor resurse nevalide</string>
|
||||
<string name="sync_notification_pending_push_title">Sincronizare în așteptare</string>
|
||||
<string name="sync_notification_pending_push_message">Datele de la distanță s-au schimbat</string>
|
||||
<!--widgets-->
|
||||
<string name="widget_sync_all">Sincronizează tot</string>
|
||||
<string name="widget_sync_all_accounts">Sincronizează toate conturile</string>
|
||||
<string name="widget_labeled_sync_label">Eticheta butonului de sincronizare</string>
|
||||
<string name="widget_icon_sync_label">Pictograma butonului de sincronizare</string>
|
||||
<string name="widget_sync_description">Atinge pentru a rula sincronizarea manual.</string>
|
||||
<!--cert4android-->
|
||||
<string name="widget_sync_all_accounts">Sincronizează toate conturile</string>
|
||||
<string name="widget_labeled_sync_label">Eticheta butonului de sincronizare</string>
|
||||
<string name="widget_icon_sync_label">Pictograma butonului de sincronizare</string>
|
||||
<string name="widget_sync_description">Atinge pentru a rula sincronizarea manual.</string>
|
||||
<!--cert4android-->
|
||||
</resources>
|
||||
|
||||
@@ -58,6 +58,10 @@
|
||||
<string name="intro_tasks_tasks_org_info"><![CDATA[Some features <a href="https://www.davx5.com/faq/tasks/advanced-task-features">are not supported</a>.]]></string>
|
||||
<string name="intro_tasks_no_app_store">No app store available</string>
|
||||
<string name="intro_tasks_dont_show">I don\'t need tasks support.*</string>
|
||||
<string name="intro_backups_title">Backups reminder</string>
|
||||
<string name="intro_backups_important">It\'s important to back up your data (including contacts and calendars) regularly to prevent potential data loss.</string>
|
||||
<string name="intro_backups_something_wrong">Something can always go wrong, whether on the server, within %s, or in other apps, which for instance might accidentally delete all calendar entries. (The deletions would then be synchronized to the server.)</string>
|
||||
<string name="intro_backups_accept">I already have a working backup strategy or I don\'t need one.</string>
|
||||
<string name="intro_open_source_title">Open-source software</string>
|
||||
<string name="intro_open_source_text">We\'re happy that you use %s, which is open-source software. Development, maintenance and support are hard work. Please consider contributing (there are many ways) or a donation. It would be highly appreciated!</string>
|
||||
<string name="intro_open_source_details">How to contribute/donate</string>
|
||||
@@ -113,6 +117,9 @@
|
||||
|
||||
<!-- AboutActivity -->
|
||||
<string name="about_translations">Translations</string>
|
||||
<string name="about_translations_thanks">❤️ Thanks to all who have contributed translations!</string>
|
||||
<string name="about_translations_over_transifex">Over Transifex</string>
|
||||
<string name="about_translations_over_weblate">Over Weblate</string>
|
||||
<string name="about_libraries">Libraries</string>
|
||||
<string name="about_version">Version %1$s (%2$d)</string>
|
||||
<string name="about_copyright">© Ricki Hirner, Bernhard Stockmann (bitfire web engineering GmbH) and contributors</string>
|
||||
|
||||
@@ -4,13 +4,12 @@
|
||||
|
||||
package at.bitfire.davdroid.di
|
||||
|
||||
import at.bitfire.davdroid.ui.intro.OseIntroPageFactory
|
||||
|
||||
import at.bitfire.davdroid.ui.AboutActivity
|
||||
import at.bitfire.davdroid.ui.AccountsDrawerHandler
|
||||
import at.bitfire.davdroid.ui.OpenSourceLicenseInfoProvider
|
||||
import at.bitfire.davdroid.ui.OseAccountsDrawerHandler
|
||||
import at.bitfire.davdroid.ui.about.AboutActivity
|
||||
import at.bitfire.davdroid.ui.about.OpenSourceLicenseInfoProvider
|
||||
import at.bitfire.davdroid.ui.intro.IntroPageFactory
|
||||
import at.bitfire.davdroid.ui.intro.OseIntroPageFactory
|
||||
import at.bitfire.davdroid.ui.setup.LoginTypesProvider
|
||||
import at.bitfire.davdroid.ui.setup.StandardLoginTypesProvider
|
||||
import dagger.Binds
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
*/
|
||||
|
||||
package at.bitfire.davdroid.ui
|
||||
package at.bitfire.davdroid.ui.about
|
||||
|
||||
import android.app.Application
|
||||
import android.text.Spanned
|
||||
@@ -20,9 +20,9 @@ import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import at.bitfire.davdroid.ui.UiUtils.toAnnotatedString
|
||||
import com.google.common.io.CharStreams
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
class OpenSourceLicenseInfoProvider @Inject constructor(): AboutActivity.AppLicenseInfoProvider {
|
||||
|
||||
@@ -7,6 +7,7 @@ package at.bitfire.davdroid.ui.intro
|
||||
import javax.inject.Inject
|
||||
|
||||
class OseIntroPageFactory @Inject constructor(
|
||||
backupsPage: BackupsPage,
|
||||
batteryOptimizationsPage: BatteryOptimizationsPage,
|
||||
openSourcePage: OpenSourcePage,
|
||||
permissionsIntroPage: PermissionsIntroPage,
|
||||
@@ -18,6 +19,7 @@ class OseIntroPageFactory @Inject constructor(
|
||||
tasksIntroPage,
|
||||
permissionsIntroPage,
|
||||
batteryOptimizationsPage,
|
||||
backupsPage,
|
||||
openSourcePage
|
||||
)
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
DAVx⁵ è un'applicazione CalDAV/CardDAV di controllo e sincronizzazione per Android che è nativamente integrata con le applicazione Android di calendario/contatti.
|
||||
DAVx⁵ è un'applicazione di gestione e sincronizzazione CalDAV/CardDAV per Android che è integrata nativamente con le applicazione Android di calendario/contatti.
|
||||
|
||||
Utilizzalo con il tuo server o con un ospite fidato per mantenere sotto controllo i tuoi contatti, aventi o attività.
|
||||
Utilizzalo con un server di tua proprietà o con un server fidato per sincronizzare i tuoi contatti, gli eventi o attività.
|
||||
|
||||
Per maggiori informazioni e per una lista di server/servizi testati, guarda nel sito Web.
|
||||
|
||||
@@ -18,7 +18,7 @@ androidx-test-runner = "1.7.0"
|
||||
androidx-test-rules = "1.7.0"
|
||||
androidx-test-junit = "1.3.0"
|
||||
androidx-work = "2.11.0"
|
||||
bitfire-cert4android = "75cc6913fd"
|
||||
bitfire-cert4android = "42d883e958"
|
||||
bitfire-dav4jvm = "acf8e4ef9b"
|
||||
bitfire-synctools = "25b92ef99a"
|
||||
compose-accompanist = "0.37.3"
|
||||
@@ -32,12 +32,12 @@ hilt = "2.59"
|
||||
kotlin = "2.2.21"
|
||||
kotlinx-coroutines = "1.10.2"
|
||||
ksp = "2.3.4"
|
||||
ktor = "3.3.3"
|
||||
ktor = "3.4.0"
|
||||
mikepenz-aboutLibraries = "13.2.1"
|
||||
mockk = "1.14.7"
|
||||
mockk = "1.14.9"
|
||||
okhttp = "5.3.2"
|
||||
openid-appauth = "0.11.1"
|
||||
robolectric = "4.16"
|
||||
robolectric = "4.16.1"
|
||||
room = "2.8.4"
|
||||
unifiedpush = "3.2.0"
|
||||
unifiedpush-fcm = "3.0.0"
|
||||
@@ -57,6 +57,7 @@ androidx-arch-core-testing = { module = "androidx.arch.core:core-testing", versi
|
||||
androidx-browser = { module = "androidx.browser:browser", version.ref = "androidx-browser" }
|
||||
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
|
||||
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
|
||||
androidx-compose-material3-adaptive = { group = "androidx.compose.material3.adaptive", name = "adaptive" }
|
||||
androidx-compose-materialIconsExtended = { module = "androidx.compose.material:material-icons-extended" }
|
||||
androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" }
|
||||
androidx-compose-ui-toolingPreview = { module = "androidx.compose.ui:ui-tooling-preview" }
|
||||
|
||||
12
scripts/fetch-weblate-translators.sh
Executable file
12
scripts/fetch-weblate-translators.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
|
||||
#
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
DATE=$(date +'%Y-%m-%d')
|
||||
|
||||
curl -H 'Accept: application/json' -H "Authorization: Token $WEBLATE_API_TOKEN" \
|
||||
"https://hosted.weblate.org/api/projects/davx5/credits/?start=2026-01-01&end=$DATE" \
|
||||
> "$SCRIPT_DIR/../app/src/main/assets/weblate-translators.json"
|
||||
Reference in New Issue
Block a user