From 88c7b31ecc82f1c1025a0014ae42ea6eebdca0a2 Mon Sep 17 00:00:00 2001 From: radiostar Date: Sun, 24 May 2026 13:34:03 +0900 Subject: [PATCH] Translate Kavita filters to Korean --- src/all/kavita/build.gradle | 2 +- .../tachiyomi/extension/all/kavita/Filters.kt | 88 +++++++++---------- .../tachiyomi/extension/all/kavita/Kavita.kt | 71 ++++++++++++--- .../extension/all/kavita/KavitaConstants.kt | 2 +- 4 files changed, 103 insertions(+), 60 deletions(-) diff --git a/src/all/kavita/build.gradle b/src/all/kavita/build.gradle index 384adfbb..cf4fa7a3 100644 --- a/src/all/kavita/build.gradle +++ b/src/all/kavita/build.gradle @@ -2,7 +2,7 @@ ext { kmkVersionCode = 1 extName = 'Kavita' extClass = '.KavitaFactory' - extVersionCode = 36 + extVersionCode = 37 isNsfw = false } diff --git a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Filters.kt b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Filters.kt index b54304d1..59f840ec 100644 --- a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Filters.kt +++ b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Filters.kt @@ -4,34 +4,34 @@ import eu.kanade.tachiyomi.extension.all.kavita.KavitaConstants.noSmartFilterSel import eu.kanade.tachiyomi.source.model.Filter class SmartFiltersFilter(smartFilters: Array) : - Filter.Select("Smart Filters", arrayOf(noSmartFilterSelected) + smartFilters) -class SortFilter(sortables: Array) : Filter.Sort("Sort by", sortables, Selection(0, true)) + Filter.Select("스마트 필터", arrayOf(noSmartFilterSelected) + smartFilters) +class SortFilter(sortables: Array) : Filter.Sort("정렬", sortables, Selection(0, true)) val sortableList = listOf( - Pair("Sort name", 1), - Pair("Created", 2), - Pair("Last modified", 3), - Pair("Item added", 4), - Pair("Time to Read", 5), - Pair("Release year", 6), - Pair("Read Progress", 7), - Pair("Average Rating", 8), - Pair("Random", 9), + Pair("정렬명", 1), + Pair("생성일", 2), + Pair("마지막 수정", 3), + Pair("추가일", 4), + Pair("읽는 시간", 5), + Pair("발매 연도", 6), + Pair("읽은 진행률", 7), + Pair("평균 평점", 8), + Pair("무작위", 9), ) -class SpecialListFilter(name: String = "Special Lists") : Filter.Select( +class SpecialListFilter(name: String = "특수 목록") : Filter.Select( name, - arrayOf("None", "Want to Read", "Reading Lists"), + arrayOf("없음", "읽고 싶음", "읽기 목록"), ) class StatusFilter : Filter.Select( - "Status", - arrayOf("Any", "Unread", "In Progress", "Read"), + "읽기 상태", + arrayOf("전체", "안 읽음", "읽는 중", "읽음"), ) class StatusSeparator : Filter.Separator() -class StatusFilterGroup(name: String = "Status") : Filter.Group( +class StatusFilterGroup(name: String = "읽기 상태") : Filter.Group( name, listOf(StatusFilter()), ) @@ -39,56 +39,56 @@ class StatusFilterGroup(name: String = "Status") : Filter.Group( // Use Filter.Text directly for release year range class ReleaseYearRange(name: String) : Filter.Text(name, "") class ReleaseYearRangeGroup(filters: List) : - Filter.Group("Release Year", filters) + Filter.Group("발매 연도", filters) // Use Filter.TriState for genres/tags/age ratings/collections/languages/libraries class GenreFilter(name: String) : Filter.TriState(name) class GenreFilterGroup(genres: List) : - Filter.Group("Genres", genres) + Filter.Group("장르", genres) class TagFilter(name: String) : Filter.TriState(name) class TagFilterGroup(tags: List) : - Filter.Group("Tags", tags) + Filter.Group("태그", tags) class AgeRatingFilter(name: String) : Filter.TriState(name) class AgeRatingFilterGroup(ageRatings: List) : - Filter.Group("Age Rating", ageRatings) + Filter.Group("연령 등급", ageRatings) class FormatFilter(name: String) : Filter.CheckBox(name, false) class FormatsFilterGroup(formats: List) : - Filter.Group("Formats", formats) + Filter.Group("형식", formats) class CollectionFilter(name: String) : Filter.TriState(name) class CollectionFilterGroup(collections: List) : - Filter.Group("Collection", collections) + Filter.Group("컬렉션", collections) class LanguageFilter(name: String) : Filter.TriState(name) class LanguageFilterGroup(languages: List) : - Filter.Group("Language", languages) + Filter.Group("언어", languages) class LibraryFilter(library: String) : Filter.TriState(library) class LibrariesFilterGroup(libraries: List) : - Filter.Group("Libraries", libraries) + Filter.Group("라이브러리", libraries) class PubStatusFilter(name: String) : Filter.CheckBox(name, false) class PubStatusFilterGroup(status: List) : - Filter.Group("Publication Status", status) + Filter.Group("연재 상태", status) class UserRating : Filter.Select( - "Minimum Rating", + "최소 평점", arrayOf( - "Any", - "1 star", - "2 stars", - "3 stars", - "4 stars", - "5 stars", + "전체", + "1점", + "2점", + "3점", + "4점", + "5점", ).mapIndexed { index, _ -> index }.toTypedArray(), ) { override fun toString(): String { return when (state) { - 0 -> "Any" - else -> "$state star${if (state > 1) "s" else ""}" + 0 -> "전체" + else -> "${state}점" } } } @@ -102,40 +102,40 @@ class PeopleSeparatorFilter : class WriterPeopleFilter(name: String) : Filter.CheckBox(name, false) class WriterPeopleFilterGroup(peoples: List) : - Filter.Group("Writer", peoples) + Filter.Group("작가", peoples) class PencillerPeopleFilter(name: String) : Filter.CheckBox(name, false) class PencillerPeopleFilterGroup(peoples: List) : - Filter.Group("Penciller", peoples) + Filter.Group("펜슬러", peoples) class InkerPeopleFilter(name: String) : Filter.CheckBox(name, false) class InkerPeopleFilterGroup(peoples: List) : - Filter.Group("Inker", peoples) + Filter.Group("잉커", peoples) class ColoristPeopleFilter(name: String) : Filter.CheckBox(name, false) class ColoristPeopleFilterGroup(peoples: List) : - Filter.Group("Colorist", peoples) + Filter.Group("컬러리스트", peoples) class LettererPeopleFilter(name: String) : Filter.CheckBox(name, false) class LettererPeopleFilterGroup(peoples: List) : - Filter.Group("Letterer", peoples) + Filter.Group("레터러", peoples) class CoverArtistPeopleFilter(name: String) : Filter.CheckBox(name, false) class CoverArtistPeopleFilterGroup(peoples: List) : - Filter.Group("Cover Artist", peoples) + Filter.Group("표지 작가", peoples) class EditorPeopleFilter(name: String) : Filter.CheckBox(name, false) class EditorPeopleFilterGroup(peoples: List) : - Filter.Group("Editor", peoples) + Filter.Group("편집자", peoples) class PublisherPeopleFilter(name: String) : Filter.CheckBox(name, false) class PublisherPeopleFilterGroup(peoples: List) : - Filter.Group("Publisher", peoples) + Filter.Group("출판사", peoples) class CharacterPeopleFilter(name: String) : Filter.CheckBox(name, false) class CharacterPeopleFilterGroup(peoples: List) : - Filter.Group("Character", peoples) + Filter.Group("캐릭터", peoples) class TranslatorPeopleFilter(name: String) : Filter.CheckBox(name, false) class TranslatorPeopleFilterGroup(peoples: List) : - Filter.Group("Translator", peoples) + Filter.Group("번역자", peoples) diff --git a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Kavita.kt b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Kavita.kt index 44e5b7ed..35d1bcd2 100644 --- a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Kavita.kt +++ b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/Kavita.kt @@ -586,12 +586,12 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou filter.state.forEach { rangeFilter -> if ((rangeFilter as Filter.Text).state.isNotEmpty()) { when (rangeFilter.name) { - "Min" -> filterV2.addStatement( + "Min", "최소" -> filterV2.addStatement( FilterComparison.GreaterThanEqual, FilterField.ReleaseYear, rangeFilter.state, ) - "Max" -> filterV2.addStatement( + "Max", "최대" -> filterV2.addStatement( FilterComparison.LessThanEqual, FilterField.ReleaseYear, rangeFilter.state, @@ -653,12 +653,12 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou val included = filter.state .filter { it.state == STATE_INCLUDE } .mapNotNull { ageFilter -> - ageRatingsListMeta.find { it.title == ageFilter.name }?.value?.toString() + ageRatingsListMeta.find { it.title == ageFilter.name || translateAgeRating(it.title) == ageFilter.name }?.value?.toString() } val excluded = filter.state .filter { it.state == STATE_EXCLUDE } .mapNotNull { ageFilter -> - ageRatingsListMeta.find { it.title == ageFilter.name }?.value?.toString() + ageRatingsListMeta.find { it.title == ageFilter.name || translateAgeRating(it.title) == ageFilter.name }?.value?.toString() } if (included.isNotEmpty()) { @@ -728,12 +728,12 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou val included = filter.state .filter { it.state == STATE_INCLUDE } .mapNotNull { languageFilter -> - languagesListMeta.find { it.title == languageFilter.name }?.isoCode + languagesListMeta.find { it.title == languageFilter.name || translateLanguage(it.title) == languageFilter.name }?.isoCode } val excluded = filter.state .filter { it.state == STATE_EXCLUDE } .mapNotNull { languageFilter -> - languagesListMeta.find { it.title == languageFilter.name }?.isoCode + languagesListMeta.find { it.title == languageFilter.name || translateLanguage(it.title) == languageFilter.name }?.isoCode } if (included.isNotEmpty()) { @@ -784,7 +784,7 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou is PubStatusFilterGroup -> { filter.state.forEach { pubStatusFilter -> if ((pubStatusFilter as Filter.CheckBox).state) { - val statusValue = when (pubStatusFilter.name) { + val statusValue = when (normalizePublicationStatus(pubStatusFilter.name)) { "Ongoing" -> 0 "Hiatus" -> 1 "Completed" -> 2 @@ -2078,8 +2078,8 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou // Release year filter ReleaseYearRangeGroup( listOf( - ReleaseYearRange("Min"), - ReleaseYearRange("Max"), + ReleaseYearRange("최소"), + ReleaseYearRange("최대"), ), ), @@ -2087,21 +2087,64 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou TagFilterGroup(tags.map { TagFilter(it) }), CollectionFilterGroup(collections.map { CollectionFilter(it) }), LibrariesFilterGroup(libraries.map { LibraryFilter(it) }), - LanguageFilterGroup(languages.map { LanguageFilter(it) }), - PubStatusFilterGroup(pubStatus.map { PubStatusFilter(it) }), - AgeRatingFilterGroup(ageRatings.map { AgeRatingFilter(it) }), + LanguageFilterGroup(languages.map { LanguageFilter(translateLanguage(it)) }), + PubStatusFilterGroup(pubStatus.map { PubStatusFilter(translatePublicationStatus(it)) }), + AgeRatingFilterGroup(ageRatings.map { AgeRatingFilter(translateAgeRating(it)) }), UserRating(), UserRatingSeparator(), // Special filters section - Filter.Header(intl["filters_special"]), - SpecialListFilter(intl["filters_special_list"]), + Filter.Header("특수 필터"), + SpecialListFilter("특수 목록"), SmartFiltersFilter(smartFilters), ) } + private fun translatePublicationStatus(value: String): String = + when (value) { + "Ongoing" -> "연재중" + "Hiatus" -> "휴재" + "Completed" -> "완결" + "Cancelled" -> "취소됨" + "Ended" -> "종료됨" + else -> value + } + + private fun normalizePublicationStatus(value: String): String = + when (value) { + "연재중" -> "Ongoing" + "휴재" -> "Hiatus" + "완결" -> "Completed" + "취소됨" -> "Cancelled" + "종료됨" -> "Ended" + else -> value + } + + private fun translateAgeRating(value: String): String = + when (value) { + "Unknown" -> "알 수 없음" + "Everyone" -> "전체 이용가" + "Teen" -> "청소년" + "Mature" -> "성인" + "Explicit" -> "노골적" + else -> value + } + + private fun translateLanguage(value: String): String = + when (value) { + "Unknown" -> "알 수 없음" + "English" -> "영어" + "Korean" -> "한국어" + "Japanese" -> "일본어" + "Chinese" -> "중국어" + "Spanish" -> "스페인어" + "French" -> "프랑스어" + "German" -> "독일어" + else -> value + } + override fun getFilterList(): FilterList { return getFilterList( genres = genresListMeta.map { it.title }, diff --git a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/KavitaConstants.kt b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/KavitaConstants.kt index a733fed4..72c39beb 100644 --- a/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/KavitaConstants.kt +++ b/src/all/kavita/src/eu/kanade/tachiyomi/extension/all/kavita/KavitaConstants.kt @@ -9,7 +9,7 @@ object KavitaConstants { const val SPECIAL_NUMBER_OFFSET = 10000000000f const val customSourceNamePref = "customSourceName" - const val noSmartFilterSelected = "No smart filter loaded" + const val noSmartFilterSelected = "스마트 필터 없음" // Template formatting preferences const val CHAPTER_TITLE_FORMAT_DEFAULT = "\$CleanTitle"