diff --git a/libretranslate/app.py b/libretranslate/app.py index d20104c..69752b6 100644 --- a/libretranslate/app.py +++ b/libretranslate/app.py @@ -23,7 +23,7 @@ from werkzeug.http import http_date from werkzeug.utils import secure_filename from libretranslate import flood, remove_translated_files, scheduler, secret, security, storage, cache -from libretranslate.language import model2iso, iso2model, detect_languages, improve_translation_formatting +from libretranslate.language import model2iso, iso2model, detect_languages, improve_translation_formatting, get_language_with_fallback from libretranslate.locales import ( _, _lazy, @@ -789,17 +789,18 @@ def create_app(args): if source_lang == "auto": candidate_langs = detect_languages(src_texts) detected_src_lang = candidate_langs[0] + src_lang = get_language_with_fallback(detected_src_lang["language"], languages) else: detected_src_lang = {"confidence": 100.0, "language": source_lang} + src_lang = next((l for l in languages if l.code == source_lang), None) else: detected_src_lang = {"confidence": 0.0, "language": "en"} - - src_lang = next(iter([l for l in languages if l.code == detected_src_lang["language"]]), None) + src_lang = next((l for l in languages if l.code == "en"), None) if src_lang is None: abort(400, description=_("%(lang)s is not supported", lang=source_lang)) - tgt_lang = next(iter([l for l in languages if l.code == target_lang]), None) + tgt_lang = next((l for l in languages if l.code == target_lang), None) if tgt_lang is None: abort(400, description=_("%(lang)s is not supported",lang=target_lang)) @@ -977,12 +978,12 @@ def create_app(args): if os.path.splitext(file.filename)[1] not in frontend_argos_supported_files_format: abort(400, description=_("Invalid request: file format not supported")) - src_lang = next(iter([l for l in languages if l.code == source_lang]), None) + src_lang = next((l for l in languages if l.code == source_lang), None) if src_lang is None and source_lang != "auto": abort(400, description=_("%(lang)s is not supported", lang=source_lang)) - tgt_lang = next(iter([l for l in languages if l.code == target_lang]), None) + tgt_lang = next((l for l in languages if l.code == target_lang), None) if tgt_lang is None: abort(400, description=_("%(lang)s is not supported", lang=target_lang)) @@ -1005,7 +1006,7 @@ def create_app(args): src_texts = argostranslatefiles.get_texts(filepath) candidate_langs = detect_languages(src_texts) detected_src_lang = candidate_langs[0] - src_lang = next(iter([l for l in languages if l.code == detected_src_lang["language"]]), None) + src_lang = get_language_with_fallback(detected_src_lang["language"], languages) if src_lang is None: abort(400, description=_("%(lang)s is not supported", lang=detected_src_lang["language"])) diff --git a/libretranslate/language.py b/libretranslate/language.py index 42f8866..a2f3d91 100644 --- a/libretranslate/language.py +++ b/libretranslate/language.py @@ -47,6 +47,26 @@ def load_lang_codes(): languages = load_languages() return tuple(l.code for l in languages) +def get_language_with_fallback(lang_code, languages): + lang = next((l for l in languages if l.code == lang_code), None) + if lang is not None: + return lang + + language_variants = { + 'pt': ['pb'], + 'pb': ['pt'], + 'zh': ['zt'], + 'zt': ['zh'] + } + + fallbacks = language_variants.get(lang_code, []) + for fallback_code in fallbacks: + fallback_lang = next((l for l in languages if l.code == fallback_code), None) + if fallback_lang is not None: + return fallback_lang + + return None + def detect_languages(text): # detect batch processing if isinstance(text, list): diff --git a/libretranslate/locales/ja/LC_MESSAGES/messages.po b/libretranslate/locales/ja/LC_MESSAGES/messages.po index 1b868ac..334687e 100644 --- a/libretranslate/locales/ja/LC_MESSAGES/messages.po +++ b/libretranslate/locales/ja/LC_MESSAGES/messages.po @@ -9,15 +9,16 @@ msgstr "" "Project-Id-Version: LibreTranslate 1.3.9\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2026-01-21 10:25-0500\n" -"PO-Revision-Date: 2025-01-04 07:30+0000\n" -"Last-Translator: moyashi_24 \n" +"PO-Revision-Date: 2026-02-08 04:09+0000\n" +"Last-Translator: あやたか \n" +"Language-Team: Japanese \n" "Language: ja\n" -"Language-Team: Japanese " -"\n" -"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.16-dev\n" "Generated-By: Babel 2.12.1\n" #: libretranslate/app.py:97 @@ -140,7 +141,7 @@ msgstr "アゼルバイジャン語" #: libretranslate/locales/.langs.py:5 msgid "Basque" -msgstr "" +msgstr "バスク語" #: libretranslate/locales/.langs.py:6 msgid "Bengali" @@ -192,7 +193,7 @@ msgstr "フランス語" #: libretranslate/locales/.langs.py:18 msgid "Galician" -msgstr "" +msgstr "ガリシア語" #: libretranslate/locales/.langs.py:19 msgid "German" @@ -236,7 +237,7 @@ msgstr "韓国語" #: libretranslate/locales/.langs.py:29 msgid "Kyrgyz" -msgstr "" +msgstr "キルギス語" #: libretranslate/locales/.langs.py:30 msgid "Latvian" @@ -268,7 +269,7 @@ msgstr "ポルトガル語" #: libretranslate/locales/.langs.py:37 msgid "Portuguese (Brazil)" -msgstr "" +msgstr "ポルトガル語(ブラジル)" #: libretranslate/locales/.langs.py:38 msgid "Romanian" @@ -328,11 +329,11 @@ msgstr "ウクライナ語" #: libretranslate/locales/.swag.py:1 msgid "Get Supported Languages" -msgstr "" +msgstr "サポート済言語を取得する" #: libretranslate/locales/.swag.py:2 msgid "List of supported languages" -msgstr "" +msgstr "サポート済言語一覧" #: libretranslate/locales/.swag.py:3 msgid "translate" @@ -826,4 +827,3 @@ msgstr "%(libretranslate)s 貢献者" #~ msgid "feedback" #~ msgstr "フィードバック" - diff --git a/libretranslate/remove_translated_files.py b/libretranslate/remove_translated_files.py index c354b1a..2936557 100644 --- a/libretranslate/remove_translated_files.py +++ b/libretranslate/remove_translated_files.py @@ -18,7 +18,7 @@ def remove_translated_files(upload_dir: str): def setup(upload_dir): - scheduler = BackgroundScheduler(daemon=True) + scheduler = BackgroundScheduler(daemon=True, timezone='UTC') scheduler.add_job(remove_translated_files, "interval", minutes=30, kwargs={'upload_dir': upload_dir}) scheduler.start() diff --git a/libretranslate/scheduler.py b/libretranslate/scheduler.py index 836a3ea..3dd551e 100644 --- a/libretranslate/scheduler.py +++ b/libretranslate/scheduler.py @@ -11,7 +11,7 @@ def setup(args): global scheduler if scheduler is None: - scheduler = BackgroundScheduler() + scheduler = BackgroundScheduler(timezone='UTC') if not args.secondary and args.req_flood_threshold > 0: scheduler.add_job(func=forgive_banned, trigger="interval", minutes=10) diff --git a/libretranslate/templates/app.js.template b/libretranslate/templates/app.js.template index 0b66d61..339b41b 100644 --- a/libretranslate/templates/app.js.template +++ b/libretranslate/templates/app.js.template @@ -155,6 +155,15 @@ document.addEventListener('DOMContentLoaded', function(){ canSendSuggestion: function(){ return this.translatedText.trim() !== "" && this.translatedText !== this.savedTanslatedText; }, + sourceLangs: function(){ + var srcLangs = JSON.parse(JSON.stringify(this.langs)); + srcLangs.sort(function(a, b){ + if (a.code === "auto") return -1; + if (b.code === "auto") return 1; + return a.name.localeCompare(b.name); + }); + return srcLangs; + }, targetLangs: function(){ if (!this.sourceLang) return this.langs; else{ diff --git a/libretranslate/templates/index.html b/libretranslate/templates/index.html index d0df3ec..518d24f 100644 --- a/libretranslate/templates/index.html +++ b/libretranslate/templates/index.html @@ -195,7 +195,7 @@ {{ _h("Translate from") }} [[ detectedLangText ]]