Compare commits

..

5 Commits

Author SHA1 Message Date
dependabot[bot]
63a5359c06 Bump the app-dependencies group with 7 updates (#1944)
Bumps the app-dependencies group with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [io.ktor:ktor-client-content-negotiation](https://github.com/ktorio/ktor) | `3.3.3` | `3.4.0` |
| [io.ktor:ktor-client-core](https://github.com/ktorio/ktor) | `3.3.3` | `3.4.0` |
| [io.ktor:ktor-client-okhttp](https://github.com/ktorio/ktor) | `3.3.3` | `3.4.0` |
| [io.ktor:ktor-serialization-kotlinx-json](https://github.com/ktorio/ktor) | `3.3.3` | `3.4.0` |
| [io.mockk:mockk](https://github.com/mockk/mockk) | `1.14.7` | `1.14.9` |
| [io.mockk:mockk-android](https://github.com/mockk/mockk) | `1.14.7` | `1.14.9` |
| [org.robolectric:robolectric](https://github.com/robolectric/robolectric) | `4.16` | `4.16.1` |


Updates `io.ktor:ktor-client-content-negotiation` from 3.3.3 to 3.4.0
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.3.3...3.4.0)

Updates `io.ktor:ktor-client-core` from 3.3.3 to 3.4.0
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.3.3...3.4.0)

Updates `io.ktor:ktor-client-okhttp` from 3.3.3 to 3.4.0
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.3.3...3.4.0)

Updates `io.ktor:ktor-serialization-kotlinx-json` from 3.3.3 to 3.4.0
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.3.3...3.4.0)

Updates `io.ktor:ktor-client-core` from 3.3.3 to 3.4.0
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.3.3...3.4.0)

Updates `io.ktor:ktor-client-okhttp` from 3.3.3 to 3.4.0
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.3.3...3.4.0)

Updates `io.ktor:ktor-serialization-kotlinx-json` from 3.3.3 to 3.4.0
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ktorio/ktor/compare/3.3.3...3.4.0)

Updates `io.mockk:mockk` from 1.14.7 to 1.14.9
- [Release notes](https://github.com/mockk/mockk/releases)
- [Commits](https://github.com/mockk/mockk/compare/1.14.7...1.14.9)

Updates `io.mockk:mockk-android` from 1.14.7 to 1.14.9
- [Release notes](https://github.com/mockk/mockk/releases)
- [Commits](https://github.com/mockk/mockk/compare/1.14.7...1.14.9)

Updates `io.mockk:mockk-android` from 1.14.7 to 1.14.9
- [Release notes](https://github.com/mockk/mockk/releases)
- [Commits](https://github.com/mockk/mockk/compare/1.14.7...1.14.9)

Updates `org.robolectric:robolectric` from 4.16 to 4.16.1
- [Release notes](https://github.com/robolectric/robolectric/releases)
- [Commits](https://github.com/robolectric/robolectric/compare/robolectric-4.16...robolectric-4.16.1)

---
updated-dependencies:
- dependency-name: io.ktor:ktor-client-content-negotiation
  dependency-version: 3.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: app-dependencies
- dependency-name: io.ktor:ktor-client-core
  dependency-version: 3.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: app-dependencies
- dependency-name: io.ktor:ktor-client-okhttp
  dependency-version: 3.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: app-dependencies
- dependency-name: io.ktor:ktor-serialization-kotlinx-json
  dependency-version: 3.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: app-dependencies
- dependency-name: io.ktor:ktor-client-core
  dependency-version: 3.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: app-dependencies
- dependency-name: io.ktor:ktor-client-okhttp
  dependency-version: 3.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: app-dependencies
- dependency-name: io.ktor:ktor-serialization-kotlinx-json
  dependency-version: 3.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: app-dependencies
- dependency-name: io.mockk:mockk
  dependency-version: 1.14.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: app-dependencies
- dependency-name: io.mockk:mockk-android
  dependency-version: 1.14.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: app-dependencies
- dependency-name: io.mockk:mockk-android
  dependency-version: 1.14.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: app-dependencies
- dependency-name: org.robolectric:robolectric
  dependency-version: 4.16.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: app-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-26 17:26:59 +01:00
Weblate (bot)
89a7cd2885 Translations update from Hosted Weblate (#1943)
* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (430 of 430 strings)

Translation: davx5/DAVx⁵ app strings (main)
Translate-URL: https://hosted.weblate.org/projects/davx5/davx5-ose-strings/pt_BR/

* Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (430 of 430 strings)

Translation: davx5/DAVx⁵ app strings (main)
Translate-URL: https://hosted.weblate.org/projects/davx5/davx5-ose-strings/zh_Hans/

* Translated using Weblate (Estonian)

Currently translated at 100.0% (430 of 430 strings)

Translation: davx5/DAVx⁵ app strings (main)
Translate-URL: https://hosted.weblate.org/projects/davx5/davx5-ose-strings/et/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (430 of 430 strings)

Translation: davx5/DAVx⁵ app strings (main)
Translate-URL: https://hosted.weblate.org/projects/davx5/davx5-ose-strings/nl/

* Added translation using Weblate (Lithuanian)

* Translated using Weblate (Lithuanian)

Currently translated at 7.6% (33 of 430 strings)

Translation: davx5/DAVx⁵ app strings (main)
Translate-URL: https://hosted.weblate.org/projects/davx5/davx5-ose-strings/lt/

* Translated using Weblate (Georgian)

Currently translated at 84.6% (364 of 430 strings)

Translation: davx5/DAVx⁵ app strings (main)
Translate-URL: https://hosted.weblate.org/projects/davx5/davx5-ose-strings/ka/

* Translated using Weblate (Romanian)

Currently translated at 100.0% (430 of 430 strings)

Translation: davx5/DAVx⁵ app strings (main)
Translate-URL: https://hosted.weblate.org/projects/davx5/davx5-ose-strings/ro/

* Translated using Weblate (Italian)

Currently translated at 88.1% (379 of 430 strings)

Translation: davx5/DAVx⁵ app strings (main)
Translate-URL: https://hosted.weblate.org/projects/davx5/davx5-ose-strings/it/

* Translated using Weblate (Italian)

Currently translated at 100.0% (4 of 4 strings)

Translation: davx5/DAVx⁵ app metadata (for F-Droid)
Translate-URL: https://hosted.weblate.org/projects/davx5/davx5-ose-fastlane/it/

---------

Co-authored-by: LucasMZ <git@lucasmz.dev>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>
Co-authored-by: Stephan Paternotte <stephan@paternottes.net>
Co-authored-by: Vaclovas Intas <Gateway_31@protonmail.com>
Co-authored-by: Temuri Doghonadze <temuri.doghonadze@gmail.com>
Co-authored-by: Igor Sorocean <sorocean.igor@gmail.com>
Co-authored-by: Alì Mortacci <newscpq@vivaldi.net>
2026-01-25 18:14:56 +01:00
Ricki Hirner
db25570581 Bump version to 4.5.9-alpha.1 2026-01-25 17:52:15 +01:00
Arnau Mora
3de34e53d0 Migrate translation contributors credits to Weblate (#1918)
* Update loading method for Weblate

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Add fetch script

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Add test function

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Add credits from Transifex

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Add workflow for updating Weblate credits

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Improve styling

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Add line break at the end

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Filter Ricki in translation contributions

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Display Transifex translations

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Modify PRs, not the base branch

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Fix paddings

Signed-off-by: Arnau Mora <arnyminerz@proton.me>

* Rename weblateTranslations flow and loadWeblateTranslations function

* Rename variables and functions from `translations` to `translators`

* - Move AboutActivity.Model class to AboutModel

* Rename translators files

* Minor renaming

* Refactor sorting logic into `sortTranslators` function

* Rename script to fetch Weblate translators

* - Remove `AboutActivityTest` class
- Move `loadTransifexTranslators` function to `AboutModel`
- Update `loadWeblateTranslators` function in `AboutModel`

* Update Weblate workflow

* - Combine Weblate and Transifex translators into a single list
- Update AboutActivity to use the combined list
- Add tests for the new functionality

* Merge Transifex and Weblate translators by username, don't show language, add Engage widget

* Extract TranslationsTab

* AboutModel: update tests

* Add thanks message for translation contributors

* Move translation credits to Weblate

- Update `OpenSourceLicenseInfoProvider` path
- Add new strings for translations credits
- Update `TranslationsTab` with new strings

* Add Accept-Language, update Context

* Update Weblate Translators Workflow

- Allow workflow to run on specific branch for testing
- Remove unnecessary fetch-depth comment

* Update Weblate Translators Workflow (2)

* Remove workflow

---------

Signed-off-by: Arnau Mora <arnyminerz@proton.me>
Co-authored-by: Ricki Hirner <hirner@bitfire.at>
2026-01-25 17:51:34 +01:00
Ricki Hirner
af084fb5d0 Add "Backups reminder" intro screen (#1937)
* Add BackupsPage to intro UI

* Add BackupsPage UI

- Implement BackupsPage composable with UI elements
- Add strings for backups reminder and acceptance

* Add to "Reset hints"

* Add another paragraph

* Update backup screen hints

- Update backups reminder text
- Remove redundant versioning note
- Update acceptance message
2026-01-25 17:48:09 +01:00
27 changed files with 1574 additions and 1226 deletions

View File

@@ -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)

View File

@@ -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())
}
}

View File

@@ -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"/>

View File

File diff suppressed because one or more lines are too long

View File

@@ -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()
}

View File

@@ -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
)

View File

@@ -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()
}
}

View File

@@ -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) {

View File

@@ -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

View File

@@ -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)
}

View File

@@ -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"))
))
}

View 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")
}
})
}

View 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(", ")
}

View File

@@ -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"
)
}

View File

@@ -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()
))
}
}
)
}

View 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 = {}
)
}
}

View File

@@ -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 {

View File

@@ -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 &gt; 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 &gt; 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 &amp; 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 &amp; 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>

View File

@@ -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 &gt; 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 &gt; 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>

View File

@@ -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>

View File

@@ -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

View File

@@ -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 {

View File

@@ -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
)

View File

@@ -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.

View File

@@ -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" }

View 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"