mirror of
https://github.com/LibreTranslate/LibreTranslate.git
synced 2026-02-21 10:40:15 -05:00
Merge branch 'main' of https://github.com/LibreTranslate/LibreTranslate
This commit is contained in:
commit
8a6a8ff3d4
@ -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"]))
|
||||
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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 <azwid@outlook.jp>\n"
|
||||
"PO-Revision-Date: 2026-02-08 04:09+0000\n"
|
||||
"Last-Translator: あやたか <mari233579@gmail.com>\n"
|
||||
"Language-Team: Japanese <https://hosted.weblate.org/projects/libretranslate/"
|
||||
"app/ja/>\n"
|
||||
"Language: ja\n"
|
||||
"Language-Team: Japanese "
|
||||
"<https://hosted.weblate.org/projects/libretranslate/app/ja/>\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 "フィードバック"
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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{
|
||||
|
||||
@ -195,7 +195,7 @@
|
||||
<span id="sourceLangLabel">{{ _h("Translate from") }}</span>
|
||||
<span v-if="detectedLangText !== ''">[[ detectedLangText ]]</span>
|
||||
<select aria-labelledby="sourceLangLabel" class="browser-default" v-model="sourceLang" ref="sourceLangDropdown" @change="handleInput">
|
||||
<template v-for="option in langs">
|
||||
<template v-for="option in sourceLangs">
|
||||
<option :value="option.code">[[ option.name ]]</option>
|
||||
</template>
|
||||
</select>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user