mirror of
https://github.com/LibreTranslate/LibreTranslate.git
synced 2024-06-16 12:20:35 +00:00
Compare commits
20 commits
Author | SHA1 | Date | |
---|---|---|---|
|
d8ff2de3c3 | ||
|
0c86cc63a9 | ||
|
11ba0ffafc | ||
|
4088b271ee | ||
|
e237d06349 | ||
|
d530b628d0 | ||
|
8bbda1949d | ||
|
f0fb4218e7 | ||
|
df3680c280 | ||
|
cb6b324478 | ||
|
76721891b4 | ||
|
86d15118ca | ||
|
ba8b8d97a1 | ||
|
f7a35db05b | ||
|
16ae59aa43 | ||
|
67c5348c02 | ||
|
f167b94166 | ||
|
7722984df5 | ||
|
9dde1e0142 | ||
|
c8360d0359 |
5
.github/workflows/issue-triage.yml
vendored
5
.github/workflows/issue-triage.yml
vendored
|
@ -19,12 +19,13 @@ jobs:
|
|||
- Q: "A question about using a software or seeking guidance on doing something?"
|
||||
- B: "Reporting an issue, an exception, a stack trace, or a software bug?"
|
||||
- T: "Reporting a problem with an inaccurate, awkward or erroneous translation?"
|
||||
- E: "Contains a suggestion for an improvement or a feature request?"
|
||||
- E: "Reporting about some missing feature or functionality?"
|
||||
- SC: "Describes an issue related to compiling or building source code?"
|
||||
logic: |
|
||||
- "Q and (not B) and (not E) and (not SC)": [comment: "Could we move this conversation over to the forum at https://community.libretranslate.com? :pray: The forum is the right place to ask questions (we try to keep the GitHub issue tracker for feature requests and bugs only). Thank you! :+1:", close: true, stop: true]
|
||||
- "B and (not T) and (not E) and (not SC)": [label: "possible bug", stop: true]
|
||||
- "T or E": [label: "enhancement", stop: true]
|
||||
- "T and (not E)": [label: "model improvement", stop: true]
|
||||
- "E": [label: "enhancement", stop: true]
|
||||
- "SC": [label: "possible bug"]
|
||||
|
||||
signature: "p.s. I'm just an automated script, not a human being."
|
||||
|
|
35
README.md
35
README.md
|
@ -70,7 +70,7 @@ Response:
|
|||
}
|
||||
```
|
||||
|
||||
### HTML (beta)
|
||||
### HTML
|
||||
|
||||
Request:
|
||||
|
||||
|
@ -97,6 +97,38 @@ Response:
|
|||
}
|
||||
```
|
||||
|
||||
### Alternative Translations
|
||||
|
||||
Request:
|
||||
|
||||
```javascript
|
||||
const res = await fetch("https://libretranslate.com/translate", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
q: "Hello",
|
||||
source: "en",
|
||||
target: "it",
|
||||
format: "text",
|
||||
alternatives: 3
|
||||
}),
|
||||
headers: { "Content-Type": "application/json" }
|
||||
});
|
||||
|
||||
console.log(await res.json());
|
||||
```
|
||||
|
||||
Response:
|
||||
|
||||
```javascript
|
||||
{
|
||||
"alternatives": [
|
||||
"Salve",
|
||||
"Pronto"
|
||||
],
|
||||
"translatedText": "Ciao"
|
||||
}
|
||||
```
|
||||
|
||||
## Install and Run
|
||||
|
||||
You can run your own API server with just a few lines of setup!
|
||||
|
@ -387,6 +419,7 @@ URL |API Key Required | Links
|
|||
[translate.terraprint.co](https://translate.terraprint.co/)|-
|
||||
[trans.zillyhuhn.com](https://trans.zillyhuhn.com/)|-
|
||||
[libretranslate.eownerdead.dedyn.io](https://libretranslate.eownerdead.dedyn.io)|-
|
||||
[translate.lotigara.ru](https://translate.lotigara.ru)|-
|
||||
|
||||
## TOR/i2p Mirrors
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM python:3.10.10-slim-bullseye as builder
|
||||
FROM python:3.11.9-slim-bullseye as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
|
@ -19,7 +19,7 @@ RUN ./venv/bin/pip install Babel==2.12.1 && ./venv/bin/python scripts/compile_lo
|
|||
&& ./venv/bin/pip install . \
|
||||
&& ./venv/bin/pip cache purge
|
||||
|
||||
FROM python:3.10.10-slim-bullseye
|
||||
FROM python:3.11.9-slim-bullseye
|
||||
|
||||
ARG with_models=false
|
||||
ARG models=""
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM arm64v8/python:3.10.10-slim-bullseye as builder
|
||||
FROM arm64v8/python:3.11.9-slim-bullseye as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
|
@ -19,7 +19,7 @@ RUN ./venv/bin/pip install Babel==2.12.1 && ./venv/bin/python scripts/compile_lo
|
|||
&& ./venv/bin/pip install . \
|
||||
&& ./venv/bin/pip cache purge
|
||||
|
||||
FROM arm64v8/python:3.10.10-slim-bullseye
|
||||
FROM arm64v8/python:3.11.9-slim-bullseye
|
||||
|
||||
ARG with_models=false
|
||||
ARG models=""
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM nvidia/cuda:11.2.2-devel-ubuntu20.04
|
||||
FROM nvidia/cuda:12.4.1-devel-ubuntu20.04
|
||||
|
||||
ENV ARGOS_DEVICE_TYPE cuda
|
||||
ARG with_models=false
|
||||
|
|
|
@ -148,6 +148,10 @@ def get_routes_limits(args, api_keys_db):
|
|||
|
||||
return res
|
||||
|
||||
def filter_unique(seq, extra):
|
||||
seen = set({extra, ""})
|
||||
seen_add = seen.add
|
||||
return [x for x in seq if not (x in seen or seen_add(x))]
|
||||
|
||||
def create_app(args):
|
||||
from libretranslate.init import boot
|
||||
|
@ -496,6 +500,14 @@ def create_app(args):
|
|||
Format of source text:
|
||||
* `text` - Plain text
|
||||
* `html` - HTML markup
|
||||
- in: formData
|
||||
name: alternatives
|
||||
schema:
|
||||
type: integer
|
||||
default: 0
|
||||
example: 3
|
||||
required: false
|
||||
description: Preferred number of alternative translations
|
||||
- in: formData
|
||||
name: api_key
|
||||
schema:
|
||||
|
@ -558,11 +570,13 @@ def create_app(args):
|
|||
source_lang = json.get("source")
|
||||
target_lang = json.get("target")
|
||||
text_format = json.get("format")
|
||||
num_alternatives = int(json.get("alternatives", 0))
|
||||
else:
|
||||
q = request.values.get("q")
|
||||
source_lang = request.values.get("source")
|
||||
target_lang = request.values.get("target")
|
||||
text_format = request.values.get("format")
|
||||
num_alternatives = request.values.get("alternatives", 0)
|
||||
|
||||
if not q:
|
||||
abort(400, description=_("Invalid request: missing %(name)s parameter", name='q'))
|
||||
|
@ -571,6 +585,14 @@ def create_app(args):
|
|||
if not target_lang:
|
||||
abort(400, description=_("Invalid request: missing %(name)s parameter", name='target'))
|
||||
|
||||
try:
|
||||
num_alternatives = max(0, int(num_alternatives))
|
||||
except ValueError:
|
||||
abort(400, description=_("Invalid request: %(name)s parameter is not a number", name='alternatives'))
|
||||
|
||||
if args.alternatives_limit != -1 and num_alternatives > args.alternatives_limit:
|
||||
abort(400, description=_("Invalid request: %(name)s parameter must be <= %(value)s", name='alternatives', value=args.alternatives_limit))
|
||||
|
||||
if not request.is_json:
|
||||
# Normalize line endings to UNIX style (LF) only so we can consistently
|
||||
# enforce character limits.
|
||||
|
@ -626,54 +648,53 @@ def create_app(args):
|
|||
|
||||
try:
|
||||
if batch:
|
||||
results = []
|
||||
batch_results = []
|
||||
batch_alternatives = []
|
||||
for text in q:
|
||||
translator = src_lang.get_translation(tgt_lang)
|
||||
if translator is None:
|
||||
abort(400, description=_("%(tname)s (%(tcode)s) is not available as a target language from %(sname)s (%(scode)s)", tname=_lazy(tgt_lang.name), tcode=tgt_lang.code, sname=_lazy(src_lang.name), scode=src_lang.code))
|
||||
|
||||
if text_format == "html":
|
||||
translated_text = str(translate_html(translator, text))
|
||||
translated_text = unescape(str(translate_html(translator, text)))
|
||||
alternatives = [] # Not supported for html yet
|
||||
else:
|
||||
translated_text = improve_translation_formatting(text, translator.translate(text))
|
||||
hypotheses = translator.hypotheses(text, num_alternatives + 1)
|
||||
translated_text = unescape(improve_translation_formatting(text, hypotheses[0].value))
|
||||
alternatives = filter_unique([unescape(improve_translation_formatting(text, hypotheses[i].value)) for i in range(1, len(hypotheses))], translated_text)
|
||||
|
||||
batch_results.append(translated_text)
|
||||
batch_alternatives.append(alternatives)
|
||||
|
||||
result = {"translatedText": batch_results}
|
||||
|
||||
results.append(unescape(translated_text))
|
||||
if source_lang == "auto":
|
||||
return jsonify(
|
||||
{
|
||||
"translatedText": results,
|
||||
"detectedLanguage": [detected_src_lang] * len(q)
|
||||
}
|
||||
)
|
||||
else:
|
||||
return jsonify(
|
||||
{
|
||||
"translatedText": results
|
||||
}
|
||||
)
|
||||
result["detectedLanguage"] = [detected_src_lang] * len(q)
|
||||
if num_alternatives > 0:
|
||||
result["alternatives"] = batch_alternatives
|
||||
|
||||
return jsonify(result)
|
||||
else:
|
||||
translator = src_lang.get_translation(tgt_lang)
|
||||
if translator is None:
|
||||
abort(400, description=_("%(tname)s (%(tcode)s) is not available as a target language from %(sname)s (%(scode)s)", tname=_lazy(tgt_lang.name), tcode=tgt_lang.code, sname=_lazy(src_lang.name), scode=src_lang.code))
|
||||
|
||||
if text_format == "html":
|
||||
translated_text = str(translate_html(translator, q))
|
||||
translated_text = unescape(str(translate_html(translator, q)))
|
||||
alternatives = [] # Not supported for html yet
|
||||
else:
|
||||
translated_text = improve_translation_formatting(q, translator.translate(q))
|
||||
hypotheses = translator.hypotheses(q, num_alternatives + 1)
|
||||
translated_text = unescape(improve_translation_formatting(q, hypotheses[0].value))
|
||||
alternatives = filter_unique([unescape(improve_translation_formatting(q, hypotheses[i].value)) for i in range(1, len(hypotheses))], translated_text)
|
||||
|
||||
result = {"translatedText": translated_text}
|
||||
|
||||
if source_lang == "auto":
|
||||
return jsonify(
|
||||
{
|
||||
"translatedText": unescape(translated_text),
|
||||
"detectedLanguage": detected_src_lang
|
||||
}
|
||||
)
|
||||
else:
|
||||
return jsonify(
|
||||
{
|
||||
"translatedText": unescape(translated_text)
|
||||
}
|
||||
)
|
||||
result["detectedLanguage"] = detected_src_lang
|
||||
if num_alternatives > 0:
|
||||
result["alternatives"] = alternatives
|
||||
|
||||
return jsonify(result)
|
||||
except Exception as e:
|
||||
raise e
|
||||
abort(500, description=_("Cannot translate text: %(text)s", text=str(e)))
|
||||
|
|
|
@ -161,6 +161,11 @@ _default_options_objects = [
|
|||
'default_value': None,
|
||||
'value_type': 'str'
|
||||
},
|
||||
{
|
||||
'name': 'ALTERNATIVES_LIMIT',
|
||||
'default_value': -1,
|
||||
'value_type': 'int'
|
||||
},
|
||||
{
|
||||
'name': 'THREADS',
|
||||
'default_value': 4,
|
||||
|
|
|
@ -9,8 +9,8 @@ msgstr ""
|
|||
"Project-Id-Version: LibreTranslate 1.3.9\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-09 15:17-0400\n"
|
||||
"PO-Revision-Date: 2024-03-25 12:01+0000\n"
|
||||
"Last-Translator: cat <158170307+cultcats@users.noreply.github.com>\n"
|
||||
"PO-Revision-Date: 2024-06-09 17:09+0000\n"
|
||||
"Last-Translator: Luna <social.pvxuu@slmail.me>\n"
|
||||
"Language-Team: Danish <https://hosted.weblate.org/projects/libretranslate/"
|
||||
"app/da/>\n"
|
||||
"Language: da\n"
|
||||
|
@ -18,16 +18,16 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.5-dev\n"
|
||||
"X-Generator: Weblate 5.6-dev\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#: libretranslate/app.py:79
|
||||
msgid "Invalid JSON format"
|
||||
msgstr "Ugyldig JSON format"
|
||||
msgstr "Ugyldigt JSON-format"
|
||||
|
||||
#: libretranslate/app.py:149 libretranslate/templates/app.js.template:459
|
||||
msgid "Auto Detect"
|
||||
msgstr "Auto detektor"
|
||||
msgstr "Auto-registrer"
|
||||
|
||||
#: libretranslate/app.py:232
|
||||
msgid "Unauthorized"
|
||||
|
@ -52,7 +52,7 @@ msgstr "Besøg %(url)s for at få en API-nøgle"
|
|||
|
||||
#: libretranslate/app.py:318
|
||||
msgid "Slowdown:"
|
||||
msgstr "Nedbremsning:"
|
||||
msgstr "Nedsættelse:"
|
||||
|
||||
#: libretranslate/app.py:525 libretranslate/app.py:527
|
||||
#: libretranslate/app.py:529 libretranslate/app.py:741
|
||||
|
@ -80,7 +80,7 @@ msgstr "%(lang)s understøttes ikke"
|
|||
#: libretranslate/app.py:594
|
||||
#, python-format
|
||||
msgid "%(format)s format is not supported"
|
||||
msgstr "%(format)s format understøttes ikke"
|
||||
msgstr "%(format)s-format understøttes ikke"
|
||||
|
||||
#: libretranslate/app.py:602 libretranslate/app.py:626
|
||||
#, python-format
|
||||
|
@ -98,7 +98,7 @@ msgstr "Kan ikke oversætte tekst: %(text)s"
|
|||
|
||||
#: libretranslate/app.py:734 libretranslate/app.py:788
|
||||
msgid "Files translation are disabled on this server."
|
||||
msgstr "File oversættelse er deaktiveret på denne server."
|
||||
msgstr "Oversættelse af filer er deaktiveret på denne server."
|
||||
|
||||
#: libretranslate/app.py:748
|
||||
msgid "Invalid request: empty file"
|
||||
|
@ -278,7 +278,7 @@ msgstr "Hej verden!"
|
|||
|
||||
#: libretranslate/locales/.swag.py:11
|
||||
msgid "Text(s) to translate"
|
||||
msgstr "Tekst(er) til oversættelse"
|
||||
msgstr "Tekst(er) at oversætte"
|
||||
|
||||
#: libretranslate/locales/.swag.py:12
|
||||
msgid "Source language code"
|
||||
|
@ -303,8 +303,8 @@ msgid ""
|
|||
" * `html` - HTML markup\n"
|
||||
msgstr ""
|
||||
"Format af kildetekst:\n"
|
||||
"* 'tekst' - almindelig tekst\n"
|
||||
"* `html' - HTML-markup\n"
|
||||
" * `tekst` - Almindelig tekst\n"
|
||||
" * `html` - HTML-markup\n"
|
||||
|
||||
#: libretranslate/locales/.swag.py:17
|
||||
msgid "API key"
|
||||
|
@ -336,7 +336,7 @@ msgstr "Registreringsfejl"
|
|||
|
||||
#: libretranslate/locales/.swag.py:24
|
||||
msgid "Text to detect"
|
||||
msgstr "Tekst at finde"
|
||||
msgstr "Tekst at registrere"
|
||||
|
||||
#: libretranslate/locales/.swag.py:25
|
||||
msgid "Retrieve frontend specific settings"
|
||||
|
@ -344,11 +344,11 @@ msgstr "Hent frontend-specifikke indstillinger"
|
|||
|
||||
#: libretranslate/locales/.swag.py:26
|
||||
msgid "frontend settings"
|
||||
msgstr "frontend indstillinger"
|
||||
msgstr "frontend-indstillinger"
|
||||
|
||||
#: libretranslate/locales/.swag.py:27
|
||||
msgid "frontend"
|
||||
msgstr "grænseflade"
|
||||
msgstr "frontend"
|
||||
|
||||
#: libretranslate/locales/.swag.py:28
|
||||
msgid "Submit a suggestion to improve a translation"
|
||||
|
@ -408,7 +408,7 @@ msgstr "Årsag til nedbremsning"
|
|||
|
||||
#: libretranslate/locales/.swag.py:42
|
||||
msgid "Translated file url"
|
||||
msgstr "Oversat fil-url"
|
||||
msgstr "Oversat fil-URL"
|
||||
|
||||
#: libretranslate/locales/.swag.py:43
|
||||
msgid "Confidence value"
|
||||
|
@ -446,7 +446,7 @@ msgstr "Om indsendelse var vellykket"
|
|||
#: libretranslate/templates/app.js.template:286
|
||||
#: libretranslate/templates/app.js.template:290
|
||||
msgid "Copy text"
|
||||
msgstr "Kopier tekst"
|
||||
msgstr "Kopiér tekst"
|
||||
|
||||
#: libretranslate/templates/app.js.template:80
|
||||
#: libretranslate/templates/app.js.template:86
|
||||
|
@ -475,8 +475,7 @@ msgid ""
|
|||
"Thanks for your correction. Note the suggestion will not take effect "
|
||||
"right away."
|
||||
msgstr ""
|
||||
"Tak for din rettelse. Bemærk, at forslaget ikke vil træde i kraft med det "
|
||||
"samme."
|
||||
"Tak for din rettelse. Bemærk, at forslaget ikke træder i kraft med det samme."
|
||||
|
||||
#: libretranslate/templates/app.js.template:455
|
||||
msgid "No languages available. Did you install the models correctly?"
|
||||
|
@ -520,7 +519,7 @@ msgstr "api"
|
|||
|
||||
#: libretranslate/templates/index.html:65
|
||||
msgid "API Docs"
|
||||
msgstr "API Docs"
|
||||
msgstr "API-dokumenter"
|
||||
|
||||
#: libretranslate/templates/index.html:67
|
||||
msgid "Get API Key"
|
||||
|
@ -588,7 +587,7 @@ msgstr "Foreslå oversættelse"
|
|||
|
||||
#: libretranslate/templates/index.html:230
|
||||
msgid "Cancel"
|
||||
msgstr "annullere"
|
||||
msgstr "Annuller"
|
||||
|
||||
#: libretranslate/templates/index.html:233
|
||||
msgid "Send"
|
||||
|
|
|
@ -9,24 +9,25 @@ msgstr ""
|
|||
"Project-Id-Version: LibreTranslate 1.3.9\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-09 15:17-0400\n"
|
||||
"PO-Revision-Date: 2023-09-06 11:02+0000\n"
|
||||
"Last-Translator: Reza Almanda <rezaalmanda27@gmail.com>\n"
|
||||
"PO-Revision-Date: 2024-06-08 12:27+0000\n"
|
||||
"Last-Translator: Wahyu Hamdani <mrhamdani0101@gmail.com>\n"
|
||||
"Language-Team: Indonesian <https://hosted.weblate.org/projects/"
|
||||
"libretranslate/app/id/>\n"
|
||||
"Language: id\n"
|
||||
"Language-Team: Indonesian "
|
||||
"<https://hosted.weblate.org/projects/libretranslate/app/id/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.6-dev\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#: libretranslate/app.py:79
|
||||
msgid "Invalid JSON format"
|
||||
msgstr "Format JSON tidak valid"
|
||||
msgstr "Format JSON tidak sah"
|
||||
|
||||
#: libretranslate/app.py:149 libretranslate/templates/app.js.template:459
|
||||
msgid "Auto Detect"
|
||||
msgstr "Deteksi Otomatis"
|
||||
msgstr "Mendeteksi Otomatis"
|
||||
|
||||
#: libretranslate/app.py:232
|
||||
msgid "Unauthorized"
|
||||
|
@ -669,4 +670,3 @@ msgstr "Kontributor %(libretranslate)s"
|
|||
|
||||
#~ msgid "multipart/form-data"
|
||||
#~ msgstr "multipart/form-data"
|
||||
|
||||
|
|
|
@ -9,8 +9,8 @@ msgstr ""
|
|||
"Project-Id-Version: LibreTranslate 1.3.9\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2023-10-09 15:17-0400\n"
|
||||
"PO-Revision-Date: 2023-12-16 08:07+0000\n"
|
||||
"Last-Translator: tuanta <tuanta@skiff.com>\n"
|
||||
"PO-Revision-Date: 2024-06-14 16:33+0000\n"
|
||||
"Last-Translator: Dương Nguyễn Võ Quốc <nguyenquocduong380@gmail.com>\n"
|
||||
"Language-Team: Vietnamese <https://hosted.weblate.org/projects/"
|
||||
"libretranslate/app/vi/>\n"
|
||||
"Language: vi\n"
|
||||
|
@ -18,12 +18,12 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.3\n"
|
||||
"X-Generator: Weblate 5.6-dev\n"
|
||||
"Generated-By: Babel 2.12.1\n"
|
||||
|
||||
#: libretranslate/app.py:79
|
||||
msgid "Invalid JSON format"
|
||||
msgstr "Định dạng JSON không hợp lệ"
|
||||
msgstr "Không đúng định dạng dữ liệu JSON"
|
||||
|
||||
#: libretranslate/app.py:149 libretranslate/templates/app.js.template:459
|
||||
msgid "Auto Detect"
|
||||
|
@ -31,7 +31,7 @@ msgstr "Tự động phát hiện"
|
|||
|
||||
#: libretranslate/app.py:232
|
||||
msgid "Unauthorized"
|
||||
msgstr "Không được phép"
|
||||
msgstr "Truy cập không hợp lệ."
|
||||
|
||||
#: libretranslate/app.py:250
|
||||
msgid "Too many request limits violations"
|
||||
|
@ -181,7 +181,7 @@ msgstr "Indonesia"
|
|||
|
||||
#: libretranslate/locales/.langs.py:17
|
||||
msgid "Irish"
|
||||
msgstr "Ireland"
|
||||
msgstr "irish"
|
||||
|
||||
#: libretranslate/locales/.langs.py:18
|
||||
msgid "Italian"
|
||||
|
@ -225,7 +225,7 @@ msgstr "Thụy Điển"
|
|||
|
||||
#: libretranslate/locales/.langs.py:28
|
||||
msgid "Turkish"
|
||||
msgstr "Thổ"
|
||||
msgstr "Thổ nhỉ kỳ"
|
||||
|
||||
#: libretranslate/locales/.langs.py:29
|
||||
msgid "Ukranian"
|
||||
|
@ -233,7 +233,7 @@ msgstr "Ukraina"
|
|||
|
||||
#: libretranslate/locales/.langs.py:30
|
||||
msgid "Vietnamese"
|
||||
msgstr "Việt Nam"
|
||||
msgstr "Tiếng Việt"
|
||||
|
||||
#: libretranslate/locales/.swag.py:1
|
||||
msgid "Retrieve list of supported languages"
|
||||
|
@ -249,11 +249,11 @@ msgstr "dịch"
|
|||
|
||||
#: libretranslate/locales/.swag.py:4
|
||||
msgid "Translate text from a language to another"
|
||||
msgstr "Dịch ngôn ngữ sang ngôn ngữ khác"
|
||||
msgstr "Dịch từ sang một ngôn ngữ khác"
|
||||
|
||||
#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:222
|
||||
msgid "Translated text"
|
||||
msgstr "Văn bản dịch"
|
||||
msgstr "Văn bản đã dịch"
|
||||
|
||||
#: libretranslate/locales/.swag.py:6
|
||||
msgid "Invalid request"
|
||||
|
@ -277,7 +277,7 @@ msgstr "Xin chào thế giới!"
|
|||
|
||||
#: libretranslate/locales/.swag.py:11
|
||||
msgid "Text(s) to translate"
|
||||
msgstr "Chữ để dịch"
|
||||
msgstr "(Các) văn bản cần dịch"
|
||||
|
||||
#: libretranslate/locales/.swag.py:12
|
||||
msgid "Source language code"
|
||||
|
@ -387,7 +387,7 @@ msgstr "Mã ngôn ngữ"
|
|||
|
||||
#: libretranslate/locales/.swag.py:37
|
||||
msgid "Human-readable language name (in English)"
|
||||
msgstr "Tên ngôn ngữ (để người đọc)"
|
||||
msgstr "Tên ngôn ngữ con người có thể đọc được (bằng tiếng Anh)"
|
||||
|
||||
#: libretranslate/locales/.swag.py:38
|
||||
msgid "Supported target language codes"
|
||||
|
@ -395,7 +395,7 @@ msgstr "Các mã ngôn ngữ đích được hỗ trợ"
|
|||
|
||||
#: libretranslate/locales/.swag.py:39
|
||||
msgid "Translated text(s)"
|
||||
msgstr "Chữ đã dịch"
|
||||
msgstr "(Các) văn bản đã dịch"
|
||||
|
||||
#: libretranslate/locales/.swag.py:40
|
||||
msgid "Error message"
|
||||
|
@ -445,7 +445,7 @@ msgstr "Đã gửi thành công hay chưa"
|
|||
#: libretranslate/templates/app.js.template:286
|
||||
#: libretranslate/templates/app.js.template:290
|
||||
msgid "Copy text"
|
||||
msgstr "Copy chữ"
|
||||
msgstr "Sao chép chữ"
|
||||
|
||||
#: libretranslate/templates/app.js.template:80
|
||||
#: libretranslate/templates/app.js.template:86
|
||||
|
@ -467,7 +467,7 @@ msgstr "Lỗi không rõ"
|
|||
|
||||
#: libretranslate/templates/app.js.template:287
|
||||
msgid "Copied"
|
||||
msgstr "Đã copy"
|
||||
msgstr "Đã sao chép"
|
||||
|
||||
#: libretranslate/templates/app.js.template:331
|
||||
msgid ""
|
||||
|
@ -477,7 +477,8 @@ msgstr "Cảm ơn đã sửa. Lưu ý đề xuất sẽ không có tác dụng n
|
|||
|
||||
#: libretranslate/templates/app.js.template:455
|
||||
msgid "No languages available. Did you install the models correctly?"
|
||||
msgstr "Không có ngôn ngữ nào. Bạn đã cài đặt các bản mẫu (model) đúng chưa?"
|
||||
msgstr ""
|
||||
"Không có ngôn ngữ có sẵn. Bạn đã cài đặt các mô hình một cách chính xác?"
|
||||
|
||||
#: libretranslate/templates/app.js.template:522
|
||||
#, python-format
|
||||
|
@ -486,7 +487,7 @@ msgstr "Nhập mã API của bạn. Nếu bạn cần lấy mã API, %(instructi
|
|||
|
||||
#: libretranslate/templates/app.js.template:522
|
||||
msgid "press the \"Get API Key\" link."
|
||||
msgstr "nhấn liên kết \"Lấy khóa\"."
|
||||
msgstr "nhấn liên kết \"Lấy mã API\"."
|
||||
|
||||
#: libretranslate/templates/app.js.template:522
|
||||
msgid "contact the server operator."
|
||||
|
@ -504,8 +505,8 @@ msgid ""
|
|||
"Free and Open Source Machine Translation API. Self-hosted, offline capable "
|
||||
"and easy to setup. Run your own API server in just a few minutes."
|
||||
msgstr ""
|
||||
"API dịch thuật máy miễn phí và nguồn mở. Tự host, có thể sử dụng offline và "
|
||||
"dễ cài đặt. Tự chạy máy chủ API của bạn chỉ trong vài phút."
|
||||
"API dịch thuật máy miễn phí và nguồn mở. Tự lưu trữ, có thể sử dụng ngoại "
|
||||
"tuyến và dễ cài đặt. Tự chạy máy chủ API của bạn chỉ trong vài phút."
|
||||
|
||||
#: libretranslate/templates/index.html:11
|
||||
msgid "translation"
|
||||
|
@ -553,7 +554,7 @@ msgstr "API dịch"
|
|||
|
||||
#: libretranslate/templates/index.html:175
|
||||
msgid "Translate Text"
|
||||
msgstr "Chữ được dịch"
|
||||
msgstr "Dịch văn bản"
|
||||
|
||||
#: libretranslate/templates/index.html:179
|
||||
msgid "Translate Files"
|
||||
|
@ -565,7 +566,7 @@ msgstr "Dịch từ"
|
|||
|
||||
#: libretranslate/templates/index.html:195
|
||||
msgid "Swap source and target languages"
|
||||
msgstr "Đổi ngôn ngữ nguồn và đích"
|
||||
msgstr "Hoán đổi ngôn ngữ nguồn và đích"
|
||||
|
||||
#: libretranslate/templates/index.html:198
|
||||
msgid "Translate into"
|
||||
|
@ -644,12 +645,12 @@ msgid ""
|
|||
"%(get_api_key)s."
|
||||
msgstr ""
|
||||
"API công khai này chỉ nên dùng để thử nghiệm, sử dụng cá nhân hay không "
|
||||
"thường xuyên. Nếu bạn muốn sử dụng cho mục đích khác, hãy %(host_server)s "
|
||||
"hoặc %(get_api_key)s."
|
||||
"thường xuyên. Nếu bạn muốn chạy ứng dụng cho quá trình sản xuất, hãy "
|
||||
"%(host_server)s hoặc %(get_api_key)s."
|
||||
|
||||
#: libretranslate/templates/index.html:340
|
||||
msgid "host your own server"
|
||||
msgstr "tự lưu máy chủ của chính bạn"
|
||||
msgstr "lưu trữ máy chủ của chính bạn"
|
||||
|
||||
#: libretranslate/templates/index.html:340
|
||||
msgid "get an API key"
|
||||
|
|
|
@ -161,6 +161,13 @@ def get_args():
|
|||
metavar="<comma-separated language codes>",
|
||||
help="Set available languages (ar,de,en,es,fr,ga,hi,it,ja,ko,pt,ru,zh)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--alternatives-limit",
|
||||
default=DEFARGS['ALTERNATIVES_LIMIT'],
|
||||
type=int,
|
||||
metavar="<maximum number of alternatives translations>",
|
||||
help="Set the maximum number of supported alternative translations (%(default)s)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--threads",
|
||||
default=DEFARGS['THREADS'],
|
||||
|
|
|
@ -134,6 +134,7 @@ document.addEventListener('DOMContentLoaded', function(){
|
|||
' source: ' + this.$options.filters.escape(this.sourceLang) + ',',
|
||||
' target: ' + this.$options.filters.escape(this.targetLang) + ',',
|
||||
' format: "' + (this.isHtml ? "html" : "text") + '",',
|
||||
' alternatives: 3,',
|
||||
' api_key: "' + (localStorage.getItem("api_key") || "") + '"',
|
||||
' }),',
|
||||
' headers: { "Content-Type": "application/json" }',
|
||||
|
@ -241,6 +242,7 @@ document.addEventListener('DOMContentLoaded', function(){
|
|||
data.append("source", self.sourceLang);
|
||||
data.append("target", self.targetLang);
|
||||
data.append("format", self.isHtml ? "html" : "text");
|
||||
data.append("alternatives", 3);
|
||||
data.append("api_key", localStorage.getItem("api_key") || "");
|
||||
if (self.apiSecret) data.append("secret", self.apiSecret);
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ classifiers = [
|
|||
dynamic = ["version"]
|
||||
|
||||
dependencies = [
|
||||
"argostranslate ==1.9.1",
|
||||
"argostranslate ==1.9.6",
|
||||
"Flask ==2.2.5",
|
||||
"flask-swagger ==0.2.14",
|
||||
"flask-swagger-ui ==4.11.1",
|
||||
|
|
Loading…
Reference in a new issue