Migrate to multiplatform string resources (#10147)

* Migrate to multiplatform string resources

* Move plurals translations into separate files

* Fix lint check on generated files

(cherry picked from commit 46e734fc8eefb8c06a880194e702559ca3fa769d)

# Conflicts:
#	app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt
#	app/src/main/java/eu/kanade/presentation/browse/ExtensionDetailsScreen.kt
#	app/src/main/java/eu/kanade/presentation/browse/ExtensionsScreen.kt
#	app/src/main/java/eu/kanade/presentation/browse/SourcesScreen.kt
#	app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceDialogs.kt
#	app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceToolbar.kt
#	app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt
#	app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt
#	app/src/main/java/eu/kanade/presentation/manga/components/MangaBottomActionMenu.kt
#	app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt
#	app/src/main/java/eu/kanade/presentation/more/MoreScreen.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsBrowseScreen.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsLibraryScreen.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsReaderScreen.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/advanced/ClearDatabaseScreen.kt
#	app/src/main/java/eu/kanade/presentation/more/settings/screen/data/CreateBackupScreen.kt
#	app/src/main/java/eu/kanade/presentation/reader/ReaderPageActionsDialog.kt
#	app/src/main/java/eu/kanade/presentation/reader/appbars/BottomReaderBar.kt
#	app/src/main/java/eu/kanade/presentation/reader/appbars/ReaderAppBars.kt
#	app/src/main/java/eu/kanade/presentation/reader/components/ChapterNavigator.kt
#	app/src/main/java/eu/kanade/presentation/reader/settings/GeneralSettingsPage.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseTab.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrateMangaScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/MigrateDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrateSourceTab.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/history/HistoryTab.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderPreferences.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreen.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/updates/UpdatesTab.kt
#	build.gradle.kts
#	i18n/build.gradle.kts
#	i18n/src/commonMain/resources/MR/base/strings_sy.xml
#	i18n/src/commonMain/resources/MR/fr/strings_sy.xml
#	i18n/src/commonMain/resources/MR/in/strings_sy.xml
#	i18n/src/commonMain/resources/MR/pt-rBR/strings_sy.xml
#	i18n/src/commonMain/resources/MR/ru/strings_sy.xml
#	i18n/src/commonMain/resources/MR/zh-rCN/strings_sy.xml
#	i18n/src/commonMain/resources/MR/zh-rTW/strings_sy.xml
This commit is contained in:
arkon
2023-11-18 13:54:56 -05:00
committed by Jobobby04
parent 120ac6dbda
commit 1eccf9fad8
318 changed files with 5701 additions and 6080 deletions
+3
View File
@@ -19,6 +19,9 @@ android {
dependencies {
implementation(project(":i18n"))
// SY -->
implementation(project(":i18n-sy"))
// SY <--
api(libs.logcat)
@@ -1,9 +1,10 @@
package eu.kanade.tachiyomi.core.security
import eu.kanade.tachiyomi.core.R
import dev.icerock.moko.resources.StringResource
import tachiyomi.core.preference.Preference
import tachiyomi.core.preference.PreferenceStore
import tachiyomi.core.preference.getEnum
import tachiyomi.i18n.MR
class SecurityPreferences(
private val preferenceStore: PreferenceStore,
@@ -45,10 +46,10 @@ class SecurityPreferences(
0,
)
enum class SecureScreenMode(val titleResId: Int) {
ALWAYS(R.string.lock_always),
INCOGNITO(R.string.pref_incognito_mode),
NEVER(R.string.lock_never),
enum class SecureScreenMode(val titleRes: StringResource) {
ALWAYS(MR.strings.lock_always),
INCOGNITO(MR.strings.pref_incognito_mode),
NEVER(MR.strings.lock_never),
}
// SY -->
@@ -5,7 +5,6 @@ import android.content.Context
import android.webkit.WebView
import android.widget.Toast
import androidx.core.content.ContextCompat
import eu.kanade.tachiyomi.core.R
import eu.kanade.tachiyomi.network.AndroidCookieJar
import eu.kanade.tachiyomi.util.system.WebViewClientCompat
import eu.kanade.tachiyomi.util.system.isOutdated
@@ -15,6 +14,8 @@ import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
import tachiyomi.core.i18n.localize
import tachiyomi.i18n.MR
import java.io.IOException
import java.util.concurrent.CountDownLatch
@@ -48,7 +49,7 @@ class CloudflareInterceptor(
// Because OkHttp's enqueue only handles IOExceptions, wrap the exception so that
// we don't crash the entire app
catch (e: CloudflareBypassException) {
throw IOException(context.getString(R.string.information_cloudflare_bypass_failure), e)
throw IOException(context.localize(MR.strings.information_cloudflare_bypass_failure), e)
} catch (e: Exception) {
throw IOException(e)
}
@@ -130,7 +131,7 @@ class CloudflareInterceptor(
if (!cloudflareBypassed) {
// Prompt user to update WebView if it seems too outdated
if (isWebViewOutdated) {
context.toast(R.string.information_webview_outdated, Toast.LENGTH_LONG)
context.toast(MR.strings.information_webview_outdated, Toast.LENGTH_LONG)
}
throw CloudflareBypassException()
@@ -5,7 +5,6 @@ import android.os.Build
import android.webkit.WebSettings
import android.webkit.WebView
import android.widget.Toast
import eu.kanade.tachiyomi.core.R
import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.WebViewUtil
import eu.kanade.tachiyomi.util.system.setDefaultSettings
@@ -15,6 +14,7 @@ import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response
import tachiyomi.core.util.lang.launchUI
import tachiyomi.i18n.MR
import java.util.Locale
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
@@ -57,7 +57,7 @@ abstract class WebViewInterceptor(
if (!WebViewUtil.supportsWebView(context)) {
launchUI {
context.toast(R.string.information_webview_required, Toast.LENGTH_LONG)
context.toast(MR.strings.information_webview_required, Toast.LENGTH_LONG)
}
return response
}
@@ -2,7 +2,8 @@ package eu.kanade.tachiyomi.util.system
import android.content.Context
import android.widget.Toast
import androidx.annotation.StringRes
import dev.icerock.moko.resources.StringResource
import tachiyomi.core.i18n.localize
/**
* Display a toast in this context.
@@ -11,11 +12,11 @@ import androidx.annotation.StringRes
* @param duration the duration of the toast. Defaults to short.
*/
fun Context.toast(
@StringRes resource: Int,
resource: StringResource,
duration: Int = Toast.LENGTH_SHORT,
block: (Toast) -> Unit = {},
): Toast {
return toast(getString(resource), duration, block)
return toast(localize(resource), duration, block)
}
/**
@@ -0,0 +1,26 @@
package tachiyomi.core.i18n
import android.content.Context
import dev.icerock.moko.resources.PluralsResource
import dev.icerock.moko.resources.StringResource
import dev.icerock.moko.resources.desc.Plural
import dev.icerock.moko.resources.desc.PluralFormatted
import dev.icerock.moko.resources.desc.Resource
import dev.icerock.moko.resources.desc.ResourceFormatted
import dev.icerock.moko.resources.desc.StringDesc
fun Context.localize(resource: StringResource): String {
return StringDesc.Resource(resource).toString(this)
}
fun Context.localize(resource: StringResource, vararg args: Any): String {
return StringDesc.ResourceFormatted(resource, *args).toString(this)
}
fun Context.localizePlural(resource: PluralsResource, count: Int): String {
return StringDesc.Plural(resource, count).toString(this)
}
fun Context.localizePlural(resource: PluralsResource, count: Int, vararg args: Any): String {
return StringDesc.PluralFormatted(resource, count, *args).toString(this)
}
@@ -3,7 +3,8 @@ package tachiyomi.core.provider
import android.content.Context
import android.os.Environment
import androidx.core.net.toUri
import eu.kanade.tachiyomi.core.R
import tachiyomi.core.i18n.localize
import tachiyomi.i18n.MR
import java.io.File
class AndroidBackupFolderProvider(
@@ -13,7 +14,7 @@ class AndroidBackupFolderProvider(
override fun directory(): File {
return File(
Environment.getExternalStorageDirectory().absolutePath + File.separator +
context.getString(R.string.app_name),
context.localize(MR.strings.app_name),
"backup",
)
}
@@ -3,7 +3,8 @@ package tachiyomi.core.provider
import android.content.Context
import android.os.Environment
import androidx.core.net.toUri
import eu.kanade.tachiyomi.core.R
import tachiyomi.core.i18n.localize
import tachiyomi.i18n.MR
import java.io.File
class AndroidDownloadFolderProvider(
@@ -13,7 +14,7 @@ class AndroidDownloadFolderProvider(
override fun directory(): File {
return File(
Environment.getExternalStorageDirectory().absolutePath + File.separator +
context.getString(R.string.app_name),
context.localize(MR.strings.app_name),
"downloads",
)
}