Migrate to lyricist, Part 1 (#2014)

* Initial convert xml to kotlin i10n res

* Composing take Translations

* Move HistoryScreen to lyricist

* Move FavouritesScreen to lyricist

* Fix naming

* Fixes

* Fixes

* Convert

* Convert

* Revert

* Fix

* Convert

* Convert

* Formats

* Cleanup

* Cleanup

* Cleanup

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Refine

* Fixes

* Cleanup

* Cleanup

* Address Code Review

* Address Code Review

* Address Code Review

* Update app/src/main/kotlin/com/hippo/ehviewer/ui/i18n/ThTranslations.kt

Co-authored-by: FooIbar <118464521+FooIbar@users.noreply.github.com>

* Update app/src/main/kotlin/com/hippo/ehviewer/ui/i18n/KoTranslations.kt

Co-authored-by: FooIbar <118464521+FooIbar@users.noreply.github.com>

* Address Code Review

---------

Co-authored-by: Dude so hot <djohn@fbi.gov>
Co-authored-by: FooIbar <118464521+FooIbar@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2024-12-10 12:36:04 +00:00
1 parent c38fa2a70f
commit 0e608d169e
37 files changed
+5557 -325

No files matched your search

+1 -1
View File
@@ -244,7 +244,7 @@ dependencies {
implementation(libs.bundles.coil) implementation(libs.bundles.coil)
implementation(libs.telephoto.zoomable) implementation(libs.telephoto.zoomable)
implementation(libs.lyricist)
implementation(libs.ktor.client.okhttp) implementation(libs.ktor.client.okhttp)
implementation(libs.bundles.kotlinx.serialization) implementation(libs.bundles.kotlinx.serialization)
@@ -7,6 +7,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import com.hippo.ehviewer.ui.i18n.LocalTranslations
import com.hippo.ehviewer.ui.i18n.Translations
import com.hippo.ehviewer.ui.screen.implicit import com.hippo.ehviewer.ui.screen.implicit
import com.hippo.ehviewer.ui.tools.DialogState import com.hippo.ehviewer.ui.tools.DialogState
import com.hippo.ehviewer.ui.tools.LocalDialogState import com.hippo.ehviewer.ui.tools.LocalDialogState
@@ -20,11 +22,12 @@ import kotlinx.coroutines.CoroutineScope
@Composable @Composable
inline fun <R> AnimatedVisibilityScope.composing( inline fun <R> AnimatedVisibilityScope.composing(
navigator: DestinationsNavigator, navigator: DestinationsNavigator,
block: @Composable context(MainActivity, SnackbarHostState, DialogState, SharedTransitionScope, TransitionsVisibilityScope, DestinationsNavigator, CoroutineScope) block: @Composable context(Translations, MainActivity, SnackbarHostState, DialogState, SharedTransitionScope, TransitionsVisibilityScope, DestinationsNavigator, CoroutineScope)
() -> R, () -> R,
) = with(NoopTransitionsVisibilityScope) { ) = with(NoopTransitionsVisibilityScope) {
togetherWith(implicit<AnimatedVisibilityScope>()) { togetherWith(implicit<AnimatedVisibilityScope>()) {
block( block(
LocalTranslations.current,
with(LocalContext.current) { remember { findActivity() } }, with(LocalContext.current) { remember { findActivity() } },
LocalSnackBarHostState.current, LocalSnackBarHostState.current,
LocalDialogState.current, LocalDialogState.current,
@@ -22,7 +22,6 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.hippo.ehviewer.R import com.hippo.ehviewer.R
import com.hippo.ehviewer.Settings import com.hippo.ehviewer.Settings
@@ -31,6 +30,7 @@ import com.hippo.ehviewer.client.EhUtils
import com.hippo.ehviewer.client.data.GalleryDetail import com.hippo.ehviewer.client.data.GalleryDetail
import com.hippo.ehviewer.client.data.GalleryInfo.Companion.LOCAL_FAVORITED import com.hippo.ehviewer.client.data.GalleryInfo.Companion.LOCAL_FAVORITED
import com.hippo.ehviewer.client.thumbUrl import com.hippo.ehviewer.client.thumbUrl
import com.hippo.ehviewer.ui.i18n.Translations
import com.hippo.ehviewer.ui.screen.navWithUrl import com.hippo.ehviewer.ui.screen.navWithUrl
import com.hippo.ehviewer.util.addTextToClipboard import com.hippo.ehviewer.util.addTextToClipboard
import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.DestinationsNavigator
@@ -38,40 +38,41 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator
private const val INDEX_URL = 2 private const val INDEX_URL = 2
private const val INDEX_PARENT = 9 private const val INDEX_PARENT = 9
private fun GalleryDetail.generateContent() = arrayOf( context(Translations)
R.string.key_gid to gid.toString(), fun GalleryDetail.content() = arrayOf(
R.string.key_token to token, keyGid to "$gid",
R.string.key_url to EhUrl.getGalleryDetailUrl(gid, token), keyToken to token,
R.string.key_title to title, keyUrl to EhUrl.getGalleryDetailUrl(gid, token),
R.string.key_title_jpn to titleJpn, keyTitle to title,
R.string.key_thumb to thumbUrl, keyTitleJpn to titleJpn,
R.string.key_category to EhUtils.getCategory(category), keyThumb to thumbUrl,
R.string.key_uploader to uploader, keyCategory to EhUtils.getCategory(category),
R.string.key_posted to posted, keyUploader to uploader,
R.string.key_parent to parent, keyPosted to posted,
R.string.key_visible to visible, keyParent to parent,
R.string.key_language to language, keyVisible to visible,
R.string.key_pages to pages.toString(), keyLanguage to language,
R.string.key_size to size, keyPages to "$pages",
R.string.key_favorite_count to favoriteCount.toString(), keySize to size,
R.string.key_favorited to (favoriteSlot > LOCAL_FAVORITED).toString(), keyFavoriteCount to "$favoriteCount",
R.string.key_rating_count to ratingCount.toString(), keyFavorited to "${(favoriteSlot > LOCAL_FAVORITED)}",
R.string.key_rating to rating.toString(), keyRatingCount to "$ratingCount",
R.string.key_torrents to torrentCount.toString(), keyRating to "$rating",
R.string.key_torrent_url to torrentUrl, keyTorrents to "$torrentCount",
R.string.favorite_name to favoriteName, keyTorrentUrl to torrentUrl,
keyFavoriteName to favoriteName,
) )
context(Context, DestinationsNavigator) context(Context, DestinationsNavigator, Translations)
@Composable @Composable
fun GalleryInfoBottomSheet(detail: GalleryDetail) { fun GalleryInfoBottomSheet(detail: GalleryDetail) {
Column(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.fillMaxWidth()) {
Text( Text(
text = stringResource(id = R.string.gallery_info), text = galleryInfo,
modifier = Modifier.align(Alignment.CenterHorizontally), modifier = Modifier.align(Alignment.CenterHorizontally),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
) )
val data = remember(detail) { detail.generateContent() } val data = remember(detail) { detail.content() }
ProvideTextStyle(MaterialTheme.typography.labelLarge) { ProvideTextStyle(MaterialTheme.typography.labelLarge) {
LazyColumn(contentPadding = WindowInsets.systemBars.only(WindowInsetsSides.Bottom).asPaddingValues()) { LazyColumn(contentPadding = WindowInsets.systemBars.only(WindowInsetsSides.Bottom).asPaddingValues()) {
itemsIndexed(data) { index, (key, content) -> itemsIndexed(data) { index, (key, content) ->
@@ -90,7 +91,7 @@ fun GalleryInfoBottomSheet(detail: GalleryDetail) {
} }
}.fillMaxWidth(), }.fillMaxWidth(),
) { ) {
Text(stringResource(id = key), modifier = Modifier.width(90.dp).padding(8.dp)) Text(key, modifier = Modifier.width(90.dp).padding(8.dp))
Text(content.orEmpty(), modifier = Modifier.padding(8.dp)) Text(content.orEmpty(), modifier = Modifier.padding(8.dp))
} }
} }
@@ -13,6 +13,7 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.navigation.NavBackStackEntry import androidx.navigation.NavBackStackEntry
import com.hippo.ehviewer.ui.i18n.ProvideTranslations
import com.hippo.ehviewer.ui.theme.EhTheme import com.hippo.ehviewer.ui.theme.EhTheme
import com.hippo.ehviewer.ui.tools.DialogState import com.hippo.ehviewer.ui.tools.DialogState
import com.hippo.ehviewer.ui.tools.LocalDialogState import com.hippo.ehviewer.ui.tools.LocalDialogState
@@ -30,8 +31,10 @@ inline fun ComponentActivity.setMD3Content(crossinline content: @Composable () -
LocalDialogState provides dialogState, LocalDialogState provides dialogState,
) { ) {
Box(modifier = Modifier.fillMaxSize()) { Box(modifier = Modifier.fillMaxSize()) {
content() ProvideTranslations {
dialogState.value?.invoke(this) content()
dialogState.value?.invoke(this)
}
} }
} }
} }
@@ -0,0 +1,306 @@
package com.hippo.ehviewer.ui.i18n
object DeTranslations : Translations by EnTranslations {
override val homepage = "Startseite"
override val subscription = "Gefolgte Etiketten"
override val whatsHot = "Beliebt"
override val favourite = "Lesezeichen"
override val history = "Verlauf"
override val downloads = "Downloads"
override val settings = "Einstellungen"
override val username = "Benutzername"
override val password = "Kennwort"
override val signIn = "Anmelden"
override val register = "Konto erstellen"
override val signInViaWebview = "Mit WebView anmelden"
override val signInFirst = "Melde dich zunächst an"
override val textIsEmpty = "Der Text wird nicht eingegeben"
override val waring = "Achtung"
override val invalidDownloadLocation = "Der Downloadpfad ist nicht verfügbar. Geh zu die Einstellungen und stelle einen neue Pfad fest."
override val errorTimeout = "Timeout"
override val errorUnknownHost = "Unbekannter Hostcomputer"
override val errorRedirection = "Zu viele Umleitungen"
override val errorSocket = "Netwerkfehler"
override val errorUnknown = "Unbekannter Fehler"
override val errorCantFindActivity = "Die Application wurde nicht gefunden"
override val errorCannotParseTheUrl = "Die URL konnte analysiert nicht werden"
override val errorDecodingFailed = "Dekodierung fehlgeschlagen"
override val errorReadingFailed = "Lesefehler"
override val errorOutOfRange = "Außer Reichweite"
override val errorParseError = "Analyzierungfehler"
override val error509 = "509"
override val errorInvalidUrl = "URL ungültig"
override val errorGetPtokenError = "Fehler beim Erhalten pTokens"
override val errorCantSaveImage = "Das Bild konnte nicht gespeichert werden"
override val errorInvalidNumber = "Nummer ungültig"
override val getIt = "Verstanden"
override val galleryListSearchBarHintExhentai = "ExHentai durchsuchen"
override val galleryListSearchBarHintEHentai = "E-Hentai durchsuchen"
override val galleryListEmptyHit = "Die Welt ist so groß und der Panda sitzt ganz allein"
override val keywordSearch = "Suche nach dem Schlüsselwort"
override val imageSearch = "Suche nach einem Bild"
override val searchImage = "Suche nach einem Bild"
override val searchSh = "Gelöschte Galerien anzeigen"
override val searchSto = "Nur die Galerien mit Torrentdateien anzeigen"
override val searchSr = "Mindestpunktzahl"
override val searchSpTo = "zu"
override val searchSf = "Standard-Filter deaktivieren für:"
override val searchSfl = "Sprache"
override val searchSfu = "Uploader"
override val searchSft = "Etikett"
override val selectImage = "Bild wählen"
override val selectImageFirst = "Wähle ein Bild"
override val addToFavourites = "Zu den Favoriten hinzufügen"
override val removeFromFavourites = "Aus den Favoriten entfernen"
override val quickSearch = "Sofortsuche"
override val quickSearchTip = "Tippe an +, um eine Sofortsuche hinzuzufügen"
override val addQuickSearchDialogTitle = "Sofortsuche hinzufügen"
override val nameIsEmpty = "Gib den Name ein"
override val delete = "Löschen"
override val addQuickSearchTip = "Das Suchergebnis wird als eine Sofortsuche gespeichert. Suche etwas zuerst, um das Ergebnis zu speichern."
override val readme = "README"
override val imageSearchNotQuickSearch = "Die Bildsuchen können als Sofortsuchen gespeichert nicht werden."
override val duplicateQuickSearch = { a: String -> "Eine Sofortsuche, deren Name ist $a, bereits besteht." }
override val duplicateName = "Dieser Name ist bereits besetzt."
override val goToHint = { a: Int, b: Int -> "Seite $a, insgesamt $b Seiten" }
override val star2 = "2 Sterne"
override val star3 = "3 Sterne"
override val star4 = "4 Sterne"
override val star5 = "5 Sterne"
override val download = "Herunterladen"
override val read = "Lesen"
override val share = "Teilen"
override val rate = "Bewerten"
override val similarGallery = "Ähnlich"
override val searchCover = "Nach dem Umschlag suchen"
override val noTags = "Kein Etikett"
override val noComments = "Kein Kommentar"
override val noMoreComments = "Keine weiteren Kommentare"
override val moreComment = "Weitere Kommentare"
override val refresh = "Neu laden"
override val openInOtherApp = "Öffnen mit …"
override val rateSuccessfully = "Bewertung erfolgreich"
override val rateFailed = "Bewertung fehlgeschlagen"
override val noTorrents = "Keine Torrentdatei"
override val torrents = "Torrentdateien"
override val notFavorited = "Nicht zu Favoriten hinzugefügt"
override val addFavoritesDialogTitle = "Zu Favoriten hinzufügen"
override val addToFavoriteSuccess = "Zu Favoriten hinzugefügt"
override val removeFromFavoriteSuccess = "Aus Favoriten entfernt"
override val addToFavoriteFailure = "Fehler beim Hinzufügen zu Favoriten"
override val removeFromFavoriteFailure = "Fehler beim Entfernen aus Favoriten"
override val filterTheUploader = { a: String -> "Uploader \"$a\" blockieren?" }
override val filterTheTag = { a: String -> "Etikett \"$a\" blockieren?" }
override val filterAdded = "Element wurde blockiert."
override val rating10 = "EIN MEISTERSTÜCK"
override val rating9 = "WUNDERVOLL"
override val rating8 = "SEHR GUT"
override val rating7 = "GUT"
override val rating6 = "NICHT SCHLECHT"
override val rating5 = "MÄßIG"
override val rating4 = "SCHLECHT"
override val rating3 = "SCHRECKLICH"
override val rating2 = "PEINLICH"
override val rating1 = "UNERTRÄGLICH"
override val rating0 = "KATASTROPHE"
override val galleryInfo = "Galeriesinfomationen"
override val copiedToClipboard = "Text in Zwischenablage kopiert"
override val keyGid = "Gid"
override val keyToken = "Token"
override val keyUrl = "URL"
override val keyTitle = "Titel"
override val keyTitleJpn = "Japanischer Titel"
override val keyThumb = "Vorschau"
override val keyCategory = "Kategorie"
override val keyUploader = "Uploader"
override val keyPosted = "Hochladungsdatum"
override val keyParent = "Elternteil"
override val keyVisible = "Sichtbar?"
override val keyLanguage = "Sprache"
override val keyPages = "Seiten"
override val keySize = "Größe"
override val keyFavoriteCount = "Zahl der Hzfg zu Fav."
override val keyFavorited = "Zu Fav. hinzugefügt"
override val keyRatingCount = "Zahl der Bewertungen"
override val keyRating = "Bewertung"
override val keyTorrents = "Zahl der Torrents"
override val keyTorrentUrl = "URL des Torrentdateis"
override val favoredTimes = { a: Int -> "♥ $a" }
override val ratingText = { a: String, b: Float, c: Int -> "%s (%.2f, %d)".format(a, b, c) }
override val galleryComments = "Kommentare der Galerie"
override val commentSuccessfully = "Kommentar erfolgreich gesendet"
override val commentFailed = "Kommentar nicht gesendet"
override val copyCommentText = "Inhalt des Kommentars kopieren"
override val voteUp = "Für den Kommentar stimmen"
override val cancelVoteUp = "Positive Stimmung abbrechen"
override val voteDown = "Gegen den Kommentar stimmen"
override val cancelVoteDown = "Negative Stimmung abbrechen"
override val voteUpSuccessfully = "Positive Stimmung erfolgreich gesendet"
override val cancelVoteUpSuccessfully = "Die negative Stimmung wurde abgebrochen"
override val voteDownSuccessfully = "Negative Stimmung erfolgreich gesendet"
override val cancelVoteDownSuccessfully = "Die negative Stimmung wurde abgebrochen"
override val voteFailed = "Stimmung gescheitert"
override val checkVoteStatus = "Details der Stimmungen anzeigen"
override val goTo = "Gehe zu"
override val sceneDownloadTitle = { a: String -> "Download - $a" }
override val noDownloadInfo = "Downloads werden hier angezeigt"
override val downloadStateNone = "Pausiert"
override val downloadStateWait = "In der Warteschlange"
override val downloadStateDownloading = "Download läuft"
override val downloadStateDownloaded = "Abgeschlossen"
override val downloadStateFailed = "Gescheitert"
override val downloadStateFailed2 = { a: Int -> "$a wurde noch nicht abgeschlossen" }
override val downloadStateFinish = "Abgeschlossen"
override val stat509AlertTitle = "509 Fehler"
override val stat509AlertText = "Die Genze der Downloads wurde erreichet. Versuche noch einmals später,"
override val statDownloadDoneTitle = "Download abgeschlossen"
override val statDownloadDoneTextSucceeded = { a: Int -> "$a Download(s) wurde(n) abgeschlossen" }
override val statDownloadDoneTextFailed = { a: Int -> "$a Download(s) gescheitert" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a erfolgreich abgeschlossen, $b gescheitert" }
override val statDownloadDoneLineSucceeded = { a: String -> "Abgeschlossen: $a" }
override val statDownloadDoneLineFailed = { a: String -> "Gescheitert: $a" }
override val downloadRemoveDialogTitle = "Download entfernen"
override val downloadRemoveDialogMessage = { a: String -> "$a aus der Downloadliste entfernen?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "$a Downloads aus der Downloadliste entfernen?" }
override val downloadRemoveDialogCheckText = "Bilddateien löschen"
override val statDownloadActionStopAll = "Alle stopppen"
override val defaultDownloadLabelName = "Standard"
override val downloadMoveDialogTitle = "Verschieben"
override val downloadLabels = "Download-Etikette"
override val downloadStartAll = "Alle starten"
override val downloadStopAll = "Alle stoppen"
override val downloadServiceLabel = "EhViewer-Download-Dienst"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a, noch $b übrig" }
override val rememberDownloadLabel = "Download-Etikette merken"
override val defaultDownloadLabel = "Standard-Download-Etikette"
override val addedToDownloadList = "Zu Download-Liste hinzugefügt"
override val add = "Hinzufügen"
override val newLabelTitle = "Neue Etikette"
override val labelTextIsEmpty = "Inhalt der Etikette erforderlich"
override val labelTextIsInvalid = "\"Standard\" ist keine valide Etikett"
override val labelTextExist = "Sie bereits besteht"
override val renameLabelTitle = "Etikett umbenennen"
override val noHistory = "Deiner Lesungsverlauf wird hier angezeigt."
override val clearAll = "Verlaufdaten löschen"
override val clearAllHistory = "Verlaufdaten löschen?"
override val filter = "Blocker"
override val filterTitle = "Titel"
override val filterUploader = "Uploader"
override val filterTag = "Etikett"
override val filterTagNamespace = "Etikettsnamensraum"
override val deleteFilter = { a: String -> "Blocker \"$a\" entfernen?" }
override val showDefinition = "Definition anzeigen"
override val addFilter = "Blocker erstellen"
override val filterText = "Blocker-Text"
override val filterTip = "Die blockierten Galerien wurde in EHentai nicht angezeigt.\n\nTitel-Blocker: die Galerien, deren Titel das Wort enthalten, ausschließen.\n\nUploader-Blocker: Die vom Uploader hochgeladen Galerien ausschließen.\n\nEtikett-Blocker: Die Galerien, die die Etikett haben, ausschließen. Es wird länger dauern, Galerieliste zu laden.\n\nEtikettnamensraum-Blocker: Die Galerien, die den Etikettnamensraum haben, ausschließen. Es wird länger dauern, Galerieliste zu laden."
override val uConfig = "EHentai-Einstellungen"
override val applyTip = "Zum Speichern der Einstellungen auf Häkchen tippen"
override val shareImage = "Das Bild teilen"
override val imageSaved = { a: String -> "Das Bild wurde zu $a gespeichert" }
override val settingsEh = "EH"
override val settingsEhSignOut = "Abmelden"
override val settingsUConfig = "EHentai-Einstellungen"
override val settingsUConfigSummary = "Einstellung auf der Webseite EHentais"
override val settingsMyTags = "Gefolgte Etiketten"
override val settingsMyTagsSummary = "Die gefolgten Etiketten in EHentai-Webseite verwalten."
override val settingsEhGallerySite = "Galerie-Seite"
override val settingsEhLaunchPage = "Standard-Bildschirm nach App-Start"
override val settingsEhListMode = "Liste-Ansicht"
override val settingsEhListModeDetail = "Details"
override val settingsEhListModeThumb = "Miniaturbild"
override val settingsEhDetailSize = "Größe der Details"
override val settingsEhDetailSizeLong = "Lange"
override val settingsEhDetailSizeShort = "Kurz"
override val settingsAdvancedAppLanguageTitle = "Sprache der App (Language)"
override val torrentCount = { a: Int -> "Torrent ($a)" }
override val settingsEhShowJpnTitle = "Japanische Titel anzeigen"
override val settingsEhFilter = "Galerie-Blocker"
override val settingsEhFilterSummary = "Nach Titel, Uploader order Etiketten die unerwünschten Galerien verstecken"
override val settingsDownload = "Download"
override val settingsDownloadDownloadLocation = "Downloadziel"
override val settingsDownloadCantGetDownloadLocation = "Downloadziel konnte nicht geladen werden"
override val settingsDownloadMediaScan = "Medienscan erlauben"
override val settingsDownloadMediaScanSummaryOn = "Du solltest deine Galerie-Apps verstecken"
override val settingsDownloadMediaScanSummaryOff = "Meisten Galerie-Apps ignorieren die Bilder im Downloadpfad"
override val settingsDownloadConcurrency = "Multi-Thread-Download"
override val settingsDownloadConcurrencySummary = { a: Int -> "Bis zu $a Bild(er)" }
override val settingsDownloadPreloadImage = "Bilder vorabladen"
override val settingsDownloadPreloadImageSummary = { a: Int -> "Die nächste $a Bilder vorabladen" }
override val settingsDownloadDownloadOriginImage = "Originale Bilder herunterladen"
override val settingsDownloadDownloadOriginImageSummary = "Wenn es aktiviert wird, wird der 509-Fehler dir schneller widerfahren"
override val settingsDownloadRestoreDownloadItems = "Download-Elemente wiederherstellen"
override val settingsDownloadRestoreDownloadItemsSummary = "Alle Download-Elemente im Downloadpfad wiederherstellen"
override val settingsDownloadRestoreNotFound = "Keine zu wiederhestellenden Elemente"
override val settingsDownloadRestoreFailed = "Wiederherstellung gescheitert"
override val settingsDownloadRestoreSuccessfully = { a: Int -> "$a Element(e) wiederhergestellt" }
override val settingsDownloadCleanRedundancy = "Unnötige Dateien löschen"
override val settingsDownloadCleanRedundancySummary = "Bilddateien, die sich im Downloadpfad befinden, aber nicht in Downloadliste, löschen"
override val settingsDownloadCleanRedundancyNoRedundancy = "Keine zu löschenden Dateien gefunden"
override val settingsDownloadCleanRedundancyDone = { a: Int -> "Reinigung abgeschlossen. $a Datei(en) wurde(n) gelöscht." }
override val settingsAdvanced = "Erweiterte Optionen"
override val settingsAdvancedSaveParseErrorBody = "HTML-Datei beim Parsing-Fehler speichern"
override val settingsAdvancedSaveParseErrorBodySummary = "Die Datei könnte etwas Privates enthalten"
override val settingsAdvancedSaveCrashLog = "Crash-Bericht speichern"
override val settingsAdvancedSaveCrashLogSummary = "Der Bericht hilft dem Entwickler dabei, Fehler schnell zu beheben."
override val settingsAdvancedDumpLogcat = "Logcat-Protokoll speichern"
override val settingsAdvancedDumpLogcatSummary = "Logcat-Protokolldatei auf externem Speicher speichern"
override val settingsAdvancedDumpLogcatFailed = "Speichern gescheitert"
override val settingsAdvancedDumpLogcatTo = { a: String -> "Protokolldatei wurde auf $a gespeichert." }
override val cloudFavorites = "Cloud-Favoriten"
override val localFavorites = "Lokale Favoriten"
override val searchBarHint = { a: String -> "$a durchsuchen" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $b" }
override val deleteFavoritesDialogTitle = "Aus Favoriten löschen"
override val deleteFavoritesDialogMessage = { a: Int -> "$a Elemente aus Favoriten löschen?" }
override val moveFavoritesDialogTitle = "Favoriten verschieben"
override val defaultFavoritesCollection = "Standard-Favoriten"
override val letMeSelect = "Manuell auswählen"
override val collections = "Kollektionen"
override val errorSomethingWrongHappened = "Ein Fehler ist aufgetreten"
override val fromTheFuture = "Von der Zukunft"
override val justNow = "Gerade"
override val yesterday = "Gestern"
override val someDaysAgo = { a: Int -> "Vor $a Tagen" }
override val archive = "Archivdateien"
override val noArchives = "Keine Archivdatei"
override val downloadArchiveStarted = "Archivdatei wird heruntergeladen"
override val downloadArchiveFailure = "Fehler beim Herunterladen der Archivdatei"
override val downloadArchiveFailureNoHath = "H@H-Klient ist für das Herunterladen der Archivdateien erforderlich"
override val settingsPrivacy = "Datenschutzoptionen"
override val settingsPrivacySecure = "Screenshot verhindern"
override val settingsPrivacySecureSummary = "Screenshots werden verhindert. Inhalt der App wird in Aktuelle Apps-Liste nicht angezeigt."
override val appWaring = "Inhalt dieser App kommt aus dem Internet, von dem einige dir körperlichen oder emotionalen Schaden zufügen kann. Du hast es wirklich erfahrt und möchtest immer noch fortsetzen."
override val errorUsernameCannotEmpty = "Gibt den Nutzername ein"
override val errorPasswordCannotEmpty = "Gibt das Passwort ein"
override val guestMode = "Anmeldung überspringen"
override val signInFailed = "Anmeldung fehlgeschlagen"
override val clipboardGalleryUrlSnackMessage = "Ein Link von einen Galerie wurde in Zwischenablage erkennt."
override val clipboardGalleryUrlSnackAction = "Gehen"
override val settingsAdvancedReadCacheSize = "Größe des Lesezwischenspeichers"
override val settingsAboutDeclarationSummary = "EhViewer verbindet sich in keiner Weise mit E-Hentai.org."
override val settingsAboutSource = "Quellcode"
override val settingsAboutVersion = "Versionnummer"
override val settingsAboutCheckForUpdates = "Auf Update überprüfen"
override val cantReadTheFile = "Datei kann nicht gelesen werden"
override val appLanguageSystem = "Sprache des Systems (Standard)"
override val pleaseWait = "Bitte warte"
override val settingsAdvancedExportData = "Daten exportieren"
override val settingsAdvancedExportDataSummary = "Daten, z. B. Downloadliste, Sofortsucheliste, zum externen Speicher speichern"
override val settingsAdvancedExportDataTo = { a: String -> "Daten wurden zu $a exportiert" }
override val settingsAdvancedExportDataFailed = "Datenexport gescheitert"
override val settingsAdvancedImportData = "Daten importieren"
override val settingsAdvancedImportDataSummary = "Gespeicherte Daten wiederherstellen"
override val settingsAdvancedImportDataSuccessfully = "Daten wurden erfolgreich importiert"
override val settingsAbout = "Über die App"
override val settingsAboutAuthor = "Entwickler"
override val settingsAboutLatestRelease = "Aktuelle Version"
override val downloadResetReadingProgress = "Lesefortschritte zurücksetzen"
override val resetReadingProgressMessage = "Lesefortschritte aus allen heruntergeladenen Galerie zurücksetzen?"
override val settingsEhIdentityCookiesSigned = "Wenn jemand die folgenden Informationen hat, kann er sich als du anmelden. <br><b>ALSO GEHEIM HALTEN!</b>"
override val settingsEhIdentityCookiesGuest = "Du hast dich noch nicht angemeldet."
override val settingsEhShowGalleryPages = "Galerieseitenzahl anzeigen"
override val settingsEhShowGalleryPagesSummary = "Die Galerieseitenzahle in der Galerieliste anzeigen"
override val darkThemeFollowSystem = "System folgen"
}
@@ -0,0 +1,640 @@
package com.hippo.ehviewer.ui.i18n
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.withStyle
object EnTranslations : Translations {
override val appName = "EhViewer"
override val siteE = "e-hentai"
override val siteEx = "exhentai"
override val doujinshi = "DOUJINSHI"
override val manga = "MANGA"
override val artistCg = "ARTIST CG"
override val gameCg = "GAME CG"
override val western = "WESTERN"
override val nonH = "NON-H"
override val imageSet = "IMAGE SET"
override val cosplay = "COSPLAY"
override val asianPorn = "ASIAN PORN"
override val misc = "MISC"
override val homepage = "Homepage"
override val subscription = "Subscription"
override val whatsHot = "What's hot"
override val favourite = "Favourite"
override val history = "History"
override val downloads = "Downloads"
override val settings = "Settings"
override val username = "Username"
override val password = "Password"
override val signIn = "Sign in"
override val register = "Register"
override val signInViaWebview = "Sign in via WebView"
override val signInFirst = "Please sign in first"
override val textIsEmpty = "Text is empty"
override val waring = "Warning"
override val invalidDownloadLocation = "It seems download location is not available. Please set it in Settings."
override val clipboardGalleryUrlSnackMessage = "There is a gallery URL in the clipboard"
override val clipboardGalleryUrlSnackAction = "View"
override val errorTimeout = "Timeout"
override val errorUnknownHost = "Unknown host"
override val errorRedirection = "Too many redirections"
override val errorSocket = "Network error"
override val errorUnknown = "Weird"
override val errorCantFindActivity = "Can't find the application"
override val errorCannotParseTheUrl = "Can't parse the URL"
override val errorDecodingFailed = "Decoding failed"
override val errorReadingFailed = "Reading Failed"
override val errorOutOfRange = "Out of range"
override val errorParseError = "Parse error"
override val error509 = "509"
override val errorInvalidUrl = "Invalid URL"
override val errorGetPtokenError = "Get pToken error"
override val errorCantSaveImage = "Can't save image"
override val errorInvalidNumber = "Invalid number"
override val appWaring = "The content of this application is from the Internet. Some of it may do physical or mental harm to you. You have learnt the risks above and would like to undertake them. By continuing to use it, you agree to the above terms."
override val appWaring2 = "By continuing to use it, you agree to the above terms."
override val errorUsernameCannotEmpty = "Username cannot be empty"
override val errorPasswordCannotEmpty = "Password cannot be empty"
override val guestMode = "Guest mode"
override val signInFailed = "Sign in failed"
override val signInFailedTip = { a: String -> "If this issue continues, try \"$a\"." }
override val getIt = "Got it"
override val galleryListSearchBarHintExhentai = "Search ExHentai"
override val galleryListSearchBarHintEHentai = "Search E-Hentai"
override val galleryListSearchBarOpenGallery = "Open the gallery"
override val galleryListEmptyHit = "The World is Big and the panda sit alone"
override val galleryListEmptyHitSubscription = "Subscribe to tags in Settings->EH->My tags"
override val keywordSearch = "Keyword search"
override val imageSearch = "Image search"
override val searchImage = "Image Search"
override val searchSh = "Expunged"
override val searchSto = "Has Torrent"
override val searchSr = "Minimum Rating"
override val searchSpTo = "to"
override val searchSpErr1 = "The page range maximum cannot be below 10"
override val searchSpErr2 = "The page range is too narrow"
override val searchSpSuffix = ""
override val searchSf = "Disable default filters for:"
override val searchSfl = "Language"
override val searchSfu = "Uploader"
override val searchSft = "Tags"
override val selectImage = "Select image"
override val selectImageFirst = "Please select image first"
override val addToFavourites = "Add to favourites"
override val removeFromFavourites = "Remove from favourites"
override val deleteDownloads = "Delete downloads"
override val quickSearch = "Quick search"
override val quickSearchTip = "Tap \"+\" to add Quick Search"
override val addQuickSearchDialogTitle = "Add Quick Search"
override val translateTagForTagger = "Use tag translation"
override val nameIsEmpty = "Name is empty"
override val delete = "Delete"
override val addQuickSearchTip = "The state of gallery list will be saved as quick search. Perform a search first to save the state of search panel."
override val readme = "README"
override val imageSearchNotQuickSearch = "Can't add image search as quick search"
override val duplicateQuickSearch = { a: String -> "A duplicate quick search exists. The name is \"$a\"." }
override val duplicateName = "This name is already in use."
override val saveProgress = "Save progress"
override val deleteQuickSearch = { a: String -> "Delete quick search \"$a\"?" }
override val goToHint = { a: Int, b: Int -> "Page $a, total $b pages" }
override val any = "Any"
override val star2 = "2 stars"
override val star3 = "3 stars"
override val star4 = "4 stars"
override val star5 = "5 stars"
override val download = "Download"
override val read = "Read"
override val favoredTimes = { a: Int -> "\u2665 $a" }
override val ratingText = { a: String, b: Float, c: Int -> "%s (%.2f, %d)".format(a, b, c) }
override val torrentCount = { a: Int -> "Torrent ($a)" }
override val share = "Share"
override val rate = "Rate"
override val similarGallery = "Similar"
override val searchCover = "Search Cover"
override val noTags = "No tags"
override val noComments = "No comments"
override val noMoreComments = "No more comments"
override val moreComment = "More comments"
override val refresh = "Refresh"
override val viewOriginal = "View original image"
override val openInOtherApp = "Open with other app"
override val clearImageCache = "Clear image cache"
override val clearImageCacheConfirm = "Clear all cached images for this gallery?"
override val imageCacheCleared = "Image cache cleared"
override val rateSuccessfully = "Rate successfully"
override val rateFailed = "Rate failed"
override val noTorrents = "No torrents"
override val torrents = "Torrents"
override val notFavorited = "Not favorited"
override val addFavoritesDialogTitle = "Add to favorites"
override val addToFavoriteSuccess = "Added to favorites"
override val removeFromFavoriteSuccess = "Removed from favorites"
override val addToFavoriteFailure = "Failed to add to favorites"
override val removeFromFavoriteFailure = "Failed to remove from favorites"
override val filterTheUploader = { a: String -> "Block the uploader \"$a\"?" }
override val filterTheTag = { a: String -> "Block the tag \"$a\"?" }
override val filterAdded = "Blocker added"
override val newerVersionAvailable = "There are newer versions of this gallery available."
override val newerVersionTitle = { a: String, b: String -> "$a, added $b" }
override val rating10 = "MASTERPIECE"
override val rating9 = "AMAZING"
override val rating8 = "GREAT"
override val rating7 = "GOOD"
override val rating6 = "OKAY"
override val rating5 = "MEDIOCRE"
override val rating4 = "BAD"
override val rating3 = "AWFUL"
override val rating2 = "PAINFUL"
override val rating1 = "UNBEARABLE"
override val rating0 = "DISASTER"
override val ratingNone = "(´_ゝ`)"
override val galleryInfo = "Gallery Info"
override val copiedToClipboard = "Copied to clipboard"
override val keyGid = "GID"
override val keyToken = "Token"
override val keyUrl = "URL"
override val keyTitle = "Title"
override val keyTitleJpn = "Jpn Title"
override val keyThumb = "Thumb"
override val keyCategory = "Category"
override val keyUploader = "Uploader"
override val keyPosted = "Posted"
override val keyParent = "Parent"
override val keyVisible = "Visible"
override val keyLanguage = "Language"
override val keyPages = "Pages"
override val keySize = "Size"
override val keyFavoriteCount = "Favorite count"
override val keyFavorited = "Favorited"
override val keyRatingCount = "Rating count"
override val keyRating = "Rating"
override val keyTorrents = "Torrents"
override val keyTorrentUrl = "Torrent URL"
override val galleryComments = "Gallery Comments"
override val commentSuccessfully = "Comment post successfully"
override val commentFailed = "Failed to post the comment"
override val copyCommentText = "Copy comment text"
override val blockCommenter = "Block the commenter"
override val filterTheCommenter = { a: String -> "Block the commenter \"$a\"?" }
override val editComment = "Edit comment"
override val editCommentSuccessfully = "The comment has been edited"
override val editCommentFailed = "Failed to edit the comment"
override val voteUp = "Vote up"
override val cancelVoteUp = "Cancel up-vote"
override val voteDown = "Vote down"
override val cancelVoteDown = "Cancel down-vote"
override val voteUpSuccessfully = "Voted up successfully"
override val cancelVoteUpSuccessfully = "Cancel up-vote successfully"
override val voteDownSuccessfully = "Voted down successfully"
override val cancelVoteDownSuccessfully = "Down-vote cancelled successfully"
override val voteFailed = "Vote failed"
override val checkVoteStatus = "View vote details"
override val clickMoreComments = "Click to load more comments"
override val lastEdited = { a: String -> "Last edited: $a" }
override val goTo = "Go to"
override val sceneDownloadTitle = { a: String -> "Download - $a" }
override val noDownloadInfo = "Download items will be shown here"
override val downloadStateNone = "Idle"
override val downloadStateWait = "Waiting"
override val downloadStateDownloading = "Downloading"
override val downloadStateDownloaded = "Downloaded"
override val downloadStateFailed = "Failed"
override val downloadStateFailed2 = { a: Int -> "$a incomplete" }
override val downloadStateFinish = "Done"
override val stat509AlertTitle = "509 Alert"
override val stat509AlertText = "Image limit has been reached. Please stop download and have a relax."
override val statDownloadDoneTitle = "Download Finished"
override val statDownloadDoneTextSucceeded = { a: Int -> "$a succeeded" }
override val statDownloadDoneTextFailed = { a: Int -> "$a failed" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a succeeded, $b failed" }
override val statDownloadDoneLineSucceeded = { a: String -> "Succeeded: $a" }
override val statDownloadDoneLineFailed = { a: String -> "Failed: $a" }
override val downloadRemoveDialogTitle = "Remove Download Item"
override val downloadRemoveDialogMessage = { a: String -> "Remove $a from download list ?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "Remove $a items from download list ?" }
override val downloadRemoveDialogCheckText = "Delete image files"
override val statDownloadActionStopAll = "Stop all"
override val defaultDownloadLabelName = "Default"
override val downloadMoveDialogTitle = "Move"
override val downloadLabels = "Download labels"
override val downloadStartAll = "Start all"
override val downloadStopAll = "Stop all"
override val downloadResetReadingProgress = "Reset reading progress"
override val resetReadingProgressMessage = "Reset the reading progress of all downloaded galleries?"
override val downloadServiceLabel = "EhViewer Download Service"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a, $b left" }
override val rememberDownloadLabel = "Remember download label"
override val defaultDownloadLabel = "Default download label"
override val addedToDownloadList = "Added to download list"
override val selectGroupingMode = "Select Grouping Mode"
override val selectGroupingModeCustom = "Custom"
override val selectGroupingModeArtist = "Artist"
override val unknownArtists = "Unknown"
override val add = "Add"
override val newLabelTitle = "New label"
override val labelTextIsEmpty = "Label text is empty"
override val labelTextIsInvalid = "\"Default\" is an invalid label"
override val labelTextExist = "Label exists"
override val renameLabelTitle = "Rename label"
override val deleteLabel = { a: String -> "Delete label \"$a\"?" }
override val noHistory = "Viewed galleries will be shown here"
override val clearAll = "Clear all"
override val clearAllHistory = "Clear all history?"
override val filter = "Blockers"
override val filterTitle = "Title"
override val filterUploader = "Uploader"
override val filterTag = "Tag"
override val filterTagNamespace = "Tag namespace"
override val filterCommenter = "Commenter"
override val filterComment = "Comment Regex"
override val deleteFilter = { a: String -> "Delete blocker \"$a\"?" }
override val addFilter = "Add blocker"
override val showDefinition = "Show definition"
override val filterText = "Blocker text"
override val filterTip = "This blocking system filters the result of EHentai website blocking system.\n\nTitle Blocker: exclude the gallery whose title contains the word.\n\nUploader Blocker: exclude the gallery which was uploaded by the uploader.\n\nTag Blocker: exclude the gallery which contain the tag, it takes more time to get gallery list.\n\nTag Namespace Blocker: exclude the gallery which contain the tag namespace, it takes more time to get gallery list.\n\nCommenter Blocker: exclude the comments posted by the commenter.\n\nComment Blocker: exclude the comments matching the regex."
override val uConfig = "EHentai settings"
override val applyTip = "Tap the check mark to save the settings"
override val myTags = "My tags"
override val shareImage = "Share image"
override val imageSaved = { a: String -> "Image saved to $a" }
override val settingsEh = "EH"
override val settingsEhSignOut = "Sign out"
override val settingsEhIdentityCookiesSigned = "Identity cookies can be used to sign in to this account.<br><b>KEEP IT SAFE</b>"
override val settingsEhIdentityCookiesGuest = "Guest mode"
override val settingsEhClearIgneous = "Clear igneous"
override val settingsUConfig = "EHentai settings"
override val settingsUConfigSummary = "Settings on EHentai website"
override val settingsMyTags = "My tags"
override val settingsMyTagsSummary = "My tags on EHentai website"
override val settingsEhGallerySite = "Gallery site"
override val settingsEhLaunchPage = "Launch page"
override val settingsEhListMode = "List mode"
override val settingsEhListModeDetail = "Detail"
override val settingsEhListModeThumb = "Thumb"
override val settingsEhDetailSize = "Detail width"
override val settingsEhDetailSizeLong = "Long"
override val settingsEhDetailSizeShort = "Short"
override val settingsEhThumbColumns = "Thumb columns"
override val settingsEhForceEhThumb = "Use e-hentai thumbnail server"
override val settingsEhForceEhThumbSummary = "Try disabling this if you have trouble loading thumbnails"
override val settingsEhShowJpnTitle = "Show Japanese title"
override val settingsEhShowJpnTitleSummary = "Require enabling Japanese Title in Settings on EHentai website"
override val settingsEhShowGalleryPages = "Show gallery pages"
override val settingsEhShowGalleryPagesSummary = "Display the number of pages in the gallery list"
override val settingsEhShowVoteStatus = "Show tag vote status"
override val settingsEhShowGalleryComments = "Show gallery comments"
override val settingsEhShowGalleryCommentsSummary = "Show comments on the gallery details page"
override val settingsEhShowGalleryCommentThreshold = "Comment score threshold"
override val settingsEhShowGalleryCommentThresholdSummary = "Hide comments at or below this score (-101 disables)"
override val settingsEhShowTagTranslations = "Show tag translations"
override val settingsEhShowTagTranslationsSummary = "Show tag translations instead of the original text (It takes time to download the data file)"
override val settingsEhTagTranslationsSource = "Placeholder"
override val settingsEhTagTranslationsSourceUrl = "https://placeholder"
override val settingsEhFilter = "Blockers"
override val settingsEhFilterSummary = "Block gallery or comment by title, uploader, tags and commenter"
override val settingsReadReverseControls = "Reverse physical key controls"
override val settingsBlockExtraneousAds = "[Experimental] Block extraneous ads"
override val settingsAdsPlaceholder = "[Optional] Pick placeholder to replace ads"
override val settingsDownload = "Download"
override val settingsDownloadDownloadLocation = "Download location"
override val settingsDownloadCantGetDownloadLocation = "Can't get download location"
override val settingsDownloadMediaScan = "Allow media scan"
override val settingsDownloadMediaScanSummaryOn = "Please hide your gallery apps away from other people"
override val settingsDownloadMediaScanSummaryOff = "Most gallery apps will ignore pictures in the download path"
override val settingsDownloadConcurrency = "Concurrency download"
override val settingsDownloadConcurrencySummary = { a: Int -> "Up to $a images" }
override val settingsDownloadDownloadDelay = "Download delay"
override val settingsDownloadDownloadDelaySummary = { a: Int -> "Delay $a ms per download" }
override val settingsDownloadDownloadTimeout = "Download timeout (in seconds)"
override val settingsDownloadPreloadImage = "Preload image"
override val settingsDownloadPreloadImageSummary = { a: Int -> "Preload next $a image" }
override val settingsDownloadDownloadOriginImage = "Download original image"
override val settingsDownloadDownloadOriginImageSummary = "Caution! May require GP"
override val settingsDownloadSaveAsCbz = "Save as CBZ archive"
override val settingsDownloadArchiveMetadata = "Archive metadata"
override val settingsDownloadArchiveMetadataSummary = "Generate ComicInfo.xml on archive download"
override val settingsDownloadReloadMetadata = "Reload metadata"
override val settingsDownloadReloadMetadataSummary = "Regenerate the ComicInfo.xml for download items whose tags may have changed"
override val settingsDownloadReloadMetadataSuccessfully = { a: Int -> "Reload $a items successfully" }
override val settingsDownloadReloadMetadataFailed = { a: String -> "Reload metadata failed: $a" }
override val settingsDownloadRestoreDownloadItems = "Restore download items"
override val settingsDownloadRestoreDownloadItemsSummary = "Restore all download items in download location"
override val settingsDownloadRestoreNotFound = "Not found download items to restore"
override val settingsDownloadRestoreFailed = "Restore failed"
override val settingsDownloadRestoreSuccessfully = { a: Int -> "Restore $a items successfully" }
override val settingsDownloadCleanRedundancy = "Clear download redundancy"
override val settingsDownloadCleanRedundancySummary = "Remove gallery images which are not in download list but in download location"
override val settingsDownloadCleanRedundancyNoRedundancy = "No redundancy"
override val settingsDownloadCleanRedundancyDone = { a: Int -> "Redundancy cleaning completed, clean-up $a items totally" }
override val settingsAdvanced = "Advanced"
override val settingsAdvancedSaveParseErrorBody = "Save HTML content when parsing error"
override val settingsAdvancedSaveParseErrorBodySummary = "Html content may be privacy-sensitive"
override val settingsAdvancedSaveCrashLog = "Save crash log when app crashes"
override val settingsAdvancedSaveCrashLogSummary = "Crash logs help developers fix bugs"
override val settingsAdvancedDumpLogcat = "Dump logcat"
override val settingsAdvancedDumpLogcatSummary = "Save logcat to external storage"
override val settingsAdvancedDumpLogcatFailed = "Dump logcat failed"
override val settingsAdvancedDumpLogcatTo = { a: String -> "Logcat dumped to $a" }
override val settingsAdvancedReadCacheSize = "Read cache size"
override val settingsAdvancedAppLanguageTitle = "App language"
override val settingsAdvancedHardwareBitmapThreshold = "Hardware bitmap (better performance) threshold"
override val settingsAdvancedHardwareBitmapThresholdSummary = "Try decreasing this if long images fail to load"
override val settingsAdvancedExportData = "Export data"
override val settingsAdvancedExportDataSummary = "Save data like download list, quick search list, to external storage"
override val settingsAdvancedExportDataTo = { a: String -> "Exported data to $a" }
override val settingsAdvancedExportDataFailed = "Failed to export data"
override val settingsAdvancedImportData = "Import data"
override val settingsAdvancedImportDataSummary = "Load data which were previously saved"
override val settingsAdvancedImportDataSuccessfully = "Data imported"
override val settingsAdvancedBackupFavorite = "Backup favorite list"
override val settingsAdvancedBackupFavoriteSummary = "Backup remote favorite list to local"
override val settingsAdvancedBackupFavoriteStart = { a: String -> "Backing up favorite list $a" }
override val settingsAdvancedBackupFavoriteNothing = "Nothing to backup"
override val settingsAdvancedBackupFavoriteSuccess = "Backup favorite list success"
override val settingsAdvancedBackupFavoriteFailed = "Backup favorite list failed"
override val settingsAbout = "About"
override val settingsAboutDeclaration = "EhViewer"
override val settingsAboutDeclarationSummary = "EhViewer is not affiliated with E-Hentai.org in any way"
override val settingsAboutAuthor = "Author"
override val settingsAboutAuthorSummary = buildAnnotatedString {
withStyle(SpanStyle(textDecoration = TextDecoration.Underline)) {
appendLine("Hippo")
appendLine("NekoInverter")
appendLine("飛鳥澪")
}
append("Foolbar")
}
override val settingsAboutLatestRelease = "Latest release"
override val settingsAboutSource = "Source"
override val settingsAboutVersion = "Build version"
override val settingsAboutCommitTime = { a: String -> "Committed at $a" }
override val settingsAboutCheckForUpdates = "Check for updates"
override val license = "License"
override val cantReadTheFile = "Can't read the file"
override val appLanguageSystem = "System Language (Default)"
override val pleaseWait = "Please wait"
override val cloudFavorites = "Cloud Favorites"
override val localFavorites = "Local Favorites"
override val searchBarHint = { a: String -> "Search $a" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $b" }
override val deleteFavoritesDialogTitle = "Delete from favorites"
override val deleteFavoritesDialogMessage = { a: Int -> "Delete $a items from favorites?" }
override val moveFavoritesDialogTitle = "Move favorites"
override val defaultFavoritesCollection = "Default favorites collection"
override val defaultFavoritesWarning = "You won't be able to add favorite notes if you enable this"
override val letMeSelect = "Let me select"
override val favoriteNote = "Favorite Note"
override val collections = "Collections"
override val errorSomethingWrongHappened = "Something wrong happened"
override val fromTheFuture = "From the future"
override val justNow = "Just now"
override val yesterday = "Yesterday"
override val someDaysAgo = { a: Int -> "$a days ago" }
override val archive = "Archive"
override val archiveFree = "Free"
override val archiveOriginal = "Original"
override val archiveResample = "Resample"
override val noArchives = "No Archives"
override val downloadArchiveStarted = "Archive download started"
override val downloadArchiveFailure = "Failed to download archive"
override val downloadArchiveFailureNoHath = "Need H@H client for archive download"
override val currentFunds = "Current Funds:"
override val insufficientFunds = "Insufficient Funds"
override val imageLimits = "Image Limits"
override val imageLimitsSummary = "Used:"
override val imageLimitsNormal = "No restrictions"
override val imageLimitsRestricted = "Image resolution restricted to 1280x"
override val resetCost = { a: Int -> "Spend $a GP to reset" }
override val reset = "Reset"
override val settingsPrivacy = "Privacy"
override val settingsPrivacySecure = "Prevent screenshots"
override val settingsPrivacySecureSummary = "Prevent the content of the app from being taken screenshots of or shown in the \"Recent Apps\" list."
override val clearSearchHistory = "Clear device search history"
override val clearSearchHistorySummary = "Remove searches you have performed from this device"
override val clearSearchHistoryConfirm = "Clear search history?"
override val searchHistoryCleared = "Search history cleared"
override val downloadService = "Download Service"
override val keyFavoriteName = "Favorite"
override val darkTheme = "Dark theme"
override val blackDarkTheme = "Black dark theme"
override val harmonizeCategoryColor = "Harmonize category color for Dynamic Color"
override val sortBy = "Sort by"
override val addedTimeDesc = "Added time (descending)"
override val addedTimeAsc = "Added time (ascending)"
override val uploadedTimeDesc = "Uploaded time (descending)"
override val uploadedTimeAsc = "Uploaded time (ascending)"
override val titleAsc = "Title (ascending)"
override val titleDesc = "Title (descending)"
override val pageCountAsc = "Page count (ascending)"
override val pageCountDesc = "Page count (descending)"
override val groupByDownloadLabel = "Group by download label"
override val downloadFilter = "Filter"
override val downloadAll = "All"
override val downloadStartAllReversed = "Start all (reversed)"
override val noBrowserInstalled = "Just install a browser please."
override val toplistAlltime = "All-Time"
override val toplistPastyear = "Past Year"
override val toplistPastmonth = "Past Month"
override val toplistYesterday = "Yesterday"
override val toplist = "Toplist"
override val tagVoteDown = "Vote down"
override val tagVoteUp = "Vote up"
override val tagVoteWithdraw = "Withdraw vote"
override val tagVoteSuccessfully = "Vote successfully"
override val deleteSearchHistory = { a: String -> "Delete \"$a\" from search history?" }
override val actionAddTag = "Add tag"
override val actionAddTagTip = "Enter new tags"
override val commentUserUploader = { a: String -> "$a (Uploader)" }
override val noNetwork = "No network"
override val settingsEhMeteredNetworkWarning = "Metered network warning"
override val meteredNetworkWarning = "Connected to metered networks"
override val readFrom = { a: Int -> "Read page $a" }
override val settingsEhRequestNews = "Timed request news page"
override val settingsEhHideHvEvents = "Hide HV event Notifications"
override val copyTrans = "Copy translation"
override val defaultDownloadDirNotEmpty = "The default download directory is not empty!"
override val resetDownloadLocation = "Reset to default"
override val pickNewDownloadLocation = "Pick a new location"
override val dontShowAgain = "Don\'t show again"
override val openSettings = "Open settings"
override val appLinkNotVerifiedMessage = "For Android 12 and newer, you need to manually add link to verified links in order to open E-Hentai links in EhViewer."
override val appLinkNotVerifiedTitle = "App links not verified"
override val openByDefault = "Open by default"
override val backupBeforeUpdate = "Backup data before update"
override val useCiUpdateChannel = "Use CI update channel"
override val settingsPrivacyRequireUnlock = "Require Unlock"
override val settingsPrivacyRequireUnlockDelay = "Lock Delay"
override val settingsPrivacyRequireUnlockDelaySummary = { a: Int -> "No unlock is required when leaving App and returning within $a minute(s)" }
override val settingsPrivacyRequireUnlockDelaySummaryImmediately = "Unlock is required whenever you return to this App"
override val filterLabel = "Blocker Type"
override val archivePasswd = "password"
override val archiveNeedPasswd = "Archive need password"
override val passwdWrong = "Password Wrong"
override val passwdCannotBeEmpty = "Password can't be empty"
override val listTileThumbSize = "Thumb size in detail mode"
override val accountName = "Account"
override val preloadThumbAggressively = "Preload thumbs aggressively"
override val animateItems = "List item animations"
override val animateItemsSummary = "Try disabling this if you are facing crashes / frame drops"
override val autoUpdates = "Automatically check for updates"
override val updateFrequencyNever = "Never"
override val updateFrequencyDaily = "Daily"
override val updateFrequency3days = "Every 3 days"
override val updateFrequencyWeekly = "Weekly"
override val updateFrequencyBiweekly = "Biweekly"
override val updateFrequencyMonthly = "Monthly"
override val updateFailed = { a: String -> "Update failed: $a" }
override val newVersionAvailable = "New version available!"
override val alreadyLatestVersion = "Already the latest version"
override val permissionDenied = "Permission denied"
override val downloadGalleryFirst = "Please download the gallery first!"
override val exportAsArchive = "Export as archive"
override val exportAsArchiveSuccess = "Export succeed"
override val exportAsArchiveFailed = "Export failed"
override val prefCropBorders = "Crop borders"
override val actionSettings = "Settings"
override val prefRotationType = "Default rotation type"
override val viewer = "Reading mode"
override val actionMenu = "Menu"
override val navZonePrev = "Prev"
override val navZoneNext = "Next"
override val navZoneLeft = "Left"
override val navZoneRight = "Right"
override val decodeImageError = "The image couldn't be loaded"
override val actionRetry = "Retry"
override val labelDefault = "Default"
override val rotationFree = "Free"
override val rotationPortrait = "Portrait"
override val rotationReversePortrait = "Reverse portrait"
override val rotationLandscape = "Landscape"
override val rotationForcePortrait = "Locked portrait"
override val rotationForceLandscape = "Locked landscape"
override val leftToRightViewer = "Left to right"
override val rightToLeftViewer = "Right to left"
override val verticalViewer = "Vertical"
override val webtoonViewer = "Webtoon"
override val verticalPlusViewer = "Continuous vertical"
override val pagerViewer = "Paged"
override val prefFullscreen = "Fullscreen"
override val prefCutoutShort = "Show content in cutout area"
override val prefPageTransitions = "Animate page transitions"
override val prefShowPageNumber = "Show page number"
override val prefShowReaderSeekbar = "Show page jumping seekbar"
override val prefDoubleTapToZoom = "Double tap to zoom"
override val prefCustomBrightness = "Custom brightness"
override val prefGrayscale = "Grayscale"
override val prefInvertedColors = "Inverted"
override val prefCustomColorFilter = "Custom color filter"
override val prefColorFilterMode = "Color filter blend mode"
override val filterModeMultiply = "Multiply"
override val filterModeScreen = "Screen"
override val filterModeOverlay = "Overlay"
override val filterModeLighten = "Dodge / Lighten"
override val filterModeDarken = "Burn / Darken"
override val prefKeepScreenOn = "Keep screen on"
override val prefReadWithTappingInverted = "Invert tap zones"
override val tappingInvertedNone = "None"
override val tappingInvertedHorizontal = "Horizontal"
override val tappingInvertedVertical = "Vertical"
override val tappingInvertedBoth = "Both"
override val prefReadWithLongTap = "Show on long tap"
override val prefReaderTheme = "Background color"
override val whiteBackground = "White"
override val grayBackground = "Gray"
override val blackBackground = "Black"
override val automaticBackground = "Auto"
override val lNav = "L shaped"
override val kindlishNav = "Kindle-ish"
override val edgeNav = "Edge"
override val rightAndLeftNav = "Right and Left"
override val disabledNav = "Disabled"
override val prefViewerNav = "Tap zones"
override val prefImageScaleType = "Scale type"
override val scaleTypeFitScreen = "Fit screen"
override val scaleTypeStretch = "Stretch"
override val scaleTypeFitWidth = "Fit width"
override val scaleTypeFitHeight = "Fit height"
override val scaleTypeOriginalSize = "Original size"
override val scaleTypeSmartFit = "Smart fit"
override val prefNavigatePan = "Pan wide images when tapping"
override val prefLandscapeZoom = "Zoom landscape image"
override val prefZoomStart = "Zoom start position"
override val zoomStartAutomatic = "Automatic"
override val zoomStartLeft = "Left"
override val zoomStartRight = "Right"
override val zoomStartCenter = "Center"
override val rotationType = "Rotation type"
override val prefCategoryReadingMode = "Reading mode"
override val prefWebtoonSidePadding = "Side padding"
override val webtoonSidePadding0 = "None"
override val webtoonSidePadding5 = "5%"
override val webtoonSidePadding10 = "10%"
override val webtoonSidePadding15 = "15%"
override val webtoonSidePadding20 = "20%"
override val webtoonSidePadding25 = "25%"
override val prefCategoryGeneral = "General"
override val customFilter = "Custom filter"
override val actionShare = "Share"
override val actionCopy = "Copy"
override val actionSave = "Save"
override val actionSaveTo = "Save to…"
override val wideColorGamut = "Use Display P3 color space"
override val settingsEhRequestNewsTimepicker = "Set time to request news"
override val darkThemeFollowSystem = "Follow system"
override val darkThemeOff = "Always off"
override val darkThemeOn = "Always on"
override val blockedImage = "Blocked image"
override val showBlockedImage = "Show blocked image"
override val pageCount = { quantity: Int ->
when (quantity) {
1 -> "$quantity page"
else -> "$quantity pages"
}
}
override val someMinutesAgo = { quantity: Int ->
when (quantity) {
1 -> "A minute ago"
else -> "$quantity minutes ago"
}
}
override val someHoursAgo = { quantity: Int ->
when (quantity) {
1 -> "An hour ago"
else -> "$quantity hours ago"
}
}
override val second = { quantity: Int ->
when (quantity) {
1 -> "sec"
else -> "secs"
}
}
override val minute = { quantity: Int ->
when (quantity) {
1 -> "min"
else -> "mins"
}
}
override val hour = { quantity: Int ->
when (quantity) {
1 -> "hour"
else -> "hours"
}
}
override val day = { quantity: Int ->
when (quantity) {
1 -> "day"
else -> "days"
}
}
override val year = { quantity: Int ->
when (quantity) {
1 -> "year"
else -> "years"
}
}
}
@@ -0,0 +1,345 @@
package com.hippo.ehviewer.ui.i18n
object EsTranslations : Translations by EnTranslations {
override val homepage = "Página de inicio"
override val subscription = "Suscripción"
override val whatsHot = "Destacado"
override val favourite = "Favoritos"
override val history = "Historial"
override val downloads = "Descargas"
override val settings = "Configuración"
override val username = "Usuario"
override val password = "Contraseña"
override val signIn = "Iniciar sesión"
override val register = "Registrarse"
override val signInViaWebview = "Iniciar sesión vía web"
override val signInFirst = "Por favor, inicie sesión primero"
override val textIsEmpty = "El texto está vacío"
override val waring = "Advertencia"
override val invalidDownloadLocation = "Parece que la ubicación de descarga no está disponible. Establece la ubicación en Configuración."
override val errorTimeout = "Sin tiempo"
override val errorUnknownHost = "Host desconocido"
override val errorRedirection = "Demasiadas redirecciones"
override val errorSocket = "Error de Red"
override val errorUnknown = "Raro"
override val errorCantFindActivity = "No se encuentra la aplicación"
override val errorCannotParseTheUrl = "No se puede analizar el URL"
override val errorDecodingFailed = "Decodificación fallida"
override val errorReadingFailed = "Lectura Fallida"
override val errorOutOfRange = "Fuera de rango"
override val errorParseError = "Análisis erróneo"
override val error509 = "509"
override val errorInvalidUrl = "Url invalida"
override val errorGetPtokenError = "Error al obtener token"
override val errorCantSaveImage = "Imposible guardar la imagen"
override val errorInvalidNumber = "Número invalido"
override val appWaring = "El contenido de esta aplicación es de Internet. Algunas de ellas pueden causarle daño psicológico. Ahora sabes los riesgos anteriormente mencionado y te gustaría asumirlos"
override val errorUsernameCannotEmpty = "El usuario no puede estar vacío"
override val guestMode = "Saltar inicio de sesión"
override val signInFailed = "Inicio de sesión fallido"
override val getIt = "Entendido"
override val galleryListSearchBarHintExhentai = "Buscar ExHentai"
override val galleryListSearchBarHintEHentai = "Buscar E-Hentai"
override val galleryListEmptyHit = "El mundo es grande y el panda está sentado solo"
override val keywordSearch = "Búsqueda por palabras clave"
override val imageSearch = "Búsqueda de imagen"
override val searchImage = "Búsqueda de imágenes"
override val searchSh = "Mostrar galerías borradas"
override val searchSto = "Mostrar solo galerías con torrents"
override val searchSr = "Valoración mínima"
override val selectImage = "Seleccionar imagen"
override val selectImageFirst = "Seleccione la imagen primero"
override val searchSpTo = "hasta"
override val searchSf = "Deshabilitar filtros para:"
override val searchSfl = "Lenguaje"
override val searchSfu = "Uploader"
override val searchSft = "Etiqueta"
override val quickSearch = "Búsqueda rápida"
override val quickSearchTip = "Pulsar \"+\" para añadir a la búsqueda rápida"
override val addQuickSearchDialogTitle = "Añadir búsqueda rápida"
override val nameIsEmpty = "Nombre vacío"
override val addQuickSearchTip = "El estado de la lista de galerías se guardará como búsqueda rápida. Aplique la búsqueda primero si desea guardar el estado del panel de búsqueda."
override val readme = "LÉEME"
override val imageSearchNotQuickSearch = "No se puede añadir la búsqueda de imágenes como búsqueda rápida"
override val duplicateQuickSearch = { a: String -> "Búsqueda rápida duplicada. El nombre es \"$a\"." }
override val duplicateName = "Nombre duplicado existente"
override val goToHint = { a: Int, b: Int -> "Página $a, total $b páginas" }
override val star2 = "2 estrellas"
override val star3 = "3 estrellas"
override val star4 = "4 estrellas"
override val star5 = "5 estrellas"
override val download = "Descargar"
override val read = "Leer"
override val favoredTimes = { a: Int -> "\u2665 $a" }
override val ratingText = { a: String, b: Float, c: Int -> "%s (%.2f, %d)".format(a, b, c) }
override val torrentCount = { a: Int -> "Torrent ($a)" }
override val share = "Compartir"
override val rate = "Valorar"
override val similarGallery = "Similar"
override val searchCover = "Buscar portada"
override val noTags = "Sin etiquetas"
override val noComments = "Sin comentarios"
override val noMoreComments = "No hay más comentarios"
override val moreComment = "Más comentarios"
override val refresh = "Actualizar"
override val openInOtherApp = "Abrir en otra aplicación"
override val rateSuccessfully = "Valoración completada"
override val rateFailed = "Valoración fallida"
override val noTorrents = "Sin torrents"
override val torrents = "Torrents"
override val notFavorited = "No en favoritos"
override val addFavoritesDialogTitle = "Añadir a favoritos - Elige categoría"
override val removeFromFavoriteSuccess = "Eliminado de favoritos"
override val addToFavoriteFailure = "No se ha podido agregar a favoritos"
override val removeFromFavoriteFailure = "Error al borrar de favoritos"
override val rating10 = "OBRA MAESTRA"
override val rating9 = "ASOMBROSO"
override val rating8 = "GRANDIOSO"
override val rating7 = "BUENO"
override val rating6 = "DECENTE"
override val rating5 = "MEDIOCRE"
override val rating4 = "MALO"
override val rating3 = "HORRIBLE"
override val rating2 = "DOLOROSO"
override val rating1 = "INSORPOTABLE"
override val rating0 = "DESASTRE"
override val galleryInfo = "Información de la galería"
override val copiedToClipboard = "Copiado al portapapeles"
override val keyGid = "Guía"
override val keyToken = "Clave"
override val keyUrl = "URL"
override val keyTitle = "Título"
override val keyTitleJpn = "Título en japonés"
override val keyThumb = "Miniatura"
override val keyCategory = "Categoría"
override val keyUploader = "Uploader"
override val keyPosted = "Publicado"
override val keyParent = "Padre"
override val keyVisible = "Visible"
override val keyLanguage = "Idioma"
override val keyPages = "Páginas"
override val keySize = "Tamaño"
override val keyFavoriteCount = "Número de favoritos"
override val keyFavorited = "Favorito"
override val keyRatingCount = "Número de valoraciones"
override val keyRating = "Valoración"
override val keyTorrents = "Torrents"
override val keyTorrentUrl = "Url de torrent"
override val galleryComments = "Comentarios de la galería"
override val commentSuccessfully = "Comentario publicado"
override val copyCommentText = "Copiar texto de comentario"
override val voteUp = "Votar positivo"
override val cancelVoteUp = "Cancelar voto"
override val voteDown = "Votar negativo"
override val voteUpSuccessfully = "Voto positivo completado"
override val cancelVoteUpSuccessfully = "Voto cancelado"
override val voteDownSuccessfully = "Voto negativo completado"
override val cancelVoteDownSuccessfully = "Voto cancelado"
override val voteFailed = "Voto fallido"
override val checkVoteStatus = "Verificar estado del voto"
override val goTo = "Ir a"
override val sceneDownloadTitle = { a: String -> "Descargas - $a" }
override val noDownloadInfo = "Las galerías descargadas se mostrarán acá"
override val downloadStateWait = "Esperando"
override val downloadStateDownloading = "Descargando"
override val downloadStateDownloaded = "Descargado"
override val downloadStateFailed2 = { a: Int -> "$a incompleto" }
override val downloadStateFinish = "Completado"
override val stat509AlertTitle = "Alerta 509"
override val stat509AlertText = "Se alcanzó el límite de imágenes. Detenga la descarga y espere un poco"
override val statDownloadDoneTitle = "Descarga completada"
override val statDownloadDoneTextSucceeded = { a: Int -> "$a completada" }
override val statDownloadDoneTextFailed = { a: Int -> "$a fallido" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a completado, $b fallido" }
override val statDownloadDoneLineSucceeded = { a: String -> "Completado: $a" }
override val statDownloadDoneLineFailed = { a: String -> "Fallido: $a" }
override val downloadRemoveDialogTitle = "Borrar galería descargada"
override val downloadRemoveDialogMessage = { a: String -> "¿Borrar $a de la lista de descargas?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "¿Borrar $a galerías de la lista de descargas?" }
override val downloadRemoveDialogCheckText = "Borrar imágenes"
override val downloadResetReadingProgress = "Reiniciar progreso de lectura"
override val resetReadingProgressMessage = "¿Deseas reiniciar el progreso de lectura en todas las galerías?"
override val statDownloadActionStopAll = "Detener todo"
override val defaultDownloadLabelName = "Predeterminado"
override val downloadMoveDialogTitle = "Mover"
override val downloadLabels = "Descargar etiquetas"
override val downloadStartAll = "Iniciar todo"
override val downloadStopAll = "Detener todo"
override val downloadServiceLabel = "Servicio de descarga EhViewer"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a, $b restantes" }
override val rememberDownloadLabel = "Recordar etiqueta de descarga"
override val defaultDownloadLabel = "Etiqueta predeterminada de descarga"
override val addedToDownloadList = "Añadido a la lista de descargas"
override val add = "Añadir"
override val newLabelTitle = "Nueva etiqueta"
override val labelTextIsEmpty = "Nombre de la etiqueta vacía"
override val labelTextIsInvalid = "\"Defecto\" es una etiqueta invalida"
override val labelTextExist = "Etiqueta existente"
override val renameLabelTitle = "Renombrar etiqueta"
override val noHistory = "Las galerías visualizadas se muestran aquí"
override val clearAllHistory = "¿Limpiar historial?"
override val shareImage = "Compartir imagen"
override val imageSaved = { a: String -> "Imagen guardada en $a" }
override val settingsEh = "EH"
override val settingsEhSignOut = "Cerrar sesión"
override val settingsUConfig = "Configuración de EHentai"
override val settingsUConfigSummary = "Configurar en la página de EHentai"
override val settingsMyTags = "Mis etiquetas"
override val settingsMyTagsSummary = "Ver página de etiquetas en EHentai"
override val settingsEhLaunchPage = "Página al iniciar aplicación"
override val settingsEhGallerySite = "Seleccionar galería"
override val settingsEhListMode = "Modo lista"
override val settingsEhListModeDetail = "Con detalles"
override val settingsEhListModeThumb = "Solo portada"
override val settingsEhDetailSize = "Tamaño del detalle"
override val settingsEhDetailSizeLong = "Largo"
override val settingsEhDetailSizeShort = "Corto"
override val settingsEhShowJpnTitle = "Mostrar títulos en japonés"
override val settingsEhShowJpnTitleSummary = "Es necesario habilitar los títulos en japonés en la propia página de EHentai"
override val settingsEhShowGalleryPages = "Mostrar número de páginas de la galería"
override val settingsEhShowGalleryPagesSummary = "Se verá cuántas páginas tiene una galería"
override val settingsEhFilter = "Filtrado de galerías"
override val settingsEhFilterSummary = "Filtrado de galerías por título, uploader y etiquetas. Para más detalles presiona el ícono (i) en la parte superior del menú"
override val settingsDownload = "Descargas"
override val settingsDownloadDownloadLocation = "Ruta de descargas"
override val settingsDownloadCantGetDownloadLocation = "No se puede obtener ruta de descargas"
override val settingsDownloadMediaScan = "Permitir escaneo de medios"
override val settingsDownloadMediaScanSummaryOn = "Las galerías de imágenes mostrarán los doujinshis/mangas descargados. ¡Cuidado con prestar tu móvil o tablet!"
override val settingsDownloadMediaScanSummaryOff = "Las de galería de imágenes no mostrarán los doujinshis/mangas descargados"
override val settingsDownloadConcurrency = "Multi-hilos al descargar"
override val settingsDownloadConcurrencySummary = { a: Int -> "Máximo de $a imágenes" }
override val settingsDownloadPreloadImage = "Precargar imagen"
override val settingsDownloadPreloadImageSummary = { a: Int -> "Precargar las siguientes $a imágenes" }
override val settingsDownloadDownloadOriginImage = "Descargar imagen original"
override val settingsDownloadDownloadOriginImageSummary = "¡Cuidado! Podrías recibir error 509"
override val settingsDownloadRestoreDownloadItems = "Restaurar los elementos de descarga"
override val settingsDownloadRestoreDownloadItemsSummary = "Restaurar todos los elementos de descarga en la ruta de descarga"
override val settingsDownloadRestoreNotFound = "No se han encontrado elementos para restaurar"
override val settingsDownloadRestoreFailed = "Restauración fallida"
override val settingsDownloadRestoreSuccessfully = { a: Int -> "Restauración de $a elementos completados" }
override val settingsDownloadCleanRedundancy = "Borrar imágenes sobrantes"
override val settingsDownloadCleanRedundancySummary = "Elimina las imágenes almacenadas en la ruta de descarga que no se encuentran en la lista de descarga"
override val settingsDownloadCleanRedundancyNoRedundancy = "Sin imágenes para borrar"
override val settingsDownloadCleanRedundancyDone = { a: Int -> "Borrado de imágenes completada, un total de $a elementos borrados" }
override val settingsAdvanced = "Avanzado"
override val settingsAdvancedSaveParseErrorBody = "Guardar contenido en HTML al analizar el error"
override val settingsAdvancedSaveParseErrorBodySummary = "El contenido HTML puede ser sensible a la privacidad"
override val settingsAdvancedDumpLogcat = "Guardado de logcat"
override val settingsAdvancedDumpLogcatSummary = "Guardar logcat en almacenamiento externo"
override val settingsAdvancedDumpLogcatFailed = "Guardado de logcat fallido"
override val settingsAdvancedDumpLogcatTo = { a: String -> "Logcat guardado en $a" }
override val settingsAdvancedReadCacheSize = "Tamaño del caché (archivos temporales)"
override val settingsAdvancedAppLanguageTitle = "Idioma de la aplicación"
override val settingsAdvancedExportData = "Exportar datos"
override val settingsAdvancedExportDataSummary = "Guardar datos en almacenamiento externo, tales como la lista de descarga, lista de búsqueda rápida, entre otros"
override val settingsAdvancedExportDataTo = { a: String -> "Datos exportados en $a" }
override val settingsAdvancedExportDataFailed = "Exportación de datos fallido"
override val settingsAdvancedImportData = "Importar datos"
override val settingsAdvancedImportDataSummary = "Cargar datos que han sido guardado antes"
override val settingsAdvancedImportDataSuccessfully = "Importación de datos completo"
override val settingsAbout = "Acerca de"
override val settingsAboutAuthor = "Autor"
override val settingsAboutSource = "Código fuente"
override val settingsAboutVersion = "Versión de compilación"
override val settingsAboutCheckForUpdates = "Verificar actualizaciones"
override val cantReadTheFile = "No se puede leer el archivo"
override val appLanguageSystem = "Lenguaje del sistema (Defecto)"
override val pleaseWait = "Espere"
override val cloudFavorites = "Favoritos en la nube"
override val localFavorites = "Favoritos locales"
override val searchBarHint = { a: String -> "Buscar $a" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $b" }
override val deleteFavoritesDialogTitle = "Eliminar de favoritos"
override val deleteFavoritesDialogMessage = { a: Int -> "¿Eliminar $a galerías de favoritos?" }
override val moveFavoritesDialogTitle = "Mover favoritos"
override val defaultFavoritesCollection = "Colección de favoritos por defecto"
override val letMeSelect = "Déjame elegir"
override val collections = "Colección"
override val fromTheFuture = "Desde el futuro"
override val justNow = "Ahora"
override val yesterday = "Ayer"
override val someDaysAgo = { a: Int -> "Hace $a días atrás" }
override val archive = "Archivo"
override val noArchives = "Sin archivos"
override val downloadArchiveStarted = "Descarga de archivos iniciada"
override val downloadArchiveFailure = "Error al descargar archivo"
override val downloadArchiveFailureNoHath = "Necesita un cliente H@H para descargar archivo"
override val addToFavoriteSuccess = "Añadido a favoritos"
override val addToFavourites = "Agregar a favoritos"
override val cancelVoteDown = "Cancelar voto negativo"
override val clearAll = "Limpiar todo"
override val commentFailed = "Comentario fallido"
override val delete = "Eliminar"
override val downloadStateFailed = "Descarga fallida"
override val downloadStateNone = "Descarga en pausa"
override val errorPasswordCannotEmpty = "La contraseña no puede estar vacía"
override val errorSomethingWrongHappened = "Ocurrió algo malo"
override val settingsPrivacy = "Privacidad"
override val filter = "Bloqueo de galerías"
override val filterTitle = "Título"
override val filterUploader = "Uploader"
override val filterTag = "Etiqueta"
override val filterTagNamespace = "Etiqueta namespace"
override val deleteFilter = { a: String -> "¿Borrar \"$a\"?" }
override val addFilter = "Bloquear etiqueta"
override val filterTheTag = { a: String -> "¿Deseas bloquear la etiqueta \"$a\"?" }
override val showDefinition = "Ver definición de la etiqueta"
override val filterAdded = "Etiqueta bloqueada"
override val filterText = "Escribe la etiqueta"
override val filterTip = "Este sistema de bloqueo filtrará las galerías de EHentai que contengan la etiqueta especificada acá.\n\nBloqueo de título: excluye las galerías cuyo título contenga la palabra.\n\nBloqueo de uploader: Excluye las galerías que publicadas por el uploader.\n\nBloqueo de etiqueta: excluye galerías que contengan la etiqueta, tomará más tiempo en obtener la lista de galerías.\n\nBloqueo de etiqueta namespace: excluye galerías que contengan la etiqueta namespace, tomará más tiempo en obtener la lista de galerías. Nota: Con namespace quiere decir etiquetas como \"male\", \"female\", \"misc\", entre otros."
override val settingsPrivacySecure = "Impedir capturas de pantalla"
override val settingsPrivacySecureSummary = "Si habilitas esta opción no podrás hacer captura de pantalla y el sistema no mostrará una previsualización en el multitareas.\n\nDeberás reiniciar la aplicación para activar esta función."
override val uConfig = "Ajustes EHentai"
override val applyTip = "Toca la marca de verificación para guardar los cambios"
override val darkThemeFollowSystem = "Sigue el sistema"
override val pageCount = { quantity: Int ->
when (quantity) {
1 -> "$quantity páginas"
else -> "$quantity páginas"
}
}
override val someMinutesAgo = { quantity: Int ->
when (quantity) {
1 -> "Hace un minuto"
else -> "Hace $quantity minutos"
}
}
override val someHoursAgo = { quantity: Int ->
when (quantity) {
1 -> "Hace una hora"
else -> "Hace $quantity horas"
}
}
override val second = { quantity: Int ->
when (quantity) {
1 -> "segundo"
else -> "segundos"
}
}
override val minute = { quantity: Int ->
when (quantity) {
1 -> "minuto"
else -> "minutos"
}
}
override val hour = { quantity: Int ->
when (quantity) {
1 -> "hora"
else -> "horas"
}
}
override val day = { quantity: Int ->
when (quantity) {
1 -> "día"
else -> "días"
}
}
override val year = { quantity: Int ->
when (quantity) {
1 -> "año"
else -> "años"
}
}
}
@@ -0,0 +1,360 @@
package com.hippo.ehviewer.ui.i18n
object FrTranslations : Translations by EnTranslations {
override val homepage = "Page d'acceuil"
override val subscription = "Tags suivis"
override val whatsHot = "Plus vus"
override val favourite = "Favoris"
override val history = "Historique"
override val downloads = "Téléchargement"
override val settings = "Paramétres"
override val username = "Nom d'utilisateur"
override val password = "Mot de passe"
override val signIn = "Se connecter"
override val register = "Créer un compte"
override val signInViaWebview = "Se connecter via WebView"
override val signInFirst = "Connectez-vous pour continuer"
override val textIsEmpty = "Entrez le texte."
override val waring = "Attention"
override val invalidDownloadLocation = "La location de téléchargement actuelle n'est pas disponible. Choissez-en une à nouveau dans les Paramétres."
override val errorTimeout = "Time-out"
override val errorUnknownHost = "Hôte inconnu"
override val errorRedirection = "Trop de redirections"
override val errorSocket = "Erreur de network"
override val errorUnknown = "Erreur inconnue"
override val errorCantFindActivity = "Impossible de trouver l'application"
override val errorCannotParseTheUrl = "Impossible de parser le lien URL"
override val errorDecodingFailed = "Échec de décodage"
override val errorReadingFailed = "Échec de lecture"
override val errorOutOfRange = "Hors de portée"
override val errorParseError = "Échec d'analyse syntaxique"
override val error509 = "509"
override val errorInvalidUrl = "URL invalide"
override val errorGetPtokenError = "Échec d'obtention de pToken"
override val errorCantSaveImage = "Impossible d'enregistrer l'image"
override val errorInvalidNumber = "Nombre invalide"
override val appWaring = "Le contenu de l'application provient de l'Internet, dont quelque chose peut vous causer le dommage physique ou mentale. Vous l'avez bien compris et voulez continuer quand même."
override val errorUsernameCannotEmpty = "Nom d'ultilisateur ne doit pas être une chaîne vide"
override val errorPasswordCannotEmpty = "Mot de passe ne doit pas être une chaîne vide"
override val guestMode = "Continuer sans se connecter"
override val signInFailed = "Impossible de se connecter"
override val getIt = "Compris"
override val galleryListSearchBarHintExhentai = "Chercher sur ExHentai"
override val galleryListSearchBarHintEHentai = "Chercher sur E-Hentai"
override val galleryListSearchBarOpenGallery = "Ouvrir la galerie spécifiée"
override val galleryListEmptyHit = "Le monde est grand et le panda s'assied tout seul."
override val galleryListEmptyHitSubscription = "Vous pouvez suivre des tags à Paramètres -> EH -> Mes tags."
override val keywordSearch = "Recherche du mot-clé"
override val imageSearch = "Recherche d'une image"
override val searchImage = "Recherche d'une image"
override val searchSh = "Montrer les galeries supprimées"
override val searchSto = "Seulement montrer galeries avec des fiches torrent"
override val searchSr = "Minimum note"
override val searchSpTo = "à"
override val searchSf = "Désactiver le filtre par défaut pour les items suivants :"
override val searchSfl = "Langue"
override val searchSfu = "Uploader"
override val searchSft = "Tag"
override val selectImage = "Sélectionner une image"
override val selectImageFirst = "Sélectionnez une image"
override val addToFavourites = "Ajouter à favori"
override val removeFromFavourites = "Retirer de favori"
override val quickSearch = "Recherche rapide"
override val quickSearchTip = "Appuyez sur \"+\" pour ajouter une Recherche rapide"
override val addQuickSearchDialogTitle = "Ajouter la Recherche rapide"
override val nameIsEmpty = "Entrez un nom"
override val delete = "Supprimer"
override val addQuickSearchTip = "Le resultat de la liste de galerie sera sauvegardé comme une Recherche rapide. Cherchez d'abord pour sauvegarder l'état du panneau recherche."
override val readme = "README"
override val imageSearchNotQuickSearch = "Impossible d'ajouter recherche d'une image comme une Recherche rapide."
override val duplicateQuickSearch = { a: String -> "Une Recherche rapide avec le nom \"$a\" déjà existe." }
override val duplicateName = "Ce nom déjà existe"
override val goToHint = { a: Int, b: Int -> "Page $a, avec un totale de $a pages" }
override val star2 = "2 étoiles"
override val star3 = "3 étoiles"
override val star4 = "4 étoiles"
override val star5 = "5 étoiles"
override val download = "Télécharger"
override val read = "Lire"
override val favoredTimes = { a: Int -> "\u2665 $a" }
override val ratingText = { a: String, b: Float, c: Int -> "%s (%.2f, %d)".format(a, b, c) }
override val torrentCount = { a: Int -> "Torrent ($a)" }
override val share = "Partager"
override val rate = "Noter"
override val similarGallery = "Similaire(s)"
override val searchCover = "Chercher le couverture"
override val noTags = "Aucun tag"
override val noComments = "Aucun commentaire"
override val noMoreComments = "Pas d'autres commentaires"
override val moreComment = "Voir plus de commentaires"
override val refresh = "Rafraîchir"
override val openInOtherApp = "Ouvrir avec une autre appli"
override val rateSuccessfully = "Noté avec succès"
override val rateFailed = "Échec de notation"
override val noTorrents = "Aucun fiche torrent"
override val torrents = "Fiches torrent"
override val notFavorited = "Non ajoutée à favoris"
override val addFavoritesDialogTitle = "Ajouter à favoris"
override val addToFavoriteSuccess = "Ajouté à favoris"
override val removeFromFavoriteSuccess = "Retirer de favoris"
override val addToFavoriteFailure = "Impossible de l'ajouter à favoris"
override val removeFromFavoriteFailure = "Impossible de la retirer de favoris"
override val filterTheUploader = { a: String -> "Bloquer l'uploader \"$a\" ?" }
override val filterTheTag = { a: String -> "Bloquer le tag \"$a\" ?" }
override val filterAdded = "Bloqué(e)"
override val rating10 = "CHEF-D'ŒUVRE"
override val rating9 = "IRRÉSISTABLE"
override val rating8 = "TRÈS BIEN"
override val rating7 = "AGRÉABLE"
override val rating6 = "PAS MAL"
override val rating5 = "COMME SI COMME ÇA"
override val rating4 = "MAL"
override val rating3 = "TRÈS MAL"
override val rating2 = "PEINE"
override val rating1 = "INSUPPORTABLE"
override val rating0 = "FUYEZ !"
override val galleryInfo = "Infos de la galerie"
override val copiedToClipboard = "Copié à presse-papiers"
override val keyGid = "Gid"
override val keyToken = "Token"
override val keyUrl = "URL"
override val keyTitle = "Titre"
override val keyTitleJpn = "Titre en japonais"
override val keyThumb = "Aperçu"
override val keyCategory = "Catégorie"
override val keyUploader = "Uploader"
override val keyPosted = "Mise en ligne"
override val keyParent = "Parent"
override val keyVisible = "Visibile ?"
override val keyLanguage = "Langue"
override val keyPages = "Pages"
override val keySize = "Taille"
override val keyFavoriteCount = "Nombre d'additions à favoris"
override val keyFavorited = "Ajouté à favoris"
override val keyRatingCount = "Nombre de notations"
override val keyRating = "Notation"
override val keyTorrents = "Nombre de torrents"
override val keyTorrentUrl = "URL du fiche torrent"
override val galleryComments = "Commentaires de la galerie"
override val commentSuccessfully = "Commentaire posté"
override val commentFailed = "Impossible de commenter"
override val copyCommentText = "Copier le texte du commentaire"
override val voteUp = "Donner \"J'aime\""
override val cancelVoteUp = "Annuler \"J'aime\""
override val voteDown = "Donner \"Je hais\""
override val cancelVoteDown = "Donner \"Je hais\""
override val voteUpSuccessfully = "\"J'aime\" donné avec succès"
override val cancelVoteUpSuccessfully = "\"J'aime\" retiré avec succès"
override val voteDownSuccessfully = "\"Je hais\" donné avec succès"
override val cancelVoteDownSuccessfully = "\"Je hais\" retiré avec succès"
override val voteFailed = "Échec du vote"
override val checkVoteStatus = "Voir les détails des votes"
override val goTo = "Aller à"
override val sceneDownloadTitle = { a: String -> "Téléchargement - $a" }
override val noDownloadInfo = "Vos téléchargements s'afficheront ici"
override val downloadStateNone = "En veille"
override val downloadStateWait = "En attente"
override val downloadStateDownloading = "Téléchargement en cours"
override val downloadStateDownloaded = "Téléchargement completé"
override val downloadStateFailed = "Échec"
override val downloadStateFailed2 = { a: Int -> "$a non complet" }
override val downloadStateFinish = "Complet"
override val stat509AlertTitle = "Erreur 509"
override val stat509AlertText = "Votre limite d'obtention d'images est atteinte. Arrêtez le téléchargement et réessayez plus tard."
override val statDownloadDoneTitle = "Téléchargement completé"
override val statDownloadDoneTextSucceeded = { a: Int -> "$a avec succés" }
override val statDownloadDoneTextFailed = { a: Int -> "$a échoué(s)" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a avec succés, $a échoué(s)" }
override val statDownloadDoneLineSucceeded = { a: String -> "Complété(s) : $a" }
override val statDownloadDoneLineFailed = { a: String -> "Échoué(s) : $a" }
override val downloadRemoveDialogTitle = "Retire téléchargement"
override val downloadRemoveDialogMessage = { a: String -> "Retirer $a de la liste de téléchargement ?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "Retirer $a articles de la liste de téléchargement ?" }
override val downloadRemoveDialogCheckText = "Supprimer fiches d'image"
override val statDownloadActionStopAll = "Arrêter tout"
override val defaultDownloadLabelName = "Défaut"
override val downloadMoveDialogTitle = "Déplacer"
override val downloadLabels = "Labels de téléchargement"
override val downloadStartAll = "Commencer tout"
override val downloadStopAll = "Arrêter tout"
override val downloadResetReadingProgress = "Réinitialiser les progrès de lecture"
override val resetReadingProgressMessage = "Réinitialiser les progrès de lecture de toutes galéries téléchargées ?"
override val downloadServiceLabel = "Service du téléchargement EhViewer"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a, encore $b" }
override val rememberDownloadLabel = "Enregistrer le label de téléchargement"
override val defaultDownloadLabel = "Label de téléchargement par défaut"
override val addedToDownloadList = "Ajouté à la liste de téléchargement"
override val add = "Ajouter"
override val newLabelTitle = "Nouveau label"
override val labelTextIsEmpty = "Entrez le texte du label"
override val labelTextIsInvalid = "\"Default\" n'est pas un label valide"
override val labelTextExist = "Ce label déjà existe"
override val renameLabelTitle = "Renommer le label"
override val noHistory = "Votre historique de les lectures de galerie s'affichera ici"
override val clearAll = "Tout effacer"
override val clearAllHistory = "Effacer toute l'historique ?"
override val filter = "Bloqueur des galeries"
override val filterTitle = "Titre"
override val filterUploader = "Uploader"
override val filterTag = "Tag"
override val filterTagNamespace = "Espace de nom de tag"
override val deleteFilter = { a: String -> "Supprimer le bloqueur bloqueur \"$a\" ?" }
override val showDefinition = "Montrer les expliques"
override val addFilter = "Ajouter un bloqueur"
override val filterText = "Texte du bloqueur"
override val filterTip = "Les galeries non désirées qui satisfont les critères des bloqueurs ne sont pas affichées.\n\nBloqueur du titre : exclure les galeries dont le titre contient le mot.\n\nBloqueur d'uploader : exclure les galerie mises en ligne par cet uploader.\n\nBloqueur de tag : exclure les galeries qui ont ce tag. Il vas prendre plus de temps pour charger la liste.\n\nBloqueur d'espace de nom de tag : exclure les galeries qui ont cette espace de nom de tag. Il vas prendre plus de temps pour charger la liste."
override val uConfig = "Paramètres EHentai"
override val applyTip = "Appuyez sur la coche pour sauvegarder les changements"
override val shareImage = "Partager l'image"
override val imageSaved = { a: String -> "Image sauvegardée à $a" }
override val settingsEh = "EH"
override val settingsEhSignOut = "Se déconnecter"
override val settingsUConfig = "Paramètres EHentai"
override val settingsUConfigSummary = "Paramètres sur le site Web EHentai"
override val settingsMyTags = "Tags suivis"
override val settingsMyTagsSummary = "Gérer les tags suivis sur le site Web EHentai"
override val settingsEhGallerySite = "Site de galerie"
override val settingsEhLaunchPage = "Écran par défaut après le lancement"
override val settingsEhListMode = "Mode de liste"
override val settingsEhListModeDetail = "Avec détails"
override val settingsEhListModeThumb = "Miniatures uniquement"
override val settingsEhDetailSize = "Taille des détails"
override val settingsEhDetailSizeLong = "Long"
override val settingsEhDetailSizeShort = "Court"
override val settingsEhShowJpnTitle = "Montrer les titres japonais"
override val settingsEhFilter = "Bloqueur des galeries"
override val settingsEhFilterSummary = "Filtrer les galerie par les titres, les uploaders ou les tags"
override val myTags = "Tags suivis"
override val settingsDownload = "Téléchargement"
override val settingsDownloadDownloadLocation = "Destination de téléchargement"
override val settingsDownloadCantGetDownloadLocation = "Impossible d'obtenir la destination de téléchargement"
override val settingsDownloadMediaScan = "Permettre le scannage multimédia"
override val settingsDownloadMediaScanSummaryOn = "Ne montrez jamais vos applications galerie à personne"
override val settingsDownloadMediaScanSummaryOff = "La plupart d'applications galerie ignorent les images dans le chemin de téléchargement"
override val settingsDownloadConcurrency = "Téléchargement multi-thread"
override val settingsDownloadConcurrencySummary = { a: Int -> "Jusqu'à $a image(s)" }
override val settingsDownloadPreloadImage = "Charger les images d'avance"
override val settingsDownloadPreloadImageSummary = { a: Int -> "Charger les prochaine $a images" }
override val settingsDownloadDownloadOriginImage = "Télécharger l'images originales"
override val settingsDownloadDownloadOriginImageSummary = "Vous allez obtenir l'erreur 509 plus facilement"
override val settingsDownloadRestoreDownloadItems = "Rétablir les galeries téléchargées"
override val settingsDownloadRestoreDownloadItemsSummary = "Rétablir tous objets déjà téléchargés dans la destination de téléchargement"
override val settingsDownloadRestoreNotFound = "Aucun objet trouvé à rétablir"
override val settingsDownloadRestoreFailed = "Échec de rétablissement"
override val settingsDownloadRestoreSuccessfully = { a: Int -> "$a objets rétablis avec succès" }
override val settingsDownloadCleanRedundancy = "Effacer fiches inutiles de téléchargement"
override val settingsDownloadCleanRedundancySummary = "Effacer les fiches des galeries qui ne sont pas dans la liste de téléchargement mais se trouvent dans la destination de téléchargement"
override val settingsDownloadCleanRedundancyNoRedundancy = "Rien à effacer"
override val settingsDownloadCleanRedundancyDone = { a: Int -> "Nettoyage complété avec succès, $a objets effacés" }
override val settingsAdvanced = "Avancé"
override val settingsAdvancedSaveParseErrorBody = "Enrég. les HTMLs avec erreurs"
override val settingsAdvancedSaveParseErrorBodySummary = "Le fiche HTML pouvait contenir les informations personnelles"
override val settingsAdvancedSaveCrashLog = "Enrégistrer le rapport crash"
override val settingsAdvancedSaveCrashLogSummary = "Les rapports crash aident le développeur à correcter les bugs"
override val settingsAdvancedDumpLogcat = "Sauvegarder le journal logcat"
override val settingsAdvancedDumpLogcatSummary = "Sauvegarder le journal logcat au stockage externe"
override val settingsAdvancedDumpLogcatFailed = "Echec de sauvegarde"
override val settingsAdvancedDumpLogcatTo = { a: String -> "Fiche sauvegardé à $a" }
override val clipboardGalleryUrlSnackMessage = "Un lien d'un galerie est détecté dans les presse-papiers."
override val clipboardGalleryUrlSnackAction = "Aller"
override val settingsAdvancedReadCacheSize = "Taille du cache pour la lecture"
override val settingsAdvancedExportData = "Exporter les données"
override val settingsAdvancedExportDataSummary = "Sauvegarder les données au stockage externe, y compris la liste de téléchargement, la liste de recherche rapide"
override val settingsAdvancedExportDataTo = { a: String -> "Données exportées à $a" }
override val settingsAdvancedExportDataFailed = "Échec d'exportation de données"
override val settingsAdvancedImportData = "Importer les données"
override val settingsAdvancedImportDataSummary = "Charger les données exportées"
override val settingsAdvancedImportDataSuccessfully = "Importation complète avec succès"
override val settingsAbout = "À propos de l'application"
override val settingsAboutDeclarationSummary = "EhViewer ne s'affilie à E-Hentai de aucune manière."
override val settingsAboutAuthor = "Développeur"
override val settingsAboutLatestRelease = "Dernière version"
override val settingsAboutSource = "Source"
override val settingsAboutVersion = "Numéro de version"
override val settingsAboutCheckForUpdates = "Chercher mise à jour"
override val cantReadTheFile = "Impossible de lire le fiche"
override val pleaseWait = "Merci de patienter"
override val cloudFavorites = "Favoris de cloud"
override val localFavorites = "Favoris locales"
override val searchBarHint = { a: String -> "Chercher dans $a" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $a" }
override val deleteFavoritesDialogTitle = "Effacer de favoris"
override val deleteFavoritesDialogMessage = { a: Int -> "Effacer $a objets de favoris ?" }
override val moveFavoritesDialogTitle = "Déplacer favoris"
override val defaultFavoritesCollection = "Collection favoris par défaut"
override val letMeSelect = "Sélectionner manuellement"
override val collections = "Collections"
override val errorSomethingWrongHappened = "Une erreur s'est produite"
override val fromTheFuture = "Du futur"
override val justNow = "En ce moment"
override val yesterday = "Hier"
override val someDaysAgo = { a: Int -> "Il y a $a jours" }
override val archive = "Fiches archives"
override val noArchives = "Aucun fiche archives"
override val downloadArchiveStarted = "Téléchargement du fiche archives a commencé"
override val downloadArchiveFailure = "Téléchargement du fiche archives a échoué"
override val downloadArchiveFailureNoHath = "Client H@H est nécessaire pour le téléchargement de fiches archives"
override val settingsPrivacy = "Confidentialité"
override val settingsPrivacySecure = "Empêcher les captures d'ecran"
override val settingsPrivacySecureSummary = "Quand cette option est activée, vous ne pouvez prendre aucune capture d'écran de l'application, et le systéme n'affiche pas le contenu d'écran dans le sélecteur de tâches.\n\nRedémarrage de l'application est nécessaire pour appliquer le changement"
override val settingsAdvancedAppLanguageTitle = "Langue de l'app (Language)"
override val appLanguageSystem = "Langue du système (défaut)"
override val settingsEhIdentityCookiesSigned = "Tout le monde peut utiliser les cookies de ce compte pour s'y connecter.<br><b>GARDEZ-LES BIEN !</b>"
override val settingsEhIdentityCookiesGuest = "Vous ne vous êtes pas connecté."
override val settingsEhShowGalleryPages = "Montrer les nombres des pages des galeries"
override val settingsEhShowGalleryPagesSummary = "Montrer le nombre des pages des galerie dans la liste des galeries"
override val darkTheme = "Thème sombre"
override val darkThemeFollowSystem = "Identique au système"
override val darkThemeOff = "Toujours actif"
override val darkThemeOn = "Toujours inactif"
override val pageCount = { quantity: Int ->
when (quantity) {
1 -> "$quantity page"
else -> "$quantity pages"
}
}
override val someMinutesAgo = { quantity: Int ->
when (quantity) {
1 -> "Il y a $quantity minute"
else -> "Il y a $quantity minutes"
}
}
override val someHoursAgo = { quantity: Int ->
when (quantity) {
1 -> "Il y a $quantity heure"
else -> "Il y a $quantity heures"
}
}
override val second = { quantity: Int ->
when (quantity) {
1 -> "$quantity sec"
else -> "secs"
}
}
override val minute = { quantity: Int ->
when (quantity) {
1 -> "$quantity min"
else -> "mins"
}
}
override val hour = { quantity: Int ->
when (quantity) {
1 -> "$quantity heure"
else -> "heures"
}
}
override val day = { quantity: Int ->
when (quantity) {
1 -> "$quantity jour"
else -> "jours"
}
}
override val year = { quantity: Int ->
when (quantity) {
1 -> "$quantity an"
else -> "ans"
}
}
}
@@ -0,0 +1,568 @@
package com.hippo.ehviewer.ui.i18n
object JaTranslations : Translations by EnTranslations {
override val homepage = "ホーム"
override val subscription = "購読"
override val whatsHot = "人気"
override val favourite = "お気に入り"
override val history = "履歴"
override val downloads = "ダウンロード"
override val settings = "設定"
override val username = "ユーザー名"
override val password = "パスワード"
override val signIn = "ログイン"
override val register = "登録"
override val signInViaWebview = "ウェブでログイン"
override val signInFirst = "ログインしてください"
override val textIsEmpty = "テキストを入力してください"
override val waring = "警告"
override val invalidDownloadLocation = "ダウンロードパスは現在利用できません。ダウンロードパスを設定してください。"
override val clipboardGalleryUrlSnackMessage = "クリップボードからギャラリーの URL が検出されました。"
override val clipboardGalleryUrlSnackAction = "表示"
override val errorTimeout = "タイムアウト"
override val errorUnknownHost = "不明なホスト"
override val errorRedirection = "リダイレクトが多すぎます"
override val errorSocket = "ネットワークエラー"
override val errorUnknown = "不明なエラー"
override val errorCantFindActivity = "アクティビティが見つかりません。"
override val errorCannotParseTheUrl = "リンクを解析できません"
override val errorDecodingFailed = "デコードに失敗しました"
override val errorReadingFailed = "読み込めませんでした"
override val errorOutOfRange = "範囲外"
override val errorParseError = "ファイルの解析に失敗しました"
override val error509 = "509 エラー"
override val errorInvalidUrl = "無効なリンクです"
override val errorGetPtokenError = "pToken 取得エラー"
override val errorCantSaveImage = "画像を保存できませんでした"
override val errorInvalidNumber = "無効な数字です"
override val appWaring = "このアプリの内容はインターネットから取得したものです。その内容の一部は心身に悪影響を与える可能性があります。それでも続行しますか?"
override val appWaring2 = "利用を続行することにより、上記の規約に同意したものとみなされます。"
override val errorUsernameCannotEmpty = "ユーザー名は空欄にできません"
override val errorPasswordCannotEmpty = "パスワードは空欄にできません"
override val guestMode = "ゲストモード"
override val signInFailed = "ログインに失敗しました"
override val signInFailedTip = { a: String -> "この問題が続く場合は「$a」をお試しください。" }
override val getIt = "了解"
override val galleryListSearchBarHintExhentai = "ExHentai を検索"
override val galleryListSearchBarHintEHentai = "E-Hentai を検索"
override val galleryListSearchBarOpenGallery = "ギャラリーを開く"
override val galleryListEmptyHit = "何も見つかりません"
override val galleryListEmptyHitSubscription = "リストは空です。\n設定 -> EH -> マイタグでタグを購読できます。"
override val keywordSearch = "キーワードで検索"
override val imageSearch = "画像で検索"
override val searchImage = "画像検索"
override val searchSh = "削除済みのギャラリーを表示"
override val searchSto = "Torrent のあるギャラリーのみを表示"
override val searchSr = "評価の下限"
override val searchSpTo = "から"
override val searchSpErr1 = "ページ範囲の最大値を 10 以下にすることはできません"
override val searchSpErr2 = "ページ範囲が狭すぎます"
override val searchSpSuffix = ""
override val searchSf = "デフォルトのフィルターで無効:"
override val searchSfl = "言語"
override val searchSfu = "アップローダー"
override val searchSft = "タグ"
override val selectImage = "画像を選択"
override val selectImageFirst = "画像を選択してください"
override val addToFavourites = "お気に入りに追加"
override val removeFromFavourites = "お気に入りから削除"
override val deleteDownloads = "ダウンロードを削除"
override val quickSearch = "クイック検索"
override val quickSearchTip = "「+」をタップしてクイック検索を追加します"
override val addQuickSearchDialogTitle = "クイック検索を追加"
override val nameIsEmpty = "タイトルが空欄です"
override val delete = "削除"
override val addQuickSearchTip = "ギャラリー検索結果の設定などはクイック検索として保存されます。検索の設定などを保存するには、まず検索を実行してください。"
override val readme = "README"
override val imageSearchNotQuickSearch = "画像検索をクイック検索として追加できませんでした"
override val duplicateQuickSearch = { a: String -> "「$a」のクイック検索はすでに存在しています。" }
override val duplicateName = "この名前はすでに使用されています。"
override val saveProgress = "進捗を保存"
override val deleteQuickSearch = { a: String -> "クイック検索の「$a」を削除しますか?" }
override val goToHint = { a: Int, b: Int -> "ページ: $a - 合計: $b ページ" }
override val any = "すべて"
override val star2 = "2 つ星"
override val star3 = "3 つ星"
override val star4 = "4 つ星"
override val star5 = "5 つ星"
override val download = "ダウンロード"
override val read = "読む"
override val favoredTimes = { a: Int -> "\u2665 $a" }
override val ratingText = { a: String, b: Float, c: Int -> "%s (%.2f - %d)".format(a, b, c) }
override val torrentCount = { a: Int -> "Torrent ($a)" }
override val share = "共有"
override val rate = "評価"
override val similarGallery = "類似のギャラリー"
override val searchCover = "カバーを検索"
override val noTags = "タグなし"
override val noComments = "コメントなし"
override val noMoreComments = "コメントはこれ以上ありません"
override val moreComment = "他のコメントを見る"
override val refresh = "更新"
override val viewOriginal = "オリジナルの画像を表示"
override val openInOtherApp = "他のアプリで開く"
override val clearImageCache = "画像キャッシュを消去"
override val clearImageCacheConfirm = "このギャラリーのすべての画像キャッシュを消去しますか?"
override val imageCacheCleared = "画像キャッシュを消去しました"
override val rateSuccessfully = "評価しました"
override val rateFailed = "評価できませんでした"
override val noTorrents = "Torrent なし"
override val torrents = "Torrent"
override val notFavorited = "お気に入り未追加"
override val addFavoritesDialogTitle = "お気に入りに追加"
override val addToFavoriteSuccess = "お気に入りに追加しました"
override val removeFromFavoriteSuccess = "お気に入りから削除しました"
override val addToFavoriteFailure = "お気に入りの追加に失敗しました"
override val removeFromFavoriteFailure = "お気に入りからの削除に失敗しました"
override val filterTheUploader = { a: String -> "アップローダーの「$a」をブロックしますか?" }
override val filterTheTag = { a: String -> "「$a」のタグをブロックしますか?" }
override val filterAdded = "ブロックを追加しました"
override val newerVersionAvailable = "このギャラリーの新しいバージョンが利用可能です。"
override val newerVersionTitle = { a: String, b: String -> "$a、$b を追加しました" }
override val rating10 = "ものすごくいい"
override val rating9 = "すごくいい"
override val rating8 = "とてもいい"
override val rating7 = "いい"
override val rating6 = "まあまあ"
override val rating5 = "普通"
override val rating4 = "悪い"
override val rating3 = "とても悪い"
override val rating2 = "目の障害になる"
override val rating1 = "悪くて呼吸できない"
override val rating0 = "…"
override val galleryInfo = "ギャラリー情報"
override val copiedToClipboard = "クリップボードにコピーしました"
override val keyGid = "GID"
override val keyToken = "トークン"
override val keyUrl = "URL"
override val keyTitle = "タイトル"
override val keyTitleJpn = "日本語のタイトル"
override val keyThumb = "サムネイル"
override val keyCategory = "カテゴリー"
override val keyUploader = "アップローダー"
override val keyPosted = "アップロード日時"
override val keyParent = "親ギャラリー"
override val keyVisible = "可視性"
override val keyLanguage = "言語"
override val keyPages = "ページ数"
override val keySize = "サイズ"
override val keyFavoriteCount = "お気に入りの数"
override val keyFavorited = "お気に入りに追加済み"
override val keyRatingCount = "評価の数"
override val keyRating = "評価"
override val keyTorrents = "Torrent"
override val keyTorrentUrl = "Torrent URL"
override val galleryComments = "ギャラリーのコメント"
override val commentSuccessfully = "コメントを送信しました"
override val commentFailed = "コメントに失敗しました"
override val copyCommentText = "コメントをコピー"
override val blockCommenter = "コメントをしたユーザーをブロック"
override val filterTheCommenter = { a: String -> "「$a」をブロックしますか?" }
override val editComment = "コメントを編集"
override val editCommentSuccessfully = "コメントが編集されました"
override val editCommentFailed = "コメントの編集に失敗しました"
override val voteUp = "高評価"
override val cancelVoteUp = "高評価を取り消す"
override val voteDown = "低評価"
override val cancelVoteDown = "低評価を取り消す"
override val voteUpSuccessfully = "高評価しました"
override val cancelVoteUpSuccessfully = "高評価を取り消しました"
override val voteDownSuccessfully = "低評価しました"
override val cancelVoteDownSuccessfully = "低評価を取り消しました"
override val voteFailed = "評価に失敗しました"
override val checkVoteStatus = "評価の詳細を表示"
override val clickMoreComments = "タップしてさらにコメントを読み込む"
override val lastEdited = { a: String -> "最終更新: $a" }
override val goTo = "ページに移動"
override val sceneDownloadTitle = { a: String -> "ダウンロード - $a" }
override val noDownloadInfo = "ダウンロードタスクはここに表示されます"
override val downloadStateNone = "一時停止中"
override val downloadStateWait = "待機中"
override val downloadStateDownloading = "ダウンロード中"
override val downloadStateDownloaded = "ダウンロード済み"
override val downloadStateFailed = "ダウンロードエラー"
override val downloadStateFailed2 = { a: Int -> "$a 件が未完成" }
override val downloadStateFinish = "ダウンロード完了"
override val stat509AlertTitle = "509 アラート"
override val stat509AlertText = "ダウンロード制限に達しました。しばらくしてからもう一度やり直してください。"
override val statDownloadDoneTitle = "ダウンロード完了"
override val statDownloadDoneTextSucceeded = { a: Int -> "$a 件が成功" }
override val statDownloadDoneTextFailed = { a: Int -> "$a 件が失敗" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a 件のダウンロードが成功、$b 件が失敗" }
override val statDownloadDoneLineSucceeded = { a: String -> "成功: $a" }
override val statDownloadDoneLineFailed = { a: String -> "失敗: $a" }
override val downloadRemoveDialogTitle = "ダウンロードを削除"
override val downloadRemoveDialogMessage = { a: String -> "ダウンロードリストから「$a」を削除しますか?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "ダウンロードリストから $a 件のタスクを削除しますか?" }
override val downloadRemoveDialogCheckText = "画像ファイルを削除"
override val statDownloadActionStopAll = "すべて停止"
override val defaultDownloadLabelName = "デフォルト"
override val downloadMoveDialogTitle = "移動"
override val downloadLabels = "ダウンロードラベル"
override val downloadStartAll = "すべて開始"
override val downloadStopAll = "すべて停止"
override val downloadResetReadingProgress = "閲覧進捗をリセット"
override val resetReadingProgressMessage = "すべてのダウンロード済みのギャラリーの閲覧進捗をリセットしますか?"
override val downloadServiceLabel = "EhViewer ダウンロードサービス"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a - 残り: $b" }
override val rememberDownloadLabel = "ダウンロードラベルを記憶"
override val defaultDownloadLabel = "デフォルトのダウンロードラベル"
override val addedToDownloadList = "ダウンロードリストに追加しました"
override val selectGroupingMode = "グループモードを選択"
override val selectGroupingModeCustom = "カスタム"
override val selectGroupingModeArtist = "アーティスト"
override val unknownArtists = "不明"
override val add = "追加"
override val newLabelTitle = "ラベルを作成"
override val labelTextIsEmpty = "ラベルテキストを入力してください"
override val labelTextIsInvalid = "「デフォルト」は無効なラベルです"
override val labelTextExist = "ラベルはすでに存在しています"
override val renameLabelTitle = "ラベルの名前を変更"
override val deleteLabel = { a: String -> "「$a」のラベルを削除しますか?" }
override val noHistory = "閲覧したギャラリーはここに表示されます"
override val clearAll = "すべて消去"
override val clearAllHistory = "履歴をすべて消去しますか?"
override val filter = "ギャラリーをブロック"
override val filterTitle = "タイトル"
override val filterUploader = "アップローダー"
override val filterTag = "タグ"
override val filterTagNamespace = "タグの名前空間"
override val filterCommenter = "コメント"
override val filterComment = "コメントの正規表現"
override val deleteFilter = { a: String -> "「$a」のブロックを削除しますか?" }
override val addFilter = "ブロックを追加"
override val showDefinition = "ヘルプを表示"
override val filterText = "テキストをブロック"
override val filterTip = "E-Hentai のギャラリーリストからブロックしたものを除外します。\n\nタイトルをブロック: ブロックしたテキストを含むギャラリーを除外します。\n\nアップローダーをブロック: 該当するアップローダーを除外します。\n\nタグをブロック: 該当するタグを含むギャラリーを除外します。ギャラリーリストの取得に時間がかかる可能性があります。\n\nタグ名前空間をブロック: 該当するタグ名前空間を含むギャラリーを除外します。ギャラリーリストの取得に時間がかかる可能性があります。\n\nコメント投稿者をブロック: 該当するコメント投稿者が投稿したコメントを除外します。\n\nコメントをブロック: 正規表現に一致するコメントを除外します。"
override val uConfig = "E-Hentai の設定"
override val applyTip = "右上隅のチェックマークをタップして設定を保存します"
override val myTags = "マイタグ"
override val shareImage = "画像を共有"
override val imageSaved = { a: String -> "画像は「$a」に保存されました" }
override val settingsEh = "EH"
override val settingsEhSignOut = "ログアウト"
override val settingsEhIdentityCookiesSigned = "このアカウントは Identity Cookie を使用してログインできます。<br><b>これは安全に保管してください</b>"
override val settingsEhIdentityCookiesGuest = "ゲストモード"
override val settingsEhClearIgneous = "Igneous を消去"
override val settingsUConfig = "E-Hentai の設定"
override val settingsUConfigSummary = "E-Hentai ウェブサイト内の設定をします"
override val settingsMyTags = "マイタグ"
override val settingsMyTagsSummary = "E-Hentai のウェブサイトでタグを管理します"
override val settingsEhGallerySite = "ギャラリーサイト"
override val settingsEhLaunchPage = "起動ページ"
override val settingsEhListMode = "リストモード"
override val settingsEhListModeDetail = "詳細"
override val settingsEhListModeThumb = "サムネイル"
override val settingsEhDetailSize = "詳細情報の幅"
override val settingsEhDetailSizeLong = "長い"
override val settingsEhDetailSizeShort = "短い"
override val settingsEhThumbColumns = "サムネイルのカラム数"
override val settingsEhForceEhThumb = "E-Hentai サムネイルサーバーを使用する"
override val settingsEhForceEhThumbSummary = "サムネイルの読み込みに問題がある場合は無効化してください"
override val settingsEhShowJpnTitle = "日本語のタイトルを表示"
override val settingsEhShowJpnTitleSummary = "E-Hentai ウェブサイトの設定で日本語のタイトルを有効化する必要があります"
override val settingsEhShowGalleryPages = "ギャラリーページ数を表示"
override val settingsEhShowGalleryPagesSummary = "リストにギャラリーのページ数を表示します"
override val settingsEhShowGalleryComments = "ギャラリーのコメントを表示"
override val settingsEhShowGalleryCommentsSummary = "ギャラリーの詳細ページにコメントを表示します"
override val settingsEhShowGalleryCommentThreshold = "コメントスコアのしきい値"
override val settingsEhShowGalleryCommentThresholdSummary = "このスコア以下のコメントを非表示にします (-101 は無効)"
override val settingsEhShowTagTranslations = "タグの翻訳を表示"
override val settingsEhShowTagTranslationsSummary = "元のテキストの代わりに翻訳したタグを表示します (データファイルのダウンロードに時間がかかります)"
override val settingsEhTagTranslationsSource = "プレースホルダー"
override val settingsEhTagTranslationsSourceUrl = "https://placeholder"
override val settingsEhFilter = "ギャラリーをブロック"
override val settingsEhFilterSummary = "タイトル、アップローダー、タグ、コメントの投稿者またはギャラリーをブロックします"
override val settingsBlockExtraneousAds = "[試験的] 関係のない広告をブロック"
override val settingsAdsPlaceholder = "[任意] 広告を置換するプレースホルダーを選択"
override val settingsDownload = "ダウンロード"
override val settingsDownloadDownloadLocation = "ダウンロード先"
override val settingsDownloadCantGetDownloadLocation = "ダウンロード先を取得できません"
override val settingsDownloadMediaScan = "メディアスキャンを許可する"
override val settingsDownloadMediaScanSummaryOn = "ギャラリーアプリで他の人に見せないようにします"
override val settingsDownloadMediaScanSummaryOff = "ほとんどのギャラリーアプリでダウンロード先のパスを無視します"
override val settingsDownloadConcurrency = "ダウンロードのスレッド数"
override val settingsDownloadConcurrencySummary = { a: Int -> "同時に最大 $a 枚の画像をダウンロードします" }
override val settingsDownloadDownloadDelay = "ダウンロードの遅延"
override val settingsDownloadDownloadDelaySummary = { a: Int -> "ダウンロードで $a ミリ秒の遅延をさせます" }
override val settingsDownloadDownloadTimeout = "ダウンロードのタイムアウト (秒単位)"
override val settingsDownloadPreloadImage = "画像をプリロード"
override val settingsDownloadPreloadImageSummary = { a: Int -> "$a 枚の画像をプリロードします" }
override val settingsDownloadDownloadOriginImage = "オリジナルの画像をダウンロードする"
override val settingsDownloadDownloadOriginImageSummary = "注意!GP が必要になる可能性があります"
override val settingsDownloadSaveAsCbz = "CBZ アーカイブで保存"
override val settingsDownloadArchiveMetadata = "アーカイブのメタデータ"
override val settingsDownloadArchiveMetadataSummary = "アーカイブのダウンロード時に ComicInfo.xml を生成します"
override val settingsDownloadReloadMetadata = "メタデータを再読み込み"
override val settingsDownloadReloadMetadataSummary = "タグが変更された可能性のあるダウンロード項目の ComicInfo.xml を再生成します"
override val settingsDownloadReloadMetadataSuccessfully = { a: Int -> "$a 個の項目を再読み込みしました" }
override val settingsDownloadReloadMetadataFailed = { a: String -> "メタデータの再読み込みに失敗: $a" }
override val settingsDownloadRestoreDownloadItems = "ダウンロードタスクを復元"
override val settingsDownloadRestoreDownloadItemsSummary = "ダウンロードディレクトリのダウンロードタスクを復元します"
override val settingsDownloadRestoreNotFound = "復元可能なダウンロードが見つかりません"
override val settingsDownloadRestoreFailed = "復元できませんでした"
override val settingsDownloadRestoreSuccessfully = { a: Int -> "$a 件のタスクが復元されました" }
override val settingsDownloadCleanRedundancy = "ダウンロードフォルダの不要なファイルを整理"
override val settingsDownloadCleanRedundancySummary = "ダウンロードディレクトリからダウンロードタスクにない画像ファイルを削除します"
override val settingsDownloadCleanRedundancyNoRedundancy = "不要なファイルが見つかりませんでした"
override val settingsDownloadCleanRedundancyDone = { a: Int -> "$a 件のファイルを削除しました" }
override val settingsAdvanced = "その他の設定"
override val settingsAdvancedSaveParseErrorBody = "解析の失敗時に HTML ファイルを保存"
override val settingsAdvancedSaveParseErrorBodySummary = "HTML ファイルに個人情報が含まれている場合があります"
override val settingsAdvancedSaveCrashLog = "アプリのクラッシュ時にレポートを保存"
override val settingsAdvancedSaveCrashLogSummary = "クラッシュレポートはバグの修正に役立ちます"
override val settingsAdvancedDumpLogcat = "Logcat をダンプ"
override val settingsAdvancedDumpLogcatSummary = "Logcat のログを内部ストレージに保存します"
override val settingsAdvancedDumpLogcatFailed = "Logcat のダンプに失敗しました"
override val settingsAdvancedDumpLogcatTo = { a: String -> "Logcat のログが「$a」にダンプされました" }
override val settingsAdvancedReadCacheSize = "読書用キャッシュのサイズ"
override val settingsAdvancedAppLanguageTitle = "アプリの言語"
override val settingsAdvancedHardwareBitmapThreshold = "ハードウェアビットマップ (パフォーマンス向上) のしきい値"
override val settingsAdvancedHardwareBitmapThresholdSummary = "長い画像の読み込みに失敗する場合はこれを減らしてみてください"
override val settingsAdvancedExportData = "データをエクスポート"
override val settingsAdvancedExportDataSummary = "ダウンロードリストやクイック検索などのデータを内部ストレージに保存します"
override val settingsAdvancedExportDataTo = { a: String -> "データを「$a」にエクスポート" }
override val settingsAdvancedExportDataFailed = "データをエクスポートできませんでした"
override val settingsAdvancedImportData = "データをインポート"
override val settingsAdvancedImportDataSummary = "以前に保存したデータを読み込みます"
override val settingsAdvancedImportDataSuccessfully = "データをインポートしました"
override val settingsAdvancedBackupFavorite = "お気に入りリストをバックアップ"
override val settingsAdvancedBackupFavoriteSummary = "リモートのお気に入りリストをローカルにバックアップします"
override val settingsAdvancedBackupFavoriteStart = { a: String -> "お気に入りリスト「$a」をバックアップ中です" }
override val settingsAdvancedBackupFavoriteNothing = "バックアップするものがありません"
override val settingsAdvancedBackupFavoriteSuccess = "お気に入りリストのバックアップに成功しました"
override val settingsAdvancedBackupFavoriteFailed = "お気に入りリストのバックアップに失敗しました"
override val settingsAbout = "このアプリについて"
override val settingsAboutDeclarationSummary = "EhViewer は E-Hentai.org と一切関係はありません"
override val settingsAboutAuthor = "開発者"
override val settingsAboutLatestRelease = "最新のリリース"
override val settingsAboutSource = "ソースコード"
override val settingsAboutVersion = "ビルドバージョン"
override val settingsAboutCommitTime = { a: String -> "$a にコミットされました" }
override val settingsAboutCheckForUpdates = "更新を確認"
override val license = "ライセンス"
override val cantReadTheFile = "ファイルを読み取れませんでした"
override val appLanguageSystem = "システム言語 (デフォルト)"
override val pleaseWait = "お待ちください"
override val cloudFavorites = "クラウドのお気に入り"
override val localFavorites = "ローカルのお気に入り"
override val searchBarHint = { a: String -> "$a を検索" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $b" }
override val deleteFavoritesDialogTitle = "お気に入りから削除"
override val deleteFavoritesDialogMessage = { a: Int -> "$a 件の項目をお気に入りリストから削除しますか?" }
override val moveFavoritesDialogTitle = "お気に入りを移動"
override val defaultFavoritesCollection = "デフォルトのお気に入りリスト"
override val defaultFavoritesWarning = "これを有効化するとお気に入りのメモを追加することができなくなります"
override val letMeSelect = "手動で選択"
override val favoriteNote = "お気に入りのメモ"
override val collections = "コレクション"
override val errorSomethingWrongHappened = "エラーが発生しました"
override val fromTheFuture = "未来から"
override val justNow = "たった今"
override val yesterday = "昨日"
override val someDaysAgo = { a: Int -> "$a 日前" }
override val archive = "圧縮パッケージ"
override val noArchives = "アーカイブなし"
override val downloadArchiveStarted = "アーカイブのダウンロードを開始しました"
override val downloadArchiveFailure = "アーカイブをダウンロードできませんでした"
override val archiveFree = "自由"
override val archiveOriginal = "オリジナル"
override val archiveResample = "リサンプル"
override val downloadArchiveFailureNoHath = "アーカイブのダウンロードは H@H クライアントが必要です"
override val currentFunds = "現在の資金:"
override val insufficientFunds = "資金が不足しています"
override val imageLimits = "画像の制限"
override val imageLimitsSummary = "使用中:"
override val imageLimitsNormal = "制限なし"
override val imageLimitsRestricted = "画面解像度は 1280x に制限されます"
override val resetCost = { a: Int -> "$a GP を使用してリセット" }
override val reset = "リセット"
override val settingsPrivacy = "プライバシー"
override val settingsPrivacySecure = "スクリーンショットを抑制する"
override val settingsPrivacySecureSummary = "アプリのコンテンツがスクリーンショットで撮影されたり「最近使用したアプリ」のリストに表示されないようにします"
override val clearSearchHistory = "デバイスの検索履歴を消去"
override val clearSearchHistorySummary = "このデバイスから検索履歴を消去します"
override val clearSearchHistoryConfirm = "検索履歴を消去しますか?"
override val searchHistoryCleared = "検索履歴を消去しました"
override val downloadService = "ダウンロードサービス"
override val keyFavoriteName = "お気に入り"
override val darkTheme = "ダークテーマ"
override val blackDarkTheme = "ブラックダークテーマ"
override val harmonizeCategoryColor = "カテゴリの色をダイナミックカラーで調和させる"
override val sortBy = "並べ替え"
override val addedTimeDesc = "追加された時間 (昇順)"
override val addedTimeAsc = "追加された時間 (昇順)"
override val uploadedTimeDesc = "アップロードされた時間 (昇順)"
override val uploadedTimeAsc = "アップロードされた時間 (昇順)"
override val titleAsc = "タイトル (昇順)"
override val titleDesc = "タイトル (降順)"
override val pageCountAsc = "ページ数 (昇順)"
override val pageCountDesc = "ページ数 (降順)"
override val groupByDownloadLabel = "ダウンロードラベルでグループにする"
override val downloadFilter = "フィルター"
override val downloadAll = "すべて"
override val downloadStartAllReversed = "すべて開始 (逆順)"
override val noBrowserInstalled = "ブラウザをインストールしてください。"
override val toplistAlltime = "すべての期間"
override val toplistPastyear = "昨年"
override val toplistPastmonth = "先月"
override val toplistYesterday = "昨日"
override val toplist = "トップリスト"
override val tagVoteDown = "評価を下げる"
override val tagVoteUp = "評価を上げる"
override val tagVoteSuccessfully = "評価が成功しました"
override val deleteSearchHistory = { a: String -> "検索履歴から「$a」を削除しますか?" }
override val actionAddTag = "タグを追加"
override val actionAddTagTip = "新しいタグを入力してください"
override val commentUserUploader = { a: String -> "$a (アップローダー)" }
override val noNetwork = "ネットワークがありません"
override val settingsEhMeteredNetworkWarning = "従量制ネットワークの警告"
override val meteredNetworkWarning = "従量制ネットワークに接続中です"
override val readFrom = { a: Int -> "$a ページを読む" }
override val settingsEhRequestNews = "時限リクエストのニュースページ"
override val settingsEhHideHvEvents = "HV イベント通知を隠す"
override val copyTrans = "翻訳をコピー"
override val defaultDownloadDirNotEmpty = "デフォルトのダウンロードディレクトリが空ではありません!"
override val resetDownloadLocation = "デフォルトにリセット"
override val pickNewDownloadLocation = "新しい場所を選択"
override val dontShowAgain = "今後表示しない"
override val openSettings = "設定を開く"
override val appLinkNotVerifiedMessage = "Android 12 以降の場合、EhViewer で E-Hentai のリンクを開くには確認済みのリンクを手動で追加する必要があります。"
override val appLinkNotVerifiedTitle = "アプリのリンクが確認されていません"
override val openByDefault = "デフォルトで開く"
override val backupBeforeUpdate = "更新前にデータをバックアップする"
override val useCiUpdateChannel = "CI 更新チャンネルを使用する"
override val settingsPrivacyRequireUnlock = "ロックの解除を要求する"
override val settingsPrivacyRequireUnlockDelay = "ロックの遅延"
override val settingsPrivacyRequireUnlockDelaySummary = { a: Int -> "$a 分以内にアプリに戻る場合はロックの解除を要求しません" }
override val settingsPrivacyRequireUnlockDelaySummaryImmediately = "このアプリに戻るたびにロックの解除を要求します"
override val filterLabel = "ブロッカーのタイプ"
override val archivePasswd = "パスワード"
override val archiveNeedPasswd = "アーカイブにはパスワードが必要です"
override val passwdWrong = "パスワードが違います"
override val passwdCannotBeEmpty = "パスワードは空欄にできません"
override val listTileThumbSize = "詳細モードのサムネイルの大きさ"
override val accountName = "アカウント"
override val preloadThumbAggressively = "サムネイルを積極的にプリロードする"
override val animateItems = "リスト項目のアニメーション"
override val animateItemsSummary = "クラッシュやフレームドロップが発生する場合はこれを無効化してください"
override val autoUpdates = "自動で更新を確認する"
override val updateFrequencyNever = "しない"
override val updateFrequencyDaily = "毎日"
override val updateFrequency3days = "3 日ごと"
override val updateFrequencyWeekly = "毎週"
override val updateFrequencyBiweekly = "隔週"
override val updateFrequencyMonthly = "毎月"
override val updateFailed = { a: String -> "更新に失敗: $a" }
override val newVersionAvailable = "新しいバージョンがあります!"
override val alreadyLatestVersion = "すでに最新のバージョンです"
override val permissionDenied = "権限がありません"
override val downloadGalleryFirst = "まずはギャラリーをダウンロードしてください!"
override val exportAsArchive = "アーカイブでエクスポート"
override val exportAsArchiveSuccess = "エクスポートが成功しました"
override val exportAsArchiveFailed = "エクスポートに失敗しました"
override val prefCropBorders = "境界線をクロップ"
override val actionSettings = "設定"
override val prefRotationType = "デフォルトの回転タイプ"
override val viewer = "読書モード"
override val actionMenu = "メニュー"
override val navZonePrev = "前へ"
override val navZoneNext = "次へ"
override val navZoneLeft = "左"
override val navZoneRight = "右"
override val decodeImageError = "画像を読み込めませんでした"
override val actionRetry = "再試行"
override val labelDefault = "デフォルト"
override val rotationFree = "自由"
override val rotationPortrait = "縦方向"
override val rotationReversePortrait = "縦方向 (反転)"
override val rotationLandscape = "横方向"
override val rotationForcePortrait = "縦方向 (固定)"
override val rotationForceLandscape = "横方向 (固定)"
override val leftToRightViewer = "左から右"
override val rightToLeftViewer = "右から左"
override val verticalViewer = "垂直"
override val webtoonViewer = "ウェブトゥーン"
override val verticalPlusViewer = "連続した垂直"
override val pagerViewer = "ページ"
override val prefFullscreen = "全画面"
override val prefCutoutShort = "カットアウト領域にコンテンツを表示"
override val prefPageTransitions = "ページ遷移アニメーション"
override val prefShowPageNumber = "ページ番号を表示"
override val prefShowReaderSeekbar = "ページジャンプシークバーを表示"
override val prefDoubleTapToZoom = "ダブルタップで拡大"
override val prefCustomBrightness = "明るさをカスタマイズ"
override val prefGrayscale = "グレースケール"
override val prefInvertedColors = "色の反転"
override val prefCustomColorFilter = "カスタムカラーフィルター"
override val prefColorFilterMode = "カラーフィルターブレンドモード"
override val filterModeMultiply = "乗算"
override val filterModeScreen = "画面"
override val filterModeOverlay = "オーバーレイ"
override val filterModeLighten = "覆い焼き / 明るい"
override val filterModeDarken = "焼き込み / 暗い"
override val prefKeepScreenOn = "常に画面を ON にする"
override val prefReadWithTappingInverted = "タップゾーンを反転"
override val tappingInvertedNone = "なし"
override val tappingInvertedHorizontal = "横"
override val tappingInvertedVertical = "縦"
override val tappingInvertedBoth = "両方"
override val prefReadWithLongTap = "長押しで表示"
override val prefReaderTheme = "背景の色"
override val whiteBackground = "ホワイト"
override val grayBackground = "グレー"
override val blackBackground = "ブラック"
override val automaticBackground = "自動"
override val lNav = "L 字型"
override val kindlishNav = "Kindle-ish"
override val edgeNav = "エッジ"
override val rightAndLeftNav = "右と左"
override val disabledNav = "無効"
override val prefViewerNav = "タップゾーン"
override val prefImageScaleType = "大きさのタイプ"
override val scaleTypeFitScreen = "画面に合わせる"
override val scaleTypeStretch = "ストレッチ"
override val scaleTypeFitWidth = "幅に合わせる"
override val scaleTypeFitHeight = "高さに合わせる"
override val scaleTypeOriginalSize = "オリジナルのサイズ"
override val scaleTypeSmartFit = "スマートフィット"
override val prefNavigatePan = "タップでワイドに画像をパンする"
override val prefLandscapeZoom = "横方向の画像を拡大"
override val prefZoomStart = "拡大の開始位置"
override val zoomStartAutomatic = "自動"
override val zoomStartLeft = "左"
override val zoomStartRight = "右"
override val zoomStartCenter = "中央"
override val rotationType = "回転のタイプ"
override val prefCategoryReadingMode = "読書モード"
override val prefWebtoonSidePadding = "両端の余白"
override val webtoonSidePadding0 = "なし"
override val webtoonSidePadding5 = "5%"
override val webtoonSidePadding10 = "10%"
override val webtoonSidePadding15 = "15%"
override val webtoonSidePadding20 = "20%"
override val webtoonSidePadding25 = "25%"
override val prefCategoryGeneral = "一般"
override val customFilter = "カスタムフィルター"
override val actionShare = "共有"
override val actionCopy = "コピー"
override val actionSave = "保存"
override val actionSaveTo = "名前を付けて保存…"
override val wideColorGamut = "Display P3 カラースペースを使用する"
override val settingsEhRequestNewsTimepicker = "ニュースをリクエストする時間を設定"
override val darkThemeFollowSystem = "システムに従う"
override val darkThemeOff = "常に OFF にする"
override val darkThemeOn = "常に ON にする"
override val blockedImage = "ブロックされた画像"
override val showBlockedImage = "ブロックされた画像を表示"
override val pageCount = { a: Int -> "$a ページ" }
override val someMinutesAgo = { a: Int -> "$a 分前" }
override val someHoursAgo = { a: Int -> "$a 時間前" }
override val second = { _: Int -> "秒" }
override val minute = { _: Int -> "分" }
override val hour = { _: Int -> "時" }
override val day = { _: Int -> "日" }
override val year = { _: Int -> "年" }
}
@@ -0,0 +1,290 @@
package com.hippo.ehviewer.ui.i18n
object KoTranslations : Translations by EnTranslations {
override val homepage = "홈"
override val whatsHot = "인기 갤러리"
override val favourite = "즐겨찾기"
override val history = "방문 기록"
override val downloads = "다운로드"
override val settings = "설정"
override val username = "사용자 이름"
override val password = "비밀번호"
override val signIn = "로그인"
override val register = "회원가입"
override val signInViaWebview = "WebView를 통하여 로그인"
override val signInFirst = "먼저 로그인하세요."
override val textIsEmpty = "텍스트가 비어 있습니다."
override val waring = "경고"
override val invalidDownloadLocation = "다운로드 위치가 잘못되었습니다. 설정을 확인하세요."
override val clipboardGalleryUrlSnackMessage = "클립보드에 갤러리 주소가 있습니다."
override val clipboardGalleryUrlSnackAction = "보기"
override val errorTimeout = "시간 초과"
override val errorUnknownHost = "알 수 없는 호스트"
override val errorRedirection = "너무 많은 서버 리디렉션"
override val errorSocket = "네트워크 오류"
override val errorUnknown = "이상함"
override val errorCantFindActivity = "앱을 찾을 수 없음"
override val errorCannotParseTheUrl = "URL을 분석할 수 없음"
override val errorDecodingFailed = "디코딩 실패"
override val errorReadingFailed = "읽기 실패"
override val errorOutOfRange = "범위 초과"
override val errorParseError = "구문 분석 오류"
override val error509 = "509"
override val errorInvalidUrl = "잘못된 URL"
override val errorGetPtokenError = "pToken 획득 오류"
override val errorCantSaveImage = "이미지를 저장할 수 없음"
override val errorInvalidNumber = "잘못된 번호"
override val appWaring = "이 앱의 내용은 인터넷에서 받아옵니다. 이 앱을 사용하기 위해서는 받아온 내용 중 일부가 사용자에게 가할 수 있는 신체적 또는 정신적 피해를 감수해야 합니다."
override val errorUsernameCannotEmpty = "사용자 이름은 비워둘 수 없습니다."
override val errorPasswordCannotEmpty = "비밀번호는 비워둘 수 없습니다."
override val guestMode = "로그인 없이 사용"
override val signInFailed = "로그인 실패"
override val getIt = "알겠습니다"
override val galleryListSearchBarHintExhentai = "ExHentai 검색"
override val galleryListSearchBarHintEHentai = "E-Hentai 검색"
override val galleryListSearchBarOpenGallery = "갤러리 열기"
override val galleryListEmptyHit = "The World is Big and the panda sit alone"
override val keywordSearch = "키워드 검색"
override val imageSearch = "이미지 검색"
override val searchImage = "이미지 검색"
override val searchSh = "Expunged 갤러리 표시"
override val searchSto = "토렌트 파일이 있는 갤러리만 검색"
override val searchSr = "최소 평점"
override val selectImage = "이미지 선택"
override val selectImageFirst = "먼저 이미지를 선택해 주세요."
override val addToFavourites = "즐겨찾기에 추가"
override val quickSearch = "빠른 검색"
override val quickSearchTip = "빠른 검색을 추가하려면 \"+\" 버튼을 누르세요."
override val addQuickSearchDialogTitle = "빠른 검색 추가"
override val nameIsEmpty = "이름이 비어 있습니다."
override val delete = "삭제"
override val addQuickSearchTip = "갤러리 목록의 상태가 빠른 검색으로 저장됩니다. 검색 패널의 상태를 저장하려면 먼저 검색을 해야 합니다."
override val readme = "README"
override val imageSearchNotQuickSearch = "이미지 검색은 빠른 검색에 추가할 수 없습니다."
override val duplicateQuickSearch = { a: String -> "이미 같은 내용의 빠른 검색 항목이 있습니다. 이름은 \"$a\"입니다." }
override val duplicateName = "같은 이름의 항목이 이미 있습니다."
override val goToHint = { a: Int, b: Int -> "페이지 $a, 총 $b 페이지" }
override val star2 = "2개"
override val star3 = "3개"
override val star4 = "4개"
override val star5 = "5개"
override val download = "다운로드"
override val read = "읽기"
override val torrentCount = { a: Int -> "토렌트 ($a)" }
override val share = "공유"
override val rate = "평가"
override val similarGallery = "유사"
override val searchCover = "커버 검색"
override val noTags = "태그 없음"
override val noComments = "코멘트 없음"
override val noMoreComments = "코멘트가 더 없음"
override val moreComment = "코멘트 더 보기"
override val refresh = "새로고침"
override val openInOtherApp = "다른 앱에서 열기"
override val rateSuccessfully = "평가를 남겼습니다."
override val rateFailed = "평가에 실패했습니다."
override val noTorrents = "토렌트 없음"
override val torrents = "토렌트"
override val notFavorited = "즐겨찾기에 없음"
override val addFavoritesDialogTitle = "즐겨찾기에 추가"
override val addToFavoriteSuccess = "즐겨찾기에 추가했습니다."
override val removeFromFavoriteSuccess = "즐겨찾기에서 제거했습니다."
override val addToFavoriteFailure = "즐겨찾기에 추가하지 못했습니다."
override val removeFromFavoriteFailure = "즐겨찾기에서 제거하지 못했습니다."
override val galleryInfo = "갤러리 정보"
override val copiedToClipboard = "클립보드에 복사했습니다."
override val keyGid = "GID"
override val keyToken = "토큰"
override val keyUrl = "주소"
override val keyTitle = "제목"
override val keyTitleJpn = "일본어 제목"
override val keyThumb = "섬네일"
override val keyCategory = "카테고리"
override val keyUploader = "업로더"
override val keyPosted = "날짜"
override val keyParent = "부모"
override val keyVisible = "가시성"
override val keyLanguage = "언어"
override val keyPages = "페이지"
override val keySize = "크기"
override val keyFavoriteCount = "즐겨찾기\n횟수"
override val keyFavorited = "즐겨찾기됨"
override val keyRatingCount = "평가 횟수"
override val keyRating = "평가"
override val keyTorrents = "토렌트"
override val keyTorrentUrl = "토렌트 주소"
override val galleryComments = "갤러리 코멘트"
override val commentSuccessfully = "코멘트를 남겼습니다."
override val commentFailed = "코멘트를 남기지 못했습니다."
override val copyCommentText = "코멘트 텍스트 복사"
override val voteUp = "추천 (Vote up)"
override val cancelVoteUp = "추천 취소"
override val voteDown = "비추천 (Vote down)"
override val cancelVoteDown = "비추천 취소"
override val voteUpSuccessfully = "추천했습니다."
override val cancelVoteUpSuccessfully = "추천을 취소했습니다."
override val voteDownSuccessfully = "비추천했습니다."
override val cancelVoteDownSuccessfully = "비추천을 취소했습니다."
override val voteFailed = "추천/비추천에 실패했습니다."
override val checkVoteStatus = "추천/비추천 상태 보기"
override val goTo = "이동"
override val sceneDownloadTitle = { a: String -> "다운로드 - $a" }
override val noDownloadInfo = "다운로드한 항목이 여기에 표시됩니다."
override val downloadStateNone = "유휴 상태"
override val downloadStateWait = "대기 중"
override val downloadStateDownloading = "다운로드 중"
override val downloadStateDownloaded = "다운로드함"
override val downloadStateFailed = "실패함"
override val downloadStateFailed2 = { a: Int -> "$a 남아 있음" }
override val downloadStateFinish = "완료"
override val stat509AlertTitle = "509 경고"
override val stat509AlertText = "이미지 제한에 도달하였습니다. 다운로드를 멈추고 잠시 쉬세요."
override val statDownloadDoneTitle = "다운로드 완료"
override val statDownloadDoneTextSucceeded = { a: Int -> "$a 성공" }
override val statDownloadDoneTextFailed = { a: Int -> "$a 실패" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a 성공, $b 실패" }
override val statDownloadDoneLineSucceeded = { a: String -> "성공: $a" }
override val statDownloadDoneLineFailed = { a: String -> "실패: $a" }
override val downloadRemoveDialogTitle = "다운로드 항목 제거"
override val downloadRemoveDialogMessage = { a: String -> "$a 항목을 다운로드 목록에서 제거하시겠습니까?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "${a}개 항목을 다운로드 목록에서 제거하시겠습니까?" }
override val downloadRemoveDialogCheckText = "이미지 파일 삭제"
override val statDownloadActionStopAll = "모두 중지"
override val defaultDownloadLabelName = "기본"
override val downloadMoveDialogTitle = "이동"
override val downloadLabels = "다운로드 레이블"
override val downloadStartAll = "모두 시작"
override val downloadStopAll = "모두 중지"
override val downloadResetReadingProgress = "독서 진행도 초기화"
override val resetReadingProgressMessage = "다운로드한 모든 갤러리의 독서 진행도를 초기화하시겠습니까?"
override val downloadServiceLabel = "EhViewer 다운로드 서비스"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a, $b 남음" }
override val rememberDownloadLabel = "다운로드 레이블 기억"
override val defaultDownloadLabel = "기본 다운로드 레이블"
override val addedToDownloadList = "다운로드 목록에 추가됨"
override val add = "추가"
override val newLabelTitle = "새 레이블"
override val labelTextIsEmpty = "레이블 텍스트가 비어 있습니다."
override val labelTextIsInvalid = "\"기본\"은 레이블 이름으로 사용할 수 없습니다."
override val labelTextExist = "이미 있는 레이블입니다."
override val renameLabelTitle = "레이블 이름 바꾸기"
override val noHistory = "읽은 갤러리가 여기에 표시됩니다."
override val clearAll = "모두 지우기"
override val clearAllHistory = "모든 방문 기록을 지우시겠습니까?"
override val filterTitle = "제목"
override val filterUploader = "업로더"
override val filterTag = "태그"
override val filterTagNamespace = "태그 네임스페이스"
override val showDefinition = "정의 표시"
override val uConfig = "E-Hentai 설정"
override val applyTip = "설정을 저장하려면 체크 표시를 누르세요."
override val shareImage = "이미지 공유"
override val imageSaved = { a: String -> "이미지를 $a 경로에 저장함" }
override val settingsEh = "EH"
override val settingsEhSignOut = "로그아웃"
override val settingsEhIdentityCookiesSigned = "식별용 쿠키를 사용하여 이 계정으로 로그인할 수 있습니다.<br><b>안전하게 보관하세요.</b>"
override val settingsEhIdentityCookiesGuest = "로그인 상태가 아닙니다."
override val settingsUConfig = "E-Hentai 설정"
override val settingsUConfigSummary = "E-Hentai 사이트의 설정 페이지를 엽니다."
override val settingsEhGallerySite = "갤러리 사이트"
override val settingsEhListMode = "목록 모드"
override val settingsEhListModeDetail = "자세히"
override val settingsEhListModeThumb = "섬네일"
override val settingsEhDetailSize = "상세 정보 크기"
override val settingsEhDetailSizeLong = "길게"
override val settingsEhDetailSizeShort = "짧게"
override val settingsEhShowJpnTitle = "일본어 제목 표시"
override val settingsEhShowGalleryPages = "갤러리 페이지 수 표시"
override val settingsEhShowGalleryPagesSummary = "갤러리 목록에 해당 갤러리의 페이지 수를 표시합니다"
override val settingsEhShowTagTranslations = "번역된 태그 표시"
override val settingsEhShowTagTranslationsSummary = "영어 태그 대신 번역된 태그를 표시합니다. 데이터 파일을 다운로드하는데 시간이 걸립 수 있습니다."
override val settingsEhTagTranslationsSource = "Placeholder"
override val settingsEhTagTranslationsSourceUrl = "https://placeholder"
override val settingsDownload = "다운로드"
override val settingsDownloadDownloadLocation = "다운로드 위치"
override val settingsDownloadCantGetDownloadLocation = "다운로드 위치를 가져올 수 없습니다."
override val settingsDownloadMediaScan = "미디어 스캔 허용"
override val settingsDownloadMediaScanSummaryOn = "다른 사람들에게 갤러리 앱을 들키지 마세요."
override val settingsDownloadMediaScanSummaryOff = "대부분의 갤러리 앱에서 다운로드 경로에 있는 사진을 무시합니다."
override val settingsDownloadConcurrency = "다중 스레드 다운로드"
override val settingsDownloadConcurrencySummary = { a: Int -> "${a}개 이미지까지" }
override val settingsDownloadPreloadImage = "이미지 미리 불러오기"
override val settingsDownloadPreloadImageSummary = { a: Int -> "다음 ${a}개 이미지를 미리 불러옴" }
override val settingsDownloadDownloadOriginImage = "원본 이미지 다운로드"
override val settingsDownloadDownloadOriginImageSummary = "이 옵션은 위험합니다! 509 오류가 발생할 수 있습니다."
override val settingsDownloadRestoreDownloadItems = "다운로드 항목 복구"
override val settingsDownloadRestoreDownloadItemsSummary = "다운로드 위치에 존재하는 모든 다운로드 항목 복구"
override val settingsDownloadRestoreNotFound = "복구할 다운로드 항목을 찾을 수 없습니다."
override val settingsDownloadRestoreFailed = "복구하지 못했습니다."
override val settingsDownloadRestoreSuccessfully = { a: Int -> "${a}개 항목을 복구했습니다." }
override val settingsDownloadCleanRedundancy = "잉여 파일 삭제"
override val settingsDownloadCleanRedundancySummary = "다운로드 위치에 존재하지만 다운로드 목록에는 없는 갤러리 이미지 제거"
override val settingsDownloadCleanRedundancyNoRedundancy = "잉여 파일이 없습니다."
override val settingsDownloadCleanRedundancyDone = { a: Int -> "잉여 파일을 청소했습니다. 모두 ${a}개 항목을 지웠습니다." }
override val settingsAdvanced = "고급"
override val settingsAdvancedSaveParseErrorBody = "파싱 오류 시 HTML 내용 저장"
override val settingsAdvancedSaveParseErrorBodySummary = "HTML 파일에는 개인 정보가 포함될 수 있습니다."
override val settingsAdvancedSaveCrashLog = "앱 충돌 시 로그 저장"
override val settingsAdvancedSaveCrashLogSummary = "충돌 로그는 개발자가 버그를 수정하는 데 도움이 됩니다."
override val settingsAdvancedDumpLogcat = "로그캣 덤프"
override val settingsAdvancedDumpLogcatSummary = "외부 저장소에 로그캣 저장"
override val settingsAdvancedDumpLogcatFailed = "로그캣을 덤프하지 못했습니다."
override val settingsAdvancedDumpLogcatTo = { a: String -> "$a 경로에 로그캣을 저장했습니다." }
override val settingsAdvancedReadCacheSize = "읽기 캐시 크기"
override val settingsAdvancedAppLanguageTitle = "앱 언어 (Language)"
override val settingsAdvancedExportData = "데이터 내보내기"
override val settingsAdvancedExportDataSummary = "다운로드 목록, 빠른 검색 목록 등의 데이터를 외부 저장소에 저장"
override val settingsAdvancedExportDataTo = { a: String -> "$a 경로에 데이터를 내보냈습니다." }
override val settingsAdvancedExportDataFailed = "데이터를 내보내지 못했습니다."
override val settingsAdvancedImportData = "데이터 가져오기"
override val settingsAdvancedImportDataSummary = "이전에 저장한 데이터 불러오기"
override val settingsAdvancedImportDataSuccessfully = "데이터를 가져왔습니다."
override val settingsAbout = "앱 정보"
override val settingsAboutDeclarationSummary = "EhViewer는 E-Hentai.org 사이트와 아무런 관계가 없습니다."
override val settingsAboutAuthor = "개발자"
override val settingsAboutSource = "소스 코드"
override val settingsAboutVersion = "빌드 버전"
override val settingsAboutCheckForUpdates = "업데이트 확인"
override val cantReadTheFile = "파일을 읽을 수 없습니다."
override val appLanguageSystem = "시스템 언어 (기본값)"
override val pleaseWait = "잠시만 기다려 주세요."
override val cloudFavorites = "클라우드 즐겨찾기"
override val localFavorites = "로컬 즐겨찾기"
override val searchBarHint = { a: String -> "$a 검색" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $b" }
override val deleteFavoritesDialogTitle = "즐겨찾기에서 삭제"
override val deleteFavoritesDialogMessage = { a: Int -> "${a}개 항목을 즐겨찾기에서 삭제하시겠습니까?" }
override val moveFavoritesDialogTitle = "즐겨찾기 이동"
override val defaultFavoritesCollection = "기본 즐겨찾기 컬렉션"
override val letMeSelect = "직접 선택"
override val collections = "컬렉션"
override val errorSomethingWrongHappened = "뭔가 잘못되었습니다."
override val fromTheFuture = "미래에"
override val justNow = "방금"
override val yesterday = "어제"
override val someDaysAgo = { a: Int -> "${a}일 전" }
override val archive = "아카이브"
override val noArchives = "아카이브 없음"
override val downloadArchiveStarted = "아카이브 다운로드가 시작되었습니다."
override val downloadArchiveFailure = "아카이브 다운로드에 실패했습니다."
override val downloadArchiveFailureNoHath = "아카이브를 다운로드하려면 H@H 클라이언트가 필요합니다."
override val settingsPrivacy = "개인 정보"
override val settingsPrivacySecure = "화면 캡처 허용 안 함"
override val settingsPrivacySecureSummary = "이 앱에서 스크린샷을 찍을 수 없게 하며, \"최근 앱\" 화면에서 앱의 내용을 보이지 않게 합니다."
override val downloadService = "다운로드 서비스"
override val keyFavoriteName = "즐겨찾기"
override val darkTheme = "어두운 테마"
override val darkThemeFollowSystem = "시스템 설정"
override val darkThemeOff = "항상 꺼짐"
override val darkThemeOn = "항상 켜짐"
override val pageCount = { a: Int -> "$a 페이지" }
override val someMinutesAgo = { a: Int -> "${a}분 전" }
override val someHoursAgo = { a: Int -> "${a}시간 전" }
override val second = { _: Int -> "초" }
override val minute = { _: Int -> "분" }
override val hour = { _: Int -> "시간" }
override val day = { _: Int -> "일" }
override val year = { _: Int -> "년" }
}
@@ -0,0 +1,224 @@
package com.hippo.ehviewer.ui.i18n
object NbNoTranslations : Translations by EnTranslations {
override val textIsEmpty = "Tekst tom"
override val waring = "Advarsel"
override val clipboardGalleryUrlSnackAction = "Vis"
override val errorTimeout = "Tidsavbrudd"
override val errorUnknownHost = "Ukjent vert"
override val errorRedirection = "For mange videresendinger"
override val errorSocket = "Nettverksfeil"
override val password = "Passord"
override val signInViaWebview = "Logg inn via WebView"
override val downloads = "Nedlastninger"
override val register = "Registrering"
override val errorInvalidNumber = "Ugyldig nummer"
override val similarGallery = "Lignende"
override val homepage = "Hjemmeside"
override val history = "Historikk"
override val subscription = "Abonnement"
override val settings = "Innstillinger"
override val username = "Brukernavn"
override val signIn = "Logg inn"
override val signInFirst = "Logg inn først"
override val download = "Last ned"
override val quickSearch = "Hurtigsøk"
override val star2 = "2 stjerner"
override val readme = "LESMEG"
override val star4 = "4 stjerner"
override val noTorrents = "Ingen torrenter"
override val searchSfl = "Språk"
override val guestMode = "Fortsett uten å logge inn"
override val favoredTimes = { a: Int -> "♥ $a" }
override val torrentCount = { a: Int -> "Torrent ($a)" }
override val share = "Del"
override val galleryListSearchBarOpenGallery = "Åpne galleriet"
override val searchSpTo = "til"
override val searchSfu = "Opplaster"
override val delete = "Slett"
override val imageSearch = "Bildesøk"
override val searchCover = "Søk i omslag"
override val searchImage = "Bildesøk"
override val selectImage = "Velg bilde"
override val star3 = "3 stjerner"
override val read = "Les"
override val noComments = "Ingen kommentarer"
override val duplicateName = "Dette navnet er allerede i bruk."
override val star5 = "5 stjerner"
override val noTags = "Ingen etiketter"
override val noMoreComments = "Ingen flere kommentarer"
override val openInOtherApp = "Åpne med et annet program"
override val torrents = "Torrenter"
override val refresh = "Gjenoppfrisk"
override val getIt = "Skjønner"
override val keywordSearch = "Nøkkelordssøk"
override val searchSft = "Etiketter"
override val any = "Ubegrenset"
override val moreComment = "Flere kommentarer"
override val tagVoteUp = "Stem opp"
override val prefGrayscale = "Gråskala"
override val actionShare = "Del"
override val filterTheTag = { a: String -> "Blokker etiketten «$a»?" }
override val rating9 = "Underbar"
override val errorInvalidUrl = "Ugyldig nettadresse"
override val errorCannotParseTheUrl = "Kan ikke tolke nettadressen"
override val rating4 = "Dårlig"
override val errorCantFindActivity = "Finner ikke programmet"
override val error509 = "509"
override val rating7 = "Bra"
override val rating5 = "Middelmådig"
override val rating3 = "Elending"
override val errorDecodingFailed = "Dekoding mislyktes"
override val errorReadingFailed = "Lesing mislyktes"
override val errorParseError = "Tolkningsfeil"
override val filterTheUploader = { a: String -> "Blokker opplasteren «$a»?" }
override val rating10 = "Mesterverk"
override val rating8 = "Storslått"
override val rating6 = "OK"
override val rating2 = "Pinlig"
override val keyPages = "Sider"
override val shareImage = "Del bilde"
override val settingsEhSignOut = "Logg ut"
override val settingsEhIdentityCookiesGuest = "Turistmodus"
override val settingsAboutVersion = "Byggversjon"
override val settingsMyTags = "Mine etiketter"
override val settingsEhTagTranslationsSource = "Plassholder"
override val settingsEhShowGalleryPages = "Vis gallerisider"
override val settingsAdvanced = "Avansert"
override val settingsAbout = "Om"
override val settingsAdvancedExportData = "Eksporter data"
override val settingsAdvancedExportDataTo = { a: String -> "Data eksportert til $a" }
override val settingsAdvancedImportData = "Importer data"
override val settingsAboutSource = "Kildekode"
override val rating1 = "Utolererbar"
override val rating0 = "Katastrofe"
override val galleryInfo = "Galleri-info"
override val settingsEhListMode = "Listemodus"
override val copiedToClipboard = "Kopiert til utklippstavlen"
override val keyTitle = "Navn"
override val statDownloadActionStopAll = "Stopp alle"
override val defaultDownloadLabelName = "Forvalg"
override val settingsUConfig = "EHentai-innstillinger"
override val keyToken = "Symbol"
override val keyLanguage = "Språk"
override val goTo = "Gå til"
override val keyUrl = "Nettadresse"
override val cantReadTheFile = "Kan ikke lese filen"
override val keyCategory = "Kategori"
override val keyUploader = "Opplaster"
override val keyVisible = "Synlig"
override val keySize = "Størrelse"
override val downloadMoveDialogTitle = "Flytt"
override val keyTorrents = "Torrenter"
override val galleryComments = "Gallerikommentarer"
override val downloadStateWait = "Venter"
override val downloadStateFailed = "Mislykket"
override val downloadStateFailed2 = { a: Int -> "$a ufullstendig" }
override val downloadLabels = "Last ned etiketter"
override val downloadStartAll = "Start alle"
override val editComment = "Rediger kommentar"
override val stat509AlertTitle = "509-advarsel"
override val statDownloadDoneTitle = "Nedlasting fullført"
override val downloadStateNone = "Pauset"
override val downloadStateDownloading = "Laster ned"
override val downloadStateDownloaded = "Nedlastet"
override val downloadStateFinish = "Ferdig"
override val downloadRemoveDialogCheckText = "Slett bildefiler"
override val settingsEhGallerySite = "Galleriside"
override val downloadStopAll = "Stopp alle"
override val imageSaved = { a: String -> "Bilde lagret i $a" }
override val settingsDownloadDownloadOriginImage = "Last ned opprinnelig bilde"
override val settingsPrivacySecure = "Forhindre skjermavbildninger"
override val downloadService = "Nedlastingstjeneste"
override val actionCopy = "Kopier"
override val toplist = "Toppliste"
override val toplistPastyear = "Forrige år"
override val toplistYesterday = "I går"
override val actionAddTag = "Legg til etikett"
override val resetDownloadLocation = "Tilbakestill til forvalg"
override val dontShowAgain = "Ikke vis igjen"
override val commentUserUploader = { a: String -> "$a (opplaster)" }
override val copyTrans = "Kopier oversettelse"
override val prefRotationType = "Forvalgt rotasjonstype"
override val viewer = "Lesemodus"
override val navZonePrev = "Forrige"
override val openSettings = "Åpne innstillingene"
override val openByDefault = "Åpne som forvalg"
override val settingsPrivacyRequireUnlock = "Krev opplåsing"
override val archivePasswd = "passord"
override val accountName = "Konto"
override val actionSettings = "Innstillinger"
override val navZoneLeft = "Venstre"
override val prefFullscreen = "Fullskjermsvisning"
override val prefInvertedColors = "Invertert"
override val actionMenu = "Meny"
override val navZoneNext = "Neste"
override val actionRetry = "Prøv igjen"
override val labelDefault = "Forvalg"
override val tappingInvertedHorizontal = "Vannrett"
override val prefCategoryReadingMode = "Lesemodus"
override val automaticBackground = "Automatisk"
override val navZoneRight = "Høyre"
override val prefReadWithLongTap = "Vis ved lang-trykk"
override val prefCustomColorFilter = "Egendefinert fargefilter"
override val filterModeScreen = "Skjerm"
override val prefKeepScreenOn = "Behold skjerm påslått"
override val tappingInvertedVertical = "Loddrett"
override val tappingInvertedBoth = "Begge"
override val whiteBackground = "Hvit"
override val prefReaderTheme = "Bakgrunnsfarge"
override val blackBackground = "Svart"
override val grayBackground = "Grå"
override val edgeNav = "Kant"
override val scaleTypeStretch = "Strekk"
override val rightAndLeftNav = "Høyre og venstre"
override val appLanguageSystem = "Systemspråk (forvalg)"
override val errorSomethingWrongHappened = "Noe gikk galt"
override val justNow = "Akkurat nå"
override val moveFavoritesDialogTitle = "Flytt favoritter"
override val letMeSelect = "La meg velge"
override val toplistPastmonth = "Forrige måned"
override val deleteSearchHistory = { a: String -> "Slett «$a» fra søkehistorikk?" }
override val collections = "Samlinger"
override val tagVoteDown = "Stem ned"
override val yesterday = "I går"
override val someDaysAgo = { a: Int -> "$a dager siden" }
override val downloadAll = "Alle"
override val actionSave = "Lagre"
override val settingsPrivacy = "Personvern"
override val noArchives = "Ingen arkiver"
override val actionSaveTo = "Lagre i …"
override val pageCount = { quantity: Int ->
when (quantity) {
1 -> "$quantity side"
else -> "$quantity sider"
}
}
override val someMinutesAgo = { quantity: Int ->
when (quantity) {
1 -> "Et minutt siden"
else -> "$quantity minutter siden"
}
}
override val minute = { _: Int -> "min" }
override val someHoursAgo = { quantity: Int ->
when (quantity) {
1 -> "Én time siden"
else -> "$quantity timer siden"
}
}
override val hour = { quantity: Int ->
when (quantity) {
1 -> "time"
else -> "timer"
}
}
override val second = { _: Int -> "sek" }
override val day = { quantity: Int ->
when (quantity) {
1 -> "dag"
else -> "dager"
}
}
override val year = { _: Int -> "år" }
}
@@ -0,0 +1,299 @@
package com.hippo.ehviewer.ui.i18n
object ThTranslations : Translations by EnTranslations {
override val homepage = "หน้าหลัก"
override val whatsHot = "เรื่องที่กำลังมาแรงมากๆ"
override val favourite = "รายการโปรด"
override val history = "ประวัติเข้าชม"
override val downloads = "ดาวน์โหลด"
override val settings = "การตั้งค่า"
override val username = "ชื่อผู้ใช้"
override val password = "รหัสผ่าน"
override val signIn = "ลงชื่อเข้าใช้"
override val register = "ลงทะเบียน"
override val signInViaWebview = "ลงชื่อเข้าใช้ผ่านมุมมองเว็บไซต์"
override val signInFirst = "โปรดลงชื่อเข้าใช้ก่อนเป็นอันดับแรก"
override val textIsEmpty = "ข้อความห้ามเว้นว่างไว้"
override val waring = "คำเตือน"
override val invalidDownloadLocation = "ดูเหมือนที่อยู่ในการดาวน์โหลดนั้นไม่พร้อมใช้งาน โปรดตั้งค่าในเมนูการตั้งค่า"
override val clipboardGalleryUrlSnackMessage = "มีลิงค์ของเว็บแกลเลอรี่อยู่ในคลิปบอร์ด"
override val clipboardGalleryUrlSnackAction = "ดู"
override val errorTimeout = "หมดเวลา"
override val errorUnknownHost = "ไม่รู้จักโฮสต์"
override val errorRedirection = "มีการเปลี่ยนทางเยอะเกินไป"
override val errorSocket = "เน็ตเวิร์คเกิดข้อผิดพลาด"
override val errorUnknown = "มันแปลกๆนะ"
override val errorCantFindActivity = "หาแอปพลิเคชั่นไม่เจอ"
override val errorCannotParseTheUrl = "ไม่สามารถวิเคราะห์ URL"
override val errorDecodingFailed = "การถอดรหัสล้มเหลว"
override val errorReadingFailed = "การอ่านล้มเหลว"
override val errorOutOfRange = "ไม่อยู่ในขอบเขต"
override val errorParseError = "การวิเคราะห์ผิดพลาด"
override val error509 = "509"
override val errorInvalidUrl = "URL ไม่ถูกต้อง"
override val errorGetPtokenError = "การรับ pToken มีปัญหา"
override val errorCantSaveImage = "ไม่สามารถบันทึกรูปภาพได้"
override val errorInvalidNumber = "จำนวนไม่ถูกต้อง"
override val appWaring = "เนื้อหาภายในแอปพลิเคชั่นนี้มาจากอินเทอร์เน็ตทั้งหมด อาจมีเนื้อหาบางอย่างที่มีผลต่อร่างกายหรือจิตใจของคุณ คุณจะต้องยอมรับความเสี่ยงที่ดังกล่าว และดำเนินการต่อไป"
override val errorUsernameCannotEmpty = "ชื่อผู้ใช้ห้ามเว้นว่างไว้"
override val errorPasswordCannotEmpty = "รหัสผ่านห้ามเว้นว่างไว้"
override val guestMode = "ดำเนินการต่อโดยไม่ต้องลงชื่อเข้าระบบ"
override val signInFailed = "การลงชื่อเข้าใช้ล้มเหลว"
override val getIt = "เข้าใจแล้ว ไม่ต้องแสดงอีก"
override val galleryListSearchBarHintExhentai = "ค้นหาใน ExHentai"
override val galleryListSearchBarHintEHentai = "ค้นหาใน E-Hentai"
override val galleryListSearchBarOpenGallery = "เปิดแกลเลอรี่"
override val galleryListEmptyHit = "โลกนั้นนะมันกว้างงงงงใหญ่ไพรศาล และแพนด้านั่งโดดเดี่ยวเดียวดายในโลกกลมๆ"
override val keywordSearch = "คีย์เวิร์ดในการค้นหา"
override val imageSearch = "ค้นหาด้วยรูป"
override val searchImage = "ค้นหาด้วยรูปภาพ"
override val searchSh = "แสดงแกลเลอรี่ที่ถูกลบออก"
override val searchSto = "แสดงผลเฉพาะแกลเลอรี่ที่มีไฟล์ Torrents"
override val searchSr = "เรตติ้งขั้นต่ำ"
override val selectImage = "เลือกรูปภาพ"
override val selectImageFirst = "โปรดเลือกรูปภาพก่อน"
override val addToFavourites = "เพิ่มเข้าในรายการโปรด"
override val quickSearch = "ค้นหาอย่างด่วน"
override val quickSearchTip = "แตะ \"+\" เพื่อเพิ่มการค้นหาอย่างด่วน"
override val addQuickSearchDialogTitle = "เพิ่มค้นหาอย่างด่วน"
override val nameIsEmpty = "ชื่อห้ามเว้นว่างไว้"
override val delete = "ลบ"
override val addQuickSearchTip = "รายการของแกลเลอรี่ต่างๆจะถูกบันทึกเป็นการค้นหาอย่างด่วน ต้องทำการค้นหาก่อนเพื่อบันทึกลงในรายการของแผงการค้นหา"
override val readme = "อ่านก่อนสักนิด"
override val imageSearchNotQuickSearch = "ไม่สามารถเพิ่มรูปในการค้นหาให้เป็นการค้นหาอย่างด่วนได้"
override val duplicateQuickSearch = { a: String -> "มีตัวค้นหาอย่างด่วนอยู่แล้วในชื่อ \"$a\"." }
override val duplicateName = "ชื่อนี้มีการใช้งานอยู่แล้ว"
override val goToHint = { a: Int, b: Int -> "หน้า $a, มีทั้งหมด $b หน้า" }
override val star2 = "2 ดาว"
override val star3 = "3 ดาว"
override val star4 = "4 ดาว"
override val star5 = "5 ดาว"
override val download = "ดาวน์โหลด"
override val read = "อ่าน"
override val favoredTimes = { a: Int -> "\u2665 $a" }
override val ratingText = { a: String, b: Float, c: Int -> "%s (%.2f, %d)".format(a, b, c) }
override val torrentCount = { a: Int -> "Torrent ($a)" }
override val share = "แชร์"
override val rate = "คะแนน"
override val similarGallery = "เหมือน"
override val searchCover = "ค้นหาปก"
override val noTags = "ไม่มีแท็ก"
override val noComments = "ไม่มีความคิดเห็น"
override val noMoreComments = "ไม่มีความเห็นเพิ่มเติมแล้ว"
override val moreComment = "ความคิดเห็นเพิ่มเติม"
override val refresh = "รีเฟรช"
override val openInOtherApp = "เปิดด้วยแอปอื่น"
override val rateSuccessfully = "ให้คะแนนเรียบร้อยแล้ว"
override val rateFailed = "การให้คะแนนล้มเหลว"
override val noTorrents = "ไม่มีไฟล์ torrents"
override val torrents = "Torrents"
override val notFavorited = "ยังไม่เพิ่มรายการโปรด"
override val addFavoritesDialogTitle = "เพิ่มเข้ารายการโปรด"
override val addToFavoriteSuccess = "เพิ่มเข้าในรายการโปรดแล้ว"
override val removeFromFavoriteSuccess = "ลบออกจากรายการโปรดแล้ว"
override val addToFavoriteFailure = "เกิดความล้มเหลวในการเพิ่มเข้าในรายการโปรด"
override val removeFromFavoriteFailure = "เกิดข้อล้มเหลวในการลบออกจากรายการโปรด"
override val rating10 = "นี้มันผลงานมาสเตอร์พีคชัดๆ!"
override val rating9 = "อะเมซิ่งมากๆ!"
override val rating8 = "เยี่ยม!"
override val rating7 = "ดี!"
override val rating6 = "ก็โอเคนะ"
override val rating5 = "ก็ไม่แย่นะ"
override val rating4 = "แย่"
override val rating3 = "แย่มาก/กลัวแล้ว"
override val rating2 = "โอ๊ยยย~"
override val rating1 = "ไม่ไหวแล้วนะ!"
override val rating0 = "พังพินาศสุดๆไปเลย!"
override val galleryInfo = "ข้อมูลแกลเลอรี่"
override val copiedToClipboard = "คัดลอกลงคลิปบอร์ดแล้ว"
override val keyGid = "Gid"
override val keyToken = "โทเคน"
override val keyUrl = "URL"
override val keyTitle = "ชื่อเรื่อง"
override val keyTitleJpn = "ชื่อเรื่องญี่ปุ่น"
override val keyThumb = "ภาพตัวอย่าง"
override val keyCategory = "หมวดหมู่"
override val keyUploader = "ผู้อัพโหลด"
override val keyPosted = "โพสต์เมื่อ"
override val keyParent = "Parent"
override val keyVisible = "แสดง"
override val keyLanguage = "ภาษา"
override val keyPages = "หน้า"
override val keySize = "ขนาดไฟล์"
override val keyFavoriteCount = "จำนวนรายการโปรด"
override val keyFavorited = "เพิ่มรายการโปรด"
override val keyRatingCount = "คนให้คะแนน"
override val keyRating = "คะแนน"
override val keyTorrents = "ไฟล์ Torrents"
override val keyTorrentUrl = "Torrent URL"
override val galleryComments = "การแสดงความคิดเห็นในแกลเลอรี่"
override val commentSuccessfully = "แสดงความคิดเห็นเสร็จเรียบร้อยแล้ว"
override val commentFailed = "การแสดงความคิดเห็นล้มเหลว"
override val copyCommentText = "คัดลอกข้อความของความคิดเห็น"
override val voteUp = "ถูกใจ"
override val cancelVoteUp = "ยกเลิกโหวตถูกใจ"
override val voteDown = "ไม่ถูกใจ"
override val cancelVoteDown = "ยกเลิกโหวตไม่ถูกใจ"
override val voteUpSuccessfully = "โหวดถูกใจแล้ว"
override val cancelVoteUpSuccessfully = "ยกเลิกโหวตถูกใจแล้ว"
override val voteDownSuccessfully = "โหวดไม่ถูกใจเสร็จแล้ว"
override val cancelVoteDownSuccessfully = "ยกเลิกโหวดไม่ถูกใจแล้ว"
override val voteFailed = "การโหวตล้มเหลว"
override val checkVoteStatus = "ดูรายละเอียดการโหวต"
override val goTo = "ไปที่"
override val sceneDownloadTitle = { a: String -> "ดาวน์โหลด - $a" }
override val noDownloadInfo = "รายการดาวน์โหลดจะอยู่ตรงนี้"
override val downloadStateNone = "Idle"
override val downloadStateWait = "กำลังรอ"
override val downloadStateDownloading = "กำลังดาวน์โหลด"
override val downloadStateDownloaded = "ดาวน์โหลดแล้ว"
override val downloadStateFailed = "ล้มเหลว"
override val downloadStateFailed2 = { a: Int -> "$a ที่ไม่เสร็จ" }
override val downloadStateFinish = "เสร็จ"
override val stat509AlertTitle = "คำเตือน 509"
override val stat509AlertText = "การลิมิตของรูปภาพต่อวันถึงลิมิตแล้ว กรุณาหยุดโหลดและพักผ่อนบ้างนะ"
override val statDownloadDoneTitle = "ดาวน์โหลดเสร็จสิ้น"
override val statDownloadDoneTextSucceeded = { a: Int -> "$a ที่เสร็จ" }
override val statDownloadDoneTextFailed = { a: Int -> "$a ที่ล้มเหลว" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a ที่เสร็จ, $b ที่ล้มเหลว" }
override val statDownloadDoneLineSucceeded = { a: String -> "เสร็จแล้ว: $a" }
override val statDownloadDoneLineFailed = { a: String -> "ล้มเหลว: $a" }
override val downloadRemoveDialogTitle = "ลบรายการดาวน์โหลด"
override val downloadRemoveDialogMessage = { a: String -> "ต้องการลบ $a ออกจากรายการดาวน์โหลดไหม?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "ต้องการลบ $a รายการจากรายการดาวน์โหลดไหม?" }
override val downloadRemoveDialogCheckText = "ลบไฟล์ภาพด้วย"
override val statDownloadActionStopAll = "หยุดทั้งหมด"
override val defaultDownloadLabelName = "ค่าเริ่มต้น"
override val downloadMoveDialogTitle = "ย้าย"
override val downloadLabels = "ป้ายชื่อดาวน์โหลด"
override val downloadStartAll = "เริ่มทั้งหมด"
override val downloadStopAll = "หยุดทั้งหมด"
override val downloadResetReadingProgress = "รีเซ็ตตำแหน่งที่อ่าน"
override val resetReadingProgressMessage = "รีเซ็ตตำแหน่งที่อ่านค้างไว้ทั้งหมดในแกลเลอรี่ที่โหลดไว้ทั้งหมดหรือไม่?"
override val downloadServiceLabel = "บริการดาวน์โหลดของ EhViewer"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a, $b left" }
override val rememberDownloadLabel = "จดจำป้ายชื่อดาวน์โหลด"
override val defaultDownloadLabel = "ป้ายชื่อดาวน์โหลดเริ่มต้น"
override val addedToDownloadList = "เพิ่มเข้าในรายการดาวน์โหลดแล้ว"
override val add = "เพิ่ม"
override val newLabelTitle = "ป้ายชื่ออันใหม่"
override val labelTextIsEmpty = "ข้อความป้ายชื่อว่างอยู่"
override val labelTextIsInvalid = "ชื่อ \"ค่าเริ่มต้น\" นั้นไม่ถูกต้อง"
override val labelTextExist = "มีป้ายชื่อนี้อยู่แล้ว"
override val renameLabelTitle = "เปลี่ยนชื่อ"
override val noHistory = "ประวัติการเข้าชมแกลเลอรี่จะอยู่ตรงนี้"
override val clearAll = "ลบทั้งหมด"
override val clearAllHistory = "จะลบประวัติทั้งหมดเลยหรือไม่?"
override val filterTitle = "ชื่อเรื่อง"
override val filterUploader = "ผู้อัพโหลด"
override val filterTag = "แท็ก"
override val filterTagNamespace = "ชื่อของแท็ก"
override val showDefinition = "แสดงความหมาย"
override val uConfig = "การตั้งค่า EHentai"
override val applyTip = "แตะเครื่องหมายถูกเพื่อบันทึกการตั้งค่าแล้ว"
override val shareImage = "แชร์รูปภาพ"
override val imageSaved = { a: String -> "ภาพถูกบันทึกไปที่ $a" }
override val settingsEh = "EH"
override val settingsEhSignOut = "ออกจากระบบ"
override val settingsEhIdentityCookiesSigned = "คุกกี๊ยืนยันตัวตนสามารถใช้ลงชื่อเข้าสู่ระบบสำหรับบัญชีนี้เท่านั้น<br><b>เก็บ รักษา ให้ ปลอดภัย</b>"
override val settingsEhIdentityCookiesGuest = "ยังไม่ลงชื่อเข้าสู่ระบบ"
override val settingsUConfig = "การตั้งค่า EHentai"
override val settingsUConfigSummary = "การตั้งค่าบนเว็บไซต์ EHentai"
override val settingsEhGallerySite = "เว็บไซต์หลักของแกลเลอรี่"
override val settingsEhListMode = "มุมองแบบรายการ"
override val settingsEhListModeDetail = "แสดงรายละเอียด"
override val settingsEhListModeThumb = "ภาพตัวอย่าง"
override val settingsEhDetailSize = "ขนาดของรายละเอียด"
override val settingsEhDetailSizeLong = "อย่างยาว"
override val settingsEhDetailSizeShort = "อย่างสั้น"
override val settingsEhShowJpnTitle = "แสดงชื่อเรื่องญี่ปุ่น"
override val settingsEhShowGalleryPages = "แสดงจำนวนหน้าของแกลเลอรี่"
override val settingsEhShowGalleryPagesSummary = "แสดงจำนวนหน้าที่มีอยู่ในแต่ละแกลเลอรี่"
override val settingsEhShowTagTranslations = "แสดงแท็กการแปลภาษา"
override val settingsEhShowTagTranslationsSummary = "แสดงแท็กการแปลภาษาแทนที่ข้อความต้นฉบับ (อาจใช้เวลามากขึ้นเพื่อดาวน์โหลดไฟล์ข้อมูล)"
override val settingsEhTagTranslationsSource = "Placeholder"
override val settingsEhTagTranslationsSourceUrl = "https://placeholder"
override val settingsDownload = "การดาวน์โหลด"
override val settingsDownloadDownloadLocation = "ตำแหน่งแหล่งดาวน์โหลด"
override val settingsDownloadCantGetDownloadLocation = "ไม่สามารถเข้าถึงแหล่งดาวน์โหลดได้"
override val settingsDownloadMediaScan = "การอนุญาตให้สแกนสื่อ"
override val settingsDownloadMediaScanSummaryOn = "โปรดซ่อนแอปแกลเลอรี่หรือแอปดูรูปในเครื่องของคุณจากคนอื่นด้วย"
override val settingsDownloadMediaScanSummaryOff = "แอปแกลเลอรี่ส่วนใหญ่จะข้ามการสแกนรูปภาพในแหล่งดาวน์โหลด"
override val settingsDownloadConcurrency = "ดาวน์โหลดแบบหลายเธด"
override val settingsDownloadConcurrencySummary = { a: Int -> "โหลดถึง $a ภาพ" }
override val settingsDownloadPreloadImage = "โหลดภาพล่วงหน้า"
override val settingsDownloadPreloadImageSummary = { a: Int -> "โหลดภาพล่วงหน้าไป $a ภาพ" }
override val settingsDownloadDownloadOriginImage = "ดาวน์โหลดรูปภาพต้นฉบับ"
override val settingsDownloadDownloadOriginImageSummary = "อันตรายนะ! คุณอาจจะเจอรหัสข้อผิดพลาด 509 ได้"
override val settingsDownloadRestoreDownloadItems = "คืนรายการดาวน์โหลด"
override val settingsDownloadRestoreDownloadItemsSummary = "คืนรายการดาวน์โหลดทั้งหมดในแหล่งดาวน์โหลด"
override val settingsDownloadRestoreNotFound = "ไม่พบรายการดาวน์โหลดที่จะคืนค่า"
override val settingsDownloadRestoreFailed = "การคืนค่าล้มเหลว"
override val settingsDownloadRestoreSuccessfully = { a: Int -> "การคืนค่า $a รายการสำเร็จแล้ว" }
override val settingsDownloadCleanRedundancy = "ลบการดาวน์โหลดที่ไม่จำเป็น"
override val settingsDownloadCleanRedundancySummary = "ลบรูปภาพแกลเลอรี่ที่ไม่ได้อยู่ในรายการดาวน์โหลด แต่อยู่ในแหล่งดาวน์โหลด"
override val settingsDownloadCleanRedundancyNoRedundancy = "ไม่มีสิ่งที่ไม่จำเป็น"
override val settingsDownloadCleanRedundancyDone = { a: Int -> "การลบสิ่งที่ไม่จำเป็นเสร็จสิ้น ลบไปแล้วทั้งหมด $a ชิ้น" }
override val settingsAdvanced = "ขั้นสูง"
override val settingsAdvancedSaveParseErrorBody = "บันทึกเนื้อหาลง HTML เมื่อการวิเคราะห์ผิดพลาด"
override val settingsAdvancedSaveParseErrorBodySummary = "เนื้อหาแบบ HTML อาจจะเป็นข้อมูลความเป็นส่วนตัวที่มีความอ่อนไหวได้"
override val settingsAdvancedSaveCrashLog = "บันทึกข้อผิดพลาดเมื่อเกิด crash"
override val settingsAdvancedSaveCrashLogSummary = "การบันทึกข้อผิดพลาดจาก crash จะช่วยให้ผู้พัฒนาหาและแก้ไขบัคต่างๆได้ง่าย"
override val settingsAdvancedDumpLogcat = "สร้าง Logcat"
override val settingsAdvancedDumpLogcatSummary = "บันทึก Logcat ไปที่พื้นที่จัดเก็บภายนอก"
override val settingsAdvancedDumpLogcatFailed = "การสร้าง Logcat เกิดข้อผิดพลาด"
override val settingsAdvancedDumpLogcatTo = { a: String -> "Logcat ถูกสร้างอยู่ที่ $a" }
override val settingsAdvancedReadCacheSize = "ขนาดในการเก็บไฟล์ชั่วคราวเพื่ออ่าน"
override val settingsAdvancedAppLanguageTitle = "ภาษาของแอป"
override val settingsAdvancedExportData = "สำเนาข้อมูล"
override val settingsAdvancedExportDataSummary = "บันทึกข้อมูลต่างๆเช่นรายการดาวน์โหลด และค้นหาอย่างด่วนลงพื้นที่จัดเก็บภายนอก"
override val settingsAdvancedExportDataTo = { a: String -> "ได้สำเนาข้อมูลแล้วจัดเก็บที่ $a" }
override val settingsAdvancedExportDataFailed = "การสำเนาข้อมูลล้มเหลว"
override val settingsAdvancedImportData = "นำเข้าข้อมูล"
override val settingsAdvancedImportDataSummary = "ดึงข้อมูลต่างๆจากไฟล์สำเนาที่ทำมาก่อนหน้านี้"
override val settingsAdvancedImportDataSuccessfully = "การนำเข้าข้อมูลสำเร็จ"
override val settingsAbout = "เกี่ยวกับ"
override val settingsAboutDeclarationSummary = "EhViewer ไม่มีความแตกต่างจากตัวเว็บ E-Hentai.org แต่อย่างใด"
override val settingsAboutAuthor = "นักพัฒนา"
override val settingsAboutSource = "ซอร์สโค้ด"
override val settingsAboutVersion = "เวอร์ชั่นแอป"
override val settingsAboutCheckForUpdates = "ตรวจสอบการอัพเดต"
override val cantReadTheFile = "ไม่สามารถอ่านไฟล์ได้"
override val appLanguageSystem = "ภาษาของระบบ (ค่าเริ่มต้น)"
override val pleaseWait = "รอสักครู่"
override val cloudFavorites = "รายการโปรดบนเว็บ"
override val localFavorites = "รายการโปรดบนเครื่อง"
override val searchBarHint = { a: String -> "ค้นหา $a" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $b" }
override val deleteFavoritesDialogTitle = "ลบออกจากรายการโปรด"
override val deleteFavoritesDialogMessage = { a: Int -> "ต้องการลบ $a รายการออกจากรายการโปรดหรือไม่?" }
override val moveFavoritesDialogTitle = "ย้ายรายการโปรด"
override val defaultFavoritesCollection = "ค่าเริ่มต้นของที่เก็บรายการโปรด"
override val letMeSelect = "ขอให้ฉันเลือกนะ"
override val collections = "คอลเลคชั่น"
override val errorSomethingWrongHappened = "มีสิ่งผิดปกติบางอย่างเกิดขึ้น"
override val fromTheFuture = "จากอนาคต"
override val justNow = "เดี๋ยวนี้"
override val yesterday = "เมื่อวาน"
override val someDaysAgo = { a: Int -> "$a วันที่ผ่านมา" }
override val archive = "การบีบอัด"
override val noArchives = "ยังไม่มีไฟล์บีบอัด"
override val downloadArchiveStarted = "เริ่มการดาวน์โหลดบีบอัด"
override val downloadArchiveFailure = "การดาวน์โหลดไฟล์บีบอัดล้มเหลว"
override val downloadArchiveFailureNoHath = "ต้องการ H@H client เพื่อโหลดไฟล์บีบอัด"
override val settingsPrivacy = "ความเป็นส่วนตัว"
override val settingsPrivacySecure = "ป้องกันการบันทึกภาพหน้าจอ"
override val settingsPrivacySecureSummary = "ป้องกันเนื้อหาต่างๆของตัวแอปจากการถูกบันทึกหน้าจอ หรือถูกแสดงในหน้ารายการ \"แอพล่าสุด\" ตอนสลับหรือระหว่างสลับไปแอปอื่น."
override val downloadService = "บริการดาวน์โหลด"
override val keyFavoriteName = "รายการโปรด"
override val pageCount = { a: Int -> "$a หน้า" }
override val someMinutesAgo = { a: Int -> "$a นาทีที่ผ่านมา" }
override val someHoursAgo = { a: Int -> "$a ชั่วโมงที่ผ่านมา" }
override val second = { _: Int -> "วิ" }
override val minute = { _: Int -> "นาที" }
override val hour = { _: Int -> "ชั่วโมง" }
override val day = { _: Int -> "วัน" }
override val year = { _: Int -> "ปี" }
}
@@ -0,0 +1,77 @@
package com.hippo.ehviewer.ui.i18n
object TrTranslations : Translations by EnTranslations {
override val galleryListSearchBarHintExhentai = "ExHentai'de Arayın"
override val homepage = "Ana sayfa"
override val subscription = "Abonelikler"
override val whatsHot = "Popüler"
override val favourite = "Favoriler"
override val history = "Geçmiş"
override val downloads = "İndirilenler"
override val settings = "Ayarlar"
override val username = "Kullanıcı adı"
override val password = "Şifre"
override val signIn = "Giriş yap"
override val register = "Kaydol"
override val signInViaWebview = "WebView aracılığıyla giriş yap"
override val signInFirst = "Lütfen önce giriş yap"
override val waring = "Uyarı"
override val invalidDownloadLocation = "İndirme konumu kullanılamıyor. Lütfen Ayarlardan ayarlayın."
override val clipboardGalleryUrlSnackMessage = "Panoda galeri bağlantısı var"
override val clipboardGalleryUrlSnackAction = "Görüntüle"
override val errorTimeout = "Zaman aşımı oluştu"
override val errorRedirection = "Çok fazla yönlendirme yapıldı"
override val errorSocket = "Ağ hatası"
override val errorUnknown = "Tuhaf"
override val errorCantFindActivity = "Uygulama bulunamıyor"
override val errorCannotParseTheUrl = "Bağlantı ayrıştırılamıyor"
override val errorDecodingFailed = "Decode işlemi başarısız"
override val errorReadingFailed = "Okuma başarısız"
override val errorOutOfRange = "Kapsam dışı"
override val errorParseError = "Ayrıştırma hatası"
override val error509 = "509"
override val errorInvalidUrl = "Geçersiz bağlantı"
override val errorGetPtokenError = "pToken alınamadı"
override val errorCantSaveImage = "Görsel kaydedilemiyor"
override val errorInvalidNumber = "Geçersiz numara"
override val errorUsernameCannotEmpty = "Kullanıcı adı boş bir metin olamaz"
override val errorPasswordCannotEmpty = "Şifre boş bir metin olamaz"
override val guestMode = "Giriş yapmaksızın devam et"
override val signInFailed = "Giriş başarısız"
override val getIt = "Anladım"
override val galleryListEmptyHit = "Dünya büyük olmasına rağmen pandacık yalnız oturuyor"
override val keywordSearch = "Anahtar Kelime Arama"
override val imageSearch = "Görsel Arama"
override val searchImage = "Görsel Arama"
override val searchSh = "Yalnızca Silinen Galerileri Gösteri"
override val searchSto = "Yalnızca Torrent'li Galerileri Göster"
override val searchSr = "En Az Derecelendirme"
override val searchSpTo = "/"
override val searchSpErr2 = "Sayfa oranı en az 20 olmalı"
override val searchSf = "Varsayılan filtreleri şunlar için devre dışı bırak:"
override val searchSfl = "Dil"
override val searchSfu = "Yükleyen"
override val searchSft = "Etiketler"
override val selectImage = "Görsel Seç"
override val selectImageFirst = "Lütfen önce görsel seç"
override val addToFavourites = "Favorilere ekle"
override val removeFromFavourites = "Favorilerden kaldır"
override val deleteDownloads = "İndirilenleri sil"
override val quickSearch = "Hızlı arama"
override val quickSearchTip = "Hızlı Aramaya eklemek için \"+\"ya basın"
override val addQuickSearchDialogTitle = "Hızlı Aramaya Ekle"
override val nameIsEmpty = "Ad boş"
override val delete = "Sil"
override val imageSearchNotQuickSearch = "Görsel arama, hızlı arama olarak eklenemez"
override val duplicateName = "Ad zaten kullanımda."
override val textIsEmpty = "Yazı boş"
override val errorUnknownHost = "Bilinmeyen host"
override val appWaring = "Bu uygulamadaki içerikler internetten alınmaktadır. Bazı içerikler fiziksel veya zihinsel olarak size zararlı gelebilir.Yukarıda, riskleri öğrendiniz ve üstleneceksiniz. \nKullanmaya devam ederek, yukarıdaki koşulları kabul edersiniz."
override val signInFailedTip = { a: String -> "Bu sorun devam ederse, \"$a\" seçeneğini deneyin." }
override val galleryListSearchBarOpenGallery = "Galeriyi aç"
override val galleryListSearchBarHintEHentai = "E-Hentai'de Arayın"
override val galleryListEmptyHitSubscription = "Etiketlere Ayarlar->EH->Etiketlerim yerinden abone olun"
override val duplicateQuickSearch = { a: String -> "Aynı bir hızlı arama zaten var. Adı \"$a\"." }
override val searchSpErr1 = "Sayfa oranı en fazla 10un altında olamaz"
override val readme = "BENIOKU"
}
@@ -0,0 +1,641 @@
@file:Suppress("ktlint:standard:property-naming")
package com.hippo.ehviewer.ui.i18n
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.intl.Locale
import cafe.adriel.lyricist.ProvideStrings
import cafe.adriel.lyricist.rememberStrings
interface Translations {
val appName: String
val siteE: String
val siteEx: String
val doujinshi: String
val manga: String
val artistCg: String
val gameCg: String
val western: String
val nonH: String
val imageSet: String
val cosplay: String
val asianPorn: String
val misc: String
val homepage: String
val subscription: String
val whatsHot: String
val favourite: String
val history: String
val downloads: String
val settings: String
val username: String
val password: String
val signIn: String
val register: String
val signInViaWebview: String
val signInFirst: String
val textIsEmpty: String
val waring: String
val invalidDownloadLocation: String
val clipboardGalleryUrlSnackMessage: String
val clipboardGalleryUrlSnackAction: String
val errorTimeout: String
val errorUnknownHost: String
val errorRedirection: String
val errorSocket: String
val errorUnknown: String
val errorCantFindActivity: String
val errorCannotParseTheUrl: String
val errorDecodingFailed: String
val errorReadingFailed: String
val errorOutOfRange: String
val errorParseError: String
val error509: String
val errorInvalidUrl: String
val errorGetPtokenError: String
val errorCantSaveImage: String
val errorInvalidNumber: String
val appWaring: String
val appWaring2: String
val errorUsernameCannotEmpty: String
val errorPasswordCannotEmpty: String
val guestMode: String
val signInFailed: String
val signInFailedTip: (String) -> String
val getIt: String
val galleryListSearchBarHintExhentai: String
val galleryListSearchBarHintEHentai: String
val galleryListSearchBarOpenGallery: String
val galleryListEmptyHit: String
val galleryListEmptyHitSubscription: String
val keywordSearch: String
val imageSearch: String
val searchImage: String
val searchSh: String
val searchSto: String
val searchSr: String
val searchSpTo: String
val searchSpErr1: String
val searchSpErr2: String
val searchSpSuffix: String
val searchSf: String
val searchSfl: String
val searchSfu: String
val searchSft: String
val selectImage: String
val selectImageFirst: String
val addToFavourites: String
val removeFromFavourites: String
val deleteDownloads: String
val quickSearch: String
val quickSearchTip: String
val addQuickSearchDialogTitle: String
val translateTagForTagger: String
val nameIsEmpty: String
val delete: String
val addQuickSearchTip: String
val readme: String
val imageSearchNotQuickSearch: String
val duplicateQuickSearch: (String) -> String
val duplicateName: String
val saveProgress: String
val deleteQuickSearch: (String) -> String
val goToHint: (Int, Int) -> String
val any: String
val star2: String
val star3: String
val star4: String
val star5: String
val download: String
val read: String
val favoredTimes: (Int) -> String
val ratingText: (String, Float, Int) -> String
val torrentCount: (Int) -> String
val share: String
val rate: String
val similarGallery: String
val searchCover: String
val noTags: String
val noComments: String
val noMoreComments: String
val moreComment: String
val refresh: String
val viewOriginal: String
val openInOtherApp: String
val clearImageCache: String
val clearImageCacheConfirm: String
val imageCacheCleared: String
val rateSuccessfully: String
val rateFailed: String
val noTorrents: String
val torrents: String
val notFavorited: String
val addFavoritesDialogTitle: String
val addToFavoriteSuccess: String
val removeFromFavoriteSuccess: String
val addToFavoriteFailure: String
val removeFromFavoriteFailure: String
val filterTheUploader: (String) -> String
val filterTheTag: (String) -> String
val filterAdded: String
val newerVersionAvailable: String
val newerVersionTitle: (String, String) -> String
val rating10: String
val rating9: String
val rating8: String
val rating7: String
val rating6: String
val rating5: String
val rating4: String
val rating3: String
val rating2: String
val rating1: String
val rating0: String
val ratingNone: String
val galleryInfo: String
val copiedToClipboard: String
val keyGid: String
val keyToken: String
val keyUrl: String
val keyTitle: String
val keyTitleJpn: String
val keyThumb: String
val keyCategory: String
val keyUploader: String
val keyPosted: String
val keyParent: String
val keyVisible: String
val keyLanguage: String
val keyPages: String
val keySize: String
val keyFavoriteCount: String
val keyFavorited: String
val keyRatingCount: String
val keyRating: String
val keyTorrents: String
val keyTorrentUrl: String
val galleryComments: String
val commentSuccessfully: String
val commentFailed: String
val copyCommentText: String
val blockCommenter: String
val filterTheCommenter: (String) -> String
val editComment: String
val editCommentSuccessfully: String
val editCommentFailed: String
val voteUp: String
val cancelVoteUp: String
val voteDown: String
val cancelVoteDown: String
val voteUpSuccessfully: String
val cancelVoteUpSuccessfully: String
val voteDownSuccessfully: String
val cancelVoteDownSuccessfully: String
val voteFailed: String
val checkVoteStatus: String
val clickMoreComments: String
val lastEdited: (String) -> String
val goTo: String
val sceneDownloadTitle: (String) -> String
val noDownloadInfo: String
val downloadStateNone: String
val downloadStateWait: String
val downloadStateDownloading: String
val downloadStateDownloaded: String
val downloadStateFailed: String
val downloadStateFailed2: (Int) -> String
val downloadStateFinish: String
val stat509AlertTitle: String
val stat509AlertText: String
val statDownloadDoneTitle: String
val statDownloadDoneTextSucceeded: (Int) -> String
val statDownloadDoneTextFailed: (Int) -> String
val statDownloadDoneTextMix: (Int, Int) -> String
val statDownloadDoneLineSucceeded: (String) -> String
val statDownloadDoneLineFailed: (String) -> String
val downloadRemoveDialogTitle: String
val downloadRemoveDialogMessage: (String) -> String
val downloadRemoveDialogMessage2: (Int) -> String
val downloadRemoveDialogCheckText: String
val statDownloadActionStopAll: String
val defaultDownloadLabelName: String
val downloadMoveDialogTitle: String
val downloadLabels: String
val downloadStartAll: String
val downloadStopAll: String
val downloadResetReadingProgress: String
val resetReadingProgressMessage: String
val downloadServiceLabel: String
val downloadSpeedText: (String) -> String
val downloadSpeedText2: (String, String) -> String
val rememberDownloadLabel: String
val defaultDownloadLabel: String
val addedToDownloadList: String
val selectGroupingMode: String
val selectGroupingModeCustom: String
val selectGroupingModeArtist: String
val unknownArtists: String
val add: String
val newLabelTitle: String
val labelTextIsEmpty: String
val labelTextIsInvalid: String
val labelTextExist: String
val renameLabelTitle: String
val deleteLabel: (String) -> String
val noHistory: String
val clearAll: String
val clearAllHistory: String
val filter: String
val filterTitle: String
val filterUploader: String
val filterTag: String
val filterTagNamespace: String
val filterCommenter: String
val filterComment: String
val deleteFilter: (String) -> String
val addFilter: String
val showDefinition: String
val filterText: String
val filterTip: String
val uConfig: String
val applyTip: String
val myTags: String
val shareImage: String
val imageSaved: (String) -> String
val settingsEh: String
val settingsEhSignOut: String
val settingsEhIdentityCookiesSigned: String
val settingsEhIdentityCookiesGuest: String
val settingsEhClearIgneous: String
val settingsUConfig: String
val settingsUConfigSummary: String
val settingsMyTags: String
val settingsMyTagsSummary: String
val settingsEhGallerySite: String
val settingsEhLaunchPage: String
val settingsEhListMode: String
val settingsEhListModeDetail: String
val settingsEhListModeThumb: String
val settingsEhDetailSize: String
val settingsEhDetailSizeLong: String
val settingsEhDetailSizeShort: String
val settingsEhThumbColumns: String
val settingsEhForceEhThumb: String
val settingsEhForceEhThumbSummary: String
val settingsEhShowJpnTitle: String
val settingsEhShowJpnTitleSummary: String
val settingsEhShowGalleryPages: String
val settingsEhShowGalleryPagesSummary: String
val settingsEhShowVoteStatus: String
val settingsEhShowGalleryComments: String
val settingsEhShowGalleryCommentsSummary: String
val settingsEhShowGalleryCommentThreshold: String
val settingsEhShowGalleryCommentThresholdSummary: String
val settingsEhShowTagTranslations: String
val settingsEhShowTagTranslationsSummary: String
val settingsEhTagTranslationsSource: String
val settingsEhTagTranslationsSourceUrl: String
val settingsEhFilter: String
val settingsEhFilterSummary: String
val settingsReadReverseControls: String
val settingsBlockExtraneousAds: String
val settingsAdsPlaceholder: String
val settingsDownload: String
val settingsDownloadDownloadLocation: String
val settingsDownloadCantGetDownloadLocation: String
val settingsDownloadMediaScan: String
val settingsDownloadMediaScanSummaryOn: String
val settingsDownloadMediaScanSummaryOff: String
val settingsDownloadConcurrency: String
val settingsDownloadConcurrencySummary: (Int) -> String
val settingsDownloadDownloadDelay: String
val settingsDownloadDownloadDelaySummary: (Int) -> String
val settingsDownloadDownloadTimeout: String
val settingsDownloadPreloadImage: String
val settingsDownloadPreloadImageSummary: (Int) -> String
val settingsDownloadDownloadOriginImage: String
val settingsDownloadDownloadOriginImageSummary: String
val settingsDownloadSaveAsCbz: String
val settingsDownloadArchiveMetadata: String
val settingsDownloadArchiveMetadataSummary: String
val settingsDownloadReloadMetadata: String
val settingsDownloadReloadMetadataSummary: String
val settingsDownloadReloadMetadataSuccessfully: (Int) -> String
val settingsDownloadReloadMetadataFailed: (String) -> String
val settingsDownloadRestoreDownloadItems: String
val settingsDownloadRestoreDownloadItemsSummary: String
val settingsDownloadRestoreNotFound: String
val settingsDownloadRestoreFailed: String
val settingsDownloadRestoreSuccessfully: (Int) -> String
val settingsDownloadCleanRedundancy: String
val settingsDownloadCleanRedundancySummary: String
val settingsDownloadCleanRedundancyNoRedundancy: String
val settingsDownloadCleanRedundancyDone: (Int) -> String
val settingsAdvanced: String
val settingsAdvancedSaveParseErrorBody: String
val settingsAdvancedSaveParseErrorBodySummary: String
val settingsAdvancedSaveCrashLog: String
val settingsAdvancedSaveCrashLogSummary: String
val settingsAdvancedDumpLogcat: String
val settingsAdvancedDumpLogcatSummary: String
val settingsAdvancedDumpLogcatFailed: String
val settingsAdvancedDumpLogcatTo: (String) -> String
val settingsAdvancedReadCacheSize: String
val settingsAdvancedAppLanguageTitle: String
val settingsAdvancedHardwareBitmapThreshold: String
val settingsAdvancedHardwareBitmapThresholdSummary: String
val settingsAdvancedExportData: String
val settingsAdvancedExportDataSummary: String
val settingsAdvancedExportDataTo: (String) -> String
val settingsAdvancedExportDataFailed: String
val settingsAdvancedImportData: String
val settingsAdvancedImportDataSummary: String
val settingsAdvancedImportDataSuccessfully: String
val settingsAdvancedBackupFavorite: String
val settingsAdvancedBackupFavoriteSummary: String
val settingsAdvancedBackupFavoriteStart: (String) -> String
val settingsAdvancedBackupFavoriteNothing: String
val settingsAdvancedBackupFavoriteSuccess: String
val settingsAdvancedBackupFavoriteFailed: String
val settingsAbout: String
val settingsAboutDeclaration: String
val settingsAboutDeclarationSummary: String
val settingsAboutAuthor: String
val settingsAboutAuthorSummary: AnnotatedString
val settingsAboutLatestRelease: String
val settingsAboutSource: String
val settingsAboutVersion: String
val settingsAboutCommitTime: (String) -> String
val settingsAboutCheckForUpdates: String
val license: String
val cantReadTheFile: String
val appLanguageSystem: String
val pleaseWait: String
val cloudFavorites: String
val localFavorites: String
val searchBarHint: (String) -> String
val favoritesTitle: (String) -> String
val favoritesTitle2: (String, String) -> String
val deleteFavoritesDialogTitle: String
val deleteFavoritesDialogMessage: (Int) -> String
val moveFavoritesDialogTitle: String
val defaultFavoritesCollection: String
val defaultFavoritesWarning: String
val letMeSelect: String
val favoriteNote: String
val collections: String
val errorSomethingWrongHappened: String
val fromTheFuture: String
val justNow: String
val yesterday: String
val someDaysAgo: (Int) -> String
val archive: String
val archiveFree: String
val archiveOriginal: String
val archiveResample: String
val noArchives: String
val downloadArchiveStarted: String
val downloadArchiveFailure: String
val downloadArchiveFailureNoHath: String
val currentFunds: String
val insufficientFunds: String
val imageLimits: String
val imageLimitsSummary: String
val imageLimitsNormal: String
val imageLimitsRestricted: String
val resetCost: (Int) -> String
val reset: String
val settingsPrivacy: String
val settingsPrivacySecure: String
val settingsPrivacySecureSummary: String
val clearSearchHistory: String
val clearSearchHistorySummary: String
val clearSearchHistoryConfirm: String
val searchHistoryCleared: String
val downloadService: String
val keyFavoriteName: String
val darkTheme: String
val blackDarkTheme: String
val harmonizeCategoryColor: String
val sortBy: String
val addedTimeDesc: String
val addedTimeAsc: String
val uploadedTimeDesc: String
val uploadedTimeAsc: String
val titleAsc: String
val titleDesc: String
val pageCountAsc: String
val pageCountDesc: String
val groupByDownloadLabel: String
val downloadFilter: String
val downloadAll: String
val downloadStartAllReversed: String
val noBrowserInstalled: String
val toplistAlltime: String
val toplistPastyear: String
val toplistPastmonth: String
val toplistYesterday: String
val toplist: String
val tagVoteDown: String
val tagVoteUp: String
val tagVoteWithdraw: String
val tagVoteSuccessfully: String
val deleteSearchHistory: (String) -> String
val actionAddTag: String
val actionAddTagTip: String
val commentUserUploader: (String) -> String
val noNetwork: String
val settingsEhMeteredNetworkWarning: String
val meteredNetworkWarning: String
val readFrom: (Int) -> String
val settingsEhRequestNews: String
val settingsEhHideHvEvents: String
val copyTrans: String
val defaultDownloadDirNotEmpty: String
val resetDownloadLocation: String
val pickNewDownloadLocation: String
val dontShowAgain: String
val openSettings: String
val appLinkNotVerifiedMessage: String
val appLinkNotVerifiedTitle: String
val openByDefault: String
val backupBeforeUpdate: String
val useCiUpdateChannel: String
val settingsPrivacyRequireUnlock: String
val settingsPrivacyRequireUnlockDelay: String
val settingsPrivacyRequireUnlockDelaySummary: (Int) -> String
val settingsPrivacyRequireUnlockDelaySummaryImmediately: String
val filterLabel: String
val archivePasswd: String
val archiveNeedPasswd: String
val passwdWrong: String
val passwdCannotBeEmpty: String
val listTileThumbSize: String
val accountName: String
val preloadThumbAggressively: String
val animateItems: String
val animateItemsSummary: String
val autoUpdates: String
val updateFrequencyNever: String
val updateFrequencyDaily: String
val updateFrequency3days: String
val updateFrequencyWeekly: String
val updateFrequencyBiweekly: String
val updateFrequencyMonthly: String
val updateFailed: (String) -> String
val newVersionAvailable: String
val alreadyLatestVersion: String
val permissionDenied: String
val downloadGalleryFirst: String
val exportAsArchive: String
val exportAsArchiveSuccess: String
val exportAsArchiveFailed: String
val prefCropBorders: String
val actionSettings: String
val prefRotationType: String
val viewer: String
val actionMenu: String
val navZonePrev: String
val navZoneNext: String
val navZoneLeft: String
val navZoneRight: String
val decodeImageError: String
val actionRetry: String
val labelDefault: String
val rotationFree: String
val rotationPortrait: String
val rotationReversePortrait: String
val rotationLandscape: String
val rotationForcePortrait: String
val rotationForceLandscape: String
val leftToRightViewer: String
val rightToLeftViewer: String
val verticalViewer: String
val webtoonViewer: String
val verticalPlusViewer: String
val pagerViewer: String
val prefFullscreen: String
val prefCutoutShort: String
val prefPageTransitions: String
val prefShowPageNumber: String
val prefShowReaderSeekbar: String
val prefDoubleTapToZoom: String
val prefCustomBrightness: String
val prefGrayscale: String
val prefInvertedColors: String
val prefCustomColorFilter: String
val prefColorFilterMode: String
val filterModeMultiply: String
val filterModeScreen: String
val filterModeOverlay: String
val filterModeLighten: String
val filterModeDarken: String
val prefKeepScreenOn: String
val prefReadWithTappingInverted: String
val tappingInvertedNone: String
val tappingInvertedHorizontal: String
val tappingInvertedVertical: String
val tappingInvertedBoth: String
val prefReadWithLongTap: String
val prefReaderTheme: String
val whiteBackground: String
val grayBackground: String
val blackBackground: String
val automaticBackground: String
val lNav: String
val kindlishNav: String
val edgeNav: String
val rightAndLeftNav: String
val disabledNav: String
val prefViewerNav: String
val prefImageScaleType: String
val scaleTypeFitScreen: String
val scaleTypeStretch: String
val scaleTypeFitWidth: String
val scaleTypeFitHeight: String
val scaleTypeOriginalSize: String
val scaleTypeSmartFit: String
val prefNavigatePan: String
val prefLandscapeZoom: String
val prefZoomStart: String
val zoomStartAutomatic: String
val zoomStartLeft: String
val zoomStartRight: String
val zoomStartCenter: String
val rotationType: String
val prefCategoryReadingMode: String
val prefWebtoonSidePadding: String
val webtoonSidePadding0: String
val webtoonSidePadding5: String
val webtoonSidePadding10: String
val webtoonSidePadding15: String
val webtoonSidePadding20: String
val webtoonSidePadding25: String
val prefCategoryGeneral: String
val customFilter: String
val actionShare: String
val actionCopy: String
val actionSave: String
val actionSaveTo: String
val wideColorGamut: String
val settingsEhRequestNewsTimepicker: String
val darkThemeFollowSystem: String
val darkThemeOff: String
val darkThemeOn: String
val blockedImage: String
val showBlockedImage: String
val pageCount: (quantity: Int) -> String
val someMinutesAgo: (quantity: Int) -> String
val someHoursAgo: (quantity: Int) -> String
val second: (quantity: Int) -> String
val minute: (quantity: Int) -> String
val hour: (quantity: Int) -> String
val day: (quantity: Int) -> String
val year: (quantity: Int) -> String
}
object Locales {
const val En = "en"
const val De = "de"
const val Es = "es"
const val Fr = "fr"
const val Ja = "ja"
const val Ko = "ko"
const val NbNo = "nb-NO"
const val Th = "th"
const val Tr = "tr"
const val ZhCn = "zh-CN"
const val ZhHk = "zh-HK"
const val ZhTw = "zh-TW"
}
val LocalTranslations: ProvidableCompositionLocal<Translations> =
staticCompositionLocalOf { EnTranslations }
@Composable
fun ProvideTranslations(content: @Composable () -> Unit) = ProvideStrings(
rememberStrings(
translations = mapOf(
Locales.En to EnTranslations,
Locales.De to DeTranslations,
Locales.Es to EsTranslations,
Locales.Fr to FrTranslations,
Locales.Ja to JaTranslations,
Locales.Ko to KoTranslations,
Locales.NbNo to NbNoTranslations,
Locales.Th to ThTranslations,
Locales.Tr to TrTranslations,
Locales.ZhCn to ZhCnTranslations,
Locales.ZhHk to ZhHkTranslations,
Locales.ZhTw to ZhTwTranslations,
),
currentLanguageTag = with(Locale.current) {
listOf(language, region).mapNotNull { it.ifBlank { null } }.joinToString("-")
},
),
provider = LocalTranslations,
content = content,
)
@@ -0,0 +1,571 @@
package com.hippo.ehviewer.ui.i18n
object ZhCnTranslations : Translations by EnTranslations {
override val homepage = "主页"
override val subscription = "订阅"
override val whatsHot = "热门"
override val favourite = "收藏"
override val history = "历史"
override val downloads = "下载"
override val settings = "设置"
override val username = "用户名"
override val password = "密码"
override val signIn = "登录"
override val register = "注册"
override val signInViaWebview = "通过网页登录"
override val signInFirst = "请先登录"
override val textIsEmpty = "文本为空"
override val waring = "警告"
override val invalidDownloadLocation = "似乎下载路径不可用。请到重新设置下载路径。"
override val clipboardGalleryUrlSnackMessage = "剪切板里有画廊链接"
override val clipboardGalleryUrlSnackAction = "查看"
override val errorTimeout = "超时"
override val errorUnknownHost = "未知主机"
override val errorRedirection = "太多重定向"
override val errorSocket = "网络错误"
override val errorUnknown = "奇怪的错误"
override val errorCantFindActivity = "找不到相应的应用"
override val errorCannotParseTheUrl = "无法解析链接"
override val errorDecodingFailed = "解码失败"
override val errorReadingFailed = "读取失败"
override val errorOutOfRange = "越界"
override val errorParseError = "解析失败"
override val error509 = "509"
override val errorInvalidUrl = "无效链接"
override val errorGetPtokenError = "获取 pToken 错误"
override val errorCantSaveImage = "无法保存图片"
override val errorInvalidNumber = "非法数字"
override val appWaring = "本应用中内容来自互联网,部分内容可能对您的生理及心理造成难以恢复的伤害。本应用作者不会对由本应用造成的任何后果负责。未成年人应在监护人指导下使用本应用。请遵守所在地的法律法规。"
override val appWaring2 = "继续使用即代表您同意上述条款。"
override val errorUsernameCannotEmpty = "用户名不可为空"
override val errorPasswordCannotEmpty = "密码不可为空"
override val guestMode = "游客模式"
override val signInFailed = "登录失败"
override val signInFailedTip = { a: String -> "若持续出错,请尝试“$a”。" }
override val getIt = "知道了"
override val galleryListSearchBarHintExhentai = "搜索 ExHentai"
override val galleryListSearchBarHintEHentai = "搜索 E-Hentai"
override val galleryListSearchBarOpenGallery = "打开画廊"
override val galleryListEmptyHit = "什么都没有找到"
override val galleryListEmptyHitSubscription = "请至 设置->EH->我的标签 订阅标签"
override val keywordSearch = "关键字搜索"
override val imageSearch = "图片搜索"
override val searchImage = "图片搜索"
override val searchSh = "已删除"
override val searchSto = "有种子"
override val searchSr = "最低评分"
override val searchSpTo = "到"
override val searchSpErr1 = "页数最大值至少为 10"
override val searchSpErr2 = "页数范围过窄"
override val searchSf = "禁用排除项:"
override val searchSfl = "语言"
override val searchSfu = "上传者"
override val searchSft = "标签"
override val selectImage = "选择图片"
override val selectImageFirst = "请先选择图片"
override val addToFavourites = "收藏"
override val removeFromFavourites = "移除收藏"
override val deleteDownloads = "删除下载"
override val quickSearch = "快速搜索"
override val quickSearchTip = "点击“+”来添加快速搜索"
override val addQuickSearchDialogTitle = "添加快速搜索"
override val nameIsEmpty = "名称为空"
override val translateTagForTagger = "使用翻译标签"
override val delete = "删除"
override val addQuickSearchTip = "画廊列表的状态将被保存为快速搜索。如果你想保存搜索面板的状态,请先执行搜索。"
override val readme = "读我"
override val imageSearchNotQuickSearch = "无法添加图片搜索为快速搜索"
override val duplicateQuickSearch = { a: String -> "已存在相同的快速搜索,名称为“$a”。" }
override val duplicateName = "已存在相同名称"
override val saveProgress = "保存进度"
override val deleteQuickSearch = { a: String -> "删除快速搜索“$a”?" }
override val goToHint = { a: Int, b: Int -> "第 $a 页,共 $b 页" }
override val any = "不限"
override val star2 = "2 星"
override val star3 = "3 星"
override val star4 = "4 星"
override val star5 = "5 星"
override val download = "下载"
override val read = "阅读"
override val favoredTimes = { a: Int -> "\u2665 $a" }
override val ratingText = { a: String, b: Float, c: Int -> "%s (%.2f, %d)".format(a, b, c) }
override val torrentCount = { a: Int -> "种子 ($a)" }
override val share = "分享"
override val rate = "评分"
override val similarGallery = "相似画廊"
override val searchCover = "搜索封面"
override val noTags = "暂无标签"
override val noComments = "暂无评论"
override val noMoreComments = "已显示所有评论"
override val moreComment = "查看更多评论"
override val refresh = "刷新"
override val viewOriginal = "查看原图"
override val openInOtherApp = "在其他应用中打开"
override val clearImageCache = "清除图片缓存"
override val clearImageCacheConfirm = "清除该画廊的所有图片缓存?"
override val imageCacheCleared = "已清除图片缓存"
override val rateSuccessfully = "评分成功"
override val rateFailed = "评分失败"
override val noTorrents = "没有种子"
override val torrents = "种子"
override val notFavorited = "未收藏"
override val addFavoritesDialogTitle = "添加收藏"
override val addToFavoriteSuccess = "已添加至收藏"
override val removeFromFavoriteSuccess = "移除收藏"
override val addToFavoriteFailure = "添加收藏失败"
override val removeFromFavoriteFailure = "移除收藏失败"
override val filterTheUploader = { a: String -> "屏蔽上传者“$a”?" }
override val filterTheTag = { a: String -> "屏蔽标签“$a”?" }
override val filterAdded = "已添加屏蔽项"
override val newerVersionAvailable = "此画廊有新版本可用。"
override val newerVersionTitle = { a: String, b: String -> "$a, 添加于 $b" }
override val rating10 = "根本把持不住"
override val rating9 = "好极了"
override val rating8 = "很棒"
override val rating7 = "不错"
override val rating6 = "还行"
override val rating5 = "一般般"
override val rating4 = "不行"
override val rating3 = "糟糕"
override val rating2 = "瞎眼"
override val rating1 = "快要窒息了"
override val rating0 = "扑街了"
override val galleryInfo = "画廊信息"
override val copiedToClipboard = "已复制到剪切板"
override val keyGid = "GID"
override val keyToken = "Token"
override val keyUrl = "链接"
override val keyTitle = "标题"
override val keyTitleJpn = "日文标题"
override val keyThumb = "缩略图"
override val keyCategory = "分类"
override val keyUploader = "上传者"
override val keyPosted = "上传时间"
override val keyParent = "父画廊"
override val keyVisible = "可见性"
override val keyLanguage = "语言"
override val keyPages = "页数"
override val keySize = "大小"
override val keyFavoriteCount = "收藏次数"
override val keyFavorited = "收藏"
override val keyRatingCount = "评价次数"
override val keyRating = "评分"
override val keyTorrents = "种子个数"
override val keyTorrentUrl = "种子链接"
override val galleryComments = "画廊评论"
override val commentSuccessfully = "评论成功"
override val commentFailed = "评论失败"
override val copyCommentText = "复制评论文字"
override val blockCommenter = "屏蔽评论者"
override val filterTheCommenter = { a: String -> "屏蔽评论者“$a”?" }
override val editComment = "修改评论"
override val editCommentSuccessfully = "评论已被修改"
override val editCommentFailed = "修改评论失败"
override val voteUp = "深表赞同"
override val cancelVoteUp = "不再深表赞同"
override val voteDown = "垃圾评论"
override val cancelVoteDown = "不是垃圾评论"
override val voteUpSuccessfully = "已深表赞同"
override val cancelVoteUpSuccessfully = "已不再深表赞同"
override val voteDownSuccessfully = "已钦定为垃圾评论"
override val cancelVoteDownSuccessfully = "已不再钦定为垃圾评论"
override val voteFailed = "投票失败"
override val checkVoteStatus = "查看投票情况"
override val clickMoreComments = "点击加载更多评论"
override val lastEdited = { a: String -> "上次修改时间:$a" }
override val goTo = "跳页"
override val sceneDownloadTitle = { a: String -> "下载 - $a" }
override val noDownloadInfo = "这里是下载项目"
override val downloadStateNone = "未启动"
override val downloadStateWait = "等待中"
override val downloadStateDownloading = "下载中"
override val downloadStateDownloaded = "已下载"
override val downloadStateFailed = "失败"
override val downloadStateFailed2 = { a: Int -> "$a 未完成" }
override val downloadStateFinish = "已完成"
override val stat509AlertTitle = "509 警告"
override val stat509AlertText = "图片配额已用尽。请停止下载,休息一下。"
override val statDownloadDoneTitle = "下载结束"
override val statDownloadDoneTextSucceeded = { a: Int -> "$a 项下载成功" }
override val statDownloadDoneTextFailed = { a: Int -> "$a 项下载失败" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a 项下载成功,$b 项下载失败" }
override val statDownloadDoneLineSucceeded = { a: String -> "下载成功:$a" }
override val statDownloadDoneLineFailed = { a: String -> "下载失败:$a" }
override val downloadRemoveDialogTitle = "移除下载项"
override val downloadRemoveDialogMessage = { a: String -> "从下载列表移除 $a ?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "从下载列表移除 $a 项?" }
override val downloadRemoveDialogCheckText = "删除图片文件"
override val statDownloadActionStopAll = "全部停止"
override val defaultDownloadLabelName = "默认"
override val downloadMoveDialogTitle = "移动"
override val downloadLabels = "下载标签"
override val downloadStartAll = "全部开始"
override val downloadStopAll = "全部停止"
override val downloadResetReadingProgress = "重置阅读进度"
override val resetReadingProgressMessage = "重置所有已下载画廊的阅读进度?"
override val downloadServiceLabel = "EhViewer 下载服务"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a,剩余 $b" }
override val rememberDownloadLabel = "记住下载标签"
override val defaultDownloadLabel = "默认下载标签"
override val addedToDownloadList = "已添加至下载列表"
override val selectGroupingMode = "选择分组依据"
override val selectGroupingModeCustom = "自定义标签"
override val selectGroupingModeArtist = "作者"
override val unknownArtists = "未知"
override val add = "添加"
override val newLabelTitle = "新标签"
override val labelTextIsEmpty = "标签文本为空"
override val labelTextIsInvalid = "“默认”是无效标签"
override val labelTextExist = "标签已存在"
override val renameLabelTitle = "重命名标签"
override val deleteLabel = { a: String -> "删除标签“$a”?" }
override val noHistory = "这里是阅读历史"
override val clearAll = "全部清除"
override val clearAllHistory = "清除所有阅读历史?"
override val filter = "屏蔽列表"
override val filterTitle = "标题"
override val filterUploader = "上传者"
override val filterTag = "标签"
override val filterTagNamespace = "标签组"
override val filterCommenter = "评论者"
override val filterComment = "评论"
override val deleteFilter = { a: String -> "删除屏蔽项“$a”?" }
override val addFilter = "添加屏蔽项"
override val showDefinition = "查看定义"
override val filterText = "屏蔽项文本"
override val filterTip = "该屏蔽系统会在 EHentai 网站屏蔽系统的基础上继续屏蔽画廊。\n\n标题屏蔽项:排除标题含有该关键字的画廊。\n\n上传者屏蔽项:排除该上传者上传的画廊。\n\n标签屏蔽项:排除包含该标签的画廊,这会使获取画廊列表花费更多时间。\n\n标签组屏蔽项:排除包含该标签组的画廊,这会使获取画廊列表花费更多时间。\n\n评论者屏蔽项:排除该评论者发布的评论。\n\n评论屏蔽项:排除匹配该正则表达式的评论。"
override val uConfig = "EHentai 设置"
override val applyTip = "点击右上角的对勾来保存设置"
override val myTags = "我的标签"
override val shareImage = "分享图片"
override val imageSaved = { a: String -> "图片已保存至 $a" }
override val settingsEh = "EH"
override val settingsEhSignOut = "退出登录"
override val settingsEhIdentityCookiesSigned = "身份 Cookie 可用于登录该账号。<br><b>注意数据安全</b>"
override val settingsEhIdentityCookiesGuest = "游客模式"
override val settingsEhClearIgneous = "清除 igneous"
override val settingsUConfig = "EHentai 设置"
override val settingsUConfigSummary = "EHentai 网站上的设置"
override val settingsMyTags = "我的标签"
override val settingsMyTagsSummary = "EHentai 网站上的我的标签"
override val settingsEhGallerySite = "画廊站点"
override val settingsEhLaunchPage = "启动页"
override val settingsEhListMode = "列表模式"
override val settingsEhListModeDetail = "详情"
override val settingsEhListModeThumb = "缩略图"
override val settingsEhDetailSize = "详情宽度"
override val settingsEhDetailSizeLong = "长"
override val settingsEhDetailSizeShort = "短"
override val settingsEhThumbColumns = "缩略图列数"
override val settingsEhForceEhThumb = "使用 e-hentai 缩略图服务器"
override val settingsEhForceEhThumbSummary = "若缩略图加载失败可尝试关闭此项"
override val settingsEhShowJpnTitle = "显示日文标题"
override val settingsEhShowJpnTitleSummary = "需同时在 EHentai 网站设置中启用 Japanese Title"
override val settingsEhShowGalleryPages = "显示画廊页数"
override val settingsEhShowGalleryPagesSummary = "在画廊列表中显示页数"
override val settingsEhShowVoteStatus = "显示标签投票状态"
override val settingsEhShowGalleryComments = "显示画廊评论"
override val settingsEhShowGalleryCommentsSummary = "在画廊详情页中显示评论"
override val settingsEhShowGalleryCommentThreshold = "评论分数阈值"
override val settingsEhShowGalleryCommentThresholdSummary = "隐藏低于或等于此分数的评论(-101 禁用)"
override val settingsEhShowTagTranslations = "显示标签翻译"
override val settingsEhShowTagTranslationsSummary = "显示翻译后的标签而非原始文字(需花费时间来下载数据文件)"
override val settingsEhTagTranslationsSource = "补充翻译(由 EhTagTranslation 提供)"
override val settingsEhTagTranslationsSourceUrl = "https://github.com/EhTagTranslation/Editor/wiki"
override val settingsEhFilter = "屏蔽列表"
override val settingsEhFilterSummary = "根据标题、上传者、标签、评论者屏蔽画廊或评论"
override val settingsReadReverseControls = "反转物理按键控制"
override val settingsBlockExtraneousAds = "[实验性] 屏蔽外部广告"
override val settingsAdsPlaceholder = "[可选] 选择替换外部广告的图片"
override val settingsDownload = "下载"
override val settingsDownloadDownloadLocation = "下载路径"
override val settingsDownloadCantGetDownloadLocation = "无法获取下载路径"
override val settingsDownloadConcurrency = "并发下载数"
override val settingsDownloadConcurrencySummary = { a: Int -> "最多同时下载 $a 张图片" }
override val settingsDownloadPreloadImage = "预载图片"
override val settingsDownloadPreloadImageSummary = { a: Int -> "向后预载 $a 张图片" }
override val settingsDownloadDownloadOriginImage = "下载原图"
override val settingsDownloadDownloadOriginImageSummary = "警告!可能需要 GP"
override val settingsDownloadSaveAsCbz = "保存为 CBZ 压缩包"
override val settingsDownloadArchiveMetadata = "压缩包元数据"
override val settingsDownloadArchiveMetadataSummary = "下载压缩包时生成 ComicInfo.xml"
override val settingsDownloadReloadMetadata = "重新加载元数据"
override val settingsDownloadReloadMetadataSummary = "为标签可能发生变动的下载项更新 ComicInfo.xml"
override val settingsDownloadReloadMetadataSuccessfully = { a: Int -> "成功加载 $a 项" }
override val settingsDownloadReloadMetadataFailed = { a: String -> "加载元数据失败: $a" }
override val settingsDownloadMediaScan = "允许媒体扫描"
override val settingsDownloadMediaScanSummaryOn = "请避免他人翻看你的图库应用"
override val settingsDownloadMediaScanSummaryOff = "大多数图库应用将不会显示下载目录中的图片"
override val settingsDownloadRestoreDownloadItems = "恢复下载项"
override val settingsDownloadRestoreDownloadItemsSummary = "恢复下载目录里的所有下载项"
override val settingsDownloadRestoreNotFound = "未找到可恢复下载项"
override val settingsDownloadRestoreFailed = "恢复失败"
override val settingsDownloadRestoreSuccessfully = { a: Int -> "成功恢复 $a 项" }
override val settingsDownloadCleanRedundancy = "清理下载冗余"
override val settingsDownloadCleanRedundancySummary = "清理下载目录中不在下载列表里的图片文件"
override val settingsDownloadCleanRedundancyNoRedundancy = "未发现冗余"
override val settingsDownloadCleanRedundancyDone = { a: Int -> "完成冗余清理,共清理 $a 项" }
override val settingsAdvanced = "高级"
override val settingsAdvancedSaveParseErrorBody = "解析失败时保存页面内容"
override val settingsAdvancedSaveParseErrorBodySummary = "页面内容可能含有隐私敏感信息"
override val settingsAdvancedSaveCrashLog = "应用崩溃时保存错误日志"
override val settingsAdvancedSaveCrashLogSummary = "错误日志可以帮助开发者修正问题"
override val settingsAdvancedDumpLogcat = "导出日志"
override val settingsAdvancedDumpLogcatSummary = "保存日志至外置存储器"
override val settingsAdvancedDumpLogcatFailed = "导出日志失败"
override val settingsAdvancedDumpLogcatTo = { a: String -> "已保存日志至 $a" }
override val settingsAdvancedReadCacheSize = "阅读缓存大小"
override val settingsAdvancedAppLanguageTitle = "App 界面语言"
override val settingsAdvancedHardwareBitmapThreshold = "硬件位图(性能更好)阈值"
override val settingsAdvancedHardwareBitmapThresholdSummary = "若长图无法加载请尝试减小此项"
override val settingsAdvancedExportData = "导出数据"
override val settingsAdvancedExportDataSummary = "保存数据至外置存储器,例如下载列表,快速搜索列表"
override val settingsAdvancedExportDataTo = { a: String -> "已导出数据至 $a" }
override val settingsAdvancedExportDataFailed = "导出数据失败"
override val settingsAdvancedImportData = "导入数据"
override val settingsAdvancedImportDataSummary = "从外置存储器导入数据"
override val settingsAdvancedImportDataSuccessfully = "导入数据成功"
override val settingsAdvancedBackupFavorite = "备份收藏列表"
override val settingsAdvancedBackupFavoriteSummary = "备份云端收藏列表到本地"
override val settingsAdvancedBackupFavoriteStart = { a: String -> "正在备份收藏列表 $a" }
override val settingsAdvancedBackupFavoriteNothing = "没有可以备份的收藏列表"
override val settingsAdvancedBackupFavoriteSuccess = "备份收藏列表成功"
override val settingsAdvancedBackupFavoriteFailed = "备份收藏列表失败"
override val settingsAbout = "关于"
override val settingsAboutDeclarationSummary = "EhViewer 与 E-Hentai.org 无任何联系"
override val settingsAboutAuthor = "作者"
override val settingsAboutLatestRelease = "最新版本"
override val settingsAboutSource = "源码"
override val license = "许可证"
override val settingsAboutVersion = "版本号"
override val settingsAboutCommitTime = { a: String -> "于 $a 提交" }
override val settingsAboutCheckForUpdates = "检查更新"
override val pleaseWait = "请稍候"
override val cantReadTheFile = "无法读取文件"
override val appLanguageSystem = "系统语言(默认)"
override val cloudFavorites = "云端收藏"
override val localFavorites = "本地收藏"
override val searchBarHint = { a: String -> "搜索 $a" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $b" }
override val deleteFavoritesDialogTitle = "删除收藏"
override val deleteFavoritesDialogMessage = { a: Int -> "删除 $a 项收藏?" }
override val moveFavoritesDialogTitle = "移动收藏"
override val defaultFavoritesCollection = "默认收藏夹"
override val defaultFavoritesWarning = "启用此项将无法添加收藏备注"
override val letMeSelect = "让我选择"
override val favoriteNote = "收藏备注"
override val collections = "收藏夹"
override val errorSomethingWrongHappened = "被玩坏了"
override val fromTheFuture = "来自未来"
override val justNow = "刚刚"
override val yesterday = "昨天"
override val someDaysAgo = { a: Int -> "$a 天前" }
override val archive = "压缩包"
override val archiveFree = "免费"
override val archiveOriginal = "原始"
override val archiveResample = "重采样"
override val noArchives = "没有压缩包"
override val downloadArchiveStarted = "开始下载压缩包"
override val downloadArchiveFailure = "无法下载压缩包"
override val downloadArchiveFailureNoHath = "下载压缩包需要 H@H 客户端"
override val currentFunds = "当前资金:"
override val insufficientFunds = "余额不足"
override val imageLimits = "图片配额"
override val imageLimitsSummary = "已用:"
override val imageLimitsNormal = "未受限制"
override val imageLimitsRestricted = "图片分辨率限制为 1280x"
override val resetCost = { a: Int -> "花费 $a GP 重置" }
override val reset = "重置"
override val settingsPrivacy = "隐私"
override val settingsPrivacySecure = "不允许屏幕抓取"
override val settingsPrivacySecureSummary = "启用后,将不能截取该应用的屏幕截图,同时,将不会在系统任务切换器中显示该应用的内容预览,重新加载应用以生效此更改"
override val clearSearchHistory = "清除设备上的搜索记录"
override val clearSearchHistorySummary = "移除您在此设备上执行过的搜索查询的记录"
override val clearSearchHistoryConfirm = "要清除搜索记录吗?"
override val searchHistoryCleared = "已清除搜索记录"
override val downloadService = "下载服务"
override val keyFavoriteName = "收藏画廊"
override val blackDarkTheme = "纯黑深色主题"
override val harmonizeCategoryColor = "类别颜色适配动态配色"
override val backupBeforeUpdate = "更新前备份数据"
override val useCiUpdateChannel = "使用持续集成(CI)构建频道更新"
override val sortBy = "排序依据"
override val addedTimeDesc = "添加时间(降序)"
override val addedTimeAsc = "添加时间(升序)"
override val uploadedTimeDesc = "上传时间(降序)"
override val uploadedTimeAsc = "上传时间(升序)"
override val titleAsc = "标题(升序)"
override val titleDesc = "标题(降序)"
override val pageCountAsc = "页数(升序)"
override val pageCountDesc = "页数(降序)"
override val groupByDownloadLabel = "按下载标签分组"
override val downloadFilter = "过滤"
override val downloadAll = "全部"
override val downloadStartAllReversed = "全部开始(倒序)"
override val settingsDownloadDownloadDelay = "下载延时"
override val settingsDownloadDownloadDelaySummary = { a: Int -> "每次下载延时 $a 毫秒" }
override val settingsDownloadDownloadTimeout = "下载超时(秒)"
override val noBrowserInstalled = "请安装一个浏览器。"
override val toplistAlltime = "从始至终"
override val toplistPastyear = "过去一年"
override val toplistPastmonth = "过去一个月"
override val toplistYesterday = "昨日"
override val toplist = "排行"
override val tagVoteDown = "不,这不是"
override val tagVoteUp = "是的,这很正确"
override val tagVoteWithdraw = "撤回投票"
override val tagVoteSuccessfully = "投票成功"
override val deleteSearchHistory = { a: String -> "从搜索记录中删除“$a”?" }
override val actionAddTag = "添加标签"
override val actionAddTagTip = "添加新标签"
override val commentUserUploader = { a: String -> "$a (上传者)" }
override val noNetwork = "无网络"
override val settingsEhMeteredNetworkWarning = "流量计费网络警告"
override val meteredNetworkWarning = "正在使用流量计费网络"
override val readFrom = { a: Int -> "从第 $a 页阅读" }
override val settingsEhRequestNews = "定时请求新闻页面"
override val settingsEhHideHvEvents = "隐藏 HV 事件通知"
override val copyTrans = "复制翻译"
override val defaultDownloadDirNotEmpty = "默认下载目录非空!"
override val resetDownloadLocation = "恢复默认路径"
override val pickNewDownloadLocation = "选择新路径"
override val dontShowAgain = "不再显示"
override val openSettings = "打开设置"
override val appLinkNotVerifiedMessage = "对于 Android 12 及更新的版本,您需要手动添加链接到已验证链接才能在 EhViewer 中打开 E-Hentai 链接。"
override val appLinkNotVerifiedTitle = "应用链接未验证"
override val openByDefault = "默认打开"
override val settingsPrivacyRequireUnlock = "需要解锁"
override val settingsPrivacyRequireUnlockDelay = "锁定延迟"
override val settingsPrivacyRequireUnlockDelaySummary = { a: Int -> "离开应用并在 $a 分钟内返回时不需要解锁" }
override val settingsPrivacyRequireUnlockDelaySummaryImmediately = "无论何时回到应用均要求解锁"
override val filterLabel = "屏蔽项类型"
override val archivePasswd = "归档文件密码"
override val archiveNeedPasswd = "归档文件需要密码"
override val passwdWrong = "密码错误"
override val passwdCannotBeEmpty = "密码不能为空"
override val listTileThumbSize = "详情模式下缩略图大小"
override val accountName = "账户"
override val preloadThumbAggressively = "激进地预载缩略图"
override val animateItems = "列表项目动画"
override val animateItemsSummary = "如遇崩溃/掉帧请尝试禁用此项"
override val autoUpdates = "自动检查更新"
override val updateFrequencyNever = "从不"
override val updateFrequencyDaily = "每天"
override val updateFrequency3days = "每三天"
override val updateFrequencyWeekly = "每周"
override val updateFrequencyBiweekly = "每两周"
override val updateFrequencyMonthly = "每月"
override val updateFailed = { a: String -> "更新失败:$a" }
override val newVersionAvailable = "有新版本!"
override val alreadyLatestVersion = "已是最新版本"
override val permissionDenied = "权限被拒"
override val downloadGalleryFirst = "请先下载画廊!"
override val exportAsArchive = "导出为归档文件"
override val exportAsArchiveSuccess = "导出成功"
override val exportAsArchiveFailed = "导出失败"
override val actionSettings = "设置"
override val actionRetry = "重试"
override val actionShare = "分享"
override val actionCopy = "复制"
override val actionSave = "保存"
override val actionSaveTo = "保存到…"
override val prefCategoryGeneral = "通用"
override val prefFullscreen = "全屏"
override val prefPageTransitions = "页面过渡动画"
override val prefShowPageNumber = "显示页码"
override val prefShowReaderSeekbar = "显示跳页拖动条"
override val prefDoubleTapToZoom = "双击缩放"
override val prefCustomBrightness = "自定义亮度"
override val prefCustomColorFilter = "自定义滤镜"
override val prefKeepScreenOn = "保持屏幕常亮"
override val prefReaderTheme = "背景颜色"
override val whiteBackground = "白色"
override val blackBackground = "黑色"
override val leftToRightViewer = "从左到右"
override val rightToLeftViewer = "从右到左"
override val verticalViewer = "从上到下"
override val webtoonViewer = "条漫"
override val pagerViewer = "单页式"
override val prefImageScaleType = "缩放模式"
override val scaleTypeFitScreen = "填充屏幕"
override val scaleTypeStretch = "拉伸"
override val scaleTypeFitWidth = "适应宽度"
override val scaleTypeFitHeight = "适应高度"
override val scaleTypeOriginalSize = "原始大小"
override val scaleTypeSmartFit = "智能填充"
override val prefZoomStart = "缩放位置"
override val zoomStartAutomatic = "自动"
override val zoomStartLeft = "左边"
override val zoomStartRight = "右边"
override val zoomStartCenter = "中间"
override val prefRotationType = "默认屏幕方向"
override val rotationFree = "跟随系统"
override val rotationForcePortrait = "锁定竖屏"
override val rotationForceLandscape = "锁定横屏"
override val customFilter = "滤镜"
override val decodeImageError = "无法加载该图片"
override val prefReadWithLongTap = "长按显示操作菜单"
override val prefColorFilterMode = "滤镜调和模式"
override val filterModeMultiply = "色彩增值"
override val filterModeScreen = "滤色"
override val filterModeOverlay = "覆盖"
override val filterModeLighten = "减淡/变亮"
override val filterModeDarken = "加深/变暗"
override val prefCutoutShort = "在刘海屏区域显示内容"
override val actionMenu = "菜单"
override val webtoonSidePadding25 = "25%"
override val webtoonSidePadding20 = "20%"
override val webtoonSidePadding15 = "15%"
override val webtoonSidePadding10 = "10%"
override val webtoonSidePadding0 = "无"
override val prefWebtoonSidePadding = "侧边填充"
override val verticalPlusViewer = "从上到下(连续)"
override val grayBackground = "灰色"
override val viewer = "阅读模式"
override val tappingInvertedBoth = "水平 + 垂直"
override val tappingInvertedVertical = "垂直"
override val tappingInvertedHorizontal = "水平"
override val tappingInvertedNone = "无"
override val prefCategoryReadingMode = "阅读模式"
override val prefReadWithTappingInverted = "反转点按区域"
override val prefViewerNav = "点按区域"
override val edgeNav = "边缘样式"
override val kindlishNav = "Kindle 样式"
override val lNav = "L 样式"
override val rightAndLeftNav = "左右样式"
override val navZoneRight = "右"
override val navZoneLeft = "左"
override val navZoneNext = "下页"
override val navZonePrev = "上页"
override val rotationLandscape = "横屏"
override val rotationPortrait = "竖屏"
override val rotationType = "屏幕方向"
override val prefGrayscale = "灰度"
override val automaticBackground = "自动"
override val prefInvertedColors = "反色"
override val labelDefault = "默认"
override val webtoonSidePadding5 = "5%"
override val prefLandscapeZoom = "放大横向图片"
override val prefNavigatePan = "图片放大时先平移再翻页"
override val rotationReversePortrait = "反向竖屏"
override val disabledNav = "关闭"
override val wideColorGamut = "使用Display P3色彩空间"
override val settingsEhRequestNewsTimepicker = "设置请求新闻页面的时间"
override val darkTheme = "深色主题"
override val darkThemeFollowSystem = "跟随系统"
override val darkThemeOff = "总是关闭"
override val darkThemeOn = "总是开启"
override val prefCropBorders = "裁剪边缘"
override val blockedImage = "已屏蔽的图片"
override val showBlockedImage = "显示已屏蔽的图片"
override val pageCount = { a: Int -> "$a 页" }
override val someMinutesAgo = { a: Int -> "$a 分钟前" }
override val someHoursAgo = { a: Int -> "$a 小时前" }
override val second = { _: Int -> "秒" }
override val minute = { _: Int -> "分钟" }
override val hour = { _: Int -> "小时" }
override val day = { _: Int -> "天" }
override val year = { _: Int -> "年" }
}
@@ -0,0 +1,414 @@
package com.hippo.ehviewer.ui.i18n
object ZhHkTranslations : Translations by EnTranslations {
override val homepage = "主頁"
override val subscription = "訂閲"
override val whatsHot = "熱門"
override val favourite = "收藏"
override val history = "歷史"
override val downloads = "下載"
override val settings = "設置"
override val username = "用户名"
override val password = "密碼"
override val signIn = "登錄"
override val register = "註冊"
override val signInViaWebview = "通過網頁登錄"
override val signInFirst = "請先登錄"
override val textIsEmpty = "文本為空"
override val waring = "警告"
override val invalidDownloadLocation = "似乎下載路徑不可用。請到重新設置下載路徑。"
override val clipboardGalleryUrlSnackMessage = "剪切板裏有畫廊鏈接"
override val clipboardGalleryUrlSnackAction = "查看"
override val errorTimeout = "超時"
override val errorUnknownHost = "未知主機"
override val errorRedirection = "太多重定向"
override val errorSocket = "網絡錯誤"
override val errorUnknown = "奇怪的錯誤"
override val errorCantFindActivity = "找不到相應的應用"
override val errorCannotParseTheUrl = "無法解析鏈接"
override val errorDecodingFailed = "解碼失敗"
override val errorReadingFailed = "讀取失敗"
override val errorOutOfRange = "越界"
override val errorParseError = "解析失敗"
override val error509 = "509"
override val errorInvalidUrl = "無效鏈接"
override val errorGetPtokenError = "獲取 pToken 錯誤"
override val errorCantSaveImage = "無法保存圖片"
override val errorInvalidNumber = "非法數字"
override val appWaring = "本應用中內容來自互聯網,部分內容可能對您的生理及心理造成難以恢復的傷害。本應用作者不會對由本應用造成的任何後果負責。\n\n未成年人應在監護人指導下使用本應用。"
override val errorUsernameCannotEmpty = "用户名不可為空"
override val errorPasswordCannotEmpty = "密碼不可為空"
override val guestMode = "跳過登錄"
override val signInFailed = "登錄失敗"
override val signInFailedTip = { a: String -> "若持續出錯,請嘗試“$a”。" }
override val getIt = "知道了"
override val galleryListSearchBarHintExhentai = "搜索 ExHentai"
override val galleryListSearchBarHintEHentai = "搜索 E-Hentai"
override val galleryListSearchBarOpenGallery = "打開畫廊"
override val galleryListEmptyHit = "什麼都沒有找到"
override val galleryListEmptyHitSubscription = "請至 設置->EH->我的標籤 訂閲標籤"
override val keywordSearch = "關鍵字搜索"
override val imageSearch = "圖片搜索"
override val searchImage = "圖片搜索"
override val searchSh = "已刪除"
override val searchSto = "有種子"
override val searchSr = "最低評分"
override val searchSpTo = "到"
override val searchSf = "禁用排除項:"
override val searchSfl = "語言"
override val searchSfu = "上傳者"
override val searchSft = "標籤"
override val selectImage = "選擇圖片"
override val selectImageFirst = "請先選擇圖片"
override val addToFavourites = "收藏"
override val removeFromFavourites = "移除收藏"
override val deleteDownloads = "刪除下載"
override val quickSearch = "快速搜索"
override val quickSearchTip = "點擊“+”來添加快速搜索"
override val addQuickSearchDialogTitle = "添加快速搜索"
override val nameIsEmpty = "名稱為空"
override val delete = "刪除"
override val addQuickSearchTip = "畫廊列表的狀態將被保存為快速搜索。如果你想保存搜索面板的狀態,請先執行搜索。"
override val readme = "讀我"
override val imageSearchNotQuickSearch = "無法添加圖片搜索為快速搜索"
override val duplicateQuickSearch = { a: String -> "已存在相同的快速搜索,名稱為“$a”。" }
override val duplicateName = "已存在相同名稱"
override val goToHint = { a: Int, b: Int -> "第 $a 頁,共 $b 頁" }
override val star2 = "2 星"
override val star3 = "3 星"
override val star4 = "4 星"
override val star5 = "5 星"
override val download = "下載"
override val read = "閲讀"
override val favoredTimes = { a: Int -> "\u2665 $a" }
override val ratingText = { a: String, b: Float, c: Int -> "%s (%.2f, %d)".format(a, b, c) }
override val torrentCount = { a: Int -> "種子 ($a)" }
override val share = "分享"
override val rate = "評分"
override val similarGallery = "相似畫廊"
override val searchCover = "搜索封面"
override val noTags = "暫無標籤"
override val noComments = "暫無評論"
override val noMoreComments = "已顯示所有評論"
override val moreComment = "查看更多評論"
override val refresh = "刷新"
override val openInOtherApp = "在其他應用中打開"
override val rateSuccessfully = "評分成功"
override val rateFailed = "評分失敗"
override val noTorrents = "沒有種子"
override val torrents = "種子"
override val notFavorited = "未收藏"
override val addFavoritesDialogTitle = "添加收藏"
override val addToFavoriteSuccess = "已添加至收藏"
override val removeFromFavoriteSuccess = "移除收藏"
override val addToFavoriteFailure = "添加收藏失敗"
override val removeFromFavoriteFailure = "移除收藏失敗"
override val filterTheUploader = { a: String -> "遮蔽上傳者“$a”?" }
override val filterTheTag = { a: String -> "遮蔽標籤“$a”?" }
override val filterAdded = "已新增遮蔽項"
override val rating10 = "根本把持不住"
override val rating9 = "好極了"
override val rating8 = "很棒"
override val rating7 = "不錯"
override val rating6 = "還行"
override val rating5 = "一般般"
override val rating4 = "不行"
override val rating3 = "糟糕"
override val rating2 = "瞎眼"
override val rating1 = "快要窒息了"
override val rating0 = "…"
override val galleryInfo = "畫廊信息"
override val copiedToClipboard = "已複製到剪切板"
override val keyGid = "Gid"
override val keyToken = "Token"
override val keyUrl = "鏈接"
override val keyTitle = "標題"
override val keyTitleJpn = "日文標題"
override val keyThumb = "縮略圖"
override val keyCategory = "分類"
override val keyUploader = "上傳者"
override val keyPosted = "上傳時間"
override val keyParent = "父畫廊"
override val keyVisible = "可見性"
override val keyLanguage = "語言"
override val keyPages = "頁數"
override val keySize = "大小"
override val keyFavoriteCount = "收藏次數"
override val keyFavorited = "收藏"
override val keyRatingCount = "評價次數"
override val keyRating = "評分"
override val keyTorrents = "種子個數"
override val keyTorrentUrl = "種子"
override val galleryComments = "畫廊評論"
override val commentSuccessfully = "評論成功"
override val commentFailed = "評論失敗"
override val copyCommentText = "複製評論文字"
override val editComment = "修改評論"
override val editCommentSuccessfully = "評論已被修改"
override val editCommentFailed = "修改評論失敗"
override val voteUp = "深表贊同"
override val cancelVoteUp = "不再深表贊同"
override val voteDown = "垃圾評論"
override val cancelVoteDown = "不是垃圾評論"
override val voteUpSuccessfully = "已深表贊同"
override val cancelVoteUpSuccessfully = "已不再深表贊同"
override val voteDownSuccessfully = "已欽定為垃圾評論"
override val cancelVoteDownSuccessfully = "已不再欽定為垃圾評論"
override val voteFailed = "投票失敗"
override val checkVoteStatus = "查看投票情況"
override val clickMoreComments = "點擊加載更多評論"
override val lastEdited = { a: String -> "上次修改時間:$a" }
override val goTo = "跳頁"
override val sceneDownloadTitle = { a: String -> "下載 - $a" }
override val noDownloadInfo = "這裏是下載項目"
override val downloadStateNone = "未啟動"
override val downloadStateWait = "等待中"
override val downloadStateDownloading = "下載中"
override val downloadStateDownloaded = "已下載"
override val downloadStateFailed = "失敗"
override val downloadStateFailed2 = { a: Int -> "$a 未完成" }
override val downloadStateFinish = "已完成"
override val stat509AlertTitle = "509 警告"
override val stat509AlertText = "圖片配額已用盡。請停止下載,休息一下。"
override val statDownloadDoneTitle = "下載結束"
override val statDownloadDoneTextSucceeded = { a: Int -> "$a 項下載成功" }
override val statDownloadDoneTextFailed = { a: Int -> "$a 項下載失敗" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a 項下載成功,$b 項下載失敗" }
override val statDownloadDoneLineSucceeded = { a: String -> "下載成功:$a" }
override val statDownloadDoneLineFailed = { a: String -> "下載失敗:$a" }
override val downloadRemoveDialogTitle = "移除下載項"
override val downloadRemoveDialogMessage = { a: String -> "從下載列表移除 $a ?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "從下載列表移除 $a 項?" }
override val downloadRemoveDialogCheckText = "刪除圖片文件"
override val statDownloadActionStopAll = "全部停止"
override val defaultDownloadLabelName = "默認"
override val downloadMoveDialogTitle = "移動"
override val downloadLabels = "下載標籤"
override val downloadStartAll = "全部開始"
override val downloadStopAll = "全部停止"
override val downloadResetReadingProgress = "重置阅读进度"
override val resetReadingProgressMessage = "重置所有已下载画廊的阅读进度?"
override val downloadServiceLabel = "EhViewer 下載服務"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a,剩餘 $b" }
override val rememberDownloadLabel = "記住下載標籤"
override val defaultDownloadLabel = "默認下載標籤"
override val addedToDownloadList = "已添加至下載列表"
override val add = "添加"
override val newLabelTitle = "新標籤"
override val labelTextIsEmpty = "標籤文本為空"
override val labelTextIsInvalid = "“默認”是無效標籤"
override val labelTextExist = "標籤已存在"
override val renameLabelTitle = "重命名標籤"
override val noHistory = "這裏是閲讀歷史"
override val clearAll = "全部清除"
override val clearAllHistory = "清除所有閲讀歷史?"
override val filter = "屏蔽畫廊"
override val filterTitle = "標題"
override val filterUploader = "上傳者"
override val filterTag = "標籤"
override val filterTagNamespace = "標籤組"
override val deleteFilter = { a: String -> "刪除屏蔽項“$a”?" }
override val addFilter = "添加屏蔽項"
override val showDefinition = "查看定義"
override val filterText = "屏蔽項文本"
override val filterTip = "該屏蔽系統會在 EHentai 網站屏蔽系統的基礎上繼續屏蔽畫廊。\n\n標題屏蔽項:排除標題含有該關鍵字的畫廊。\n\n上傳者屏蔽項:排除該上傳者上傳的畫廊。\n\n標籤屏蔽項:排除包含該標籤的畫廊,這會使獲取畫廊列表花費更多時間。\n\n標籤組屏蔽項:排除包含該標籤組的畫廊,這會使獲取畫廊列表花費更多時間。"
override val uConfig = "EHentai 設置"
override val applyTip = "點擊右上角的對勾來保存設置"
override val myTags = "我的標籤"
override val shareImage = "分享圖片"
override val imageSaved = { a: String -> "圖片已保存至 $a" }
override val settingsEh = "EH"
override val settingsEhSignOut = "退出登錄"
override val settingsEhIdentityCookiesSigned = "身份 Cookie 可用於登錄該賬號。<br><b>注意數據安全</b>"
override val settingsEhIdentityCookiesGuest = "未登錄"
override val settingsUConfig = "EHentai 設置"
override val settingsUConfigSummary = "EHentai 網站上的設置"
override val settingsMyTags = "我的標籤"
override val settingsMyTagsSummary = "EHentai 網站上的我的標籤"
override val settingsEhGallerySite = "畫廊站點"
override val settingsEhLaunchPage = "啟動頁"
override val settingsEhListMode = "列表模式"
override val settingsEhListModeDetail = "詳情"
override val settingsEhListModeThumb = "縮略圖"
override val settingsEhDetailSize = "詳情大小"
override val settingsEhDetailSizeLong = "長"
override val settingsEhDetailSizeShort = "短"
override val settingsEhThumbColumns = "縮略圖列數"
override val settingsEhShowJpnTitle = "顯示日文標題"
override val settingsEhShowJpnTitleSummary = "需同時在 EHentai 網站設置中啟用 Japanese Title"
override val settingsEhShowGalleryPages = "顯示畫廊頁數"
override val settingsEhShowGalleryPagesSummary = "在畫廊列表中顯示頁數"
override val settingsEhShowTagTranslations = "顯示標籤翻譯"
override val settingsEhShowTagTranslationsSummary = "顯示翻譯後的標籤而非原始文字(需花費時間來下載數據文件)"
override val settingsEhTagTranslationsSource = "補充翻譯(由 EhTagTranslation 提供)"
override val settingsEhTagTranslationsSourceUrl = "https://github.com/EhTagTranslation/Editor/wiki"
override val settingsEhFilter = "屏蔽畫廊"
override val settingsEhFilterSummary = "根據標題、上傳者、標籤屏蔽畫廊"
override val settingsDownload = "下載"
override val settingsDownloadDownloadLocation = "下載路徑"
override val settingsDownloadCantGetDownloadLocation = "無法獲取下載路徑"
override val settingsDownloadConcurrency = "下載線程數"
override val settingsDownloadConcurrencySummary = { a: Int -> "最多同時下載 $a 張圖片" }
override val settingsDownloadPreloadImage = "預載圖片"
override val settingsDownloadPreloadImageSummary = { a: Int -> "向後預載 $a 張圖片" }
override val settingsDownloadDownloadOriginImage = "下載原圖"
override val settingsDownloadDownloadOriginImageSummary = "這很危險!勾選此項會導致下載配額迅速流失"
override val settingsDownloadMediaScan = "允許媒體掃描"
override val settingsDownloadMediaScanSummaryOn = "請避免他人翻看你的圖庫應用"
override val settingsDownloadMediaScanSummaryOff = "大多數圖庫應用將不會顯示下載目錄中的圖片"
override val settingsDownloadRestoreDownloadItems = "恢復下載項"
override val settingsDownloadRestoreDownloadItemsSummary = "恢復下載目錄裏的所有下載項"
override val settingsDownloadRestoreNotFound = "未找到可恢復下載項"
override val settingsDownloadRestoreFailed = "恢復失敗"
override val settingsDownloadRestoreSuccessfully = { a: Int -> "成功恢復 $a 項" }
override val settingsDownloadCleanRedundancy = "清理下載宂餘"
override val settingsDownloadCleanRedundancySummary = "清理下載目錄中不在下載列表裏的圖片文件"
override val settingsDownloadCleanRedundancyNoRedundancy = "未發現宂餘"
override val settingsDownloadCleanRedundancyDone = { a: Int -> "完成宂餘清理,共清理 $a 項" }
override val settingsAdvanced = "高級"
override val settingsAdvancedSaveParseErrorBody = "解析失敗時保存頁面內容"
override val settingsAdvancedSaveParseErrorBodySummary = "頁面內容可能含有隱私敏感信息"
override val settingsAdvancedSaveCrashLog = "應用崩潰時保存錯誤日誌"
override val settingsAdvancedSaveCrashLogSummary = "錯誤日誌可以幫助開發者修正問題"
override val settingsAdvancedDumpLogcat = "導出日誌"
override val settingsAdvancedDumpLogcatSummary = "保存日誌至外置存儲器"
override val settingsAdvancedDumpLogcatFailed = "導出日誌失敗"
override val settingsAdvancedDumpLogcatTo = { a: String -> "已保存日誌至 $a" }
override val settingsAdvancedReadCacheSize = "閲讀緩存大小"
override val settingsAdvancedAppLanguageTitle = "App 界面語言"
override val settingsAdvancedExportData = "導出數據"
override val settingsAdvancedExportDataSummary = "保存數據至外置存儲器,例如下載列表,快速搜索列表"
override val settingsAdvancedExportDataTo = { a: String -> "已導出數據至 $a" }
override val settingsAdvancedExportDataFailed = "導出數據失敗"
override val settingsAdvancedImportData = "導入數據"
override val settingsAdvancedImportDataSummary = "從外置存儲器導入數據"
override val settingsAdvancedImportDataSuccessfully = "導入數據成功"
override val settingsAbout = "關於"
override val settingsAboutDeclarationSummary = "EhViewer 與 E-Hentai.org 無任何聯繫"
override val settingsAboutAuthor = "作者"
override val settingsAboutLatestRelease = "最新版本"
override val settingsAboutSource = "源碼"
override val settingsAboutVersion = "版本號"
override val settingsAboutCheckForUpdates = "檢查更新"
override val pleaseWait = "請稍候"
override val cantReadTheFile = "無法讀取文件"
override val appLanguageSystem = "系統語言(默認)"
override val cloudFavorites = "雲端收藏"
override val localFavorites = "本地收藏"
override val searchBarHint = { a: String -> "搜索 $a" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $b" }
override val deleteFavoritesDialogTitle = "刪除收藏"
override val deleteFavoritesDialogMessage = { a: Int -> "刪除 $a 項收藏?" }
override val moveFavoritesDialogTitle = "移動收藏"
override val defaultFavoritesCollection = "默認收藏夾"
override val letMeSelect = "讓我選擇"
override val collections = "收藏夾"
override val errorSomethingWrongHappened = "被玩壞了"
override val fromTheFuture = "來自未來"
override val justNow = "剛剛"
override val yesterday = "昨天"
override val someDaysAgo = { a: Int -> "$a 天前" }
override val archive = "壓縮包"
override val noArchives = "沒有壓縮包"
override val downloadArchiveStarted = "開始下載壓縮包"
override val downloadArchiveFailure = "無法下載壓縮包"
override val downloadArchiveFailureNoHath = "下載壓縮包需要 H@H 客户端"
override val settingsPrivacy = "隱私"
override val settingsPrivacySecure = "不允許荧幕抓取"
override val settingsPrivacySecureSummary = "啟用後,將不能截取該應用的螢幕截圖,同時,將不會在系統任務切換器中顯示該應用的內容預覽,重新啟動應用以生效此更改"
override val keyFavoriteName = "收藏畫廊"
override val actionSettings = "設定"
override val actionRetry = "重試"
override val actionShare = "分享"
override val actionSave = "儲存"
override val actionSaveTo = "儲存到…"
override val prefCategoryGeneral = "一般"
override val prefFullscreen = "全螢幕"
override val prefShowPageNumber = "顯示頁碼"
override val prefCustomBrightness = "自訂亮度"
override val prefCustomColorFilter = "色彩濾鏡"
override val prefKeepScreenOn = "保持螢幕恆亮"
override val prefRotationType = "預設螢幕方向"
override val rotationFree = "自動"
override val rotationForcePortrait = "鎖定直向"
override val rotationForceLandscape = "鎖定橫向"
override val prefPageTransitions = "翻頁轉場動畫"
override val prefColorFilterMode = "濾鏡融合機制"
override val filterModeMultiply = "色彩增值"
override val filterModeScreen = "濾色"
override val filterModeOverlay = "覆蓋"
override val filterModeLighten = "減淡/變亮"
override val filterModeDarken = "加深/變暗"
override val prefReadWithLongTap = "長按顯示"
override val prefReaderTheme = "背景顏色"
override val whiteBackground = "白色"
override val blackBackground = "黑色"
override val leftToRightViewer = "由左至右"
override val rightToLeftViewer = "由右至左"
override val verticalViewer = "由上至下"
override val webtoonViewer = "Webtoon 模式"
override val pagerViewer = "單頁式"
override val prefImageScaleType = "縮放模式"
override val scaleTypeFitScreen = "符合螢幕"
override val scaleTypeStretch = "延展"
override val scaleTypeFitWidth = "符合頁寬"
override val scaleTypeFitHeight = "符合頁高"
override val scaleTypeOriginalSize = "原始大小"
override val scaleTypeSmartFit = "智慧型填充"
override val prefZoomStart = "縮放原點"
override val zoomStartAutomatic = "自動"
override val zoomStartLeft = "左邊"
override val zoomStartRight = "右邊"
override val zoomStartCenter = "中間"
override val decodeImageError = "無法載入該圖片"
override val downloadAll = "全部"
override val customFilter = "濾鏡"
override val grayBackground = "灰色"
override val webtoonSidePadding25 = "25%"
override val webtoonSidePadding20 = "20%"
override val webtoonSidePadding15 = "15%"
override val webtoonSidePadding10 = "10%"
override val webtoonSidePadding0 = "無"
override val actionMenu = "選單"
override val prefCutoutShort = "使用螢幕凹口區域"
override val prefWebtoonSidePadding = "頁緣留白"
override val viewer = "閱讀模式"
override val tappingInvertedBoth = "全部"
override val tappingInvertedVertical = "垂直"
override val tappingInvertedHorizontal = "水平"
override val prefReadWithTappingInverted = "反轉輕觸區域"
override val verticalPlusViewer = "垂直連貫"
override val tappingInvertedNone = "無"
override val prefCategoryReadingMode = "閱讀模式"
override val edgeNav = "邊緣式"
override val kindlishNav = "Kindle 式"
override val lNav = "L 式"
override val prefViewerNav = "輕觸區域"
override val rightAndLeftNav = "左右式"
override val rotationPortrait = "直向"
override val rotationType = "螢幕方向"
override val navZoneLeft = "左邊"
override val navZonePrev = "上一頁"
override val navZoneNext = "下一頁"
override val navZoneRight = "右邊"
override val rotationLandscape = "橫向"
override val automaticBackground = "自動"
override val prefGrayscale = "灰階"
override val prefInvertedColors = "反轉"
override val labelDefault = "預設"
override val webtoonSidePadding5 = "5%"
override val prefLandscapeZoom = "縮放橫向圖片"
override val prefNavigatePan = "輕觸時移動圖片"
override val rotationReversePortrait = "顛倒直向"
override val disabledNav = "停用"
override val pageCount = { a: Int -> "$a 頁" }
override val someMinutesAgo = { a: Int -> "$a 分鐘前" }
override val someHoursAgo = { a: Int -> "$a 小時前" }
override val second = { _: Int -> "秒" }
override val minute = { _: Int -> "分鐘" }
override val hour = { _: Int -> "小時" }
override val day = { _: Int -> "天" }
override val year = { _: Int -> "年" }
}
@@ -0,0 +1,557 @@
package com.hippo.ehviewer.ui.i18n
object ZhTwTranslations : Translations by EnTranslations {
override val homepage = "首頁"
override val subscription = "訂閱"
override val whatsHot = "熱門"
override val favourite = "收藏"
override val history = "歷史"
override val downloads = "下載"
override val settings = "設定"
override val username = "使用者名稱"
override val password = "密碼"
override val signIn = "登入"
override val register = "註冊"
override val signInViaWebview = "透過網頁登入"
override val signInFirst = "請先登入"
override val textIsEmpty = "文字是空的"
override val waring = "警告"
override val invalidDownloadLocation = "看來下載路徑似乎沒辦法使用。請至設定重新設定下載路徑。"
override val clipboardGalleryUrlSnackMessage = "剪貼簿裡有圖庫連結"
override val clipboardGalleryUrlSnackAction = "檢視"
override val errorTimeout = "逾時"
override val errorUnknownHost = "未知的主機"
override val errorRedirection = "重新導向迴圈"
override val errorSocket = "網路錯誤"
override val errorUnknown = "奇怪的錯誤"
override val errorCantFindActivity = "找不到相對應的應用程式"
override val errorCannotParseTheUrl = "無法解析連結"
override val errorDecodingFailed = "解碼失敗"
override val errorReadingFailed = "讀取失敗"
override val errorOutOfRange = "超出範圍"
override val errorParseError = "解析失敗"
override val error509 = "509"
override val errorInvalidUrl = "不正確的連結"
override val errorGetPtokenError = "取得 pToken 時發生錯誤"
override val errorCantSaveImage = "無法儲存圖片"
override val errorInvalidNumber = "無效的數字"
override val appWaring = "本應用程式中內容來自網際網路,部分內容可能對您的生理及心理造成難以恢復的傷害。本應用程式的作者不會對由其所造成的任何影響負責。\n\n未成年人應在監護人指導下使用本應用程式。\n\n繼續使用即代表您同意上述條款。"
override val appWaring2 = "繼續使用即表示您同意上述條款。"
override val errorUsernameCannotEmpty = "使用者名稱欄位不能為空"
override val errorPasswordCannotEmpty = "密碼欄位不能為空"
override val guestMode = "略過登入"
override val signInFailed = "登入失敗"
override val signInFailedTip = { a: String -> "若持續出錯,請嘗試“$a”。" }
override val getIt = "知道了"
override val galleryListSearchBarHintExhentai = "在 ExHentai 搜尋"
override val galleryListSearchBarHintEHentai = "在 E-Hentai 搜尋"
override val galleryListSearchBarOpenGallery = "開啟圖庫"
override val galleryListEmptyHit = "什麼都沒找到"
override val galleryListEmptyHitSubscription = "請至 設定->EH->我的標籤 訂閱標籤"
override val keywordSearch = "關鍵字搜尋"
override val imageSearch = "圖片搜尋"
override val searchImage = "圖片搜尋"
override val searchSh = "已被移除"
override val searchSto = "有種子"
override val searchSr = "最低評分"
override val searchSpTo = "到"
override val searchSpErr1 = "頁數最大值至少為 10"
override val searchSpErr2 = "頁數範圍差至少為 20"
override val searchSf = "停用排除項:"
override val searchSfl = "語言"
override val searchSfu = "上傳者"
override val searchSft = "標籤"
override val selectImage = "選擇圖片"
override val selectImageFirst = "請先選擇圖片"
override val addToFavourites = "收藏"
override val removeFromFavourites = "移除收藏"
override val deleteDownloads = "刪除下載"
override val quickSearch = "快速搜尋"
override val quickSearchTip = "點選“+”以新增快速搜尋"
override val addQuickSearchDialogTitle = "新增快速搜尋"
override val nameIsEmpty = "名稱是空的"
override val delete = "刪除"
override val addQuickSearchTip = "圖庫列表的狀態將被儲存為快速搜尋。如果你想儲存搜尋面板的狀態,請先進行搜尋。"
override val readme = "ReadMe"
override val imageSearchNotQuickSearch = "無法將圖片搜尋加入快速搜尋"
override val duplicateQuickSearch = { a: String -> "已存在相同的快速搜尋,名稱為“$a”。" }
override val duplicateName = "名稱重複"
override val saveProgress = "儲存進度"
override val deleteQuickSearch = { a: String -> "刪除快速搜尋“$a”?" }
override val goToHint = { a: Int, b: Int -> "第 $a 頁,共 $b 頁" }
override val any = "不限"
override val star2 = "2 星"
override val star3 = "3 星"
override val star4 = "4 星"
override val star5 = "5 星"
override val download = "下載"
override val read = "閱讀"
override val favoredTimes = { a: Int -> "\u2665 $a" }
override val ratingText = { a: String, b: Float, c: Int -> "%s (%.2f, %d)".format(a, b, c) }
override val torrentCount = { a: Int -> "種子 ($a)" }
override val share = "分享"
override val rate = "評分"
override val similarGallery = "類似圖庫"
override val searchCover = "以封面搜尋"
override val noTags = "還沒有標籤"
override val noComments = "沒有留言"
override val noMoreComments = "已顯示所有的留言了"
override val moreComment = "更多留言"
override val refresh = "重新整理"
override val viewOriginal = "查看原圖"
override val openInOtherApp = "在其他應用程式中開啟"
override val clearImageCache = "清除圖片快取"
override val clearImageCacheConfirm = "為該圖庫清除所有快取圖片?"
override val imageCacheCleared = "已清除圖片快取"
override val rateSuccessfully = "評分成功"
override val rateFailed = "評分失敗"
override val noTorrents = "沒有種子"
override val torrents = "種子"
override val notFavorited = "未收藏"
override val addFavoritesDialogTitle = "新增到收藏裡"
override val addToFavoriteSuccess = "已新增至收藏中"
override val removeFromFavoriteSuccess = "從收藏中移除"
override val addToFavoriteFailure = "無法新增至收藏"
override val removeFromFavoriteFailure = "無法從收藏中移除"
override val filterTheUploader = { a: String -> "把上傳者“$a”加入過濾列表?" }
override val filterTheTag = { a: String -> "隱藏標籤“$a”?" }
override val filterAdded = "已經新增篩選條件"
override val newerVersionAvailable = "此圖庫有新版本可以使用。"
override val newerVersionTitle = { a: String, b: String -> "$a, 於 $b 加入" }
override val rating10 = "太神啦!"
override val rating9 = "根本把持不住"
override val rating8 = "很棒"
override val rating7 = "不錯"
override val rating6 = "還好"
override val rating5 = "普通"
override val rating4 = "不行"
override val rating3 = "超爛"
override val rating2 = "快瞎了"
override val rating1 = "快要窒息了"
override val rating0 = "下去!"
override val galleryInfo = "圖庫資訊"
override val copiedToClipboard = "已複製到剪貼簿"
override val keyGid = "GID"
override val keyToken = "Token"
override val keyUrl = "網址"
override val keyTitle = "標題"
override val keyTitleJpn = "日文標題"
override val keyThumb = "縮圖"
override val keyCategory = "分類"
override val keyUploader = "上傳者"
override val keyPosted = "上傳時間"
override val keyParent = "上層圖庫"
override val keyVisible = "可見"
override val keyLanguage = "語言"
override val keyPages = "頁數"
override val keySize = "大小"
override val keyFavoriteCount = "收藏次數"
override val keyFavorited = "收藏"
override val keyRatingCount = "評分次數"
override val keyRating = "分數"
override val keyTorrents = "種子數"
override val keyTorrentUrl = "種子連結"
override val galleryComments = "圖庫留言"
override val commentSuccessfully = "留言成功"
override val commentFailed = "留言失敗"
override val copyCommentText = "複製留言文字"
override val blockCommenter = "隱藏評論者"
override val filterTheCommenter = { a: String -> "隱藏評論者“$a”?" }
override val editComment = "修改留言"
override val editCommentSuccessfully = "留言已被修改"
override val editCommentFailed = "修改留言失敗"
override val voteUp = "推"
override val cancelVoteUp = "收回推"
override val voteDown = "噓"
override val cancelVoteDown = "收回噓"
override val voteUpSuccessfully = "發出推了"
override val cancelVoteUpSuccessfully = "已經收回推了"
override val voteDownSuccessfully = "發出噓了"
override val cancelVoteDownSuccessfully = "已經收回噓了"
override val voteFailed = "推噓失敗"
override val checkVoteStatus = "檢視推噓狀態"
override val clickMoreComments = "點選載入更多留言"
override val lastEdited = { a: String -> "上次修改時間:$a" }
override val goTo = "跳到"
override val sceneDownloadTitle = { a: String -> "正在下載 - $a" }
override val noDownloadInfo = "下載項目將顯示在此"
override val downloadStateNone = "閒置中"
override val downloadStateWait = "等待中"
override val downloadStateDownloading = "下載中"
override val downloadStateDownloaded = "已下載"
override val downloadStateFailed = "下載失敗"
override val downloadStateFailed2 = { a: Int -> "還有 $a 未完成" }
override val downloadStateFinish = "大功告成"
override val stat509AlertTitle = "509 警告"
override val stat509AlertText = "圖片流量已用盡。請停止下載,休息一下。"
override val statDownloadDoneTitle = "下載結束"
override val statDownloadDoneTextSucceeded = { a: Int -> "有 $a 項已成功下載" }
override val statDownloadDoneTextFailed = { a: Int -> "有 $a 項下載失敗" }
override val statDownloadDoneTextMix = { a: Int, b: Int -> "$a 項成功下載,$b 項下載失敗" }
override val statDownloadDoneLineSucceeded = { a: String -> "$a 下載成功" }
override val statDownloadDoneLineFailed = { a: String -> "$a 下載失敗" }
override val downloadRemoveDialogTitle = "移除下載佇列"
override val downloadRemoveDialogMessage = { a: String -> "將 $a 從下載佇列中移除嗎?" }
override val downloadRemoveDialogMessage2 = { a: Int -> "從下載佇列中移除 $a 項任務嗎?" }
override val downloadRemoveDialogCheckText = "刪除圖檔"
override val statDownloadActionStopAll = "全部停止"
override val defaultDownloadLabelName = "預設"
override val downloadMoveDialogTitle = "移動"
override val downloadLabels = "下載標籤"
override val downloadStartAll = "全部開始"
override val downloadStopAll = "全部停止"
override val downloadResetReadingProgress = "重置閱讀進度"
override val resetReadingProgressMessage = "重置所有已下載圖庫的閱讀進度?"
override val downloadServiceLabel = "EhViewer 下載服務"
override val downloadSpeedText = { a: String -> a }
override val downloadSpeedText2 = { a: String, b: String -> "$a,剩餘 $b" }
override val rememberDownloadLabel = "記住下載標籤"
override val defaultDownloadLabel = "預設下載標籤"
override val addedToDownloadList = "已新增至下載列表"
override val selectGroupingMode = "選擇分組依據"
override val selectGroupingModeCustom = "自定義標籤"
override val selectGroupingModeArtist = "作者"
override val unknownArtists = "未知"
override val add = "新增"
override val newLabelTitle = "新標籤"
override val labelTextIsEmpty = "標籤文字是空的"
override val labelTextIsInvalid = "“預設”是無效的標籤"
override val labelTextExist = "標籤已存在"
override val renameLabelTitle = "重新命名標籤"
override val deleteLabel = { a: String -> "刪除標籤“$a”?" }
override val noHistory = "歷史紀錄將會顯示在這裡"
override val clearAll = "全部清除"
override val clearAllHistory = "清除所有歷史紀錄?"
override val filter = "隱藏圖庫"
override val filterTitle = "標題"
override val filterUploader = "上傳者"
override val filterTag = "標籤"
override val filterTagNamespace = "標籤組"
override val filterCommenter = "評論者"
override val filterComment = "評論"
override val deleteFilter = { a: String -> "刪除隱藏項“$a”?" }
override val addFilter = "新增隱藏項"
override val showDefinition = "檢視定義"
override val filterText = "隱藏項文字"
override val filterTip = "該隱藏系統會在 EHentai 網站隱藏系統的基礎上繼續隱藏圖庫。\n\n標題隱藏項:排除標題含有該關鍵字的圖庫。\n\n上傳者隱藏項:排除該上傳者上傳的圖庫。\n\n標籤隱藏項:排除包含該標籤的圖庫,這會使獲取圖庫列表花費更多時間。\n\n標籤組隱藏項:排除包含該標籤組的圖庫,這會使獲取圖庫列表花費更多時間。"
override val uConfig = "EHentai 設定"
override val applyTip = "點選右上角的勾勾以儲存設定"
override val myTags = "我的標籤"
override val shareImage = "分享圖片"
override val imageSaved = { a: String -> "已將圖片儲存至 $a" }
override val settingsEh = "EH"
override val settingsEhSignOut = "登出"
override val settingsEhIdentityCookiesSigned = "身份 Cookie 可用於登入該帳號。<br><b>請注意資料安全</b>"
override val settingsEhIdentityCookiesGuest = "訪客模式"
override val settingsEhClearIgneous = "清除 igneous"
override val settingsUConfig = "EHentai 設定"
override val settingsUConfigSummary = "EHentai 網站上的設定"
override val settingsMyTags = "我的標籤"
override val settingsMyTagsSummary = "EHentai 網站上的我的標籤"
override val settingsEhGallerySite = "圖庫站臺"
override val settingsEhLaunchPage = "啟動頁"
override val settingsEhListMode = "列表模式"
override val settingsEhListModeDetail = "詳細資料"
override val settingsEhListModeThumb = "縮圖"
override val settingsEhDetailSize = "詳細大小"
override val settingsEhDetailSizeLong = "長"
override val settingsEhDetailSizeShort = "短"
override val settingsEhThumbColumns = "縮圖列數"
override val settingsEhForceEhThumb = "使用 e-hentai 縮圖伺服器"
override val settingsEhForceEhThumbSummary = "若縮圖載入遇到問題可嘗試停用此項"
override val settingsEhShowJpnTitle = "顯示日文標題"
override val settingsEhShowJpnTitleSummary = "需同時在 EHentai 網站設定中啟用 Japanese Title"
override val settingsEhShowGalleryPages = "顯示圖庫頁數"
override val settingsEhShowGalleryPagesSummary = "在圖庫列表中顯示頁數"
override val settingsEhShowGalleryComments = "顯示圖庫評論"
override val settingsEhShowGalleryCommentsSummary = "在圖庫詳情頁中顯示評論"
override val settingsEhShowGalleryCommentThreshold = "評論分數閥值"
override val settingsEhShowGalleryCommentThresholdSummary = "隱藏小於或等於設定分數的評論(-101 為停用)"
override val settingsEhShowTagTranslations = "顯示標籤翻譯"
override val settingsEhShowTagTranslationsSummary = "顯示翻譯後的標籤而非原始文字(需花費時間來下載資料檔案)"
override val settingsEhTagTranslationsSource = "補充翻譯(由 EhTagTranslation 提供)"
override val settingsEhTagTranslationsSourceUrl = "https://github.com/EhTagTranslation/Editor/wiki"
override val settingsEhFilter = "隱藏圖庫"
override val settingsEhFilterSummary = "根據標題、上傳者、標籤、評論者隱藏圖庫或評論"
override val settingsDownload = "下載"
override val settingsDownloadDownloadLocation = "下載路徑"
override val settingsDownloadCantGetDownloadLocation = "無法取得下載路徑"
override val settingsDownloadConcurrency = "並行下載數"
override val settingsDownloadConcurrencySummary = { a: Int -> "最多同時下載 $a 張圖片" }
override val settingsDownloadPreloadImage = "預載圖片"
override val settingsDownloadPreloadImageSummary = { a: Int -> "向後預載 $a 張圖片" }
override val settingsDownloadDownloadOriginImage = "下載原圖"
override val settingsDownloadDownloadOriginImageSummary = "這很危險!勾選這個選項會導致圖片流量配額快速耗用"
override val settingsDownloadSaveAsCbz = "儲存為 CBZ 壓縮檔"
override val settingsDownloadArchiveMetadata = "壓縮檔中繼資料"
override val settingsDownloadArchiveMetadataSummary = "下載壓縮檔時產生 ComicInfo.xml"
override val settingsDownloadReloadMetadata = "重新載入中繼資料"
override val settingsDownloadReloadMetadataSummary = "為標籤可能發生變動的下載項更新 ComicInfo.xml"
override val settingsDownloadReloadMetadataSuccessfully = { a: Int -> "成功載入 $a 項" }
override val settingsDownloadReloadMetadataFailed = { a: String -> "載入中繼資料失敗: $a" }
override val settingsDownloadMediaScan = "允許其他程式進行媒體掃描"
override val settingsDownloadMediaScanSummaryOn = "請別讓別人看到你的相簿"
override val settingsDownloadMediaScanSummaryOff = "大部分相簿軟體將會忽略顯示下載路徑中的影像"
override val settingsDownloadRestoreDownloadItems = "復原下載的檔案"
override val settingsDownloadRestoreDownloadItemsSummary = "復原下載路徑中的所有下載的檔案"
override val settingsDownloadRestoreNotFound = "未尋獲可復原的已下載檔案"
override val settingsDownloadRestoreFailed = "復原失敗"
override val settingsDownloadRestoreSuccessfully = { a: Int -> "成功復原 $a 項" }
override val settingsDownloadCleanRedundancy = "清除冗餘的檔案"
override val settingsDownloadCleanRedundancySummary = "清除已下載但不在下載列表中的圖檔"
override val settingsDownloadCleanRedundancyNoRedundancy = "未發現冗餘檔案"
override val settingsDownloadCleanRedundancyDone = { a: Int -> "完成冗餘檔案清理,共清理了 $a 個檔案" }
override val settingsAdvanced = "進階"
override val settingsAdvancedSaveParseErrorBody = "解析失敗時儲存網頁的內容"
override val settingsAdvancedSaveParseErrorBodySummary = "網頁內容可能含有敏感的隱私資料"
override val settingsAdvancedSaveCrashLog = "應用程式崩潰時儲存錯誤日誌"
override val settingsAdvancedSaveCrashLogSummary = "錯誤日誌可以幫助開發者修正問題"
override val settingsAdvancedDumpLogcat = "傾印記錄檔"
override val settingsAdvancedDumpLogcatSummary = "將紀錄檔儲存至外接儲存裝置"
override val settingsAdvancedDumpLogcatFailed = "無法傾印紀錄檔"
override val settingsAdvancedDumpLogcatTo = { a: String -> "已將紀錄檔儲存至 $a" }
override val settingsAdvancedReadCacheSize = "閱讀快取大小"
override val settingsAdvancedAppLanguageTitle = "應用程式介面語言"
override val settingsAdvancedExportData = "匯出檔案"
override val settingsAdvancedExportDataSummary = "儲存資料至外接儲存裝置,例如下載列表,快速搜尋列表"
override val settingsAdvancedExportDataTo = { a: String -> "已匯出資料至 $a" }
override val settingsAdvancedExportDataFailed = "無法匯出資料"
override val settingsAdvancedImportData = "匯入檔案"
override val settingsAdvancedImportDataSummary = "從之前儲存的檔案匯入"
override val settingsAdvancedImportDataSuccessfully = "成功將資料匯入"
override val settingsAdvancedBackupFavorite = "備份收藏列表"
override val settingsAdvancedBackupFavoriteSummary = "備份雲端收藏列表到本機"
override val settingsAdvancedBackupFavoriteStart = { a: String -> "正在備份收藏列表 $a" }
override val settingsAdvancedBackupFavoriteNothing = "沒有可以備份的收藏列表"
override val settingsAdvancedBackupFavoriteSuccess = "備份收藏列表成功"
override val settingsAdvancedBackupFavoriteFailed = "備份收藏列表失敗"
override val settingsAbout = "關於"
override val settingsAboutDeclarationSummary = "EhViewer 與 E-Hentai.org 無任何關聯"
override val settingsAboutAuthor = "作者"
override val settingsAboutLatestRelease = "最新版本"
override val settingsAboutSource = "原始碼"
override val settingsAboutVersion = "版本號碼"
override val settingsAboutCommitTime = { a: String -> "於 $a 提交" }
override val settingsAboutCheckForUpdates = "檢查更新"
override val license = "授權條款"
override val pleaseWait = "請稍候"
override val cantReadTheFile = "無法讀取檔案"
override val appLanguageSystem = "系統語言(預設)"
override val cloudFavorites = "雲端收藏"
override val localFavorites = "本機收藏"
override val searchBarHint = { a: String -> "搜尋 $a" }
override val favoritesTitle = { a: String -> a }
override val favoritesTitle2 = { a: String, b: String -> "$a - $b" }
override val deleteFavoritesDialogTitle = "移除收藏"
override val deleteFavoritesDialogMessage = { a: Int -> "將 $a 項收藏移除?" }
override val moveFavoritesDialogTitle = "移動收藏"
override val defaultFavoritesCollection = "預設收藏夾"
override val defaultFavoritesWarning = "若啟用此項將無法新增收藏備註"
override val letMeSelect = "讓我每次都選擇"
override val favoriteNote = "收藏備註"
override val collections = "收藏夾"
override val errorSomethingWrongHappened = "被玩壞了"
override val fromTheFuture = "來自未來"
override val justNow = "剛剛"
override val yesterday = "昨天"
override val someDaysAgo = { a: Int -> "$a 天前" }
override val archive = "壓縮檔"
override val archiveFree = "免費"
override val archiveOriginal = "原始"
override val archiveResample = "重新採樣"
override val noArchives = "沒有壓縮檔"
override val downloadArchiveStarted = "開始下載壓縮檔"
override val downloadArchiveFailure = "下載失敗"
override val downloadArchiveFailureNoHath = "下載壓縮檔需要 H@H 客戶端"
override val currentFunds = "目前資金:"
override val insufficientFunds = "餘額不足"
override val imageLimits = "圖片配額"
override val imageLimitsSummary = "已用:"
override val resetCost = { a: Int -> "花費 $a GP 重置" }
override val reset = "重置"
override val settingsPrivacy = "隱私"
override val settingsPrivacySecure = "不允許螢幕擷取"
override val settingsPrivacySecureSummary = "啟用後,將無法對本程式進行螢幕擷取,同時,將不會在系統任務切換器中顯示該程式的預覽內容,重新啟動本程式以套用此變更"
override val clearSearchHistory = "清除裝置上的搜尋記錄"
override val clearSearchHistorySummary = "移除曾在此裝置上進行過的搜尋"
override val clearSearchHistoryConfirm = "清除搜尋記錄?"
override val searchHistoryCleared = "已清除搜尋記錄"
override val downloadService = "下載服務"
override val keyFavoriteName = "收藏圖庫"
override val blackDarkTheme = "純黑深色主題"
override val harmonizeCategoryColor = "以動態顏色為分類顏色配色"
override val backupBeforeUpdate = "更新前備份資料"
override val useCiUpdateChannel = "使用 CI 更新頻道"
override val sortBy = "排序方式"
override val addedTimeDesc = "加入時間 (遞減)"
override val addedTimeAsc = "加入時間 (遞增)"
override val uploadedTimeDesc = "上傳時間 (遞減)"
override val uploadedTimeAsc = "上傳時間 (遞增)"
override val titleAsc = "標題 (遞減)"
override val titleDesc = "標題 (遞增)"
override val pageCountAsc = "頁數 (遞減)"
override val pageCountDesc = "頁數 (遞增)"
override val groupByDownloadLabel = "按下載標籤分組"
override val downloadFilter = "過濾"
override val downloadAll = "全部"
override val downloadStartAllReversed = "全部開始(倒序)"
override val settingsDownloadDownloadDelay = "下載延時"
override val settingsDownloadDownloadDelaySummary = { a: Int -> "每次下載延時 $a 毫秒" }
override val settingsDownloadDownloadTimeout = "下載超時(秒)"
override val noBrowserInstalled = "請安裝一個瀏覽器。"
override val toplistAlltime = "從始至終"
override val toplistPastyear = "過去一年"
override val toplistPastmonth = "過去一個月"
override val toplistYesterday = "昨日"
override val toplist = "排行"
override val tagVoteDown = "不,這不是"
override val tagVoteUp = "是的,這很正確"
override val tagVoteSuccessfully = "投票成功"
override val deleteSearchHistory = { a: String -> "從搜尋記錄中刪除“$a”?" }
override val actionAddTag = "增加標籤"
override val actionAddTagTip = "增加新標籤"
override val commentUserUploader = { a: String -> "$a (上傳者)" }
override val settingsEhMeteredNetworkWarning = "流量計費網路警告"
override val meteredNetworkWarning = "正在使用流量計費網路"
override val readFrom = { a: Int -> "從第 $a 頁閱讀" }
override val settingsEhRequestNews = "啟動時請求新聞頁面"
override val settingsEhHideHvEvents = "隱藏 HV 事件通知"
override val copyTrans = "複製翻譯"
override val resetDownloadLocation = "恢復預設路徑"
override val pickNewDownloadLocation = "選擇新路徑"
override val dontShowAgain = "不再顯示"
override val openSettings = "開啟設定"
override val appLinkNotVerifiedMessage = "對於 Android 12 及更新的版本,您需要手動增加連結到已驗證連結才能在 EhViewer 中開啟 E-Hentai 連結。"
override val appLinkNotVerifiedTitle = "應用程式連結未驗證"
override val openByDefault = "預設開啟"
override val settingsPrivacyRequireUnlock = "需要解鎖"
override val settingsPrivacyRequireUnlockDelay = "鎖定延遲"
override val settingsPrivacyRequireUnlockDelaySummary = { a: Int -> "離開程式並在 $a 分鐘內返回時不需要解鎖" }
override val settingsPrivacyRequireUnlockDelaySummaryImmediately = "無論何時回到程式均要求解鎖"
override val filterLabel = "隱藏項類型"
override val archivePasswd = "壓縮檔密碼"
override val archiveNeedPasswd = "壓縮檔需要密碼"
override val passwdWrong = "密碼錯誤"
override val passwdCannotBeEmpty = "密碼不能為空"
override val listTileThumbSize = "詳情模式下縮圖大小"
override val accountName = "帳號"
override val preloadThumbAggressively = "積極地預載入縮圖"
override val animateItems = "列表項目動畫"
override val animateItemsSummary = "如遇崩潰/低幀率請嘗試停用此項"
override val autoUpdates = "自動檢查更新"
override val updateFrequencyNever = "從不"
override val updateFrequencyDaily = "每天"
override val updateFrequency3days = "每 3 天"
override val updateFrequencyWeekly = "每週"
override val updateFrequencyBiweekly = "每兩週"
override val updateFrequencyMonthly = "每月"
override val updateFailed = { a: String -> "更新失敗:$a" }
override val newVersionAvailable = "有新版本可用!"
override val alreadyLatestVersion = "已是最新版本"
override val permissionDenied = "沒有權限"
override val downloadGalleryFirst = "請先下載圖庫!"
override val exportAsArchive = "匯出成壓縮檔"
override val exportAsArchiveSuccess = "匯出成功"
override val exportAsArchiveFailed = "匯出失敗"
override val actionSettings = "設定"
override val actionRetry = "重試"
override val actionShare = "分享"
override val actionCopy = "複製"
override val actionSave = "儲存"
override val actionSaveTo = "儲存到…"
override val prefCategoryGeneral = "一般"
override val prefFullscreen = "全螢幕"
override val prefPageTransitions = "翻頁轉場動畫"
override val prefShowPageNumber = "顯示頁碼"
override val prefShowReaderSeekbar = "顯示跳頁拖動條"
override val prefDoubleTapToZoom = "雙擊縮放"
override val prefCustomBrightness = "自訂亮度"
override val prefCustomColorFilter = "色彩濾鏡"
override val prefKeepScreenOn = "保持螢幕恆亮"
override val prefReaderTheme = "背景顏色"
override val whiteBackground = "白色"
override val blackBackground = "黑色"
override val leftToRightViewer = "由左至右"
override val rightToLeftViewer = "由右至左"
override val verticalViewer = "由上至下"
override val webtoonViewer = "Webtoon 模式"
override val pagerViewer = "單頁式"
override val prefImageScaleType = "縮放模式"
override val scaleTypeFitScreen = "符合螢幕"
override val scaleTypeStretch = "延展"
override val scaleTypeFitWidth = "符合頁寬"
override val scaleTypeFitHeight = "符合頁高"
override val scaleTypeOriginalSize = "原始大小"
override val scaleTypeSmartFit = "智慧型填充"
override val prefZoomStart = "縮放原點"
override val zoomStartAutomatic = "自動"
override val zoomStartLeft = "左邊"
override val zoomStartRight = "右邊"
override val zoomStartCenter = "中間"
override val prefRotationType = "預設螢幕方向"
override val rotationFree = "自動"
override val rotationForcePortrait = "鎖定直向"
override val rotationForceLandscape = "鎖定橫向"
override val customFilter = "濾鏡"
override val decodeImageError = "無法載入該圖片"
override val prefReadWithLongTap = "長按顯示"
override val prefColorFilterMode = "濾鏡融合機制"
override val filterModeMultiply = "色彩增值"
override val filterModeScreen = "濾色"
override val filterModeOverlay = "覆蓋"
override val filterModeLighten = "減淡/變亮"
override val filterModeDarken = "加深/變暗"
override val prefCutoutShort = "使用螢幕凹口區域"
override val actionMenu = "選單"
override val webtoonSidePadding25 = "25%"
override val webtoonSidePadding20 = "20%"
override val webtoonSidePadding15 = "15%"
override val webtoonSidePadding10 = "10%"
override val webtoonSidePadding0 = "無"
override val prefWebtoonSidePadding = "頁緣留白"
override val verticalPlusViewer = "垂直連貫"
override val grayBackground = "灰色"
override val viewer = "閱讀模式"
override val tappingInvertedBoth = "水平 + 垂直"
override val tappingInvertedVertical = "垂直"
override val tappingInvertedHorizontal = "水平"
override val tappingInvertedNone = "無"
override val prefCategoryReadingMode = "閱讀模式"
override val prefReadWithTappingInverted = "反轉輕觸區域"
override val prefViewerNav = "輕觸區域"
override val edgeNav = "邊緣式"
override val kindlishNav = "Kindle 式"
override val lNav = "L 式"
override val rightAndLeftNav = "左右式"
override val navZoneRight = "右邊"
override val navZoneLeft = "左邊"
override val navZoneNext = "下一頁"
override val navZonePrev = "上一頁"
override val rotationLandscape = "橫向"
override val rotationPortrait = "直向"
override val rotationType = "螢幕方向"
override val prefGrayscale = "灰階"
override val automaticBackground = "自動"
override val prefInvertedColors = "反轉"
override val labelDefault = "預設"
override val webtoonSidePadding5 = "5%"
override val prefLandscapeZoom = "縮放橫向圖片"
override val prefNavigatePan = "輕觸時移動圖片"
override val rotationReversePortrait = "顛倒直向"
override val disabledNav = "停用"
override val wideColorGamut = "使用 Display P3 色彩空間"
override val settingsEhRequestNewsTimepicker = "設定請求新聞頁面的時間"
override val darkTheme = "深色主題"
override val darkThemeFollowSystem = "跟隨系統"
override val darkThemeOff = "總是關閉"
override val darkThemeOn = "總是開啟"
override val prefCropBorders = "邊緣裁剪"
override val pageCount = { a: Int -> "$a 頁" }
override val someMinutesAgo = { a: Int -> "$a 分鐘前" }
override val someHoursAgo = { a: Int -> "$a 小時前" }
override val second = { _: Int -> "秒" }
override val minute = { _: Int -> "分鐘" }
override val hour = { _: Int -> "小時" }
override val day = { _: Int -> "天" }
override val year = { _: Int -> "年" }
}
@@ -17,13 +17,13 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.hippo.ehviewer.R
import com.hippo.ehviewer.client.parser.Archive import com.hippo.ehviewer.client.parser.Archive
import com.hippo.ehviewer.client.parser.Funds import com.hippo.ehviewer.client.parser.Funds
import com.hippo.ehviewer.ui.i18n.Translations
context(Translations)
@Composable @Composable
fun ArchiveList( fun ArchiveList(
funds: Funds, funds: Funds,
@@ -31,10 +31,6 @@ fun ArchiveList(
onItemClick: (Archive) -> Unit, onItemClick: (Archive) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val currentFunds = stringResource(R.string.current_funds)
val archiveFree = stringResource(R.string.archive_free)
val archiveOriginal = stringResource(R.string.archive_original)
val archiveResample = stringResource(R.string.archive_resample)
val fundsStyle = MaterialTheme.typography.labelLarge val fundsStyle = MaterialTheme.typography.labelLarge
val (hAtH, nonHAtH) = remember(items) { items.partition { it.isHAtH } } val (hAtH, nonHAtH) = remember(items) { items.partition { it.isHAtH } }
LazyVerticalGrid( LazyVerticalGrid(
@@ -32,7 +32,6 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import arrow.core.Either import arrow.core.Either
import arrow.core.Either.Companion.catch import arrow.core.Either.Companion.catch
@@ -47,6 +46,7 @@ import com.hippo.ehviewer.client.EhEngine
import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.EhUtils
import com.hippo.ehviewer.client.parser.HomeParser import com.hippo.ehviewer.client.parser.HomeParser
import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.collectAsState
import com.hippo.ehviewer.ui.i18n.Translations
import com.hippo.ehviewer.ui.login.refreshAccountInfo import com.hippo.ehviewer.ui.login.refreshAccountInfo
import com.hippo.ehviewer.ui.tools.DialogState import com.hippo.ehviewer.ui.tools.DialogState
import com.hippo.ehviewer.util.displayString import com.hippo.ehviewer.util.displayString
@@ -81,12 +81,11 @@ private val limitFlow: StateFlow<Result> = refreshEvent.conflate()
.let { src -> merge(src, invalidateEvent.map { none() }) } .let { src -> merge(src, invalidateEvent.map { none() }) }
.stateIn(limitScope, SharingStarted.Eagerly, none()) .stateIn(limitScope, SharingStarted.Eagerly, none())
context(CoroutineScope, DialogState, SnackbarHostState, DestinationsNavigator) context(CoroutineScope, DialogState, SnackbarHostState, DestinationsNavigator, Translations)
@Composable @Composable
fun AvatarIcon() { fun AvatarIcon() {
val hasSignedIn by Settings.hasSignedIn.collectAsState() val hasSignedIn by Settings.hasSignedIn.collectAsState()
if (hasSignedIn) { if (hasSignedIn) {
val placeholder = stringResource(id = R.string.please_wait)
val result by limitFlow.collectAsState() val result by limitFlow.collectAsState()
IconButton( IconButton(
onClick = { onClick = {
@@ -105,7 +104,7 @@ fun AvatarIcon() {
) { ) {
CircularProgressIndicator() CircularProgressIndicator()
Spacer(modifier = Modifier.size(dimensionResource(id = R.dimen.keyline_margin))) Spacer(modifier = Modifier.size(dimensionResource(id = R.dimen.keyline_margin)))
Text(text = placeholder) Text(text = pleaseWait)
} }
} }
result.onSome { current -> result.onSome { current ->
@@ -122,16 +121,16 @@ fun AvatarIcon() {
) )
} }
when (limits.maximum) { when (limits.maximum) {
-1 -> Text(text = stringResource(id = R.string.image_limits_restricted)) -1 -> Text(text = imageLimitsRestricted)
0 -> Text(text = stringResource(id = R.string.image_limits_normal)) 0 -> Text(text = imageLimitsNormal)
else -> Row(verticalAlignment = Alignment.CenterVertically) { else -> Row(verticalAlignment = Alignment.CenterVertically) {
Text(text = stringResource(id = R.string.image_limits_summary)) Text(text = imageLimitsSummary)
RollingNumber(number = limits.current) RollingNumber(number = limits.current)
Text(text = " / ") Text(text = " / ")
RollingNumberPlaceholder(number = limits.maximum) RollingNumberPlaceholder(number = limits.maximum)
} }
} }
Text(text = stringResource(id = R.string.current_funds)) Text(text = currentFunds)
Row( Row(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceAround, horizontalArrangement = Arrangement.SpaceAround,
@@ -160,9 +159,9 @@ fun AvatarIcon() {
) { ) {
Icon( Icon(
imageVector = Icons.Default.RestartAlt, imageVector = Icons.Default.RestartAlt,
contentDescription = stringResource(id = R.string.reset), contentDescription = reset,
) )
Text(text = stringResource(id = R.string.reset_cost, limits.resetCost)) Text(text = resetCost(limits.resetCost))
} }
} }
} }
@@ -200,7 +199,7 @@ fun AvatarIcon() {
awaitConfirmationOrCancel( awaitConfirmationOrCancel(
confirmText = R.string.sign_in, confirmText = R.string.sign_in,
showCancelButton = false, showCancelButton = false,
text = { Text(text = stringResource(id = R.string.settings_eh_identity_cookies_guest)) }, text = { Text(text = settingsEhIdentityCookiesGuest) },
) )
EhUtils.signOut() EhUtils.signOut()
} }
@@ -18,36 +18,32 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.hippo.ehviewer.R
import com.hippo.ehviewer.client.parser.Torrent import com.hippo.ehviewer.client.parser.Torrent
import com.hippo.ehviewer.client.parser.format import com.hippo.ehviewer.client.parser.format
import com.hippo.ehviewer.ui.i18n.Translations
context(Translations)
@Composable @Composable
fun TorrentList( fun TorrentList(
items: List<Torrent>, items: List<Torrent>,
onItemClick: (Torrent) -> Unit, onItemClick: (Torrent) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val title = stringResource(R.string.torrents)
Column( Column(
modifier = modifier.padding(vertical = 8.dp), modifier = modifier.padding(vertical = 8.dp),
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
) { ) {
Text(text = title, style = MaterialTheme.typography.headlineSmall) Text(text = torrents, style = MaterialTheme.typography.headlineSmall)
val labelStyle = MaterialTheme.typography.labelLarge val labelStyle = MaterialTheme.typography.labelLarge
LazyColumn( LazyColumn(
contentPadding = PaddingValues(vertical = 16.dp), contentPadding = PaddingValues(vertical = 16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp),
) { ) {
items(items) { items(items) {
Column( Column(modifier = Modifier.clickable { onItemClick(it) }.minimumInteractiveComponentSize().padding(horizontal = 8.dp)) {
modifier = Modifier.clickable { onItemClick(it) }.minimumInteractiveComponentSize()
.padding(horizontal = 8.dp),
) {
Text( Text(
text = it.name, text = it.name,
modifier = Modifier.basicMarquee( modifier = Modifier.basicMarquee(
@@ -46,7 +46,6 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import androidx.paging.Pager import androidx.paging.Pager
import androidx.paging.PagingConfig import androidx.paging.PagingConfig
@@ -99,8 +98,6 @@ import moe.tarsin.coroutines.runSwallowingWithUI
@Composable @Composable
fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) = composing(navigator) { fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) = composing(navigator) {
// Immutables // Immutables
val localFavName = stringResource(R.string.local_favorites)
val cloudFavName = stringResource(R.string.cloud_favorites)
val animateItems by Settings.animateItems.collectAsState() val animateItems by Settings.animateItems.collectAsState()
val hasSignedIn by Settings.hasSignedIn.collectAsState() val hasSignedIn by Settings.hasSignedIn.collectAsState()
@@ -115,18 +112,13 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) =
val favCatName = remember(urlBuilder) { val favCatName = remember(urlBuilder) {
when (val favCat = urlBuilder.favCat) { when (val favCat = urlBuilder.favCat) {
in 0..9 -> Settings.favCat[favCat] in 0..9 -> Settings.favCat[favCat]
FavListUrlBuilder.FAV_CAT_LOCAL -> localFavName.also { searchBarOffsetY = 0 } FavListUrlBuilder.FAV_CAT_LOCAL -> localFavorites.also { searchBarOffsetY = 0 }
else -> cloudFavName else -> cloudFavorites
} }
} }
val title = if (keyword.isNullOrBlank()) { val title = if (keyword.isNullOrBlank()) favoritesTitle(favCatName) else favoritesTitle2(favCatName, keyword)
stringResource(R.string.favorites_title, favCatName)
} else {
stringResource(R.string.favorites_title_2, favCatName, keyword)
}
val density = LocalDensity.current val density = LocalDensity.current
val localFavCountFlow = rememberInVM { EhDB.localFavCount } val localFavCountFlow = rememberInVM { EhDB.localFavCount }
val searchBarHint = stringResource(R.string.search_bar_hint, favCatName)
val data = rememberInVM(isLocalFav) { val data = rememberInVM(isLocalFav) {
if (isLocalFav) { if (isLocalFav) {
Pager(PagingConfig(20, jumpThreshold = 40)) { Pager(PagingConfig(20, jumpThreshold = 40)) {
@@ -186,7 +178,7 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) =
ProvideSideSheetContent { sheetState -> ProvideSideSheetContent { sheetState ->
val localFavCount by localFavCountFlow.collectAsState(0) val localFavCount by localFavCountFlow.collectAsState(0)
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.collections)) }, title = { Text(text = collections) },
windowInsets = EmptyWindowInsets, windowInsets = EmptyWindowInsets,
colors = topBarOnDrawerColor(), colors = topBarOnDrawerColor(),
) )
@@ -196,11 +188,11 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) =
scope.invalidate() scope.invalidate()
} }
} }
val localFav = stringResource(id = R.string.local_favorites) to localFavCount val localFav = localFavorites to localFavCount
val faves = if (hasSignedIn) { val faves = if (hasSignedIn) {
arrayOf( arrayOf(
localFav, localFav,
stringResource(id = R.string.cloud_favorites) to Settings.favCloudCount, cloudFavorites to Settings.favCloudCount,
*Settings.favCat.zip(Settings.favCount.toTypedArray()).toTypedArray(), *Settings.favCat.zip(Settings.favCount.toTypedArray()).toTypedArray(),
) )
} else { } else {
@@ -241,7 +233,7 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) =
if (it) checkedInfoMap.clear() if (it) checkedInfoMap.clear()
}, },
title = title, title = title,
searchFieldHint = searchBarHint, searchFieldHint = searchBarHint(favCatName),
tagNamespace = !isLocalFav, tagNamespace = !isLocalFav,
searchBarOffsetY = { searchBarOffsetY }, searchBarOffsetY = { searchBarOffsetY },
trailingIcon = { trailingIcon = {
@@ -390,7 +382,7 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) =
onClick(Icons.Default.Delete) { onClick(Icons.Default.Delete) {
val info = checkedInfoMap.takeAndClear() val info = checkedInfoMap.takeAndClear()
awaitConfirmationOrCancel(title = R.string.delete_favorites_dialog_title) { awaitConfirmationOrCancel(title = R.string.delete_favorites_dialog_title) {
Text(text = stringResource(R.string.delete_favorites_dialog_message, info.size)) Text(text = deleteFavoritesDialogMessage(info.size))
} }
val srcCat = urlBuilder.favCat val srcCat = urlBuilder.favCat
runSwallowingWithUI { runSwallowingWithUI {
@@ -407,7 +399,7 @@ fun AnimatedVisibilityScope.FavouritesScreen(navigator: DestinationsNavigator) =
onClick(Icons.AutoMirrored.Default.DriveFileMove) { onClick(Icons.AutoMirrored.Default.DriveFileMove) {
// First is local favorite, the other 10 is cloud favorite // First is local favorite, the other 10 is cloud favorite
val items = buildList { val items = buildList {
add(localFavName) add(localFavorites)
if (hasSignedIn) { if (hasSignedIn) {
addAll(Settings.favCat) addAll(Settings.favCat)
} }
@@ -103,6 +103,7 @@ import com.hippo.ehviewer.ui.MainActivity
import com.hippo.ehviewer.ui.confirmRemoveDownload import com.hippo.ehviewer.ui.confirmRemoveDownload
import com.hippo.ehviewer.ui.destinations.GalleryCommentsScreenDestination import com.hippo.ehviewer.ui.destinations.GalleryCommentsScreenDestination
import com.hippo.ehviewer.ui.getFavoriteIcon import com.hippo.ehviewer.ui.getFavoriteIcon
import com.hippo.ehviewer.ui.i18n.Translations
import com.hippo.ehviewer.ui.jumpToReaderByPage import com.hippo.ehviewer.ui.jumpToReaderByPage
import com.hippo.ehviewer.ui.main.ArchiveList import com.hippo.ehviewer.ui.main.ArchiveList
import com.hippo.ehviewer.ui.main.EhPreviewItem import com.hippo.ehviewer.ui.main.EhPreviewItem
@@ -153,7 +154,7 @@ import kotlinx.coroutines.launch
import moe.tarsin.coroutines.runSuspendCatching import moe.tarsin.coroutines.runSuspendCatching
import moe.tarsin.coroutines.runSwallowingWithUI import moe.tarsin.coroutines.runSwallowingWithUI
context(CoroutineScope, DestinationsNavigator, DialogState, MainActivity, SnackbarHostState, SharedTransitionScope, TransitionsVisibilityScope) context(CoroutineScope, DestinationsNavigator, DialogState, MainActivity, SnackbarHostState, SharedTransitionScope, TransitionsVisibilityScope, Translations)
@Composable @Composable
fun GalleryDetailContent( fun GalleryDetailContent(
galleryInfo: GalleryInfo, galleryInfo: GalleryInfo,
@@ -378,7 +379,7 @@ fun GalleryDetailContent(
} }
} }
context(Context, CoroutineScope, DestinationsNavigator, DialogState, SnackbarHostState) context(Context, CoroutineScope, DestinationsNavigator, DialogState, SnackbarHostState, Translations)
@Composable @Composable
fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) { fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
@Composable @Composable
@@ -400,9 +401,9 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
fun GalleryDetailComment(commentsList: List<GalleryComment>) { fun GalleryDetailComment(commentsList: List<GalleryComment>) {
val maxShowCount = 2 val maxShowCount = 2
val commentText = when { val commentText = when {
commentsList.isEmpty() -> stringResource(R.string.no_comments) commentsList.isEmpty() -> noComments
commentsList.size <= maxShowCount -> stringResource(R.string.no_more_comments) commentsList.size <= maxShowCount -> noMoreComments
else -> stringResource(R.string.more_comment) else -> moreComment
} }
fun navigateToCommentScreen() { fun navigateToCommentScreen() {
navigate(GalleryCommentsScreenDestination(galleryDetail.gid)) navigate(GalleryCommentsScreenDestination(galleryDetail.gid))
@@ -439,7 +440,7 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
} }
suspend fun showNewerVersionDialog() { suspend fun showNewerVersionDialog() {
val items = galleryDetail.newerVersions.map { val items = galleryDetail.newerVersions.map {
getString(R.string.newer_version_title, it.title, it.posted) newerVersionTitle(it.title.orEmpty(), it.posted.orEmpty())
} }
val selected = awaitSelectItem(items) val selected = awaitSelectItem(items)
val info = galleryDetail.newerVersions[selected] val info = galleryDetail.newerVersions[selected]
@@ -457,7 +458,7 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
modifier = Modifier.fillMaxWidth().height(32.dp), modifier = Modifier.fillMaxWidth().height(32.dp),
) { ) {
} }
Text(text = stringResource(id = R.string.newer_version_available)) Text(text = newerVersionAvailable)
} }
Spacer(modifier = Modifier.size(keylineMargin)) Spacer(modifier = Modifier.size(keylineMargin))
} }
@@ -467,16 +468,12 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
) { ) {
val favSlot by FavouriteStatusRouter.collectAsState(galleryDetail) { it } val favSlot by FavouriteStatusRouter.collectAsState(galleryDetail) { it }
val favButtonText = if (favSlot != NOT_FAVORITED) { val favButtonText = if (favSlot != NOT_FAVORITED) {
galleryDetail.favoriteName ?: stringResource(id = R.string.local_favorites) galleryDetail.favoriteName ?: localFavorites
} else { } else {
stringResource(id = R.string.not_favorited) notFavorited
} }
val favoritesLock = remember { MutatorMutex() } val favoritesLock = remember { MutatorMutex() }
Column(horizontalAlignment = Alignment.CenterHorizontally) { Column(horizontalAlignment = Alignment.CenterHorizontally) {
val removeSucceed = stringResource(R.string.remove_from_favorite_success)
val addSucceed = stringResource(R.string.add_to_favorite_success)
// val removeFailed = stringResource(R.string.remove_from_favorite_failure)
val addFailed = stringResource(R.string.add_to_favorite_failure)
FilledTertiaryIconToggleButton( FilledTertiaryIconToggleButton(
checked = favSlot != NOT_FAVORITED, checked = favSlot != NOT_FAVORITED,
onCheckedChange = { onCheckedChange = {
@@ -486,13 +483,13 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
modifyFavorites(galleryDetail.galleryInfo) modifyFavorites(galleryDetail.galleryInfo)
}.onSuccess { add -> }.onSuccess { add ->
if (add) { if (add) {
showSnackbar(addSucceed) showSnackbar(addToFavoriteSuccess)
} else { } else {
showSnackbar(removeSucceed) showSnackbar(removeFromFavoriteSuccess)
} }
}.onFailure { }.onFailure {
// TODO: We don't know if it's add or remove // TODO: We don't know if it's add or remove
showSnackbar(addFailed) showSnackbar(addToFavoriteFailure)
} }
} }
} }
@@ -507,7 +504,7 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
} }
EhIconButton( EhIconButton(
icon = Icons.Default.Search, icon = Icons.Default.Search,
text = stringResource(id = R.string.similar_gallery), text = similarGallery,
onClick = { onClick = {
val keyword = EhUtils.extractTitle(galleryDetail.title) val keyword = EhUtils.extractTitle(galleryDetail.title)
val artistTag = galleryDetail.tagGroups.artistTag() val artistTag = galleryDetail.tagGroups.artistTag()
@@ -535,11 +532,6 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
} }
}, },
) )
val signInFirst = stringResource(R.string.sign_in_first)
val noArchive = stringResource(R.string.no_archives)
val downloadStarted = stringResource(R.string.download_archive_started)
val downloadFailed = stringResource(R.string.download_archive_failure)
val failureNoHath = stringResource(R.string.download_archive_failure_no_hath)
val archiveResult = remember(galleryDetail) { val archiveResult = remember(galleryDetail) {
async(Dispatchers.IO + Job(), CoroutineStart.LAZY) { async(Dispatchers.IO + Job(), CoroutineStart.LAZY) {
with(galleryDetail) { with(galleryDetail) {
@@ -555,7 +547,7 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
runSuspendCatching { runSuspendCatching {
val (archiveList, funds) = bgWork { archiveResult.await() } val (archiveList, funds) = bgWork { archiveResult.await() }
if (archiveList.isEmpty()) { if (archiveList.isEmpty()) {
showSnackbar(noArchive) showSnackbar(noArchives)
} else { } else {
val selected = showNoButton { val selected = showNoButton {
ArchiveList( ArchiveList(
@@ -565,15 +557,15 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
) )
} }
EhUtils.downloadArchive(galleryDetail, selected) EhUtils.downloadArchive(galleryDetail, selected)
showSnackbar(downloadStarted) showSnackbar(downloadArchiveStarted)
} }
}.onFailure { }.onFailure {
when (it) { when (it) {
is NoHAtHClientException -> showSnackbar(failureNoHath) is NoHAtHClientException -> showSnackbar(downloadArchiveFailureNoHath)
is EhException -> showSnackbar(it.displayString()) is EhException -> showSnackbar(it.displayString())
else -> { else -> {
logcat(it) logcat(it)
showSnackbar(downloadFailed) showSnackbar(downloadArchiveFailure)
} }
} }
} }
@@ -582,11 +574,9 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
} }
EhIconButton( EhIconButton(
icon = Icons.Default.FolderZip, icon = Icons.Default.FolderZip,
text = stringResource(id = R.string.archive), text = archive,
onClick = ::showArchiveDialog, onClick = ::showArchiveDialog,
) )
val torrentText = stringResource(R.string.torrent_count, galleryDetail.torrentCount)
val noTorrents = stringResource(R.string.no_torrents)
val torrentResult = remember(galleryDetail) { val torrentResult = remember(galleryDetail) {
async(Dispatchers.IO + Job(), CoroutineStart.LAZY) { async(Dispatchers.IO + Job(), CoroutineStart.LAZY) {
parZip( parZip(
@@ -621,7 +611,7 @@ fun BelowHeader(galleryDetail: GalleryDetail, voteTag: VoteTag) {
} }
EhIconButton( EhIconButton(
icon = EhIcons.Default.Magnet, icon = EhIcons.Default.Magnet,
text = torrentText, text = torrentCount(galleryDetail.torrentCount),
onClick = { onClick = {
launchIO { launchIO {
when { when {
@@ -153,7 +153,6 @@ fun AnimatedVisibilityScope.GalleryDetailScreen(args: GalleryDetailScreenArgs, n
} }
} }
val signInFirst = stringResource(R.string.sign_in_first)
Scaffold( Scaffold(
topBar = { topBar = {
LargeTopAppBar( LargeTopAppBar(
@@ -200,7 +199,7 @@ fun AnimatedVisibilityScope.GalleryDetailScreen(args: GalleryDetailScreenArgs, n
onDismissRequest = { dropdown = false }, onDismissRequest = { dropdown = false },
) { ) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_add_tag)) }, text = { Text(text = actionAddTag) },
onClick = { onClick = {
dropdown = false dropdown = false
val detail = galleryInfo as? GalleryDetail ?: return@DropdownMenuItem val detail = galleryInfo as? GalleryDetail ?: return@DropdownMenuItem
@@ -218,7 +217,7 @@ fun AnimatedVisibilityScope.GalleryDetailScreen(args: GalleryDetailScreenArgs, n
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.refresh)) }, text = { Text(text = refresh) },
onClick = { onClick = {
dropdown = false dropdown = false
// Invalidate cache // Invalidate cache
@@ -229,9 +228,8 @@ fun AnimatedVisibilityScope.GalleryDetailScreen(args: GalleryDetailScreenArgs, n
getDetailError = "" getDetailError = ""
}, },
) )
val imageCacheClear = stringResource(R.string.image_cache_cleared)
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.clear_image_cache)) }, text = { Text(text = clearImageCache) },
onClick = { onClick = {
dropdown = false dropdown = false
val gd = galleryInfo as? GalleryDetail ?: return@DropdownMenuItem val gd = galleryInfo as? GalleryDetail ?: return@DropdownMenuItem
@@ -240,27 +238,25 @@ fun AnimatedVisibilityScope.GalleryDetailScreen(args: GalleryDetailScreenArgs, n
confirmText = R.string.clear_all, confirmText = R.string.clear_all,
title = R.string.clear_image_cache, title = R.string.clear_image_cache,
) { ) {
Text(text = stringResource(id = R.string.clear_image_cache_confirm)) Text(text = clearImageCacheConfirm)
} }
(0..<gd.pages).forEach { (0..<gd.pages).forEach {
val key = getImageKey(gd.gid, it) val key = getImageKey(gd.gid, it)
imageCache.remove(key) imageCache.remove(key)
} }
showSnackbar(imageCacheClear) showSnackbar(imageCacheCleared)
} }
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.open_in_other_app)) }, text = { Text(text = openInOtherApp) },
onClick = { onClick = {
dropdown = false dropdown = false
openBrowser(galleryDetailUrl) openBrowser(galleryDetailUrl)
}, },
) )
val exportSuccess = stringResource(id = R.string.export_as_archive_success)
val exportFailed = stringResource(id = R.string.export_as_archive_failed)
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.export_as_archive)) }, text = { Text(text = exportAsArchive) },
onClick = { onClick = {
dropdown = false dropdown = false
launchIO { launchIO {
@@ -269,7 +265,7 @@ fun AnimatedVisibilityScope.GalleryDetailScreen(args: GalleryDetailScreenArgs, n
if (!canExport) { if (!canExport) {
awaitConfirmationOrCancel( awaitConfirmationOrCancel(
showCancelButton = false, showCancelButton = false,
text = { Text(text = stringResource(id = R.string.download_gallery_first)) }, text = { Text(text = downloadGalleryFirst) },
) )
} else { } else {
val info = galleryInfo!! val info = galleryInfo!!
@@ -286,11 +282,11 @@ fun AnimatedVisibilityScope.GalleryDetailScreen(args: GalleryDetailScreenArgs, n
SpiderDen(info, dirname).exportAsCbz(file) SpiderDen(info, dirname).exportAsCbz(file)
} }
} }
exportSuccess exportAsArchiveSuccess
}.getOrElse { }.getOrElse {
logcat(it) logcat(it)
file.delete() file.delete()
exportFailed exportAsArchiveFailed
} }
showSnackbar(message = msg) showSnackbar(message = msg)
} }
@@ -33,7 +33,6 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import androidx.paging.Pager import androidx.paging.Pager
@@ -70,8 +69,6 @@ import kotlinx.coroutines.launch
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun AnimatedVisibilityScope.HistoryScreen(navigator: DestinationsNavigator) = composing(navigator) { fun AnimatedVisibilityScope.HistoryScreen(navigator: DestinationsNavigator) = composing(navigator) {
val title = stringResource(id = R.string.history)
val hint = stringResource(R.string.search_bar_hint, title)
val animateItems by Settings.animateItems.collectAsState() val animateItems by Settings.animateItems.collectAsState()
var searchBarExpanded by rememberSaveable { mutableStateOf(false) } var searchBarExpanded by rememberSaveable { mutableStateOf(false) }
@@ -103,15 +100,15 @@ fun AnimatedVisibilityScope.HistoryScreen(navigator: DestinationsNavigator) = co
}, },
expanded = searchBarExpanded, expanded = searchBarExpanded,
onExpandedChange = { searchBarExpanded = it }, onExpandedChange = { searchBarExpanded = it },
title = title, title = history,
searchFieldHint = hint, searchFieldHint = searchBarHint(history),
searchBarOffsetY = { searchBarOffsetY }, searchBarOffsetY = { searchBarOffsetY },
trailingIcon = { trailingIcon = {
IconButton(onClick = { IconButton(onClick = {
launch { launch {
awaitConfirmationOrCancel( awaitConfirmationOrCancel(
confirmText = R.string.clear_all, confirmText = R.string.clear_all,
text = { Text(text = stringResource(id = R.string.clear_all_history)) }, text = { Text(text = clearAllHistory) },
) )
EhDB.clearHistoryInfo() EhDB.clearHistoryInfo()
} }
@@ -185,13 +182,8 @@ fun AnimatedVisibilityScope.HistoryScreen(navigator: DestinationsNavigator) = co
modifier = Modifier.padding(16.dp), modifier = Modifier.padding(16.dp),
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,
) )
val emptyHint = if (keyword.isEmpty()) {
stringResource(id = R.string.no_history)
} else {
stringResource(id = R.string.gallery_list_empty_hit)
}
Text( Text(
text = emptyHint, text = if (keyword.isEmpty()) noHistory else galleryListEmptyHit,
style = MaterialTheme.typography.headlineMedium, style = MaterialTheme.typography.headlineMedium,
) )
} }
@@ -25,7 +25,6 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import com.hippo.ehviewer.R import com.hippo.ehviewer.R
import com.hippo.ehviewer.client.data.ListUrlBuilder import com.hippo.ehviewer.client.data.ListUrlBuilder
@@ -47,7 +46,6 @@ import kotlinx.coroutines.launch
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun AnimatedVisibilityScope.ImageSearchScreen(navigator: DestinationsNavigator) = composing(navigator) { fun AnimatedVisibilityScope.ImageSearchScreen(navigator: DestinationsNavigator) = composing(navigator) {
val selectImageFirst = stringResource(R.string.select_image_first)
val marginH = dimensionResource(id = R.dimen.gallery_list_margin_h) val marginH = dimensionResource(id = R.dimen.gallery_list_margin_h)
val marginV = dimensionResource(id = R.dimen.gallery_list_margin_v) val marginV = dimensionResource(id = R.dimen.gallery_list_margin_v)
var imageUri by rememberSaveable { mutableStateOf<Uri?>(null) } var imageUri by rememberSaveable { mutableStateOf<Uri?>(null) }
@@ -55,7 +53,7 @@ fun AnimatedVisibilityScope.ImageSearchScreen(navigator: DestinationsNavigator)
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.image_search)) }, title = { Text(text = imageSearch) },
) )
}, },
floatingActionButton = { floatingActionButton = {
@@ -96,7 +94,7 @@ fun AnimatedVisibilityScope.ImageSearchScreen(navigator: DestinationsNavigator)
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
) { ) {
Text( Text(
text = stringResource(id = R.string.search_image), text = searchImage,
modifier = Modifier.height(dimensionResource(id = R.dimen.search_category_title_height)), modifier = Modifier.height(dimensionResource(id = R.dimen.search_category_title_height)),
fontWeight = FontWeight.Bold, fontWeight = FontWeight.Bold,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
@@ -1,5 +1,6 @@
package com.hippo.ehviewer.ui.screen package com.hippo.ehviewer.ui.screen
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@@ -18,12 +19,11 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.hippo.ehviewer.R
import com.hippo.ehviewer.client.EhEngine import com.hippo.ehviewer.client.EhEngine
import com.hippo.ehviewer.icons.EhIcons import com.hippo.ehviewer.icons.EhIcons
import com.hippo.ehviewer.icons.big.SadAndroid import com.hippo.ehviewer.icons.big.SadAndroid
import com.hippo.ehviewer.ui.composing
import com.hippo.ehviewer.util.displayString import com.hippo.ehviewer.util.displayString
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.annotation.RootGraph
@@ -33,13 +33,12 @@ import moe.tarsin.coroutines.runSuspendCatching
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun ProgressScreen(gid: Long, token: String, page: Int, navigator: DestinationsNavigator) { fun AnimatedVisibilityScope.ProgressScreen(gid: Long, token: String, page: Int, navigator: DestinationsNavigator) = composing(navigator) {
val wrong = stringResource(id = R.string.error_something_wrong_happened)
var error by rememberSaveable { mutableStateOf("") } var error by rememberSaveable { mutableStateOf("") }
LaunchedEffect(error) { LaunchedEffect(error) {
if (error.isEmpty()) { if (error.isEmpty()) {
if (gid == -1L || token == "invalid" || page == -1) { if (gid == -1L || token == "invalid" || page == -1) {
error = wrong error = errorSomethingWrongHappened
} else { } else {
runSuspendCatching { runSuspendCatching {
EhEngine.getGalleryToken(gid, token, page) EhEngine.getGalleryToken(gid, token, page)
@@ -71,7 +70,7 @@ fun ProgressScreen(gid: Long, token: String, page: Int, navigator: DestinationsN
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,
) )
Text( Text(
text = wrong, text = error,
style = MaterialTheme.typography.headlineMedium, style = MaterialTheme.typography.headlineMedium,
) )
} }
@@ -1,6 +1,7 @@
package com.hippo.ehviewer.ui.settings package com.hippo.ehviewer.ui.settings
import android.content.Context import android.content.Context
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
@@ -19,21 +20,18 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.fromHtml
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.hippo.ehviewer.BuildConfig import com.hippo.ehviewer.BuildConfig
import com.hippo.ehviewer.EhDB import com.hippo.ehviewer.EhDB
import com.hippo.ehviewer.R import com.hippo.ehviewer.R
import com.hippo.ehviewer.Settings import com.hippo.ehviewer.Settings
import com.hippo.ehviewer.download.downloadLocation import com.hippo.ehviewer.download.downloadLocation
import com.hippo.ehviewer.ui.composing
import com.hippo.ehviewer.ui.destinations.LicenseScreenDestination import com.hippo.ehviewer.ui.destinations.LicenseScreenDestination
import com.hippo.ehviewer.ui.tools.DialogState import com.hippo.ehviewer.ui.tools.DialogState
import com.hippo.ehviewer.ui.tools.LocalDialogState import com.hippo.ehviewer.ui.tools.LocalDialogState
@@ -56,17 +54,9 @@ import moe.tarsin.coroutines.runSuspendCatching
private const val REPO_URL = "https://github.com/${BuildConfig.REPO_NAME}" private const val REPO_URL = "https://github.com/${BuildConfig.REPO_NAME}"
private const val RELEASE_URL = "$REPO_URL/releases" private const val RELEASE_URL = "$REPO_URL/releases"
@Composable
@Stable
private fun versionCode() = "${BuildConfig.VERSION_NAME} (${BuildConfig.COMMIT_SHA})\n" + stringResource(R.string.settings_about_commit_time, AppConfig.commitTime)
@Composable
@Stable
private fun author() = AnnotatedString.fromHtml(stringResource(R.string.settings_about_author_summary).replace('$', '@'))
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun AboutScreen(navigator: DestinationsNavigator) { fun AnimatedVisibilityScope.AboutScreen(navigator: DestinationsNavigator) = composing(navigator) {
val context = LocalContext.current val context = LocalContext.current
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
@@ -76,7 +66,7 @@ fun AboutScreen(navigator: DestinationsNavigator) {
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.settings_about)) }, title = { Text(text = settingsAbout) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { navigator.popBackStack() }) { IconButton(onClick = { navigator.popBackStack() }) {
Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null)
@@ -89,49 +79,49 @@ fun AboutScreen(navigator: DestinationsNavigator) {
) { paddingValues -> ) { paddingValues ->
Column(modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection).verticalScroll(rememberScrollState()).padding(paddingValues)) { Column(modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection).verticalScroll(rememberScrollState()).padding(paddingValues)) {
Preference( Preference(
title = stringResource(id = R.string.settings_about_declaration), title = settingsAboutDeclaration,
summary = stringResource(id = R.string.settings_about_declaration_summary), summary = settingsAboutDeclarationSummary,
) )
HtmlPreference( HtmlPreference(
title = stringResource(id = R.string.settings_about_author), title = settingsAboutAuthor,
summary = author(), summary = settingsAboutAuthorSummary,
) )
UrlPreference( UrlPreference(
title = stringResource(id = R.string.settings_about_latest_release), title = settingsAboutLatestRelease,
url = RELEASE_URL, url = RELEASE_URL,
) )
UrlPreference( UrlPreference(
title = stringResource(id = R.string.settings_about_source), title = settingsAboutSource,
url = REPO_URL, url = REPO_URL,
) )
Preference(title = stringResource(id = R.string.license)) { Preference(title = license) {
navigator.navigate(LicenseScreenDestination) navigator.navigate(LicenseScreenDestination)
} }
Preference( Preference(
title = stringResource(id = R.string.settings_about_version), title = settingsAboutVersion,
summary = versionCode(), summary = "${BuildConfig.VERSION_NAME} (${BuildConfig.COMMIT_SHA})\n" + settingsAboutCommitTime(AppConfig.commitTime),
) )
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.backup_before_update), title = backupBeforeUpdate,
value = Settings::backupBeforeUpdate, value = Settings::backupBeforeUpdate,
) )
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.use_ci_update_channel), title = useCiUpdateChannel,
value = Settings::useCIUpdateChannel, value = Settings::useCIUpdateChannel,
) )
SimpleMenuPreferenceInt( SimpleMenuPreferenceInt(
title = stringResource(id = R.string.auto_updates), title = autoUpdates,
entry = R.array.update_frequency, entry = R.array.update_frequency,
entryValueRes = R.array.update_frequency_values, entryValueRes = R.array.update_frequency_values,
value = Settings::updateIntervalDays.observed, value = Settings::updateIntervalDays.observed,
) )
WorkPreference(title = stringResource(id = R.string.settings_about_check_for_updates)) { WorkPreference(title = settingsAboutCheckForUpdates) {
runSuspendCatching { runSuspendCatching {
AppUpdater.checkForUpdate(true)?.let { AppUpdater.checkForUpdate(true)?.let {
dialogState.showNewVersion(context, it) dialogState.showNewVersion(context, it)
} ?: launchSnackBar(context.getString(R.string.already_latest_version)) } ?: launchSnackBar(alreadyLatestVersion)
}.onFailure { }.onFailure {
launchSnackBar(context.getString(R.string.update_failed, it.displayString())) launchSnackBar(updateFailed(it.displayString()))
} }
} }
} }
@@ -86,9 +86,9 @@ fun AnimatedVisibilityScope.DownloadScreen(navigator: DestinationsNavigator) = c
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.settings_download)) }, title = { Text(text = settingsDownload) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { navigator.popBackStack() }) { IconButton(onClick = { popBackStack() }) {
Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null)
} }
}, },
@@ -98,7 +98,6 @@ fun AnimatedVisibilityScope.DownloadScreen(navigator: DestinationsNavigator) = c
) { paddingValues -> ) { paddingValues ->
Column(modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection).verticalScroll(rememberScrollState()).padding(paddingValues)) { Column(modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection).verticalScroll(rememberScrollState()).padding(paddingValues)) {
var downloadLocationState by ::downloadLocation.observed var downloadLocationState by ::downloadLocation.observed
val cannotGetDownloadLocation = stringResource(id = R.string.settings_download_cant_get_download_location)
val selectDownloadDirLauncher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocumentTree()) { treeUri -> val selectDownloadDirLauncher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocumentTree()) { treeUri ->
treeUri?.run { treeUri?.run {
launchIO { launchIO {
@@ -110,7 +109,7 @@ fun AnimatedVisibilityScope.DownloadScreen(navigator: DestinationsNavigator) = c
downloadLocationState = path downloadLocationState = path
}.onFailure { }.onFailure {
logcat(it) logcat(it)
launchSnackBar(cannotGetDownloadLocation) launchSnackBar(settingsDownloadCantGetDownloadLocation)
} }
} }
} }
@@ -154,28 +153,28 @@ fun AnimatedVisibilityScope.DownloadScreen(navigator: DestinationsNavigator) = c
logcat(it) logcat(it)
} }
} }
launchSnackBar(cannotGetDownloadLocation) launchSnackBar(settingsDownloadCantGetDownloadLocation)
} }
} }
} }
val mediaScan = Settings::mediaScan.observed val mediaScan = Settings::mediaScan.observed
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_download_media_scan), title = settingsDownloadMediaScan,
summary = if (mediaScan.value) stringResource(id = R.string.settings_download_media_scan_summary_on) else stringResource(id = R.string.settings_download_media_scan_summary_off), summary = if (mediaScan.value) settingsDownloadMediaScanSummaryOn else settingsDownloadMediaScanSummaryOff,
value = mediaScan.rememberedAccessor, value = mediaScan.rememberedAccessor,
) )
val multiThreadDownload = Settings::multiThreadDownload.observed val multiThreadDownload = Settings::multiThreadDownload.observed
SimpleMenuPreferenceInt( SimpleMenuPreferenceInt(
title = stringResource(id = R.string.settings_download_concurrency), title = settingsDownloadConcurrency,
summary = stringResource(id = R.string.settings_download_concurrency_summary, multiThreadDownload.value), summary = settingsDownloadConcurrencySummary(multiThreadDownload.value),
entry = R.array.multi_thread_download_entries, entry = R.array.multi_thread_download_entries,
entryValueRes = R.array.multi_thread_download_entry_values, entryValueRes = R.array.multi_thread_download_entry_values,
value = multiThreadDownload, value = multiThreadDownload,
) )
val downloadDelay = Settings::downloadDelay.observed val downloadDelay = Settings::downloadDelay.observed
SimpleMenuPreferenceInt( SimpleMenuPreferenceInt(
title = stringResource(id = R.string.settings_download_download_delay), title = settingsDownloadDownloadDelay,
summary = stringResource(id = R.string.settings_download_download_delay_summary, downloadDelay.value), summary = settingsDownloadDownloadDelaySummary(downloadDelay.value),
entry = R.array.download_delay_entries, entry = R.array.download_delay_entries,
entryValueRes = R.array.download_delay_entry_values, entryValueRes = R.array.download_delay_entry_values,
value = downloadDelay, value = downloadDelay,
@@ -184,13 +183,13 @@ fun AnimatedVisibilityScope.DownloadScreen(navigator: DestinationsNavigator) = c
maxValue = 120, maxValue = 120,
minValue = 10, minValue = 10,
step = 10, step = 10,
title = stringResource(id = R.string.settings_download_download_timeout), title = settingsDownloadDownloadTimeout,
value = Settings::downloadTimeout, value = Settings::downloadTimeout,
) )
val preloadImage = Settings::preloadImage.observed val preloadImage = Settings::preloadImage.observed
SimpleMenuPreferenceInt( SimpleMenuPreferenceInt(
title = stringResource(id = R.string.settings_download_preload_image), title = settingsDownloadPreloadImage,
summary = stringResource(id = R.string.settings_download_preload_image_summary, preloadImage.value), summary = settingsDownloadPreloadImageSummary(preloadImage.value),
entry = R.array.preload_image_entries, entry = R.array.preload_image_entries,
entryValueRes = R.array.preload_image_entry_values, entryValueRes = R.array.preload_image_entry_values,
value = preloadImage, value = preloadImage,
@@ -1,6 +1,8 @@
package com.hippo.ehviewer.ui.settings package com.hippo.ehviewer.ui.settings
import android.content.Context
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@@ -27,7 +29,6 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
@@ -40,10 +41,11 @@ import com.hippo.ehviewer.client.EhTagDatabase
import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUrl
import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.EhUtils
import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.collectAsState
import com.hippo.ehviewer.ui.composing
import com.hippo.ehviewer.ui.destinations.FilterScreenDestination import com.hippo.ehviewer.ui.destinations.FilterScreenDestination
import com.hippo.ehviewer.ui.destinations.MyTagsScreenDestination import com.hippo.ehviewer.ui.destinations.MyTagsScreenDestination
import com.hippo.ehviewer.ui.destinations.UConfigScreenDestination import com.hippo.ehviewer.ui.destinations.UConfigScreenDestination
import com.hippo.ehviewer.ui.tools.LocalDialogState import com.hippo.ehviewer.ui.screen.implicit
import com.hippo.ehviewer.ui.tools.observed import com.hippo.ehviewer.ui.tools.observed
import com.hippo.ehviewer.ui.tools.rememberedAccessor import com.hippo.ehviewer.ui.tools.rememberedAccessor
import com.hippo.ehviewer.util.copyTextToClipboard import com.hippo.ehviewer.util.copyTextToClipboard
@@ -58,20 +60,18 @@ import kotlinx.datetime.LocalTime
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun EhScreen(navigator: DestinationsNavigator) { fun AnimatedVisibilityScope.EhScreen(navigator: DestinationsNavigator) = composing(navigator) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
val coroutineScope = rememberCoroutineScope { Dispatchers.IO } val coroutineScope = rememberCoroutineScope { Dispatchers.IO }
val context = LocalContext.current
fun launchSnackBar(content: String) = coroutineScope.launch { snackbarHostState.showSnackbar(content) } fun launchSnackBar(content: String) = coroutineScope.launch { snackbarHostState.showSnackbar(content) }
val hasSignedIn by Settings.hasSignedIn.collectAsState() val hasSignedIn by Settings.hasSignedIn.collectAsState()
val dialogState = LocalDialogState.current
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.settings_eh)) }, title = { Text(text = settingsEh) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { navigator.popBackStack() }) { IconButton(onClick = { popBackStack() }) {
Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null)
} }
}, },
@@ -80,7 +80,6 @@ fun EhScreen(navigator: DestinationsNavigator) {
}, },
snackbarHost = { SnackbarHost(snackbarHostState) }, snackbarHost = { SnackbarHost(snackbarHostState) },
) { paddingValues -> ) { paddingValues ->
val copiedToClipboard = stringResource(id = R.string.copied_to_clipboard)
Column( Column(
modifier = Modifier modifier = Modifier
.nestedScroll(scrollBehavior.nestedScrollConnection) .nestedScroll(scrollBehavior.nestedScrollConnection)
@@ -90,12 +89,12 @@ fun EhScreen(navigator: DestinationsNavigator) {
if (hasSignedIn) { if (hasSignedIn) {
val displayName by Settings.displayName.collectAsState() val displayName by Settings.displayName.collectAsState()
Preference( Preference(
title = stringResource(id = R.string.account_name), title = accountName,
summary = displayName, summary = displayName,
) { ) {
coroutineScope.launch { coroutineScope.launch {
val cookies = EhCookieStore.getIdentityCookies() val cookies = EhCookieStore.getIdentityCookies()
dialogState.awaitConfirmationOrCancel( awaitConfirmationOrCancel(
confirmText = R.string.settings_eh_sign_out, confirmText = R.string.settings_eh_sign_out,
dismissText = R.string.settings_eh_clear_igneous, dismissText = R.string.settings_eh_clear_igneous,
showCancelButton = cookies.last().second != null, showCancelButton = cookies.last().second != null,
@@ -127,7 +126,7 @@ fun EhScreen(navigator: DestinationsNavigator) {
} }
val gallerySite = Settings.gallerySite.asMutableState() val gallerySite = Settings.gallerySite.asMutableState()
SimpleMenuPreferenceInt( SimpleMenuPreferenceInt(
title = stringResource(id = R.string.settings_eh_gallery_site), title = settingsEhGallerySite,
entry = R.array.gallery_site_entries, entry = R.array.gallery_site_entries,
entryValueRes = R.array.gallery_site_entry_values, entryValueRes = R.array.gallery_site_entry_values,
value = gallerySite, value = gallerySite,
@@ -137,40 +136,38 @@ fun EhScreen(navigator: DestinationsNavigator) {
SwitchPref( SwitchPref(
checked = forceEhThumb, checked = forceEhThumb,
onMutate = { forceEhThumb = !forceEhThumb }, onMutate = { forceEhThumb = !forceEhThumb },
title = stringResource(id = R.string.settings_eh_force_eh_thumb), title = settingsEhForceEhThumb,
summary = stringResource(id = R.string.settings_eh_force_eh_thumb_summary), summary = settingsEhForceEhThumbSummary,
) )
} }
Preference( Preference(
title = stringResource(id = R.string.settings_u_config), title = settingsUConfig,
summary = stringResource(id = R.string.settings_u_config_summary), summary = settingsUConfigSummary,
) { navigator.navigate(UConfigScreenDestination) } ) { navigator.navigate(UConfigScreenDestination) }
Preference( Preference(
title = stringResource(id = R.string.settings_my_tags), title = settingsMyTags,
summary = stringResource(id = R.string.settings_my_tags_summary), summary = settingsMyTagsSummary,
) { navigator.navigate(MyTagsScreenDestination) } ) { navigator.navigate(MyTagsScreenDestination) }
} }
var defaultFavSlot by Settings::defaultFavSlot.observed var defaultFavSlot by Settings::defaultFavSlot.observed
val disabled = stringResource(id = R.string.disabled_nav)
val localFav = stringResource(id = R.string.local_favorites)
val summary = when (defaultFavSlot) { val summary = when (defaultFavSlot) {
-1 -> localFav -1 -> localFavorites
in 0..9 -> Settings.favCat[defaultFavSlot] in 0..9 -> Settings.favCat[defaultFavSlot]
else -> stringResource(id = R.string.default_favorites_warning) else -> defaultFavoritesWarning
} }
Preference( Preference(
title = stringResource(id = R.string.default_favorites_collection), title = defaultFavoritesCollection,
summary = summary, summary = summary,
) { ) {
coroutineScope.launch { coroutineScope.launch {
val items = buildList { val items = buildList {
add(disabled) add(disabledNav)
add(localFav) add(localFavorites)
if (hasSignedIn) { if (hasSignedIn) {
addAll(Settings.favCat) addAll(Settings.favCat)
} }
} }
defaultFavSlot = dialogState.awaitSelectItem( defaultFavSlot = awaitSelectItem(
items = items, items = items,
title = R.string.default_favorites_collection, title = R.string.default_favorites_collection,
selected = defaultFavSlot + 2, selected = defaultFavSlot + 2,
@@ -178,28 +175,28 @@ fun EhScreen(navigator: DestinationsNavigator) {
} }
} }
SimpleMenuPreferenceInt( SimpleMenuPreferenceInt(
title = stringResource(id = R.string.dark_theme), title = darkTheme,
entry = R.array.night_mode_entries, entry = R.array.night_mode_entries,
entryValueRes = R.array.night_mode_values, entryValueRes = R.array.night_mode_values,
value = Settings::theme.observed, value = Settings::theme.observed,
) )
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.black_dark_theme), title = blackDarkTheme,
value = Settings.blackDarkTheme::value, value = Settings.blackDarkTheme::value,
) )
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.harmonize_category_color), title = harmonizeCategoryColor,
value = Settings::harmonizeCategoryColor, value = Settings::harmonizeCategoryColor,
) )
SimpleMenuPreferenceInt( SimpleMenuPreferenceInt(
title = stringResource(id = R.string.settings_eh_launch_page), title = settingsEhLaunchPage,
entry = R.array.launch_page_entries, entry = R.array.launch_page_entries,
entryValueRes = R.array.launch_page_entry_values, entryValueRes = R.array.launch_page_entry_values,
value = Settings::launchPage.observed, value = Settings::launchPage.observed,
) )
val listMode = Settings.listMode.asMutableState() val listMode = Settings.listMode.asMutableState()
SimpleMenuPreferenceInt( SimpleMenuPreferenceInt(
title = stringResource(id = R.string.settings_eh_list_mode), title = settingsEhListMode,
entry = R.array.list_mode_entries, entry = R.array.list_mode_entries,
entryValueRes = R.array.list_mode_entry_values, entryValueRes = R.array.list_mode_entry_values,
value = listMode, value = listMode,
@@ -210,11 +207,11 @@ fun EhScreen(navigator: DestinationsNavigator) {
maxValue = 60, maxValue = 60,
minValue = 20, minValue = 20,
step = 7, step = 7,
title = stringResource(id = R.string.list_tile_thumb_size), title = listTileThumbSize,
value = Settings.listThumbSize::value, value = Settings.listThumbSize::value,
) )
SimpleMenuPreferenceInt( SimpleMenuPreferenceInt(
title = stringResource(id = R.string.settings_eh_detail_size), title = settingsEhDetailSize,
entry = R.array.detail_size_entries, entry = R.array.detail_size_entries,
entryValueRes = R.array.detail_size_entry_values, entryValueRes = R.array.detail_size_entry_values,
value = Settings.detailSize.asMutableState(), value = Settings.detailSize.asMutableState(),
@@ -224,24 +221,24 @@ fun EhScreen(navigator: DestinationsNavigator) {
IntSliderPreference( IntSliderPreference(
maxValue = 10, maxValue = 10,
minValue = 1, minValue = 1,
title = stringResource(id = R.string.settings_eh_thumb_columns), title = settingsEhThumbColumns,
value = Settings.thumbColumns::value, value = Settings.thumbColumns::value,
) )
var showGalleryPages by Settings.showGalleryPages.asMutableState() var showGalleryPages by Settings.showGalleryPages.asMutableState()
SwitchPref( SwitchPref(
checked = showGalleryPages, checked = showGalleryPages,
onMutate = { showGalleryPages = !showGalleryPages }, onMutate = { showGalleryPages = !showGalleryPages },
title = stringResource(id = R.string.settings_eh_show_gallery_pages), title = settingsEhShowGalleryPages,
summary = stringResource(id = R.string.settings_eh_show_gallery_pages_summary), summary = settingsEhShowGalleryPagesSummary,
) )
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_eh_show_vote_status), title = settingsEhShowVoteStatus,
value = Settings.showVoteStatus::value, value = Settings.showVoteStatus::value,
) )
val showComments = Settings::showComments.observed val showComments = Settings::showComments.observed
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_eh_show_gallery_comments), title = settingsEhShowGalleryComments,
summary = stringResource(id = R.string.settings_eh_show_gallery_comments_summary), summary = settingsEhShowGalleryCommentsSummary,
value = showComments.rememberedAccessor, value = showComments.rememberedAccessor,
) )
AnimatedVisibility(visible = showComments.value) { AnimatedVisibility(visible = showComments.value) {
@@ -249,53 +246,52 @@ fun EhScreen(navigator: DestinationsNavigator) {
maxValue = 100, maxValue = 100,
minValue = -101, minValue = -101,
showTicks = false, showTicks = false,
title = stringResource(id = R.string.settings_eh_show_gallery_comment_threshold), title = settingsEhShowGalleryCommentThreshold,
summary = stringResource(id = R.string.settings_eh_show_gallery_comment_threshold_summary), summary = settingsEhShowGalleryCommentThresholdSummary,
value = Settings::commentThreshold, value = Settings::commentThreshold,
) )
} }
if (EhTagDatabase.isTranslatable(context)) { if (EhTagDatabase.isTranslatable(implicit<Context>())) {
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_eh_show_tag_translations), title = settingsEhShowTagTranslations,
summary = stringResource(id = R.string.settings_eh_show_tag_translations_summary), summary = settingsEhShowTagTranslationsSummary,
value = Settings::showTagTranslations, value = Settings::showTagTranslations,
) )
UrlPreference( UrlPreference(
title = stringResource(id = R.string.settings_eh_tag_translations_source), title = settingsEhTagTranslationsSource,
url = stringResource(id = R.string.settings_eh_tag_translations_source_url), url = settingsEhTagTranslationsSourceUrl,
) )
} }
Preference( Preference(
title = stringResource(id = R.string.settings_eh_filter), title = settingsEhFilter,
summary = stringResource(id = R.string.settings_eh_filter_summary), summary = settingsEhFilterSummary,
) { navigator.navigate(FilterScreenDestination) } ) { navigate(FilterScreenDestination) }
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_eh_metered_network_warning), title = settingsEhMeteredNetworkWarning,
value = Settings.meteredNetworkWarning::value, value = Settings.meteredNetworkWarning::value,
) )
if (hasSignedIn) { if (hasSignedIn) {
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_eh_show_jpn_title), title = settingsEhShowJpnTitle,
summary = stringResource(id = R.string.settings_eh_show_jpn_title_summary), summary = settingsEhShowJpnTitleSummary,
value = Settings::showJpnTitle, value = Settings::showJpnTitle,
) )
val reqNews = Settings::requestNews.observed val reqNews = Settings::requestNews.observed
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_eh_request_news), title = settingsEhRequestNews,
value = reqNews.rememberedAccessor, value = reqNews.rememberedAccessor,
) )
AnimatedVisibility(visible = reqNews.value) { AnimatedVisibility(visible = reqNews.value) {
val pickerTitle = stringResource(id = R.string.settings_eh_request_news_timepicker) Preference(title = settingsEhRequestNewsTimepicker) {
Preference(title = pickerTitle) {
coroutineScope.launch { coroutineScope.launch {
val time = LocalTime.fromSecondOfDay(Settings.requestNewsTime) val time = LocalTime.fromSecondOfDay(Settings.requestNewsTime)
val (hour, minute) = dialogState.awaitSelectTime(pickerTitle, time.hour, time.minute) val (hour, minute) = awaitSelectTime(settingsEhRequestNewsTimepicker, time.hour, time.minute)
Settings.requestNewsTime = LocalTime(hour, minute).toSecondOfDay() Settings.requestNewsTime = LocalTime(hour, minute).toSecondOfDay()
} }
} }
} }
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_eh_hide_hv_events), title = settingsEhHideHvEvents,
value = Settings::hideHvEvents, value = Settings::hideHvEvents,
) )
} }
@@ -1,5 +1,6 @@
package com.hippo.ehviewer.ui.settings package com.hippo.ehviewer.ui.settings
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -43,7 +44,6 @@ import androidx.compose.runtime.currentRecomposeScope
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -61,8 +61,8 @@ import com.hippo.ehviewer.client.EhFilter.trigger
import com.hippo.ehviewer.collectAsState import com.hippo.ehviewer.collectAsState
import com.hippo.ehviewer.dao.Filter import com.hippo.ehviewer.dao.Filter
import com.hippo.ehviewer.dao.FilterMode import com.hippo.ehviewer.dao.FilterMode
import com.hippo.ehviewer.ui.composing
import com.hippo.ehviewer.ui.tools.Await import com.hippo.ehviewer.ui.tools.Await
import com.hippo.ehviewer.ui.tools.LocalDialogState
import com.hippo.ehviewer.ui.tools.thenIf import com.hippo.ehviewer.ui.tools.thenIf
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.annotation.RootGraph
@@ -74,18 +74,14 @@ import moe.tarsin.coroutines.groupByToObserved
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun FilterScreen(navigator: DestinationsNavigator) { fun AnimatedVisibilityScope.FilterScreen(navigator: DestinationsNavigator) = composing(navigator) {
val scope = rememberCoroutineScope()
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
val allFilterMap = remember { scope.async { EhFilter.filters.await().groupByToObserved { it.mode } } } val allFilterMap = remember { async { EhFilter.filters.await().groupByToObserved { it.mode } } }
val dialogState = LocalDialogState.current
val textIsEmpty = stringResource(R.string.text_is_empty)
val labelExist = stringResource(R.string.label_text_exist)
val animateItems by Settings.animateItems.collectAsState() val animateItems by Settings.animateItems.collectAsState()
fun addFilter() { fun addFilter() {
scope.launch { launch {
dialogState.dialog { cont -> dialog { cont ->
val types = stringArrayResource(id = R.array.filter_entries) val types = stringArrayResource(id = R.array.filter_entries)
val type = rememberTextFieldState(types[0]) val type = rememberTextFieldState(types[0])
val state = rememberTextFieldState() val state = rememberTextFieldState()
@@ -103,7 +99,7 @@ fun FilterScreen(navigator: DestinationsNavigator) {
cont.resume(Unit) cont.resume(Unit)
requireNotNull(allFilterMap.getCompleted()[mode]).add(filter) requireNotNull(allFilterMap.getCompleted()[mode]).add(filter)
} else { } else {
error = labelExist error = labelTextExist
} }
} }
} }
@@ -111,7 +107,7 @@ fun FilterScreen(navigator: DestinationsNavigator) {
onDismissRequest = { cont.cancel() }, onDismissRequest = { cont.cancel() },
confirmButton = { confirmButton = {
TextButton(onClick = ::invalidateAndSave) { TextButton(onClick = ::invalidateAndSave) {
Text(text = stringResource(id = R.string.add)) Text(text = add)
} }
}, },
dismissButton = { dismissButton = {
@@ -120,7 +116,7 @@ fun FilterScreen(navigator: DestinationsNavigator) {
} }
}, },
title = { title = {
Text(text = stringResource(id = R.string.add_filter)) Text(text = addFilter)
}, },
text = { text = {
var expanded by remember { mutableStateOf(false) } var expanded by remember { mutableStateOf(false) }
@@ -134,7 +130,7 @@ fun FilterScreen(navigator: DestinationsNavigator) {
readOnly = true, readOnly = true,
state = type, state = type,
label = { label = {
Text(text = stringResource(id = R.string.filter_label)) Text(text = filterLabel)
}, },
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) },
colors = ExposedDropdownMenuDefaults.outlinedTextFieldColors(), colors = ExposedDropdownMenuDefaults.outlinedTextFieldColors(),
@@ -159,7 +155,7 @@ fun FilterScreen(navigator: DestinationsNavigator) {
val isError = error != null val isError = error != null
OutlinedTextField( OutlinedTextField(
state = state, state = state,
label = { Text(text = stringResource(id = R.string.filter_text)) }, label = { Text(text = filterText) },
supportingText = { error?.let { Text(text = it) } }, supportingText = { error?.let { Text(text = it) } },
trailingIcon = { trailingIcon = {
if (isError) { if (isError) {
@@ -185,7 +181,7 @@ fun FilterScreen(navigator: DestinationsNavigator) {
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.filter)) }, title = { Text(text = filter) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { navigator.popBackStack() }) { IconButton(onClick = { navigator.popBackStack() }) {
Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null)
@@ -193,12 +189,12 @@ fun FilterScreen(navigator: DestinationsNavigator) {
}, },
actions = { actions = {
IconButton(onClick = { IconButton(onClick = {
scope.launch { launch {
dialogState.awaitConfirmationOrCancel( awaitConfirmationOrCancel(
title = R.string.filter, title = R.string.filter,
showCancelButton = false, showCancelButton = false,
) { ) {
Text(text = stringResource(id = R.string.filter_tip)) Text(text = filterTip)
} }
} }
}) { }) {
@@ -222,17 +218,17 @@ fun FilterScreen(navigator: DestinationsNavigator) {
var showTip = true var showTip = true
filters.forEach { (filterMode, filters) -> filters.forEach { (filterMode, filters) ->
val title = when (filterMode) { val title = when (filterMode) {
FilterMode.TITLE -> R.string.filter_title FilterMode.TITLE -> filterTitle
FilterMode.UPLOADER -> R.string.filter_uploader FilterMode.UPLOADER -> filterUploader
FilterMode.TAG -> R.string.filter_tag FilterMode.TAG -> filterTag
FilterMode.TAG_NAMESPACE -> R.string.filter_tag_namespace FilterMode.TAG_NAMESPACE -> filterTagNamespace
FilterMode.COMMENTER -> R.string.filter_commenter FilterMode.COMMENTER -> filterCommenter
FilterMode.COMMENT -> R.string.filter_comment FilterMode.COMMENT -> filterComment
} }
if (filters.isNotEmpty()) { if (filters.isNotEmpty()) {
item(key = filterMode) { item(key = filterMode) {
Text( Text(
text = stringResource(id = title), text = title,
modifier = Modifier.padding(horizontal = 24.dp, vertical = 8.dp).thenIf(animateItems) { animateItem() }, modifier = Modifier.padding(horizontal = 24.dp, vertical = 8.dp).thenIf(animateItems) { animateItem() },
color = MaterialTheme.colorScheme.tertiary, color = MaterialTheme.colorScheme.tertiary,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
@@ -251,9 +247,9 @@ fun FilterScreen(navigator: DestinationsNavigator) {
Text(text = filter.text, modifier = Modifier.weight(1F)) Text(text = filter.text, modifier = Modifier.weight(1F))
IconButton( IconButton(
onClick = { onClick = {
scope.launch { launch {
dialogState.awaitConfirmationOrCancel(confirmText = R.string.delete) { awaitConfirmationOrCancel(confirmText = R.string.delete) {
Text(text = stringResource(id = R.string.delete_filter, filter.text)) Text(text = deleteFilter(filter.text))
} }
filter.forget { filter.forget {
filters.remove(filter) filters.remove(filter)
@@ -283,7 +279,7 @@ fun FilterScreen(navigator: DestinationsNavigator) {
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,
) )
Text( Text(
text = stringResource(id = R.string.filter), text = filter,
style = MaterialTheme.typography.headlineMedium, style = MaterialTheme.typography.headlineMedium,
) )
} }
@@ -1,5 +1,6 @@
package com.hippo.ehviewer.ui.settings package com.hippo.ehviewer.ui.settings
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.automirrored.filled.ArrowBack
@@ -13,10 +14,8 @@ import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.hippo.ehviewer.R import com.hippo.ehviewer.ui.composing
import com.hippo.ehviewer.ui.openBrowser import com.hippo.ehviewer.ui.openBrowser
import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer
import com.mikepenz.aboutlibraries.ui.compose.m3.LibraryDefaults import com.mikepenz.aboutlibraries.ui.compose.m3.LibraryDefaults
@@ -26,15 +25,14 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun LicenseScreen(navigator: DestinationsNavigator) { fun AnimatedVisibilityScope.LicenseScreen(navigator: DestinationsNavigator) = composing(navigator) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
val context = LocalContext.current
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.license)) }, title = { Text(text = license) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { navigator.popBackStack() }) { IconButton(onClick = { popBackStack() }) {
Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null)
} }
}, },
@@ -48,7 +46,7 @@ fun LicenseScreen(navigator: DestinationsNavigator) {
colors = LibraryDefaults.libraryColors(badgeBackgroundColor = MaterialTheme.colorScheme.tertiary), colors = LibraryDefaults.libraryColors(badgeBackgroundColor = MaterialTheme.colorScheme.tertiary),
padding = LibraryDefaults.libraryPadding(badgeContentPadding = PaddingValues(4.dp)), padding = LibraryDefaults.libraryPadding(badgeContentPadding = PaddingValues(4.dp)),
onLibraryClick = { library -> onLibraryClick = { library ->
library.website?.let { context.openBrowser(it) } library.website?.let { openBrowser(it) }
}, },
) )
} }
@@ -1,5 +1,6 @@
package com.hippo.ehviewer.ui.settings package com.hippo.ehviewer.ui.settings
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -11,11 +12,10 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import com.google.accompanist.web.WebView import com.google.accompanist.web.WebView
import com.google.accompanist.web.rememberWebViewState import com.google.accompanist.web.rememberWebViewState
import com.hippo.ehviewer.R
import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUrl
import com.hippo.ehviewer.ui.composing
import com.hippo.ehviewer.util.setDefaultSettings import com.hippo.ehviewer.util.setDefaultSettings
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.annotation.RootGraph
@@ -23,14 +23,14 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun MyTagsScreen(navigator: DestinationsNavigator) { fun AnimatedVisibilityScope.MyTagsScreen(navigator: DestinationsNavigator) = composing(navigator) {
val url = EhUrl.myTagsUrl val url = EhUrl.myTagsUrl
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.my_tags)) }, title = { Text(text = myTags) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { navigator.popBackStack() }) { IconButton(onClick = { popBackStack() }) {
Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null)
} }
}, },
@@ -3,7 +3,6 @@ package com.hippo.ehviewer.ui.settings
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContract import androidx.activity.result.contract.ActivityResultContract
import androidx.annotation.ArrayRes import androidx.annotation.ArrayRes
import androidx.annotation.StringRes
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
@@ -30,7 +29,6 @@ import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.integerArrayResource import androidx.compose.ui.res.integerArrayResource
import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringArrayResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import arrow.atomic.Atomic import arrow.atomic.Atomic
@@ -63,7 +61,7 @@ object PreferenceTokens {
@Composable @Composable
fun PreferenceHeader( fun PreferenceHeader(
icon: Painter, icon: Painter,
@StringRes title: Int, title: String,
childRoute: DirectionDestinationSpec, childRoute: DirectionDestinationSpec,
navigator: DestinationsNavigator, navigator: DestinationsNavigator,
) { ) {
@@ -74,14 +72,14 @@ fun PreferenceHeader(
Spacer(modifier = Modifier.size(PreferenceTokens.PreferenceIconPadding)) Spacer(modifier = Modifier.size(PreferenceTokens.PreferenceIconPadding))
Icon(painter = icon, contentDescription = null, modifier = Modifier.size(PreferenceTokens.PreferenceIconSize), tint = MaterialTheme.colorScheme.primary) Icon(painter = icon, contentDescription = null, modifier = Modifier.size(PreferenceTokens.PreferenceIconSize), tint = MaterialTheme.colorScheme.primary)
Spacer(modifier = Modifier.size(PreferenceTokens.PreferenceIconPadding)) Spacer(modifier = Modifier.size(PreferenceTokens.PreferenceIconPadding))
Text(text = stringResource(id = title), modifier = Modifier.padding(PreferenceTextPadding), style = MaterialTheme.typography.bodyLarge) Text(text = title, modifier = Modifier.padding(PreferenceTextPadding), style = MaterialTheme.typography.bodyLarge)
} }
} }
@Composable @Composable
fun PreferenceHeader( fun PreferenceHeader(
icon: ImageVector, icon: ImageVector,
@StringRes title: Int, title: String,
childRoute: DirectionDestinationSpec, childRoute: DirectionDestinationSpec,
navigator: DestinationsNavigator, navigator: DestinationsNavigator,
) = PreferenceHeader( ) = PreferenceHeader(
@@ -1,6 +1,7 @@
package com.hippo.ehviewer.ui.settings package com.hippo.ehviewer.ui.settings
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -15,39 +16,34 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.hippo.ehviewer.EhApplication.Companion.searchDatabase import com.hippo.ehviewer.EhApplication.Companion.searchDatabase
import com.hippo.ehviewer.R import com.hippo.ehviewer.R
import com.hippo.ehviewer.Settings import com.hippo.ehviewer.Settings
import com.hippo.ehviewer.asMutableState import com.hippo.ehviewer.asMutableState
import com.hippo.ehviewer.ui.composing
import com.hippo.ehviewer.ui.isAuthenticationSupported import com.hippo.ehviewer.ui.isAuthenticationSupported
import com.hippo.ehviewer.ui.tools.LocalDialogState
import com.hippo.ehviewer.ui.tools.observed import com.hippo.ehviewer.ui.tools.observed
import com.hippo.ehviewer.ui.tools.rememberedAccessor import com.hippo.ehviewer.ui.tools.rememberedAccessor
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun PrivacyScreen(navigator: DestinationsNavigator) { fun AnimatedVisibilityScope.PrivacyScreen(navigator: DestinationsNavigator) = composing(navigator) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
val coroutineScope = rememberCoroutineScope { Dispatchers.IO } fun launchSnackBar(content: String) = launch { snackbarHostState.showSnackbar(content) }
fun launchSnackBar(content: String) = coroutineScope.launch { snackbarHostState.showSnackbar(content) }
val dialogState = LocalDialogState.current
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.settings_privacy)) }, title = { Text(text = settingsPrivacy) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { navigator.popBackStack() }) { IconButton(onClick = { popBackStack() }) {
Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null)
} }
}, },
@@ -59,37 +55,36 @@ fun PrivacyScreen(navigator: DestinationsNavigator) {
Column(modifier = Modifier.padding(it).nestedScroll(scrollBehavior.nestedScrollConnection)) { Column(modifier = Modifier.padding(it).nestedScroll(scrollBehavior.nestedScrollConnection)) {
val security = Settings.security.asMutableState() val security = Settings.security.asMutableState()
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_privacy_require_unlock), title = settingsPrivacyRequireUnlock,
value = security.rememberedAccessor, value = security.rememberedAccessor,
enabled = LocalContext.current.isAuthenticationSupported(), enabled = isAuthenticationSupported(),
) )
AnimatedVisibility(visible = security.value) { AnimatedVisibility(visible = security.value) {
val securityDelay = Settings::securityDelay.observed val securityDelay = Settings::securityDelay.observed
val summary = if (securityDelay.value == 0) { val summary = if (securityDelay.value == 0) {
stringResource(id = R.string.settings_privacy_require_unlock_delay_summary_immediately) settingsPrivacyRequireUnlockDelaySummaryImmediately
} else { } else {
stringResource(id = R.string.settings_privacy_require_unlock_delay_summary, securityDelay.value) settingsPrivacyRequireUnlockDelaySummary(securityDelay.value)
} }
IntSliderPreference( IntSliderPreference(
maxValue = 30, maxValue = 30,
title = stringResource(id = R.string.settings_privacy_require_unlock_delay), title = settingsPrivacyRequireUnlockDelay,
summary = summary, summary = summary,
value = securityDelay.rememberedAccessor, value = securityDelay.rememberedAccessor,
enabled = LocalContext.current.isAuthenticationSupported(), enabled = LocalContext.current.isAuthenticationSupported(),
) )
} }
SwitchPreference( SwitchPreference(
title = stringResource(id = R.string.settings_privacy_secure), title = settingsPrivacySecure,
summary = stringResource(id = R.string.settings_privacy_secure_summary), summary = settingsPrivacySecureSummary,
value = Settings::enabledSecurity, value = Settings::enabledSecurity,
) )
val searchHistoryCleared = stringResource(id = R.string.search_history_cleared)
Preference( Preference(
title = stringResource(id = R.string.clear_search_history), title = clearSearchHistory,
summary = stringResource(id = R.string.clear_search_history_summary), summary = clearSearchHistorySummary,
) { ) {
coroutineScope.launch { launch {
dialogState.awaitConfirmationOrCancel( awaitConfirmationOrCancel(
confirmText = R.string.clear_all, confirmText = R.string.clear_all,
title = R.string.clear_search_history_confirm, title = R.string.clear_search_history_confirm,
) )
@@ -1,5 +1,6 @@
package com.hippo.ehviewer.ui.settings package com.hippo.ehviewer.ui.settings
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -17,10 +18,9 @@ import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.stringResource
import com.hippo.ehviewer.R
import com.hippo.ehviewer.icons.EhIcons import com.hippo.ehviewer.icons.EhIcons
import com.hippo.ehviewer.icons.filled.SadPanda import com.hippo.ehviewer.icons.filled.SadPanda
import com.hippo.ehviewer.ui.composing
import com.hippo.ehviewer.ui.destinations.AboutScreenDestination import com.hippo.ehviewer.ui.destinations.AboutScreenDestination
import com.hippo.ehviewer.ui.destinations.AdvancedScreenDestination import com.hippo.ehviewer.ui.destinations.AdvancedScreenDestination
import com.hippo.ehviewer.ui.destinations.DownloadScreenDestination import com.hippo.ehviewer.ui.destinations.DownloadScreenDestination
@@ -32,12 +32,12 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun SettingsScreen(navigator: DestinationsNavigator) { fun AnimatedVisibilityScope.SettingsScreen(navigator: DestinationsNavigator) = composing(navigator) {
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.settings)) }, title = { Text(text = settings) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { navigator.navigateUp() }) { IconButton(onClick = { navigator.navigateUp() }) {
Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null)
@@ -50,31 +50,31 @@ fun SettingsScreen(navigator: DestinationsNavigator) {
Column(modifier = Modifier.padding(it).nestedScroll(scrollBehavior.nestedScrollConnection)) { Column(modifier = Modifier.padding(it).nestedScroll(scrollBehavior.nestedScrollConnection)) {
PreferenceHeader( PreferenceHeader(
icon = EhIcons.Default.SadPanda, icon = EhIcons.Default.SadPanda,
title = R.string.settings_eh, title = settingsEh,
childRoute = EhScreenDestination, childRoute = EhScreenDestination,
navigator = navigator, navigator = navigator,
) )
PreferenceHeader( PreferenceHeader(
icon = Icons.Default.Download, icon = Icons.Default.Download,
title = R.string.settings_download, title = settingsDownload,
childRoute = DownloadScreenDestination, childRoute = DownloadScreenDestination,
navigator = navigator, navigator = navigator,
) )
PreferenceHeader( PreferenceHeader(
icon = Icons.Default.Security, icon = Icons.Default.Security,
title = R.string.settings_privacy, title = settingsPrivacy,
childRoute = PrivacyScreenDestination, childRoute = PrivacyScreenDestination,
navigator = navigator, navigator = navigator,
) )
PreferenceHeader( PreferenceHeader(
icon = Icons.Default.Adb, icon = Icons.Default.Adb,
title = R.string.settings_advanced, title = settingsAdvanced,
childRoute = AdvancedScreenDestination, childRoute = AdvancedScreenDestination,
navigator = navigator, navigator = navigator,
) )
PreferenceHeader( PreferenceHeader(
icon = Icons.Default.Info, icon = Icons.Default.Info,
title = R.string.settings_about, title = settingsAbout,
childRoute = AboutScreenDestination, childRoute = AboutScreenDestination,
navigator = navigator, navigator = navigator,
) )
@@ -1,6 +1,7 @@
package com.hippo.ehviewer.ui.settings package com.hippo.ehviewer.ui.settings
import android.webkit.WebView import android.webkit.WebView
import androidx.compose.animation.AnimatedVisibilityScope
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -18,13 +19,13 @@ import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import arrow.atomic.Atomic import arrow.atomic.Atomic
import arrow.atomic.value
import com.google.accompanist.web.WebView import com.google.accompanist.web.WebView
import com.google.accompanist.web.rememberWebViewState import com.google.accompanist.web.rememberWebViewState
import com.hippo.ehviewer.R
import com.hippo.ehviewer.client.EhCookieStore import com.hippo.ehviewer.client.EhCookieStore
import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUrl
import com.hippo.ehviewer.ui.composing
import com.hippo.ehviewer.util.setDefaultSettings import com.hippo.ehviewer.util.setDefaultSettings
import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.annotation.RootGraph
@@ -34,14 +35,14 @@ private const val APPLY_JS = "javascript:(function(){var apply = document.getEle
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
fun UConfigScreen(navigator: DestinationsNavigator) { fun AnimatedVisibilityScope.UConfigScreen(navigator: DestinationsNavigator) = composing(navigator) {
val url = EhUrl.uConfigUrl val url = EhUrl.uConfigUrl
val webview = remember { Atomic<WebView?>(null) } var webview by remember { Atomic<WebView?>(null)::value }
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(text = stringResource(id = R.string.u_config)) }, title = { Text(text = uConfig) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { navigator.popBackStack() }) { IconButton(onClick = { navigator.popBackStack() }) {
Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null) Icon(imageVector = Icons.AutoMirrored.Default.ArrowBack, contentDescription = null)
@@ -50,7 +51,7 @@ fun UConfigScreen(navigator: DestinationsNavigator) {
actions = { actions = {
IconButton( IconButton(
onClick = { onClick = {
webview.get()?.loadUrl(APPLY_JS) webview?.loadUrl(APPLY_JS)
navigator.popBackStack() navigator.popBackStack()
}, },
) { ) {
@@ -66,9 +67,8 @@ fun UConfigScreen(navigator: DestinationsNavigator) {
state = state, state = state,
modifier = Modifier.padding(paddingValues).fillMaxSize(), modifier = Modifier.padding(paddingValues).fillMaxSize(),
onCreated = { it.setDefaultSettings() }, onCreated = { it.setDefaultSettings() },
factory = { WebView(it).apply { webview.set(this) } }, factory = { WebView(it).apply { webview = this } },
) )
val applyTip = stringResource(id = R.string.apply_tip)
LaunchedEffect(Unit) { snackbarHostState.showSnackbar(applyTip) } LaunchedEffect(Unit) { snackbarHostState.showSnackbar(applyTip) }
DisposableEffect(Unit) { DisposableEffect(Unit) {
onDispose { onDispose {
+3
View File
@@ -25,6 +25,7 @@ kotlinx-datetime = "0.6.1"
kotlinx-serialization = "1.7.3" kotlinx-serialization = "1.7.3"
ksp = "2.1.0-1.0.29" ksp = "2.1.0-1.0.29"
ktor = "3.0.2" ktor = "3.0.2"
lyricist = "1.7.0"
okhttp = "5.0.0-alpha.14" okhttp = "5.0.0-alpha.14"
okio = "3.9.1" okio = "3.9.1"
splitties = "3.0.0" splitties = "3.0.0"
@@ -94,6 +95,8 @@ kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.
ktlint = "com.pinterest:ktlint:1.4.0" ktlint = "com.pinterest:ktlint:1.4.0"
lyricist = { module = "cafe.adriel.lyricist:lyricist", version.ref = "lyricist" }
okhttp-bom = { module = "com.squareup.okhttp3:okhttp-bom", version.ref = "okhttp" } okhttp-bom = { module = "com.squareup.okhttp3:okhttp-bom", version.ref = "okhttp" }
okhttp-android = { module = "com.squareup.okhttp3:okhttp-android" } okhttp-android = { module = "com.squareup.okhttp3:okhttp-android" }
ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }