Translate Kavita filters to Korean
Some checks failed
CI / Prepare job (push) Has been cancelled
Create Release on Merge / release (push) Has been cancelled
CI / Build extensions (${{ matrix.chunk.number }}) (push) Has been cancelled
CI / Publish extension repo (push) Has been cancelled
Lock threads / lock (push) Has been cancelled

This commit is contained in:
2026-05-24 13:34:03 +09:00
parent 7df02d1a2a
commit 88c7b31ecc
4 changed files with 103 additions and 60 deletions

View File

@@ -2,7 +2,7 @@ ext {
kmkVersionCode = 1 kmkVersionCode = 1
extName = 'Kavita' extName = 'Kavita'
extClass = '.KavitaFactory' extClass = '.KavitaFactory'
extVersionCode = 36 extVersionCode = 37
isNsfw = false isNsfw = false
} }

View File

@@ -4,34 +4,34 @@ import eu.kanade.tachiyomi.extension.all.kavita.KavitaConstants.noSmartFilterSel
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
class SmartFiltersFilter(smartFilters: Array<String>) : class SmartFiltersFilter(smartFilters: Array<String>) :
Filter.Select<String>("Smart Filters", arrayOf(noSmartFilterSelected) + smartFilters) Filter.Select<String>("스마트 필터", arrayOf(noSmartFilterSelected) + smartFilters)
class SortFilter(sortables: Array<String>) : Filter.Sort("Sort by", sortables, Selection(0, true)) class SortFilter(sortables: Array<String>) : Filter.Sort("정렬", sortables, Selection(0, true))
val sortableList = listOf( val sortableList = listOf(
Pair("Sort name", 1), Pair("정렬명", 1),
Pair("Created", 2), Pair("생성일", 2),
Pair("Last modified", 3), Pair("마지막 수정", 3),
Pair("Item added", 4), Pair("추가일", 4),
Pair("Time to Read", 5), Pair("읽는 시간", 5),
Pair("Release year", 6), Pair("발매 연도", 6),
Pair("Read Progress", 7), Pair("읽은 진행률", 7),
Pair("Average Rating", 8), Pair("평균 평점", 8),
Pair("Random", 9), Pair("무작위", 9),
) )
class SpecialListFilter(name: String = "Special Lists") : Filter.Select<String>( class SpecialListFilter(name: String = "특수 목록") : Filter.Select<String>(
name, name,
arrayOf("None", "Want to Read", "Reading Lists"), arrayOf("없음", "읽고 싶음", "읽기 목록"),
) )
class StatusFilter : Filter.Select<String>( class StatusFilter : Filter.Select<String>(
"Status", "읽기 상태",
arrayOf("Any", "Unread", "In Progress", "Read"), arrayOf("전체", "안 읽음", "읽는 중", "읽음"),
) )
class StatusSeparator : class StatusSeparator :
Filter.Separator() Filter.Separator()
class StatusFilterGroup(name: String = "Status") : Filter.Group<StatusFilter>( class StatusFilterGroup(name: String = "읽기 상태") : Filter.Group<StatusFilter>(
name, name,
listOf(StatusFilter()), listOf(StatusFilter()),
) )
@@ -39,56 +39,56 @@ class StatusFilterGroup(name: String = "Status") : Filter.Group<StatusFilter>(
// Use Filter.Text directly for release year range // Use Filter.Text directly for release year range
class ReleaseYearRange(name: String) : Filter.Text(name, "") class ReleaseYearRange(name: String) : Filter.Text(name, "")
class ReleaseYearRangeGroup(filters: List<ReleaseYearRange>) : class ReleaseYearRangeGroup(filters: List<ReleaseYearRange>) :
Filter.Group<ReleaseYearRange>("Release Year", filters) Filter.Group<ReleaseYearRange>("발매 연도", filters)
// Use Filter.TriState for genres/tags/age ratings/collections/languages/libraries // Use Filter.TriState for genres/tags/age ratings/collections/languages/libraries
class GenreFilter(name: String) : Filter.TriState(name) class GenreFilter(name: String) : Filter.TriState(name)
class GenreFilterGroup(genres: List<GenreFilter>) : class GenreFilterGroup(genres: List<GenreFilter>) :
Filter.Group<GenreFilter>("Genres", genres) Filter.Group<GenreFilter>("장르", genres)
class TagFilter(name: String) : Filter.TriState(name) class TagFilter(name: String) : Filter.TriState(name)
class TagFilterGroup(tags: List<TagFilter>) : class TagFilterGroup(tags: List<TagFilter>) :
Filter.Group<TagFilter>("Tags", tags) Filter.Group<TagFilter>("태그", tags)
class AgeRatingFilter(name: String) : Filter.TriState(name) class AgeRatingFilter(name: String) : Filter.TriState(name)
class AgeRatingFilterGroup(ageRatings: List<AgeRatingFilter>) : class AgeRatingFilterGroup(ageRatings: List<AgeRatingFilter>) :
Filter.Group<AgeRatingFilter>("Age Rating", ageRatings) Filter.Group<AgeRatingFilter>("연령 등급", ageRatings)
class FormatFilter(name: String) : Filter.CheckBox(name, false) class FormatFilter(name: String) : Filter.CheckBox(name, false)
class FormatsFilterGroup(formats: List<FormatFilter>) : class FormatsFilterGroup(formats: List<FormatFilter>) :
Filter.Group<FormatFilter>("Formats", formats) Filter.Group<FormatFilter>("형식", formats)
class CollectionFilter(name: String) : Filter.TriState(name) class CollectionFilter(name: String) : Filter.TriState(name)
class CollectionFilterGroup(collections: List<CollectionFilter>) : class CollectionFilterGroup(collections: List<CollectionFilter>) :
Filter.Group<CollectionFilter>("Collection", collections) Filter.Group<CollectionFilter>("컬렉션", collections)
class LanguageFilter(name: String) : Filter.TriState(name) class LanguageFilter(name: String) : Filter.TriState(name)
class LanguageFilterGroup(languages: List<LanguageFilter>) : class LanguageFilterGroup(languages: List<LanguageFilter>) :
Filter.Group<LanguageFilter>("Language", languages) Filter.Group<LanguageFilter>("언어", languages)
class LibraryFilter(library: String) : Filter.TriState(library) class LibraryFilter(library: String) : Filter.TriState(library)
class LibrariesFilterGroup(libraries: List<LibraryFilter>) : class LibrariesFilterGroup(libraries: List<LibraryFilter>) :
Filter.Group<LibraryFilter>("Libraries", libraries) Filter.Group<LibraryFilter>("라이브러리", libraries)
class PubStatusFilter(name: String) : Filter.CheckBox(name, false) class PubStatusFilter(name: String) : Filter.CheckBox(name, false)
class PubStatusFilterGroup(status: List<PubStatusFilter>) : class PubStatusFilterGroup(status: List<PubStatusFilter>) :
Filter.Group<PubStatusFilter>("Publication Status", status) Filter.Group<PubStatusFilter>("연재 상태", status)
class UserRating : Filter.Select<Int>( class UserRating : Filter.Select<Int>(
"Minimum Rating", "최소 평점",
arrayOf( arrayOf(
"Any", "전체",
"1 star", "1",
"2 stars", "2",
"3 stars", "3",
"4 stars", "4",
"5 stars", "5",
).mapIndexed { index, _ -> index }.toTypedArray(), ).mapIndexed { index, _ -> index }.toTypedArray(),
) { ) {
override fun toString(): String { override fun toString(): String {
return when (state) { return when (state) {
0 -> "Any" 0 -> "전체"
else -> "$state star${if (state > 1) "s" else ""}" else -> "${state}"
} }
} }
} }
@@ -102,40 +102,40 @@ class PeopleSeparatorFilter :
class WriterPeopleFilter(name: String) : Filter.CheckBox(name, false) class WriterPeopleFilter(name: String) : Filter.CheckBox(name, false)
class WriterPeopleFilterGroup(peoples: List<WriterPeopleFilter>) : class WriterPeopleFilterGroup(peoples: List<WriterPeopleFilter>) :
Filter.Group<WriterPeopleFilter>("Writer", peoples) Filter.Group<WriterPeopleFilter>("작가", peoples)
class PencillerPeopleFilter(name: String) : Filter.CheckBox(name, false) class PencillerPeopleFilter(name: String) : Filter.CheckBox(name, false)
class PencillerPeopleFilterGroup(peoples: List<PencillerPeopleFilter>) : class PencillerPeopleFilterGroup(peoples: List<PencillerPeopleFilter>) :
Filter.Group<PencillerPeopleFilter>("Penciller", peoples) Filter.Group<PencillerPeopleFilter>("펜슬러", peoples)
class InkerPeopleFilter(name: String) : Filter.CheckBox(name, false) class InkerPeopleFilter(name: String) : Filter.CheckBox(name, false)
class InkerPeopleFilterGroup(peoples: List<InkerPeopleFilter>) : class InkerPeopleFilterGroup(peoples: List<InkerPeopleFilter>) :
Filter.Group<InkerPeopleFilter>("Inker", peoples) Filter.Group<InkerPeopleFilter>("잉커", peoples)
class ColoristPeopleFilter(name: String) : Filter.CheckBox(name, false) class ColoristPeopleFilter(name: String) : Filter.CheckBox(name, false)
class ColoristPeopleFilterGroup(peoples: List<ColoristPeopleFilter>) : class ColoristPeopleFilterGroup(peoples: List<ColoristPeopleFilter>) :
Filter.Group<ColoristPeopleFilter>("Colorist", peoples) Filter.Group<ColoristPeopleFilter>("컬러리스트", peoples)
class LettererPeopleFilter(name: String) : Filter.CheckBox(name, false) class LettererPeopleFilter(name: String) : Filter.CheckBox(name, false)
class LettererPeopleFilterGroup(peoples: List<LettererPeopleFilter>) : class LettererPeopleFilterGroup(peoples: List<LettererPeopleFilter>) :
Filter.Group<LettererPeopleFilter>("Letterer", peoples) Filter.Group<LettererPeopleFilter>("레터러", peoples)
class CoverArtistPeopleFilter(name: String) : Filter.CheckBox(name, false) class CoverArtistPeopleFilter(name: String) : Filter.CheckBox(name, false)
class CoverArtistPeopleFilterGroup(peoples: List<CoverArtistPeopleFilter>) : class CoverArtistPeopleFilterGroup(peoples: List<CoverArtistPeopleFilter>) :
Filter.Group<CoverArtistPeopleFilter>("Cover Artist", peoples) Filter.Group<CoverArtistPeopleFilter>("표지 작가", peoples)
class EditorPeopleFilter(name: String) : Filter.CheckBox(name, false) class EditorPeopleFilter(name: String) : Filter.CheckBox(name, false)
class EditorPeopleFilterGroup(peoples: List<EditorPeopleFilter>) : class EditorPeopleFilterGroup(peoples: List<EditorPeopleFilter>) :
Filter.Group<EditorPeopleFilter>("Editor", peoples) Filter.Group<EditorPeopleFilter>("편집자", peoples)
class PublisherPeopleFilter(name: String) : Filter.CheckBox(name, false) class PublisherPeopleFilter(name: String) : Filter.CheckBox(name, false)
class PublisherPeopleFilterGroup(peoples: List<PublisherPeopleFilter>) : class PublisherPeopleFilterGroup(peoples: List<PublisherPeopleFilter>) :
Filter.Group<PublisherPeopleFilter>("Publisher", peoples) Filter.Group<PublisherPeopleFilter>("출판사", peoples)
class CharacterPeopleFilter(name: String) : Filter.CheckBox(name, false) class CharacterPeopleFilter(name: String) : Filter.CheckBox(name, false)
class CharacterPeopleFilterGroup(peoples: List<CharacterPeopleFilter>) : class CharacterPeopleFilterGroup(peoples: List<CharacterPeopleFilter>) :
Filter.Group<CharacterPeopleFilter>("Character", peoples) Filter.Group<CharacterPeopleFilter>("캐릭터", peoples)
class TranslatorPeopleFilter(name: String) : Filter.CheckBox(name, false) class TranslatorPeopleFilter(name: String) : Filter.CheckBox(name, false)
class TranslatorPeopleFilterGroup(peoples: List<TranslatorPeopleFilter>) : class TranslatorPeopleFilterGroup(peoples: List<TranslatorPeopleFilter>) :
Filter.Group<TranslatorPeopleFilter>("Translator", peoples) Filter.Group<TranslatorPeopleFilter>("번역자", peoples)

View File

@@ -586,12 +586,12 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
filter.state.forEach { rangeFilter -> filter.state.forEach { rangeFilter ->
if ((rangeFilter as Filter.Text).state.isNotEmpty()) { if ((rangeFilter as Filter.Text).state.isNotEmpty()) {
when (rangeFilter.name) { when (rangeFilter.name) {
"Min" -> filterV2.addStatement( "Min", "최소" -> filterV2.addStatement(
FilterComparison.GreaterThanEqual, FilterComparison.GreaterThanEqual,
FilterField.ReleaseYear, FilterField.ReleaseYear,
rangeFilter.state, rangeFilter.state,
) )
"Max" -> filterV2.addStatement( "Max", "최대" -> filterV2.addStatement(
FilterComparison.LessThanEqual, FilterComparison.LessThanEqual,
FilterField.ReleaseYear, FilterField.ReleaseYear,
rangeFilter.state, rangeFilter.state,
@@ -653,12 +653,12 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
val included = filter.state val included = filter.state
.filter { it.state == STATE_INCLUDE } .filter { it.state == STATE_INCLUDE }
.mapNotNull { ageFilter -> .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 val excluded = filter.state
.filter { it.state == STATE_EXCLUDE } .filter { it.state == STATE_EXCLUDE }
.mapNotNull { ageFilter -> .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()) { if (included.isNotEmpty()) {
@@ -728,12 +728,12 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
val included = filter.state val included = filter.state
.filter { it.state == STATE_INCLUDE } .filter { it.state == STATE_INCLUDE }
.mapNotNull { languageFilter -> .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 val excluded = filter.state
.filter { it.state == STATE_EXCLUDE } .filter { it.state == STATE_EXCLUDE }
.mapNotNull { languageFilter -> .mapNotNull { languageFilter ->
languagesListMeta.find { it.title == languageFilter.name }?.isoCode languagesListMeta.find { it.title == languageFilter.name || translateLanguage(it.title) == languageFilter.name }?.isoCode
} }
if (included.isNotEmpty()) { if (included.isNotEmpty()) {
@@ -784,7 +784,7 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
is PubStatusFilterGroup -> { is PubStatusFilterGroup -> {
filter.state.forEach { pubStatusFilter -> filter.state.forEach { pubStatusFilter ->
if ((pubStatusFilter as Filter.CheckBox).state) { if ((pubStatusFilter as Filter.CheckBox).state) {
val statusValue = when (pubStatusFilter.name) { val statusValue = when (normalizePublicationStatus(pubStatusFilter.name)) {
"Ongoing" -> 0 "Ongoing" -> 0
"Hiatus" -> 1 "Hiatus" -> 1
"Completed" -> 2 "Completed" -> 2
@@ -2078,8 +2078,8 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
// Release year filter // Release year filter
ReleaseYearRangeGroup( ReleaseYearRangeGroup(
listOf( listOf(
ReleaseYearRange("Min"), ReleaseYearRange("최소"),
ReleaseYearRange("Max"), ReleaseYearRange("최대"),
), ),
), ),
@@ -2087,21 +2087,64 @@ class Kavita(private val suffix: String = "") : ConfigurableSource, UnmeteredSou
TagFilterGroup(tags.map { TagFilter(it) }), TagFilterGroup(tags.map { TagFilter(it) }),
CollectionFilterGroup(collections.map { CollectionFilter(it) }), CollectionFilterGroup(collections.map { CollectionFilter(it) }),
LibrariesFilterGroup(libraries.map { LibraryFilter(it) }), LibrariesFilterGroup(libraries.map { LibraryFilter(it) }),
LanguageFilterGroup(languages.map { LanguageFilter(it) }), LanguageFilterGroup(languages.map { LanguageFilter(translateLanguage(it)) }),
PubStatusFilterGroup(pubStatus.map { PubStatusFilter(it) }), PubStatusFilterGroup(pubStatus.map { PubStatusFilter(translatePublicationStatus(it)) }),
AgeRatingFilterGroup(ageRatings.map { AgeRatingFilter(it) }), AgeRatingFilterGroup(ageRatings.map { AgeRatingFilter(translateAgeRating(it)) }),
UserRating(), UserRating(),
UserRatingSeparator(), UserRatingSeparator(),
// Special filters section // Special filters section
Filter.Header(intl["filters_special"]), Filter.Header("특수 필터"),
SpecialListFilter(intl["filters_special_list"]), SpecialListFilter("특수 목록"),
SmartFiltersFilter(smartFilters), 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 { override fun getFilterList(): FilterList {
return getFilterList( return getFilterList(
genres = genresListMeta.map { it.title }, genres = genresListMeta.map { it.title },

View File

@@ -9,7 +9,7 @@ object KavitaConstants {
const val SPECIAL_NUMBER_OFFSET = 10000000000f const val SPECIAL_NUMBER_OFFSET = 10000000000f
const val customSourceNamePref = "customSourceName" const val customSourceNamePref = "customSourceName"
const val noSmartFilterSelected = "No smart filter loaded" const val noSmartFilterSelected = "스마트 필터 없음"
// Template formatting preferences // Template formatting preferences
const val CHAPTER_TITLE_FORMAT_DEFAULT = "\$CleanTitle" const val CHAPTER_TITLE_FORMAT_DEFAULT = "\$CleanTitle"