Under attack mode (bdb9b6a224)

Update Locales (97804234f1)

IT Translation (58a95aecef)

Fix z-index (fd0119bf70)

Improvement to under attack mode (411b50178e)

Translations (22268c1923) (c72fb9c836)
This commit is contained in:
vdbhb59 2025-04-19 13:15:04 +05:30
commit 42fb6cf8d6
12 changed files with 552 additions and 444 deletions

View file

@ -199,6 +199,7 @@ Arguments passed to the process or set via environment variables are split into
| --api-keys | Enable API keys database for per-client rate limits when --req-limit is reached | `Don't use API keys` | LT_API_KEYS |
| --require-api-key-origin | Require use of an API key for programmatic access to the API, unless the request origin matches this domain | `No restrictions on domain origin` | LT_REQUIRE_API_KEY_ORIGIN |
| --require-api-key-secret | Require use of an API key for programmatic access to the API, unless the client also sends a secret match | `No secrets required` | LT_REQUIRE_API_KEY_SECRET |
| --under-attack | Enable under attack mode. When enabled, requests must be made with an API key | `Disabled` | LT_UNDER_ATTACK |
| --suggestions | Allow user suggestions | `Disabled` | LT_SUGGESTIONS |
| --disable-files-translation | Disable files translation | `File translation allowed` | LT_DISABLE_FILES_TRANSLATION |
| --disable-web-ui | Disable web ui | `Web Ui enabled` | LT_DISABLE_WEB_UI |

View file

@ -102,6 +102,9 @@ def get_remote_address():
return ip
def get_fingerprint():
return request.headers.get("User-Agent", "") + request.headers.get("Cookie", "")
def get_req_limits(default_limit, api_keys_db, db_multiplier=1, multiplier=1):
req_limit = default_limit
@ -348,12 +351,25 @@ def create_app(args):
and not secret.secret_match(req_secret)
):
need_key = True
if secret.secret_bogus_match(req_secret):
abort(make_response(jsonify({
'translatedText': secret.get_emoji(),
'alternatives': [],
'detectedLanguage': { 'confidence': 100, 'language': 'en' }
}), 200))
if (args.require_api_key_fingerprint
and key_missing):
if flood.fingerprint_mismatch(ip, get_fingerprint()):
need_key = True
if args.under_attack and key_missing:
abort(make_response(jsonify({
'translatedText': secret.get_emoji(),
'alternatives': [],
'detectedLanguage': { 'confidence': 100, 'language': 'en' }
}), 200))
if need_key:
description = _("Please contact the server operator to get an API key")
@ -432,7 +448,8 @@ def create_app(args):
swagger_url=swagger_url,
available_locales=sorted([{'code': l['code'], 'name': _lazy(l['name'])} for l in get_available_locales(not args.debug)], key=lambda s: s['name']),
current_locale=get_locale(),
alternate_locales=get_alternate_locale_links()
alternate_locales=get_alternate_locale_links(),
under_attack=args.under_attack,
))
if args.require_api_key_secret:
@ -460,7 +477,8 @@ def create_app(args):
url_prefix=args.url_prefix,
get_api_key_link=args.get_api_key_link,
api_secret=api_secret,
bogus_api_secret=bogus_api_secret), content_type='application/javascript; charset=utf-8')
bogus_api_secret=bogus_api_secret,
under_attack=args.under_attack), content_type='application/javascript; charset=utf-8')
if args.require_api_key_secret:
response.headers['Last-Modified'] = http_date(datetime.now())

View file

@ -151,6 +151,16 @@ _default_options_objects = [
'default_value': False,
'value_type': 'bool'
},
{
'name': 'UNDER_ATTACK',
'default_value': False,
'value_type': 'bool'
},
{
'name': 'REQUIRE_API_KEY_FINGERPRINT',
'default_value': False,
'value_type': 'bool'
},
{
'name': 'SHARED_STORAGE',
'default_value': 'memory://',
@ -219,4 +229,4 @@ _default_options_objects = [
]
DEFAULT_ARGUMENTS = {obj['name']: _get_value(**obj) for obj in _default_options_objects}
DEFAULT_ARGUMENTS = {obj['name']: _get_value(**obj) for obj in _default_options_objects}

View file

@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: LibreTranslate 1.3.9\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-10-16 23:47+0200\n"
"PO-Revision-Date: 2024-11-12 22:23+0000\n"
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
"PO-Revision-Date: 2025-04-18 15:45+0000\n"
"Last-Translator: Cengizhan Peker <cengizhan.peker@extenship.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/libretranslate/"
"app/es/>\n"
"Language: es\n"
@ -18,12 +18,12 @@ 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.9-dev\n"
"X-Generator: Weblate 5.11.1-dev\n"
"Generated-By: Babel 2.16.0\n"
#: libretranslate/app.py:80
msgid "Invalid JSON format"
msgstr "Formato JSON inválido"
msgstr "JSON inválido"
#: libretranslate/app.py:180 libretranslate/templates/app.js.template:467
msgid "Auto Detect"

View file

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: LibreTranslate 1.3.9\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-10-16 23:47+0200\n"
"PO-Revision-Date: 2024-10-23 17:15+0000\n"
"POT-Creation-Date: 2025-04-18 14:43-0400\n"
"PO-Revision-Date: 2025-04-19 06:10+0000\n"
"Last-Translator: Ghost of Sparta <makesocialfoss32@keemail.me>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/libretranslate/"
"app/hu/>\n"
@ -18,113 +18,116 @@ 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.8.2-dev\n"
"Generated-By: Babel 2.16.0\n"
"X-Generator: Weblate 5.11.1-dev\n"
"Generated-By: Babel 2.12.1\n"
#: libretranslate/app.py:80
#: libretranslate/app.py:93
msgid "Invalid JSON format"
msgstr "Érvénytelen JSON formátum"
#: libretranslate/app.py:180 libretranslate/templates/app.js.template:467
#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473
msgid "Auto Detect"
msgstr "Automatikus felismerés"
#: libretranslate/app.py:273
#: libretranslate/app.py:311
msgid "Unauthorized"
msgstr "Nincs jogosultsága"
#: libretranslate/app.py:291
#: libretranslate/app.py:329
msgid "Too many request limits violations"
msgstr "Túl sok kérelem korlátozza a jogsértéseket"
msgstr "Túl sok kérelem határértéke elérve"
#: libretranslate/app.py:298
#: libretranslate/app.py:336
msgid "Invalid API key"
msgstr "Érvénytelen API kulcs"
msgstr "Érvénytelen API-kulcs"
#: libretranslate/app.py:324
#: libretranslate/app.py:371
msgid "Please contact the server operator to get an API key"
msgstr ""
"Vegye fel a kapcsolatot a kiszolgáló-üzemeltetővel, hogy megkapja az API "
"kulcsot"
#: libretranslate/app.py:326
#, python-format
msgid "Visit %(url)s to get an API key"
msgstr "Látogasson el a(z) %(url)s címre, API kulcshoz"
"Vegye fel a kapcsolatot a kiszolgáló üzemeltetőjével, hogy megkapja az "
"API-kulcsot"
#: libretranslate/app.py:373
#, python-format
msgid "Visit %(url)s to get an API key"
msgstr "Látogasson el a(z) %(url)s címre, API-kulcshoz"
#: libretranslate/app.py:420
msgid "Slowdown:"
msgstr "Lassulás:"
#: libretranslate/app.py:606 libretranslate/app.py:608
#: libretranslate/app.py:610 libretranslate/app.py:819
#: libretranslate/app.py:821 libretranslate/app.py:823
#: libretranslate/app.py:980 libretranslate/app.py:1137
#: libretranslate/app.py:1139 libretranslate/app.py:1141
#: libretranslate/app.py:1143
#: libretranslate/app.py:657 libretranslate/app.py:659
#: libretranslate/app.py:661 libretranslate/app.py:882
#: libretranslate/app.py:884 libretranslate/app.py:886
#: libretranslate/app.py:1051 libretranslate/app.py:1208
#: libretranslate/app.py:1210 libretranslate/app.py:1212
#: libretranslate/app.py:1214
#, python-format
msgid "Invalid request: missing %(name)s parameter"
msgstr "Érvénytelen kérés: hiányzik a(z) %(name)s paraméter"
#: libretranslate/app.py:615
#: libretranslate/app.py:666
#, python-format
msgid "Invalid request: %(name)s parameter is not a number"
msgstr "Érvénytelen kérés: <x>0 0</x> paraméter nem szám %(name)s"
msgstr "Érvénytelen kérés: a(z) %(name)s paraméter nem egy szám"
#: libretranslate/app.py:618
#: libretranslate/app.py:669
#, python-format
msgid "Invalid request: %(name)s parameter must be <= %(value)s"
msgstr "Érvénytelen kérés: <x>0 0</x> paraméternek &lt;= %(value)s %(name)s"
msgstr ""
"Érvénytelen kérés: a(z) %(name)s paraméternek a következőnek kell lennie:"
" %(value)s"
#: libretranslate/app.py:635 libretranslate/app.py:645
#: libretranslate/app.py:686 libretranslate/app.py:696
#, python-format
msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)"
msgstr ""
"Érvénytelen kérés: a kérés mérete (%(size)s) meghaladja a szövegkorlátot "
"(%(limit)s)"
"Érvénytelen kérés: a kérés mérete (%(size)s) meghaladja a(z) (%(limit)s) "
"szövegkorlátot"
#: libretranslate/app.py:660 libretranslate/app.py:665
#: libretranslate/app.py:834 libretranslate/app.py:839
#: libretranslate/app.py:715 libretranslate/app.py:720
#: libretranslate/app.py:897 libretranslate/app.py:902
#: libretranslate/app.py:924
#, python-format
msgid "%(lang)s is not supported"
msgstr "%(lang)s nyelv nem támogatott"
msgstr "a(z) %(lang)s nyelv nem támogatott"
#: libretranslate/app.py:671
#: libretranslate/app.py:726
#, python-format
msgid "%(format)s format is not supported"
msgstr "%(format)s formátum nem támogatott"
msgstr "a(z) %(format)s formátum nem támogatott"
#: libretranslate/app.py:680 libretranslate/app.py:704
#: libretranslate/app.py:735 libretranslate/app.py:763
#, python-format
msgid ""
"%(tname)s (%(tcode)s) is not available as a target language from "
"%(sname)s (%(scode)s)"
msgstr ""
"%(tname)s (%(tcode)s) nem áll rendelkezésre célnyelvként %(sname)s "
"(%(scode)s)"
"%(tname)s (%(tcode)s) nem áll rendelkezésre célnyelvként a következőből: "
"%(sname)s (%(scode)s)"
#: libretranslate/app.py:724
#: libretranslate/app.py:787
#, python-format
msgid "Cannot translate text: %(text)s"
msgstr "Nem fordítható szöveg: %(text)s"
msgstr "A következő szöveg nem fordítható: %(text)s"
#: libretranslate/app.py:811 libretranslate/app.py:872
#: libretranslate/app.py:874 libretranslate/app.py:943
msgid "Files translation are disabled on this server."
msgstr "A fájlfordítások ki vannak kapcsolva ezen a kiszolgálón."
#: libretranslate/app.py:826
#: libretranslate/app.py:889
msgid "Invalid request: empty file"
msgstr "Érvénytelen kérés: üres fájl"
msgstr "Érvénytelen kérés: a fájl üres"
#: libretranslate/app.py:829
#: libretranslate/app.py:892
msgid "Invalid request: file format not supported"
msgstr "Érvénytelen kérés: fájlformátum nem támogatott"
msgstr "Érvénytelen kérés: a fájlformátum nem támogatott"
#: libretranslate/app.py:880
#: libretranslate/app.py:951
msgid "Invalid filename"
msgstr "Érvénytelen fájlnév"
#: libretranslate/app.py:1122
#: libretranslate/app.py:1193
msgid "Suggestions are disabled on this server."
msgstr "A javaslatok ki vannak kapcsolva ezen a kiszolgálón."
@ -145,188 +148,184 @@ msgid "Azerbaijani"
msgstr "Azerbajdzsáni"
#: libretranslate/locales/.langs.py:5
msgid "Basque"
msgstr "Baszk"
#: libretranslate/locales/.langs.py:6
msgid "Bengali"
msgstr "Bengáli"
#: libretranslate/locales/.langs.py:7
#: libretranslate/locales/.langs.py:6
msgid "Bulgarian"
msgstr "Bolgár"
#: libretranslate/locales/.langs.py:8
#: libretranslate/locales/.langs.py:7
msgid "Catalan"
msgstr "Katalán"
#: libretranslate/locales/.langs.py:9
#: libretranslate/locales/.langs.py:8
msgid "Chinese"
msgstr "Kínai"
#: libretranslate/locales/.langs.py:10
#: libretranslate/locales/.langs.py:9
msgid "Chinese (traditional)"
msgstr "Kínai (hagyományos)"
#: libretranslate/locales/.langs.py:11
#: libretranslate/locales/.langs.py:10
msgid "Czech"
msgstr "Cseh"
#: libretranslate/locales/.langs.py:12
#: libretranslate/locales/.langs.py:11
msgid "Danish"
msgstr "Dán"
#: libretranslate/locales/.langs.py:13
#: libretranslate/locales/.langs.py:12
msgid "Dutch"
msgstr "Holland"
#: libretranslate/locales/.langs.py:14
#: libretranslate/locales/.langs.py:13
msgid "Esperanto"
msgstr "Eszperantó"
#: libretranslate/locales/.langs.py:15
#: libretranslate/locales/.langs.py:14
msgid "Estonian"
msgstr "Észt"
#: libretranslate/locales/.langs.py:16
#: libretranslate/locales/.langs.py:15
msgid "Finnish"
msgstr "Finn"
#: libretranslate/locales/.langs.py:17
#: libretranslate/locales/.langs.py:16
msgid "French"
msgstr "Francia"
#: libretranslate/locales/.langs.py:18
msgid "Galician"
msgstr "Galíciai"
#: libretranslate/locales/.langs.py:19
#: libretranslate/locales/.langs.py:17
msgid "German"
msgstr "Német"
#: libretranslate/locales/.langs.py:20
#: libretranslate/locales/.langs.py:18
msgid "Greek"
msgstr "Görög"
#: libretranslate/locales/.langs.py:21
#: libretranslate/locales/.langs.py:19
msgid "Hebrew"
msgstr "Héber"
#: libretranslate/locales/.langs.py:22
#: libretranslate/locales/.langs.py:20
msgid "Hindi"
msgstr "Hindi"
#: libretranslate/locales/.langs.py:23
#: libretranslate/locales/.langs.py:21
msgid "Hungarian"
msgstr "Magyar"
#: libretranslate/locales/.langs.py:24
#: libretranslate/locales/.langs.py:22
msgid "Indonesian"
msgstr "Indonéz"
#: libretranslate/locales/.langs.py:25
#: libretranslate/locales/.langs.py:23
msgid "Irish"
msgstr "Ír"
#: libretranslate/locales/.langs.py:26
#: libretranslate/locales/.langs.py:24
msgid "Italian"
msgstr "Olasz"
#: libretranslate/locales/.langs.py:27
#: libretranslate/locales/.langs.py:25
msgid "Japanese"
msgstr "Japán"
#: libretranslate/locales/.langs.py:28
#: libretranslate/locales/.langs.py:26
msgid "Korean"
msgstr "Koreai"
#: libretranslate/locales/.langs.py:29
#: libretranslate/locales/.langs.py:27
msgid "Latvian"
msgstr "Lett"
#: libretranslate/locales/.langs.py:30
#: libretranslate/locales/.langs.py:28
msgid "Lithuanian"
msgstr "Litván"
#: libretranslate/locales/.langs.py:31
#: libretranslate/locales/.langs.py:29
msgid "Malay"
msgstr "Maláj"
#: libretranslate/locales/.langs.py:32
#: libretranslate/locales/.langs.py:30
msgid "Norwegian"
msgstr "Norvég"
#: libretranslate/locales/.langs.py:33
#: libretranslate/locales/.langs.py:31
msgid "Persian"
msgstr "Perzsa"
#: libretranslate/locales/.langs.py:34
#: libretranslate/locales/.langs.py:32
msgid "Polish"
msgstr "Lengyel"
#: libretranslate/locales/.langs.py:35
#: libretranslate/locales/.langs.py:33
msgid "Portuguese"
msgstr "Portugál"
#: libretranslate/locales/.langs.py:36
#: libretranslate/locales/.langs.py:34
msgid "Portuguese (Brazil)"
msgstr "Portugál (brazil)"
#: libretranslate/locales/.langs.py:35
msgid "Romanian"
msgstr "Román"
#: libretranslate/locales/.langs.py:37
#: libretranslate/locales/.langs.py:36
msgid "Russian"
msgstr "Orosz"
#: libretranslate/locales/.langs.py:38
#: libretranslate/locales/.langs.py:37
msgid "Slovak"
msgstr "Szlovák"
#: libretranslate/locales/.langs.py:39
#: libretranslate/locales/.langs.py:38
msgid "Slovenian"
msgstr "Szlovén"
#: libretranslate/locales/.langs.py:40
#: libretranslate/locales/.langs.py:39
msgid "Spanish"
msgstr "Spanyol"
#: libretranslate/locales/.langs.py:41
#: libretranslate/locales/.langs.py:40
msgid "Swedish"
msgstr "Svéd"
#: libretranslate/locales/.langs.py:42
#: libretranslate/locales/.langs.py:41
msgid "Tagalog"
msgstr "Tagalog"
#: libretranslate/locales/.langs.py:43
#: libretranslate/locales/.langs.py:42
msgid "Thai"
msgstr "Thai"
#: libretranslate/locales/.langs.py:44
#: libretranslate/locales/.langs.py:43
msgid "Turkish"
msgstr "Török"
#: libretranslate/locales/.langs.py:45
#: libretranslate/locales/.langs.py:44
msgid "Ukranian"
msgstr "Ukrán"
#: libretranslate/locales/.langs.py:46
#: libretranslate/locales/.langs.py:45
msgid "Urdu"
msgstr "Urdu"
#: libretranslate/locales/.langs.py:47
#: libretranslate/locales/.langs.py:46
msgid "Serbian"
msgstr "Szerb"
#: libretranslate/locales/.langs.py:48
#: libretranslate/locales/.langs.py:47
msgid "Ukrainian"
msgstr "Ukrán"
#: libretranslate/locales/.langs.py:49
#: libretranslate/locales/.langs.py:48
msgid "Vietnamese"
msgstr "Vietnámi"
#: libretranslate/locales/.swag.py:1
msgid "Retrieve list of supported languages"
msgstr "Támogatott nyelvek listájának lekérése"
msgstr "A támogatott nyelvek listájának lekérése"
#: libretranslate/locales/.swag.py:2
msgid "List of languages"
@ -338,11 +337,11 @@ msgstr "fordítás"
#: libretranslate/locales/.swag.py:4
msgid "Translate text from a language to another"
msgstr "Szöveg fordítása egy nyelvről egy másikra"
msgstr "Szöveg fordítása az egyik nyelvről a másikra"
#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:224
#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233
msgid "Translated text"
msgstr "Fordított szöveg"
msgstr "Lefordított szöveg"
#: libretranslate/locales/.swag.py:6
msgid "Invalid request"
@ -370,11 +369,11 @@ msgstr "Lefordítandó szöveg(ek)"
#: libretranslate/locales/.swag.py:12
msgid "Source language code"
msgstr "Forrás nyelv kódja"
msgstr "Forrásnyelv kódja"
#: libretranslate/locales/.swag.py:13
msgid "Target language code"
msgstr "Cél nyelv kódja"
msgstr "Célnyelv kódja"
#: libretranslate/locales/.swag.py:14
msgid "text"
@ -390,41 +389,41 @@ msgid ""
" * `text` - Plain text\n"
" * `html` - HTML markup\n"
msgstr ""
"Formátum forrás szöveg:\n"
"Forrásszöveg formátuma:\n"
"* `text' - egyszerű szöveg\n"
"* `html' - HTML markup\n"
#: libretranslate/locales/.swag.py:17
msgid "Preferred number of alternative translations"
msgstr "Előnyös számú alternatív fordítás"
msgstr "Az alternatív fordítások előnyben részesített száma"
#: libretranslate/locales/.swag.py:18
msgid "API key"
msgstr "API kulcs"
msgstr "API-kulcs"
#: libretranslate/locales/.swag.py:19
msgid "Translate file from a language to another"
msgstr "Fájl fordítása egy nyelvről egy másikra"
msgstr "Fájl fordítása az egyik nyelvről a másikra"
#: libretranslate/locales/.swag.py:20
msgid "Translated file"
msgstr "Fordított fájl"
msgstr "Lefordított fájl"
#: libretranslate/locales/.swag.py:21
msgid "File to translate"
msgstr "Fájl fordítása"
msgstr "Fájl lefordítása"
#: libretranslate/locales/.swag.py:22
msgid "Detect the language of a single text"
msgstr "A szöveg nyelvének észlelése"
msgstr "Egyetlen szöveg nyelvének felismerése"
#: libretranslate/locales/.swag.py:23
msgid "Detections"
msgstr "Észlelések"
msgstr "Felismerések"
#: libretranslate/locales/.swag.py:24
msgid "Detection error"
msgstr "Észlelési hiba"
msgstr "Felismerési hiba"
#: libretranslate/locales/.swag.py:25
msgid "Text to detect"
@ -432,19 +431,19 @@ msgstr "Felismerendő szöveg"
#: libretranslate/locales/.swag.py:26
msgid "Retrieve frontend specific settings"
msgstr "Frontend-specifikus beállítások lekérése"
msgstr "Előtétprogram-specifikus beállítások lekérése"
#: libretranslate/locales/.swag.py:27
msgid "frontend settings"
msgstr "frontend beállítások"
msgstr "előtétprogram-beállítások"
#: libretranslate/locales/.swag.py:28
msgid "frontend"
msgstr "frontend"
msgstr "előtétprogram"
#: libretranslate/locales/.swag.py:29
msgid "Submit a suggestion to improve a translation"
msgstr "Küldjön javaslatot a fordítás javításához"
msgstr "Küldjön javaslatot egy fordítás javításához"
#: libretranslate/locales/.swag.py:30
msgid "Success"
@ -464,7 +463,7 @@ msgstr "Javasolt fordítás"
#: libretranslate/locales/.swag.py:34
msgid "Language of original text"
msgstr "Eredeti szöveg nyelve"
msgstr "Az eredeti szöveg nyelve"
#: libretranslate/locales/.swag.py:35
msgid "Language of suggested translation"
@ -488,7 +487,7 @@ msgstr "Támogatott célnyelvi kódok"
#: libretranslate/locales/.swag.py:40
msgid "Translated text(s)"
msgstr "Fordított szöveg(ek)"
msgstr "Lefordított szöveg(ek)"
#: libretranslate/locales/.swag.py:41
msgid "Error message"
@ -500,31 +499,31 @@ msgstr "A lelassulás oka"
#: libretranslate/locales/.swag.py:43
msgid "Translated file url"
msgstr "Fordított fájl url"
msgstr "Lefordított fájl webcíme"
#: libretranslate/locales/.swag.py:44
msgid "Confidence value"
msgstr "Bizalmi érték"
msgstr "Megbízhatósági érték"
#: libretranslate/locales/.swag.py:45
msgid "Character input limit for this language (-1 indicates no limit)"
msgstr "Jellemző bemeneti határértéke ennek a nyelvnek (-1 nem jelzi a határt)"
msgstr "Karakterbeviteli korlát ezen a nyelven (-1 azt jelenti, hogy nincs korlát)"
#: libretranslate/locales/.swag.py:46
msgid "Frontend translation timeout"
msgstr "Frontend fordítás időtúllépés"
msgstr "Előtétprogram-fordítási időtúllépés"
#: libretranslate/locales/.swag.py:47
msgid "Whether the API key database is enabled."
msgstr "Függetlenül attól, hogy az API kulcs adatbázisa engedélyezett-e."
msgstr "Független attól, hogy az API-kulcs adatbázisa engedélyezve van-e."
#: libretranslate/locales/.swag.py:48
msgid "Whether an API key is required."
msgstr "Szükséges-e API kulcs."
msgstr "Független attól, hogy az API-kulcs szükséges-e."
#: libretranslate/locales/.swag.py:49
msgid "Whether submitting suggestions is enabled."
msgstr "Engedélyezve van-e a javaslatok beküldése."
msgstr "Független attól, hogy engedélyezve van-e a javaslatok beküldése."
#: libretranslate/locales/.swag.py:50
msgid "Supported files format"
@ -532,7 +531,7 @@ msgstr "Támogatott fájlformátum"
#: libretranslate/locales/.swag.py:51
msgid "Whether submission was successful"
msgstr "Amennyiben a beküldés sikeres volt"
msgstr "Független attól, hogy a beküldés sikeres volt-e"
#: libretranslate/templates/app.js.template:31
#: libretranslate/templates/app.js.template:294
@ -546,10 +545,10 @@ msgstr "Szöveg másolása"
#: libretranslate/templates/app.js.template:281
#: libretranslate/templates/app.js.template:351
#: libretranslate/templates/app.js.template:439
#: libretranslate/templates/app.js.template:487
#: libretranslate/templates/app.js.template:493
#, python-format
msgid "Cannot load %(url)s"
msgstr "Nem tölthető be a(z) %(url)s"
msgstr "Nem tölthető be a(z) %(url)s webcím"
#: libretranslate/templates/app.js.template:272
#: libretranslate/templates/app.js.template:342
@ -574,21 +573,23 @@ msgstr ""
msgid "No languages available. Did you install the models correctly?"
msgstr "Nincsenek elérhető nyelvek. Helyesen telepítette a modelleket?"
#: libretranslate/templates/app.js.template:530
#: libretranslate/templates/app.js.template:536
#, python-format
msgid "Type in your API Key. If you need an API key, %(instructions)s"
msgstr "Írja be az API kulcsot. Ha szüksége van egy API kulcsra, %(instructions)s"
msgstr ""
"Írja be az API-kulcsot. Ha szüksége van egy API-kulcsra, tekintse meg a "
"következőt: %(instructions)s"
#: libretranslate/templates/app.js.template:530
#: libretranslate/templates/app.js.template:536
msgid "press the \"Get API Key\" link."
msgstr "nyomja meg a \"Get API Key\" hivatkozást."
msgstr "kattintson az „API-kulcs beszerzése” hivatkozásra."
#: libretranslate/templates/app.js.template:530
#: libretranslate/templates/app.js.template:536
msgid "contact the server operator."
msgstr "lépjen kapcsolatba a kiszolgáló-üzemeltetővel."
msgstr "lépjen kapcsolatba a kiszolgáló üzemeltetőjével."
#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27
#: libretranslate/templates/index.html:338
#: libretranslate/templates/index.html:347
msgid "Free and Open Source Machine Translation API"
msgstr "Ingyenes és nyílt forráskódú gépi fordító API"
@ -599,8 +600,8 @@ msgid ""
"capable and easy to setup. Run your own API server in just a few minutes."
msgstr ""
"Ingyenes és nyílt forráskódú gépi fordító API. Ingyenesen letölthető, "
"offline működő és könnyen telepíthető. Futtassa saját API kiszolgálóját "
"néhány perc alatt."
"offline működő és könnyen telepíthető. Futtassa a saját API-kiszolgálóját"
" néhány perc alatt."
#: libretranslate/templates/index.html:11
msgid "translation"
@ -612,11 +613,11 @@ msgstr "api"
#: libretranslate/templates/index.html:67
msgid "API Docs"
msgstr "API Dokumentáció"
msgstr "API-dokumentáció"
#: libretranslate/templates/index.html:69
msgid "Get API Key"
msgstr "Szerezzen API kucsot"
msgstr "API-kulcs beszerzése"
#: libretranslate/templates/index.html:71
msgid "GitHub"
@ -624,7 +625,7 @@ msgstr "GitHub"
#: libretranslate/templates/index.html:73
msgid "Set API Key"
msgstr "Állítsa be az API kulcsot"
msgstr "API-kulcs beállítása"
#: libretranslate/templates/index.html:75
msgid "Change language"
@ -640,108 +641,115 @@ msgstr "Váltás sötét/világos módra"
#: libretranslate/templates/index.html:159
msgid "Dismiss"
msgstr "elvetés"
msgstr "Elvetés"
#: libretranslate/templates/index.html:173
#: libretranslate/templates/index.html:177
msgid ""
"Due to bot abuse, translation requests are temporarily limited to users "
"with a valid API key. Sorry for the inconvenience!"
msgstr ""
"A botok visszaélései miatt a fordítási kérelmek ideiglenesen csak érvényes "
"API-kulccsal rendelkező felhasználókra korlátozódnak. Elnézést a "
"kellemetlenségért!"
#: libretranslate/templates/index.html:182
msgid "Translation API"
msgstr "Fordító API"
#: libretranslate/templates/index.html:177
#: libretranslate/templates/index.html:186
msgid "Translate Text"
msgstr "Szöveg fordítása"
#: libretranslate/templates/index.html:181
#: libretranslate/templates/index.html:190
msgid "Translate Files"
msgstr "Fájlok fordítása"
#: libretranslate/templates/index.html:187
#: libretranslate/templates/index.html:196
msgid "Translate from"
msgstr "Fordítási ürlap"
msgstr "Fordítás erről:"
#: libretranslate/templates/index.html:197
#: libretranslate/templates/index.html:206
msgid "Swap source and target languages"
msgstr "Forrás és célnyelv felcserélése"
#: libretranslate/templates/index.html:200
#: libretranslate/templates/index.html:209
msgid "Translate into"
msgstr "Fordítsd le ebbe"
msgstr "Fordítás erre:"
#: libretranslate/templates/index.html:212
#: libretranslate/templates/index.html:221
msgid "Text to translate"
msgstr "Fordítandó szöveg"
#: libretranslate/templates/index.html:215
#: libretranslate/templates/index.html:224
msgid "Delete text"
msgstr "Szöveg törlése"
#: libretranslate/templates/index.html:228
#: libretranslate/templates/index.html:237
msgid "Suggest translation"
msgstr "Javasoljon fordítást"
msgstr "Fordítás javaslása"
#: libretranslate/templates/index.html:232
#: libretranslate/templates/index.html:241
msgid "Cancel"
msgstr "Mégse"
#: libretranslate/templates/index.html:235
#: libretranslate/templates/index.html:244
msgid "Send"
msgstr "Küldés"
#: libretranslate/templates/index.html:251
#: libretranslate/templates/index.html:260
msgid "Supported file formats:"
msgstr "Támogatott fájlformátumok:"
#: libretranslate/templates/index.html:255
#: libretranslate/templates/index.html:264
msgid "File"
msgstr "Fájl"
#: libretranslate/templates/index.html:270
#: libretranslate/templates/index.html:279
msgid "Remove file"
msgstr "Fájl eltávolítása"
#: libretranslate/templates/index.html:277
#: libretranslate/templates/index.html:286
msgid "Translate"
msgstr "Fordítás"
#: libretranslate/templates/index.html:278
#: libretranslate/templates/index.html:322
#: libretranslate/templates/index.html:287
#: libretranslate/templates/index.html:331
msgid "Download"
msgstr "Letöltés"
#: libretranslate/templates/index.html:297
#: libretranslate/templates/index.html:306
msgid "Request"
msgstr "Kérés"
#: libretranslate/templates/index.html:302
#: libretranslate/templates/index.html:311
msgid "Response"
msgstr "Válasz"
#: libretranslate/templates/index.html:317
#: libretranslate/templates/index.html:326
msgid "Open Source Machine Translation API"
msgstr "Nyílt Forráskódú Gépi Fordító API"
msgstr "Nyílt forráskódú gépi fordító API"
#: libretranslate/templates/index.html:318
#: libretranslate/templates/index.html:327
msgid "Free to download. Offline Capable. Easy to Setup."
msgstr "Ingyenesen letölthető, offline működő. Könnyen beállítható."
#: libretranslate/templates/index.html:337
#: libretranslate/templates/index.html:346
msgid "LibreTranslate"
msgstr "LibreTranslate"
#: libretranslate/templates/index.html:339
#: libretranslate/templates/index.html:348
msgid "License:"
msgstr "Licenc:"
#: libretranslate/templates/index.html:345
#: libretranslate/templates/index.html:354
#, python-format
msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s"
msgstr ""
"%(heart)s-el készítve. Közreműködtek %(contributors)s működtetve ezzel: "
"%(engine)s"
msgstr "%(heart)s-vel készítik a %(contributors)s és az %(engine)s támogatja"
#: libretranslate/templates/index.html:345
#: libretranslate/templates/index.html:354
#, python-format
msgid "%(libretranslate)s Contributors"
msgstr "%(libretranslate)s Közreműködők"
msgstr "%(libretranslate)s közreműködői"
#~ msgid "multipart/form-data"
#~ msgstr "multipart/form-data"
@ -767,3 +775,9 @@ msgstr "%(libretranslate)s Közreműködők"
#~ msgid "get an API key"
#~ msgstr "API kulcs szerzése"
#~ msgid "Basque"
#~ msgstr "Baszk"
#~ msgid "Galician"
#~ msgstr "Galíciai"

View file

@ -8,91 +8,91 @@ msgid ""
msgstr ""
"Project-Id-Version: LibreTranslate 1.3.9\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-10-16 23:47+0200\n"
"POT-Creation-Date: 2025-04-18 14:43-0400\n"
"PO-Revision-Date: 2025-03-01 18:02+0000\n"
"Last-Translator: Piero Toffanin <pt@masseranolabs.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/libretranslate/"
"app/it/>\n"
"Language: it\n"
"Language-Team: Italian "
"<https://hosted.weblate.org/projects/libretranslate/app/it/>\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.10.3-dev\n"
"Generated-By: Babel 2.16.0\n"
"Generated-By: Babel 2.12.1\n"
#: libretranslate/app.py:80
#: libretranslate/app.py:93
msgid "Invalid JSON format"
msgstr "Formato JSON non valido"
#: libretranslate/app.py:180 libretranslate/templates/app.js.template:467
#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473
msgid "Auto Detect"
msgstr "Rileva Automaticamente"
#: libretranslate/app.py:273
#: libretranslate/app.py:311
msgid "Unauthorized"
msgstr "Non autorizzato"
#: libretranslate/app.py:291
#: libretranslate/app.py:329
msgid "Too many request limits violations"
msgstr "Violazione da troppe richieste"
#: libretranslate/app.py:298
#: libretranslate/app.py:336
msgid "Invalid API key"
msgstr "Chiave API non valida"
#: libretranslate/app.py:324
#: libretranslate/app.py:371
msgid "Please contact the server operator to get an API key"
msgstr "Si prega di contattare l'operatore del server per ottenere una chiave API"
#: libretranslate/app.py:326
#: libretranslate/app.py:373
#, python-format
msgid "Visit %(url)s to get an API key"
msgstr "Visita %(url)s per ottenere una chiave API"
#: libretranslate/app.py:373
#: libretranslate/app.py:420
msgid "Slowdown:"
msgstr "Rallenta:"
#: libretranslate/app.py:606 libretranslate/app.py:608
#: libretranslate/app.py:610 libretranslate/app.py:819
#: libretranslate/app.py:821 libretranslate/app.py:823
#: libretranslate/app.py:980 libretranslate/app.py:1137
#: libretranslate/app.py:1139 libretranslate/app.py:1141
#: libretranslate/app.py:1143
#: libretranslate/app.py:657 libretranslate/app.py:659
#: libretranslate/app.py:661 libretranslate/app.py:882
#: libretranslate/app.py:884 libretranslate/app.py:886
#: libretranslate/app.py:1051 libretranslate/app.py:1208
#: libretranslate/app.py:1210 libretranslate/app.py:1212
#: libretranslate/app.py:1214
#, python-format
msgid "Invalid request: missing %(name)s parameter"
msgstr "Richiesta non valida: parametro %(name)s mancante"
#: libretranslate/app.py:615
#: libretranslate/app.py:666
#, python-format
msgid "Invalid request: %(name)s parameter is not a number"
msgstr "Richiesta invalida: parametro %(name)s non è un numero"
#: libretranslate/app.py:618
#: libretranslate/app.py:669
#, python-format
msgid "Invalid request: %(name)s parameter must be <= %(value)s"
msgstr "Richiesta invalida: parametro %(name)s deve essere <= %(value)s"
#: libretranslate/app.py:635 libretranslate/app.py:645
#: libretranslate/app.py:686 libretranslate/app.py:696
#, python-format
msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)"
msgstr ""
"Richiesta non valida: richiesta (%(size)s) supera i limiti di testo "
"(%(limit)s)"
#: libretranslate/app.py:660 libretranslate/app.py:665
#: libretranslate/app.py:834 libretranslate/app.py:839
#: libretranslate/app.py:715 libretranslate/app.py:720
#: libretranslate/app.py:897 libretranslate/app.py:902
#: libretranslate/app.py:924
#, python-format
msgid "%(lang)s is not supported"
msgstr "%(lang)s non è supportato"
#: libretranslate/app.py:671
#: libretranslate/app.py:726
#, python-format
msgid "%(format)s format is not supported"
msgstr "il formato %(format)s non è supportato"
#: libretranslate/app.py:680 libretranslate/app.py:704
#: libretranslate/app.py:735 libretranslate/app.py:763
#, python-format
msgid ""
"%(tname)s (%(tcode)s) is not available as a target language from "
@ -101,28 +101,28 @@ msgstr ""
"%(tname)s (%(tcode)s) non è disponibile come lingua di destinazione da "
"%(sname)s (%(scode)s)"
#: libretranslate/app.py:724
#: libretranslate/app.py:787
#, python-format
msgid "Cannot translate text: %(text)s"
msgstr "Non è possible tradurre il testo: %(text)s"
#: libretranslate/app.py:811 libretranslate/app.py:872
#: libretranslate/app.py:874 libretranslate/app.py:943
msgid "Files translation are disabled on this server."
msgstr "La traduzione dei files è disabilitata su questo server."
#: libretranslate/app.py:826
#: libretranslate/app.py:889
msgid "Invalid request: empty file"
msgstr "Richiesta non valida: file vuoto"
#: libretranslate/app.py:829
#: libretranslate/app.py:892
msgid "Invalid request: file format not supported"
msgstr "Richiesta non valida: formato del file non supportato"
#: libretranslate/app.py:880
#: libretranslate/app.py:951
msgid "Invalid filename"
msgstr "Nome del file non valido"
#: libretranslate/app.py:1122
#: libretranslate/app.py:1193
msgid "Suggestions are disabled on this server."
msgstr "I suggerimenti sono disabilitati su questo server."
@ -143,182 +143,178 @@ msgid "Azerbaijani"
msgstr "Azero"
#: libretranslate/locales/.langs.py:5
msgid "Basque"
msgstr "Basco"
#: libretranslate/locales/.langs.py:6
msgid "Bengali"
msgstr "Bengali"
#: libretranslate/locales/.langs.py:7
#: libretranslate/locales/.langs.py:6
msgid "Bulgarian"
msgstr "Bulgaro"
#: libretranslate/locales/.langs.py:8
#: libretranslate/locales/.langs.py:7
msgid "Catalan"
msgstr "Catalano"
#: libretranslate/locales/.langs.py:9
#: libretranslate/locales/.langs.py:8
msgid "Chinese"
msgstr "Cinese"
#: libretranslate/locales/.langs.py:10
#: libretranslate/locales/.langs.py:9
msgid "Chinese (traditional)"
msgstr "Cinese (tradizionale)"
#: libretranslate/locales/.langs.py:11
#: libretranslate/locales/.langs.py:10
msgid "Czech"
msgstr "Ceco"
#: libretranslate/locales/.langs.py:12
#: libretranslate/locales/.langs.py:11
msgid "Danish"
msgstr "Danese"
#: libretranslate/locales/.langs.py:13
#: libretranslate/locales/.langs.py:12
msgid "Dutch"
msgstr "Olandese"
#: libretranslate/locales/.langs.py:14
#: libretranslate/locales/.langs.py:13
msgid "Esperanto"
msgstr "Esperanto"
#: libretranslate/locales/.langs.py:15
#: libretranslate/locales/.langs.py:14
msgid "Estonian"
msgstr "Estone"
#: libretranslate/locales/.langs.py:16
#: libretranslate/locales/.langs.py:15
msgid "Finnish"
msgstr "Finlandese"
#: libretranslate/locales/.langs.py:17
#: libretranslate/locales/.langs.py:16
msgid "French"
msgstr "Francese"
#: libretranslate/locales/.langs.py:18
msgid "Galician"
msgstr "Galiziano"
#: libretranslate/locales/.langs.py:19
#: libretranslate/locales/.langs.py:17
msgid "German"
msgstr "Tedesco"
#: libretranslate/locales/.langs.py:20
#: libretranslate/locales/.langs.py:18
msgid "Greek"
msgstr "Greco"
#: libretranslate/locales/.langs.py:21
#: libretranslate/locales/.langs.py:19
msgid "Hebrew"
msgstr "Ebraico"
#: libretranslate/locales/.langs.py:22
#: libretranslate/locales/.langs.py:20
msgid "Hindi"
msgstr "Hindi"
#: libretranslate/locales/.langs.py:23
#: libretranslate/locales/.langs.py:21
msgid "Hungarian"
msgstr "Ungherese"
#: libretranslate/locales/.langs.py:24
#: libretranslate/locales/.langs.py:22
msgid "Indonesian"
msgstr "Indonesiano"
#: libretranslate/locales/.langs.py:25
#: libretranslate/locales/.langs.py:23
msgid "Irish"
msgstr "Irlandese"
#: libretranslate/locales/.langs.py:26
#: libretranslate/locales/.langs.py:24
msgid "Italian"
msgstr "Italiano"
#: libretranslate/locales/.langs.py:27
#: libretranslate/locales/.langs.py:25
msgid "Japanese"
msgstr "Giapponese"
#: libretranslate/locales/.langs.py:28
#: libretranslate/locales/.langs.py:26
msgid "Korean"
msgstr "Coreano"
#: libretranslate/locales/.langs.py:29
#: libretranslate/locales/.langs.py:27
msgid "Latvian"
msgstr "Lettone"
#: libretranslate/locales/.langs.py:30
#: libretranslate/locales/.langs.py:28
msgid "Lithuanian"
msgstr "Lituano"
#: libretranslate/locales/.langs.py:31
#: libretranslate/locales/.langs.py:29
msgid "Malay"
msgstr "Malese"
#: libretranslate/locales/.langs.py:32
#: libretranslate/locales/.langs.py:30
msgid "Norwegian"
msgstr "Norvegese"
#: libretranslate/locales/.langs.py:33
#: libretranslate/locales/.langs.py:31
msgid "Persian"
msgstr "Persiano"
#: libretranslate/locales/.langs.py:34
#: libretranslate/locales/.langs.py:32
msgid "Polish"
msgstr "Polacco"
#: libretranslate/locales/.langs.py:35
#: libretranslate/locales/.langs.py:33
msgid "Portuguese"
msgstr "Portoghese"
#: libretranslate/locales/.langs.py:36
#: libretranslate/locales/.langs.py:34
msgid "Portuguese (Brazil)"
msgstr ""
#: libretranslate/locales/.langs.py:35
msgid "Romanian"
msgstr "Rumeno"
#: libretranslate/locales/.langs.py:37
#: libretranslate/locales/.langs.py:36
msgid "Russian"
msgstr "Russo"
#: libretranslate/locales/.langs.py:38
#: libretranslate/locales/.langs.py:37
msgid "Slovak"
msgstr "Slovacco"
#: libretranslate/locales/.langs.py:39
#: libretranslate/locales/.langs.py:38
msgid "Slovenian"
msgstr "Sloveno"
#: libretranslate/locales/.langs.py:40
#: libretranslate/locales/.langs.py:39
msgid "Spanish"
msgstr "Spagnolo"
#: libretranslate/locales/.langs.py:41
#: libretranslate/locales/.langs.py:40
msgid "Swedish"
msgstr "Svedese"
#: libretranslate/locales/.langs.py:42
#: libretranslate/locales/.langs.py:41
msgid "Tagalog"
msgstr "Tagalog"
#: libretranslate/locales/.langs.py:43
#: libretranslate/locales/.langs.py:42
msgid "Thai"
msgstr "Tailandese"
#: libretranslate/locales/.langs.py:44
#: libretranslate/locales/.langs.py:43
msgid "Turkish"
msgstr "Turco"
#: libretranslate/locales/.langs.py:45
#: libretranslate/locales/.langs.py:44
msgid "Ukranian"
msgstr "Ucraino"
#: libretranslate/locales/.langs.py:46
#: libretranslate/locales/.langs.py:45
msgid "Urdu"
msgstr "Urdu"
#: libretranslate/locales/.langs.py:47
#: libretranslate/locales/.langs.py:46
msgid "Serbian"
msgstr "Serbo"
#: libretranslate/locales/.langs.py:48
#: libretranslate/locales/.langs.py:47
msgid "Ukrainian"
msgstr "Ucraino"
#: libretranslate/locales/.langs.py:49
#: libretranslate/locales/.langs.py:48
msgid "Vietnamese"
msgstr "Vietnamita"
@ -338,7 +334,7 @@ msgstr "traduzione"
msgid "Translate text from a language to another"
msgstr "Traduce testo da una lingua a un'altra"
#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:224
#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233
msgid "Translated text"
msgstr "Testo tradotto"
@ -544,7 +540,7 @@ msgstr "Copia testo"
#: libretranslate/templates/app.js.template:281
#: libretranslate/templates/app.js.template:351
#: libretranslate/templates/app.js.template:439
#: libretranslate/templates/app.js.template:487
#: libretranslate/templates/app.js.template:493
#, python-format
msgid "Cannot load %(url)s"
msgstr "Non riesco a caricare %(url)s"
@ -572,23 +568,23 @@ msgstr ""
msgid "No languages available. Did you install the models correctly?"
msgstr "Nessuna lingua disponibile. Hai installato correttamente i modelli?"
#: libretranslate/templates/app.js.template:530
#: libretranslate/templates/app.js.template:536
#, python-format
msgid "Type in your API Key. If you need an API key, %(instructions)s"
msgstr ""
"Digita la tua chiave API. Se hai bisogno di una chiave API, "
"%(instructions)s"
#: libretranslate/templates/app.js.template:530
#: libretranslate/templates/app.js.template:536
msgid "press the \"Get API Key\" link."
msgstr "premi il link \"Ottieni Chiave API\"."
#: libretranslate/templates/app.js.template:530
#: libretranslate/templates/app.js.template:536
msgid "contact the server operator."
msgstr "contatta l'operatore del server."
#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27
#: libretranslate/templates/index.html:338
#: libretranslate/templates/index.html:347
msgid "Free and Open Source Machine Translation API"
msgstr "API di traduzione automatica libera e open source"
@ -598,9 +594,9 @@ msgid ""
"Free and Open Source Machine Translation API. Free to download, offline "
"capable and easy to setup. Run your own API server in just a few minutes."
msgstr ""
"API di traduzione automatica libera e open source. Gratis da scaricare, funziona "
"anche offline e facile da configurare. Fai girare il tuo server API in "
"pochi minuti."
"API di traduzione automatica libera e open source. Gratis da scaricare, "
"funziona anche offline e facile da configurare. Fai girare il tuo server "
"API in pochi minuti."
#: libretranslate/templates/index.html:11
msgid "translation"
@ -642,101 +638,107 @@ msgstr "Cambia modalità scura/chiara"
msgid "Dismiss"
msgstr "Chiudi"
#: libretranslate/templates/index.html:173
#: libretranslate/templates/index.html:177
msgid ""
"Due to bot abuse, translation requests are temporarily limited to users "
"with a valid API key. Sorry for the inconvenience!"
msgstr "A causa di abusi di bots, le richieste di traduzione sono temporaneamente limitate agli utenti in possesso di una chiave API valida. Ci scusiamo per l'inconveniente!"
#: libretranslate/templates/index.html:182
msgid "Translation API"
msgstr "API di Traduzione"
#: libretranslate/templates/index.html:177
#: libretranslate/templates/index.html:186
msgid "Translate Text"
msgstr "Traduci Testo"
#: libretranslate/templates/index.html:181
#: libretranslate/templates/index.html:190
msgid "Translate Files"
msgstr "Traduci Files"
#: libretranslate/templates/index.html:187
#: libretranslate/templates/index.html:196
msgid "Translate from"
msgstr "Traduci da"
#: libretranslate/templates/index.html:197
#: libretranslate/templates/index.html:206
msgid "Swap source and target languages"
msgstr "Scambia lingua sorgente e di destinazione"
#: libretranslate/templates/index.html:200
#: libretranslate/templates/index.html:209
msgid "Translate into"
msgstr "Traduci in"
#: libretranslate/templates/index.html:212
#: libretranslate/templates/index.html:221
msgid "Text to translate"
msgstr "Testo da tradurre"
#: libretranslate/templates/index.html:215
#: libretranslate/templates/index.html:224
msgid "Delete text"
msgstr "Elimina testo"
#: libretranslate/templates/index.html:228
#: libretranslate/templates/index.html:237
msgid "Suggest translation"
msgstr "Suggerisci una traduzione"
#: libretranslate/templates/index.html:232
#: libretranslate/templates/index.html:241
msgid "Cancel"
msgstr "Annulla"
#: libretranslate/templates/index.html:235
#: libretranslate/templates/index.html:244
msgid "Send"
msgstr "Invia"
#: libretranslate/templates/index.html:251
#: libretranslate/templates/index.html:260
msgid "Supported file formats:"
msgstr "Formati files supportati:"
#: libretranslate/templates/index.html:255
#: libretranslate/templates/index.html:264
msgid "File"
msgstr "File"
#: libretranslate/templates/index.html:270
#: libretranslate/templates/index.html:279
msgid "Remove file"
msgstr "Rimuovi file"
#: libretranslate/templates/index.html:277
#: libretranslate/templates/index.html:286
msgid "Translate"
msgstr "Traduci"
#: libretranslate/templates/index.html:278
#: libretranslate/templates/index.html:322
#: libretranslate/templates/index.html:287
#: libretranslate/templates/index.html:331
msgid "Download"
msgstr "Scarica"
#: libretranslate/templates/index.html:297
#: libretranslate/templates/index.html:306
msgid "Request"
msgstr "Richiesta"
#: libretranslate/templates/index.html:302
#: libretranslate/templates/index.html:311
msgid "Response"
msgstr "Risposta"
#: libretranslate/templates/index.html:317
#: libretranslate/templates/index.html:326
msgid "Open Source Machine Translation API"
msgstr "API di Traduzione Automatica Open Source"
#: libretranslate/templates/index.html:318
#: libretranslate/templates/index.html:327
msgid "Free to download. Offline Capable. Easy to Setup."
msgstr "Gratis da scaricare. Funziona offline. Facile da Configurare."
#: libretranslate/templates/index.html:337
#: libretranslate/templates/index.html:346
msgid "LibreTranslate"
msgstr "LibreTranslate"
#: libretranslate/templates/index.html:339
#: libretranslate/templates/index.html:348
msgid "License:"
msgstr "Licenza:"
#: libretranslate/templates/index.html:345
#: libretranslate/templates/index.html:354
#, python-format
msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s"
msgstr "Realizzato con %(heart)s da %(contributors)s e grazie a %(engine)s"
#: libretranslate/templates/index.html:345
#: libretranslate/templates/index.html:354
#, python-format
msgid "%(libretranslate)s Contributors"
msgstr "Contributori di %(libretranslate)s"
@ -765,3 +767,9 @@ msgstr "Contributori di %(libretranslate)s"
#~ msgid "get an API key"
#~ msgstr "ottieni una chiave API"
#~ msgid "Basque"
#~ msgstr "Basco"
#~ msgid "Galician"
#~ msgstr "Galiziano"

View file

@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: LibreTranslate 1.3.9\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-10-16 23:47+0200\n"
"PO-Revision-Date: 2025-01-22 05:16+0000\n"
"Last-Translator: Poesty Li <poesty7450@gmail.com>\n"
"POT-Creation-Date: 2025-04-18 14:43-0400\n"
"PO-Revision-Date: 2025-04-19 06:10+0000\n"
"Last-Translator: LTSlw <LTSlw@outlook.com>\n"
"Language-Team: Chinese (Simplified Han script) <https://hosted.weblate.org/"
"projects/libretranslate/app/zh_Hans/>\n"
"Language: zh\n"
@ -18,107 +18,110 @@ 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.10-dev\n"
"Generated-By: Babel 2.16.0\n"
"X-Generator: Weblate 5.11.1-dev\n"
"Generated-By: Babel 2.12.1\n"
#: libretranslate/app.py:80
#: libretranslate/app.py:93
msgid "Invalid JSON format"
msgstr "无效的 JSON 格式"
msgstr "JSON 格式无效"
#: libretranslate/app.py:180 libretranslate/templates/app.js.template:467
#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473
msgid "Auto Detect"
msgstr "自动检测"
#: libretranslate/app.py:273
#: libretranslate/app.py:311
msgid "Unauthorized"
msgstr "未授权"
msgstr "未授权"
#: libretranslate/app.py:291
#: libretranslate/app.py:329
#, fuzzy
msgid "Too many request limits violations"
msgstr "请求次数过多超过限制"
#: libretranslate/app.py:298
#: libretranslate/app.py:336
msgid "Invalid API key"
msgstr "无效的 API 密钥"
msgstr "API 密钥无效"
#: libretranslate/app.py:324
#: libretranslate/app.py:371
msgid "Please contact the server operator to get an API key"
msgstr "请联系管理员获取 API 密钥"
msgstr "请联系管理员获取 API 密钥"
#: libretranslate/app.py:326
#: libretranslate/app.py:373
#, python-format
msgid "Visit %(url)s to get an API key"
msgstr "访问 %(url)s 以获取 API 密钥"
#: libretranslate/app.py:373
#: libretranslate/app.py:420
#, fuzzy
msgid "Slowdown:"
msgstr "慢一点:"
#: libretranslate/app.py:606 libretranslate/app.py:608
#: libretranslate/app.py:610 libretranslate/app.py:819
#: libretranslate/app.py:821 libretranslate/app.py:823
#: libretranslate/app.py:980 libretranslate/app.py:1137
#: libretranslate/app.py:1139 libretranslate/app.py:1141
#: libretranslate/app.py:1143
#: libretranslate/app.py:657 libretranslate/app.py:659
#: libretranslate/app.py:661 libretranslate/app.py:882
#: libretranslate/app.py:884 libretranslate/app.py:886
#: libretranslate/app.py:1051 libretranslate/app.py:1208
#: libretranslate/app.py:1210 libretranslate/app.py:1212
#: libretranslate/app.py:1214
#, python-format
msgid "Invalid request: missing %(name)s parameter"
msgstr "无效的请求:丢失 %(name)s 参数"
#: libretranslate/app.py:615
#: libretranslate/app.py:666
#, python-format
msgid "Invalid request: %(name)s parameter is not a number"
msgstr "无效的请求 : 参数%(name)s不是数字"
#: libretranslate/app.py:618
#: libretranslate/app.py:669
#, python-format
msgid "Invalid request: %(name)s parameter must be <= %(value)s"
msgstr "无效的请求 : %(name)s 参数必须 <= %(value)s"
#: libretranslate/app.py:635 libretranslate/app.py:645
#: libretranslate/app.py:686 libretranslate/app.py:696
#, python-format
msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)"
msgstr "无效的请求:请求(%(size)s超过文本限制%(limit)s"
#: libretranslate/app.py:660 libretranslate/app.py:665
#: libretranslate/app.py:834 libretranslate/app.py:839
#: libretranslate/app.py:715 libretranslate/app.py:720
#: libretranslate/app.py:897 libretranslate/app.py:902
#: libretranslate/app.py:924
#, python-format
msgid "%(lang)s is not supported"
msgstr "%(lang)s 不受支持"
#: libretranslate/app.py:671
#: libretranslate/app.py:726
#, python-format
msgid "%(format)s format is not supported"
msgstr "%(format)s 格式不受支持"
#: libretranslate/app.py:680 libretranslate/app.py:704
#: libretranslate/app.py:735 libretranslate/app.py:763
#, python-format
msgid ""
"%(tname)s (%(tcode)s) is not available as a target language from "
"%(sname)s (%(scode)s)"
msgstr "%(tname)s%(tcode)s不能作为 %(sname)s %(scode)s的目标语言"
#: libretranslate/app.py:724
#: libretranslate/app.py:787
#, python-format
msgid "Cannot translate text: %(text)s"
msgstr "无法翻译文本:%(text)s"
#: libretranslate/app.py:811 libretranslate/app.py:872
#: libretranslate/app.py:874 libretranslate/app.py:943
msgid "Files translation are disabled on this server."
msgstr "文件翻译在此服务器上被禁用。"
#: libretranslate/app.py:826
#: libretranslate/app.py:889
msgid "Invalid request: empty file"
msgstr "无效的请求:空文件"
#: libretranslate/app.py:829
#: libretranslate/app.py:892
msgid "Invalid request: file format not supported"
msgstr "无效的请求:文件格式不受支持"
#: libretranslate/app.py:880
#: libretranslate/app.py:951
msgid "Invalid filename"
msgstr "无效的文件名"
#: libretranslate/app.py:1122
#: libretranslate/app.py:1193
msgid "Suggestions are disabled on this server."
msgstr "该服务器已禁用建议功能。"
@ -139,182 +142,178 @@ msgid "Azerbaijani"
msgstr "阿塞拜疆语"
#: libretranslate/locales/.langs.py:5
msgid "Basque"
msgstr "巴斯克语"
#: libretranslate/locales/.langs.py:6
msgid "Bengali"
msgstr "孟加拉语"
#: libretranslate/locales/.langs.py:7
#: libretranslate/locales/.langs.py:6
msgid "Bulgarian"
msgstr "保加利亚语"
#: libretranslate/locales/.langs.py:8
#: libretranslate/locales/.langs.py:7
msgid "Catalan"
msgstr "加泰罗尼亚语"
#: libretranslate/locales/.langs.py:9
#: libretranslate/locales/.langs.py:8
msgid "Chinese"
msgstr "简体中文"
#: libretranslate/locales/.langs.py:10
#: libretranslate/locales/.langs.py:9
msgid "Chinese (traditional)"
msgstr "繁体中文"
#: libretranslate/locales/.langs.py:11
#: libretranslate/locales/.langs.py:10
msgid "Czech"
msgstr "捷克语"
#: libretranslate/locales/.langs.py:12
#: libretranslate/locales/.langs.py:11
msgid "Danish"
msgstr "丹麦语"
#: libretranslate/locales/.langs.py:13
#: libretranslate/locales/.langs.py:12
msgid "Dutch"
msgstr "荷兰语"
#: libretranslate/locales/.langs.py:14
#: libretranslate/locales/.langs.py:13
msgid "Esperanto"
msgstr "世界语"
#: libretranslate/locales/.langs.py:15
#: libretranslate/locales/.langs.py:14
msgid "Estonian"
msgstr "爱沙尼亚语"
#: libretranslate/locales/.langs.py:16
#: libretranslate/locales/.langs.py:15
msgid "Finnish"
msgstr "芬兰语"
#: libretranslate/locales/.langs.py:17
#: libretranslate/locales/.langs.py:16
msgid "French"
msgstr "法语"
#: libretranslate/locales/.langs.py:18
msgid "Galician"
msgstr "加利西亚语"
#: libretranslate/locales/.langs.py:19
#: libretranslate/locales/.langs.py:17
msgid "German"
msgstr "德语"
#: libretranslate/locales/.langs.py:20
#: libretranslate/locales/.langs.py:18
msgid "Greek"
msgstr "希腊语"
#: libretranslate/locales/.langs.py:21
#: libretranslate/locales/.langs.py:19
msgid "Hebrew"
msgstr "希伯来语"
#: libretranslate/locales/.langs.py:22
#: libretranslate/locales/.langs.py:20
msgid "Hindi"
msgstr "印地语"
#: libretranslate/locales/.langs.py:23
#: libretranslate/locales/.langs.py:21
msgid "Hungarian"
msgstr "匈牙利语"
#: libretranslate/locales/.langs.py:24
#: libretranslate/locales/.langs.py:22
msgid "Indonesian"
msgstr "印度尼西亚语"
#: libretranslate/locales/.langs.py:25
#: libretranslate/locales/.langs.py:23
msgid "Irish"
msgstr "爱尔兰语"
#: libretranslate/locales/.langs.py:26
#: libretranslate/locales/.langs.py:24
msgid "Italian"
msgstr "意大利语"
#: libretranslate/locales/.langs.py:27
#: libretranslate/locales/.langs.py:25
msgid "Japanese"
msgstr "日语"
#: libretranslate/locales/.langs.py:28
#: libretranslate/locales/.langs.py:26
msgid "Korean"
msgstr "韩语"
#: libretranslate/locales/.langs.py:29
#: libretranslate/locales/.langs.py:27
msgid "Latvian"
msgstr "拉脱维亚语"
#: libretranslate/locales/.langs.py:30
#: libretranslate/locales/.langs.py:28
msgid "Lithuanian"
msgstr "立陶宛语"
#: libretranslate/locales/.langs.py:31
#: libretranslate/locales/.langs.py:29
msgid "Malay"
msgstr "马来语"
#: libretranslate/locales/.langs.py:32
#: libretranslate/locales/.langs.py:30
msgid "Norwegian"
msgstr "挪威语"
#: libretranslate/locales/.langs.py:33
#: libretranslate/locales/.langs.py:31
msgid "Persian"
msgstr "波斯语"
#: libretranslate/locales/.langs.py:34
#: libretranslate/locales/.langs.py:32
msgid "Polish"
msgstr "波兰语"
#: libretranslate/locales/.langs.py:35
#: libretranslate/locales/.langs.py:33
msgid "Portuguese"
msgstr "葡萄牙语"
#: libretranslate/locales/.langs.py:36
#: libretranslate/locales/.langs.py:34
msgid "Portuguese (Brazil)"
msgstr "葡萄牙语(巴西)"
#: libretranslate/locales/.langs.py:35
msgid "Romanian"
msgstr "罗马尼亚语"
#: libretranslate/locales/.langs.py:37
#: libretranslate/locales/.langs.py:36
msgid "Russian"
msgstr "俄语"
#: libretranslate/locales/.langs.py:38
#: libretranslate/locales/.langs.py:37
msgid "Slovak"
msgstr "斯洛伐克语"
#: libretranslate/locales/.langs.py:39
#: libretranslate/locales/.langs.py:38
msgid "Slovenian"
msgstr "斯洛文尼亚语"
#: libretranslate/locales/.langs.py:40
#: libretranslate/locales/.langs.py:39
msgid "Spanish"
msgstr "西班牙语"
#: libretranslate/locales/.langs.py:41
#: libretranslate/locales/.langs.py:40
msgid "Swedish"
msgstr "瑞典语"
#: libretranslate/locales/.langs.py:42
#: libretranslate/locales/.langs.py:41
msgid "Tagalog"
msgstr "标记"
#: libretranslate/locales/.langs.py:43
#: libretranslate/locales/.langs.py:42
msgid "Thai"
msgstr "泰国语"
#: libretranslate/locales/.langs.py:44
#: libretranslate/locales/.langs.py:43
msgid "Turkish"
msgstr "土耳其语"
#: libretranslate/locales/.langs.py:45
#: libretranslate/locales/.langs.py:44
msgid "Ukranian"
msgstr "乌克兰语"
#: libretranslate/locales/.langs.py:46
#: libretranslate/locales/.langs.py:45
msgid "Urdu"
msgstr "乌尔都语"
#: libretranslate/locales/.langs.py:47
#: libretranslate/locales/.langs.py:46
msgid "Serbian"
msgstr "塞尔维亚语"
#: libretranslate/locales/.langs.py:48
#: libretranslate/locales/.langs.py:47
msgid "Ukrainian"
msgstr "乌克兰语"
#: libretranslate/locales/.langs.py:49
#: libretranslate/locales/.langs.py:48
msgid "Vietnamese"
msgstr "越南语"
@ -334,7 +333,7 @@ msgstr "翻译"
msgid "Translate text from a language to another"
msgstr "将文本从一种语言翻译成另一种语言"
#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:224
#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233
msgid "Translated text"
msgstr "已翻译文本"
@ -540,7 +539,7 @@ msgstr "复制文本"
#: libretranslate/templates/app.js.template:281
#: libretranslate/templates/app.js.template:351
#: libretranslate/templates/app.js.template:439
#: libretranslate/templates/app.js.template:487
#: libretranslate/templates/app.js.template:493
#, python-format
msgid "Cannot load %(url)s"
msgstr "无法加载 %(url)s"
@ -566,21 +565,21 @@ msgstr "感谢您的更正。注意此建议不会立即生效。"
msgid "No languages available. Did you install the models correctly?"
msgstr "无可用的语言。您是否正确安装了模型?"
#: libretranslate/templates/app.js.template:530
#: libretranslate/templates/app.js.template:536
#, python-format
msgid "Type in your API Key. If you need an API key, %(instructions)s"
msgstr "输入您的API密钥。如果您需要API密钥%(instructions)s"
#: libretranslate/templates/app.js.template:530
#: libretranslate/templates/app.js.template:536
msgid "press the \"Get API Key\" link."
msgstr "点击“获取API密钥”链接。"
#: libretranslate/templates/app.js.template:530
#: libretranslate/templates/app.js.template:536
msgid "contact the server operator."
msgstr "联系服务器管理员。"
#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27
#: libretranslate/templates/index.html:338
#: libretranslate/templates/index.html:347
msgid "Free and Open Source Machine Translation API"
msgstr "免费开源的机器翻译API"
@ -631,101 +630,107 @@ msgstr "切换暗黑/明亮模式"
msgid "Dismiss"
msgstr "忽略"
#: libretranslate/templates/index.html:173
#: libretranslate/templates/index.html:177
msgid ""
"Due to bot abuse, translation requests are temporarily limited to users "
"with a valid API key. Sorry for the inconvenience!"
msgstr ""
#: libretranslate/templates/index.html:182
msgid "Translation API"
msgstr "翻译API"
#: libretranslate/templates/index.html:177
#: libretranslate/templates/index.html:186
msgid "Translate Text"
msgstr "翻译文本"
#: libretranslate/templates/index.html:181
#: libretranslate/templates/index.html:190
msgid "Translate Files"
msgstr "翻译文件"
#: libretranslate/templates/index.html:187
#: libretranslate/templates/index.html:196
msgid "Translate from"
msgstr "翻译自"
#: libretranslate/templates/index.html:197
#: libretranslate/templates/index.html:206
msgid "Swap source and target languages"
msgstr "交换来源语言与目标语言"
#: libretranslate/templates/index.html:200
#: libretranslate/templates/index.html:209
msgid "Translate into"
msgstr "翻译为"
#: libretranslate/templates/index.html:212
#: libretranslate/templates/index.html:221
msgid "Text to translate"
msgstr "需要翻译的文本"
#: libretranslate/templates/index.html:215
#: libretranslate/templates/index.html:224
msgid "Delete text"
msgstr "删除文本"
#: libretranslate/templates/index.html:228
#: libretranslate/templates/index.html:237
msgid "Suggest translation"
msgstr "建议译文"
#: libretranslate/templates/index.html:232
#: libretranslate/templates/index.html:241
msgid "Cancel"
msgstr "取消"
#: libretranslate/templates/index.html:235
#: libretranslate/templates/index.html:244
msgid "Send"
msgstr "发送"
#: libretranslate/templates/index.html:251
#: libretranslate/templates/index.html:260
msgid "Supported file formats:"
msgstr "支持的文件格式:"
#: libretranslate/templates/index.html:255
#: libretranslate/templates/index.html:264
msgid "File"
msgstr "文件"
#: libretranslate/templates/index.html:270
#: libretranslate/templates/index.html:279
msgid "Remove file"
msgstr "删除文件"
#: libretranslate/templates/index.html:277
#: libretranslate/templates/index.html:286
msgid "Translate"
msgstr "命令, 例如\"翻译\""
#: libretranslate/templates/index.html:278
#: libretranslate/templates/index.html:322
#: libretranslate/templates/index.html:287
#: libretranslate/templates/index.html:331
msgid "Download"
msgstr "下载"
#: libretranslate/templates/index.html:297
#: libretranslate/templates/index.html:306
msgid "Request"
msgstr "请求"
#: libretranslate/templates/index.html:302
#: libretranslate/templates/index.html:311
msgid "Response"
msgstr "响应"
#: libretranslate/templates/index.html:317
#: libretranslate/templates/index.html:326
msgid "Open Source Machine Translation API"
msgstr "开源的机器翻译API"
#: libretranslate/templates/index.html:318
#: libretranslate/templates/index.html:327
msgid "Free to download. Offline Capable. Easy to Setup."
msgstr "自我托管。支持离线。易于设置。"
#: libretranslate/templates/index.html:337
#: libretranslate/templates/index.html:346
msgid "LibreTranslate"
msgstr "LibreTranslate"
#: libretranslate/templates/index.html:339
#: libretranslate/templates/index.html:348
msgid "License:"
msgstr "许可:"
#: libretranslate/templates/index.html:345
#: libretranslate/templates/index.html:354
#, python-format
msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s"
msgstr "由 %(contributors)s 用 %(heart)s 制作并且由 %(engine)s 驱动"
#: libretranslate/templates/index.html:345
#: libretranslate/templates/index.html:354
#, python-format
msgid "%(libretranslate)s Contributors"
msgstr "%(libretranslate)s 贡献者"
@ -751,3 +756,9 @@ msgstr "%(libretranslate)s 贡献者"
#~ msgid "get an API key"
#~ msgstr "获取API密钥"
#~ msgid "Basque"
#~ msgstr "巴斯克语"
#~ msgid "Galician"
#~ msgstr "加利西亚语"

View file

@ -147,6 +147,18 @@ def get_args():
action="store_true",
help="Require use of an API key for programmatic access to the API, unless the client also sends a secret match",
)
parser.add_argument(
"--require-api-key-fingerprint",
default=DEFARGS['REQUIRE_API_KEY_FINGERPRINT'],
action="store_true",
help="Require use of an API key for programmatic access to the API, unless the client also matches a fingerprint",
)
parser.add_argument(
"--under-attack",
default=DEFARGS['UNDER_ATTACK'],
action="store_true",
help="Enable under attack mode. When enabled, requests must be made with an API key",
)
parser.add_argument(
"--shared-storage",
type=str,
@ -250,4 +262,4 @@ def main():
if __name__ == "__main__":
main()
main()

View file

@ -457,6 +457,10 @@ code[class*="language-"], pre[class*="language-"] {
background-color: var(--sec-bg-color)
}
textarea:disabled{
opacity: 0.5;
}
@media (min-width: 280px) {
.btn-text {
display: inline;
@ -481,4 +485,4 @@ code[class*="language-"], pre[class*="language-"] {
nav button.sidenav-trigger {
display: none;
}
}
}

View file

@ -1,4 +1,5 @@
import redis
import time
storage = None
def get_storage():
@ -18,7 +19,7 @@ class Storage:
def get_int(self, key):
raise Exception("not implemented")
def set_str(self, key, value):
def set_str(self, key, value, ex=None):
raise Exception("not implemented")
def get_str(self, key):
raise Exception("not implemented")
@ -56,11 +57,22 @@ class MemoryStorage(Storage):
def get_int(self, key):
return int(self.store.get(key, 0))
def set_str(self, key, value):
self.store[key] = value
def set_str(self, key, value, ex=None):
self.store[key] = {
'value': value,
'ex': None if ex is None else time.time() + ex
}
def get_str(self, key):
return str(self.store.get(key, ""))
d = self.store.get(key, {'value': '', 'ex': None})
if d['ex'] is None:
return d['value']
else:
if d['ex'] <= time.time():
del self.store[key]
return ''
else:
return d['value']
def set_hash_int(self, ns, key, value):
if ns not in self.store:
@ -123,8 +135,8 @@ class RedisStorage(Storage):
else:
return v
def set_str(self, key, value):
self.conn.set(key, value)
def set_str(self, key, value, ex=None):
self.conn.set(key, value, ex=ex)
def get_str(self, key):
v = self.conn.get(key)

View file

@ -17,6 +17,7 @@ document.addEventListener('DOMContentLoaded', function(){
settings: {},
sourceLang: "",
targetLang: "",
apiKey: localStorage.getItem("api_key") || "",
loadingTranslation: false,
inputText: "",
@ -45,6 +46,7 @@ document.addEventListener('DOMContentLoaded', function(){
},
mounted: function() {
const self = this;
window._vueApp = self;
self.$el.classList.add("loaded");
const settingsRequest = new XMLHttpRequest();
@ -137,7 +139,7 @@ document.addEventListener('DOMContentLoaded', function(){
' target: ' + this.$options.filters.escape(this.targetLang) + ',',
' format: "' + (this.isHtml ? "html" : "text") + '",',
' alternatives: 3,',
' api_key: "' + (localStorage.getItem("api_key") || "") + '"',
' api_key: "' + this.apiKey + '"',
' }),',
' headers: { "Content-Type": "application/json" }',
'});',
@ -164,6 +166,9 @@ document.addEventListener('DOMContentLoaded', function(){
});
return tgtLangs;
}
},
disableInput: function(){
return {% if under_attack %}true{% else %}false{% endif %} && this.apiKey === "";
}
},
filters: {
@ -211,6 +216,7 @@ document.addEventListener('DOMContentLoaded', function(){
history.pushState(null, '', newRelativePathQuery);
},
handleInput: function(e){
if (this.disableInput) return;
this.closeSuggestTranslation(e)
this.updateQueryParam('source', this.sourceLang)
@ -245,7 +251,7 @@ document.addEventListener('DOMContentLoaded', function(){
data.append("target", self.targetLang);
data.append("format", self.isHtml ? "html" : "text");
data.append("alternatives", 3);
data.append("api_key", localStorage.getItem("api_key") || "");
data.append("api_key", self.apiKey);
if (self.apiSecret) data.append("secret", atob(self.apiSecret));
request.open('POST', BaseUrl + '/translate', true);
@ -329,7 +335,7 @@ document.addEventListener('DOMContentLoaded', function(){
data.append("s", self.translatedText);
data.append("source", self.sourceLang);
data.append("target", self.targetLang);
data.append("api_key", localStorage.getItem("api_key") || "");
data.append("api_key", self.apiKey);
request.open('POST', BaseUrl + '/suggest', true);
request.onload = function() {
@ -382,6 +388,7 @@ document.addEventListener('DOMContentLoaded', function(){
},
translateFile: function(e) {
e.preventDefault();
if (this.disableInput) return;
let self = this;
let translateFileRequest = new XMLHttpRequest();
@ -392,7 +399,7 @@ document.addEventListener('DOMContentLoaded', function(){
data.append("file", this.inputFile);
data.append("source", this.sourceLang);
data.append("target", this.targetLang);
data.append("api_key", localStorage.getItem("api_key") || "");
data.append("api_key", this.apiKey);
if (self.apiSecret) data.append("secret", self.apiSecret);
this.loadingFileTranslation = true
@ -537,6 +544,9 @@ function setApiKey(){
if (newKey === null) newKey = "";
localStorage.setItem("api_key", newKey);
if (window._vueApp){
window._vueApp.apiKey = newKey;
}
}
// Color scheme handling
@ -618,4 +628,4 @@ function applyPreferredColorScheme(scheme) {
applyPreferredColorScheme(getPreferredColorScheme());
// @license-end
// @license-end

View file

@ -151,17 +151,16 @@
<div class="container">
<div class="row">
<div class="col s12 m12">
<div class="card horizontal">
<div class="card-stacked">
<div class="card-content">
<i class="material-icons">warning</i><p> [[ error ]]</p>
<div class="card horizontal">
<div class="card-stacked">
<div class="card-content">
<i class="material-icons">warning</i><p> [[ error ]]</p>
</div>
<div class="card-action">
<a href="#" @click="dismissError">{{ _h("Dismiss") }}</a>
</div>
</div>
</div>
<div class="card-action">
<a href="#" @click="dismissError">{{ _h("Dismiss") }}</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@ -171,13 +170,22 @@
<div class="section no-pad-bot">
<div class="container">
<div class="row">
{% if under_attack %}
<div class="card horizontal style="z-index: -1;">
<div class="card-stacked">
<div class="card-content center">
<i class="material-icons" style="position: relative; top: 4px;">warning</i> {{ _h("Due to bot abuse, translation requests are temporarily limited to users with a valid API key. Sorry for the inconvenience!") }}</p>
</div>
</div>
</div>
{% endif %}
<h3 class="header center">{{ _h("Translation API") }}</h3>
<div id="translation-type-btns" class="s12 center" v-if="filesTranslation === true">
<button type="button" class="btn btn-switch-type" @click="switchType('text')" :class="{'active': translationType === 'text'}">
<button type="button" class="btn btn-switch-type" @click="switchType('text')" :class="{'active': translationType === 'text'}" :disabled="disableInput">
<i aria-hidden="true" class="material-icons">title</i>
<span class="btn-text">{{ _h("Translate Text") }}</span>
</button>
<button type="button" class="btn btn-switch-type" @click="switchType('files')" :class="{'active': translationType === 'files'}">
<button type="button" class="btn btn-switch-type" @click="switchType('files')" :class="{'active': translationType === 'files'}" :disabled="disableInput">
<i aria-hidden="true" class="material-icons">description</i>
<span class="btn-text">{{ _h("Translate Files") }}</span>
</button>
@ -212,7 +220,7 @@
<label for="textarea1" class="sr-only">
{{ _h("Text to translate") }}
</label>
<textarea id="textarea1" :maxLength="charactersLimit" v-model="inputText" @input="handleInput" ref="inputTextarea" dir="auto"></textarea>
<textarea id="textarea1" :maxLength="charactersLimit" v-model="inputText" @input="handleInput" ref="inputTextarea" dir="auto" :disabled="disableInput"></textarea>
<button class="btn-delete-text" title="{{ _h('Delete text') }}" aria-label="{{ _h('Delete text') }}" @click="deleteText">
<i class="material-icons">close</i>
</button>
@ -224,7 +232,7 @@
<label for="textarea2" class="sr-only">
{{ _h("Translated text") }}
</label>
<textarea id="textarea2" v-model="translatedText" ref="translatedTextarea" dir="auto" v-bind:readonly="suggestions && !isSuggesting"></textarea>
<textarea id="textarea2" v-model="translatedText" ref="translatedTextarea" dir="auto" v-bind:readonly="suggestions && !isSuggesting" :disabled="disableInput"></textarea>
<div class="actions">
<button v-if="suggestions && !loadingTranslation && inputText.length && !isSuggesting" class="btn-action" @click="suggestTranslation" aria-label="{{ _h('Suggest translation') }}">
<i class="material-icons">edit</i>