Merge branch 'master' into sync-part-final

This commit is contained in:
KaiserBh 2024-01-08 06:44:07 +11:00 committed by GitHub
commit 39e3b356bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 364 additions and 192 deletions

View File

@ -3,7 +3,7 @@
I acknowledge that: I acknowledge that:
- I have updated: - I have updated:
- To the latest version of the app (stable is v0.15.0) - To the latest version of the app (stable is v0.15.1)
- All extensions - All extensions
- I have gone through the FAQ (https://tachiyomi.org/docs/faq/general) and troubleshooting guide (https://tachiyomi.org/docs/guides/troubleshooting/) - I have gone through the FAQ (https://tachiyomi.org/docs/faq/general) and troubleshooting guide (https://tachiyomi.org/docs/guides/troubleshooting/)
- If this is an issue with an extension, that I should be opening an issue in https://github.com/tachiyomiorg/tachiyomi-extensions - If this is an issue with an extension, that I should be opening an issue in https://github.com/tachiyomiorg/tachiyomi-extensions

View File

@ -53,7 +53,7 @@ body:
label: Tachiyomi version label: Tachiyomi version
description: You can find your Tachiyomi version in **More → About**. description: You can find your Tachiyomi version in **More → About**.
placeholder: | placeholder: |
Example: "0.15.0" Example: "0.15.1"
validations: validations:
required: true required: true
@ -98,7 +98,7 @@ body:
required: true required: true
- label: I have gone through the [FAQ](https://tachiyomi.org/docs/faq/general) and [troubleshooting guide](https://tachiyomi.org/docs/guides/troubleshooting/). - label: I have gone through the [FAQ](https://tachiyomi.org/docs/faq/general) and [troubleshooting guide](https://tachiyomi.org/docs/guides/troubleshooting/).
required: true required: true
- label: I have updated the app to version **[0.15.0](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**. - label: I have updated the app to version **[0.15.1](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**.
required: true required: true
- label: I have updated all installed extensions. - label: I have updated all installed extensions.
required: true required: true

View File

@ -33,7 +33,7 @@ body:
required: true required: true
- label: If this is an issue with an extension, I should be opening an issue in the [extensions repository](https://github.com/tachiyomiorg/tachiyomi-extensions/issues/new/choose). - label: If this is an issue with an extension, I should be opening an issue in the [extensions repository](https://github.com/tachiyomiorg/tachiyomi-extensions/issues/new/choose).
required: true required: true
- label: I have updated the app to version **[0.15.0](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**. - label: I have updated the app to version **[0.15.1](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**.
required: true required: true
- label: I will fill out all of the requested information in this form. - label: I will fill out all of the requested information in this form.
required: true required: true

View File

@ -22,8 +22,8 @@ android {
defaultConfig { defaultConfig {
applicationId = "eu.kanade.tachiyomi" applicationId = "eu.kanade.tachiyomi"
versionCode = 115 versionCode = 117
versionName = "0.15.0" versionName = "0.15.1"
buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"") buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"")
buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"") buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"")

View File

@ -8,7 +8,8 @@
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Storage --> <!-- Storage -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" /> tools:ignore="ScopedStorage" />
<!-- For background jobs --> <!-- For background jobs -->
@ -21,17 +22,20 @@
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" /> <uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
<!-- To view extension packages in API 30+ --> <!-- To view extension packages in API 30+ -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" <uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" /> tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_APP_SPECIFIC_LOCALES" <uses-permission
android:name="android.permission.READ_APP_SPECIFIC_LOCALES"
tools:ignore="ProtectedPermissions" /> tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<!-- Remove permission from Firebase dependency --> <!-- Remove permission from Firebase dependency -->
<uses-permission android:name="com.google.android.gms.permission.AD_ID" <uses-permission
android:name="com.google.android.gms.permission.AD_ID"
tools:node="remove" /> tools:node="remove" />
<application <application
@ -52,16 +56,30 @@
<activity <activity
android:name=".ui.main.MainActivity" android:name=".ui.main.MainActivity"
android:exported="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:theme="@style/Theme.Tachiyomi.SplashScreen" android:theme="@style/Theme.Tachiyomi.SplashScreen">
android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
<intent-filter> <!-- Deep link to add repos -->
<intent-filter android:label="@string/action_add_repo">
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tachiyomi" />
<data android:host="add-repo" />
</intent-filter>
<!-- Open backup files -->
<intent-filter android:label="@string/pref_restore_backup">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
@ -69,7 +87,6 @@
<data android:scheme="content" /> <data android:scheme="content" />
<data android:host="*" /> <data android:host="*" />
<data android:mimeType="*/*" /> <data android:mimeType="*/*" />
<!-- <!--
Work around Android's ugly primitive PatternMatcher Work around Android's ugly primitive PatternMatcher
implementation that can't cope with finding a . early in implementation that can't cope with finding a . early in
@ -93,16 +110,16 @@
</activity> </activity>
<activity <activity
android:process=":error_handler"
android:name=".crash.CrashActivity" android:name=".crash.CrashActivity"
android:exported="false" /> android:exported="false"
android:process=":error_handler" />
<activity <activity
android:name=".ui.deeplink.DeepLinkActivity" android:name=".ui.deeplink.DeepLinkActivity"
android:launchMode="singleTask" android:exported="true"
android:theme="@android:style/Theme.NoDisplay"
android:label="@string/action_search" android:label="@string/action_search"
android:exported="true"> android:launchMode="singleTask"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.SEARCH" /> <action android:name="android.intent.action.SEARCH" />
<action android:name="com.google.android.gms.actions.SEARCH_ACTION" /> <action android:name="com.google.android.gms.actions.SEARCH_ACTION" />
@ -126,20 +143,21 @@
<activity <activity
android:name=".ui.reader.ReaderActivity" android:name=".ui.reader.ReaderActivity"
android:launchMode="singleTask" android:exported="false"
android:exported="false"> android:launchMode="singleTask">
<intent-filter> <intent-filter>
<action android:name="com.samsung.android.support.REMOTE_ACTION" /> <action android:name="com.samsung.android.support.REMOTE_ACTION" />
</intent-filter> </intent-filter>
<meta-data android:name="com.samsung.android.support.REMOTE_ACTION" <meta-data
android:name="com.samsung.android.support.REMOTE_ACTION"
android:resource="@xml/s_pen_actions" /> android:resource="@xml/s_pen_actions" />
</activity> </activity>
<activity <activity
android:name=".ui.security.UnlockActivity" android:name=".ui.security.UnlockActivity"
android:theme="@style/Theme.Tachiyomi" android:exported="false"
android:exported="false" /> android:theme="@style/Theme.Tachiyomi" />
<activity <activity
android:name=".ui.webview.WebViewActivity" android:name=".ui.webview.WebViewActivity"
@ -148,25 +166,25 @@
<activity <activity
android:name=".extension.util.ExtensionInstallActivity" android:name=".extension.util.ExtensionInstallActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar" android:exported="false"
android:exported="false" /> android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity <activity
android:name=".ui.setting.track.TrackLoginActivity" android:name=".ui.setting.track.TrackLoginActivity"
android:label="@string/track_activity_name" android:exported="true"
android:exported="true"> android:label="@string/track_activity_name">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tachiyomi" />
<data android:host="anilist-auth" /> <data android:host="anilist-auth" />
<data android:host="bangumi-auth" /> <data android:host="bangumi-auth" />
<data android:host="myanimelist-auth" /> <data android:host="myanimelist-auth" />
<data android:host="shikimori-auth" /> <data android:host="shikimori-auth" />
<data android:scheme="tachiyomi"/>
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
@ -220,9 +238,9 @@
<provider <provider
android:name="rikka.shizuku.ShizukuProvider" android:name="rikka.shizuku.ShizukuProvider"
android:authorities="${applicationId}.shizuku" android:authorities="${applicationId}.shizuku"
android:multiprocess="false"
android:enabled="true" android:enabled="true"
android:exported="true" android:exported="true"
android:multiprocess="false"
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" /> android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
<meta-data <meta-data

View File

@ -21,6 +21,7 @@ import eu.kanade.domain.source.interactor.SetMigrateSorting
import eu.kanade.domain.source.interactor.ToggleLanguage import eu.kanade.domain.source.interactor.ToggleLanguage
import eu.kanade.domain.source.interactor.ToggleSource import eu.kanade.domain.source.interactor.ToggleSource
import eu.kanade.domain.source.interactor.ToggleSourcePin import eu.kanade.domain.source.interactor.ToggleSourcePin
import eu.kanade.domain.source.interactor.TrustExtension
import eu.kanade.domain.track.interactor.AddTracks import eu.kanade.domain.track.interactor.AddTracks
import eu.kanade.domain.track.interactor.RefreshTracks import eu.kanade.domain.track.interactor.RefreshTracks
import eu.kanade.domain.track.interactor.SyncChapterProgressWithTrack import eu.kanade.domain.track.interactor.SyncChapterProgressWithTrack
@ -170,6 +171,7 @@ class DomainModule : InjektModule {
addFactory { ToggleLanguage(get()) } addFactory { ToggleLanguage(get()) }
addFactory { ToggleSource(get()) } addFactory { ToggleSource(get()) }
addFactory { ToggleSourcePin(get()) } addFactory { ToggleSourcePin(get()) }
addFactory { TrustExtension(get()) }
addFactory { CreateSourceRepo(get()) } addFactory { CreateSourceRepo(get()) }
addFactory { DeleteSourceRepo(get()) } addFactory { DeleteSourceRepo(get()) }

View File

@ -0,0 +1,27 @@
package eu.kanade.domain.source.interactor
import android.content.pm.PackageInfo
import androidx.core.content.pm.PackageInfoCompat
import eu.kanade.domain.source.service.SourcePreferences
import tachiyomi.core.preference.getAndSet
class TrustExtension(
private val preferences: SourcePreferences,
) {
fun isTrusted(pkgInfo: PackageInfo, signatureHash: String): Boolean {
val key = "${pkgInfo.packageName}:${PackageInfoCompat.getLongVersionCode(pkgInfo)}:$signatureHash"
return key in preferences.trustedExtensions().get()
}
fun trust(pkgName: String, versionCode: Long, signatureHash: String) {
preferences.trustedExtensions().getAndSet { exts ->
// Remove previously trusted versions
val removed = exts.filter { it.startsWith("$pkgName:") }.toMutableSet()
removed.also {
it += "$pkgName:$versionCode:$signatureHash"
}
}
}
}

View File

@ -38,11 +38,14 @@ class SourcePreferences(
SetMigrateSorting.Direction.ASCENDING, SetMigrateSorting.Direction.ASCENDING,
) )
fun hideInLibraryItems() = preferenceStore.getBoolean("browse_hide_in_library_items", false)
fun extensionRepos() = preferenceStore.getStringSet("extension_repos", emptySet()) fun extensionRepos() = preferenceStore.getStringSet("extension_repos", emptySet())
fun extensionUpdatesCount() = preferenceStore.getInt("ext_updates_count", 0) fun extensionUpdatesCount() = preferenceStore.getInt("ext_updates_count", 0)
fun trustedSignatures() = preferenceStore.getStringSet(Preference.appStateKey("trusted_signatures"), emptySet()) fun trustedExtensions() = preferenceStore.getStringSet(
Preference.appStateKey("trusted_extensions"),
fun hideInLibraryItems() = preferenceStore.getBoolean("browse_hide_in_library_items", false) emptySet(),
)
} }

View File

@ -133,13 +133,13 @@ private fun ExtensionContent(
) { ) {
val context = LocalContext.current val context = LocalContext.current
var trustState by remember { mutableStateOf<Extension.Untrusted?>(null) } var trustState by remember { mutableStateOf<Extension.Untrusted?>(null) }
val installGranted = rememberRequestPackageInstallsPermissionState() val installGranted = rememberRequestPackageInstallsPermissionState(initialValue = true)
FastScrollLazyColumn( FastScrollLazyColumn(
contentPadding = contentPadding + topSmallPaddingValues, contentPadding = contentPadding + topSmallPaddingValues,
) { ) {
if (!installGranted && state.installer?.requiresSystemPermission == true) { if (!installGranted && state.installer?.requiresSystemPermission == true) {
item { item(key = "extension-permissions-warning") {
WarningBanner( WarningBanner(
textRes = MR.strings.ext_permission_install_apps_warning, textRes = MR.strings.ext_permission_install_apps_warning,
modifier = Modifier.clickable { modifier = Modifier.clickable {

View File

@ -16,16 +16,22 @@ import eu.kanade.tachiyomi.util.system.toast
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import tachiyomi.presentation.core.screens.LoadingScreen import tachiyomi.presentation.core.screens.LoadingScreen
class ExtensionReposScreen : Screen() { class ExtensionReposScreen(
private val url: String? = null,
) : Screen() {
@Composable @Composable
override fun Content() { override fun Content() {
val context = LocalContext.current val context = LocalContext.current
val navigator = LocalNavigator.currentOrThrow val navigator = LocalNavigator.currentOrThrow
val screenModel = rememberScreenModel { ExtensionReposScreenModel() }
val screenModel = rememberScreenModel { ExtensionReposScreenModel() }
val state by screenModel.state.collectAsState() val state by screenModel.state.collectAsState()
LaunchedEffect(url) {
url?.let { screenModel.createRepo(it) }
}
if (state is RepoScreenState.Loading) { if (state is RepoScreenState.Loading) {
LoadingScreen() LoadingScreen()
return return

View File

@ -14,11 +14,11 @@ import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
@Composable @Composable
fun rememberRequestPackageInstallsPermissionState(): Boolean { fun rememberRequestPackageInstallsPermissionState(initialValue: Boolean = false): Boolean {
val context = LocalContext.current val context = LocalContext.current
val lifecycleOwner = LocalLifecycleOwner.current val lifecycleOwner = LocalLifecycleOwner.current
var installGranted by remember { mutableStateOf(false) } var installGranted by remember { mutableStateOf(initialValue) }
DisposableEffect(lifecycleOwner.lifecycle) { DisposableEffect(lifecycleOwner.lifecycle) {
val observer = object : DefaultLifecycleObserver { val observer = object : DefaultLifecycleObserver {

View File

@ -374,13 +374,6 @@ object Migrations {
uiPreferences.relativeTime().set(false) uiPreferences.relativeTime().set(false)
} }
} }
if (oldVersion < 107) {
replacePreferences(
preferenceStore = preferenceStore,
filterPredicate = { it.key.startsWith("pref_mangasync_") || it.key.startsWith("track_token_") },
newKey = { Preference.privateKey(it) },
)
}
if (oldVersion < 113) { if (oldVersion < 113) {
val prefsToReplace = listOf( val prefsToReplace = listOf(
"pref_download_only", "pref_download_only",
@ -407,7 +400,19 @@ object Migrations {
} }
if (oldVersion < 114) { if (oldVersion < 114) {
sourcePreferences.extensionRepos().getAndSet { sourcePreferences.extensionRepos().getAndSet {
it.map { "https://raw.githubusercontent.com/$it/repo" }.toSet() it.map { repo -> "https://raw.githubusercontent.com/$repo/repo" }.toSet()
}
}
if (oldVersion < 116) {
replacePreferences(
preferenceStore = preferenceStore,
filterPredicate = { it.key.startsWith("pref_mangasync_") || it.key.startsWith("track_token_") },
newKey = { Preference.privateKey(it) },
)
}
if (oldVersion < 117) {
prefs.edit {
remove(Preference.appStateKey("trusted_signatures"))
} }
} }
return true return true

View File

@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.extension
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import eu.kanade.domain.source.interactor.TrustExtension
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.tachiyomi.extension.api.ExtensionApi import eu.kanade.tachiyomi.extension.api.ExtensionApi
import eu.kanade.tachiyomi.extension.api.ExtensionUpdateNotifier import eu.kanade.tachiyomi.extension.api.ExtensionUpdateNotifier
@ -18,7 +19,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.emptyFlow
import logcat.LogPriority import logcat.LogPriority
import tachiyomi.core.preference.plusAssign
import tachiyomi.core.util.lang.launchNow import tachiyomi.core.util.lang.launchNow
import tachiyomi.core.util.lang.withUIContext import tachiyomi.core.util.lang.withUIContext
import tachiyomi.core.util.system.logcat import tachiyomi.core.util.system.logcat
@ -34,13 +34,11 @@ import java.util.Locale
* To avoid malicious distribution, every extension must be signed and it will only be loaded if its * To avoid malicious distribution, every extension must be signed and it will only be loaded if its
* signature is trusted, otherwise the user will be prompted with a warning to trust it before being * signature is trusted, otherwise the user will be prompted with a warning to trust it before being
* loaded. * loaded.
*
* @param context The application context.
* @param preferences The application preferences.
*/ */
class ExtensionManager( class ExtensionManager(
private val context: Context, private val context: Context,
private val preferences: SourcePreferences = Injekt.get(), private val preferences: SourcePreferences = Injekt.get(),
private val trustExtension: TrustExtension = Injekt.get(),
) { ) {
var isInitialized = false var isInitialized = false
@ -249,18 +247,19 @@ class ExtensionManager(
} }
/** /**
* Adds the given signature to the list of trusted signatures. It also loads in background the * Adds the given extension to the list of trusted extensions. It also loads in background the
* extensions that match this signature. * now trusted extensions.
* *
* @param signature The signature to whitelist. * @param extension the extension to trust
*/ */
fun trustSignature(signature: String) { fun trust(extension: Extension.Untrusted) {
val untrustedSignatures = _untrustedExtensionsFlow.value.map { it.signatureHash }.toSet() val untrustedPkgNames = _untrustedExtensionsFlow.value.map { it.pkgName }.toSet()
if (signature !in untrustedSignatures) return if (extension.pkgName !in untrustedPkgNames) return
preferences.trustedSignatures() += signature trustExtension.trust(extension.pkgName, extension.versionCode, extension.signatureHash)
val nowTrustedExtensions = _untrustedExtensionsFlow.value.filter { it.signatureHash == signature } val nowTrustedExtensions = _untrustedExtensionsFlow.value
.filter { it.pkgName == extension.pkgName && it.versionCode == extension.versionCode }
_untrustedExtensionsFlow.value -= nowTrustedExtensions _untrustedExtensionsFlow.value -= nowTrustedExtensions
launchNow { launchNow {

View File

@ -7,6 +7,7 @@ import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import dalvik.system.PathClassLoader import dalvik.system.PathClassLoader
import eu.kanade.domain.source.interactor.TrustExtension
import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.source.service.SourcePreferences
import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.Extension
import eu.kanade.tachiyomi.extension.model.LoadResult import eu.kanade.tachiyomi.extension.model.LoadResult
@ -15,7 +16,6 @@ import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceFactory import eu.kanade.tachiyomi.source.SourceFactory
import eu.kanade.tachiyomi.util.lang.Hash import eu.kanade.tachiyomi.util.lang.Hash
import eu.kanade.tachiyomi.util.storage.copyAndSetReadOnlyTo import eu.kanade.tachiyomi.util.storage.copyAndSetReadOnlyTo
import eu.kanade.tachiyomi.util.system.isDevFlavor
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
@ -41,6 +41,7 @@ import java.io.File
internal object ExtensionLoader { internal object ExtensionLoader {
private val preferences: SourcePreferences by injectLazy() private val preferences: SourcePreferences by injectLazy()
private val trustExtension: TrustExtension by injectLazy()
private val loadNsfwSource by lazy { private val loadNsfwSource by lazy {
preferences.showNsfwSource().get() preferences.showNsfwSource().get()
} }
@ -49,8 +50,6 @@ internal object ExtensionLoader {
private const val METADATA_SOURCE_CLASS = "tachiyomi.extension.class" private const val METADATA_SOURCE_CLASS = "tachiyomi.extension.class"
private const val METADATA_SOURCE_FACTORY = "tachiyomi.extension.factory" private const val METADATA_SOURCE_FACTORY = "tachiyomi.extension.factory"
private const val METADATA_NSFW = "tachiyomi.extension.nsfw" private const val METADATA_NSFW = "tachiyomi.extension.nsfw"
private const val METADATA_HAS_README = "tachiyomi.extension.hasReadme"
private const val METADATA_HAS_CHANGELOG = "tachiyomi.extension.hasChangelog"
const val LIB_VERSION_MIN = 1.4 const val LIB_VERSION_MIN = 1.4
const val LIB_VERSION_MAX = 1.5 const val LIB_VERSION_MAX = 1.5
@ -119,12 +118,6 @@ internal object ExtensionLoader {
* @param context The application context. * @param context The application context.
*/ */
fun loadExtensions(context: Context): List<LoadResult> { fun loadExtensions(context: Context): List<LoadResult> {
// Always make users trust unknown extensions on cold starts in non-dev builds
// due to inherent security risks
if (!isDevFlavor) {
preferences.trustedSignatures().delete()
}
val pkgManager = context.packageManager val pkgManager = context.packageManager
val installedPkgs = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { val installedPkgs = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
@ -262,7 +255,7 @@ internal object ExtensionLoader {
if (signatures.isNullOrEmpty()) { if (signatures.isNullOrEmpty()) {
logcat(LogPriority.WARN) { "Package $pkgName isn't signed" } logcat(LogPriority.WARN) { "Package $pkgName isn't signed" }
return LoadResult.Error return LoadResult.Error
} else if (!hasTrustedSignature(signatures)) { } else if (!isTrusted(pkgInfo, signatures)) {
val extension = Extension.Untrusted( val extension = Extension.Untrusted(
extName, extName,
pkgName, pkgName,
@ -281,9 +274,6 @@ internal object ExtensionLoader {
return LoadResult.Error return LoadResult.Error
} }
val hasReadme = appInfo.metaData.getInt(METADATA_HAS_README, 0) == 1
val hasChangelog = appInfo.metaData.getInt(METADATA_HAS_CHANGELOG, 0) == 1
val classLoader = try { val classLoader = try {
PathClassLoader(appInfo.sourceDir, null, context.classLoader) PathClassLoader(appInfo.sourceDir, null, context.classLoader)
} catch (e: Exception) { } catch (e: Exception) {
@ -393,13 +383,12 @@ internal object ExtensionLoader {
?.toList() ?.toList()
} }
private fun hasTrustedSignature(signatures: List<String>): Boolean { private fun isTrusted(pkgInfo: PackageInfo, signatures: List<String>): Boolean {
if (officialSignature in signatures) { if (officialSignature in signatures) {
return true return true
} }
val trustedSignatures = preferences.trustedSignatures().get() return trustExtension.isTrusted(pkgInfo, signatures.last())
return trustedSignatures.any { signatures.contains(it) }
} }
private fun isOfficiallySigned(signatures: List<String>): Boolean { private fun isOfficiallySigned(signatures: List<String>): Boolean {

View File

@ -195,8 +195,8 @@ class ExtensionsScreenModel(
} }
} }
fun trustSignature(signatureHash: String) { fun trustExtension(extension: Extension.Untrusted) {
extensionManager.trustSignature(signatureHash) extensionManager.trust(extension)
} }
@Immutable @Immutable

View File

@ -61,7 +61,7 @@ fun extensionsTab(
}, },
onInstallExtension = extensionsScreenModel::installExtension, onInstallExtension = extensionsScreenModel::installExtension,
onOpenExtension = { navigator.push(ExtensionDetailsScreen(it.pkgName)) }, onOpenExtension = { navigator.push(ExtensionDetailsScreen(it.pkgName)) },
onTrustExtension = { extensionsScreenModel.trustSignature(it.signatureHash) }, onTrustExtension = { extensionsScreenModel.trustExtension(it) },
onUninstallExtension = { extensionsScreenModel.uninstallExtension(it) }, onUninstallExtension = { extensionsScreenModel.uninstallExtension(it) },
onUpdateExtension = extensionsScreenModel::updateExtension, onUpdateExtension = extensionsScreenModel::updateExtension,
onRefresh = extensionsScreenModel::findAvailableExtensions, onRefresh = extensionsScreenModel::findAvailableExtensions,

View File

@ -56,6 +56,7 @@ import eu.kanade.presentation.components.AppStateBanners
import eu.kanade.presentation.components.DownloadedOnlyBannerBackgroundColor import eu.kanade.presentation.components.DownloadedOnlyBannerBackgroundColor
import eu.kanade.presentation.components.IncognitoModeBannerBackgroundColor import eu.kanade.presentation.components.IncognitoModeBannerBackgroundColor
import eu.kanade.presentation.components.IndexingBannerBackgroundColor import eu.kanade.presentation.components.IndexingBannerBackgroundColor
import eu.kanade.presentation.more.settings.screen.browse.ExtensionReposScreen
import eu.kanade.presentation.more.settings.screen.data.RestoreBackupScreen import eu.kanade.presentation.more.settings.screen.data.RestoreBackupScreen
import eu.kanade.presentation.util.AssistContentScreen import eu.kanade.presentation.util.AssistContentScreen
import eu.kanade.presentation.util.DefaultNavigatorScreenTransition import eu.kanade.presentation.util.DefaultNavigatorScreenTransition
@ -446,10 +447,18 @@ class MainActivity : BaseActivity() {
null null
} }
Intent.ACTION_VIEW -> { Intent.ACTION_VIEW -> {
// Handling opening of backup files
if (intent.data.toString().endsWith(".tachibk")) { if (intent.data.toString().endsWith(".tachibk")) {
navigator.popUntilRoot() navigator.popUntilRoot()
navigator.push(RestoreBackupScreen(intent.data.toString())) navigator.push(RestoreBackupScreen(intent.data.toString()))
} }
// Deep link to add extension repo
else if (intent.scheme == "tachiyomi" && intent.data?.host == "add-repo") {
intent.data?.getQueryParameter("url")?.let { repoUrl ->
navigator.popUntilRoot()
navigator.push(ExtensionReposScreen(repoUrl))
}
}
null null
} }
else -> return false else -> return false

View File

@ -9,7 +9,7 @@
<string name="label_backup">Copia de seguridad y restauración</string> <string name="label_backup">Copia de seguridad y restauración</string>
<string name="action_settings">Ajustes</string> <string name="action_settings">Ajustes</string>
<string name="action_filter">Filtrar</string> <string name="action_filter">Filtrar</string>
<string name="action_filter_unread">Sin leer</string> <string name="action_filter_unread">Con capítulos sin leer</string>
<string name="action_filter_empty">Quitar filtro</string> <string name="action_filter_empty">Quitar filtro</string>
<string name="action_search">Buscar</string> <string name="action_search">Buscar</string>
<string name="action_select_all">Seleccionar todo</string> <string name="action_select_all">Seleccionar todo</string>
@ -54,7 +54,7 @@
<string name="update_48hour">Cada 2 días</string> <string name="update_48hour">Cada 2 días</string>
<string name="pref_library_update_restriction">Restricciones de actualización automática del dispositivo</string> <string name="pref_library_update_restriction">Restricciones de actualización automática del dispositivo</string>
<string name="charging">Mientras se carga la batería</string> <string name="charging">Mientras se carga la batería</string>
<string name="pref_update_only_non_completed">Omitir entradas marcadas como \"Completado\"</string> <string name="pref_update_only_non_completed">Saltarse títulos cuya publicación haya concluido</string>
<string name="pref_auto_update_manga_sync">Actualizar progreso al terminar un capítulo</string> <string name="pref_auto_update_manga_sync">Actualizar progreso al terminar un capítulo</string>
<string name="pref_fullscreen">Pantalla completa</string> <string name="pref_fullscreen">Pantalla completa</string>
<string name="pref_page_transitions">Transiciones de página animadas</string> <string name="pref_page_transitions">Transiciones de página animadas</string>
@ -98,8 +98,8 @@
<string name="cookies_cleared">Cookies borradas</string> <string name="cookies_cleared">Cookies borradas</string>
<string name="pref_clear_database">Borrar la base de datos</string> <string name="pref_clear_database">Borrar la base de datos</string>
<string name="pref_clear_database_summary">Borrar el historial de los elementos que no estén guardados en tu biblioteca</string> <string name="pref_clear_database_summary">Borrar el historial de los elementos que no estén guardados en tu biblioteca</string>
<string name="clear_database_confirmation">¿Está seguro\? Se perderán los capítulos leídos y el progreso de las entradas que no pertenezcan a la biblioteca</string> <string name="clear_database_confirmation">¿Seguro? Perderás los capítulos leídos y el progreso de los títulos que no pertenezcan a la biblioteca</string>
<string name="clear_database_completed">Entradas eliminadas</string> <string name="clear_database_completed">Elementos borrados</string>
<string name="version">Versión</string> <string name="version">Versión</string>
<string name="pref_enable_acra">Enviar informes de fallos</string> <string name="pref_enable_acra">Enviar informes de fallos</string>
<string name="pref_acra_summary">Ayuda a corregir cualquier error. No se enviará ninguna información personal</string> <string name="pref_acra_summary">Ayuda a corregir cualquier error. No se enviará ninguna información personal</string>
@ -126,7 +126,7 @@
<string name="download_unread">Sin leer</string> <string name="download_unread">Sin leer</string>
<string name="confirm_delete_chapters">¿Seguro que quieres eliminar los capítulos seleccionados\?</string> <string name="confirm_delete_chapters">¿Seguro que quieres eliminar los capítulos seleccionados\?</string>
<string name="reading">Leyendo</string> <string name="reading">Leyendo</string>
<string name="completed">Completado</string> <string name="completed">Concluido</string>
<string name="dropped">Abandonado</string> <string name="dropped">Abandonado</string>
<string name="on_hold">En espera</string> <string name="on_hold">En espera</string>
<string name="plan_to_read">Para leer luego</string> <string name="plan_to_read">Para leer luego</string>
@ -141,7 +141,7 @@
<string name="decode_image_error">No se pudo cargar la imagen</string> <string name="decode_image_error">No se pudo cargar la imagen</string>
<string name="download_queue_error">No se pudieron descargar los capítulos. Puedes volver a intentarlo en la sección de descargas</string> <string name="download_queue_error">No se pudieron descargar los capítulos. Puedes volver a intentarlo en la sección de descargas</string>
<string name="notification_new_chapters">Nuevos capítulos encontrados</string> <string name="notification_new_chapters">Nuevos capítulos encontrados</string>
<string name="notification_first_add_to_library">Primero tienes que añadir el manga a tu biblioteca</string> <string name="notification_first_add_to_library">Primero tienes que añadir el título a tu biblioteca</string>
<string name="file_select_cover">Elige una imagen de portada</string> <string name="file_select_cover">Elige una imagen de portada</string>
<string name="file_select_backup">Elige una copia de respaldo</string> <string name="file_select_backup">Elige una copia de respaldo</string>
<string name="update_check_confirm">Descargar</string> <string name="update_check_confirm">Descargar</string>
@ -158,7 +158,7 @@
<string name="download_notifier_unknown_error">No se ha podido descargar el capítulo debido a un error inesperado</string> <string name="download_notifier_unknown_error">No se ha podido descargar el capítulo debido a un error inesperado</string>
<string name="download_notifier_text_only_wifi">No estás conectado a ninguna red Wi-Fi</string> <string name="download_notifier_text_only_wifi">No estás conectado a ninguna red Wi-Fi</string>
<string name="categories">Categorías</string> <string name="categories">Categorías</string>
<string name="manga">Entradas en la biblioteca</string> <string name="manga">Títulos en la biblioteca</string>
<string name="track">Seguimiento</string> <string name="track">Seguimiento</string>
<string name="history">Historial</string> <string name="history">Historial</string>
<string name="action_filter_bookmarked">Favoritos</string> <string name="action_filter_bookmarked">Favoritos</string>
@ -211,7 +211,7 @@
<string name="creating_backup">Creando copia de seguridad</string> <string name="creating_backup">Creando copia de seguridad</string>
<string name="no_more_results">No hay más resultados</string> <string name="no_more_results">No hay más resultados</string>
<string name="local_source">Fuente local</string> <string name="local_source">Fuente local</string>
<string name="delete_downloads_for_manga">¿Eliminar los capítulos descargados\?</string> <string name="delete_downloads_for_manga">¿Quieres borrar los capítulos descargados?</string>
<string name="chapter_paused">Pausado</string> <string name="chapter_paused">Pausado</string>
<string name="manga_tracking_tab">Seguimiento</string> <string name="manga_tracking_tab">Seguimiento</string>
<string name="error_category_exists">¡Ya existe una categoría con este nombre!</string> <string name="error_category_exists">¡Ya existe una categoría con este nombre!</string>
@ -240,7 +240,7 @@
<string name="ext_downloading">Descargando</string> <string name="ext_downloading">Descargando</string>
<string name="ext_installing">Instalando</string> <string name="ext_installing">Instalando</string>
<string name="ext_installed">Instalado</string> <string name="ext_installed">Instalado</string>
<string name="ext_trust">Confiable</string> <string name="ext_trust">Confiar</string>
<string name="ext_untrusted">No confiable</string> <string name="ext_untrusted">No confiable</string>
<string name="ext_uninstall">Desinstalar</string> <string name="ext_uninstall">Desinstalar</string>
<string name="untrusted_extension">Extensión no confiable</string> <string name="untrusted_extension">Extensión no confiable</string>
@ -252,11 +252,11 @@
<string name="transition_no_previous">No hay ningún capítulo anterior</string> <string name="transition_no_previous">No hay ningún capítulo anterior</string>
<string name="migrate">Migrar</string> <string name="migrate">Migrar</string>
<string name="copy">Copiar</string> <string name="copy">Copiar</string>
<string name="untrusted_extension_message">Esta extensión fue firmada por un autor desconocido y no fue cargada. <string name="untrusted_extension_message">Esta extensión tiene una firma de un autor desconocido y no se ha podido cargar.
\n \n
\nLas extensiones maliciosas pueden leer cualquier credencial de inicio de sesión almacenada o ejecutar código arbitrario. \nUna extensión maliciosa puede leer credenciales de inicio guardadas o ejecutar cualquier tipo de código en tu dispositivo.
\n \n
\nAl confiar en el certificado de esta extensión, aceptas estos riesgos.</string> \nAl confiar en este certificado aceptas estos riesgos.</string>
<string name="double_tap_anim_speed_0">Sin animación</string> <string name="double_tap_anim_speed_0">Sin animación</string>
<string name="manga_added_library">Añadido a biblioteca</string> <string name="manga_added_library">Añadido a biblioteca</string>
<string name="manga_removed_library">Quitado de biblioteca</string> <string name="manga_removed_library">Quitado de biblioteca</string>
@ -302,9 +302,9 @@
<string name="action_sort_latest_chapter">Por capítulo más reciente</string> <string name="action_sort_latest_chapter">Por capítulo más reciente</string>
<string name="action_view_chapters">Ver capítulos</string> <string name="action_view_chapters">Ver capítulos</string>
<string name="action_cancel_all">Cancelar todo</string> <string name="action_cancel_all">Cancelar todo</string>
<string name="theme_light">Colores claros</string> <string name="theme_light">Claros</string>
<string name="theme_dark">Colores oscuros</string> <string name="theme_dark">Oscuros</string>
<string name="theme_system">Colores del sistema</string> <string name="theme_system">Del sistema</string>
<string name="pref_manage_notifications">Gestionar notificaciones</string> <string name="pref_manage_notifications">Gestionar notificaciones</string>
<string name="pref_category_security">Seguridad y privacidad</string> <string name="pref_category_security">Seguridad y privacidad</string>
<string name="lock_with_biometrics">Desbloqueo biométrico</string> <string name="lock_with_biometrics">Desbloqueo biométrico</string>
@ -376,7 +376,7 @@
<string name="label_data">Datos</string> <string name="label_data">Datos</string>
<string name="backup_restore_missing_sources">Fuentes que faltan:</string> <string name="backup_restore_missing_sources">Fuentes que faltan:</string>
<string name="invalid_backup_file_missing_manga">La copia de seguridad no contiene ningun elemento; la biblioteca está vacía.</string> <string name="invalid_backup_file_missing_manga">La copia de seguridad no contiene ningun elemento; la biblioteca está vacía.</string>
<string name="invalid_backup_file">El archivo de copia de seguridad es inválido:</string> <string name="invalid_backup_file">El archivo de copia de seguridad no parece estar bien:</string>
<string name="pref_library_update_refresh_metadata_summary">Comprueba si hay una nueva portada, información y descripción al actualizar la biblioteca</string> <string name="pref_library_update_refresh_metadata_summary">Comprueba si hay una nueva portada, información y descripción al actualizar la biblioteca</string>
<string name="pref_library_update_refresh_metadata">Actualizar automáticamente los metadatos</string> <string name="pref_library_update_refresh_metadata">Actualizar automáticamente los metadatos</string>
<string name="action_display_comfortable_grid">Cuadrícula amplia</string> <string name="action_display_comfortable_grid">Cuadrícula amplia</string>
@ -405,7 +405,7 @@
<string name="download_insufficient_space">No se pudo descargar ningún capítulo, queda muy poco espacio</string> <string name="download_insufficient_space">No se pudo descargar ningún capítulo, queda muy poco espacio</string>
<string name="action_global_search_query">Buscar por «%1$s» en todas las fuentes</string> <string name="action_global_search_query">Buscar por «%1$s» en todas las fuentes</string>
<string name="pref_category_reading_mode">Modo de lectura</string> <string name="pref_category_reading_mode">Modo de lectura</string>
<string name="pref_category_theme">Tema de colores</string> <string name="pref_category_theme">Esquema de colores</string>
<string name="action_sort_date_added">Por fecha en la biblioteca</string> <string name="action_sort_date_added">Por fecha en la biblioteca</string>
<string name="no_pinned_sources">Todavía no has anclado ninguna fuente</string> <string name="no_pinned_sources">Todavía no has anclado ninguna fuente</string>
<string name="channel_complete">Terminadas</string> <string name="channel_complete">Terminadas</string>
@ -554,22 +554,22 @@
<string name="channel_app_updates">Actualizaciones de la aplicación</string> <string name="channel_app_updates">Actualizaciones de la aplicación</string>
<string name="pref_auto_clear_chapter_cache">Limpiar la caché de capítulos al abrir la aplicación</string> <string name="pref_auto_clear_chapter_cache">Limpiar la caché de capítulos al abrir la aplicación</string>
<string name="database_clean">Base de datos limpia</string> <string name="database_clean">Base de datos limpia</string>
<string name="clear_database_source_item_count">%1$d entradas que no pertenecen a la biblioteca en la base de datos</string> <string name="clear_database_source_item_count">%1$d títulos que no pertenecen a la biblioteca en la base de datos</string>
<string name="extension_api_error">No se pudo descargar el listado de extensiones</string> <string name="extension_api_error">No se pudo descargar el listado de extensiones</string>
<string name="privacy_policy">Política de privacidad</string> <string name="privacy_policy">Política de privacidad</string>
<string name="pref_update_only_completely_read">Omitir entradas con capítulos no leídos</string> <string name="pref_update_only_completely_read">Saltarse títulos con capítulos por leer</string>
<string name="library_errors_help">Si necesitas ayuda para resolver los errores de actualización de la biblioteca mira en %1$s</string> <string name="library_errors_help">Si necesitas ayuda para resolver los errores de actualización de la biblioteca mira en %1$s</string>
<string name="save_chapter_as_cbz">Guardar como archivo CBZ</string> <string name="save_chapter_as_cbz">Guardar como archivo CBZ</string>
<string name="on_hiatus">En pausa</string> <string name="on_hiatus">En pausa</string>
<string name="publishing_finished">Serie terminada</string> <string name="publishing_finished">Publicación finalizada</string>
<string name="cancelled">Cancelada</string> <string name="cancelled">Cancelada</string>
<string name="action_show_manga">Mostrar el elemento</string> <string name="action_show_manga">Mostrar el elemento</string>
<string name="pref_navigate_pan">Desplazarse por el resto de la página antes de cambiar</string> <string name="pref_navigate_pan">Desplazarse por el resto de la página antes de cambiar</string>
<string name="action_display_cover_only_grid">Cuadrícula sólo de portadas</string> <string name="action_display_cover_only_grid">Cuadrícula sólo de portadas</string>
<string name="pref_landscape_zoom">Acercar la vista en horizontal</string> <string name="pref_landscape_zoom">Acercar la vista en horizontal</string>
<string name="pref_update_only_started">Omitir entradas sin lectura iniciada</string> <string name="pref_update_only_started">Saltarse títulos sin empezar</string>
<string name="skipped_reason_completed">Omitido, ya que su publicación ha terminado</string> <string name="skipped_reason_completed">Omitido, ya que su publicación ha terminado</string>
<string name="skipped_reason_not_caught_up">Omitido porque hay capítulos sin leer</string> <string name="skipped_reason_not_caught_up">Omitido porque todavía hay capítulos sin leer</string>
<string name="skipped_reason_not_started">Omitido porque no hay capítulos leídos</string> <string name="skipped_reason_not_started">Omitido porque no hay capítulos leídos</string>
<string name="learn_more">Ver más detalles</string> <string name="learn_more">Ver más detalles</string>
<string name="notification_update_error">Actualizaciones fallidas: %1$d</string> <string name="notification_update_error">Actualizaciones fallidas: %1$d</string>
@ -600,7 +600,7 @@
<string name="ext_info_age_rating">Clasificación por edades</string> <string name="ext_info_age_rating">Clasificación por edades</string>
<string name="reading_list">Leyendo</string> <string name="reading_list">Leyendo</string>
<string name="wish_list">A leer en un futuro</string> <string name="wish_list">A leer en un futuro</string>
<string name="complete_list">Manga terminado</string> <string name="complete_list">Leídos del todo</string>
<string name="on_hold_list">En pausa</string> <string name="on_hold_list">En pausa</string>
<string name="unfinished_list">Sin terminar</string> <string name="unfinished_list">Sin terminar</string>
<string name="network_not_metered">Solo en conexiones no medidas</string> <string name="network_not_metered">Solo en conexiones no medidas</string>
@ -613,15 +613,15 @@
<string name="delete_category">Borrar categoría</string> <string name="delete_category">Borrar categoría</string>
<string name="delete_category_confirmation">¿Quieres borrar la categoría «%s»\?</string> <string name="delete_category_confirmation">¿Quieres borrar la categoría «%s»\?</string>
<string name="internal_error">ErrorInterno: Mira el registro de depuración para más información</string> <string name="internal_error">ErrorInterno: Mira el registro de depuración para más información</string>
<string name="pref_user_agent_string">User agent predeterminado</string> <string name="pref_user_agent_string">Identificarse como otro navegador web («user agent»)</string>
<string name="pref_reset_user_agent_string">Restablecer user agent predeterminado</string> <string name="pref_reset_user_agent_string">Volver a la identificación de navegador («user agent») original</string>
<string name="action_remove_everything">Quitar todo</string> <string name="action_remove_everything">Quitar todo</string>
<string name="loader_rar5_error">La app no soporta el formato RARv5</string> <string name="loader_rar5_error">La app no soporta el formato RARv5</string>
<string name="appwidget_updates_description">Aquí aparecerá el contenido más reciente de tu biblioteca</string> <string name="appwidget_updates_description">Aquí aparecerá el contenido más reciente de tu biblioteca</string>
<string name="appwidget_unavailable_locked">El widget no está disponible cuando el bloqueo de aplicación está activo</string> <string name="appwidget_unavailable_locked">El widget no está disponible cuando el bloqueo de aplicación está activo</string>
<string name="update_already_running">Ya se está actualizando</string> <string name="update_already_running">Ya se está actualizando</string>
<string name="theme_tidalwave">Marea</string> <string name="theme_tidalwave">Marea</string>
<string name="error_user_agent_string_blank">El valor del user agent no puede estar en blanco</string> <string name="error_user_agent_string_blank">La cadena con el agente de usuario («user agent») no puede estar vacía</string>
<string name="download_ahead_info">Solo funciona si el capítulo actual y el que va después ya están descargados.</string> <string name="download_ahead_info">Solo funciona si el capítulo actual y el que va después ya están descargados.</string>
<string name="download_ahead">Descargar por adelantado</string> <string name="download_ahead">Descargar por adelantado</string>
<string name="auto_download_while_reading">Descarga los capítulos siguientes mientras lees</string> <string name="auto_download_while_reading">Descarga los capítulos siguientes mientras lees</string>
@ -648,7 +648,7 @@
<string name="unknown_title">Título desconocido</string> <string name="unknown_title">Título desconocido</string>
<string name="invalid_location">Ubicación incorrecta: %s</string> <string name="invalid_location">Ubicación incorrecta: %s</string>
<string name="updates_last_update_info_just_now">Ahora mismo</string> <string name="updates_last_update_info_just_now">Ahora mismo</string>
<string name="error_user_agent_string_invalid">Valor de user agent inválido</string> <string name="error_user_agent_string_invalid">La cadena con el agente de usuario («user agent») no parece ser correcta</string>
<string name="download_notifier_cache_renewal">Reindexando descargas</string> <string name="download_notifier_cache_renewal">Reindexando descargas</string>
<string name="action_open_random_manga">Abrir un elemento al azar</string> <string name="action_open_random_manga">Abrir un elemento al azar</string>
<string name="information_no_entries_found">Parece que esta categoría está vacía</string> <string name="information_no_entries_found">Parece que esta categoría está vacía</string>
@ -662,7 +662,7 @@
<string name="pref_invalidate_download_cache_summary">Forzar a la aplicación a volver a comprobar los capítulos descargados</string> <string name="pref_invalidate_download_cache_summary">Forzar a la aplicación a volver a comprobar los capítulos descargados</string>
<string name="label_started">Empezados</string> <string name="label_started">Empezados</string>
<string name="label_local">En el dispositivo</string> <string name="label_local">En el dispositivo</string>
<string name="label_completed_titles">Manga completado</string> <string name="label_completed_titles">Leídos del todo</string>
<string name="label_read_duration">Tiempo de lectura</string> <string name="label_read_duration">Tiempo de lectura</string>
<string name="label_read_chapters">Leídos</string> <string name="label_read_chapters">Leídos</string>
<string name="label_tracker_section">Con seguimiento</string> <string name="label_tracker_section">Con seguimiento</string>
@ -674,15 +674,15 @@
<string name="minute_short">%dm</string> <string name="minute_short">%dm</string>
<string name="label_used">En uso</string> <string name="label_used">En uso</string>
<string name="not_applicable">No disponible</string> <string name="not_applicable">No disponible</string>
<string name="label_tracked_titles">Manga en servicios de seguimiento</string> <string name="label_tracked_titles">En servicios de seguimiento</string>
<string name="label_downloaded">Descargados</string> <string name="label_downloaded">Descargados</string>
<string name="label_stats">Estadísticas</string> <string name="label_stats">Estadísticas</string>
<string name="label_overview_section">Resumen</string> <string name="label_overview_section">Resumen</string>
<string name="label_titles_section">Manga</string> <string name="label_titles_section">Títulos</string>
<string name="seconds_short">%ds</string> <string name="seconds_short">%ds</string>
<string name="action_not_now">Ahora no</string> <string name="action_not_now">Ahora no</string>
<string name="information_no_manga_category">La categoría está vacía</string> <string name="information_no_manga_category">La categoría está vacía</string>
<string name="pref_library_update_show_tab_badge">Mostrar el número de capítulos por leer en el icono de actualizaciones</string> <string name="pref_library_update_show_tab_badge">Ver número de capítulos por leer en el icono de actualizaciones</string>
<string name="copied_to_clipboard_plain">Se ha copiado al portapapeles</string> <string name="copied_to_clipboard_plain">Se ha copiado al portapapeles</string>
<string name="pref_skip_dupe_chapters">Saltarse los capítulos repetidos</string> <string name="pref_skip_dupe_chapters">Saltarse los capítulos repetidos</string>
<string name="enhanced_services_not_installed">Está disponible, pero la fuente todavía no se ha instalado: %s</string> <string name="enhanced_services_not_installed">Está disponible, pero la fuente todavía no se ha instalado: %s</string>
@ -698,7 +698,7 @@
<string name="overlay_header">Superposición</string> <string name="overlay_header">Superposición</string>
<string name="pref_page_rotate">Girar las páginas anchas para adaptarlas a la pantalla</string> <string name="pref_page_rotate">Girar las páginas anchas para adaptarlas a la pantalla</string>
<string name="pref_page_rotate_invert">Girar las páginas anchas en la dirección opuesta</string> <string name="pref_page_rotate_invert">Girar las páginas anchas en la dirección opuesta</string>
<string name="pref_debug_info">Información sobre la depuración</string> <string name="pref_debug_info">Información de depuración</string>
<string name="pref_chapter_swipe">Deslizamiento de dedo en capítulos</string> <string name="pref_chapter_swipe">Deslizamiento de dedo en capítulos</string>
<string name="pref_chapter_swipe_start">Deslizar a la izquierda</string> <string name="pref_chapter_swipe_start">Deslizar a la izquierda</string>
<string name="pref_chapter_swipe_end">Deslizar a la derecha</string> <string name="pref_chapter_swipe_end">Deslizar a la derecha</string>
@ -706,7 +706,7 @@
<string name="pref_library_columns_per_row">%d por fila</string> <string name="pref_library_columns_per_row">%d por fila</string>
<string name="action_filter_interval_late">Tras 10 o más días</string> <string name="action_filter_interval_late">Tras 10 o más días</string>
<string name="action_sort_next_updated">Próxima actualización prevista</string> <string name="action_sort_next_updated">Próxima actualización prevista</string>
<string name="pref_update_only_in_release_period">Prever la fecha del próximo lanzamiento</string> <string name="pref_update_only_in_release_period">Intentar predecir cuándo sale el siguiente número</string>
<string name="intervals_header">Intervalos</string> <string name="intervals_header">Intervalos</string>
<string name="action_filter_interval_passed">Ha pasado el período de comprobación</string> <string name="action_filter_interval_passed">Ha pasado el período de comprobación</string>
<string name="manga_display_interval_title">Estimar cada</string> <string name="manga_display_interval_title">Estimar cada</string>
@ -770,15 +770,15 @@
<string name="onboarding_guides_returning_user">¿No es la primera vez que instalas %s?</string> <string name="onboarding_guides_returning_user">¿No es la primera vez que instalas %s?</string>
<string name="onboarding_action_skip">Saltar</string> <string name="onboarding_action_skip">Saltar</string>
<string name="onboarding_action_next">Siguiente</string> <string name="onboarding_action_next">Siguiente</string>
<string name="onboarding_description">Lo primero de todo es poner las cosas a tu gusto. Siempre puedes volver a cambiarlas más tarde en los ajustes.</string> <string name="onboarding_description">Lo primero de todo es dejar las cosas a tu gusto. Siempre puedes volver a cambiarlas más tarde en los ajustes.</string>
<string name="no_location_set">Todavía no has proporcionado una ubicación de almacenamiento</string> <string name="no_location_set">Todavía no has proporcionado ninguna carpeta</string>
<string name="onboarding_storage_info">Selecciona una carpeta donde %1$s almacenará las descargas de capítulos, copias de seguridad y otras cosas. <string name="onboarding_storage_info">Selecciona una carpeta donde %1$s almacenará las descargas de capítulos, copias de seguridad y otras cosas.
\n \n
\nTe recomendamos que sea solo para %1$s. \nTe recomendamos que sea solo para %1$s.
\n \n
\nCarpeta seleccionada: %2$s</string> \nCarpeta seleccionada: %2$s</string>
<string name="onboarding_permission_install_apps">Permiso para instalar aplicaciones</string> <string name="onboarding_permission_install_apps">Permiso para instalar aplicaciones</string>
<string name="onboarding_permission_notifications">Permiso de notificación</string> <string name="onboarding_permission_notifications">Permiso para mostrar notificaciones</string>
<string name="onboarding_permission_ignore_battery_opts_description">Previene cortes y retrasos al procesar tareas en segundo plano que tarden un poco; como al buscar y descargar contenido nuevo, así como al restaurar copias de respaldo.</string> <string name="onboarding_permission_ignore_battery_opts_description">Previene cortes y retrasos al procesar tareas en segundo plano que tarden un poco; como al buscar y descargar contenido nuevo, así como al restaurar copias de respaldo.</string>
<string name="onboarding_permission_ignore_battery_opts">Uso de batería en segundo plano</string> <string name="onboarding_permission_ignore_battery_opts">Uso de batería en segundo plano</string>
<string name="onboarding_permission_install_apps_description">Para instalar extensiones que te permiten buscar y descargar contenido.</string> <string name="onboarding_permission_install_apps_description">Para instalar extensiones que te permiten buscar y descargar contenido.</string>
@ -787,19 +787,21 @@
<string name="available_disk_space_info">Disponible: %1$s / Total: %2$s</string> <string name="available_disk_space_info">Disponible: %1$s / Total: %2$s</string>
<string name="ext_permission_install_apps_warning">Toca aquí para conceder los permisos necesarios para instalar extensiones.</string> <string name="ext_permission_install_apps_warning">Toca aquí para conceder los permisos necesarios para instalar extensiones.</string>
<string name="private_settings">Incluir datos privados, como las claves de inicio de sesión en plataformas de seguimiento</string> <string name="private_settings">Incluir datos privados, como las claves de inicio de sesión en plataformas de seguimiento</string>
<string name="invalid_backup_file_error">Error completo:</string> <string name="invalid_backup_file_error">Descripción completa del problema:</string>
<string name="manga_interval_expected_update">Próxima actualización prevista en torno a %1$s, revisando cada %2$s</string> <string name="manga_interval_expected_update">Próxima actualización prevista en torno a %1$s, revisando cada %2$s</string>
<string name="repo_extension_message">Esta extensión proviene de un repositorio externo. Toca para ver el repositorio.</string> <string name="repo_extension_message">Esta extensión proviene de un repositorio externo. Toca para verlo.</string>
<string name="manga_interval_custom_amount">Frecuencia de actualización personalizada:</string> <string name="manga_interval_custom_amount">Frecuencia de actualización personalizada:</string>
<string name="error_repo_exists">¡Este repositorio ya existe!</string> <string name="error_repo_exists">El repositorio ya existe</string>
<string name="pref_library_update_smart_update">Actualización inteligente</string> <string name="pref_library_update_smart_update">Actualizaciones inteligentes</string>
<string name="invalid_repo_name">URL de repositorio inválida</string> <string name="invalid_repo_name">La dirección URL del repositorio no parece ser correcta</string>
<string name="action_add_repo_message">Agregar repositorios adicionales a Tachiyomi. La URL debe terminar con \"index.min.json\".</string> <string name="action_add_repo_message">Añade más repositorios a Tachiyomi; la dirección URL tiene que terminar en «index.min.json».</string>
<string name="delete_repo_confirmation">¿Deseas eliminar el repositorio \"%s\"?</string> <string name="delete_repo_confirmation">¿Seguro que quieres borrar el repositorio «%s»?</string>
<string name="action_delete_repo">Eliminar repositorio</string> <string name="action_delete_repo">Borrar repositorio</string>
<string name="manga_interval_header">Próxima actualización</string> <string name="manga_interval_header">Próxima actualización</string>
<string name="action_add_repo">Agregar repositorio</string> <string name="action_add_repo">Añadir un repositorio</string>
<string name="information_empty_repos">No tienes repositorios agregados.</string> <string name="information_empty_repos">Todavía no has añadido ningún repositorio.</string>
<string name="label_extension_repos">Repositorios de extensiones</string> <string name="label_extension_repos">Repositorios de extensiones</string>
<string name="label_add_repo_input">URL del repositorio</string> <string name="label_add_repo_input">Dirección URL del repositorio</string>
<string name="onboarding_storage_help_info">¿Acabas de actualizar desde una versión más antigua y no sabes qué hacer? Échale un vistazo a la guía de almacenamiento.</string>
<string name="onboarding_storage_help_action">Guía de almacenamiento</string>
</resources> </resources>

View File

@ -180,11 +180,11 @@
<string name="pref_fullscreen">Naka-fullscreen</string> <string name="pref_fullscreen">Naka-fullscreen</string>
<string name="unofficial_extension_message">Wala sa opisyal na listahan ang extension na ito.</string> <string name="unofficial_extension_message">Wala sa opisyal na listahan ang extension na ito.</string>
<string name="obsolete_extension_message">Hindi na available ang extension na ito. Maaaring hindi ito gumana nang maayos at maaaring magdulot ng mga isyu sa app. Inirerekomenda ang pag-uninstall nito.</string> <string name="obsolete_extension_message">Hindi na available ang extension na ito. Maaaring hindi ito gumana nang maayos at maaaring magdulot ng mga isyu sa app. Inirerekomenda ang pag-uninstall nito.</string>
<string name="untrusted_extension_message">Pinirmahan ang extension na ito gamit ang isang kaduda-dudang certificate at hindi muna pinagana. <string name="untrusted_extension_message">Ang extension na ito ay nilagdaan ng sinumang hindi kilalang author at hindi na-load.
\n \n
\nMaaaring mabasa ng isang kaduda-dudang extension ang kahit anong nakatagong credentials sa pag-login o di kaya nama\'y magsimula ng delikadong code. \nMaaaring basahin ng mga nakakahamak na extension ang anumang nakatagong kredensyal sa pag-log in o magsagawa ng arbitrary code.
\n \n
\nTinatanggap mo ang mga bantang ito sa pagtiwala sa certificate na ito.</string> \nSa pamamagitan ng pagtitiwala sa certificate ng extension na ito, tinatanggap mo ang mga panganib na ito.</string>
<string name="untrusted_extension">Di-pinagkakatiwalaang extension</string> <string name="untrusted_extension">Di-pinagkakatiwalaang extension</string>
<string name="ext_uninstall">I-uninstall</string> <string name="ext_uninstall">I-uninstall</string>
<string name="ext_trust">Tiwala</string> <string name="ext_trust">Tiwala</string>
@ -203,7 +203,7 @@
<string name="default_category">Default na kategorya</string> <string name="default_category">Default na kategorya</string>
<string name="pref_library_update_refresh_metadata_summary">Maghanap ng mga bagong cover at detalye kapag nag-a-update ng Aklatan</string> <string name="pref_library_update_refresh_metadata_summary">Maghanap ng mga bagong cover at detalye kapag nag-a-update ng Aklatan</string>
<string name="pref_library_update_refresh_metadata">Awtomatikong i-refresh ang metadata</string> <string name="pref_library_update_refresh_metadata">Awtomatikong i-refresh ang metadata</string>
<string name="pref_update_only_non_completed">May \"Kumpleto\" na estado</string> <string name="pref_update_only_non_completed">Laktawan ang mga entry na may katayuang \"Nakumpleto\"</string>
<string name="charging">Kapag naka-charge</string> <string name="charging">Kapag naka-charge</string>
<string name="pref_library_update_restriction">Awtomatikong ina-update ang mga paghihigpit sa device</string> <string name="pref_library_update_restriction">Awtomatikong ina-update ang mga paghihigpit sa device</string>
<string name="update_weekly">Linggo-linggo</string> <string name="update_weekly">Linggo-linggo</string>
@ -223,8 +223,8 @@
<string name="secure_screen">Bantayan ang screen</string> <string name="secure_screen">Bantayan ang screen</string>
<string name="pref_read_with_tapping_inverted">Baligtarin ang mga tap zone</string> <string name="pref_read_with_tapping_inverted">Baligtarin ang mga tap zone</string>
<string name="backup_restore_missing_sources">Nawawalang mga source:</string> <string name="backup_restore_missing_sources">Nawawalang mga source:</string>
<string name="invalid_backup_file_missing_manga">Hindi naglalaman ang backup ng kahit anong mga entry sa Aklatan.</string> <string name="invalid_backup_file_missing_manga">Hindi naglalaman ang backup ng kahit anong mga entry sa aklatan.</string>
<string name="invalid_backup_file">Invalid na backup</string> <string name="invalid_backup_file">Imbalidong backup file:</string>
<string name="backup_created">Nai-backup na</string> <string name="backup_created">Nai-backup na</string>
<string name="pref_backup_interval">Awtomatikong dalas ng pag-backup</string> <string name="pref_backup_interval">Awtomatikong dalas ng pag-backup</string>
<string name="pref_restore_backup_summ">I-restore ang Aklatan mula sa backup</string> <string name="pref_restore_backup_summ">I-restore ang Aklatan mula sa backup</string>
@ -389,7 +389,7 @@
<string name="pref_clear_database_summary">Burahin ang nakaraan ng mga entry na hindi naka-save sa aklatan mo</string> <string name="pref_clear_database_summary">Burahin ang nakaraan ng mga entry na hindi naka-save sa aklatan mo</string>
<string name="pref_clear_database">Linisin ang database</string> <string name="pref_clear_database">Linisin ang database</string>
<string name="cache_delete_error">Nagka-error habang nililinis</string> <string name="cache_delete_error">Nagka-error habang nililinis</string>
<string name="cache_deleted">Nalinis na ang cache. Binura ang %1$d (na) file</string> <string name="cache_deleted">Na-clear ang cache, na-delete ang %1$d na file</string>
<string name="used_cache">Nagamit: %1$s</string> <string name="used_cache">Nagamit: %1$s</string>
<string name="pref_clear_chapter_cache">Linisin ang cache ng kabanata</string> <string name="pref_clear_chapter_cache">Linisin ang cache ng kabanata</string>
<string name="label_data">Data</string> <string name="label_data">Data</string>
@ -457,9 +457,7 @@
<string name="action_display_show_number_of_items">Ipakita ang bilang ng mga item</string> <string name="action_display_show_number_of_items">Ipakita ang bilang ng mga item</string>
<string name="pref_dual_page_invert_summary">Kung sakaling hindi sumasakto sa direksyon ng pagbabasa ang paghahati sa malalapad na pahina</string> <string name="pref_dual_page_invert_summary">Kung sakaling hindi sumasakto sa direksyon ng pagbabasa ang paghahati sa malalapad na pahina</string>
<string name="pref_dual_page_invert">Baligtarin ang paghahati sa pahina</string> <string name="pref_dual_page_invert">Baligtarin ang paghahati sa pahina</string>
<string name="backup_restore_content_full">Ire-restore ang mga datos mula sa backup file. <string name="backup_restore_content_full">Kailangan mong i-install muli ang mga nawawalang extension at mag-login muli sa mga tracker pagkatapos para magamit ang mga ito.</string>
\n
\nKailangan mong i-install muli ang mga nawawalang extension at mag-login muli sa mga tracker pagkatapos para magamit ang mga ito.</string>
<string name="pref_dns_over_https">DNS kesa HTTPS (DoH)</string> <string name="pref_dns_over_https">DNS kesa HTTPS (DoH)</string>
<string name="pref_download_new_categories_details">Ang mga entry sa mga ibinukod na kategorya ay hindi mada-download kahit na sila ay kasama rin sa mga kategoryang kasama.</string> <string name="pref_download_new_categories_details">Ang mga entry sa mga ibinukod na kategorya ay hindi mada-download kahit na sila ay kasama rin sa mga kategoryang kasama.</string>
<string name="pref_category_auto_download">Kusang pag-download</string> <string name="pref_category_auto_download">Kusang pag-download</string>
@ -491,7 +489,7 @@
<string name="restrictions">Restriksyon: %s</string> <string name="restrictions">Restriksyon: %s</string>
<string name="error_no_match">Walang nahanap na kapares</string> <string name="error_no_match">Walang nahanap na kapares</string>
<string name="date">Petsa</string> <string name="date">Petsa</string>
<string name="local_invalid_format">Invalid na format ng kabanata</string> <string name="local_invalid_format">Imbalidong format ng kabanata</string>
<string name="chapter_not_found">Hindi makita ang kabanata</string> <string name="chapter_not_found">Hindi makita ang kabanata</string>
<string name="source_unsupported">Di suportado ang source</string> <string name="source_unsupported">Di suportado ang source</string>
<string name="unread">Di pa nabasa</string> <string name="unread">Di pa nabasa</string>
@ -560,7 +558,7 @@
<string name="extension_api_error">Bigong makuha ang listahan ng mga extension</string> <string name="extension_api_error">Bigong makuha ang listahan ng mga extension</string>
<string name="privacy_policy">Patakaran sa Pagkapribado</string> <string name="privacy_policy">Patakaran sa Pagkapribado</string>
<string name="library_errors_help">Para sa tulong sa pag-aayos ng mga error sa pag-update ng aklatan, tingnan ang %1$s</string> <string name="library_errors_help">Para sa tulong sa pag-aayos ng mga error sa pag-update ng aklatan, tingnan ang %1$s</string>
<string name="pref_update_only_completely_read">May di pa nababasang kabanata</string> <string name="pref_update_only_completely_read">Laktawan ang mga entry na hindi pa nababasang kabanata</string>
<string name="save_chapter_as_cbz">I-save bilang CBZ archive</string> <string name="save_chapter_as_cbz">I-save bilang CBZ archive</string>
<string name="publishing_finished">Tapos na\'ng mailathala</string> <string name="publishing_finished">Tapos na\'ng mailathala</string>
<string name="on_hiatus">Naka-hiatus</string> <string name="on_hiatus">Naka-hiatus</string>
@ -568,7 +566,7 @@
<string name="action_show_manga">Ipakita ang entry</string> <string name="action_show_manga">Ipakita ang entry</string>
<string name="action_display_cover_only_grid">Pabalat lang</string> <string name="action_display_cover_only_grid">Pabalat lang</string>
<string name="skipped_reason_completed">Nilaktawan dahil kumpleto na ang serye</string> <string name="skipped_reason_completed">Nilaktawan dahil kumpleto na ang serye</string>
<string name="pref_update_only_started">Hindi pa nasisimulan</string> <string name="pref_update_only_started">Laktawan ang hindi nasimulang mga entry</string>
<string name="skipped_reason_not_caught_up">Nilaktawan dahil may di pa nabasang mga kabanata</string> <string name="skipped_reason_not_caught_up">Nilaktawan dahil may di pa nabasang mga kabanata</string>
<string name="skipped_reason_not_started">Nilaktawan dahil wala pang nabasang mga kabanata</string> <string name="skipped_reason_not_started">Nilaktawan dahil wala pang nabasang mga kabanata</string>
<string name="pref_landscape_zoom">Awtomatikong mag-zoom sa mga malalawak na larawan</string> <string name="pref_landscape_zoom">Awtomatikong mag-zoom sa mga malalawak na larawan</string>
@ -649,7 +647,7 @@
<string name="crash_screen_restart_application">Buksan muli ang app</string> <string name="crash_screen_restart_application">Buksan muli ang app</string>
<string name="invalid_location">Invalid na lugar: %s</string> <string name="invalid_location">Invalid na lugar: %s</string>
<string name="unknown_title">Di alam na pamagat</string> <string name="unknown_title">Di alam na pamagat</string>
<string name="error_user_agent_string_invalid">Invalid na string ng user agent</string> <string name="error_user_agent_string_invalid">Di-wastong string ng user agent</string>
<string name="updates_last_update_info_just_now">Ngayon lang</string> <string name="updates_last_update_info_just_now">Ngayon lang</string>
<string name="download_notifier_cache_renewal">Tinitignan ang mga download</string> <string name="download_notifier_cache_renewal">Tinitignan ang mga download</string>
<string name="information_no_entries_found">Walang mga entry ang nahanap sa kategoryang ito</string> <string name="information_no_entries_found">Walang mga entry ang nahanap sa kategoryang ito</string>
@ -715,7 +713,7 @@
<string name="action_filter_interval_long">Kunin kada buwan (kada ika-28 na araw)</string> <string name="action_filter_interval_long">Kunin kada buwan (kada ika-28 na araw)</string>
<string name="manga_display_interval_title">Tantyahin bawat</string> <string name="manga_display_interval_title">Tantyahin bawat</string>
<string name="manga_display_modified_interval_title">Itakdang i-update bawat</string> <string name="manga_display_modified_interval_title">Itakdang i-update bawat</string>
<string name="pref_update_only_in_release_period">Sa labas ng inaasahang release period</string> <string name="pref_update_only_in_release_period">Hulaan ang susunod na oras ng release</string>
<string name="intervals_header">Mga pagitan</string> <string name="intervals_header">Mga pagitan</string>
<string name="skipped_reason_not_in_release_period">Nilaktawan dahil walang inaasahang release ngayong araw</string> <string name="skipped_reason_not_in_release_period">Nilaktawan dahil walang inaasahang release ngayong araw</string>
<string name="has_results">May mga resulta</string> <string name="has_results">May mga resulta</string>
@ -746,7 +744,7 @@
<string name="file_null_uri_error">Ang file picker ay nabigo na ibalik ang file sa app</string> <string name="file_null_uri_error">Ang file picker ay nabigo na ibalik ang file sa app</string>
<string name="label_data_storage">Data at storage</string> <string name="label_data_storage">Data at storage</string>
<string name="pref_flash_page_summ">Binabawasan ang ghosting sa mga e-ink na display</string> <string name="pref_flash_page_summ">Binabawasan ang ghosting sa mga e-ink na display</string>
<string name="pref_flash_page">Mag-flash ng puti kada pagbabago ng pahina</string> <string name="pref_flash_page">Mag-flash kada pumalit ng pahina</string>
<string name="relative_time_span_never">Hindi kailanman</string> <string name="relative_time_span_never">Hindi kailanman</string>
<string name="last_auto_backup_info">Huling awtomatikong na-back up: %s</string> <string name="last_auto_backup_info">Huling awtomatikong na-back up: %s</string>
<string name="pref_storage_usage">Paggamit ng storage</string> <string name="pref_storage_usage">Paggamit ng storage</string>
@ -769,7 +767,7 @@
<string name="onboarding_action_finish">Magsimula</string> <string name="onboarding_action_finish">Magsimula</string>
<string name="onboarding_storage_selection_required">Dapat pumili ng isang folder</string> <string name="onboarding_storage_selection_required">Dapat pumili ng isang folder</string>
<string name="onboarding_heading">Maligayang pagdating!</string> <string name="onboarding_heading">Maligayang pagdating!</string>
<string name="onboarding_guides_returning_user">Gumagamit ba ng %s dati?</string> <string name="onboarding_guides_returning_user">Muling pag-install ng %s?</string>
<string name="onboarding_action_skip">Laktawan</string> <string name="onboarding_action_skip">Laktawan</string>
<string name="onboarding_action_next">Susunod</string> <string name="onboarding_action_next">Susunod</string>
<string name="onboarding_description">Mag-set up muna tayo ng ilang bagay. Maaari mo ring baguhin ang mga ito anumang oras sa mga setting sa ibang pagkakataon.</string> <string name="onboarding_description">Mag-set up muna tayo ng ilang bagay. Maaari mo ring baguhin ang mga ito anumang oras sa mga setting sa ibang pagkakataon.</string>
@ -787,8 +785,23 @@
<string name="onboarding_permission_notifications_description">Maabisuhan para sa mga update sa aklatan at higit pa.</string> <string name="onboarding_permission_notifications_description">Maabisuhan para sa mga update sa aklatan at higit pa.</string>
<string name="onboarding_permission_action_grant">Payagan</string> <string name="onboarding_permission_action_grant">Payagan</string>
<string name="available_disk_space_info">Na magagamit: %1$s / Kabuuan: %2$s</string> <string name="available_disk_space_info">Na magagamit: %1$s / Kabuuan: %2$s</string>
<string name="manga_interval_expected_update">Inaasahan ang susunod na update sa humigit-kumulang %s</string> <string name="manga_interval_expected_update">Inaasahan ang susunod na update sa humigit-kumulang %1$s, na tumitingin sa bawat %2$s</string>
<string name="invalid_backup_file_error">Buong error:</string> <string name="invalid_backup_file_error">Buong error:</string>
<string name="ext_permission_install_apps_warning">Kinakailangan ng permiso para mag-install ng mga extension. I-tap upang mapayagan ito.</string> <string name="ext_permission_install_apps_warning">Kinakailangan ng permiso para mag-install ng mga extension. I-tap upang mapayagan ito.</string>
<string name="private_settings">Kasali ang mga sensitibong setting (hal., mga tracker login token)</string> <string name="private_settings">Kasali ang mga sensitibong setting (hal., mga tracker login token)</string>
<string name="onboarding_storage_help_info">Nag-a-update mula sa isang mas lumang bersyon at hindi sigurado kung ano ang pipiliin? Sumangguni sa gabay sa storage para sa higit pang impormasyon.</string>
<string name="pref_library_update_smart_update">Matalas na pag-update</string>
<string name="information_empty_repos">Wala kang na-set na repo.</string>
<string name="action_add_repo">Magdagdag ng repo</string>
<string name="label_extension_repos">Mga repo ng extension</string>
<string name="onboarding_storage_help_action">Gabay sa storage</string>
<string name="error_repo_exists">Umiiral na ang repo na ito!</string>
<string name="action_delete_repo">Tanggalin ang repo</string>
<string name="label_add_repo_input">URL ng repo</string>
<string name="action_add_repo_message">Magdagdag ng mga karagdagang repo sa Tachiyomi. Dapat ito ay isang URL na nagtatapos sa \"index.min.json\".</string>
<string name="repo_extension_message">Ang extension na ito ay nagmula sa isang external na repo. I-tap para tignan ang repo.</string>
<string name="invalid_repo_name">Di-wastong URL ng repo</string>
<string name="manga_interval_header">Susunod na update</string>
<string name="delete_repo_confirmation">Gusto mo bang tanggalin ang repo na \"%s\"?</string>
<string name="manga_interval_custom_amount">Ipasadya ang update frequency:</string>
</resources> </resources>

View File

@ -80,4 +80,9 @@
<item quantity="many">%d jours</item> <item quantity="many">%d jours</item>
<item quantity="other">%d jours</item> <item quantity="other">%d jours</item>
</plurals> </plurals>
<plurals name="num_repos">
<item quantity="one">%d dépôt</item>
<item quantity="many">%d dépôts</item>
<item quantity="other">%d dépôts</item>
</plurals>
</resources> </resources>

View File

@ -557,7 +557,7 @@
<string name="database_clean">Rien à effacer</string> <string name="database_clean">Rien à effacer</string>
<string name="extension_api_error">Échec de la récupération de la liste des extensions</string> <string name="extension_api_error">Échec de la récupération de la liste des extensions</string>
<string name="privacy_policy">Politique de confidentialité</string> <string name="privacy_policy">Politique de confidentialité</string>
<string name="pref_update_only_completely_read">Avec des chapitres non lus</string> <string name="pref_update_only_completely_read">Avec chapitre(s) non lu(s)</string>
<string name="save_chapter_as_cbz">Enregistrer comme archive CBZ</string> <string name="save_chapter_as_cbz">Enregistrer comme archive CBZ</string>
<string name="library_errors_help">Pour savoir comment corriger les erreurs de mise à jour de la bibliothèque, voir %1$s</string> <string name="library_errors_help">Pour savoir comment corriger les erreurs de mise à jour de la bibliothèque, voir %1$s</string>
<string name="on_hiatus">En pause</string> <string name="on_hiatus">En pause</string>
@ -709,7 +709,7 @@
<string name="action_filter_interval_dropped">Abandonné \? En retard de 20+ et 2 mois</string> <string name="action_filter_interval_dropped">Abandonné \? En retard de 20+ et 2 mois</string>
<string name="action_filter_interval_passed">Période de contrôle réussie</string> <string name="action_filter_interval_passed">Période de contrôle réussie</string>
<string name="action_sort_next_updated">Prochaine mise à jour prévue</string> <string name="action_sort_next_updated">Prochaine mise à jour prévue</string>
<string name="pref_update_only_in_release_period">Période de diffusion prévue</string> <string name="pref_update_only_in_release_period">Prochaine sortie prévue dans:</string>
<string name="action_set_interval">Définir l\'intervalle</string> <string name="action_set_interval">Définir l\'intervalle</string>
<string name="action_ok">Valider</string> <string name="action_ok">Valider</string>
<string name="action_filter_interval_custom">Intervalle de recherche personnalisé</string> <string name="action_filter_interval_custom">Intervalle de recherche personnalisé</string>
@ -758,4 +758,21 @@
<string name="ext_permission_install_apps_warning">Des permissions sont nécessaires pour installer des extensions. Appuyer ici pour les accorder.</string> <string name="ext_permission_install_apps_warning">Des permissions sont nécessaires pour installer des extensions. Appuyer ici pour les accorder.</string>
<string name="onboarding_permission_action_grant">Accorder</string> <string name="onboarding_permission_action_grant">Accorder</string>
<string name="pref_relative_format">Durées relatives</string> <string name="pref_relative_format">Durées relatives</string>
<string name="onboarding_permission_notifications">Permission de notifications</string>
<string name="onboarding_permission_ignore_battery_opts">Utilisation de la batterie en arrière-plan</string>
<string name="onboarding_permission_install_apps_description">Pour installer des extensions de source.</string>
<string name="onboarding_permission_ignore_battery_opts_description">Évite les interruptions des longues mises à jour de bibliothèque, téléchargements de chapitres et restaurations de sauvegardes.</string>
<string name="onboarding_permission_install_apps">Permission d\'installer des applications</string>
<string name="onboarding_storage_help_info">Mise à jour depuis une ancienne version et pas sûr de quoi choisir? Consultez le guide de stockage pour plus d\'informations.</string>
<string name="onboarding_storage_help_action">Guide de stockage</string>
<string name="onboarding_permission_notifications_description">Soyez notifié des mises à jour de la bibliothèque et autre.</string>
<string name="pref_library_update_smart_update">Mise à jour intelligente</string>
<string name="pref_onboarding_guide">Guide de démarrage</string>
<string name="onboarding_description">Commençons par paramétrer certaines choses. Vous pouvez toujours changer ces paramètres plus tard.</string>
<string name="onboarding_storage_info">Sélectionnez un dossier où %1$s stockera les chapitres téléchargés, les sauvegardes et plus encore.
\n
\nUn dossier dédié est recommandé.
\n
\nDossier sélectionné: %2$s</string>
<string name="onboarding_storage_action_select">Sélectionnez un dossier</string>
</resources> </resources>

View File

@ -48,4 +48,7 @@
<plurals name="day"> <plurals name="day">
<item quantity="other">%d hari</item> <item quantity="other">%d hari</item>
</plurals> </plurals>
<plurals name="num_repos">
<item quantity="other">%d repo</item>
</plurals>
</resources> </resources>

View File

@ -78,7 +78,7 @@
<string name="all">Semua</string> <string name="all">Semua</string>
<string name="pref_library_update_restriction">Pembatasan pembaruan otomatis</string> <string name="pref_library_update_restriction">Pembatasan pembaruan otomatis</string>
<string name="charging">Saat mengisi daya</string> <string name="charging">Saat mengisi daya</string>
<string name="pref_update_only_non_completed">Dengan status \"Selesai\"</string> <string name="pref_update_only_non_completed">Lewati daftar dengan status \"Selesai\"</string>
<string name="pref_auto_update_manga_sync">Perbarui kemajuan setelah membaca</string> <string name="pref_auto_update_manga_sync">Perbarui kemajuan setelah membaca</string>
<string name="default_category">Kategori bawaan</string> <string name="default_category">Kategori bawaan</string>
<string name="default_category_summary">Selalu tanya</string> <string name="default_category_summary">Selalu tanya</string>
@ -241,11 +241,11 @@
<string name="ext_untrusted">Tidak terpercaya</string> <string name="ext_untrusted">Tidak terpercaya</string>
<string name="ext_uninstall">Lepas</string> <string name="ext_uninstall">Lepas</string>
<string name="untrusted_extension">Ekstensi tidak terpercaya</string> <string name="untrusted_extension">Ekstensi tidak terpercaya</string>
<string name="untrusted_extension_message">Ekstensi ini ditandatangani dengan sertifikat tidak tepercaya dan tidak diaktifkan. <string name="untrusted_extension_message">Ekstensi ini ditandatangani oleh author yang tidak dikenal dan tidak dimuat.
\n \n
\nEkstensi berbahaya dapat membaca kredensial login apa pun yang disimpan atau mengeksekusi kode arbitrer. \nEkstensi berbahaya dapat membaca semua kredensial login yang disimpan atau menjalankan kode berbahaya.
\n \n
\nDengan mempercayai sertifikat ini, Anda menerima risiko ini.</string> \nDengan mempercayai sertifikat ekstensi ini, Anda menerima risiko ini.</string>
<string name="pref_double_tap_anim_speed">Kecepatan animasi ketukan dua kali</string> <string name="pref_double_tap_anim_speed">Kecepatan animasi ketukan dua kali</string>
<string name="double_tap_anim_speed_0">Tanpa animasi</string> <string name="double_tap_anim_speed_0">Tanpa animasi</string>
<string name="double_tap_anim_speed_normal">Normal</string> <string name="double_tap_anim_speed_normal">Normal</string>
@ -376,7 +376,7 @@
<string name="label_data">Data</string> <string name="label_data">Data</string>
<string name="backup_restore_missing_sources">Sumber yang hilang:</string> <string name="backup_restore_missing_sources">Sumber yang hilang:</string>
<string name="invalid_backup_file_missing_manga">Cadangan tidak berisi entri perpustakaan apa pun.</string> <string name="invalid_backup_file_missing_manga">Cadangan tidak berisi entri perpustakaan apa pun.</string>
<string name="invalid_backup_file">Berkas cadangan tidak valid</string> <string name="invalid_backup_file">File cadangan tidak valid:</string>
<string name="sort_by_upload_date">Menurut tanggal pengunggahan</string> <string name="sort_by_upload_date">Menurut tanggal pengunggahan</string>
<string name="action_display_comfortable_grid">Grid nyaman</string> <string name="action_display_comfortable_grid">Grid nyaman</string>
<string name="tabs_header">Tab</string> <string name="tabs_header">Tab</string>
@ -471,9 +471,7 @@
<string name="pref_dns_over_https">DNS melalui HTTPS (DoH)</string> <string name="pref_dns_over_https">DNS melalui HTTPS (DoH)</string>
<string name="kindlish_nav">semacam Kindle</string> <string name="kindlish_nav">semacam Kindle</string>
<string name="pref_category_auto_download">Unduh otomatis</string> <string name="pref_category_auto_download">Unduh otomatis</string>
<string name="backup_restore_content_full">Data dari berkas cadangan akan dipulihkan. <string name="backup_restore_content_full">Anda mungkin perlu memasang ulang ekstensi yang hilang dan log in ke layanan pelacakan setelahnya untuk menggunakannya.</string>
\n
\nAnda perlu memasang ekstensi yang hilang dan masuk ke layanan pelacakan setelahnya untuk menggunakannya.</string>
<string name="notification_incognito_text">Matikan mode penyamaran</string> <string name="notification_incognito_text">Matikan mode penyamaran</string>
<string name="source_unsupported">Sumber tidak didukung</string> <string name="source_unsupported">Sumber tidak didukung</string>
<string name="error_no_match">Tidak ditemukan kecocokan</string> <string name="error_no_match">Tidak ditemukan kecocokan</string>
@ -558,7 +556,7 @@
<string name="database_clean">Tidak ada yang perlu dibersihkan</string> <string name="database_clean">Tidak ada yang perlu dibersihkan</string>
<string name="clear_database_source_item_count">%1$d entri non-perpustakaan dalam database</string> <string name="clear_database_source_item_count">%1$d entri non-perpustakaan dalam database</string>
<string name="extension_api_error">Gagal mendapatkan daftar ekstensi</string> <string name="extension_api_error">Gagal mendapatkan daftar ekstensi</string>
<string name="pref_update_only_completely_read">Dengan bab yang belum dibaca</string> <string name="pref_update_only_completely_read">Lewati daftar dengan chapter yang belum dibaca</string>
<string name="privacy_policy">Kebijakan privasi</string> <string name="privacy_policy">Kebijakan privasi</string>
<string name="publishing_finished">Penerbitan selesai</string> <string name="publishing_finished">Penerbitan selesai</string>
<string name="cancelled">Dibatalkan</string> <string name="cancelled">Dibatalkan</string>
@ -567,7 +565,7 @@
<string name="save_chapter_as_cbz">Simpan sebagai arsip CBZ</string> <string name="save_chapter_as_cbz">Simpan sebagai arsip CBZ</string>
<string name="action_show_manga">Lihat entri</string> <string name="action_show_manga">Lihat entri</string>
<string name="action_display_cover_only_grid">Grid sampul saja</string> <string name="action_display_cover_only_grid">Grid sampul saja</string>
<string name="pref_update_only_started">Yang belum dibaca</string> <string name="pref_update_only_started">Lewati dafter yang belum mulai dibaca</string>
<string name="skipped_reason_completed">Dilewati karena seri telah selesai</string> <string name="skipped_reason_completed">Dilewati karena seri telah selesai</string>
<string name="skipped_reason_not_caught_up">Dilewati karena ada bab yang belum dibaca</string> <string name="skipped_reason_not_caught_up">Dilewati karena ada bab yang belum dibaca</string>
<string name="skipped_reason_not_started">Dilewati karena tidak ada bab yang dibaca</string> <string name="skipped_reason_not_started">Dilewati karena tidak ada bab yang dibaca</string>
@ -715,7 +713,7 @@
<string name="action_filter_interval_passed">Melewati periode pemeriksaan</string> <string name="action_filter_interval_passed">Melewati periode pemeriksaan</string>
<string name="action_sort_next_updated">Pembaruan yang diharapkan berikutnya</string> <string name="action_sort_next_updated">Pembaruan yang diharapkan berikutnya</string>
<string name="intervals_header">Interval</string> <string name="intervals_header">Interval</string>
<string name="pref_update_only_in_release_period">Di luar periode rilis yang diharapkan</string> <string name="pref_update_only_in_release_period">Prediksikan waktu rilis selanjutnya</string>
<string name="manga_display_interval_title">Perkirakan setiap</string> <string name="manga_display_interval_title">Perkirakan setiap</string>
<string name="manga_display_modified_interval_title">Atur untuk memperbarui setiap</string> <string name="manga_display_modified_interval_title">Atur untuk memperbarui setiap</string>
<string name="track_delete_title">Hapus %s pelacakan\?</string> <string name="track_delete_title">Hapus %s pelacakan\?</string>
@ -752,7 +750,7 @@
<string name="last_auto_backup_info">Terakhir dicadangkan secara otomatis: %s</string> <string name="last_auto_backup_info">Terakhir dicadangkan secara otomatis: %s</string>
<string name="no_scanlators_found">Tidak ditemukan pemindai</string> <string name="no_scanlators_found">Tidak ditemukan pemindai</string>
<string name="scanlator">Pemindai</string> <string name="scanlator">Pemindai</string>
<string name="pref_flash_page">Berkedip putih pada perubahan halaman</string> <string name="pref_flash_page">Perlihatkan kilatan saat halaman berubah</string>
<string name="pref_storage_usage">Penggunaan penyimpanan</string> <string name="pref_storage_usage">Penggunaan penyimpanan</string>
<string name="action_sort_tracker_score">Skor pelacak</string> <string name="action_sort_tracker_score">Skor pelacak</string>
<string name="label_data_storage">Data dan penyimpanan</string> <string name="label_data_storage">Data dan penyimpanan</string>
@ -771,7 +769,7 @@
<string name="onboarding_permission_notifications">Izin notifikasi</string> <string name="onboarding_permission_notifications">Izin notifikasi</string>
<string name="onboarding_permission_install_apps">Izin pasang aplikasi</string> <string name="onboarding_permission_install_apps">Izin pasang aplikasi</string>
<string name="onboarding_heading">Selamat Datang!</string> <string name="onboarding_heading">Selamat Datang!</string>
<string name="onboarding_guides_returning_user">Sudah pernah menggunakan %s sebelumnya?</string> <string name="onboarding_guides_returning_user">Install ulang %s?</string>
<string name="onboarding_action_skip">Lewati</string> <string name="onboarding_action_skip">Lewati</string>
<string name="onboarding_permission_ignore_battery_opts_description">Hindari gangguan pada pembaruan pustaka, pengunduhan, dan pemulihan cadangan yang berlangsung lama.</string> <string name="onboarding_permission_ignore_battery_opts_description">Hindari gangguan pada pembaruan pustaka, pengunduhan, dan pemulihan cadangan yang berlangsung lama.</string>
<string name="onboarding_action_next">Selanjutnya</string> <string name="onboarding_action_next">Selanjutnya</string>
@ -786,4 +784,24 @@
\nSebaiknya menggunakan direktori terpisah. \nSebaiknya menggunakan direktori terpisah.
\n \n
\nDirektori yang dipilih: %2$s</string> \nDirektori yang dipilih: %2$s</string>
<string name="onboarding_storage_help_action">Panduan penyimpanan</string>
<string name="pref_library_update_smart_update">Pembauan pintar</string>
<string name="onboarding_storage_help_info">Memperbarui dari versi lama dan tak yakin harus pilih mana? lihat panduan penyimpanan untuk informasi lebih lanjut.</string>
<string name="action_add_repo">Tambahkan repo</string>
<string name="action_add_repo_message">Tambahkan repo lain ke Tachiyomi. Seharusnya URL yang memiliki akhiran \"index.min.json\".</string>
<string name="label_extension_repos">Repositori ekstensi</string>
<string name="information_empty_repos">Anda tidak memiliki repositori yang ditetapkan.</string>
<string name="invalid_backup_file_error">Keseluruhan eror:</string>
<string name="error_repo_exists">Repositori ini sudah ada!</string>
<string name="manga_interval_header">Update selanjutnya</string>
<string name="label_add_repo_input">URL Repo</string>
<string name="invalid_repo_name">URL repo tidak valid</string>
<string name="repo_extension_message">Ekstensi ini dari repo eksternal. ketuk untuk lihat repo.</string>
<string name="private_settings">Sertakan pengaturan sensitif (contohnya, token login pelacak)</string>
<string name="ext_permission_install_apps_warning">Izin diperlukan untuk memasang ekstensi. Klik disini untuk memberi izin.</string>
<string name="action_delete_repo">Hapus repo</string>
<string name="delete_repo_confirmation">Apa Anda yakin ingin menghapus repo \"%s\"?</string>
<string name="manga_interval_expected_update">Update selanjutnya diperkirakan sekitar %1$s, memeriksa setiap sekitar %2$s</string>
<string name="available_disk_space_info">Tersedia:%1$s/Total:%2$s</string>
<string name="manga_interval_custom_amount">Keseringan pembaruan yang di kostumisasi:</string>
</resources> </resources>

View File

@ -48,4 +48,7 @@
<plurals name="day"> <plurals name="day">
<item quantity="other">%d일</item> <item quantity="other">%d일</item>
</plurals> </plurals>
<plurals name="num_repos">
<item quantity="other">%d 저장소</item>
</plurals>
</resources> </resources>

View File

@ -767,7 +767,7 @@
<string name="onboarding_action_finish">Kom i gang</string> <string name="onboarding_action_finish">Kom i gang</string>
<string name="onboarding_storage_selection_required">En mappe må velges</string> <string name="onboarding_storage_selection_required">En mappe må velges</string>
<string name="onboarding_heading">Velkommen!</string> <string name="onboarding_heading">Velkommen!</string>
<string name="onboarding_guides_returning_user">Allerede brukt %s før?</string> <string name="onboarding_guides_returning_user">Reinstallerer du %s?</string>
<string name="onboarding_action_skip">Hopp over</string> <string name="onboarding_action_skip">Hopp over</string>
<string name="onboarding_action_next">Neste</string> <string name="onboarding_action_next">Neste</string>
<string name="onboarding_description">La oss sette opp noen ting først. Du kan alltid endre disse i innstillingene senere også.</string> <string name="onboarding_description">La oss sette opp noen ting først. Du kan alltid endre disse i innstillingene senere også.</string>

View File

@ -766,7 +766,7 @@
<string name="onboarding_guides_new_user">Novo no %s? Recomendamos dar uma olhada no guia de introdução.</string> <string name="onboarding_guides_new_user">Novo no %s? Recomendamos dar uma olhada no guia de introdução.</string>
<string name="onboarding_action_finish">Começar</string> <string name="onboarding_action_finish">Começar</string>
<string name="onboarding_heading">Bem-vindo(a)!</string> <string name="onboarding_heading">Bem-vindo(a)!</string>
<string name="onboarding_guides_returning_user">Já utilizou o %s antes?</string> <string name="onboarding_guides_returning_user">Reinstalando o %s?</string>
<string name="onboarding_action_skip">Pular</string> <string name="onboarding_action_skip">Pular</string>
<string name="onboarding_action_next">Próximo</string> <string name="onboarding_action_next">Próximo</string>
<string name="onboarding_description">Vamos definir algumas coisas primeiro. Você sempre pode fazer alterações nas configurações depois também.</string> <string name="onboarding_description">Vamos definir algumas coisas primeiro. Você sempre pode fazer alterações nas configurações depois também.</string>
@ -793,12 +793,15 @@
<string name="invalid_backup_file_error">Erro completo:</string> <string name="invalid_backup_file_error">Erro completo:</string>
<string name="error_repo_exists">Este repositório já existe!</string> <string name="error_repo_exists">Este repositório já existe!</string>
<string name="pref_library_update_smart_update">Atualização inteligente</string> <string name="pref_library_update_smart_update">Atualização inteligente</string>
<string name="invalid_repo_name">Nome de repositório inválido</string> <string name="invalid_repo_name">URL do repositório inválido</string>
<string name="action_add_repo_message">Adiciona repositórios adicionais ao Tachiyomi. O formato de um repositório é \"usuário/repositório\", onde \"usuário\" é o dono do repositório e \"repositório\" é o nome do repositório.</string> <string name="action_add_repo_message">Adiciona repositórios adicionais ao Tachiyomi. Deve ser uma URL que termine com \"index.min.json\".</string>
<string name="delete_repo_confirmation">Você deseja deletar o repositório \"%s\"?</string> <string name="delete_repo_confirmation">Você deseja deletar o repositório \"%s\"?</string>
<string name="action_delete_repo">Deletar repositório</string> <string name="action_delete_repo">Deletar repositório</string>
<string name="manga_interval_header">Próxima atualização</string> <string name="manga_interval_header">Próxima atualização</string>
<string name="action_add_repo">Adicionar repositório</string> <string name="action_add_repo">Adicionar repositório</string>
<string name="information_empty_repos">Você não tem repositórios definidos.</string> <string name="information_empty_repos">Você não tem repositórios definidos.</string>
<string name="label_extension_repos">Repositórios de extensões</string> <string name="label_extension_repos">Repositórios de extensões</string>
<string name="label_add_repo_input">URL do repositório</string>
<string name="onboarding_storage_help_action">Guia de armazenamento</string>
<string name="onboarding_storage_help_info">Atualizando de uma versão anterior e não tem certeza do que selecionar? Consulte o guia de armazenamento para mais informações.</string>
</resources> </resources>

View File

@ -716,4 +716,10 @@
<string name="manga_display_modified_interval_title">Definido para atualizar a cada</string> <string name="manga_display_modified_interval_title">Definido para atualizar a cada</string>
<string name="skipped_reason_not_in_release_period">Pulado, pois nenhum lançamento é esperado para hoje</string> <string name="skipped_reason_not_in_release_period">Pulado, pois nenhum lançamento é esperado para hoje</string>
<string name="delete_downloaded">Deletar dowloand</string> <string name="delete_downloaded">Deletar dowloand</string>
<string name="selected">Selecionado</string>
<string name="not_selected">Não selecionado</string>
<string name="action_menu_overflow_description">Mais opções</string>
<string name="action_bar_up_description">Rolar para cima</string>
<string name="unlock_app_title">Desbloquear %s</string>
<string name="label_data_storage">Dados e armazenamento</string>
</resources> </resources>

View File

@ -767,7 +767,7 @@
<string name="onboarding_action_finish">Начать</string> <string name="onboarding_action_finish">Начать</string>
<string name="onboarding_storage_selection_required">Необходимо выбрать папку</string> <string name="onboarding_storage_selection_required">Необходимо выбрать папку</string>
<string name="onboarding_heading">Добро пожаловать!</string> <string name="onboarding_heading">Добро пожаловать!</string>
<string name="onboarding_guides_returning_user">Уже использовали %s раньше?</string> <string name="onboarding_guides_returning_user">Переустанавливаете %s?</string>
<string name="onboarding_action_skip">Пропустить</string> <string name="onboarding_action_skip">Пропустить</string>
<string name="onboarding_action_next">Следующее</string> <string name="onboarding_action_next">Следующее</string>
<string name="onboarding_description">Давайте настроем парочку вещей. Вы всегда можете их поменять позже в настройках.</string> <string name="onboarding_description">Давайте настроем парочку вещей. Вы всегда можете их поменять позже в настройках.</string>
@ -802,4 +802,6 @@
<string name="information_empty_repos">У вас нет репозиториев.</string> <string name="information_empty_repos">У вас нет репозиториев.</string>
<string name="label_extension_repos">Репозитории расширений</string> <string name="label_extension_repos">Репозитории расширений</string>
<string name="label_add_repo_input">URL-адрес репозитория</string> <string name="label_add_repo_input">URL-адрес репозитория</string>
<string name="onboarding_storage_help_action">Руководство по хранению</string>
<string name="onboarding_storage_help_info">Обновляетесь со старой версии и не знаете, что выбрать? Обратите внимание на руководство по хранению для большей информации.</string>
</resources> </resources>

View File

@ -48,4 +48,7 @@
<plurals name="day"> <plurals name="day">
<item quantity="other">%d 天</item> <item quantity="other">%d 天</item>
</plurals> </plurals>
<plurals name="num_repos">
<item quantity="other">%d 仓库</item>
</plurals>
</resources> </resources>

View File

@ -83,7 +83,7 @@
<string name="all">全部</string> <string name="all">全部</string>
<string name="pref_library_update_restriction">设备自动更新限制</string> <string name="pref_library_update_restriction">设备自动更新限制</string>
<string name="charging">充电时</string> <string name="charging">充电时</string>
<string name="pref_update_only_non_completed">已完结</string> <string name="pref_update_only_non_completed">跳过状态为“已完结”的作品</string>
<string name="pref_auto_update_manga_sync">阅读后更新进度</string> <string name="pref_auto_update_manga_sync">阅读后更新进度</string>
<string name="default_category">默认分类</string> <string name="default_category">默认分类</string>
<string name="default_category_summary">始终询问</string> <string name="default_category_summary">始终询问</string>
@ -97,11 +97,11 @@
<string name="ext_untrusted">不可信</string> <string name="ext_untrusted">不可信</string>
<string name="ext_uninstall">卸载</string> <string name="ext_uninstall">卸载</string>
<string name="untrusted_extension">不可信的插件</string> <string name="untrusted_extension">不可信的插件</string>
<string name="untrusted_extension_message">此插件使用不受信任的证书签名且尚未激活 <string name="untrusted_extension_message">此插件由未知作者签名且尚未加载
\n \n
\n恶意插件可以读取任何存储的登录凭据或执行任意代码。 \n恶意插件可以读取任何存储的登录凭据或执行任意代码。
\n \n
\n信任此证书即代表你愿意承担上述风险。</string> \n信任此插件证书即代表你愿意承担上述风险。</string>
<string name="pref_fullscreen">全屏</string> <string name="pref_fullscreen">全屏</string>
<string name="pref_page_transitions">页面过渡动画</string> <string name="pref_page_transitions">页面过渡动画</string>
<string name="pref_double_tap_anim_speed">双击动画速度</string> <string name="pref_double_tap_anim_speed">双击动画速度</string>
@ -167,7 +167,7 @@
<string name="creating_backup">正在创建备份</string> <string name="creating_backup">正在创建备份</string>
<string name="pref_clear_chapter_cache">清除章节缓存</string> <string name="pref_clear_chapter_cache">清除章节缓存</string>
<string name="used_cache">已使用空间:%1$s</string> <string name="used_cache">已使用空间:%1$s</string>
<string name="cache_deleted">缓存已清除。%1$d 个文件已被删除</string> <string name="cache_deleted">缓存已清除%1$d个文件已被删除</string>
<string name="cache_delete_error">清除时出现错误</string> <string name="cache_delete_error">清除时出现错误</string>
<string name="pref_clear_cookies">清除 Cookie</string> <string name="pref_clear_cookies">清除 Cookie</string>
<string name="cookies_cleared">Cookie 已清除</string> <string name="cookies_cleared">Cookie 已清除</string>
@ -301,8 +301,8 @@
<string name="action_sort_latest_chapter">作品更新时间</string> <string name="action_sort_latest_chapter">作品更新时间</string>
<string name="action_view_chapters">查看章节</string> <string name="action_view_chapters">查看章节</string>
<string name="action_cancel_all">全部取消</string> <string name="action_cancel_all">全部取消</string>
<string name="theme_light">关闭</string> <string name="theme_light">浅色</string>
<string name="theme_dark">开启</string> <string name="theme_dark">深色</string>
<string name="theme_system">跟随系统</string> <string name="theme_system">跟随系统</string>
<string name="pref_manage_notifications">通知管理</string> <string name="pref_manage_notifications">通知管理</string>
<string name="pref_category_security">隐私</string> <string name="pref_category_security">隐私</string>
@ -376,7 +376,7 @@
<string name="label_data">数据</string> <string name="label_data">数据</string>
<string name="backup_restore_missing_sources">缺少图源:</string> <string name="backup_restore_missing_sources">缺少图源:</string>
<string name="invalid_backup_file_missing_manga">备份不包含任何作品。</string> <string name="invalid_backup_file_missing_manga">备份不包含任何作品。</string>
<string name="invalid_backup_file">无效的备份文件</string> <string name="invalid_backup_file">无效的备份文件</string>
<string name="pref_library_update_refresh_metadata_summary">更新书架时一并检查封面和简介是否有变动</string> <string name="pref_library_update_refresh_metadata_summary">更新书架时一并检查封面和简介是否有变动</string>
<string name="pref_library_update_refresh_metadata">自动刷新元数据</string> <string name="pref_library_update_refresh_metadata">自动刷新元数据</string>
<string name="action_migrate">迁移</string> <string name="action_migrate">迁移</string>
@ -457,9 +457,7 @@
<string name="pref_dual_page_split">拆分双页</string> <string name="pref_dual_page_split">拆分双页</string>
<string name="pref_dual_page_invert">拆分双页时交换顺序</string> <string name="pref_dual_page_invert">拆分双页时交换顺序</string>
<string name="pref_dual_page_invert_summary">拆分双页的顺序与阅读方向不符时可以开启</string> <string name="pref_dual_page_invert_summary">拆分双页的顺序与阅读方向不符时可以开启</string>
<string name="backup_restore_content_full">即将还原备份文件中的数据。 <string name="backup_restore_content_full">您可能需要安装缺失的插件并登录进度记录平台才能正常使用。</string>
\n
\n随后请重新安装所有缺失的插件并重新登录进度记录平台。</string>
<string name="nav_zone_right"></string> <string name="nav_zone_right"></string>
<string name="nav_zone_left"></string> <string name="nav_zone_left"></string>
<string name="nav_zone_next">下一页</string> <string name="nav_zone_next">下一页</string>
@ -559,7 +557,7 @@
<string name="clear_database_source_item_count">数据库中有 %1$d 部作品未添加到书架</string> <string name="clear_database_source_item_count">数据库中有 %1$d 部作品未添加到书架</string>
<string name="extension_api_error">无法获取插件列表</string> <string name="extension_api_error">无法获取插件列表</string>
<string name="privacy_policy">隐私声明</string> <string name="privacy_policy">隐私声明</string>
<string name="pref_update_only_completely_read">有未读章节</string> <string name="pref_update_only_completely_read">跳过有未读章节的作品</string>
<string name="library_errors_help">关于书架更新出错的解决方法,请参阅 %1$s</string> <string name="library_errors_help">关于书架更新出错的解决方法,请参阅 %1$s</string>
<string name="save_chapter_as_cbz">保存为 CBZ 压缩包</string> <string name="save_chapter_as_cbz">保存为 CBZ 压缩包</string>
<string name="publishing_finished">出版完毕</string> <string name="publishing_finished">出版完毕</string>
@ -569,7 +567,7 @@
<string name="action_display_cover_only_grid">封面网格</string> <string name="action_display_cover_only_grid">封面网格</string>
<string name="pref_landscape_zoom">自动放大横向图片</string> <string name="pref_landscape_zoom">自动放大横向图片</string>
<string name="pref_navigate_pan">图片放大时先平移再翻页</string> <string name="pref_navigate_pan">图片放大时先平移再翻页</string>
<string name="pref_update_only_started">尚未开始阅读</string> <string name="pref_update_only_started">跳过还未开始阅读的作品</string>
<string name="skipped_reason_completed">已跳过,因为作品已完结</string> <string name="skipped_reason_completed">已跳过,因为作品已完结</string>
<string name="skipped_reason_not_caught_up">已跳过,因为有未读章节</string> <string name="skipped_reason_not_caught_up">已跳过,因为有未读章节</string>
<string name="skipped_reason_not_started">已跳过,因为尚未开始阅读</string> <string name="skipped_reason_not_started">已跳过,因为尚未开始阅读</string>
@ -579,8 +577,8 @@
<string name="action_move_to_top_all_for_series">将作品移到顶部</string> <string name="action_move_to_top_all_for_series">将作品移到顶部</string>
<string name="disabled_nav">关闭</string> <string name="disabled_nav">关闭</string>
<string name="error_saving_picture">保存图片出错</string> <string name="error_saving_picture">保存图片出错</string>
<string name="update_check_fdroid_migration_info">新版本可从官方版本中获得。 轻按以了解如何从非官方 F-Droid 版本迁移。</string> <string name="update_check_fdroid_migration_info">官方发布了新版本。 轻按以了解如何从非官方 F-Droid 版本迁移。</string>
<string name="empty_backup_error">没有要备份的库条目</string> <string name="empty_backup_error">书架没有可备份的作品</string>
<string name="update_check_open">打开 GitHub 页面</string> <string name="update_check_open">打开 GitHub 页面</string>
<string name="webview_data_deleted">已清除 WebView 数据</string> <string name="webview_data_deleted">已清除 WebView 数据</string>
<string name="pref_clear_webview_data">清除 WebView 数据</string> <string name="pref_clear_webview_data">清除 WebView 数据</string>
@ -706,7 +704,7 @@
<string name="pref_chapter_swipe_start">向左滑动操作</string> <string name="pref_chapter_swipe_start">向左滑动操作</string>
<string name="pref_double_tap_zoom">双击放大</string> <string name="pref_double_tap_zoom">双击放大</string>
<string name="pref_library_columns_per_row">每行 %d 个</string> <string name="pref_library_columns_per_row">每行 %d 个</string>
<string name="pref_update_only_in_release_period">未到预计更新时间</string> <string name="pref_update_only_in_release_period">预计下次更新时间</string>
<string name="action_ok">确定</string> <string name="action_ok">确定</string>
<string name="track_delete_title">要删除 %s 的记录吗?</string> <string name="track_delete_title">要删除 %s 的记录吗?</string>
<string name="track_delete_remote_text">同时删除 %s 上的数据</string> <string name="track_delete_remote_text">同时删除 %s 上的数据</string>
@ -747,7 +745,7 @@
<string name="relative_time_span_never">从不</string> <string name="relative_time_span_never">从不</string>
<string name="pref_flash_page_summ">减少电子墨水屏上的重影</string> <string name="pref_flash_page_summ">减少电子墨水屏上的重影</string>
<string name="last_auto_backup_info">上次自动备份:%s</string> <string name="last_auto_backup_info">上次自动备份:%s</string>
<string name="pref_flash_page">切页时闪烁白屏</string> <string name="pref_flash_page">切页时闪烁</string>
<string name="label_data_storage">数据与存储</string> <string name="label_data_storage">数据与存储</string>
<string name="pref_storage_usage">存储占用</string> <string name="pref_storage_usage">存储占用</string>
<string name="action_create">创建</string> <string name="action_create">创建</string>
@ -766,5 +764,44 @@
<string name="onboarding_action_skip">跳过</string> <string name="onboarding_action_skip">跳过</string>
<string name="onboarding_action_next">下一步</string> <string name="onboarding_action_next">下一步</string>
<string name="action_bar_up_description">向上浏览</string> <string name="action_bar_up_description">向上浏览</string>
<string name="onboarding_description">让我们先设置一些东西。你也可以稍后在设置中更改这些。</string> <string name="onboarding_description">让我们先进行一些设置。您也可以稍后在设置中更改这些选项。</string>
<string name="onboarding_permission_ignore_battery_opts_description">避免长时间运行的书架更新、下载和备份恢复被中断。</string>
<string name="onboarding_permission_action_grant">授权</string>
<string name="no_location_set">未设置存储位置</string>
<string name="invalid_backup_file_error">完整错误:</string>
<string name="onboarding_permission_ignore_battery_opts">后台电池配置</string>
<string name="ext_permission_install_apps_warning">需要权限安装插件。点击此处授权。</string>
<string name="action_add_repo">添加仓库</string>
<string name="private_settings">包含敏感设置(例如进度记录平台的登录令牌)</string>
<string name="delete_repo_confirmation">您希望删除仓库\"%s\"吗?</string>
<string name="repo_extension_message">此插件来自外部仓库。点击查看该仓库。</string>
<string name="error_repo_exists">此仓库已存在!</string>
<string name="action_delete_repo">删除仓库</string>
<string name="invalid_repo_name">无效的仓库URL</string>
<string name="pref_storage_location_info">用于自动备份、章节下载和本地图源。</string>
<string name="manga_interval_expected_update">下次更新预计在%1$s天后每隔%2$s检查一次</string>
<string name="manga_interval_custom_amount">自定义更新频率:</string>
<string name="onboarding_permission_install_apps">应用安装权限</string>
<string name="onboarding_permission_install_apps_description">用以安装图源插件。</string>
<string name="onboarding_permission_notifications">通知权限</string>
<string name="onboarding_guides_new_user">%s新手我们建议您查阅入门指南。</string>
<string name="onboarding_guides_returning_user">重新安装%s?</string>
<string name="pref_library_update_smart_update">智能更新</string>
<string name="onboarding_permission_notifications_description">获取书架更新及其他通知。</string>
<string name="label_extension_repos">插件仓库</string>
<string name="information_empty_repos">您没有设置仓库。</string>
<string name="label_add_repo_input">仓库URL</string>
<string name="action_add_repo_message">向 Tachiyomi 添加额外仓库。注意是以“index.min.json”结尾的 URL。</string>
<string name="manga_interval_header">下次更新</string>
<string name="onboarding_storage_help_info">从旧版本升级而来不知如何选择?请参阅存储指南获取更多信息。</string>
<string name="onboarding_storage_help_action">存储指南</string>
<string name="pref_storage_location">存储位置</string>
<string name="onboarding_storage_action_select">选择一个文件夹</string>
<string name="onboarding_storage_info">选择文件夹%1$s用以存储下载章节、备份文件及其他。
\n
\n推荐使用专用文件夹。
\n
\n已选文件夹%2$s</string>
<string name="onboarding_storage_selection_required">必须选择一个文件夹</string>
<string name="available_disk_space_info">可用:%1$s / 全部:%2$s</string>
</resources> </resources>

View File

@ -80,7 +80,7 @@
<string name="all">全部</string> <string name="all">全部</string>
<string name="pref_library_update_restriction">自動更新的裝置限制</string> <string name="pref_library_update_restriction">自動更新的裝置限制</string>
<string name="charging">充電時</string> <string name="charging">充電時</string>
<string name="pref_update_only_non_completed">連載已完結</string> <string name="pref_update_only_non_completed">略過已完結的作品</string>
<string name="default_category">預設類別</string> <string name="default_category">預設類別</string>
<string name="default_category_summary">總是詢問</string> <string name="default_category_summary">總是詢問</string>
<string name="ext_update">更新</string> <string name="ext_update">更新</string>
@ -557,7 +557,7 @@
<string name="database_clean">無須清理</string> <string name="database_clean">無須清理</string>
<string name="extension_api_error">擴充套件清單取得失敗</string> <string name="extension_api_error">擴充套件清單取得失敗</string>
<string name="privacy_policy">隱私權政策</string> <string name="privacy_policy">隱私權政策</string>
<string name="pref_update_only_completely_read">有未讀章節</string> <string name="pref_update_only_completely_read">略過有未讀章節的作品</string>
<string name="library_errors_help">如欲瞭解如何修復書櫃更新錯誤,請參閱 %1$s</string> <string name="library_errors_help">如欲瞭解如何修復書櫃更新錯誤,請參閱 %1$s</string>
<string name="save_chapter_as_cbz">以 CBZ 封存檔格式儲存</string> <string name="save_chapter_as_cbz">以 CBZ 封存檔格式儲存</string>
<string name="on_hiatus">休刊中</string> <string name="on_hiatus">休刊中</string>
@ -567,7 +567,7 @@
<string name="pref_landscape_zoom">自動縮放寬頁</string> <string name="pref_landscape_zoom">自動縮放寬頁</string>
<string name="pref_navigate_pan">導覽寬頁時先平移後翻頁</string> <string name="pref_navigate_pan">導覽寬頁時先平移後翻頁</string>
<string name="action_display_cover_only_grid">純封面格狀</string> <string name="action_display_cover_only_grid">純封面格狀</string>
<string name="pref_update_only_started">無已讀章節</string> <string name="pref_update_only_started">略過無已讀章節的作品</string>
<string name="skipped_reason_completed">由於連載已完結,因此略過</string> <string name="skipped_reason_completed">由於連載已完結,因此略過</string>
<string name="skipped_reason_not_caught_up">由於有未讀章節,因此略過</string> <string name="skipped_reason_not_caught_up">由於有未讀章節,因此略過</string>
<string name="skipped_reason_not_started">由於無已讀章節,因此略過</string> <string name="skipped_reason_not_started">由於無已讀章節,因此略過</string>
@ -718,7 +718,7 @@
<string name="action_sort_next_updated">下次預期更新</string> <string name="action_sort_next_updated">下次預期更新</string>
<string name="intervals_header">刊期</string> <string name="intervals_header">刊期</string>
<string name="manga_display_interval_title">預計每個</string> <string name="manga_display_interval_title">預計每個</string>
<string name="pref_update_only_in_release_period">未臨出刊日</string> <string name="pref_update_only_in_release_period">預估出刊日</string>
<string name="manga_display_modified_interval_title">設定為每個</string> <string name="manga_display_modified_interval_title">設定為每個</string>
<string name="skipped_reason_not_in_release_period">由於未臨出刊日,因此略過</string> <string name="skipped_reason_not_in_release_period">由於未臨出刊日,因此略過</string>
<string name="has_results">有結果</string> <string name="has_results">有結果</string>
@ -767,7 +767,7 @@
<string name="onboarding_action_finish">開始使用</string> <string name="onboarding_action_finish">開始使用</string>
<string name="onboarding_storage_selection_required">必須選擇一個資料夾</string> <string name="onboarding_storage_selection_required">必須選擇一個資料夾</string>
<string name="onboarding_heading">歡迎!</string> <string name="onboarding_heading">歡迎!</string>
<string name="onboarding_guides_returning_user">已是 %s 的既有使用者</string> <string name="onboarding_guides_returning_user">重新安裝 %s</string>
<string name="onboarding_action_skip">略過</string> <string name="onboarding_action_skip">略過</string>
<string name="onboarding_action_next">下一步</string> <string name="onboarding_action_next">下一步</string>
<string name="onboarding_description">讓我們先設定一些東西。稍後你隨時可至設定中變更這些選項。</string> <string name="onboarding_description">讓我們先設定一些東西。稍後你隨時可至設定中變更這些選項。</string>
@ -787,7 +787,7 @@
<string name="available_disk_space_info">可用:%1$s / 總計:%2$s</string> <string name="available_disk_space_info">可用:%1$s / 總計:%2$s</string>
<string name="ext_permission_install_apps_warning">缺少安裝擴充套件所需的權限。輕觸此處以授予。</string> <string name="ext_permission_install_apps_warning">缺少安裝擴充套件所需的權限。輕觸此處以授予。</string>
<string name="private_settings">包含敏感設定 (如:歷程平台登入權杖)</string> <string name="private_settings">包含敏感設定 (如:歷程平台登入權杖)</string>
<string name="manga_interval_expected_update">預計再 %s左右出刊</string> <string name="manga_interval_expected_update">預計 %1$s後出刊每 %2$s檢查一次</string>
<string name="invalid_backup_file_error">完整錯誤訊息:</string> <string name="invalid_backup_file_error">完整錯誤訊息:</string>
<string name="repo_extension_message">此擴充套件來自外部儲存庫,輕觸以檢視該儲存庫。</string> <string name="repo_extension_message">此擴充套件來自外部儲存庫,輕觸以檢視該儲存庫。</string>
<string name="manga_interval_custom_amount">自訂更新頻率:</string> <string name="manga_interval_custom_amount">自訂更新頻率:</string>
@ -801,4 +801,6 @@
<string name="action_add_repo">新增儲存庫</string> <string name="action_add_repo">新增儲存庫</string>
<string name="information_empty_repos">尚未新增任何儲存庫</string> <string name="information_empty_repos">尚未新增任何儲存庫</string>
<string name="label_extension_repos">擴充套件儲存庫</string> <string name="label_extension_repos">擴充套件儲存庫</string>
<string name="onboarding_storage_help_action">儲存空間指南</string>
<string name="onboarding_storage_help_info">從舊版升級而不確定該如何選擇嗎?請參閱儲存空間指南以取得更多資訊。</string>
</resources> </resources>