diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8ab61e8f..b3e1db9c0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -257,16 +257,6 @@ dependencies { } ``` -#### I18n library - -[`lib-i18n`](https://github.com/tachiyomiorg/tachiyomi-extensions/tree/master/lib/i18n) is a library for handling internationalization in the sources. It allows loading `.properties` files with messages located under the `res/raw` folder of each extension, that can be used to translate strings under the source. - -```gradle -dependencies { - implementation(project(':lib-i18n')) -} -``` - #### Additional dependencies If you find yourself needing additional functionality, you can add more dependencies to your `build.gradle` file. diff --git a/lib/i18n/build.gradle.kts b/lib/i18n/build.gradle.kts deleted file mode 100644 index 5eaa29645..000000000 --- a/lib/i18n/build.gradle.kts +++ /dev/null @@ -1,21 +0,0 @@ -plugins { - id("com.android.library") - kotlin("android") -} - -android { - compileSdk = AndroidConfig.compileSdk - - defaultConfig { - minSdk = AndroidConfig.minSdk - targetSdk = AndroidConfig.targetSdk - } -} - -repositories { - mavenCentral() -} - -dependencies { - compileOnly(libs.kotlin.stdlib) -} diff --git a/lib/i18n/src/main/AndroidManifest.xml b/lib/i18n/src/main/AndroidManifest.xml deleted file mode 100644 index 04965588a..000000000 --- a/lib/i18n/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/lib/i18n/src/main/java/eu/kanade/tachiyomi/lib/i18n/Intl.kt b/lib/i18n/src/main/java/eu/kanade/tachiyomi/lib/i18n/Intl.kt deleted file mode 100644 index 85132dfa5..000000000 --- a/lib/i18n/src/main/java/eu/kanade/tachiyomi/lib/i18n/Intl.kt +++ /dev/null @@ -1,83 +0,0 @@ -package eu.kanade.tachiyomi.lib.i18n - -import java.io.InputStreamReader -import java.text.Collator -import java.util.Locale -import java.util.PropertyResourceBundle - -/** - * A simple wrapper to make internationalization easier to use in sources. - * - * Message files should be put at the `/res/raw` folder, with the name - * `messages_{iso_639_1}.properties`, where `iso_639_1` should be using - * snake case and be in lowercase. - * - * To edit the strings, use the official JetBrain's - * [Resource Bundle Editor plugin](https://plugins.jetbrains.com/plugin/17035-resource-bundle-editor). - * - * Make sure to configure Android Studio to save Properties files as UTF-8 as well. - * You can refer to this [documentation](https://www.jetbrains.com/help/idea/properties-files.html#1cbc434e) - * on how to do so. - */ -class Intl( - private val language: String, - private val baseLanguage: String, - private val availableLanguages: Set, - private val classLoader: ClassLoader, - private val createMessageFileName: (String) -> String = { createDefaultMessageFileName(it) } -) { - - val chosenLanguage: String = when (language) { - in availableLanguages -> language - else -> baseLanguage - } - - private val locale: Locale = Locale.forLanguageTag(chosenLanguage) - - val collator: Collator = Collator.getInstance(locale) - - private val baseBundle: PropertyResourceBundle by lazy { createBundle(baseLanguage) } - - private val bundle: PropertyResourceBundle by lazy { - if (chosenLanguage == baseLanguage) baseBundle else createBundle(chosenLanguage) - } - - /** - * Returns the string from the message file. If the [key] is not present - * in the current language, the English value will be returned. If the [key] - * is also not present in English, the [key] surrounded by brackets will be returned. - */ - operator fun get(key: String): String = when { - bundle.containsKey(key) -> bundle.getString(key) - baseBundle.containsKey(key) -> baseBundle.getString(key) - else -> "[$key]" - } - - fun languageDisplayName(localeCode: String): String = - Locale.forLanguageTag(localeCode) - .getDisplayName(locale) - .replaceFirstChar { if (it.isLowerCase()) it.titlecase(locale) else it.toString() } - - /** - * Creates a [PropertyResourceBundle] instance from the language specified. - * The expected message file will be loaded from the `res/raw`. - * - * The [PropertyResourceBundle] is used directly instead of [java.util.ResourceBundle] - * because the later has issues with UTF-8 files in Java 8, which would need - * the message files to be saved in ISO-8859-1, making the file readability bad. - */ - private fun createBundle(lang: String): PropertyResourceBundle { - val fileName = createMessageFileName(lang) - val fileContent = classLoader.getResourceAsStream(fileName) - - return PropertyResourceBundle(InputStreamReader(fileContent, "UTF-8")) - } - - companion object { - fun createDefaultMessageFileName(lang: String): String { - val langSnakeCase = lang.replace("-", "_").lowercase() - - return "res/raw/messages_$langSnakeCase.properties" - } - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index 9d8ac45a2..025aa944a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,6 @@ include(":core") -listOf("dataimage", "unpacker", "cryptoaes", "textinterceptor", "synchrony", "i18n").forEach { +listOf("dataimage", "unpacker", "cryptoaes", "textinterceptor", "synchrony").forEach { include(":lib-$it") project(":lib-$it").projectDir = File("lib/$it") } diff --git a/src/all/mangadex/build.gradle b/src/all/mangadex/build.gradle index d28b63e97..af4c1d2e2 100644 --- a/src/all/mangadex/build.gradle +++ b/src/all/mangadex/build.gradle @@ -6,12 +6,8 @@ ext { extName = 'MangaDex' pkgNameSuffix = 'all.mangadex' extClass = '.MangaDexFactory' - extVersionCode = 182 + extVersionCode = 183 isNsfw = true } -dependencies { - implementation(project(":lib-i18n")) -} - apply from: "$rootDir/common.gradle" diff --git a/src/all/mangadex/res/raw/messages_en.properties b/src/all/mangadex/res/raw/messages_en.properties deleted file mode 100644 index c411bb60a..000000000 --- a/src/all/mangadex/res/raw/messages_en.properties +++ /dev/null @@ -1,145 +0,0 @@ -alternative_titles=Alternative titles: -alternative_titles_in_description=Alternative titles in description -alternative_titles_in_description_summary=Include a manga's alternative titles at the end of its description -block_group_by_uuid=Block groups by UUID -block_group_by_uuid_summary=Chapters from blocked groups will not show up in Latest or Manga feed. Enter as a Comma-separated list of group UUIDs -block_uploader_by_uuid=Block uploader by UUID -block_uploader_by_uuid_summary=Chapters from blocked uploaders will not show up in Latest or Manga feed. Enter as a Comma-separated list of uploader UUIDs -content=Content -content_gore=Gore -content_rating=Content rating -content_rating_erotica=Erotica -content_rating_genre=Content rating: %s -content_rating_pornographic=Pornographic -content_rating_safe=Safe -content_rating_suggestive=Suggestive -content_sexual_violence=Sexual violence -cover_quality=Cover quality -cover_quality_low=Low -cover_quality_medium=Medium -cover_quality_original=Original -data_saver=Data saver -data_saver_summary=Enables smaller, more compressed images -excluded_tags_mode=Excluded tags mode -filter_original_languages=Filter original languages -filter_original_languages_summary=Only show content that was originally published in the selected languages in both latest and browse -format=Format -format_adaptation=Adaptation -format_anthology=Anthology -format_award_winning=Award winning -format_doujinshi=Doujinshi -format_fan_colored=Fan colored -format_full_color=Full color -format_long_strip=Long strip -format_official_colored=Official colored -format_oneshot=Oneshot -format_user_created=User created -format_web_comic=Web comic -format_yonkoma=4-Koma -genre=Genre -genre_action=Action -genre_adventure=Adventure -genre_boys_love=Boy's Love -genre_comedy=Comedy -genre_crime=Crime -genre_drama=Drama -genre_fantasy=Fantasy -genre_girls_love=Girl's Love -genre_historical=Historical -genre_horror=Horror -genre_isekai=Isekai -genre_magical_girls=Magical girls -genre_mecha=Mecha -genre_medical=Medical -genre_mystery=Mystery -genre_philosophical=Philosophical -genre_romance=Romance -genre_sci_fi=Sci-Fi -genre_slice_of_life=Slice of life -genre_sports=Sports -genre_superhero=Superhero -genre_thriller=Thriller -genre_tragedy=Tragedy -genre_wuxia=Wuxia -has_available_chapters=Has available chapters -included_tags_mode=Included tags mode -invalid_author_id=Not a valid author ID -invalid_group_id=Not a valid group ID -invalid_uuids=The text contains invalid UUIDs -migrate_warning=Migrate this entry from MangaDex to MangaDex to update it -mode_and=And -mode_or=Or -no_group=No Group -no_series_in_list=No series in the list -original_language=Original language -original_language_filter_chinese=%s (Manhua) -original_language_filter_japanese=%s (Manga) -original_language_filter_korean=%s (Manhwa) -publication_demographic=Publication demographic -publication_demographic_josei=Josei -publication_demographic_none=None -publication_demographic_seinen=Seinen -publication_demographic_shoujo=Shoujo -publication_demographic_shounen=Shounen -sort=Sort -sort_alphabetic=Alphabetic -sort_chapter_uploaded_at=Chapter uploaded at -sort_content_created_at=Content created at -sort_content_info_updated_at=Content info updated at -sort_number_of_follows=Number of follows -sort_rating=Rating -sort_relevance=Relevance -sort_year=Year -standard_content_rating=Default content rating -standard_content_rating_summary=Show content with the selected ratings by default -standard_https_port=Use HTTPS port 443 only -standard_https_port_summary=Enable to only request image servers that use port 443. This allows users with stricter firewall restrictions to access MangaDex images -status=Status -status_cancelled=Cancelled -status_completed=Completed -status_hiatus=Hiatus -status_ongoing=Ongoing -tags_mode=Tags mode -theme=Theme -theme_aliens=Aliens -theme_animals=Animals -theme_cooking=Cooking -theme_crossdressing=Crossdressing -theme_delinquents=Delinquents -theme_demons=Demons -theme_gender_swap=Genderswap -theme_ghosts=Ghosts -theme_gyaru=Gyaru -theme_harem=Harem -theme_incest=Incest -theme_loli=Loli -theme_mafia=Mafia -theme_magic=Magic -theme_martial_arts=Martial arts -theme_military=Military -theme_monster_girls=Monster girls -theme_monsters=Monsters -theme_music=Music -theme_ninja=Ninja -theme_office_workers=Office workers -theme_police=Police -theme_post_apocalyptic=Post-apocalyptic -theme_psychological=Psychological -theme_reincarnation=Reincarnation -theme_reverse_harem=Reverse harem -theme_samurai=Samurai -theme_school_life=School life -theme_shota=Shota -theme_supernatural=Supernatural -theme_survival=Survival -theme_time_travel=Time travel -theme_traditional_games=Traditional games -theme_vampires=Vampires -theme_video_games=Video games -theme_villainess=Vilania -theme_virtual_reality=Virtual reality -theme_zombies=Zombies -try_using_first_volume_cover=Attempt to use the first volume cover as cover -try_using_first_volume_cover_summary=May need to manually refresh entries already in library. Otherwise, clear database to have new covers to show up. -unable_to_process_chapter_request=Unable to process Chapter request. HTTP code: %d -uploaded_by=Uploaded by %s \ No newline at end of file diff --git a/src/all/mangadex/res/raw/messages_es.properties b/src/all/mangadex/res/raw/messages_es.properties deleted file mode 100644 index fc1dc27ab..000000000 --- a/src/all/mangadex/res/raw/messages_es.properties +++ /dev/null @@ -1,108 +0,0 @@ -block_group_by_uuid=Bloquear grupos por UUID -block_group_by_uuid_summary=Los capítulos de los grupos bloqueados no aparecerán en Recientes o en el Feed de mangas. Introduce una coma para separar la lista de UUIDs -block_uploader_by_uuid=Bloquear uploader por UUID -block_uploader_by_uuid_summary=Los capítulos de los uploaders bloqueados no aparecerán en Recientes o en el Feed de mangas. Introduce una coma para separar la lista de UUIDs -content=Contenido -content_rating=Clasificación de contenido -content_rating_erotica=Erótico -content_rating_genre=Clasificación: %s -content_rating_pornographic=Pornográfico -content_rating_safe=Seguro -content_rating_suggestive=Sugestivo -content_sexual_violence=Violencia sexual -cover_quality=Calidad de la portada -cover_quality_low=Bajo -cover_quality_medium=Medio -data_saver=Ahorro de datos -data_saver_summary=Utiliza imágenes más pequeñas y más comprimidas -excluded_tags_mode=Modo de etiquetas excluidas -filter_original_languages=Filtrar por lenguajes -filter_original_languages_summary=Muestra solo el contenido publicado en los idiomas seleccionados en recientes y en la búsqueda -format=Formato -format_adaptation=Adaptación -format_anthology=Antología -format_award_winning=Ganador de premio -format_fan_colored=Coloreado por fans -format_full_color=Todo a color -format_long_strip=Tira larga -format_official_colored=Coloreo oficial -format_user_created=Creado por usuario -genre=Genero -genre_action=Acción -genre_adventure=Aventura -genre_comedy=Comedia -genre_crime=Crimen -genre_fantasy=Fantasia -genre_historical=Histórico -genre_magical_girls=Chicas mágicas -genre_medical=Medico -genre_mystery=Misterio -genre_philosophical=Filosófico -genre_sci_fi=Ciencia ficción -genre_slice_of_life=Recuentos de la vida -genre_sports=Deportes -genre_superhero=Superhéroes -genre_tragedy=Tragedia -has_available_chapters=Tiene capítulos disponibles -included_tags_mode=Modo de etiquetas incluidas -invalid_author_id=ID de autor inválida -invalid_group_id=ID de grupo inválida -migrate_warning=Migre la entrada MangaDex a MangaDex para actualizarla -mode_and=Y -mode_or=O -no_group=Sin grupo -no_series_in_list=No hay series en la lista -original_language=Lenguaje original -publication_demographic=Demografía -publication_demographic_none=Ninguna -sort=Ordenar -sort_alphabetic=Alfabeticamente -sort_chapter_uploaded_at=Capítulo subido en -sort_content_created_at=Contenido creado en -sort_content_info_updated_at=Información del contenido actualizada en -sort_number_of_follows=Número de seguidores -sort_rating=Calificación -sort_relevance=Relevancia -sort_year=Año -standard_content_rating=Clasificación de contenido por defecto -standard_content_rating_summary=Muestra el contenido con la clasificación de contenido seleccionada por defecto -standard_https_port=Utilizar el puerto 443 de HTTPS -standard_https_port_summary=Habilite esta opción solicitar las imágenes a los servidores que usan el puerto 443. Esto permite a los usuarios con restricciones estrictas de firewall acceder a las imagenes en MangaDex -status=Estado -status_cancelled=Cancelado -status_completed=Completado -status_hiatus=Pausado -status_ongoing=Publicandose -tags_mode=Modo de etiquetas -theme=Tema -theme_aliens=Alienígenas -theme_animals=Animales -theme_cooking=Cocina -theme_crossdressing=Travestismo -theme_delinquents=Delincuentes -theme_demons=Demonios -theme_gender_swap=Cambio de sexo -theme_ghosts=Fantasmas -theme_incest=Incesto -theme_magic=Magia -theme_martial_arts=Artes marciales -theme_military=Militar -theme_monster_girls=Chicas monstruo -theme_monsters=Monstruos -theme_music=Musica -theme_office_workers=Oficinistas -theme_police=Policial -theme_post_apocalyptic=Post-apocalíptico -theme_psychological=Psicológico -theme_reincarnation=Reencarnación -theme_reverse_harem=Harem inverso -theme_school_life=Vida escolar -theme_supernatural=Sobrenatural -theme_survival=Supervivencia -theme_time_travel=Viaje en el tiempo -theme_traditional_games=Juegos tradicionales -theme_vampires=Vampiros -theme_villainess=Villana -theme_virtual_reality=Realidad virtual -unable_to_process_chapter_request=No se ha podido procesar la solicitud del capítulo. Código HTTP: %d -uploaded_by=Subido por %s \ No newline at end of file diff --git a/src/all/mangadex/res/raw/messages_pt_br.properties b/src/all/mangadex/res/raw/messages_pt_br.properties deleted file mode 100644 index f0d66530b..000000000 --- a/src/all/mangadex/res/raw/messages_pt_br.properties +++ /dev/null @@ -1,118 +0,0 @@ -alternative_titles=Títulos alternativos: -alternative_titles_in_description=Títulos alternativos na descrição -alternative_titles_in_description_summary=Inclui os títulos alternativos das séries no final de cada descrição -block_group_by_uuid=Bloquear grupos por UUID -block_group_by_uuid_summary=Capítulos de grupos bloqueados não irão aparecer no feed de Recentes ou Mangás. Digite uma lista de UUIDs dos grupos separados por vírgulas -block_uploader_by_uuid=Bloquear uploaders por UUID -block_uploader_by_uuid_summary=Capítulos de usuários bloqueados não irão aparecer no feed de Recentes ou Mangás. Digite uma lista de UUIDs dos usuários separados por vírgulas -content=Conteúdo -content_rating=Classificação de conteúdo -content_rating_erotica=Erótico -content_rating_genre=Classificação: %s -content_rating_pornographic=Pornográfico -content_rating_safe=Seguro -content_rating_suggestive=Sugestivo -content_sexual_violence=Violência sexual -cover_quality=Qualidade da capa -cover_quality_low=Baixa -cover_quality_medium=Média -data_saver=Economia de dados -data_saver_summary=Utiliza imagens menores e mais compactadas -excluded_tags_mode=Modo de exclusão de tags -filter_original_languages=Filtrar os idiomas originais -filter_original_languages_summary=Mostra somente conteúdos que foram publicados originalmente nos idiomas selecionados nas seções de recentes e navegar -format=Formato -format_adaptation=Adaptação -format_anthology=Antologia -format_award_winning=Premiado -format_fan_colored=Colorizado por fãs -format_full_color=Colorido -format_long_strip=Vertical -format_official_colored=Colorizado oficialmente -format_user_created=Criado por usuários -genre=Gênero -genre_action=Ação -genre_adventure=Aventura -genre_comedy=Comédia -genre_crime=Crime -genre_fantasy=Fantasia -genre_historical=Histórico -genre_magical_girls=Garotas mágicas -genre_medical=Médico -genre_mystery=Mistério -genre_philosophical=Filosófico -genre_sci_fi=Ficção científica -genre_slice_of_life=Cotidiano -genre_sports=Esportes -genre_superhero=Super-heroi -genre_tragedy=Tragédia -has_available_chapters=Há capítulos disponíveis -included_tags_mode=Modo de inclusão de tags -invalid_author_id=ID do autor inválido -invalid_group_id=ID do grupo inválido -invalid_uuids=O texto contém UUIDs inválidos -migrate_warning=Migre esta entrada do MangaDex para o MangaDex para atualizar -mode_and=E -mode_or=Ou -no_group=Sem grupo -no_series_in_list=Sem séries na lista -original_language=Idioma original -original_language_filter_japanese=%s (Mangá) -publication_demographic=Demografia da publicação -publication_demographic_none=Nenhuma -sort=Ordenar -sort_alphabetic=Alfabeticamente -sort_chapter_uploaded_at=Upload do capítulo -sort_content_created_at=Criação do conteúdo -sort_content_info_updated_at=Atualização das informações -sort_number_of_follows=Número de seguidores -sort_rating=Nota -sort_relevance=Relevância -sort_year=Ano de lançamento -standard_content_rating=Classificação de conteúdo padrão -standard_content_rating_summary=Mostra os conteúdos com as classificações selecionadas por padrão -standard_https_port=Utilizar somente a porta 443 do HTTPS -standard_https_port_summary=Ative para fazer requisições em somente servidores de imagem que usem a porta 443. Isso permite com que usuários com regras mais restritas de firewall possam acessar as imagens do MangaDex. -status=Estado -status_cancelled=Cancelado -status_completed=Completo -status_hiatus=Hiato -status_ongoing=Em andamento -tags_mode=Modo das tags -theme=Tema -theme_aliens=Alienígenas -theme_animals=Animais -theme_cooking=Culinária -theme_delinquents=Delinquentes -theme_demons=Demônios -theme_gender_swap=Troca de gêneros -theme_ghosts=Fantasmas -theme_harem=Harém -theme_incest=Incesto -theme_mafia=Máfia -theme_magic=Magia -theme_martial_arts=Artes marciais -theme_military=Militar -theme_monster_girls=Garotas monstro -theme_monsters=Monstros -theme_music=Musical -theme_office_workers=Funcionários de escritório -theme_police=Policial -theme_post_apocalyptic=Pós-apocalíptico -theme_psychological=Psicológico -theme_reincarnation=Reencarnação -theme_reverse_harem=Harém reverso -theme_school_life=Vida escolar -theme_supernatural=Sobrenatural -theme_survival=Sobrevivência -theme_time_travel=Viagem no tempo -theme_traditional_games=Jogos tradicionais -theme_vampires=Vampiros -theme_video_games=Videojuegos -theme_villainess=Villainess -theme_virtual_reality=Realidade virtual -theme_zombies=Zumbis -try_using_first_volume_cover=Tentar usar a capa do primeiro volume como capa -try_using_first_volume_cover_summary=Pode ser necessário atualizar os itens já adicionados na biblioteca. Alternativamente, limpe o banco de dados para as novas capas aparecerem. -unable_to_process_chapter_request=Não foi possível processar a requisição do capítulo. Código HTTP: %d -uploaded_by=Enviado por %s \ No newline at end of file diff --git a/src/all/mangadex/res/raw/messages_ru.properties b/src/all/mangadex/res/raw/messages_ru.properties deleted file mode 100644 index fbc49b49f..000000000 --- a/src/all/mangadex/res/raw/messages_ru.properties +++ /dev/null @@ -1,138 +0,0 @@ -block_group_by_uuid=Заблокировать группы по UUID -block_group_by_uuid_summary=Главы от заблокированных групп не будут отображаться в последних обновлениях и в списке глав тайтла. Введите через запятую список UUID групп. -block_uploader_by_uuid=Заблокировать загрузчика по UUID -block_uploader_by_uuid_summary=Главы от заблокированных загрузчиков не будут отображаться в последних обновлениях и в списке глав тайтла. Введите через запятую список UUID загрузчиков. -content=Неприемлемый контент -content_gore=Жестокость -content_rating=Рейтинг контента -content_rating_erotica=Эротический -content_rating_genre=Рейтинг контента: %s -content_rating_pornographic=Порнографический -content_rating_safe=Безопасный -content_rating_suggestive=Намекающий -content_sexual_violence=Сексуальное насилие -cover_quality=Качество обложки -cover_quality_low=Низкое -cover_quality_medium=Среднее -cover_quality_original=Оригинальное -data_saver=Экономия трафика -data_saver_summary=Использует меньшие по размеру, сжатые изображения -excluded_tags_mode=Исключая -filter_original_languages=Фильтр по языку оригинала -filter_original_languages_summary=Показывать тайтлы которые изначально были выпущены только в выбранных языках в последних обновлениях и при поиске -format=Формат -format_adaptation=Адаптация -format_anthology=Антология -format_award_winning=Отмеченный наградами -format_doujinshi=Додзинси -format_fan_colored=Раскрашенная фанатами -format_full_color=В цвете -format_long_strip=Веб -format_official_colored=Официально раскрашенная -format_oneshot=Сингл -format_user_created=Созданная пользователями -format_web_comic=Веб-комикс -format_yonkoma=Ёнкома -genre=Жанр -genre_action=Боевик -genre_adventure=Приключения -genre_boys_love=BL -genre_comedy=Комедия -genre_crime=Криминал -genre_drama=Драма -genre_fantasy=Фэнтези -genre_girls_love=GL -genre_historical=История -genre_horror=Ужасы -genre_isekai=Исекай -genre_magical_girls=Махо-сёдзё -genre_mecha=Меха -genre_medical=Медицина -genre_mystery=Мистика -genre_philosophical=Философия -genre_romance=Романтика -genre_sci_fi=Научная фантастика -genre_slice_of_life=Повседневность -genre_sports=Спорт -genre_superhero=Супергерои -genre_thriller=Триллер -genre_tragedy=Трагедия -genre_wuxia=Культивация -has_available_chapters=Есть главы -included_tags_mode=Включая -invalid_author_id=Недействительный ID автора -invalid_group_id=Недействительный ID группы -mode_and=И -mode_or=Или -no_group=Нет группы -no_series_in_list=Лист пуст -original_language=Язык оригинала -original_language_filter_chinese=%s (Манхуа) -original_language_filter_japanese=%s (Манга) -original_language_filter_korean=%s (Манхва) -publication_demographic=Целевая аудитория -publication_demographic_josei=Дзёсэй -publication_demographic_none=Нет -publication_demographic_seinen=Сэйнэн -publication_demographic_shoujo=Сёдзё -publication_demographic_shounen=Сёнэн -sort=Сортировать по -sort_alphabetic=Алфавиту -sort_chapter_uploaded_at=Загруженной главе -sort_content_created_at=По дате создания -sort_content_info_updated_at=По дате обновления -sort_number_of_follows=Количеству фолловеров -sort_rating=Популярности -sort_relevance=Лучшему соответствию -sort_year=Год -standard_content_rating=Рейтинг контента по умолчанию -standard_content_rating_summary=Показывать контент с выбранным рейтингом по умолчанию -standard_https_port=Использовать только HTTPS порт 443 -standard_https_port_summary=Запрашивает изображения только с серверов которые используют порт 443. Это позволяет пользователям со строгими правилами брандмауэра загружать изображения с MangaDex. -status=Статус -status_cancelled=Отменён -status_completed=Завершён -status_hiatus=Приостановлен -status_ongoing=Онгоинг -tags_mode=Режим поиска -theme=Теги -theme_aliens=Инопланетяне -theme_animals=Животные -theme_cooking=Животные -theme_crossdressing=Кроссдрессинг -theme_delinquents=Хулиганы -theme_demons=Демоны -theme_gender_swap=Смена гендера -theme_ghosts=Призраки -theme_gyaru=Гяру -theme_harem=Гарем -theme_incest=Инцест -theme_loli=Лоли -theme_mafia=Мафия -theme_magic=Магия -theme_martial_arts=Боевые исскуства -theme_military=Военные -theme_monster_girls=Монстродевушки -theme_monsters=Монстры -theme_music=Музыка -theme_ninja=Ниндзя -theme_office_workers=Офисные работники -theme_police=Полиция -theme_post_apocalyptic=Постапокалиптика -theme_psychological=Психология -theme_reincarnation=Реинкарнация -theme_reverse_harem=Обратный гарем -theme_samurai=Самураи -theme_school_life=Школа -theme_shota=Шота -theme_supernatural=Сверхъестественное -theme_survival=Выживание -theme_time_travel=Путешествие во времени -theme_traditional_games=Путешествие во времени -theme_vampires=Вампиры -theme_video_games=Видеоигры -theme_villainess=Злодейка -theme_virtual_reality=Виртуальная реальность -theme_zombies=Зомби -unable_to_process_chapter_request=Не удалось обработать ссылку на главу. Ошибка: %d -uploaded_by=Загрузил %s \ No newline at end of file diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MDConstants.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MDConstants.kt index 95eca0a26..b7f8eaa11 100644 --- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MDConstants.kt +++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MDConstants.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.extension.all.mangadex -import eu.kanade.tachiyomi.lib.i18n.Intl import java.text.SimpleDateFormat import java.util.Locale import java.util.TimeZone @@ -50,8 +49,8 @@ object MDConstants { return "${coverQualityPref}_$dexLang" } - fun getCoverQualityPreferenceEntries(intl: Intl) = - arrayOf(intl["cover_quality_original"], intl["cover_quality_medium"], intl["cover_quality_low"]) + fun getCoverQualityPreferenceEntries(intl: MangaDexIntl) = + arrayOf(intl.coverQualityOriginal, intl.coverQualityMedium, intl.coverQualityLow) fun getCoverQualityPreferenceEntryValues() = arrayOf("", ".512.jpg", ".256.jpg") diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt index 95f5f9183..2bb9a1495 100644 --- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt +++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDex.kt @@ -82,10 +82,9 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St .addQueryParameter("includes[]", MDConstants.coverArt) .addQueryParameter("contentRating[]", preferences.contentRating) .addQueryParameter("originalLanguage[]", preferences.originalLanguages) - .build() return GET( - url = url, + url = url.build().toString(), headers = headers, cache = CacheControl.FORCE_NETWORK, ) @@ -171,9 +170,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St .addQueryParameter("excludedUploaders[]", preferences.blockedUploaders) .addQueryParameter("includeFuturePublishAt", "0") .addQueryParameter("includeEmptyPages", "0") - .build() - return GET(url, headers, CacheControl.FORCE_NETWORK) + return GET(url.build().toString(), headers, CacheControl.FORCE_NETWORK) } // Search manga section @@ -220,7 +218,7 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St .asObservable() .map { response -> if (response.isSuccessful.not()) { - throw Exception(helper.intl["unable_to_process_chapter_request"].format(response.code)) + throw Exception(helper.intl.unableToProcessChapterRequest(response.code)) } response.parseAs().data!!.relationships @@ -251,7 +249,7 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St query.startsWith(MDConstants.prefixGrpSearch) -> { val groupId = query.removePrefix(MDConstants.prefixGrpSearch) if (!helper.containsUuid(groupId)) { - throw Exception(helper.intl["invalid_group_id"]) + throw Exception(helper.intl.invalidGroupId) } tempUrl.addQueryParameter("group", groupId) @@ -260,7 +258,7 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St query.startsWith(MDConstants.prefixAuthSearch) -> { val authorId = query.removePrefix(MDConstants.prefixAuthSearch) if (!helper.containsUuid(authorId)) { - throw Exception(helper.intl["invalid_author_id"]) + throw Exception(helper.intl.invalidAuthorId) } tempUrl.addQueryParameter("authorOrArtist", authorId) @@ -296,7 +294,7 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St val amount = listDtoFiltered.count() if (amount < 1) { - throw Exception(helper.intl["no_series_in_list"]) + throw Exception(helper.intl.noSeriesInList) } val minIndex = (page - 1) * MDConstants.mangaLimit @@ -313,7 +311,7 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St url.addQueryParameter("ids[]", ids) - val mangaRequest = GET(url.build(), headers, CacheControl.FORCE_NETWORK) + val mangaRequest = GET(url.build().toString(), headers, CacheControl.FORCE_NETWORK) val mangaResponse = client.newCall(mangaRequest).execute() val mangaList = searchMangaListParse(mangaResponse) @@ -363,9 +361,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St MDConstants.defaultBlockedGroups + preferences.blockedGroups, ) .addQueryParameter("excludedUploaders[]", preferences.blockedUploaders) - .build() - return GET(url, headers, CacheControl.FORCE_NETWORK) + return GET(url.build().toString(), headers, CacheControl.FORCE_NETWORK) } // Manga Details section @@ -385,16 +382,15 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St */ override fun mangaDetailsRequest(manga: SManga): Request { if (!helper.containsUuid(manga.url.trim())) { - throw Exception(helper.intl["migrate_warning"]) + throw Exception(helper.intl.migrateWarning) } val url = (MDConstants.apiUrl + manga.url).toHttpUrl().newBuilder() .addQueryParameter("includes[]", MDConstants.coverArt) .addQueryParameter("includes[]", MDConstants.author) .addQueryParameter("includes[]", MDConstants.artist) - .build() - return GET(url, headers, CacheControl.FORCE_NETWORK) + return GET(url.build().toString(), headers, CacheControl.FORCE_NETWORK) } override fun mangaDetailsParse(response: Response): SManga { @@ -457,7 +453,7 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St .addQueryParameter("locales[]", locales.toSet()) .addQueryParameter("limit", limit.toString()) .addQueryParameter("offset", "0") - .build() + .toString() val result = runCatching { client.newCall(GET(apiUrl, headers)).execute().parseAs().data @@ -486,7 +482,7 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St */ override fun chapterListRequest(manga: SManga): Request { if (!helper.containsUuid(manga.url)) { - throw Exception(helper.intl["migrate_warning"]) + throw Exception(helper.intl.migrateWarning) } return paginatedChapterListRequest(helper.getUUIDFromUrl(manga.url), 0) @@ -503,9 +499,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St .addQueryParameter("contentRating[]", "pornographic") .addQueryParameter("excludedGroups[]", preferences.blockedGroups) .addQueryParameter("excludedUploaders[]", preferences.blockedUploaders) - .build() - return GET(url, headers, CacheControl.FORCE_NETWORK) + return GET(url.build().toString(), headers, CacheControl.FORCE_NETWORK) } override fun chapterListParse(response: Response): List { @@ -547,7 +542,7 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St override fun pageListRequest(chapter: SChapter): Request { if (!helper.containsUuid(chapter.url)) { - throw Exception(helper.intl["migrate_warning"]) + throw Exception(helper.intl.migrateWarning) } val chapterId = chapter.url.substringAfter("/chapter/") @@ -591,7 +586,7 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St override fun setupPreferenceScreen(screen: PreferenceScreen) { val coverQualityPref = ListPreference(screen.context).apply { key = MDConstants.getCoverQualityPreferenceKey(dexLang) - title = helper.intl["cover_quality"] + title = helper.intl.coverQuality entries = MDConstants.getCoverQualityPreferenceEntries(helper.intl) entryValues = MDConstants.getCoverQualityPreferenceEntryValues() setDefaultValue(MDConstants.getCoverQualityPreferenceDefaultValue()) @@ -610,8 +605,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St val tryUsingFirstVolumeCoverPref = SwitchPreferenceCompat(screen.context).apply { key = MDConstants.getTryUsingFirstVolumeCoverPrefKey(dexLang) - title = helper.intl["try_using_first_volume_cover"] - summary = helper.intl["try_using_first_volume_cover_summary"] + title = helper.intl.tryUsingFirstVolumeCover + summary = helper.intl.tryUsingFirstVolumeCoverSummary setDefaultValue(MDConstants.tryUsingFirstVolumeCoverDefault) setOnPreferenceChangeListener { _, newValue -> @@ -625,8 +620,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St val dataSaverPref = SwitchPreferenceCompat(screen.context).apply { key = MDConstants.getDataSaverPreferenceKey(dexLang) - title = helper.intl["data_saver"] - summary = helper.intl["data_saver_summary"] + title = helper.intl.dataSaver + summary = helper.intl.dataSaverSummary setDefaultValue(false) setOnPreferenceChangeListener { _, newValue -> @@ -640,8 +635,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St val standardHttpsPortPref = SwitchPreferenceCompat(screen.context).apply { key = MDConstants.getStandardHttpsPreferenceKey(dexLang) - title = helper.intl["standard_https_port"] - summary = helper.intl["standard_https_port_summary"] + title = helper.intl.standardHttpsPort + summary = helper.intl.standardHttpsPortSummary setDefaultValue(false) setOnPreferenceChangeListener { _, newValue -> @@ -655,13 +650,13 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St val contentRatingPref = MultiSelectListPreference(screen.context).apply { key = MDConstants.getContentRatingPrefKey(dexLang) - title = helper.intl["standard_content_rating"] - summary = helper.intl["standard_content_rating_summary"] + title = helper.intl.standardContentRating + summary = helper.intl.standardContentRatingSummary entries = arrayOf( - helper.intl["content_rating_safe"], - helper.intl["content_rating_suggestive"], - helper.intl["content_rating_erotica"], - helper.intl["content_rating_pornographic"], + helper.intl.contentRatingSafe, + helper.intl.contentRatingSuggestive, + helper.intl.contentRatingErotica, + helper.intl.contentRatingPornographic, ) entryValues = arrayOf( MDConstants.contentRatingPrefValSafe, @@ -682,8 +677,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St val originalLanguagePref = MultiSelectListPreference(screen.context).apply { key = MDConstants.getOriginalLanguagePrefKey(dexLang) - title = helper.intl["filter_original_languages"] - summary = helper.intl["filter_original_languages_summary"] + title = helper.intl.filterOriginalLanguages + summary = helper.intl.filterOriginalLanguagesSummary entries = arrayOf( helper.intl.languageDisplayName(MangaDexIntl.JAPANESE), helper.intl.languageDisplayName(MangaDexIntl.CHINESE), @@ -707,8 +702,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St val blockedGroupsPref = EditTextPreference(screen.context).apply { key = MDConstants.getBlockedGroupsPrefKey(dexLang) - title = helper.intl["block_group_by_uuid"] - summary = helper.intl["block_group_by_uuid_summary"] + title = helper.intl.blockGroupByUuid + summary = helper.intl.blockGroupByUuidSummary setOnBindEditTextListener(helper::setupEditTextUuidValidator) @@ -721,8 +716,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St val blockedUploaderPref = EditTextPreference(screen.context).apply { key = MDConstants.getBlockedUploaderPrefKey(dexLang) - title = helper.intl["block_uploader_by_uuid"] - summary = helper.intl["block_uploader_by_uuid_summary"] + title = helper.intl.blockUploaderByUuid + summary = helper.intl.blockUploaderByUuidSummary setOnBindEditTextListener(helper::setupEditTextUuidValidator) @@ -735,8 +730,8 @@ abstract class MangaDex(final override val lang: String, private val dexLang: St val altTitlesInDescPref = SwitchPreferenceCompat(screen.context).apply { key = MDConstants.getAltTitlesInDescPrefKey(dexLang) - title = helper.intl["alternative_titles_in_description"] - summary = helper.intl["alternative_titles_in_description_summary"] + title = helper.intl.altTitlesInDesc + summary = helper.intl.altTitlesInDescSummary setDefaultValue(false) setOnPreferenceChangeListener { _, newValue -> diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexFilters.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexFilters.kt index b8dff948c..d6e8f4959 100644 --- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexFilters.kt +++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexFilters.kt @@ -4,7 +4,6 @@ import android.content.SharedPreferences import eu.kanade.tachiyomi.extension.all.mangadex.dto.ContentRatingDto import eu.kanade.tachiyomi.extension.all.mangadex.dto.PublicationDemographicDto import eu.kanade.tachiyomi.extension.all.mangadex.dto.StatusDto -import eu.kanade.tachiyomi.lib.i18n.Intl import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.FilterList import okhttp3.HttpUrl @@ -14,7 +13,7 @@ class MangaDexFilters { internal fun getMDFilterList( preferences: SharedPreferences, dexLang: String, - intl: Intl, + intl: MangaDexIntl, ): FilterList = FilterList( HasAvailableChaptersFilter(intl), OriginalLanguageList(intl, getOriginalLanguage(preferences, dexLang, intl)), @@ -23,18 +22,18 @@ class MangaDexFilters { StatusList(intl, getStatus(intl)), SortFilter(intl, getSortables(intl)), TagsFilter(intl, getTagFilters(intl)), - TagList(intl["content"], getContents(intl)), - TagList(intl["format"], getFormats(intl)), - TagList(intl["genre"], getGenres(intl)), - TagList(intl["theme"], getThemes(intl)), + TagList(intl.content, getContents(intl)), + TagList(intl.format, getFormats(intl)), + TagList(intl.genre, getGenres(intl)), + TagList(intl.theme, getThemes(intl)), ) private interface UrlQueryFilter { fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) } - private class HasAvailableChaptersFilter(intl: Intl) : - Filter.CheckBox(intl["has_available_chapters"]), + private class HasAvailableChaptersFilter(intl: MangaDexIntl) : + Filter.CheckBox(intl.hasAvailableChapters), UrlQueryFilter { override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) { @@ -46,8 +45,8 @@ class MangaDexFilters { } private class OriginalLanguage(name: String, val isoCode: String) : Filter.CheckBox(name) - private class OriginalLanguageList(intl: Intl, originalLanguage: List) : - Filter.Group(intl["original_language"], originalLanguage), + private class OriginalLanguageList(intl: MangaDexIntl, originalLanguage: List) : + Filter.Group(intl.originalLanguage, originalLanguage), UrlQueryFilter { override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) { @@ -70,7 +69,7 @@ class MangaDexFilters { private fun getOriginalLanguage( preferences: SharedPreferences, dexLang: String, - intl: Intl, + intl: MangaDexIntl, ): List { val originalLanguages = preferences.getStringSet( MDConstants.getOriginalLanguagePrefKey(dexLang), @@ -78,18 +77,18 @@ class MangaDexFilters { )!! return listOf( - OriginalLanguage(intl["original_language_filter_japanese"], MDConstants.originalLanguagePrefValJapanese) + OriginalLanguage(intl.originalLanguageFilterJapanese, MDConstants.originalLanguagePrefValJapanese) .apply { state = MDConstants.originalLanguagePrefValJapanese in originalLanguages }, - OriginalLanguage(intl["original_language_filter_chinese"], MDConstants.originalLanguagePrefValChinese) + OriginalLanguage(intl.originalLanguageFilterChinese, MDConstants.originalLanguagePrefValChinese) .apply { state = MDConstants.originalLanguagePrefValChinese in originalLanguages }, - OriginalLanguage(intl["original_language_filter_korean"], MDConstants.originalLanguagePrefValKorean) + OriginalLanguage(intl.originalLanguageFilterKorean, MDConstants.originalLanguagePrefValKorean) .apply { state = MDConstants.originalLanguagePrefValKorean in originalLanguages }, ) } private class ContentRating(name: String, val value: String) : Filter.CheckBox(name) - private class ContentRatingList(intl: Intl, contentRating: List) : - Filter.Group(intl["content_rating"], contentRating), + private class ContentRatingList(intl: MangaDexIntl, contentRating: List) : + Filter.Group(intl.contentRating, contentRating), UrlQueryFilter { override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) { @@ -104,7 +103,7 @@ class MangaDexFilters { private fun getContentRating( preferences: SharedPreferences, dexLang: String, - intl: Intl, + intl: MangaDexIntl, ): List { val contentRatings = preferences.getStringSet( MDConstants.getContentRatingPrefKey(dexLang), @@ -112,24 +111,24 @@ class MangaDexFilters { ) return listOf( - ContentRating(intl["content_rating_safe"], ContentRatingDto.SAFE.value).apply { + ContentRating(intl.contentRatingSafe, ContentRatingDto.SAFE.value).apply { state = contentRatings?.contains(MDConstants.contentRatingPrefValSafe) ?: true }, - ContentRating(intl["content_rating_suggestive"], ContentRatingDto.SUGGESTIVE.value).apply { + ContentRating(intl.contentRatingSuggestive, ContentRatingDto.SUGGESTIVE.value).apply { state = contentRatings?.contains(MDConstants.contentRatingPrefValSuggestive) ?: true }, - ContentRating(intl["content_rating_erotica"], ContentRatingDto.EROTICA.value).apply { + ContentRating(intl.contentRatingErotica, ContentRatingDto.EROTICA.value).apply { state = contentRatings?.contains(MDConstants.contentRatingPrefValErotica) ?: false }, - ContentRating(intl["content_rating_pornographic"], ContentRatingDto.PORNOGRAPHIC.value).apply { + ContentRating(intl.contentRatingPornographic, ContentRatingDto.PORNOGRAPHIC.value).apply { state = contentRatings?.contains(MDConstants.contentRatingPrefValPornographic) ?: false }, ) } private class Demographic(name: String, val value: String) : Filter.CheckBox(name) - private class DemographicList(intl: Intl, demographics: List) : - Filter.Group(intl["publication_demographic"], demographics), + private class DemographicList(intl: MangaDexIntl, demographics: List) : + Filter.Group(intl.publicationDemographic, demographics), UrlQueryFilter { override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) { @@ -141,17 +140,17 @@ class MangaDexFilters { } } - private fun getDemographics(intl: Intl) = listOf( - Demographic(intl["publication_demographic_none"], PublicationDemographicDto.NONE.value), - Demographic(intl["publication_demographic_shounen"], PublicationDemographicDto.SHOUNEN.value), - Demographic(intl["publication_demographic_shoujo"], PublicationDemographicDto.SHOUJO.value), - Demographic(intl["publication_demographic_seinen"], PublicationDemographicDto.SEINEN.value), - Demographic(intl["publication_demographic_josei"], PublicationDemographicDto.JOSEI.value), + private fun getDemographics(intl: MangaDexIntl) = listOf( + Demographic(intl.publicationDemographicNone, PublicationDemographicDto.NONE.value), + Demographic(intl.publicationDemographicShounen, PublicationDemographicDto.SHOUNEN.value), + Demographic(intl.publicationDemographicShoujo, PublicationDemographicDto.SHOUJO.value), + Demographic(intl.publicationDemographicSeinen, PublicationDemographicDto.SEINEN.value), + Demographic(intl.publicationDemographicJosei, PublicationDemographicDto.JOSEI.value), ) private class Status(name: String, val value: String) : Filter.CheckBox(name) - private class StatusList(intl: Intl, status: List) : - Filter.Group(intl["status"], status), + private class StatusList(intl: MangaDexIntl, status: List) : + Filter.Group(intl.status, status), UrlQueryFilter { override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) { @@ -163,31 +162,31 @@ class MangaDexFilters { } } - private fun getStatus(intl: Intl) = listOf( - Status(intl["status_ongoing"], StatusDto.ONGOING.value), - Status(intl["status_completed"], StatusDto.COMPLETED.value), - Status(intl["status_hiatus"], StatusDto.HIATUS.value), - Status(intl["status_cancelled"], StatusDto.CANCELLED.value), + private fun getStatus(intl: MangaDexIntl) = listOf( + Status(intl.statusOngoing, StatusDto.ONGOING.value), + Status(intl.statusCompleted, StatusDto.COMPLETED.value), + Status(intl.statusHiatus, StatusDto.HIATUS.value), + Status(intl.statusCancelled, StatusDto.CANCELLED.value), ) data class Sortable(val title: String, val value: String) { override fun toString(): String = title } - private fun getSortables(intl: Intl) = arrayOf( - Sortable(intl["sort_alphabetic"], "title"), - Sortable(intl["sort_chapter_uploaded_at"], "latestUploadedChapter"), - Sortable(intl["sort_number_of_follows"], "followedCount"), - Sortable(intl["sort_content_created_at"], "createdAt"), - Sortable(intl["sort_content_info_updated_at"], "updatedAt"), - Sortable(intl["sort_relevance"], "relevance"), - Sortable(intl["sort_year"], "year"), - Sortable(intl["sort_rating"], "rating"), + private fun getSortables(intl: MangaDexIntl) = arrayOf( + Sortable(intl.sortAlphabetic, "title"), + Sortable(intl.sortChapterUploadedAt, "latestUploadedChapter"), + Sortable(intl.sortNumberOfFollows, "followedCount"), + Sortable(intl.sortContentCreatedAt, "createdAt"), + Sortable(intl.sortContentInfoUpdatedAt, "updatedAt"), + Sortable(intl.sortRelevance, "relevance"), + Sortable(intl.sortYear, "year"), + Sortable(intl.sortRating, "rating"), ) - class SortFilter(intl: Intl, private val sortables: Array) : + class SortFilter(intl: MangaDexIntl, private val sortables: Array) : Filter.Sort( - intl["sort"], + intl.sort, sortables.map(Sortable::title).toTypedArray(), Selection(5, false), ), @@ -223,112 +222,112 @@ class MangaDexFilters { } } - private fun getContents(intl: Intl): List { + private fun getContents(intl: MangaDexIntl): List { val tags = listOf( - Tag("b29d6a3d-1569-4e7a-8caf-7557bc92cd5d", intl["content_gore"]), - Tag("97893a4c-12af-4dac-b6be-0dffb353568e", intl["content_sexual_violence"]), + Tag("b29d6a3d-1569-4e7a-8caf-7557bc92cd5d", intl.contentGore), + Tag("97893a4c-12af-4dac-b6be-0dffb353568e", intl.contentSexualViolence), ) return tags.sortIfTranslated(intl) } - private fun getFormats(intl: Intl): List { + private fun getFormats(intl: MangaDexIntl): List { val tags = listOf( - Tag("b11fda93-8f1d-4bef-b2ed-8803d3733170", intl["format_yonkoma"]), - Tag("f4122d1c-3b44-44d0-9936-ff7502c39ad3", intl["format_adaptation"]), - Tag("51d83883-4103-437c-b4b1-731cb73d786c", intl["format_anthology"]), - Tag("0a39b5a1-b235-4886-a747-1d05d216532d", intl["format_award_winning"]), - Tag("b13b2a48-c720-44a9-9c77-39c9979373fb", intl["format_doujinshi"]), - Tag("7b2ce280-79ef-4c09-9b58-12b7c23a9b78", intl["format_fan_colored"]), - Tag("f5ba408b-0e7a-484d-8d49-4e9125ac96de", intl["format_full_color"]), - Tag("3e2b8dae-350e-4ab8-a8ce-016e844b9f0d", intl["format_long_strip"]), - Tag("320831a8-4026-470b-94f6-8353740e6f04", intl["format_official_colored"]), - Tag("0234a31e-a729-4e28-9d6a-3f87c4966b9e", intl["format_oneshot"]), - Tag("891cf039-b895-47f0-9229-bef4c96eccd4", intl["format_user_created"]), - Tag("e197df38-d0e7-43b5-9b09-2842d0c326dd", intl["format_web_comic"]), + Tag("b11fda93-8f1d-4bef-b2ed-8803d3733170", intl.formatFourKoma), + Tag("f4122d1c-3b44-44d0-9936-ff7502c39ad3", intl.formatAdaptation), + Tag("51d83883-4103-437c-b4b1-731cb73d786c", intl.formatAnthology), + Tag("0a39b5a1-b235-4886-a747-1d05d216532d", intl.formatAwardWinning), + Tag("b13b2a48-c720-44a9-9c77-39c9979373fb", intl.formatDoujinshi), + Tag("7b2ce280-79ef-4c09-9b58-12b7c23a9b78", intl.formatFanColored), + Tag("f5ba408b-0e7a-484d-8d49-4e9125ac96de", intl.formatFullColor), + Tag("3e2b8dae-350e-4ab8-a8ce-016e844b9f0d", intl.formatLongStrip), + Tag("320831a8-4026-470b-94f6-8353740e6f04", intl.formatOfficialColored), + Tag("0234a31e-a729-4e28-9d6a-3f87c4966b9e", intl.formatOneshot), + Tag("891cf039-b895-47f0-9229-bef4c96eccd4", intl.formatUserCreated), + Tag("e197df38-d0e7-43b5-9b09-2842d0c326dd", intl.formatWebComic), ) return tags.sortIfTranslated(intl) } - private fun getGenres(intl: Intl): List { + private fun getGenres(intl: MangaDexIntl): List { val tags = listOf( - Tag("391b0423-d847-456f-aff0-8b0cfc03066b", intl["genre_action"]), - Tag("87cc87cd-a395-47af-b27a-93258283bbc6", intl["genre_adventure"]), - Tag("5920b825-4181-4a17-beeb-9918b0ff7a30", intl["genre_boys_love"]), - Tag("4d32cc48-9f00-4cca-9b5a-a839f0764984", intl["genre_comedy"]), - Tag("5ca48985-9a9d-4bd8-be29-80dc0303db72", intl["genre_crime"]), - Tag("b9af3a63-f058-46de-a9a0-e0c13906197a", intl["genre_drama"]), - Tag("cdc58593-87dd-415e-bbc0-2ec27bf404cc", intl["genre_fantasy"]), - Tag("a3c67850-4684-404e-9b7f-c69850ee5da6", intl["genre_girls_love"]), - Tag("33771934-028e-4cb3-8744-691e866a923e", intl["genre_historical"]), - Tag("cdad7e68-1419-41dd-bdce-27753074a640", intl["genre_horror"]), - Tag("ace04997-f6bd-436e-b261-779182193d3d", intl["genre_isekai"]), - Tag("81c836c9-914a-4eca-981a-560dad663e73", intl["genre_magical_girls"]), - Tag("50880a9d-5440-4732-9afb-8f457127e836", intl["genre_mecha"]), - Tag("c8cbe35b-1b2b-4a3f-9c37-db84c4514856", intl["genre_medical"]), - Tag("ee968100-4191-4968-93d3-f82d72be7e46", intl["genre_mystery"]), - Tag("b1e97889-25b4-4258-b28b-cd7f4d28ea9b", intl["genre_philosophical"]), - Tag("423e2eae-a7a2-4a8b-ac03-a8351462d71d", intl["genre_romance"]), - Tag("256c8bd9-4904-4360-bf4f-508a76d67183", intl["genre_sci_fi"]), - Tag("e5301a23-ebd9-49dd-a0cb-2add944c7fe9", intl["genre_slice_of_life"]), - Tag("69964a64-2f90-4d33-beeb-f3ed2875eb4c", intl["genre_sports"]), - Tag("7064a261-a137-4d3a-8848-2d385de3a99c", intl["genre_superhero"]), - Tag("07251805-a27e-4d59-b488-f0bfbec15168", intl["genre_thriller"]), - Tag("f8f62932-27da-4fe4-8ee1-6779a8c5edba", intl["genre_tragedy"]), - Tag("acc803a4-c95a-4c22-86fc-eb6b582d82a2", intl["genre_wuxia"]), + Tag("391b0423-d847-456f-aff0-8b0cfc03066b", intl.genreAction), + Tag("87cc87cd-a395-47af-b27a-93258283bbc6", intl.genreAdventure), + Tag("5920b825-4181-4a17-beeb-9918b0ff7a30", intl.genreBoysLove), + Tag("4d32cc48-9f00-4cca-9b5a-a839f0764984", intl.genreComedy), + Tag("5ca48985-9a9d-4bd8-be29-80dc0303db72", intl.genreCrime), + Tag("b9af3a63-f058-46de-a9a0-e0c13906197a", intl.genreDrama), + Tag("cdc58593-87dd-415e-bbc0-2ec27bf404cc", intl.genreFantasy), + Tag("a3c67850-4684-404e-9b7f-c69850ee5da6", intl.genreGirlsLove), + Tag("33771934-028e-4cb3-8744-691e866a923e", intl.genreHistorical), + Tag("cdad7e68-1419-41dd-bdce-27753074a640", intl.genreHorror), + Tag("ace04997-f6bd-436e-b261-779182193d3d", intl.genreIsekai), + Tag("81c836c9-914a-4eca-981a-560dad663e73", intl.genreMagicalGirls), + Tag("50880a9d-5440-4732-9afb-8f457127e836", intl.genreMecha), + Tag("c8cbe35b-1b2b-4a3f-9c37-db84c4514856", intl.genreMedical), + Tag("ee968100-4191-4968-93d3-f82d72be7e46", intl.genreMystery), + Tag("b1e97889-25b4-4258-b28b-cd7f4d28ea9b", intl.genrePhilosophical), + Tag("423e2eae-a7a2-4a8b-ac03-a8351462d71d", intl.genreRomance), + Tag("256c8bd9-4904-4360-bf4f-508a76d67183", intl.genreSciFi), + Tag("e5301a23-ebd9-49dd-a0cb-2add944c7fe9", intl.genreSliceOfLife), + Tag("69964a64-2f90-4d33-beeb-f3ed2875eb4c", intl.genreSports), + Tag("7064a261-a137-4d3a-8848-2d385de3a99c", intl.genreSuperhero), + Tag("07251805-a27e-4d59-b488-f0bfbec15168", intl.genreThriller), + Tag("f8f62932-27da-4fe4-8ee1-6779a8c5edba", intl.genreTragedy), + Tag("acc803a4-c95a-4c22-86fc-eb6b582d82a2", intl.genreWuxia), ) return tags.sortIfTranslated(intl) } - private fun getThemes(intl: Intl): List { + private fun getThemes(intl: MangaDexIntl): List { val tags = listOf( - Tag("e64f6742-c834-471d-8d72-dd51fc02b835", intl["theme_aliens"]), - Tag("3de8c75d-8ee3-48ff-98ee-e20a65c86451", intl["theme_animals"]), - Tag("ea2bc92d-1c26-4930-9b7c-d5c0dc1b6869", intl["theme_cooking"]), - Tag("9ab53f92-3eed-4e9b-903a-917c86035ee3", intl["theme_crossdressing"]), - Tag("da2d50ca-3018-4cc0-ac7a-6b7d472a29ea", intl["theme_delinquents"]), - Tag("39730448-9a5f-48a2-85b0-a70db87b1233", intl["theme_demons"]), - Tag("2bd2e8d0-f146-434a-9b51-fc9ff2c5fe6a", intl["theme_gender_swap"]), - Tag("3bb26d85-09d5-4d2e-880c-c34b974339e9", intl["theme_ghosts"]), - Tag("fad12b5e-68ba-460e-b933-9ae8318f5b65", intl["theme_gyaru"]), - Tag("aafb99c1-7f60-43fa-b75f-fc9502ce29c7", intl["theme_harem"]), - Tag("5bd0e105-4481-44ca-b6e7-7544da56b1a3", intl["theme_incest"]), - Tag("2d1f5d56-a1e5-4d0d-a961-2193588b08ec", intl["theme_loli"]), - Tag("85daba54-a71c-4554-8a28-9901a8b0afad", intl["theme_mafia"]), - Tag("a1f53773-c69a-4ce5-8cab-fffcd90b1565", intl["theme_magic"]), - Tag("799c202e-7daa-44eb-9cf7-8a3c0441531e", intl["theme_martial_arts"]), - Tag("ac72833b-c4e9-4878-b9db-6c8a4a99444a", intl["theme_military"]), - Tag("dd1f77c5-dea9-4e2b-97ae-224af09caf99", intl["theme_monster_girls"]), - Tag("36fd93ea-e8b8-445e-b836-358f02b3d33d", intl["theme_monsters"]), - Tag("f42fbf9e-188a-447b-9fdc-f19dc1e4d685", intl["theme_music"]), - Tag("489dd859-9b61-4c37-af75-5b18e88daafc", intl["theme_ninja"]), - Tag("92d6d951-ca5e-429c-ac78-451071cbf064", intl["theme_office_workers"]), - Tag("df33b754-73a3-4c54-80e6-1a74a8058539", intl["theme_police"]), - Tag("9467335a-1b83-4497-9231-765337a00b96", intl["theme_post_apocalyptic"]), - Tag("3b60b75c-a2d7-4860-ab56-05f391bb889c", intl["theme_psychological"]), - Tag("0bc90acb-ccc1-44ca-a34a-b9f3a73259d0", intl["theme_reincarnation"]), - Tag("65761a2a-415e-47f3-bef2-a9dababba7a6", intl["theme_reverse_harem"]), - Tag("81183756-1453-4c81-aa9e-f6e1b63be016", intl["theme_samurai"]), - Tag("caaa44eb-cd40-4177-b930-79d3ef2afe87", intl["theme_school_life"]), - Tag("ddefd648-5140-4e5f-ba18-4eca4071d19b", intl["theme_shota"]), - Tag("eabc5b4c-6aff-42f3-b657-3e90cbd00b75", intl["theme_supernatural"]), - Tag("5fff9cde-849c-4d78-aab0-0d52b2ee1d25", intl["theme_survival"]), - Tag("292e862b-2d17-4062-90a2-0356caa4ae27", intl["theme_time_travel"]), - Tag("31932a7e-5b8e-49a6-9f12-2afa39dc544c", intl["theme_traditional_games"]), - Tag("d7d1730f-6eb0-4ba6-9437-602cac38664c", intl["theme_vampires"]), - Tag("9438db5a-7e2a-4ac0-b39e-e0d95a34b8a8", intl["theme_video_games"]), - Tag("d14322ac-4d6f-4e9b-afd9-629d5f4d8a41", intl["theme_villainess"]), - Tag("8c86611e-fab7-4986-9dec-d1a2f44acdd5", intl["theme_virtual_reality"]), - Tag("631ef465-9aba-4afb-b0fc-ea10efe274a8", intl["theme_zombies"]), + Tag("e64f6742-c834-471d-8d72-dd51fc02b835", intl.themeAliens), + Tag("3de8c75d-8ee3-48ff-98ee-e20a65c86451", intl.themeAnimals), + Tag("ea2bc92d-1c26-4930-9b7c-d5c0dc1b6869", intl.themeCooking), + Tag("9ab53f92-3eed-4e9b-903a-917c86035ee3", intl.themeCrossdressing), + Tag("da2d50ca-3018-4cc0-ac7a-6b7d472a29ea", intl.themeDelinquents), + Tag("39730448-9a5f-48a2-85b0-a70db87b1233", intl.themeDemons), + Tag("2bd2e8d0-f146-434a-9b51-fc9ff2c5fe6a", intl.themeGenderSwap), + Tag("3bb26d85-09d5-4d2e-880c-c34b974339e9", intl.themeGhosts), + Tag("fad12b5e-68ba-460e-b933-9ae8318f5b65", intl.themeGyaru), + Tag("aafb99c1-7f60-43fa-b75f-fc9502ce29c7", intl.themeHarem), + Tag("5bd0e105-4481-44ca-b6e7-7544da56b1a3", intl.themeIncest), + Tag("2d1f5d56-a1e5-4d0d-a961-2193588b08ec", intl.themeLoli), + Tag("85daba54-a71c-4554-8a28-9901a8b0afad", intl.themeMafia), + Tag("a1f53773-c69a-4ce5-8cab-fffcd90b1565", intl.themeMagic), + Tag("799c202e-7daa-44eb-9cf7-8a3c0441531e", intl.themeMartialArts), + Tag("ac72833b-c4e9-4878-b9db-6c8a4a99444a", intl.themeMilitary), + Tag("dd1f77c5-dea9-4e2b-97ae-224af09caf99", intl.themeMonsterGirls), + Tag("36fd93ea-e8b8-445e-b836-358f02b3d33d", intl.themeMonsters), + Tag("f42fbf9e-188a-447b-9fdc-f19dc1e4d685", intl.themeMusic), + Tag("489dd859-9b61-4c37-af75-5b18e88daafc", intl.themeNinja), + Tag("92d6d951-ca5e-429c-ac78-451071cbf064", intl.themeOfficeWorkers), + Tag("df33b754-73a3-4c54-80e6-1a74a8058539", intl.themePolice), + Tag("9467335a-1b83-4497-9231-765337a00b96", intl.themePostApocalyptic), + Tag("3b60b75c-a2d7-4860-ab56-05f391bb889c", intl.themePsychological), + Tag("0bc90acb-ccc1-44ca-a34a-b9f3a73259d0", intl.themeReincarnation), + Tag("65761a2a-415e-47f3-bef2-a9dababba7a6", intl.themeReverseHarem), + Tag("81183756-1453-4c81-aa9e-f6e1b63be016", intl.themeSamurai), + Tag("caaa44eb-cd40-4177-b930-79d3ef2afe87", intl.themeSchoolLife), + Tag("ddefd648-5140-4e5f-ba18-4eca4071d19b", intl.themeShota), + Tag("eabc5b4c-6aff-42f3-b657-3e90cbd00b75", intl.themeSupernatural), + Tag("5fff9cde-849c-4d78-aab0-0d52b2ee1d25", intl.themeSurvival), + Tag("292e862b-2d17-4062-90a2-0356caa4ae27", intl.themeTimeTravel), + Tag("31932a7e-5b8e-49a6-9f12-2afa39dc544c", intl.themeTraditionalGames), + Tag("d7d1730f-6eb0-4ba6-9437-602cac38664c", intl.themeVampires), + Tag("9438db5a-7e2a-4ac0-b39e-e0d95a34b8a8", intl.themeVideoGames), + Tag("d14322ac-4d6f-4e9b-afd9-629d5f4d8a41", intl.themeVillainess), + Tag("8c86611e-fab7-4986-9dec-d1a2f44acdd5", intl.themeVirtualReality), + Tag("631ef465-9aba-4afb-b0fc-ea10efe274a8", intl.themeZombies), ) return tags.sortIfTranslated(intl) } // to get all tags from dex https://api.mangadex.org/manga/tag - internal fun getTags(intl: Intl): List { + internal fun getTags(intl: MangaDexIntl): List { return getContents(intl) + getFormats(intl) + getGenres(intl) + getThemes(intl) } @@ -336,13 +335,13 @@ class MangaDexFilters { override fun toString(): String = title } - private fun getTagModes(intl: Intl) = arrayOf( - TagMode(intl["mode_and"], "AND"), - TagMode(intl["mode_or"], "OR"), + private fun getTagModes(intl: MangaDexIntl) = arrayOf( + TagMode(intl.modeAnd, "AND"), + TagMode(intl.modeOr, "OR"), ) - private class TagInclusionMode(intl: Intl, modes: Array) : - Filter.Select(intl["included_tags_mode"], modes, 0), + private class TagInclusionMode(intl: MangaDexIntl, modes: Array) : + Filter.Select(intl.includedTagsMode, modes, 0), UrlQueryFilter { override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) { @@ -350,8 +349,8 @@ class MangaDexFilters { } } - private class TagExclusionMode(intl: Intl, modes: Array) : - Filter.Select(intl["excluded_tags_mode"], modes, 1), + private class TagExclusionMode(intl: MangaDexIntl, modes: Array) : + Filter.Select(intl.excludedTagsMode, modes, 1), UrlQueryFilter { override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) { @@ -359,8 +358,8 @@ class MangaDexFilters { } } - private class TagsFilter(intl: Intl, innerFilters: FilterList) : - Filter.Group>(intl["tags_mode"], innerFilters), + private class TagsFilter(intl: MangaDexIntl, innerFilters: FilterList) : + Filter.Group>(intl.tags, innerFilters), UrlQueryFilter { override fun addQueryParameter(url: HttpUrl.Builder, dexLang: String) { @@ -369,20 +368,20 @@ class MangaDexFilters { } } - private fun getTagFilters(intl: Intl): FilterList = FilterList( + private fun getTagFilters(intl: MangaDexIntl): FilterList = FilterList( TagInclusionMode(intl, getTagModes(intl)), TagExclusionMode(intl, getTagModes(intl)), ) - internal fun addFiltersToUrl(url: HttpUrl.Builder, filters: FilterList, dexLang: String): HttpUrl { + internal fun addFiltersToUrl(url: HttpUrl.Builder, filters: FilterList, dexLang: String): String { filters.filterIsInstance() .forEach { filter -> filter.addQueryParameter(url, dexLang) } - return url.build() + return url.toString() } - private fun List.sortIfTranslated(intl: Intl): List = apply { - if (intl.chosenLanguage == MangaDexIntl.ENGLISH) { + private fun List.sortIfTranslated(intl: MangaDexIntl): List = apply { + if (intl.availableLang == MangaDexIntl.ENGLISH) { return this } diff --git a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexHelper.kt b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexHelper.kt index 331cdd6ea..60234e8ae 100644 --- a/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexHelper.kt +++ b/src/all/mangadex/src/eu/kanade/tachiyomi/extension/all/mangadex/MangaDexHelper.kt @@ -29,7 +29,6 @@ import eu.kanade.tachiyomi.extension.all.mangadex.dto.TagDto import eu.kanade.tachiyomi.extension.all.mangadex.dto.UnknownEntity import eu.kanade.tachiyomi.extension.all.mangadex.dto.UserAttributes import eu.kanade.tachiyomi.extension.all.mangadex.dto.UserDto -import eu.kanade.tachiyomi.lib.i18n.Intl import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter @@ -86,19 +85,7 @@ class MangaDexHelper(lang: String) { } } - val intl = Intl( - language = lang, - baseLanguage = MangaDexIntl.ENGLISH, - availableLanguages = MangaDexIntl.AVAILABLE_LANGS, - classLoader = this::class.java.classLoader, - createMessageFileName = { lang -> - when (lang) { - MangaDexIntl.SPANISH_LATAM -> Intl.createDefaultMessageFileName(MangaDexIntl.SPANISH) - MangaDexIntl.PORTUGUESE -> Intl.createDefaultMessageFileName(MangaDexIntl.BRAZILIAN_PORTUGUESE) - else -> Intl.createDefaultMessageFileName(lang) - } - }, - ) + val intl = MangaDexIntl(lang) /** * Gets the UUID from the url @@ -315,11 +302,10 @@ class MangaDexHelper(lang: String) { val dexLocale = Locale.forLanguageTag(lang) val nonGenres = listOfNotNull( - attr.publicationDemographic - ?.let { intl["publication_demographic_${it.name.lowercase()}"] }, + attr.publicationDemographic?.let { intl.publicationDemographic(it) }, attr.contentRating .takeIf { it != ContentRatingDto.SAFE } - ?.let { intl["content_rating_genre"].format(intl["content_rating_${it.name.lowercase()}"]) }, + ?.let { intl.contentRatingGenre(it) }, attr.originalLanguage ?.let { Locale.forLanguageTag(it) } ?.getDisplayName(dexLocale) @@ -360,7 +346,7 @@ class MangaDexHelper(lang: String) { if (altTitles.isNotEmpty()) { val altTitlesDesc = altTitles - .joinToString("\n", "${intl["alternative_titles"]}\n") { "• $it" } + .joinToString("\n", "${intl.altTitleText}\n") { "• $it" } desc += (if (desc.isNullOrBlank()) "" else "\n\n") + altTitlesDesc.removeEntitiesAndMarkdown() } } @@ -392,9 +378,9 @@ class MangaDexHelper(lang: String) { val users = chapterDataDto.relationships .filterIsInstance() .mapNotNull { it.attributes?.username } - if (users.isNotEmpty()) intl["uploaded_by"].format(users.joinToString(" & ")) else "" + if (users.isNotEmpty()) intl.uploadedBy(users) else "" } - .ifEmpty { intl["no_group"] } // "No Group" as final resort + .ifEmpty { intl.noGroup } // "No Group" as final resort val chapterName = mutableListOf() // Build chapter name @@ -479,7 +465,7 @@ class MangaDexHelper(lang: String) { .map(String::trim) .all(::isUuid) - editText.error = if (!isValid) intl["invalid_uuids"] else null + editText.error = if (!isValid) intl.invalidUuids else null editText.rootView.findViewById