From abc55d8ed50a3b689d6d3ce533b3bb13cdd0289d Mon Sep 17 00:00:00 2001 From: tomit4 Date: Fri, 29 Aug 2025 03:38:56 -0700 Subject: [PATCH] :wrench: Copied self hosted docker apps --- .../.well-known/funding-manifest-urls | 2 + self_host/LibreTranslate/CONTRIBUTING.md | 140 ++ self_host/LibreTranslate/LICENSE | 661 +++++++++ self_host/LibreTranslate/README.md | 32 + self_host/LibreTranslate/TRADEMARK.md | 91 ++ self_host/LibreTranslate/VERSION | 1 + self_host/LibreTranslate/babel.cfg | 2 + .../LibreTranslate/docker-compose.cuda.yml | 34 + self_host/LibreTranslate/docker-compose.yml | 37 + self_host/LibreTranslate/docker/Dockerfile | 46 + .../LibreTranslate/docker/arm.Dockerfile | 44 + .../LibreTranslate/docker/cuda.Dockerfile | 46 + .../docker/root-with-sshd.Dockerfile | 105 ++ .../docker/user-with-api-key.Dockerfile | 78 + .../LibreTranslate/docs/CONTRIBUTING.es.md | 138 ++ self_host/LibreTranslate/docs/README.es.md | 748 ++++++++++ self_host/LibreTranslate/docs/TRADEMARK.es.md | 90 ++ self_host/LibreTranslate/k8s.yaml | 84 ++ .../LibreTranslate/libretranslate/__init__.py | 3 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 243 bytes .../__pycache__/app.cpython-313.pyc | Bin 0 -> 55369 bytes .../__pycache__/main.cpython-313.pyc | Bin 0 -> 11320 bytes .../LibreTranslate/libretranslate/api_keys.py | 112 ++ .../LibreTranslate/libretranslate/app.py | 1308 +++++++++++++++++ .../libretranslate/default_values.py | 247 ++++ .../LibreTranslate/libretranslate/detect.py | 54 + .../LibreTranslate/libretranslate/flood.py | 60 + .../LibreTranslate/libretranslate/init.py | 76 + .../LibreTranslate/libretranslate/language.py | 162 ++ .../LibreTranslate/libretranslate/locales.py | 97 ++ .../locales/ar/LC_MESSAGES/messages.po | 765 ++++++++++ .../libretranslate/locales/ar/meta.json | 4 + .../locales/az/LC_MESSAGES/messages.po | 771 ++++++++++ .../libretranslate/locales/az/meta.json | 4 + .../locales/be/LC_MESSAGES/messages.po | 767 ++++++++++ .../libretranslate/locales/be/meta.json | 4 + .../locales/bg/LC_MESSAGES/messages.po | 775 ++++++++++ .../libretranslate/locales/bg/meta.json | 4 + .../locales/bn/LC_MESSAGES/messages.po | 752 ++++++++++ .../libretranslate/locales/bn/meta.json | 4 + .../locales/ca/LC_MESSAGES/messages.po | 775 ++++++++++ .../libretranslate/locales/ca/meta.json | 4 + .../locales/ckb/LC_MESSAGES/messages.po | 731 +++++++++ .../locales/cs/LC_MESSAGES/messages.po | 775 ++++++++++ .../libretranslate/locales/cs/meta.json | 4 + .../locales/cv/LC_MESSAGES/messages.po | 739 ++++++++++ .../locales/da/LC_MESSAGES/messages.po | 772 ++++++++++ .../libretranslate/locales/da/meta.json | 4 + .../locales/de/LC_MESSAGES/messages.po | 779 ++++++++++ .../libretranslate/locales/de/meta.json | 4 + .../locales/el/LC_MESSAGES/messages.po | 774 ++++++++++ .../libretranslate/locales/el/meta.json | 4 + .../locales/eo/LC_MESSAGES/messages.po | 772 ++++++++++ .../libretranslate/locales/eo/meta.json | 4 + .../locales/es/LC_MESSAGES/messages.po | 779 ++++++++++ .../libretranslate/locales/es/meta.json | 4 + .../locales/et/LC_MESSAGES/messages.po | 775 ++++++++++ .../libretranslate/locales/et/meta.json | 4 + .../locales/eu/LC_MESSAGES/messages.po | 770 ++++++++++ .../libretranslate/locales/eu/meta.json | 4 + .../locales/ext/LC_MESSAGES/messages.po | 752 ++++++++++ .../libretranslate/locales/ext/meta.json | 4 + .../locales/fa/LC_MESSAGES/messages.po | 771 ++++++++++ .../libretranslate/locales/fa/meta.json | 4 + .../locales/fi/LC_MESSAGES/messages.po | 770 ++++++++++ .../libretranslate/locales/fi/meta.json | 4 + .../locales/fil/LC_MESSAGES/messages.po | 760 ++++++++++ .../libretranslate/locales/fil/meta.json | 4 + .../locales/fr/LC_MESSAGES/messages.po | 778 ++++++++++ .../libretranslate/locales/fr/meta.json | 4 + .../locales/ga/LC_MESSAGES/messages.po | 779 ++++++++++ .../libretranslate/locales/ga/meta.json | 4 + .../locales/gd/LC_MESSAGES/messages.po | 758 ++++++++++ .../libretranslate/locales/gd/meta.json | 4 + .../locales/gl/LC_MESSAGES/messages.po | 775 ++++++++++ .../libretranslate/locales/gl/meta.json | 4 + .../locales/he/LC_MESSAGES/messages.po | 763 ++++++++++ .../libretranslate/locales/he/meta.json | 4 + .../locales/hi/LC_MESSAGES/messages.po | 775 ++++++++++ .../libretranslate/locales/hi/meta.json | 4 + .../locales/hu/LC_MESSAGES/messages.po | 783 ++++++++++ .../libretranslate/locales/hu/meta.json | 4 + .../locales/id/LC_MESSAGES/messages.po | 774 ++++++++++ .../libretranslate/locales/id/meta.json | 4 + .../locales/it/LC_MESSAGES/messages.po | 776 ++++++++++ .../libretranslate/locales/it/meta.json | 4 + .../locales/ja/LC_MESSAGES/messages.po | 763 ++++++++++ .../libretranslate/locales/ja/meta.json | 4 + .../locales/kab/LC_MESSAGES/messages.po | 771 ++++++++++ .../libretranslate/locales/kab/meta.json | 4 + .../locales/kk/LC_MESSAGES/messages.po | 675 +++++++++ .../libretranslate/locales/kk/meta.json | 4 + .../locales/ko/LC_MESSAGES/messages.po | 766 ++++++++++ .../libretranslate/locales/ko/meta.json | 4 + .../locales/lt/LC_MESSAGES/messages.po | 747 ++++++++++ .../libretranslate/locales/lt/meta.json | 4 + .../locales/lv/LC_MESSAGES/messages.po | 749 ++++++++++ .../libretranslate/locales/lv/meta.json | 4 + .../libretranslate/locales/messages.pot | 729 +++++++++ .../locales/mia/LC_MESSAGES/messages.po | 755 ++++++++++ .../libretranslate/locales/mia/meta.json | 4 + .../locales/ms/LC_MESSAGES/messages.po | 765 ++++++++++ .../libretranslate/locales/ms/meta.json | 4 + .../locales/nb/LC_MESSAGES/messages.po | 782 ++++++++++ .../libretranslate/locales/nb/meta.json | 4 + .../locales/nl/LC_MESSAGES/messages.po | 776 ++++++++++ .../libretranslate/locales/nl/meta.json | 4 + .../locales/nn/LC_MESSAGES/messages.po | 754 ++++++++++ .../libretranslate/locales/nn/meta.json | 4 + .../locales/oc/LC_MESSAGES/messages.po | 772 ++++++++++ .../libretranslate/locales/oc/meta.json | 4 + .../locales/pa/LC_MESSAGES/messages.po | 757 ++++++++++ .../libretranslate/locales/pa/meta.json | 4 + .../locales/pl/LC_MESSAGES/messages.po | 770 ++++++++++ .../libretranslate/locales/pl/meta.json | 4 + .../locales/pt/LC_MESSAGES/messages.po | 775 ++++++++++ .../libretranslate/locales/pt/meta.json | 4 + .../locales/pt_BR/LC_MESSAGES/messages.po | 777 ++++++++++ .../libretranslate/locales/pt_BR/meta.json | 4 + .../locales/ro/LC_MESSAGES/messages.po | 770 ++++++++++ .../libretranslate/locales/ro/meta.json | 4 + .../locales/ru/LC_MESSAGES/messages.po | 781 ++++++++++ .../libretranslate/locales/ru/meta.json | 4 + .../locales/si/LC_MESSAGES/messages.po | 755 ++++++++++ .../libretranslate/locales/si/meta.json | 4 + .../locales/sk/LC_MESSAGES/messages.po | 767 ++++++++++ .../libretranslate/locales/sk/meta.json | 4 + .../locales/sl/LC_MESSAGES/messages.po | 747 ++++++++++ .../libretranslate/locales/sl/meta.json | 4 + .../locales/sq/LC_MESSAGES/messages.po | 764 ++++++++++ .../libretranslate/locales/sq/meta.json | 4 + .../locales/sr/LC_MESSAGES/messages.po | 770 ++++++++++ .../libretranslate/locales/sr/meta.json | 4 + .../locales/sv/LC_MESSAGES/messages.po | 785 ++++++++++ .../libretranslate/locales/sv/meta.json | 4 + .../locales/ta/LC_MESSAGES/messages.po | 754 ++++++++++ .../locales/th/LC_MESSAGES/messages.po | 746 ++++++++++ .../libretranslate/locales/th/meta.json | 4 + .../locales/tl/LC_MESSAGES/messages.po | 758 ++++++++++ .../libretranslate/locales/tl/meta.json | 4 + .../locales/tr/LC_MESSAGES/messages.po | 776 ++++++++++ .../libretranslate/locales/tr/meta.json | 4 + .../locales/ug/LC_MESSAGES/messages.po | 754 ++++++++++ .../libretranslate/locales/ug/meta.json | 4 + .../locales/uk/LC_MESSAGES/messages.po | 781 ++++++++++ .../libretranslate/locales/uk/meta.json | 4 + .../locales/ur/LC_MESSAGES/messages.po | 748 ++++++++++ .../libretranslate/locales/ur/meta.json | 4 + .../locales/vi/LC_MESSAGES/messages.po | 772 ++++++++++ .../libretranslate/locales/vi/meta.json | 4 + .../locales/zgh/LC_MESSAGES/messages.po | 754 ++++++++++ .../libretranslate/locales/zgh/meta.json | 4 + .../locales/zh/LC_MESSAGES/messages.po | 764 ++++++++++ .../libretranslate/locales/zh/meta.json | 4 + .../locales/zh_Hant/LC_MESSAGES/messages.po | 760 ++++++++++ .../libretranslate/locales/zh_Hant/meta.json | 4 + .../LibreTranslate/libretranslate/main.py | 297 ++++ .../LibreTranslate/libretranslate/manage.py | 63 + .../libretranslate/no_limiter.py | 13 + .../libretranslate/remove_translated_files.py | 26 + .../libretranslate/scheduler.py | 25 + .../LibreTranslate/libretranslate/secret.py | 121 ++ .../LibreTranslate/libretranslate/security.py | 16 + .../libretranslate/static/css/main.css | 488 ++++++ .../static/css/material-icons.css | 36 + .../static/css/materialize.min.css | 13 + .../libretranslate/static/css/prism.min.css | 1 + .../libretranslate/static/favicon.ico | Bin 0 -> 268350 bytes .../static/fonts/MaterialIcons-Regular.eot | Bin 0 -> 143258 bytes .../static/fonts/MaterialIcons-Regular.ttf | Bin 0 -> 128180 bytes .../static/fonts/MaterialIcons-Regular.woff | Bin 0 -> 57620 bytes .../static/fonts/MaterialIcons-Regular.woff2 | Bin 0 -> 44300 bytes .../libretranslate/static/icon.svg | 83 ++ .../static/js/materialize.min.js | 6 + .../libretranslate/static/js/prism.min.js | 1 + .../libretranslate/static/js/vue@2.js | 6 + .../LibreTranslate/libretranslate/storage.py | 179 +++ .../libretranslate/suggestions.py | 39 + .../libretranslate/templates/app.js.template | 631 ++++++++ .../libretranslate/templates/index.html | 381 +++++ .../libretranslate/tests/__init__.py | 0 .../libretranslate/tests/test_api/__init__.py | 0 .../libretranslate/tests/test_api/conftest.py | 19 + .../test_api/test_api_detect_language.py | 26 + .../test_api/test_api_frontend_settings.py | 4 + .../tests/test_api/test_api_get_languages.py | 16 + .../tests/test_api/test_api_spec.py | 10 + .../tests/test_api/test_api_translate.py | 61 + .../libretranslate/tests/test_init.py | 10 + self_host/LibreTranslate/main.py | 4 + self_host/LibreTranslate/manage.py | 4 + self_host/LibreTranslate/pyproject.toml | 140 ++ self_host/LibreTranslate/run.bat | 41 + self_host/LibreTranslate/run.sh | 92 ++ .../LibreTranslate/scripts/compile_locales.py | 30 + .../LibreTranslate/scripts/gunicorn_conf.py | 47 + .../LibreTranslate/scripts/healthcheck.py | 15 + .../LibreTranslate/scripts/install_models.py | 21 + .../scripts/suggestions-to-jsonl.py | 46 + .../LibreTranslate/scripts/update_locales.py | 161 ++ self_host/LibreTranslate/wsgi.py | 22 + self_host/pi-hole/docker-compose.yml | 29 + self_host/searxng-docker/Caddyfile | 91 ++ self_host/searxng-docker/LICENSE | 661 +++++++++ self_host/searxng-docker/README.md | 119 ++ self_host/searxng-docker/docker-compose.yaml | 23 + .../searxng-docker.service.template | 16 + self_host/searxng-docker/searxng/limiter.toml | 7 + self_host/searxng-docker/searxng/settings.yml | 40 + 209 files changed, 58596 insertions(+) create mode 100644 self_host/LibreTranslate/.well-known/funding-manifest-urls create mode 100644 self_host/LibreTranslate/CONTRIBUTING.md create mode 100644 self_host/LibreTranslate/LICENSE create mode 100644 self_host/LibreTranslate/README.md create mode 100644 self_host/LibreTranslate/TRADEMARK.md create mode 100644 self_host/LibreTranslate/VERSION create mode 100644 self_host/LibreTranslate/babel.cfg create mode 100644 self_host/LibreTranslate/docker-compose.cuda.yml create mode 100644 self_host/LibreTranslate/docker-compose.yml create mode 100644 self_host/LibreTranslate/docker/Dockerfile create mode 100644 self_host/LibreTranslate/docker/arm.Dockerfile create mode 100644 self_host/LibreTranslate/docker/cuda.Dockerfile create mode 100644 self_host/LibreTranslate/docker/root-with-sshd.Dockerfile create mode 100644 self_host/LibreTranslate/docker/user-with-api-key.Dockerfile create mode 100644 self_host/LibreTranslate/docs/CONTRIBUTING.es.md create mode 100644 self_host/LibreTranslate/docs/README.es.md create mode 100644 self_host/LibreTranslate/docs/TRADEMARK.es.md create mode 100644 self_host/LibreTranslate/k8s.yaml create mode 100644 self_host/LibreTranslate/libretranslate/__init__.py create mode 100644 self_host/LibreTranslate/libretranslate/__pycache__/__init__.cpython-313.pyc create mode 100644 self_host/LibreTranslate/libretranslate/__pycache__/app.cpython-313.pyc create mode 100644 self_host/LibreTranslate/libretranslate/__pycache__/main.cpython-313.pyc create mode 100644 self_host/LibreTranslate/libretranslate/api_keys.py create mode 100644 self_host/LibreTranslate/libretranslate/app.py create mode 100644 self_host/LibreTranslate/libretranslate/default_values.py create mode 100644 self_host/LibreTranslate/libretranslate/detect.py create mode 100644 self_host/LibreTranslate/libretranslate/flood.py create mode 100644 self_host/LibreTranslate/libretranslate/init.py create mode 100644 self_host/LibreTranslate/libretranslate/language.py create mode 100644 self_host/LibreTranslate/libretranslate/locales.py create mode 100644 self_host/LibreTranslate/libretranslate/locales/ar/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ar/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/az/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/az/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/be/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/be/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/bg/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/bg/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/bn/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/bn/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ca/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ca/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ckb/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/cs/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/cs/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/cv/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/da/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/da/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/de/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/de/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/el/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/el/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/eo/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/eo/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/es/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/es/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/et/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/et/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/eu/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/eu/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ext/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ext/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/fa/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/fa/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/fi/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/fi/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/fil/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/fil/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/fr/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/fr/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ga/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ga/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/gd/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/gd/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/gl/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/gl/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/he/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/he/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/hi/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/hi/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/hu/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/hu/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/id/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/id/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/it/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/it/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ja/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ja/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/kab/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/kab/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/kk/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/kk/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ko/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ko/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/lt/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/lt/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/lv/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/lv/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/messages.pot create mode 100644 self_host/LibreTranslate/libretranslate/locales/mia/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/mia/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ms/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ms/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/nb/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/nb/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/nl/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/nl/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/nn/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/nn/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/oc/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/oc/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/pa/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/pa/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/pl/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/pl/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/pt/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/pt/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/pt_BR/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/pt_BR/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ro/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ro/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ru/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ru/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/si/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/si/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/sk/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/sk/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/sl/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/sl/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/sq/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/sq/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/sr/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/sr/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/sv/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/sv/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ta/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/th/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/th/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/tl/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/tl/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/tr/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/tr/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ug/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ug/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/uk/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/uk/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/ur/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/ur/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/vi/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/vi/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/zgh/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/zgh/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/zh/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/zh/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/locales/zh_Hant/LC_MESSAGES/messages.po create mode 100644 self_host/LibreTranslate/libretranslate/locales/zh_Hant/meta.json create mode 100644 self_host/LibreTranslate/libretranslate/main.py create mode 100644 self_host/LibreTranslate/libretranslate/manage.py create mode 100644 self_host/LibreTranslate/libretranslate/no_limiter.py create mode 100644 self_host/LibreTranslate/libretranslate/remove_translated_files.py create mode 100644 self_host/LibreTranslate/libretranslate/scheduler.py create mode 100644 self_host/LibreTranslate/libretranslate/secret.py create mode 100644 self_host/LibreTranslate/libretranslate/security.py create mode 100644 self_host/LibreTranslate/libretranslate/static/css/main.css create mode 100644 self_host/LibreTranslate/libretranslate/static/css/material-icons.css create mode 100644 self_host/LibreTranslate/libretranslate/static/css/materialize.min.css create mode 100644 self_host/LibreTranslate/libretranslate/static/css/prism.min.css create mode 100644 self_host/LibreTranslate/libretranslate/static/favicon.ico create mode 100644 self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.eot create mode 100644 self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.ttf create mode 100644 self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.woff create mode 100644 self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.woff2 create mode 100644 self_host/LibreTranslate/libretranslate/static/icon.svg create mode 100644 self_host/LibreTranslate/libretranslate/static/js/materialize.min.js create mode 100644 self_host/LibreTranslate/libretranslate/static/js/prism.min.js create mode 100644 self_host/LibreTranslate/libretranslate/static/js/vue@2.js create mode 100644 self_host/LibreTranslate/libretranslate/storage.py create mode 100644 self_host/LibreTranslate/libretranslate/suggestions.py create mode 100644 self_host/LibreTranslate/libretranslate/templates/app.js.template create mode 100644 self_host/LibreTranslate/libretranslate/templates/index.html create mode 100644 self_host/LibreTranslate/libretranslate/tests/__init__.py create mode 100644 self_host/LibreTranslate/libretranslate/tests/test_api/__init__.py create mode 100644 self_host/LibreTranslate/libretranslate/tests/test_api/conftest.py create mode 100644 self_host/LibreTranslate/libretranslate/tests/test_api/test_api_detect_language.py create mode 100644 self_host/LibreTranslate/libretranslate/tests/test_api/test_api_frontend_settings.py create mode 100644 self_host/LibreTranslate/libretranslate/tests/test_api/test_api_get_languages.py create mode 100644 self_host/LibreTranslate/libretranslate/tests/test_api/test_api_spec.py create mode 100644 self_host/LibreTranslate/libretranslate/tests/test_api/test_api_translate.py create mode 100644 self_host/LibreTranslate/libretranslate/tests/test_init.py create mode 100644 self_host/LibreTranslate/main.py create mode 100644 self_host/LibreTranslate/manage.py create mode 100644 self_host/LibreTranslate/pyproject.toml create mode 100644 self_host/LibreTranslate/run.bat create mode 100755 self_host/LibreTranslate/run.sh create mode 100755 self_host/LibreTranslate/scripts/compile_locales.py create mode 100644 self_host/LibreTranslate/scripts/gunicorn_conf.py create mode 100644 self_host/LibreTranslate/scripts/healthcheck.py create mode 100755 self_host/LibreTranslate/scripts/install_models.py create mode 100755 self_host/LibreTranslate/scripts/suggestions-to-jsonl.py create mode 100755 self_host/LibreTranslate/scripts/update_locales.py create mode 100644 self_host/LibreTranslate/wsgi.py create mode 100644 self_host/pi-hole/docker-compose.yml create mode 100644 self_host/searxng-docker/Caddyfile create mode 100644 self_host/searxng-docker/LICENSE create mode 100644 self_host/searxng-docker/README.md create mode 100644 self_host/searxng-docker/docker-compose.yaml create mode 100644 self_host/searxng-docker/searxng-docker.service.template create mode 100644 self_host/searxng-docker/searxng/limiter.toml create mode 100644 self_host/searxng-docker/searxng/settings.yml diff --git a/self_host/LibreTranslate/.well-known/funding-manifest-urls b/self_host/LibreTranslate/.well-known/funding-manifest-urls new file mode 100644 index 00000000..b419350a --- /dev/null +++ b/self_host/LibreTranslate/.well-known/funding-manifest-urls @@ -0,0 +1,2 @@ +https://libretranslate.com/funding.json + diff --git a/self_host/LibreTranslate/CONTRIBUTING.md b/self_host/LibreTranslate/CONTRIBUTING.md new file mode 100644 index 00000000..ee4ded68 --- /dev/null +++ b/self_host/LibreTranslate/CONTRIBUTING.md @@ -0,0 +1,140 @@ +# Contributing + +If you want to make changes to the code, you can build from source, and run the API. + +## Build Dependencies + +* cmake + +### Debian / Ubuntu + +```sh +sudo apt-get install cmake +``` + +### Fedora / RHEL + +```sh +sudo dnf install cmake +``` + +## Getting Started + +Install [`hatch`](https://hatch.pypa.io) to manage the projects dependencies and run dev scripts: + +```bash +pipx install hatch +``` + +Clone the repository: + +```bash +git clone https://github.com/LibreTranslate/LibreTranslate.git +cd LibreTranslate +``` + +Hatch will automatically install the required dependencies in a virtual environment, and enable [`pre-commit`](https://pre-commit.com/), which will run before each commit to run formatting. You can ignore `pre-commit` checks when committing if necessary: `git commit --no-verify -m "Fix"` + +Run in development: + +```bash +hatch run dev --debug +``` + +Then open a web browser to + +You can also start a new shell in a virtual environment with libretranslate installed: + +```bash +hatch shell +libretranslate [args] +# Or +python main.py [args] +``` + +> You can still use `pip install -e ".[test]"` directly if you don't want to use hatch. + +## Run the tests + +Run the test suite and linting checks: + +```bash +hatch run test +``` + +To display all `print()` when debugging: + +```bash +hatch run test -s +``` + +You can also run the tests on multiple python versions: + +```bash +hatch run all:test +``` + +You can clean the virtual environment with: + +```bash +hatch env prune +``` + +## Run with Docker + +Linux/macOS: `./run.sh [args]` +Windows: `run.bat [args]` + +Then open a web browser to + +## Build with Docker + +```bash +docker build -f docker/Dockerfile [--build-arg with_models=true] -t libretranslate . +``` + +If you want to run the Docker image in a complete offline environment, you need to add the `--build-arg with_models=true` parameter. Then the language models are downloaded during the build process of the image. Otherwise, these models get downloaded on the first run of the image/container. + +Run the built image: + +```bash +docker run -it -p 5000:5000 libretranslate [args] +``` + +Or build and run using Docker Compose: + +```bash +docker compose up -d --build +``` + +> Feel free to change the [`docker-compose.yml`](https://github.com/LibreTranslate/LibreTranslate/blob/main/docker-compose.yml) file to adapt it to your deployment needs, or use an extra `docker-compose.prod.yml` file for your deployment configuration. +> +> The models are stored inside the container under `/home/libretranslate/.local/share` and `/home/libretranslate/.local/cache`. Feel free to use volumes if you do not want to redownload the models when the container is destroyed. To update the models, use the `--update-models` argument. + +## FAQ + +### Externally Managed Environment + +Some users may encounter the following error while installing packages: + +``` +error: externally-managed-environment + +× This environment is externally managed +╰─> To install Python packages system-wide, try apt install + python3-xyz, where xyz is the package you are trying to + install. + + … +``` + +This occurs when your operating system depends on and manages Python for core functionality. In this case, you should install and setup venv (virtual environments) to manage project dependencies. + +This prevents pip packages from being installed system-wide. This way, there are no risks of pip packages conflicting between multiple projects or the operating system. + +References: +* [Python venv documentation](https://docs.python.org/library/venv.html) + +## Other Languages + +- [Español (CONTRIBUTING)](docs/CONTRIBUTING.es.md) \ No newline at end of file diff --git a/self_host/LibreTranslate/LICENSE b/self_host/LibreTranslate/LICENSE new file mode 100644 index 00000000..0ad25db4 --- /dev/null +++ b/self_host/LibreTranslate/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/self_host/LibreTranslate/README.md b/self_host/LibreTranslate/README.md new file mode 100644 index 00000000..3c34736a --- /dev/null +++ b/self_host/LibreTranslate/README.md @@ -0,0 +1,32 @@ +# LibreTranslate + +[Try it online!](https://libretranslate.com) | [API Docs](https://docs.libretranslate.com) | [Community Forum](https://community.libretranslate.com/) | [Bluesky](https://bsky.app/profile/libretranslate.com) + +[![Python versions](https://img.shields.io/pypi/pyversions/libretranslate)](https://pypi.org/project/libretranslate) [![Run tests](https://github.com/LibreTranslate/LibreTranslate/workflows/Run%20tests/badge.svg)](https://github.com/LibreTranslate/LibreTranslate/actions?query=workflow%3A%22Run+tests%22) [![Build and Publish Docker Image](https://github.com/LibreTranslate/LibreTranslate/actions/workflows/publish-docker.yml/badge.svg)](https://github.com/LibreTranslate/LibreTranslate/actions/workflows/publish-docker.yml) [![Publish package](https://github.com/LibreTranslate/LibreTranslate/actions/workflows/publish-package.yml/badge.svg)](https://github.com/LibreTranslate/LibreTranslate/actions/workflows/publish-package.yml) [![Awesome Humane Tech](https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true)](https://codeberg.org/teaserbot-labs/delightful-humane-design) + +Free and Open Source Machine Translation API, entirely self-hosted. Unlike other APIs, it doesn't rely on proprietary providers such as Google or Azure to perform translations. Instead, its translation engine is powered by the open source [Argos Translate](https://github.com/argosopentech/argos-translate) library. + +![Translation](https://github.com/user-attachments/assets/457696b5-dbff-40ab-a18e-7bfb152c5121) + +## Getting Started + +- [Quickstart](https://docs.libretranslate.com/) +- [Usage Instructions](https://docs.libretranslate.com/guides/api_usage/) +- [Community Resources](https://docs.libretranslate.com/community/resources/) + +## Credits + +This work is largely possible thanks to [Argos Translate](https://github.com/argosopentech/argos-translate), which powers the translation engine. + +## License + +[GNU Affero General Public License v3](https://www.gnu.org/licenses/agpl-3.0.en.html) + +## Trademark + +See [Trademark Guidelines](https://github.com/LibreTranslate/LibreTranslate/blob/main/TRADEMARK.md) + +## Other Languages + +- [Español (README)](docs/README.es.md) + diff --git a/self_host/LibreTranslate/TRADEMARK.md b/self_host/LibreTranslate/TRADEMARK.md new file mode 100644 index 00000000..9e422441 --- /dev/null +++ b/self_host/LibreTranslate/TRADEMARK.md @@ -0,0 +1,91 @@ +# LibreTranslate Trademark Guidelines + +LibreTranslate is an open source organization. Because we make our code available to download and modify, proper use of our trademarks is essential to inform users whether or not LibreTranslate stands behind a product or service. When using LibreTranslate trademarks (including some product names that are part of our organization) you must comply with these LibreTranslate Trademark Guidelines. + +Some of our trademark names include: + + * LibreTranslate + * LTEngine + +Some of our trademark logos include: + + ![LibreTranslate](https://avatars.githubusercontent.com/u/77352747?s=200&v=4) + +However, this is not a complete list of our names, logos, and brand features, all of which are subject to these guidelines. + +If you want to report misuse of an LibreTranslate trademark, please contact us via https://uav4geo.com/contact + +## When do I need specific permission to use an LibreTranslate trademark? + +Noting that LibreTranslate software combined with, or integrated into, any other software program, including but not limited to automation software for offering LibreTranslate as a cloud service or orchestration software for offering LibreTranslate in containers is considered "modified" LibreTranslate software, you may do the following without receiving specific permission from LibreTranslate (or its affiliates): + + * Use LibreTranslate wordmarks and/or logos in unmodified versions of LibreTranslate programs, products, services and technologies. + * Use LibreTranslate wordmarks in text to truthfully refer to and/or link to unmodified LibreTranslate programs, products, services and technologies. + * Use LibreTranslate logos in visuals to truthfully refer to and/or to link to the applicable programs, products, services and technologies hosted on LibreTranslate servers. + * Use LibreTranslate wordmarks to explain that your software is based on LibreTranslate's open source code, or is compatible with LibreTranslate's software. + * Describe a social media account, page, or community in accordance with the [Social Media Guidelines](#social-media-guidelines). + +All other uses of an LibreTranslate trademark require our prior written permission. This includes any use of a LibreTranslate trademark in a domain name. Contact us at https://uav4geo.com/contact for more information. + +## When allowed, how should I use an LibreTranslate trademark? + +### General Guidelines + +#### Do: + + * Use the LibreTranslate trademark exactly as shown in the list above. + * Use LibreTranslate wordmarks only as an adjective, never as a noun or verb. Do not use them in plural or possessive forms. Instead, use the generic term for the LibreTranslate product or service following the trademark, for example: LibreTranslate translation software. + +#### Don't: + + * Don't use LibreTranslate trademarks in the name of your business, product, service, app, domain name, publication, or other offering. + * Don't use marks, logos, company names, slogans, domain names, or designs that are confusingly similar to LibreTranslate trademarks. + * Don't use LibreTranslate trademarks in a way that incorrectly implies affiliation with, or sponsorship, endorsement, or approval by LibreTranslate of your products or services. + * Don't display LibreTranslate trademarks more prominently than your product, service, or company name. + * Don't use LibreTranslate trademarks on merchandise for sale (e.g., selling t-shirts, mugs, etc.) + * Don't use LibreTranslate trademarks for any other form of commercial use (e.g. offering technical support services), unless such use is limited to a truthful and descriptive reference (e.g. Independent technical support for LibreTranslate's software). + * Don't modify LibreTranslate's trademarks, abbreviate them, or combine them with any other symbols, words, or images, or incorporate them into a tagline or slogan. + + ### Social Media Guidelines + +In addition to the General Guidelines above, the name and handle of your social media account and any and all pages cannot begin with an LibreTranslate trademark. In addition, LibreTranslate logos cannot be used in a way that might suggest affiliation with LibreTranslate, including, but not limited to, the account, profile, or header images. The only exception to these requirements is if you've received prior permission from LibreTranslate. + +For example, you cannot name your account, page, or community "LibreTranslate Representatives" or "LibreTranslate Software". However, it would be acceptable to name your account, page, or community "Fans of LibreTranslate" or "Information about LibreTranslate Software" as long as you do not use the LibreTranslate trademarks or LibreTranslate logos or otherwise suggest any affiliation with LibreTranslate. + +### Open Source Project Guidelines + +The specific license for each of LibreTranslate's software products and code says what you can and cannot do with the code itself but does not give permission to use LibreTranslate's trademarks. If you choose to build on or modify LibreTranslate's open source code for your own project, + +#### You Must: + + * Follow the terms of the Open Source License(s) for LibreTranslate software products and code. + * Choose branding, logos, and trademarks that denotes your own unique identity so as to clearly signal to users that there is no affiliation with or endorsement by LibreTranslate. + * Follow the General Guidelines, above. + +#### You Must NOT: + +* Use any LibreTranslate trademark in connection with the user-facing name or branding of your project. + * Use any LibreTranslate trademark or any part of any LibreTranslate trademark to incorrectly suggest or give the impression your software is actually published by, affiliated with, or endorsed by LibreTranslate. + +For example, please do not name your project, [Something]-LibreTranslate, or LibreTranslate-[Something] + +#### You May: + + * State in words (not using logos or images) that your product "works with" or "is compatible" with certain LibreTranslate software products, if that is true. + * State in words (not using logos or images) that your project is based on LibreTranslate open source technology, if that is true, as long as you also include a statement that your project is not officially associated with LibreTranslate or its products. + +For instance, you may state that your project: + +"is proudly built from LibreTranslate's open source software" + +as long as you also include the statement equally prominently: + +"[Brand Name] and [Product Name] are not officially associated with LibreTranslate or its products." + +### LibreTranslate Community Guidelines + +Various permissions to use LibreTranslate Trademarks have been provided to various members of the LibreTranslate Community, and these LibreTranslate Trademark Guidelines do not alter any such previously granted permissions. + +## Other Languages + +- [Español (TRADEMARK)](/docs/TRADEMARK.es.md) diff --git a/self_host/LibreTranslate/VERSION b/self_host/LibreTranslate/VERSION new file mode 100644 index 00000000..f8a696c8 --- /dev/null +++ b/self_host/LibreTranslate/VERSION @@ -0,0 +1 @@ +1.7.2 diff --git a/self_host/LibreTranslate/babel.cfg b/self_host/LibreTranslate/babel.cfg new file mode 100644 index 00000000..b335d317 --- /dev/null +++ b/self_host/LibreTranslate/babel.cfg @@ -0,0 +1,2 @@ +[python: **.py] +[jinja2: **/templates/**] \ No newline at end of file diff --git a/self_host/LibreTranslate/docker-compose.cuda.yml b/self_host/LibreTranslate/docker-compose.cuda.yml new file mode 100644 index 00000000..6d3d7ba3 --- /dev/null +++ b/self_host/LibreTranslate/docker-compose.cuda.yml @@ -0,0 +1,34 @@ +services: + libretranslate: + container_name: libretranslate + image: libretranslate/libretranslate:latest-cuda + ports: + - "5000:5000" + restart: unless-stopped + command: --disable-web-ui + environment: + - LT_API_KEYS_DB_PATH=/app/db/api_keys.db + - LT_API_KEYS=True + - LT_REQ_LIMIT=120 + - LT_UPDATE_MODELS=True + - LT_DEBUG=True + - PUID=root + volumes: + - ${libretranslate_data_folder}/db:/app/db + - ${libretranslate_data_folder}/data:/root/.local:rw + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + ## Uncomment this for logging in docker compose logs + # tty: true +# './venv/bin/python is not implemented in the cuda docker yet +# healthcheck: +# test: ['CMD-SHELL', './venv/bin/python scripts/healthcheck.py'] +# interval: 10s +# timeout: 4s +# retries: 4 +# start_period: 5s diff --git a/self_host/LibreTranslate/docker-compose.yml b/self_host/LibreTranslate/docker-compose.yml new file mode 100644 index 00000000..c4c08810 --- /dev/null +++ b/self_host/LibreTranslate/docker-compose.yml @@ -0,0 +1,37 @@ +# NOTE: Afterwards sh into the docker and install all the models: +# docker exec -it sh +# cd scripts +# ./install_models.py +# NOTE: You'll need to install a lot of packages using pip, just keep going, eventually the script will work +services: + libretranslate: + container_name: libretranslate + image: libretranslate/libretranslate:latest + ports: + - "5000:5000" + restart: unless-stopped + healthcheck: + test: ['CMD-SHELL', './venv/bin/python scripts/healthcheck.py'] + interval: 10s + timeout: 4s + retries: 4 + start_period: 5s + ## Uncomment this for logging in docker compose logs + # tty: true + ## Uncomment above command and define your args if necessary + # command: --ssl --ga-id MY-GA-ID --req-limit 100 --char-limit 500 + ## Uncomment this section and the libretranslate_api_keys volume if you want to backup your API keys + # environment: + # - LT_API_KEYS=true + # - LT_API_KEYS_DB_PATH=/app/db/api_keys.db # Same result as `db/api_keys.db` or `./db/api_keys.db` + ## Uncomment these vars and libretranslate_models volume to optimize loading time. + # - LT_UPDATE_MODELS=true + # - LT_LOAD_ONLY=en,fr + # volumes: + # - libretranslate_api_keys:/app/db + # Keep the models in a docker volume, to avoid re-downloading on startup + # - libretranslate_models:/home/libretranslate/.local:rw + +# volumes: +# libretranslate_api_keys: +# libretranslate_models: diff --git a/self_host/LibreTranslate/docker/Dockerfile b/self_host/LibreTranslate/docker/Dockerfile new file mode 100644 index 00000000..d1219ec1 --- /dev/null +++ b/self_host/LibreTranslate/docker/Dockerfile @@ -0,0 +1,46 @@ +FROM python:3.11.11-slim-bullseye AS builder + +WORKDIR /app + +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update -qq \ + && apt-get -qqq install --no-install-recommends -y pkg-config gcc g++ \ + && apt-get upgrade --assume-yes \ + && apt-get clean \ + && rm -rf /var/lib/apt + +RUN python -mvenv venv && ./venv/bin/pip install --no-cache-dir --upgrade pip + +COPY . . + +# Install package from source code, compile translations +RUN ./venv/bin/pip install Babel==2.12.1 && ./venv/bin/python scripts/compile_locales.py \ + && ./venv/bin/pip install torch==2.2.0 --extra-index-url https://download.pytorch.org/whl/cpu \ + && ./venv/bin/pip install "numpy<2" \ + && ./venv/bin/pip install . \ + && ./venv/bin/pip cache purge + +FROM python:3.11.11-slim-bullseye + +ARG with_models=false +ARG models="" + +RUN addgroup --system --gid 1032 libretranslate && adduser --system --uid 1032 libretranslate && mkdir -p /home/libretranslate/.local && chown -R libretranslate:libretranslate /home/libretranslate/.local +USER libretranslate + +COPY --from=builder --chown=1032:1032 /app /app +WORKDIR /app + +COPY --from=builder --chown=1032:1032 /app/venv/bin/ltmanage /usr/bin/ + +RUN if [ "$with_models" = "true" ]; then \ + # initialize the language models + if [ ! -z "$models" ]; then \ + ./venv/bin/python scripts/install_models.py --load_only_lang_codes "$models"; \ + else \ + ./venv/bin/python scripts/install_models.py; \ + fi \ + fi + +EXPOSE 5000 +ENTRYPOINT [ "./venv/bin/libretranslate", "--host", "*" ] diff --git a/self_host/LibreTranslate/docker/arm.Dockerfile b/self_host/LibreTranslate/docker/arm.Dockerfile new file mode 100644 index 00000000..8788f655 --- /dev/null +++ b/self_host/LibreTranslate/docker/arm.Dockerfile @@ -0,0 +1,44 @@ +FROM arm64v8/python:3.11.11-slim-bullseye as builder + +WORKDIR /app + +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update -qq \ + && apt-get -qqq install --no-install-recommends -y pkg-config gcc g++ \ + && apt-get upgrade --assume-yes \ + && apt-get clean \ + && rm -rf /var/lib/apt + +RUN python -mvenv venv && ./venv/bin/pip install --no-cache-dir --upgrade pip + +COPY . . + +# Install package from source code, compile translations +RUN ./venv/bin/pip install Babel==2.12.1 && ./venv/bin/python scripts/compile_locales.py \ + && ./venv/bin/pip install torch==2.0.1 --extra-index-url https://download.pytorch.org/whl/cpu \ + && ./venv/bin/pip install "numpy<2" \ + && ./venv/bin/pip install . \ + && ./venv/bin/pip cache purge + +FROM arm64v8/python:3.11.11-slim-bullseye + +ARG with_models=false +ARG models="" + +RUN addgroup --system --gid 1032 libretranslate && adduser --system --uid 1032 libretranslate && mkdir -p /home/libretranslate/.local && chown -R libretranslate:libretranslate /home/libretranslate/.local +USER libretranslate + +COPY --from=builder --chown=1032:1032 /app /app +WORKDIR /app + +RUN if [ "$with_models" = "true" ]; then \ + # initialize the language models + if [ ! -z "$models" ]; then \ + ./venv/bin/python scripts/install_models.py --load_only_lang_codes "$models"; \ + else \ + ./venv/bin/python scripts/install_models.py; \ + fi \ + fi + +EXPOSE 5000 +ENTRYPOINT [ "./venv/bin/libretranslate", "--host", "*" ] diff --git a/self_host/LibreTranslate/docker/cuda.Dockerfile b/self_host/LibreTranslate/docker/cuda.Dockerfile new file mode 100644 index 00000000..9ce0751a --- /dev/null +++ b/self_host/LibreTranslate/docker/cuda.Dockerfile @@ -0,0 +1,46 @@ +FROM nvidia/cuda:12.4.1-devel-ubuntu20.04 + +ENV ARGOS_DEVICE_TYPE auto +ARG with_models=false +ARG models="" + +WORKDIR /app + +ARG DEBIAN_FRONTEND=noninteractive +RUN apt-get update -qq \ + && apt-get -qqq install --no-install-recommends -y libicu-dev libaspell-dev libcairo2 libcairo2-dev pkg-config gcc g++ python3.8-dev python3-pip libpython3.8-dev\ + && apt-get upgrade --assume-yes \ + && apt-get clean \ + && rm -rf /var/lib/apt + +RUN pip3 install --no-cache-dir --upgrade pip && apt-get remove python3-pip --assume-yes + +RUN ln -s /usr/bin/python3 /usr/bin/python + +RUN pip3 install --no-cache-dir torch==1.12.0+cu116 -f https://download.pytorch.org/whl/torch_stable.html + +COPY . . + +RUN if [ "$with_models" = "true" ]; then \ + # install only the dependencies first + pip3 install --no-cache-dir -e .; \ + # initialize the language models + if [ ! -z "$models" ]; then \ + ./scripts/install_models.py --load_only_lang_codes "$models"; \ + else \ + ./scripts/install_models.py; \ + fi \ + fi + +# Install package from source code +RUN pip3 install Babel==2.12.1 && python3 scripts/compile_locales.py \ + && pip3 install "numpy<2" \ + && pip3 install . \ + && pip3 cache purge + +# Depending on your cuda install you may need to uncomment this line to allow the container to access the cuda libraries +# See: https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#post-installation-actions +# ENV LD_LIBRARY_PATH=/usr/local/cuda/lib:/usr/local/cuda/lib64 + +EXPOSE 5000 +ENTRYPOINT [ "libretranslate", "--host", "*" ] diff --git a/self_host/LibreTranslate/docker/root-with-sshd.Dockerfile b/self_host/LibreTranslate/docker/root-with-sshd.Dockerfile new file mode 100644 index 00000000..90b55797 --- /dev/null +++ b/self_host/LibreTranslate/docker/root-with-sshd.Dockerfile @@ -0,0 +1,105 @@ +FROM python:3.11.11-slim-bullseye AS builder + +WORKDIR /app + +ARG DEBIAN_FRONTEND=noninteractive +RUN <'/app/start.sh' < + +También puedes iniciar una nueva shell en un entorno virtual con libretranslate instalado: + +```bash +hatch shell +libretranslate [args] +# O +python main.py [args] +``` + +> Puedes usar `pip install -e ".[test]"` directamente si no quieres usar Hatch. + +## Ejecutar las pruebas + +Ejecutar el conjunto de pruebas y las comprobaciones de linting: + +```bash +hatch run test +``` + +Para mostrar todos los `print()` durante la depuración: + +```bash +hatch run test -s +``` + +También puedes ejecutar las pruebas en varias versiones de Python: + +```bash +hatch run all:test +``` + +Puedes limpiar el entorno virtual con: + +```bash +hatch env prune +``` + +## Ejecutar con Docker + +Linux/MacOS: `./run.sh [args]` +Windows: `run.bat [args]` + +Luego, abre un navegador web en + +## Construir con Docker + +```bash +docker build -f docker/Dockerfile [--build-arg with_models=true] -t libretranslate . +``` + +Si quieres ejecutar la imagen de Docker en un entorno completamente sin conexión, debes agregar el parámetro `--build-arg with_models=true`. Los modelos de lenguaje se descargan durante el proceso de construcción de la imagen. De lo contrario, estos modelos se descargan durante la primera ejecución de la imagen/contenedor. + +Ejecute la imagen compilada: + +```bash +docker run -it -p 5000:5000 libretranslate [args] +``` + +O compila y ejecuta con Docker Compose: + +```bash +docker compose up -d --build +``` + +> Puedes modificar el archivo [`docker-compose.yml`](https://github.com/LibreTranslate/LibreTranslate/blob/main/docker-compose.yml) para adaptarlo a tus necesidades de implementación o usar un archivo `docker-compose.prod.yml` adicional para la configuración de tu implementación. +> +> Los modelos se almacenan dentro del contenedor en `/home/libretranslate/.local/share` y `/home/libretranslate/.local/cache`. Puedes usar volúmenes si no quieres volver a descargar los modelos cuando se destruya el contenedor. Para actualizar los modelos, usa el argumento `--update-models`. + +## Preguntas frecuentes + +### Entorno administrado externamente + +Algunos usuarios pueden encontrar el siguiente error al instalar paquetes: + +``` +error: externally-managed-environment + +× Este entorno está administrado externamente +╰─> Para instalar paquetes de Python en todo el sistema, pruebe apt install python3-xyz, donde xyz es el paquete que intenta instalar. + + … +``` + +Esto ocurre cuando su sistema operativo depende de Python y lo administra para su funcionalidad principal. En este caso, debe instalar y configurar venv (entornos virtuales) para administrar las dependencias del proyecto. + +Esto evita que los paquetes pip se instalen en todo el sistema. De esta manera, se evita el riesgo de que los paquetes pip entren en conflicto entre varios proyectos o el sistema operativo. + +Referencias: +* [Documentación de venv sobre Python](https://docs.python.org/library/venv.html) + +## Otros idiomas + +- [English (CONTRIBUTING)](/CONTRIBUTING.md) \ No newline at end of file diff --git a/self_host/LibreTranslate/docs/README.es.md b/self_host/LibreTranslate/docs/README.es.md new file mode 100644 index 00000000..77b8588f --- /dev/null +++ b/self_host/LibreTranslate/docs/README.es.md @@ -0,0 +1,748 @@ +# LibreTranslate + +[Pruébalo en línea!](https://libretranslate.com) | [Documentación de la API](https://libretranslate.com/docs) | [Foro de la Comunidad](https://community.libretranslate.com/) | [Bluesky](https://bsky.app/profile/libretranslate.com) + +[![Versiones de python](https://img.shields.io/pypi/pyversions/libretranslate)](https://pypi.org/project/libretranslate) [![Ejecutar Pruebas](https://github.com/LibreTranslate/LibreTranslate/workflows/Run%20tests/badge.svg)](https://github.com/LibreTranslate/LibreTranslate/actions?query=workflow%3A%22Run+tests%22) [![Crear y Publicar Imagen de Docker](https://github.com/LibreTranslate/LibreTranslate/actions/workflows/publish-docker.yml/badge.svg)](https://github.com/LibreTranslate/LibreTranslate/actions/workflows/publish-docker.yml) [![Publicar paquete](https://github.com/LibreTranslate/LibreTranslate/actions/workflows/publish-package.yml/badge.svg)](https://github.com/LibreTranslate/LibreTranslate/actions/workflows/publish-package.yml) [![Increible Technologia Humana](https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true)](https://codeberg.org/teaserbot-labs/delightful-humane-design) + +API de traducción automática gratuita y de código abierto, completamente alojada en el propio servidor. A diferencia de otras API, no depende de proveedores propietarios como Google o Azure para realizar las traducciones. En su lugar, su motor de traducción se basa en código abierto. [Argos Translate](https://github.com/argosopentech/argos-translate) libreria. + +![Traducción](https://github.com/user-attachments/assets/457696b5-dbff-40ab-a18e-7bfb152c5121) + +[Pruébalo en línea!](https://libretranslate.com) | [Documentación de la API](https://libretranslate.com/docs) + +## Ejemplos de la API + +### Básico + +Solicitud: + +```javascript +const res = await fetch("https://libretranslate.com/translate", { + method: "POST", + body: JSON.stringify({ + q: "Hello!", + source: "en", + target: "es", + }), + headers: { "Content-Type": "application/json" }, +}); + +console.log(await res.json()); +``` + +Respuesta: + +```javascript +{ + "translatedText": "¡Hola!" +} +``` + +Lista de códigos de idiomas: https://libretranslate.com/languages + +### Detección automática de idioma + +Solicitud: + +```javascript +const res = await fetch("https://libretranslate.com/translate", { + method: "POST", + body: JSON.stringify({ + q: "Ciao!", + source: "auto", + target: "es", + }), + headers: { "Content-Type": "application/json" }, +}); + +console.log(await res.json()); +``` + +Respuesta: + +```javascript +{ + "detectedLanguage": { + "confidence": 83, + "language": "it" + }, + "translatedText": "Adios!" +} +``` + +### HTML + +Solicitud: + +```javascript +const res = await fetch("https://libretranslate.com/translate", { + method: "POST", + body: JSON.stringify({ + q: '

Hello!

', + source: "en", + target: "es", + format: "html", + }), + headers: { "Content-Type": "application/json" }, +}); + +console.log(await res.json()); +``` + +Respuesta: + +```javascript +{ + "translatedText": "

¡Hola!

" +} +``` + +### Traducciones Alternativas + +Solicitud: + +```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()); +``` + +Respuesta: + +```javascript +{ + "alternatives": [ + "Salve", + "Pronto" + ], + "translatedText": "Ciao" +} +``` + +## Instalar y Ejecutar + +Puedes ejecutar tu propio servidor API con solo unas pocas líneas de configuración! + +Asegúrate de tener instalado Python (se recomienda la versión 3.8 o superior) y, a continuación, simplemente ejecuta: + +```bash +pip install libretranslate +libretranslate [args] +``` + +Luego abra un navegador web para + +De forma predeterminada, LibreTranslate instalará compatibilidad con todos los idiomas disponibles. Para cargar solo ciertos idiomas y reducir el tiempo de inicio, puede usar el argumento **--load-only**: + +```bash +libretranslate --load-only en,es,fr +``` + +Consulte también los demás [arguments](#settings--flags) a continuación. + +En Ubuntu 20.04, también puede usar el script de instalación disponible en + +## Ejecutar con Docker + +También puede ejecutar la aplicación con [docker](https://docker.com): + +### Linux/macOS + +```bash +./run.sh [args] +``` + +### Windows + +```bash +run.bat [args] +``` + +## Compilación y ejecución + +Consulta [CONTRIBUTING.md](./CONTRIBUTING.md) para obtener información sobre cómo compilar y ejecutar el proyecto tú mismo. + +### CUDA + +Puedes usar la aceleración por hardware para acelerar las traducciones en un equipo con GPU con CUDA 12.4.1 y [nvidia-docker](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html) instalados. + +Ejecuta esta versión con: + +```bash +docker compose -f docker-compose.cuda.yml up -d --build +``` + +## Argumentos + +Los argumentos que se pasan al proceso o se configuran mediante variables de entorno se dividen en dos tipos. + +- Ajustes o indicadores de tiempo de ejecución que se utilizan para alternar modos de ejecución específicos o deshabilitar partes de la aplicación. Actúan como un interruptor al agregarse o eliminarse. + +- Parámetros de configuración para establecer varios límites y configurar la aplicación. Estos requieren que se pase un parámetro para funcionar. Si se eliminan, se utilizan los parámetros predeterminados. + +### Configuración / Indicadores + + +| Argumento | Descripción | Configuración predeterminada | Sobre nombre | +| ----------------------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------- | ------------------------------ | +| --debug | Habilitar entorno de depuración | `Desactivado` | LT_DEBUG | +| --ssl | Si habilitar SSL | `Desactivado` | LT_SSL | +| --api-keys | Habilitar la base de datos de claves API para los límites de velocidad por cliente cuando se alcanza --req-limit | `No utilice claves API` | LT_API_KEYS | +| --require-api-key-origin | Requerir el uso de una clave API para el acceso programático a la API, a menos que el origen de la solicitud coincida con este dominio | `Sin restricciones sobre el origen del dominio` | LT_REQUIRE_API_KEY_ORIGIN | +| --require-api-key-secret | Requerir el uso de una clave API para el acceso programático a la API, a menos que el cliente también envíe una coincidencia secreta | `No se requieren secretos` | LT_REQUIRE_API_KEY_SECRET | +| --require-api-key-fingerprint | Requerir el uso de una clave API para el acceso programático a la API, a menos que el cliente también coincida con una huella digital | `No se requieren huellas digitales` | LT_REQUIRE_API_KEY_FINGERPRINT | +| --under-attack | Habilitar el modo bajo ataque. Cuando está habilitado, las solicitudes deben realizarse con una clave API. | `Desactivado` | LT_UNDER_ATTACK | +| --suggestions | Permitir sugerencias de usuarios | `Desactivado` | LT_SUGGESTIONS | +| --disable-files-translation | Deshabilitar la traducción de archivos | `Se permite la traducción de archivos` | LT_DISABLE_FILES_TRANSLATION | +| --disable-web-ui | Deshabilitar la interfaz web | `Interfaz de usuario web habilitada` | LT_DISABLE_WEB_UI | +| --update-models | Actualizar los modelos de lenguaje al inicio | `Solo se activa si no se encuentran modelos` | LT_UPDATE_MODELS | +| --metrics | Habilitar el punto final /metrics para exportar [Prometheus](https://prometheus.io/) métricas de uso | `Desactivado` | LT_METRICS | + +### Parámetros de configuración + +| Argumento | Descripción | Parámetro predeterminado | Sobre nombre | +| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | --------------------------- | +| --host | Establecer el host para vincular el servidor to | `127.0.0.1` | LT_HOST | +| --port | Establecer el puerto al que se vinculará el servidor | `5000` | LT_PORT | +| --char-limit | Establecer límite de caracteres | `Sin Limite` | LT_CHAR_LIMIT | +| --req-limit | Establecer el número máximo de solicitudes por minuto por cliente (fuera de los límites establecidos por las claves API) | `Sin Limite` | LT_REQ_LIMIT | +| --req-limit-storage | URI de almacenamiento para limitar el almacenamiento de datos de solicitudes. Ver [Flask Limiter](https://flask-limiter.readthedocs.io/en/stable/configuration.html) | `memoria://` | LT_REQ_LIMIT_STORAGE | +| --req-time-cost | Considera el coste de tiempo (en segundos) para limitar las solicitudes. Si una solicitud tarda 10 segundos y este valor se establece en 5, el coste de la solicitud es 2 o el coste real de la solicitud (el que sea mayor). | `Sin costo de tiempo` | LT_REQ_TIME_COST | +| --batch-limit | Establecer el número máximo de textos a traducir en una solicitud por lotes | `Sin Limite` | LT_BATCH_LIMIT | +| --ga-id | Habilite Google Analytics en la página del cliente API proporcionando una identificación | `Vacío (sin seguimiento)` | LT_GA_ID | +| --frontend-language-source | Establecer el idioma predeterminado del frontend - fuente | `auto` | LT_FRONTEND_LANGUAGE_SOURCE | +| --frontend-language-target | Establecer el idioma predeterminado del frontend - objetivo | `locale` (coincide con la configuración regional del sitio) | LT_FRONTEND_LANGUAGE_TARGET | +| --frontend-timeout | Establecer el tiempo de espera de traducción del frontend | `500` | LT_FRONTEND_TIMEOUT | +| --api-keys-db-path | Utilice una ruta específica dentro del contenedor para la base de datos local. Puede ser absoluta o relativa. | `db/api_keys.db` | LT_API_KEYS_DB_PATH | +| --api-keys-remote | Utilice este punto final remoto para consultar claves API válidas en lugar de utilizar la base de datos local | `Vacío (usa db local en su lugar)` | LT_API_KEYS_REMOTE | +| --get-api-key-link | Mostrar un enlace en la interfaz de usuario donde dirigir a los usuarios para obtener una clave API | `Vacío (no se muestra ningún enlace en la interfaz web)` | LT_GET_API_KEY_LINK | +| --shared-storage | URI de almacenamiento compartido que se utilizará para compartir datos entre múltiples procesos (por ejemplo, al usar gunicorn) | `memoria://` | LT_SHARED_STORAGE | +| --secondary | Marque esta instancia como una instancia secundaria para evitar conflictos con el nodo principal en configuraciones de múltiples nodos | `Nodo primario` | LT_SECONDARY | +| --load-only | Establecer idiomas disponibles | `Vacío (utilizar todo de argostranslate)` | LT_LOAD_ONLY | +| --threads | Establecer número de subprocesos | `4` | LT_THREADS | +| --metrics-auth-token | Proteja el punto final /metrics permitiendo solo clientes que tengan un token de portador de autorización válido | `Vacío (no se requiere autenticación)` | LT_METRICS_AUTH_TOKEN | +| --url-prefix | Agregar prefijo a la URL: ejemplo.com:5000/prefijo-url/ | `/` | LT_URL_PREFIX | + +### Notas: + +- Cada argumento tiene una variable de entorno equivalente que puede usarse en su lugar. Las variables de entorno sobrescriben los valores predeterminados, pero tienen menor prioridad que los argumentos del comando y son especialmente útiles si se usan con Docker. Los nombres de las variables de entorno son la versión en mayúsculas del nombre del argumento del comando equivalente, con el prefijo `LT`. + +- Para configurar el requisito de uso de la clave API, establezca `--req-limit` en `0` y agregue el indicador `--api-keys`. Las solicitudes realizadas sin una clave API correcta serán rechazadas. + +- Al establecer `--update-models`, se actualizarán los modelos independientemente de si hay actualizaciones disponibles. + +## Actualización + +### Software + +Si instaló con pip: + +`pip install -U libretranslate` + +Si usa docker: + +`docker pull libretranslate/libretranslate` + +### Modelos de lenguaje + +Inicie el programa con el argumento `--update-models`. Por ejemplo: `libretranslate --update-models` o `./run.sh --update-models`. + +También puede ejecutar el script `scripts/install_models.py`. + +## Ejecutar con WSGI y Gunicorn + +```bash +pip install gunicorn +gunicorn --bind 0.0.0.0:5000 'wsgi:app' +``` + +Puedes pasar los argumentos de la aplicación directamente a Gunicorn mediante: + +```bash +gunicorn --bind 0.0.0.0:5000 'wsgi:app(api_keys=True)' +``` + +## Implementación de Kubernetes + +Consulta el [artículo Mediano de JM Robles](https://jmrobles.medium.com/libretranslate-your-own-translation-service-on-kubernetes-b46c3e1af630) y el [k8s.yaml](https://github.com/LibreTranslate/LibreTranslate/blob/main/k8s.yaml) mejorado por @rasos. + +### Gráfico de Helm + +Gracias al trabajo de @rasos, ahora puedes instalar LibreTranslate en Kubernetes usando Helm. + +Ya hay un gráfico de Helm disponible en el repositorio [helm-chart](https://github.com/LibreTranslate/helm-chart/), donde puedes encontrar más detalles. + +Puede instalar rápidamente LibreTranslate en Kubernetes usando Helm con el siguiente comando: + +```bash +helm repo add libretranslate https://libretranslate.github.io/helm-chart/ +helm repo update +helm search repo libretranslate + +helm install libretranslate libretranslate/libretranslate --namespace libretranslate --create-namespace +``` + +## Administrar claves API + +LibreTranslate admite cuotas límite por usuario. Por ejemplo, puede emitir claves API a los usuarios para que puedan disfrutar de mayores límites de solicitudes por minuto (si también configura `--req-limit`). De forma predeterminada, todos los usuarios tienen un límite de velocidad basado en `--req-limit`, pero al pasar un parámetro opcional `api_key` a los endpoints REST, un usuario puede disfrutar de mayores límites de solicitudes. También puede especificar diferentes límites de caracteres que omiten el valor predeterminado `--char-limit` por clave. + +Para usar claves API, simplemente inicie LibreTranslate con la opción `--api-keys`. Si modificó la ruta de la base de datos de claves API con la opción `--api-keys-db-path`, debe especificar la ruta con el mismo indicador de argumento al usar el comando `ltmanage keys`. + +### Agregar nuevas claves + +Para emitir una nueva clave API con un límite de 120 solicitudes por minuto: + +```bash +ltmanage keys add 120 +``` + +Para emitir una nueva clave API con 120 solicitudes por minuto y un máximo de 5000 caracteres por solicitud: + +```bash +ltmanage keys add 120 --char-limit 5000 +``` + +Si cambió la ruta de la base de datos de claves API: + +```bash +ltmanage keys --api-keys-db-path path/to/db/dbName.db add 120 +``` + +### Eliminar claves + +```bash +ltmanage keys remove +``` + +### Ver claves + +```bash +ltmanage keys +``` + +## Métricas de Prometheus + +LibreTranslate tiene Prometheus Capacidades de [exportador](https://prometheus.io/docs/instrumenting/exporters/) cuando pasa el argumento `--metrics` al inicio (deshabilitado de manera predeterminada). Cuando las métricas están habilitadas, se monta un punto final `/metrics` en la instancia: + + + +```promql +# HELP libretranslate_http_requests_in_flight Métrica multiproceso +# TYPE libretranslate_http_requests_in_flight Indicador +libretranslate_http_requests_in_flight{api_key="",endpoint="/translate",request_ip="127.0.0.1"} 0.0 +# HELP libretranslate_http_request_duration_seconds Métrica multiproceso +# TYPE libretranslate_http_request_duration_seconds Resumen +libretranslate_http_request_duration_seconds_count{api_key="",endpoint="/translate",request_ip="127.0.0.1",status="200"} 0.0 +libretranslate_http_request_duration_seconds_sum{api_key="",endpoint="/translate",request_ip="127.0.0.1",status="200"} 0.0 +``` + +Puede configurar `prometheus.yml` para leer las métricas: + +```yaml +scrape_configs: +- job_name: "libretranslate" + +# Solo es necesario si usas --metrics-auth-token +#authorization: +#credentials: "mytoken" + +static_configs: +- targets: ["localhost:5000"] +``` + +Para proteger el endpoint `/metrics`, también puedes usar `--metrics-auth-token mytoken`. + +Si usa Gunicorn, asegúrese de crear un directorio para almacenar las métricas de datos multiproceso y configure `PROMETHEUS_MULTIPROC_DIR`: + +```bash +mkdir -p /tmp/prometheus_data +rm /tmp/prometheus_data/* +export PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_data +gunicorn -c scripts/gunicorn_conf.py --bind 0.0.0.0:5000 'wsgi:app(metrics=True)' +``` + +## Enlaces de lenguaje + +Puedes usar el [plugin oficial de traducción de Discourse](https://github.com/discourse/discourse-translator) para traducir temas de Discourse con LibreTranslate. Para instalarlo, simplemente modifica `/var/discourse/containers/app.yml`: + +```yaml +## Los plugins van aquí +## Consulta https://meta.discourse.org/t/19157 para más detalles +hooks: +after_code: +- exec: +cd: $home/plugins +cmd: +- git clone https://github.com/discourse/docker_manager.git +- git clone https://github.com/discourse/discourse-translator +... +``` + +Luego, ejecuta `./launcher rebuild app`. Desde el panel de administración de Discourse, selecciona "LibreTranslate" como proveedor de traducción y configura los endpoints correspondientes. + +Véalo en acción en esta [página](https://community.libretranslate.com/t/have-you-considered-adding-the-libretranslate-discourse-translator-multilingual-to-this-forum/766). + +## Aplicaciones móviles + +- [LibreTranslator](https://codeberg.org/BeoCode/LibreTranslator) es una aplicación para Android [disponible en Play Store](https://play.google.com/store/apps/details?id=de.beowulf.libretranslater) y [en la tienda de F-Droid](https://f-droid.org/packages/de.beowulf.libretranslater/) que utiliza la API de LibreTranslate. +- [Translate You](https://github.com/you-apps/TranslateYou) es una aplicación de traducción centrada en la privacidad, desarrollada con MD3, disponible [en la tienda de F-Droid](https://f-droid.org/packages/com.bnyro.translate/) y que utiliza la API de LibreTranslate, entre otros proveedores. - [LiTranslate](https://github.com/viktorkalyniuk/LiTranslate-iOS) es una aplicación para iOS [disponible en la App Store](https://apps.apple.com/us/app/litranslate/id1644385339) que utiliza la API de LibreTranslate. + +## Navegador web + +- [minbrowser](https://minbrowser.org/) es un navegador web con [soporte integrado para LibreTranslate](https://github.com/argosopentech/argos-translate/discussions/158#discussioncomment-1141551). +- Un complemento de LibreTranslate para Firefox está [actualmente en desarrollo](https://github.com/LibreTranslate/LibreTranslate/issues/55). + +## Espejos + +Esta es una lista de instancias públicas de LibreTranslate; algunas requieren una clave API. Si desea agregar una nueva URL, abra una solicitud de extracción. + + +| URL | Se requiere clave API | Enlaces | +| ----------------------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------- | +| [libretranslate.com](https://libretranslate.com) | :heavy_check_mark: | [ [Get API Key](https://portal.libretranslate.com) ] [ [Service Status](https://status.libretranslate.com/) ] | +| [translate.flossboxin.org.in](https://translate.flossboxin.org.in/) | | [ [Contact/eMail](mailto:dev@flossboxin.org.in) ] | +| [lt.blitzw.in](https://lt.blitzw.in/) | | | + +## TOR/i2p Espejos + +| URL | +| ---------------------------------------------------------------------------------------------------------------------------------------------- | +| [lt.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion](http://lt.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion/) | +| [lt.vern.i2p](http://vernf45n7mxwqnp5riaax7p67pwcl7wcefdcnqqvim7ckdx4264a.b32.i2p/) | + +## Añadiendo nuevos modelos de lenguaje + +Tiene dos opciones para crear nuevos modelos de lenguaje: + +- [Locomotive](https://github.com/LibreTranslate/Locomotive) +- [Argos Train](https://github.com/argosopentech/argos-train) ([videotutorial](https://www.youtube.com/watch?v=Vj_qgnhOEwg)) + +La mayoría de los datos de entrenamiento provienen de [Opus](http://opus.nlpl.eu/), un corpus paralelo de código abierto. Consulte también [NLLU](https://nllu.libretranslate.com) + +## Localización + +La interfaz web de LibreTranslate está disponible en todos los idiomas a los que LibreTranslate puede traducir. También puede (aproximadamente) [traducirse a sí mismo!](https://github.com/LibreTranslate/LibreTranslate/blob/main/scripts/update_locales.py). Es posible que algunos idiomas no aparezcan en la interfaz de usuario, ya que aún no han sido revisados ​​por un usuario. Puedes habilitar todos los idiomas activando el modo `--debug`. + +Para ayudar a mejorar o revisar las traducciones de la interfaz de usuario: + +- Ve a . Todos los cambios se envían automáticamente a este repositorio. +- Una vez revisadas/editadas todas las cadenas, abre una solicitud de extracción y modifica `libretranslate/locales/{code}/meta.json`: + +```json +{ +"name": "", +"reviewed": true <-- Cambia esto de falso a verdadero +} +``` + + +| Idioma | Revisado | Enlace de Pizarra web | +| --------------------- | ------------------ | ------------------------------------------------------------------------ | +| Arabic | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/ar/) | +| Azerbaijani | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/az/) | +| Basque | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/eu/) | +| Chinese | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/zh/) | +| Chinese (Traditional) | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/zh_Hant/) | +| Czech | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/cs/) | +| Danish | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/da/) | +| Dutch | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/nl/) | +| English | :heavy_check_mark: | [Edit](https://hosted.weblate.org/projects/libretranslate/app/) | +| Esperanto | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/eo/) | +| Finnish | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/fi/) | +| French | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/fr/) | +| German | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/de/) | +| Greek | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/el/) | +| Hebrew | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/he/) | +| Hindi | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/hi/) | +| Hungarian | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/hu/) | +| Indonesian | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/id/) | +| Irish | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/ga/) | +| Italian | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/it/) | +| Japanese | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/ja/) | +| Kabyle | :heavy_check_mark: | [Edit](https://hosted.weblate.org/projects/libretranslate/app/kab/) | +| Korean | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/ko/) | +| Occitan | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/oc/) | +| Persian | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/fa/) | +| Polish | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/pl/) | +| Portuguese | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/pt/) | +| Russian | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/ru/) | +| Slovak | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/sk/) | +| Spanish | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/es/) | +| Swedish | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/sv/) | +| Turkish | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/tr/) | +| Ukrainian | :heavy_check_mark: | [Edit](https://hosted.weblate.org/translate/libretranslate/app/uk/) | +| Vietnamese | | [Edit](https://hosted.weblate.org/translate/libretranslate/app/vi/) | + +## Mapa de ruta + +Ayúdanos abriendo una solicitud de extracción! + +- [ ] Enlaces de lenguaje para cada lenguaje de programación +- [ ] [Traducciones mejoradas](https://community.libretranslate.com/t/the-best-way-to-train-models/172) + +Cualquier otra idea es bienvenida. + +## Preguntas frecuentes + +### Puedo usar su servidor API en libretranslate.com para mi aplicación en producción? + +En resumen, sí, [pero solo si compras una clave API](https://portal.libretranslate.com). Por supuesto, siempre puedes ejecutar LibreTranslate gratis en tu propio servidor. + +### Algunas traducciones en libretranslate.com son diferentes a las alojadas por el usuario. Por qué? + +Por defecto, los modelos de lenguaje se cargan desde el [argos-index](https://github.com/argosopentech/argospm-index). A veces implementamos modelos en libretranslate.com que aún no se han añadido al índice argos, como los convertidos desde OPUS ([thread](https://community.libretranslate.com/t/opus-mt-language-models-port-thread/757)) + +### Dónde se guardan los modelos de lenguaje? + +En `$HOME/.local/share/argos-translate/packages`. En Windows, es `C:\Users\youruser\.local\share\argos-translate\packages`. + +### Puedo usar LibreTranslate tras un proxy inverso, como Apache2 o Caddy? + +Sí, aquí hay ejemplos de configuración para Apache2 y Caddy que redirigen un subdominio (con certificado HTTPS) a LibreTranslate ejecutándose en un contenedor en el host local. + +```bash +sudo docker run -ti --rm -p 127.0.0.1:5000:5000 libretranslate/libretranslate +``` + +Puede eliminar `127.0.0.1` del comando anterior si desea acceder a él desde `domain.tld:5000`, además de `subdomain.domain.tld` (esto puede ser útil para determinar si hay un problema con Apache 2 o el contenedor de Docker). + +Agregue `--restart unless-stopped` si desea que este contenedor se inicie al arrancar, a menos que se detenga manualmente. + +
+Configuración de Apache +
+ +Reemplace [YOUR_DOMAIN] con su dominio completo; por ejemplo, `translate.domain.tld` o `libretranslate.domain.tld`. + +Elimine `#` en las líneas ErrorLog y CustomLog para registrar las solicitudes. + +```ApacheConf +#Libretranslate + +#Redireccionar http a https + +Nombre del servidor http://[SU_DOMINIO] +Redirigir / https://[SU_DOMINIO] +# Registro de errores ${APACHE_LOG_DIR}/error.log +# Registro personalizado ${APACHE_LOG_DIR}/tr-access.log combinado + + +#https + +NombreDeServidor https://[SU_DOMINIO] + +PassProxy / http://127.0.0.1:5000/ +PassReverseProxy / http://127.0.0.1:5000/ +ProxyPreserveHost Activado + +SSLEngine Activado +ArchivoDeCertificadoSSL /etc/letsencrypt/live/[SU_DOMINIO]/fullchain.pem +ArchivoDeClaveDeCertificadoSSL /etc/letsencrypt/live/[SU_DOMINIO]/privkey.pem +ArchivoDeCadenaDeCertificadoSSL /etc/letsencrypt/live/[SU_DOMINIO]/fullchain.pem + +# RegistroDeErrores ${APACHE_LOG_DIR}/tr-error.log +# RegistroPersonalizado ${APACHE_LOG_DIR}/tr-access.log Combinado + +``` + +Agregue esto a la configuración de un sitio existente o a un nuevo archivo en `/etc/apache2/sites-available/new-site.conf` y ejecute `sudo a2ensite new-site.conf`. + +Para obtener un certificado de subdominio HTTPS, instale `certbot` (snap), ejecute `sudo certbot certonly --manual --preferred-challenges dns` e ingrese su información (con `subdomain.domain.tld` como dominio). Agregue un registro DNS TXT con su registrador de dominio cuando se le solicite. Esto guardará su certificado y clave en `/etc/letsencrypt/live/{subdomain.domain.tld}/`. Como alternativa, comente las líneas SSL si no desea usar HTTPS. + +
+ +
+Configuración de Caddy +
+ +Reemplace [SU_DOMINIO] con su dominio completo; por ejemplo, `translate.domain.tld` o `libretranslate.domain.tld`. + +```Caddyfile +#Libretranslate +[SU_DOMINIO] { +reverse_proxy localhost:5000 +} +``` + +Agregue esto a un archivo Caddyfile existente o guárdelo como `Caddyfile` en cualquier directorio y ejecute `sudo caddy reload` en ese mismo directorio. + +
+ +
+NGINX config +
+ +Reemplace [SU_DOMINIO] con su dominio completo; por ejemplo, `translate.domain.tld` o `libretranslate.domain.tld`. + +Elimine `#` en las líneas `access_log` y `error_log` para deshabilitar el registro. + +```NginxConf +server { +list 80; nombre_del_servidor [SU_DOMINIO]; +return 301 https://$nombre_del_servidor$uri_de_solicitud; +} + +servidor { + list 443 http2 ssl; + nombre_del_servidor [SU_DOMINIO]; + + #registro_acceso off; + #registro_error off; + + # Sección SSL + certificado_ssl /etc/letsencrypt/live/[SU_DOMINIO]/fullchain.pem; + clave_del_certificado_ssl /etc/letsencrypt/live/[SU_DOMINIO]/privkey.pem; + + protocolos_ssl TLSv1.2 TLSv1.3; + + # Utilizando el conjunto de cifrado recomendado de: https://wiki.mozilla.org/Security/Server_Side_TLS + ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; + + ssl_session_timeout 10m; + ssl_session_cache shared:MozSSL:10m; # aproximadamente 40000 sesiones + ssl_session_tickets off; + + # Especifica una curva para cifrados ECDHE. + ssl_ecdh_curve prime256v1; + # El servidor debe determinar los cifrados, no el cliente. + ssl_prefer_server_ciphers on; + + # Sección de encabezado + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; + add_header Referrer-Policy "strict-origin" always; + + add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; modo=bloquear" siempre; + add_header X-Content-Type-Options "nosniff" siempre; + add_header X-Download-Options "noopen" siempre; + add_header X-Robots-Tag "none" siempre; + + add_header Política de funciones "micrófono 'ninguno'; cámara 'ninguna'; geolocalización 'ninguna';" siempre; + # Encabezado más reciente, pero no compatible en todas partes + add_header Política de permisos "micrófono=(), cámara=(), geolocalización=()" siempre; + + # Eliminar X-Powered-By, que es una fuga de información + fastcgi_hide_header X-Powered-By; + + # No enviar el encabezado del servidor nginx + server_tokens off; + + # Sección GZIP + gzip activado; + gzip_disable "msie6"; + + gzip_vary activado; + gzip_proxied any; + gzip_comp_level 6; + gzip_buffers 16 8k; + gzip_http_version 1.1; + gzip_min_length 256; gzip_types texto/xml texto/javascript fuente/ttf fuente/eot fuente/otf aplicación/x-javascript aplicación/atom+xml aplicación/javascript aplicación/json aplicación/manifiesto+json aplicación/rss+xml aplicación/x-web-app-manifest+json aplicación/xhtml+xml aplicación/xml imagen/svg+xml imagen/x-icon texto/css texto/plain; + + + location / { + proxy_pass http://127.0.0.1:5000/; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + client_max_body_size 0; + } +} + +``` + +Agregue esto a una configuración de NGINX existente o guárdelo como `libretranslate` en el directorio `/etc/nginx/site-enabled` y ejecute `sudo nginx -s reload`. + +
+ +### Puedo ejecutarlo como systemd (el instalado por defecto en pip/python)? + +Sí, simplemente cree un archivo de servicio en `/etc/systemd/system` y habilítelo para que se ejecute al inicio. +El archivo .env (entorno) es opcional según su configuración. Agregue lo siguiente al archivo (modifique los valores según sea necesario) y nómbrelo "libretranslate.service). + +```javascript +[Unidad] +Descripción=LibreTranslate +Después=network.target +[Servicio] +Usuario=root +Tipo=idle +Reiniciar=always +Environment="PATH=/usr/local/lib/python3.11/dist-packages/libretranslate" +ExecStart=/usr/bin/python3 /usr/local/bin/libretranslate +EnvironmentFile=/usr/local/lib/python3.11/dist-packages/libretranslate/.env +ExecReload=/bin/kill -s HUP $MAINPID +KillMode=mixed +TimeoutStopSec=1 +[Instalar] +WantedBy=multi-user.target +``` + +Una vez guardado, vuelva a cargar el archivo Daemon e iniciar el servicio: + +```javascript +systemctl daemon-reload +systemctl start libretranslate.service +systemctl enable libretranslate.service +``` + +### Puedo realizar traducciones por lotes? + +Sí, pasa un array de cadenas en lugar de una cadena al campo `q`: + +```javascript +const res = await fetch("https://libretranslate.com/translate", { +method: "POST", +body: JSON.stringify({ +q: ["Hello", "world"], +source: "en", +target: "es", +}), +headers: { "Content-Type": "application/json" }, +}); + +console.log(await res.json()); +// { +// "translatedText": [ +// "Hola", +// "mundo" +// ] +// } +``` + +## Contribuyendo + +Agradecemos sus contribuciones! Aquí tienen algunas ideas: + +- Entrenar un nuevo modelo de lenguaje usando [Locomotive](https://github.com/LibreTranslate/Locomotive). Por ejemplo, queremos entrenar redes neuronales mejoradas para [alemán](https://community.libretranslate.com/t/help-wanted-improve-en-de-translation/935) y muchos otros idiomas. +- Puedes superar el rendimiento de nuestros modelos de lenguaje? Entrena uno nuevo y comparémoslo. Para enviar tu modelo, publica en el [foro de la comunidad](https://community.libretranslate.com/) un enlace para descargar tu archivo .argosmodel y un texto de muestra que tu modelo haya traducido. +- Elige un [problema](https://github.com/LibreTranslate/LibreTranslate/issues) en el que trabajar. + +## Créditos + +Este trabajo es posible en gran medida gracias a [Argos Translate](https://github.com/argosopentech/argos-translate), que impulsa el motor de traducción. + +## Licencia + +[Licencia Pública General GNU Affero v3](https://www.gnu.org/licenses/agpl-3.0.en.html) + +## Marca registrada + +Consulte las [Directrices de marca registrada](https://github.com/LibreTranslate/LibreTranslate/blob/main/docs/TRADEMARK.es.md) + +## Projectos Relacionados + +* [LTEngine](https://github.com/LibreTranslate/LTEngine): Machine translation powered by LLMs with a LibreTranslate-compatible API + +## Otros idiomas + +- [English (README)](/README.md) \ No newline at end of file diff --git a/self_host/LibreTranslate/docs/TRADEMARK.es.md b/self_host/LibreTranslate/docs/TRADEMARK.es.md new file mode 100644 index 00000000..8cb90102 --- /dev/null +++ b/self_host/LibreTranslate/docs/TRADEMARK.es.md @@ -0,0 +1,90 @@ +# Directrices de marca registrada de LibreTranslate + +LibreTranslate es una organización de código abierto. Dado que nuestro código está disponible para su descarga y modificación, el uso correcto de nuestras marcas registradas es esencial para informar a los usuarios si LibreTranslate respalda un producto o servicio. Al utilizar las marcas registradas de LibreTranslate (incluidos algunos nombres de productos que forman parte de nuestra organización), debe cumplir con estas Directrices de marca registrada de LibreTranslate. + +Algunas de nuestras marcas registradas incluyen: + +* LibreTranslate + +Algunos de nuestros logotipos de marcas registradas incluyen: + +![LibreTranslate](https://avatars.githubusercontent.com/u/77352747?s=200&v=4) + +Sin embargo, esta no es una lista completa de nuestros nombres, logotipos y características de marca, todos los cuales están sujetos a estas directrices. + +Si desea denunciar el uso indebido de una marca registrada de LibreTranslate, contáctenos a través de https://uav4geo.com/contact + +## ¿Cuándo necesito un permiso específico para usar una marca registrada de LibreTranslate? + +Teniendo en cuenta que el software LibreTranslate combinado o integrado en cualquier otro programa de software, incluido, entre otros, el software de automatización para ofrecer LibreTranslate como un servicio en la nube o el software de orquestación para ofrecer LibreTranslate en contenedores, se considera software LibreTranslate "modificado", puede hacer lo siguiente sin recibir permiso específico de LibreTranslate (o sus afiliados): + +* Utilizar las marcas denominativas y/o logotipos de LibreTranslate en versiones sin modificar de los programas, productos, servicios y tecnologías de LibreTranslate. +* Utilizar las marcas denominativas de LibreTranslate en el texto para referirse o enlazar verazmente a programas, productos, servicios y tecnologías de LibreTranslate sin modificar. +* Utilizar los logotipos de LibreTranslate en elementos visuales para referirse o enlazar verazmente a los programas, productos, servicios y tecnologías aplicables alojados en los servidores de LibreTranslate. +* Utilizar las marcas denominativas de LibreTranslate para explicar que su software se basa en el código fuente abierto de LibreTranslate o que es compatible con él. +* Describir una cuenta, página o comunidad en redes sociales de acuerdo con las [Directrices de Redes Sociales](#social-media-guidelines). + +Todos los demás usos de una marca registrada de LibreTranslate requieren nuestra autorización previa por escrito. Esto incluye cualquier uso de una marca registrada de LibreTranslate en un nombre de dominio. Contáctenos en https://uav4geo.com/contact para obtener más información. + +## Cuando esté permitido, ¿cómo debo usar una marca registrada de LibreTranslate? + +### Pautas generales + +#### Qué hacer: + +* Use la marca registrada de LibreTranslate exactamente como se muestra en la lista anterior. +* Use las marcas denominativas de LibreTranslate solo como adjetivo, nunca como sustantivo o verbo. No las use en plural ni posesivo. En su lugar, use el término genérico para el producto o servicio de LibreTranslate después de la marca registrada, por ejemplo: software de traducción LibreTranslate. + +#### Qué no hacer: + +* No use las marcas registradas de LibreTranslate en el nombre de su empresa, producto, servicio, aplicación, nombre de dominio, publicación u otra oferta. +* No use marcas, logotipos, nombres de empresas, eslóganes, nombres de dominio o diseños que sean confusamente similares a las marcas registradas de LibreTranslate. +* No use las marcas registradas de LibreTranslate de una manera que implique incorrectamente afiliación, patrocinio, respaldo o aprobación por parte de LibreTranslate de sus productos o servicios. +* No muestre las marcas registradas de LibreTranslate de forma más prominente que el nombre de su producto, servicio o empresa. +* No utilice las marcas registradas de LibreTranslate en productos a la venta (p. ej., venta de camisetas, tazas, etc.). +* No utilice las marcas registradas de LibreTranslate para ningún otro uso comercial (p. ej., ofrecer servicios de soporte técnico), a menos que dicho uso se limite a una referencia veraz y descriptiva (p. ej., soporte técnico independiente para el software de LibreTranslate). +* No modifique las marcas registradas de LibreTranslate, ni las abrevie, ni las combine con otros símbolos, palabras o imágenes, ni las incorpore en un eslogan o lema. + +### Directrices para redes sociales + +Además de las Directrices generales mencionadas anteriormente, el nombre y el nombre de usuario de su cuenta de redes sociales, así como de todas sus páginas, no pueden comenzar con una marca registrada de LibreTranslate. Asimismo, los logotipos de LibreTranslate no pueden usarse de forma que sugiera afiliación con LibreTranslate, incluyendo, entre otros, las imágenes de la cuenta, el perfil o el encabezado. La única excepción a estos requisitos es si cuenta con la autorización previa de LibreTranslate. + +Por ejemplo, no puede nombrar su cuenta, página o comunidad como "Representantes de LibreTranslate" o "Software de LibreTranslate". Sin embargo, sí es aceptable nombrar su cuenta, página o comunidad como "Fans de LibreTranslate" o "Información sobre el software de LibreTranslate", siempre y cuando no utilice las marcas registradas ni los logotipos de LibreTranslate ni sugiera de cualquier otra forma alguna afiliación con LibreTranslate. + +### Directrices para proyectos de código abierto + +La licencia específica de cada producto y código de software de LibreTranslate especifica lo que se puede y no se puede hacer con el código, pero no autoriza el uso de las marcas registradas de LibreTranslate. Si decide desarrollar o modificar el código fuente abierto de LibreTranslate para su propio proyecto, + +#### Debe: + +* Seguir los términos de la(s) Licencia(s) de Código Abierto para los productos y el código de software de LibreTranslate. +* Elegir marcas, logotipos y marcas registradas que denoten su identidad única para indicar claramente a los usuarios que no existe afiliación ni respaldo por parte de LibreTranslate. +* Seguir las Directrices generales mencionadas anteriormente. + +#### NO DEBE: + +* Usar ninguna marca registrada de LibreTranslate en relación con el nombre o la marca de su proyecto. +* Usar ninguna marca registrada de LibreTranslate, ni parte de ella, para sugerir o dar la impresión incorrecta de que su software está publicado, afiliado o respaldado por LibreTranslate. + +Por ejemplo, no nombre su proyecto [Algo]-LibreTranslate ni LibreTranslate-[Algo]. + +#### Puede: + +* Declarar con palabras (sin usar logotipos ni imágenes) que su producto "funciona con" o "es compatible" con ciertos productos de software de LibreTranslate, si es cierto. +* Declarar con palabras (sin usar logotipos ni imágenes) que su proyecto se basa en la tecnología de código abierto de LibreTranslate, si es cierto, siempre que incluya una declaración de que su proyecto no está oficialmente asociado con LibreTranslate ni con sus productos. + +Por ejemplo, puede indicar que su proyecto: + +"se basa en el software de código abierto de LibreTranslate" + +siempre que incluya también la siguiente declaración, de forma igualmente destacada: + +"[Marca] y [Nombre del producto] no están oficialmente asociados con LibreTranslate ni con sus productos". + +### Directrices de la comunidad de LibreTranslate + +Se han otorgado varios permisos para utilizar las marcas comerciales de LibreTranslate a varios miembros de la comunidad de LibreTranslate, y estas Pautas de marcas comerciales de LibreTranslate no alteran ninguno de los permisos otorgados previamente. + +## Otros Idiomas + +- [English (TRADEMARK)](/TRADEMARK.md) \ No newline at end of file diff --git a/self_host/LibreTranslate/k8s.yaml b/self_host/LibreTranslate/k8s.yaml new file mode 100644 index 00000000..06291cd5 --- /dev/null +++ b/self_host/LibreTranslate/k8s.yaml @@ -0,0 +1,84 @@ +# kubernetes deployment template +# prepare a namespace on your cluster first like libretranslate-prod +apiVersion: v1 +kind: ConfigMap +metadata: + name: libretranslate-config +data: +# list loaded languages or leave empty to load all + langs: "es,de,it,en,fr,cs,da,nl,hu,pl,pt,sk,ru,tr,uk,fi,eo" + ltapikey: "yoursecretapikey" +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: libretranslate +spec: + selector: + matchLabels: + app: libretranslate + template: + metadata: + labels: + app: libretranslate + spec: + containers: + - name: libretranslate + image: libretranslate/libretranslate:latest + resources: + limits: + memory: "1Gi" + cpu: "500m" + ports: + - containerPort: 5000 + env: + - name: "LT_LOAD_ONLY" + valueFrom: + configMapKeyRef: + name: libretranslate-config + key: langs + - name: "TRANSLATE_KEY" + valueFrom: + configMapKeyRef: + name: libretranslate-config + key: ltapikey +--- +apiVersion: v1 +kind: Service +metadata: + name: libretranslate-svc + namespace: libretranslate-prod +spec: + selector: + app: libretranslate + ports: + - port: 5000 + targetPort: 5000 + +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + cert-manager.io/issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/proxy-body-size: 5m + name: libretranslate-ingress + namespace: libretranslate-prod + labels: + app: libretranslate +spec: + tls: + - hosts: + - libretranslate.mydomain.net + secretName: libretranslate-mydomain-net + rules: + - host: libretranslate.mydomain.net + http: + paths: + - backend: + service: + name: libretranslate-svc + port: + number: 5000 + path: / + pathType: Prefix diff --git a/self_host/LibreTranslate/libretranslate/__init__.py b/self_host/LibreTranslate/libretranslate/__init__.py new file mode 100644 index 00000000..982fb0ba --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/__init__.py @@ -0,0 +1,3 @@ +import os +from .main import main +from .manage import manage diff --git a/self_host/LibreTranslate/libretranslate/__pycache__/__init__.cpython-313.pyc b/self_host/LibreTranslate/libretranslate/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcdd3c493f29ad76575fba4dbc7c71665c6f92a3 GIT binary patch literal 243 zcmey&%ge<81o^oeGi-qLV-N=hn4pZ$DnQ0mhG2$ZMsJ29hG3>(W^YC>#v(=q5SzuD z$&0CoNr54qQIqv0NQ>V~Mj)xlc#9=BF*6THv*jk{C8nopGT&m#FD_yMN*1vKiIohW zfh5B%C;g24+*JLfqRhlR{lwCu_=3dbY@qsLeV@#vqSTP0#Ju91#FA9~91ynz&W(@H y%*!l^kJl@xyv1RYo1apelWJE4@(;-VVm=`8ftit!@iqhJT?Vmx3{piLKp_AQ={w~B literal 0 HcmV?d00001 diff --git a/self_host/LibreTranslate/libretranslate/__pycache__/app.cpython-313.pyc b/self_host/LibreTranslate/libretranslate/__pycache__/app.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..028754ab752272f6d191b35eeac7d07de6168fa8 GIT binary patch literal 55369 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 literal 0 HcmV?d00001 diff --git a/self_host/LibreTranslate/libretranslate/__pycache__/main.cpython-313.pyc b/self_host/LibreTranslate/libretranslate/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa81aad25bdde32617fd1db3a6a8f434ba197553 GIT binary patch literal 11320 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 I_b6fh-vLEW;s5{u literal 0 HcmV?d00001 diff --git a/self_host/LibreTranslate/libretranslate/api_keys.py b/self_host/LibreTranslate/libretranslate/api_keys.py new file mode 100644 index 00000000..e56ca83e --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/api_keys.py @@ -0,0 +1,112 @@ +import os +import sqlite3 +import uuid + +import requests +from expiringdict import ExpiringDict + +from libretranslate.default_values import DEFAULT_ARGUMENTS as DEFARGS + +DEFAULT_DB_PATH = DEFARGS['API_KEYS_DB_PATH'] + + +class Database: + def __init__(self, db_path=DEFAULT_DB_PATH, max_cache_len=1000, max_cache_age=30): + # Legacy check - this can be removed at some point in the near future + if os.path.isfile("api_keys.db") and not os.path.isfile("db/api_keys.db"): + print("Migrating {} to {}".format("api_keys.db", "db/api_keys.db")) + try: + os.rename("api_keys.db", "db/api_keys.db") + except Exception as e: + print(str(e)) + + db_dir = os.path.dirname(db_path) + if db_dir != '' and not os.path.exists(db_dir): + os.makedirs(db_dir) + self.db_path = db_path + self.cache = ExpiringDict(max_len=max_cache_len, max_age_seconds=max_cache_age) + + # Make sure to do data synchronization on writes! + self.c = sqlite3.connect(db_path, check_same_thread=False) + self.c.execute( + """CREATE TABLE IF NOT EXISTS api_keys ( + "api_key" TEXT NOT NULL, + "req_limit" INTEGER NOT NULL, + "char_limit" INTEGER DEFAULT NULL, + PRIMARY KEY("api_key") + );""" + ) + + # Schema/upgrade checks + schema = self.c.execute("SELECT sql FROM sqlite_master WHERE type='table' AND name='api_keys';").fetchone()[0] + if '"char_limit" INTEGER DEFAULT NULL' not in schema: + self.c.execute('ALTER TABLE api_keys ADD COLUMN "char_limit" INTEGER DEFAULT NULL;') + + def lookup(self, api_key): + val = self.cache.get(api_key) + if val is None: + # DB Lookup + stmt = self.c.execute( + "SELECT req_limit, char_limit FROM api_keys WHERE api_key = ?", (api_key,) + ) + row = stmt.fetchone() + if row is not None: + self.cache[api_key] = row + val = row + else: + self.cache[api_key] = False + val = False + + if isinstance(val, bool): + val = None + + return val + + def add(self, req_limit, api_key="auto", char_limit=None): + if api_key == "auto": + api_key = str(uuid.uuid4()) + if char_limit == 0: + char_limit = None + + self.remove(api_key) + self.c.execute( + "INSERT INTO api_keys (api_key, req_limit, char_limit) VALUES (?, ?, ?)", + (api_key, req_limit, char_limit), + ) + self.c.commit() + return (api_key, req_limit, char_limit) + + def remove(self, api_key): + self.c.execute("DELETE FROM api_keys WHERE api_key = ?", (api_key,)) + self.c.commit() + return api_key + + def all(self): + row = self.c.execute("SELECT api_key, req_limit, char_limit FROM api_keys") + return row.fetchall() + + +class RemoteDatabase: + def __init__(self, url, max_cache_len=1000, max_cache_age=600): + self.url = url + self.cache = ExpiringDict(max_len=max_cache_len, max_age_seconds=max_cache_age) + + def lookup(self, api_key): + val = self.cache.get(api_key) + if val is None: + try: + r = requests.post(self.url, data={'api_key': api_key}, timeout=60) + res = r.json() + except Exception as e: + print("Cannot authenticate API key: " + str(e)) + return None + + if res.get('error') is not None: + return None + + req_limit = res.get('req_limit', None) + char_limit = res.get('char_limit', None) + + self.cache[api_key] = (req_limit, char_limit) + + return val diff --git a/self_host/LibreTranslate/libretranslate/app.py b/self_host/LibreTranslate/libretranslate/app.py new file mode 100644 index 00000000..e0381e55 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/app.py @@ -0,0 +1,1308 @@ +import io +import math +import os +import re +import tempfile +import uuid +from datetime import datetime +from functools import wraps +from html import unescape +from timeit import default_timer + +import argostranslatefiles +from argostranslatefiles import get_supported_formats +from flask import Blueprint, Flask, Response, abort, jsonify, render_template, request, send_file, session, url_for, make_response +from flask_babel import Babel +from flask_session import Session +from flask_swagger import swagger +from flask_swagger_ui import get_swaggerui_blueprint +from translatehtml import translate_html +from werkzeug.exceptions import HTTPException +from werkzeug.http import http_date +from werkzeug.utils import secure_filename + +from libretranslate import flood, remove_translated_files, scheduler, secret, security, storage +from libretranslate.language import model2iso, iso2model, detect_languages, improve_translation_formatting +from libretranslate.locales import ( + _, + _lazy, + get_alternate_locale_links, + get_available_locale_codes, + get_available_locales, + gettext_escaped, + gettext_html, + lazy_swag, +) + +from .api_keys import Database, RemoteDatabase +from .suggestions import Database as SuggestionsDatabase + +# Rough map of emoji characters +emojis = {e: True for e in \ + [ord(' ')] + # Spaces + list(range(0x1F600,0x1F64F)) + # Emoticons + list(range(0x1F300,0x1F5FF)) + # Misc Symbols and Pictographs + list(range(0x1F680,0x1F6FF)) + # Transport and Map + list(range(0x2600,0x26FF)) + # Misc symbols + list(range(0x2700,0x27BF)) + # Dingbats + list(range(0xFE00,0xFE0F)) + # Variation Selectors + list(range(0x1F900,0x1F9FF)) + # Supplemental Symbols and Pictographs + list(range(0x1F1E6,0x1F1FF)) + # Flags + list(range(0x20D0,0x20FF)) # Combining Diacritical Marks for Symbols +} + +def get_version(): + try: + with open("VERSION") as f: + return f.read().strip() + except: + return "?" + + +def get_upload_dir(): + upload_dir = os.path.join(tempfile.gettempdir(), "libretranslate-files-translate") + + if not os.path.isdir(upload_dir): + os.mkdir(upload_dir) + + return upload_dir + + +def get_req_api_key(): + if request.is_json: + json = get_json_dict(request) + ak = json.get("api_key") + else: + ak = request.values.get("api_key") + + return ak + +def get_req_secret(): + if request.is_json: + json = get_json_dict(request) + ak = json.get("secret") + else: + ak = request.values.get("secret") + + return ak + + +def get_json_dict(request): + d = request.get_json() + if not isinstance(d, dict): + abort(400, description=_("Invalid JSON format")) + return d + + +def get_remote_address(): + if request.headers.getlist("X-Forwarded-For"): + ip = request.headers.getlist("X-Forwarded-For")[0].split(",")[0] + else: + ip = request.remote_addr or "127.0.0.1" + + 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 + + if api_keys_db: + api_key = get_req_api_key() + + if api_key: + api_key_limits = api_keys_db.lookup(api_key) + if api_key_limits is not None: + req_limit = api_key_limits[0] * db_multiplier + + return int(req_limit * multiplier) + + +def get_char_limit(default_limit, api_keys_db): + char_limit = default_limit + + if api_keys_db: + api_key = get_req_api_key() + + if api_key: + api_key_limits = api_keys_db.lookup(api_key) + if api_key_limits is not None: + if api_key_limits[1] is not None: + char_limit = api_key_limits[1] + + return char_limit + + +def get_routes_limits(args, api_keys_db): + default_req_limit = args.req_limit + if default_req_limit == -1: + # TODO: better way? + default_req_limit = 9999999999999 + + def minute_limits(): + return "%s per minute" % get_req_limits(default_req_limit, api_keys_db) + + def hourly_limits(n): + def func(): + decay = (0.75 ** (n - 1)) + return "{} per {} hour".format(get_req_limits(args.hourly_req_limit * n, api_keys_db, int(os.environ.get("LT_HOURLY_REQ_LIMIT_MULTIPLIER", 60) * n), decay), n) + return func + + def daily_limits(): + return "%s per day" % get_req_limits(args.daily_req_limit, api_keys_db, int(os.environ.get("LT_DAILY_REQ_LIMIT_MULTIPLIER", 1440))) + + res = [minute_limits] + + if args.hourly_req_limit > 0: + for n in range(1, args.hourly_req_limit_decay + 2): + res.append(hourly_limits(n)) + + if args.daily_req_limit > 0: + res.append(daily_limits) + + 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 detect_translatable(src_texts): + if isinstance(src_texts, list): + return any(detect_translatable(t) for t in src_texts) + + for ch in src_texts: + if not (ord(ch) in emojis): + return True + + # All emojis + return False + + +def create_app(args): + from libretranslate.init import boot + + boot(args.load_only, args.update_models, args.force_update_models) + + from libretranslate.language import load_languages + + swagger_url = args.url_prefix + "/docs" # Swagger UI (w/o trailing '/') + api_url = "/spec" + + bp = Blueprint('Main app', __name__) + + storage.setup(args.shared_storage) + + if not args.disable_files_translation: + remove_translated_files.setup(get_upload_dir()) + languages = load_languages() + language_pairs = {} + for lang in languages: + language_pairs[lang.code] = sorted([l.to_lang.code for l in lang.translations_from]) + + # Map userdefined frontend languages to argos language object. + if args.frontend_language_source == "auto": + frontend_argos_language_source = type( + "obj", (object,), {"code": "auto", "name": _("Auto Detect")} + ) + else: + frontend_argos_language_source = next( + iter([l for l in languages if l.code == args.frontend_language_source]), + None, + ) + if frontend_argos_language_source is None: + frontend_argos_language_source = languages[0] + + + language_target_fallback = languages[1] if len(languages) >= 2 else languages[0] + + if args.frontend_language_target == "locale": + def resolve_language_locale(): + loc = get_locale() + language_target = next( + iter([l for l in languages if l.code == loc]), None + ) + if language_target is None: + language_target = language_target_fallback + return language_target + + frontend_argos_language_target = resolve_language_locale + else: + language_target = next( + iter([l for l in languages if l.code == args.frontend_language_target]), None + ) + if language_target is None: + language_target = language_target_fallback + frontend_argos_language_target = lambda: language_target + + frontend_argos_supported_files_format = [] + + for file_format in get_supported_formats(): + for ff in file_format.supported_file_extensions: + frontend_argos_supported_files_format.append(ff) + + api_keys_db = None + + if args.req_limit > 0 or args.api_keys or args.daily_req_limit > 0 or args.hourly_req_limit > 0: + api_keys_db = None + if args.api_keys: + api_keys_db = RemoteDatabase(args.api_keys_remote) if args.api_keys_remote else Database(args.api_keys_db_path) + + from flask_limiter import Limiter + + def limits_cost(): + req_cost = getattr(request, 'req_cost', 1) + if args.req_time_cost > 0: + return max(req_cost, int(math.ceil(getattr(request, 'duration', 0) / args.req_time_cost))) + else: + return req_cost + + def get_limits_key_func(): + if args.api_keys: + def func(): + ak = get_req_api_key() + return ak if ak else get_remote_address() + return func + else: + return get_remote_address + + limiter = Limiter( + key_func=get_limits_key_func(), + default_limits=get_routes_limits( + args, api_keys_db + ), + storage_uri=args.req_limit_storage, + default_limits_deduct_when=lambda req: True, # Force cost to be called after the request + default_limits_cost=limits_cost, + strategy="moving-window", + ) + else: + from .no_limiter import Limiter + + limiter = Limiter() + + if not "gunicorn" in os.environ.get("SERVER_SOFTWARE", ""): + # Gunicorn starts the scheduler in the master process + scheduler.setup(args) + + flood.setup(args) + secret.setup(args) + + measure_request = None + gauge_request = None + if args.metrics: + if os.environ.get("PROMETHEUS_MULTIPROC_DIR") is None: + default_mp_dir = os.path.abspath(os.path.join("db", "prometheus")) + if not os.path.isdir(default_mp_dir): + os.mkdir(default_mp_dir) + os.environ["PROMETHEUS_MULTIPROC_DIR"] = default_mp_dir + + from prometheus_client import CONTENT_TYPE_LATEST, CollectorRegistry, Gauge, Summary, generate_latest, multiprocess + + @bp.route("/metrics") + @limiter.exempt + def prometheus_metrics(): + if args.metrics_auth_token: + authorization = request.headers.get('Authorization') + if authorization != "Bearer " + args.metrics_auth_token: + abort(401, description=_("Unauthorized")) + + registry = CollectorRegistry() + multiprocess.MultiProcessCollector(registry) + return Response(generate_latest(registry), mimetype=CONTENT_TYPE_LATEST) + + measure_request = Summary('libretranslate_http_request_duration_seconds', 'Time spent on request', ['endpoint', 'status', 'request_ip', 'api_key']) + measure_request.labels('/translate', 200, '127.0.0.1', '') + + gauge_request = Gauge('libretranslate_http_requests_in_flight', 'Active requests', ['endpoint', 'request_ip', 'api_key'], multiprocess_mode='livesum') + gauge_request.labels('/translate', '127.0.0.1', '') + + def access_check(f): + @wraps(f) + def func(*a, **kw): + ip = get_remote_address() + + if flood.is_banned(ip): + abort(403, description=_("Too many request limits violations")) + + if args.api_keys: + ak = get_req_api_key() + if ak and api_keys_db.lookup(ak) is None: + abort( + 403, + description=_("Invalid API key"), + ) + else: + need_key = False + key_missing = api_keys_db.lookup(ak) is None + + if (args.require_api_key_origin + and key_missing + and not re.match(args.require_api_key_origin, request.headers.get("Origin", "")) + ): + need_key = True + + req_secret = get_req_secret() + if (args.require_api_key_secret + and key_missing + 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: + need_key = True + + if need_key: + description = _("Please contact the server operator to get an API key") + if args.get_api_key_link: + description = _("Visit %(url)s to get an API key", url=args.get_api_key_link) + abort( + 400, + description=description, + ) + return f(*a, **kw) + + if args.metrics: + @wraps(func) + def measure_func(*a, **kw): + start_t = default_timer() + status = 200 + ip = get_remote_address() + ak = get_req_api_key() or '' + g = gauge_request.labels(request.path, ip, ak) + try: + g.inc() + return func(*a, **kw) + except HTTPException as e: + status = e.code + raise e + finally: + request.duration = max(default_timer() - start_t, 0) + measure_request.labels(request.path, status, ip, ak).observe(request.duration) + g.dec() + return measure_func + else: + @wraps(func) + def time_func(*a, **kw): + start_t = default_timer() + try: + return func(*a, **kw) + finally: + request.duration = max(default_timer() - start_t, 0) + return time_func + + @bp.errorhandler(400) + def invalid_api(e): + return jsonify({"error": str(e.description)}), 400 + + @bp.errorhandler(500) + def server_error(e): + return jsonify({"error": str(e.description)}), 500 + + @bp.errorhandler(429) + def slow_down_error(e): + flood.report(get_remote_address()) + return jsonify({"error": _("Slowdown:") + " " + str(e.description)}), 429 + + @bp.errorhandler(403) + def denied(e): + return jsonify({"error": str(e.description)}), 403 + + @bp.route("/") + @limiter.exempt + def index(): + if args.disable_web_ui: + abort(404) + + langcode = args.frontend_language if len(args.frontend_language) > 0 else request.args.get('lang') + if langcode and langcode in get_available_locale_codes(not args.debug): + session.update(preferred_lang=langcode) + + resp = make_response(render_template( + "index.html", + gaId=args.ga_id, + frontendTimeout=args.frontend_timeout, + api_keys=args.api_keys, + get_api_key_link=args.get_api_key_link, + web_version=os.environ.get("LT_WEB") is not None, + version=get_version(), + 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(), + under_attack=args.under_attack, + hide_api=args.hide_api, + frontend_title=args.frontend_title, + )) + + if args.require_api_key_secret: + resp.set_cookie('r', '1') + + return resp + + @bp.route("/js/app.js") + @limiter.exempt + def appjs(): + if args.disable_web_ui: + abort(404) + + api_secret = "" + bogus_api_secret = "" + if args.require_api_key_secret: + bogus_api_secret = secret.get_bogus_secret_b64() + + if 'User-Agent' in request.headers and request.cookies.get('r'): + api_secret = secret.get_current_secret_js() + else: + api_secret = secret.get_bogus_secret_js() + + response = Response(render_template("app.js.template", + url_prefix=args.url_prefix, + get_api_key_link=args.get_api_key_link, + api_secret=api_secret, + 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()) + response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0' + response.headers['Pragma'] = 'no-cache' + response.headers['Expires'] = '-1' + + return response + + @bp.get("/languages") + @limiter.exempt + def langs(): + """ + Get Supported Languages + --- + tags: + - translate + responses: + 200: + description: List of supported languages + schema: + id: languages + type: array + items: + type: object + description: Supported language + properties: + code: + type: string + description: Language code + name: + type: string + description: Human-readable language name (in English) + targets: + type: array + items: + type: string + description: Supported target language codes + """ + return jsonify([{"code": model2iso(l.code), + "name": _lazy(l.name), + "targets": model2iso(language_pairs.get(l.code, [])) + } for l in languages]) + + # Add cors + @bp.after_request + def after_request(response): + response.headers.add("Access-Control-Allow-Origin", "*") + response.headers.add( + "Access-Control-Allow-Headers", "Authorization, Content-Type" + ) + response.headers.add("Access-Control-Expose-Headers", "Authorization") + response.headers.add("Access-Control-Allow-Methods", "GET, POST") + response.headers.add("Access-Control-Allow-Credentials", "true") + response.headers.add("Access-Control-Max-Age", 60 * 60 * 24 * 20) + return response + + @bp.post("/translate") + @access_check + def translate(): + """ + Translate Text + --- + tags: + - translate + parameters: + - in: formData + name: q + schema: + oneOf: + - type: string + example: Hello world! + - type: array + example: ['Hello world!'] + required: true + description: Text(s) to translate + - in: formData + name: source + schema: + type: string + example: en + required: true + description: Source language code or "auto" for auto detection + - in: formData + name: target + schema: + type: string + example: es + required: true + description: Target language code + - in: formData + name: format + schema: + type: string + enum: [text, html] + default: text + example: text + required: false + description: > + 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: + type: string + example: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + required: false + description: API key + responses: + 200: + description: Translation + schema: + id: translate + type: object + properties: + translatedText: + oneOf: + - type: string + - type: array + description: Translated text(s) + detectedLanguage: + oneOf: + - type: object + properties: + confidence: + type: number + format: float + minimum: 0 + maximum: 100 + description: Confidence value + example: 100 + language: + type: string + description: Language code + - type: array + items: + type: object + properties: + confidence: + type: number + format: float + minimum: 0 + maximum: 100 + description: Confidence value + example: 100 + language: + type: string + description: Language code + alternatives: + oneOf: + - type: array + items: + type: string + - type: array + items: + type: array + items: + type: string + description: Alternative translations + required: + - translatedText + 400: + description: Invalid request + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + 500: + description: Translation error + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + 429: + description: Slow down + schema: + id: error-slow-down + type: object + properties: + error: + type: string + description: Reason for slow down + 403: + description: Banned + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + """ + if request.is_json: + json = get_json_dict(request) + q = json.get("q") + source_lang = iso2model(json.get("source")) + target_lang = iso2model(json.get("target")) + text_format = json.get("format") + num_alternatives = int(json.get("alternatives", 0)) + else: + q = request.values.get("q") + source_lang = iso2model(request.values.get("source")) + target_lang = iso2model(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')) + if not source_lang: + abort(400, description=_("Invalid request: missing %(name)s parameter", name='source')) + 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. + # https://www.rfc-editor.org/rfc/rfc2046#section-4.1.1 + q = "\n".join(q.splitlines()) + + char_limit = get_char_limit(args.char_limit, api_keys_db) + + batch = isinstance(q, list) + + if batch and args.batch_limit != -1: + batch_size = len(q) + if args.batch_limit < batch_size: + abort( + 400, + description=_("Invalid request: request (%(size)s) exceeds text limit (%(limit)s)", size=batch_size, limit=args.batch_limit), + ) + + src_texts = q if batch else [q] + + if char_limit != -1: + for text in src_texts: + if len(text) > char_limit: + abort( + 400, + description=_("Invalid request: request (%(size)s) exceeds text limit (%(limit)s)", size=len(text), limit=char_limit), + ) + + if batch: + request.req_cost = max(1, len(q)) + + translatable = detect_translatable(src_texts) + if translatable: + if source_lang == "auto": + candidate_langs = detect_languages(src_texts) + detected_src_lang = candidate_langs[0] + else: + detected_src_lang = {"confidence": 100.0, "language": source_lang} + else: + detected_src_lang = {"confidence": 0.0, "language": "en"} + + src_lang = next(iter([l for l in languages if l.code == detected_src_lang["language"]]), None) + + if src_lang is None: + abort(400, description=_("%(lang)s is not supported", lang=source_lang)) + + tgt_lang = next(iter([l for l in languages if l.code == target_lang]), None) + + if tgt_lang is None: + abort(400, description=_("%(lang)s is not supported",lang=target_lang)) + + if not text_format: + text_format = "text" + + if text_format not in ["text", "html"]: + abort(400, description=_("%(format)s format is not supported", format=text_format)) + + try: + if batch: + 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 translatable: + if text_format == "html": + translated_text = unescape(str(translate_html(translator, text))) + alternatives = [] # Not supported for html yet + else: + 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) + else: + translated_text = text # Cannot translate, send the original text back + alternatives = [] + + batch_results.append(translated_text) + batch_alternatives.append(alternatives) + + result = {"translatedText": batch_results} + + if source_lang == "auto": + result["detectedLanguage"] = [model2iso(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 translatable: + if text_format == "html": + translated_text = unescape(str(translate_html(translator, q))) + alternatives = [] # Not supported for html yet + else: + 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) + else: + translated_text = q # Cannot translate, send the original text back + alternatives = [] + + result = {"translatedText": translated_text} + + if source_lang == "auto": + result["detectedLanguage"] = model2iso(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))) + + @bp.post("/translate_file") + @access_check + def translate_file(): + """ + Translate a File + --- + tags: + - translate + consumes: + - multipart/form-data + parameters: + - in: formData + name: file + type: file + required: true + description: File to translate + - in: formData + name: source + schema: + type: string + example: en + required: true + description: Source language code or "auto" for auto detection + - in: formData + name: target + schema: + type: string + example: es + required: true + description: Target language code + - in: formData + name: api_key + schema: + type: string + example: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + required: false + description: API key + responses: + 200: + description: Translated file + schema: + id: translate-file + type: object + properties: + translatedFileUrl: + type: string + description: Translated file url + 400: + description: Invalid request + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + 500: + description: Translation error + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + 429: + description: Slow down + schema: + id: error-slow-down + type: object + properties: + error: + type: string + description: Reason for slow down + 403: + description: Banned + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + """ + if args.disable_files_translation: + abort(403, description=_("Files translation are disabled on this server.")) + + source_lang = iso2model(request.form.get("source")) + target_lang = iso2model(request.form.get("target")) + file = request.files['file'] + char_limit = get_char_limit(args.char_limit, api_keys_db) + + if not file: + abort(400, description=_("Invalid request: missing %(name)s parameter", name='file')) + if not source_lang: + abort(400, description=_("Invalid request: missing %(name)s parameter", name='source')) + if not target_lang: + abort(400, description=_("Invalid request: missing %(name)s parameter", name='target')) + + if file.filename == '': + abort(400, description=_("Invalid request: empty file")) + + if os.path.splitext(file.filename)[1] not in frontend_argos_supported_files_format: + abort(400, description=_("Invalid request: file format not supported")) + + src_lang = next(iter([l for l in languages if l.code == source_lang]), None) + + if src_lang is None and source_lang != "auto": + abort(400, description=_("%(lang)s is not supported", lang=source_lang)) + + tgt_lang = next(iter([l for l in languages if l.code == target_lang]), None) + + if tgt_lang is None: + abort(400, description=_("%(lang)s is not supported", lang=target_lang)) + + try: + filename = str(uuid.uuid4()) + '.' + secure_filename(file.filename) + filepath = os.path.join(get_upload_dir(), filename) + + file.save(filepath) + + # Not an exact science: take the number of bytes and divide by + # the character limit. Assuming a plain text file, this will + # set the cost of the request to N = bytes / char_limit, which is + # roughly equivalent to a batch process of N batches assuming + # each batch uses all available limits + if char_limit > 0: + request.req_cost = max(1, int(os.path.getsize(filepath) / char_limit)) + + if source_lang == "auto": + src_texts = argostranslatefiles.get_texts(filepath) + candidate_langs = detect_languages(src_texts) + detected_src_lang = candidate_langs[0] + src_lang = next(iter([l for l in languages if l.code == detected_src_lang["language"]]), None) + if src_lang is None: + abort(400, description=_("%(lang)s is not supported", lang=detected_src_lang["language"])) + + translated_file_path = argostranslatefiles.translate_file(src_lang.get_translation(tgt_lang), filepath) + translated_filename = os.path.basename(translated_file_path) + + return jsonify( + { + "translatedFileUrl": url_for('Main app.download_file', filename=translated_filename, _external=True) + } + ) + except Exception as e: + abort(500, description=e) + + @bp.get("/download_file/") + def download_file(filename: str): + """ + Download a translated file + """ + if args.disable_files_translation: + abort(400, description=_("Files translation are disabled on this server.")) + + filepath = os.path.join(get_upload_dir(), filename) + try: + checked_filepath = security.path_traversal_check(filepath, get_upload_dir()) + if os.path.isfile(checked_filepath): + filepath = checked_filepath + except security.SuspiciousFileOperationError: + abort(400, description=_("Invalid filename")) + + return_data = io.BytesIO() + with open(filepath, 'rb') as fo: + return_data.write(fo.read()) + return_data.seek(0) + + download_filename = filename.split('.') + download_filename.pop(0) + download_filename = '.'.join(download_filename) + + return send_file(return_data, as_attachment=True, download_name=download_filename) + + @bp.post("/detect") + @access_check + def detect(): + """ + Detect Language of Text + --- + tags: + - translate + parameters: + - in: formData + name: q + schema: + type: string + example: What language is this? + required: true + description: Text to detect + - in: formData + name: api_key + schema: + type: string + example: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + required: false + description: API key + responses: + 200: + description: Detections + schema: + id: detections + type: array + items: + type: object + properties: + confidence: + type: number + format: float + minimum: 0 + maximum: 100 + description: Confidence value + example: 100 + language: + type: string + description: Language code + example: en + 400: + description: Invalid request + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + 500: + description: Detection error + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + 429: + description: Slow down + schema: + id: error-slow-down + type: object + properties: + error: + type: string + description: Reason for slow down + 403: + description: Banned + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + """ + if request.is_json: + json = get_json_dict(request) + q = json.get("q") + else: + q = request.values.get("q") + + if not q: + abort(400, description=_("Invalid request: missing %(name)s parameter", name='q')) + + return jsonify(model2iso(detect_languages(q))) + + @bp.route("/frontend/settings") + @limiter.exempt + def frontend_settings(): + """ + Retrieve Frontend Settings + --- + tags: + - misc + responses: + 200: + description: frontend settings + schema: + id: frontend-settings + type: object + properties: + charLimit: + type: integer + description: Character input limit for this language (-1 indicates no limit) + frontendTimeout: + type: integer + description: Frontend translation timeout + apiKeys: + type: boolean + description: Whether the API key database is enabled. + keyRequired: + type: boolean + description: Whether an API key is required. + suggestions: + type: boolean + description: Whether submitting suggestions is enabled. + supportedFilesFormat: + type: array + items: + type: string + description: Supported files format + language: + type: object + properties: + source: + type: object + properties: + code: + type: string + description: Language code + name: + type: string + description: Human-readable language name (in English) + target: + type: object + properties: + code: + type: string + description: Language code + name: + type: string + description: Human-readable language name (in English) + """ + target_lang = frontend_argos_language_target() + + return jsonify( + { + "charLimit": args.char_limit, + "frontendTimeout": args.frontend_timeout, + "apiKeys": args.api_keys, + "keyRequired": bool(args.api_keys and args.require_api_key_origin), + "suggestions": args.suggestions, + "filesTranslation": not args.disable_files_translation, + "supportedFilesFormat": [] if args.disable_files_translation else frontend_argos_supported_files_format, + "language": { + "source": { + "code": frontend_argos_language_source.code, + "name": _lazy(frontend_argos_language_source.name), + }, + "target": { + "code": target_lang.code, + "name": _lazy(target_lang.name), + }, + }, + } + ) + + @bp.post("/suggest") + def suggest(): + """ + Submit a Suggestion to Improve a Translation + --- + tags: + - misc + parameters: + - in: formData + name: q + schema: + type: string + example: Hello world! + required: true + description: Original text + - in: formData + name: s + schema: + type: string + example: ¡Hola mundo! + required: true + description: Suggested translation + - in: formData + name: source + schema: + type: string + example: en + required: true + description: Language of original text + - in: formData + name: target + schema: + type: string + example: es + required: true + description: Language of suggested translation + responses: + 200: + description: Success + schema: + id: suggest-response + type: object + properties: + success: + type: boolean + description: Whether submission was successful + 403: + description: Not authorized + schema: + id: error-response + type: object + properties: + error: + type: string + description: Error message + """ + if not args.suggestions: + abort(403, description=_("Suggestions are disabled on this server.")) + + if request.is_json: + json = get_json_dict(request) + q = json.get("q") + s = json.get("s") + source_lang = iso2model(json.get("source")) + target_lang = iso2model(json.get("target")) + else: + q = request.values.get("q") + s = request.values.get("s") + source_lang = iso2model(request.values.get("source")) + target_lang = iso2model(request.values.get("target")) + + if not q: + abort(400, description=_("Invalid request: missing %(name)s parameter", name='q')) + if not s: + abort(400, description=_("Invalid request: missing %(name)s parameter", name='s')) + if not source_lang: + abort(400, description=_("Invalid request: missing %(name)s parameter", name='source')) + if not target_lang: + abort(400, description=_("Invalid request: missing %(name)s parameter", name='target')) + + SuggestionsDatabase().add(q, s, source_lang, target_lang) + return jsonify({"success": True}) + + app = Flask(__name__) + + app.config["SESSION_TYPE"] = "filesystem" + app.config["SESSION_FILE_DIR"] = os.path.join("db", "sessions") + app.config["JSON_AS_ASCII"] = False + Session(app) + + if args.debug: + app.config["TEMPLATES_AUTO_RELOAD"] = True + + app.register_blueprint(bp) + + limiter.init_app(app) + + swag = swagger(app) + swag["basePath"] = args.url_prefix if args.url_prefix != "" else "/" + swag["info"]["version"] = get_version() + swag["info"]["title"] = "LibreTranslate" + swag["info"]["description"] = "Free and Open Source Machine Translation API." + swag["info"]["license"] = {"name": "AGPL-3.0"} + + @app.route(api_url) + @limiter.exempt + def spec(): + return jsonify(lazy_swag(swag)) + + app.config["BABEL_TRANSLATION_DIRECTORIES"] = 'locales' + + def get_locale(): + override_lang = request.headers.get('X-Override-Accept-Language') + if override_lang and override_lang in get_available_locale_codes(): + return override_lang + return session.get('preferred_lang', request.accept_languages.best_match(get_available_locale_codes())) + + Babel(app, locale_selector=get_locale) + + app.jinja_env.globals.update(_e=gettext_escaped, _h=gettext_html) + + # Call factory function to create our blueprint + # The Blueprint is not using url_for which means the middleware does not work properly and we need to manually fix things + swaggerui_blueprint = get_swaggerui_blueprint(swagger_url, args.url_prefix + api_url) + swaggerui_blueprint.url_prefix = "/docs" + app.register_blueprint(swaggerui_blueprint) + + return app diff --git a/self_host/LibreTranslate/libretranslate/default_values.py b/self_host/LibreTranslate/libretranslate/default_values.py new file mode 100644 index 00000000..99cf329e --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/default_values.py @@ -0,0 +1,247 @@ +import os + +_prefix = 'LT_' + + +def _get_value_str(name, default_value): + env_value = os.environ.get(name) + return default_value if env_value is None else env_value + + +def _get_value_int(name, default_value): + try: + return int(os.environ[name]) + except: + return default_value + + +def _get_value_bool(name, default_value): + env_value = os.environ.get(name) + if env_value in ['FALSE', 'False', 'false', '0']: + return False + if env_value in ['TRUE', 'True', 'true', '1']: + return True + return default_value + + +def _get_value(name, default_value, value_type): + env_name = _prefix + name + if value_type == 'str': + return _get_value_str(env_name, default_value) + if value_type == 'int': + return _get_value_int(env_name, default_value) + if value_type == 'bool': + return _get_value_bool(env_name, default_value) + return default_value + + +_default_options_objects = [ + { + 'name': 'HOST', + 'default_value': '127.0.0.1', + 'value_type': 'str' + }, + { + 'name': 'PORT', + 'default_value': 5000, + 'value_type': 'int' + }, + { + 'name': 'CHAR_LIMIT', + 'default_value': -1, + 'value_type': 'int' + }, + { + 'name': 'REQ_LIMIT', + 'default_value': -1, + 'value_type': 'int' + }, + { + 'name': 'REQ_LIMIT_STORAGE', + 'default_value': 'memory://', + 'value_type': 'str' + }, + { + 'name': 'HOURLY_REQ_LIMIT', + 'default_value': -1, + 'value_type': 'int' + }, + { + 'name': 'HOURLY_REQ_LIMIT_DECAY', + 'default_value': 0, + 'value_type': 'int' + }, + { + 'name': 'DAILY_REQ_LIMIT', + 'default_value': -1, + 'value_type': 'int' + }, + { + 'name': 'REQ_FLOOD_THRESHOLD', + 'default_value': -1, + 'value_type': 'int' + }, + { + 'name': 'REQ_TIME_COST', + 'default_value': -1, + 'value_type': 'int' + }, + { + 'name': 'BATCH_LIMIT', + 'default_value': -1, + 'value_type': 'int' + }, + { + 'name': 'GA_ID', + 'default_value': None, + 'value_type': 'str' + }, + { + 'name': 'DEBUG', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'SSL', + 'default_value': None, + 'value_type': 'bool' + }, + { + 'name': 'FRONTEND_LANGUAGE_SOURCE', + 'default_value': 'auto', + 'value_type': 'str' + }, + { + 'name': 'FRONTEND_LANGUAGE_TARGET', + 'default_value': 'locale', + 'value_type': 'str' + }, + { + 'name': 'FRONTEND_LANGUAGE', + 'default_value': '', + 'value_type': 'str' + }, + { + 'name': 'FRONTEND_TIMEOUT', + 'default_value': 500, + 'value_type': 'int' + }, + { + 'name': 'FRONTEND_TITLE', + 'default_value': '', + 'value_type': 'str' + }, + { + 'name': 'API_KEYS', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'API_KEYS_DB_PATH', + 'default_value': 'db/api_keys.db', + 'value_type': 'str' + }, + { + 'name': 'API_KEYS_REMOTE', + 'default_value': '', + 'value_type': 'str' + }, + { + 'name': 'GET_API_KEY_LINK', + 'default_value': '', + 'value_type': 'str' + }, + { + 'name': 'REQUIRE_API_KEY_ORIGIN', + 'default_value': '', + 'value_type': 'str' + }, + { + 'name': 'REQUIRE_API_KEY_SECRET', + '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': 'HIDE_API', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'SHARED_STORAGE', + 'default_value': 'memory://', + 'value_type': 'str' + }, + { + 'name': 'SECONDARY', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'LOAD_ONLY', + 'default_value': None, + 'value_type': 'str' + }, + { + 'name': 'ALTERNATIVES_LIMIT', + 'default_value': -1, + 'value_type': 'int' + }, + { + 'name': 'THREADS', + 'default_value': 4, + 'value_type': 'int' + }, + { + 'name': 'SUGGESTIONS', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'DISABLE_FILES_TRANSLATION', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'DISABLE_WEB_UI', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'UPDATE_MODELS', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'FORCE_UPDATE_MODELS', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'METRICS', + 'default_value': False, + 'value_type': 'bool' + }, + { + 'name': 'METRICS_AUTH_TOKEN', + 'default_value': '', + 'value_type': 'str' + }, + { + 'name': 'URL_PREFIX', + 'default_value': '', + 'value_type': 'str' + }, +] + + +DEFAULT_ARGUMENTS = {obj['name']: _get_value(**obj) for obj in _default_options_objects} diff --git a/self_host/LibreTranslate/libretranslate/detect.py b/self_host/LibreTranslate/libretranslate/detect.py new file mode 100644 index 00000000..023adbac --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/detect.py @@ -0,0 +1,54 @@ + +from langdetect import DetectorFactory + +DetectorFactory.seed = 0 + +from langdetect import detect_langs, LangDetectException +from langdetect.lang_detect_exception import ErrorCode +from lexilang.detector import detect as lldetect + + +class Language: + def __init__(self, code, confidence): + self.code = code + self.confidence = float(confidence) + + def __str__(self): + return (f"code: {self.code:<9} confidence: {self.confidence:>5.1f} ") + +def check_lang(langcodes, lang): + return normalized_lang_code(lang) in langcodes + +def normalized_lang_code(lang): + code = lang.lang + # Handle Chinese + if code == "zh-cn": + code = "zh" + elif code == "zh-tw": + code = "zt" + return code + +class Detector: + def __init__(self, langcodes = ()): + self.langcodes = langcodes + + def detect(self, text): + if len(text) < 20: + code, conf = lldetect(text, self.langcodes) + if conf > 0: + return [Language(code, round(conf * 100))] + + try: + top_3_choices = [lang for lang in detect_langs(text) if check_lang(self.langcodes, lang)][:3] + if not len(top_3_choices): + return [Language("en", 0)] + if top_3_choices[0].prob == 0: + return [Language("en", 0)] + except LangDetectException as e: + if e.code == ErrorCode.CantDetectError: + return [Language("en", 0)] + else: + raise e + + return [Language(normalized_lang_code(lang), round(lang.prob * 100)) for lang in top_3_choices] + diff --git a/self_host/LibreTranslate/libretranslate/flood.py b/self_host/LibreTranslate/libretranslate/flood.py new file mode 100644 index 00000000..3f87c9bd --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/flood.py @@ -0,0 +1,60 @@ +from libretranslate.storage import get_storage + +active = False +threshold = -1 + +def forgive_banned(): + global threshold + + clear_list = [] + s = get_storage() + banned = s.get_all_hash_int("banned") + + for ip in banned: + if banned[ip] <= 0: + clear_list.append(ip) + else: + s.set_hash_int("banned", ip, min(threshold, banned[ip]) - 1) + + for ip in clear_list: + s.del_hash("banned", ip) + +def setup(args): + global active + global threshold + + if args.req_flood_threshold > 0: + active = True + threshold = args.req_flood_threshold + +def report(request_ip): + if active: + get_storage().inc_hash_int("banned", request_ip) + +def decrease(request_ip): + s = get_storage() + if s.get_hash_int("banned", request_ip) > 0: + s.dec_hash_int("banned", request_ip) + +def has_violation(request_ip): + s = get_storage() + return s.get_hash_int("banned", request_ip) > 0 + +def is_banned(request_ip): + s = get_storage() + + # More than X offences? + return active and s.get_hash_int("banned", request_ip) >= threshold + +def fingerprint_mismatch(request_ip, fingerprint): + if not isinstance(fingerprint, str) or fingerprint == "": + return True + + s = get_storage() + k = f"fingerprint:{request_ip}" + expected = s.get_str(k) + if expected == "": + s.set_str(k, fingerprint, ex=300) + return False + else: + return fingerprint != expected \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/init.py b/self_host/LibreTranslate/libretranslate/init.py new file mode 100644 index 00000000..0df8ba3d --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/init.py @@ -0,0 +1,76 @@ + +from argostranslate import package, translate +from packaging import version + +import libretranslate.language + + +def boot(load_only=None, update_models=False, install_models=False): + try: + if update_models: + check_and_install_models(load_only_lang_codes=load_only, update=update_models) + else: + check_and_install_models(force=install_models, load_only_lang_codes=load_only) + except Exception as e: + print("Cannot update models (normal if you're offline): %s" % str(e)) + + +def check_and_install_models(force=False, load_only_lang_codes=None,update=False): + if len(package.get_installed_packages()) < 2 or force or update: + # Update package definitions from remote + print("Updating language models") + package.update_package_index() + + # Load available packages from local package index + available_packages = package.get_available_packages() + installed_packages = package.get_installed_packages() + print("Found %s models" % len(available_packages)) + if load_only_lang_codes is not None: + # load_only_lang_codes: List[str] (codes) + load_only_lang_codes = libretranslate.language.iso2model(load_only_lang_codes) + + # Ensure the user does not use any unavailable language code. + unavailable_lang_codes = set(load_only_lang_codes) + for pack in available_packages: + unavailable_lang_codes -= {pack.from_code, pack.to_code} + if unavailable_lang_codes: + raise ValueError( + "Unavailable language codes: %s." + % ",".join(sorted(unavailable_lang_codes)) + ) + # Keep only the packages that have both from_code and to_code in our list. + available_packages = [ + pack + for pack in available_packages + if pack.from_code in load_only_lang_codes and pack.to_code in load_only_lang_codes + ] + if not available_packages: + raise ValueError("no available package") + print("Keep %s models" % len(available_packages)) + + # Download and install all available packages + for available_package in available_packages: + update = False + if not force: + for pack in installed_packages: + if ( + pack.from_code == available_package.from_code + and pack.to_code == available_package.to_code + ): + update = True + if version.parse(pack.package_version) < version.parse(available_package.package_version): + print( + f"Updating {available_package} ({pack.package_version}->{available_package.package_version}) ..." + ) + pack.update() + if not update: + print( + f"Downloading {available_package} ({available_package.package_version}) ..." + ) + available_package.install() + + # reload installed languages + libretranslate.language.languages = translate.get_installed_languages() + print( + f"Loaded support for {len(translate.get_installed_languages())} languages ({len(available_packages)} models total)!" + ) diff --git a/self_host/LibreTranslate/libretranslate/language.py b/self_host/LibreTranslate/libretranslate/language.py new file mode 100644 index 00000000..42f88660 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/language.py @@ -0,0 +1,162 @@ + +from functools import lru_cache + +from argostranslate import translate + +from libretranslate.detect import Detector + +__languages = None +aliases = { + 'pb': 'pt-BR', + 'zh': 'zh-Hans', + 'zt': 'zh-Hant', +} +rev_aliases = {v.lower(): k for k, v in aliases.items()} + +def iso2model(lang): + if isinstance(lang, list): + return [iso2model(l) for l in lang] + + if not isinstance(lang, str): + return lang + + lang = lang.lower() + return rev_aliases.get(lang, lang) + +def model2iso(lang): + if isinstance(lang, dict) and 'language' in lang: + d = dict(lang) + d['language'] = model2iso(d['language']) + return d + elif isinstance(lang, list): + return [model2iso(l) for l in lang] + + lang = lang.lower() + return aliases.get(lang, lang) + +def load_languages(): + global __languages + + if __languages is None or len(__languages) == 0: + __languages = translate.get_installed_languages() + + return __languages + +@lru_cache(maxsize=None) +def load_lang_codes(): + languages = load_languages() + return tuple(l.code for l in languages) + +def detect_languages(text): + # detect batch processing + if isinstance(text, list): + is_batch = True + else: + is_batch = False + text = [text] + + lang_codes = load_lang_codes() + + # get the candidates + candidates = [] + for t in text: + try: + d = Detector(lang_codes).detect(t) + for i in range(len(d)): + d[i].text_length = len(t) + candidates.extend(d) + except Exception as e: + print(str(e)) + + # total read bytes of the provided text + text_length_total = sum(c.text_length for c in candidates) + + # this happens if no language could be detected + if not candidates: + # use language "en" by default but with zero confidence + return [{"confidence": 0.0, "language": "en"}] + + # for multiple occurrences of the same language (can happen on batch detection) + # calculate the average confidence for each language + if is_batch: + temp_average_list = [] + for lang_code in lang_codes: + # get all candidates for a specific language + lc = list(filter(lambda l: l.code == lang_code, candidates)) + if len(lc) > 1: + # if more than one is present, calculate the average confidence + lang = lc[0] + lang.confidence = sum(l.confidence for l in lc) / len(lc) + lang.text_length = sum(l.text_length for l in lc) + temp_average_list.append(lang) + elif lc: + # otherwise just add it to the temporary list + temp_average_list.append(lc[0]) + + if temp_average_list: + # replace the list + candidates = temp_average_list + + # sort the candidates descending based on the detected confidence + candidates.sort( + key=lambda l: 0 if text_length_total == 0 else (l.confidence * l.text_length) / text_length_total, reverse=True + ) + + return [{"confidence": l.confidence, "language": l.code} for l in candidates] + + +def improve_translation_formatting(source, translation, improve_punctuation=True, remove_single_word_duplicates=True): + source = source.strip() + + if not len(source): + return "" + + if not len(translation): + return source + + if improve_punctuation: + source_last_char = source[len(source) - 1] + translation_last_char = translation[len(translation) - 1] + + punctuation_chars = ['!', '?', '.', ',', ';', '。'] + if source_last_char in punctuation_chars: + if translation_last_char != source_last_char: + if translation_last_char in punctuation_chars: + translation = translation[:-1] + + translation += source_last_char + elif translation_last_char in punctuation_chars: + translation = translation[:-1] + + # A workaround for certain language models that output + # the single word repeated ad-infinitum (the "salad" bug) + # https://github.com/LibreTranslate/LibreTranslate/issues/46 + if remove_single_word_duplicates: + if len(source) < 20 and source.count(" ") == 0 and translation.count(" ") > 0: + bow = translation.split() + count = {} + for word in bow: + count[word] = count.get(word, 0) + 1 + + for word in count: + if count[word] / len(count) >= 2: + translation = bow[0] + break + + if source.islower(): + return translation.lower() + + if source.isupper(): + return translation.upper() + + if len(translation) == 0: + return source + + if source[0].islower(): + return translation[0].lower() + translation[1:] + + if source[0].isupper(): + return translation[0].upper() + translation[1:] + + return translation + diff --git a/self_host/LibreTranslate/libretranslate/locales.py b/self_host/LibreTranslate/libretranslate/locales.py new file mode 100644 index 00000000..eab1a5fa --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales.py @@ -0,0 +1,97 @@ +import json +import os +from functools import lru_cache + +from flask_babel import gettext as _ +from flask_babel import lazy_gettext as _lazy +from markupsafe import Markup, escape + + +@lru_cache(maxsize=None) +def get_available_locales(only_reviewed=True, sort_by_name=False): + locales_dir = os.path.join(os.path.dirname(__file__), 'locales') + dirs = [os.path.join(locales_dir, d) for d in os.listdir(locales_dir)] + + res = [{'code': 'en', 'name': 'English', 'reviewed': True}] + + for d in dirs: + if d == 'en': + continue + + meta_file = os.path.join(d, 'meta.json') + if os.path.isdir(os.path.join(d, 'LC_MESSAGES')) and os.path.isfile(meta_file): + try: + with open(meta_file) as f: + j = json.loads(f.read()) + except Exception as e: + print(e) + continue + + if j.get('reviewed') or not only_reviewed: + res.append({'code': os.path.basename(d), 'name': j.get('name', ''), 'reviewed': j.get('reviewed', False)}) + + if sort_by_name: + res.sort(key=lambda s: s['name']) + + return res + +@lru_cache(maxsize=None) +def get_available_locale_codes(only_reviewed=True): + return [l['code'] for l in get_available_locales(only_reviewed=only_reviewed)] + +@lru_cache(maxsize=None) +def get_alternate_locale_links(): + tmpl = os.environ.get("LT_LOCALE_LINK_TEMPLATE") + if tmpl is None: + return [] + + locales = get_available_locale_codes() + result = [] + for l in locales: + link = tmpl.replace("{LANG}", l) + if l == 'en': + link = link.replace("en.", "") + result.append({ 'link': link,'lang': l }) + return result + +# Javascript code should use _e instead of _ +def gettext_escaped(text, **variables): + return json.dumps(_(text, **variables)) + +# HTML should be escaped using _h instead of _ +def gettext_html(text, **variables): + # Translate text without args + s = str(escape(_(text))) + + v = {} + if variables: + for k in variables: + if hasattr(variables[k], 'unescape'): + v[k] = variables[k].unescape() + else: + v[k] = Markup(variables[k]) + + # Variables are assumed to be already escaped and thus safe + return Markup(s if not v else s % v) + +def swag_eval(swag, func): + # Traverse the swag spec structure + # and call func on summary and description keys + for k in swag: + if k in ['summary', 'description'] and isinstance(swag[k], str) and swag[k] != "": + swag[k] = func(swag[k]) + elif k == 'tags' and isinstance(swag[k], list): + swag[k] = [func(v) for v in swag[k]] + elif isinstance(swag[k], dict): + swag_eval(swag[k], func) + elif isinstance(swag[k], list) and k != 'consumes': + for i in swag[k]: + if isinstance(i, str): + func(i) + elif isinstance(i, dict): + swag_eval(i, func) + + return swag + +def lazy_swag(swag): + return swag_eval(swag, _lazy) \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/ar/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ar/LC_MESSAGES/messages.po new file mode 100644 index 00000000..2bb69373 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ar/LC_MESSAGES/messages.po @@ -0,0 +1,765 @@ +# Arabic translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-03-02 05:55+0000\n" +"Last-Translator: ButterflyOfFire \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=0 && n%100<=2 ? 4 : 5);\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "تنسيق JSON غير صالح" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "اكتشاف تلقائي" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "غير مصرح به" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "تم تجاوز عدد الطلبات المسموح بها" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "مفتاح API غير صحيح" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "يرجى الاتصال بالسيرفر للحصول على مفتاح API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "زيارة%(url)s للحصول على مفتاح API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "التباطؤ:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "عدم وجود طلب: صفر البارامترات ليست رقم %(name)s" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "عدم وجود طلب: صفر البارامترات يجب أن تكون %(value)s %(name)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s الشكل غير مدعوم" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "لا يمكن ترجمة النص: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "ترجمة الملفات معطلة على هذا الخادم." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "طلب خاطئ: ملف فارغ" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "طلب غير صحيح: صيغة الملف غير مدعومة" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "اسم الملف غير صالح" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "الاقتراحات معطلة على هذا الخادم." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "الإنجليزية" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "ألبانيا" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "العربية" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "الأذربيجانية" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "بنغالي" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "بلغاريا" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalan" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "الصينية" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "الصينية (التقليدية)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "التشيكية" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "الدنماركية" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "الهولندية" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "الإسبيرنتو" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "إستونيا" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "الفنلندية" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "الفرنسية" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "الألمانية" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "اليونانية" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "العبرية" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "الهندية" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "الهنغارية" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "الإندونيسية" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "الأيرلندية" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "الإيطالية" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "اليابانية" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "الكورية" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "لاتفيا" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "ليتوانيا" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "مالي" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "النرويج" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "الفارسية" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "البولندية" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "البرتغالية" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "البرتغال (البرازيل)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "رومانيا" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "الروسية" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "السلوفاكية" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "سلوفينيا(ن)" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "الإسبانية" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "السويدية" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "تايلند" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "التركية" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "الأوكرانية" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "صربيا" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "أوكرانيا" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamese" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "قائمة الاسترجاع باللغات المدعومة" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "قائمة اللغات" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "ترجمة" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "ترجمة النص من لغة إلى أخرى" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "النص المترجمة" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "عدم وجود طلب" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "خطأ الترجمة" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "تمهل" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "تم حظرها" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "مرحبا العالم!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "النص (النصوص) المراد ترجمتها" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "رمز لغة المصدر" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "رمز اللغة الهدف" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "نص" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format of source text:\n" +"* " النص "\n" +"* html - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "العدد المفضَّل من الترجمات البديلة" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "مفتاح API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "ترجمة ملف من لغة إلى أخرى" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "ملف مراجع" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "ملف للترجمة" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "الكشف عن لغة نص ما" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "الكشف" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "الخطأ" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "النص المراد الكشف عنه" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "استرداد إعدادات محددة للواجهة الأمامية" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "اعدادات الواجهة الأمامية" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "الواجهة" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "تقديم اقتراح لتحسين الترجمة" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "تم بنجاح" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "غيرمرخص به" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "النص الأصلي" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "الترجمة المقترَحة" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "لغة النص الأصلي" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "لغة الترجمة المقترَحة" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "التعليقات" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "رمز اللغة" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "اسم لغة قابلة للقراءة البشرية (باللغة الإنكليزية)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "رموز اللغات المستهدفة المدعومة" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "النص/النثوص المترجمة" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "رسالة خطأ" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "سبب التباطؤ" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "عنوان ملف مترجمة" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "قيمة الثقة" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "الحد الأقصى للمدخلات التعريفية لهذه اللغة (-1 لا يشير إلى حد أقصى)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "وقت واجهة الترجمة" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "ما إذا كانت قاعدة البيانات الرئيسية متاحة." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "ما إذا كان من المطلوب وجود مفتاح." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "وسواء أمكن تقديم الاقتراحات." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "استمارة الملفات المدعومة" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "ما إذا كان التقديم ناجحاً" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "نسخ النص" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "لا يمكن تحميل %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "خطأ غير معروف" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "تم نسخه" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "شكراً على تصحيحك ملاحظة الاقتراح لن يبدأ تطبيقه في الحال." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "لا توجد لغات متاحة. هل قمت بتثبيت النماذج بشكل صحيح؟?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "ادخل مفتاحك إذا كنت بحاجة إلى مفتاح API، %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "اضغط على رابط \"المفاتيح\"." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "واجهة برمجة تطبيقات حرة ومفتوحة المصدر للترجمة الآلية" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"واجهة حرة ومفتوحة المصدر لبرمجة تطبيقات الترجمة الآلية. متاح للتنزيل مجانا " +"ويعمل دون اتصال بالانترنت وسهل للتثبيت. قوموا بإطلاق خادمكم الخاص في غضون " +"دقائق." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "ترجمة" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API مستندات" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "الحصول على مفتاح API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "غيت هب" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "تعيين مفتاح API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "تغيير اللغة" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "تعديل" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "الظلمة/الضوء" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "تجاهل" + +#: 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:186 +msgid "Translate Text" +msgstr "ترجمة النص" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "ترجمة الملفات" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "ترجمة من" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "تبديل المصدر واللغات المستهدفة" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "ترجمة الى" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "نص للترجمة" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "حذف النص" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "اقتراح ترجمة" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "إلغاء" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "أرسل" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "صيغ الملفات المدعومة:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "ملف" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "حذف الملف" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "ترجمة" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "تحميل" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "الطلب" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "الرد" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "api ترجمة آلي مفتوح المصدر" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "مجاني للتنزيل. يمكن استخدامه دون اتصال بالإنترنت. سهل الإعداد." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "ترجمة حرة" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "الرخصة:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "مصنوعة %(heart)s من قبل %(contributors)s ومدعومة بواسطة %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s المساهمون" + +#~ msgid "multipart/form-data" +#~ msgstr "البيانات المتعددة الجوانب/الرسمية" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamese" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "يجب استخدام واجهة برمجة التطبيقات العامة هذه للاختبار أو للاستخدام الشخصي أو" +#~ " غير المتكرر. إذا كنت تريد تشغيل تطبيق إنتاجي ، من فضلك استخدم " +#~ "%(host_server)s أو %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "تستضيف خادمك الخاص" + +#~ msgid "get an API key" +#~ msgstr "الحصول على مفتاح API" + +#~ msgid "Basque" +#~ msgstr "Basque" + +#~ msgid "Galician" +#~ msgstr "غاليشي" diff --git a/self_host/LibreTranslate/libretranslate/locales/ar/meta.json b/self_host/LibreTranslate/libretranslate/locales/ar/meta.json new file mode 100644 index 00000000..f240dd22 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ar/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Arabic", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/az/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/az/LC_MESSAGES/messages.po new file mode 100644 index 00000000..73743500 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/az/LC_MESSAGES/messages.po @@ -0,0 +1,771 @@ +# Azerbaijani translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-09-17 21:09+0000\n" +"Last-Translator: Dinissantos \n" +"Language-Team: Azerbaijani \n" +"Language: az\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Invalid JSON format" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Avtomatik simptomlar" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Uşaq" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Ən çox məlumat limitləri" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Invalid API əsas" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Bir API əsas almaq üçün server operatorla əlaqə edin" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Bakı %(url)s Bir API əsas almaq" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Yavaşlama:" + +#: 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 "Invalid tərəfindən: eksik %(name)s Qeydiyyat" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Ad Soyad: Qeydiyyat parametr bir sayı deyil %(name)s" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Ad Soyad: Qeydiyyat parametr <= %(value)s %(name)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, fuzzy, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Invalid tərəfindən: (%(size)s) / (%(limit)s)" + +#: 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 Yadda saxla" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s format dəstəkləmir" + +#: libretranslate/app.py:735 libretranslate/app.py:763 +#, fuzzy, python-format +msgid "" +"%(tname)s (%(tcode)s) is not available as a target language from %(sname)s " +"(%(scode)s)" +msgstr "" +"%(tname)s (%(tcode)s Ətraf dili kimi mövcud deyil %(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Qeyd çevirmə: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Bu server üzərində faylları silinir." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Invalid istə: boş fayl" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Invalid tərəfindən: fayl format əlavə etmir" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Ad Soyad" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Proqramlar bu server üzrə dəstəklənir." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "İngilis dili" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Bakı" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Bakı" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Bakı" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Qalereya" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Rusiya" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Kateqoriya" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Çin" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Çin (traditional)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Çex dili" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danimarka" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Rusiya" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estoniya" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Qeydiyyat" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Fransız" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Almaniya" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Yunanıstan" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Elan" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Qeydiyyat" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Bakı" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Qeydiyyat" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Rusiya" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Rusiya" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Yapon" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreya" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Latvia" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Rusiya" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Bakı" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Rusiya" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Axtar" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Bakı" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portuguese" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr " Portuguese (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romanian" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rusiya" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Qeydiyyat" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Sloveniya" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "İspaniya" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Bakı" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Axtarış" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thai" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Türkiyə" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "U" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Bakı" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Rusiya" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrayna" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr " Vietnamese" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Yadda saxla" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Dillərin siyahısı" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "translate" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Bir dildən digər məsləhət" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Tarix" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Ad Soyad" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Translation error" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Aşağı" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Bakı" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Salam dünya!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Tərcümə ediləcək mətn(lər)" + +#: libretranslate/locales/.swag.py:12 +#, fuzzy +msgid "Source language code" +msgstr "Dil kodu" + +#: libretranslate/locales/.swag.py:13 +#, fuzzy +msgid "Target language code" +msgstr "İctimai kodları" + +#: libretranslate/locales/.swag.py:14 +#, fuzzy +msgid "text" +msgstr "Elanlar" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Məhsulun forması:\n" +"* 'text' - Düz məhsul\n" +"* 'html' - HTML qeydiyyat\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Alternat ünvanı" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Axtarış" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Bir dildən digər fayl" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Proqram" + +#: libretranslate/locales/.swag.py:21 +#, fuzzy +msgid "File to translate" +msgstr "Tarix" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Bir məhsul dilinin tanınması" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Axtarış" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "İmtahan" + +#: libretranslate/locales/.swag.py:25 +#, fuzzy +msgid "Text to detect" +msgstr "Avtomatik simptomlar" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Yadda saxla" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "front" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "front" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Müəlliflik hüquququ" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Qeydiyyat" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Qeyd olun" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Original" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Qeydiyyat" + +#: libretranslate/locales/.swag.py:34 +#, fuzzy +msgid "Language of original text" +msgstr "Bir məhsul dilinin tanınması" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Müəlliflik" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "feedback" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Dil kodu" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Human-readable dil adı (in English)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "İctimai kodları" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Xüsusi məhsullar" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Yadda saxla" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Yavaş aşağı qaldırmaq" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Url url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Konfiqurasiya" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Bu dil üçün simvol giriş limiti (-1 heç bir limit göstərir)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Qeydiyyat vaxtı" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "API əsas verilən veriləndirilməsi." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Bir API əsas tələb olun." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Təkliflərin təklif edilməsi mümkündür." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "E-poçt ünvanı" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Yadda saxla" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Elanlar" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Qeydiyyat %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Xüsusi məlumat" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Elan" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "Sizin düzeltmeniz üçün. Müəlliflik hüququqları qorunur." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Heç bir dil mövcuddur. Siz modelləri düzgün quraşdırdı?" + +#: libretranslate/templates/app.js.template:536 +#, fuzzy, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "API key növü. Bir API əsas lazım varsa, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "\"Get API Key\" linkini basın." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "server operatoru əlaqə edin." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Pulsuz və Açıq Source Machine Translation API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Pulsuz və Open Source Machine Translation API. Yükləmək üçün pulsuz, offline" +" və asan quraşdırmaq. Yalnız bir neçə dərhal öz API server çalışır." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "translation" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Qeydiyyat" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "API Qeydiyyat" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "Qeydiyyat" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "API Qeydiyyat" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Dil" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Tarix" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Qızıl / iş rejimi" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Qeydiyyat" + +#: 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 "" +"Avtomobil istismarı ilə, çeviri məlumatları müxtəlif API key ilə " +"istifadəçilərlə əlaqədardır. Dövlət üçün gözəl!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Axtarış" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Axtarış" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Proqramlar" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Qeydiyyatdan" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Swap məhsul və hedef dillər" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Axtarış" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Tarix" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Delete" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Qeydiyyat" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Tarix" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "E-poçt" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Dəstəklənən fayl formatları:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Qeydiyyat" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Proqram" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Axtarış" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Pulsuz" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Qeydiyyat" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Response" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open Source Machine Translation API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Yükləmək üçün pulsuz. Offline Capable. Avadanlıq." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "Qeydiyyat" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Lisenziya:" + +#: libretranslate/templates/index.html:354 +#, fuzzy, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Yaponiya %(heart)s by %(contributors)s və tərəfdaşlıq %(engine)s" + +#: libretranslate/templates/index.html:354 +#, fuzzy, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Kontributors" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr " Vietnamese" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Bu ictimai API test üçün istifadə olunmalıdır, xüsusi və ya infrequent " +#~ "istifadə. istehsalda bir proqram işləyirsinizsə, lütfen %(host_server)s ya " +#~ "%(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "öz serverinizə baxın" + +#~ msgid "get an API key" +#~ msgstr "bir API əsas almaq" + +#~ msgid "Basque" +#~ msgstr "Qalereya" + +#~ msgid "Galician" +#~ msgstr " Gal" diff --git a/self_host/LibreTranslate/libretranslate/locales/az/meta.json b/self_host/LibreTranslate/libretranslate/locales/az/meta.json new file mode 100644 index 00000000..d07c41ad --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/az/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Azerbaijani", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/be/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/be/LC_MESSAGES/messages.po new file mode 100644 index 00000000..ab773952 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/be/LC_MESSAGES/messages.po @@ -0,0 +1,767 @@ +# Belarusian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.12\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-04-02 23:12+0000\n" +"Last-Translator: rferee \n" +"Language: be\n" +"Language-Team: Belarusian " +"\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Памылковы JSON-фармат" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Аўтавызначэнне" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Патрэбна аўтарызацыя" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Перавышаны ліміт запытаў" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Памылковы API ключ" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Калі ласка звяжыцеся з аператарам сэрверу каб атрымаць API ключ" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Наведайце %(url)s каб атрымаць API ключ" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Запаволенне:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Фармат %(format)s не падтрымліваеецца" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Не атрымалася перакласці тэкст: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Переклад файлаў вымкнуты на гэтым сэрвере." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Памылковы запыт: пусты файл" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Памылковы запыт: фармат файла не падтрымліваецца" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Няслушная назва файла" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Прапанаванні выключаны на гэтым сэрверы." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Англійская" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Арабская" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Азербайджанская" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Кітайская" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Чешская" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Дацкая" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Нідэрландская" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Эсперанта" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Фінская" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Французская" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Нямецкая" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Грэчаская" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Іўрыт" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Хіндзі" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Венгерская" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Інданезійская" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Ірландская" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Італьянская" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Японская" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Карэйская" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Персідская" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Польская" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Партугальская" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Руская" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Славацкая" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Іспанская" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Шведская" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Турэцкая" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Украінская" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Атрымаць спіс падтрыманых моў" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Спіс моў" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "пераклад" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Перакласць тэкст з адной мовы на іншую" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Перакладзены тэкст" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Памылковы запыт" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Памылка перакладу" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Запаволенне" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Заблакавана" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Прывітанне, свет!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Тэкст(а) для перакладу" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Код мовы арыгінала" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Код мовы пераклада" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "тэкст" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Фармат выточнага тэксту:\n" +"* `text` - Звычайны тэкст\n" +"* `html` - HTML-разметка\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API ключ" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Перакласць файл з адной мовы на іншую" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Перакладзены файл" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Файл для перакладу" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Вызначыць мову аднаго тэксту" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Вызначэння" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Памылка вызначэння" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Тэкст для вызначэння" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Атрымаць налады для інтэрфэйсу" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "налады інтэрфэйсу" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "інтэрфейс" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Запрапанаваць як палепшыць пераклад" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Поспех" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Не аўтаразаваны" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Арыгінальны тэкст" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Запрапанаваны пераклад" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Мова арыгінальнага тэкста" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Мова прапанаванага перакладу" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "зваротная сувязь" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Код мовы" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Чалавекачытальная назва мовы (па-ангельску)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Коды падтрымліваемых моў" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Перакладзены(-я) тэкст(-а)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Паведамленне пра абмылу" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Прычына запаволення" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL-адрэса перакладзенага файла" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Ровень упэўненасці" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Абмежаванне колькаскі знакаў для гэтай мовы (-1 азначае адсутнасць " +"абмежаванняў)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Час перакладу інтэрфэйсу перавышаны" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Ці увамкнёная база дадзеных API ключоў." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Ці патрэбен API ключ." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Ці ўвамкненна магчымасць адпраўляць прапановы." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Падтрымліваемыя фарматы файлаў" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Ці было адсыланне паспяховым" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Скапіяваць тэкст" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Немагчыма спампаваць %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Невядомая памылка" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Скапіявана" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Дзякуй за вашу заўвагу. Прыміце да ўвагі: Ваша прапанова не адразу " +"набудзе моц." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Няма даступных моў. Вы слушна ўсталявалі мадэлі?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "націсніце на спасылку \"Атрымаць API ключ\"." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Бясплатнае API для машыннага перакладу з адкрытым выточным кодам" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +#, fuzzy +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 для машыннага перакладу з адкрытым выточным кодам." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "пераклад" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Vietnamese" +#~ msgstr "В’етнамская" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/be/meta.json b/self_host/LibreTranslate/libretranslate/locales/be/meta.json new file mode 100644 index 00000000..7d4398d8 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/be/meta.json @@ -0,0 +1,4 @@ +{ + "name": "be", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/bg/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/bg/LC_MESSAGES/messages.po new file mode 100644 index 00000000..270e290b --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/bg/LC_MESSAGES/messages.po @@ -0,0 +1,775 @@ +# Bulgarian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.12\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-05-25 14:46+0000\n" +"Last-Translator: Salif Mehmed \n" +"Language-Team: Bulgarian \n" +"Language: bg\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.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Невалиден JSON формат" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Разпознаване" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Неоторизиран" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Твърде много нарушения на ограниченията на заявките" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Невалиден API ключ" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Моля, свържете се с оператора на сървъра, за да получите API ключ" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Посетете %(url)s, за да получите API ключ" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Забавяне:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Невалидна заявка: параметърът %(name)s не е число" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Невалидна заявка: параметърът %(name)s трябва да бъде <= %(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Форматът %(format)s не се поддържа" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Не може да се преведе текстът: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Превеждането на файлове е изключено на този сървър." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Невалидна заявка: празен файл" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Невалидна заявка: файловият формат не се поддържа" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Невалидно име на файла" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Предложенията са изключени на този сървър." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "английски" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "албански" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "арабски" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "азербайджански" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "бенгалски" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "български" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "каталонски" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "китайски" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "китайски (традиционен)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "чешки" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "датски" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "нидерландски" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "есперанто" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "естонски" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "фински" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "френски" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "немски" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "гръцки" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "иврит" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "хинди" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "унгарски" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "индонезийски" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "ирландски" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "италиански" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "японски" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "корейски" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "латвийски" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "литовски" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "малайски" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "норвежки" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "персийски" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "полски" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "португалски" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "португалски (Бразилия)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "румънски" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "руски" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "словашки" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "словенски" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "испански" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "шведски" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "тагалог" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "тайски" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "турски" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "украински" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "урду" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "сръбски" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "украински" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "виетнамски" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Извличане на списък с поддържани езици" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Списък с езици" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "превеждане" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Превеждане на текст от един език на друг" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Преведен текст" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Невалидна заявка" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Грешка при превода" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Забавяне" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Блокиран" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Здравей, свят!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Текст(ове) за превод" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Код на изходния език" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Код на целевия език" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "text" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Формат на изходния текст:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Предпочитан брой алтернативни преводи" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API ключ" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Превеждане на файл от един език на друг" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Преведен файл" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Файл за превод" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Разпознаване на езика на единичен текст" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Разпознавания" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Грешка при разпознаване" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Текст за разпознаване" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Извличане на специфични за клиентска част настройки" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "настройки на клиентската част" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "клиентска част" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Изпрати предложение за подобряване на превода" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Успех" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Не оторизиран" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Оригинален текст" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Предложен превод" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Език на оригиналния текст" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Език на предложения превод" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "обратна връзка" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Езиков код" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Човекоразбираемо име на езика (на английски)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Поддържани целеви езикови кодове" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Преведен(и) текст(ове)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Съобщение за грешка" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Причина за забавяне" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Адрес на преведен файл" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Стойност на увереност" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Ограничение за въвеждане на символи за този език (-1 означава, че няма " +"ограничение)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Време за изчакване на превода през клиентската част" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Дали базата данни с API ключове е включена." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Дали API ключ е задължителен." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Дали изпращането на предложения е включено." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Поддържан файлов формат" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Дали подаването е било успешно" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Копиране на текста" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Не може да се зареди %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Неизвестна грешка" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Копиран" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Благодарности за поправката. Имайте предвид, че предложението няма да " +"влезе в сила веднага." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Няма налични езици. Правилно ли инсталирахте моделите?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "натиснете връзката „Получаване на API ключ“." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Свободен API с отворен код за машинен превод" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 с отворен код за машинен превод. безплатно за изтегляне, " +"офлайн способност и лесен за настройка. Стартирайте свой собствен API " +"сървър само за няколко минути." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "превод" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Документация" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Получаване на API ключ" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Задаване на API ключ" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Промяна на езика" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Редактиране" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Превключване на тъмен/светъл режим" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Отхвърляне" + +#: 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 "" +"Поради злоупотреба с ботове, заявките за превод са временно ограничени до " +"потребители с валиден API ключ. Извинете за неудобството!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API за превеждане" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Превод на текст" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Превод на файлове" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Превеждане от" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Размяна на изходния и целевия език" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Превеждане на" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Текст за превод" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Изтриване на текста" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Предлагане на превод" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Отказ" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Изпращане" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Поддържани файлови формати:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Файл" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Премахване на файла" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Превеждане" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Изтегляне" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Заявка" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Отговор" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API с отворен код за машинен превод" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "безплатно за изтегляне. Офлайн способност. Лесен за настройка." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Лицензия:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Направено с %(heart)s от %(contributors)s и задвижвано от %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Сътрудници" + +#~ msgid "Vietnamese" +#~ msgstr "Виетнамски" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Този публичен API трябва да се " +#~ "използва за тестване, лична или рядка" +#~ " употреба. Ако възнамерявате да стартирате" +#~ " приложение в продукция, моля " +#~ "%(host_server)s или %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "хоствайте свой собствен сървър" + +#~ msgid "get an API key" +#~ msgstr "получаване на API ключ" + +#~ msgid "Basque" +#~ msgstr "баски" + +#~ msgid "Galician" +#~ msgstr "галисийски" diff --git a/self_host/LibreTranslate/libretranslate/locales/bg/meta.json b/self_host/LibreTranslate/libretranslate/locales/bg/meta.json new file mode 100644 index 00000000..f2d8b980 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/bg/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Bulgarian", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/bn/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/bn/LC_MESSAGES/messages.po new file mode 100644 index 00000000..d4948022 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/bn/LC_MESSAGES/messages.po @@ -0,0 +1,752 @@ +# Bangla translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-08-08 13:20-0400\n" +"Last-Translator: FULL NAME \n" +"Language-Team: bn \n" +"Language: bn\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "অবৈধ JSON বিন্যাস" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "স্বয়ংক্রীয় সনাক্তকরণ" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "অনুমোদিত নয়" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "অত্যাধিক সংখ্যক সীমা লঙ্ঘন" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "ভুল API কি" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "API কি প্রাপ্ত করার উদ্দেশ্যে অনুগ্রহ করে সার্ভারের সাথে যোগাযোগ করুন" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "পরিদর্শন করুন API কি প্রাপ্ত করার জন্য একটি API কি %(url)s" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "ধীর:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "অবৈধ অনুরোধ: একটি নম্বর নয় %(name)s" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"অবৈধ অনুরোধ: পরামিতির মান হওয়া আবশ্যক %(name)s %(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr " অসমর্থিত বিন্যাস %(format)s" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "টেক্সট অনুবাদ করতে ব্যর্থ: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "এই সার্ভারে ফাইল অনুবাদ নিষ্ক্রিয় ।." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "অবৈধ ফাইল: ফাঁকা ফাইল" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "অবৈধ অনুরোধ: ফাইল ফরম্যাট সমর্থিত নয়" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "ফাইলের নাম বৈধ নয়" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "এই সার্ভারের জন্য অতিরিক্ত পরামর্শ নিষ্ক্রিয় করা হয়েছে।." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "ইংরেজি" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "আলবেনীয়" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "আরবি" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "আজারবাইজানিName" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "বাংলা" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "বুলগেরিয়ানName" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "ক্যাটালানName" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "চীনি" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "চীনা (সরলীকৃত)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "চেক" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "ড্যানিশName" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "ডাচ" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "এসপারান্তোName" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "এস্তোনিয়ানName" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "ফিনিশName" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "ফরাসি" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "জার্মান" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "গ্রিক" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "হিব্রু" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "হিন্দি" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "হাঙ্গেরিয়ানName" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "ইন্দোনেশিয়ান" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "আইরিশ" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "ইতালীয়Name" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "জাপানি" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "কোরিয়ান" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "লাটভিয়ানName" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "লিথুয়েনীয়" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "মালয়Name" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "নরওয়েজিয়ান" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "ফার্সি" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "পোলিশ" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "পর্তুগীজName" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "পোর্তুগিজ (মোগুয়ে)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "রোমেনিয়ান" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "রুশ" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "স্লোভাকName" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "স্লোভেনিয়ান" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "স্প্যানিশ" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "সুইডিশ" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "ট্যাগু" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "থাই" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "তুর্কি" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "উরানিয়ানName" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "উর্দুName" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "সার্বিয়ান" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "ইউক্রেইনিয়" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "ভিয়েতনামিস" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "সমর্থিত ভাষার তালিকা" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "ভাষা" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "অনুবাদ" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "একটি ভাষা থেকে টেক্সট অনুবাদ করুন" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "অনুবাদক টেক্সট" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "অবৈধ অনুরোধ" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "অনুবাদ সংক্রান্ত ত্রুটি" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "আস্তে যাও" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "নিষিদ্ধ করা হয়েছে" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "হ্যালো বিশ্ব!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "লেখাসমূহ" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "উৎসের কোড" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "লক্ষ্য ভাষার কোড" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "টেক্সট" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"মূল টেক্সটের ধরন:\n" +"* লেখা - প্লেইন টেক্সট\n" +"* `%s' - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "বিকল্প অনুবাদ" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-কি" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "অন্য একটি ভাষা থেকে ফাইল অনুবাদ করুন" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "অনুবাদক ফাইল" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "যে ফাইল অনুবাদ করা হচ্ছে" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "টেক্সটের ভাষা সনাক্ত করা হবে" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "স্বয়ংক্রীয় সনাক্তকরণ" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "সনাক্ত করা ত্রুটি" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "যে টেক্সট প্রদর্শন করা হবে" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "সুনির্দিষ্ট বৈশিষ্ট্য প্রাপ্ত করুন" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "সম্মুখপ্রান্ত সেটিংস" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "সম্মুখপ্রান্ত" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "অনুবাদ উন্নত করার জন্য একটি পরামর্শ প্রেরণ করুন" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "সাফল্য" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "অনুমোদিত নয়" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "মূল টেক্সট" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "প্রস্তাবিত অনুবাদ" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "মূল টেক্সটের ভাষা" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "অনুবাদ করার ভাষার অনুবাদ" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "প্রতিক্রিয়া" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "ভাষার কোড" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "পাঠযোগ্য নাম (ইংরেজি)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "সমর্থিত ভাষার কোড" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "অনুবাদক টেক্সট" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "ত্রুটির বার্তা" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "ধীর হওয়ার কারণ" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "অনুবাদক ফাইল url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "মান" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "এই ভাষার জন্য অক্ষরের ইনপুট সীমা (-1-র মধ্যে সীমিত)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "সম্মুখপ্রান্ত অনুবাদ সময়সীমা" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "API- কি'র ডাটাবেস সক্রিয় করা হয়েছে কি না।." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "API-কি আবশ্যক কি না।." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "প্রস্তাবসমূহ সক্রিয় করা হয়েছে কি না." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "এই পাসওয়ার্ডটি মনে রাখা হবে" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "ডিস্কটি সফল হয়েছে কিনা" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "টেক্সট কপি করুন" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "লোড করতে ব্যর্থ %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "অজানা ত্রুটি" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "অনুলিপি করা হয়েছে" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "সংশোধন করার জন্য ধন্যবাদ. উল্লেখ্য, এই পরামর্শ কার্যকর করা হবে না।." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "কোনো ভাষা উপলব্ধ নেই। আপনি কি মডেল সঠিকভাবে ইনস্টল করেছেন?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "\" API\" কি-র সাথে লিঙ্ক স্থাপন করুন।." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "মুক্ত এবং ওপেন সোর্স মেশিন অনুবাদ API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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। স্ব-বিশ্লেষণ, অফ-লাইন অবস্থায় থাকা। " +"কয়েক মিনিটের মধ্যে আপনার নিজস্ব API সার্ভার চালান।." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "অাপনার সিস্টেম সম্বন্ধে তথ্য দেখুনtranslation" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "অঙ্ক" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API ডক" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "API প্রাপ্ত করুন কি" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "গিটহাব" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "API নির্ধারণ করুন কি" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "ভাষা পরিবর্তন করো" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "সম্পাদনা" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "পর্দা জুড়ে প্রদর্শন/আড়াল করা হবে" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "বাতিল" + +#: 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 "" +"বোট অপব্যবহারের কারণে, বৈধ API কী সহ ব্যবহারকারীদের জন্য সাময়িকভাবে অনুবাদ " +"অনুরোধ করা হয়। ঝামেলার জন্য দুঃখিত!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "অনুবাদ API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "টেক্সট অনুবাদ" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "ফাইল অনুবাদ করুন" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "অনুবাদ করো" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Swap উৎস ও টার্গেট ভাষা ব্যবহার করুন" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "চিহ্নিত অবস্থানে স্থানান্তর করুন" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "অনুবাদ করার জন্য চিহ্নিত টেক্সট" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "টেক্সট মুছে ফেলুন" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "অনুবাদ পরামর্শ করো" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "বাতিল" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "প্রেরণ" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "সমর্থিত ফাইল ফরম্যাট:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "ফাইল" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "ফাইল মুছে ফেলুন" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "অনুবাদ" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "ডাউনলোড করা হয়েছে" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "অনুরোধ" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "প্রতিক্রিয়া" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "ওপেন সোর্স মেশিন অনুবাদ APIQuery" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "হায় খোদা! অফ-লাইন। শান্ত হও।." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "লাইসেন্স:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"সহ ধরন এবং বিদারনশীল %(heart)s %(contributors)s " +"%(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr " অংশগ্রহণকারী %(libretranslate)s" + +#~ msgid "Basque" +#~ msgstr "বাস্ক" + +#~ msgid "Galician" +#~ msgstr "অংশগ্রহণকারীদের আমন্ত্রণ জানান" diff --git a/self_host/LibreTranslate/libretranslate/locales/bn/meta.json b/self_host/LibreTranslate/libretranslate/locales/bn/meta.json new file mode 100644 index 00000000..0bc3ef5b --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/bn/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Bengali", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/ca/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ca/LC_MESSAGES/messages.po new file mode 100644 index 00000000..b200dc10 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ca/LC_MESSAGES/messages.po @@ -0,0 +1,775 @@ +# Catalan translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.12\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-20 07:30+0000\n" +"Last-Translator: Marc Riera \n" +"Language-Team: Catalan \n" +"Language: ca\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.11.1-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "El format JSON no és vàlid" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Detecció automàtica" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "No autoritzat" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Massa infraccions dels límits de sol·licituds" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "La clau de l'API no és vàlida" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" +"Poseu-vos en contacte amb l'operador del servidor per a obtenir una clau " +"de l'API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Visiteu %(url)s per a obtenir una clau de l'API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Reduïu el nombre de sol·licituds:" + +#: 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 "La sol·licitud no és vàlida: falta el paràmetre %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "La sol·licitud no és vàlida: el paràmetre %(name)s no és un nombre" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "La sol·licitud no és vàlida: el paràmetre %(name)s ha de ser <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"La sol·licitud no és vàlida: la sol·licitud (%(size)s) supera el límit de" +" text (%(limit)s)" + +#: 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 "No s'admet %(lang)s" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "No s'admet el format %(format)s" + +#: 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) no està disponible com a llengua de destinació des " +"de %(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "No es pot traduir el text: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "La traducció de fitxers està inhabilitada en aquest servidor." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "La sol·licitud no és vàlida: el fitxer és buit" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "La sol·licitud no és vàlida: no s'admet el format del fitxer" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nom de fitxer no vàlid" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Els suggeriments estan inhabilitats en aquest servidor." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Anglès" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanès" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Àrab" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Àzeri" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengalí" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Búlgar" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Català" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Xinès" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Xinès (tradicional)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Txec" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danès" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holandès" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estonià" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finès" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francès" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Alemany" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grec" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebreu" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Hongarès" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesi" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandès" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italià" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonès" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Coreà" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Letó" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituà" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malai" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Noruec" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persa" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polonès" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portuguès" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portuguès (Brasil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romanès" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rus" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Eslovac" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Eslovè" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Castellà" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Suec" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagàlog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tai" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turc" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ucraïnès" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdú" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbi" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ucraïnès" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Recupera la llista de llengües admeses" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Llista de llengües" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "traducció" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Tradueix text d'una llengua a una altra" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Text traduït" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Sol·licitud no vàlida" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "S'ha produït un error de traducció" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Reduïu el nombre de sol·licituds" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Prohibit" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Hola món!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Textos a traduir" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Codi de la llengua d'origen" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Codi de la llengua de destinació" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "text" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format del text original:\n" +" * `text`: text sense format\n" +" * `html`: format HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Nombre preferit de traduccions alternatives" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Clau de l'API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Tradueix un fitxer d'una llengua a una altra" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Fitxer traduït" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fitxer a traduir" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detecta la llengua d'un únic text" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Deteccions" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Error de detecció" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Text a detectar" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Recupera la configuració específica de la interfície" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "configuració de la interfície" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "interfície" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Envia un suggeriment per a millorar una traducció" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Correcte" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "No autoritzat" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Text original" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Traducció suggerida" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Llengua del text original" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Llengua de la traducció suggerida" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "comentaris" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Codi de llengua" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nom de la llengua comprensible per humans (en anglès)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Codis de les llengües de destinació acceptades" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Textos traduïts" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Missatge d'error" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Motiu per a reduir el nombre de sol·licituds" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL del fitxer traduït" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Valor de confiança" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Límit d'entrada de caràcters per a aquesta llengua (-1 indica que no hi " +"ha límit)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Temps d'espera màxim de traducció de la interfície" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Indica si la base de dades de claus de l'API està habilitada." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Indica si es requereix una clau de l'API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Indica si l'enviament de suggeriments està habilitat." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Formats de fitxer acceptats" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Indica si l'enviament ha estat correcte" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Copia el text" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "No s'ha pogut carregar %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Error desconegut" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "S'ha copiat" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Gràcies per la correcció. Tingueu en compte que el suggeriment no tindrà " +"un efecte immediat." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "No hi ha cap llengua disponible. Heu instal·lat correctament els models?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Escriviu la vostra clau de l'API. Si necessiteu una clau de l'API, " +"%(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "premeu l'enllaç «Obtén una clau de l'API»." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "poseu-vos en contacte amb l'operador del servidor." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API de traducció automàtica lliure i oberta" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 de traducció automàtica gratuïta i de codi obert. Baixa gratuïta, amb" +" possibilitat d'ús fora de línia i fàcil de configurar. Executeu el " +"vostre propi servidor d'API en només uns minuts." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "traducció" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Documentació de l'API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Obtén una clau de l'API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Defineix la clau de l'API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Canvia de llengua" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Edita" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Canvia entre els modes fosc i clar" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Descarta" + +#: 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 de l'abús per part de bots, les sol·licituds de traducció estan " +"limitades actualment als usuaris amb una clau de l'API. Disculpeu les " +"molèsties." + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API de traducció" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Tradueix text" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Tradueix fitxers" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Tradueix de" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Intercanvia les llengües d'origen i de destinació" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Tradueix a" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Text a traduir" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Esborra el text" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Suggereix una traducció" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Cancel·la" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Envia" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formats de fitxer admesos:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fitxer" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Suprimeix el fitxer" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Tradueix" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Baixa" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Sol·licitud" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Resposta" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API de traducció automàtica de codi obert" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Baixada gratuïta. Possibilitat d'ús fora de línia. Fàcil de configurar." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Llicència:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Fet amb %(heart)s pels %(contributors)s i amb tecnologia de %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "col·laboradors de %(libretranslate)s" + +#~ msgid "Vietnamese" +#~ msgstr "vietnamita" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "Basc" + +#~ msgid "Galician" +#~ msgstr "Gallec" diff --git a/self_host/LibreTranslate/libretranslate/locales/ca/meta.json b/self_host/LibreTranslate/libretranslate/locales/ca/meta.json new file mode 100644 index 00000000..3eb289f2 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ca/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Catalan", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/ckb/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ckb/LC_MESSAGES/messages.po new file mode 100644 index 00000000..bea231ad --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ckb/LC_MESSAGES/messages.po @@ -0,0 +1,731 @@ +# Translations template for LibreTranslate. +# Copyright (C) 2025 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.7.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-07-21 11:03+0000\n" +"Last-Translator: Halbast Abdullah \n" +"Language-Team: Kurdish (Central) \n" +"Language: ckb\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.13-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "دۆزینەوەی خۆکار" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "ناسەلمێنراو" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "کلیلی ئەی پی ئایی نادروست" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" diff --git a/self_host/LibreTranslate/libretranslate/locales/cs/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/cs/LC_MESSAGES/messages.po new file mode 100644 index 00000000..6abb3e02 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/cs/LC_MESSAGES/messages.po @@ -0,0 +1,775 @@ +# Czech translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-25 07:48+0000\n" +"Last-Translator: slrslr \n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"X-Generator: Weblate 5.11.1-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Neplatný formát JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Automaticky rozpoznat" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Neoprávněné" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Příliš mnoho omezení požadavků" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Neplatný API klíč" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Obraťte se na provozovatele serveru pro získání API klíče" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Navštivte %(url)s pro získání API klíče" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Zpomalení:" + +#: 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 "Neplatný požadavek: chybějící parametr %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Neplatná žádost: %(name)s parametr není číslo" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Neplatná žádost: %(name)s 2 nařízení o kapitálových požadavcích. %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Neplatná požadavek: požadavek (%(size)s) překračuje limit textu " +"(%(limit)s)" + +#: 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 není podporováno" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s formát není podporován" + +#: 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) není k dispozici jako cílový jazyk od %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Nelze přeložit text: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Překlady souborů jsou na tomto serveru zakázány." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Neplatný požadavek: prázdný soubor" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Neplatný požadavek: formát souboru není podporován" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Neplatný název souboru" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Návrhy jsou na tomto serveru zakázány." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Angličtina" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albánie" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabština" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Ázerbájdžánština" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengálsko" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulharsky" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalánština" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Čínština" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Čína (tradiční)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Čeština" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dánština" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holandština" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estonština" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finština" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francouzština" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Němčina" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Řečtina" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebrejština" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindština" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Maďarština" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonéština" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irština" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italština" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonština" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Korejština" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Lotyšsky" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litevština" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malay" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norština" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Perština" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polština" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugalština" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugalština (Brazílie)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumunsko" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ruština" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovenština" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovinsky" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Španělština" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Švédština" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thajské" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turečtina" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrajinština" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Srbština" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrajinština" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamština" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Získat seznam podporovaných jazyků" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Seznam jazyků" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "překlady" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Přeložit text do jiného jazyka" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Přeložený text" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Neplatný požadavek" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Chyba překladu" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Zpomalte" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Zablokován" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Ahoj světe!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Text(y) k překladu" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Kód zdojového jazyka" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Kód cílového jazyka" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "text" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formát zdrojového textu:\n" +"* `text` - prostý text\n" +"* `html` - HTML kód\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Preferovaný počet alternativních překladů" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API klíč" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Přeložit soubor do jiného jazyka" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Přeložený soubor" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Soubor k překladu" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Rozpozná jazyk jediného textu" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Rozpoznání" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Chyba rozpoznání" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Text pro rozpoznání" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Načíst nastavení specifické pro rozhraní" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "nastavení rozhraní" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "rozhraní" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Odeslat návrh na zlepšení překladu" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Hledat" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Chybí oprávnění" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Původní text" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Navrhovaný překlad" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Jazyk původního textu" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Jazyk navrhovaného překladu" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "zpětná vazba" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Kód jazyka" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Lidsky čitelný název jazyka (v angličtině)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Podporované cílové jazykové kódy" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Přeložený text(y)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Chybová zpráva" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Důvod pro zpomalení" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL přeloženého souboru" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Míra jistoty" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Omezení počtu znaků pro tento jazyk (-1 označuje žádný limit)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Časový limit překladu rozhraní" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Jestli je dostupná databáze API klíčů." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Jestli je vyžadován API klíč." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Jestli je povoleno podání návrhů." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Podporované formáty souborů" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Jestli bylo podání úspěšné" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopírovat text" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Nelze načíst %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Neznámá chyba" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Zkopírováno" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "Díky za opravu. Všimněte si, že návrh nebude mít vliv hned." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Žádné jazyky. Nainstalovali jste modely správně?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Zadejte ve svém API klíč. Pokud potřebujete klíč API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "následujte odkaz „Získejte API klíč“." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "obraťte se na provozovatele serveru." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Zdarma a Open Source API strojového překladu" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Zdarma a Open Source API strojového překladu. Zdarma ke stažení, " +"použitelné bez připojení a snadno nastavitelné. Spusťte si vlastní API " +"server během několika minut." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "překlad" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API dokumentace" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Získejte API klíč" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Nastavit API klíč" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Změnit jazyk" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Editace" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Přepnout tmavý / světlý režim" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Odmítnout" + +#: 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 "" +"Vzhledem ke zneužití roboty, jsou požadavky na překlad dočasně omezeny na " +"uživatele s platným klíčem API. Omlouváme se za nepříjemnost!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Překladové API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Přeložit text" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Přeložit soubory" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Přeložit z" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Vyměnit zdroj a cílové jazyky" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Přeložit do" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Text překládat" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Smazat text" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Navrhnout překlad" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Hledat" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Odeslat" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Podporované formáty souborů:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Soubor" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Odebrat soubor" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Přeložit" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Stáhnout" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Požadavek" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Odpoveď" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open Source API strojového překladu" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Zdarma ke stažení. Použitelné bez připojení. Snadné nastavení." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licence:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Vyrobeno s %(heart)s %(contributors)s a poháněno %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s přispěvateli" + +#~ msgid "multipart/form-data" +#~ msgstr "vícepart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamština" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Toto veřejné API by měl být " +#~ "použito jen pro testování, osobní nebo" +#~ " pro občasné použití. Pokud se " +#~ "chystáte spustit aplikaci v ostrém " +#~ "provozu, prosím %(host_server)s nebo " +#~ "%(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "hostujte vlastní server" + +#~ msgid "get an API key" +#~ msgstr "získejte API klíč" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" diff --git a/self_host/LibreTranslate/libretranslate/locales/cs/meta.json b/self_host/LibreTranslate/libretranslate/locales/cs/meta.json new file mode 100644 index 00000000..ea49a037 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/cs/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Czech", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/cv/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/cv/LC_MESSAGES/messages.po new file mode 100644 index 00000000..951810e5 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/cv/LC_MESSAGES/messages.po @@ -0,0 +1,739 @@ +# Chuvash translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.2\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-03-25 10:20+0000\n" +"Last-Translator: Astahar \n" +"Language: cv\n" +"Language-Team: Chuvash " +"\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Йӑнӑш JSON формачӗ" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "[чӗлхесене хӑй тӗллӗн уйӑрни]" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Авторизациленмен" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Ӗҫлемен API-ключ" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "API-ключ илес тесен, тархасшӑн, сервер операторӗпе ҫыхӑнӑр" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "API-ключ илмешкӗн %(url)s адреспа кӗрӗр" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Майӗпенленӗр:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Юрӑхсӑр запрос: «%(name)s» параметр число мар" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Юрӑхсӑр запрос: «%(name)s» параметр виҫи <= «%(value)s» пулмалла" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s форматпа усӑ курма май ҫук" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/da/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/da/LC_MESSAGES/messages.po new file mode 100644 index 00000000..6f937b9f --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/da/LC_MESSAGES/messages.po @@ -0,0 +1,772 @@ +# Danish translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-02 01:39+0000\n" +"Last-Translator: Stefan McKinnon Edwards \n" +"Language-Team: Danish \n" +"Language: da\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Ugyldigt JSON-format" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Auto-registrer" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Uautoriseret" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "For mange anmodninger" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Ugyldig API-nøgle" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Kontakt venligst serveroperatøren for at få en API-nøgle" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Besøg %(url)s for at få en API-nøgle" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "For mange forespørgsler:" + +#: 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 "Ugyldig forespørgsel: manglende %(name)s-parameter" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Ugyldig forespørgsel: %(name)s parameter er ikke et nummer" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Ugyldig forespørgsel: %(name)s parameter skal være <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Ugyldig forespørgsel: forespørgslen (%(size)s) overskrider tekstgrænsen " +"(%(limit)s)" + +#: 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 understøttes ikke" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s-format understøttes ikke" + +#: 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) er ikke tilgængelig som målsprog fra %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Kan ikke oversætte tekst: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Oversættelse af filer er deaktiveret på denne server." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Ugyldig forespørgsel: tom fil" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Ugyldig forespørgsel: filformat understøttes ikke" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Ugyldigt filnavn" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Forslag er deaktiveret på denne server." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Engelsk" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanien" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabisk" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Aserbajdsjan" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgarsk" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalansk" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Kinesisk" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kinesisk (traditionelt)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Tjekkisk" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dansk" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Hollandsk" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estisk" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finsk" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Fransk" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Tysk" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Græsk" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebræisk" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ungarsk" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesisk" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irsk" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiensk" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japansk" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreansk" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Lettisk let lettisk" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litauen" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malay" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norge" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persisk" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polsk" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugisisk" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugisisk (Brasilien)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumænsk" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Russisk" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovakisk" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovensk slovensk" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spansk" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Svensk" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Billeder af Thai" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Tyrkisk" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrainsk" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbisk serbisk" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukraine" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamesisk" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Hent liste over understøttede sprog" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Liste over sprog" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "oversæt" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Oversæt tekst fra et sprog til et andet" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Oversat tekst" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Ugyldig forespørgsel" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Oversættelsesfejl" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Sænk farten" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Bandlyst" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Hej verden!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Tekst(er) at oversætte" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Kildesprogkode" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Målsprogkode" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "tekst" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format af kildetekst:\n" +" * `tekst` - Almindelig tekst\n" +" * `html` - HTML-markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Antal alternative oversættelser" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-nøgle" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Oversæt fil fra et sprog til et andet" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Oversat fil" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fil at oversætte" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Registrer sproget i en enkelt tekst" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Registreringer" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Registreringsfejl" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Tekst at registrere" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Hent frontend-specifikke indstillinger" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "frontend-indstillinger" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Indsend et forslag til forbedring af en oversættelse" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Succes" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Ikke autoriseret" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Original tekst" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Foreslået oversættelse" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Originaltekstens sprog" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Sprog i foreslået oversættelse" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "feedback" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Sprogkode" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Menneskeligt læseligt sprognavn (på engelsk)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Understøttede målsprogkoder" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Oversat tekst(er)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Fejlmeddelelse" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Årsag til nedbremsning" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Oversat fil-URL" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Konfidensværdi" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Grænse for tegninput for dette sprog (-1 angiver ingen grænse)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Timeout for frontend-oversættelse" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Om API-nøgledatabasen er aktiveret." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Om en API-nøgle er påkrævet." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Om indsendelse af forslag er aktiveret." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Understøttede filformater" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Om indsendelse var vellykket" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopiér tekst" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Kan ikke indlæse %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Ukendt fejl" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopieret" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Tak for din rettelse. Bemærk, at forslaget ikke træder i kraft med det " +"samme." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Ingen tilgængelige sprog. Har du installeret modellerne korrekt?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Indtast din API-nøgle. Hvis du har brug for en API-nøgle, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "tryk på linket \"Get API Key\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "kontakt serveroperatøren." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Gratis og Open Source Maskinoversættelses-API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Gratis og Open Source Maskinoversættelses-API. Selv-hosted, kan bruges " +"offline og er let at opsætte. Kør din egen API-server på blot et par " +"minutter." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "oversættelse" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API-dokumenter" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Få API-nøgle" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Indstil API-nøgle" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Skift sprog" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Rediger" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Skift mellem mørk/lys tilstand" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Afvis" + +#: 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 "" +"På grund af bot-misbrug er oversættelsesanmodninger midlertidigt begrænset " +"til brugere med en gyldig API-nøgle. Desværre for ulejligheden!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Oversættelses-API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Oversæt Tekst" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Oversæt Filer" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Oversæt fra" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Byt om på kilde- og målsprog" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Oversæt til" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Tekst at oversætte" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Slet tekst" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Foreslå oversættelse" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Annuller" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Send" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Understøttede filformater:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fil" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Fjern fil" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Oversæt" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Hent" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Anmod" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Svar" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open Source Maskinoversættelses-API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Selv-Hosted. Kan bruges offline. Nem at opsætte." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licens:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Lavet med %(heart)s af %(contributors)s og drevet af %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Bidragsydere" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamesisk" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Denne offentlige API bør bruges til test, personlig eller sjælden brug. Hvis" +#~ " du har tænkt dig at køre en applikation i produktion, venligst " +#~ "%(host_server)s eller %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "host din egen server" + +#~ msgid "get an API key" +#~ msgstr "få en API-nøgle" + +#~ msgid "Basque" +#~ msgstr "Baskisk" + +#~ msgid "Galician" +#~ msgstr "Galicien" diff --git a/self_host/LibreTranslate/libretranslate/locales/da/meta.json b/self_host/LibreTranslate/libretranslate/locales/da/meta.json new file mode 100644 index 00000000..0a7d7e09 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/da/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Danish", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/de/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/de/LC_MESSAGES/messages.po new file mode 100644 index 00000000..6cb23305 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/de/LC_MESSAGES/messages.po @@ -0,0 +1,779 @@ +# German translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-26 07:29+0000\n" +"Last-Translator: Wuzzy \n" +"Language-Team: German \n" +"Language: de\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.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Ungültiges JSON-Format" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Auto-Erkennung" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Unbefugt" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Zu viele Verstöße gegen die Anfragelimits" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Ungültiger API-Schlüssel" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" +"Bitte kontaktieren Sie den Serverbetreiber, um einen API-Schlüssel zu " +"erhalten" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Besuchen Sie %(url)s, um einen API-Schlüssel zu erhalten" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Verlangsamung:" + +#: 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 "Ungültige Anfrage: fehlender Parameter %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Ungültige Anfrage: %(name)s-Parameter ist keine Zahl" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Ungültige Anfrage: %(name)s-Parameter muss <= %(value)s sein" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Ungültige Anfrage: Anfrage (%(size)s) überschreitet Textlimit (%(limit)s)" + +#: 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 wird nicht unterstützt" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "„%(format)s“-Format wird nicht unterstützt" + +#: 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) ist nicht als Zielsprache von %(sname)s (%(scode)s)" +" verfügbar" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Konnte Text nicht übersetzen: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Die Übersetzung von Dateien ist auf diesem Server deaktiviert." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Ungültige Anfrage: leere Datei" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Ungültige Anfrage: Dateiformat nicht unterstützt" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Ungültiger Dateiname" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Vorschläge sind auf diesem Server deaktiviert." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Englisch" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanisch" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabisch" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Aserbaidschanisch" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgarisch" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalanisch" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Chinesisch" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Chinesisch (traditionell)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Tschechisch" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dänisch" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Niederländisch" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estnisch" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finnisch" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Französisch" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Deutsch" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Griechisch" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebräisch" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ungarisch" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesisch" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irisch" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italienisch" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japanisch" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreanisch" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Lettisch" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litauisch" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malayisch" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norwegisch" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persisch" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polnisch" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugiesisch" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugiesisch (Brasilien)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumänisch" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Russisch" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slowakisch" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slowenisch" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spanisch" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Schwedisch" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thai" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Türkisch" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrainisch" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbisch" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrainisch" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamesisch" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Liste der unterstützten Sprachen abrufen" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Liste der Sprachen" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "übersetzen" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Übersetzen von Text aus einer Sprache in eine andere" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Übersetzter Text" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Ungültige Anfrage" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Übersetzungsfehler" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Verlangsamen" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Verbannt" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Hallo Welt!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Zu übersetzende(r) Text(e)" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Quellsprachen-Code" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Zielsprachen-Code" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "text" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format des Ausgangstextes:\n" +" * `text` – Einfacher Text\n" +" * `html` – HTML-Markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Bevorzugte Anzahl alternativer Übersetzungen" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-Schlüssel" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Datei von einer Sprache in eine andere übersetzen" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Übersetzte Datei" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Datei zum Übersetzen" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Sprache eines einzelnen Textes erkennen" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Erkennungen" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Erkennungsfehler" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Zu erkennender Text" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Abrufen frontendspezifischer Einstellungen" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "Frontend-Einstellungen" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "Frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Einen Vorschlag zur Verbesserung einer Übersetzung einreichen" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Erfolg" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Nicht autorisiert" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Ursprünglicher Text" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Vorgeschlagene Übersetzung" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Sprache des Originaltextes" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Sprache der vorgeschlagenen Übersetzung" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "Feedback" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Sprachencode" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Vom Menschen lesbare Sprachbezeichnung (auf Englisch)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Unterstützte Zielsprachencodes" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Übersetzter Text(e)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Fehlermeldung" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Gründe für die Verlangsamung" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL der übersetzten Datei" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Konfidenzwert" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Zeicheneingabegrenze für diese Sprache (-1 bedeutet unbegrenzt)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Zeitüberschreitung der Frontend-Übersetzung" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Ob die API-Schlüsseldatenbank aktiviert ist." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Ob ein API-Schlüssel erforderlich ist." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Ob die Einreichung von Vorschlägen aktiviert ist." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Unterstütztes Dateiformat" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Ob die Einreichung erfolgreich war" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Text kopieren" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Kann %(url)s nicht laden" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Unbekannter Fehler" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopiert" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Danke für Ihre Korrektur. Beachten Sie, dass der Vorschlag nicht sofort " +"wirksam wird." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Keine Sprachen verfügbar. Haben Sie die Modelle richtig installiert?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Geben Sie Ihren API-Schlüssel ein. Wenn Sie einen API-Schlüssel " +"benötigen, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "folgen Sie dem Link „API-Schlüssel erhalten“." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "kontaktieren Sie den Serverbetreiber." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Freie und quelloffene API für maschinelle Übersetzung" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Freie und quelloffene API für maschinelle Übersetzung. Kostenlos zum " +"download, offline-fähig und einfach einzurichten. Betreiben Sie Ihren " +"eigenen API-Server in nur wenigen Minuten." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "Übersetzung" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "API" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API-Doku" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "API-Schlüssel erhalten" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "API-Schlüssel festlegen" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Sprache ändern" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Bearbeiten" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Dunkler/Lichtmodus" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Ablehnen" + +#: 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 "" +"Aufgrund von Bot-Missbrauchs werden Übersetzungsanfragen temporär auf " +"Benutzer mit einem gültigen API-Key beschränkt. Tschuldigung für die " +"Unannehmlichkeiten!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Übersetzungs-API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Text übersetzen" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Dateien übersetzen" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Übersetzen von" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Quell- und Zielsprache vertauschen" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Übersetzen in" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Text zum Übersetzen" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Text löschen" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Übersetzung vorschlagen" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Abbrechen" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Senden" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Unterstützte Dateiformate:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Datei" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Datei entfernen" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Übersetzen" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Herunterladen" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Anfrage" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Antwort" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open-Source-API für maschinelle Übersetzung" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Kostenlos zum download. Offline-fähig. Einfach einzurichten." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Lizenz:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Mit %(heart)s gemacht von %(contributors)s und betrieben mit %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "den %(libretranslate)s-Mitwirkenden" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamesisch" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Diese öffentliche API sollte zum Testen," +#~ " persönlichen oder seltenen Gebrauch " +#~ "verwendet werden. Wenn Sie eine " +#~ "Anwendung produktiv betreiben wollen, bitte" +#~ " %(host_server)s oder %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "hosten Sie Ihren eigenen Server" + +#~ msgid "get an API key" +#~ msgstr "holen Sie sich einen API-Schlüssel" + +#~ msgid "Basque" +#~ msgstr "Baskisch" + +#~ msgid "Galician" +#~ msgstr "Galicisch" diff --git a/self_host/LibreTranslate/libretranslate/locales/de/meta.json b/self_host/LibreTranslate/libretranslate/locales/de/meta.json new file mode 100644 index 00000000..e2aa116f --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/de/meta.json @@ -0,0 +1,4 @@ +{ + "name": "German", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/el/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/el/LC_MESSAGES/messages.po new file mode 100644 index 00000000..2dd683f7 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/el/LC_MESSAGES/messages.po @@ -0,0 +1,774 @@ +# Greek translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-12 08:53+0000\n" +"Last-Translator: GiannosOB \n" +"Language-Team: Greek \n" +"Language: el\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Άκυρη JSON μορφή" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Αυτόματη Ανίχνευση" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Μη εξουσιοδοτημένο" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Πάρα πολλά αιτήματα περιορίζουν τις παραβιάσεις" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Μη έγκυρο κλειδί API" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Επικοινωνήστε με τον χειριστή server για να πάρετε ένα API κλειδί" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Επισκεφθείτε τον σύνδεσμο %(url)s για να πάρετε ένα κλειδί API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Επιβράδυνση:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Μη έγκυρη αίτηση: Η παράμετρος %(name)s δεν είναι αριθμός" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Μη έγκυρη αίτηση: Η παράμετρος %(name)s πρέπει να είναι <= > %(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Η μορφή %(format)s δεν υποστηρίζεται" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Το κείμενο: %(text)s δεν μπορεί να μεταφράστει" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Η μετάφραση αρχείων ειναί απενεργοποιημένη σε αυτόν τον διακομιστή." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Μη έγκυρο αίτημα: Το αρχείο είναι άδειο" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Ακυρωμένη αίτηση: μορφή αρχείου που δεν υποστηρίζεται" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Μη έγκυρο όνομα αρχείου" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Οι προτάσεις απενεργοποιούνται σε αυτόν τον server." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Αγγλικά" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Αλβανικά" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Αραβικά" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Αζερμπαϊτζάν" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Μπενγκάλι" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Βουλγαρικά" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Καταλανικά" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Κινέζοι" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Κινέζικα (παραδοσιακά)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Τσεχική" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Δανία" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Ολλανδ Ολλανδία" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Εσθονικά" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Φινλανδός" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Γάλλος" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Γερμανός" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Ελληνικά" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Εβραϊκή εβραϊκή" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ούγγρος" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Ινδονησία" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Ιρλανδία" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Ιταλός" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Ιάπωνες" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Κορεατική Κορέα" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Λετονικά" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Λιθουανικά" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Μαλαϊκή" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Νορβηγικά" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Πέρσες" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Πολωνία Πολωνίας" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Πορτογαλικά" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Πορτογαλικά (Βραζιλία)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Ρουμανία" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ρώσοι" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Σλοβά" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Σλοβενία" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Ισπανικά ισπανικά" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Σουηδικά" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Ταγκαλόγκ" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Ταϊλάνδη" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Το τουρκικό Τουρκ Τουρκίας" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ουκρανίας" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Ούρντου" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Σερβία" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ουκρανικά" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Βιετναμέζικα" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Αναγνώριση λίστας υποστηριζόμενων γλωσσών" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Κατάλογος γλωσσών" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "μετέφρασε" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Μεταφράστε κείμενο από γλώσσα σε άλλη" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Μεταφρασμένο κείμενο" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Ακυρωμένο αίτημα" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Σφάλμα μετάφρασης" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Αργά κάτω" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Απαγορεύεται" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Γεια σας κόσμο!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Κείμενο(-α) για μετάφραση" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Κωδικός γλώσσας πηγής" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Κωδικός γλώσσας στόχου" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "Κείμενο" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Μορφή κειμένου προέλευσης:\n" +"* \"text\" - Plain text\n" +"* \"html\" - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Προτιμώμενος αριθμός εναλλακτικών μεταφράσεων" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Κλειδί API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Επίπεδο από γλώσσα σε άλλη" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Μεταφρασμένο αρχείο" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Αρχείο για μετάφραση" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Περιγράψτε τη γλώσσα ενός ενιαίου κειμένου" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Ανιχνεύεται" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Ανίχνευση σφάλματος" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Κείμενο για ανίχνευση" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Επανάκτηση συγκεκριμένων ρυθμίσεων" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "ρυθμίσεις frontend" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "πρόσωψη" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Υποβολή πρότασης για βελτίωση της μετάφρασης" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Επιτυχία" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Όχι εξουσιοδοτημένος" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Πρωτότυπο κείμενο" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Προτεινόμενη μετάφραση" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Γλώσσα αρχικού κειμένου" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Γλώσσα προτεινόμενης μετάφρασης" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "ανατροφοδότηση" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Κωδικός γλώσσας" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Ανθρώπινο αναγνώσιμο όνομα γλώσσας (στα αγγλικά)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Υποστηριζόμενη γλώσσα-στόχος" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Μεταφρασμένο κείμενο(s)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Μήνυμα σφάλματος" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Λόγος για επιβράδυνση" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Μεταφρασμένο αρχείο url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Εμπιστοσύνη αξία" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Χαρακτηριστικά όρια εισόδου για αυτή τη γλώσσα (-1 δεν υποδεικνύει όριο)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Frontend μετάφραση timeout" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Είτε η βάση δεδομένων API είναι ενεργοποιημένη." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Είτε απαιτείται κλειδί API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Είτε η υποβολή προτάσεων είναι ενεργοποιημένη." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Υποστηριζόμενη μορφή αρχείων" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Είτε η υποβολή ήταν επιτυχής" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Αντιγραφή κειμένου" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Δεν μπορεί να φορτώσει φορτίο %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Άγνωστο λάθος" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Συνήγοροι" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Χάρη στη διόρθωση σας. Σημειώστε ότι η πρόταση δεν θα τεθεί σε ισχύ αμέσως." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Δεν υπάρχουν διαθέσιμες γλώσσες. εγκαταστήσετε σωστά τα μοντέλα?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Τύπος στο API Key. Εάν χρειάζεστε ένα API key, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "πατήστε το σύνδεσμο \"Get API Key\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "επικοινωνήστε με τον διαχειριστή server." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Δωρεάν και Open Source Machine μετάφραση API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Δωρεάν και Open Source Machine Translation API. Free to download, offline " +"ικανή και εύκολη στη ρύθμιση. Πατήστε το δικό σας διακομιστή API σε λίγα " +"λεπτά." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "μετάφραση" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Λήψη κλειδιού API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Ορισμός κλειδιού API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Αλλαγή γλώσσας" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Επεξεργασία επεξεργασίας" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Εναλλαγή σκοτεινής/φωτεινής λειτουργίας" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Απ" + +#: 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 "" +"Λόγω κατάχρησης bot, τα αιτήματα μετάφρασης περιορίζονται προσωρινά σε " +"χρήστες με έγκυρο κλειδί API. Συγγνώμη για την ενόχληση!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Μετάφραση API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Μετάφραση κειμένου" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Αρχεία μετάφρασης" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Μεταφράστε από" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Η πηγή Swap και οι γλώσσες-στόχος" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Μετάβαση σε" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Κείμενο για μετάφραση" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Διαγράψτε κείμενο" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Πρότεινε μετάφραση" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Ακύρωση" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Αποστολή" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Υποστηριζόμενη μορφή αρχείων:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "File" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Αφαιρέστε αρχείο αρχείων" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Μετάφρασε" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Λήψη" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Αίτηση αιτήματος" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Απάντηση" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Άνοιγμα API Πηγιαίου Μηχανίματος Μετάφρασης" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Αυτο-Hosted. Offline Capable. Εύκολο στη ρύθμιση." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Άδεια:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"Δημιουργήθηκε με %(heart)s από %(contributors)s και τροφοδοτείται από " +"%(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Συμβαλλόμενοι" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Βιετναμ Βιετνάμ" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Αυτό το δημόσιο API θα πρέπει να χρησιμοποιείται για δοκιμές, προσωπική ή " +#~ "σπάνια χρήση. Εάν πρόκειται να εκτελέσετε μια εφαρμογή στην παραγωγή, " +#~ "παρακαλούμε %(host_server)s ή %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "φιλοξενήσει το δικό σας διακομιστή" + +#~ msgid "get an API key" +#~ msgstr "πάρετε ένα API key" + +#~ msgid "Basque" +#~ msgstr "Βασκικά" + +#~ msgid "Galician" +#~ msgstr "Γαλικιακά" diff --git a/self_host/LibreTranslate/libretranslate/locales/el/meta.json b/self_host/LibreTranslate/libretranslate/locales/el/meta.json new file mode 100644 index 00000000..03fe87de --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/el/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Greek", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/eo/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/eo/LC_MESSAGES/messages.po new file mode 100644 index 00000000..42ae9acf --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/eo/LC_MESSAGES/messages.po @@ -0,0 +1,772 @@ +# Esperanto translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2023-05-02 19:52+0000\n" +"Last-Translator: Jorge Maldonado Ventura \n" +"Language: eo\n" +"Language-Team: Esperanto " +"\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Nevalida JSON-aranĝo" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Aŭtomata Detekto" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Ne rajtigita" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Tro da petaj limmalobservoj" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Invalid API-ŝlosilo" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Bonvolu kontakti la servilo operatoro por akiri API-ŝlosilon" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Vizitu %(url)s por akiri API-ŝlosilon" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Malrapidiĝo:" + +#: 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 "Nevalida peto: mankas %(name)s parametro" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Invalida peto: 0 0 0 0 parametro ne estas nombro %(name)s" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Invalida peto: 0 0 0 0 parametro devas esti 1 1 1 1 " +"%(name)s %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Nevalida peto: peto (%(size)s) superas tekstlimon (%(limit)s)" + +#: 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 ne estas subtenata" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s-aranĝo ne estas subtenata" + +#: 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) ne estas disponebla kiel cellingvo de %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Ne povas traduki tekston: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Dosier-tradukoj estas malebligitaj en ĉi tiu servilo." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Nevalida peto: malplena dosiero" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Nevalida peto: dosieraranĝo ne subtenata" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nevalida dosiernomo" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Sugestoj estas malebligitaj en ĉi tiu servilo." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Angla" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albana albana" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Araba" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbajĝana" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengala bengala" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgara Bulgaro" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalana kataluno" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Ĉina" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "La ĉina (tradicia)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Ĉeĥa" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dana" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Nederlanda" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "La estona" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finna" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Franca" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Germana" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Greka" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebrea" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindia" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Hungara" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonezia" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlanda" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Itala" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japana" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Korea" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "La latva" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litova litovo" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malaja" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norvega" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persa" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Pola" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugala" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumana" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rusa" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovaka" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovena slovena" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Hispana" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Sveda" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "La tagaloga tagalo" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tajlanda" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turka" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukraina" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "La urdua" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Ricevi liston de subtenataj lingvoj" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Listo de lingvoj" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "traduki" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Traduki tekston de lingvo al alia" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Tradukita teksto" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Nevalida peto" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Traduka eraro" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Malrapidiĝo" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Forbarita" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Saluton, mondo!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Teksto(j) por traduki" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Fontlingva kodo" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Kodo de la cellingvo" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "teksto" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Aranĝo de fontteksto:\n" +" * `text` - Plata teksto\n" +" * `html` - HTML-markado\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Preferita nombro de alternativaj tradukoj" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-ŝlosilo" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Traduki dosieron de lingvo al alia" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Tradukita dosiero" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Dosiero por traduki" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detekti la lingvon de ununura teksto" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Ekkonoj" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Ekkona eraro" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Ekkonota teksto" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Ricevu agordojn specifajn de la fasado" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "agordoj de la fasado" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "fasado" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Submeti sugeston por plibonigi tradukon" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Sukceso" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Ne rajtigita" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Origina teksto" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Proponita traduko" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Lingvo de la origina teksto" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Lingvo de la proponita traduko" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "prikomentado" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Lingvokodo" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Hom-legebla lingvonomo (en la angla)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Subtenitaj cellingvokodoj" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Tradukita(j) teksto(j)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Erarmesaĝo" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Kaŭzo de malrapido" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL de tradukita dosiero" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Konfidencvaloro" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Limo de signaj enigoj por ĉi tiu lingvo (-1 indikas neniun limon)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Tempolimo de fasada traduko" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Ĉu la datumbazo de la API-ŝlosilo estas ebligita." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Ĉu API-ŝlosilo estas postulata." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Ĉu submeti proponojn estas ebligita." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Aranĝo de subtenataj dosieroj" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Ĉu submetado estis sukcesa" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopii tekston" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Ne povas ŝarĝi %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Nekonata eraro" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopiita" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "Dankon pro via korekto. Notu, ke la propono ne ekvalidos tuj." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Neniu lingvo disponebla. Ĉu vi ĝuste instalis la modelojn?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Tajpu vian API-ŝlosilon. Se vi bezonas API-ŝlosilon, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "premu la «Akiri API-ŝlosilon» ligilon." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "kontaktu la servilan operatoron." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Libera kaj malfermitkoda API de maŝina tradukado" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Libera kaj malfermitkoda API de maŝina tradukado. Senpage elŝutebla, " +"senkonekte funkciebla kaj facile instalebla. Rulu vian propran API-" +"servilon en nur kelkaj minutoj." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "traduko" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API-dokumentaro" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Akiri API-ŝlosilon" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Agordi API-ŝlosilon" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Ŝanĝi la lingvon" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Redakti" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Toggle malhela/luma reĝimo" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Malakcepti" + +#: 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 "Tradukado-API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Traduki tekston" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Traduki dosierojn" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Tradukita de" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Interŝanĝi fontajn kaj celajn lingvojn" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Traduki al" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Teksto por traduki" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Forigi tekston" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Proponita traduko" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Nuligi" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Sendi" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Subtenitaj dosierformatoj:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Dosiero" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Forigi dosieron" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Traduku" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Elŝuti" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Peto" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Respondo" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API de malfermitkoda maŝina tradukado" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Senpage elŝutebla. Senkonekte funkciebla. Facile instalebla." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Permesilo:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Farita per %(heart)s de %(contributors)s kaj funkciigita per %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Kontribuantoj" + +#~ msgid "multipart/form-data" +#~ msgstr "multiparta/forma-datumoj" + +#~ msgid "Vietnamese" +#~ msgstr "Vjetnama" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Ĉi tiu publika API devus esti " +#~ "uzita por testado, persona aŭ malofta" +#~ " uzo. Se vi rulos apon en " +#~ "produkta medio, bonvolu %(host_server)s aŭ " +#~ "%(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "gastigi vian propran servilon" + +#~ msgid "get an API key" +#~ msgstr "akiri API-ŝlosilon" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/eo/meta.json b/self_host/LibreTranslate/libretranslate/locales/eo/meta.json new file mode 100644 index 00000000..9f93056e --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/eo/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Esperanto", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/es/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/es/LC_MESSAGES/messages.po new file mode 100644 index 00000000..6bd5b3e1 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/es/LC_MESSAGES/messages.po @@ -0,0 +1,779 @@ +# Spanish translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-20 10:36+0000\n" +"Last-Translator: xuars \n" +"Language-Team: Spanish \n" +"Language: es\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.11.1-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "JSON inválido" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Detección automática" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "No autorizado" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Demasiadas violaciones a los límites de la solicitud" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Clave API inválida" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" +"Por favor, contacte con el operador del servidor para obtener una clave " +"API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Visita %(url)s para conseguir una clave API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Ralentización:" + +#: 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 "Solicitud inválida: falta %(name)s parámetro" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Solicitud no válida: El parámetro %(name)s no es un número" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Petición no válida: el parámetro %(name)s debe ser <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Solicitud inválida: el %(size)s) de la solicitud excede el límite de " +"(%(limit)s) de texto" + +#: 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 "el %(lang)s no es compatible" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "formato(s) %(format)s no compatible(s)" + +#: 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) no está disponible como idioma de destino para " +"%(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "No se puede traducir el texto: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "La traducción de archivos está deshabilitada en este servidor." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Solicitud inválida: archivo vacío" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Solicitud inválida: formato de archivo no compatible" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nombre de archivo inválido" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Las sugerencias están deshabilitadas en este servidor." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Inglés" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanés" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Árabe" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaijani" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengalí" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalán" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Chino" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Chino (tradicional)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Checo" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danés" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holandés" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estonio" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finlandés" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francés" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Alemán" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Griego" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebreo" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Húngaro" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesio" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandés" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiano" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonés" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Coreano" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Letón" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituano" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malayo" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Noruego" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persa" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polaco" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugués" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugués (Brasil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumano" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ruso" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Eslovaco" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Esloveno" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Español" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Suecia" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalo" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tailandés" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turco" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ucraniano" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbio" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ucraniano" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Recuperar la lista de idiomas compatibles" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lista de idiomas" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "traducir" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Traducir texto de un idioma a otro" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Texto traducido" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Solicitud inválida" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Error de traducción" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Despacio" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Prohibido" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "¡Hola mundo!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Texto(s) para traducir" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Código fuente del idioma" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Código del idioma de destino" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "texto" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formato de texto fuente:\n" +" * `text` - Texto sin formato\n" +" * `html` - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Número preferido de traducciones alternativas" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Clave API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Traducir archivo de un idioma a otro" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Archivo traducido" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Archivo a traducir" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detectar el idioma de un solo texto" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Detecciones" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Error de detección" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Texto a detectar" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Recuperar configuración específica de la interfaz" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "configuración de la interfaz" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "interfaz" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Presentar una sugerencia para mejorar la traducción" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Todo salió bien" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "No autorizado" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Texto original" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Traducción propuesta" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Idioma del texto original" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Idioma de la traducción sugerida" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "opinión" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Código de idioma" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nombre del idioma comprensible por el ser humano (en inglés)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Códigos de idiomas de destino compatibles" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Texto(s) traducido(s)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Mensaje de error" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Razón para reducir la velocidad" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Archivo traducido url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Valor de confianza" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Límite de entrada de caracteres para este idioma (-1 indica sin límite)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Tiempo de traducción de interfaz" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Si la base de datos clave API está habilitada." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Si se necesita una clave API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Si se permite presentar sugerencias." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Formato de archivos compatibles" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Si el envío tuvo éxito" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Copiar texto" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "No se puede cargar %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Error desconocido" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Copiado" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Gracias por tu corrección. Ten en cuenta que la sugerencia no tendrá " +"efecto inmediatamente." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "No hay idiomas disponibles. ¿Instalaste los modelos correctamente?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Introduce tu clave de API. Si necesitas una clave de API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "presiona el enlace \"Obtener Clave API\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "comunícate con el operador del servidor." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API de traducción automática gratuita y de código abierto" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 de traducción automática gratuita y de código abierto. Descarga " +"gratuita, con capacidad para trabajar sin conexión y fácil de configurar." +" Aloja tu propio servidor API en sólo unos minutos." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "traducción" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Obtener Clave API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Establecer Clave API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Cambiar el idioma" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Editar" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Modo oscuro/ligero" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Desestimar" + +#: 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 "" +"Debido al abuso de bots, las peticiones de traducciones están temporalmente " +"limitadas a los usuarios con una clave API válida. ¡Perdón por las molestias!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API de Traducción" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Traducir texto" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Traducir archivos" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Traducir del" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Cambiar idioma de origen y destino" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Traducir al" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Texto para traducir" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Borrar el texto" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Sugerir traducción" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Cancelar" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Enviar" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formatos de archivo compatibles:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Archivo" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Eliminar el archivo" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Traducir" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Descargar" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Solicitud" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Respuesta" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API de Traducción de Código Abierto" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Descarga gratuita. Funciona Sin Conexión. Fácil de Configurar." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licencia:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Hecho con %(heart)s por %(contributors)s e impulsado por %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Colaboradores de %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamita" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Esta API pública debería ser utilizada" +#~ " sólo para hacer pruebas y para " +#~ "el uso personal o poco frecuente. " +#~ "Si vas a ejecutar una aplicación " +#~ "en producción, por favor %(host_server)s " +#~ "u %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "aloja tu propio servidor" + +#~ msgid "get an API key" +#~ msgstr "obtén una clave API" + +#~ msgid "Basque" +#~ msgstr "Vasco" + +#~ msgid "Galician" +#~ msgstr "Galego" diff --git a/self_host/LibreTranslate/libretranslate/locales/es/meta.json b/self_host/LibreTranslate/libretranslate/locales/es/meta.json new file mode 100644 index 00000000..f928e055 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/es/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Spanish", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/et/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/et/LC_MESSAGES/messages.po new file mode 100644 index 00000000..623495e1 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/et/LC_MESSAGES/messages.po @@ -0,0 +1,775 @@ +# Estonian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.12\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-02-01 18:01+0000\n" +"Last-Translator: Priit Jõerüüt \n" +"Language-Team: Estonian \n" +"Language: et\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Vigane JSON-vorming" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Tuvasta keel automaatselt" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Pole lubatud" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Liiga palju päringuid ühes ajaühikus" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Vigane API võti" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Palun küsi serveri haldajalt API võtit" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "API võtme saamiseks palun vaata seda urli - %(url)s" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Võtame nüüd tempot alla:" + +#: 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 "Vigane päring: puuduv parameeter „%(name)s“" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Vigane taotlus: %(name)s parameeter ei ole arv" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Vigane taotlus: %(name)s parameeter peab olema ≤ %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Vigane päring: päringu (%(size)s) suurus ületab tekstipäringutele lubatud " +"ülempiiri (%(limit)s)" + +#: 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 keel ei ole veel tõlgitav" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s vorming ei ole veel toetatud" + +#: 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 keel (%(tcode)s) ei ole veel kasutatav sihtkeelena kui lähtekeel " +"on %(sname)s keel (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Teksti tõlkimine ei õnnestu: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Failide tõlkimine ei ole selles serveris lubatud." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Vigane päring: tühi fail" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Vigane päring: failivorming pole toetatud" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Vigane failinimi" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Tõlkesoovituste võimalus ei ole selles serveris kasutusel." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "inglise" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albaania" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "araabia" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "aserbaidžaani" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgaaria" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Kataloonia" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "hiina" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Hiina (traditsiooniline)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "tšehhi" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "taani" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "hollandi" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Eesti" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "soome" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "prantsuse" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "saksa" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "kreeka" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "heebrea" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "ungari" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "indoneesia" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "iiri" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "itaalia" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "jaapani" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "korea" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Läti" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Leedu" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malay" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norra" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "pärsia" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "poola" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "portugali" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugali (Brasiilia)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumeenlane" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "vene" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "slovaki" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Sloveenia" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "hispaania" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "rootsi" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalogi" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tai" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "türgi" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "ukraina" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbia" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukraina" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnami" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Laadi kasutatavate keelte loend" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Keelte loend" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "tõlkimine" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Tõlgi tekst ühest keelest teise" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Tõlgitud tekst" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Vigane päring" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Tõlkeviga" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Aeglustame päringuid" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Keelatud" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Tere maailm!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Tõlgitav tekst" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Lähtekeele kood" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Tõlkekeele kood" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "tekst" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Lähteteksti vorming:\n" +" * `text` - vormindamata tekst\n" +" * `html` - HTML-vormingus tekst\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Alternatiivsete tõlgete eelistatud arv" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API võti" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Tõlgi fail ühest keelest teise" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Tõlgitud fail" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Tõlgitav fail" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Tuvasta ühe teksti keel" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Tuvastamise tulemused" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Viga tuvastamisel" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Tekst, kust peaksime keele tuvastama" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Päring kasutajaliidese seadistuste vaatamiseks" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "kasutajaliidese seadistused" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "kasutajaliides" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Võimalus ettepanekute saatmiseks tõlke parandamise nimel" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Päring õnnestus" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Päring pole lubatud" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Lähtetekst" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Ettepanek tõlke parandamiseks" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Teksti lähtekeel" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Teksti tõlkekeel" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "tagasiside" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Keelekood" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Inimloetav keele nimi (inglise keeles)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Tõetatud tõlkekeelte koodid" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Tõlgitud tekst(id)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Veateade" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Päringute aeglustamise põhjus" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Tõlgitud faili url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Usaldusväärsuse väärtus" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Lähteteksti tähemärkide mahu ülempiir selle keele kohta (-1 märgib ülempiiri" +" puudumist)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Tõlkepäringu aegumine kasutajaliideses" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Kas API võtmete andmebaas on kasutusel." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Kas API võtme kasutamine on nõutav." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Kas tõlkesoovituste saatmine on kasutusel." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Toetatud failivormingud" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Kas tõlkesoovituse saatmine õnnstus" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopeeri tekst" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "%(url)s urli laadimine ei õnnestunud" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Tundmatu viga" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopeeritud" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Täname tõlke parandusettepaneku eest. Palun arvesta, et ta ei tule koheselt " +"kasutusele." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" +"Ühtegi keelt pole saadaval. Kas sa keelemudelid paigaldasid korrektselt?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Sisesta siia oma API võti. Kui sul API võti on puudu, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "klõpsi linki „Osta API võti“." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "võta ühendust serveri haldajaga." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Vaba ja avatud lähtekoodiga masintõlke API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Vaba ja avatud lähtekoodiga masintõlke API. Majutatav oma serveris, toimib " +"ka võrguühenduseta ja on hõlpsasti seadistatav. Võta oma API server " +"kasutusele vaid mõne minutiga." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "tõlge" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API kirjeldus" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Osta API võti" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Lisa API võti" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Vaheta keelt" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Muuda" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Vaheta kujundust: tume/hele" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Loobu" + +#: 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 "" +"Boti kuritarvitamise tõttu on tõlketaotlused ajutiselt piiratud kehtiva API " +"võtmega kasutajatega. Vabandust ebamugavuste pärast!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "TõlkeAPI" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Tõlgi teksti" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Tõlgi faile" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Lähtekeel" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Vaheta lähte- ja tõlkekeeled" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Tõlkekeel" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Tõlgitav tekst" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Kustuta tekst" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Soovita paremat tõlget" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Katkesta" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Saada" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Kasutatavad failivormingud:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fail" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Eemalda fail" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Tõlgi" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Laadi alla" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Päring" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Vastus" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Avatud lähtekoodiga masintõlke API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" +"Majutatav oma serveris. Toimib ka võrguühenduseta. Hõlpsasti seadistatav." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Litsents:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"Tehtud suure %(heart)s'ga, millesse panustasid %(contributors)s ning " +"sisulise töö teeb ära %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s kaasautorid" + +#~ msgid "Vietnamese" +#~ msgstr "vietnami" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Palun kasuta seda avalikku API't testimiseks, isiklikel eesmärkidel või " +#~ "muudel harvadel juhtudel. Kui tahad kasutada API't mõnes " +#~ "produktsioonirakenduses, siis palun %(host_server)s või %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "pane püsti oma server" + +#~ msgid "get an API key" +#~ msgstr "või osta meie serveri API võti" + +#~ msgid "Basque" +#~ msgstr "Baski" + +#~ msgid "Galician" +#~ msgstr "Galicia" diff --git a/self_host/LibreTranslate/libretranslate/locales/et/meta.json b/self_host/LibreTranslate/libretranslate/locales/et/meta.json new file mode 100644 index 00000000..01f9bd49 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/et/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Estonian", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/eu/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/eu/LC_MESSAGES/messages.po new file mode 100644 index 00000000..89650a1b --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/eu/LC_MESSAGES/messages.po @@ -0,0 +1,770 @@ +# Basque translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.12\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-10-09 17:15+0000\n" +"Last-Translator: Urtzi Odriozola Lizaso \n" +"Language: eu\n" +"Language-Team: Basque " +"\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "JSON formatu baliogabea" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Hautemate automatikoa" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Baimenik gabe" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Eskaera-mugaren urraketa gehiegi" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "API gako baliogabea" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Mesedez, jarri harremanetan zerbitzari-operadorearekin API gakoa lortzeko" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Bisitatu %(url)s API gako bat lortzeko" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Moteltzea:" + +#: 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 "Eskaera baliogabea: %(name)s parametroa falta da" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Eskaera baliogabea: %(name)s parametroa ez da zenbakia" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Eskaera baliogabea: %(name)s parametroak <= %(value)s izan behar du" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Eskaera baliogabea: eskaerak (%(size)s) testu muga (%(limit)s) gainditzen" +" du" + +#: 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 ez da bateragarria" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s formatua ez da bateragarria" + +#: 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) ez dago eskuragarri helburu hizkuntza moduan " +"%(sname)s-(e)tik (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Ezin da testua itzuli: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Fitxategi itzulpenak ez daude gaituta zerbitzari honetan." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Eskaera baliogabea: fitxategi hutsa" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Eskaera baliogabea: fitxategiaren formatua ez da bateragarria" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Fitxategiaren izena baliogabea" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Iradokizunak ez daude gaituta zerbitzari honetan." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Ingelesa" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albaniera" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabiera" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaijanera" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengalera" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgariera" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalana" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Txinera" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Txinera (tradizionala)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Txekiera" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Daniera" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Nederlandera" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperantoa" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estoniera" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finlandiera" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Frantsesa" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Alemana" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Greziera" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebreera" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindiera" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Hungariera" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesiera" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandera" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiera" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japoniera" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreera" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Letoniera" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituaniera" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malaysiera" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norvegiera" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persiera" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Poloniera" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugesa" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Errumaniera" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Errusiera" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Eslovakiera" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Esloveniera" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Gaztelania" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Suediera" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagaloa" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thailandiera" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turkiera" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrainera" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdua" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbiera" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrainera" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamera" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Eskuratu bateragarriak diren hizkuntzen zerrenda" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Hizkuntzen zerrenda" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "itzuli" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Itzuli testua hizkuntza batetik bestera" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Itzulitako testua" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Eskaera baliogabea" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Itzulpen errorea" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Moteldu" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Debekatua" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Kaixo mundua!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Itzultzeko testua(k)" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Jatorrizko hizkuntza kodea" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Helburu hizkuntza kodea" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "testua" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Jatorrizko testu formatua:\n" +" * `text` - Formatu gabeko testua\n" +" * `html` - HTML etiketak\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Itzulpen alternatiboen kopuru hobetsia" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API gakoa" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Itzuli fitxategia hizkuntza batetik bestera" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Itzulitako fitxategia" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Itzultzeko fitxategia" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Hauteman testu bakar baten hizkuntza" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Hautemateak" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Hautemate errorea" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Hautemateko testua" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Eskuratu interfazeko ezarpen espezifikoak" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "interfaze ezarpenak" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "interfazea" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Bidali iradokizun bat itzulpena hobetzeko" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Arrakasta" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Baimenik gabea" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Jatorrizko testua" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Iradokitako itzulpena" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Jatorrizko testuaren hizkuntza" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Iradokitako itzulpenaren hizkuntza" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "iritzia" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Hizkuntzaren kodea" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Gizakiak uler dezakeen hizkuntzaren izena (ingelesez)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Helburuko hizkuntzen kode bateragarriak" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Itzulitako testua(k)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Errore mezua" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Moteltzeko arrazoia" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Itzulitako fitxategiaren url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Konfiantza balioa" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Karakterearen sarrera-muga hizkuntza honetarako (-1ek mugarik ez dagoela " +"adierazten du)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Interfazeko itzulpen denbora" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "API gakoen datu-basea gaituta dagoen ala ez." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "API gako bat behar den ala ez." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Iradokizunak bidaltzea gaituta dagoen ala ez." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Fitxategi bateragarrien formatua" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Bidalketa arrakastatsua izan den ala ez" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopiatu testua" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Ezin da %(url)s kargatu" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Errore ezezaguna" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopiatua" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Eskerrik asko zuzenketagatik. Kontuan izan iradokizunak ez duela " +"berehalakoan eraginik izango." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Ez dago hizkuntza erabilgarririk. Modeloak ongi instalatu dituzu?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Idatzi zure API gakoa. API gako bat behar baduzu, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "sakatu \"Lortu API Gakoa\" esteka." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "jarri zerbitzari-operadorearekin harremanetan." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Doako eta kode irekiko Itzulpen automatikoko APIa" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Doako eta kode irekiko Itzulpen automatikoko APIa. Doan deskargatzeko, " +"konexio beharrik gabea eta konfiguratzeko erraza. Exekutatu zure API " +"zerbitzaria minutu gutxitan." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "itzulpena" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Dokak" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Lortu API Gakoa" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Ezarri API Gakoa" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Aldatu hizkuntza" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Editatu" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Modu iluna/argia" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Baztertu" + +#: 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 "Itzulpen APIa" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Itzuli testua" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Itzuli fitxategiak" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Itzuli hemendik" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Aldatu jatorrizko eta helburuko hizkuntzak" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Itzuli hona" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Itzultzeko testua" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Ezabatu testua" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Iradoki itzulpena" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Utzi" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Bidali" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Fitxategi bateragarrien formatuak:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fitxategia" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Kendu fitxategia" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Itzuli" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Deskargatu" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Eskaera" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Erantzuna" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Kode Irekiko Itzulpen Automatikoko APIa" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Doan deskargatzeko. Konexio beharrik gabe. Konfiguratzeko erraza." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Lizentzia:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "%(contributors)s %(heart)sez egina eta %(engine)sk sustatua" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Laguntzaileek" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "API publiko hau proba, erabilera " +#~ "pertsonal edo ez-ohikoetarako erabili " +#~ "behar da. Aplikazio bat ekoizpenean " +#~ "exekutatu nahi baduzu, mesedez %(host_server)s" +#~ " edo %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "ostatatu zure zerbitzaria" + +#~ msgid "get an API key" +#~ msgstr "API gako bat lortu" + +#~ msgid "Basque" +#~ msgstr "Euskara" + +#~ msgid "Galician" +#~ msgstr "Galiziera" + diff --git a/self_host/LibreTranslate/libretranslate/locales/eu/meta.json b/self_host/LibreTranslate/libretranslate/locales/eu/meta.json new file mode 100644 index 00000000..76ebb650 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/eu/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Basque", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/ext/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ext/LC_MESSAGES/messages.po new file mode 100644 index 00000000..2039b08a --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ext/LC_MESSAGES/messages.po @@ -0,0 +1,752 @@ +# ext translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language: ext\n" +"Language-Team: none\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Vietnamese" +#~ msgstr "" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/ext/meta.json b/self_host/LibreTranslate/libretranslate/locales/ext/meta.json new file mode 100644 index 00000000..94f47673 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ext/meta.json @@ -0,0 +1,4 @@ +{ + "name": "ext", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/fa/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/fa/LC_MESSAGES/messages.po new file mode 100644 index 00000000..10b64482 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/fa/LC_MESSAGES/messages.po @@ -0,0 +1,771 @@ +# Persian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-07-26 07:54+0000\n" +"Last-Translator: MjavadH \n" +"Language-Team: Persian \n" +"Language: fa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "فرمت JSON نامعتبر است" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "تشخیص خودکار" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "غیرمجاز" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "تعداد درخواست‌ها بیش از حد مجاز است" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "کلید API نامعتبر است" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "لطفاً برای دریافت کلید API با اپراتور سرور تماس بگیرید" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "برای دریافت کلید API از %(url)s بازدید نمایید" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "کاهش سرعت:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "درخواست Invalid: %(name)s پارامتر یک عدد نیست" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "درخواست Invalid: %(name)s پارامتر باید <= 1 1 %(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "فرمت %(format)s پشتیبانی نمی‌شود" + +#: 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 "" +"(%(tcode)s) (%(tname)s) از (%(scode)s) (%(sname)s) به عنوان یک زبان هدف در " +"دسترس نیست" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "متن قابل ترجمه نیست: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "ترجمه فایل در این سرور غیرفعال است." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "درخواست نامعتبر: فایل خالی است" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "درخواست نامعتبر: فرمت فایل پشتیبانی نمی‌شود" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "نام فایل نامعتبر است" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "پیشنهادات در این سرور غیرفعال است." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "انگلیسی" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "آلبانی" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "عربی" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "آذری" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "بنگالی" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "بلغاری" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "کاتالونیا" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "چینی" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "چینی ( سنتی)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "(کشور) چک" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "دانمارکی" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "هلندی" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "اسپرانتور" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "استونی" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "فنلاندی" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "فرانسوی" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "آلمانی" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "یونانی" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "عبری" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "هندی" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "مجارستانی" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "اندونزیایی" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "ایرلندی" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "ایتالیایی" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "ژاپنی" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "کره‌ای" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "لتونی" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "لیتوانی" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "مالزیایی" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "نروژی" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "فارسی" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "لهستانی" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "پرتغالی" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "پرتغالی (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "رومانی" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "روسی" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "اسلواکی" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "اسلوونی" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "اسپانیایی" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "سوئدی" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "تایلند" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "ترکی" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "اوکراینی" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "اردو" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "صربستان" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "اوکراین" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "ویتنامی" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "بازیابی فهرست زبان‌های پشتیبانی شده" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "فهرست زبان‌ها" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "ترجمه" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "ترجمه متن از یک زبان به زبان دیگر" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "متن ترجمه شده" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "درخواست نامعتبر است" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "خطا در ترجمه" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "کاهش سرعت" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "ممنوع شده" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "سلام دنیا!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "متن (ها) برای ترجمه" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "کد زبان منبع" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "کد زبان هدف" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "متن" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"فرمت متن منبع:\n" +"* text - متن ساده\n" +"* html - حالت های html\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "تعداد ترجمه های جایگزین" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "کلید API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "ترجمه فایل از یک زبان به زبان دیگر" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "فایل ترجمه شده" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "فایل برای ترجمه" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "تشخیص زبان یک متن" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "شناسایی ها" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "خطای شناسایی" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "متن برای شناسایی" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "بازیابی تنظیمات ظاهری ویژه" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "تنظیمات ظاهری" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "نما ظاهری" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "پیشنهادی برای بهبود ترجمه ثبت نمایید" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "موفقیت‌آمیز" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "مجاز نیست" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "متن اصلی" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "ترجمه پیشنهادی" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "زبان متن اصلی" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "زبان ترجمه پیشنهادی" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "بازخورد" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "کد زبان" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "نام زبان قابل خواندن برای انسان (به انگلیسی)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "کدهای زبان هدف پشتیبانی شده" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "متن‌(های) ترجمه شده" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "پیام خطا" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "دلیل کاهش سرعت" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "نشانی فایل ترجمه شده" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "ضریب اطمینان" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "محدودیت کاراکتر برای این زبان (-1 یعنی بدون محدودیت)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "محدودیت زمانی ترجمه برای نمای ظاهری" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "اینکه (آیا) پایگاه داده مربوط به کلید API فعال است." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "اینکه (آیا) کلید API مورد نیاز است." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "اینکه (آیا) ارسال پیشنهادات ممکن است." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "فرمت فایل‌های پشتیبانی شده" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "اینکه (آیا) ارسال موفقیت‌آمیز بود" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "کپی متن" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "%(url)s بارگیری نمی‌شود" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "خطای ناشناخته" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "کپی شد" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"از تصحیح شما سپاس‌گزاریم. توجه داشته باشید که این پیشنهاد بلافاصله اجرا " +"نخواهد شد." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "هیچ زبانی در دسترس نیست. آیا مدل‌ها را به‌درستی نصب کرده‌اید؟" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "بر روی لینک \"دریافت کلید API\" کلیک کنید." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API ترجمه ماشینی رایگان و متن باز" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 ترجمه ماشینی رایگان و متن باز. خود میزبان، با قابلیت راه‌اندازی آسان و " +"آفلاین. سرور API خود را تنها در چند دقیقه اجرا کنید." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "ترجمه" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "داکیومنت های API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "دریافت کلید API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "گیت‌هاب" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "تنظیم کلید API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "تغییر زبان" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "ویرایش" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "تغییر به حالت تیره/روشن" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "انصراف" + +#: 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 "" +"با توجه به سوء استفاده از ربات، درخواست های ترجمه به طور موقت محدود به " +"کاربران با یک کلید API معتبر است. ببخشید برای ناراحتی!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API ترجمه" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "ترجمه متن" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "ترجمه فایل ها" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "ترجمه از" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "جابجایی زبان مبدا و هدف" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "ترجمه به" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "متن برای ترجمه" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "حذف متن" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "پیشنهاد ترجمه" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "لغو" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "ارسال" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "فرمت‌های فایل پشتیبانی شده:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "فایل" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "حذف فایل" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "ترجمه کن" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "بارگیری (دانلود)" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "درخواست" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "پاسخ" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API ترجمه ماشینی متن باز" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "خود میزبان. قابلیت کار آفلاین. با قابلیت راه‌اندازی آسان." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "لیبر ترنسلیت" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "مجوز:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"ساخته شده با %(heart)s توسط %(contributors)s و قدرت گرفته از %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "مشارکت‌‌کنندگان %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "ویتنامی" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "این API عمومی باید برای آزمایش، استفاده شخصی یا اختصاصی است. اگر قرار است " +#~ "برنامه‌ای که برای محصول است با آن اجرا کنید، لطفا %(host_server)s یا " +#~ "%(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "در سرور خود میزبانی کنید" + +#~ msgid "get an API key" +#~ msgstr "یک کلید API بگیرید" + +#~ msgid "Basque" +#~ msgstr "Basque" + +#~ msgid "Galician" +#~ msgstr "Galician" diff --git a/self_host/LibreTranslate/libretranslate/locales/fa/meta.json b/self_host/LibreTranslate/libretranslate/locales/fa/meta.json new file mode 100644 index 00000000..31f6aed6 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/fa/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Persian", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/fi/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/fi/LC_MESSAGES/messages.po new file mode 100644 index 00000000..237a1546 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/fi/LC_MESSAGES/messages.po @@ -0,0 +1,770 @@ +# Finnish translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-05-15 02:15+0000\n" +"Last-Translator: J \n" +"Language-Team: Finnish \n" +"Language: fi\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.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Virheellinen JSON-formaatti" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Automaattinen tunnistus" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Luvaton" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Liikaa pyyntöjä, rajat ylitetty" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Virheellinen API-avain" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Ota yhteyttä palvelimen ylläpitäjään saadaksesi API-avaimen" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Vieraile %(url)s:ssa saadaksesi API-avaimen" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Hidastus:" + +#: 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 "Virheellinen pyyntö: Puuttuva %(name)s parametri" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Virheellinen pyyntö: %(name)s Parametri ei ole numero" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Virheellinen pyyntö: %(name)s Parametrin on oltava 1 1 %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Virheellinen pyyntö: pyyntö (%(size)s ylittää tekstin rajan (%(limit)s)" + +#: 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 ei ole tuettu" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s formaattia ei tueta" + +#: 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) ei ole saatavilla kohdekielenä %(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Ei voi kääntää tekstiä: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Tiedostojen kääntäminen on poistettu käytöstä tällä palvelimella." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Virheellinen pyyntö: tyhjä tiedosto" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Virheellinen pyyntö: tiedostomuotoa ei tueta" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Virheellinen tiedoston nimi" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Ehdotukset on poistettu käytöstä tällä palvelimella." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Englanti" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albania" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabia" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaidžan" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgaria" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalonia" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Kiina" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kiina (perinteinen)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Tšekki" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Tanska" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Hollanti" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Viro" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Suomi" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Ranska" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Saksa" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Kreikka" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Heprea" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Unkari" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesia" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlanti" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italia" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japani" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Korea" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Latvia" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Liettua" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malesia" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norja" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persia" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Puola" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugali" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugali (Brazilia)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romania" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Venäjä" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovakia" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovenia" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Espanja" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Ruotsi" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalogi" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thaimaa" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turkki" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukraina" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbia" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukraina" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnam" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Luettelo tuetuista kielistä" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Luettelo kielistä" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "käännökset" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Käännä teksti kielestä toiseen" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Käännetty teksti" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Virheellinen pyyntö" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Käännösvirhe" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Hidasta" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Bännätty" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Hei maailma!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Käännettävä teksti" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Lähdekielikoodi" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Kohdekielen koodi" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "teksti" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Lähdetekstin muoto:\n" +" * `text` - Selkoteksti\n" +" * `html` - HTML-merkintä\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Vaihtoehtoisia käännöksiä suositellaan" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-avain" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Tiedoston kääntäminen kielestä toiseen" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Käännetty tiedosto" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Käännettävä tiedosto" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Tunnista yhden tekstin kieli" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Havainnot" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Tunnistusvirhe" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Tunnistettava teksti" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Etsi käyttöliittymäkohtaisia asetuksia" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "käyttöliittymän asetukset" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "käyttöliittymä" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Ehdota parannusta käännökseen" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Onnistui" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Ei lupaa" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Alkuperäinen teksti" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Käännösehdotus" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Alkuperäisen tekstin kieli" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Ehdotetun käännöksen kieli" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "palaute" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Kielikoodi" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Ihmisen luettava kieli (englanniksi)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Tuettu kohdekielikoodi" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Käännetty teksti" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Virheviesti" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Hidastuksen syy" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Käännetyn tiedoston URL" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Luottamusarvo" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Merkkien syöttörajoitus tälle kielelle (-1 = ei rajaa)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Käyttöliittymän käännöksen aikakatkaisu" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Onko API avaintietokanta käytössä." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Tarvitaanko API-avain." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Onko ehdotusten esittäminen mahdollista." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Tuettu tiedostomuoto" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Onnistuiko lähetys" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopioi teksti" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Ei voi ladata %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Tuntematon virhe" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopioitu" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "Kiitos korjauksesta. Huomaa, että ehdotus ei tule heti voimaan." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Ei kieliä saatavilla. Oletko asentanut mallit oikein?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Kirjoita API-avaimesi. Jos tarvitset API-avaimen, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "paina \"Get API Key\" -linkkiä." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "ota yhteyttä palvelimen ylläpitäjään." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Ilmainen ja avoimen lähdekoodin konekäännösrajapinta" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Ilmainen ja avoimen lähdekoodin konekäännösrajapinta. Itseisännöity, " +"offline-tilassa toimiva ja helppo asentaa. Käytä omaa API-palvelintasi " +"muutamassa minuutissa." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "käännös" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Dokumentaatio" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Hanki API-avain" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Aseta API-avain" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Vaihda kieltä" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Muokkaa" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Tumma/vaalea tila" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Hylkää" + +#: 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 "" +"Bottien väärinkäytön vuoksi käännöspyynnöt rajoittuvat tilapäisesti " +"käyttäjiin, joilla on voimassa oleva API-avain. Pahoittelen häiriötä!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Käännös API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Käännä teksti" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Käännä tiedosto" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Käännökset" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Vaihda lähde ja kohdekielet" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Käännä kielelle" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Käännettävä teksti" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Poista teksti" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Ehdota käännöstä" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Peru" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Lähetä" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Tuetut tiedostomuodot:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Tiedosto" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Poista tiedosto" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Käännä" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Lataa" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Pyyntö" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Vastaus" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Avoimen lähdekoodin konekäännösrajapinta" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Itseisännöity. Offline-yhteensopiva. Helppo asentaa." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Lisenssi:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "%(heart)s:lla tehnyt %(contributors)s hyödyntäen %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Osallistujat" + +#~ msgid "multipart/form-data" +#~ msgstr "monipuolinen/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnami" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Tämä julkinen API on käytettävissä testaamiseen, henkilökohtaiseen tai " +#~ "harvaan käyttöön. Jos aiot käyttää sovellusta tuotannossa, ole hyvä " +#~ "%(host_server)s tai %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "isännöi oma palvelin" + +#~ msgid "get an API key" +#~ msgstr "hanki API-avain" + +#~ msgid "Basque" +#~ msgstr "Baski" + +#~ msgid "Galician" +#~ msgstr "Galician" diff --git a/self_host/LibreTranslate/libretranslate/locales/fi/meta.json b/self_host/LibreTranslate/libretranslate/locales/fi/meta.json new file mode 100644 index 00000000..786443a3 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/fi/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Finnish", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/fil/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/fil/LC_MESSAGES/messages.po new file mode 100644 index 00000000..96e2885a --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/fil/LC_MESSAGES/messages.po @@ -0,0 +1,760 @@ +# Filipino translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.12\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-04-03 08:46+0000\n" +"Last-Translator: searinminecraft " +"<114207889+searinminecraft@users.noreply.github.com>\n" +"Language: fil\n" +"Language-Team: Filipino " +"\n" +"Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 ==" +" 4 || n % 10 == 6 || n % 10 == 9);\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Hindi wastong JSON format" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "I-auto Detect" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Hindi awtorisado" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Masyadong maraming paglalabag sa limitasyon ng hiling" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Hindi wastong API key" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Makipag-ugnayan sa operator ng server para makakuha ng API key" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Bisitahin ang %(url)s para makakuha ng API key" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Slowdown:" + +#: 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 "Hindi wastong hiling: nawawalang %(name)s na parameter" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Hindi wastong hiling: lumalagpas ang hiling (%(size)s) ang limitasyon ng " +"text (%(limit)s)" + +#: 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 "Hindi sinusuportahan ang %(lang)s" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Hindi sinusuportahan ang %(format)s na format" + +#: 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 "" +"Ang %(tname)s (%(tcode)s) ay hindi available bilang target na wika galing" +" sa %(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Hindi masalin ang text: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Ang pagsalin ng file ay naka-disable sa server na ito." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Hindi wastong hiling: walang laman na file" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Hindi wastong hiling: hindi sinusuportahan ang file format" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Hindi wastong filename" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Naka-disable ang mga mungkahi sa server na ito." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Kunin ang listahan ng mga sinusuportahang wika" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Listahan ng mga wika" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Vietnamese" +#~ msgstr "" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/fil/meta.json b/self_host/LibreTranslate/libretranslate/locales/fil/meta.json new file mode 100644 index 00000000..241cc010 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/fil/meta.json @@ -0,0 +1,4 @@ +{ + "name": "fil", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/fr/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/fr/LC_MESSAGES/messages.po new file mode 100644 index 00000000..7d2f1387 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/fr/LC_MESSAGES/messages.po @@ -0,0 +1,778 @@ +# French translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-08-24 13:02+0000\n" +"Last-Translator: ButterflyOfFire \n" +"Language-Team: French \n" +"Language: fr\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.13\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Format JSON incorrect" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Détection automatique" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Non autorisé" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Dépassement de la limite du nombre de requêtes" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Clé API incorrecte" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Veuillez contacter l'opérateur du serveur pour obtenir une clé API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Visitez %(url)s pour obtenir une clé API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Ralentissement :" + +#: 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 "Requête incorrecte : le paramètre %(name)s est manquant" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Requête non valide : le paramètre %(name)s n'est pas un nombre" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Requête non valide : le paramètre %(name)s doit être <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Requête non valide : la requête (%(size)s) dépasse la limite de texte " +"(%(limit)s)" + +#: 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 n'est pas prise en charge" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "le format %(format)s n'est pas pris en charge" + +#: 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) n'est pas disponible comme langue cible pour " +"%(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Impossible de traduire le texte : %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "La traduction de fichiers est désactivée sur ce serveur." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Requête invalide : le fichier est vide" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Requête non valide : le format de ce fichier n'est pas pris en charge" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nom de fichier invalide" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Les suggestions sont désactivées sur ce serveur." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Anglais" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanais" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "arabe" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "azéri" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgare" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalan" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "chinois" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Chinois (traditionnel)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "tchèque" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "danois" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "néerlandais" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "espéranto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estonien" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "finnois" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "français" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "allemand" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "grec" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "hébreux" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "hongrois" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "indonésien" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "irlandais" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "italien" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "japonais" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "coréen" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Lettonie" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituanien" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malay" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norvège" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "perse" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "polonais" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "portugais" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugais (Brésil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Roumain" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "russe" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "slovaque" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovénie" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "espagnol" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "suédois" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thaï" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "turque" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "ukrainien" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Ourdou" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbe" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrainien" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamien" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Récupérer la liste des langues prises en charge" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Liste des langues" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "traduction" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Traduire du texte d’une langue à l'autre" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Texte traduit" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Requête incorrecte" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Erreur de traduction" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Ralentissement" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Banni" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Bonjour le monde !" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Texte(s) à traduire" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Code de la langue source" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Code de la langue cible" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "texte" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format du texte source :\n" +" * `text` - Texte brut\n" +" * `html` - Balises HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Nombre préféré de traductions alternatives" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Clé API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Traduire un fichier d'une langue à une autre" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Fichier traduit" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fichier à traduire" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Détecter la langue d'un seul texte" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Détections" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Erreur de détection" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Texte à détecter" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Récupérer les paramètres spécifiques à l’interface" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "paramètres de l’interface" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "interface" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Soumettre une suggestion pour améliorer une traduction" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Succès" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Autorisation manquante" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Texte original" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Traduction proposée" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Langue du texte original" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Langue de la traduction proposée" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "commentaire" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Code de la langue" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nom de la langue lisible par un humain (en anglais)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Codes de langues cibles pris en charge" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Texte(s) traduit(s)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Message d'erreur" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Raison du ralentissement" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL du fichier traduit" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Valeur de confiance" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Limite de caractères pour cette langue (-1 indique aucune limite)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Expiration du délai d'attente pour l'interface de traduction" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Indique si la base de données de clés API est activée." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Indique si une clé API est requise." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Indique si l'envoi de suggestions est activé." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Formats de fichier pris en charge" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Si l'envoi a réussi" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Copier le texte" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Impossible de charger %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Erreur inconnue" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Copié" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Merci pour votre correction. Notez que la suggestion ne prendra pas effet" +" immédiatement." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Pas de langues disponibles. Avez-vous installé les modèles correctement ?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Entrez votre clé API. Si vous avez besoin d'une clé API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "appuyez sur le lien « Obtenir une clé d'API »." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "contactez l'opérateur du serveur." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API de Traduction Automatique libre et ouverte" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 de Traduction Automatique libre et ouverte. Téléchargement gratuit, " +"hors ligne et facile à installer. Lancez votre propre serveur API en " +"quelques minutes." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "traduction" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "API" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Documentation de l'API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Obtenir une clé d'API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Définir la clé d'API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Changer de langue" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Modifier" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Basculer en mode sombre/clair" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Ignorer" + +#: 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 "" +"Suite à des abus provenant de bots, les demandes de traduction sont " +"temporairement limitées aux utilisateurs disposant d'une clé API valide. " +"Veuillez nous excuser pour la gêne occasionnée !" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API de traduction" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Traduire du texte" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Traduire des fichiers" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Traduire depuis" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Échanger la langue source et la langue cible" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Traduire en" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Texte à traduire" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Supprimer le texte" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Suggérer une traduction" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Annuler" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Envoyer" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formats de fichiers pris en charge :" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fichier" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Supprimer le fichier" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Traduire" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Télécharger" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Requête" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Réponse" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API ouverte de traduction automatique" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Téléchargement gratuit. Mode hors ligne. Facile à configurer." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licence :" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Conçu avec %(heart)s par %(contributors)s et propulsé par %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Contributeurs %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "vietnamien" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Cette API publique ne devrait être " +#~ "utilisée que pour des tests, de " +#~ "manière personnelle ou occasionnelle. Si " +#~ "vous souhaitez l'utiliser avec une " +#~ "application en production, veuillez " +#~ "%(host_server)s ou %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "héberger votre propre serveur" + +#~ msgid "get an API key" +#~ msgstr "obtenir une clé d'API" + +#~ msgid "Basque" +#~ msgstr "Basque" + +#~ msgid "Galician" +#~ msgstr "Galicien" diff --git a/self_host/LibreTranslate/libretranslate/locales/fr/meta.json b/self_host/LibreTranslate/libretranslate/locales/fr/meta.json new file mode 100644 index 00000000..ac9b9663 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/fr/meta.json @@ -0,0 +1,4 @@ +{ + "name": "French", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/ga/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ga/LC_MESSAGES/messages.po new file mode 100644 index 00000000..d2ef44db --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ga/LC_MESSAGES/messages.po @@ -0,0 +1,779 @@ +# Irish translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-30 11:20+0000\n" +"Last-Translator: Aindriú Mac Giolla Eoin \n" +"Language-Team: Irish \n" +"Language: ga\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :(" +"n>6 && n<11) ? 3 : 4;\n" +"X-Generator: Weblate 5.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Formáid JSON marcáilte" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Braith Uathoibríoch" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Gan údarás" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Cuireann an iomarca iarratas teorainn le sáruithe" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Eochair API neamhbhailí" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Déan teagmháil le hoibreoir an fhreastalaí chun eochair API a fháil" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Tabhair cuairt ar %(url)s a fháil eochair API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Go mall:" + +#: 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 "Iarratas neamhbhailí: paraiméadar %(name)s in easnamh" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Iarratas neamhbhailí: ní uimhir é paraiméadar %(name)s" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Iarratas neamhbhailí: Caithfidh paraiméadar %(name)s a bheith <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Iarratas neamhbhailí: iarratas (%(size)s) níos mó ná teorainn téacs " +"(%(limit)s)" + +#: 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 "Ní thacaítear le %(lang)s" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Ní thacaítear le formáid %(format)s" + +#: 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) nach bhfuil ar fáil mar sprioctheanga ó %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Ní féidir téacs a aistriú: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Comhaid aistriúcháin atá faoi mhíchumas ar an bhfreastalaí." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Iarratas neamhbhailí: comhad folamh" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Iarratas neamhbhailí: formáid comhaid nach bhfuil tacaíocht" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Ainm comhaid neamhbhailí" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Díchumasaítear moltaí ar an bhfreastalaí seo." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Béarla" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "An Albáinis" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Araibis" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "An Asarbaiseáin" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Beangáilis" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgáiris" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalóinis" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Sínis" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Sínis (traidisiúnta)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Seiceach" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danmhairgis" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Ollainnis" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Eastóinis" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Fionlainnis" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Fraincis" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Gearmáinis" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Gréigis" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Eabhrais" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hiondúis" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ungáiris" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indinéisis" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Gaeilge" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Iodálach" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Seapánach" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Cóiréis" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Laitvis" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Liotuáinis" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malaeis" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Ioruais" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Peirsis" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polainnis" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portaingéilis" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portaingéilis (an Bhrasaíl)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rómáinis" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rúisis" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slóvaicis" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slóivéinis" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spáinnis" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Sualainnis" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagálaigis" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Téalainnis" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Tuircis" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Úcráinis" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdais" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "An tSeirbia" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Bláthanna cumhra: cumhráin" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vítneaimis Víneaimis" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Aisghabh liosta de na teangacha a dtacaítear leo" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Liosta teangacha" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "aistrigh" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Aistrigh téacs ó theanga go teanga eile" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Téacs Aistrithe" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Iarratas neamhbhailí" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Earráid aistriúcháin" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Go mall" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Cosc" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Dia duit domhan!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Téacs(í) le haistriú" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Cód teanga foinse" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Cód teanga sprice" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "téacs" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formáid an téacs foinseach:\n" +" * `téacs` - Gnáth-théacs\n" +" * `html` - marcáil HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "An líon rogha aistriúcháin mhalartacha" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Eochair API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Aistrithe comhad ó theanga go ceann eile" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Aistrithe comhad" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Comhad le haistriú" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Braith teanga téacs amháin" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Brathanna" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Earráid braite" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Téacs le brath" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Aisghabh sainsocruithe tosaigh" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "socruithe ceann tosaigh" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "ceann tosaigh" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Cuir isteach moladh chun aistriúchán a fheabhsú" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Rath" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Gan údar" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Téacs bunaidh" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Aistriúchán molta" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Teanga an bhuntéacs" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Teanga an aistriúcháin molta" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "aiseolas" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Cód teanga" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Ainm teanga inléite ag an duine (i mBéarla)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Cóid sprioctheanga tacaithe" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Téacs(í) traslatáilte" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Teachtaireacht Earráid" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Cúis le mall síos" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL comhad aistrithe" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Luach muiníne" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Teorainn ionchuir charachtair don teanga seo (ní léiríonn -1 aon teorainn)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Teorainn ama aistriúcháin tosaigh" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Cibé an bhfuil an bunachar sonraí eochair API cumasaithe." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Cibé an bhfuil eochair API ag teastáil." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Cibé an bhfuil moltaí a chur isteach ar chumas." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Formáid comhaid Tacaithe" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Cibé an raibh aighneacht rathúil" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Téacs Cóip" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Ní féidir ualach %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Earráid anaithnid" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Cóipeáladh" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Go raibh maith agat as do cheartú. Tabhair faoi deara nach mbeidh an " +"moladh i bhfeidhm ar shiúl." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Níl aon teangacha ar fáil. An raibh tú a shuiteáil na samhlacha i gceart?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Clóscríobh isteach d'Eochair API. Má tá eochair API uait, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "brúigh an nasc \"Get API Key\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "déan teagmháil le hoibreoir an fhreastalaí." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API Aistriú Meaisín Foinse Oscailte saor in aisce" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 Aistriú Meaisín Foinse Oscailte saor in aisce. Féin-óstach, as líne " +"in ann agus éasca le socrú. Rith do fhreastalaí API féin i gceann cúpla " +"nóiméad." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "aistriúchán" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Faigh Eochair API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Socraigh Eochair API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Athrú teanga" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Cuir in eagar" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Scoránaigh mód dorcha/solas" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Díbhe" + +#: 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 "" +"Mar gheall ar mhí-úsáid bot, tá iarratais aistriúcháin teoranta go sealadach " +"d'úsáideoirí a bhfuil eochair API bailí acu. Gabh mo leithscéal as an " +"míchaoithiúlacht!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Aistriúchán API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Aistrigh Téacs" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Aistrigh Comhaid" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Aistrigh ó" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Babhtáil foinse agus sprioctheangacha" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Aistrigh isteach" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Téacs a aistriú" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Scrios téacs" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Mol aistriúcháin" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Cealaigh" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Seol" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formáidí comhaid tacaithe:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Comhad" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Bain comhad" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Aistrigh" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Íoslódáil" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Iarratas" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Freagra" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API Aistriú Meaisín Foinse Oscailte" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Féin-Óstach. As Líne In ann. Éasca le Socrú." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Ceadúnas:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Déanta le %(heart)s ag %(contributors)s agus arna chumhachtú ag %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Rannpháirtithe" + +#~ msgid "multipart/form-data" +#~ msgstr "ilpháirt / form-sonraí" + +#~ msgid "Vietnamese" +#~ msgstr "Vítneaimis Víneaimis" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Ba cheart an API poiblí seo a " +#~ "úsáid le haghaidh tástála, úsáide " +#~ "pearsanta nó go minic. Má tá tú" +#~ " ag dul a reáchtáil iarratas i " +#~ "dtáirgeadh, le do thoil %(host_server)s " +#~ "nó %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "óstach do fhreastalaí féin" + +#~ msgid "get an API key" +#~ msgstr "a fháil eochair API" + +#~ msgid "Basque" +#~ msgstr "Taiseachas aeir: fliuch" + +#~ msgid "Galician" +#~ msgstr "Riachtanais uisce: measartha" diff --git a/self_host/LibreTranslate/libretranslate/locales/ga/meta.json b/self_host/LibreTranslate/libretranslate/locales/ga/meta.json new file mode 100644 index 00000000..89711ed6 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ga/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Irish", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/gd/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/gd/LC_MESSAGES/messages.po new file mode 100644 index 00000000..f2942867 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/gd/LC_MESSAGES/messages.po @@ -0,0 +1,758 @@ +# Scottish Gaelic translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.2\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-06-16 10:01+0000\n" +"Last-Translator: GunChleoc \n" +"Language-Team: Gaelic \n" +"Language: gd\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " +"(n > 2 && n < 20) ? 2 : 3;\n" +"X-Generator: Weblate 5.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Fòrmat JSON mì-dhligheach" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Fèin-mhothaich" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Gun chead" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Chuirear cus iarrtasan thar na tha ceadaiche" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Iuchair API mhì-dhligheach" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Cuir fios gu obraiche an fhrithealaiche airson iuchair API fhaighinn" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Tadhail air %(url)s a dh’fhaighinn iuchair API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Maille:" + +#: 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 "Iarrtas mì-dhligheach: tha am paramadair %(name)s a dhìth" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Iarrtas mì-dhligheach: chan eil am paramadair %(name)s ’na àireamh" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Iarrtas mì-dhligheach: feumaidh am paramadair %(name)s a bhith <= " +"%(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Iarrtas mì-dhligheach: tha teacsa an iarrtais (%(size)s) thair na crìche " +"de (%(limit)s)" + +#: 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 "Chan eil taic ri %(lang)s" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Chan eil taic ris an fhòrmat %(format)s" + +#: 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 "" +"Chan eil %(tname)s (%(tcode)s) ri fhaighinn ’na chànan-amais o %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Chan urrainn dhuinn an teacsa seo eadar-theangachadh: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Tha eadar-theangachaidh fhaidhlichean à comas air an frithealaiche seo." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Iarrtas mì-dhligheach: faidhle falamh" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Iarrtas mì-dhligheach: Cha chuir sinn taic ri fòrmat an fhaidhle" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Ainm faidhle mì-dhligheach" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Tha molaidhean à comas air an frithealaiche seo." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Beurla" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albàinis" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabais" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Asarbaideànais" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Beangailis" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgarais" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalanais" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Sìnis" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Sìnis (thradaiseanta)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Seicis" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danmhairgis" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Duitsis" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Eastoinis" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Fionnlannais" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Fraingis" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Gearmailtis" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Greugais" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Eabhra" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindis" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ungairis" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Innd-Innsis" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Gaeilge" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Eadailtis" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Seapanais" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Coirèanais" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Laitbheis" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Liotuainis" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malaidhis" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Nirribhis" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Pearsais" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Pòlainnis" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portagailis" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romàinis" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ruisis" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slòbhacais" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slòbhainis" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spàinntis" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Suainis" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tàidh" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turcais" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Ùrdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Sèirbis" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ucràinis" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Bhiet-Namais" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Faigh liosta nan cànan ris a bheil taic" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Liosta nan cànan" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "eadar-theangaich" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Eadar-theangaich teacsa on dàrna cànan gun chànan eile" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Teacsa air eadar-theangachadh" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Iarrtas mì-dhligheach" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Mearachd eadar-theangachaidh" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Maille" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Toirmeasg" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Shin thu, a shaoghail!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Teacsa no dhà ri eadar-theangachadh" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Còd a’ chanain thùsail" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Còd a’ chanain-amais" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "teacsa" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Fòrmat teacsa an tùis:\n" +" * `text` – Teacsa lom\n" +" * `html` – Markup HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "An àireamh as fheàrr de roghainnean eadar-theangachaidh" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Iuchair API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Eadar-theangaich faidhle on dàrna cànan gun chànan eile" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Faidhle air eadar-theangachadh" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Am faidhle ri eadar-theangachadh" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Mothaich do chànan aon teacsa" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Mothachaidhean" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Mearachd mothachaidh" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "An teacsa ri mhothachadh" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Faigh roghainnean sònraichte a’ frontend" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "roghainnean a’ frontend" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Cuir a-null moladh airson piseach a thoirt air eadar-theangachadh" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Chaidh leis" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Gun ùghdarrachadh" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "An teacsa tùsail" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "An t-eadar-theangachadh ’ga mholadh" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Cànan an teacsa thùsail" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Cànan an eadar-theangachaidh ’ga mholadh" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "beachd thugainn" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Còd a’ chànain" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Ainm a’ chànain a leughas daoine (sa Bheurla)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Còdan canain-amais ris a chuir sinn taic" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Teacsa(ichean) air eadar-theangachadh" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Teachdaireachd na mearachd" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Adhbhar na maille" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL an fhaidhle air eadar-theangachadh" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Luach na h-earbsa" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Crìoch ion-chur charactaran dhan chànan seo (innsidh -1 nach bi crìoch " +"air)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Crìoch-ùine eadar-theangachadh a’ frontend" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Co-dhiù a bheil stòr-dàta nan iuchraichean API an comas gus nach eil." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Co-dhiù a bheil feum air iuchair API gus nach eil." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Co-dhiù a bheil cur a-null mholaidhean an comas gus nach eil." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Fòrmatan faidhle ris a bheil taic" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Co-dhiù an do shoirbhich leis a’ cur a-null gus nach do shoirbhich" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Dèan lethbhreac dhen teacsa" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Cha ghabh %(url)s a luchdadh" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Mearachd nach aithne dhuinn" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Chaidh lethbhreac dheth a dhèanamh" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Mòran taing airson do cheartachadh. Thoir an aire nach bi am moladh an " +"sàs sa bhad." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Cha eil cànan ri fhaighinn. An do stàlaich thu na modailean mar bu chòir?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Cuir a-steach an iuchair API agad. Ma tha iuchair API a dhìth ort, " +"%(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "brùth air a’ cheangal “Faigh iuchair API”." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "cuir fios gu obraiche an fhrithealaiche." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API saor airson eadar-theangachadh inneil le bun-tùs fosgailte" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 saor airson eadar-theangachadh inneil le bun-tùs fosgailte. " +"Òstaichidh tu fhèin is cleachdaidh far loidhne thu e is tha e furasta a " +"shuidheachadh." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "eadar-theangachadh" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Docamaideadh an API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Faigh iuchair API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Suidhich iuchair API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Atharraich an cànan" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Deasaich" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Toglaich am modh dorcha/soilleir" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Leig seachad" + +#: 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 eadar-theangachaidh" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Eadar-theangaich teacsa" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Eadar-theangaich faidhlichean" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Eadar-theangaich o" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Cuir na cànanan tùsail is ri eadar-theangachadh an àite a chèile" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Eadar-theangaich gu" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "An teacsa ri eadar-theangachadh" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Sguab às an teacsa" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Mol eadar-theangachadh" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Sguir dheth" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Cuir" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Fòrmatan faidhle ris a chuir sinn taic:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Faidhle" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Thoir am faidhle air falbh" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Eadar-theangaich" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Luchdaich a-nuas" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Iarrtas" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Freagairt" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API airson eadar-theangachadh inneil le bun-tùs fosgailte" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Òstaich thu fhèin e. Comas far loidhne. Furasta a shuidheachadh." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Ceadachas:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"Chaidh a dhèanamh le %(heart)s le %(contributors)s ’s le cumhachd " +"%(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Co-thabhartaichean %(libretranslate)s" + +#~ msgid "Basque" +#~ msgstr "Basgais" + +#~ msgid "Galician" +#~ msgstr "Gailìsis" diff --git a/self_host/LibreTranslate/libretranslate/locales/gd/meta.json b/self_host/LibreTranslate/libretranslate/locales/gd/meta.json new file mode 100644 index 00000000..67ea3784 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/gd/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Scottish Gaelic", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/gl/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/gl/LC_MESSAGES/messages.po new file mode 100644 index 00000000..9c6a8e73 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/gl/LC_MESSAGES/messages.po @@ -0,0 +1,775 @@ +# Galician translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-20 10:36+0000\n" +"Last-Translator: xuars \n" +"Language-Team: Galician \n" +"Language: gl\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.11.1-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Formato JSON non válido" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Auto Detección" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Non autorizado" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Demasiadas peticións por enriba do límite" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Chave API non válida" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Contacte coa xerencia do servidor para obter unha chave da API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Visite %(url)s para obter unha chave API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Máis amodo:" + +#: 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 "Solicitude non válida: falta o parámetro %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Solicitude inválida: 0 0 O parámetro non é un número. %(name)s" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Solicitude inválida: 0 0 O parámetro debe ser <= %(value)s " +"%(name)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Solicitude non válida: solicitude (%(size)s) supera o límite de texto " +"(%(limit)s)" + +#: 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 "Non hai soporte para %(lang)s" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Non hai soporte para o formato %(format)s" + +#: 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 non está dispoñible como idioma a traducir desde " +"%(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Non se pode traducir: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "A tradución de ficheiros está desactivada neste servidor." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Solicitude non válida: ficheiro baleiro" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Solicitude non válida: o formato do ficheiro non está soportado" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nome de ficheiro non válido" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "As suxestións están desactivadas neste servidor." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Inglés" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanés" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Árabe" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Acerbaixano" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengalí" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalán" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Chinés" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "China (tradicional)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Checo" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dinamarqués" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Neerlandés" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estoniano" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finés" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francés" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Alemán" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grego" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebreo" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Húngaro" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesio" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandés" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiano" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Xaponés" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Coreano" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Letón" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituano" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malaio" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Noruega" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Farsi" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polaco" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugués" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugués (Brasil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romanía" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ruso" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Eslovaco" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Esloveno" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Español" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Sueco" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tailandés" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turco" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ucraniano" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbio" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ucraíno" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnam" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Obter lista dos idiomas soportados" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lista de idiomas" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "traducir" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Traducir texto dun idioma a outro" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Texto traducido" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Solicitude non válida" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Erro na tradución" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Máis amodo" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Vetado" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Ola mundo!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Texto(s) a traducir" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Código de idioma da fonte" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Código de idioma do obxectivo" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "texto" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formato do texto fonte:\n" +" * `text`- Texto plano\n" +" * `html`- Marcado HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Número de traduccións alternativas" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Chave API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Traducir un ficheiro dun idioma a outro" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Ficheiro traducido" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Ficheiro a traducir" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detectar idioma dun único texto" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Deteccións" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Erro na detección" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Texto a detectar" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Obter axustes específicos da interface" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "axustes da interface" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "interface" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Enviar unha suxestión para mellorar a tradución" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Correcto" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Non autorizado" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Texto orixinal" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Tradución suxerida" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Idioma do texto orixinal" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Idioma da tradución suxerida" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "opinión" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Código de idioma" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nome do idioma en formato lexible (en Inglés)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Códigos de idioma obxectivo soportados" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Texto(s) traducido(s)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Mensaxe de erro" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Motivo da ralentización" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL do ficheiro traducido" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Valor de fiabilidade" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Límite de caracteres de entrada par este idioma (-1 significa sen límite)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Marxe temporal para a tradución na interface" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Se a base de datos de chaves API está activada." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Se é precisa unha chave API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Se está activado o envío de suxestións." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Formatos de ficheiro soportados" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Se o envío foi correcto" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Copiar texto" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Non se cargou %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Erro descoñecido" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Copiado" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Grazas pola túa corrección. Ten en conta que a suxestión non ten efectos " +"inmediatos." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Sen idiomas dispoñibles. Instalaches os módulos correctamente?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Escribe a túa Chave API. Se precisas unha Chave API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "preme na ligazón \"Obter Chave API\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "contacta coa xerencia do servidor." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API da Tradución por Máquina de código Libre e Aberto" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 da Tradución por Máquina de código Libre e Aberto. Auto-Hospedado, " +"doado de instalar e sen precisar conexión. Executa o teu propio servidor " +"API en só uns minutos." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "tradución" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Docs da API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Obter Chave API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Establecer Chave API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Cambiar de Idioma" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Editar" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Modo escuro/luz" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Desbotar" + +#: 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 "" +"Debido ao abuso de bots, as peticións de traducións están temporalmente " +"limitadas a usuarios cunha clave API válida. Perdón polas molestias!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API de tradución" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Traducir Texto" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Traducir Ficheiros" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Traducir desde" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Intercambiar idiomas de orixe e obxectivo" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Traducir ao" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Texto a traducir" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Eliminar texto" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Suxerir tradución" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Cancelar" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Enviar" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formatos de ficheiro soportados:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Ficheiro" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Eliminar ficheiro" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Traduce" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Descargar" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Solicitar" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Resposta" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API de Tradución por Máquina de Código Aberto" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Auto-Hospedado. Sen Conexión. Doado de Configurar." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licenza:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Feito con %(heart)s por %(contributors)s e grazas a %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Colaboradoras de %(libretranslate)s" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamita" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Esta API pública só debe ser " +#~ "utilizada para probas, de xeito personal" +#~ " e pouco frecuente. Se vas a " +#~ "usar unha aplicación en produción, por" +#~ " favor %(host_server)s ou %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "instala o teu propio servidor" + +#~ msgid "get an API key" +#~ msgstr "obtén unha chave API" + +#~ msgid "Basque" +#~ msgstr "Vasco" + +#~ msgid "Galician" +#~ msgstr "Galego" diff --git a/self_host/LibreTranslate/libretranslate/locales/gl/meta.json b/self_host/LibreTranslate/libretranslate/locales/gl/meta.json new file mode 100644 index 00000000..2317495e --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/gl/meta.json @@ -0,0 +1,4 @@ +{ + "name": "gl", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/he/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/he/LC_MESSAGES/messages.po new file mode 100644 index 00000000..c2cf9f1a --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/he/LC_MESSAGES/messages.po @@ -0,0 +1,763 @@ +# Hebrew translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-03-02 13:39+0000\n" +"Last-Translator: Yaron Shahrabani \n" +"Language-Team: Hebrew \n" +"Language: he\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "תבנית ה־JSON שגויה" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "זיהוי אוטומטי" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "לא מורשה" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "יותר מדי הפרות מגבלות בקשות" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "מפתח API שגוי" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "נא ליצור קשר עם מפעילי השרת כדי לקבל מפתח API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "נא לגשת אל %(url)s כדי להשיג מפתח API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "האטה:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "בקשה שגויה: המשתנה %(name)s הוא לא מספר" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "בקשה שגויה:המשתנה %(name)s חייב להיות קטן או שווה ל־%(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "התבנית %(format)s לא נתמכת" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "לא ניתן לתרגם טקסט: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "תרגום קבצים מוגבל בשרת זה." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "בקשה שגויה: קובץ ריק" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "בקשה שגויה: תסדיר קובץ לא נתמך" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "שם הקובץ שגוי" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "הצעות מושבתות בשרת זה." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "אנגלית" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "אלבנית" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "ערבית" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "אזרית" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "בנגלית" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "בולגרית" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "קטאלונית" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "סינית" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "סינית מסורתית" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "צ׳כית" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "דנית" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "הולנדית" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "אספרנטו" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "אסטונית" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "פינית" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "צרפתית" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "גרמנית" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "יוונית" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "עברית" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "הינדי" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "הונגרית" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "אינדונזית" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "אירית" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "איטלקית" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "יפנית" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "קוריאנית" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "לטבית" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "ליטאית" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "מלאית" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "נורבגית" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "פרסית" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "פולנית" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "פורטוגלית" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "פורטוגזית (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "רומנית" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "רוסית" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "סלובקית" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "סלובנית" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "ספרדית" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "שוודית" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "טאגאלוג" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "תאית" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "טורקית" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "אוקראה" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "אורדו" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "סרבית" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "אוקראינית" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "וייטנאמית" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "משיכת רשימת השפות הנתמכות" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "רשימת השפות" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "תרגום" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "תרגום טקסט משפה אחת לאחרת" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "הטקסט המתורגם" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "בקשה שגויה" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "שגיאת תרגום" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "האטה" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "חסום" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "שלום עולם!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "טקסט(ים) לתרגום" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "קוד שפת המקור" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "קוד שפת היעד" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "טקסט" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"תבנית טקסט מקור:\n" +"„טקסט” - טקסט רגיל\n" +"„html” - קוד HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "מספר מועדף של תרגומים חלופיים" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "מפתח API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "תרגום קובץ משפה אחת לאחרת" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "הקובץ המתורגם" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "קובץ לתרגום" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "זיהוי השפה של טקסט בודד" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "זיהויים" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "שגיאת זיהוי" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "טקסט לזיהוי" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "משיכת הגדרות נקודתיות למנשק משתמש" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "הגדרות מנשק משתמש" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "מנשק משתמש" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "הגשת הצעה לשיפור תרגום" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "הצליח" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "לא מורשה" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "טקסט מקורי" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "תרגום מוצע" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "שפת הטקסט המקורי" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "שפת התרגום המוצע" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "משוב" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "קוד שפה" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "שם שפה לקריאה אנושית (באנגלית)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "קוד שפת היעד" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "תרגום טקסט(s)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "הודעת שגיאה" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "סיבה להאט" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "קובץ url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "ערך אמון" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "הגבלת קלט תווים לשפה זו (-1 לא מצביעה על גבול)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "זמן תרגום מיידי" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "בין אם מסד הנתונים מפתח API מופעל." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "בין אם נדרש מפתח API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "בין אם ניתן להגיש הצעות." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "פורמט קבצים נתמך" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "אם ההגשה הייתה מוצלחת" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "העתק טקסט" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "לא ניתן לטעון את %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "טעות לא ידועה" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "שוטרים" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "תודה על התיקון שלך. שימו לב שההצעה לא תיכנס לתוקף מיד." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "אין שפות זמינות. האם התקנת נכון את המודלים?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "לחצו על הקישור \"Get API Key\"." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Free and Open Source Machine" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Free and Open Source Machine Translation API עוין עצמי, לא מקוון מסוגל וקל " +"להגדרה. הפעילו את שרת ה- API שלכם תוך מספר דקות בלבד." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "תרגום התרגום" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "קבלת מפתח API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "הגדר מפתח API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "שינוי השפה" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Editעריכה" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "מצב כהה/אור" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "משמעת" + +#: 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 "" +"בשל התעללות בבוט, בקשות התרגום מוגבלות באופן זמני למשתמשים עם מפתח API תקף. " +"סליחה על אי הנוחות!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "תרגום API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "תרגום טקסט" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "תרגום קבצים" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "תרגום" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "מקור ושפת היעד" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "לתרגם" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "טקסט לתרגם" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "למחוק טקסט" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "הצעות תרגום" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "ביטול" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "שלח" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "פורמטי קבצים תומכים:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "File" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "הסרת קובץ" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "תרגום" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "הורד Download" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "בקשה" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "תגובה" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "קוד פתוח תרגום API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "חופשי להורדה. תואם להפעלה בלי אינטנרנט. קל להגדרה." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "רישיון:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "מיוצר עם %(heart)s על ידי %(contributors)s ומופעל על ידי %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "תורמי %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "וייטנאם" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "ממשק API ציבורי זה משמש לבדיקה, שימוש אישי או בלתי צפוי בלבד. אם אתה הולך " +#~ "להפעיל יישום בסביבת פעילות מלאה, בבקשה %(host_server)s או %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "מארח את השרת שלך" + +#~ msgid "get an API key" +#~ msgstr "מפתח API" + +#~ msgid "Basque" +#~ msgstr "בסקית" + +#~ msgid "Galician" +#~ msgstr "גליסית" diff --git a/self_host/LibreTranslate/libretranslate/locales/he/meta.json b/self_host/LibreTranslate/libretranslate/locales/he/meta.json new file mode 100644 index 00000000..3cc0c1b1 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/he/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Hebrew", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/hi/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/hi/LC_MESSAGES/messages.po new file mode 100644 index 00000000..7c5dfe41 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/hi/LC_MESSAGES/messages.po @@ -0,0 +1,775 @@ +# Hindi translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-05-16 03:46+0000\n" +"Last-Translator: Chaitanya Pandey \n" +"Language-Team: Hindi \n" +"Language: hi\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.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "अमान्य JSON प्रारूप" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "ऑटो डिटेक्ट करें" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "अनधिकृत" + +#: libretranslate/app.py:329 +#, fuzzy +msgid "Too many request limits violations" +msgstr "बहुत से सीमा उल्लंघन अनुरोध" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "अमान्य API कुंजी" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "API कुंजी प्राप्त करने के लिए कृपया सर्वर ऑपरेटर से संपर्क करें" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "API कुंजी प्राप्त करने के लिए %(url)s पर जाएं" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "गति कम करो:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "अमान्य अनुरोध: %(name)s पैरामीटर संख्या नहीं है" + +#: libretranslate/app.py:669 +#, fuzzy, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "अमान्य अनुरोध: %(name)s पैरामीटर <= %(value)s होना चाहिए" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s प्रारूप समर्थित नहीं है" + +#: 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 (d)%(tcode)s) से लक्ष्य भाषा के रूप में उपलब्ध नहीं है %(sname)s " +"(d)%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "पाठ का अनुवाद नहीं कर सकते: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "इस सर्वर पर फ़ाइलें अनुवाद अक्षम हैं।।" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "अमान्य अनुरोध: खाली फ़ाइल" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "अमान्य अनुरोध: फ़ाइल प्रारूप समर्थित नहीं है" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "अमान्य फ़ाइलनाम" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "इस सर्वर पर सुझाव अक्षम हैं।." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "अंग्रेज़ी" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "अल्बानियाई" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "अरबी" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "अज़रबैजानी" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "बंगाली" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "बल्गेरियन" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "कैटलन" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "चीनी" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "चीनी (पारंपरिक)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "चेक" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "डैनिश" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "डच" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "एस्पेरांतो" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "एस्टोनियाई" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "फिनिश" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "फ्रेंच" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "जर्मन" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "यूनानी" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "हिब्रू" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "हिन्दी" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "हंगेरियन" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "इंडोनेशिया" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "आयरिश" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "इतालवी" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "जापानी" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "कोरियाई" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "लातवियाई" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "लेबनान" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "मलय" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "नॉर्वे" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "फ़ारसी" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "पोलिश" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "पुर्तगाली" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "पुर्तगाली (ब्राज़ील)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "रोमानियाई" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "रूसी" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "स्लोवाक" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "स्लोवेनियाई" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "स्पेनिश" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "स्वीडिश" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "टैगलॉग" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "थाई" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "तुर्की" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "यूक्रेनी" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "उर्दू" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "सर्बियाई" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "यूक्रेनियन" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "वियतनामी" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "समर्थित भाषाओं की सूची पुनर्प्राप्त करें" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "भाषाओं की सूची" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "अनुवाद" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "पाठ को एक भाषा से दूसरे में अनुवाद करें" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "अनुवादित पाठ" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "अमान्य अनुरोध" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "अनुवाद त्रुटि" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "गति कम करो" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "प्रतिबंधित" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "नमस्ते दुनिया!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "अनुवाद करने के लिए पाठ" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "स्रोत भाषा का कोड" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "लक्ष्य भाषा का कोड" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "पाठ" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"स्रोत पाठ का प्रारूप:\n" +" * `पाठ` - सादा पाठ\n" +" * `html` - HTML मार्कअप\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "वैकल्पिक अनुवादों की पसंदीदा संख्या" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API कुंजी" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "किसी भाषा से किसी अन्य भाषा में फ़ाइल ट्रांसलेट करें" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "अनुवादित फाइल" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "अनुवाद करने के लिए फाइल" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "एकल पाठ की भाषा का पता लगाएं" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "जांच" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "जांच त्रुटि" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "डिटेक्ट करने के लिए पाठ" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Frontend विशिष्ट सेटिंग्स पुनर्प्राप्त करें" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "Frontend सेटिंग्स" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "Frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "अनुवाद को बेहतर बनाने के लिए सुझाव देना" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "सफलता" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "अधिकृत नहीं" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "मूल पाठ" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "सुझाया गया अनुवाद" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "मूल पाठ की भाषा" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "सुझाए गए अनुवाद की भाषा" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "प्रतिक्रिया" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "भाषा कोड" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "मानव पठनीय भाषा का नाम (अंग्रेजी में)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "समर्थित लक्ष्य भाषा कोड" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "अनुवादित पाठ(ओं)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "त्रुटि संदेश" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "गति धीमी होने का कारण" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "अनुवादित फ़ाइल url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "आत्मविश्वास मूल्य" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "इस भाषा के लिए चरित्र इनपुट सीमा (-1 इंगित करता है कि कोई सीमा नहीं)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Frontend अनुवाद टाइमआउट" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "क्या API कुंजी डेटाबेस सक्षम है।।" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "क्या एक API कुंजी की आवश्यकता है।।" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "क्या सुझाव देना संभव है।." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "समर्थित फाइलें प्रारूप" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "क्या सबमिशन सफल रहा" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "पाठ कॉपी करें" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "%(url)s लोड नहीं किया जा सकता" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "अज्ञात त्रुटि" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "कॉपी किया गया" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"आपके सुधार के लिए धन्यवाद। ध्यान दें कि सुझाव तुरंत प्रभावी नहीं होगा।." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" +"कोई भाषा उपलब्ध नहीं है। क्या आप मॉडल को सही ढंग से स्थापित कर सकते हैं?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "\"API कुंजी प्राप्त करें\" लिंक दबाएं।" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "मुफ़्त और मुक्त स्रोत मशीन अनुवाद API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 सर्वर चलाएं।" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "अनुवाद" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API दस्तावेज़" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "API प्राप्त करें कुंजी" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "API सेट कुंजी" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "भाषा बदलें" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "संपादित करें" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "टॉगल डार्क / लाइट मोड" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "खारिज" + +#: 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:186 +msgid "Translate Text" +msgstr "पाठ अनुवाद" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "फ़ाइलें अनुवाद" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "से अनुवाद करें" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "स्रोत और लक्ष्य भाषाओं की अदला-बदली करें" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "में अनुवाद" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "अनुवाद करने के लिए पाठ" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "पाठ हटाएँ" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "अनुवाद सुझाएँ" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "रद्द करें" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "भेजें" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "समर्थित फ़ाइल प्रारूप:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "फ़ाइल" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "फ़ाइल निकालें" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "अनुवाद" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "डाउनलोड" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "अनुरोध" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "जवाब" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "ओपन सोर्स मशीन अनुवाद API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "स्व-होस्टेड। ऑफलाइन सक्षम। सेटअप करने में आसान।." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "लाइसेंस:" + +#: 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:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s योगदानकर्ता" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "वियतनामी" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "इस सार्वजनिक API का उपयोग परीक्षण, व्यक्तिगत या गलत उपयोग के लिए किया जाना " +#~ "चाहिए। यदि आप उत्पादन में आवेदन चला रहे हैं, तो कृपया ध्यान दें। " +#~ "%(host_server)s या %(get_api_key)s।" + +#~ msgid "host your own server" +#~ msgstr "अपने सर्वर को होस्ट करें" + +#~ msgid "get an API key" +#~ msgstr "API कुंजी प्राप्त करें" + +#~ msgid "Basque" +#~ msgstr "बास्क" + +#~ msgid "Galician" +#~ msgstr "गैलिशियन" diff --git a/self_host/LibreTranslate/libretranslate/locales/hi/meta.json b/self_host/LibreTranslate/libretranslate/locales/hi/meta.json new file mode 100644 index 00000000..4c1fbaea --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/hi/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Hindi", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/hu/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/hu/LC_MESSAGES/messages.po new file mode 100644 index 00000000..556304cf --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/hu/LC_MESSAGES/messages.po @@ -0,0 +1,783 @@ +# Hungarian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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 \n" +"Language-Team: Hungarian \n" +"Language: hu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.11.1-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Érvénytelen JSON formátum" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Automatikus felismerés" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Nincs jogosultsága" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Túl sok kérelem határértéke elérve" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Érvénytelen API-kulcs" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" +"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: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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Érvénytelen kérés: a(z) %(name)s paraméter nem egy szám" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Érvénytelen kérés: a(z) %(name)s paraméternek a következőnek kell lennie:" +" %(value)s" + +#: 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(z) (%(limit)s) " +"szövegkorlátot" + +#: 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 "a(z) %(lang)s nyelv nem támogatott" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "a(z) %(format)s formátum nem támogatott" + +#: 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 a következőből: " +"%(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "A következő szöveg nem fordítható: %(text)s" + +#: 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:889 +msgid "Invalid request: empty file" +msgstr "Érvénytelen kérés: a fájl üres" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Érvénytelen kérés: a fájlformátum nem támogatott" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Érvénytelen fájlnév" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "A javaslatok ki vannak kapcsolva ezen a kiszolgálón." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Angol" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albán" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arab" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbajdzsáni" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengáli" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bolgár" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalán" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Kínai" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kínai (hagyományos)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Cseh" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dán" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holland" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Eszperantó" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Észt" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finn" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francia" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Német" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Görög" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Héber" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Magyar" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonéz" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Ír" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Olasz" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japán" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreai" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Lett" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litván" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Maláj" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norvég" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Perzsa" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Lengyel" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugál" + +#: 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:36 +msgid "Russian" +msgstr "Orosz" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Szlovák" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Szlovén" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spanyol" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Svéd" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thai" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Török" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrán" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Szerb" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrán" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnámi" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "A támogatott nyelvek listájának lekérése" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Nyelvek listája" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "fordítás" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Szöveg fordítása az egyik nyelvről a másikra" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Lefordított szöveg" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Érvénytelen kérés" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Fordítási hiba" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Lassabban" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Tiltott" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Hello világ!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Lefordítandó szöveg(ek)" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Forrásnyelv kódja" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Célnyelv kódja" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "szöveg" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"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 "Az alternatív fordítások előnyben részesített száma" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-kulcs" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Fájl fordítása az egyik nyelvről a másikra" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Lefordított fájl" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fájl lefordítása" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Egyetlen szöveg nyelvének felismerése" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Felismerések" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Felismerési hiba" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Felismerendő szöveg" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Előtétprogram-specifikus beállítások lekérése" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "előtétprogram-beállítások" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "előtétprogram" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Küldjön javaslatot egy fordítás javításához" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Siker" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Nem engedélyezett" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Eredeti szöveg" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Javasolt fordítás" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Az eredeti szöveg nyelve" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "A javasolt fordítás nyelve" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "visszajelzés" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Nyelvkód" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Emberi olvasható nyelv neve (angolul)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Támogatott célnyelvi kódok" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Lefordított szöveg(ek)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Hibaüzenet" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "A lelassulás oka" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Lefordított fájl webcíme" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Megbízhatósági érték" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Karakterbeviteli korlát ezen a nyelven (-1 azt jelenti, hogy nincs korlát)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +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 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 "Független attól, hogy az API-kulcs szükséges-e." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Független attól, hogy engedélyezve van-e a javaslatok beküldése." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Támogatott fájlformátum" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +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 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Szöveg másolása" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(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 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Ismeretlen hiba" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Másolva" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Köszönöm a helyesbítést. Vegye figyelembe, hogy a javaslata nem fog " +"azonnal hatályba lépni." + +#: libretranslate/templates/app.js.template:463 +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: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, tekintse meg a " +"következőt: %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "kattintson az „API-kulcs beszerzése” hivatkozásra." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "lépjen kapcsolatba a kiszolgáló üzemeltetőjével." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: 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" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"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 a saját API-kiszolgálóját" +" néhány perc alatt." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "fordítás" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API-dokumentáció" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "API-kulcs beszerzése" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "API-kulcs beállítása" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Nyelv módosítása" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Szerkesztés" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Váltás sötét/világos módra" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Elvetés" + +#: 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:186 +msgid "Translate Text" +msgstr "Szöveg fordítása" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Fájlok fordítása" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Fordítás erről:" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Forrás és célnyelv felcserélése" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Fordítás erre:" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Fordítandó szöveg" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Szöveg törlése" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Fordítás javaslása" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Mégse" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Küldés" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Támogatott fájlformátumok:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fájl" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Fájl eltávolítása" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Fordítás" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Letöltés" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Kérés" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Válasz" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Nyílt forráskódú gépi fordító API" + +#: 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:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licenc:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "%(heart)s-vel készítik a %(contributors)s és az %(engine)s támogatja" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s közreműködői" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnami" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Ezt a nyilvános API-t tesztelésre, " +#~ "személyes vagy alkalmi használatra " +#~ "használandó. Amennyiben az alkalmazásod éles" +#~ " környezetben fogod használni úgy használd" +#~ " a %(host_server)s-t vagy %(get_api_key)s-t." + +#~ msgid "host your own server" +#~ msgstr "Hosztold a saját szervered" + +#~ msgid "get an API key" +#~ msgstr "API kulcs szerzése" + +#~ msgid "Basque" +#~ msgstr "Baszk" + +#~ msgid "Galician" +#~ msgstr "Galíciai" diff --git a/self_host/LibreTranslate/libretranslate/locales/hu/meta.json b/self_host/LibreTranslate/libretranslate/locales/hu/meta.json new file mode 100644 index 00000000..a7f59d99 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/hu/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Hungarian", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/id/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/id/LC_MESSAGES/messages.po new file mode 100644 index 00000000..f96817b0 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/id/LC_MESSAGES/messages.po @@ -0,0 +1,774 @@ +# Indonesian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-03-24 11:28+0000\n" +"Last-Translator: Erol Joudy Tooy \n" +"Language-Team: Indonesian \n" +"Language: id\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Format JSON tidak valid" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Deteksi Otomatis" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Tidak Diizinkan" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Melebihi batas permintaan yang diijinkan" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Kunci API tidak valid" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Silakan hubungi operator server untuk memperoleh kunci API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Kunjungi %(url)s untuk memperoleh kunci API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Perlahan:" + +#: 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 "Permintaan tidak valid: parameter %(name)s tidak ada" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Permintaan tidak valid: parameter %(name)s bukan berupa angka" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Permintaan tidak valid: parameter %(name)s harus <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Permintaan tidak valid: permintaan (%(size)s) melebihi batas teks " +"(%(limit)s)" + +#: 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 tidak didukung" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s format tidak didukung" + +#: 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) tidak tersedia sebagai bahasa target dari %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Tidak dapat menerjemahkan teks: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Terjemahan file dinonaktifkan di server ini." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Permintaan tidak valid: file kosong" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Permintaan tidak valid: format file tidak didukung" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nama file tidak valid" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Saran dinonaktifkan di server ini." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Bahasa Inggris" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Indonesia" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Bahasa Arab" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Bahasa Zerbaijani" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Login" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Login" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Login" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Bahasa Cina" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kitajka (traditional)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Bahasa Czech" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Bahasa Danish" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Bahasa Belanda" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Bahasa Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Login" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Bahasa Suomi" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Bahasa Perancis" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Bahasa Jerman" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Bahasa Yunani" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Bahasa Yahudi" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Bahasa India" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Bahasa Hungaria" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Bahasa Indonesia" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Bahasa Irlandia" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Bahasa Italy" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Bahasa Jepang" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Bahasa Korea" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Login" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Login" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Login" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Login" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Bahasa Persia" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Bahasa Polish" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugis" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugis (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Login" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rusia" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovak" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Login" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spanyol" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Swedia" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Login" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Login" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turki" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukraina" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Login" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Login" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Login" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Login" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Lihat daftar bahasa yang didukung" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Daftar bahasa" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "terjemahkan" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Terjemahkan teks dari bahasa ke bahasa lain" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Teks yang diterjemahkan" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Permintaan tidak valid" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Kesalahan terjemahan" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Pelan-pelan" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Diblokir" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Halo dunia!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Teks-teks untuk diterjemahkan" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Kode bahasa sumber" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Kode bahasa target" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "teks" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format teks sumber:\n" +"Sitemap\n" +"* `html` - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Sejumlah alternatif terjemahan" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Kunci API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Terjemahkan file dari bahasa ke bahasa lain" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "File yang diterjemahkan" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "File untuk diterjemahkan" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Mendeteksi bahasa teks tunggal" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Deteksi" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Kesalahan deteksi" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Teks untuk dideteksi" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Lihat pengaturan spesifik frontend" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "pengaturan frontend" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Kirim saran untuk meningkatkan terjemahan" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Berhasil" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Tidak sah" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Teks asli" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Terjemahan yang disarankan" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Bahasa teks asli" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Bahasa terjemahan yang disarankan" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "umpan balik" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Bahasa" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nama bahasa yang dapat dibaca manusia (dalam bahasa Inggris)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Mendukung kode bahasa target" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Teks yang telah diterjemahkan" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Pesan kesalahan" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Alasan untuk memperlambat" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Diterjemahkan url file" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Nilai kepercayaan" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Batas input karakter untuk bahasa ini (-1 menunjukkan tidak ada batasan)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Sitemap" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Apakah database kunci API diaktifkan." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Apakah kunci API diperlukan." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Apakah pengiriman saran diaktifkan." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Format file yang didukung" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Apakah pengajuan berhasil" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Fotokopi" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Tidak bisa memuat %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Kesalahan tidak diketahui" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Disalin" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Terima kasih atas koreksi Anda. Perhatikan saran tidak akan mengambil efek " +"segera." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" +"Tidak ada bahasa yang tersedia. Apakah Anda menginstal model dengan benar?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Ketikkan kunci API. Jika Anda memerlukan kunci API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "tekan tautan \"Get API Key\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "hubungi operator server." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API Translation API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Gratis dan Open Source Machine Translation API. Secara mandiri, offline " +"mampu dan mudah diatur. Jalankan server API Anda sendiri hanya dalam " +"beberapa menit." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "sitemap" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Documents" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Dapatkan Kunci API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Tetapkan Kunci API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Mengubah bahasa" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Sunting" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Mode gelap / ringan" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Tutup" + +#: 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 "" +"Karena penyalahgunaan bot, permintaan terjemahan terbatas pada pengguna " +"dengan kunci API yang valid. Maaf untuk ketidaknyamanan!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Terjemahkan Teks" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Terjemahkan File" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Terjemahkan dari" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Sumber swap dan bahasa target" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Terjemahkan ke" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Teks untuk diterjemahkan" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Hapus teks" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Sarankan terjemahan" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Batal" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Kirim" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Format file yang didukung:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "File" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Hapus file" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Terjemahkan" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Unduh" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Minta" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Respons" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API documentation" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Hosting mandiri. Bisa Offline. Mudah Disiapkan." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Lisensi:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"Dibuat dengan %(heart)s oleh %(contributors)s dan didukung oleh %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Kontributor %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnam" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "API publik ini harus digunakan untuk pengujian, penggunaan pribadi, atau " +#~ "jarang dipakai. Jika Anda akan menjalankan aplikasi dalam tahap produksi, " +#~ "silakan %(host_server)s atau %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "host server anda sendiri" + +#~ msgid "get an API key" +#~ msgstr "dapatkan kunci API" + +#~ msgid "Basque" +#~ msgstr "Login" + +#~ msgid "Galician" +#~ msgstr "Login" diff --git a/self_host/LibreTranslate/libretranslate/locales/id/meta.json b/self_host/LibreTranslate/libretranslate/locales/id/meta.json new file mode 100644 index 00000000..7b51b1af --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/id/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Indonesian", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/it/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/it/LC_MESSAGES/messages.po new file mode 100644 index 00000000..196c72b6 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/it/LC_MESSAGES/messages.po @@ -0,0 +1,776 @@ +# Italian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\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 \n" +"Language: it\n" +"Language-Team: Italian " +"\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Formato JSON non valido" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Rileva Automaticamente" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Non autorizzato" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Violazione da troppe richieste" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Chiave API non valida" + +#: 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:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Visita %(url)s per ottenere una chiave API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Rallenta:" + +#: 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: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: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: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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "il formato %(format)s non è supportato" + +#: 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) non è disponibile come lingua di destinazione da " +"%(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Non è possible tradurre il testo: %(text)s" + +#: 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:889 +msgid "Invalid request: empty file" +msgstr "Richiesta non valida: file vuoto" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Richiesta non valida: formato del file non supportato" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nome del file non valido" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "I suggerimenti sono disabilitati su questo server." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Inglese" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanese" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabo" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azero" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgaro" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalano" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Cinese" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Cinese (tradizionale)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Ceco" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danese" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Olandese" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estone" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finlandese" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francese" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Tedesco" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Greco" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Ebraico" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ungherese" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesiano" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandese" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiano" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Giapponese" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Coreano" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Lettone" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituano" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malese" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norvegese" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persiano" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polacco" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portoghese" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumeno" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Russo" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovacco" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Sloveno" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spagnolo" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Svedese" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tailandese" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turco" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ucraino" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbo" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ucraino" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Recupera l'elenco delle lingue supportate" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Elenco delle lingue" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "traduzione" + +#: libretranslate/locales/.swag.py:4 +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:233 +msgid "Translated text" +msgstr "Testo tradotto" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Richiesta non valida" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Errore di traduzione" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Rallenta" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Bannato" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Ciao mondo!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Testo/i da tradurre" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Codice lingua sorgente" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Codice lingua destinazione" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "testo" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formato del testo sorgente:\n" +" * `text` - Testo normale\n" +" * `html` - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Numero preferito di traduzioni alternative" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Chiave API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Traduce file da una lingua a un'altra" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "File tradotto" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "File da tradurre" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Rileva la lingua di un singolo testo" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Rilevazioni" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Errore di rilevamento" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Testo da rilevare" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Recupera le impostazioni del frontend" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "impostazioni del frontend" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Invia un suggerimento per migliorare una traduzione" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Successo" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Non autorizzato" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Testo originale" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Traduzione suggerita" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Lingua del testo originale" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Lingua della traduzione suggerita" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "feedback" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Codice lingua" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nome della lingua (in Inglese)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Codici lingua di destinazione supportati" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Testo/i tradotto/i" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Messaggio di errore" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Ragione del rallentamento" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL del file tradotto" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Valore di confidenza" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Limite di caratteri per questa lingua (-1 indica nessun limite)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Tempo limite di traduzione sul frontend" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Se il database di chiavi API è abilitato." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Se è richiesta una chiave API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Se l'invio di suggerimenti è abilitato." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Formati files supportati" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Se l'invio è stato di successo" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Copia testo" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Non riesco a caricare %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Errore sconosciuto" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Copiato" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Grazie per la tua correzione. Si noti che il suggerimento non avrà " +"effetto subito." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Nessuna lingua disponibile. Hai installato correttamente i modelli?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "premi il link \"Ottieni Chiave API\"." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API di traduzione automatica libera e open source" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "traduzione" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Ottieni Chiave API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Imposta Chiave API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Cambia lingua" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Modifica" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Cambia modalità scura/chiara" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Chiudi" + +#: 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:186 +msgid "Translate Text" +msgstr "Traduci Testo" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Traduci Files" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Traduci da" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Scambia lingua sorgente e di destinazione" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Traduci in" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Testo da tradurre" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Elimina testo" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Suggerisci una traduzione" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Annulla" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Invia" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formati files supportati:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "File" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Rimuovi file" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Traduci" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Scarica" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Richiesta" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Risposta" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API di Traduzione Automatica Open Source" + +#: 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:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licenza:" + +#: 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:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Contributori di %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamita" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Questa API pubblica può essere " +#~ "utilizzata per fare prove, per uso " +#~ "personale o infrequente. Se hai " +#~ "intenzione di utilizzarla in produzione, " +#~ "per favore %(host_server)s o %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "hosta un server tuo" + +#~ msgid "get an API key" +#~ msgstr "ottieni una chiave API" + +#~ msgid "Basque" +#~ msgstr "Basco" + +#~ msgid "Galician" +#~ msgstr "Galiziano" + diff --git a/self_host/LibreTranslate/libretranslate/locales/it/meta.json b/self_host/LibreTranslate/libretranslate/locales/it/meta.json new file mode 100644 index 00000000..5f788ae1 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/it/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Italian", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/ja/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ja/LC_MESSAGES/messages.po new file mode 100644 index 00000000..67698c17 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ja/LC_MESSAGES/messages.po @@ -0,0 +1,763 @@ +# Japanese translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-01-04 07:30+0000\n" +"Last-Translator: moyashi_24 \n" +"Language: ja\n" +"Language-Team: Japanese " +"\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "無効なJSON形式" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "自動検出" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "無許可" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "リクエストが多すぎます" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "無効なAPIキー" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "APIキーを取得するにはサーバ管理者に連絡してください" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "%(url)sにアクセスして API キーを取得する" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "スローダウン:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "無効なリクエスト:パラメータ %(name)s は数値ではありません" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "無効なリクエスト:パラメータ %(name)s は %(value)s 以下である必要があります" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s フォーマットはサポートされていません" + +#: 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 "%(sname)s (%(scode)s)から%(tname)s (%(tcode)s)への翻訳は利用できません" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "テキストを翻訳できません: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "このサーバーではファイル翻訳が無効になっています。" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "無効なリクエスト:空のファイル" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "無効なリクエスト:サポートされていないファイル形式" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "無効なファイル名" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "このサーバーで提案が無効になっています。" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "英語" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "アルバニア語" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "アラビア語" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "アゼルバイジャン語" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "ベンガル語" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "ブルガリア語" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "カタルーニャ語" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "中国語 (簡体)" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "中国語 (繁体)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "チェコ語" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "デンマーク語" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "オランダ語" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "エスペラント語" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "エストニア語" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "フィンランド語" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "フランス語" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "ドイツ語" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "ギリシャ語" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "ヘブライ語" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "ヒンディー語" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "ハンガリー語" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "インドネシア語" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "アイルランド語" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "イタリア語" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "日本語" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "韓国語" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "ラトビア語" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "リトアニア語" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "マレー語" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "ノルウェー語" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "ペルシア語" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "ポーランド語" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "ポルトガル語" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "ルーマニア語" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "ロシア語" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "スロヴァキア語" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "スロベニア語" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "スペイン語" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "スウェーデン語" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "タガログ語" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "タイ語" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "トルコ語" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "ウクライナ語" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "ウルドゥー語" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "セルビア語" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "ウクライナ語" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "ベトナム語" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "サポートされている言語リストを取得" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "言語リスト" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "翻訳" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "言語から言語にテキストを翻訳する" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "翻訳済みテキスト" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "無効なリクエスト" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "翻訳エラー" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "スローダウン" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "禁止された" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "こんにちは皆さん!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "翻訳するテキスト" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "翻訳元の言語コード" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "翻訳先の言語コード" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "テキスト" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"ソーステキストの形式:\n" +"* `text` - プレーンテキスト\n" +"* `html` - HTML マークアップ\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "代替翻訳の優先数" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "APIキー" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "言語から言語にファイルを翻訳する" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "翻訳済みファイル" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "翻訳するファイル" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "単一テキストの言語を検出する" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "検出" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "検出エラー" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "検出するテキスト" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "フロントエンドの特定の設定を取得する" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "フロントエンドの設定" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "フロントエンド" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "翻訳の改善案を出す" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "成功" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "認証されていません" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "オリジナルテキスト" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "提案された翻訳" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "オリジナルテキストの言語" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "提案された翻訳の言語" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "フィードバック" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "言語コード" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "読みやすい言語名(英語)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "サポートされた翻訳先の言語コード" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "翻訳されたテキスト" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "エラーメッセージ" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "遅くなる理由" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "翻訳されたファイルのURL" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "確信度" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "この言語の入力可能文字数 (-1は無制限)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "フロントエンド翻訳タイムアウト" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "APIキーデータベースが有効になっているかどうか。" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "APIキーが要求されるかどうか。" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "翻訳精度を上げるための修正が可能かどうか。" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "サポートされているファイル形式" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "提出が成功したかどうか" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "テキストをコピー" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "%(url)sを読み込めません" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "未知のエラー" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "コピー済み" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "修正ありがとうございます。 提案の反映には時間がかかる場合があります。" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "利用可能な言語がありません。利用するには言語モデルを正しくインストールしてください。" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "「APIキーを取得」を押してください。" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "無料かつオープンソースな機械翻訳API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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。無料でダウンロード、オフラインで利用可能、セットアップも簡単。数分であなたのAPIサーバーを実行。" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "翻訳" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "APIドキュメント" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "APIキーを取得" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "APIキーを設定" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "言語を変更" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "編集" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "ダークモード/ライトモードを切り替える" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "却下" + +#: 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:186 +msgid "Translate Text" +msgstr "テキストを翻訳" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "ファイルを翻訳" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "翻訳元:" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "翻訳元と翻訳先の言語を入れ替える" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "翻訳先:" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "翻訳するテキスト" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "テキストを削除" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "翻訳を改善する" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "キャンセル" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "送信" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "サポートされているファイル形式:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "ファイル" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "ファイルを削除" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "翻訳" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "ダウンロード" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "リクエスト" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "レスポンス" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "オープンソース機械翻訳API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "無料でダウンロード。 オフライン対応。簡単にセットアップ。" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "ライセンス:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "%(heart)sと%(contributors)sによって作成され、%(engine)sを利用して作られています。" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s 貢献者" + +#~ msgid "multipart/form-data" +#~ msgstr "マルチパート/フォームデータ" + +#~ msgid "Vietnamese" +#~ msgstr "ベトナム" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "この公開API " +#~ "はテストまたは個人的、頻繁でない用途に使用してください。製品のアプリケーションに使用する場合は、%(host_server)s " +#~ "または %(get_api_key)sしてください。" + +#~ msgid "host your own server" +#~ msgstr "自分のサーバーをホストする" + +#~ msgid "get an API key" +#~ msgstr "APIキーを取得" + +#~ msgid "Basque" +#~ msgstr "バスク語" + +#~ msgid "Galician" +#~ msgstr "ガリシア語" + diff --git a/self_host/LibreTranslate/libretranslate/locales/ja/meta.json b/self_host/LibreTranslate/libretranslate/locales/ja/meta.json new file mode 100644 index 00000000..1a126f01 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ja/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Japanese", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/kab/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/kab/LC_MESSAGES/messages.po new file mode 100644 index 00000000..18895d13 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/kab/LC_MESSAGES/messages.po @@ -0,0 +1,771 @@ +# Kabyle translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-05-13 12:01+0000\n" +"Last-Translator: ButterflyOfFire \n" +"Language-Team: Kabyle \n" +"Language: kab\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.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Amasal JSON d arameɣtu" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Tifin tawurmant" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Ur yettusireg ara" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Aṭas n uɛeddi deg tilas n ussuter" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Tasarut API d tarameɣtut" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Ttxil-k·m, nermes amahal n uqeddac i wawway n tsarut API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Rzu ɣer %(url)s i wawway n tsarut API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Taẓayt:" + +#: 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 "Assuter arameɣtu: ixuṣṣ uɣewwar %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Asuter ur yettwaqbal ara: asefran %(name)s mačči d uṭun" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Asuter ur yettwaqbal ara: asefran %(name)s yessefk ad yili d <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Assuter d arameɣtu: assuter(%(size)s) iɛedda tilas n uḍris (%(limit)s)" + +#: 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 ur yettusefrak ara" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Amasal %(format)s ur yettusefrak ara" + +#: 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) ur yelli ara am tutlayt tasaḍast n %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Ur yizmir asuqel n uḍṛis: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Asuqqel n yifuyla yensa ɣef uqeddac-a." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Assuter arameɣtu: afaylu d ilem" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Assuter d arameɣtu: amasal n ufaylu ur yettusefrak ara" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Isem n ufaylu d armeɣtu" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Isumar nsan ɣef uqeddac-a." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Taglizit" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Talbanit" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Taɛrabt" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Tazerbiǧanit" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Tabengalit" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Tabulgarit" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Takaṭalant" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Tacinwatt" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Tacinwat (tamansayt)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Tačikit" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Tadanit" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Tahulandit" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Taspirantit" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Tasṭunit" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Tafinit" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Tafṛansist" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Talmanit" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Tagrigit" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Taɛebranit" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Tahendit" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Tahungaṛit" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Tandunizit" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Tirlandit" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Taṭelyanit" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Tajapunit" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Takurit" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Talitunit" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Talitwanit" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Tamalayt" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Tanurvijit" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Tafarsit" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Tapulunit" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Tapurtugit" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Tapurtugit (Brizil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Tarumanit" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Tarusit" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Tasluvakt" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Tasluvinit" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Taspenyulit" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Taswidit" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tatagalugt" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Taṭaylandit" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Taṭurkit" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Takrinit" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Turdut" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Tasiṛbit" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Tukranit" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Tavyiṭnamit" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Tabdart n tutlayin yettwasefraken" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Tabdart n tutlayin" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "suqel" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Asuqqel n uḍris seg tutlayt ɣer tayeḍ" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Aḍris yettwasuqqlen" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Assuter arameɣtu" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Tuccḍa deg tsuqilt" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "S ttawil" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Yettwagdel" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Azul !" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Aḍris(iḍrisen) ara yettwasuqqlen" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Tangalt n tutlayt taɣbalut" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Tangalt n tutlayt tasaḍast" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "aḍṛis" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Amasal n uḍris aɣbalu:\n" +" * `text` - Aḍris aččaran\n" +" * `html` - Taṛekkazt HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Amḍan-ik·im ufrin n tsuqilin timlellayin" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Tasarutt API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Asuqqel n ufaylu seg tutlayt ɣer tayeḍ" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Afaylu yettwasuqqlen" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Afaylu ara yettwasuqqlen" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Tifin n tutlayt n kra n uḍris" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Tifin" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Tuccḍa deg tifin" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Aḍris ara yettwafen" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Err-d iɣewwaren imaẓlayen n ugrudem" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "iɣewwaren n ugrudem" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "agrudem" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Azen asumer i usnerni n tsuqqilt" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Awwaḍ" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Ur yettusireg ara" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Aḍris aɣbalu" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Tasuqqilt i d-yettwasumren" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Tutlayt n uḍris aɣbalu" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Tutlayt n tsuqqilt i d-yettwasumren" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "tamawt" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Tangalt n tutlayt" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Isem n tutlayt igezzu umdan (s teglizit)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Tingalin n tutlayin tisaḍasin i yettwasefraken" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Aḍris(iḍrisen) yettwasuqqlen" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Izen n tuccḍa" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Ssebba n taẓayt" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL n ufaylu i yettwasuqqlen" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Azal n teflest" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Talast n unekcum n yisekkilen i tutlayt-a (-1 ur d-iskan kra n talast)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Akud n tsuqqilt ɣef ugrudem" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Yeskan ma yella taffa n yisefka n tsura API termed." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Yeskan-d ma tettwasra tasarut n API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Yeskan ma yella tuzna n yisumar termed." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Imasalen n yifuyla i yettwasefraken" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Ma yella tuzna tɛedda" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Nɣel aḍris" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "D awezɣi asali n %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Tuccḍa d tarussint" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Yettwanɣel" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "Tanemmirt ɣef useɣti. Ẓer belli asumer ur iteṭṭef ara imir kan." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Ulac tutlayin i yellan. Tesbeddeḍ tineɣrufin akken iwata?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Sekcem tasarut-ik•im API. Ma yella tesriḍ tasarut API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "sit ɣef useɣwen \"Awi tasarut API\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "nermes amahal n uqeddac." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API n tsuqqilt tawurmant tilellit, n uɣbalu yeldin" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 n tsuqqilt tawurmant tilellit, n uɣbalu yeldin. Yezdeɣ i yiman-is, s " +"war tuqqna, fessus i usebded. Senker aqeddac-ik·im API deg kra n " +"tesdatin." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "tasuqqilt" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Tasemlit API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Awi tasarut API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Sbadu tasarut API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Beddel tutlayt" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Ẓreg" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Uɣal ɣer uskar aberkan neɣ aceɛlal" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Zgel" + +#: 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 "" +"Ɣef lǧal n tḥeqranit n iṛubuyen, issutren n tsuqilt ttwalessen seg leɛḍil i " +"yiseqdacen yesɛan kan tasarut API tameɣtut. Suref-t-aɣ ɣef aya!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API n usuqqel" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Suqqel aḍris" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Suqqel ifuyla" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Suqqel seg" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Semmeskel aɣbalu d tutlayt tasaḍast" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Suqqel ɣer" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Aḍris ara yettwasuqqlen" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Kkes aḍris" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Sumer tasuqqilt" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Sefsex" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Azen" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Imasalen n ufaylu i yettwasefraken:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Afaylu" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Kkes afaylu" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Suqqel" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Sader" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Assuter" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Tiririt" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API n usuqqel awurman n uɣbalu yeldin" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Yettwasezdeɣ i yiman-is. Iteddu s war tuqqna. Fessus i usesteb." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Turagt:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"Yettufeṣṣel s %(heart)s sɣur %(contributors)s, yella-d s lmendad n " +"%(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Imttekkiyen n %(libretranslate)s" + +#~ msgid "Vietnamese" +#~ msgstr "Tavyiṭnamit" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "API-a azayaz ilaq ad yettuseqdec i " +#~ "usekyed, i useqdec uslig neɣ i " +#~ "useqdec ur negzi. Ma yella tesnekkreḍ" +#~ " asnas id-yettfarasen, ttxil-k·m seqdec " +#~ "%(host_server)s neɣ %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "Sezdeɣ aqeddac inek·inem" + +#~ msgid "get an API key" +#~ msgstr "Awi tasarut API" + +#~ msgid "Basque" +#~ msgstr "Tabaskit" + +#~ msgid "Galician" +#~ msgstr "Tagalisyant" diff --git a/self_host/LibreTranslate/libretranslate/locales/kab/meta.json b/self_host/LibreTranslate/libretranslate/locales/kab/meta.json new file mode 100644 index 00000000..8c26a291 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/kab/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Kabyle", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/kk/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/kk/LC_MESSAGES/messages.po new file mode 100644 index 00000000..13b605b7 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/kk/LC_MESSAGES/messages.po @@ -0,0 +1,675 @@ +# Translations template for LibreTranslate. +# Copyright (C) 2025 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2025. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.7.1\n" +"Report-Msgid-Bugs-To: https://github.com/LibreTranslate/LibreTranslate/issues\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-05-25 19:35+0500\n" +"Last-Translator: AnmiTaliDev \n" +"Language-Team: \n" +"Language: kk_KZ\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" +"X-Generator: Poedit 3.6\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "JSON форматы дұрыс емес" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Тілді автоматты анықтау" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Рұқсат етілмеген" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Сұраныс шектеулерін тым көп бұзу" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "API кілті жарамсыз" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "API кілтін алу үшін сервер әкімшісіне хабарласыңыз" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "API кілтін алу үшін мына мекенжайға кіріңіз: %(url)s" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Баяулау:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Жарамсыз сұрау: %(name)s параметрі сан емес" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Жарамсыз сұрау: %(name)s параметрі %(value)s мәнінен кем немесе тең болуы керек" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s пішімі қолдау таппайды" + +#: 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 "%(sname)s (%(scode)s) тілінен %(tname)s (%(tcode)s) тіліне аудару қолжетімді емес" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Мәтінді аудару мүмкін емес: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Бұл серверде файлдарды аудару өшірілген." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Жарамсыз сұрау: бос файл" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Жарамсыз сұрау: файл пішімі қолдау таппайды" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Файл атауы жарамсыз" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Бұл серверде ұсыныстар өшірілген." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Ағылшын тілі" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Албан тілі" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Араб тілі" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Әзербайжан тілі" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Бенгал тілі" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Болгар тілі" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Каталан тілі" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Қытай тілі" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Қытай тілі (дәстүрлі)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Чех тілі" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Дат тілі" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Голланд тілі" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Эсперанто тілі" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Эстондық тілі" + +msgid "Finnish" +msgstr "Фин тілі" + +msgid "French" +msgstr "Француз тілі" + +msgid "German" +msgstr "Неміс тілі" + +msgid "Greek" +msgstr "Грек тілі" + +msgid "Hebrew" +msgstr "Иврит тілі" + +msgid "Hindi" +msgstr "Хинди тілі" + +msgid "Hungarian" +msgstr "Венгр тілі" + +msgid "Indonesian" +msgstr "Индонезия тілі" + +msgid "Irish" +msgstr "Ирланд тілі" + +msgid "Italian" +msgstr "Итальян тілі" + +msgid "Japanese" +msgstr "Жапон тілі" + +msgid "Korean" +msgstr "Кәріс тілі" + +msgid "Latvian" +msgstr "Латыш тілі" + +msgid "Lithuanian" +msgstr "Литва тілі" + +msgid "Malay" +msgstr "Малай тілі" + +msgid "Norwegian" +msgstr "Норвег тілі" + +msgid "Persian" +msgstr "Парсы тілі" + +msgid "Polish" +msgstr "Поляк тілі" + +msgid "Portuguese" +msgstr "Португал тілі" + +msgid "Portuguese (Brazil)" +msgstr "Португал тілі (Бразилия)" + +msgid "Romanian" +msgstr "Румын тілі" + +msgid "Russian" +msgstr "Орыс тілі" + +msgid "Slovak" +msgstr "Словак тілі" + +msgid "Slovenian" +msgstr "Словен тілі" + +msgid "Spanish" +msgstr "Испан тілі" + +msgid "Swedish" +msgstr "Швед тілі" + +msgid "Tagalog" +msgstr "Тагалог тілі" + +msgid "Thai" +msgstr "Тай тілі" + +msgid "Turkish" +msgstr "Түрік тілі" + +msgid "Ukranian" +msgstr "Украин тілі\" # ← Тут ошибка в оригинале! Правильно msgid \"Ukrainian" + +msgid "Urdu" +msgstr "Урду тілі" + +msgid "Serbian" +msgstr "Серб тілі" + +msgid "Ukrainian" +msgstr "Украин тілі" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Вьетнам тілі" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Қолдау көрсетілетін тілдердің тізімін алу" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Тілдер тізімі" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "аудару" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Мәтінді бір тілден екінші тілге аудару" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Аударылған мәтін" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Жарамсыз сұраныс" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Аудару қатесі" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Баяулаңыз" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Бұғатталған" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Сәлем, әлем!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Аударуға арналған мәтін(дер)" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Бастапқы тілдің коды" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Мақсатты тілдің коды" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "мәтін" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Бастапқы мәтіннің пішімі:\n" +" * `text` - Қарапайым мәтін\n" +" * `html` - HTML белгілеуі\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Альтернативті аудармалар саны (қалауыңыз бойынша)" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API кілті" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Файлды бір тілден екінші тілге аудару" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Аударылған файл" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Аударылатын файл" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Бір мәтіннің тілін анықтау" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Тіл анықтамалары" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Анықтау қатесі" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Анықтауға арналған мәтін" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Фронтендке арналған баптауларды алу" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "фронтенд баптаулары" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "фронтенд" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Аударманы жақсарту үшін ұсыныс жіберу" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Сәтті" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Рұқсат етілмеген" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Бастапқы мәтін" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Ұсынылған аударма" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Бастапқы мәтіннің тілі" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Ұсынылған аударманың тілі" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "кері байланыс" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Тіл коды" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Адам түсінетін тіл атауы (ағылшынша)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Қолдау көрсетілетін мақсатты тілдердің кодтары" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Аударылған мәтін(дер)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Қате туралы хабарлама" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Баяулаудың себебі" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Аударылған файл сілтемесі" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Сенімділік деңгейі" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Бұл тіл үшін таңба шектеуі (-1 — шектеусіз)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Фронтенд аудармасының күту уақыты" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "API кілттер дерекқоры қосылған ба." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "API кілті қажет пе." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Ұсыныстар жіберу мүмкіндігі қосылған ба." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Қолдау көрсетілетін файл пішімдері" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Жіберу сәтті өтті ме" + +#: libretranslate/templates/app.js.template:31 libretranslate/templates/app.js.template:294 libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Мәтінді көшіру" + +#: libretranslate/templates/app.js.template:80 libretranslate/templates/app.js.template:86 libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 libretranslate/templates/app.js.template:351 libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "%(url)s жүктелмеді" + +#: libretranslate/templates/app.js.template:272 libretranslate/templates/app.js.template:342 libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Белгісіз қате" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Көшірілді" + +#: libretranslate/templates/app.js.template:339 +msgid "Thanks for your correction. Note the suggestion will not take effect right away." +msgstr "Түзетулеріңіз үшін рахмет. Ұсыныс бірден қолданылмайтынын ескеріңіз." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Тілдер қолжетімді емес. Модельдерді дұрыс орнаттыңыз ба?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "API кілтіңізді енгізіңіз. Егер кілт қажет болса, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "\"API кілтін алу\" сілтемесін басыңыз." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Тегін және ашық кодты машиналық аударма API" + +#: libretranslate/templates/index.html:10 libretranslate/templates/index.html:31 +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. Жүктеп алуға тегін, офлайн жұмыс істей алады және оңай бапталады. Өз API серверіңізді бірнеше минутта іске қосыңыз." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "аударма" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Документация API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Получить ключ API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Установить ключ API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Сменить язык" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Редактировать" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Переключить тёмную/светлую тему" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Закрыть" + +#: 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 "Из-за злоупотреблений со стороны ботов, запросы на перевод временно доступны только пользователям с действительным ключом API. Приносим извинения за неудобства!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API перевода" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Перевести текст" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Перевести файлы" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Перевести с" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Поменять языки местами" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Перевести на" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Текст для перевода" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Удалить текст" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Предложить перевод" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Отмена" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Отправить" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Поддерживаемые форматы файлов:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Файл" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Удалить файл" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Перевести" + +#: libretranslate/templates/index.html:287 libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Скачать" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Запрос" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Ответ" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Открытый API для машинного перевода" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Бесплатно. Работает офлайн. Лёгкая установка." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Лицензия:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Создано с любовью %(heart)s участниками %(contributors)s и работает на базе %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s үлес қосушылары" diff --git a/self_host/LibreTranslate/libretranslate/locales/kk/meta.json b/self_host/LibreTranslate/libretranslate/locales/kk/meta.json new file mode 100644 index 00000000..26fc85d2 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/kk/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Kazakh", + "reviewed": false +} diff --git a/self_host/LibreTranslate/libretranslate/locales/ko/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ko/LC_MESSAGES/messages.po new file mode 100644 index 00000000..b2299f33 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ko/LC_MESSAGES/messages.po @@ -0,0 +1,766 @@ +# Korean translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2023-06-19 20:49+0000\n" +"Last-Translator: Sungjoon Moon \n" +"Language: ko\n" +"Language-Team: Korean " +"\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "잘못된 JSON 형식" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "자동 감지" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "인증되지 않음" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "요청이 너무 많음" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "잘못된 API 키" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "API 키를 얻기 위해 서버 연산자에 문의하시기 바랍니다" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "%(url)s 에서 API 키 받기" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "속도가 느림:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "잘못된 요청: 0 댓글 매개변수는 수 없습니다 %(name)s" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "잘못된 요청: 0 댓글 매개 변수는 <= 1명 1명 %(name)s %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "잘못된 요청: 텍스트 제한 (%(limit)s) 초과하는 요청 (%(size)s)" + +#: 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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s 형식은 지원되지 않습니다" + +#: 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 "%(sname)s (%(scode)s)에서 %(tname)s (%(tcode)s)로 번역할 수 없습니다" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "텍스트를 번역할 수 없습니다: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "현재 서버에서 파일 번역이 비활성화 되어 있습니다." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "잘못된 요청: 빈 파일" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "잘못된 요청: 파일 형식 지원되지 않음" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "잘못된 파일명" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "현재 서버에서 제안이 비활성화 되어 있습니다." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "영어" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "알바니아" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "아랍어" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "아제르바이잔어" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "채용정보" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "한국어" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "카테고리" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "중국어" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "한국어 (Korean)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "체코어" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "덴마크어" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "네덜란드어" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "에스페란토" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "에스토니아" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "핀란드어" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "프랑스어" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "독일어" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "그리스어" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "히브리어" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "힌디어" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "헝가리어" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "인도네시아어" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "아일랜드어" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "이탈리아어" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "일본어" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "한국어" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "라트비아" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "한국어" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "담당자: Ms" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "한국어" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "페르시아어" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "폴란드어" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "포르투칼어" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "한국어" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "러시아어" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "슬로바키아어" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "한국어" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "스패인어" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "스웨덴어" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "다운로드" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "뚱 베어" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "터키어" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "우크라이나어" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "채용 정보" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "지원되는 언어 목록 검색" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "언어 목록" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "번역" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "다른 언어로 텍스트를 번역" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "번역된 텍스트" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "잘못된 요청" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "번역 오류" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "속도가 느림" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "금지됨" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "안녕하세요!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "번역할 테스트" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "출발 언어 코드" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "도착 언어 코드" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "텍스트" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"출발 텍스트의 형식 :\n" +"* `text` - 평문 텍스트\n" +"* `html` - HTML 마크 업\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "다른 번역의 선호 번호" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API 키" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "다른 언어로 파일을 번역" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "번역된 파일" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "번역할 파일" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "단일 텍스트의 언어를 감지" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "감지 내용" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "감지 오류" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "감지할 텍스트" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "프론트엔드의 특정 설정을 검색" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "프론트엔드 설정" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "프론트엔드" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "번역을 개선하기 위해 제안을 제출" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "성공" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "권한 없음" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "원문" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "제안된 번역" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "원문의 언어" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "제안된 번역의 언어" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "피드백" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "언어 코드" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "사람이 읽을 수 있는 언어 이름 (영어로)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "지원하는 언어 코드" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "번역된 텍스트" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "오류 메시지" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "느려지는 이유" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "번역된 파일 url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "신뢰치" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "이 언어의 문자 입력 제한 (-1은 제한이 없음을 의미)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "프론트엔드 번역 시간 초과" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "API 키 데이터베이스가 활성화되었는지 여부." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "API 키가 필요하든." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "자주 묻는 질문." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "지원된 파일 형식" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "제출이 성공했는지 여부" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "텍스트 복사" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "%(url)s를 읽어들일 수 없음" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "알려지지 않은 오류" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "복사됨" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "수정해 주셔서 감사합니다. 제안은 즉시 반영되지 않을 수 있습니다." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "가능한 언어가 없음. 언어 모델을 제대로 설치하셨나요?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "\"Get API Key\" 링크를 누릅니다." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "자유 오픈 소스 기계 번역 API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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. 무료로 다운로드 가능, 오프라인에서 사용이 가능하며, 설치가 쉽습니다. 단 몇 분 만 투자하여 " +"자신의 API 서버를 돌려보세요." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "번역" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API 문서" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "API 키 획득" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "API 키 설정" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "언어 선택" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "수정" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "어두운 색/빛 모드" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "닫기" + +#: 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:186 +msgid "Translate Text" +msgstr "텍스트 번역하기" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "파일 번역하기" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "~로 부터 번역하기" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "출발 언어, 도착 언어 서로 바꾸기" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "~로 번역하기" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "번역할 텍스트" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "텍스트 삭제" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "번역 제안하기" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "취소" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "보내기" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "지원되는 파일 형식:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "파일" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "파일 삭제" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "번역" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "다운로드" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "요청" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "응답" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "오픈 소스 기계 번역 API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "무료로 다운로드 가능. 오프라인 이용 가능. 설정하기 쉬움." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "라이센스:" + +#: 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:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s 기여자" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form 자료" + +#~ msgid "Vietnamese" +#~ msgstr "베트남어" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "이 공개 API는 테스트 또는 개인적인 용도로만 " +#~ "사용되어야 하며, 잦은 요청을 지양합니다. 운영 환경에서" +#~ " 응용 프로그램을 실행할 경우, %(host_server)s 또는" +#~ " %(get_api_key)s을 참조하십시오." + +#~ msgid "host your own server" +#~ msgstr "자신만의 서버 호스팅" + +#~ msgid "get an API key" +#~ msgstr "API 키 획득" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/ko/meta.json b/self_host/LibreTranslate/libretranslate/locales/ko/meta.json new file mode 100644 index 00000000..f5044c39 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ko/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Korean", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/lt/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/lt/LC_MESSAGES/messages.po new file mode 100644 index 00000000..68687dff --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/lt/LC_MESSAGES/messages.po @@ -0,0 +1,747 @@ +# Lithuanian translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-08-08 13:03-0400\n" +"Last-Translator: FULL NAME \n" +"Language-Team: lt \n" +"Language: lt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Blogas JSON formatas" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Automatinis aptikimas" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Neleidžiama" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "NAME OF TRANSLATORS" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Blogas API raktas" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Prašome susisiekti su serverio operatoriumi, kad gautumėte API raktą" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Apsilankymas %(url)s gauti API raktą" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Lėčiau:" + +#: 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 "Blogas prašymas: trūksta %(name)s parametras" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Klaidingas prašymas: %(name)s parametras nėra skaičius" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Klaidingas prašymas: %(name)s parametras turi būti < = %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Blogas prašymas: prašymas (%(size)s) viršija teksto ribą (%(limit)s)" + +#: 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 nepalaikoma" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s formatas nepalaikomas" + +#: 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) nėra kaip tikslinės kalbos iš %(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Nepavyko išversti teksto: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Failų vertimas šiame serveryje yra išjungtas." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Blogas prašymas: tuščias failas" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Klaidingas prašymas: failo formatas nepalaikomas" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Klaidingas failo pavadinimas" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Siūlymai yra išjungti šiame serveryje." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Anglų" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanijos" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabų" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaidžanas" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgarų" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalonų" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Kinų" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kinų (tradicinė)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Čekų" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danų" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Olandų" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estų" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Suomių" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Prancūzų" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Vokiečių" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Graikų" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebrajų" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindis" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Vengrų" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indoneziečių" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Airių" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italų" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonų" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Korėjiečių" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Latvių" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lietuvių" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "MalajusCountry name" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norvegų" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persų" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Lenkų" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugalų" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugalų (Brazilija)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumunų" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rusų" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovakų" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovėnų" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Ispanų" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Švedų" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalogas" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thai" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turkų" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "UkranijName" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbų" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrainiečių" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamiečių" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Gauti palaikomų kalbų sąrašą" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Kalbų sąrašas" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "translate" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Versti tekstą iš kalbos į kitą" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Tekstas išvertus" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Klaidingas prašymas" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Vertimo klaida" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Lėčiau" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Konservuoti" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Labas pasaulis!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Verstinas (-i) tekstas (-ai)" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Šaltinio kalbos kodas" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Paskirties kalbos kodas" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "tekstas" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Šaltinio teksto formatas:\n" +"* tekstas - plonas tekstas\n" +"* 'html' - HTML žymėjimas\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Pageidautinas alternatyvių vertimų skaičius" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API raktas" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Klubui buvo priskirtas žaidėjas dėl per mažo jų skaičiaus" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Išverstas failas" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Failas išversti" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "NAME OF TRANSLATORS" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "III PRIEDAS" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Nustatymo klaida" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Name" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "@ info: whatsthis" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "frontent nustatymai" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontent" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Siūlymą patobulinti vertimą" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Sėkmė" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Neleidžiama" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Originalus tekstas" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Siūlomas vertimas" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Originalaus teksto kalba" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Siūlomo vertimo kalba" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "grįžtamoji informacija" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Kalbos kodas" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Humanitarinės kalbos pavadinimas (anglų kalba)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "NAME OF TRANSLATORS" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Išverstas (-i) tekstas (-ai)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Klaidos pranešimas" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Vėlavimo priežastis" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Išverstas failas url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Patikimumo vertė" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Simbolių įvedimo riba šiai kalbai (-1 reiškia, kad ribų nėra)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Name" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "NAME OF TRANSLATORS." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "NAME OF TRANSLATORS." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "@ info: status." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Palaikomas failų formatas" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "@ info: whatsthis" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopijuoti tekstą" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Nepavyko įkelti %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Nežinoma klaida" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopijuota" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Ačiū, kad pataisei. Atkreipkite dėmesį, pasiūlymas nebus įsigalioti iš " +"karto." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Kalbų nėra. Tu teisingai įdiegei modelius?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Įveskite savo API raktą. Jums reikia API rakto, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "paspauskite nuorodą \"Gauk API raktą\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "susisiekti su serverio operatoriumi." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Nemokamas ir atvirojo kodo mašinos vertimas API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Nemokamai ir Open Source Machine Translation API. Savarankiškai patalpintas," +" atsijungęs gali ir lengvai nustatyti. Bėk savo API serverį po kelių " +"minučių." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "vertimas" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API dokumentai" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Gauk API Raktas" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Nustatyti API Raktas" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Keisti kalbą" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Keisti" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Perjungti tamsios (šviesos) veikseną" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Naikinti" + +#: 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 "" +"Bot piktnaudžiavimo, vertimo prašymai laikinai tik vartotojams su " +"galiojančiu API klavišą. Atleisk už nepatogumus!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Vertimo API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Versti tekstą" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Name" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Žaisti iš" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Sukeisti šaltinį ir tikslines kalbas" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Pereiti į" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Verstinas tekstas" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Trinti" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Siūlomas vertimas" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Atsisakyti" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Siųsti" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Palaikomi failų formatai:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Failas" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Pašalinti failą" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Transliuoti" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Atsisiųsti" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Prašymas" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Atsakas" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open Source Machine Translation API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Selfas Hostedas. Galimi atsijungimai. Lengva susitvarkyti." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "Name" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licencija:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Lovatiesės %(heart)s pagal %(contributors)s ir varomas %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Pagalbininkai" + +#~ msgid "Basque" +#~ msgstr "Baskij" + +#~ msgid "Galician" +#~ msgstr "GalisName" diff --git a/self_host/LibreTranslate/libretranslate/locales/lt/meta.json b/self_host/LibreTranslate/libretranslate/locales/lt/meta.json new file mode 100644 index 00000000..df73c998 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/lt/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Lithuanian", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/lv/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/lv/LC_MESSAGES/messages.po new file mode 100644 index 00000000..4e0473a6 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/lv/LC_MESSAGES/messages.po @@ -0,0 +1,749 @@ +# Latvian translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-08-08 13:03-0400\n" +"Last-Translator: FULL NAME \n" +"Language-Team: lv \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Nederīgs JSON formāts" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Automātiski noteikt" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Neautorizēts" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Pārāk daudz pieprasījumu ierobežo pārkāpumus" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Nederīga API atslēga" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Lūdzu sazinieties ar servera operatoru, lai iegūtu API atslēgu" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Apmeklējums %(url)s API atslēga" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Lejupvērst:" + +#: 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 "Nederīgs pieprasījums: trūkst %(name)s parametrs" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Nederīgs pieprasījums: %(name)s parametrs nav skaitlis" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Nederīgs pieprasījums: %(name)s parametram jābūt > %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Nederīgs pieprasījums (%(size)s) pārsniedz teksta limitu (%(limit)s)" + +#: 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 nav atbalstīts" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s formāts nav atbalstīts" + +#: 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) nav pieejams kā mērķa valoda no %(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Nevar tulkot tekstu: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Šajā serverī ir atslēgts failu tulkojums." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Nederīgs pieprasījums: tukšs fails" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Nederīgs pieprasījums: faila formāts nav atbalstīts" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nederīgs faila nosaukums" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Serverī ir atslēgti ieteikumi." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Angļu" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albāņu" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arābu" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaidžāna" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "BengāļuName" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgāru" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Kataloņu" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Ķīniešu" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Ķīniešu (tradicionālie)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Čehu" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dāņu" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holandiešu" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Igauņu" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Somu" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Franču" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Vācu" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grieķu" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Ebreju" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ungāru" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonēziešu" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Īru" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Itāļu" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japānas" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Korejiešu" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Latviešu" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lietuviešu" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malāvija" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Latviešu" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persiešu" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Poļu" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugāļu" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugāļu (Brazīlija)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumāņu" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Krievu" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovāku" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovēņu" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spāņu" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Zviedru" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalogs" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Taizemiešu" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turku" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukraņu" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbu" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukraiņu" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vjetnamiešu" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Ielādēt atbalstīto valodu sarakstu" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Valodu saraksts" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "tulkot" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Tulkot tekstu no valodas uz citu" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Tulkots teksts" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Nederīgs pieprasījums" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Tulkošanas kļūda" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Lēnāk" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Konservēti" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Labdien!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Teksts(-i), ko tulkot" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Izcelsmes valodas kods" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Mērķa valodas kods" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "teksts" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Avota teksta formāts:\n" +"* `teksts` - vienkāršs teksts\n" +"* `html` - HTML marķējums\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Vēlamais alternatīvo tulkojumu skaits" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API atslēga" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Tulkot failu no valodas uz citu" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Tulkots fails" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fails, ko tulkot" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Noteikt viena teksta valodu" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Noteikšana" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Noteikšanas kļūda" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Nosakāmais teksts" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Ielādēt priekšpuses īpašos iestatījumus" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "priekšpuses iestatījumi" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "priekšpuse" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Iesniegt ierosinājumu uzlabot tulkojumu" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Panākumi" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Nav atļauts" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Oriģinālais teksts" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Ierosinātais tulkojums" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Oriģināla teksta valoda" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Ierosinātā tulkojuma valoda" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "atsauksmes" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Valodas kods" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Cilvēkam salasāms valodas nosaukums (angliski)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Pamatotie mērķa valodu kodi" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Tulkots(i) teksts(i)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Kļūdas paziņojums" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Palēninājuma iemesls" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Tulkots faila URL" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Ticamības vērtība" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Rakstzīmju ievades ierobežojums šai valodai (-1 norāda, ka nav ierobežojuma)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Priekšpuses tulkošanas noildze" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Vai ir ieslēgta API atslēgu datubāze." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Vai nepieciešama API atslēga." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Vai ir ieslēgta ieteikumu nosūtīšana." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Atbalstīto failu formāts" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Vai iesniegšana bija veiksmīga" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopēt tekstu" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Nevar ielādēt %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Nezināma kļūda" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Nokopēts" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Paldies par korekciju. Ņemiet vērā, ka ierosinājums stāsies spēkā uzreiz." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Valodas nav pieejamas. Vai jūs pareizi uzstādījāt modeļus?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Ierakstiet savā API atslēgā. Ja jums ir nepieciešama API atslēga, " +"%(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "nospiediet \"Get API Key\" saiti." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "sazinieties ar servera operatoru." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Bezmaksas un atvērtā pirmkoda mašīntulkošanas API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Bezmaksas un atvērtā pirmkoda mašīntulkošanas API. Free to download, " +"bezsaistē spēj un viegli uzstādīt. Palaist savu API serveri tikai dažas " +"minūtes." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "tulkošana" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API dokumenti" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Saņemt API Atslēga" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Uzstādīt API Atslēga" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Mainīt valodu" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Rediģēt" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Slēgt Tumšo/ Gaismu" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Noņemt" + +#: 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 "" +"Bota ļaunprātīgas izmantošanas dēļ tulkošanas pieprasījumi uz laiku attiecas" +" tikai uz lietotājiem ar derīgu API atslēgu. Atvainojiet par neērtībām!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Tulkošanas API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Tulkot tekstu" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Tulkot failus" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Tulkot no" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Maiņvietas avots un mērķa valodas" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Tulkot uz" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Tulkojamais teksts" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Dzēst tekstu" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Ieteikt tulkojumu" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Atcelt" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Sūtīt" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Atbalstītie failu formāti:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fails" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Izņemt failu" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Tulkot" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Lejupielādēt" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Pieprasījums" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Atbildes reakcija" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Atvērt pirmkoda mašīnas tulkošanas API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Pašaizliedzies. Bezsaistes Spēj. Viegli iestatīt." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTulkot" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licence:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Izgatavots no %(heart)s līdz %(contributors)s un darbina %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Atbalstītāji" + +#~ msgid "Basque" +#~ msgstr "BaskuName" + +#~ msgid "Galician" +#~ msgstr "Galisiešu" diff --git a/self_host/LibreTranslate/libretranslate/locales/lv/meta.json b/self_host/LibreTranslate/libretranslate/locales/lv/meta.json new file mode 100644 index 00000000..d5bd3b2e --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/lv/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Latvian", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/messages.pot b/self_host/LibreTranslate/libretranslate/locales/messages.pot new file mode 100644 index 00000000..d9538c82 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/messages.pot @@ -0,0 +1,729 @@ +# Translations template for LibreTranslate. +# Copyright (C) 2025 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2025. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.7.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/mia/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/mia/LC_MESSAGES/messages.po new file mode 100644 index 00000000..5c8b6d8d --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/mia/LC_MESSAGES/messages.po @@ -0,0 +1,755 @@ +# mia translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.12\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-07-04 18:09+0000\n" +"Last-Translator: \"Michael R. Lawrence\" \n" +"Language: mia\n" +"Language-Team: Miami " +"\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +#, fuzzy +msgid "Invalid JSON format" +msgstr "moochi eelaamweekaneewiki JSON kiikoo" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "" + +#: libretranslate/app.py:311 +#, fuzzy +msgid "Unauthorized" +msgstr "moochi koteelilo" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Moochi API paahpahaakani" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "weekiyosiko" + +#: 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 "" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, fuzzy, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "maci kiikoo : kiikoo (%(size)s) mihši awikawiko limit (%(limit)s)" + +#: libretranslate/app.py:715 libretranslate/app.py:720 +#: libretranslate/app.py:897 libretranslate/app.py:902 +#: libretranslate/app.py:924 +#, fuzzy, python-format +msgid "%(lang)s is not supported" +msgstr "moochi supported" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Vietnamese" +#~ msgstr "" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/mia/meta.json b/self_host/LibreTranslate/libretranslate/locales/mia/meta.json new file mode 100644 index 00000000..72ccea11 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/mia/meta.json @@ -0,0 +1,4 @@ +{ + "name": "mia", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/ms/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ms/LC_MESSAGES/messages.po new file mode 100644 index 00000000..387305a1 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ms/LC_MESSAGES/messages.po @@ -0,0 +1,765 @@ +# Malay translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-08-08 13:03-0400\n" +"Last-Translator: FULL NAME \n" +"Language-Team: ms \n" +"Language: ms\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Format JSON tidak sah" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Autokesan" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Tidak dibenarkan" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Terlalu banyak permintaan yang membatasi pelanggaran" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Kunci API tidak sah" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Sila hubungi operator server untuk mendapatkan kunci API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Lawati WANITA 0 Diambil kunci API %(url)s" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Perlahan:" + +#: 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 "" +"Permintaan tidak sah: hilang WANITA 0 Parameter month= yang tidak " +"diketahui akan diabaikan %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" +"Permintaan tidak sah: WANITA 0 Parameter gnona bukanlah sebuah angka " +"%(name)s" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Permintaan tidak sah: WANITA 0 parameter harus <= Perancis " +"%(name)s %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Permintaan tidak sah: permintaan (request)WANITA 0) melebihi batas " +"teks (Perancis) %(size)s %(limit)s" + +#: 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 "WANITA 0 Pautan simbolik tidak disokong %(lang)s" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "WANITA 0 Format wourne tidak didukung %(format)s" + +#: 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 "" +"WANITA 0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( " +"( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( " +"( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (.Perancis) tidak " +"tersedia sebagai bahasa target dari %(sname)s ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( " +"( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( " +"( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( " +"( (.Fiji 3) %(tname)s %(tcode)s %(scode)s" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Tidak dapat menerjemahkan teks: WANITA 0 %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Penerjemahan berkas-berkas translasi tidak aktif pada server ini." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Permintaan tidak sah: fail kosong" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Permintaan tidak sah: format berkas tidak disokong" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nama berkas tidak sah" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Cadang ringan dinonaktifkan pada server ini." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Bahasa Inggris" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albania" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arab" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaijan" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgaria" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalan" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Perancis" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Bahasa Tionghoa (tradisional)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Czech" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Denmark" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Hindia Belanda" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estonia" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finlandia" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Perancis" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Jerman" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Yunani" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Ibrani" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Hongaria" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Bahasa Indonesia" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Ireland" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italia" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Jepang" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Korea" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Latvia" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lithuania" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Bahasa Melayu" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norwegia" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persia" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polish" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugis" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugis Portugis (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumania" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rusia" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovak" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovenia" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spanyol" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Swedish" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thai" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turki" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrainian" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbia" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukraina" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnam" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Daftar bahasa yang didukung" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Bahasa" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "terjemahkan" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Terjemahkan teks dari bahasa ke bahasa lain" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Terjemahkan teks" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Permintaan tidak sah" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Kesalahan terjemahan terjemahan terjemahan" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Perlahan" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Diban" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Halo dunia!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Teks untuk diterjemahkan" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Kode bahasa sumber" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Kode bahasa sasaran" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "teks" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format teks sumber:\n" +"Teks biasa\n" +"* * `html` - Markup HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Jumlah terjemahan alternatif yang lebih disukai" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Kunci API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Terjemahkan file dari bahasa ke bahasa lain" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Berkas terterjemah terjemahan" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Berkas untuk diterjemahkan" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Kesan bahasa teks tunggal" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Mengesankan" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Kesalahan pengesanan efek" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Teks untuk dideteksi" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Pengaturan spesifik frontend boochi Retrievee" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "pengaturan frontend xahole" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "bagian depan *" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Berikan saran untuk meningkatkan terjemahan" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Sukses" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Tidak berwenang" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Teks Asal" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Terjemahan yang disarankan" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Bahasa Mandarin dari teks asli" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Bahasa dari terjemahan yang disarankan" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "umpan balik tidak merata" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Bahasa" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nama bahasa Human-readable (dalam bahasa Inggris)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Kode bahasa sasaran yang didukung" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Teks Terjemah Terjemahkan" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Pesan kesalahan" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Alasan untuk memperlambat" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL berkas terterjemahan Terjemahkan" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Nilai percaya diri" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Batas input karakter bagi bahasa ini (-1 menunjukkan tidak ada batas)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Terjemahan bahasa Jerman" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Apakah database kunci API diaktifkan." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Apakah anak kunci API diperlukan." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Tidak soal apakah saran - saran yang diajukan diaktifkan." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Format berkas yang didukung" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Apakah pengerahan kata berhasil" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Salin teks" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Tidak dapat memuat WANITA 0 %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Tidak diketahui error" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Copied" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Terima kasih atas pembetulanmu. Perhatikan saran tidak akan mengambil efek " +"segera." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "197 bahasa tidak tersedia. Apa kau memasang model dengan benar?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Ketik di kunci API-mu. Jika Anda membutuhkan kunci API, WANITA 0 " +"%(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "tekan « Get API Key\" link." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "hubungi operator server." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API Terjemahan Mesin Jerman" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 Terjemahan Mesin Sumber Terbuka dan Bebas Wadah Free dan Open Source. " +"Kepemilikan diri, offline mampu dan mudah diatur. Liat server API sendiri " +"dalam beberapa menit." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "terjemahan fedora" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "afrika" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Dok API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Dapatkan API Kunci" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "API Set Kunci" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Bahasa" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Edit" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Togol mode gelap/cahaya" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "[Salah]" + +#: 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 "" +"Karena penyalahgunaan bot, permintaan terjemahan dibatasi sementara oleh " +"pengguna dengan kunci API yang valid. Maaf atas ketidaknyamanan ini!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API Terjemahan Bahasa Indonesia" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Terjemahan" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Terjemahkan Berkas" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Terjemahan dari" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "S Swap sumber dan bahasa target SHAPD" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Terjemahkan kedalam" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Teks untuk diterjemahkan" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Teks Delete" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Saran terjemahan" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Batal" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Kirim" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Format berkas yang didukung:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Berkas" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Mengeluarkan berkas" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Terjemahan" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Muaturun" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Permintaan" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Sambutan" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API Terjemahan Mesin Sumber Terbuka" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Free to download. Kemampuan Luar Talian. Mudah diatur." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Lisensi:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"Dibuat dengan WANITA 0 Oleh: Perancis Ditenagai oleh " +"%(engine)s %(heart)s %(contributors)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "WANITA 0 Kontributor %(libretranslate)s" + +#~ msgid "Basque" +#~ msgstr "Basque" + +#~ msgid "Galician" +#~ msgstr "Galisia" diff --git a/self_host/LibreTranslate/libretranslate/locales/ms/meta.json b/self_host/LibreTranslate/libretranslate/locales/ms/meta.json new file mode 100644 index 00000000..7e2741ad --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ms/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Malay", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/nb/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/nb/LC_MESSAGES/messages.po new file mode 100644 index 00000000..09cc0de7 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/nb/LC_MESSAGES/messages.po @@ -0,0 +1,782 @@ +# Norwegian Bokmål (Norway) translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-03-25 12:01+0000\n" +"Last-Translator: Kaleido Scope \n" +"Language-Team: Norwegian Bokmål \n" +"Language: nb_NO\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Ugyldig JSON-format" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Oppdag automatisk" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Ikke godkjent" + +#: libretranslate/app.py:329 +#, fuzzy +msgid "Too many request limits violations" +msgstr "For mange brudd på forespørselsgrensene" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Ugyldig API-nøkkel" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Kontakt tjeneradministrator for å få API-nøkkel" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Besøk %(url)s for å få en API-nøkkel" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Nedsakking:" + +#: 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 "Ugyldig forespørsel: manglende %(name)s-parameter" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Ugyldig forespørsel: %(name)s parameteren er ikke et tall" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Ugyldig forespørsel: %(name)s Parameteren må være <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Ugyldig forespørsel: forespørselen (%(size)s) overstiger tekstgrensen " +"(%(limit)s)" + +#: 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 støttes ikke" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s-formatet støttes ikke" + +#: 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) er ikke tilgjengelig som målspråk fra %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Kan ikke oversette tekst: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +#, fuzzy +msgid "Files translation are disabled on this server." +msgstr "Filoversettelse er avskrudd på denne tjeneren." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Ugyldig forespørsel: tom fil" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Ugyldig forespørsel: filformatet støttes ikke" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Ugyldig filnavn" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Forslag er deaktivert på denne tjeneren." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Engelsk" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albansk" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabisk" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Aserbajdsjansk" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgarsk" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalansk" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Kinesisk" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kinesisk (tradisjonell)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Tsjekkisk" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dansk" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Nederlandsk" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estisk" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finsk" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Fransk" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Tysk" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Gresk" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebraisk" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ungarsk" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesisk" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irsk" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiensk" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japansk" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreansk" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Latvisk" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litauisk" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malay" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norsk" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persisk" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polsk" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugisisk" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugisisk (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumensk" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Russisk" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovakisk" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovensk" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spansk" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Svensk" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thailandsk" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Tyrkisk" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrainsk" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbisk" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrainsk" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamesisk" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Hent liste over støttede språk" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Språkliste" + +#: libretranslate/locales/.swag.py:3 +#, fuzzy +msgid "translate" +msgstr "oversettelse" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Oversett tekst fra ett språk til et annet" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Oversatt tekst" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Ugyldig forespørsel" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Oversettelsesfeil" + +#: libretranslate/locales/.swag.py:8 +#, fuzzy +msgid "Slow down" +msgstr "Sakk ned" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Bannlyst" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Hei verden!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Tekst(er) å oversette" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Kilde-språkkode" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Målspråkkode" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "tekst" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "HTML" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format for kildetekst:\n" +" * `text` — klartekst\n" +" * `html` — HTML-oppmerking\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Foretrukket antall alternative oversettelser" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-nøkkel" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Oversett fil fra ett språk til et annet" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Oversatt fil" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fil å oversette" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Oppdag språk for enkelt tekst" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Oppdagelser" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Oppdagelsesfeil" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Tekst å oppdage" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Hent skjermflate-spesifikke innstillinger" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "skjermflate-innstillinger" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "skjermflate" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Send inn et forslag om forbedring av en oversettelse" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Vellykket" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Ikke godkjent" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Opprinnelig tekst" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Foreslått oversettelse" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Originaltekstens språk" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Språk for foreslått oversettelse" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "tilbakemelding" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Språkkode" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Menneskelesbart språknavn (på engelsk)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Støttede målspråkkoder" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Oversatt(e) tekst(er)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Feilmelding" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Grunn for nedsakking" + +#: libretranslate/locales/.swag.py:43 +#, fuzzy +msgid "Translated file url" +msgstr "Oversatt fil-nettadresse" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Tillitsverdi" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Tegnbegrensning for dette språket (-1 indikerer ingen grense)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Tidsavbrudd for skjermflateoversettelse" + +#: libretranslate/locales/.swag.py:47 +#, fuzzy +msgid "Whether the API key database is enabled." +msgstr "Hvorvidt API-nøkkeldatabasen er påskrudd." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Hvorvidt en API-nøkkel kreves." + +#: libretranslate/locales/.swag.py:49 +#, fuzzy +msgid "Whether submitting suggestions is enabled." +msgstr "Hvorvidt innsendelse av forslag tillates." + +#: libretranslate/locales/.swag.py:50 +#, fuzzy +msgid "Supported files format" +msgstr "Støttede filformater" + +#: libretranslate/locales/.swag.py:51 +#, fuzzy +msgid "Whether submission was successful" +msgstr "Hvorvidt innsendelsen var vellykket" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopier tekst" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Kan ikke laste inn %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Ukjent feil" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopiert" + +#: libretranslate/templates/app.js.template:339 +#, fuzzy +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Takk for korrigeringen. Merk at forslaget ikke vil tre i kraft umiddelbart." + +#: libretranslate/templates/app.js.template:463 +#, fuzzy +msgid "No languages available. Did you install the models correctly?" +msgstr "Ingen tilgjengelige språk. Har du installert modellene riktig?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Skriv inn din API-nøkkel. Hvis du trenger en API-nøkkel, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +#, fuzzy +msgid "press the \"Get API Key\" link." +msgstr "trykk på «Hent API-nøkkel»-lenken." + +#: libretranslate/templates/app.js.template:536 +#, fuzzy +msgid "contact the server operator." +msgstr "kontakt tjeneradministratoren." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Fritt maskinoversettelses-API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Fritt maskinoversettelses-API. Selvtjent, mulighet for frakoblet modus, og " +"enkelt oppsett. Kjør din egen API-tjener i løpet av minutter." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "oversettelse" + +#: libretranslate/templates/index.html:11 +#, fuzzy +msgid "api" +msgstr "API" + +#: libretranslate/templates/index.html:67 +#, fuzzy +msgid "API Docs" +msgstr "API-dokumentasjon" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Hent API-nøkkel" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Sett API-nøkkel" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Endre språk" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Rediger" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Slå av/på mørk/lysmodus" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Avslå" + +#: 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 "" +"På grunn av botmisbruk er oversettelsesforespørsler midlertidig begrenset " +"til brukere med en gyldig API-nøkkel. Beklager ulempen!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Oversettelses-API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Oversett tekst" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Oversett filer" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Oversett fra" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Bytt kilde- og målspråk" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Oversett til" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Tekst å oversette" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Slett tekst" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Foreslå oversettelse" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Avbryt" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Send" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Støttede filformater:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fil" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Fjern fil" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Oversett" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Last ned" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Forespørsel" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Svar" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Fritt maskinoversettelses-API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Selvtjent. Muligheter for frakoblet modus. Enkelt oppsett." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Lisens:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Laget med %(heart)s av %(contributors)s og drevet av %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s-bidgragsytere" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamesisk" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Dette offentlige API-et er tiltenkt testing, personlig, eller sjelden bruk. " +#~ "Hvis du vil kjøre et program i produksjon, %(host_server)s, eller " +#~ "%(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "vertstjen din egen tjener" + +#~ msgid "get an API key" +#~ msgstr "hent en API-nøkkel" + +#~ msgid "Basque" +#~ msgstr "Baskisk" + +#~ msgid "Galician" +#~ msgstr "Galicisk" diff --git a/self_host/LibreTranslate/libretranslate/locales/nb/meta.json b/self_host/LibreTranslate/libretranslate/locales/nb/meta.json new file mode 100644 index 00000000..7dd39d78 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/nb/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Norwegian", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/nl/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/nl/LC_MESSAGES/messages.po new file mode 100644 index 00000000..11680658 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/nl/LC_MESSAGES/messages.po @@ -0,0 +1,776 @@ +# Dutch translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-07-07 09:01+0000\n" +"Last-Translator: Michiel van der Wulp \n" +"Language-Team: Dutch \n" +"Language: nl\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.13-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Onjuist JSON-formaat" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Automatisch detecteren" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Niet bevoegd" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Overschrijding maximaal aantal verzoeken" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Ongeldige API-sleutel" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Neem contact op met de serverbeheerder om een API-sleutel te krijgen" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Ga naar %(url)s om een API-sleutel te krijgen" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Vertraging:" + +#: 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 "Ongeldig verzoek: %(name)s parameter ontbreekt" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Ongeldig verzoek: %(name)s parameter is geen getal" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Ongeldig verzoek: %(name)s parameter moet zijn %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Ongeldig verzoek: verzoek (%(size)s) overschrijdt tekstlimiet (%(limit)s)" + +#: 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 wordt niet ondersteund" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s formaat wordt niet ondersteund" + +#: 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) Is niet beschikbaar als een doeltaal van %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Kan tekst niet vertalen: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Bestanden vertalen is uitgeschakeld op deze server." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Ongeldig verzoek: leeg bestand" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Ongeldig verzoek: bestandsformaat wordt niet ondersteund" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Ongeldige bestandsnaam" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Suggesties zijn uitgeschakeld op deze server." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Engels" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanezen" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabisch" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbeidzjaans" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengaals" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgaars" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalaans" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Chinees" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Chinees (traditioneel)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Tsjechisch" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Deens" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Nederlands" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Ests" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Fins" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Frans" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Duits" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grieks" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebreeuws" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Hongaars" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesisch" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Iers" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiaans" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japans" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreaans" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Lets" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litouws" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Maleis" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Noors" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Perzisch" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Pools" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugees" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugees (Brazilië)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Roemeens" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Russisch" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovaaks" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Sloveens" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spaans" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Zweeds" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thais" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turks" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Oekraïens" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Servisch" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Oekraïens" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamees" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Haal de lijst met ondersteunde talen op" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lijst van talen" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "vertaal" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Vertaal tekst van de ene taal naar een andere" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Vertaalde tekst" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Ongeldig verzoek" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Vertaalfout" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Vertraag" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Verbannen" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Hallo wereld!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Tekst(en) om te vertalen" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Brontaal code" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Doeltaal code" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "tekst" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format of bron sms:\n" +"Plain sms\n" +"HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Voorkeursaantal alternatieve vertalingen" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-sleutel" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Vertaal een bestand van de ene taal naar de andere" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Vertaald bestand" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Bestand om te vertalen" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detecteer de taal op basis van een tekst" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Detecties" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Detectie fout" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Tekst om te detecteren" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Verwijder de frontend specifieke instellingen" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "frontend instellingen" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Doe een suggestie voor het verbeteren van een vertaling" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Succes" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Niet gemachtigd" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Originele tekst" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Voorgestelde vertaling" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Taal van de oorspronkelijke tekst" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Taal van de voorgestelde vertaling" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "feedback" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Taalcode" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Menselijke taalnaam (in Engels)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Codes van ondersteunde doeltalen" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Vertaald tekst" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Foutmelding" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Reden voor vertraging" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL van het vertaalde bestand" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Vertrouwelijke waarde" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Maximum aantal in te geven tekens voor deze taal (-1 betekent geen limiet)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Frontend vertaling time-out" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Of de API-sleutel database in staat is." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Of een API-sleutel nodig is." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Of het indienen van suggesties mogelijk is." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Ondersteunde bestandsformaten" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Of het nu succesvol was" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Tekst kopiëren" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Kan niet laden %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Onbekende fout" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Gekopieerd" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "Bedankt voor je correctie. Let op dat de suggestie niet meteen zal werken." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Geen talen beschikbaar. Heb je de modellen correct geïnstalleerd?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Voer je API-sleutel in. Als je een API-sleutel nodig hebt, " +"%(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "druk op de \"Get API Key\" link." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "neem contact op met de beheerder." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Een vrije en open source vertalingsmachine" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Een vrije en open source vertalingsmachine met API. Zelf te hosten, kan " +"offline gebruikt worden en makkelijk te configureren. Draai je eigen API-" +"server binnen een paar minuten." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "vertaling" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API docmentatie" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Haal API-sleutel" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "API-sleutel instellen" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Taal wijzigen" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Bewerk" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Schakelen tussen donker/lichtmodus" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Verwerpen" + +#: 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 "" +"Vanwege misbruik door bots zijn vertaalverzoeken tijdelijk beperkt tot " +"gebruikers met een geldige API-sleutel. Sorry voor het ongemak!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Vertaling API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Vertaal tekst" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Vertaal bestanden" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Vertaal uit" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Verwissel bron- en doeltalen" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Vertaal naar" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Text om te vertalen" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Tekst verwijderen" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Vertaling voorstellen" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Annuleren" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Versturen" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Ondersteunde bestandsformaten:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Bestand" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Verwijder bestand" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Vertaal" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Download" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Verzoek" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Antwoord" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open source vertalingsmachine API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Zelf te hosten. Kan offline gebruikt worden. Makkelijk te configureren." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licentie:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"Gemaakt met een %(heart)s door de %(contributors)s en gebouwd op %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s bijdragers" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamees" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Deze publieke API moet worden gebruikt" +#~ " voor testen, persoonlijk of infrequent " +#~ "gebruik. Als je een applicatie in " +#~ "productie laat lopen, dan aub " +#~ "%(host_server)s of... %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "host je eigen server" + +#~ msgid "get an API key" +#~ msgstr "verkrijg een API sleutel" + +#~ msgid "Basque" +#~ msgstr "Baskische" + +#~ msgid "Galician" +#~ msgstr "Galicisch" diff --git a/self_host/LibreTranslate/libretranslate/locales/nl/meta.json b/self_host/LibreTranslate/libretranslate/locales/nl/meta.json new file mode 100644 index 00000000..5a776a42 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/nl/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Dutch", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/nn/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/nn/LC_MESSAGES/messages.po new file mode 100644 index 00000000..2ed27f5a --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/nn/LC_MESSAGES/messages.po @@ -0,0 +1,754 @@ +# Norwegian Nynorsk translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.12\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-03-25 12:01+0000\n" +"Last-Translator: Kaleido Scope \n" +"Language: nn\n" +"Language-Team: Norwegian Nynorsk " +"\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Ugyldig JSON-format" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Oppdag automatisk" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Ikkje godkjent" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "For mange førespurnadar" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Ugyldig API-nykel" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Ta kontakt med sørvaradministrator for å få API-nykel" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Besøk %(url)s for å få ein API-nykel" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Nedbremsing:" + +#: 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 "Ugyldig førespurnad: manglande %(name)s-parameter" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Engelsk" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabisk" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azeri" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Mandarin" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Tjekkisk" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dansk" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Nederlandsk" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finsk" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Fransk" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Tysk" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Gresk" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebraisk" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ungarsk" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesisk" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irsk" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiensk" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japansk" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreansk" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Farsi" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polsk" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugisisk" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Russisk" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovakisk" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spansk" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Svensk" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Tyrkisk" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrainsk" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Hent liste over støtta språk" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Språkliste" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Omset tekst frå eit språk til eit anna" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Omsette tekst" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Ugyldig førespurnad" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Omsetningsfeil" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Senk farten" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Utestengd" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Hei verda!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Tekst til omsetning" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamesisk" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/nn/meta.json b/self_host/LibreTranslate/libretranslate/locales/nn/meta.json new file mode 100644 index 00000000..cf3777d6 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/nn/meta.json @@ -0,0 +1,4 @@ +{ + "name": "nn", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/oc/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/oc/LC_MESSAGES/messages.po new file mode 100644 index 00000000..bc8e1433 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/oc/LC_MESSAGES/messages.po @@ -0,0 +1,772 @@ +# Occitan translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-11-29 04:07+0000\n" +"Last-Translator: Quentin PAGÈS \n" +"Language: oc\n" +"Language-Team: Occitan " +"\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Format JSON invalid" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Deteccion automatica" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Pas permés" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Tròp de despassament de limit de requèstas" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Clau API invalida" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Mercés de contactar l’operator del servidor per obténer una clau API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Consultatz %(url)s per obténer una clau API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Alentissètz :" + +#: 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 "Requèsta invalida : paramètre %(name)s mancant" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Requèsta non valabla: lo paramètre %(name)s es pas un nombre" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Demanda non valida : requèsta (%(size)s) despassa lo limit de tèxte " +"(%(limit)s)" + +#: 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 es pas pres en carga" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Format %(format)s pas pres en carga" + +#: 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) es pas disponible coma lenga cibla de %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Impossible de traduire lo tèxte : %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "La traduccion de fichièrs es desactivada sus aqueste servidor." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Requèsta invalida : fichièr void" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Requèsta invalida : format de fichièr pas pres en carga" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nom de fichièr invalida" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Las suggestions son desactivadas sus aqueste servidor." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Anglés" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabi" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azèri" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalan" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Chinés" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Mandarin (tradicional)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Chèc" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danés" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Neerlandés" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finés" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francés" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Alemand" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grèc" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Ebrèu" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Indi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ongrés" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesian" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandés" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italian" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonés" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Corean" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persan" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polonés" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugués" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romanés" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rus" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Eslovac" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Espanhòl" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Suedés" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turc" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ucraïnian" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Recuperar la lista de las lengas presas en carga" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lista de lengas" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "traduire" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Traduire un tèxte d’una lenga a l’autra" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Tèxte traduch" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Requèsta invalida" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Error de traduccion" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Alentir" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Fòrabandit" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Adieu, lo mond !" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Tèxte(s) de traduire" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Còdi de la lenga font" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Còdi de la lenga cibla" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "tèxte" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format del tèxt font :\n" +" * `text` - Tèxte brut\n" +" * `html` - Balisatge HTM\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "clau d’API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Traduire un fichièr d’una lenga a l’autra" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Fichièr traduch" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fichièr de traduire" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detectar la lenga d’un sol tèxte" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Deteccions" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Error de deteccion" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Tèxte de detectar" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Recuperar los paramètres especifics de l’interfàcia" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "paramètres de l’interfàcia" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "interfàcia" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Sometre una suggestion per melhorar una traduccion" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Succès" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Pas permés" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Tèxte original" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Traduccion suggerida" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Lenga del tèxte original" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Lenga de la traduccion suggerida" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "comentaris" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Còdi lenga" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nom de la lenga lisible per un uman (en anglés)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Còdis de lengas cibla presas en carga" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Tèxte(s) traduch(es)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Messatge d’error" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Rason de l’alentiment" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL del fichièr traduch" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Valor de fisança" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Limit d’entrada de caractèrs per aquesta lenga (-1 indica cap de limit)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Expiracion de la traduccion de l’interfàcia" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Indica se la basa de donadas de claus API es activada." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Indica se una clau API es requerida." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Indica se lo mandadís de suggestions es activat." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Fichièrs preses en carga" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Indica se lo mandadís a capitat" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Copiar lo tèxte" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Cargament impossible de %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Error desconeguda" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Copiat" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Mercés de vòstra correccion. Notatz que la suggestion serà pas presa en " +"compte immediatament." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Cap de lenga pas disponibla. Avètz installats los modèls corrèctament ?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Picatz vòstra clau API. Se vos cal una clau API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "quichatz lo ligam « Obténer una clau API »." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "contactatz l’operator del servidor." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API de traduccion automatica gratuita e liura" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 de traduccion automatica liura e dobèrta. Auto-albergada, fòra linha," +" de bon installar. Lançatz vòstre pròpri servidor API en qualques " +"minutas." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "traduccion" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Documents API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Obténer clau API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Definir clau API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Cambiar la lenga" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Modificar" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Ignorar" + +#: 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 de traduccion" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Traduire tèxte" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Traduire fichièrs" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Traduire a partir de" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Intervertir la lenga font e cibla" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Traduire en" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Tèxte de traduire" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Suprimir lo tèxte" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Suggerir traduccion" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Anullar" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Enviar" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formats de fichièrs preses en carga :" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fichièr" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Suprimir fichièr" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Traduire" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Telecargar" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Requèsta" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Responsa" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API de traduccion automatica liura" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Auto albergat. Pòt foncionar fòra connexion. De bon configurar." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licéncia :" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Concebut amb %(heart)s pels %(contributors)s e propulsat per %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Contributors %(libretranslate)s" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamian" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Aquesta API publica deuriá èsser " +#~ "utilizada per d’ensages, l’utilizacion " +#~ "personala o ocasionala. Se sètz per " +#~ "executar una aplicacion en produccion, " +#~ "se vos plai %(host_server)s o " +#~ "%(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "albergatz vòstre pròpri servidor" + +#~ msgid "get an API key" +#~ msgstr "obténer una clau API" + +#~ msgid "Basque" +#~ msgstr "Basc" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/oc/meta.json b/self_host/LibreTranslate/libretranslate/locales/oc/meta.json new file mode 100644 index 00000000..b5ed1de0 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/oc/meta.json @@ -0,0 +1,4 @@ +{ + "name": "oc", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/pa/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/pa/LC_MESSAGES/messages.po new file mode 100644 index 00000000..b27588b3 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/pa/LC_MESSAGES/messages.po @@ -0,0 +1,757 @@ +# Punjabi translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-05-16 02:45+0000\n" +"Last-Translator: Mandeep \n" +"Language-Team: Punjabi \n" +"Language: pa\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.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "ਅਵੈਧ JSON ਫਾਰਮੈਟ" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "ਆਟੋ ਖੋਜ" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "ਅਣਅਧਿਕਾਰਤ" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "ਬਹੁਤ ਜ਼ਿਆਦਾ ਬੇਨਤੀ ਸੀਮਾ ਉਲੰਘਣਾਵਾਂ" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "ਅਵੈਧ API ਕੁੰਜੀ" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "ਕਿਰਪਾ ਕਰਕੇ API ਕੁੰਜੀ ਲੈਣ ਲਈ ਸਰਵਰ ਆਪਰੇਟਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "API ਕੁੰਜੀ ਲੈਣ ਲਈ %(url)s 'ਤੇ ਜਾਓ" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "ਹੌਲੀ:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "ਅਵੈਧ ਬੇਨਤੀ: ਪੈਰਾਮੀਟਰ %(name)s ਇੱਕ ਨੰਬਰ ਨਹੀਂ ਹੈ" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "ਅਵੈਧ ਬੇਨਤੀ: ਪੈਰਾਮੀਟਰ %(name)s <= %(value)s ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s ਫਾਰਮੈਟ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Vietnamese" +#~ msgstr "" + +#~ msgid "Kabyle" +#~ msgstr "" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" diff --git a/self_host/LibreTranslate/libretranslate/locales/pa/meta.json b/self_host/LibreTranslate/libretranslate/locales/pa/meta.json new file mode 100644 index 00000000..ce793824 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/pa/meta.json @@ -0,0 +1,4 @@ +{ + "name": "pa", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/pl/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/pl/LC_MESSAGES/messages.po new file mode 100644 index 00000000..2ac70b3f --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/pl/LC_MESSAGES/messages.po @@ -0,0 +1,770 @@ +# Polish translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-17 09:53+0000\n" +"Last-Translator: Przemek \n" +"Language-Team: Polish \n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Nieprawidłowy format JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Wykryj automatycznie" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Nieautoryzowany" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Przekroczono limit ilości zapytań" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Nieprawidłowy klucz API" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Proszę skontaktować się z operatorem serwera, aby uzyskać klucz API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Przejdź do %(url)s aby uzyskać klucz API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Spowolnienie:" + +#: 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 "Nieprawidłowe zapytanie: brakuje parametru %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Nieprawidłowe zapytanie: %(name)s parametr nie jest liczbą" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Nieprawidłowe zapytanie: %(name)s parametr musi być < = %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Nieprawidłowe zapytanie: zapytanie (%(size)s) przekracza limit znaków " +"(%(limit)s)" + +#: 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 nie jest wspierany" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "format %(format)s nie jest wspierany" + +#: 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) nie jest dostępny jako język docelowy z języka " +"%(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Nie można przetłumaczyć tekstu: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Tłumaczenie plików jest wyłączone na tym serwerze." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Nieprawidłowe zapytanie: pusty plik" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Nieprawidłowe zapytanie: format pliku nie jest wspierany" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nieprawidłowa nazwa pliku" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Sugestie są wyłączone na serwerze." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Angielski" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albański" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabski" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbejdżański" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengalski" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bułgarski" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Kataloński" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Chiński" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Chiński (tradycyjny)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Czeski" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Duński" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holenderski" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estoński" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Fiński" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francuski" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Niemiecki" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grecki" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebrajski" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hinduski" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Węgierski" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonezyjski" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandzki" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Włoski" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japoński" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreański" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Łotewski" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litewski" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malajski" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norweski" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Perski" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polski" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugalski" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugalski (Brazylia)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumuński" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rosyjski" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Słowacki" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Słoweński" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Hiszpański" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Szwedzki" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalski" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tajski" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turecki" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukraiński" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbski" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukraiński" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Wietnamski" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Pobierz listę wspieranych języków" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lista języków" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "tłumaczenie" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Tłumaczenie tekstu z jednego języka na inny" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Przetłumaczony tekst" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Nieprawidłowe żądanie" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Błąd tłumaczenia" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Zwolnij" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Zbanowany" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Witaj świecie!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Tekst(y) do przetłumaczenia" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Kod języka źródłowego" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Kod języka tłumaczenia" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "tekst" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format tekstu źródłowego:\n" +"* `text` – zwykły tekst\n" +"* `html' – znaczniki HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Preferowana liczba tłumaczeń alternatywnych" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Klucz API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Tłumaczenie pliku z jednego języka na inny" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Przetłumaczony plik" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Plik do przetłumaczenia" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Wykryj język pojedynczego tekstu" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Wykryto" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Błąd wykrywania" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Tekst do wykrycia" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Pobierz ustawienia frontendu" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "ustawienia frontendu" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Zgłoś sugestię do poprawy tłumaczenia" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Sukces" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Nie autoryzowano" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Oryginalny tekst" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Proponowane tłumaczenie" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Język tekstu oryginalnego" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Język sugerowanego tłumaczenia" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "informacja zwrotna" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Kod języka" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nazwa języka (w języku angielskim)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Wspierane kody językowe" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Przetłumaczone tekst(y)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Błąd" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Powód" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Przetłumaczony url pliku" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Poziom ufności" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Limit znaków dla tego języka (-1 oznacza brak limitu)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Przekroczono czas oczekiwania na tłumaczenie" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Czy baza kluczy API jest włączona." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Czy klucz API jest wymagany." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Umożliwia to, że sugestie mogą być poddane." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Plik multimedialny" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Współzałożycielstwo odniosło sukces" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Tekst Copy" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "ładunek %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Nieznany błąd" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Skopiowano" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "Dzięki korekcji. Zasugerowanie nie będzie realizowane." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Żadne języki nie są dostępne. Czy można poprawnie stosować modele?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Wprowadź swój klucz API. Jeśli potrzebujesz klucza API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "prasa \"Get API Key\" (ang.)." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "skontaktuje się z operatorem serwera." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Free and Open Source Machine Translation API (ang.)" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Free and Open Source Machine Translation API (ang.). Samodzielny, niezdolny " +"i łatwy do położenia. Służysz własny serwer API w ciągu kilku minut." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "transkrypcja" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "API Key" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Ustaw klucz API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Język zmienny" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Edyta" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Przełącz tryb ciemny/jasny" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Dyskusja" + +#: 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 "" +"Ze względu na nadużywanie bot, wnioski o tłumaczenie są tymczasowo " +"ograniczone do użytkowników z ważnym kluczem API. Przepraszam za " +"niedogodności!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Tłumaczenie API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Przekład" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Translate File" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Przetłumaczenie" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Źródło i języki docelowe" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Przetłumaczyć" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Tekst tłumaczenia" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Tekst Delete" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Suggest" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Anuluj" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Send" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formaty plików:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "File" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Usuń plik" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Tłumacz" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Pobierz" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Zapytanie" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Odpowiedź" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open Source Machine Translation API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Free to download (ang.). Offline Capable (ang.). Łatwe do realizacji." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslation" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licencja:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "zrealizować %(heart)s by %(contributors)s zasilany %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Contributor" + +#~ msgid "multipart/form-data" +#~ msgstr "wieloczęściowy/formowy" + +#~ msgid "Vietnamese" +#~ msgstr "Wietnamski" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "To publiczne API powinno być wykorzystywane do testowania, osobistego lub " +#~ "rzadkiego użytku. Jeśli zamierzasz uruchomić aplikację w produkcji, proszę " +#~ "%(host_server)s lub %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "serwer" + +#~ msgid "get an API key" +#~ msgstr "uzyskaj klucz API" + +#~ msgid "Basque" +#~ msgstr "Baskijski" + +#~ msgid "Galician" +#~ msgstr "Galicyjski" diff --git a/self_host/LibreTranslate/libretranslate/locales/pl/meta.json b/self_host/LibreTranslate/libretranslate/locales/pl/meta.json new file mode 100644 index 00000000..086ddfbd --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/pl/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Polish", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/pt/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/pt/LC_MESSAGES/messages.po new file mode 100644 index 00000000..680675de --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/pt/LC_MESSAGES/messages.po @@ -0,0 +1,775 @@ +# Portuguese translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-06-02 23:35+0000\n" +"Last-Translator: Manuela Silva \n" +"Language-Team: Portuguese \n" +"Language: pt\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.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Formato JSON inválido" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Deteção Automática" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Não autorizado" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Demasiadas violações do limite de pedidos" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Chave de API inválida" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Por favor, contacte o operador do servidor para obter uma chave API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Visite %(url)s para obter uma chave API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Abrandar:" + +#: 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 "Pedido inválido: parâmetro %(name)s em falta" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Pedido inválido: o parâmetro %(name)s não é um número" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Pedido inválida: o parâmetro %(name)s deve ser <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Pedido inválido: pedido (%(size)s) excede o limite de texto (%(limit)s)" + +#: 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 não é suportado" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Formato %(format)s não é suportado" + +#: 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) não está disponível como idioma de destino de " +"%(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Não é possível traduzir o texto: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "A tradução de ficheiros está desativada neste servidor." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Pedido inválido: ficheiro vazio" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Pedido inválido: formato de ficheiro não suportado" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nome de ficheiro inválido" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "As sugestões estão desativadas neste servidor." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Inglês" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanês" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Árabe" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaijão" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalão" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Chinês" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Chinês (tradicional)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Checo" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dinamarquês" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holandês (Países Baixos)" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estoniano" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finlandês" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francês" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Alemão" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grego" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebraico" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Indiano (Hindi)" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Húngaro" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonésio" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandês" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiano" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonês" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Coreano" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Letão" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituano" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malaio" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norueguês" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persa" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polonês" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Português (Portugal)" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Português (Brasil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romeno" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Russo" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Eslovaco" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Esloveno" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Espanhol" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Sueco" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalo" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tailandês" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turco" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ucraniano" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Sérvio" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ucraniano" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Obter lista de idiomas suportados" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lista de idiomas" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "traduzir" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Traduzir texto de um idioma para outro" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Texto traduzido" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Pedido inválido" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Erro ao traduzir" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Abrandar" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Banido" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Olá, mundo!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Texto(s) para traduzir" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Código do idioma fonte" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Código do idioma de destino" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "texto" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formato do texto de origem:\n" +"* `text` - Texto simples\n" +"* `html` - marcação HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Número preferido de traduções alternativas" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Chave API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Traduzir ficheiro de um idioma para outro" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Ficheiro traduzido" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Ficheiro a traduzir" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detetar o idioma de um único texto" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Deteções" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Erro de deteção" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Texto para detetar" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Obter configurações específicas do Frontend" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "configurações do frontend" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Submeter uma sugestão para melhorar uma tradução" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Sucesso" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Não autorizado" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Texto original" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Tradução sugerida" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Idioma do texto original" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Idioma da tradução sugerida" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "opinião" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Código do idioma" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nome do idioma legível para humanos (em inglês)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Códigos do idioma de destino suportados" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Texto(s) traduzido(s)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Mensagem de erro" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Motivo por abrandar" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Url do ficheiro traduzido" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Valor de confiança" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Limite da entrada de carateres para este idioma (-1 indica sem limite)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Tempo de tradução do Frontend" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Se a base de dados da chave API está ativada." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Se uma chave API é necessária." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Se submeter sugestões está ativado." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Formatos de ficheiros suportados" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Se a submissão foi bem-sucedida" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Copiar texto" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Não é possível carregar %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Erro desconhecido" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Copiado" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Obrigado pela sua correção. Note que a sugestão não terá efeito de " +"imediato." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Não há idiomas disponíveis. Instalou os modelos corretamente?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Digite a sua chave API. Se precisar de uma chave API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "clique na hiperligação \"Obter Chave API\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "contacte o operador do servidor." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API de Tradução Automática Gratuita e de Código Aberto" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 de Tradução Automática Gratuita e de Código Aberto. Grátis para " +"transferir, ''off-line'' e fácil de configurar. Execute o seu próprio " +"servidor API em apenas alguns minutos." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "tradução" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Documentação API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Obter Chave API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Definir Chave API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Alterar idioma" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Editar" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Alternar o modo escuro/claro" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Ignorar" + +#: 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 "" +"Devido ao abuso de robô, os pedidos de tradução estão temporariamente " +"limitados aos utilizadores com uma chave de API válida. Desculpe pela " +"inconveniência!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API de Tradução" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Traduzir Texto" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Traduzir Ficheiros" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Traduzir de" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Inverter idiomas fonte e de destino" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Traduzir para" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Texto para traduzir" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Excluir texto" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Sugerir tradução" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Cancelar" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Enviar" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formatos de ficheiros suportados:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Ficheiro" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Remover ficheiro" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Traduzir" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Transferir" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Pedido" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Resposta" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API de Tradução Automática Gratuita e de Código Aberto" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Grátis para transferir. Funciona Off-line. Fácil de configurar." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licença:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Criado com %(heart)s por %(contributors)s e alimentado por %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Colaboradores %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamita" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Esta API pública deve ser usada " +#~ "para testes, uso pessoal ou infrequente." +#~ " Se você vai executar uma aplicação" +#~ " em produção, por favor %(host_server)s " +#~ "ou %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "hospede seu próprio servidor" + +#~ msgid "get an API key" +#~ msgstr "obter uma chave API" + +#~ msgid "Basque" +#~ msgstr "Basco" + +#~ msgid "Galician" +#~ msgstr "Galego" diff --git a/self_host/LibreTranslate/libretranslate/locales/pt/meta.json b/self_host/LibreTranslate/libretranslate/locales/pt/meta.json new file mode 100644 index 00000000..43e85525 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/pt/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Portuguese", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/pt_BR/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/pt_BR/LC_MESSAGES/messages.po new file mode 100644 index 00000000..22543a55 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/pt_BR/LC_MESSAGES/messages.po @@ -0,0 +1,777 @@ +# Portuguese (Brazil) translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-06-06 04:36+0000\n" +"Last-Translator: Juzé \n" +"Language-Team: Portuguese (Brazil) \n" +"Language: pt_BR\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.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Formato JSON inválido" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Detecção automática" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Sem autorização" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Muitas violações de limite de solicitação" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Chave de API inválida" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Entre em contato com o operador do servidor para obter uma chave de API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Acesse %(url)s para obter uma chave de API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Devagar:" + +#: 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 "Solicitação inválida: parâmetro %(name)s ausente" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Solicitação inválida: o parâmetro %(name)s não é um número" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Solicitação inválida: o parâmetro %(name)s deve ser <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Solicitação inválida: a solicitação (%(size)s) excede o limite de texto " +"(%(limit)s)" + +#: 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 não é suportado" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "O formato %(format)s não é suportado" + +#: 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) não está disponível como idioma da tradução em " +"%(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Não é possível traduzir o texto: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "A tradução de arquivos está desativada neste servidor." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Solicitação inválida: arquivo vazio" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Solicitação inválida: formato de arquivo não suportado" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nome de arquivo inválido" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "As sugestões estão desativadas neste servidor." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Inglês" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanês" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Árabe" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaijano" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalão" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Chinês" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Chinês (tradicional)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Tcheco" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dinamarquês" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holandês" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estoniano" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finlandês" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francês" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Alemão" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grego" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebraico" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Húngaro" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonésio" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandês" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiano" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonês" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Coreano" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Letão" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituano" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malaio" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norueguês" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persa" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polonês" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Português" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Português (Brasil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romeno" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Russo" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Eslovaco" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Esloveno" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Espanhol" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Sueco" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalo" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tailandês" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turco" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ucraniano" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Sérvio" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ucraniano" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Recuperar lista de idiomas suportados" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lista de idiomas" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "tradução" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Traduz texto de um idioma para outro" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Texto traduzido" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Solicitação inválida" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Erro de tradução" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Devagar" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Banido" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Olá, mundo!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Texto(s) para traduzir" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Código do idioma do texto original" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Código do idioma da tradução" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "texto" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formato do texto original:\n" +"* `text` - Texto simples\n" +"* `html` - Marcação HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Número preferido para traduções alternativas" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Chave de API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Traduz arquivo de um idioma para outro" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Arquivo traduzido" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Arquivo a ser traduzido" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detecta o idioma de um único texto" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Detecções" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Erro de detecção" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Texto a ser detectado" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Recuperar configurações específicas do front-end" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "configurações de front-end" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "front-end" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Envie uma sugestão para melhorar uma tradução" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Sucesso" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Não autorizado" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Texto original" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Tradução sugerida" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Idioma do texto original" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Idioma da tradução sugerida" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "feedback" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Código do idioma" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Nome do idioma legível por humanos (em Inglês)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Códigos de idioma da tradução suportados" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Texto(s) traduzido(s)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Mensagem de erro" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Razão para desacelerar" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL do arquivo traduzido" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Valor da confiança" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Limite de entrada de caracteres para este idioma (-1 indica que não há " +"limite)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Tempo limite de tradução do front-end" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Se o banco de dados de chaves de API está ativado." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Se é necessária uma chave de API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Se o envio de sugestões está ativado." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Formato de arquivos suportados" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Se o envio foi bem-sucedido" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Copiar texto" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Não é possível carregar %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Erro desconhecido" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Copiado" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Obrigado pela sua correção. Observe que a sugestão não entrará em vigor " +"imediatamente." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Nenhum idioma disponível. Você instalou os modelos corretamente?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Digite sua chave de API. Se você precisar de uma chave de API, " +"%(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "clique no link \"Obter chave de API\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "entre em contato com o operador do servidor." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API de Tradução Automática Livre e de Código Aberto" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 de Tradução Automática Livre e de Código Aberto. Grátis para " +"descarregar, também funciona offline e fácil de configurar. Execute seu " +"próprio servidor de API em apenas alguns minutos." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "tradução" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "API" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Documentação da API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Obter chave de API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Definir chave de API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Alterar idioma" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Editar" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Alternar modo claro/escuro" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Descartar" + +#: 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 "" +"Devido ao abuso de bots, as solicitações de tradução estão temporariamente " +"limitadas a usuários com uma chave de API válida. Desculpe o incômodo!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API de Tradução" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Traduzir Texto" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Traduzir Arquivos" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Traduzir de" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Inverter idiomas do texto original e da tradução" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Traduzir para" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Texto a ser traduzido" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Apagar texto" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Sugerir tradução" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Cancelar" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Enviar" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formatos de arquivo suportados:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Arquivo" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Remover arquivo" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Traduzir" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Download" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Solicitação" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Resposta" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API de Tradução Automática de Código Aberto" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Download gratuito. Funciona offline. Fácil de configurar." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licença:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Feito com %(heart)s por %(contributors)s e desenvolvido por %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Colaboradores" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamita" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Esta API pública deve ser usada " +#~ "para testes, uso pessoal ou pouco " +#~ "frequente. Se for executar uma aplicação" +#~ " em produção, por favor, %(host_server)s" +#~ " ou %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "hospede seu próprio servidor" + +#~ msgid "get an API key" +#~ msgstr "obtenha uma chave de API" + +#~ msgid "Basque" +#~ msgstr "Basco" + +#~ msgid "Galician" +#~ msgstr "Galego" diff --git a/self_host/LibreTranslate/libretranslate/locales/pt_BR/meta.json b/self_host/LibreTranslate/libretranslate/locales/pt_BR/meta.json new file mode 100644 index 00000000..a5c27199 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/pt_BR/meta.json @@ -0,0 +1,4 @@ +{ + "name": "pt_BR", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/ro/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ro/LC_MESSAGES/messages.po new file mode 100644 index 00000000..c35325d3 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ro/LC_MESSAGES/messages.po @@ -0,0 +1,770 @@ +# Romanian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2023-02-27 19:38+0000\n" +"Last-Translator: Simona Iacob \n" +"Language-Team: Romanian \n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Format JSON invalid" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Detectare automată" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Neautorizat" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Prea multe încălcări ale limitelor de solicitare" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Cheie API invalidă" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" +"Vă rugăm să contactați operatorul serverului pentru a obține o cheie API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Vizitați %(url)s pentru a obține o cheie API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Încetinire:" + +#: 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 "Cerere invalidă: lipsește parametrul %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Cerere nevalidă: %(name)s parametrul nu este un număr" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Cerere nevalidă: %(name)s parametrul trebuie să fie > %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Cerere invalidă: cererea (%(size)s) depășește limita de text (%(limit)s)" + +#: 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 nu este acceptat" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s formatul nu este acceptat" + +#: 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) nu este disponibilă ca limbă țintă din %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Nu se poate traduce textul: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Traducerea fișierelor este dezactivată pe acest server." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Cerere invalidă: fișier gol" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Cerere invalidă: formatul de fișier nu este acceptat" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nume de fișier invalid" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Sugestiile sunt dezactivate pe acest server." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Engleză" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albaneză" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabă" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaidjan" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgară" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalană" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Chineză" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Chineză (tradițională)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Cehă" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Daneză" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Olandeză" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estoniană" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finlandeză" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Franceză" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Germană" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Greacă" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Ebraică" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindusă" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Maghiară" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indoneziană" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandezii" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italiană" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japoneză" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Coreeană" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Letonia" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituaniană" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malaezia" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norvegiană" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persană" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Poloneză" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugheză" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugheză (Brazilia)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Română" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rusă" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovacă" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovacă" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spaniolă" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Suedeză" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thailandeză" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turcă" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ucraineană" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Sârbă" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ucraineană" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnameză" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Preluarea listei de limbi acceptate" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Listă de limbi" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "traduceți" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Traduceți text dintr-o limbă în alta" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Text tradus" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Cerere invalidă" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Eroare de traducere" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Încetinește" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Interzis" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Bună ziua lume!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Text(e) de tradus" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Codul limbii sursă" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Codul limbii țintă" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "text" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formatul textului sursă:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Numărul preferat de traduceri alternative" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Cheia API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Traduceți fișierul dintr-o limbă în alta" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Fișier tradus" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fișier de tradus" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detectarea limbii unui singur text" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Detecții" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Eroare de detectare" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Text de detectat" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Preluarea setărilor specifice frontend-ului" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "setări frontend" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "partea din față" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Trimiteți o sugestie pentru a îmbunătăți o traducere" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Succes" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Nu este autorizat" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Textul original" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Traducere sugerată" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Limba în care a fost redactat textul original" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Limba de traducere propusă" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "feedback" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Cod de limbă" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Denumirea limbii lizibile de către om (în limba engleză)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Coduri de limbă țintă acceptate" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Text(e) tradus" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Mesaj de eroare" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Motivul încetinirii" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Traducere fișier url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Valoarea de încredere" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Limita de introducere a caracterelor pentru această limbă (-1 indică faptul " +"că nu există limită)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Timeout de traducere frontală" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Dacă este activată baza de date cu chei API." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Dacă este necesară o cheie API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Dacă este activată trimiterea de sugestii." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Formatul fișierelor acceptate" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Dacă depunerea a avut succes" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Copiați textul" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Nu se poate încărca %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Eroare necunoscută" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Copiat" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Vă mulțumim pentru corecție. Rețineți că sugestia nu va avea efect imediat." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Nu există limbi disponibile. Ați instalat corect modelele?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Introduceți cheia API. Dacă aveți nevoie de o cheie API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "apăsați linkul \"Get API Key\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "contactați operatorul serverului." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Gratuit și Open Source Machine Translation API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 de traducere automată gratuită și cu sursă deschisă. Free to download, " +"capabil de offline și ușor de configurat. Rulați propriul server API în doar" +" câteva minute." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "traducere" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Obțineți cheia API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Setați cheia API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Schimbați limba" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Editați" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Comută modul întuneric/lumină" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Respingeți" + +#: 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 "" +"Datorită abuzului de bot, cererile de traducere sunt limitate temporar la " +"utilizatorii cu o cheie API valabilă. Scuze pentru deranj!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API de traducere" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Traduceți textul" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Traducere fișiere" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Traducere din" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Schimbați limbile sursă și țintă" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Traduceți în" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Text de tradus" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Ștergeți textul" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Sugerați o traducere" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Anulează" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Trimiteți" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formate de fișiere acceptate:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fișier" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Eliminați fișierul" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Traducere" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Descărcați" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Cerere" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Răspuns" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open Source Machine Translation API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Free to download. Capabil offline. Ușor de instalat." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licență:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Realizat cu %(heart)s de %(contributors)s și propulsat de %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Colaboratori" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnameză" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Această API publică ar trebui să fie utilizată pentru testare, pentru uz " +#~ "personal sau pentru utilizări rare. Dacă aveți de gând să rulați o aplicație" +#~ " în producție, vă rugăm să folosiți %(host_server)s sau %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "găzduiți propriul server" + +#~ msgid "get an API key" +#~ msgstr "obțineți o cheie API" + +#~ msgid "Basque" +#~ msgstr "Basc" + +#~ msgid "Galician" +#~ msgstr "Galiciană" diff --git a/self_host/LibreTranslate/libretranslate/locales/ro/meta.json b/self_host/LibreTranslate/libretranslate/locales/ro/meta.json new file mode 100644 index 00000000..c0dd6d6e --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ro/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Romanian", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/ru/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ru/LC_MESSAGES/messages.po new file mode 100644 index 00000000..3c21316c --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ru/LC_MESSAGES/messages.po @@ -0,0 +1,781 @@ +# Russian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-05-08 05:34+0000\n" +"Last-Translator: 439JBYL80IGQTF25UXNR0X1BG " +"<439JBYL80IGQTF25UXNR0X1BG@users.noreply.hosted.weblate.org>\n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Неверный формат JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "[автоопределение языка]" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Не авторизовано" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Слишком много нарушений предела запроса" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Недействительный API-ключ" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Пожалуйста, свяжитесь с оператором сервера, чтобы получить API-ключ" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Зайдите на %(url)s для получения API-ключа" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Притормозите:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Неверный запрос: параметр «%(name)s» не является числом" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Неверный запрос: параметр «%(name)s» должен быть <= «%(value)s»" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Формат %(format)s не поддерживается" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Не удаётся перевести текст: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Перевод файлов отключён на этом сервере." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Недействительный запрос: пустой файл" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Недействительный запрос: формат файла не поддерживается" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Неверное имя файла" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Предложения отключены на этом сервере." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "английский" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "албанский" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "арабский" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "азербайджанский" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "бенгальский" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "болгарский" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "каталонский" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "китайский" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "китайский (традиционный)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "чешский" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "датский" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "голландский" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "эсперанто" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "эстонский" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "финский" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "французский" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "немецкий" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "греческий" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "иврит" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "хинди" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "венгерский" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "индонезийский" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "ирландский" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "итальянский" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "японский" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "корейский" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "латвийский" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "литовский" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "малайский" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "норвежский" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "персидский" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "польский" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "португальский" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "португальский (бразильский)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "румынский" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "русский" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "словацкий" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "словенский" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "испанский" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "шведский" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "тагальский" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "тайский" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "турецкий" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "украинский" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "урду" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "сербский" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "украинский" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "вьетнамский" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Получение списка поддерживаемых языков" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Список языков" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "перевод" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Перевести текст с языка на другой" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Перевод текста" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "При недействительном запросе" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "При ошибке перевода" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "При замедлении" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "При блокировке" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Привет, мир!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Текст для перевода" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Код исходного языка" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Код целевого языка" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "text" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Формат исходного текста:\n" +" * `text` - Простой текст\n" +" * `html` - HTML-разметка\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Желаемое число других переводов" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-ключ" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Перевести файл с языка на другой" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "При переведённом файле" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Файл для перевода" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Обнаружение языка одного текста" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Обнаружения" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "При ошибке обнаружения" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Текст для обнаружения" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Получение конкретных настроек интерфейса (frontend)" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "При настройке интерфейса (frontend)" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Подать предложение для улучшения перевода" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "При отправке" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Если пользователь не авторизован" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Изначальный текст" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Предлагаемый перевод" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Язык изначального текста" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Язык предлагаемого перевода" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "обратная связь" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Языковой код" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Человеческое название языка (на английском)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Поддерживаемые языковые коды" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Перевод текста" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Сообщение ошибки" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Причина замедления" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL переведённого файла" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Уровень достоверности" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Предел вводимых символов для этого языка (-1 не указывает на предел)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Превышаемое время ожидания перевода интерфейса (frontend)" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "При включённой базе данных API-ключей." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "При требовании API-ключа." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "При включённом предложения перевода." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Поддерживаемый формат файлов" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "При отправке предложения" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Копировать текст" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Невозможно загрузить %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Неизвестная ошибка" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Скопировано" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Спасибо за вашу поправку. Обратите внимание, что предложение не будет " +"действовать сразу." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Нет языков. Вы правильно установили модели?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Введите ваш API-ключ. Если вам нужен ключ — %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "нажмите на ссылку «Получить API-ключ»." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Бесплатный и открытый источник машинного перевода с помощью API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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. " +"Бесплатно скачать, возможность работы в автономном режиме и простота " +"настройки. Запустите свой собственный сервер API всего за несколько " +"минут." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "перевод" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Документация API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Получить API-ключ" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Установить API-ключ" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Изменить язык" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Изменить" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Переключение тёмного/светлого режима" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Закрыть" + +#: 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 "" +"Из-за злоупотреблений ботов, запросы переводов временно ограничены для " +"пользователей с действительным API ключом. Извините за неудобства!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Перевод с помощью API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Перевести текст" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Перевести файлы" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Перевести с" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Поменять местами исходный и целевой языки" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Перевести на" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Текст для перевода" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Удалить текст" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Предложить перевод" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Отмена" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Отправить" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Поддерживаемые форматы файлов:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Файл" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Удалить файл" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Перевести" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Скачать" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Запрос" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Ответ" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API машинного перевода с открытым исходным кодом" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" +"Бесплатно скачать. Возможность работы в автономном режиме. Легко " +"настраивается." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Лицензия:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Сделано с %(heart)s благодаря %(contributors)s и работает на %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "участникам, внёсшим вклад в разработку %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-данные" + +#~ msgid "Vietnamese" +#~ msgstr "вьетнамский" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Этот публичный API должен использоваться " +#~ "для тестирования, личного или нечастого " +#~ "использования. Если вы собираетесь запустить" +#~ " приложение в производстве, пожалуйста " +#~ "%(host_server)s или %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "разместите собственный сервер" + +#~ msgid "get an API key" +#~ msgstr "получите ключ API" + +#~ msgid "Basque" +#~ msgstr "баскский" + +#~ msgid "Galician" +#~ msgstr "галисийский" diff --git a/self_host/LibreTranslate/libretranslate/locales/ru/meta.json b/self_host/LibreTranslate/libretranslate/locales/ru/meta.json new file mode 100644 index 00000000..d5ee81d9 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ru/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Russian", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/si/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/si/LC_MESSAGES/messages.po new file mode 100644 index 00000000..a09840db --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/si/LC_MESSAGES/messages.po @@ -0,0 +1,755 @@ +# Sinhala translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2023-07-27 07:54+0000\n" +"Last-Translator: Overplant Poster " +"\n" +"Language: si\n" +"Language-Team: Sinhala " +"\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "ඉංග්‍රීසි" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "අරාබි" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "චීන" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "ප්‍රංශ" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "ජර්මානු" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "ග්‍රීක" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "හින්දි" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "ඉතාලි" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "ජපන්" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "කොරියානු" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "රුසියානු" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "භාෂා ලැයිස්තුව" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "යෝජිත පරිවර්තනය" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "යෝජිත පරිවර්තනයේ භාෂාව" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "භාෂා කේතය" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "බලපත්‍රය:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Vietnamese" +#~ msgstr "" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/si/meta.json b/self_host/LibreTranslate/libretranslate/locales/si/meta.json new file mode 100644 index 00000000..72e0a934 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/si/meta.json @@ -0,0 +1,4 @@ +{ + "name": "si", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/sk/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/sk/LC_MESSAGES/messages.po new file mode 100644 index 00000000..01fca1b6 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sk/LC_MESSAGES/messages.po @@ -0,0 +1,767 @@ +# Slovak translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-11-05 12:00+0000\n" +"Last-Translator: Milan Šalka \n" +"Language-Team: Slovak \n" +"Language: sk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Neplatný formát JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Auto Detect" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Neoprávnené" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Príliš veľa porušení limitov žiadostí" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Neplatný API kľúč" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Prosím, kontaktujte operátora servera, aby ste dostali kľúč API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Návšteva %(url)s získať API kľúč" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Spomaľovanie:" + +#: 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 "Neplatná požiadavka: chýba %(name)s parameter" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Neplatná požiadavka: %(name)s parameter nie je číslo" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Neplatná požiadavka: %(name)s parameter musí byť <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Neplatná požiadavka: žiadosť (%(size)s) presahuje limit textu (%(limit)s)" + +#: 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 nie je podporovaný" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s formát nie je podporovaný" + +#: 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) nie je k dispozícii ako cieľový jazyk od %(sname)s " +"()%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Nemožno preložiť text: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Preklady sú zakázané na tomto serveri." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Neplatná požiadavka: prázdny súbor" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Neplatná požiadavka: formát súboru nie je podporovaný" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Neplatné meno" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Návrhy sú zakázané na tomto serveri." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Angličtina" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albánsko" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabčina" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaština" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengálčina" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulharšťina" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalánsky" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Čínske" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Čínština (tradičná)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Čeština" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Dánčina" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Dánština" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estónčina" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Fínština" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francúzština" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Nemčina" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Gréčtina" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebrejčina" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Madarčina" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonézske" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Írština" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Taliančina" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonština" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Kórejština" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Litvinština" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litovčina" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Zuzana" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Nórština" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Perzština" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polština" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugalština" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portuguese (Brazílsko)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumunčina" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ruština" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovenčina" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovinčina" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Španiečina" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Švédština" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thajské" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turečtina" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrajinčina" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Srbština" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrajinčina" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamčina" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Zdroj podporovaných jazykov" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Zoznam jazykov" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "preložiť" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Preložiť text z jazyka do druhého" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Preklad" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Neplatná požiadavka" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Chyba prekladu" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Spomaľte" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Zakázané" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Dobrý deň, svet!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Text(y) na preloženie" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Kód zdrojového jazyka" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Kód cieľového jazyka" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "text" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formát zdrojového textu:\n" +" * `text` - Jednoduchý text\n" +" * `html` - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Preferovaný počet alternatívnych prekladov" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API kľúč" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Preložiť súbor z jedného jazyka do iného" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Preložený súbor" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Súbor na preloženie" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detegovať jazyk jedného kusu textu" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Detekcie" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Chyba detekcie" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Text na detekciu" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Získať nastavenia špecifické pre rozhranie" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "Nastavenia rozhrania" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Poslať návrh na zlepšenie prekladu" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Úspech" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Chýba oprávnenie" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Pôvodný text" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Navrhnutý preklad" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Jazyk pôvodného textu" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Jazyk navrhovaného prekladu" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "spätná väzba" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Kód jazyka" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Ľudské meno jazyka (v angličtine)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Podporované cieľové jazykové kódy" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Preložený text(y)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Chybová správa" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Dôvod spomalenia" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Url preloženého súboru" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Miera istoty" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Limit vloženia znakov pre tento jazyk (-1 označuje žiadny limit)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Časový limit prekladu rozhrania" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Či je povolená databáza API kľúčov." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Či je potrebný API kľúč." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Či je povolené posielanie návrhov." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Podporovaný formát súborov" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Či bolo podanie úspešné" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopírovať text" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Nemožno načítať %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Neznáma chyba" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Skopírované" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "Vďaka za vašu korekciu. Všimnite si, že návrh nebude mať vplyv hneď." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "K dispozícii nie sú žiadne jazyky. Nainštalovali ste modely správne?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Zadajte svoje API kľúč. Ak potrebujete kľúč API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "stlačte odkaz „Get API Key“." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "kontaktujte operátora servera." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Zadarmo a Open Source strojový preklad API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Zadarmo a Open Source strojového prekladu API. Seba-hosted, offline schopný " +"a ľahko nastaviť. Spustite svoj vlastný server API za pár minút." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "preklad" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API dokumentácia" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Získať API kľúč" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Nastaviť API kľúč" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Zmeniť jazyk" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Upraviť" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Toggle tmavý / svetelný režim" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Odmietnuť" + +#: 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 "" +"Vzhľadom na bot zneužívanie, žiadosti o preklad sú dočasne obmedzené pre " +"užívateľov s platným API kľúčom. Ospravedlňujeme sa za nepríjemnosti!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Prekladové API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Preložiť text" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Preložiť súbory" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Preložiť z" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Zameniť zdrojový a cieľový jazyk" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Preložiť do" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Text na preloženie" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Odstrániť text" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Navrhnúť preklad" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Zrušiť" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Odoslať" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Podporované formáty súborov:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Súbor" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Odstrániť súbor" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Preložiť" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Stiahnuť" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Žiadosť" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Odpoveď" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open Source strojového prekladu API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Samostatne. Offline Capable. Jednoduché nastavenie." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licencia:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Vyrobené s %(heart)s za pomoci %(contributors)s a poháňaný %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Prispievatelia" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/formátové údaje" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamčina" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Toto verejné API by malo byť použité pre testovanie, osobné alebo zriedkavé " +#~ "použitie. Ak sa chystáte spustiť aplikáciu vo výrobe, prosím %(host_server)s" +#~ " alebo %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "hostiť svoj vlastný server" + +#~ msgid "get an API key" +#~ msgstr "získať API kľúč" + +#~ msgid "Basque" +#~ msgstr "Všeobecný" + +#~ msgid "Galician" +#~ msgstr "Galský" diff --git a/self_host/LibreTranslate/libretranslate/locales/sk/meta.json b/self_host/LibreTranslate/libretranslate/locales/sk/meta.json new file mode 100644 index 00000000..f8c255d7 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sk/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Slovak", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/sl/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/sl/LC_MESSAGES/messages.po new file mode 100644 index 00000000..438c7e76 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sl/LC_MESSAGES/messages.po @@ -0,0 +1,747 @@ +# Slovenian translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-08-08 13:03-0400\n" +"Last-Translator: FULL NAME \n" +"Language-Team: sl \n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Neveljavna oblika JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Samodejno zaznaj" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Nepooblaščen" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Preveč zahtevkov omejuje kršitve" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Neveljaven ključ API" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Prosimo kontaktirajte operaterja strežnika, da dobite API ključ" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Obisk %(url)s dobiti API ključ" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Upočasni:" + +#: 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 "Neveljaven zahtevek: manjka %(name)s parameter" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Neveljavna zahteva: %(name)s parameter ni številka" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Neveljavna zahteva: %(name)s Parameter mora biti pomanjkljiv %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Neveljavna zahteva: zahteva (%(size)s) presega mejo besedila (%(limit)s)" + +#: 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 ni podprto" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s oblika ni podprta" + +#: 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) ni na voljo kot ciljni jezik %(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Ni moč prevesti besedila: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Prevajanje datotek je onemogočeno na tem strežniku." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Neveljavna zahteva: prazna datoteka" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Neveljaven zahtevek: oblika datoteke ni podprta" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Neveljavno ime datoteke" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Predlogi so onemogočeni na tem strežniku." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Angleščina" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "AlbanskoName" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabščina" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbajdžan" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengalska" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bolgarščina" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalonščina" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Kitajska" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kitajska (tradicionalna)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Češka" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danski" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Nizozemska" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estonščina" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finska" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francoski" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Nemščina" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grščina" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebrejsko" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Madžarska" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonezijski" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irska" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italijanska" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonka" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Korejska" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Latvijščina" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litva" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malay" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norveška" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Perzijščina" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Poljska" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugalščina" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugalska (Brazilija)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romunska" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ruščina" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovaščina" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovenski" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Španščina" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Švedska" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tajska" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turška" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukranian" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Srbska" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrajinski" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamec" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Pridobi seznam podprtih jezikov" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Seznam jezikov" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "prevedi" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Prevedi besedilo iz jezika v jezik" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Prevedeno besedilo" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Neveljavna zahteva" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Napaka pri prevajanju" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Počasi" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Prepovedano" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Pozdravljen svet!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Besedilo za prevajanje" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Koda izvornega jezika" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Oznaka ciljnega jezika" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "besedilo" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Oblika izvornega besedila:\n" +"* `besedilo' - navadno besedilo\n" +"* `html' - pribitek HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Prednostna številka alternativnih prevodov" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Ključ API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Prevedi datoteko iz jezika v drug jezik" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Prevedena datoteka" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Datoteka za prevajanje" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Zaznaj jezik enega besedila" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Odkrivanje" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Napaka pri odkrivanju" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Besedilo za odkrivanje" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Pridobi posebne nastavitve za prednji konec" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "nastavitve prednjega okna" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "začelje" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Predloži predlog za izboljšanje prevoda" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Uspeh" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Ni dovoljeno" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Originalno besedilo" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Predlagani prevod" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Jezik izvirnega besedila" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Jezik predlaganega prevajanja" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "povratne informacije" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Jezikovna koda" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Ime jezika, ki ga je mogoče brati (v angleščini)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Podprte ciljne jezikovne kode" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Prevedena besedila" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Sporočilo o napaki" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Razlog za upočasnitev" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Prevedena datoteka url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Vrednost zaupanja" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Omejitev vnosa znakov za ta jezik (-1 označuje brez omejitve)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Zakasnitev prevajanja v začetku" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Ali je omogočena zbirka ključev API." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Ali je potreben ključ API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Ali je predlog omogočen." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Oblika podprtih datotek" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Ali je bila vloga uspešna" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopiraj besedilo" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Ni moč naložiti %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Neznana napaka" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopirano" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "Hvala za popravek. Upoštevajte, da predlog ne bo takoj začel veljati." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Jeziki niso na voljo. Ste pravilno namestili modele?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Vtipkaj svoj API ključ. Če potrebujete API ključ, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "pritisnite » Get API Key«." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "kontaktirajte operaterja strežnika." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Brezplačno in odprtokodno strojno prevajanje API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Brezplačno in odprtokodno strojno prevajanje API. Samo-gostitelj, brez " +"povezave sposoben in enostaven za namestitev. Poženite svoj API strežnik v " +"samo nekaj minutah." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "prevod" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Dobi API Ključ" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Nastavi API Ključ" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Spremeni jezik" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Uredi" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Preklopi temen/lahek način" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Prosto" + +#: 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 "" +"Zaradi zlorabe bota so zahteve za prevod začasno omejene na uporabnike z " +"veljavnim API ključem. Oprostite za neprijetnosti!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Prevod API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Prevedi besedilo" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Prevedi datoteke" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Prevedi iz" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Zamenjaj izvorne in ciljne jezike" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Prevedi v" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Besedilo za prevajanje" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Zbriši besedilo" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Predlog za prevod" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Prekliči" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Pošlji" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Podprti formati datotek:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Datoteka" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Odstrani datoteko" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Prevedi" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Prenesi" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Zahtevek" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Odziv" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API za prevajanje odprtokodnega stroja" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Samosvoj. Nesposobna. Enostavna nastavitev." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibrePrevajanje" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licenca:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Narejeno z %(heart)s z %(contributors)s in napajajo %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Prispevki" + +#~ msgid "Basque" +#~ msgstr "BaskovskoName" + +#~ msgid "Galician" +#~ msgstr "Galščina" diff --git a/self_host/LibreTranslate/libretranslate/locales/sl/meta.json b/self_host/LibreTranslate/libretranslate/locales/sl/meta.json new file mode 100644 index 00000000..9e715251 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sl/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Slovenian", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/sq/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/sq/LC_MESSAGES/messages.po new file mode 100644 index 00000000..66f9d678 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sq/LC_MESSAGES/messages.po @@ -0,0 +1,764 @@ +# Albanian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: sq\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Format i pavlefshëm JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Auto" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "I paautorizuar" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Tepër kërkojnë shkelje të kufizimeve" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Kyç i pavlefshëm" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Vihu në kontakt me operatorin e serverit për të marrë një kyç API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Vizitim %(url)s merr a" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Ngadalë:" + +#: 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 "Kërkesë e pavlefshme: mungon %(name)s Parametër" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Kërkesë e pavlefshme: %(name)s nuk a" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Kërkesë e pavlefshme: %(name)s Parametri duhet të jetë <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Kërkesë e pavlefshme: (%(size)s) tejkaloi kufirin e tekstit (%(limit)s)" + +#: 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 nuk suportohet" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s Format i pasuportuar" + +#: 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)snuk është a %(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "I pamundur përkthimi i tekstit: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "File në server j." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Kërkesë e pavlefshme: file bosh" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Kërkesë e pavlefshme: Format i pasuportuar file" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Emri" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Propozimet në këtë server janë të çaktivizuar." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Anglisht" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Shqip" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabisht" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaixhani" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bullgarisht" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalane" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Kineze" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kineze" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Çekisht" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danisht" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Hollandeze" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estonisht" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finlandeze" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Frengjisht" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Gjermanisht" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Greqisht" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebraike" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Hungarisht" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indoneziane" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandeze" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italisht" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonisht" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreane" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Letonisht" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Lituaniane" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malay" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norvegjeze" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persiane" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polonisht" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugalisht" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugeze (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumanisht" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rusisht" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Sllovak" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Sllovene" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spanjisht" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Suedisht" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tailandeze" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turqisht" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukraneze" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbe" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "UkrahinaseHebrew, Visual" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnameze" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Duke marrë listën e gjuhëve të suportuara" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lista e gjuhëve" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "për" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Përkthe tekstin nga një gjuhë në një tjetër" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Teksti i përkthyer" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Kërkesë e pavlefshme" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Gabim në përkthimin" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Ngadalë" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Ndaluar" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Përshëndetje botë!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Teksti" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Kodi i gjuhës së buruesit" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Objektivi kodi" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "tekst" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Formati i tekstit burim:\n" +"* tekst i thjeshtë\n" +"* Hhtml-Spanj HTML\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Numri i preferuar i përkthimeve alternative" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Pulsanti API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Përkthe skedarët nga një gjuhë tek tjetra" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Përkther file" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "File nga" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Dekto gjuhën e një teksti të vetëm" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Deteksione" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Gabim në shmangje" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Teksti që duhet zbuluar" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Duke marrë rregullimet e prezgjedhura" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "parametrat" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "A" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Me sukses" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Nuk është i autorizuar" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Tekst origjinal" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Sugjerim për përkthimin" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Gjuha e tekstit origjinal" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Gjuha e përkthimit të sugjeruar" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "release" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Kodi i gjuhës" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Emri i gjuhës së lexueshme (në anglisht)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Kodi i gjuhës së synuar" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Përkthehet teksti" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Gabim" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Arsye për të ngadalësuar" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Përktheu file url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Vlera e besimit" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Për nuk" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Ndërfaqe" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Tregon nëse është aktivizuar databaza e kyçit API." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Nëse nevoitet një kyç API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Nëse është aktivuar paraqitja e sugjerimeve." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Format i suportuar files" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Nëse nënshtrimi ishte i suksesshëm" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopjo tekstin" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "I pamundur ngarkimi %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Gabim i panjohur" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopjuar" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Faleminderit për korrigjimin. Vër re se sugjerimi nuk do të ndikojë " +"menjëherë." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Asnjë gjuhë në dispozicion. I instalove mirë modelet?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Lloji në çelësin tuaj API. Nëse ju duhet një çelës API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "shtyp lidhjen \"Merr API.\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "kontaktoni operatorin e serverit." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Translation falas dhe i hapur i makinave" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Translation i Makinave Free dhe Open. Vetë-pritur, jashtë linje i aftë dhe i" +" lehtë për t'u krijuar. Zbatoni serverin tuaj API për pak minuta." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "përkthimi" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Merr API Kenia" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Vendose Kenia" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Ndrysho gjuhën" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Ndrysho" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Kavo" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Të këqijat" + +#: 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 "" +"Për shkak të abuzimit me robotët, kërkesat e përkthimit janë përkohësisht të" +" kufizuara për përdoruesit me një çelës të vlefshëm aPI. Më fal për " +"shqetësimin!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Përkthimi" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Përkthe tekstin" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Përkthe files" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Përkthe nga" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Dhe" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Përkthe në" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Teksti që duhet përkthyer" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Fshi tekstin" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Sugjerim për përkthimin" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Anullo" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Dërgo" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Formatet e suportuar të file:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "File" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Hiq file" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Përkthe" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Shkarkimi" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Kërkesë" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Përgjigje" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Përkthimi i Makinës Burimit" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "E vetmuar. Jashtë Kapit. E lehtë për t'u rregulluar." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "Libre Translate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Liçenca:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "E bërë me %(heart)s nga %(contributors)s Dhe fuqizuar nga %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Ndihmuan" + +#~ msgid "Vietnamese" +#~ msgstr "" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "Baske" + +#~ msgid "Galician" +#~ msgstr "Galiciani" diff --git a/self_host/LibreTranslate/libretranslate/locales/sq/meta.json b/self_host/LibreTranslate/libretranslate/locales/sq/meta.json new file mode 100644 index 00000000..b3cfa9fe --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sq/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Albanian", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/sr/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/sr/LC_MESSAGES/messages.po new file mode 100644 index 00000000..245394dd --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sr/LC_MESSAGES/messages.po @@ -0,0 +1,770 @@ +# Serbian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-01-15 11:58+0000\n" +"Last-Translator: Lav Rottweiler \n" +"Language: sr\n" +"Language-Team: Serbian " +"\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Nevažeći JSON format" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Auto Detekcija" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Neovlašćeno" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Previše zahteva i kršenja ograničenja" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Nevažeći API ključ" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Kontaktirajte operatera servera da dobijete API ključ" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Posetite %(url)s da bi ste dobili API ključ" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Uspori:" + +#: 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 "Nevažeći zahtev: nedostaje parametar %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Nevažeći zahtev: parametar %(name)s nije broj" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Nevažeći zahtev: parametar %(name)s mora biti <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Nevažeći zahtev: zahtev (%(size)s) premašuje ograničenje teksta " +"(%(limit)s)" + +#: 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 nije podržan" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s format nije podržan" + +#: 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) nije dostupan kao ciljni jezik is %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Nije moguće prevesti tekst:%(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Prevođenje fajlova je onemogućeno na ovom serveru." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Nevažeći zahtev: prazan fajl" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Nevažeći zahtev: format fajla nije podržan" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Nepostojeće ime fajla" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Predlozi su onemogućeni na ovom serveru." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Engleski" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanski" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arapski" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbejdžanski" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengalski" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bugarski" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalonski" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Kineski" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kineski (tradicionalni)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Češki" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danski" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holandski" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estonski" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finski" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Francuski" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Nemački" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grčki" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebrejski" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Indijski" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Mađarski" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonežanski" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irski" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italijanski" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japanski" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Korejski" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Latvijski" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litvanski" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malezijski" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norveški" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persijski" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Poljski" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugalski" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumunski" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ruski" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovacki" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovenački" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Španski" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Švedski" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagaloški" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tajlandski" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turski" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukrajinski" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Srpski" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrajnski" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vijetnamski" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Preuzmite listu podržanih jezika" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lista jezika" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "prevodi" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Prevedite tekst sa jednog jezika na drugi" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Prevedeni tekst" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Nevažeći upit" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Greška u prevodu" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Uspori" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Zabranjeno" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Zdravo Svete!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Tekst(ovi) za prevod" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Jezik izvornog koda" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Kod ciljnog jezika" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "tekst" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format izvornog teksta:\n" +" * `text` - običan tekst\n" +" * `html` - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Željeni broj alternativnih prevoda" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API ključ" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Prevedite fajl sa jednog jezika na drugi" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Prevedeni fajl" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fajl za prevod" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Detektuj jezik u tekstu" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Detekcija" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Greška u detekciji" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Tekst za detekciju" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Preuzmi specifična podešavanja frontenda" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "podešavanja frontenda" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Pošaljite predlog za poboljšanje prevoda" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Uspešno" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Nije dozvoljeno" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Originalni tekst" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Predloženi prevod" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Jezik originalnog teksta" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Jezik predloženog prevoda" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "povratne info" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Jezik koda" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Ime jezika (na engleskom)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Podržani kodovi ciljnog jezika" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Prevedeni tekst(ovi)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Poruka o grešci" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Razlog za usporavanje" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL prevedenog fajla" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Nivo poverenja" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Ograničenje unosa znakova za ovaj jezik (-1 označava da nema ograničenja)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Vremensko ograničenje za prevod na frontendu" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Da li je omogućena baza podataka API ključeva." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Kada je potreban API ključ." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Kada je slanje predloga omogućeno." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Podržani format fajlova" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Da li je podnošenje bilo uspešno" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopiraj teks" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Nije moguće učitati %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Nepoznata greška" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopirano" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "Hvala na ispravci. Imajte na umu da predlog neće odmah stupiti na snagu." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Nema dostupnih jezika. Da li ste pravilno instalirali modele?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Unesite svoj API ključ. Ako vam je potreban API ključ,%(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "kliknite na „Preuzmi API ključ“." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "kontaktirajte administratora servera." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Besplatni API za mašinsko prevođenje otvorenog koda" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Besplatni API za mašinsko prevođenje otvorenog koda. Hostovan na vašem " +"serveru, lokalna verzija i jednostavan za podešavanje. Pokrenite " +"sopstveni API server za samo nekoliko minuta." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "prevod" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API dokumentacija" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Nabavite API ključ" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Kreiraj API ključ" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Promeni jezik" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Izmeni" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "tamni/svetli mod" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Odbaci" + +#: 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 za prevođenje" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Prevedi Tekst" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Prevedi Fajl" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Prevedi iz" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Zamenite izvorni i ciljni jezik" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Prevesti u" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Tekst za prevod" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Izbriši tekst" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Predloži prevod" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Otkaži" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Pošalji" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Podržani formati fajlova:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fajl" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Izbriši fajl" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Prevedi" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Preuzmi" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Zahtev" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Odgovor" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API za prevođenje otvorenog koda" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Hostujte sami. Radi i bez internet konekcije. Laka instalacija." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "SlobodniPrevodilac" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licenca:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Napravljen sa %(heart)s, sa %(contributors)s , i pokreće ga %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Saradnici" + +#~ msgid "Vietnamese" +#~ msgstr "Vijetnamski" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Ovaj javni API bi trebalo da se" +#~ " koristi za testiranje, ličnu ili " +#~ "retku upotrebu. Ako nameravate da " +#~ "pokrenete aplikaciju u produkciji, molim " +#~ "vas %(host_server)s ili %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "hostujte svoj server" + +#~ msgid "get an API key" +#~ msgstr "zatraži API ključ" + +#~ msgid "Basque" +#~ msgstr "Baskijski" + +#~ msgid "Galician" +#~ msgstr "Galicijski" + diff --git a/self_host/LibreTranslate/libretranslate/locales/sr/meta.json b/self_host/LibreTranslate/libretranslate/locales/sr/meta.json new file mode 100644 index 00000000..e8f8cc4d --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sr/meta.json @@ -0,0 +1,4 @@ +{ + "name": "sr", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/sv/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/sv/LC_MESSAGES/messages.po new file mode 100644 index 00000000..6163dc2f --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sv/LC_MESSAGES/messages.po @@ -0,0 +1,785 @@ +# Swedish translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2023-03-01 08:36+0000\n" +"Last-Translator: tygyh \n" +"Language-Team: Swedish \n" +"Language: sv\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Invalid JSON-format" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Identifiera Automatiskt" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Obehörig" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "För många förfrågningar begränsar överträdelser" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Invalid API nyckel" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Kontakta serveroperatören för att få en API-nyckel" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Besök %(url)s för att få en API-nyckel" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Nedsaktning:" + +#: 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 "Ogiltig begäran: parametern %(name)s saknas" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" +"Ogiltig begäran: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 parameter är inte ett tal %(name)s" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Ogiltig begäran: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " +"0 parameter måste vara ≤ 1 1 %(name)s %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Ogiltig begäran: begäran %(size)s överstiger textgränsen (%(limit)s)" + +#: 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 stöds inte" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s-formatet stöds inte" + +#: 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) är inte tillgängligt som målspråk från %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Kan inte översätta text: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Filöversättning är inaktiverad på denna server." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Ogiltig begäran: tom fil" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Ogiltig begäran: filformat som inte stöds" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Invalid filnamn" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Förslag är inaktiverade på denna server." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Engelska" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanska" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabiska" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbajdzjan" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgariska" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalanska" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Kinesiska" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Kinesiska (traditionell)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Tjeckien" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danska" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Holländska" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estland" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Finska finska" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Franska franska" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Tyska tyska" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Grekiska" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebreiska" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Ungerska" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesiska" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irländska" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italienska Italien" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japansk" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreanska" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Lettland" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litauen" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malay" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norska" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persiska" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polska" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portugisiska" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portugisiska (Brasilien)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Rumänien" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ryska" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovakiska" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovenska" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Spanska spanska" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Svenska" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thailändska" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turkiska" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukraniska" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbiska" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrainska" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamesiska" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Hämta lista över stödda språk" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Lista över språk" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "översättning" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Översätt text från ett språk till ett annat" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Översatt text" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Ogiltig begäran" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Översättningsfel" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Sakta ner" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Bannad" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Hello världen!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Text(er) att översätta" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Källspråkskod" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Målspråkskod" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "text" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Format för källtext:\n" +"\"text\" - vanlig text\n" +"\"html\" - HTML-märkning\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Föredraget antal alternativa översättningar" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API-nyckel" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Översätt fil från ett språk till ett annat" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Översatt fil" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Fil att översätta" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Upptäck språket i en enda text" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Detektioner" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Detektering fel" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Text att upptäcka" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Hämta frontend specifika inställningar" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "frontend inställningar" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "frontend" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Skicka in ett förslag för att förbättra en översättning" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Framgång" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Inte auktoriserad" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Originaltext" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Föreslagen översättning" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Språk av originaltext" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Språk av föreslagen översättning" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "återkoppling" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Språkkod" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Mänskligt läsbart språknamn (på engelska)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Stödda målspråkskoder" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Översatt text(er)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Felmeddelande" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Reason för slow down" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Översatt fil url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Förtroendevärde" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Teckengräns för detta språk (-1 anger ingen gräns)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Frontend översättning timeout" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Oavsett om API-nyckeldatabasen är aktiverad." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Oavsett om en API-nyckel krävs." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Oavsett om det är möjligt att lämna in förslag." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Stödda filer format" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Oavsett om inlämning var framgångsrik" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopiera text" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Kan inte ladda %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Okänd fel" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopierad" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Tack för din korrigering. Observera att förslaget inte kommer att träda i " +"kraft direkt." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Inga språk tillgängliga. Har du installerat modellerna korrekt?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"Skriv in din API-nyckel. Om du behöver en API-nyckel, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "tryck på länken \"Get API Key\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "kontakta serveroperatören." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Gratis och öppen källkod Maskinöversättning API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Gratis och öppen källkod Maskinöversättning API. Självvärd, offline kapabel " +"och lätt att installera. Kör din egen API-server på bara några minuter." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "översättning" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Få API Nyckeln" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Ställ in API Nyckeln" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Ändra språk" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Redigera" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Växla mörkt/ljusläge" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Avfärda" + +#: 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 "" +"På grund av bot missbruk är översättningsförfrågningar tillfälligt " +"begränsade till användare med en giltig API-nyckel. Förlåt för besväret!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Översättning API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Översätt text" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Översätt filer" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Översättning från" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Swap källa och målspråk" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Översätt till" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Text att översätta" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Ta bort text" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Föreslå översättning" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Avbokning" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Skicka" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Stödda filformat:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Fil" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Ta bort filen" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Översättning" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Ladda ner" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Begäran" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Svar" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API för maskinöversättning med öppen källkod" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Självhäftad. Offline kapabel. Lätt att ställa in." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Licens:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Tillverkad med %(heart)s av %(contributors)s och drivs av %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Bidragsgivare" + +#~ msgid "multipart/form-data" +#~ msgstr "multipart/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamesiska" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Detta offentliga API bör användas för testning, personlig eller sällsynt " +#~ "användning. Om du ska köra en ansökan i produktionen, vänligen " +#~ "%(host_server)s eller %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "värd din egen server" + +#~ msgid "get an API key" +#~ msgstr "få en API-nyckel" + +#~ msgid "Basque" +#~ msgstr "Basket" + +#~ msgid "Galician" +#~ msgstr "Galiker" diff --git a/self_host/LibreTranslate/libretranslate/locales/sv/meta.json b/self_host/LibreTranslate/libretranslate/locales/sv/meta.json new file mode 100644 index 00000000..c5b5b464 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/sv/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Swedish", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/ta/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ta/LC_MESSAGES/messages.po new file mode 100644 index 00000000..8e9e9e52 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ta/LC_MESSAGES/messages.po @@ -0,0 +1,754 @@ +# Tamil translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.2\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-06-28 13:05+0000\n" +"Last-Translator: தமிழ்நேரம் \n" +"Language-Team: Tamil \n" +"Language: ta\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.13-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "தவறான சாதொபொகு வடிவம்" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "ஆட்டோ கண்டறிதல்" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "அங்கீகரிக்கப்படாதது" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "பல கோரிக்கை மீறல்களைக் கட்டுப்படுத்துகிறது" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "தவறான பநிஇ விசை" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "பநிஇ விசையைப் பெற சேவையக ஆபரேட்டரைத் தொடர்பு கொள்ளவும்" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "பநிஇ விசையைப் பெற %(url)s ஐப் பார்வையிடவும்" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "மந்தநிலை:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "தவறான கோரிக்கை: %(name)s அளவுரு ஒரு எண் அல்ல" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "தவறான கோரிக்கை: %(name)s அளவுரு <= %(value)s இருக்க வேண்டும்" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s வடிவமைப்பு ஆதரிக்கப்படவில்லை" + +#: 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 "" +"%(sname)s%(scode)s இலிருந்து %(tname)s%(tcode)s இலக்கு மொழியாகக் கிடைக்கவில்லை" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "உரையை மொழிபெயர்க்க முடியாது: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "இந்த சேவையகத்தில் கோப்புகள் மொழிபெயர்ப்பு முடக்கப்பட்டுள்ளது." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "தவறான கோரிக்கை: வெற்று கோப்பு" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "தவறான கோரிக்கை: கோப்பு வடிவம் ஆதரிக்கப்படவில்லை" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "தவறான கோப்பு பெயர்" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "இந்த சேவையகத்தில் பரிந்துரைகள் முடக்கப்பட்டுள்ளன." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "ஆங்கிலம்" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "அல்பேனிய" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "அரபு" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "அசர்பைசானி" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "பெங்காலி" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "பல்கேரியன்" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "கற்றலான்" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "சீன" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "சீன (பாரம்பரிய)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "செக்" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "டேனிச்" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "டச்சு" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "எச்பெராண்டோ" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "எச்டோனிய" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "பின்னிச்" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "பிரஞ்சு" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "செர்மன்" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "கிரேக்கம்" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "எபிரேய" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "இந்தி" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "அங்கேரியன்" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "இந்தோனேசிய" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "ஐரிச்" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "இத்தாலிய" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "சப்பானியர்கள்" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "கொரிய" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "லாட்வியன்" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "லிதுவேனியன்" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "மலாய்" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "நோர்வே" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "பெர்சியன்" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "போலீச்" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "போர்த்துகீசியம்" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "போர்த்துகீசியம் (பிரேசில்)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "ருமேனிய" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "ரச்ய" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "ச்லோவாக்" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "ச்லோவேனியன்" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "ச்பானிச்" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "ச்வீடிச்" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "டாக்லாக்" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "தாய்" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "துருக்கிய" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "உக்ரேனிய" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "உருது" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "செர்பிய" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "உக்ரேனியன்" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "வியட்நாமிய" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "உதவி மொழிகளின் பட்டியலை மீட்டெடுக்கவும்" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "மொழிகளின் பட்டியல்" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "மொழிபெயர்த்திடு" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "உரையை ஒரு மொழியிலிருந்து இன்னொரு மொழிக்கு மொழிபெயர்க்கவும்" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "மொழிபெயர்க்கப்பட்ட உரை" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "தவறான கோரிக்கை" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "மொழிபெயர்ப்பு பிழை" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "மெதுவாக" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "தடைசெய்யப்பட்டது" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "வணக்கம் உலகம்!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "மொழிபெயர்க்க உரை (கள்)" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "மூல மொழி குறியீடு" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "இலக்கு மொழி குறியீடு" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "உரை" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "உஉகுமொ" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"மூல உரையின் வடிவம்:\n" +" * `உரை` - எளிய உரை\n" +" * `html` - உஉகுமொ markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "மாற்று மொழிபெயர்ப்புகளின் விருப்பமான எண்ணிக்கை" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "பநிஇ விசை" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "கோப்பை ஒரு மொழியிலிருந்து இன்னொரு மொழிக்கு மொழிபெயர்க்கவும்" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "மொழிபெயர்க்கப்பட்ட கோப்பு" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "மொழிபெயர்க்க கோப்பு" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "ஒற்றை உரையின் மொழியைக் கண்டறியவும்" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "கண்டறிதல்கள்" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "கண்டறிதல் பிழை" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "கண்டறிய உரை" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "ஃபிரான்டென்ட் குறிப்பிட்ட அமைப்புகளை மீட்டெடுக்கவும்" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "ஃபிரான்டென்ட் அமைப்புகள்" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "ஃபிரான்ட்" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "மொழிபெயர்ப்பை மேம்படுத்த ஒரு ஆலோசனையை சமர்ப்பிக்கவும்" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "செய்" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "ஏற்பு இல்லை" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "அசல் உரை" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "பரிந்துரைக்கப்பட்ட மொழிபெயர்ப்பு" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "அசல் உரையின் மொழி" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "பரிந்துரைக்கப்பட்ட மொழிபெயர்ப்பின் மொழி" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "கருத்து" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "மொழி குறியீடு" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "மனிதனால் படிக்கக்கூடிய மொழி பெயர் (ஆங்கிலத்தில்)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "ஆதரிக்கப்பட்ட இலக்கு மொழி குறியீடுகள்" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "மொழிபெயர்க்கப்பட்ட உரை (கள்)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "பிழை செய்தி" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "மெதுவாக இருப்பதற்கான காரணம்" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "மொழிபெயர்க்கப்பட்ட கோப்பு முகவரி" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "நம்பிக்கை மதிப்பு" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"இந்த மொழிக்கான எழுத்து உள்ளீட்டு வரம்பு (-1 வரம்பு இல்லை என்பதைக் " +"குறிக்கிறது)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "ஃபிரான்டென்ட் மொழிபெயர்ப்பு நேரம் முடிந்தது" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "பநிஇ விசை தரவுத்தளம் இயக்கப்பட்டதா என்பதை." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "பநிஇ விசை தேவையா என்பதை." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "பரிந்துரைகளை சமர்ப்பிப்பது இயக்கப்பட்டதா." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "ஆதரிக்கப்பட்ட கோப்புகள் வடிவம்" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "சமர்ப்பிப்பு வெற்றிகரமாக இருந்ததா" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "உரையை நகலெடுக்கவும்" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "%(url)s ஏற்ற முடியாது" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "தெரியாத பிழை" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "நகலெடுக்கப்பட்டது" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"உங்கள் திருத்தத்திற்கு நன்றி. குறிப்பு பரிந்துரை இப்போதே நடைமுறைக்கு " +"வராது." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "மொழிகள் எதுவும் கிடைக்கவில்லை. நீங்கள் மாதிரிகளை சரியாக நிறுவினீர்களா?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"உங்கள் பநிஇ விசையில் தட்டச்சு செய்க. உங்களுக்கு பநிஇ விசை தேவைப்பட்டால், " +"%(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "\"பநிஇ கீ\" இணைப்பை அழுத்தவும்." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "இலவச மற்றும் திறந்த மூல இயந்திர மொழிபெயர்ப்பு பநிஇ" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"இலவச மற்றும் திறந்த மூல இயந்திர மொழிபெயர்ப்பு பநிஇ. சுய-ஓச்ட், " +"இணைப்பில்லாத திறன் மற்றும் அமைக்க எளிதானது. உங்கள் சொந்த பநிஇ சேவையகத்தை " +"சில நிமிடங்களில் இயக்கவும்." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "மொழிபெயர்ப்பு" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "பநிஇ" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "பநிஇ டாக்ச்" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "பநிஇ விசையைப் பெறுங்கள்" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "கிரப்" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "பநிஇ விசையை அமைக்கவும்" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "மொழியை மாற்றவும்" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "தொகு" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "இருண்ட/ஒளி பயன்முறையை மாற்றவும்" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "தள்ளுபடி" + +#: 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 "மொழிபெயர்ப்பு பநிஇ" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "உரையை மொழிபெயர்க்கவும்" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "கோப்புகளை மொழிபெயர்க்கவும்" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "இருந்து மொழிபெயர்க்கவும்" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "மூலத்தை மாற்றவும் மற்றும் இலக்கு மொழிகள்" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "மொழிபெயர்க்கவும்" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "மொழிபெயர்க்க உரை" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "உரையை நீக்கு" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "மொழிபெயர்ப்பை பரிந்துரைக்கவும்" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "ரத்துசெய்" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "அனுப்பு" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "உதவி கோப்பு வடிவங்கள்:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "கோப்பு" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "கோப்பை அகற்று" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "மொழிபெயர்த்திடு" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "பதிவிறக்கம்" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "கோரிக்கை" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "பதில்" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "திறந்த மூல இயந்திர மொழிபெயர்ப்பு பநிஇ" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "சுய-ஓச்ட். இணைப்பில்லாத திறன். அமைக்க எளிதானது." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "லிப்ரெட்ரான்ச்லேட்" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "உரிமம்:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"%(heart)s %(contributors)s மூலம் தயாரிக்கப்படுகின்றன மற்றும் %(engine)s " +"மூலம் இயக்கப்படுகின்றன" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s பங்களிப்பாளர்கள்" + +#~ msgid "Basque" +#~ msgstr "பாச்க்" + +#~ msgid "Galician" +#~ msgstr "காலிசியன்" diff --git a/self_host/LibreTranslate/libretranslate/locales/th/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/th/LC_MESSAGES/messages.po new file mode 100644 index 00000000..c51bee43 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/th/LC_MESSAGES/messages.po @@ -0,0 +1,746 @@ +# Thai translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-06-05 16:54+0000\n" +"Last-Translator: Anucha Lhaononkor \n" +"Language-Team: Thai \n" +"Language: th\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "รูปแบบ JSON ไม่ถูกต้อง" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "ตรวจสอบอัตโนมัติ" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "ไม่ได้รับอนุญาต" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "มีการละเมิดข้อห้ามมากเกินไป" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "กุญแจ API ใช้ไม่ได้หรือไม่ถูกต้อง" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "โปรดติดต่อโอเปอเรเตอร์เพื่อรับกุญแจ API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "ไปยัง %(url)s เพื่อเอากุญแจ API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "ชะลอ :" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "การร้องขอไม่ถูกต้อง : %(name)s พารามิเตอร์ไม่ใช่ตัวเลข" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "การร้องขอไม่ถูกต้อง : %(name)s พารามิเตอร์ต้องเป็น <= %(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s ยังไม่รองรับการฟอร์แมต" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "ไม่สามารถแปลข้อความ : %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "การแปลของแฟ้มถูกปิดการใช้งานบนเซิร์ฟเวอร์นี้." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "การร้องขอไม่ถูกต้อง : ไฟล์ว่างเปล่า" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "การร้องขอไม่ถูกต้อง : ยังไม่รองรับรูปแบบของแฟ้ม" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "ชื่อแฟ้มไม่ถูกต้อง" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "คําแนะนําถูกปิดการใช้งานบนเซิร์ฟเวอร์นี้." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "อังกฤษ" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "อัลเบเนีย" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "อารบิก" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "อาร์เซอร์ไบจัน" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "เบงกาลี" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "บัลแกเรีย" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "คาตาลัน" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "จีน" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "จีน (ดั้งเดิม)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "เชค" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "เดนมาร์ก" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "ดัตช์" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "เอสเปรันโต" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "เอสโตเนีย" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "ฟินแลนด์" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "ฝรั่งเศส" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "เยอรมัน" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "กรีก" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "ฮีบรู" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "ฮินดู" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "ฮังการี" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "อินโดนีเซีย" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "ไอริชName" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "อิตาลี" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "ญี่ปุ่น" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "เกาหลี" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "ภาษาลัตเวียName" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "ภาษาลิทัวเนียName" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "ภาษามาเลย์Name" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "นอร์เวย์" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "เปอร์เซีย" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "โปแลนด์" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "โปรตุเกส" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "โปรตุเกส (บราซิล)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "โรมาเนียName" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "รัสเซีย" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "ภาษาสโลวาเกียName" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "ภาษาสโลเนียName" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "สเปน" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "สวีเดน" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "ป้ายกํากับ" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "ภาษาไทยName" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "ภาษาตุรกีName" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "ภาษาอุรากวัยName" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "อูร์ดู" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "เซอร์เบียName" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "ยูเครน" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "ภาษาเวียดนามName" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "รับรายการภาษาที่รองรับ" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "รายการภาษา" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "แปล" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "แปลข้อความจากภาษาเป็นภาษาอื่น" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "ข้อความที่แปลแล้ว" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "การร้องขอไม่ถูกต้อง" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "การแปลผิดพลาด" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "ช้าลงหน่อย" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "แบน" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "สวัสดีโลก!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "ข้อความที่จะแปล" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "รหัสภาษาต้นฉบับ" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "รหัสภาษาเป้าหมาย" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "ข้อความ" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"รูปแบบข้อความต้นฉบับ:\n" +"– ข้อความธรรมดา\n" +"*เพลง*\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "จํานวนที่ควรใช้ในการแปลภาษา" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "กุญแจ API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "แปลแฟ้มจากภาษาเป็นภาษาอื่น" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "แฟ้มที่แปลแล้ว" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "แฟ้มที่จะแปล" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "ตรวจจับภาษาของข้อความเดียว" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "ตรวจสอบ" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "การตรวจสอบผิดพลาด" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "ข้อความที่จะตรวจสอบ" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "รับค่าค่าหน้าจอที่กําหนด" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "ตั้งค่าด้านหน้า" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "ด้านหน้า" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "จง ส่ง ข้อ เสนอ แนะ เพื่อ ปรับ ปรุง การ แปล" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "สําเร็จ" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "ไม่ได้รับอนุญาต" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "ข้อความต้นฉบับ" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "แปลที่แนะนํา" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "ภาษาของต้นฉบับ" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "ภาษา ที่ มี การ แนะ ให้ แปล" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "การตอบกลับ" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "รหัสภาษา" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "ชื่อภาษาที่อ่านได้ของมนุษย์ (in อังกฤษ)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "รองรับรหัสภาษาเป้าหมาย" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "แปลข้อความ" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "ข้อความผิดพลาด" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "เหตุผลสําหรับช้าลง" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "แปลแฟ้ม url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "ค่าความละเอียด" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "จํากัดการป้อนอักขระสําหรับภาษานี้ (1 แสดงถึงไม่มีข้อจํากัด)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "เวลาแปลฟร้อนท์" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "จะเปิดใช้งานฐานข้อมูลกุญแจ API หรือไม่." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "ต้องการกุญแจ API หรือไม่." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "เปิดใช้การแนะนําการส่งข้อมูลหรือไม่." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "รูปแบบแฟ้มที่รองรับ" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "การส่งล้มเหลวหรือไม่" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "คัดลอกข้อความ" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "ไม่สามารถเรียกใช้ได้ %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุ" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "คัดลอก" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "ขอบคุณที่แก้ไข โปรด สังเกต ข้อ เสนอ แนะ นี้ จะ ไม่ มี ผล กระทบ ทันที." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "ไม่มีภาษา คุณติดตั้งแบบจําลองอย่างถูกต้องหรือไม่?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "กดลิงก์ \"get API คีย์\"." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API ฟรีและโอเพนซอร์ส" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 ฟรีและโอเพนซอร์ส ระบบควบคุมตัวเอง เชื่อมต่อได้ง่าย เรียกใช้เซิร์ฟเวอร์ " +"API ของคุณเองในไม่กี่นาที." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "แปล" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "หมอ API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "รับ API คีย์" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "กิตฮับ" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "ตั้งค่า API คีย์" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "เปลี่ยนภาษา" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "แก้ไข" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "สลับโหมดมืด/ แสง" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "ไม่สนใจ" + +#: 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 "" +"เนื่องจากการใช้หุ่นในทางที่ผิด การร้องขอให้แปลจะถูกจํากัดเฉพาะผู้ใช้ชั่วคราว" +" ด้วยกุญแจ API ที่ถูกต้อง ขออภัยในความไม่สะดวก!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "แปล API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "แปลข้อความ" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "แปลแฟ้ม" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "แปลจาก" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "เปลี่ยนแหล่งและภาษาเป้าหมาย" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "แปลเป็น" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "ข้อความที่จะแปล" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "ลบข้อความ" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "แนะนําการแปลภาษา" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "ยกเลิก" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "ส่ง" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "รูปแบบแฟ้มที่รองรับ:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "แฟ้ม" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "ลบแฟ้ม" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "แปล" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "ดาวน์โหลด" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "ต้องการ" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "ปฏิกิริยา" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API สําหรับแปลภาษาแบบโอเพนซอร์ส" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "หลงตัวเอง ไม่มีสัญญาณ ง่ายต่อการจัดฉาก." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "สัญญาอนุญาตสิทธิ์:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "สร้างด้วย %(heart)s โดย %(contributors)s และพลังงานโดย %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s ผู้มีส่วนร่วม" + +#~ msgid "Basque" +#~ msgstr "บาสก์" + +#~ msgid "Galician" +#~ msgstr "กาลิเซีย" diff --git a/self_host/LibreTranslate/libretranslate/locales/th/meta.json b/self_host/LibreTranslate/libretranslate/locales/th/meta.json new file mode 100644 index 00000000..4ae2cc0d --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/th/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Thai", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/tl/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/tl/LC_MESSAGES/messages.po new file mode 100644 index 00000000..844163dd --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/tl/LC_MESSAGES/messages.po @@ -0,0 +1,758 @@ +# Filipino (Philippines) translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-08-08 13:03-0400\n" +"Last-Translator: FULL NAME \n" +"Language-Team: fil_PH \n" +"Language: fil_PH\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Hindi tanggap na anyo ng JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Di - Nakikitang Awto" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Hindi awtorisado" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Napakarami ang humihiling ng limitasyon sa mga paglabag" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Hindi tanggap na key ng API" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" +"Pakisuyong makipag - ugnayan sa opereytor ng server upang makakuha ng susi " +"ng API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Pagdalaw %(url)s upang makakuha ng susing API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Mabagal:" + +#: 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 "Imbalidong pangalan ng programa: bigo %(name)s parameter" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Imbalidong kahilingan: %(name)s Hindi numero ang parameter" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" +"Imbalidong kahilingan: %(name)s Ang parameter ay dapat <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Imbalidong pangalan ng programa: (%(size)s) lumampas sa itinakdang teksto " +"(%(limit)s)" + +#: 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 hindi suportado ang mga symbolic link" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s Hindi suportado ang mga symbolic link" + +#: 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) ay hindi magagamit bilang isang wikang puntirya mula " +"sa %(sname)s (%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Hindi maisalin ang teksto: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Ang salin ng talaksan ay may kapansanan sa server na ito." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Imbalidong pangalan ng programa: bigong talaksan" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Hindi tanggap na hostname" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Ang mga mungkahi ay may kapansanan sa serverg ito." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Albanian" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arabe" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerbaijani" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengali" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgariano" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Catalan" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Tsino" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Tsino (tradisyonal)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Czech" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danes" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Olandes" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estoniano" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Wikang Pinlandes" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Pranses" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Aleman" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Griego" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Hebreo" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Hungariano" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesian" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Irlandes" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Italyano" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Hapones" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Koreano" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Latviano" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Ang Lithuanian" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malay" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norwego" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Persiano" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Polako" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portuges" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portuges (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romaniano" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Ruso" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovak" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovenia" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Kastila" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Suweko" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalog" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Thai" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Turko" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukranian" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urdu" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Serbiano" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukrainian" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamese" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Retrieve list ng suportadong mga wika" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Talaan ng mga wika" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "salin" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Isinalin ang teksto mula sa isang wika tungo sa ibang wika" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Isinalin na teksto" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Imbalidong pangalan ng programa" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Pagkakamali sa pagsasalin" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Magmabagal" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Ipinagbawal" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Maganda talaga!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Mga teksto(mga) na isasalin" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Pinagmulan ng kodigo ng wika" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Target language code" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "teksto" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Pinagmulan ng teksto:\n" +"* `text` - Plain\n" +"* `html` - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Mas piniling bilang ng alternatibong mga salin" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Susi ng API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Isinalin ang talaksan mula sa isang wika tungo sa ibang wika" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Isinalin na talaksan" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Sawi sa pagsasalin" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Alamin ang wika ng isang teksto" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Mga Pag - aalinlangan" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Maling diyagnosis" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Mag - text para malaman ito" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Ibalik ang espesipikong mga setting" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "harapan" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "harap" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Magpasakop sa mungkahi na pagbutihin ang isang salin" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Tagumpay" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Hindi awtorisado" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Orihinal na teksto" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Iminumungkahing salin" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Wika ng orihinal na teksto" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Wika ng iminungkahing salin" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "pagtanggap" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Kodigo ng wika" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Pangalan ng tao-basang wika (sa Ingles)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Suportadong target na mga kodigo sa wika" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Isinalin na teksto(s)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Error sa pagbasa ng mensahe" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Dahilan para magmabagal" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Isinalin ang talaksang url" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Halaga ng pagtitiwala" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Ang character input limit para sa wikang ito (-1 ay nagpapakita ng walang " +"hangganan)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Harapang pagsasalin" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Kung baga magagawa ang API key database." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Kung kailangan ang susing API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Kung baga ang pagkakapit ng mga mungkahi ay magagawa." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Suportadong format ng mga file" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Kung baga ang pagpapasakop ay matagumpay" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Kopya ng teksto" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Hindi maikarga %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Hindi kilalang error" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Pinagkunan" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Salamat sa iyong pagtutuwid. Pansinin na ang mungkahi ay hindi kaagad - agad" +" matutupad." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Walang makukuhang wika. Tama ba ang pagkakakabit mo sa mga modelo?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Uri sa iyong API Key. Kung kailangan mo ng API key, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "pindutin ang \"Get API Key\" link." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "makipag - ugnayan sa opereytor ng server." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API at Open Source Machine Translation" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Malaya at Open Source Machine Translation API. Sarili-hosted, offline may " +"kakayahan at madaling mag-setup. Itakbo ang iyong sariling API server sa " +"loob lamang ng ilang minuto." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "salin" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Docs" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Kumuha ng API Susi" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Magtakda ng API Susi" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Nagbabago ng wika" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Baguhin" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Togle dark/light mode" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Mga Mali" + +#: 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 "" +"Dahil sa pang-aabusong bit, ang mga kahilingan sa pagsasalin ay " +"pansamantalang nililimitahan sa mga gumagamit na may tanggap na susing API. " +"Ikinalulungkot ang abala!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API sa Pagsasalin" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Saling Teksto" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Mga Larawan ng Pagsasalin" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Isinalin mula sa" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Swap source at target languages" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Isinalin sa" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Tekstong isasalin" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Itapon ang teksto" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Mungkahi" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Huwag ituloy" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Pagpadala" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Suportadong mga format ng talaksan:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Sawi ang paglikha ng talaksan" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Alisin ang talaksan" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Pagsasalin" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Ibaba" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Kahilingan" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Pagtugon" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Open Source Machine Translation API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Sarili-Hosted. May Kapansanan. Madaling Itakda." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Lisensiya:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"Ginawa kasama ng %(heart)s sunod %(contributors)s at pinapatakbo ng " +"%(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Tagapag - abuloy" + +#~ msgid "Basque" +#~ msgstr "Basque" + +#~ msgid "Galician" +#~ msgstr "Galician" diff --git a/self_host/LibreTranslate/libretranslate/locales/tl/meta.json b/self_host/LibreTranslate/libretranslate/locales/tl/meta.json new file mode 100644 index 00000000..aea7939f --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/tl/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Tagalog", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/tr/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/tr/LC_MESSAGES/messages.po new file mode 100644 index 00000000..f436e8c2 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/tr/LC_MESSAGES/messages.po @@ -0,0 +1,776 @@ +# Turkish translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-07-10 15:01+0000\n" +"Last-Translator: Kubi Kanber \n" +"Language-Team: Turkish \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.13-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Geçersiz JSON formatı" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Otomatik Algılama" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Yetkisiz" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Çok fazla istek sınırı ihlali" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Geçersiz API anahtarı" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "API anahtarı almak için lütfen sunucu yöneticisiyle iletişime geçin" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "API anahtarı almak için %(url)s adresini ziyaret edin" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Yavaşlama:" + +#: 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 "Geçersiz istek: %(name)s parametresi eksik" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Geçersiz istek: %(name)s parametresi bir sayı değil" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Geçersiz istek: %(name)s parametresi <= %(value)s olmali" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "Geçersiz istek: istek (%(size)s) metin sınırını (%(limit)s) aşıyor" + +#: 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 desteklenmiyor" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s biçimi desteklenmiyor" + +#: 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) için hedef dil olarak " +"kullanılamıyor" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Metin çevrilemiyor: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Dosya çevirisi bu sunucuda devre dışı bırakıldı." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Geçersiz istek: boş dosya" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Geçersiz istek: dosya biçimi desteklenmiyor" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Geçersiz dosya adı" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Öneriler bu sunucuda devre dışı bırakıldı." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "İngilizce" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Arnavutça" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Arapça" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Azerice" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Bengalce" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Bulgarca" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Katalanca" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Çince" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Çince (geleneksel)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Çekçe" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Danca" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Felemenkçe" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Estonca" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Fince" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Fransızca" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Almanca" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Yunanca" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "İbranice" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Hintçe" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Macarca" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Endonezce" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "İrlandaca" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "İtalyanca" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Japonca" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Korece" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Letonca" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Litvanyaca" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Malayca" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Norveççe" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Farsça" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Lehçe" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Portekizce" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Portekizce (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Romence" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Rusça" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovakça" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Slovence" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "İspanyolca" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "İsveççe" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Tagalogca" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Tayca" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Türkçe" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukraynaca" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Urduca" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Sırpça" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Ukraynaca" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "Vietnamca" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Desteklenen dillerin listesini al" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Dillerin listesi" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "çeviri" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Bir dilden diğerine metin çevirin" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Çevirilen metin" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Geçersiz istek" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Çeviri hatası" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Yavaşla" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Yasaklandı" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Merhaba dünya!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Çevrilecek metin(ler)" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Kaynak dil kodu" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Hedef dil kodu" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "metin" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Kaynak metin biçimi:\n" +" * `text` - Düz metin\n" +" * `html` - HTML işaretlemesi\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Tercih edilen alternatif çeviri sayısı" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API anahtarı" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Bir dilden diğerine dosya çevirin" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Çevrilen dosya" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Çevrilecek dosya" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Tek bir metnin dilini algıla" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Algılamalar" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Algılama hatası" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Algılanacak metin" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Önyüze özgü ayarları al" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "önyüz ayarları" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "önyüz" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Bir çeviriyi iyileştirmek için öneri gönderin" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Başarılı" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Yetkili değil" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Orijinal metin" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Önerilen çeviri" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Orijinal metnin dili" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Önerilen çevirinin dili" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "geri bildirim" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Dil kodu" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Okunabilir dil adı (İngilizce olarak)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Desteklenen hedef dil kodları" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Çevrilen metin(ler)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Hata mesajı" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Yavaşlama nedeni" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Çevrilen dosya URL'si" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Güven değeri" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Bu dil için karakter giriş sınırı (-1, sınır olmadığını gösterir)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Önyüz çeviri zaman aşımı" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "API anahtar veri tabanının etkin olup olmadığı." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Bir API anahtarının gerekli olup olmadığı." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Öneri göndermenin etkin olup olmadığı." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Desteklenen dosya biçimi" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Gönderimin başarılı olup olmadığı" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Metni kopyala" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "%(url)s yüklenemiyor" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Bilinmeyen hata" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Kopyalandı" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "" +"Düzeltmeniz için teşekkürler. Önerinin hemen yürürlüğe girmeyeceğini " +"unutmayın." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Kullanılabilir dil yok. Modelleri doğru şekilde yüklediniz mi?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"API anahtarınızı yazın. Bir API anahtarına ihtiyacınız varsa, " +"%(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "\"API Anahtarı Al\" bağlantısına tıklayın." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "sunucu yöneticisiyle iletişime geçin." + +#: libretranslate/templates/index.html:9 +#: libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Ücretsiz ve Açık Kaynaklı Makine Çevirisi API'si" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"Ücretsiz ve Açık Kaynaklı Makine Çevirisi API'si. Ücretsiz indirilebilir, " +"çevrimdışı çalışabilir ve kurulumu kolaydır. Kendi API sunucunuzu sadece " +"birkaç dakikada çalıştırın." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "çeviri" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API Belgeleri" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "API Anahtarı Al" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "API Anahtarını Ayarla" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Dili değiştir" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Düzenle" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Koyu/açık modu değiştir" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Kapat" + +#: 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 "" +"Bot kötüye kullanımı nedeniyle, çeviri istekleri geçici olarak geçerli bir " +"API anahtarına sahip kullanıcılarla sınırlıdır. Rahatsızlıktan dolayı özür " +"dileriz!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "Çeviri API'si" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Metin Çevir" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Dosya Çevir" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Şundan çevir" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Kaynak ve hedef dilleri değiştirin" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Şuna çevir" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Çevrilecek metin" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Metni sil" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Çeviri öner" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "İptal" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Gönder" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Desteklenen dosya biçimleri:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Dosya" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Dosyayı kaldır" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Çevir" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "İndir" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "İstek" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Yanıt" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "Açık Kaynaklı Makine Çevirisi API'si" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Ücretsiz indirilebilir. Çevrimdışı kullanılabilir. Kurulumu kolaydır." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Lisans:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"%(contributors)s tarafından %(heart)s ile yapıldı ve %(engine)s tarafından " +"desteklenmektedir" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s Katkıda Bulunanlar" + +#~ msgid "multipart/form-data" +#~ msgstr "çoklu bölüm/form-data" + +#~ msgid "Vietnamese" +#~ msgstr "Vietnamca" + +#~ msgid "" +#~ "This public API should be used for testing, personal or infrequent use. If " +#~ "you're going to run an application in production, please %(host_server)s or " +#~ "%(get_api_key)s." +#~ msgstr "" +#~ "Bu herkese açık API test, kişisel veya ara sıra kullanım için " +#~ "kullanılmalıdır. Üretimde bir uygulama çalıştıracaksanız, lütfen " +#~ "%(host_server)s veya %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "kendi sunucunuzu barındırın" + +#~ msgid "get an API key" +#~ msgstr "bir API anahtarı alın" + +#~ msgid "Basque" +#~ msgstr "Basque" + +#~ msgid "Galician" +#~ msgstr "Galician" diff --git a/self_host/LibreTranslate/libretranslate/locales/tr/meta.json b/self_host/LibreTranslate/libretranslate/locales/tr/meta.json new file mode 100644 index 00000000..498ea8aa --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/tr/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Turkish", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/ug/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ug/LC_MESSAGES/messages.po new file mode 100644 index 00000000..648e6c46 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ug/LC_MESSAGES/messages.po @@ -0,0 +1,754 @@ +# Uyghur translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.12\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-02-20 07:02+0000\n" +"Last-Translator: Liam Johnson \n" +"Language: ug\n" +"Language-Team: Uyghur " +"\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "ئىناۋەتسىز JSON فورماتى" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "ئاپتوماتىك تەكشۈرۈش" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "ھوقۇق بېرىلمىگەن" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "ئىلتىماس سانى چەكتىن ئاشتى" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "API ئاچقۇچ ئىناۋەتسىز" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Vietnamese" +#~ msgstr "" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/ug/meta.json b/self_host/LibreTranslate/libretranslate/locales/ug/meta.json new file mode 100644 index 00000000..a886bc45 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ug/meta.json @@ -0,0 +1,4 @@ +{ + "name": "ug", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/uk/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/uk/LC_MESSAGES/messages.po new file mode 100644 index 00000000..38496137 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/uk/LC_MESSAGES/messages.po @@ -0,0 +1,781 @@ +# Ukrainian translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-05-07 15:01+0000\n" +"Last-Translator: Do you know my name? " +"\n" +"Language-Team: Ukrainian \n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Weblate 5.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Недійсний формат JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Автовизначення" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Неавторизовано" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Перевищено обмеження запитів" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Недійсний ключ API" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Зв'яжіться з оператором сервера, щоб отримати ключ API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Відвідайте %(url)s, щоб отримати ключ API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Сповільнення:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Недійсний запит: параметр %(name)s не є числом" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Недійсний запит: параметр %(name)s має бути <= %(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "Формат %(format)s не підтримується" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Не вдалося перекласти текст: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Переклад файлів на цьому сервері вимкнено." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Недійсний запит: порожній файл" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Недійсний запит: формат файлу не підтримується" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "Недійсна назва файлу" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Пропозиції на цьому сервері вимкнено." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Англійська" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Албанська" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Арабська" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Азербайджанська" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "Бенгальська" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Болгарська" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "Каталанська" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Китайська" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "Китайська (традиційна)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Чеська" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Данська" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Нідерландська" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Есперанто" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Естонська" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Фінська" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Французька" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Німецька" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Грецька" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Іврит" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Хінді" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Угорська" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Індонезійська" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "Ірландська" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Італійська" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Японська" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Корейська" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "Латиська" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "Литовська" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "Малайська" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "Норвезька" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Перська" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Польська" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Португальська" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "Португальська (Бразилія)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "Румунська" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Російська" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Словацька" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "Словенська" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Іспанська" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Шведська" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "Тагальська" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "Тайська" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Турецька" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Українська" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "Урду" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "Сербська" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "Українська" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "В'єтнамська" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Отримати список підтримуваних мов" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Список мов" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "переклад" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Перекласти текст із однієї мови на іншу" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Перекладений текст" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Недійсний запит" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Помилка перекладу" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Сповільнення" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Заблоковано" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Привіт, світе!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "Текст для перекладу" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Код мови оригіналу" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Код мови перекладу" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "текст" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Формат оригінального тексту:\n" +" * `text` - Звичайний текст\n" +" * `html` - HTML розмітка\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "Бажана кількість альтернативних перекладів" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Ключ API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Перекласти файл із однієї мови на іншу" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Перекладений файл" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Файл для перекладу" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Визначити мову окремого тексту" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Визначення" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Помилка визначення" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Текст для визначення" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Отримати специфічні налаштування інтерфейсу" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "налаштування інтерфейсу" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "інтерфейс" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Подати пропозицію щодо покращення перекладу" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Успіх" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Не авторизовано" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Оригінальний текст" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Запропонований переклад" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Мова оригінального тексту" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Мова запропонованого перекладу" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "зворотний зв'язок" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Код мови" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Назва мовою, зрозумілою для людини (англійською)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Підтримувані коди мов перекладу" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "Перекладений текст" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Повідомлення про помилку" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Причина сповільнення" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "URL-адреса перекладеного файлу" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Рівень достовірності" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" +"Обмеження на введення символів для цієї мови (-1 означає відсутність " +"обмежень)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Перевищено час очікування перекладу інтерфейсу" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Чи ввімкнено базу даних ключів API." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Чи потрібен ключ API." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Чи ввімкнено подання пропозицій." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Підтримувані формати файлів" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Чи була заявка успішною" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Скопіювати текст" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Не вдається завантажити %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Невідома помилка" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Скопійовано" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" +"Дякуємо за виправлення. Зверніть увагу, що пропозиція не набуде чинності " +"одразу." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "Немає доступних мов. Чи правильно ви встановили моделі?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "натисніть на покликання «Отримати ключ API»." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "Вільний API машинного перекладу з відкритим сирцевим кодом" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 машинного перекладу з відкритим сирцевим кодом. Безплатний для " +"завантаження, з можливістю роботи офлайн та простотий у налаштуванні. " +"Запустіть власний API-сервер усього за кілька хвилин." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "переклад" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Документація до API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Отримати ключ API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Установити ключ API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Змінити мову" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Редагувати" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Перемкнути темну/світлу тему" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Відмовитись" + +#: 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 "" +"Через зловживання ботами, запити на переклад тимчасово обмежено для " +"користувачів із дійсним ключем API. Вибачте за незручності!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "API для перекладу" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Переклад тексту" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Переклад файлів" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Перекласти з" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Поміняти мови місцями" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Перекласти на" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Текст для перекладу" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Видалити текст" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Запропонувати переклад" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Скасувати" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Надіслати" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Підтримувані формати файлів:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Файл" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Вилучити файл" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Перекласти" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Завантажити" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Запит" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Відповідь" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API машинного перекладу з відкритим сирцевим кодом" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" +"Безплатний для завантаження. З можливість роботи офлайн. Простотий у " +"налаштуванні." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Ліцензія:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Зроблено з %(heart)s %(contributors)s та працює на основі %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "спільнотою %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "мультипарт/форм-дані" + +#~ msgid "Vietnamese" +#~ msgstr "В'єтнамська" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "Цей публічний API слід використовувати " +#~ "для тестування, особистого або нечастого " +#~ "використання. Якщо ви збираєтесь запустити " +#~ "застосунок у виробництво, будь ласка, " +#~ "%(host_server)s чи %(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "розмістіть на своєму власному сервері" + +#~ msgid "get an API key" +#~ msgstr "отримайте API ключ" + +#~ msgid "Basque" +#~ msgstr "Баскська" + +#~ msgid "Galician" +#~ msgstr "Галісійська" diff --git a/self_host/LibreTranslate/libretranslate/locales/uk/meta.json b/self_host/LibreTranslate/libretranslate/locales/uk/meta.json new file mode 100644 index 00000000..28a6f528 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/uk/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Ukrainian", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/ur/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/ur/LC_MESSAGES/messages.po new file mode 100644 index 00000000..3f2c5d3a --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ur/LC_MESSAGES/messages.po @@ -0,0 +1,748 @@ +# Urdu translations for LibreTranslate. +# Copyright (C) 2024 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.6.1\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2024-08-08 13:03-0400\n" +"Last-Translator: FULL NAME \n" +"Language-Team: ur \n" +"Language: ur\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "ایس " + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "خود کار ڈیکاٹ" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "غیر درج شدہ" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "بہت سے طلبہ کی خلاف ورزی کی حدود ہیں۔" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "اہم تجاویز" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "براہ کرم سرور آپریٹر سے رابطہ کریں" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "ملاقات %(url)s ایک ایپی کلید حاصل کرنے کے لئے" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "غلطی:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "غیر متصل درخواست: %(name)s پیرامیٹر نمبر نہیں ہے" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "غیر متصل درخواست: %(name)s پیرامیٹر لازمی ہے. %(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s فارمیٹ کی مدد نہیں کی جاسکتی" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "ترجمہ: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "فائل کا ترجمہ اس سرور پر معذور ہے۔." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "محفوظ درخواست: خالی فائل" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "محفوظ درخواست: فائل کی معاونت نہیں ہے" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "نقل‌مکانی" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "اس سرور پر خدمات معطل ہیں۔." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "انگریزی" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "البانیا" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "عربي" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "آذربائیجان" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "بنگالی" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "بلغاریہ" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "کتالان" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "چین" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "چینی (انگریزی:" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "چیک" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "دانش" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "ڈچ" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "ایسپرانتو" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "ايستان" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "فِش" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "فر انس" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "جرمني" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "یونانی" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "عبرانی" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "ہندی" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "ه رات" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "انڈونیشیا" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "آئرش" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "اطالوی" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "جاپاني" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "کوریا" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "لٹو يا" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "لتھووینیا" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "ملے" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "ناري" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "فارسی" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "پولش" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "فر انس" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "پرتگالی (Brazil)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "رومي" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "رو ن" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "سلواک" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "سلووینیا" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "اندلس" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "سو ڈا ني" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "غیر متصل" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "تھائی" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "ترکي" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "یورینس" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "اُردو" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "سر گري" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "یوکرین" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "ویتنام" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "معاون زبانوں کی فہرست" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "یہ فہرست زبانوں (List of languages) ہے۔" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "ترجمہ" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "زبان سے دوسری زبان تک عبارت" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "نقل و حمل" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "غیر متصل درخواست" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "ترجمہ غلطی" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "بند" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "بائٹس" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "ہیلو دنیا!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "ترجمہ کرنے کے لئے متن(s)" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "ماخذ زبان کوڈ" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "زبانوں کا کوڈ" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "متن" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "حمیل" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"ماخذ متناسقات:\n" +"*\n" +"*'html' - ایچ ٹی ایم ایل مارک اپ -\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "متعدد متبادل ترجمے" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "کلید" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "زبان سے دوسرے تک فائل" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "فائل حذف کی جارہی ہے" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "فائل کا ترجمہ" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "ايک متن کي زبان کي نقل کريں" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "حقائق" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "ڈیٹنگ غلطی" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "معلوم کرنے کے لئے متن" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "حفاظتی مخصوص ترتیبات" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "پیشگی ترتیبات" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "آمنے سامنے" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "ترجمے کو بہتر بنانے کی تجویز پیش کریں" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "کامیابی" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "اجازت نہیں دی گئی" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "اصل متن" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "ترجمہ" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "اصل متن کی زبان" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "ترجمے کی تجویز" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "جواب" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "زبان کا کوڈ" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "انسانی قابل زبان نام (انگریزی میں)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "نشان زدہ زبان کے کوڈ کی حمایت کی۔" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "نقل و حمل (s)" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "خامی پیام" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "سست کرنے کی وجہ" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "فائل رولر" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "اعتماد کی اہمیت" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "حروف تہجی اس زبان کے لیے حدیث (-1 کوئی حدیث نہیں)۔" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "وقت کا غلط استعمال" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "چاہے اے پی آئی کی کلید ڈیٹا بیس کے قابل ہو۔." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "چاہے آپ کسی ایپی کلید کی ضرورت ہو ۔." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "خواہ پیش کرنے والے تجاویز قابلِ‌بھروسا ہیں ۔." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "فائلوں کی معاونت" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "خواہ اسلام کامیاب رہا" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "متن نقل کریں" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "لوڈ نہیں ہوسکتا %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "نامعلوم" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "کوس" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect right " +"away." +msgstr "آپ کی اصلاح کا شکریہ. اِس سلسلے میں ایک مثال پر غور کریں ۔." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "کوئی زبان دستیاب نہیں۔ آپ نے ماڈلز کو درست طور پر نصب کیا؟?" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" +"قسم اپنی ایپی کلید میں. آپ کو ایک ایپی کلید کی ضرورت ہے تو، %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "\"پی اے کلید\" لنک پر زور دیں." + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "آزاد اور کھلے ماخذ مشین اے پی آئی" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" +"آزاد اور اوپن ماخذ مشین اے پی آئی۔ خود غرضی، بے قاعدہ صلاحیت اور آسانی سے " +"نصب کرنے کے لئے. صرف چند منٹ میں اپنے ذاتی ایپی سرور چلا." + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "ترجمہ" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "پانی" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "اپریل" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "توجہ حاصل کریں کلید" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "جٹوب" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "خیال کریں کلید" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "زبان تبدیل کریں" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "مرتب" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "تاریکی / روشنی کا موڈ" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "تفریق" + +#: 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 "ترجمہ" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "متن" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "فائلیں" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "عبارت سے" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "سواپ ماخذ اور ہدف زبانیں ہیں۔" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "داخل ہوں گے" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "ترجمہ کرنے کے لئے متن" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "حذف" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "ترجمہ" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "منسوخ" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "بھیجو" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "معاون فائل فارمیٹ:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "فائل" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "فائل حذف کریں" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "عبارت" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "اوپر لکھیں" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "درخواست" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "دوبارہ شروع" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "دستیاب مشینوں کا ترجمہ اے پی آئی" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "خود مختار ہو گیا۔ ممکن ہے. تیار کرنے کے لئے آسان." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "لبرٹی" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "اجازت نامہ:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" +"ساتھ بنایا گیا ہے %(heart)s قسم %(contributors)s جو بڑا زور آور ہے " +"%(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s نقل و حمل" + +#~ msgid "Basque" +#~ msgstr "بسک" + +#~ msgid "Galician" +#~ msgstr "جلیان" diff --git a/self_host/LibreTranslate/libretranslate/locales/ur/meta.json b/self_host/LibreTranslate/libretranslate/locales/ur/meta.json new file mode 100644 index 00000000..7b094689 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/ur/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Urdu", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/vi/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/vi/LC_MESSAGES/messages.po new file mode 100644 index 00000000..d5fa5caf --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/vi/LC_MESSAGES/messages.po @@ -0,0 +1,772 @@ +# Vietnamese translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-07-05 04:01+0000\n" +"Last-Translator: HGN \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.13-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "Không đúng định dạng dữ liệu JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "Tự động phát hiện" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "Truy cập không được cấp quyền" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "Quá nhiều yêu cầu vượt giới hạn" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "Mã API không hợp lệ" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "Hãy liên hệ với người quản trị máy chủ để nhận mã API" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "Vào %(url)s để lấy mã API" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "Chậm lại:" + +#: 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 "Yêu cầu không hợp lệ: thiếu tham số %(name)s" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "Yêu cầu không hợp lệ: tham số %(name)s không phải là một số" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "Yêu cầu không hợp lệ: tham số %(name)s phải <= %(value)s" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" +"Yêu cầu không hợp lệ: kích thước yêu cầu %(size)s vượt quá giới hạn chữ " +"(%(limit)s)" + +#: 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 không được hỗ trợ" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "định dạng %(format)s không được hỗ trợ" + +#: 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) không có sẵn làm ngôn ngữ đích từ %(sname)s " +"(%(scode)s)" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "Không thể dịch văn bản: %(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "Dịch tệp tin bị tắt trên máy chủ này." + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "Yêu cầu không xác định: thư mục rỗng" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "Yêu cầu không xác định: định dạng thư mục không được hỗ trợ" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "tên thư mục không phù hợp" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "Những gợi ý bị tắt trên máy chủ này." + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "Tiếng Anh" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "Người Albania" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "Ả Rập" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "Tiếng Azeri" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "Tiếng Bulgaria" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "Trung Quốc" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "Séc" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "Đan Mạch" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "Hà Lan" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "Esperanto (Quốc tế ngữ)" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "Người Estonia" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "Phần Lan" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "Pháp" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "Đức" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "Hy Lạp" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "Tiếng Do Thái" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "Tiếng Hindi" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "Hungary" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "Indonesia" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "irish" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "Ý" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "Nhật" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "Hàn" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "Ba Tư" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "Ba Lan" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "Bồ Đào Nha" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "Nga" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "Slovak" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "Tây Ban Nha" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "Thụy Điển" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "Thổ nhỉ kỳ" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "Ukraina" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "Lấy danh sách ngôn ngữ được hỗ trợ" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "Danh sách ngôn ngữ" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "dịch" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "Dịch từ sang một ngôn ngữ khác" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "Văn bản đã dịch" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "Yêu cầu không hợp lệ" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "Lỗi dịch" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "Chậm lại" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "Đã bị cấm" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "Xin chào thế giới!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "(Các) văn bản cần dịch" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "Mã ngôn ngữ nguồn" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "Mã ngôn ngữ đích" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "chữ" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"Định dạng văn bản nguồn:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "Mã API" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "Dịch tệp tin sang ngôn ngữ khác" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "Tệp tin đã dịch" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "Tệp để dịch" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "Phát hiện ngôn ngữ của một đoạn chữ" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "Các phát hiện" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "Lỗi phát hiện" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "Chữ để phát hiện" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "Lấy cài đặt về giao diện" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "các cài đặt giao diện" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "giao diện" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "Gửi gợi ý để cải thiện bản dịch" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "Thành công" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "Không được phép" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "Chữ gốc" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "Bản dịch đề xuất" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "Ngôn ngữ của văn bản gốc" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "Ngôn ngữ của bản dịch đề xuất" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "phản hồi" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "Mã ngôn ngữ" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "Tên ngôn ngữ con người có thể đọc được (bằng tiếng Anh)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "Các mã ngôn ngữ đích được hỗ trợ" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "(Các) văn bản đã dịch" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "Thông điệp lỗi" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "Lý do phải chậm lại" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "Dịch url tệp tin" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "Giá trị tin cậy" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "Giới hạn ký tự đầu vào cho ngôn ngữ này (-1 nghĩa là không giới hạn)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "Quá hạn đợi bản dịch" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "Cơ sở dữ liệu mã API có được bật không." + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "Có bắt buộc mã API hay không." + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "Có cho phép gửi đề xuất hay không." + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "Các định dạng tệp tin được hỗ trợ" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "Đã gửi thành công hay chưa" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "Sao chép chữ" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "Không thể tải %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "Lỗi không rõ" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "Đã sao chép" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "Cảm ơn đã sửa. Lưu ý đề xuất sẽ không có tác dụng ngay lập tức." + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +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:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "Nhập mã API của bạn. Nếu bạn cần lấy mã API, %(instructions)s" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "nhấn liên kết \"Lấy mã API\"." + +#: libretranslate/templates/app.js.template:536 +msgid "contact the server operator." +msgstr "liên hệ với người quản trị máy chủ." + +#: libretranslate/templates/index.html:9 libretranslate/templates/index.html:27 +#: libretranslate/templates/index.html:347 +msgid "Free and Open Source Machine Translation API" +msgstr "API dịch thuật máy miễn phí và mã nguồn mở" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 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" +msgstr "dịch" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "api" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "Tài liệu API" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "Lấy Mã API" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "Đặt Mã API" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "Thay đổi ngôn ngữ" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "Sửa" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "Chuyển chế độ sáng/tối" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "Bỏ" + +#: 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 dịch" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "Dịch văn bản" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "Dịch tệp tin" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "Dịch từ" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "Hoán đổi ngôn ngữ nguồn và đích" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "Dịch sang" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "Chữ để dịch" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "Xóa chữ" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "Đề xuất dịch" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "Hủy" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "Gửi" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "Các định dạng tệp tin được hỗ trợ:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "Tệp tin" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "Bỏ tệp tin" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "Dịch" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "Tải về" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "Yêu cầu" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "Trả lời" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "API Dịch Máy Mã Nguồn Mở" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "Tự lưu trữ. Có thể dùng ngoại tuyến. Dễ cài đặt." + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "Giấy phép:" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "Tạo ra với %(heart)s bởi %(contributors)s và chạy bằng %(engine)s" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "Các cộng tác viên %(libretranslate)s" + +#~ msgid "multipart/form-data" +#~ msgstr "đa phần dữ liệu" + +#~ msgid "Vietnamese" +#~ msgstr "Tiếng Việt" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(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 chạy ứng dụng cho quá trình" +#~ " sản xuất, hãy %(host_server)s hoặc " +#~ "%(get_api_key)s." + +#~ msgid "host your own server" +#~ msgstr "lưu trữ máy chủ của chính bạn" + +#~ msgid "get an API key" +#~ msgstr "lấy mã API" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" diff --git a/self_host/LibreTranslate/libretranslate/locales/vi/meta.json b/self_host/LibreTranslate/libretranslate/locales/vi/meta.json new file mode 100644 index 00000000..d2c96c6d --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/vi/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Vietnamese", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/zgh/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/zgh/LC_MESSAGES/messages.po new file mode 100644 index 00000000..d441c12f --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/zgh/LC_MESSAGES/messages.po @@ -0,0 +1,754 @@ +# Standard Moroccan Tamazight translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2023-01-28 14:45+0000\n" +"Last-Translator: ⵣⵓⵀⵉⵔ ⴰⵎⴰⵣⵉⵖ ZOUHIR DEHBI \n" +"Language: zgh\n" +"Language-Team: Tamazight (Standard Moroccan) " +"\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" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "ⵓⵔ ⵜⵎⵙⴰⵙⴰ ⵜⵍⵖⴰ ⵏ JSON" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "ⵉⵕⵉⵕⴹ ⴰⵡⵓⵔⵎⴰⵏ" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "ⵡⴰⵔ ⵜⵓⵔⴰⴳⵜ" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "" + +#: libretranslate/app.py:686 libretranslate/app.py:696 +#, python-format +msgid "Invalid request: request (%(size)s) exceeds text limit (%(limit)s)" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "" + +#: 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 "" + +#: libretranslate/app.py:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +#, python-format +msgid "Type in your API Key. If you need an API key, %(instructions)s" +msgstr "" + +#: libretranslate/templates/app.js.template:536 +msgid "press the \"Get API Key\" link." +msgstr "" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 "" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "" + +#: 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 "" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "Made with %(heart)s by %(contributors)s and powered by %(engine)s" +msgstr "" + +#: libretranslate/templates/index.html:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "" + +#~ msgid "Vietnamese" +#~ msgstr "" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" + +#~ msgid "host your own server" +#~ msgstr "" + +#~ msgid "get an API key" +#~ msgstr "" + +#~ msgid "Basque" +#~ msgstr "" + +#~ msgid "Galician" +#~ msgstr "" + diff --git a/self_host/LibreTranslate/libretranslate/locales/zgh/meta.json b/self_host/LibreTranslate/libretranslate/locales/zgh/meta.json new file mode 100644 index 00000000..479eca9b --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/zgh/meta.json @@ -0,0 +1,4 @@ +{ + "name": "zgh", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/locales/zh/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/zh/LC_MESSAGES/messages.po new file mode 100644 index 00000000..227ff880 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/zh/LC_MESSAGES/messages.po @@ -0,0 +1,764 @@ +# Chinese translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-04-21 05:58+0000\n" +"Last-Translator: LTSlw \n" +"Language-Team: Chinese (Simplified Han script) \n" +"Language: zh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.11.1-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "JSON 格式无效" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "自动检测" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "未授权" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "请求次数过多超过限制" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "API 密钥无效" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "请联系管理员获取 API 密钥" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "访问 %(url)s 以获取 API 密钥" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "请减速:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "无效的请求:参数 %(name)s 不是数字" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "无效的请求:%(name)s 参数必须 <= %(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "%(format)s 格式不受支持" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "无法翻译文本:%(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "文件翻译在此服务器上被禁用。" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "无效的请求:空文件" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "无效的请求:文件格式不受支持" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "无效的文件名" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "该服务器已禁用建议功能。" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "英语" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "阿尔巴尼亚语" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "阿拉伯语" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "阿塞拜疆语" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "孟加拉语" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "保加利亚语" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "加泰罗尼亚语" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "简体中文" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "繁体中文" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "捷克语" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "丹麦语" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "荷兰语" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "世界语" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "爱沙尼亚语" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "芬兰语" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "法语" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "德语" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "希腊语" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "希伯来语" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "印地语" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "匈牙利语" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "印度尼西亚语" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "爱尔兰语" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "意大利语" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "日语" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "韩语" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "拉脱维亚语" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "立陶宛语" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "马来语" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "挪威语" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "波斯语" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "波兰语" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "葡萄牙语" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "葡萄牙语(巴西)" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "罗马尼亚语" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "俄语" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "斯洛伐克语" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "斯洛文尼亚语" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "西班牙语" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "瑞典语" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "他加禄语" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "泰语" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "土耳其语" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "乌克兰语" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "乌尔都语" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "塞尔维亚语" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "乌克兰语" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "越南语" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "获取支持的语言列表" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "语言列表" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "翻译" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "将文本从一种语言翻译成另一种语言" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "译文" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "无效的请求" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "翻译出错" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "请减速" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "已封禁" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "你好世界!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "待翻译文本" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "源语言代码" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "目标语言代码" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "文本" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "HTML" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"源文本格式:\n" +" * `text` - 纯文本\n" +" * `html` - HTML 标记\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "首选替代翻译数量" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API 密钥" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "将文件从一种语言翻译成另一种语言" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "已翻译文件" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "待翻译文件" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "检测单条文本的语言" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "语言检测结果" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "检测出错" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "待检测文本" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "获取前端特定设置" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "前端设置" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "前端" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "提交翻译改进建议" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "成功" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "未授权" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "原文" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "建议译文" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "原文语言" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "建议译文语言" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "反馈" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "语言代码" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "人类可读的语言名称(英语)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "支持的目标语言代码" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "已翻译文本" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "错误信息" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "减速原因" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "已翻译文件 URL" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "置信度" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "此语言的字符输入限制(-1表示无限制)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "前端翻译超时" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "是否启用 API 密钥数据库。" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "是否需要 API 密钥。" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "是否启用建议提交。" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "支持的文件格式" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "是否提交成功" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "复制文本" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "无法加载 %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "未知错误" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "已复制" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "感谢您的更正。注意此建议不会立即生效。" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "无可用的语言。您是否正确安装了模型?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "请点击“获取 API 密钥”链接。" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "开源自由的机器翻译 API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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 。可自由下载、支持离线运行且部署简便," +"只需数分钟即可搭建专属 API 服务。" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "翻译" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "API" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API 文档" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "获取 API 密钥" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "设置 API 密钥" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "切换语言" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "编辑" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "切换黑暗/明亮模式" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "忽略" + +#: 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 "由于机器人滥用行为,翻译服务暂时仅限持有有效API密钥的用户使用。给您带来不便," +"敬请谅解!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "翻译 API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "翻译文本" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "翻译文件" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "翻译自" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "交换源语言与目标语言" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "翻译为" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "待翻译文本" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "删除文本" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "建议译文" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "取消" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "发送" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "支持的文件格式:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "文件" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "删除文件" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "翻译" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "下载" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "请求" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "响应" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "开源的机器翻译 API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "可自由下载、支持离线运行且部署简便。" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "许可证:" + +#: 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:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s 贡献者" + +#~ msgid "multipart/form-data" +#~ msgstr "多部分/非正式数据" + +#~ msgid "Vietnamese" +#~ msgstr "越南语" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "此公共API仅适用于测试,个人或不频繁的使用。如果您要在生产环境中运行应用程序,请 %(host_server)s " +#~ "或 %(get_api_key)s。" + +#~ msgid "host your own server" +#~ msgstr "搭建自己的服务器" + +#~ msgid "get an API key" +#~ msgstr "获取API密钥" + +#~ msgid "Basque" +#~ msgstr "巴斯克语" + +#~ msgid "Galician" +#~ msgstr "加利西亚语" diff --git a/self_host/LibreTranslate/libretranslate/locales/zh/meta.json b/self_host/LibreTranslate/libretranslate/locales/zh/meta.json new file mode 100644 index 00000000..6604fc51 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/zh/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Chinese", + "reviewed": true +} diff --git a/self_host/LibreTranslate/libretranslate/locales/zh_Hant/LC_MESSAGES/messages.po b/self_host/LibreTranslate/libretranslate/locales/zh_Hant/LC_MESSAGES/messages.po new file mode 100644 index 00000000..532faba8 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/zh_Hant/LC_MESSAGES/messages.po @@ -0,0 +1,760 @@ +# Chinese (Traditional) translations for LibreTranslate. +# Copyright (C) 2023 LibreTranslate Authors +# This file is distributed under the same license as the LibreTranslate +# project. +# FIRST AUTHOR , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: LibreTranslate 1.3.9\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2025-04-18 14:43-0400\n" +"PO-Revision-Date: 2025-05-18 07:57+0000\n" +"Last-Translator: Justin Lin \n" +"Language-Team: Chinese (Traditional Han script) \n" +"Language: zh_Hant\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.12-dev\n" +"Generated-By: Babel 2.12.1\n" + +#: libretranslate/app.py:93 +msgid "Invalid JSON format" +msgstr "無效的 JSON 格式" + +#: libretranslate/app.py:209 libretranslate/templates/app.js.template:473 +msgid "Auto Detect" +msgstr "自動偵測" + +#: libretranslate/app.py:311 +msgid "Unauthorized" +msgstr "未經授權" + +#: libretranslate/app.py:329 +msgid "Too many request limits violations" +msgstr "請求次數過多超過限制" + +#: libretranslate/app.py:336 +msgid "Invalid API key" +msgstr "無效的 API 金鑰" + +#: libretranslate/app.py:371 +msgid "Please contact the server operator to get an API key" +msgstr "請聯絡伺服器管理員以取得 API 金鑰" + +#: libretranslate/app.py:373 +#, python-format +msgid "Visit %(url)s to get an API key" +msgstr "造訪 %(url)s 以取得 API 金鑰" + +#: libretranslate/app.py:420 +msgid "Slowdown:" +msgstr "慢一點:" + +#: 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:666 +#, python-format +msgid "Invalid request: %(name)s parameter is not a number" +msgstr "無效的請求:%(name)s 參數不是數字" + +#: libretranslate/app.py:669 +#, python-format +msgid "Invalid request: %(name)s parameter must be <= %(value)s" +msgstr "無效的請求:%(name)s 參數必須小於或等於 %(value)s" + +#: 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: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:726 +#, python-format +msgid "%(format)s format is not supported" +msgstr "不支援 %(format)s 格式" + +#: 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:787 +#, python-format +msgid "Cannot translate text: %(text)s" +msgstr "無法翻譯文字:%(text)s" + +#: libretranslate/app.py:874 libretranslate/app.py:943 +msgid "Files translation are disabled on this server." +msgstr "此伺服器上已停用檔案翻譯功能。" + +#: libretranslate/app.py:889 +msgid "Invalid request: empty file" +msgstr "無效的請求:空檔案" + +#: libretranslate/app.py:892 +msgid "Invalid request: file format not supported" +msgstr "無效的請求:不支援的檔案格式" + +#: libretranslate/app.py:951 +msgid "Invalid filename" +msgstr "無效的檔案名稱" + +#: libretranslate/app.py:1193 +msgid "Suggestions are disabled on this server." +msgstr "此伺服器上已停用建議功能。" + +#: libretranslate/locales/.langs.py:1 +msgid "English" +msgstr "英文" + +#: libretranslate/locales/.langs.py:2 +msgid "Albanian" +msgstr "阿爾巴尼亞文" + +#: libretranslate/locales/.langs.py:3 +msgid "Arabic" +msgstr "阿拉伯文" + +#: libretranslate/locales/.langs.py:4 +msgid "Azerbaijani" +msgstr "亞塞拜然語" + +#: libretranslate/locales/.langs.py:5 +msgid "Bengali" +msgstr "孟加拉文" + +#: libretranslate/locales/.langs.py:6 +msgid "Bulgarian" +msgstr "保加利亞文" + +#: libretranslate/locales/.langs.py:7 +msgid "Catalan" +msgstr "加泰隆尼亞文" + +#: libretranslate/locales/.langs.py:8 +msgid "Chinese" +msgstr "中文" + +#: libretranslate/locales/.langs.py:9 +msgid "Chinese (traditional)" +msgstr "正體中文(臺灣)" + +#: libretranslate/locales/.langs.py:10 +msgid "Czech" +msgstr "捷克語" + +#: libretranslate/locales/.langs.py:11 +msgid "Danish" +msgstr "丹麥文" + +#: libretranslate/locales/.langs.py:12 +msgid "Dutch" +msgstr "荷蘭文" + +#: libretranslate/locales/.langs.py:13 +msgid "Esperanto" +msgstr "世界語" + +#: libretranslate/locales/.langs.py:14 +msgid "Estonian" +msgstr "愛沙尼亞文" + +#: libretranslate/locales/.langs.py:15 +msgid "Finnish" +msgstr "芬蘭文" + +#: libretranslate/locales/.langs.py:16 +msgid "French" +msgstr "法文" + +#: libretranslate/locales/.langs.py:17 +msgid "German" +msgstr "德文" + +#: libretranslate/locales/.langs.py:18 +msgid "Greek" +msgstr "希臘文" + +#: libretranslate/locales/.langs.py:19 +msgid "Hebrew" +msgstr "希伯來文" + +#: libretranslate/locales/.langs.py:20 +msgid "Hindi" +msgstr "印地語" + +#: libretranslate/locales/.langs.py:21 +msgid "Hungarian" +msgstr "匈牙利文" + +#: libretranslate/locales/.langs.py:22 +msgid "Indonesian" +msgstr "印尼文" + +#: libretranslate/locales/.langs.py:23 +msgid "Irish" +msgstr "愛爾蘭文" + +#: libretranslate/locales/.langs.py:24 +msgid "Italian" +msgstr "義大利文" + +#: libretranslate/locales/.langs.py:25 +msgid "Japanese" +msgstr "日文" + +#: libretranslate/locales/.langs.py:26 +msgid "Korean" +msgstr "韓文" + +#: libretranslate/locales/.langs.py:27 +msgid "Latvian" +msgstr "拉脫維亞文" + +#: libretranslate/locales/.langs.py:28 +msgid "Lithuanian" +msgstr "立陶宛文" + +#: libretranslate/locales/.langs.py:29 +msgid "Malay" +msgstr "馬來文" + +#: libretranslate/locales/.langs.py:30 +msgid "Norwegian" +msgstr "挪威文" + +#: libretranslate/locales/.langs.py:31 +msgid "Persian" +msgstr "波斯文" + +#: libretranslate/locales/.langs.py:32 +msgid "Polish" +msgstr "波蘭文" + +#: libretranslate/locales/.langs.py:33 +msgid "Portuguese" +msgstr "葡萄牙文" + +#: libretranslate/locales/.langs.py:34 +msgid "Portuguese (Brazil)" +msgstr "葡萄牙語" + +#: libretranslate/locales/.langs.py:35 +msgid "Romanian" +msgstr "羅馬尼亞文" + +#: libretranslate/locales/.langs.py:36 +msgid "Russian" +msgstr "俄文" + +#: libretranslate/locales/.langs.py:37 +msgid "Slovak" +msgstr "斯洛伐克語" + +#: libretranslate/locales/.langs.py:38 +msgid "Slovenian" +msgstr "斯洛維尼亞文" + +#: libretranslate/locales/.langs.py:39 +msgid "Spanish" +msgstr "西班牙文" + +#: libretranslate/locales/.langs.py:40 +msgid "Swedish" +msgstr "瑞典文" + +#: libretranslate/locales/.langs.py:41 +msgid "Tagalog" +msgstr "塔加洛文" + +#: libretranslate/locales/.langs.py:42 +msgid "Thai" +msgstr "泰文" + +#: libretranslate/locales/.langs.py:43 +msgid "Turkish" +msgstr "土耳其文" + +#: libretranslate/locales/.langs.py:44 +msgid "Ukranian" +msgstr "烏克蘭語" + +#: libretranslate/locales/.langs.py:45 +msgid "Urdu" +msgstr "烏爾都文" + +#: libretranslate/locales/.langs.py:46 +msgid "Serbian" +msgstr "塞爾維亞文" + +#: libretranslate/locales/.langs.py:47 +msgid "Ukrainian" +msgstr "烏克蘭文" + +#: libretranslate/locales/.langs.py:48 +msgid "Vietnamese" +msgstr "越南文" + +#: libretranslate/locales/.swag.py:1 +msgid "Retrieve list of supported languages" +msgstr "檢索支援語言的列表" + +#: libretranslate/locales/.swag.py:2 +msgid "List of languages" +msgstr "語言列表" + +#: libretranslate/locales/.swag.py:3 +msgid "translate" +msgstr "翻譯" + +#: libretranslate/locales/.swag.py:4 +msgid "Translate text from a language to another" +msgstr "將文字從一種語言翻譯成另一種語言" + +#: libretranslate/locales/.swag.py:5 libretranslate/templates/index.html:233 +msgid "Translated text" +msgstr "已翻譯文字" + +#: libretranslate/locales/.swag.py:6 +msgid "Invalid request" +msgstr "無效的請求" + +#: libretranslate/locales/.swag.py:7 +msgid "Translation error" +msgstr "翻譯錯誤" + +#: libretranslate/locales/.swag.py:8 +msgid "Slow down" +msgstr "慢一點" + +#: libretranslate/locales/.swag.py:9 +msgid "Banned" +msgstr "已封鎖" + +#: libretranslate/locales/.swag.py:10 +msgid "Hello world!" +msgstr "你好世界!" + +#: libretranslate/locales/.swag.py:11 +msgid "Text(s) to translate" +msgstr "需要翻譯的文字" + +#: libretranslate/locales/.swag.py:12 +msgid "Source language code" +msgstr "來源語言代碼" + +#: libretranslate/locales/.swag.py:13 +msgid "Target language code" +msgstr "目標語言代碼" + +#: libretranslate/locales/.swag.py:14 +msgid "text" +msgstr "文字" + +#: libretranslate/locales/.swag.py:15 +msgid "html" +msgstr "html" + +#: libretranslate/locales/.swag.py:16 +msgid "" +"Format of source text:\n" +" * `text` - Plain text\n" +" * `html` - HTML markup\n" +msgstr "" +"來源文字的格式:\n" +" *`text` - 純文字\n" +" *`html` - html 標記\n" + +#: libretranslate/locales/.swag.py:17 +msgid "Preferred number of alternative translations" +msgstr "偏好的替代翻譯數量" + +#: libretranslate/locales/.swag.py:18 +msgid "API key" +msgstr "API 金鑰" + +#: libretranslate/locales/.swag.py:19 +msgid "Translate file from a language to another" +msgstr "將檔案從一種語言翻譯成另一種語言" + +#: libretranslate/locales/.swag.py:20 +msgid "Translated file" +msgstr "已翻譯檔案" + +#: libretranslate/locales/.swag.py:21 +msgid "File to translate" +msgstr "需要翻譯的檔案" + +#: libretranslate/locales/.swag.py:22 +msgid "Detect the language of a single text" +msgstr "偵測單一文字的語言" + +#: libretranslate/locales/.swag.py:23 +msgid "Detections" +msgstr "偵測" + +#: libretranslate/locales/.swag.py:24 +msgid "Detection error" +msgstr "錯誤偵測" + +#: libretranslate/locales/.swag.py:25 +msgid "Text to detect" +msgstr "需要偵測的文字" + +#: libretranslate/locales/.swag.py:26 +msgid "Retrieve frontend specific settings" +msgstr "檢索前端特定設定" + +#: libretranslate/locales/.swag.py:27 +msgid "frontend settings" +msgstr "前端設定" + +#: libretranslate/locales/.swag.py:28 +msgid "frontend" +msgstr "前端" + +#: libretranslate/locales/.swag.py:29 +msgid "Submit a suggestion to improve a translation" +msgstr "提交建議以改善翻譯" + +#: libretranslate/locales/.swag.py:30 +msgid "Success" +msgstr "成功" + +#: libretranslate/locales/.swag.py:31 +msgid "Not authorized" +msgstr "未經授權" + +#: libretranslate/locales/.swag.py:32 +msgid "Original text" +msgstr "原文" + +#: libretranslate/locales/.swag.py:33 +msgid "Suggested translation" +msgstr "建議譯文" + +#: libretranslate/locales/.swag.py:34 +msgid "Language of original text" +msgstr "原始文字的語言" + +#: libretranslate/locales/.swag.py:35 +msgid "Language of suggested translation" +msgstr "建議譯文的語言" + +#: libretranslate/locales/.swag.py:36 +msgid "feedback" +msgstr "意見回饋" + +#: libretranslate/locales/.swag.py:37 +msgid "Language code" +msgstr "語言代碼" + +#: libretranslate/locales/.swag.py:38 +msgid "Human-readable language name (in English)" +msgstr "人類可讀的語言名稱(英文)" + +#: libretranslate/locales/.swag.py:39 +msgid "Supported target language codes" +msgstr "支援的目標語言代碼" + +#: libretranslate/locales/.swag.py:40 +msgid "Translated text(s)" +msgstr "已翻譯文字" + +#: libretranslate/locales/.swag.py:41 +msgid "Error message" +msgstr "錯誤訊息" + +#: libretranslate/locales/.swag.py:42 +msgid "Reason for slow down" +msgstr "速度下降的原因" + +#: libretranslate/locales/.swag.py:43 +msgid "Translated file url" +msgstr "已翻譯檔案的連結" + +#: libretranslate/locales/.swag.py:44 +msgid "Confidence value" +msgstr "信心值" + +#: libretranslate/locales/.swag.py:45 +msgid "Character input limit for this language (-1 indicates no limit)" +msgstr "此語言的字元輸入限制(-1 表示無限制)" + +#: libretranslate/locales/.swag.py:46 +msgid "Frontend translation timeout" +msgstr "前端翻譯逾時" + +#: libretranslate/locales/.swag.py:47 +msgid "Whether the API key database is enabled." +msgstr "是否啟用了 API 金鑰資料庫。" + +#: libretranslate/locales/.swag.py:48 +msgid "Whether an API key is required." +msgstr "是否需要 API 金鑰。" + +#: libretranslate/locales/.swag.py:49 +msgid "Whether submitting suggestions is enabled." +msgstr "是否啟用了支援提交建議。" + +#: libretranslate/locales/.swag.py:50 +msgid "Supported files format" +msgstr "支援的檔案格式" + +#: libretranslate/locales/.swag.py:51 +msgid "Whether submission was successful" +msgstr "送出是否成功" + +#: libretranslate/templates/app.js.template:31 +#: libretranslate/templates/app.js.template:294 +#: libretranslate/templates/app.js.template:298 +msgid "Copy text" +msgstr "複製文字" + +#: libretranslate/templates/app.js.template:80 +#: libretranslate/templates/app.js.template:86 +#: libretranslate/templates/app.js.template:91 +#: libretranslate/templates/app.js.template:281 +#: libretranslate/templates/app.js.template:351 +#: libretranslate/templates/app.js.template:439 +#: libretranslate/templates/app.js.template:493 +#, python-format +msgid "Cannot load %(url)s" +msgstr "無法載入 %(url)s" + +#: libretranslate/templates/app.js.template:272 +#: libretranslate/templates/app.js.template:342 +#: libretranslate/templates/app.js.template:420 +#: libretranslate/templates/app.js.template:431 +msgid "Unknown error" +msgstr "未知錯誤" + +#: libretranslate/templates/app.js.template:295 +msgid "Copied" +msgstr "已複製" + +#: libretranslate/templates/app.js.template:339 +msgid "" +"Thanks for your correction. Note the suggestion will not take effect " +"right away." +msgstr "感謝您的更正。注意此建議將不會立即生效。" + +#: libretranslate/templates/app.js.template:463 +msgid "No languages available. Did you install the models correctly?" +msgstr "無可用的語言。您是否正確安裝了模型?" + +#: 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:536 +msgid "press the \"Get API Key\" link." +msgstr "點選“取得 API 金鑰”連結。" + +#: 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:347 +msgid "Free and Open Source Machine Translation API" +msgstr "自由且開源的機器翻譯 API" + +#: libretranslate/templates/index.html:10 +#: libretranslate/templates/index.html:31 +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。可自行架設,支援離線使用,且安裝簡便。只需幾分鐘即可部署並啟動您的專屬 API 伺服器。" + +#: libretranslate/templates/index.html:11 +msgid "translation" +msgstr "翻譯" + +#: libretranslate/templates/index.html:11 +msgid "api" +msgstr "API" + +#: libretranslate/templates/index.html:67 +msgid "API Docs" +msgstr "API 文件" + +#: libretranslate/templates/index.html:69 +msgid "Get API Key" +msgstr "取得 API 金鑰" + +#: libretranslate/templates/index.html:71 +msgid "GitHub" +msgstr "GitHub" + +#: libretranslate/templates/index.html:73 +msgid "Set API Key" +msgstr "設定 API 金鑰" + +#: libretranslate/templates/index.html:75 +msgid "Change language" +msgstr "更改語言" + +#: libretranslate/templates/index.html:81 +msgid "Edit" +msgstr "編輯" + +#: libretranslate/templates/index.html:83 +msgid "Toggle dark/light mode" +msgstr "切換深色/淺色模式" + +#: libretranslate/templates/index.html:159 +msgid "Dismiss" +msgstr "忽略" + +#: 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 "因應機器人濫用,翻譯請求暫時限制於持有有效API金鑰的使用者。對此不便,我們深感" +"抱歉!" + +#: libretranslate/templates/index.html:182 +msgid "Translation API" +msgstr "翻譯 API" + +#: libretranslate/templates/index.html:186 +msgid "Translate Text" +msgstr "翻譯文字" + +#: libretranslate/templates/index.html:190 +msgid "Translate Files" +msgstr "翻譯檔案" + +#: libretranslate/templates/index.html:196 +msgid "Translate from" +msgstr "翻譯自" + +#: libretranslate/templates/index.html:206 +msgid "Swap source and target languages" +msgstr "來源語言與目標語言互換" + +#: libretranslate/templates/index.html:209 +msgid "Translate into" +msgstr "翻譯成" + +#: libretranslate/templates/index.html:221 +msgid "Text to translate" +msgstr "需要翻譯的文字" + +#: libretranslate/templates/index.html:224 +msgid "Delete text" +msgstr "刪除文字" + +#: libretranslate/templates/index.html:237 +msgid "Suggest translation" +msgstr "建議翻譯" + +#: libretranslate/templates/index.html:241 +msgid "Cancel" +msgstr "取消" + +#: libretranslate/templates/index.html:244 +msgid "Send" +msgstr "送出" + +#: libretranslate/templates/index.html:260 +msgid "Supported file formats:" +msgstr "支援的檔案格式:" + +#: libretranslate/templates/index.html:264 +msgid "File" +msgstr "檔案" + +#: libretranslate/templates/index.html:279 +msgid "Remove file" +msgstr "移除檔案" + +#: libretranslate/templates/index.html:286 +msgid "Translate" +msgstr "翻譯" + +#: libretranslate/templates/index.html:287 +#: libretranslate/templates/index.html:331 +msgid "Download" +msgstr "下載" + +#: libretranslate/templates/index.html:306 +msgid "Request" +msgstr "請求" + +#: libretranslate/templates/index.html:311 +msgid "Response" +msgstr "回應" + +#: libretranslate/templates/index.html:326 +msgid "Open Source Machine Translation API" +msgstr "開源的機器翻譯 API" + +#: libretranslate/templates/index.html:327 +msgid "Free to download. Offline Capable. Easy to Setup." +msgstr "自建。可離線。容易設定。" + +#: libretranslate/templates/index.html:346 +msgid "LibreTranslate" +msgstr "LibreTranslate" + +#: libretranslate/templates/index.html:348 +msgid "License:" +msgstr "授權:" + +#: 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:354 +#, python-format +msgid "%(libretranslate)s Contributors" +msgstr "%(libretranslate)s 貢獻者" + +#~ msgid "Ukranian" +#~ msgstr "烏克蘭文" + +#~ msgid "" +#~ "This public API should be used for" +#~ " testing, personal or infrequent use. " +#~ "If you're going to run an " +#~ "application in production, please " +#~ "%(host_server)s or %(get_api_key)s." +#~ msgstr "" +#~ "此公共 API 僅適用於測試、個人或不經常使用。如果您將在正式環境中使用,請 " +#~ "%(host_server)s 或 %(get_api_key)s。" + +#~ msgid "host your own server" +#~ msgstr "建立自己的伺服器" + +#~ msgid "get an API key" +#~ msgstr "取得 API 金鑰" + +#~ msgid "Basque" +#~ msgstr "巴斯克語" + +#~ msgid "Galician" +#~ msgstr "加利西亞語" diff --git a/self_host/LibreTranslate/libretranslate/locales/zh_Hant/meta.json b/self_host/LibreTranslate/libretranslate/locales/zh_Hant/meta.json new file mode 100644 index 00000000..73e357e9 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/locales/zh_Hant/meta.json @@ -0,0 +1,4 @@ +{ + "name": "Chinese (Traditional)", + "reviewed": false +} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/main.py b/self_host/LibreTranslate/libretranslate/main.py new file mode 100644 index 00000000..21581982 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/main.py @@ -0,0 +1,297 @@ +import argparse +import operator +import sys + +from libretranslate.app import create_app +from libretranslate.default_values import DEFAULT_ARGUMENTS as DEFARGS +from werkzeug.serving import run_simple +from werkzeug.middleware.dispatcher import DispatcherMiddleware + + +def get_args(): + parser = argparse.ArgumentParser( + description="LibreTranslate - Free and Open Source Translation API" + ) + parser.add_argument( + "--host", type=str, help="Hostname (%(default)s)", default=DEFARGS['HOST'] + ) + parser.add_argument("--port", type=int, help="Port (%(default)s)", default=DEFARGS['PORT']) + parser.add_argument( + "--char-limit", + default=DEFARGS['CHAR_LIMIT'], + type=int, + metavar="", + help="Set character limit (%(default)s)", + ) + parser.add_argument( + "--req-limit", + default=DEFARGS['REQ_LIMIT'], + type=int, + metavar="", + help="Set the default maximum number of requests per minute per client (%(default)s)", + ) + parser.add_argument( + "--req-limit-storage", + default=DEFARGS['REQ_LIMIT_STORAGE'], + type=str, + metavar="", + help="Storage URI to use for request limit data storage. See https://flask-limiter.readthedocs.io/en/stable/configuration.html. (%(default)s)", + ) + parser.add_argument( + "--hourly-req-limit", + default=DEFARGS['HOURLY_REQ_LIMIT'], + type=int, + metavar="", + help="Set the default maximum number of requests per hour per client, in addition to req-limit. (%(default)s)", + ) + parser.add_argument( + "--hourly-req-limit-decay", + default=DEFARGS['HOURLY_REQ_LIMIT_DECAY'], + type=int, + metavar="", + help="When used in combination with hourly-req-limit, adds additional hourly restrictions that logaritmically decrease for each additional hour. (%(default)s)", + ) + parser.add_argument( + "--daily-req-limit", + default=DEFARGS['DAILY_REQ_LIMIT'], + type=int, + metavar="", + help="Set the default maximum number of requests per day per client, in addition to req-limit. (%(default)s)", + ) + parser.add_argument( + "--req-flood-threshold", + default=DEFARGS['REQ_FLOOD_THRESHOLD'], + type=int, + metavar="", + help="Set the maximum number of request limit offences that a client can exceed before being banned. (%(default)s)", + ) + parser.add_argument( + "--req-time-cost", + default=DEFARGS['REQ_TIME_COST'], + type=int, + metavar="", + help="Considers a time cost (in seconds) for request limiting purposes. If a request takes 10 seconds and this value is set to 5, the request cost is either 2 or the actual request cost (whichever is greater). (%(default)s)", + ) + parser.add_argument( + "--batch-limit", + default=DEFARGS['BATCH_LIMIT'], + type=int, + metavar="", + help="Set maximum number of texts to translate in a batch request (%(default)s)", + ) + parser.add_argument( + "--ga-id", + type=str, + default=DEFARGS['GA_ID'], + metavar="", + help="Enable Google Analytics on the API client page by providing an ID (%(default)s)", + ) + parser.add_argument( + "--debug", default=DEFARGS['DEBUG'], action="store_true", help="Enable debug environment" + ) + parser.add_argument( + "--ssl", default=DEFARGS['SSL'], action="store_true", help="Whether to enable SSL" + ) + parser.add_argument( + "--frontend-language-source", + type=str, + default=DEFARGS['FRONTEND_LANGUAGE_SOURCE'], + metavar="", + help="Set frontend default language - source (%(default)s)", + ) + parser.add_argument( + "--frontend-language-target", + type=str, + default=DEFARGS['FRONTEND_LANGUAGE_TARGET'], + metavar="", + help="Set frontend default language - target (%(default)s)", + ) + parser.add_argument( + "--frontend-language", + type=str, + default=DEFARGS['FRONTEND_LANGUAGE'], + metavar="", + help="Set frontend interface language (%(default)s)", + ) + parser.add_argument( + "--frontend-title", + type=str, + default=DEFARGS['FRONTEND_TITLE'], + metavar="", + help="Set frontend title (%(default)s)", + ) + parser.add_argument( + "--frontend-timeout", + type=int, + default=DEFARGS['FRONTEND_TIMEOUT'], + metavar="<milliseconds>", + help="Set frontend translation timeout (%(default)s)", + ) + parser.add_argument( + "--api-keys", + default=DEFARGS['API_KEYS'], + action="store_true", + help="Enable API keys database for per-user rate limits lookup", + ) + parser.add_argument( + "--api-keys-db-path", + default=DEFARGS['API_KEYS_DB_PATH'], + type=str, + help="Use a specific path inside the container for the local database. Can be absolute or relative (%(default)s)", + ) + parser.add_argument( + "--api-keys-remote", + default=DEFARGS['API_KEYS_REMOTE'], + type=str, + help="Use this remote endpoint to query for valid API keys instead of using the local database", + ) + parser.add_argument( + "--get-api-key-link", + default=DEFARGS['GET_API_KEY_LINK'], + type=str, + help="Show a link in the UI where to direct users to get an API key", + ) + parser.add_argument( + "--require-api-key-origin", + type=str, + default=DEFARGS['REQUIRE_API_KEY_ORIGIN'], + help="Require use of an API key for programmatic access to the API, unless the request origin matches this domain", + ) + parser.add_argument( + "--require-api-key-secret", + default=DEFARGS['REQUIRE_API_KEY_SECRET'], + 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( + "--hide-api", + default=DEFARGS['HIDE_API'], + action="store_true", + help="Hide the API request/response fields in the frontend", + ) + 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, + default=DEFARGS['SHARED_STORAGE'], + metavar="<Storage URI>", + help="Shared storage URI to use for multi-process data sharing (e.g. via gunicorn)", + ) + parser.add_argument( + "--secondary", + default=DEFARGS['SECONDARY'], + action="store_true", + help="Mark this instance as a secondary instance to avoid conflicts with the primary node in multi-node setups", + ) + parser.add_argument( + "--load-only", + type=operator.methodcaller("split", ","), + default=DEFARGS['LOAD_ONLY'], + 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'], + type=int, + metavar="<number of threads>", + help="Set number of threads (%(default)s)", + ) + parser.add_argument( + "--suggestions", default=DEFARGS['SUGGESTIONS'], action="store_true", help="Allow user suggestions" + ) + parser.add_argument( + "--disable-files-translation", default=DEFARGS['DISABLE_FILES_TRANSLATION'], action="store_true", + help="Disable files translation" + ) + parser.add_argument( + "--disable-web-ui", default=DEFARGS['DISABLE_WEB_UI'], action="store_true", help="Disable web ui" + ) + parser.add_argument( + "--update-models", default=DEFARGS['UPDATE_MODELS'], action="store_true", help="Update language models at startup" + ) + parser.add_argument( + "--force-update-models", default=DEFARGS['FORCE_UPDATE_MODELS'], action="store_true", help="Install/Reinstall language models at startup" + ) + parser.add_argument( + "--metrics", + default=DEFARGS['METRICS'], + action="store_true", + help="Enable the /metrics endpoint for exporting Prometheus usage metrics", + ) + parser.add_argument( + "--metrics-auth-token", + default=DEFARGS['METRICS_AUTH_TOKEN'], + type=str, + help="Protect the /metrics endpoint by allowing only clients that have a valid Authorization Bearer token (%(default)s)", + ) + parser.add_argument( + "--url-prefix", + default=DEFARGS['URL_PREFIX'], + type=str, + help="Add a prefix like /url-prefix to URL: example.com:5000/url-prefix/", + ) + args = parser.parse_args() + if args.url_prefix and not args.url_prefix.startswith('/'): + args.url_prefix = '/' + args.url_prefix + return args + + +def main(): + args = get_args() + + if args.url_prefix: + def redirect(environ, start_response): + start_response("301 REDIRECT", [("Content-Type", "text/plain"), ("Location", args.url_prefix)]) + yield b"Redirect..." + + app = DispatcherMiddleware(redirect, { + args.url_prefix: create_app(args) + }) + else: + app = DispatcherMiddleware(create_app(args)) + + if '--wsgi' in sys.argv: + return app + else: + if args.debug and args.host == "*": + # '::' will listen on both ipv6 and ipv4 + args.host = "::" + + if args.debug: + run_simple(args.host, args.port, app) + else: + from waitress import serve + + url_scheme = "https" if args.ssl else "http" + print(f"Running on {url_scheme}://{args.host}:{args.port}{args.url_prefix}") + + serve( + app, + host=args.host, + port=args.port, + url_scheme=url_scheme, + threads=args.threads + ) + + +if __name__ == "__main__": + main() diff --git a/self_host/LibreTranslate/libretranslate/manage.py b/self_host/LibreTranslate/libretranslate/manage.py new file mode 100644 index 00000000..a24a74d2 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/manage.py @@ -0,0 +1,63 @@ +import argparse +import os + +from libretranslate.api_keys import Database +from libretranslate.default_values import DEFAULT_ARGUMENTS as DEFARGS + + +def manage(): + parser = argparse.ArgumentParser(description="LibreTranslate Manage Tools") + subparsers = parser.add_subparsers( + help="", dest="command", required=True, title="Command List" + ) + + keys_parser = subparsers.add_parser("keys", help="Manage API keys database") + keys_parser.add_argument( + "--api-keys-db-path", + default=DEFARGS['API_KEYS_DB_PATH'], + type=str, + help="Use a specific path inside the container for the local database", + ) + keys_subparser = keys_parser.add_subparsers( + help="", dest="sub_command", title="Command List" + ) + + keys_add_parser = keys_subparser.add_parser("add", help="Add API keys to database") + keys_add_parser.add_argument( + "req_limit", type=int, help="Request Limits (per minute)" + ) + keys_add_parser.add_argument( + "--key", type=str, default="auto", required=False, help="API Key" + ) + keys_add_parser.add_argument( + "--char-limit", type=int, default=0, required=False, help="Character limit" + ) + + keys_remove_parser = keys_subparser.add_parser( + "remove", help="Remove API keys from database" + ) + keys_remove_parser.add_argument("key", type=str, help="API Key") + + args = parser.parse_args() + + if args.command == "keys": + if not os.path.exists(args.api_keys_db_path): + print("No such database: %s" % args.api_keys_db_path) + exit(1) + db = Database(args.api_keys_db_path) + if args.sub_command is None: + # Print keys + keys = db.all() + if not keys: + print("There are no API keys") + else: + for item in keys: + print("{}: {}".format(*item)) + + elif args.sub_command == "add": + print(db.add(args.req_limit, args.key, args.char_limit)[0]) + elif args.sub_command == "remove": + print(db.remove(args.key)) + else: + parser.print_help() + exit(1) diff --git a/self_host/LibreTranslate/libretranslate/no_limiter.py b/self_host/LibreTranslate/libretranslate/no_limiter.py new file mode 100644 index 00000000..28d895e9 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/no_limiter.py @@ -0,0 +1,13 @@ +from functools import wraps + + +class Limiter: + def exempt(self, f): + @wraps(f) + def wrapper(*args, **kwargs): + return f(*args, **kwargs) + + return wrapper + + def init_app(self, app): + pass diff --git a/self_host/LibreTranslate/libretranslate/remove_translated_files.py b/self_host/LibreTranslate/libretranslate/remove_translated_files.py new file mode 100644 index 00000000..c354b1ab --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/remove_translated_files.py @@ -0,0 +1,26 @@ +import atexit +import os +import time +from datetime import datetime + +from apscheduler.schedulers.background import BackgroundScheduler + + +def remove_translated_files(upload_dir: str): + now = time.mktime(datetime.now().timetuple()) + + for f in os.listdir(upload_dir): + f = os.path.join(upload_dir, f) + if os.path.isfile(f): + f_time = os.path.getmtime(f) + if (now - f_time) > 1800: # 30 minutes + os.remove(f) + + +def setup(upload_dir): + scheduler = BackgroundScheduler(daemon=True) + scheduler.add_job(remove_translated_files, "interval", minutes=30, kwargs={'upload_dir': upload_dir}) + scheduler.start() + + # Shut down the scheduler when exiting the app + atexit.register(lambda: scheduler.shutdown()) diff --git a/self_host/LibreTranslate/libretranslate/scheduler.py b/self_host/LibreTranslate/libretranslate/scheduler.py new file mode 100644 index 00000000..836a3eab --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/scheduler.py @@ -0,0 +1,25 @@ +import atexit + +from apscheduler.schedulers.background import BackgroundScheduler + +scheduler = None + +def setup(args): + from libretranslate.flood import forgive_banned + from libretranslate.secret import rotate_secrets + + global scheduler + + if scheduler is None: + scheduler = BackgroundScheduler() + + if not args.secondary and args.req_flood_threshold > 0: + scheduler.add_job(func=forgive_banned, trigger="interval", minutes=10) + + if not args.secondary and args.api_keys and args.require_api_key_secret: + scheduler.add_job(func=rotate_secrets, trigger="interval", minutes=30) + + scheduler.start() + + # Shut down the scheduler when exiting the app + atexit.register(lambda: scheduler.shutdown()) \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/secret.py b/self_host/LibreTranslate/libretranslate/secret.py new file mode 100644 index 00000000..fdf818d3 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/secret.py @@ -0,0 +1,121 @@ +import base64 +import random +import string +from functools import lru_cache + +from libretranslate.storage import get_storage + + +def to_base(n, b): + if n == 0: + return 0 + if n < 0: + sign = -1 + else: + sign = 1 + + n *= sign + digits = [] + while n: + digits.append(str(n % b)) + n //= b + return int(''.join(digits[::-1])) * sign + +@lru_cache(maxsize=4) +def obfuscate(input_str): + encoded = [ord(ch) for ch in input_str] + ops = ['+', '-', '*', ''] + parts = [] + + for c in encoded: + num = random.randint(1, 100) + op = random.choice(ops) + if op == '+': + v = c + num + op = '-' + elif op == '-': + v = c - num + op = '+' + if random.randint(0, 1) == 0: + op = '+false+' + elif op == '*': + v = c * num + op = '/' + if random.randint(0, 1) == 0: + op = '/**\\/*//' + + use_dec = random.randint(0, 1) == 0 + base = random.randint(4, 7) + + if op == '': + if use_dec: + parts.append(f'_({c})') + else: + parts.append(f'_(p({to_base(c, base)},{base}))') + else: + if use_dec: + parts.append(f'_({v}{op}{num})') + else: + parts.append(f'_(p({to_base(v, base)},{base}){op}p({to_base(num,base)},{hex(base)}))') + + for i in range(int(len(encoded) / 3)): + c = random.randint(1, 100) + parts.insert(random.randint(0, len(parts)), f"_(/*_({c})*/)") + for i in range(int(len(encoded) / 3)): + parts.insert(random.randint(0, len(parts)), f"\n[]\n") + + code = '(_=String.fromCharCode,p=parseInt,' + '+'.join(parts) + ')' + return code + +def generate_secret(): + return ''.join(random.choices(string.ascii_uppercase + string.digits, k=7)) + +def rotate_secrets(): + s = get_storage() + secret_1 = s.get_str("secret_1") + s.set_str("secret_0", secret_1) + s.set_str("secret_1", generate_secret()) + +def secret_match(secret): + s = get_storage() + return secret == s.get_str("secret_0") or secret == s.get_str("secret_1") + +def secret_bogus_match(secret): + if random.randint(0, 1) == 0: + return secret == get_bogus_secret() + return False + +def get_current_secret(): + return get_storage().get_str("secret_1") + +def get_current_secret_b64(): + return base64.b64encode(get_current_secret().encode("utf-8")).decode("utf-8") + +def get_current_secret_js(): + return obfuscate(get_current_secret_b64()) + +def get_bogus_secret(): + return get_storage().get_str("secret_bogus") + +def get_bogus_secret_b64(): + return base64.b64encode(get_bogus_secret().encode("utf-8")).decode("utf-8") + +def get_bogus_secret_js(): + return obfuscate(get_bogus_secret_b64()) + +@lru_cache(maxsize=1) +def get_emoji(): + return random.choice(["😂", "🤪", "😜", "🤣", "😹", "🐒", "🙈", "🤡", "🥸", "😆", "🥴", "🐸", "🐤", "🐒🙊", "👀", "💩", "🤯", "😛", "🤥", "👻"]) + +def setup(args): + if args.require_api_key_secret: + s = get_storage() + + if not s.exists("secret_0"): + s.set_str("secret_0", generate_secret()) + + if not s.exists("secret_1"): + s.set_str("secret_1", generate_secret()) + + if not s.exists("secret_bogus"): + s.set_str("secret_bogus", generate_secret()) diff --git a/self_host/LibreTranslate/libretranslate/security.py b/self_host/LibreTranslate/libretranslate/security.py new file mode 100644 index 00000000..7163a839 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/security.py @@ -0,0 +1,16 @@ +import os + + +class SuspiciousFileOperationError(Exception): + pass + + +def path_traversal_check(unsafe_path, known_safe_path): + known_safe_path = os.path.abspath(known_safe_path) + unsafe_path = os.path.abspath(unsafe_path) + + if (os.path.commonprefix([known_safe_path, unsafe_path]) != known_safe_path): + raise SuspiciousFileOperationError(f"{unsafe_path} is not safe") + + # Passes the check + return unsafe_path diff --git a/self_host/LibreTranslate/libretranslate/static/css/main.css b/self_host/LibreTranslate/libretranslate/static/css/main.css new file mode 100644 index 00000000..4d418183 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/static/css/main.css @@ -0,0 +1,488 @@ +/* Custom styles for LibreTranslate page */ + +:root { + --pri-bg-color: #fff; + --sec-bg-color: #f3f3f3; + --code-bg-color: #fbfbfb; + --border-color: #ccc; + --fg-color: #000; + --nav-fg-color: #fff; + --accent-color: #1565c0; +} + +@media (prefers-color-scheme: dark) { + :root { + --pri-bg-color: #111; + --sec-bg-color: #222; + --code-bg-color: #222; + --border-color: #444; + --fg-color: #fff; + } + + .token.atrule, .token.attr-value, .token.keyword { + color: #40b5e8; + } + + .language-css .token.string, .style .token.string, + .token.entity, .token.operator, .token.url { + color: #eecfab; + background: hsla(0,0%, 15%, .5); + } + + .token.attr-name, .token.builtin, .token.char, + .token.inserted, .token.selector, .token.string { + color: #acd25f; + } + + .token.boolean, .token.constant, .token.deleted, .token.number, + .token.property, .token.symbol, .token.tag { + color: #ff8bcc; + } + + .token.class-name, .token.function { + color: #ff7994; + } +} + +html, body, select { + font-size: 16px; + font-family: Arial, Helvetica, sans-serif !important; +} + +body { + background-color: var(--pri-bg-color); + color: var(--fg-color); +} + +nav, #nav, #nav-mobile, .locale-panel, .page-footer { + background-color: var(--accent-color); +} + +nav, nav .material-icons { + color: var(--nav-fg-color); +} + +.material-icons { + color: var(--fg-color); +} + +a:not(.noline) { + text-decoration: underline; +} + +#app { + min-height: 80vh; +} + +.component{ + visibility: hidden; +} + +#app.loaded .component{ + visibility: visible; +} + +h3.header { + margin-bottom: 2.5rem; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mb-1 { + margin-bottom: 1rem; +} + +.position-relative { + position: relative; +} + +.top-nav .locale-panel { + position: absolute; + top: 64px; + height: 68px; + right: 0; + padding: 0 16px; + width: 240px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 0 2px 2px 0 rgb(0 0 0 / 14%), 0 3px 1px -2px rgb(0 0 0 / 12%), 0px 4px 5px 0 rgb(0 0 0 / 20%); +} + +.locale-panel{ + display: none; +} + +.change-language.clicked + .locale-panel{ + display: block; +} + +.locale-panel select { + display: block; + height: 32px; + font-size: 14px; + color: var(--fg-color); + background-color: var(--pri-bg-color); + border: none; +} + +.locale-panel a{ + line-height: normal; + font-size: 90%; + padding: 0; + margin-top: 6px; + text-align: right; + text-decoration: none; + height: 28px; +} + +.locale-panel a:hover{ + text-decoration: underline; +} + +.locale-panel a i.material-icons{ + display: inline-block; + line-height: initial; + line-height: 14px; + font-size: 100%; + position: relative; + top: 2px; + left: 2px; +} + +.locale-panel a:hover{ + background-color: transparent !important; +} + +#nav-mobile .locale-panel{ + color: rgba(0,0,0,0.87); + padding: 0 32px; + padding-top: 12px; +} + +#nav-mobile a, #nav-mobile a i.material-icons{ + color: #fff; +} + +#nav-mobile .locale-panel a{ + padding: 0; +} + +#nav-mobile .locale-panel a i.material-icons{ + float: none; +} + +select { + color: var(--fg-color); + background-color: var(--pri-bg-color); +} + +.language-select { + display: inline-flex; + align-items: center; + justify-content: flex-start; +} + +.language-select select { + border: none; + width: auto; + cursor: pointer; + font-weight: 600; + text-decoration: underline; + -webkit-appearance: none; + appearance: none; + padding: 0; + text-indent: 0.01px; + text-overflow: ""; + margin: 0; + margin-left: 6px; + height: 2rem; + line-height: inherit; + outline: none; + position: relative; +} + +.language-select:after { + content: ""; + width: 0.5em; + height: 0.5em; + margin: 0 0 0.25rem -0.75rem; + border: solid var(--fg-color); + border-width: 0 2px 2px 0; + display: inline-block; + padding: 3px; + transform: rotate(45deg); + z-index: -1; +} + +.btn-switch-language { + color: black; + margin-left: -1.5rem; + margin-right: 1rem; +} + +.textarea-container { + margin-top: 0; + position: relative; +} + +.textarea-container .material-icons { + color: #666; +} + +.btn-delete-text { + position: absolute; + right: 1.5rem; + top: 0.75rem; + border: 0; + background: none; + padding: 0; + cursor: pointer; + color: #666; +} + +.btn-delete-text:focus, +.btn-action:focus { + background: none !important; +} + +.characters-limit-container { + position: absolute; + right: 2rem; + bottom: 1rem; + color: #666; + pointer-events: none; +} +.actions { + position: absolute; + right: 1.25rem; + bottom: 1rem; + display: flex; +} + +.btn-switch-type { + background-color: var(--sec-bg-color); + color: var(--fg-color); + display: flex; + align-items: center; + margin: .5rem; +} + +.btn-switch-type:focus { + background-color: inherit; +} + +.btn-switch-type:hover { + background-color: var(--sec-bg-color); +} + +.btn-switch-type.active { + background-color: var(--accent-color); + color: #FFF; +} + +.btn-switch-type.active .material-icons { + color: #FFF; +} + +.file-dropzone { + font-size: 1.1rem; + background: var(--sec-bg-color); + border: 1px solid var(--border-color); + padding: 1rem 2rem 1rem 1.5rem; + min-height: 220px; + position: relative; +} + +.dropzone-content { + position: absolute; + top: 50%; + left: 50%; + + transform: translate(-50%, -50%); +} + +.btn-action { + display: flex; + align-items: center; + color: #666; + font-size: 0.85rem; + background: none; + border: none; + cursor: pointer; +} + +.btn-blue { + color: #1565C0; +} + +.btn-action:disabled { + color: #666; +} + +.btn-action span { + padding-right: 0.5rem; +} + +.btn-action .material-icons { + font-size: 1.35rem; +} + +#translation-type-btns { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin: -.5rem; +} + +.btn-text { + display: none; + margin-left: 1em; +} + +#translation-form { + padding-top: 1em; +} + +.progress { + background-color: #f3f3f3; +} + +.progress.translate { + position: absolute; +} + +.progress .indeterminate { + background-color: steelblue; +} + +.textarea-container textarea { + font-size: 1.25rem; + resize: none; + color: var(--fg-color); + background: var(--sec-bg-color); + border: 1px solid var(--border-color); + padding: 1rem 2rem 1rem 1.5rem; + overflow-y: hidden; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.code-row-wrapper { + display: flex; + flex-wrap: wrap; +} + +.code-box { + display: flex; + flex-direction: column; +} + +.code { + font-size: 90%; + padding: 1rem 1.5rem; + background: var(--code-bg-color); + border: 1px solid var(--border-color); + overflow: auto; + font-family: monospace; + min-height: 280px; + width: 100%; + overflow: auto; + flex-grow: 1; +} + +code[class*="language-"], pre[class*="language-"] { + color: var(--fg-color); + text-shadow: 0 1px var(--pri-bg-color); +} + +.page-footer .footer-copyright { + justify-content: center; + padding: 0.5rem 1rem; +} + +#logo-container { + height: 100%; +} + +.logo { + height: 32px; +} + +.brand-logo { + text-decoration: none; +} + +.sidenav-trigger { + background-color: transparent; + border: none; + color: white; +} + +#download-btn-wrapper { + display: flex; + justify-content: center; + margin: 2em 0; +} + +#download-btn { + display: flex; + align-items: center; + text-decoration: none; +} + +#download-btn i{ + color: #fff; +} + +.card-content { + background-color: var(--pri-bg-color); +} + +.card-stacked, .card-stacked .card-content { + background-color: var(--sec-bg-color) +} + +textarea:disabled{ + opacity: 0.5; +} + +@media (min-width: 280px) { + .btn-text { + display: inline; + } +} + +@media (max-width: 760px) { + .language-select select { + text-align: center; + margin: auto; + padding: 0; + } + .language-select:after { + content: none; + } + .language-select span { + display: none; + } +} + +@media (min-width: 993px) { + nav button.sidenav-trigger { + display: none; + } +} diff --git a/self_host/LibreTranslate/libretranslate/static/css/material-icons.css b/self_host/LibreTranslate/libretranslate/static/css/material-icons.css new file mode 100644 index 00000000..b19d665c --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/static/css/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url('../fonts/MaterialIcons-Regular.eot'); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url('../fonts/MaterialIcons-Regular.woff2') format('woff2'), + url('../fonts/MaterialIcons-Regular.woff') format('woff'), + url('../fonts/MaterialIcons-Regular.ttf') format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/self_host/LibreTranslate/libretranslate/static/css/materialize.min.css b/self_host/LibreTranslate/libretranslate/static/css/materialize.min.css new file mode 100644 index 00000000..74b1741b --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/static/css/materialize.min.css @@ -0,0 +1,13 @@ +/*! + * Materialize v1.0.0 (http://materializecss.com) + * Copyright 2014-2017 Materialize + * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) + */ +.materialize-red{background-color:#e51c23 !important}.materialize-red-text{color:#e51c23 !important}.materialize-red.lighten-5{background-color:#fdeaeb !important}.materialize-red-text.text-lighten-5{color:#fdeaeb !important}.materialize-red.lighten-4{background-color:#f8c1c3 !important}.materialize-red-text.text-lighten-4{color:#f8c1c3 !important}.materialize-red.lighten-3{background-color:#f3989b !important}.materialize-red-text.text-lighten-3{color:#f3989b !important}.materialize-red.lighten-2{background-color:#ee6e73 !important}.materialize-red-text.text-lighten-2{color:#ee6e73 !important}.materialize-red.lighten-1{background-color:#ea454b !important}.materialize-red-text.text-lighten-1{color:#ea454b !important}.materialize-red.darken-1{background-color:#d0181e !important}.materialize-red-text.text-darken-1{color:#d0181e !important}.materialize-red.darken-2{background-color:#b9151b !important}.materialize-red-text.text-darken-2{color:#b9151b !important}.materialize-red.darken-3{background-color:#a21318 !important}.materialize-red-text.text-darken-3{color:#a21318 !important}.materialize-red.darken-4{background-color:#8b1014 !important}.materialize-red-text.text-darken-4{color:#8b1014 !important}.red{background-color:#F44336 !important}.red-text{color:#F44336 !important}.red.lighten-5{background-color:#FFEBEE !important}.red-text.text-lighten-5{color:#FFEBEE !important}.red.lighten-4{background-color:#FFCDD2 !important}.red-text.text-lighten-4{color:#FFCDD2 !important}.red.lighten-3{background-color:#EF9A9A !important}.red-text.text-lighten-3{color:#EF9A9A !important}.red.lighten-2{background-color:#E57373 !important}.red-text.text-lighten-2{color:#E57373 !important}.red.lighten-1{background-color:#EF5350 !important}.red-text.text-lighten-1{color:#EF5350 !important}.red.darken-1{background-color:#E53935 !important}.red-text.text-darken-1{color:#E53935 !important}.red.darken-2{background-color:#D32F2F !important}.red-text.text-darken-2{color:#D32F2F !important}.red.darken-3{background-color:#C62828 !important}.red-text.text-darken-3{color:#C62828 !important}.red.darken-4{background-color:#B71C1C !important}.red-text.text-darken-4{color:#B71C1C !important}.red.accent-1{background-color:#FF8A80 !important}.red-text.text-accent-1{color:#FF8A80 !important}.red.accent-2{background-color:#FF5252 !important}.red-text.text-accent-2{color:#FF5252 !important}.red.accent-3{background-color:#FF1744 !important}.red-text.text-accent-3{color:#FF1744 !important}.red.accent-4{background-color:#D50000 !important}.red-text.text-accent-4{color:#D50000 !important}.pink{background-color:#e91e63 !important}.pink-text{color:#e91e63 !important}.pink.lighten-5{background-color:#fce4ec !important}.pink-text.text-lighten-5{color:#fce4ec !important}.pink.lighten-4{background-color:#f8bbd0 !important}.pink-text.text-lighten-4{color:#f8bbd0 !important}.pink.lighten-3{background-color:#f48fb1 !important}.pink-text.text-lighten-3{color:#f48fb1 !important}.pink.lighten-2{background-color:#f06292 !important}.pink-text.text-lighten-2{color:#f06292 !important}.pink.lighten-1{background-color:#ec407a !important}.pink-text.text-lighten-1{color:#ec407a !important}.pink.darken-1{background-color:#d81b60 !important}.pink-text.text-darken-1{color:#d81b60 !important}.pink.darken-2{background-color:#c2185b !important}.pink-text.text-darken-2{color:#c2185b !important}.pink.darken-3{background-color:#ad1457 !important}.pink-text.text-darken-3{color:#ad1457 !important}.pink.darken-4{background-color:#880e4f !important}.pink-text.text-darken-4{color:#880e4f !important}.pink.accent-1{background-color:#ff80ab !important}.pink-text.text-accent-1{color:#ff80ab !important}.pink.accent-2{background-color:#ff4081 !important}.pink-text.text-accent-2{color:#ff4081 !important}.pink.accent-3{background-color:#f50057 !important}.pink-text.text-accent-3{color:#f50057 !important}.pink.accent-4{background-color:#c51162 !important}.pink-text.text-accent-4{color:#c51162 !important}.purple{background-color:#9c27b0 !important}.purple-text{color:#9c27b0 !important}.purple.lighten-5{background-color:#f3e5f5 !important}.purple-text.text-lighten-5{color:#f3e5f5 !important}.purple.lighten-4{background-color:#e1bee7 !important}.purple-text.text-lighten-4{color:#e1bee7 !important}.purple.lighten-3{background-color:#ce93d8 !important}.purple-text.text-lighten-3{color:#ce93d8 !important}.purple.lighten-2{background-color:#ba68c8 !important}.purple-text.text-lighten-2{color:#ba68c8 !important}.purple.lighten-1{background-color:#ab47bc !important}.purple-text.text-lighten-1{color:#ab47bc !important}.purple.darken-1{background-color:#8e24aa !important}.purple-text.text-darken-1{color:#8e24aa !important}.purple.darken-2{background-color:#7b1fa2 !important}.purple-text.text-darken-2{color:#7b1fa2 !important}.purple.darken-3{background-color:#6a1b9a !important}.purple-text.text-darken-3{color:#6a1b9a !important}.purple.darken-4{background-color:#4a148c !important}.purple-text.text-darken-4{color:#4a148c !important}.purple.accent-1{background-color:#ea80fc !important}.purple-text.text-accent-1{color:#ea80fc !important}.purple.accent-2{background-color:#e040fb !important}.purple-text.text-accent-2{color:#e040fb !important}.purple.accent-3{background-color:#d500f9 !important}.purple-text.text-accent-3{color:#d500f9 !important}.purple.accent-4{background-color:#a0f !important}.purple-text.text-accent-4{color:#a0f !important}.deep-purple{background-color:#673ab7 !important}.deep-purple-text{color:#673ab7 !important}.deep-purple.lighten-5{background-color:#ede7f6 !important}.deep-purple-text.text-lighten-5{color:#ede7f6 !important}.deep-purple.lighten-4{background-color:#d1c4e9 !important}.deep-purple-text.text-lighten-4{color:#d1c4e9 !important}.deep-purple.lighten-3{background-color:#b39ddb !important}.deep-purple-text.text-lighten-3{color:#b39ddb !important}.deep-purple.lighten-2{background-color:#9575cd !important}.deep-purple-text.text-lighten-2{color:#9575cd !important}.deep-purple.lighten-1{background-color:#7e57c2 !important}.deep-purple-text.text-lighten-1{color:#7e57c2 !important}.deep-purple.darken-1{background-color:#5e35b1 !important}.deep-purple-text.text-darken-1{color:#5e35b1 !important}.deep-purple.darken-2{background-color:#512da8 !important}.deep-purple-text.text-darken-2{color:#512da8 !important}.deep-purple.darken-3{background-color:#4527a0 !important}.deep-purple-text.text-darken-3{color:#4527a0 !important}.deep-purple.darken-4{background-color:#311b92 !important}.deep-purple-text.text-darken-4{color:#311b92 !important}.deep-purple.accent-1{background-color:#b388ff !important}.deep-purple-text.text-accent-1{color:#b388ff !important}.deep-purple.accent-2{background-color:#7c4dff !important}.deep-purple-text.text-accent-2{color:#7c4dff !important}.deep-purple.accent-3{background-color:#651fff !important}.deep-purple-text.text-accent-3{color:#651fff !important}.deep-purple.accent-4{background-color:#6200ea !important}.deep-purple-text.text-accent-4{color:#6200ea !important}.indigo{background-color:#3f51b5 !important}.indigo-text{color:#3f51b5 !important}.indigo.lighten-5{background-color:#e8eaf6 !important}.indigo-text.text-lighten-5{color:#e8eaf6 !important}.indigo.lighten-4{background-color:#c5cae9 !important}.indigo-text.text-lighten-4{color:#c5cae9 !important}.indigo.lighten-3{background-color:#9fa8da !important}.indigo-text.text-lighten-3{color:#9fa8da !important}.indigo.lighten-2{background-color:#7986cb !important}.indigo-text.text-lighten-2{color:#7986cb !important}.indigo.lighten-1{background-color:#5c6bc0 !important}.indigo-text.text-lighten-1{color:#5c6bc0 !important}.indigo.darken-1{background-color:#3949ab !important}.indigo-text.text-darken-1{color:#3949ab !important}.indigo.darken-2{background-color:#303f9f !important}.indigo-text.text-darken-2{color:#303f9f !important}.indigo.darken-3{background-color:#283593 !important}.indigo-text.text-darken-3{color:#283593 !important}.indigo.darken-4{background-color:#1a237e !important}.indigo-text.text-darken-4{color:#1a237e !important}.indigo.accent-1{background-color:#8c9eff !important}.indigo-text.text-accent-1{color:#8c9eff !important}.indigo.accent-2{background-color:#536dfe !important}.indigo-text.text-accent-2{color:#536dfe !important}.indigo.accent-3{background-color:#3d5afe !important}.indigo-text.text-accent-3{color:#3d5afe !important}.indigo.accent-4{background-color:#304ffe !important}.indigo-text.text-accent-4{color:#304ffe !important}.blue{background-color:#2196F3 !important}.blue-text{color:#2196F3 !important}.blue.lighten-5{background-color:#E3F2FD !important}.blue-text.text-lighten-5{color:#E3F2FD !important}.blue.lighten-4{background-color:#BBDEFB !important}.blue-text.text-lighten-4{color:#BBDEFB !important}.blue.lighten-3{background-color:#90CAF9 !important}.blue-text.text-lighten-3{color:#90CAF9 !important}.blue.lighten-2{background-color:#64B5F6 !important}.blue-text.text-lighten-2{color:#64B5F6 !important}.blue.lighten-1{background-color:#42A5F5 !important}.blue-text.text-lighten-1{color:#42A5F5 !important}.blue.darken-1{background-color:#1E88E5 !important}.blue-text.text-darken-1{color:#1E88E5 !important}.blue.darken-2{background-color:#1976D2 !important}.blue-text.text-darken-2{color:#1976D2 !important}.blue.darken-3{background-color:#1565C0 !important}.blue-text.text-darken-3{color:#1565C0 !important}.blue.darken-4{background-color:#0D47A1 !important}.blue-text.text-darken-4{color:#0D47A1 !important}.blue.accent-1{background-color:#82B1FF !important}.blue-text.text-accent-1{color:#82B1FF !important}.blue.accent-2{background-color:#448AFF !important}.blue-text.text-accent-2{color:#448AFF !important}.blue.accent-3{background-color:#2979FF !important}.blue-text.text-accent-3{color:#2979FF !important}.blue.accent-4{background-color:#2962FF !important}.blue-text.text-accent-4{color:#2962FF !important}.light-blue{background-color:#03a9f4 !important}.light-blue-text{color:#03a9f4 !important}.light-blue.lighten-5{background-color:#e1f5fe !important}.light-blue-text.text-lighten-5{color:#e1f5fe !important}.light-blue.lighten-4{background-color:#b3e5fc !important}.light-blue-text.text-lighten-4{color:#b3e5fc !important}.light-blue.lighten-3{background-color:#81d4fa !important}.light-blue-text.text-lighten-3{color:#81d4fa !important}.light-blue.lighten-2{background-color:#4fc3f7 !important}.light-blue-text.text-lighten-2{color:#4fc3f7 !important}.light-blue.lighten-1{background-color:#29b6f6 !important}.light-blue-text.text-lighten-1{color:#29b6f6 !important}.light-blue.darken-1{background-color:#039be5 !important}.light-blue-text.text-darken-1{color:#039be5 !important}.light-blue.darken-2{background-color:#0288d1 !important}.light-blue-text.text-darken-2{color:#0288d1 !important}.light-blue.darken-3{background-color:#0277bd !important}.light-blue-text.text-darken-3{color:#0277bd !important}.light-blue.darken-4{background-color:#01579b !important}.light-blue-text.text-darken-4{color:#01579b !important}.light-blue.accent-1{background-color:#80d8ff !important}.light-blue-text.text-accent-1{color:#80d8ff !important}.light-blue.accent-2{background-color:#40c4ff !important}.light-blue-text.text-accent-2{color:#40c4ff !important}.light-blue.accent-3{background-color:#00b0ff !important}.light-blue-text.text-accent-3{color:#00b0ff !important}.light-blue.accent-4{background-color:#0091ea !important}.light-blue-text.text-accent-4{color:#0091ea !important}.cyan{background-color:#00bcd4 !important}.cyan-text{color:#00bcd4 !important}.cyan.lighten-5{background-color:#e0f7fa !important}.cyan-text.text-lighten-5{color:#e0f7fa !important}.cyan.lighten-4{background-color:#b2ebf2 !important}.cyan-text.text-lighten-4{color:#b2ebf2 !important}.cyan.lighten-3{background-color:#80deea !important}.cyan-text.text-lighten-3{color:#80deea !important}.cyan.lighten-2{background-color:#4dd0e1 !important}.cyan-text.text-lighten-2{color:#4dd0e1 !important}.cyan.lighten-1{background-color:#26c6da !important}.cyan-text.text-lighten-1{color:#26c6da !important}.cyan.darken-1{background-color:#00acc1 !important}.cyan-text.text-darken-1{color:#00acc1 !important}.cyan.darken-2{background-color:#0097a7 !important}.cyan-text.text-darken-2{color:#0097a7 !important}.cyan.darken-3{background-color:#00838f !important}.cyan-text.text-darken-3{color:#00838f !important}.cyan.darken-4{background-color:#006064 !important}.cyan-text.text-darken-4{color:#006064 !important}.cyan.accent-1{background-color:#84ffff !important}.cyan-text.text-accent-1{color:#84ffff !important}.cyan.accent-2{background-color:#18ffff !important}.cyan-text.text-accent-2{color:#18ffff !important}.cyan.accent-3{background-color:#00e5ff !important}.cyan-text.text-accent-3{color:#00e5ff !important}.cyan.accent-4{background-color:#00b8d4 !important}.cyan-text.text-accent-4{color:#00b8d4 !important}.teal{background-color:#009688 !important}.teal-text{color:#009688 !important}.teal.lighten-5{background-color:#e0f2f1 !important}.teal-text.text-lighten-5{color:#e0f2f1 !important}.teal.lighten-4{background-color:#b2dfdb !important}.teal-text.text-lighten-4{color:#b2dfdb !important}.teal.lighten-3{background-color:#80cbc4 !important}.teal-text.text-lighten-3{color:#80cbc4 !important}.teal.lighten-2{background-color:#4db6ac !important}.teal-text.text-lighten-2{color:#4db6ac !important}.teal.lighten-1{background-color:#26a69a !important}.teal-text.text-lighten-1{color:#26a69a !important}.teal.darken-1{background-color:#00897b !important}.teal-text.text-darken-1{color:#00897b !important}.teal.darken-2{background-color:#00796b !important}.teal-text.text-darken-2{color:#00796b !important}.teal.darken-3{background-color:#00695c !important}.teal-text.text-darken-3{color:#00695c !important}.teal.darken-4{background-color:#004d40 !important}.teal-text.text-darken-4{color:#004d40 !important}.teal.accent-1{background-color:#a7ffeb !important}.teal-text.text-accent-1{color:#a7ffeb !important}.teal.accent-2{background-color:#64ffda !important}.teal-text.text-accent-2{color:#64ffda !important}.teal.accent-3{background-color:#1de9b6 !important}.teal-text.text-accent-3{color:#1de9b6 !important}.teal.accent-4{background-color:#00bfa5 !important}.teal-text.text-accent-4{color:#00bfa5 !important}.green{background-color:#4CAF50 !important}.green-text{color:#4CAF50 !important}.green.lighten-5{background-color:#E8F5E9 !important}.green-text.text-lighten-5{color:#E8F5E9 !important}.green.lighten-4{background-color:#C8E6C9 !important}.green-text.text-lighten-4{color:#C8E6C9 !important}.green.lighten-3{background-color:#A5D6A7 !important}.green-text.text-lighten-3{color:#A5D6A7 !important}.green.lighten-2{background-color:#81C784 !important}.green-text.text-lighten-2{color:#81C784 !important}.green.lighten-1{background-color:#66BB6A !important}.green-text.text-lighten-1{color:#66BB6A !important}.green.darken-1{background-color:#43A047 !important}.green-text.text-darken-1{color:#43A047 !important}.green.darken-2{background-color:#388E3C !important}.green-text.text-darken-2{color:#388E3C !important}.green.darken-3{background-color:#2E7D32 !important}.green-text.text-darken-3{color:#2E7D32 !important}.green.darken-4{background-color:#1B5E20 !important}.green-text.text-darken-4{color:#1B5E20 !important}.green.accent-1{background-color:#B9F6CA !important}.green-text.text-accent-1{color:#B9F6CA !important}.green.accent-2{background-color:#69F0AE !important}.green-text.text-accent-2{color:#69F0AE !important}.green.accent-3{background-color:#00E676 !important}.green-text.text-accent-3{color:#00E676 !important}.green.accent-4{background-color:#00C853 !important}.green-text.text-accent-4{color:#00C853 !important}.light-green{background-color:#8bc34a !important}.light-green-text{color:#8bc34a !important}.light-green.lighten-5{background-color:#f1f8e9 !important}.light-green-text.text-lighten-5{color:#f1f8e9 !important}.light-green.lighten-4{background-color:#dcedc8 !important}.light-green-text.text-lighten-4{color:#dcedc8 !important}.light-green.lighten-3{background-color:#c5e1a5 !important}.light-green-text.text-lighten-3{color:#c5e1a5 !important}.light-green.lighten-2{background-color:#aed581 !important}.light-green-text.text-lighten-2{color:#aed581 !important}.light-green.lighten-1{background-color:#9ccc65 !important}.light-green-text.text-lighten-1{color:#9ccc65 !important}.light-green.darken-1{background-color:#7cb342 !important}.light-green-text.text-darken-1{color:#7cb342 !important}.light-green.darken-2{background-color:#689f38 !important}.light-green-text.text-darken-2{color:#689f38 !important}.light-green.darken-3{background-color:#558b2f !important}.light-green-text.text-darken-3{color:#558b2f !important}.light-green.darken-4{background-color:#33691e !important}.light-green-text.text-darken-4{color:#33691e !important}.light-green.accent-1{background-color:#ccff90 !important}.light-green-text.text-accent-1{color:#ccff90 !important}.light-green.accent-2{background-color:#b2ff59 !important}.light-green-text.text-accent-2{color:#b2ff59 !important}.light-green.accent-3{background-color:#76ff03 !important}.light-green-text.text-accent-3{color:#76ff03 !important}.light-green.accent-4{background-color:#64dd17 !important}.light-green-text.text-accent-4{color:#64dd17 !important}.lime{background-color:#cddc39 !important}.lime-text{color:#cddc39 !important}.lime.lighten-5{background-color:#f9fbe7 !important}.lime-text.text-lighten-5{color:#f9fbe7 !important}.lime.lighten-4{background-color:#f0f4c3 !important}.lime-text.text-lighten-4{color:#f0f4c3 !important}.lime.lighten-3{background-color:#e6ee9c !important}.lime-text.text-lighten-3{color:#e6ee9c !important}.lime.lighten-2{background-color:#dce775 !important}.lime-text.text-lighten-2{color:#dce775 !important}.lime.lighten-1{background-color:#d4e157 !important}.lime-text.text-lighten-1{color:#d4e157 !important}.lime.darken-1{background-color:#c0ca33 !important}.lime-text.text-darken-1{color:#c0ca33 !important}.lime.darken-2{background-color:#afb42b !important}.lime-text.text-darken-2{color:#afb42b !important}.lime.darken-3{background-color:#9e9d24 !important}.lime-text.text-darken-3{color:#9e9d24 !important}.lime.darken-4{background-color:#827717 !important}.lime-text.text-darken-4{color:#827717 !important}.lime.accent-1{background-color:#f4ff81 !important}.lime-text.text-accent-1{color:#f4ff81 !important}.lime.accent-2{background-color:#eeff41 !important}.lime-text.text-accent-2{color:#eeff41 !important}.lime.accent-3{background-color:#c6ff00 !important}.lime-text.text-accent-3{color:#c6ff00 !important}.lime.accent-4{background-color:#aeea00 !important}.lime-text.text-accent-4{color:#aeea00 !important}.yellow{background-color:#ffeb3b !important}.yellow-text{color:#ffeb3b !important}.yellow.lighten-5{background-color:#fffde7 !important}.yellow-text.text-lighten-5{color:#fffde7 !important}.yellow.lighten-4{background-color:#fff9c4 !important}.yellow-text.text-lighten-4{color:#fff9c4 !important}.yellow.lighten-3{background-color:#fff59d !important}.yellow-text.text-lighten-3{color:#fff59d !important}.yellow.lighten-2{background-color:#fff176 !important}.yellow-text.text-lighten-2{color:#fff176 !important}.yellow.lighten-1{background-color:#ffee58 !important}.yellow-text.text-lighten-1{color:#ffee58 !important}.yellow.darken-1{background-color:#fdd835 !important}.yellow-text.text-darken-1{color:#fdd835 !important}.yellow.darken-2{background-color:#fbc02d !important}.yellow-text.text-darken-2{color:#fbc02d !important}.yellow.darken-3{background-color:#f9a825 !important}.yellow-text.text-darken-3{color:#f9a825 !important}.yellow.darken-4{background-color:#f57f17 !important}.yellow-text.text-darken-4{color:#f57f17 !important}.yellow.accent-1{background-color:#ffff8d !important}.yellow-text.text-accent-1{color:#ffff8d !important}.yellow.accent-2{background-color:#ff0 !important}.yellow-text.text-accent-2{color:#ff0 !important}.yellow.accent-3{background-color:#ffea00 !important}.yellow-text.text-accent-3{color:#ffea00 !important}.yellow.accent-4{background-color:#ffd600 !important}.yellow-text.text-accent-4{color:#ffd600 !important}.amber{background-color:#ffc107 !important}.amber-text{color:#ffc107 !important}.amber.lighten-5{background-color:#fff8e1 !important}.amber-text.text-lighten-5{color:#fff8e1 !important}.amber.lighten-4{background-color:#ffecb3 !important}.amber-text.text-lighten-4{color:#ffecb3 !important}.amber.lighten-3{background-color:#ffe082 !important}.amber-text.text-lighten-3{color:#ffe082 !important}.amber.lighten-2{background-color:#ffd54f !important}.amber-text.text-lighten-2{color:#ffd54f !important}.amber.lighten-1{background-color:#ffca28 !important}.amber-text.text-lighten-1{color:#ffca28 !important}.amber.darken-1{background-color:#ffb300 !important}.amber-text.text-darken-1{color:#ffb300 !important}.amber.darken-2{background-color:#ffa000 !important}.amber-text.text-darken-2{color:#ffa000 !important}.amber.darken-3{background-color:#ff8f00 !important}.amber-text.text-darken-3{color:#ff8f00 !important}.amber.darken-4{background-color:#ff6f00 !important}.amber-text.text-darken-4{color:#ff6f00 !important}.amber.accent-1{background-color:#ffe57f !important}.amber-text.text-accent-1{color:#ffe57f !important}.amber.accent-2{background-color:#ffd740 !important}.amber-text.text-accent-2{color:#ffd740 !important}.amber.accent-3{background-color:#ffc400 !important}.amber-text.text-accent-3{color:#ffc400 !important}.amber.accent-4{background-color:#ffab00 !important}.amber-text.text-accent-4{color:#ffab00 !important}.orange{background-color:#ff9800 !important}.orange-text{color:#ff9800 !important}.orange.lighten-5{background-color:#fff3e0 !important}.orange-text.text-lighten-5{color:#fff3e0 !important}.orange.lighten-4{background-color:#ffe0b2 !important}.orange-text.text-lighten-4{color:#ffe0b2 !important}.orange.lighten-3{background-color:#ffcc80 !important}.orange-text.text-lighten-3{color:#ffcc80 !important}.orange.lighten-2{background-color:#ffb74d !important}.orange-text.text-lighten-2{color:#ffb74d !important}.orange.lighten-1{background-color:#ffa726 !important}.orange-text.text-lighten-1{color:#ffa726 !important}.orange.darken-1{background-color:#fb8c00 !important}.orange-text.text-darken-1{color:#fb8c00 !important}.orange.darken-2{background-color:#f57c00 !important}.orange-text.text-darken-2{color:#f57c00 !important}.orange.darken-3{background-color:#ef6c00 !important}.orange-text.text-darken-3{color:#ef6c00 !important}.orange.darken-4{background-color:#e65100 !important}.orange-text.text-darken-4{color:#e65100 !important}.orange.accent-1{background-color:#ffd180 !important}.orange-text.text-accent-1{color:#ffd180 !important}.orange.accent-2{background-color:#ffab40 !important}.orange-text.text-accent-2{color:#ffab40 !important}.orange.accent-3{background-color:#ff9100 !important}.orange-text.text-accent-3{color:#ff9100 !important}.orange.accent-4{background-color:#ff6d00 !important}.orange-text.text-accent-4{color:#ff6d00 !important}.deep-orange{background-color:#ff5722 !important}.deep-orange-text{color:#ff5722 !important}.deep-orange.lighten-5{background-color:#fbe9e7 !important}.deep-orange-text.text-lighten-5{color:#fbe9e7 !important}.deep-orange.lighten-4{background-color:#ffccbc !important}.deep-orange-text.text-lighten-4{color:#ffccbc !important}.deep-orange.lighten-3{background-color:#ffab91 !important}.deep-orange-text.text-lighten-3{color:#ffab91 !important}.deep-orange.lighten-2{background-color:#ff8a65 !important}.deep-orange-text.text-lighten-2{color:#ff8a65 !important}.deep-orange.lighten-1{background-color:#ff7043 !important}.deep-orange-text.text-lighten-1{color:#ff7043 !important}.deep-orange.darken-1{background-color:#f4511e !important}.deep-orange-text.text-darken-1{color:#f4511e !important}.deep-orange.darken-2{background-color:#e64a19 !important}.deep-orange-text.text-darken-2{color:#e64a19 !important}.deep-orange.darken-3{background-color:#d84315 !important}.deep-orange-text.text-darken-3{color:#d84315 !important}.deep-orange.darken-4{background-color:#bf360c !important}.deep-orange-text.text-darken-4{color:#bf360c !important}.deep-orange.accent-1{background-color:#ff9e80 !important}.deep-orange-text.text-accent-1{color:#ff9e80 !important}.deep-orange.accent-2{background-color:#ff6e40 !important}.deep-orange-text.text-accent-2{color:#ff6e40 !important}.deep-orange.accent-3{background-color:#ff3d00 !important}.deep-orange-text.text-accent-3{color:#ff3d00 !important}.deep-orange.accent-4{background-color:#dd2c00 !important}.deep-orange-text.text-accent-4{color:#dd2c00 !important}.brown{background-color:#795548 !important}.brown-text{color:#795548 !important}.brown.lighten-5{background-color:#efebe9 !important}.brown-text.text-lighten-5{color:#efebe9 !important}.brown.lighten-4{background-color:#d7ccc8 !important}.brown-text.text-lighten-4{color:#d7ccc8 !important}.brown.lighten-3{background-color:#bcaaa4 !important}.brown-text.text-lighten-3{color:#bcaaa4 !important}.brown.lighten-2{background-color:#a1887f !important}.brown-text.text-lighten-2{color:#a1887f !important}.brown.lighten-1{background-color:#8d6e63 !important}.brown-text.text-lighten-1{color:#8d6e63 !important}.brown.darken-1{background-color:#6d4c41 !important}.brown-text.text-darken-1{color:#6d4c41 !important}.brown.darken-2{background-color:#5d4037 !important}.brown-text.text-darken-2{color:#5d4037 !important}.brown.darken-3{background-color:#4e342e !important}.brown-text.text-darken-3{color:#4e342e !important}.brown.darken-4{background-color:#3e2723 !important}.brown-text.text-darken-4{color:#3e2723 !important}.blue-grey{background-color:#607d8b !important}.blue-grey-text{color:#607d8b !important}.blue-grey.lighten-5{background-color:#eceff1 !important}.blue-grey-text.text-lighten-5{color:#eceff1 !important}.blue-grey.lighten-4{background-color:#cfd8dc !important}.blue-grey-text.text-lighten-4{color:#cfd8dc !important}.blue-grey.lighten-3{background-color:#b0bec5 !important}.blue-grey-text.text-lighten-3{color:#b0bec5 !important}.blue-grey.lighten-2{background-color:#90a4ae !important}.blue-grey-text.text-lighten-2{color:#90a4ae !important}.blue-grey.lighten-1{background-color:#78909c !important}.blue-grey-text.text-lighten-1{color:#78909c !important}.blue-grey.darken-1{background-color:#546e7a !important}.blue-grey-text.text-darken-1{color:#546e7a !important}.blue-grey.darken-2{background-color:#455a64 !important}.blue-grey-text.text-darken-2{color:#455a64 !important}.blue-grey.darken-3{background-color:#37474f !important}.blue-grey-text.text-darken-3{color:#37474f !important}.blue-grey.darken-4{background-color:#263238 !important}.blue-grey-text.text-darken-4{color:#263238 !important}.grey{background-color:#9e9e9e !important}.grey-text{color:#9e9e9e !important}.grey.lighten-5{background-color:#fafafa !important}.grey-text.text-lighten-5{color:#fafafa !important}.grey.lighten-4{background-color:#f5f5f5 !important}.grey-text.text-lighten-4{color:#f5f5f5 !important}.grey.lighten-3{background-color:#eee !important}.grey-text.text-lighten-3{color:#eee !important}.grey.lighten-2{background-color:#e0e0e0 !important}.grey-text.text-lighten-2{color:#e0e0e0 !important}.grey.lighten-1{background-color:#bdbdbd !important}.grey-text.text-lighten-1{color:#bdbdbd !important}.grey.darken-1{background-color:#757575 !important}.grey-text.text-darken-1{color:#757575 !important}.grey.darken-2{background-color:#616161 !important}.grey-text.text-darken-2{color:#616161 !important}.grey.darken-3{background-color:#424242 !important}.grey-text.text-darken-3{color:#424242 !important}.grey.darken-4{background-color:#212121 !important}.grey-text.text-darken-4{color:#212121 !important}.black{background-color:#000 !important}.black-text{color:#000 !important}.white{background-color:#fff !important}.white-text{color:#fff !important}.transparent{background-color:rgba(0,0,0,0) !important}.transparent-text{color:rgba(0,0,0,0) !important}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,*:before,*:after{-webkit-box-sizing:inherit;box-sizing:inherit}button,input,optgroup,select,textarea{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.clearfix{clear:both}.z-depth-0{-webkit-box-shadow:none !important;box-shadow:none !important}.z-depth-1,nav,.card-panel,.card,.toast,.btn,.btn-large,.btn-small,.btn-floating,.dropdown-content,.collapsible,.sidenav{-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2);box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.z-depth-1-half,.btn:hover,.btn-large:hover,.btn-small:hover,.btn-floating:hover{-webkit-box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2);box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2)}.z-depth-2{-webkit-box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3);box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3)}.z-depth-3{-webkit-box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2);box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.z-depth-4{-webkit-box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2);box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2)}.z-depth-5,.modal{-webkit-box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2);box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2)}.hoverable{-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s}.hoverable:hover{-webkit-box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width: 992px){.pagination{width:100%}.pagination li.prev,.pagination li.next{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:rgba(255,255,255,0.7)}.breadcrumb i,.breadcrumb [class^="mdi-"],.breadcrumb [class*="mdi-"],.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:'\E5CC';color:rgba(255,255,255,0.7);vertical-align:top;display:inline-block;font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax-container .parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax-container .parallax img{opacity:0;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed !important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%}@media only screen and (max-width: 600px){.hide-on-small-only,.hide-on-small-and-down{display:none !important}}@media only screen and (max-width: 992px){.hide-on-med-and-down{display:none !important}}@media only screen and (min-width: 601px){.hide-on-med-and-up{display:none !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.hide-on-med-only{display:none !important}}@media only screen and (min-width: 993px){.hide-on-large-only{display:none !important}}@media only screen and (min-width: 1201px){.hide-on-extra-large-only{display:none !important}}@media only screen and (min-width: 1201px){.show-on-extra-large{display:block !important}}@media only screen and (min-width: 993px){.show-on-large{display:block !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.show-on-medium{display:block !important}}@media only screen and (max-width: 600px){.show-on-small{display:block !important}}@media only screen and (min-width: 601px){.show-on-medium-and-up{display:block !important}}@media only screen and (max-width: 992px){.show-on-medium-and-down{display:block !important}}@media only screen and (max-width: 600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;color:#fff;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:10px 0px;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:none}table{width:100%;display:table;border-collapse:collapse;border-spacing:0}table.striped tr{border-bottom:none}table.striped>tbody>tr:nth-child(odd){background-color:rgba(242,242,242,0.5)}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:rgba(242,242,242,0.5)}table.centered thead tr th,table.centered tbody tr td{text-align:center}tr{border-bottom:1px solid rgba(0,0,0,0.12)}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width: 992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:'\00a0'}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:"\00a0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{border-bottom:none;padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid rgba(0,0,0,0.12)}}.collection{margin:.5rem 0 1rem 0;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar:not(.circle-clipper)>.circle,.collection .collection-item.avatar :not(.circle-clipper)>.circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;-webkit-transition:.25s;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;background-color:#26a69a;-webkit-transition:width .3s linear;transition:width .3s linear}.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none !important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left !important}.right{float:right !important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0 !important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;-webkit-box-sizing:border-box;box-sizing:border-box}span.badge.new{font-weight:300;font-size:0.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]::after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px;-webkit-font-smoothing:auto}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collapsible span.badge{margin-left:auto}.sidenav span.badge{margin-top:calc(24px - 11px)}table span.badge{display:inline-block;float:none;margin-left:auto}.material-icons{text-rendering:optimizeLegibility;-webkit-font-feature-settings:'liga';-moz-font-feature-settings:'liga';font-feature-settings:'liga'}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width: 601px){.container{width:85%}}@media only screen and (min-width: 993px){.container{width:70%}}.col .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*="push-"],.row .col[class*="pull-"]{position:relative}.row .col.s1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.s7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width: 601px){.row .col.m1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.m7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width: 993px){.row .col.l1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.l7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width: 1201px){.row .col.xl1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.xl7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav i,nav [class^="mdi-"],nav [class*="mdi-"],nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width: 993px){nav a.sidenav-trigger{display:none}}nav .sidenav-trigger{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .sidenav-trigger i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width: 992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;-webkit-transform:none;transform:none}nav .brand-logo.left{left:0.5rem}nav .brand-logo.right{right:0.5rem;left:auto}}nav .brand-logo.right{right:0.5rem;padding:0}nav .brand-logo i,nav .brand-logo [class^="mdi-"],nav .brand-logo [class*="mdi-"],nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{-webkit-transition:background-color .3s;transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,0.1)}nav ul a{-webkit-transition:background-color .3s;transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-large,nav ul a.btn-small,nav ul a.btn-large,nav ul a.btn-flat,nav ul a.btn-floating{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-small>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,0.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=text]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=url]:valid,nav .input-field input[type=date]:valid{border:none;-webkit-box-shadow:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:rgba(255,255,255,0.7);-webkit-transition:color .3s;transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width: 601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.sidenav-trigger,nav a.sidenav-trigger i{height:64px;line-height:64px}.navbar-fixed{height:64px}}a{text-decoration:none}html{line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:normal;color:rgba(0,0,0,0.87)}@media only screen and (min-width: 0){html{font-size:14px}}@media only screen and (min-width: 992px){html{font-size:14.5px}}@media only screen and (min-width: 1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.3}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;line-height:110%;margin:2.8rem 0 1.68rem 0}h2{font-size:3.56rem;line-height:110%;margin:2.3733333333rem 0 1.424rem 0}h3{font-size:2.92rem;line-height:110%;margin:1.9466666667rem 0 1.168rem 0}h4{font-size:2.28rem;line-height:110%;margin:1.52rem 0 .912rem 0}h5{font-size:1.64rem;line-height:110%;margin:1.0933333333rem 0 .656rem 0}h6{font-size:1.15rem;line-height:110%;margin:.7666666667rem 0 .46rem 0}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light{font-weight:300}.thin{font-weight:200}@media only screen and (min-width: 360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width: 390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width: 420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width: 450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width: 480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width: 510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width: 540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width: 570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width: 600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width: 630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width: 660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width: 690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width: 720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width: 750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width: 780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width: 810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width: 840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width: 870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width: 900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width: 930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width: 960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width: 360px){.flow-text{font-size:1.2rem}}.scale-transition{-webkit-transition:-webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:-webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important}.scale-transition.scale-out{-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform .2s !important;transition:-webkit-transform .2s !important;transition:transform .2s !important;transition:transform .2s, -webkit-transform .2s !important}.scale-transition.scale-in{-webkit-transform:scale(1);transform:scale(1)}.card-panel{-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s;padding:24px;margin:.5rem 0 1rem 0;border-radius:2px;background-color:#fff}.card{position:relative;margin:.5rem 0 1rem 0;background-color:#fff;-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s;border-radius:2px}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.small,.card.medium,.card.large{position:relative}.card.small .card-image,.card.medium .card-image,.card.large .card-image{max-height:60%;overflow:hidden}.card.small .card-image+.card-content,.card.medium .card-image+.card-content,.card.large .card-image+.card-content{max-height:40%}.card.small .card-content,.card.medium .card-content,.card.large .card-content{max-height:100%;overflow:hidden}.card.small .card-action,.card.medium .card-action,.card.large .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.card.horizontal.small .card-image,.card.horizontal.medium .card-image,.card.horizontal.large .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.small .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.large .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.card.horizontal .card-stacked .card-content{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{background-color:inherit;border-top:1px solid rgba(160,160,160,0.2);position:relative;padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;-webkit-transition:color .3s ease;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width: 600px){#toast-container{min-width:100%;bottom:0%}}@media only screen and (min-width: 601px) and (max-width: 992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width: 993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;cursor:default}.toast .toast-action{color:#eeff41;font-weight:500;margin-right:-25px;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width: 600px){.toast{width:100%;border-radius:0}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab a,.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover{color:rgba(255,255,255,0.7)}.tabs.tabs-transparent .tab a:hover,.tabs.tabs-transparent .tab a.active{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.tabs-fixed-width .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(238,110,115,0.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;-webkit-transition:color .28s ease, background-color .28s ease;transition:color .28s ease, background-color .28s ease}.tabs .tab a:focus,.tabs .tab a:focus.active{background-color:rgba(246,178,181,0.2);outline:none}.tabs .tab a:hover,.tabs .tab a.active{background-color:transparent;color:#ee6e73}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(238,110,115,0.4);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left, right}@media only screen and (max-width: 992px){.tabs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;opacity:0;position:absolute;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none;visibility:hidden;background-color:#323232}.backdrop{position:absolute;opacity:0;height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 0%;transform-origin:50% 0%;visibility:hidden}.btn,.btn-large,.btn-small,.btn-flat{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 16px;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn.disabled,.disabled.btn-large,.disabled.btn-small,.btn-floating.disabled,.btn-large.disabled,.btn-small.disabled,.btn-flat.disabled,.btn:disabled,.btn-large:disabled,.btn-small:disabled,.btn-floating:disabled,.btn-large:disabled,.btn-small:disabled,.btn-flat:disabled,.btn[disabled],.btn-large[disabled],.btn-small[disabled],.btn-floating[disabled],.btn-large[disabled],.btn-small[disabled],.btn-flat[disabled]{pointer-events:none;background-color:#DFDFDF !important;-webkit-box-shadow:none;box-shadow:none;color:#9F9F9F !important;cursor:default}.btn.disabled:hover,.disabled.btn-large:hover,.disabled.btn-small:hover,.btn-floating.disabled:hover,.btn-large.disabled:hover,.btn-small.disabled:hover,.btn-flat.disabled:hover,.btn:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-floating:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-flat:disabled:hover,.btn[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-floating[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-flat[disabled]:hover{background-color:#DFDFDF !important;color:#9F9F9F !important}.btn,.btn-large,.btn-small,.btn-floating,.btn-large,.btn-small,.btn-flat{font-size:14px;outline:0}.btn i,.btn-large i,.btn-small i,.btn-floating i,.btn-large i,.btn-small i,.btn-flat i{font-size:1.3rem;line-height:inherit}.btn:focus,.btn-large:focus,.btn-small:focus,.btn-floating:focus{background-color:#1d7d74}.btn,.btn-large,.btn-small{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;-webkit-transition:background-color .2s ease-out;transition:background-color .2s ease-out;cursor:pointer}.btn:hover,.btn-large:hover,.btn-small:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;background-color:#26a69a;border-radius:50%;-webkit-transition:background-color .3s;transition:background-color .3s;cursor:pointer;vertical-align:middle}.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px;padding:0}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.btn-small{width:32.4px;height:32.4px}.btn-floating.btn-small.halfway-fab{bottom:-16.2px}.btn-floating.btn-small i{line-height:32.4px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:997}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.direction-left,.fixed-action-btn.direction-right{padding:0 0 0 15px}.fixed-action-btn.direction-left ul,.fixed-action-btn.direction-right ul{text-align:right;right:64px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.direction-left ul li,.fixed-action-btn.direction-right ul li{display:inline-block;margin:7.5px 15px 0 0}.fixed-action-btn.direction-right{padding:0 15px 0 0}.fixed-action-btn.direction-right ul{text-align:left;direction:rtl;left:64px;right:auto}.fixed-action-btn.direction-right ul li{margin:7.5px 0 0 15px}.fixed-action-btn.direction-bottom{padding:0 0 15px 0}.fixed-action-btn.direction-bottom ul{top:64px;bottom:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.fixed-action-btn.direction-bottom ul li{margin:15px 0 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;z-index:1}.fixed-action-btn.toolbar ul li{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;display:inline-block;margin:0;height:100%;-webkit-transition:none;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#26a69a;border-radius:50%;-webkit-transform:scale(0);transform:scale(0)}.btn-flat{-webkit-box-shadow:none;box-shadow:none;background-color:transparent;color:#343434;cursor:pointer;-webkit-transition:background-color .2s;transition:background-color .2s}.btn-flat:focus,.btn-flat:hover{-webkit-box-shadow:none;box-shadow:none}.btn-flat:focus{background-color:rgba(0,0,0,0.1)}.btn-flat.disabled,.btn-flat.btn-flat[disabled]{background-color:transparent !important;color:#b3b2b2 !important;cursor:default}.btn-large{height:54px;line-height:54px;font-size:15px;padding:0 28px}.btn-large i{font-size:1.6rem}.btn-small{height:32.4px;line-height:32.4px;font-size:13px}.btn-small i{font-size:1.2rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;overflow-y:auto;opacity:0;position:absolute;left:0;top:0;z-index:9999;-webkit-transform-origin:0 0;transform-origin:0 0}.dropdown-content:focus{outline:0}.dropdown-content li{clear:both;color:rgba(0,0,0,0.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left}.dropdown-content li:hover,.dropdown-content li.active{background-color:#eee}.dropdown-content li:focus{outline:none}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}body.keyboard-focused .dropdown-content li:focus{background-color:#dadada}.input-field.col .dropdown-content [type="checkbox"]+label{top:1px;left:0;height:18px;-webkit-transform:none;transform:none}.dropdown-trigger{cursor:pointer}/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;-webkit-transition:.3s ease-out;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,0.2);-webkit-transition:all 0.7s ease-out;transition:all 0.7s ease-out;-webkit-transition-property:opacity, -webkit-transform;transition-property:opacity, -webkit-transform;transition-property:transform, opacity;transition-property:transform, opacity, -webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,0.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,0.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,0.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,0.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,0.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,0.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,0.7)}.waves-effect input[type="button"],.waves-effect input[type="reset"],.waves-effect input[type="submit"]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{-webkit-transition:none !important;transition:none !important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.waves-input-wrapper{border-radius:0.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top, opacity}.modal:focus{outline:none}@media only screen and (max-width: 992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%;text-align:right}.modal .modal-footer .btn,.modal .modal-footer .btn-large,.modal .modal-footer .btn-small,.modal .modal-footer .btn-flat{margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-25%;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,0.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom, opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem 0}.collapsible-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;cursor:pointer;-webkit-tap-highlight-color:transparent;line-height:1.5;padding:1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header:focus{outline:0}.collapsible-header i{width:2rem;font-size:1.6rem;display:inline-block;text-align:center;margin-right:1rem}.keyboard-focused .collapsible-header:focus{background-color:#eee}.collapsible-body{display:none;border-bottom:1px solid #ddd;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2rem}.sidenav .collapsible,.sidenav.fixed .collapsible{border:none;-webkit-box-shadow:none;box-shadow:none}.sidenav .collapsible li,.sidenav.fixed .collapsible li{padding:0}.sidenav .collapsible-header,.sidenav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.sidenav .collapsible-header:hover,.sidenav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,0.05)}.sidenav .collapsible-header i,.sidenav.fixed .collapsible-header i{line-height:inherit}.sidenav .collapsible-body,.sidenav.fixed .collapsible-body{border:0;background-color:#fff}.sidenav .collapsible-body li a,.sidenav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;-webkit-box-shadow:none;box-shadow:none}.collapsible.popout>li{-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);margin:0 24px;-webkit-transition:margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94)}.collapsible.popout>li.active{-webkit-box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,0.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip:focus{outline:none;background-color:#26a69a;color:#fff}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:none;border-bottom:1px solid #9e9e9e;-webkit-box-shadow:none;box-shadow:none;margin:0 0 8px 0;min-height:45px;outline:none;-webkit-transition:all .3s;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;-webkit-box-shadow:0 1px 0 0 #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .input{background:none;border:0;color:rgba(0,0,0,0.6);display:inline-block;font-size:16px;height:3rem;line-height:32px;outline:0;margin:0;padding:0 !important;width:120px !important}.chips .input:focus{border:0 !important;-webkit-box-shadow:none !important;box-shadow:none !important}.chips .autocomplete-content{margin-top:0;margin-bottom:0}.prefix ~ .chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty ~ label{font-size:0.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.materialboxed{display:block;cursor:-webkit-zoom-in;cursor:zoom-in;position:relative;-webkit-transition:opacity .4s;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:-webkit-zoom-out;cursor:zoom-out}#materialbox-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#292929;z-index:1000;will-change:opacity}.materialbox-caption{position:fixed;display:none;color:#fff;line-height:50px;bottom:0;left:0;width:100%;text-align:center;padding:0% 15%;height:50px;z-index:1000;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}::-ms-input-placeholder{color:#d1d1d1}::placeholder{color:#d1d1d1}input:not([type]),input[type=text]:not(.browser-default),input[type=password]:not(.browser-default),input[type=email]:not(.browser-default),input[type=url]:not(.browser-default),input[type=time]:not(.browser-default),input[type=date]:not(.browser-default),input[type=datetime]:not(.browser-default),input[type=datetime-local]:not(.browser-default),input[type=tel]:not(.browser-default),input[type=number]:not(.browser-default),input[type=search]:not(.browser-default),textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:border .3s, -webkit-box-shadow .3s;transition:border .3s, -webkit-box-shadow .3s;transition:box-shadow .3s, border .3s;transition:box-shadow .3s, border .3s, -webkit-box-shadow .3s}input:not([type]):disabled,input:not([type])[readonly="readonly"],input[type=text]:not(.browser-default):disabled,input[type=text]:not(.browser-default)[readonly="readonly"],input[type=password]:not(.browser-default):disabled,input[type=password]:not(.browser-default)[readonly="readonly"],input[type=email]:not(.browser-default):disabled,input[type=email]:not(.browser-default)[readonly="readonly"],input[type=url]:not(.browser-default):disabled,input[type=url]:not(.browser-default)[readonly="readonly"],input[type=time]:not(.browser-default):disabled,input[type=time]:not(.browser-default)[readonly="readonly"],input[type=date]:not(.browser-default):disabled,input[type=date]:not(.browser-default)[readonly="readonly"],input[type=datetime]:not(.browser-default):disabled,input[type=datetime]:not(.browser-default)[readonly="readonly"],input[type=datetime-local]:not(.browser-default):disabled,input[type=datetime-local]:not(.browser-default)[readonly="readonly"],input[type=tel]:not(.browser-default):disabled,input[type=tel]:not(.browser-default)[readonly="readonly"],input[type=number]:not(.browser-default):disabled,input[type=number]:not(.browser-default)[readonly="readonly"],input[type=search]:not(.browser-default):disabled,input[type=search]:not(.browser-default)[readonly="readonly"],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly="readonly"]{color:rgba(0,0,0,0.42);border-bottom:1px dotted rgba(0,0,0,0.42)}input:not([type]):disabled+label,input:not([type])[readonly="readonly"]+label,input[type=text]:not(.browser-default):disabled+label,input[type=text]:not(.browser-default)[readonly="readonly"]+label,input[type=password]:not(.browser-default):disabled+label,input[type=password]:not(.browser-default)[readonly="readonly"]+label,input[type=email]:not(.browser-default):disabled+label,input[type=email]:not(.browser-default)[readonly="readonly"]+label,input[type=url]:not(.browser-default):disabled+label,input[type=url]:not(.browser-default)[readonly="readonly"]+label,input[type=time]:not(.browser-default):disabled+label,input[type=time]:not(.browser-default)[readonly="readonly"]+label,input[type=date]:not(.browser-default):disabled+label,input[type=date]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime]:not(.browser-default):disabled+label,input[type=datetime]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime-local]:not(.browser-default):disabled+label,input[type=datetime-local]:not(.browser-default)[readonly="readonly"]+label,input[type=tel]:not(.browser-default):disabled+label,input[type=tel]:not(.browser-default)[readonly="readonly"]+label,input[type=number]:not(.browser-default):disabled+label,input[type=number]:not(.browser-default)[readonly="readonly"]+label,input[type=search]:not(.browser-default):disabled+label,input[type=search]:not(.browser-default)[readonly="readonly"]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly="readonly"]+label{color:rgba(0,0,0,0.42)}input:not([type]):focus:not([readonly]),input[type=text]:not(.browser-default):focus:not([readonly]),input[type=password]:not(.browser-default):focus:not([readonly]),input[type=email]:not(.browser-default):focus:not([readonly]),input[type=url]:not(.browser-default):focus:not([readonly]),input[type=time]:not(.browser-default):focus:not([readonly]),input[type=date]:not(.browser-default):focus:not([readonly]),input[type=datetime]:not(.browser-default):focus:not([readonly]),input[type=datetime-local]:not(.browser-default):focus:not([readonly]),input[type=tel]:not(.browser-default):focus:not([readonly]),input[type=number]:not(.browser-default):focus:not([readonly]),input[type=search]:not(.browser-default):focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;-webkit-box-shadow:0 1px 0 0 #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=text]:not(.browser-default):focus:not([readonly])+label,input[type=password]:not(.browser-default):focus:not([readonly])+label,input[type=email]:not(.browser-default):focus:not([readonly])+label,input[type=url]:not(.browser-default):focus:not([readonly])+label,input[type=time]:not(.browser-default):focus:not([readonly])+label,input[type=date]:not(.browser-default):focus:not([readonly])+label,input[type=datetime]:not(.browser-default):focus:not([readonly])+label,input[type=datetime-local]:not(.browser-default):focus:not([readonly])+label,input[type=tel]:not(.browser-default):focus:not([readonly])+label,input[type=number]:not(.browser-default):focus:not([readonly])+label,input[type=search]:not(.browser-default):focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]):focus.valid ~ label,input[type=text]:not(.browser-default):focus.valid ~ label,input[type=password]:not(.browser-default):focus.valid ~ label,input[type=email]:not(.browser-default):focus.valid ~ label,input[type=url]:not(.browser-default):focus.valid ~ label,input[type=time]:not(.browser-default):focus.valid ~ label,input[type=date]:not(.browser-default):focus.valid ~ label,input[type=datetime]:not(.browser-default):focus.valid ~ label,input[type=datetime-local]:not(.browser-default):focus.valid ~ label,input[type=tel]:not(.browser-default):focus.valid ~ label,input[type=number]:not(.browser-default):focus.valid ~ label,input[type=search]:not(.browser-default):focus.valid ~ label,textarea.materialize-textarea:focus.valid ~ label{color:#4CAF50}input:not([type]):focus.invalid ~ label,input[type=text]:not(.browser-default):focus.invalid ~ label,input[type=password]:not(.browser-default):focus.invalid ~ label,input[type=email]:not(.browser-default):focus.invalid ~ label,input[type=url]:not(.browser-default):focus.invalid ~ label,input[type=time]:not(.browser-default):focus.invalid ~ label,input[type=date]:not(.browser-default):focus.invalid ~ label,input[type=datetime]:not(.browser-default):focus.invalid ~ label,input[type=datetime-local]:not(.browser-default):focus.invalid ~ label,input[type=tel]:not(.browser-default):focus.invalid ~ label,input[type=number]:not(.browser-default):focus.invalid ~ label,input[type=search]:not(.browser-default):focus.invalid ~ label,textarea.materialize-textarea:focus.invalid ~ label{color:#F44336}input:not([type]).validate+label,input[type=text]:not(.browser-default).validate+label,input[type=password]:not(.browser-default).validate+label,input[type=email]:not(.browser-default).validate+label,input[type=url]:not(.browser-default).validate+label,input[type=time]:not(.browser-default).validate+label,input[type=date]:not(.browser-default).validate+label,input[type=datetime]:not(.browser-default).validate+label,input[type=datetime-local]:not(.browser-default).validate+label,input[type=tel]:not(.browser-default).validate+label,input[type=number]:not(.browser-default).validate+label,input[type=search]:not(.browser-default).validate+label,textarea.materialize-textarea.validate+label{width:100%}input.valid:not([type]),input.valid:not([type]):focus,input.valid[type=text]:not(.browser-default),input.valid[type=text]:not(.browser-default):focus,input.valid[type=password]:not(.browser-default),input.valid[type=password]:not(.browser-default):focus,input.valid[type=email]:not(.browser-default),input.valid[type=email]:not(.browser-default):focus,input.valid[type=url]:not(.browser-default),input.valid[type=url]:not(.browser-default):focus,input.valid[type=time]:not(.browser-default),input.valid[type=time]:not(.browser-default):focus,input.valid[type=date]:not(.browser-default),input.valid[type=date]:not(.browser-default):focus,input.valid[type=datetime]:not(.browser-default),input.valid[type=datetime]:not(.browser-default):focus,input.valid[type=datetime-local]:not(.browser-default),input.valid[type=datetime-local]:not(.browser-default):focus,input.valid[type=tel]:not(.browser-default),input.valid[type=tel]:not(.browser-default):focus,input.valid[type=number]:not(.browser-default),input.valid[type=number]:not(.browser-default):focus,input.valid[type=search]:not(.browser-default),input.valid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.valid,textarea.materialize-textarea.valid:focus,.select-wrapper.valid>input.select-dropdown{border-bottom:1px solid #4CAF50;-webkit-box-shadow:0 1px 0 0 #4CAF50;box-shadow:0 1px 0 0 #4CAF50}input.invalid:not([type]),input.invalid:not([type]):focus,input.invalid[type=text]:not(.browser-default),input.invalid[type=text]:not(.browser-default):focus,input.invalid[type=password]:not(.browser-default),input.invalid[type=password]:not(.browser-default):focus,input.invalid[type=email]:not(.browser-default),input.invalid[type=email]:not(.browser-default):focus,input.invalid[type=url]:not(.browser-default),input.invalid[type=url]:not(.browser-default):focus,input.invalid[type=time]:not(.browser-default),input.invalid[type=time]:not(.browser-default):focus,input.invalid[type=date]:not(.browser-default),input.invalid[type=date]:not(.browser-default):focus,input.invalid[type=datetime]:not(.browser-default),input.invalid[type=datetime]:not(.browser-default):focus,input.invalid[type=datetime-local]:not(.browser-default),input.invalid[type=datetime-local]:not(.browser-default):focus,input.invalid[type=tel]:not(.browser-default),input.invalid[type=tel]:not(.browser-default):focus,input.invalid[type=number]:not(.browser-default),input.invalid[type=number]:not(.browser-default):focus,input.invalid[type=search]:not(.browser-default),input.invalid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.invalid,textarea.materialize-textarea.invalid:focus,.select-wrapper.invalid>input.select-dropdown,.select-wrapper.invalid>input.select-dropdown:focus{border-bottom:1px solid #F44336;-webkit-box-shadow:0 1px 0 0 #F44336;box-shadow:0 1px 0 0 #F44336}input:not([type]).valid ~ .helper-text[data-success],input:not([type]):focus.valid ~ .helper-text[data-success],input:not([type]).invalid ~ .helper-text[data-error],input:not([type]):focus.invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default).valid ~ .helper-text[data-success],input[type=text]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=text]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default).valid ~ .helper-text[data-success],input[type=password]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=password]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default).valid ~ .helper-text[data-success],input[type=email]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=email]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default).valid ~ .helper-text[data-success],input[type=url]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=url]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default).valid ~ .helper-text[data-success],input[type=time]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=time]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default).valid ~ .helper-text[data-success],input[type=date]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=date]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default).valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default).valid ~ .helper-text[data-success],input[type=number]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=number]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default).valid ~ .helper-text[data-success],input[type=search]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=search]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default):focus.invalid ~ .helper-text[data-error],textarea.materialize-textarea.valid ~ .helper-text[data-success],textarea.materialize-textarea:focus.valid ~ .helper-text[data-success],textarea.materialize-textarea.invalid ~ .helper-text[data-error],textarea.materialize-textarea:focus.invalid ~ .helper-text[data-error],.select-wrapper.valid .helper-text[data-success],.select-wrapper.invalid ~ .helper-text[data-error]{color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}input:not([type]).valid ~ .helper-text:after,input:not([type]):focus.valid ~ .helper-text:after,input[type=text]:not(.browser-default).valid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=password]:not(.browser-default).valid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=email]:not(.browser-default).valid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=url]:not(.browser-default).valid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=time]:not(.browser-default).valid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=date]:not(.browser-default).valid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=tel]:not(.browser-default).valid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=number]:not(.browser-default).valid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=search]:not(.browser-default).valid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.valid ~ .helper-text:after,textarea.materialize-textarea.valid ~ .helper-text:after,textarea.materialize-textarea:focus.valid ~ .helper-text:after,.select-wrapper.valid ~ .helper-text:after{content:attr(data-success);color:#4CAF50}input:not([type]).invalid ~ .helper-text:after,input:not([type]):focus.invalid ~ .helper-text:after,input[type=text]:not(.browser-default).invalid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=password]:not(.browser-default).invalid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=email]:not(.browser-default).invalid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=url]:not(.browser-default).invalid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=time]:not(.browser-default).invalid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=date]:not(.browser-default).invalid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=tel]:not(.browser-default).invalid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=number]:not(.browser-default).invalid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=search]:not(.browser-default).invalid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.invalid ~ .helper-text:after,textarea.materialize-textarea.invalid ~ .helper-text:after,textarea.materialize-textarea:focus.invalid ~ .helper-text:after,.select-wrapper.invalid ~ .helper-text:after{content:attr(data-error);color:#F44336}input:not([type])+label:after,input[type=text]:not(.browser-default)+label:after,input[type=password]:not(.browser-default)+label:after,input[type=email]:not(.browser-default)+label:after,input[type=url]:not(.browser-default)+label:after,input[type=time]:not(.browser-default)+label:after,input[type=date]:not(.browser-default)+label:after,input[type=datetime]:not(.browser-default)+label:after,input[type=datetime-local]:not(.browser-default)+label:after,input[type=tel]:not(.browser-default)+label:after,input[type=number]:not(.browser-default)+label:after,input[type=search]:not(.browser-default)+label:after,textarea.materialize-textarea+label:after,.select-wrapper+label:after{display:block;content:"";position:absolute;top:100%;left:0;opacity:0;-webkit-transition:.2s opacity ease-out, .2s color ease-out;transition:.2s opacity ease-out, .2s color ease-out}.input-field{position:relative;margin-top:1rem;margin-bottom:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline input,.input-field.inline .select-dropdown{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix ~ label,.input-field.col .prefix ~ .validate ~ label{width:calc(100% - 3rem - 1.5rem)}.input-field>label{color:#9e9e9e;position:absolute;top:0;left:0;font-size:1rem;cursor:text;-webkit-transition:color .2s ease-out, -webkit-transform .2s ease-out;transition:color .2s ease-out, -webkit-transform .2s ease-out;transition:transform .2s ease-out, color .2s ease-out;transition:transform .2s ease-out, color .2s ease-out, -webkit-transform .2s ease-out;-webkit-transform-origin:0% 100%;transform-origin:0% 100%;text-align:initial;-webkit-transform:translateY(12px);transform:translateY(12px)}.input-field>label:not(.label-icon).active{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field>input[type]:-webkit-autofill:not(.browser-default):not([type="search"])+label,.input-field>input[type=date]:not(.browser-default)+label,.input-field>input[type=time]:not(.browser-default)+label{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field .helper-text{position:relative;min-height:18px;display:block;font-size:12px;color:rgba(0,0,0,0.54)}.input-field .helper-text::after{opacity:1;position:absolute;top:0;left:0}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;-webkit-transition:color .2s;transition:color .2s;top:.5rem}.input-field .prefix.active{color:#26a69a}.input-field .prefix ~ input,.input-field .prefix ~ textarea,.input-field .prefix ~ label,.input-field .prefix ~ .validate ~ label,.input-field .prefix ~ .helper-text,.input-field .prefix ~ .autocomplete-content{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix ~ label{margin-left:3rem}@media only screen and (max-width: 992px){.input-field .prefix ~ input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width: 600px){.input-field .prefix ~ input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;-webkit-transition:.3s background-color;transition:.3s background-color}.nav-wrapper .input-field input[type=search]{height:inherit;padding-left:4rem;width:calc(100% - 4rem);border:0;-webkit-box-shadow:none;box-shadow:none}.input-field input[type=search]:focus:not(.browser-default){background-color:#fff;border:0;-webkit-box-shadow:none;box-shadow:none;color:#444}.input-field input[type=search]:focus:not(.browser-default)+label i,.input-field input[type=search]:focus:not(.browser-default) ~ .mdi-navigation-close,.input-field input[type=search]:focus:not(.browser-default) ~ .material-icons{color:#444}.input-field input[type=search]+.label-icon{-webkit-transform:none;transform:none;left:1rem}.input-field input[type=search] ~ .mdi-navigation-close,.input-field input[type=search] ~ .material-icons{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;-webkit-transition:.3s color;transition:.3s color}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{line-height:normal;overflow-y:hidden;padding:.8rem 0 .8rem 0;resize:none;min-height:3rem;-webkit-box-sizing:border-box;box-sizing:border-box}.hiddendiv{visibility:hidden;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0;z-index:-1}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}.character-counter{min-height:18px}[type="radio"]:not(:checked),[type="radio"]:checked{position:absolute;opacity:0;pointer-events:none}[type="radio"]:not(:checked)+span,[type="radio"]:checked+span{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-transition:.28s ease;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="radio"]+span:before,[type="radio"]+span:after{content:'';position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;-webkit-transition:.28s ease;transition:.28s ease}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after,[type="radio"]:checked+span:before,[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border-radius:50%}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after{border:2px solid #5a5a5a}[type="radio"]:not(:checked)+span:after{-webkit-transform:scale(0);transform:scale(0)}[type="radio"]:checked+span:before{border:2px solid transparent}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border:2px solid #26a69a}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:after{background-color:#26a69a}[type="radio"]:checked+span:after{-webkit-transform:scale(1.02);transform:scale(1.02)}[type="radio"].with-gap:checked+span:after{-webkit-transform:scale(0.5);transform:scale(0.5)}[type="radio"].tabbed:focus+span:before{-webkit-box-shadow:0 0 0 10px rgba(0,0,0,0.1);box-shadow:0 0 0 10px rgba(0,0,0,0.1)}[type="radio"].with-gap:disabled:checked+span:before{border:2px solid rgba(0,0,0,0.42)}[type="radio"].with-gap:disabled:checked+span:after{border:none;background-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before,[type="radio"]:disabled:checked+span:before{background-color:transparent;border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled+span{color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before{border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:checked+span:after{background-color:rgba(0,0,0,0.42);border-color:#949494}[type="checkbox"]:not(:checked),[type="checkbox"]:checked{position:absolute;opacity:0;pointer-events:none}[type="checkbox"]+span:not(.lever){position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="checkbox"]+span:not(.lever):before,[type="checkbox"]:not(.filled-in)+span:not(.lever):after{content:'';position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:3px;-webkit-transition:.2s;transition:.2s}[type="checkbox"]:not(.filled-in)+span:not(.lever):after{border:0;-webkit-transform:scale(0);transform:scale(0)}[type="checkbox"]:not(:checked):disabled+span:not(.lever):before{border:none;background-color:rgba(0,0,0,0.42)}[type="checkbox"].tabbed:focus+span:not(.lever):after{-webkit-transform:scale(1);transform:scale(1);border:0;border-radius:50%;-webkit-box-shadow:0 0 0 10px rgba(0,0,0,0.1);box-shadow:0 0 0 10px rgba(0,0,0,0.1);background-color:rgba(0,0,0,0.1)}[type="checkbox"]:checked+span:not(.lever):before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:checked:disabled+span:before{border-right:2px solid rgba(0,0,0,0.42);border-bottom:2px solid rgba(0,0,0,0.42)}[type="checkbox"]:indeterminate+span:not(.lever):before{top:-11px;left:-12px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:indeterminate:disabled+span:not(.lever):before{border-right:2px solid rgba(0,0,0,0.42);background-color:transparent}[type="checkbox"].filled-in+span:not(.lever):after{border-radius:2px}[type="checkbox"].filled-in+span:not(.lever):before,[type="checkbox"].filled-in+span:not(.lever):after{content:'';left:0;position:absolute;-webkit-transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;z-index:1}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0px;z-index:0}[type="checkbox"].filled-in:checked+span:not(.lever):before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:checked+span:not(.lever):after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type="checkbox"].filled-in.tabbed:focus+span:not(.lever):after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,0.1)}[type="checkbox"].filled-in.tabbed:checked:focus+span:not(.lever):after{border-radius:2px;background-color:#26a69a;border-color:#26a69a}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):before{background-color:transparent;border:2px solid transparent}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):after{border-color:transparent;background-color:#949494}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):before{background-color:transparent}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):after{background-color:#949494;border-color:#949494}.switch,.switch *{-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:before,.switch label input[type=checkbox]:checked+.lever:after{left:18px}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a}.switch label .lever{content:"";display:inline-block;position:relative;width:36px;height:14px;background-color:rgba(0,0,0,0.38);border-radius:15px;margin-right:10px;-webkit-transition:background 0.3s ease;transition:background 0.3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:before,.switch label .lever:after{content:"";position:absolute;display:inline-block;width:20px;height:20px;border-radius:50%;left:0;top:-3px;-webkit-transition:left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;transition:left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;transition:left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease;transition:left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease}.switch label .lever:before{background-color:rgba(38,166,154,0.15)}.switch label .lever:after{background-color:#F1F1F1;-webkit-box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before,input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(38,166,154,0.15)}input[type=checkbox]:not(:disabled) ~ .lever:active:before,input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(0,0,0,0.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default;background-color:rgba(0,0,0,0.12)}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#949494}select{display:none}select.browser-default{display:block}select{background-color:rgba(255,255,255,0.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper.valid+label,.select-wrapper.invalid+label{width:100%;pointer-events:none}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.select-wrapper input.select-dropdown:focus{border-bottom:1px solid #26a69a}.select-wrapper .caret{position:absolute;right:0;top:0;bottom:0;margin:auto 0;z-index:0;fill:rgba(0,0,0,0.87)}.select-wrapper+label{position:absolute;top:-26px;font-size:.8rem}select:disabled{color:rgba(0,0,0,0.42)}.select-wrapper.disabled+label{color:rgba(0,0,0,0.42)}.select-wrapper.disabled .caret{fill:rgba(0,0,0,0.42)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,0.42);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-wrapper i{color:rgba(0,0,0,0.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,0.3);background-color:transparent}body.keyboard-focused .select-dropdown.dropdown-content li:focus{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li:hover{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li.selected{background-color:rgba(0,0,0,0.03)}.prefix ~ .select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix ~ label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,0.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,0.4)}.select-dropdown li.optgroup ~ li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large,.file-field .btn-small{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.file-field input[type=file]::-webkit-file-upload-button{display:none}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:none}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;margin-left:7px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s;-webkit-appearance:none;background-color:#26a69a;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;margin:-5px 0 0 0}.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 10px rgba(38,166,154,0.26);box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]{border:1px solid white}input[type=range]::-moz-range-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-moz-focus-inner{border:0}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s}.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{display:inline-block;font-weight:300;color:#757575;padding-left:16px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:15px;border-left:1px solid #ee6e73}.table-of-contents a.active{font-weight:500;padding-left:14px;border-left:2px solid #ee6e73}.sidenav{position:fixed;width:300px;left:0;top:0;margin:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);height:100%;height:calc(100% + 60px);height:-moz-calc(100%);padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.right-aligned{right:0;-webkit-transform:translateX(105%);transform:translateX(105%);left:auto;-webkit-transform:translateX(100%);transform:translateX(100%)}.sidenav .collapsible{margin:0}.sidenav li{float:none;line-height:48px}.sidenav li.active{background-color:rgba(0,0,0,0.05)}.sidenav li>a{color:rgba(0,0,0,0.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.sidenav li>a:hover{background-color:rgba(0,0,0,0.05)}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-flat,.sidenav li>a.btn-floating{margin:10px 15px}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-floating{color:#fff}.sidenav li>a.btn-flat{color:#343434}.sidenav li>a.btn:hover,.sidenav li>a.btn-large:hover,.sidenav li>a.btn-small:hover,.sidenav li>a.btn-large:hover{background-color:#2bbbad}.sidenav li>a.btn-floating:hover{background-color:#26a69a}.sidenav li>a>i,.sidenav li>a>[class^="mdi-"],.sidenav li>a li>a>[class*="mdi-"],.sidenav li>a>i.material-icons{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,0.54)}.sidenav .divider{margin:8px 0 0 0}.sidenav .subheader{cursor:initial;pointer-events:none;color:rgba(0,0,0,0.54);font-size:14px;font-weight:500;line-height:48px}.sidenav .subheader:hover{background-color:transparent}.sidenav .user-view{position:relative;padding:32px 32px 0;margin-bottom:8px}.sidenav .user-view>a{height:auto;padding:0}.sidenav .user-view>a:hover{background-color:transparent}.sidenav .user-view .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.sidenav .user-view .circle,.sidenav .user-view .name,.sidenav .user-view .email{display:block}.sidenav .user-view .circle{height:64px;width:64px}.sidenav .user-view .name,.sidenav .user-view .email{font-size:14px;line-height:24px}.sidenav .user-view .name{margin-top:16px;font-weight:500}.sidenav .user-view .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.drag-target.right-aligned{right:0}.sidenav.sidenav-fixed{left:0;-webkit-transform:translateX(0);transform:translateX(0);position:fixed}.sidenav.sidenav-fixed.right-aligned{right:0;left:auto}@media only screen and (max-width: 992px){.sidenav.sidenav-fixed{-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.sidenav-fixed.right-aligned{-webkit-transform:translateX(105%);transform:translateX(105%)}.sidenav>a{padding:0 16px}.sidenav .user-view{padding:16px 16px 0}}.sidenav .collapsible-body>ul:not(.collapsible)>li.active,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#ee6e73}.sidenav .collapsible-body>ul:not(.collapsible)>li.active a,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.sidenav .collapsible-body{padding:0}.sidenav-overlay{position:fixed;top:0;left:0;right:0;opacity:0;height:120vh;background-color:rgba(0,0,0,0.5);z-index:997;display:none}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent !important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent !important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent !important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1)}@-webkit-keyframes fade-out{from{opacity:1}to{opacity:0}}@keyframes fade-out{from{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:center}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;-webkit-transition:background-color .3s;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4CAF50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;-webkit-perspective:500px;perspective:500px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform-origin:0% 50%;transform-origin:0% 50%}.carousel.carousel-slider{top:0;left:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{visibility:hidden;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:rgba(255,255,255,0.5);-webkit-transition:background-color .3s;transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel.scrolling .carousel-item .materialboxed,.carousel .carousel-item:not(.active) .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;-webkit-transition:visibility 0s .3s;transition:visibility 0s .3s}.tap-target-wrapper.open{visibility:visible;-webkit-transition:visibility 0s;transition:visibility 0s}.tap-target-wrapper.open .tap-target{-webkit-transform:scale(1);transform:scale(1);opacity:.95;-webkit-transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1)}.tap-target-wrapper.open .tap-target-wave::before{-webkit-transform:scale(1);transform:scale(1)}.tap-target-wrapper.open .tap-target-wave::after{visibility:visible;-webkit-animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;-webkit-transition:opacity .3s, visibility 0s 1s, -webkit-transform .3s;transition:opacity .3s, visibility 0s 1s, -webkit-transform .3s;transition:opacity .3s, transform .3s, visibility 0s 1s;transition:opacity .3s, transform .3s, visibility 0s 1s, -webkit-transform .3s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#ee6e73;-webkit-box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);width:100%;height:100%;opacity:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1)}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave::before,.tap-target-wave::after{content:'';display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#ffffff}.tap-target-wave::before{-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s, -webkit-transform .3s}.tap-target-wave::after{visibility:hidden;-webkit-transition:opacity .3s, visibility 0s, -webkit-transform .3s;transition:opacity .3s, visibility 0s, -webkit-transform .3s;transition:opacity .3s, transform .3s, visibility 0s;transition:opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s;z-index:-1}.tap-target-origin{top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);z-index:10002;position:absolute !important}.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small),.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover{background:none}@media only screen and (max-width: 600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:visible;position:relative}.pulse::before{content:'';display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;-webkit-transition:opacity .3s, -webkit-transform .3s;transition:opacity .3s, -webkit-transform .3s;transition:opacity .3s, transform .3s;transition:opacity .3s, transform .3s, -webkit-transform .3s;-webkit-animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;z-index:-1}@-webkit-keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}100%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}@keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}100%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}.datepicker-modal{max-width:325px;min-width:300px;max-height:none}.datepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.datepicker-controls{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:280px;margin:0 auto}.datepicker-controls .selects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.datepicker-controls .select-wrapper input{border-bottom:none;text-align:center;margin:0}.datepicker-controls .select-wrapper input:focus{border-bottom:none}.datepicker-controls .select-wrapper .caret{display:none}.datepicker-controls .select-year input{width:50px}.datepicker-controls .select-month input{width:70px}.month-prev,.month-next{margin-top:4px;cursor:pointer;background-color:transparent;border:none}.datepicker-date-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;color:#fff;padding:20px 22px;font-weight:500}.datepicker-date-display .year-text{display:block;font-size:1.5rem;line-height:25px;color:rgba(255,255,255,0.7)}.datepicker-date-display .date-text{display:block;font-size:2.8rem;line-height:47px;font-weight:500}.datepicker-calendar-container{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.datepicker-table{width:280px;font-size:1rem;margin:0 auto}.datepicker-table thead{border-bottom:none}.datepicker-table th{padding:10px 5px;text-align:center}.datepicker-table tr{border:none}.datepicker-table abbr{text-decoration:none;color:#999}.datepicker-table td{border-radius:50%;padding:0}.datepicker-table td.is-today{color:#26a69a}.datepicker-table td.is-selected{background-color:#26a69a;color:#fff}.datepicker-table td.is-outside-current-month,.datepicker-table td.is-disabled{color:rgba(0,0,0,0.3);pointer-events:none}.datepicker-day-button{background-color:transparent;border:none;line-height:38px;display:block;width:100%;border-radius:50%;padding:0 5px;cursor:pointer;color:inherit}.datepicker-day-button:focus{background-color:rgba(43,161,150,0.25)}.datepicker-footer{width:280px;margin:0 auto;padding-bottom:5px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.datepicker-cancel,.datepicker-clear,.datepicker-today,.datepicker-done{color:#26a69a;padding:0 1rem}.datepicker-clear{color:#F44336}@media only screen and (min-width: 601px){.datepicker-modal{max-width:625px}.datepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.datepicker-date-display{-webkit-box-flex:0;-webkit-flex:0 1 270px;-ms-flex:0 1 270px;flex:0 1 270px}.datepicker-controls,.datepicker-table,.datepicker-footer{width:320px}.datepicker-day-button{line-height:44px}}.timepicker-modal{max-width:325px;max-height:none}.timepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.text-primary{color:#fff}.timepicker-digital-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;padding:10px;font-weight:300}.timepicker-text-container{font-size:4rem;font-weight:bold;text-align:center;color:rgba(255,255,255,0.6);font-weight:400;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-span-hours,.timepicker-span-minutes,.timepicker-span-am-pm div{cursor:pointer}.timepicker-span-hours{margin-right:3px}.timepicker-span-minutes{margin-left:3px}.timepicker-display-am-pm{font-size:1.3rem;position:absolute;right:1rem;bottom:1rem;font-weight:400}.timepicker-analog-display{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.timepicker-plate{background-color:#eee;border-radius:50%;width:270px;height:270px;overflow:visible;position:relative;margin:auto;margin-top:25px;margin-bottom:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-canvas,.timepicker-dial{position:absolute;left:0;right:0;top:0;bottom:0}.timepicker-minutes{visibility:hidden}.timepicker-tick{border-radius:50%;color:rgba(0,0,0,0.87);line-height:40px;text-align:center;width:40px;height:40px;position:absolute;cursor:pointer;font-size:15px}.timepicker-tick.active,.timepicker-tick:hover{background-color:rgba(38,166,154,0.25)}.timepicker-dial{-webkit-transition:opacity 350ms, -webkit-transform 350ms;transition:opacity 350ms, -webkit-transform 350ms;transition:transform 350ms, opacity 350ms;transition:transform 350ms, opacity 350ms, -webkit-transform 350ms}.timepicker-dial-out{opacity:0}.timepicker-dial-out.timepicker-hours{-webkit-transform:scale(1.1, 1.1);transform:scale(1.1, 1.1)}.timepicker-dial-out.timepicker-minutes{-webkit-transform:scale(0.8, 0.8);transform:scale(0.8, 0.8)}.timepicker-canvas{-webkit-transition:opacity 175ms;transition:opacity 175ms}.timepicker-canvas line{stroke:#26a69a;stroke-width:4;stroke-linecap:round}.timepicker-canvas-out{opacity:0.25}.timepicker-canvas-bearing{stroke:none;fill:#26a69a}.timepicker-canvas-bg{stroke:none;fill:#26a69a}.timepicker-footer{margin:0 auto;padding:5px 1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.timepicker-clear{color:#F44336}.timepicker-close{color:#26a69a}.timepicker-clear,.timepicker-close{padding:0 20px}@media only screen and (min-width: 601px){.timepicker-modal{max-width:600px}.timepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.timepicker-text-container{top:32%}.timepicker-display-am-pm{position:relative;right:auto;bottom:auto;text-align:center;margin-top:1.2rem}} diff --git a/self_host/LibreTranslate/libretranslate/static/css/prism.min.css b/self_host/LibreTranslate/libretranslate/static/css/prism.min.css new file mode 100644 index 00000000..8c4cc057 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/static/css/prism.min.css @@ -0,0 +1 @@ +code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/static/favicon.ico b/self_host/LibreTranslate/libretranslate/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5f01dc6383172df2ba1ee0c46aae7d2b2aed604d GIT binary patch literal 268350 zcmeI537jNFmH%rPV7Le6l&c32IYe$b6m4!07ePTz6;wnK6%h|~k#1zg6VX2+!s1_) zT@Vj+L07J28U|1VM8yT<n&Os285o2?$C>^9GAp~Yv$LwQG9$Axv)-G}Zz?NZ#)}uf zh?f}|5n0`6Oyl38MuY!nH8xpu$;Rp&ZvvFoSi(=&VPnDc#)exoJb2&z{}%IMC=Um> z(H?7r+Q$x!fjk(nm@iMvt1T?<^XTPfGs=L)y~TaBPuTbRGhlIVabN#lZZ(WDU~zA8 zAMF$Nz5WbX+*{n&zn5DLqYPNwTii$cgnh3+0~Yrd_x11PR>LR*7WWqS(LQ0{>(7A2 zy~Ta~d%4vx%7Dea#eK9-*!TJ~U~zA8U;kciHH<P~ac^-S?GyIB{tQ^$Tin;bms<^^ z3|QP-+(-L_eXl<Q7WWqS_3!0Y!zcq5_ZIijK4IVM&w%T=|0k6F-H?g{ad$J&Pp6m| z19>vwI_~G-?3=(IU{6C&9P9;OJAkEui7}8T1Fqx#$2iNcdzlym#z2V~a2@wQp{{nn zDsh9GYsLT!SlnATFa`#X0gL;=YjdlyF<^0TeZUwPJO(W82d~Yo#>Rlfz4ZZOVDK2Q zxF5VWw;CG*7WdW%jDf*pz~X-J+T3bv3|QP-A20?6j{%GO!E1A?u`ytAZ+*ZR7(50n z?gy{Ut;WWH#l7_bV_@(Yu(%(*Hn$oZ0~Ytz2aJKiW5D8m@Y>vJYz$c3TOTk629E)Y z`@w5-tFbX)ac_OV7#KVTEba%d&8^19fW^J_0b^kB7_hh>yf(KQ8v_>i)(4D%!DGPU ze(>7dYHSQx+*=<o1_qCTL5urUY2sag{Y{_2>+5x@@fuV{eL1ZRQrxc%N&f+!1|J6& z`;gE<^mlnj!QNmRFewKEJL1M{pua`AUP_k+CGIzZpUXi|-@kD@0+s_NQyI`T@**I< z{tP|_RsbgbV_->&J{;T!f`0sSjyD9oN|4{xXBq!4=C+V>1Bljf0cl?bD*}@V2Gox( z17W_z)dgS!U{X8-D^ujDU>*p!i;k}Wn}A*<Y9s6Svc>&wkZ}iSSFeAd`v#Z^Od5^N zAz?OX$JejX?QTRB%D^m2)7WbvXxA>+qk9cVD(&o~O)pd29|#E#fNpgWpXY#=fkBqn zQu&)fH@+U@oMXWZV3IEb+hP7X(5+3RSKDc9n?#b>>*bs>#J!$_js|)zP3rqUIrrbe zDqs+0S1SDnkd!aYkDLKk119bn&^+q?;4YA~O?2MvU?<Q`da;@0+<wRXGF13e;8~Ew z-|#t$$nzbLWqpL~m6LzL<NHCFizLV5>t|pyVB(H}r7-nD@B~QG4$*V|NWNjvNuqhO ze(z`8uS7*PPxm57TMzZ+^TEqO-9`75!@wgTEnmu~d(0ldBs&AkV`2o%2U*(W9`bAb zwVh<K9hbLXalZx?)Hq%9ba8(5lBO~Ld7#eE`_rl4`@oZ+7jD{}`w({C0c6)C9RnI? zo(=vE+VR{=`dsY11;j}&c9NXikGR*`(xpK6>LflUIY+VoEl|gKe$B_72;$a+l5o@R zoM*84Nw6F+>5YLQPQL`G-?ig6O}fT%ZwFCHW2;l1qT_xGDs(OA<WpLm=J~%4>a<@) zF*yn}FPD~=PWiOXe-;?DITEUzS~e!<m7o)^S#+A;ekag#T_9QP#pNwB?sujVzXfrA zxJuKQ>kD96P<7GR<!j(2;EJC(I~sTC-nAYu>CC`ZsONw<9$ltAMH$C{;5p2tZP_X+ z?)Rmvdx2~J<Lv1k_F1qrsH$kMz2-kOhKZ|V9%;IVZ3;}{8Q6*BTR|S&$Jx|#*oT1D z3*z)y(u#<CjaQBX&*$KOySl5a6F_ji<ghZLIZxex+tn@4^j}f#c9mhOI7fG(sQ(3d zavx{=Im#T#q1+<k9=E+~*0FqQ{1R8cJkoT%d^f0?=w7cm$|A3mVgCO}+1f8{;xiyF z?gn9wiaOS_{-<*&yQsLw^~Mt5Fz_%ainqrp>i|$S(S9azr5G%Vt8h7bCff%Ly6g!7 ze*$4{iaORa#oj=1<GRcu;~w`tc{Bgt2VB>soxS@hYZp*O*#xIA1TTSh^~)=LE@kcq z237W=;zjn;pdB?geKFW5M0}ug_1TZOS9LUYD)M>hca*oK3a+4NUGgKK$Z=B8zf|Ud z733_d%e!NsA2I(I%KbE0DN=!;JzRbEEACaT*MYp(^};+|LwQ3gxT5k#{2l}0Iu&vJ zC}kc521UekKc46HJRzPnu8)fAcJ61~t8UwZn}O?kwX=5-WmS1E|GN0EIlmVQ<V;*@ zAK6<$-DO8Acn4_LfAUJdjxx9JK(6a@`yKbHs>a`1KXP5SID7x3oHKyt&8jN${ewXF z;kY{HmG%(j{R^n8Y)!?A9Dk~vG;i}A&~49@>ozSz+*57uw@2pi>AHS#_H?h*^Ky6} zBws5hdZ+F-5Ld^%(jK6^I?nTNOucR>n9FA=?_{9)n{MK|J<AgJs`snG^}ux<<Lo^_ zIs1dEi{|@(3N((1t7jf*_fVFef$JjcP?7%zd2rRvrp9X8Te2ibBJJ#?O)pd2tNx1p zqOQAlQr0#qwBoWV{(lW*`5l8^`_Ju^r*U!BMcir4tk?QyIbZ8oy^fi(loyw`Y;muC z^cqmq^Zx%(*4iqx;-Y8%6Tx3WTs!BHrsuNo8Z%!jB^qC!0~Uci_=&SQo3hf}YvOEW zNh@RALrp{PJ>3Gb)GcY=Z&OYk-a(&EJq`yC7Q~zQ{W+-Ob#p2F{w&ZQnWX(B%XzxC zTng3)X(UV8ae2!c_u@wD8h-$Be!EOtKpDq_y2zeXq{ux{-=(~jDn{OW@%K64vLCgx zwUBbek>0mTEA4EjO)qoYizCe+X+J~S`X$ZxXUf<c)J1g7ENWlGKPc-opnGT)L~D_c zfuwyS%Xzw|d=;z=vPc#m;_{X~?!}ejv52wjt&~&c=T&hP7R`~)2664~I&D7X90R6- zGK=<!-346NKhB;w`3!LJ3>jxXOIj7;9_qZ`9D9<_EOkwi_xqHwq6(~u=sI>KNK*H# z=R8h1`<9qDt=C;s5EojT|0r-Z2Fltt(fn13d)-Ig2gGNz4lciI|I`Vf3Zj_aG=ZbD zIOj6plBagIeor|XXOvAecYi);=eNuBzfjHxfaY0UiA(=vt159X{<O#8B%o&|*F1#n z>Dg~LP-f8_k@lMCJ;Nk>Xx8Jr%R#uFc^zvX(JG)UqWJqX&^0};ItO;OAM7Zw1aK*V zeOI4VihJ?6EI1S7y+2L+2FtoWH3Q$YPe*G*>Ie6N{XjPv;smX`x#~OZ?5J(N2waVE zF_lRUBzF<}8Z<Yob<{kh9oK2os}}d-RQHmLLE1Ve&36W6l%?<D%DCux=Wiff4~<cd z1l`7#T0g!jk~eI})v?yd-U<3GTi`$uYnr;xACY5aUA0SKr;2eedWXPl5Y!`&&w1EC z2$V^7#hHgeTz#J*U2_u}4|I}^QO*HzHe9Cti88k8<Vems?ZGW#UPJTEy2j<Xmf^Bp zWUH!ikL%vM``Tmgnv<|SJwI#ytPG-f{S65F7d_TE;549ltWL5e%HM)$e%IgitpBo3 zj^w1%IPG+h_w(RWlyM};Gv+bxyq&5X_u}I%Kw~V|{WWawT<mwdhjL1;qGubmRoJg~ z$J%@PEui~dC)pY0J)oT(7wHSJ{~6$Vo(q#5<zTeW0vB~?XG7ybJ#*z9^AzE{9#xNf zasFZOLJr&n?L8mchk$;Gt~p-;z1+Jr=XWt!7j%;SQ9cfWy5{kzaqym<oN%n$410eB zdDJDa`8@VN3cAgwaEcQN%60Ww^|%+Qn&UqU1oPXjxCz_29s3)CqD9xWV?lHtFYH^V z<15I!X&0w;&(gK6lbx)(+1OvRiyto3D`7;}yR80p%CB|glflxUDCy)+8eJXYUfios zT?x`~kTj33EqZP&QuG|7^`WFb#+~;o^1rr&)2fr^1T-d(%kLshW0g^m_jvzA%FuI; z3!md`=v{;_0o`kglsI3qq}3(v)dt%F%^_#uqf_2zu)QBBN_L<iSM|}jx6@dACi)9O zr}}5r>H4)R$V=Xc;YUGMKRe|=ANv|p6fK>6N~5b&+^a1P2YJrtT!($_mCIXRNdY&4 zG;P{0&x6?0e3zab;$#+ydH>dt#$>C+6`nC|HS*^@-qV`kD>C|-Hha4^O`Be~xYwBV z%OJ03eT`Q&Kiw{NP-T|Yv2ZC!+oqlJX^!m}pgqrVqI;&U51nje(P^A~d|bg9($p4u z-tJ}Iv)4M@g#A}#@G)!FUj6NMe%<0;{3>qpy!JnY{q0mx4x%ySc_6RrmimMC(wzj_ zt??g?F6}&GxBe#mpMd7vUCFK($~p(q$?v<czr8DGQ`+g|Um9H<<6hM61oFIZeGmJ~ zs33<j16!v9-4oNaWiNRY`}=}8ksq4F?8RQM=bnT8rQ-_kF-_z9t3j{jCp};Lat`Rx zr#wzi>TlBX>Kgar{zE`(E=jrQ<vhiW%l@EsV9iCpkdwdBx?My$ou0F`?w{wgzUD~x z0a-=kmb}&>)OXY-d9Ohv;UL<6S-;mg?lq46Pmq<PcKOG!t@}+@(etUs*4qEot}K`7 zb0}vP=q7t`LZ0L2%dx*=HzzviHTKpsmrHKKw!V$+<vNsKq$=!}i{m=Sz1n4Spyx>! zTt#i@KJyWfRSv~~=G&t7^Z0%*<>(nGiRgNi=X{yQHiso~B<37lFMb5_;7B(0?64Ln zi@2_5-Q!;ErhDm&z%_TWcL!J>q?NajG4D0!px$~`J*Y=V^Ijjj9)Hq|nchpjyxR0W zZ1;N}FWO8&8@l=>%WG67wAIpNf6m8+(<#$nXGg)s~&?Xg~RJAdR2H<a;b9KQ)K> z0nm$V$jN^Io$8xbHy^u4fwD>3`n1b82yw4A+#2K+V{@^+r3&dmcIVuCK)ZHvnf`am zISr(pKi9Ql6y&wGcr&)w1W815Y+nX0`3c)P6WeKdO5%UobHYBlI3AR^7vGwj)&0c< zZ&4fH!0vRAM0Vw*yyhIDekoSZ1uG_Ttiw5Lqq_-2?YsD{HaVt4*<sZi_>$LL<2BfR zMYymM9lPK;Y-5n(epT90Z5yt?t7AQ*C)vxh3+HJch^unD*-`th0bIy|7|}SmTbXI} zH)6NjbH1)!s!tmG-SRwwU0qYkD&73=RX<2^uQt_QmAux=&c^nVDx{6<L3&a5dG&*< zz)%}s(j+fKrVBx@eJsiOdKNhfbdn=b=CQv);|+}k%PdJa?B$$6i+er0od<g1DCxNx zf9}wx^XPhWe@^Ab`F8_lb$jo=jjJ7#HP8Jph$}N|+SS;d*`{<o|7%Q;wT!s@ih-5e zlv|eMIKQ)`4O-l*9W@7+*BsxsupPbUzm2p9L6&yvCGYK&rFqOeM00$f2fg@{^jtkd z==vBZCy=-hB(;_FJgwQ~#Z_EA(xxS?Ptx-SG493vDIh6Fy_~1#{B2YKqPgcI!Q-G8 z8(Gf1o3dUH@|2A*u5z;Y*)H$*up6CEe<f*m=1`uVEwr{-1!>1u+Vnw<`&l&h??GDL zI^{b9yZSwrkAlDER7PC+_fXbupa?mMLh@MGdknkVhAN=(#pxifzFE`$3%l)}D?%=m z;xKDnqxlCl?$wxjZzqqjV-vgI1$oVVN83=}_1v--C`yJXD6hRUqoGRZnJkZIq(`v( zx==Y~Ka6YhENO!r_gdfjHORtW8S*MF-rR?d`zgxI<DP#Dc2@_w*PjVobNo+ip4_s} zM<v8H2ZJ2<YVc!#p7UJuT9iG_t!s~eKV(A+&Eq-$1?=tzwgS2@yXI2s0%hHwgKM$k znu9@)d)-&m4_xzFguRFG`>nCPq`1V>a^mhkuzOw(w)LLE!Jum5x<3ti+^hZH543l~ zHMe=%)7ZXW_j!sQmn}HTV?AGUBYy*~IlLH~%YmwiYaT4_{r9YIqa(QHHZOac!|TWM zd|a$7MdJUj2zQU-=Z<les6d+QzGQLlH~NWu<S|F(y1lgL?@cA^r~BZ~bHH_7UEBK# zK59=z6~#3d7WaNH*np2B_s*wjNBOsB2|KOUz^?^q>Qq#od+{%ieal5PhijfJ?k8IA zOC|2RS}QN}`(oOoROa!L*6pe+7WetJ-fJ<fcWYd8oYmfM@JYUvSvJGDJoeXQ<xcr^ z&71|QEG~Em+pzonL~mG{!;3(epMD=-k3X6-FS}@d@B5(Nd_~LG9-WVsoxBA8MeCLI zyT$!v(hub8iy$knF7jWA9~)10uhicT!@HM&i@LkAaR>ekm729=&bi_vuw!vQnRo5u zxfulf^y5>{$!eD&P$ij#vzmMC2WN3*ibuUaR0oNxUzRkB`>DM`b3j=*&5~E|37rr0 z?m*RKIu6VCEcJJp_fCA#I!ztKB`>mNaX+<JY)eu<=Jys*?pHxo-VL3~oWBRQEMxu8 z#W`5fG>iNE8*W*O_$hGBbtilCDNo~!D()f0?Qzll^*+$4u0`ndKF^lpURD3VHD`9e zkM9%jA$cKi&3Bx=rzz(+pgHlXi|X(L5LeG4)AYQtWYx(G`R|%Li~A6{p~F{ltUa-= z`HtFaQik3STLRQY^qx~c_wdZ4{4(xq%+kKmev|dP#eIBh=w9)Ckd@y~`Sm+ryTun@ z=~TTp-;eo`fa_mU{)&}maH{h`-CTWI+)w2=NI8Ooynd5o4BOiT1=Z|xCF*k>aMee9 zv7=`*jW_Bhy>O7^T#NhmJ!E}U_kbikCOt>{$Hcj8*IB+y<&tvZ@;tSdeg~*-;*ulT zvbb;GL-N>r`W(gW-oD7%XteK9>yobfYd3q}q|7?al>{B4TfKYLTigfC#(%z>WS76i zqxr65<BO_Q>PFP233~01S<crrbq`QS$-+xqUW@zAy<`*A4}m!D(xzRAJ?(9)vn)^L zt^#Q}N|Wz;%6nN&Nln8?r#u$-ojZ#5@aXR=bmFjAo#ydh(Ye@KXusr`w{ASwWiNhQ z<9DljuX>C7IF=`;eZq17)p&GxauK!sb||$fYR~TDl(ls&S@bK_Yg~6b-{QV|XL&uR zJOjFM*^B<;-HWaK8JklB#bYnLq&@d%l%ug(T_r6q?ebaNckd~ya>^~B9fxVsFUFqM z3+gPZP`O`$H2n0EM{A>XpDXQ!k0j?>+;@+>X`FJ7<NkXG_SWiNbfwSGdfN9ul75)w zoChgm(@Hbd-T5s1#O1ZP@6Nf-co%T_o{sjA?<~VL7uRzmaeerQa5$spJjT^KOPa-f zvJRtnIv)dBxDMylI{t@~6<z7G_QCr+_wQ(o|A9&~l+5{X-*Itlai5I$JocP_m!j+R zu4o*S8h<|wT=dmA8@d)(;de*lxalP=uI^dVEbf!BuV?(PgDhM}^WKU*&3)BbUQXq1 z2GP2^`mT5Hv`47!;)<`pj>UcQ9&;q8y4<s?cU9}W<}7BlFYyu(^f%X^r>Kwt5ZAm} z+$ZleiqR*5t2WRz<nZLhSN6<P9dZ`tUVqcNZojY5u93s_c5!TR-;U|2=~~BkJ!bvl z)M9Fvas)Nf{F{sZ8n$s4HrK5kTk#bN*W1Oh#eF=_aj6=!UI1M19@w}7d&_`2%Nwbj z)-8iNyZXEgn{{8m3;KmC&H_6Y_W`rXK2PMdfIAnT`kjbb$%?M*S$ZdTE^xtD*v7wA zmXY2a57*npvBiCFZJ_7L7k~@yWn(_j{jkomGL>_^&sqB)j;b?hk-E9+Z-E_)`v}2Z zzP=Lu10dip>!<qfF<r{6x>{rLAAzh~h4brrxmVSR>B0YS-CZ18-1k5}r>+3TfD7&e z8{foU-Q}xPFsQGK&!@4sW8Fy$)z1ZIVH+0rA#xKOYX8o8Ak1Ob<EyZz>q(vE1S*%6 zr*M9Y`)qt#-1i=BA937=@5A1#-rcBFjzjR)<vx9_-M^_)3}kaQe9d!lY;oUvd+b9N zmveji{hhkMoA(Cl=yEMj`vJ5sU{J(GtcPt_-1pvdHY1D6cTKc!?>)V{QK=kS%X<`r z`(D=L<158LHfOVP70qvP-+Oz!j4Zc-D3@8j*L~mKn(%dpW6n;;-k?a9z7?0(;=cEu zvou*;uS@+Hn|0o|H<S8Z3*!1<+O+err#+N|AZa;jm(SupU9Zu-rX8ng(tn4&)zZ0A ziCnr?>UVL{aMLc2_UX!QnMJ=f=0e(WkT%`oK3%IEO*WVBnmmTRSEqBOGP%yi)3p6G zF5gYqE9?5_viP<yI19W6WR<x3XGyDC+-qF7JJ4^eXf3^8vKIww&sY}j!+8f`UFsBv ze2F{F7nJSqk1T~xyMiBpXMy~@9IOGdNVu=KIIddU9}Iba1`mQS1KlJ05&xS~?&H8k z8w55!fW11)u~g3G7-=r{UR4spbU)JmLCra6Pf^gO`qW-*-S;&HNGoA`E{>}d_qxYE z1j6;6%l9vWqT_#c%KUxAm#|-Hj&&WYv*?=rcaVmgxI9l`Yr8%ZrswyqfZ|&Bqc}g6 z_9D=p#kBXRc6QUIS0(OsExi-8tLFpgz5t4PMqZw>e$m07c7AqBzZ82KC)QPVqhjj+ zojB-4_X4(LvtOdIhVD7hdr`YOJjuEHr*yWR&9v!Ni2Kdp>SmCnj`wrksX*_|<te&u z|2s(HQ_^#8!Jgh(t*dN9#hw94`RI0@o*54816gZP<|o13pqr0Tz3yGxf?g$RC+qjJ z$NhQ`r1w^Ot*6@LQ(#??myBSzSHC))uWMG`*Q>m^NMd(mPD*-j?8H-`({r=dRf>|A zQ_#D?Z-A~jfgino{ttQA0li4CWpq1VW6Py`aiG9+wVwS$(5(*b^lF>mg5yBe`BY3y zk@t|Y5VR}5*Yv+)Yo{rt)F(mL@J`Qaz4E2=KT!ZZ%Tb2L=T`$)f8X~z*jf=Jl_xpT z75;*)?}9QuQ?7(x=K@{R)AWaM9_@d>5gZ9zj-&U)o}MwoWo0?mHRP?JuCh86yA@>N zD4O^59Ldrg{p-OGz<dxbJIi;?Z+-@-j3lD@OILU;wluCxJI9#B-!$jw_gU1Qiq|aM zM)NMf-Y>zM!7?DLY>5F~JEP@f`To(YPL(*nuI1M`=IiX7>bntk&j6j~=(Du5@@lT* zP+;O;|2_^8F7Kn!_R)Td?|~ga((5g!PLcIVxfew3XZe2Slv3)Gpy$c|cFflWj_J{u zMAzOsL6&w*n)iOn(U@Y;MbFIhKvLeaoc9>zd=+TEDUGa3reA|BK1B0sK4XbA&Qu_e z#+8?VXq~fs{}J|NH>>CwUTXu_0he<&N$RF&&<((#ik@xr99Ok#1I_*G8n1c8UPR9$ zzX0v*rb(ZTy<X;fdhxdm=bq=7ugkHgaYS0tHDh~l5qKV?X)_mjRQ}3f&}0`X`~Yyl zVHz8{#*cvmKrhe!7jS->^4jIO1AA+Ox{97-+SNTx`W4tqyZ?0^@{WK<9Q%}}9_oLe z2TOrL5$)&rJxIfs>pa1;|F#Lq|B_?BpTOQ`3CphHX{R~n>l*AW-y;zk(`!CW&uA{z zi(K`==kQ0*xq~2@H@yM4;?9+w2l45%pxeFoV<~;t_5B5)=bC%KE#PW!J{SUZm6NDg z);7|<46TFx4g46a0FsEt^x7YxIR@p;>PH^=HTKvY)LGW0az6)o@aMv&?ghUB2Z45D z|93?ESD$<l=-T}l_#?O;{0w{td;uH}4hF+uORzq8IanHKeL?-RuJU0j7Hu0{0~dh# zK<lDS@CPslsDJ3$_uJs#faYP|1@;B60~>-Q^PsQbyb<syh?ZZr@9J}kjXH|@_o+Z} zQa0YB{wRhOv#$YB(euEC;2Yp%@ByGX0<Fz#3^ZPN8Bk1{G#YzA!o}cQK+m(E07ruZ z!LC5pLCtNi1;m@4-LqT=#ryu?22iFkeYB71yT&j#g7<@&ppK%pTpxT4Xb;yvKpYok zO1l>yj|b|Hf#_aiF&(hc{ZrR_@s%Z(yO-jhq3f=$FY`c|`cc#u#k;Oc?**%aK@p9? z-Un3omq3)4GJV(eNqhcw0ZGP}oMuum1KJm;d*+>>OnoQni=J)9z)@f|FsP!s>)CBK z&@*zBr!sxleB7yEO<+<U2DZZ$&GnV}{-Jok254?b^ExIz1LEQ^a1|(X{A+Gv4D1aw zel_VI1A6w-oZnnfru#$K7hQ|41MdXkXGOl6gcw+v<3m8%<NqmqJRPhBOp0e<M~b`* zly#0se%%D#16Bbh$rw=l>;8W&&=@Iv4K2&D=8ETleSqEjA)x?K41Eeb49e0E!hUFd z@@Aklo<W+gqq<H-<A05jt_PX}4Rc(UW8M2d2L^ebhU(`oJ5j<ffMTmGZ6Eldd%*4B zBf!Rhkl;uZQ^x@9aVulH>$(3*@Ooh4mI1x9q<DG|1aVfT&-?J}U%`67Bp(KJE!BGZ z9iU8YANZp2r{<c}S52}ruq7t6$5!)W0mo(ed<37q0yYIE#W1h|#b`}!E+|Vs2>ehV z{Q;=+yEarWSJ9q5&58X91iY5z^J#oK4`}^x31Ctz1Jfu@_k(YOCqY^IMc{|VByR&Y z=LZQr$SlrPT)hASF3a%wJpO2(z^-5^VA5X(mZbPM0F4LLHf87|fe(MhpVPpqz@#$+ zx{hmK#IHfXUl~3%pQL@I2Lrv&Yf>%-)Fy8S*MTyv>uS#LzktRjCh-ht-S*Sq2~dVu z4}7>Ae@*~v0F!bvpt*m|t(EQB@GgAPJ;TQRkPs5R^Y|lBrfc=%`14h;F)*nX1Da<& z3;YEH*YAFRK7%ix1$vKU&_&n31Hu1-ez!|d{@?ILbFx~GwK+RTsHkZEWiRkc@OKcj zZ$CeEU%L=!O=3_*<N8y8=0Ez`7D3tCcXKm19N05FB-BLoPQ-CQ&uc+j_xn@(w}-)? z$*ZXF#h@(X`bY8Qb6_1{Qcngn_CFWQ1O1MBmEQ#K0$P)(y9D#~w^GqEaIbYjjp_A{ zk9;$!Hv>ykz5T(BK;yf9_rYiJ;a|b>psunE75gywGw3(pD*qOsF@2pmr+Owa46H?( z*4E3=7hl4Ub3h%}i?qJ-HBg3qI8WinSHKW38C(W5XS)ly5|rV6pUd&1PHRVcuKF41 z_qa-JdkxSWudSm(f{Dj~_S1bDJP!Ij4%NJ}){&|%yHkPNK)?BX2p>)Ywr3I&Or|iP zxt(Ef1?cy^|4;bvW>7`Z{Zw<64}*Tj`~u3?e){c!i80WP0X>guZ_N{+pZ!+vc^(1u zEK(I&7Dqn?`n_H<7axuTwm%9IOcFDod;cC_4(Mm>Yp>ylKo#EqS_MD94s@UG7iZd= z^%JliFfj(wGO!LA&jinbe)Z+~lzlSLy|k<{3&*q;u6L07#Z!~Aj|Ve>i7}9s0j>9I zt@m!wuRg7N=;>g2P&U~Dhpq+v;zs-a^uFT`z{D7E&A^rzycG0n&QD`ly(6|FD2wcf zBmLZer#YC<0PVvzF$VHtK>h0!py%#>+~0I>`+uMeV_D6A+}S4{#Qm?pp1}6lLV`)| z3}~IIpYM-qyzy<I-x%+g96-SjfPP&2o~PWi!4NPp28w1t<9_Y0TLg;k|C&Ej?5_-p z6y00j3Hr6a=^n~H5@^4_i80VG2DH|%XKvktijIBV_s;@Ftx;<q!F#|{py;~l+WHHy zH83#-%D{l;`;P(IXH#@M=z0GPkoP>lV*Y5*k9iHPW9r&k$9I;fmPy4K&^*`epy=4w zJipfX@><{5e8&4hKVn{U2uA^3TTP6CvNG^$9Q!3GI`*}`uf094_w^~}j|0zuqU&@m zW$pw_jDadJuoh092Xr4UGFG&w@PokBx|YWFdVVQ-ul-Auc`jHRm>2_9VqgWF9R)?t z_i4`U5a2>IZ~rtX^4j%R$~y_<Jzqf)CdNQ63~0=KEO-(W89NVA-rgXK97N`#*Xr)4 z%tL{mEliAoDl?!lw_<26C^Gi7kM6Y~jqFFJhe474-avV;OXIBNF$PM^fcBFXy{Gj$ z%AD0BC&Qet`)*M&uXXuLzy`p?7^ouyJ5s4zK~XWKa{dz}-P5P{>V8|Gf11DhCRi1i z7z1@?Kzn=VfTChwd-^^Px~+e&&pERT^h<kjP60N52MHzv!N4ZeQft#i#lB+feI1xx z9o>%$^hfiYn(tf+m>2_t#K1;W_9{?R>}#HG7Z4TwEjW#}i}GVGWgQ4K-)UkD3?c)X z%en#-6>~RH)+`Xn5*(Ze7JwprxSMkJ1SZD7pfj)`1Y8Y@h&z>WJ_w$v-^Q`_`4mz1 zA1LRIz{D6Z27CrI=AR9Uh(F!ij|ciKI^BPZDD#$9d3=}{1I9pzfz3G9IJ}5Be1dZB zDyS^&$I<$ri7{Xd#517Zl<3EMym?(~v|jn@_^Mi}F<=aY7<fI$MUB7nig(%7*k$uj zz3k8!Fa|m^urKOIK%Q}#r|sY1yY?rU7z4&YZw%-iSiO^)XME;iTl<i=>8+}EwlQD~ zv>2Gq=f}Z|AdmRW!{#0Mx;-#428@C93@l65ZvefsmPeerwAsYR-GPZQU<_nuK<}zu z3S7phYg<|u)ZSYYW55`2$H2yz(p;JAcy(d#S^PR0*nWFRFfj%kGq4Bt9tAF9)s+p+ zJ$w=@2~3OuV;~;}^zP~lz*XF4v7<Q$%{^!i!o(Ob2J&M-e-p0AcV;_X7k+{-ntL!Y z28@CH8CaJht_PiBGH;#Uv(cP`i7{Xd6vx0YMfGbxpUSoMy5ic}N-_q*44lB1qW>O` z<`&)`cEXO00b`(024+%Pk-v$jXNR+a{oVOOo7oC82Bt8uH7WOkyr1V~e>SkcR|g3u z#y|-e(Au7Uhd$5Pe+c{b8(Af2Y;(aFXfd!7pITGPGw#pAzU{|r5pEyGKuH+TJ8%z! zykcMLhO3pNuI7d@U<^z!a59Jg1bM{1o+FN!D9VnE0b`&f46KD8dHycvPqDvTN$P5D z7z4(@1Oo?i_&mttp8qs<?eA1iaBWA%Kv@{j{rHC<kGPl3&zGg5=7%w03`}A`>upbh zJYxSg?5;7XH2Y!<7z1TsK<~om_0FF5>F!^KN}3PGfH5$I0qx_<Yh6!&UvK)95-q_P zFb4X~fd0<y86c0b{yo^;px+g=@{IvwAeI6BO}Zv<9s7C*@Lj;f7%&FP$AIqnUjwe= zUiK~mO9K;Qz!)eW1KZ-#W59LnKZwmu%U50V$QUpNU_f*G=K<GoKOdWi025=t7$_$L zyW-X}AZzSDhYkJhJN<_40bq4tVhk7q<z!%a+`1g3iF@tM9Rr^Oy8*qEXYb=ef{8Iu z0S4ZIk4b);L+|tHcQY>oCxRWo%D}`JFb1l}z*@NcI}mrz*Sg&O;1ZzU%-kH<dv}mv zVhq%P0liZb#J%3xy8~#>?@;hcuoN&c28@AvF`)N#6zdm&w}T;|HGY!{FfeWL6j>N{ z+w{gygaHTrBc@kP6oP%zPtY;t$oLtI{?QCte$h~H#OJ(`p#4XOTgeM%hV;#$K;H=T z^QMRNV>4U&MUA0Wax)xmqcd9ig^d|4{a9n9b+mZ#qQ>-=eqJLmI~vk2Y)qS?XGk!f ze?g<s(vR`9;K`y!W1<4hM&o2Z{zn@vvt$W8S-hBBJNx=ZNFR8zcrm%w@$^`272D)! zynK#V@bq}mDt3&ck=6;y#a;ynq12FmxTRMv1pPcde78n98fxj43u)<nx0Dc6P`Qwn zo)1I`K?R%oGOqXCRzgt0F@2fPj|BOBOJ4O`de75g=|`2K14M@ir>myE+haN!@zh=- z-(*gyp4&|w4SRaesLzjQ*3)}+9`f|w;W~c)F>-m;@-q1Zc-7z8*Ei97)$$7U2~b+l z{yNvM)+k3l0b?8m{l_cID^;ofnK}ykr&p|}Z<6X0Fv>yDzrA8dbb{xVj=ZEGK0E@3 zNnPw&8sWgxkH?pc4U_68>&QECnEyR*#?X7!p2LAhwde9kpl=5HQ%74zew72gzIn8G zD`B#vl<6wPvoC8NEsa^NGn-yYpy$)mFY;#8b><i;Gsp8wFGC9(YqpL?`5YS8d$mQs zKoR4eIa%-Z08j6Y_BrA-I#N)+ryr5m-pbvG&y&Z}L~EgMHX1VQ>(PwoM<Ig88jW4N zqn5+tdeJfD_3v5UkqCjXalO8y=l_+*_0Tv;KhyUL{Y;PEuwLcO(CMDckfX9Uo?is{ zdP0JuG5*KjalJ~O?p;W<C3(81ABpIvd8N+q^rQU0IIJgOnpdjy)5NFWUfu_1jwylv z8Z$f<2WsVs@}=_QR7Y}mvc5^m2xtuH$gfT~zX(1BG=`h4BlW@w`_k_W8Y4P784OL* zFCb+{(C|pm(eNZamKs}i(Mvr|WqOS`GAX}2mUuDY=~0LL3-mL_8+o$c>#*b>?*v}I zq%6OGj$clPf(xe?Zd3Kc!I@G0n7mWh_F6%G1PSFI^VDkeQST_KZ+fZnX3RSh{o(w+ zUZwi_p@?41;+NX=j^g#Q>Yq6r$*%_V8`am3#Ojr+lU})eOB_t{U(M=Ynmg#d#)#K@ z4IGdjG+T&YPalx#_x?%cdmSJkwVi%QPES}0^Y1m=NEf}-9rCyOnuzc`iQ4z77rGr! z(vP+Jl&>H1iVD?V-NHBO)wGj-l=6qC<Zq7WZ>#s{^*eBE{*HROO-nyU`6E-xPoQt{ z(>8xg-^9LWeiDCltK|AtONIF*e=8OHDfAPz$lvm0A}!okyXj%7WBz!(y0y<r0)4Bc z!v0Ol-%TImpYr>yKG70U`<?Xa*1hSko7DbO^Ebxzi&USe{Y8zDz`uoJ4*f76-UUwe zn>V3f(7NsqOD(I?Hygu2{&|fdFKmWM9@mdHh5~(48Ab#9et!5GAD@n?=^}bq9M_{7 ziRzogTVTJTD|;kAUxV?ps^*Pp!v2vKJm0D5yfIBkkLmI8xp%A!&=9q2^<>;b?|t|0 z2*Z>0P3d>`^>j!oGd3yzsM1>crjBQfh4pfY=RZF`8ifCcyzi>DSA1gyUq32!<EXIS zD{``aR#@L81J94){CuCVKPq)pKjNQG`M!G*eM`M~;rK{%lK-vf^lbR<H%|5qw!RJf z-}L{OSNybveoCvfA^)5HANBMzTKeGYgx*ur|5_<c?|Um~N%I<%J{9O&4vgpbzcW^A zrL-Iv2~P0YWvmt?jCutO1z*R!uRNaw3C&hQ>$~@jE<LXI3!KqXw~E8hAiwW$>#E!u zfl!@sy?Qv(I^DO%-Eu-d=IKZL6Pn(a;jrGX5lNEqlPB`~4h(r}pKh@^q4!<(D==|9 zp`XY@F0Xjq%tLywOuvG@`@@s<zJsI%12i3l^81-al-iVi&s0e7J2fQzsPvwzA-$jK zjWDG4Lm{jmQ>yg7rD0hL>pcf$)vun^lk}d0@@o8Gvfej~e%#Pxz2C&>n}H({{ixE1 zTh$xl#E8BrJ?W$R9FcmGe}1_`{_v~Slfw1${ceSJE0iYby?Xo4FFv~w`(6e7he)5@ zs9uiw4~g;mG4u_;`Xll_n!hRi$e8~3)sySzS72lmbr49C{P!DfNZHkllF53nh1Qea z>n2n5UIq0heFFC*`F-Z4AC_@svi(-vq4%{@^iAbO0{5f&{TT7@&T;m=o=5(mdeQuT z&z-1VRPT4uiRwl5eixmn-W2_)ybn6x)cOYm1l6CCzv*Qkul^LhPeAB8KW@oC@Cg{N z{*?T_K4{%3{I^1TXxwU~{lb?9@0_UKCupQ?{%~ySq$&AFMZkFWsroV06ZA~gH_=bf zGgU7FC+O*2F9Ij%o0?xeEQ?+}u#<n?^lE@k`PBd&^<$m+QxERMuk@YTXK^#5UJclx ke|Q)9PI@(97CjBzvHs|XJK0|pre|vZA;Lo4XYs=S16%GLrvLx| literal 0 HcmV?d00001 diff --git a/self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.eot b/self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..70508ebabc9992e64f1314f866b2d7ab90438c58 GIT binary patch literal 143258 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 Hzx)3OGG_Ot literal 0 HcmV?d00001 diff --git a/self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.ttf b/self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7015564ad166a3e9d88c82f17829f0cc01ebe29a GIT binary patch literal 128180 zcmeEvcYK@Gx&M1)4R2eLU&)qiS+*?6)@#Q@mX+x!dpHRhNLkQ2n^<J;kbuez8wxUI zr_5rp%WP?@?v|9UTluyHio*yYZVT-#T-r;O-}gC3uO&O7_qM(Fe(oPX+3!B@8P9pn zv(I@YCP`A66qE9#?Q>?%nyr<jWfHqKA9ow(EIw!1Q04n~;kp^uU2~R&r@#I4N0#7v zy(DeM)7Fl{UG?iEiS5Vp-gR5nZ2!Xt?L(4OfNQ;G-QL|!$;f7+fJ1n$-Lz)c_S2_P z61x_cQvRk34{V%y__rw1S}n1ib1&GiX1)H`*KWkKPq1}efE!w-!E@G$>xK)q?B3sZ zV)JZV|5B0+M=#vAZq1~o{wt7w4A*yUS+jq;)+-&y^A$+%+`4AVhU&7w+Y-AP^<@XQ zZ`-x|^p#SF#I6~l=MuG@X?}XnH|mdkwrui;Qh^3HB<bhBx&P(N@fArroz_TH2Pt0? zkMWL_ITbgsr<`(sXrm<My&^p+Rr1@EknvO@X&k?!)ky3nNr&4D7`1p#=J=shC0$PW z>+*Oy+A$M$RE3dWOlmuQdZcu^om&H^q~Mv6Zi_T@_TTbTBt?>?5cVPbh4~g3xr$0r z{)|#lIz@`{vjpGMJ$jSgr+346O3y_a@hmFE`BS>8M@mYi{>eN?$|a05%AN9(rDmiR zXX0*%KMSF~VQC+pMR63l)1J;1UQc=}%C8j3&+`x<T8;Oke4~^S&cs{YIHOYOM|Yz9 z9m-Q0$%$G<cc{!MndgdBmnnx*QVKN<<u9&8Yv@}2ivtqkkIErPmu3E_{Zy;$ALW<N z-=wxv-5Jt|JpH&Y<7oj;L71i>->Z1J+4_iD<?iE1C-IW#ZcK7Y0o)O-7VV4TE|na{ zCR((QpHbVX#^P@|j<VFl(@_plY*dHrkFZ8<HML2!P2dHUO=k(|d0twKr=&KjKhYE7 zTGXHFNOhoo6L>-O5oc5m)t>SRp+%xbu@Tr(I{FiJ5~Yh=sm63hxn}>U9LkB_qchsR zgfwUSqf`=})3au&9ea8!&flgURU`+_>8X!DQOlzIb4wL9jG>MShYLNWd!i<^r$4%D zk_h^ARylH)+OZP%+?iCORua-sE^56O@cK}l=xwSe;R3xSdNsz=(tWiwN=X~_2fZQl z^mIl2NB7m#6LE)9(4Q>zW?(%ra~+nt`5o#dN<pPk+oF6Q2D}Jnl<Pd+dg@Dp1*Hy4 zDJde|gFi}7HI0D+&=a+mqExz~7K^J8&gosslS-m-OQq3$s;LjSFY{|r6BSA^q@`9; zKD1X*y2yd{l$LN=lufx){-QN<<~_P6(oqidmiVK3spksDGF^##REi?GGEcKDpr@3F zgiT<7DX$ULLF7zrqSEGp5{%BDYDG^(t3|m~4#8EtOL>TQL@AV>(uup2mi`D{REEUQ zWT^;8^@)I4l&5ORq>Q0%Mr`yK<$G$uDx8bdly4`0gGv*%6RE>IHI+jcM5*by7`1ey z^kSo$irUhfqBgXrGUy#Ohk)eeSVV8H!bY^7>Lf`Ucv{gCN=*=^aVO)P>OoJ$o}Lf{ z=vtDd;wWlIbx~_XrP3e$!22N!NuULiR0vKD83<>R_7jqj`2D=heJ%R{*ZYy5P8u&w zkUlFN9LgK28mb#=7-}ABADS?<Y-q>OOGDon`p(ch$G04hAHVDPw~zne_)m|&di>2d z*T4ClH-Gr%kKW3EtMaY!Zw<Zm`?t++k9&LaJ6-SWeCPEO&J(jveD}obC*C-5{N49X zvXiAJ<&zUnE;+gD<Z~x~{GRll{=KsIl;H)C+a#$CC9fHhP_li<HPkpXZpc40X(&AO z#L(A=zCHB4<Fk(6gp%(^$*&y$<?*36J#W7B=J!yt;jO~AY;WED)|+qr;cfZtws%_I znefiHPn4c;o%oJg^1Hu3S#;8Pvh(D^lgm!-Ir+lLpT4JgFaJH`@TAkHPyfs5$4@`z zY;>BPCa2L^>MU^<JByr!wXf9vsP>1oKd9YYJEwM9?WEdZt-rRpw$bs9;|9m|j%yuD z9E%<2)C||0sySKnZq146kE;Jv{Xq5Z>YesK*<ZK6W`EW83)@d^-?x3&_OLB(yVZ7! z?en&qZ8zC&wB1m7iRcZq`hWjdOhsyjG6he@u?^b<Y=keL&1@w&uEBN?Td5=s;V?wc z8*!`>8{yWF9a|mlx8Uf))_`-!(?gVwaIXtT$fQH<IG=>09~+f56-T;WhI7c=L%{B# z9XLn%Lr-9P3FnaOhrW*O8#uoP$8Tf%4$iN`@q5_b!TAl6bbJ=JEjWK1$D6RlasID3 z-X%8absX=<hWDl4;P?ZvNvCmy41WBlLcl!^x&Qd9IM?DhgzZh7LsxmzgKa&|i*Q7} z-b5YPd>m1SH-Ct8wBgMkiH$9nq_+&%@E++2Z(;1c1u31a!qJ9pJkB@ccsDkb!H(dF za^Ctq&XLDke~_fN%{c!Rju`2019t2a9MMN_Pe#94B<UT%`W?Vk19-m!SiZ9p=X4M4 zdk1aRY?7oCrP!P}zZ6HLI{_GJ0GAV}`-$)3`~@75mNv~-aC}2-ny=z`Tx=S&_1*Wx zruiC<sN+e{4h{O`Bw%q8WoUkmBXoh2sH<iWNA&&4i8u!wPcFo^1m|eqNx<mjE}XxM z;~s3!0o?$jlc>kZALAVGJc)ilaZ(=e?mZ1QJ<dOmBhtNBhV$ESL|N~F!sXp7NyEUO z;RQJVid263uY8m807HiNP)+`0$VZ|r_oqJ0xtFKa=?(b>g+;|VH$VNfL@F&SH=4{9 zvc+0iWwTe;IBK1B^{xiD$NTAT{qH{Ey0O&6|JpIWr-3^!fpoS;+AQsm4oIJqu9j|= zZkN6&Jt93Ny(oQC`l0kQ=~vKj-;@3z{h2XVz>KVl)v+el&L*&FY#v*}wz4>TjJ>TX z)`T@*(j+yfG@s;^<oWY1&wDxV&)NoUul648ceS7Bx^z2q_vw!5exv&jy-VM!pRK<@ ze}n$J`VR~q!v@1;h5^Gd!w31Ad^vw%{_6be@_$ueC}=ELT(GfVZ^1JKuN4*)&MMqh zcu!GDQL?zM_@<KCC6AQ6QQB5|QRy9}KPr8_jFkn-)|FjV_RX^Q%e%@~mfunSQu!N3 zgR#jt*SObsyYYRK-L%luYr4pEv*`iTH%-4a>&>0!9p<lBbXKgaxV+--il56B@<Mr! ze82oPdB~DyX|>#J`L)$<?X`Zv`c>=el~QGW<<iPSm0zy>b(OJdWz{XV65B-EZri=K zm+b|1hkdqvmHjgNefA&OPgjqtUS7SU`e^kZYLuG!H5b-gQFD9EfTPqAbVMCDIi7X= z%<&t?hqcyPrFLHJg|)Xi3!QeS-?_xO#d)Xm$8}O&XWiDiyX#)AOV@YQudM%k{Wt30 zc9prhToKn^*K@94H<UDtZ`jdrPs7g|K6Y2T7r3u>zv%wh)9KmZdBXE&ug|;Kd%ky< z_c`xh8|{s28y{&ZXj;^?zv<bgZ#BKzl=hi?if^LtYTu*2LB*sjR*ovaY&JCqo9}L^ zY?<70wB@65pBZ=KxIeY}T5oRs_qOV`>1`LZ-Prb(w%6M&?UUM9wqM%*X!|$YPj<LE zKHG6!$AcZoj@LU*`|JGE{44yI`=9pzytA~kyK`q}f9F%3Kk6I~uz)$RHgF(tN8qWz zYh4vxp02%JcXfTg>sMVL2K~WV!F|Cm1iu~p-FVCRRpW0R|Ml^y@xv1eCXAb~X2Nw7 zzBjRGV%x-(6EC0m^29$(vQC;jX~U$iP5SYqHzvJ5>Gb4^$-c=~PQGXIi<94;QZU6c zW%ZOxr@S)d_uZE68Qr_OpYHza)W)ejQ?Hu($kdae_E0!<ap=*|FG8P8tDQD$+PY~^ zP5WTFclzS#ho|2>{m~iIXQXC+dDg?TUYPasS-+iKJ$uINO|$Qq{e#)>&uN{rVa@|{ zUY+ZnyKe5Ib6=n5o40h{W%C}JcXEEg{FeDk=kJ~$pa0_g-}aRDOzb(YC)RU&&!auZ z7O(}@1@jhcTJY$C;e`zgw=8^V;fISl79Cjh{d3qkYtDIcalzuY#akCYw)l<3e_Y~P za@mr%mwK1ZTe@lK{-xhq*0AidWyjBLKX>1`&z$>OSQ|bNzB@b^DT+8Et0Rv_z8?Aa z<<-k)F5k2KiRJ&Y!muK+V*iSJSG=$ywX$es^~#o&2Up&+@~bO<zp8fC(p7s`eR0*l zuFhY*ZuQ-(f4KUu=LOH(e%|fpy?lP*`Qy*ubpHM4|I7KGeCDFh{N=OFpWXM_uYGp7 z*V((V_mbXcdk5E)u35I`vNaE{HLSgG?JaA6u`RndocYM8V{k-*C*Wa=JqYYCw z#5Vk7W9h~z8xL)Ka${=apEp@I&E3?u>FG_sy`bQNwhNA4@RJKZ*}Qb~-J9R&%kOLM z+u3(>-^<a$XlHa;^rGm)(H~u?zfiew)rD7G__YiFW6Sg{`?lP@<yTvVw_3J#Z@qBq z?OT7m^^e<h+b-C4_qHEw`^)yC?NhgJ-+ue{cXn8IY})boj^FO=+<D>7&+WW^=L0*R z-1*&|r*{6wuHs!ayMnvs?pnF)@UHuIeRbDcy9;->?_Rk3g58IA-?ICW-Cy6G+Wp%- z&3iWNxpB`6dyemI*t>G?ZF^tY`ycyi_O04?+rBsVSMFc6|Iz)!2O176I<Wh|JqNyX z;NK1g5AHm8&%swOa$L0hqKhsXI+TB?^U%46t~m7cp|=h<9o}^KzQcnTYcFoTc)`Wj zT>R9<zq`bLN#7-pT=L6H-jC^Hp4j5p!Po<_=Rarq+y$RI`nh*5^<BF0()%v`(WR#^ zn{wH~%bvRI-OHOVUw?V>^4G4=Uor8D6<1t-#W$~b?MnH|IaeOJGI<rdYT;E^UG>;i zKfCJpM=VELjx0K|=g6B^=Uv@&b??<TU;W}Wh1Yanv+tT8UX#9d^R+iz`^{^AcU{YM zJFk26x_7RxxjuaT<<~!c{m-sHd4u7G@C}#T@c0eiyy3MQOK)tyalwsyZ@lHkXKsAs zCihKUH$`r`@}?JWdj00=n^)X?@aC`I{PyQ7KfmzviO>J(mZDqgZ;9M;%`IQK<>W1& z+*)^Q*R9)cz2Vm9Zhb4x;`aEI_!r|pihtDK*1x6yvHtgOGv7Atwyn3_e%trHAbr92 zg)Lur_;&m4b8kO%`;)i7eTU|b<~!!yvHgyF@A%#wf4I|s=jZPnxbv5HNq2egT5{Ky z?^f<!b@vT-C-2eRGwz<gdtScRckj9PK6>woqpqVXkKTSXb@cQXgJ0b8#V5Wvd|&B( zZTFpf-_H9UzAt&-ukQQn{mu6;x&OKQKYF0yfu#?8;el^G@NW;+J$T`R4?Xzx2Y>S5 zyAP%xs(EPgLl-`D<wN&A^x{LuA7&3L4=;Uq+ryVW{Jn?&_@!B2df-bxf5i02lt;Eb za_J*qedMD7%fO<6iw9mDcq>tq2qex;T%LF+@%_ZVKRW3#&10U&);@OaW3N7Le|+QP zvB$si`0x`|Ppo?4;1l0?;*BR4J-Oq_ho1bmr#hZG^wi@|{orZ+(^H>*;px*~p77=E zU%vm#Z$G0vv-z1jpZV8km1iG%_SAFL&&_&n%X6<iU;g|zpFi=!gcpvy@XU)1kV+uS zNVl^v<ZgpB?kOg<PJY^;m44UplwSAR<frpAIF+8tquV;V{j@>PKAHS9M4I1q_>F#} z*Kc$gkL=sHk%iL<BlC|4JzUOc&k8~R{~8eZ|M2*`@gt9{2`t4@977?2y8|xSicQmD zsnFMZI+^VA`DQ$M`0$g5hhwpbqOcH74?ihsN8U8R`e~M|Py{==Iz9FJ3RC9YpkH>$ z*uHYzh7H$kSjIC+B0FCgmm98QcAk?trYI;KHV`(PsRuMFwH^kunO9+OcsLb_gcT*k z;^`>T!#2W_NM9t?!m3E=QEMvBAFx{Gx<D|{*+pB2MV2iV+2E(<uyDv13i&Q>Nyl13 z?G@D(?V+!oTUB3mN(qJVzof-#Z8_v$QdCx2QBhh}w8Wn>+Mv>9p+s#(OVt+YGc86b z99sWwDlRq^n-`BCzj%B;Z!eQ^qu8_=H^wjis{kEf7eZ^3ED5Sm2K!(KU`I7Y9$h@2 zt`4tXWEtoT2CN3JUaqiobOky+UfETVNg69Qm6VwN#P?Uri??q-x_#lzj@@<34=tbH z<>SSQ`Z##45_rCSaqk3nvtw6NpnLi9?(yg5H@!i56mxinQKJM}*Gif@Ls>3Yy<SGa zem{yP=myZ4pK?D4I2$YUuDW_pz}VU4XR+dfP(euvcEwIb*~3rxEnK|}s2bCQrm89v zlPv|s#RU=CS&BkMqp$jH#?uldX4q3dz!Jt1s3p-;=%)-7sza@aR<dv;a$1V`A}lnV zNU%tH0Q6UdbCG1HHUU3?C$ybW-%u<T4u=Os&3KU^Wl&LkN{p(?Z}_MV8q^`ij<Fcd zbjZ_ca2c&ke(t&Cb1W8%F)2oA0!Wik)0l%smpAw!Qap#pr=?gdXY^=cPc6mx;cf96 zf>zm;hdcvrgE!!3y?geAdPAX@GZfmxWSp>2jBbbvx=T=j4H12Jf@4zv*qK2PufD=+ z@N@>v=suvotKRDoe_~j;Xt2r^R*U%i(AivD+q`r9c*m?+CyZ4}hpVEj$z-T$s<1A< zIHF8h)om<oXe=tR<})9qto_>fqe%O$S?O&yqpQOp2Q3zdyU8~-5}Df4-QD7>wc8!_ zo?<Pz9%1X`*p&zTa=}}M@#+Vi$;B~r4e-ps@r?S(FQ3sz0mYfYs&Z#}L2=xvIGwr3 zG!zOIaZJL_=`1de1p**0!=sRh`cFpR3<K&lR1d2m0G#a%T4{`#fyNaEFO4*p><z*V z7M{JqUR%}^$Q;7qSSTC`ZJ6EBRBNvb^e|=Q6!+2dQH<<3=u#QSIDp-NG2`)|12BL= zf&v+uRKa#M^aOl?o`xCc%~;;)fvU&kt|j@iXXh{JYMnC0=&{9Y9@<e4XLGG4`y3mS zua`zCdO1j4YWb8xt}QDnEMw&r<(+4i_SEHtWu--z7nPO0GOFAVr&B5Tl<Q#Omdp&K zDBB=^N6-tjLYurguV|N*LvJ<PU|(se<E<N4Rq4vt+dMQh(8#daR=|?!JMAk=b(yvn zxilVIdF+-;w7kLYI(vl`oD6nvaHa%#z?nanw)m}nZ)Rh$aFsDVV63V#T6`g&PYEf+ zA`)pL+?;Ae=m!X@e2yqV19AinQ2E7JJTn;UWKPFeJgkJnN|dq}bST0UWL?E%x*rZF z)%&1NRpE5XS7l@{UFk+j6Ld-~k#p7{%KaN9red*FYWU0&qds3kQNRE{rOa##^CgP} zd!|`!g$@OJK*~7>IfL+pGc5{-OHCFhXh2SDSuE2e*|(>N$b)5XUv7&DGi9j`eESWY z83^N5zU?+x4F<2l>kZOh&>FN_4V;lPsnf8qao)Vfg@(?NGa*_;C!J%QSz9~9bk3y7 zi|A~o@tmBV%kW+|ADs0DGa(=Fene8as$s+I$t{~Fw|vmB!Ni&GZ7q{$Z)iyWxZwjj zVKKpeH6YPZ7GrT<XTmL)i}(lnGZBV#G01%B!JKlbWf{qcaAu^u5ST+HFDEg8AM=fH zcNN$2z@xZiMAS}|6;#>5ihIDLD|3XSxPqJ_xx&$70|OWd3Dg(r8K{e7wi*(rPO*5L zuGDfg<mU+ny`GF10vu}L6+7D7yC+ktEPhaHOlL}K)_^rvP#cJilG0vC_7WWzV=@Nl zWMsY|(P@(N02(k>zZasH4x2KN;3Gr{pGE^tO9_(uBH+%zVEhy2sI~v!7?FYlrNEI( zxX%#&4U!#XA#M3PtU783>g~qHqJ1GyDvvF{G@VLh8o**o66C4VqxJZF;40JzwGG1@ zL+XgCfN~%wZALE4b6X7%<Z>h<kfs5Uw)B5+8eGmwOP~CUsj||P9xzoBw^5V?72U}+ zTN~z7nLu?wdl)?XI*ha^Mp~SgRSPZ(dh7<DA{nhqjPA~{bcF%0&A@L~G=1{)U7ng6 zPt9VIv`$MTnz4`%)G}UfvDqx;-@~&S&vO0@DVS7HEJgw!4VsLMkwO#*bXvmaI`Bt1 zfPSwd7RsW&)2P0W+7OR`M}|X#;s7WK`6MOjfi<A!Zo-wIp9a8~Ol0tLIg-sO8MerY z(YaA%3J5&-H_1%Iu8FB~?yB<aIqNZml%Bqxo<I}>XZ`Fs>(|c-^x#G$8YRqArAR%; z2FYy=$}UhTzwBjR2C@}olV>#VZJuG>+noNBgB4%m*yebX-+4E4X9n(&oEL+fhd<;= z9tloKtPGu)dX_=ZBVjO`Mnh>J3sSOU&z_c`OOZ54qho|){1Vcj5!|*0{8lmpKn4=I zgDUM%^$ZAyL8@mmws2u=Vb7uEkojjpyg#}fMx3?wV{7eeL0UYk6z|I93VNE}anFt& z_bjMe=5#J~E=5&yYA%`UjCC=p2Gv>AMQ~ohy~?0rjnH+XfB{Hn?on6`c|S2Y81W58 zh!LtBImJhbqF}TnM#*5rA4LfUsT>$lN2>b>UF_=g8b}KBWCoFeq%)Fbskd|GfcNWd zwtCwG9UZkE_r<e2I%aq1JZ?uv2W!aIfhkC0tG}k>2Bhlja_f<*V|I{E9k|CDMpbNN zM5oYiCeF`*7h{UeiU*M76K8PhW4*oebD89bSimq2VvvGk9CL#*gf^isL2~lfp%4}g zhf8Q|it$&%oZ(a99=aN&9pM{d0+0hqm(W7FG{!Y9%E9l|$)q*P@@#g{K2xt38I@0D z@%Jw;C}FAemG+rhp4Y@#Z@*t$(1ZM<=!a_|W9fi*lGz_LdR+|_hCnnNjfR=Ci-n@; zf#^kh?T-Ru;z$ea3u!Yc<B`5TXj_y-$oN#ZB!`@X%UH4(!^x{R1iFG=*$e*Q)j@*| zKpiJ3(TiQc!lah{kQSTWO;y&_(eQ>1EIg@o+PM~IQGj&@SYlPnbO?*hHHFOv)9Ra| zu?-LU7nL@bZl2lJRA;X#&~~=kIE9&ovcC#`TSn0n%mQ5+#ljxpwV*u)-ZG|4JNMja zt&=9T1_Hypg<mb*d}K3nTeNXe>9YN{M=fewRQy!sH;(^a;6B+##^NDMMC9S&VHU}v zT`ZYIXW}3Dm#e~NHUB)&o+^0mI4$+cT*U?f%hi8K8Og<W7EpS)dJ{W~;?oO-8xLbb z=V8)ltyL%0OYQ9E>?i2wVyOby1GU1<X$xufI=>eZwae==xU7DI*%f4qFMaOf!%wB} zTIMsldc74}D!ebQ>+o;r_)@+7`Fi`M+s6H=v(weVE`;eq1Bff&Oi7We3LWHYtTUnr zkY}<8n1fc9B&j?cPRGJwI)l#5k{mu&U>v6<5}%>yr=u~_kh65Y6LAISpuQDQID#-m zfJ3_K4F)hiORxe*2)Cr%Lc4`_g%kiLSh_=Fh26&$Fo4$>Pyw##2`N|@gKUL5jaH*6 z(B$Q5^YR)sdV>}h1zL?B2ZKIyVbE$dD=TDA-mUBBM5CPx7F@7E0e^YPpwVeHidL)3 zLjpx>F430gH5#U6x~ekuTvMzs3e47*729X82k(h+o&;_*s&!sz4*axI@GMmf{wFOy zOM_h<1Rs}6UoXopWXVARq5x4DFoUj-v8UIMf|*~oRQUZ}nHK}$QSJPG4v;h&Uj|5q zat%O60Lv$U5sY?}X|zQet)<Ao@>y|lK0vE0zzz`68UWCI4MSQJPo&Y743CCL<ypar zj0*D0iu3}q1kDmHveatx%QSjz8H(5Hbb0wGhv^x*l4+Q(oTord%7B?F4s}ojN>C4U zAYs+e0fHHTS<7n41&F{PzY24&*W>b@rBnW5(3I%>ZjA;VpPz?<Q99sIh6CDZL=ANs z!i`5p!SOeFEU&f9tbx-#4<IQhMRGXDd6i2G(IicYR;MW$4V6)N^3RU~;$&xtOQT1D z+QDZV1*>TkScP<jQLvyh8vXl5!Hr`?vFsR^VKLh$U7It;JHhqOI?De?aQ>{2aTF0M zp^vnAIH>gDpGSTF*+2-K(2OD_{~Yc=I|kG_W1&-;`?tnIX&w=Wvy6qnS+M65gQo0^ zv7ps4P0`rVFsjXG9Sqt$CPr{}I6ObL6{?>g$vHiuo*0z4jOr;{!EcEB<Uy|DcQc$P zWA#s@V=QL0u_|M9Aj)meFcp#6zn{y#iqN(cg_w{D3Zfo-jeHVGaOw(ZVB=t?M@*Km zjFW*9W~eSh&}HzttgwE;TuxkktYB;fy&*=+lBUugXO+omHh<aUw8&2PbaP2hPYK)` zRF`y&_D<*oGPWYQ)C8%yrJyS|Zyt=lxHA17i86L*Q`ON>2x5+^k0+or)Ic8$k~G0v zPB0;xASy&si)!^I>B38w*0I%O&)O>OmG+W?Fzl+~a3B!qvUS;PK~|<}r<JBuw6~|H zHwsyFr9Ec1+ABB2dJr4YGfa@<0OfF_T18>GBMXHdmI=g=K@E08H6{g{i~~@x`_f4! zhtvJ6FWo;J3X#eLzYuh4(hcHxJBrp-KsTtCoWNEuY)L_qm$|hOL>YoE>5rs;S|Mo+ zwYlx?XKlt9iD2ktg)A}y$xxfKErv^aV6(lXkVQY{gDk6RfQGE+MVLE;353fuVf1~1 zTX06nliG}Rokhpbojcys+UiLU2$Ri&rRVKEue7;j`nl6fzQN5pkW8~UWF(yqejczL z)STNMRE*7)@)91Kp)?8u#QOqYA;|F-JOtCj<x0QJEt5vh!lMMdtT&GI77Lf|ys~?Y zhQW<9b%8n-hPtO}X(YCijYEN9B9fSO?VVhuNdR8oAw!3XWy8>0NJ}95i3G2QH)tg* zz(|)KbH>*=r=?Q^aKiBMROIaMb%rcHpHKry@0KN}M#6Z~ArDxwNsGlF!6Gw+i45Z$ z`lz^<8NeC|Ifb0p!gYs#R80YBLW&s0G5)NF59M%`X<z_y<j5e-!arl51ic98K9x=k zF!?M*LODBu&?7pw8JPMD;D`~jZ;i0YNF$m@z>*iVSY@anaKm_mdV{Mgh`qN9#!$V1 zrM501U&)f+JKU{P!}@ARlYU{fUePz*)arKlrz%sYPGd_SIGC^GuZgX}K7FHu9>3Vy zQ0t$1G2Zdl^OqiMZH4+w78=#Z0?P;uH&qfJ@yT)9rm2cBhlVQ*&12LPKKg`aPCZTf z38GGkrU<G*R7E9q<gFR28WXW&346e9@4C{d5W!PQO~Y9V0{WH|G$R)4;WW<tST6Cn zR^}s5P~AMzld0@8^q^!iNn=`!3n&X?2E&<ooCOxi(W5IG3XRQWH10s(CjTMne`nB6 z2^AvNqE-pUFdtmyFnXvITX+stTEJUIxt%4aQTa&mIP{~OOvnNt`bPuH3Amr1Q$<~7 zpwzL@9_Prw#yrWr7K~=5`cDZ*pmAX&lh>SJi#mWEfFT6WW{-e31q>3(TCP=Mn8siz z6ga~+F{*WE#lJByCquS8s(H{&$-<EWjiB*LwsSjbO14e~erZ3&u)8sWVXq5NPY~&# zEf42(t!`tlVFQIK3KOoPMBqiikId2d@pJ4FsdOZjguTk=8%V*fuRtH=eF&C>dt)xr zWJm^;3!$z_)U_HG5sNk0Wwn4U!D9~j3DPTPQsiGXT;FznYhiIiBUy3!Q?R_?L|edY z=eM;M>TnO&seXFc*ice{d=cjkIvIt`A+dS`DQpIPJ=BrTV3*Shdj?%`W!D35%D7@@ zmENQe==Gaf{boH*O!_KkaR&>PO)t}xRf;?7*NZfjWxCSo<tT$VU>rOek=JH`FaTQY zN~U}tJ3hXi#Z%YgNHk@iw2)oRo<%A|O+$ls$w(J4gZRU>&=Yg)j?Ht-W8vQ3BQeLW zed&+qI_7e?To1TJ$tyve0=c6EE4$B;gok78J{HBv+Jv%?U>Jq0KpuV6gK=XgcnV8= zd_AhduK(DFnovDdew`2dj$}5#NgnVTpux!y41%fl9lj0igR%B*M>k8f?|A0E4ec?0 z#U-R{d`l518n@9Co&+F>jL<KGh*^N2A_40>x8tPXStL^~kR}Q%xiIO4F+8h)n<2<3 z)Iwn&f(2EsGl1d}*2l@A2D=Z~ppQkB1W?ZB6I}ExHPPV>+T2F3N~Y^NEW&u4VWhB^ zz~zX_fKgM0Li~RaMif4-tExEFmRL%INz8!Hf6+H!M5#tDjLn-l?~=yq>c;AevIZ=Q zpNKmv9ga%pt9Vk~xIEX6l}0r{ibz_^jsYjUj$A?}s&?iefbD@sND!bGET7{=fa3<l z2p4R9qsK>U>t|XEN*Wq1a!5hw1GPG0d3MZbX+5vKwLn`uWU+8!g|xCoAuE3&a7N~S z0^v8T1r2G1ggh127TA(hYqKTeGE*(<>b2@h>p~0^J=2a!r>0l)5w>V<Yqs6N?b70W zBR_wM@6+GOd61iw4fCsw;@%nO-{E(}{tkXF_GxjT@u6}B@)7~VG3KlzxUFhI3Hs&q zFdW-arBB%3z`A&d4do=Tw1i|xMiMt48$e3giVX&0<QE_rzN8=(hNDO>D1pup9xf<m zGI@>QBBy=~6&IwFc&;R=ej<J$34Ndh6x?s{lB*EZ1Pln;8JtDFIE7|G^XQL<`}_F_ zb7F-36m+4C;xu4K4#HZ4h6T9S7w%*VJ%E}D5fWsi-EqzVkI8c9M%#kl8SE2VC(r2^ zXK0#aX9~Nejh;nY@A#KZ8|#(M1@?UVL{CTSWgV03X^MLb0Z+)LE`vHWqa^Y#!>Q)y z{m!k7{>~t2PO2P28lMW(X%%oN_|PdOwkls$m5&Dyg`v=JeaKx=?ehCwkPPZe?Do2% zdi&?0-BHK_;uAt403EbO^q&G;O@ZS<rv)!T<Mal@I4yZT;5@H~&`7L>%;u=wU$)G& z&n<5#EYw$YdY#&t_NVi$<+GYY-OC#m8f#h6g){AQD#sNS8LYFWEv+rGAi*Zn%yG-R z+h#2)tF(aiQ;#S-PQ^eTIa9{f0<4!SN;RV7Q#{J2;L!5gW~Hp07sZMY_fy-PSl(T` zc=i;NQ54YqpHjCGNpytHautDGPNRvfplzg_P`rhpwjjtOILSSJTw4-334G?HI+goQ z7LT>$>vn_v2gg(*kseTTN(bFfrxXSgbhcy-B#s*PZE*M^%0>8FIR1Ox@P4947O_3m zjm7zc#;Wmb?H@b(L7^W@Usv6vw;A6bpZDiKcF-Wop^^Wcasqju1CW(cQa$MIbkxs^ zQQ|THHF;zNln&uJgCRgYw~oOis|a-(xjS2iFXkxI!c0<M;FD`y6^^=bUb%fjb8|{@ z*LF-<ak$ngZ)kV14p)KJWw9Xw>X-!%nlD1g)Yh9S+N<2gNiI)q?YORS=UCm<>n6^h z(4woTtv$SAN=L1?Y4(O!UD^V84qOF20UP+UB!wXBBr(dZ;9RZfD~LIMG{69lA6N$1 zyzp_GKF!B{I6vRz^fj01^<~XI=bjadSKPs!>!-Lt9-)0oZkByYT_+Bmb&4-6*SOs^ zpjL1scse(Z5<%hJ%G5|iZ@9=uL$bR3pVUJKZ<aO4QUhnJ0E>t4gV!|{`}DG*HCVt? z2_`cDlN8QK?t<`OhWbcOYPc|n4CYFJW97rE=W84bw)%d#z_B1KM8E2q;&B&@k`h_# zd{(>QNMGOT9>;>e3c=7;3c;{!l*owkS7YQo2wyvCEOw$zq>mA2$+g9JI)Gk4A#0a7 zL5$+z!qU>hgS2xcXF0~-Gu|<=`C^ccRkh(nB2`-W6MFQM!ZLa|-Z7=Q*-^`>k{aV6 zG$cq>ZivyudsItCCO+qL5Qjz-E*2fc0IV|douF+pXq%`t#=grqLb+A4o%=?V+fyz9 zQRX>PzMzl)S877kFN#r~AnOqW%j5?93@&m;N_-0Nq4;2M(^xnJjs%88Ts3nB2W8yV z(cy~ISOAZW6H^iw=wp?-3R#v*$XOfWh=wZYEhJ$mN6f;-2u^loXixZMqS93PSd!wv z;24)jfi(>o{-VY)G>|k!o@-wB3WFbnie1>PDBaDcx|^H371p|T=FIl=srH#O*Uqx{ z+LO44hkSo4Zq1^{iqolZ%ZCiDmh4jolJC_hbaM2Ne4!_8jI3^!%SrsIy8m@0e16Gv z#3myAa(ar(Q<Ed%u%{K?xmNVNkOziAkI23Z*b=|tRG$KkDNp2PMSL6S9yBf)2PHVV zl1jnd8xDu%a74yF0uv&L3rDMv!Xiq@XuCswgajfMg`^LPAgX~61Ti0i+7Y+U9b+gH zcT|~fY;BI2ZRXX5<;J2th2`ai?r{xIaH^-)h{?|4^73M5c~K7~>M1O9BGk|F+}OGa zJ}v{>#MrTcvz&GO=s<$tzz_06r<W-?1CS{d6|%`Ry|K|!QxhgVf+37MJGNeuJI$7= z%ITh{+fsWDROdWeErG*;IKa7|4s%Tgi$DR%=?fNtJwSoLH?KkO^}_WV@OsGqYwe=F zze6St(q%<Zs$ongdFrdG>TQRtT8*sHR+s8@I;LpgnA4RyG&)&RSxFCc_7Ve}8H!$~ zE3MXOWsUXB{!E|Z7^F9AHE!~H*mYWF*Ax_JbPZaq(PA9At)sgP^Jg_Mpk{4LWFd!; z0G~UF!)G%Hr+kR3iVTyziiAqxDWEv3@HEz({soJWV}OgBKDaH2as@CNj>1-pC{TC6 z1GldX^v~<C5+Xxn#tquYX%5#s9$C9svd%ZHvvZo)yTE7A=4qOyOzTwUceRnP(xCLr zM+E;zh0YJ1%;`-3P-|d7A1l*q*#xK4Nv%=!4-N2`EM>tuu7s$gM^$YR%E+zE2+z+^ zMC9mcDb?3E))=V)9}I(vB#<XXmLi5kZ$RH7YAoPK&1o2BSOb$Ik<C^m+#gO$VKO)J z{EsbOJg#i(#DlN~n^FWI3{lQq?a1|2oS8sV-S93TJVj5DDr&w#F9Uv4dEjbPL>_2K zyr#Y0xs^R=pO`+3GD_>%*DQPMBN~HdJ2M)q$|o6<jm7n~Z>Lw=C&Gs`XfCcxpQ<X} z>pZ80v2B%bk-(Ntvfzkq1oo65SAPSBkmJ66u!zLjLY%-xLb0i2^Y|kBB3fTYbd7iz zLiSzchNGj*^%LsD@QOoIR(4<g?aBA<us7Q5<_bG&I<%sD<+I<uddI!T&30R(-HwvU z(n1!WBEXVU#sHKs+0WuJUkv|<!Nrl&zYs<v$-E+-7aTuhBSgu$o(dL4JZHqm$(z8y zVIJZcNsW@Iva&cu!;Z2#s#<m?r!72aHIvCH5x7dYB{Wik18StwcUAKaatj~`J(`mn zz<P?JO(Ua%Sk1h?6b&AdL>p;^6j<5Jb>2EN`T{L==eCikNL`0@3-eT*mOi&<eq=sV z3Ps}zYY<E?l@+qMB|Wr9QEn<OOMgUEmlc*3Hx$EMM)(^7rV%75+6D*(mI1~Qw5sw* z9jtmNg2fj=TwCZ^i2ntjp-j@riqc)XN-Mrhw=(}^t0z;i`LV|U#?f%Wm~(^wQ{<et z!WzWz)~gl@CLsp;gO+U~2wKd-3R9%?2Mq}xD}7@oLU<I0uu=SN-#&->&-STjxW#KB zXg5i0Am(S2w%{Xz42IFl;-|P!&UfUesWOJhTBd5mLLZLM9fd6B<O>viPm(Z23W7r- zZWr2dM`yh%OsEKfSvW2pIY{%?h^k>!V{`}+0|Izlaat@_=9pj(FheNbVW5aW%ysGL zD64>wG`oW(<$k5d@?2FzRaL{gd~ZyDEXUR7h7R=|>IEL#imoQ?1T8`PN$4<snzrKa zLcds9+&AdEhfmAOj2`Orl?JEJX#mR%g+L`Sy^AK3jac(RG0l~g=y{S*1oqO*A#NFg z;0>)n7sSLN_7yA@0Fk~!pN{=@@oyKiKDx%GX$Y6}wxHF-;Yl+FQtDLUnu4dSh{${L z$tT$rqTq^eezRhD>!wXw&`#)4RmD4Yh}mK>(1;lF;PbG8WWj{APL9nO6lpw4$KsJ; zpD(VYpwe*aLs7d4iZi6hYxt88bkF?z`}6nvkUZs!!<>qAs->6WX(?h0c0m|r6PVqV zNJIvx{#aj&)2DoC7RUOao~8kKy<HedpitaeZb77&xF(kr7XiU8g5$K{d$4clA#Zl) z1-rZ+)>vAtbvO%??!tU~t=UywU8L9L7nE7-Z4-P=d4W!ScU^Vk<RD`@Luq04Bx6Zs zk*lM~R9?o6MTXsOPrj$bQ1Iu5;(WWK*3sx~Fjkr@4U>cQfmz*Nd)?f^d;~A)=E-Fh zc|~mvWexRq3#-=VjqXKIcd{JwAm%`pHi)=6XgsM16xA@N3n}7m$yADF%D_y*Ljo|1 zjyOM2gg9ikC@_)Rk-&XPawSI{MJFH-&M!AmPyof`VT90;MVq_3n<Ejs*K3dT4W!dJ zL^8Knbn1$!O_1}NVm@CR4s@BtAc_S2=dF!luG{>xIWchZ1aCWy2x!Wj1VTmyO0cUJ zBp0=Hk6&r*u<V%^W{!o)g^klX%V$Oi-=Y#?>X{7aNp5nDb06ujkB<{Ud&myJ_1+PR z8XYueIF;|LTnd9!B}yunA~ek9PJM%eqgc}nib@b3T;Y?kSgd>sTIzxwriJ&!<8bGE zZuOSseBOtUizpqnR!wPuTLhu&a^?lN?Q-5CZ4mF~az2$C%a)8>ZMGsl&Kp1$zCw!; zvg?HuQNA65!FfhYdAWr->GJ6IF}Y+k#%wO5WQ0)aB5sXI@PGv_rlKw>Zh2v?2s|LP zW<HR6(+FJ?R7K1%q4<vmL<`W0hh5S{=nB&j%hv;*4X-6(bY5l);^-CU6?!`14?&D6 zfed-kPtvH1ybkn)g6k<2Mfl0dSOSqDT(`yEW<)Rwrgwn{!61lT3{$T#5tN?5wt=*R z(8`r`g2%UG57EwOOYjL=<YR;#Q6b+9HsppI6zh-21IP-!Odd{(D$+sn47l9^9p+Sn zVkW_$lz39`l(SM-8PyGO!zrk1Y=pSd>_C$262Ms=Z391=fdU;7&}#ruW>Vwg^DCM+ zI5#v`yv%JKv8bnYc(`>H;T+bYV{d?F5GH{$!Da{&iI5uT1V!_9TRV&^$9K0aN-mfR z3OuvCb6O)tPmt3ZRVvHG66d+{{6YU%>IGqko!hddaZ5|({%u*A|B~kBJ<O6m6=GR; zH5lB7d-sa=3kt6X&v&9;++6_Y?x&JS=t90o-x+k0DG~6}s7ft`_%uQ-Lm57jBLiZ# z4zS7}{M$0%G%f;~s&YiYy^sKZR$Q)1faS$5k^og1jrzKPtO=N-1-Z(IGDwO?xLDS( zMcRy?cEjPYB@_ZMa#W;9m2pob3?~>XgwMLl<g*!v37Er18;zW-waQ4df(XxLFh%G| z6mE|^;k_EMpy8UX@Qf^7=E~Djr5VWD3c*Nd>Gd`^F5&MSXK>2R&9c)l&RErFGe)Vv zD2>)o2pTNOW`cGb5dA{F6Y|oKY6irkAt#I`JjNWfPsT<*(U2UrBw(sX(PRyc#}OhQ zhuzbX9!`;naWe*6jBKDH_c*8mMKeK0r^qSdScu>Tphz;PCle1!;+wK$LQhZQ`0<TJ zm;^lG2_FA7@bjHZe3*HUa0Lv+qsmd3QdODqml8>AnR=_#TBYzo8P=Tu*>_;o4Sp+U ze$BCP`Gy%Zy=E@v*+B6cnOkGu-eH>@TZh>-OEJqPTh6cl(Q=IIr?2DXtgFtH!>O-r zhu_v6Tf4-$WQp@!l%wKU3N0(){Fv8WwUwy+hZXgfZ*R|;YsjM8C)j7k(x-B#8|FZV zxPyqjpePe`pwO_gLN{a!ND=BxB$}KKFgN9ZDmxVk;HUrL9B_?HMIw2WX0Own7P5l` zG1_G?GDPizPD37*y@bL**^r$rwqFEegm2)IXkzBWuz9hY?CB@%2hVXjWlSC06Ywpz zM}6|ci%QJqk_-o@oF#&b*_xYgW)xU|^=^XaIDp&|EEEsy8ObZUhqBoNsWcCBUlbNa zPQ;mVX1S`=jvG?=0H!&eh$~rFY%~_%MLSm{g}F4anJUKO^owMMV{?j)6cL~q$yG=C zeGvL5=Bc2es=bj^CQ{Ldi5KPO7(Tl9=+Kz#*hp@WK8OO0&4n$>sS`_#c^#ZUZR0=o zeilX)wFy5epQk&@k2=<knlZ*x6Ipv1Bm$?Y+Eh?cQEw`1T$@wbKa|NN?xHtrcxo*- zt!ZikUmguk;(`i0h(4lq8PEo|7vT+<`9X^*kTE9+<%CUXY@Bl5c?adSq|dIEA81;_ z@|QH7ciw^f#GU)_t~y(h=JXZ7nuY$RC>EgQ8TlEIF$3H7jT@bBl#JvcIm&rw6p+GQ z!YHih%00dsj9Lq78{~7PGIa&gBfOY0mm3@JW8)p|=TVifPx|D8(;W4O8k>HT{(+-? zHP!n1f>}!Rz%&QgOSbL;26jlrXN3c~ki0a{4xFySz|4(}lXIZ*quRPES&p<97M=;8 z^&JO0t9&bbk@l)eM4r$*;4=0H_6LlMj2r+DBv=4cQOvWzoG*k6;lgi#9MIl0%Qvg3 zZ06OoXRn_#XT8{er>ZKEO!{_?+?YN4#YKw<LfM@83`CWZsd6S_ibs|3I-ddP#H`Q0 z9;W0L!NR2C&%PfIdioCK6hvb%TMBF_Dj(2|%2~D^%jBA^_UstX&6H^c6_=YE*Jogn zf!>8!r5rfORwj|>Au%Sa@8@PDXd*?HQd~DIJ6N28NDMSs;_DR_b7l%1@pmT8Z5|)G zaK+(mOS<MSU$$hMX?)@QuITu><%d@+JCGmBKX-iha<)1Dz_K=PU9}C1zJR-`u`wkW zDODshP%N+D*a4gcfqF1h@liwZb|6F){DCusHgZRsFXULe)-mIG$BY?{wdqrtn^7Ov zQp3I_^mHcvXFAr#=_aD?!=QQ4vNASZvKN7Uoz0)<mbr<SN=4viDjcPFk{HccPM;ct za816ycz=JgxFAJ0Qw7D!a3};>NXd!W&*~6pof$PJ_bK{S96u!j7?OyO`A$(>Vs0ET zS5Y9tBN7ml9Q&l0F(9U{iC|;0SCLg;hHOvX9Evv@!6%Y}5YU0rF-Z;LN>>+YD;A4B z6ICQ640djFv!Qo}Z$_^{J$aQQbrjQkmmgY|`+%p&<9JPYms{?CTI#2k_G#seZdn!g z(t8OH;Z-1ho!hdYj@k<90^Ecq0jmseDO>%s+U4CHf3(wF&z7KQir&qZH8<<Zokh#L z9d>7}8@I3dSyKn_b)ubSeY*7m5W$x9K5vcF?&w}#<Sf_G&HtNq`k(KKERD}%xI`8; z1LpeED7ND0rS&Ypm%^lrl0XejC`>quHIfF{Kw4aI?N4ZN8jQp`hB?9!hNu`?b0S~r zVjr_4x7UFawFSK}GO}mbv(K`b2hs<al?@HCbA=C6wbIgT4RC%&!L}sw!=4WQLi6)G zX(=v0mL%a5bVeBnFy}n%8wgq8Mzd5I`^i6))e}V^BxZB8!4L}7qpG+K^FveIs~F2Q zjbh}hwV)LW$aCqXRj;{s02K)602*!$Bbf~Y(G?H^Y*z;v<m>Wqi^MG%(Ps$aiGiTe ziLXBb!O(2G4B{)ac)B~>&!6$940Y)5_Z_Ar=GZwC!c5`!F(O0IE?;A>fxAOlg8Tr0 z(CQeZtK?y0>kb?^Ke1>(#pJQq4&b<dQR4jc>xl%Yvl@FqK4CsLo@^cD7pB-AswOsS z1#M^(DaKsq!#R1{D8-4+GE13}2qz5Kbm*fwBLu>XCswgo3d_o_q4kuCEygNXEyXF> zHZq|UgA|*lg<O@5rm)jY{j=Hlt$(wIqarkxjIEjoz=(}h4Z30S?6u>tk=b8>t^^w| zU#aYGmP|JBdXLv{vA7}gP~bE}d{K}L=H!flSjaZclN}ZgDlBnBph|yOy`*&gE%{FU zEVjL{@JNBJ@U&D|cvXSDu+!0U;E(%T9qd?9QJE~?!RK5TS+Fur5kJM7?8v%FYpz4u zs|pJd4{0krQi#`@_y6%gs{{3Czy|vA4$ZHi7C`P-Yluh!Ly(QBCO9$7GA@tjXicV4 zGk<pEv~=Vi#zfW9r}^=wk;h%U4wHM$N0@Zv-t=iv1+4W<Rk3Ftq9&>YD(FbYipPCm z7`Lh(LihxoET+i#OA!8$#g1J<tF6&5I|!v1=YQF`8{~aH%YZi{M+h>0GS*wM0co)w zR4g0LgUMPpPhF)}9#`$tGJ<WN@N*0Mjj$G`hds8c294sjBO(zX9U1)qZIBs3!|<Pm zg*U4oi)bo5CC>wfAX)#AD6G&t05%Xy4}!g8{QdVt{i!mX&_{?SGOV*r1U8m_7i(_Q z*^KnN8Qx717o=_Q7{j`t7vbO=**3c`eZ|+VVtbxvN7Faim9HJyn7;Y>9NMe}g!70j zOCN(Icd-D-aUOC(Y&Ix2#cNGK3fYhs>^5{b^gwyAWIZjrMvKM(_Gbw(VLd(nuGg1X zs+<kpmT@iK24|I}M6Ykwm$yv022?JRUs94ErJZA3?XmHnVO=_HL1{787Srhpi^_^i z3$(iNnkfsNq&z!I^TU)hoL}m+I%+Lwt>7!iVX4IY6|+U6VVDO8JPa+sh}p%=KG!~H z*~fJ)3VUVu>n+Wfu;az)6Z7qJHnD)cqIvbruN87yFKka)9ti1OScEAGA0g)CjRIw$ zsC=l;zy+9a2_t-TK{|RU66vRXlAi*q8zm2{sKcCt5&I%;k;A`801puA0&EoqWX&Ts zaA2XZTxAN`?2UF?2(zoIJ=Imh;31P=+f+5JwAx&a|I%qyrsh(6h236JUD7-NR-BQD zslQU3qQSkQuIY33?(tI385rh)7(6UR{XrCqOUSj&&aUR}p3~BH80shJ6QT$BjLu?A z>nw5dq14?xWgQEL!wW!&Xl!)AYeFkGw2*HVIu@FZp2);NtAV3BepBELttlwLph~Y_ zdh+muc8j-l{SE7RtSAe+YGfZ|Qwku3nshVwxw7P;l@r%hyRGMpo4tPh?AAp*I&|eq z*CeC6s-42qMC>TEqauXn*y?Fi$H99L+eLH|G7c9dU=<OFOZ|a+&<DZs2&0Ysob@^p zAm*Rl0eCpEwj~a@V6hL|XU%G7g%tWWM36Xkj375efl%p>=q{Cq?^>~5z@rh^<j5mf zfMY{u_e0br_c|wCC>1^z7mX#k;uA}a)7VrWs#7$r+DWzc(0ZRUROe!?noe6Sv+9dw zz}>4KH_qUzYq6F!lv}6OG#SRV<~P^0SWGosXAg0IW)_!uys4G27#kh)Fe4Ii8azS+ z!W_*1Ope6{)PJlF9HZ~Gg;4t>YM;$%?EI-9R??U%%^<nR6_7DDNV_Ack)~vjc0^(l zcZ=YhY<|#Q10=Q3rk<NK*HNlT0`cr*=|~TX6I?*vq%8#_NDNz&`#@5BvQ>=22jObL zl$aE~1+NGu%HbWHB!r^`>J{1R{_Aa-18>kd`05~_CY(M797)C^^Dvzgv8QWl7hTg) zJ*R7RQ<(x?({tJwS&pe4Xwv}g_%9`D&(Gl-&D<x6dq8-B&?4Tf5#JA5i8c@Ln`ohE zw73$!Az>AQdaS`8da#7N^XQ;D=vQ1^A-MqBt42yo>?^*-KJMe6HMn>X7W4tSCLcdt z|DBjXy-!jpwU%@>jtMB3pg`9o8B@;_#t=r(W~Ox5X!^AgN3=X9U_@>)^5(~=N3o|4 z50ej!rY(t{CUg*B0+h%~h69He-bF&30zt@!1{maG!I`rG37fg)g6f(lqa9SgfS=dT zOqaM%m`nGmm4pRUXR1Hlp&nBpf%_5(hylDR(3eDoVhSFjGAu@qeONt!&gl-d20yA| zrlzRt-!=MFOtqp81V@57!I9cQb)$9LcwgY0>a3nqTDqom95boT^dm5%f|*M|Ui`8c ziQY(YKP0tCBD5qbg1bOTa%AERPw-E^N*pA^DA?1wN&^1emO}VIp^8M8h=LG&2|toR zf&rogM4?bE)Ph(o<t!$xr-2&y0sa3@ELAa%TF$W&M_SpAAVT+Yj|5ffT@`9{PVWzM zpb)qKCm>~J5Yv$WN8lr%qP7DgaLGUk6;AMf3}T#ccmZ+(c93bZcq(Sd3%?Squhi2N z8Dn(OIHQ`<Mm6$hj_4zjepNzBLx*sXY7#@&pkq)t>Lh-DAD&T}1P#I&f&f8;p*AX& z&xM?NPU*easE%|G74dOeP8h~JmMW8_fGYh1bQ3CW@d^V007oRoZTy4k(VqXKQT*!f zZw=LmTElCJO410Yd$fWlZ(Zg&-Sc82D68+#k&haV01EvG+GHZ(7Xk^eV6bS3sH#e< zsO7jL#?Gil5dXvf**Q7Q45io)l0*4CPn?H%UI+l;(8L<6(7BTUvVc(RZ{$QAn{rV% zo>L|l(Kj*VMD<az=F@9M^FQ6#)D=5(@`6c*8#t3HX#ji@f3t--b)vfQykZChL!~G$ zI*zRvcw8KD`xo)}ULM&g?Bz5wS41pXNf@QIS)n8{XQ>J634}<i7(cG1{<bR{+Mk8^ z8%l<-UoCgmw=$(;F0oIFuSoEj&9J-x{xH7>U0yFujzUy~7li3heM^~t@<cuBv>&Jo zb>52Lz{SlCleN0^G5di<7u`x$k1QuH1(sqYqgi!KHD`4N-I%|~RdqyE)68sG5;$v) zW5K~HxiJ0CE1Rw>EZkFAQe3#VuyCut7HqnxwVE{OVo!0)#>IuUf;~t8t$eE=?roam zJcWIUy@Y5Zc(24<Gg6hI8o^l;bZEA-@%9Ps)<9479H!(wKe1Gq!){9dz&_sD6R7W+ zb8lJ63q9ps7Xhxk?vMjB@gQbe-ObEbccXZaS2p@(-<~$>m6dIKc$KBACZtm#%vq#0 zZ?cq(BKv5iSa_#sWYK8ilnj7y!$FQqxa?CInn0r?lETOV@)6mB*cTqK0B8OSITB?e zZw@lf=7<^jh+twA=EAcizLdn0dc-*pIRMOw0dtA~DH>ha;AV2A5|ih)(#8^@L?}eI zG^f-94d>a6ObkCT#VQhx5*>t%l447s$)z~LO9Ju3f%!dwK+k-X4eG{xzQOtP@sG9y zq+UqaM>Dx)=0wpLS4SqF*#f_K)>|dajBy_43R;8X5pFI7+K&7q1Of%&KfrG>GaR9& z>aBdA(RPz)t&r<wX!g*Da@#?ajl&=aje*Xw;YjC!+>%p$A+I;&G0M<+Lq3@}qG({m zQqhe6P{<NVS|XN0OCdp-EJWl#Cj$#I<fD;mU10b*w#GW>V=NX*V6rb3GLT1>m&IgY zmPjN?%^D74ns7!HC0vgpQjr2a#e85M1&^`GtIiZ(DCQehLJ+_r_~Zm_cmv<><dK3D zwZT_L<uV6GH$sbDpaP)~llwwZ1koYREdgUK*Kg@90Xf2D4m02|7ZVBVh)yM#ua6e8 zOhKAME(lQxi5iNw(<)F{sV0Efz<^f`n*?x?2TSs`ffJ;=0^t!MMst`Wr1)YvNYq)i zu<<;Cge6!CdvqR{c8ZS{M0_F-aG<yk;c+>6L_y8sT&Dw7pgb@mJ*)RZ|K--xm-~7G z&E3s`s1k;6F;S~1wTT22dKxJhL}H}C@I`iLEPLP$z=PJ;7e6gsdo6}aG#XN3;5)gi zQ_|?qL^=rh?kwwGVlbk{G;v%t&BY^;!NLB1HB?>L>X5H$n->_&ZH-wj#-kNRmOmJ^ z_5o%GtE(S?3P2>nKVP~?UHl*i%3?(nzLKTtU@&)fF?sLacml>{ZnvzW1yW)-&8(-8 zjnh%%XKE;lyMau`dJlCKcn=oT=SMa6MIGDBJ%3WkuS@RX1Nkz(e<~-!=GvyZx-}z1 z+-&=oQIR%kBqqgSQ=AR-m^w(b+$yJ5Ukw29le|rlsizcKz?$MHWo5t;jlx$M%S;Rq z&<2?ls~rDtMFWR2RtH+IO9~q5U{=o%2dY02hiB(AU+?@;vqFY?W4!@t3k6u(z^MPx zwMJCT!ny)%^cor|6>}nR=s<m=kWA`$Dod^NKNdkB#h9XaOPaey_IsiyWN?fkoGr#R zom78+EH+5do?!{}hlQX|5e-Fn9Ha;^NSLQ3iX{clrP@F`!Wgf`*Lfvc^Aq+g&>D)_ z2C;$>jx3Id0PxbHFTqZ@RbhC-)HX~53Xp^V!zq&dpu4@q$guF_D=fAwj~QmjRpn(3 z72e1F4Mln7<)v%2`Of<GfTQ+gS3`MezD9$gq+>?Y6th0hP*&5izr~`*Vw;6JO!_LZ zy0IQyHIMcVb9suaO4M336ER;TR*SiP5-r{kRT7a%Dn)h+HL`$G3;9b;pC<s7^I9Lh z3k7ii6fcs7Ap>7(AgUPx#4_b^`8nss2!927X12T#V5i0jQsfi2+j`;n<KY)#Nq26f zh!T-SBpO_ZpjYpZ6EVhQkZX!ggZq(qAvpn1hvlflBd9|K{D?vp%P|CEzG1-2XVQ~g z#7%)aS<v2Ut_#&Q!wNXrUD~s3-ZSRX+EP=<Nv1&d2;{Ujqd`~!E9O^CnpdZ<HRyyH zkhfW23DHN+rD$~;4yh!`Q;>P`M|}K3sxu)bvK}-1CL%p8r6B@-gW&mQ@FoarVE({M znS=osBA5ID9bE`o&Lsof^1nU4+TBy;n&+5X->cvUwG03tqK-migJSo=(k;GZ@)Q{u zkOI#KNmHT};Y<otPzx)Z!k*2<$Z;8#!L#MYChTyqC=nIwYjL!szwKyo?DF}d;MOs= zyTvhXoTH^S76Rc4_4N_gQlw+x_5tERqDSk!SkV@nn7Pnl#d5XS*io|NHk5Ri%*ED_ zd%*&53_0=39B7=WV^KhvfB|d{L;C_I3<J!RCIE@y7{)f2Gr%zkVl=q9oWYJkLKtM0 zC<G0XGeS`zXy84S4%O3qeTseKwqguSKSFR_JZwkkGiZeco{5pqNH}J!8gH*`!P2^u zCe*lBPOw%7w7$F<6ZY~c1{arfO|h2R%PJZtl=*ymmwmjYq^?A!EA@L8>bxzgGuL-W zB7#(~2VV)w2tpj9F+em*+>J-ligBU}BlTDSSj-X;@wJGvRc5vi(SUiDEaXS;D=2uL zhRslIb93#nW9{EjP3(#cV?E8wMj2{s4=k6Mm7t1<aQ4wO3=6xvY2wu8^l+eOdYinU zW#S6v%bVhBp4t;=pQrP-%_HcmP&DxwbD~BRM*^P&uh<CGda19AI$VwxLmmYO=5c5x z(Ah4(yBa=T&&c;UG$ZxW(OM@IgY7lA&#YhSddIeA2Q!VSW&C=_)@H~2(N)dnsi)XY zHy>8k;F+1SXebhjj%_(&yrTo7b0n>e{6N%;X21b6f<;#_im=H<f9bMuU*HXy02_ez zK{xf(PtzYzc#ZOxK+jx1t8bdvQd{S-IcK)lTAkijz*`|lNI6B;_<91J^EC>p5Omg> zJT^~J`^=KsD&7ZbFPi!MVbKS?EWJTg=`65gaq0vV)!1EBMs;B|W55_gm!Oa~H|j8^ z>F9U0OaV>57h)=+@Xtgcg=E#p&M|opLwt{q1}E|qT>4DDCBhAS#H(Y<a2#$G!n`w5 z2Ze)=r>3bi;g}LZyn2j}CE<M}{zfkBk=S|?cv5haL%I|nC1MH4W+^V`KuQ)EF5abB zF)s6w^s5dPF7R3TH$ot^sF}cuo`QawlM&D(4>%%nB1#4Ogz7iU{T9fWeB+ZkCy52A zLb<ueEoQ6LY)QayQB}WcR53InMJYu*5)rgeFcqvAcxJuh6awyxWY>EnQzm#TH1W&~ zY+6~Dcm@1Bd=3oNy@Iq^Gjijznsbi?8Xm?>OUZ)}1G@5>Ym^=5bgxjRHrqUq69}~N zI5-o8JLQ@+i?=JwyPKyfm>fs(B$zF$Fw_a4r-)2ZCefBUsYx2gdCS-W44DeRtPQ_k zK)s|`8z_7^#VNcdEVjSmvr{7@6-tgOHBL2(4o>Z@aP?>EML3{hJADle_Vl^{!lfV? zl46&Un9*_I{xqANI*La`!K;!YBS@xyfK<py2G1SlJeQ~t*x3lkNM#5T*&v+C23W*> z1HL%5f{cy`^dYS%B+DTo8;{D7w7;DA4Iw>1a`^N-6WoY`@F>a^vIKPsByMiO2!Z?1 zSQJ(zvxJp?$fn@M#^nPXX<b&#Ovf4D#wZb(sSa5)7LCUE9!A9!!nEiIkc$QK6ikPK zV{{NSA{2q$COyb4`&`2idWH`*h-G}r6oE?frh(CfeH_s;ZR6r%cmNZ&Y(}w5Vg#aL z*@DuLfpXWq`scsn2Vn?fEeUTo`jR~HG<wN`lL^-VPbLI;^5}LC7I#5NXgFl^u;Cr& z^xHfMg+AzrZwJ}>&jDbOlgx8M^l)xYpORZF9?s2g(B@I((K*t(oMeBY8H8#N=K7Z5 zhf`NaRejdvw^q*~jKhPBSv#3yF6|(crzt=_3-#py?L(QX{w$S(Rfukje>g<?MJn|U z-Or6$BfG~}VfR>xaSs{|A=G;hB9ddc!w&?bgmf*wcYiIVfJTEPY#tIg);_}bl;U~m z3ViY83Q9rtU8~`F{__1I3o7Gzlo967>9O}7{_6801L}nsdLahcU1D$ph(eO-pD&;U z3!wNcq?3ghbupxjv8w^y0wMoHMnQ%#ltHz2K-PYRpTH-opl@j`sjF+NGo(lx@PVpf zIX1V~5B9}F2h=Y3yShUP52$_csXZb`PN^1|5HtZ;uJ|Q116*eQb7&RG^a2{tB1sb# z;6PY|l730R0Z~!WSOz4V5|P9j157ZLjy{^iK^&w>x(T1}84kMi&sZxNjNar|q`5^w z5#xZ)Kl1%WY2^Eh-QBt0U;OW**d*nJA>|252#X}qZ0edi&H)hRfdx|ND@sZl?HB;n z0da<|6#^90H);I2va#iPoPT79<rp3!zW>?}P68T<mC&->B+6G8V2)F#(g>Wl8EwW> zbifWUR7=VuN|fbK0ZxBL7F}_T<xmJYhCg6fQRJL{&$TJ~vHm6~1yS4#o#(o`&`CLU zBLc;Vl$iNMW(F=_`3-o7Jj{qB<r8bFFtrvG7~d(yFME;jg=6u-K?*w=`$(jNV+>*+ zpegJW??DzR=5`ADSV|r`gJO(mdWCDafBAAoALC0-UEa^$dt_Q~`VIOT=mxeezjqpP z$i~I;HE$>?mU?n5FJaq<?u_tHc@B__4EGb9Ewao&tJC}ri`Wn<De|LOCz@~0d9TZe z*d`+W6=&obPA=p2#=WElC1}U<#m6<_RA7%Gq^Y0OHr8ixB0tfe<UjbIm~){;{x0D3 z>+luH5>X-2*#-9^=L)z0NIWKWFdpp(L5DlFu;dCGCf|TIG%l>r+>UqB?=N9Wy}cuS zrBdi+-%r1*u$c^Nh+>*YsDGQXvY^=g4x76q{R^ZC4VM*rr=RIxs)c0d7dV!|E56FM zDhX3n2&;m82_y<R#58-FrhpUphMhhqzQ8~uK`gqRQrfXbu2VKT8k^di+S{6pEmOK% zK#l1a#adsK6uWTvN~4TaB@GS67A%=g)?MP|f?q=LC!DAHknWUQmpV5lkU>gelZwjJ zLRoS87iFNPigHz+wPa7Gh%JpgSHaiGZb@3U6?suO9ylxJlwhKp%%tSjrAxOaCoRp# z^#9>VY~?K#6}PO6#lK<RJmaP52Ptw|^-JXPa<{0X$}ZF+)tQ-9QH++n#G1xrCZgDv z7+{5UA4%Gy51}RT`9e695L}2KlK3#Moqw7YTnvPSXtNC3Oc)Md#@V9CN5zQ?J#F;5 zd=!mN^qrz5X;mZ`C{=6x$XMZOGYuS)GIFK56MP|piWO6_js^b!2q3$PL<|JFL&z4Z zL0*A}Q&%u6U)9S-BA;ji^fB;x)w(HGqY<(B>Nl<|!by-_mqx9~*m^*a#}_>K=ax%o zevf}sy{*b*tZFT{TFbv&Zn2cZ)=!Ef3qOY#MwqdX#y|V_RSlJu4KuCf=~s9ff4P-& z$uKkkF}6qKb@~Fz$eLTUq6JVCGq6PHKZFW+$B;es8<)_<7u3L&K>7(MNGgUbo=eR} za=SDA^7kSMqGYEf+D8$5m>_zV0zKno4w@IIXAqAwIcDft-5K<3B-eO4c?&0K&k-$4 zr)bY}7Sk`-FLASvZnAz$E!Q7qw0amlBEG#qD;0w~f&F28LsvulG1AfhOq$g@d$?`Z ztTx(k&ZNxAu=;>7Q`HT*My6^#XM9H{NzQH#Nqj+uU>DB;B{&fwk<jvC)@KPolWaMX ziQ-a0$9V)Fj}`D+#q`0UY4U(Pjdm=+rx=cVp!49tjxTi_#5g7SF$5ZtB&!vlNAD#I zDkQs1{4I@rgc#Fj=Az+<xe^wZN^>GQZPlu2(eO;n-lzV-{Qa3iPeD#xju7%YC=wSr zNb%&+(kvW3E#bef57-w?68Rz1GkM5l&@vUr>=<)FK`T@#Ug#xVe$_t~l*wO#s*-Oa zfVoIqbK%Y)P_J-beraibjKaeA@h+clv4mwAWP@WPme)w6O7c^bD3xFGGUsS(Jr(xq z3XjKJQ*HJ@+!Kl==KGN)0X!2@BGCgoWK2oQ@JzKfpkzdQWr_t-S0*RC<9f&E$<J<@ z&g;Pq6)N>dH`CDI9{8nvUq!YJ7=2ZZ5FJf67zHwFigWA+bXiVW>Zn(7Jp0+mI0DlD zfv-wuOQW`8jN(fp+%u`RRHcLrACJMhw!JyNNM_@-Z+Mgo5_m84M53m|qc8^<i^y0< zqzz$r<OYPs6)PHPixXVJp%Cw^-|<_GD;RXI(JNY$O&Zo2&?V?IT+c@roOQjY7}5!O zou{LDlE5d7Vw%<v4>N6-n^tu&mSKUE;f8js=AZ}fQ{gTkF?wzH<<e)RP0}`6byUP& zSUc$3cUa0PgBdEEbea3=b1%~PaZinFSFa6Y(`BwLnf%E|Og+KsX~nJ*OJQNr#$4Ek zaH9xY0DCh}LU(#_H6L3SwrQpkM5^Om?1%YTH@(o4+g&coBuuwsv~%**%_G+#I*U`9 z`8<QQ{J8{JsZ>P3iu~J6n8h_gnkLPY7J{RlFKyr+Z_d6v9HT51>d{&ckW{FUp!gr1 z3Z*eA)i+3p)?}U$R8;8DkvY^>ind}OLXD}`>0>;OO~L7-l&JW8J}CL{H}|lZP-VE* zl6e&8?VQJNVGr0Xw^$;S*B<3Vo~eK&AH6epM(K~COG!NK8vfpe{5D85{5}EreU5?J zi8;~qz57<IM!HH`EA>e`rGrvTx>CAM`hs+nbT7H0KA`r$wFBtY=^1sefnTYZ#AnHp zHJji8%*KLjL^R<U@s8ZJifl|{K&FCF1+N9*?~uK`Tl{<v`A@8n0j8&Zt{`BsOy^MS z133EC3kFjA9!Iik?QC`RVn&d_m;NSeOvNSU@}kMO0fAiqAbMmoe_g;^?4PGQCHT_9 zM|e!wTUJ=k2!166JkKG(Jj9cBTP&y04<QbJ&B$$Lu%{oiFVScr^_z;><f3wONwEo~ zYY`iS8-KD`7|<FI*YY<73g64`EJrTaSnwNQ<%K$03c}pWA4q&vK+$(9HE?4#iyxZi z4EQ9MVGZkb(q_<uJ<>(eWzyBs&C+esz0$+d6T~aT$W?n%?JpH)MVF{oqSrlR-cjFG zQ>o9@t`J?7mxCig-fe2fiVjt2m7e2`n%CI8nImUVOyy9|=XVfdScFbQ{~Wbgy3go3 z4yoe%dD14HjEEF|gc~2>zywxc8J<V^%UvqUh&RQa_3+UmhSEZQ?_2!N?<|)2{E~Vp z$<M@q6n!Up)5?=x&7T56prBgfNDh3;zT3y2o{Or<e30h84|ym{^~s0H`$6H0S7HVd zjz~e;K?3|3(IDVr7!dWC%Y<NxuGGrIhgVK)Yo9Qoy^W=ixVn1X?se7Gcqf+8D9(5% z`TwYU7r@5O@=REtWJ$iuvMkAxZArdKwvKOOTb5@$_MFT;<4NWgc_xz!&Ser}1DVha z2?+sl+du-8n}(KMAf#<dEht^Kp{2B-rj!=KrBLj@mu>&_-hcdW>EFL;ciFD8&+~rg zNV3Nh=wD#}ow1~&Bk6qK`7ZDEdEfWkV~?Hdi|s#iW`9h6)6nt2dmiX$0N=E;Mlgnx znK#81Cq;)tFxwGw3a2s90myuz^F2hndWTW4__u5GQcwnL_U${q&)57r{~Khb_;F?A zu=!Psc>k&4>ZoQ|akIz^g#Q%XdZCHt;kKZjZswK>c)%Vma3a-g-a#?tT?p~}Q$8(S z$M=-;4NIbKAgWbDZ6&yd`LSfNFvv^&n#c3Sxi2EVru?U%>iyHbzAp6<yyZ#HUnQgc zlLi*Ecr~>2=Y<Wa9olG&-gP*;C0$2q3WOQR6_9y1<>3@i$Z%<TwXNaXbvFiYoI4); zm2aLHJCJzQQ+4W@y4ia?|DJFE(aBFD6W(|9KR!`-+<)Yy&j&is4B;{VOHDz%KjD0Q z!Y$HgPNYxfB&x9p29P7!QhjaVbIMjuza!eOkxw10+SU*D56un@%@(xgtKd(mYKFhV zPlh08uVTCkqR~*=f}9-)atj6}lbLAQlB~1pAF@$%6#ok-F~s&Ro4|L7@9_<ie;c~S z`U@;F^a3P$nMnp4=vjn25<!6FzXqIwwlUp$J@CAgvn@$3WDD5<HbV5SHcn8mfW4qu zKen~y%V;z&uFh!wsz%F5QsTAf4DA$EUk7YT+dUk%jf8P1SUu$E;=twd<OI-k2?sF# zrPHvNAOdV{E$SEVFoNw7kr{+82}?P2t=d229w~`I!t_T4H5;V&(%uz1yFou^fEpaz z&4ASDlm=9~*mw}}soGs+a}t=@nVBALxtx`w9>*Wi*+t|uvlT)sfo6j5tmpXcf=(|| zMR1e9cEWd>riE?BnghE90>ZyvZ*-NUdTI8`4jt0j`0tT+fAw13;(D+-K|LrvC@|~0 z1-aIDgdf7X2AeDFQ>Jn(?fas3Pm19Ki5|-9u<;agD<`_N#>bJ@nUqY?y=|Fdx~f?w ztvk2%3Hz0cQPu%dqX<2Lw5MJvTz6ES&(<6lPCT%0WU#fpt-bZ+#fz4zsd=jghQCq- z*I&H*$jCyVrKzL2wVk;)HFohU;z0m{fM}LM5EXb+7##=~34;Yc_{rf<suMonf#F!} zix<8Siwz$D{aVG@f7B<xaN&z`(u1+oI^ZTovW<E6DjsA+crjwm8-Vv6Dzvq_bsqf{ zATCx`3}ZzGt)%x+31~W_T*~LMsNo*f+qibNIF_(%+bhS`!{8l+evT%vfopT5zDx%1 zI?RUYbYK+pHB;2~Xk+no*y|B_0#SPtGms5>;CHOFpqw>1>T+W#R&h=Ji|F<`|4mu) z><yf|zJ09Y?nmzK7;8@muECVC&tp~OF>176Lesg*q9FNWIV#$KTwGgQudx_#_GlO0 zX0Idtv`MwjKwG^+zQ)ERHVJKE3c{933s@U{G(cs_0Ah}06sH1wAyp_SfXiXu<TI;( z6_67h2G8_TdA-PmFZV=@JT2AMJ=xZK_K4(Udyn8?*_tDScLg0D=(5T+zTdcDl@xVV zUZ#SSUg-U1*@kyW6tit)wRsp+OAj>t`?PbJ7KgX#q^xIITv*4NK*1AD;yCXVQi*}% znx;txG;f_$M<}7fs>Zo;QRtBMDZfWKLdO;STgHt0PTw)}QqaN|Mi|OY^&eDv@yed` zGqB>~7VX>p-i6~+2XsuOeM*l2t?b&OVvXbvRQ+b_Fgjrs$cgpl+Oq*G9F3i}tgz!M zC7pf}63UZU7v!W;Cou?0&Hs|0gBcm*@g!WvCjGbe{$K_>dhQ2%UGI4K;qvdQJoX*x ztCZLD`0KIz|AODHMkCOJ9)iaT)@~JmdC-<7?5!9eMS|Usn~RRwP+l0b_6TeWUq@go zz@tjz52~($ve-{~KRMVZ3)o$P6$efbIW4D{A`6fQ^KMVMR4nHIA~Z0N=XbS-oU1B9 zo`zxs&<4F8{P*HbCOeZATxowFoR!%bWJOZbOLg8le|Y{)zj||fi`UuMJvP=EA)<P* zwJG4~3hy6C+=0wKZ7uHTu7OTg2Vs909p|C{$m)+s3$jP1G7wnIyS*Er7l^!J&(c=W z1gn3<fHX0)5(cb7QyJk{(>=h`*+Gp<*Wh*B12z&i*@kqrzNxVz*xEGK+3IT#wYPV8 z!)?v()&{E%#M19bw_AK|zLwUe&VkNWH<Ge@JNi4L9qu;jU!TBT+>D+C=>bx}+NMx| z3Ihe-S~$eq@0pAjhAXrU{5(I<*m-3%)iruU-p0D7h_@-&)cm${*ZIAwv$eHtsI9fN zQw<IIJ)XKckH<f>d)8OyZy(z2eQ+V#Ju(+>b9+4Qwyu3O-UsfEh+aQe(<>ptsOzZ( z6F(qWi2afcEMTR}My|X`--$n}Bea&Vk1H@HQfK(mwG*hOMdsEVk{nDJaFVZ#MdvAZ zAobVP-Kd(KSCOj+6Tte<MsaIra=Ig%20k^?o$W?@B#k<b_|leME!iEa=@I3@LFNt_ z6yZ-gRMRQ&pz09p&^@&(R95;GXlV(cNf{Gtw=Ki9$&Nvg?rfK|CQn#Bp(AU1FUbXL z?#LPH7IfqeZC8fIP13u4f~+x7`;KqUp*X=+&DewSz}<_J+gj`q<m?VD>NP={QXQ0S z>!O&$ZQ7%-L$jzY3s=cbYlB(OVnj98%mj8Q#eiySJ9J7<K`y_9)oC}p<M0Djfui9r zJM#1uX}N@+H2Py8HzR*=#%swEq!}WZV70vbas}*#viK6a1xaD+a<C@{fsCm6o^S7z ztk_s1*Pf@EInp(kpfL~Xn8WYW5!7GGBbKOk_gd|j07L>F1)p7GpD^;z9uKcr-gi6p z>k)wzQW+I{a44~1V62z#(=BS0s0o5igMHmD2QN2HOkohwyC*?}u1*j1@<Rq5T<w2# zJ~K5n0Kp-t8ju+6l-{qh$Dk9Sld{=4t;HS3lV8epVm`6iBcMV^PX2PETkV~$dYpyy z04*I!DbPc$PXOtG(X5rP!{{&r)X3ZIo^wT}wo+=LHZ}BmNkFou8RTljlSR7`!&P3- zi+T@vwo1T@L6TDBg$goM&$J0=Rq7*Uf(?rGVy^0;7b157GN~=u;SHo+3d~hmw+K0? zY8CK`9?*yVR>4F3Ao{pQL}-HmMcb-r!15t}`kG3(6B-ziY(?yIm}soneI1iP_>|~k zp{bXP71%Q{oH3~DUo%=@yy?&gQZrp0F+j-@wl{Qwab~apD6m=Rt5AZk$}kBdtd&M` z`Pkwewb>;ROr~(p%2-_7zJ-xVO=0b8-?9hS5A;H{PAQ{QPUn~V_VS9weB>0`ukH}5 z0@BMd;ce93q9Z%dd7Hg3Q{aeWM12R@fHm47f;hoJ-2X26;j>w4xsbKO9xtA!fCjR> z!d@10NM#YUF_U%UAQVpFeI^8HC^eIPeQa=i-+ki)@u_{U?e-X+;S1t3{w+^;Y}j*y zoKZLGH~O1{v8jEx#Q4FWoL)_iE=+w~yvjMb%o}mRsn?G4d+)9J9;NkN4!`=Q`Yv<; z>`z<!_tN_XB*RP?l}<oDU>k+73!xF4lQnu`&M?k+AllKE;w9z*H{;Q1o*x+<Y>)Ms zW<$NRzo)0)S>IrqeKDuk<8pbt&TXF*#h!Fi@=$X_`&{qfV4b(sgREnyQ|oE<)(sB! z&b6yLmr|}ewbSREf$AJnkEzW>glIkBCt&o?;$i!KC=X|W;7x%FdGSiS+-CYCW3jPk zVq>wl$*2|c`5v6erBgVi^2q1)X1v8;?001<-03&r&0YEY`)~@ua#(4!)cg^=8;k&i zkxEUWT}kVZ?Va*YxibCg-pNRiDYkvXhsx{FWecXd?Zz~%i=~$wCC&x+O##<%!!yjv z8X06jU}g-+Y$>(c`|QTjH`R%*b2peP%Gmwv*jfPz_HTY`>BK7bLjk{C#c#160=mHh z6ot!x_M?~=uHGO$B!XS%T5LmX2eV5XMEk>9+2KKRl1PHOI1|<eKzRFmwH|KaL}=A? z;UN}F08p5G1||Y1;$$AAM@YDmhq@>wSJrgKqP*HDrxm`zFK!sXpX&3h18-V-ww=L< zy_u3MXh$#tu;Ea{6Fm<cA*eYAxkn|I!d3@mRxz_FQ3>UXQ$(~gjRb8ZluyZ&@uXE_ zO|9{^2)3p_&8JcJj6n*7sN$;yJ`><uOWX5u4n||)D~$cL^>N!8Y1gu^Q2Wp}uVlrO zX}Oc(;jrk!R*$EYq>tP$*7*A+Pv4vz>zsXCD%Q)#h@=*~{9Z}Xw^!`wb8@D(O8u8= zJ|zMK<NR0Zudw>)DQOeVM?3yJRs~|cGAIUyY8x7_j!0FEDZ-a^LV%Q823V>v`eAUl z0HxNe%Eja9=41F<T8iHh|3mfFE~ETeAb*jb^d(2!P{)wMH*OqT(ogvIvF4>bA4^Lr zj$f#@@=O<TTgQwzR9?VXK5N9&OL)g8t{&UcT<Z(abunr@0z}GT`w5bJ`>}0LwO0{} z@$w(k>&kO2Phw(K^o|{L>~I7fu4-kVrW13-)YpMq=l~b&6}>#fctM0)a0x@m;nGHY za7v_ZhDB#s<VnlmDD;D`-l=9fpFWyMu%2%HrGKtZ47CIj%Z5?kxd=ylAQ9+P&)-%4 zdid$<6Zd5@Se%y%i9pM6q9GVu4&N7OLBWwxj1{Gk60CqGC{+vgeGkSCyS`Rd^rAa< zx7_$-3W~p!f|LF*RT%U895baa5C#{e^#r={f@v-XT9Ez+&F9&PMo7wyqj-Z#ALPMR z6c~_EHjlAw!M1n(ysT~UKTN4!LEP249Bz}G{*)=UU2nT>*{1XAsNgsCm3~H!HM7yR z27ucHypt%vv?DE^I$cwo>nG(nj?sbj-j3I^y$H5<f#o7Ygpk6n9j>MtqA5e?8?y5l z+t~rtT{qr%Lrfg`*NYQBF2@5m+;HRP<^6@6$8)Qvq0w_w4&H#<Jf0j*+=j#4O`ZTg z@!<D2K2qbpkIQi!XZyt+KYfkg@jAES61A4Oe_J*PX7i?RQ`^byNTUkAb&EW2ttbh2 z!!ZqYwHvA^90a)JtL^AQXP0z3x~k=vbwAq0s)OAV_M@7d?4b-7?sidKt*)*j%&gH! z7)Ij78i_rDlo#cV7kSz+mTQUo4=7jGdfl3_ySqUzVe4W&^dRz%PVp5X3-X3Q)y(7! z8LYh08<|mdB;;l#EHcldJfg=I&ZZ@P5+RHiPpZ7Um1D$I)@T)4-XxaBq1X~CLh!`} zXZB16sj9sxG4$EbXqzQB@tl=!sH400ji>kbb;X+B*%uF$7@RyGNXL<#W;U~b=};y< zJlWTEuBp$Z8v2aT{=OzK#(lfv>G3YcD9?BGO%BI02bcC|W|7Y(o(`Ogb@eqd7^p&( zy;XfjV?YF_@z^ibu0&eQz~=$c0Ko}b4~!PiOwL?2qrfu4=77p!{z!XkYdc;vxDoEG zL;^Y;**o-Tq$B&qEz=6_7K9gsSkxw>GvVFRS`eqH=J;dJVbGttX#C<M=hE=FBaHuv zJ5D_Cz==CD=McHNZv^36w1S(Uq$Ti9cz5jB0p#$*b!yi>NF>t6K{~Q~LU}9?%boq+ z_6gY6lT2pxW6MBTg8<X*Ro5ko-w#wei`G>xW<u`5y+bcI@|Ba~cd6>NtUL*C9NNGt zWr+wT&XvKxsuc=>NS@3FaFMNT<q<qUYZJBStJ-52Z0#t~4j`kn!w4BmMxlBOg$<*4 z?a}EFY(ZtE@CINb0B_o1l~5Q(Zs$Co<Q6Q|JP0d?VRW`*33dL)mO*mWtl9uG{@7fK zD@8n0kkv?RY}-Y}7YcL9xyP=E%up#Bc@ECJ$9~DKXsnSf>sT>eB5T8{An+%IY>`IL zHQJw%c!aCg5Q_C6;=DMzurS&^G}O%pk8ych)HsyPCy}ZnG=F{}IkYGBPCSx04l*FN zf)v3`%f8f98~!Xr?12o~QV$?0DeIx~Is3{X26Qr5&;VGN2x9TdM@2Nk)$-T{dE66o z`*2t)_(^<}gH>P>`MFgow}FHMho^)ttU^QiY4vStM|KsNDp(#;cX=Z}a|C6`j(_4z zI(<{ane4*3a|^p~!j7Yy_lNi;t#l3>gb7P3eIqa@iLssYgso%a?_VR}adq?YS=e`w z_6(I2f<?K!3JTb*WA{zoGwBsc(Y<6^&EdX^kXEh-op9s6=(*3T>m{UA-DyXb{tCW< zyj}c8fL}<hBM9`)I~7tu<3-C_nnKtb!T*2o2|;jfMhjFW0HhDEECk@Ttb9<+XkZni z00n!ok`PL~iq?#*L)+vX*6tNq1(m%4C|_ky5CurOV9O3+TK?4}NG5Y9!9fHRxL@2t z@DNEtrJ&%<ztY_7tXux_a-GvY=)Uo`b7xN9eC~`YwwAx#>g?}#wyHhyn(gfT+s;n3 zVn<OClY|^R*t`9(R1oWhn}x9g^|fHL08ouSypDI_M}OO?+|I4n%bocpwzFDo+Ui5? zeF(K^pNu<09X_Y0Z`_%j-scSAe&FoFolK|x(}!;hc-q@Nf!pkZzkk<~&$q-URcvzw z_W!&60px(P4!T-*zjk*kpK7USb-rjGwKr~czJOz>njf#q-^GYZjlE<fykHViz`O;s z;j8F=UO7&iV`gSX2(zXjtFJzt{kvi!K~O@Cf<u}~io#X!qsF*Z>GO{YRb(T})}dig z4~~N0On}#eTf!`2+n;H;&5}iD$b7sOJDQvU>`_FR9r=+F+@z%(0FU4cP@fW+_SQ_M zwS6_vl1T(x0?>&ow7SVOFA3@icF#~Kl*p$OC^!nuDv%A~IUV>^<*Q8IfPHLQ(g<zV zG7Io0U1eqs1a-)j4OHKb8hNp_fA9X|WH8-3KsU;Ng#yFTsM(Y3=}Br0Y#CJKDcSw# zgpC!VHe{iE!X7}VQ#0Czt)u$7Kbr6E&hyE#U+ZYTubn%3^c)_%ZaY@#y83(A-leK2 zF`z^VXT@ub9Sc)LHaO{qtrs;$Q|cqLv)NO-j6_%O!iZsvESx`os{DW5c;k&vJn^J@ z?d->9XFKC9BgPv>Mh>07<<J-K!QLmHc!Fbg)^Qeo_DxvXI?xg*1TrFln`8uzj5b_i zxJ}g<X(9WbJ-csgetztZJKh)%$0l~W+h9n&uD#Ci^r&B`Uw+GSy-|PU_9OLYUU5hH zJ#oL=@Vuv|Gd4K(ifGqp5^d(t<}XyD;?U-xScG9z4ST%Vej0&cZSho*Q5p40UZwlB zv2c7~;)90UAMZYU2fM(od^Q{#8w~NB=L@lLZ1Bh{&PelybY(wBvvy^OH{<Gc5k_K# zZP1++XiZmRS5{$jrwpw%d8uG-OTOA>Aac>wh%2T})_=7%WQs^Cr~hpMU}2Ox9TVzL z)Ng~gwqRbc*s_^096`1;<_>vKCkRWzMT@gw7!-iK+2CWx;{K?F_%y2n-qyB{)HifD zt+=8eZK&^RDu1=D)jNI5<DZHCcZpqirmfd|oeMQ?`5_L<pYbNz9xGL;`Z}m2vE$lC zj6J_y1{b-^TwKiKZ?!6n9Zcm@&n_;`%-~V7(Kj?VO5Qp<OUL$WXZ<Nkn6*S*1##hH z$MP6<lsrNaz2*jm{H^x2k1dt2EG^1e<Z*3=5zj3$5^1rnH2dSqlv(w1F*^pWxa2O` zpf`&<>dz|V27ru<=fO}|B~xGi-fuweP6I`d&P9J_{(EXU;wgVT>@~kP{~NFw=M+q_ z{^<ASKkp5fpY}pgtI~ZfOI;;v4A5i>G=Htkp&E`KTS=bZB6<uRf93Jy`8;>O!|_I^ zL%jvmCWc*kE435S7O-qc`tWOjYtN)CfC^*N2K#~?G51smz7Y9Ok%2M`RC;EE9CN`9 z!sQ5Yg<54QIhZ9V6Qw&Fz2V0Cuv4{-)O+e4Ju@5#oj#+wW6J5Qb9z-nV?&_6wchO> zX>Q-`cMm6fJ)YKnPknPB-R$p8r`wy$*I)1$=3mbY_<gR{=}c#XJJHtMe&p4i-Mfch z^O{W9<#xH8bd5MYt_F8gW7D9oF4f!^3ws(|o(89@z9pP&t&8;p>s)&VUvhk%HGXb( zyiq-eyPtL34!Xx%gZX*Kn*-GaSHrz+zdtXXL7?v#00MfZ>8>TLXIjRP=pu|nhk9Kc zZX4XGM>RAwwb!?LJ-E}rtlvEp^5a&$?zZlZc73aX=8va4!^g&rrWSvCEE-8PIFr#v zS9-$VmQ1VOu&d7HQm(6R)aT=!q76?=bEn*ChualvOAodqMy{j2@pNz4-2|Uo!)U-g z01iWL$;`o<;9Pd)YKvzL(vc+!*<={hpT<x!O{*NEktXi+<aOCtTkBVtOIWHUKbzSP z<G@EBFybx#Pv-L~M9tR?9VKYBp?y*Guh94cg`1{xtR1eFl!y{&0yLQ839Ai62s_(> zBQ@}~j<au3k9N&W&YrxOnENtX-H64~iFn7^g`vL0#GV70T<~js!wcsCa(jE%OyYqP zdnV>?j$QwM8piQhJhOk#L>!-<?T9Df0<N#n2TFjfUqZVbGi{L%!8p#RAfAxlJqgLs zdU64A)e)*B_WL=f^Me<gU2jUn7Cz{7zV}V8=8FrlV_-*h663S(X$zTtcW9xmtrTkW zm|#x}9c|^$sMBOh>U9zhq^WEWe0~$Xf~E~igXnG`^j5}iLKd*3B*&Y-cO41{MjVOC zXzu_{4F@QKPDE%vFDcA`;f0cFzJ#4!YniL9l8x!4k{ZTkC0ZM=JmyIkKfpto06G!8 z1NRg_C8#q{TwjN32NVGfIT(K<y^e=sj!g$-M4k1Th`?$jg7!XGUNzB+(Fhx|AL5b3 zTfXNCu+PKlAB6Iq%axW&xl(QuuS+YrpuB-6ypUVh3^SKoS;9#~m5U<2M8+(<9=<<d z?rN}{VR+9NKMufYc@@F%<yC+k^J~B>6!;4u1k}Gk6ZC=#LK8!tQmG9*I0X*`{;H9_ zQ(+h(kSg>)4;?fP!hNagQzL_kMA8{Nz3a%`cON-D)fP?kCCVF-P8JKkTzbn}8jNW~ z$C{5n{&*|O1uM1%id)30qoidsJGhl+NGZO5?nxqbkdQ>ZAoo|P-(lx3P02O6t7b5~ z^yhM9>GxF^W64<1G*_k8Rew)@)7(gZB^gUT){~5V)p(nKPd`dpW%~E{?=8V8xo_W@ zR15|(`jpw;KT3PHZ!)f}XY?iW`u46MVAP9q0h$8PHrvnQ_&Az*bNZN7o!B(z&=vgQ z+-37o96X4oGW+(a6>)4NjEB)BwTLg^<aZ3?_4rCH|Dy&-ECrO0>~?Xa3gjuSW@f7D zgun!mVA)YDCZ4TT9DtaDE~gBU=}g>d3AC{Ts{je2Q-p`tnuj0`E+3mwO>JFWZL|q= zwH5Nq=JR;7(bmO4g0?P5(n07U`Z~HE4eO24k2s8Y&s~lg<idsV6srt+r$${8L(A-P z7&Am-;DA164kp`|9SL7<Khv8qrMjFj*AHe=%L;XH{86|Da?F9yrRM01Mbc(yxNTi9 zR~3=|q^pf?+SOYQjoky)SXaR^kX^HAAT=(wa#tJoGj9NOP(ZeQmHz7;MDMu1gA@=R z6F|!ChDY=|P%CT4$}CIIae^mZ)`KM!(cb`Xf^H8k3AqVoNa6{U6QHRU9lszxWRM$w zbYoq*p0|6hupDtGEOsKjhSOBnvw?XXsw51Yc_lZ&<X&ao_nM3csjEE`k}JfPoVQQv z=iYNSO2VmCF~4F`K}=;GzF2EWpm*#zcET@PJ3-GZIfsMMEH3UataJpoOwkg?`C=`V z6)fF@c&Pn&dVM<mX1u(ePM-8q9A^jcw*22>sn{d?)GKg&%f2i5yvSwfywf3QsX?rn zt0O1E8MH)Z;nHO{v6v=j(2G9uRMrtil0(B-qmkD@0XBd1O;RcJV5aAktNs;ya_JLA zd_lMdawNl$t&DfvwRbs!@|$J5Kxd6a&3rNgSOr8&qVXxPX>5M2>S6)ci0)7eVA@S( zIQP>@gfNI>Ujc2_o$h(FME7m1*fta>3+<5*Du&EGCn0{QSKHo`?k;aG@QWYX<Tj@6 zV3?76yB9OVbLE%z48goBBgM>;o1jyEu~JCZU^EH|#`aW#pMb@2u&k{-4?f3j1a&R* zt)cE7T*}9W77Vk1fI~VGifqg@%wI)2J>5e|>Bw7fMpPMeXCu##O-MPm?T7rsCq5i2 zKZV!MQ*liT^L-;D9UXXFn49a0&do)OJ6fETe5Ye18tszri2=njL7V)?KA4v6gMH}3 z?1a5ogrLvz1S-9CazJ5vRo9+9U3{#v3wVTS(-Px$siX|mB_DR}N$Wm#jFiOg4W$Ic z0wZr%|0T5~eb5wbJ3a1){O`hJbN%2<@>v$wcuDlM6>(=4&L156bt%L_wGJOJdIVQ@ z;(oN`=oVTGA2Z^|WCn3xI(~7z6npx3jGm*wr#=-xz@oh0z~uek!PW;KYz?XoiP)jV z{7;|_Ho?B3^;qpNLE>I1v@2d}Rwp%%9b0W^PA~mzYikMK=8^}0?VjgRV+9pKOkW$$ z${D;+y3%=&Uyxa6B!7lDk?kJ%l+eA3h7KJe2*0?!Wh#DuO536*EQ}yWb<g>Qh4b@= z#?yzIoA=g-0>0tI$i7kkH;}!0VI+2b9!?E)D?u=kMVuH}cmm&^KY#nKx2@pY?ah0e zn}-v|s2^D*s-J$vs#Qtr3!E4j5AEXzZ6UVEwpUg6j5q@!jB`^9{<K<GB}r7_x5caQ zi}Gxod*&QMMG*zM)`I8ekP0IIsrVLjjG$|Ms;_Tq9l3F+qlZF#PJ+qWHakjdlu?nA zEYOR@;}%J=dow7})zS-QzSI4IYBe<phMc(aClapsf5@{M9zg>Q%`Z9RWyBM?f<TjH zou5Z{=DB>a+KXa7h_(k`Dyu&R6{*ACL5x6v=3teAHAPf*@Gv2@VJsMEyHK({!kzJo zBhuk4H02PS9_8;0d4muH%)ANVAm|-Zy9NiB2M2d4@aWOuTyA(YogN!X-I^MLgbOxR z-h5Aox8W|thMQ6UT@Buj_ka<C3kOF=f<|{&7q%6%c~xhO8FiqkQ1-D$32>vzvF)P^ zL*7LR7kD&Pesx|ZDYq(tn(d>{oI|RvmmJ7AU!A5`+w-MH`=*|c8;Pc-gb{y!3S*;N z-;@~=sjIqL7~zgh$tkfK<jT<atUT64r5$5s<+7l!JTFZ3_fNfGHSoXq-k8r6_&xOk zEH#k(11>;tVa}$JHAD0YT*LkFt07{@+MnOrJDM6XMq9>?EcAqYL06OOej~Xoa5S~Q z{QE^C|CC{7($jrG=lI=6eb-xi&M6va346`~stHe7Di}tFfJ~NAR@M-P|L|{$#^SN` z+8VYE3UL%NmlBC!Fp;>FNv~ca-00G(mT2g;DnQC)W&jSp6yJcrIF%8lon)lYKP6QV zihBjZsaB`@OQxyJ(q*PMPfiPc-3QH_{t9?42VvTP?bSos9bP_1!~2q@Qu4ixAL%cZ z`itHNdJ2V}i~An!Dik2@kl*bSos~JU;X!2$F#HUrXrNyq_`5xL7r=?b>L<HSu9W&e zvKSl1B@dlfg|4|zEc|>t5?7n$i(RKq7rGvui}j&_ne*=rj(uXHycrL~pe2!Jvv(j7 zgF6kDD%A{Dai^iGa%Fl0fDGBu7eFDZimvBAr*v&CX&@^Fqf^Zjj$kM_PeE9q1nUF% zh=~1<w7=va1b}(N%U42at4Mw2Kx_Irj2bgdC3#m`H~<(L*aL1L+B^x4p$8mxLi)3U zed>7l@cG`}TaJW}7bAWxF12^^h|nSbhtKYD-*l6E&)Hpv`=a9AN0bQ+17y@WwrNWR z%!vUkY__)->zS%>CY9;^*mKG9Kd2)`=2I)efxVh8tsqpoWXUvu%R(2T4nR95c!VEx zhU{G^aD@z0ivaQg!B~_1`Ti*rx(BsP1QWD(nygpMHD(Go|E|ywQu$fryt$E5?Z1ZB zCow`$YqJpUkhEck!|%%syq#A%H=}{J`ufDp-R*oir{8TZKd*_SJpWdHje<&0vKp-A zLusTA>S=5ogoA2_qgn}2v}H}5=?fr;ShO{4PH4gspHAftsezG7E`&vde9*?axwf=s z!j9uuh3y7^p`aNInXqdwsgQ{=)0R4N>{jkKmF<N;l`ADhOPZ_K1q%hGe)V`m`Gtm8 zPbU*?Z6=f=!`a!k(bnlCR`W_S8rTyE95tfqVENIuV6bhg4Ui~($S)2H$>*KUa)c3@ zh-c0@trL(2#A4A$BR!WZb&W6%@DaY-;ZdQHI7(Z5As$bJd_Elce4zy2_*?L%#UDz% z^W;Tj5jc5KJt=u55BK_fy`e;79kamJH6}vxKHgBr9Ex=f@xOfF!~-Yr_W<sleCS!M zNLrY{qwV~8UW_m-mR64-)Jtv)c3JOZj+AtihQ_RVNFau=|0LPJ1jI$?MnQiR5JJc; z@xD>WfdVINURjy*g`bxUk54f%CDJHH{mb0`AFe|&m)21bU?MOzrSifef{kM%IMq~` zI~cW)F*RN<%9cpp2i9Ngw|#_4!#vCDhdb2XhGy6C=E%na%Kgt!=_Br*8w?F();U1b z{ppqlxBH1uzsn6Bq_HvcG*n;0L~C}rT?q{%!c}*5pfF?(#F8wnh>C-RG{B$peJ;1T zMb)L={KMcflw7p0U3)B2l<#IN*{<DMX*RBOyW#*ZFBaMJVl&d|*rqsjEd|n9O>GZ8 z9GN_v6J1?3i91WDr^|M>m)A&=6ly$_zx4XZkx3b)xW(~+x^Y+>-8)0PAV}_{m3q)T zdGY>Jr|!R~a>6MeSiExl_?5~Y+{D`R6E}vt$N;{Gwcp=?JAft}#&p-3ihz8?8RW4s za3SOE)5*N7Aq#5{MBU~BN<$>0BOgje@s9{4OUos?4y#<tU77;h)&{IFN`6rO<w5FV zA2ahf-pWIy0W1KLX8eOa2>)mg(1$4M1u_Hild*R80klf_w){r(D|(<wy~VGsm3%jo zg9@})Lg_#sblwp4U~}{3=7Hu?GqUF(N7||g|Cey)ax+f0U-n0uF$a0<;eza8%z<Rb z=@*_tnI1bANqR8`hfEqG&72BCWLzp@enHEs+>CR89>M3z+tuql=oR@BOpSIJkX0DQ zac8_E<%>^tif!C9OKFr+K?%Y1Qs4lj3=_R6p*Ik+10f_Np$A8^H_R)2b=<)a`rkcq z+jwL1z!3NT<@M$Ux*O{nRP?rq@kTe!;r;q$emFGH(ok6|963rzl@*_~@~b8%!!Fl% zMQSufDDL~~8%m{;?B=IMtux^jM81B?jX!>w!ERH~iYnuU{Iz{=0*8lxoGS|hgEXP5 zkQ{3LywIhX#Y)Q%T))&EAbQkU`=4}MqzNRI$5djtCHhSO+|9<?m1q)GD|0B20t-JD z5O(&*S60Bq;22=yUMH-md(?*dP3%WFM+Kh-u`@|SddTC2EK9vUtmfk%h<)G#vEOU< zN8-oF8sZW26Xzq5%c{{j-)TnT4P!UNBW+#hBZnh}DmUl+{iv}#w4!JfnvU0kW@lRv z;Dnm8#|rwdO>BhZaI{cE<+Y;MnVDCVKOskI(Il~<j1L~6j7zc!Kb3h>Uca7OCB5Ne z6E@?D?oA3q-5ZvGf0gc?0fG5J^zTeQ^Zhh%Se+^51TFe37Ob7>1d+b>*JOLmpF4T( zrzZOPCi-p>k=Ha~UyQUD13iO-J%PXMo9OMGc%?RKQNKoHGzdqnR19rw5N7EBv3D>m zdA$VQ!D^O;r|ZS0`iJwcb;<MU{}}xrYN)CFg?i`k=!j}k`{e+=wj=Jm5-U;J>-4N) z4T2m)C4!PMLw8It6td%;ENALXBO~7B1L*_HUi;vW8HzEfGyI&X{Xo9qvLZE<V;Otv zDNtu(GvRIl1jzA}?|tv{srB+BKGTG_&unBmhK?vM%J6VDAjh*5Q0rs#qIb-Rl{ASA z*08y)ME!_+?t7n^NT6afh;9za-X#tNfi#1IzUem@Aj=p%`>I~bqV3jhMx;rw1JRJ) zvAWFk6_ElP-f%WPV))uT9n-0VYJ#*CA1R()h@U(>-|qK@4_$XU4mSw(G|gw&OIqkM zs1Z1ooq_)CwM>3cj=YlHH-E`k&U~Q0K3VVm04I}E3zI3_1|O*R;_DxHUVC-`N!2s` zqoNVE-HN^<)@6Y8K>S6p!BZ@N>lg>ysit-w9a}gHvs^TJr7DEw;X_IgRlj;&D#|iJ zBARJTJoiNo`+^ZBeylc*535pGygmb6fR)jeBd^RL3LPTD`BE^5ijnY(!XT9gVFn|_ zBEfGpVhNVZYeos%)<Gir+d=)Vml=kp0TD-YFDb3YN#_BOEzl?V#EnUf04Qd`9a~Qp z6V>1OyMahV{<zX`#FveMZgZf!r2z_8_kgMY<Q>j3*pO13|Lwvh-zL_SpO1~!cg9BQ zBjmS{`jJ>?{U{zIF|jFz@Ch-m3yzT3b)vL|OSUm_QcY5!(Kc8J3~)%<hMnIp)Zf>a zO5YEQPS6+Z*>_~DWz-nGUYPM+Jx1_TzU%KEcLw{WjEtFnDxZE{i{3T6p@~uiWV4D) zvSmkDBFUL8TLJ~7DX6UNuqUc}tXcS`-VF%eO?iV9D=S+~EdZ6^ar@#YkHn84V_40O zdxaaHc=RXn_3e#Rr5{od7Yfg3RO#cv+4r*s*ZXI&(5m#qi<O6QoSDqZLZH0M#eii| z+m)}pCRVB2c3*8z*2e;oNZ=DP>+Sx7+j~;oORTcpL5~`WnsL(LObgQ@1xGgRQqZRH ztV;P^3-S4H=6B7<7f#e1<NUTW`cqBuZ7mH~S6G#lm5DRp+9i#qpAuf8pvqmB&djW& z$NDmTWAKiud@NgDT0_O$zFp2z$+@dfKm%26lo+!t))<RgpxCG73KJ=k`+-tzWfNeu z^uSg1(IRpU8DA5fbnaRTX}+-f)S~F5<KIsqCAFaMnKH7Vu>&25_SWehJ$7zQ=sc6! zpq`n2arj#;QU8bA5|UK&=(O1zXSsm<Zk(4SrLh~uS9c`U^d^7wk`MgGrq|3!l|&ww z8PX)72fRCA4u}YZfeG$NfDwSeCAeXdnW5|s*hz6!e*ePUq26%kKw@tq(HZWoGsenG zV}|kc=hxR8Mdo{_sCA$E0OghsgnK*d6N&oHUNzQsaJ2lls&n*Uo4>HC6+^86*4oQ8 z7A4GRQ(LNHTrMR~EMKnWj)2Sw&DRp3ZrRKioa(f8Y#?mTGMnem(41|gPo*bdIq%M7 z3L;g#l~|O^a#%5)8-^Iqy9U~rx6t0pl(LwCqNa5s1E(rYa~0CQ1#uzR@5R`m%*buh zjc0qJPTh20IB{^!f6vC@wtd&FudXgj!@llhqA{Ir>~jx<e|b3WOyHk0mKF&-2nk%< zw}%*Uv(?580}|-C7gJWXaR-1W1{uR{BgFX8xzWKfW29yDNY5@`M^mK1doi87L+D~L zlev_+bSaauOy3_LF|+BO&b|)U*xg6kwC%h6D}$MtWa4}RFT|4Mz{`rl%eLc$FfO!~ z=?5G4auo33D|e;~4;r$THYDX2UKnV!u~dmemMCQFi80C8=#}>B@y0IY1*7i2JQOPy zV-F#a_hBA9jBgeY6TGU30%6X8!Um34YqenJGJyB6A0&@z|1_?>ri;0*FRfW<E?#9F zS21}NNRfrrRm{=$evp)*I2Z&r_M!YQs_r4`Q?ZBB594?C?&AIxD=}m{xNoyz8)KtZ zZ@3|5|NWeR&Hj`97Uz|zJEOq6S0OjNlM*8OqEgw?pT}NuJQVwR{epY`x5xL`HGK<M z+Z7#*t^ied=%JYXryjD8a0>0#)T4u+T4Yy-3&m7UUgR4zNMA3~EypXYq^jJVR_Qye z>{Z-d0e+BbWfd-$exi}U*ZJJz<e@TF$YxhcE6C}q3M=M@xstw&b4xgR&FdgZ1%52+ z5we_I6D%A)>lJe?y|MzxU3vu~bK1OulQ?5ypPP`cN-$K^;Ld`un!E8ZrDi~$Wm#Ze z!DUuO<H=#Q6tU*Cb*vIQ00u8h%wB5RRPbRj82q(7BQ#K6Yo5uk*Ri``Z?mswU#IeF z*}U}i^l$gdb#$(T56h{8@{BoHvi7Q2oWYPq;-mI}>@76>f~`%e*H2zPl$@r$CcVF9 zr1jRh!*}0(_=r9Y9b!B=dlc9jtm}{BYImY<oG+{tt`TBpQeFurJ9zLJ%>TiI>fQ2E z{#|+D{`)BS*`2V_$nS`91E_(&_A19gu9<`K{04dcl00wQZvp-WHP5`cVln<u`r(>w z$8RzVB`FeiH*h;3G=Ai0PHo0+_>%Em)c8|o?1qh(95}*vX^|`F@3ImjQCdiC0wiJV zhVL3*x*=A=fpTozKo6Ep=}39lUnCL9a+_DXpz1(}aEE!Un|I2(X&~+K_v<Q;G+i~Y zTp*(9UUJ0b2;Y7P-^PE;Hojf0Hb_j=pH{vtWd`q*)lL8ApUH|~EPusnZhO|@Oo8@5 z%Xk<N2<$VgRxUo36`ABgdH&RVd1HRGeOKaOVpn_luT>gFJ(Z~~HS&CR6cIX$qoe*^ zZEd^!<v-5l5U)s1Y<n)4C6h5Z(39ZL^9Qq(=pZq{3kFa76w?Nz5Fh5HZwFxUp`pFE z-ug)JPEwFNgI|mHMuNemU5$-DJA6vjpBldP*4IC+KYRM_$w#Im>2v9&U6Ia61b1v( zuPCz;9a+)Hp^bsta@i7C$33lcilhnL#Hv-@aJ=g*3%?G;CRVMv3KJ>!l}(eaeTp1X zK*@VUsgAI03VVMk$KeZu-<^0Z9=i`;I3uJvcj55viSG^;`E=nYEk1Ge6~*n>=M7lc z=nAcWeBi?2y`%T-9sT=(3+-~j4~_0Ud|{ycje)=Cfn8gjGPJEF{%CL%be$>VW!+>L zDHA)S1nJXd%{5jNebig*;uv}Ib1!!VHcvHQEKN5-Sg7M~Iv5^(<?59y%=KN>g$?}s zq<q9Vsci}CnmLZI)sjnA8OQ)O_D=16E<8PrzYza+Y_+_uzah_9W7W24_320JU^Jxj z*XjXv3}svf@VJs3*S^`{#yYslPWM^>kEpc(Q!lD`jm2_`^=wDVAU66<{_N47o}*d+ zzSXK_Hg6P;On43)@Jt*T{IXT<Qjm1DvP~V)$YQ^!m@LHJq74@RRJF6@m(8cPSXk;n zQB0=;^jYr>c(!dx+omw~YZY~wLM?+S^$vmS=uG2q#=`NcGGY>WF4X!HKhfIpg1BON z-v0ZBUJXQhaRt!xMoq^H4O!%BQBJGgd#YdHQDWgjAsR%q;ICH&LEK8XWR5Q06+Xc- zl^L21manMGPH$1?8wBEu1_pd7K@Z^a?2sqWW2(!)scPoG8?)a>?Sl746UbJ#fmiz! z5L=4B3aJyqrv!mi^(Bmt-#*^ZGT`dy=s542oAd2zoF5yTZ+v!}Z(;n_UE>XP&Hr(z z<Kj@q>wSCo`gWb-7f*3EP3%36N4KoVm+esof^`Pb^t{EZI{`rbH5y)q)C76f-hF!3 zN5F@m{?Q3cJSbmTjr^M9fsn`O$iDR1g_9Qn72BZ$2)It7ZaVB_7f&wkJOb4|==tA+ zK4>e|HRj*{vOW56C>A`=zO3>oK9bnEU&TgWDCBFbu8l^zt%)?-;sLT|iF4v`9FX17 zLtN;f<vUBJurd+m4ORz7g-(+*lOPQNV*(HMs_%I`89)!adz!~yIo6zr;27bM_o=?} z_Y(QV<$SR4AM~kctGji-&$r*__I2vt-2LQYK7nssu9+p~X&#`ofXlz!IJiirKz78G zcGbG*gbAhax}EP;H8GNc)<f;@)iN-+FTIsw6T@qTxL}(EvJixW_z$41_8O@-iFOCA zu9`avvQaf&o7c4LpY(ZBbGP{lt`-FME>y3ziNya9ppYcR@=)PYA|2SaX6m2Y`d6V) z+Sm*k9Y8!4s*pca4Um7OS`t|0<yQY}|7@jy`fBW7sd_1d)v$k#+Dl=*<lqA-Vh^{{ z>NiMDoFoO%ELc`}L5fMVwLmk6h>0q{U2)%H#(IIl*UT-M7Y<Jj$Gdtni^`}R;ygxj z-Z3w-ZZjwZJWZ++Yy~WuSJLDl?pLC-!dVLZXgLc%+6)BOsi|nfmmL4QE+pNX?Ch*> z_$1!tarPchV?2WLAyZR_Cera(&ooZQx{!=-veh%<a(_~v(Vsd!37=c&r!A|nCiozD z4_1CwuqEh#2v->@U@2Hbf*#zv?#^bqI5~NAHaR{xkxQ@ZgZ$*=W<Fn<nmjyrYwJkM z{&Z$=JYT+oc!!$zQ<J0@c2!rMRhPBYDTW{!r)2jN*AfO>{0uPZn6NEuaK7Ye6A?%& z0PTZ+Z!PpHYl<@VCM=iC;LLHgRwe?OA<YMqL`hDOBmxM}d?(lt)*HkepoLMF|GEug zx>oLZXZnE?$ZaGp0(Aw8w}2#ZOvBgY`UrBlzVpr#4<IknW%>%XjN|`0nGfCsO9CLy zt|kN4)x#R#EQ1EQIkkAG+}g89Pt;oC(~F=5MtRl1e;sn&-ddIql-b%|Uf<X#A|M2% zeDl~PRe4<K0quD;SQpDx1a%KiAlpM!Jb18p=<{248-1@q;h2rEjAc<{5bF>tAVW}9 zC_9DSW^;7QT*?z@3X_MYFxDx+oAiuagXbX2!M$}$WkWr7j#a(ly+~-@++gHUP$%9v zG9HWtZ?2U=t^@o&bWdC8x;uWw+sYrDd#rH=@zM<~fc}_0;|E(mvm^iE+D=0&gyl)3 zFu;=9J)UF|esHf<Z(|TT9=ctGV_4zwCbgDd%cGvbW~qNt`Q@BSUIevUN#_BTB)?cy zf1`e`dOf*Z$eVS0Q&_%(UTET>&@WF+h5UH@oKF>6?^sh4zVd$^{cK-M?UK{}iF=3M zKh)Q^TsQQJ*Y9sOF>^Ze)GD-X#=mhO8J4#dxr&l3HMrIM#$_9{Dl>1Yzk{?Xw(UXq z`L#2c*MMUuI};j&1sY3?(>SI6#@pC@;`%}~nP2Q`I@;MBDL)AOKz?K){odxNXP}Ub z7W18jCU^Y>5jaY=6t!MyL3Bp&FS(wc<}EEeOGMx@Tfj~(Z^+g68F`48a&ef_fmMJk zQ$pWO$Y-Czm7Ayq2WtBn!m`R_YZ~!lvR0D_@EqA^sC}-0Z#jtTu#I%AIbg|0rSdbr zunB}jF^_h9m^F>J_ydeGYagLfhl~zvyfE3!!0!cOnhL|*45%QI9ECztPEIQhJnH<T ziBs<n_q%&s;eZPH`X{C*7D9Jj9@^^x->Mtv+}G{t=x=THc9fPAW>5Hy9f>+ubJt+w zSbg8woH3R9)>p%E)Zgy!_BJ;4ccU*kM+UrR1N6O5`eIF#_(ISXiGx6lYt1ms=oko( zD#jOI6;1X8RG=;9-yL0;J@!RwV8;>j5RKjxUra_H4fM4220F*bPoR7-N0?wC{An() zQ8QW!f#hZLWXcU$;?AyxxD_!XoxVcCp+$!(+Ey*5)64Sr6xtCmmqy!CmBSrteS}$W zJ>=f7Cb@S=Kf+wN5b;VVdhXC=nxWMIf*AEbeb|@F`3@^%DF?y8MisLsL>21~xi^C% z=W|7Q=r32^jNOh)=#yTqnvYc)K~-(kf@V)uFjqufoa*&;J?M4_L)Cb>e?@(1UK7pi zbUj*nO<1c+L_x`Jry?xukgOLEwbT}cnK0Uhc(}A$?P|NUXqt<c+Pc7jZF#aJ7&KO7 z0&lf(do;n*?t;=M{SpWg#^TM?roU3J6<_lo%JZ|PInxw##+qi#@{0+?XZWKD1evi= zIXuyLF26tjbS(CC{;5lxic3$)I1`!kanL~KHAKC<Nx0IGTad4*nS{JqUHJ5TdgP5G zM)Y{p+`Ll-?l4ZiaB_2g-Wb6-oVw!<<HQNhnwE?=vHJtqr;zPLDh_fKQh1P$*s{4G z!MRbi>Iyz7c($`|OU<O7vqfAacZbWas9nhG2%$`+4qL(sBo>1hLNr4R7w=*XM?@}0 zsD}XP2E_wm?O7<O^4tq5;7xh}w+Ol*aFG&0^qW~VZ|&YSxY6WmPIMZnT}_9k%IUd( ze<Cvf(5MPDO}jdM?Gg9=u1(W5?-^`rTxjb|r#kjVrsl?5ch?V(<{QiZMYVQB+M62x zE6kvzfI+bi1*xG1f~gr;kcF4x3Bnl10Jc&K3QwEl7gFxI;gNkofAmit#LX*bw6osB zh}ZB)6vgpULo>L`i2pPHnYUm5V6@YTA&4{^LIpVD#4l3bLpB|(KyhqMkqFpE35p{$ zcUlx4pCGFaJEc}lvxwyQlA*L^BfSQ;Y51d;mrN7jDYb5zh^#fuyf_`F(gamS{Nm0B z@=EVgdftfHmRe$rDQEs_Yiv{Qex#^GI}qrn3P|I7K|R$yH*?_JW68a0>DY(m=&tx? z`t#-GuD!{}&K;PU``Cx&^=^)&EdkM|$hAaJfcOmHG7N~Fa1&Han;V_*3z+Z=l+YJ^ zTdDxc-tqLUqsSIFfGWM@xK}m<zGGjT*%1IE8icjq>koyH0N2klWh(SV@2id<f0g%( z#;N=7zk&m`h7(^bFV#Qt%p)~ARvpG&>VFRc{L~NdW7zM(;Eq*{o54M2ydNwrnfvbh zp!dwrORvv*&+J)3{vf1DsQ=)eGgJBwxO;M<xzNf4Le*~d-($U^TNq4=YkxYow0G}P zz3l0AMs6a!Q$=`g?xIkFTW5z-2poll-f+AQGgQ#%LEK(4MOPH4bJ9*dkyY#04SEev zWGR<VJe8ZD%UwSgJ9_?}BlGH2*UufD8oOf&=a&v2nvR(#4py)E1Zajvoq$p-;+G$a zJ)3(SzPT3r8uc)-io-b2CHcKIWyI{IQeq9jleS!mdJ;l#8RbqP3VZ{>3r{J%MZ*+Q zu@jP!zUHy9=Kki<vF5%=GP;_+AruRBAYsm0LvtV;3xVw~1jCE|sCQt%8=(oN7l>T^ zgpY{77d+G`gj(*T;p5I0emxleLe$^Xv~OQi6DyWAW4vrMr?*DZ*ZCc$5ECv|Q0R>r zZZPaCdAM-Q_x5A^dsak5y>&P{jHRMz*N`{(Pmb|aTrV%JmjtA|woZi{VG;sd&dIrL zZ%`gV^n5!uwNbRP0rYJW{&e(h8jv43gwtcjM*kq1L>7|Db?=|er@fz>-JdP5&pymh zsX-vOvG+II2Ev)lNKDCVcwi6C*?*v|4oBYUz*^E)(0+Q_u_MK`!pahCIB7K!MyX%) zLe?u}X?#Ru+*I(toID2}+B!IEzE3V~ASF(qp%IkjyCwsTH~V`GqbKf(hYh3esBYWU zb+F5Y!w|n<n#==kVwT7;wd_-yuK{*CQVPz*_E|{P%n(Q-W+VewPyy3`utoW&U)SNn z%mYS!_0X^3lr>3;xF(E=O-Fv*S(tWc7jqHrziPT|CSb>7{PD55mOpCg6T9?V<@rCp z>jGRs+LN<B+}nGfz%6tX>F?u{3-3~0mQRPa8`{2}$KJqp0b&;cm{?<ca3x?Bu(l9` zWRPrO&6pa6k}x`jxc8-K(Fg{OmC0jGKB^PGrel*({Q+RKrH1FRuC(vW(l@g^T%A;7 zszc?*ZX9FvIlBP_kt`MR!`bX`KD1*qRx2gxIjbPR%K(CnJYTl$oPF0<2cQQOO>PX_ zS>?azYIG`(@;K#QUNaC`dRyo7NK{|`W5d6<>vz7Q+{k)Vy{XRjcC{z+d%L@!>#q(c z=DI7~g7xfmy%5KM+(#A>lG_I`EV9a=hm}H9`#=O1wCa7P-G^gm+~uzyaU1S4kO|tq zy|VpwQ%h4Z^WJw(p1l`4r8>6EK?Vvz9f9B_U<j^mx-xf}mASc<xqnyFu*{$uPbRNV zCg-*{X-%ZqYPc^;$n(ScSCD^19!B+zOaQqeD7a_f{-kbZ)q6xPeAath4J|E&RuQGN z5?T^9A&<AL`N-GuI?t_|`WtKVZQPlii;|V8L5Z}#l1V?&N(lN73~Ez4z#&;{lNF#E zv+O!X_BluEpnvvGSB@SMTgn=rncA(eZ^R3A5Nu<kas;?0Wi#Nc@l4MtEi9{$J`12r zIy3l>mJZWCtlQIcI1Y_r7jv!HQEgboLg<P7A_B~QAI81{)3*sVEIQ)RA&;P;M?D~_ zWizAcN4{5c{KAoeXtF7B<meG)7|Z4KvN67Em%1cC)mstBZ!BmSls^7=w6VLnr6r1& z?#AeHD!yk=9Qk@E&(+E|70zL^r?0;1QhDtgf(u_C2cJ%!M;hU&!&=IubYBF0pm!a< zH_daHeZ*!g73S8+%OEt9yy7ovuJ(3e9;?<hX~WmD7Bgx{Tr}vHzU&N+M9M_If8lNR zIKE&W-&bDScfDNo&F7X>-TegYMK{~i3~Wz-n@Nxlf3~+d9B%$I2rCiBZ{%RJDhPsy zu|QcMG6_VhbX;YY(=*GGOj^A$T;BZiCMWAMvaYG^fu%%CJ3c+5*uCJS^04i%wr^Ce zYD>PXP3=!E07kZP`SP|D+f~^&Y*{U6Y-g||%zpAjksbPhnB}#dup-UAadd71`TSZM z(s|@pj=jSly~k}O1AF(xfy`2%0cu%8Gc17SO~cUM?&)a1u966>s(E`LX+cxLjd)?J zLH0o4#5Rr6<`QwIz`hngcwheJ)2EkC!RM#I?MH;$!|%!!%gKS}CR&CpUE1(v(vY^m z3-=S&ay~jRI60_36o`n@61eQ7ED`POxa@TPRQoRsMxuj*(Z;%Sew_B7ZFJ*X)5-R8 zjg5`x+GN(q<^BPqo`8%iNC-Hw=$^nLvD(KwW>d$|eb1O{jvw4RbiiB$pyJR-Z(_K< zZgtKWNe{QSWV#WtI$gMlkfB$duJ0Wi?dzDXMVQ(v5PCmu0up*3NWYETw7K?nP${{1 zf8@?ce@nE6d#`A)raXg_r_;S>Yx(ztuzStjsWsa&giS|4uWfAawb~`XwKnr&ZHsTr z=eJ~FtZmLr)U>zdj)}8^sc!1~-SIbhvva)dx@+8VG2J^n+?)SF?%0i8&y1N8sY$5` zj9#0p!1*<XLc6kemY%#}{Db<yfB%6`*6}-QdPYg=CVUXWKYo5dp83^K=)1Ljtepwl zegWGlB!twIM|3r*W(Bp$Li5^lqXtEk`<YO9bS!+`*eEXj+L{hLi4Hs*4v&uNN4T`5 zQEjOuua*cn=vvSVE51Q&F!D(|`3$XJ<qffcmEuT81IAoMtZ18uDSV%jxbS@2XUVI$ zQ36mGDz|?`fC#y}{az>A!M>|qkyow7+I6>Op^-<_{t}UL+t;y8(`&Es3xfIHa;1O( z#7T3s9>~0~@S$OCWWzw#D979SAN=XPdw=@D{`a1|e4*vt?{2wpSz9WoH8M_#wuCSN zEciM^9sW=`P6m(MKCu2^|J(G>e`Vs9h5Drf7cQUF7pc8M14mF_fpz2uw_j!8_9H<x zxb0F)^$WNBa`kd<^xvUgauSP7AHqRqAppMsZK3)fM*dEa_v{SN>rk!fpod&0Zc-3A zn#HC_+H{srr1*qK55`A+wZn_OA)7U%989d`K7>qL_m6i31{$5?nSeVO>fg1i8})&G zk<M6`uem$k*47h^bo<&u{jGIJdrr0LbX-oy<9E$5|JHxs{b--pfAe^As6H7Ct(|G= zZftC>Ywip;wSoqQ{l1p2`sVN-B2gC;c439sSUXx69jaeP1LL{Z#*u=1K!MJy{I^7e zQDzygQ#iF(bea-P^@!f8Rz-sq8)7&CbA&fBJtReo7oRV~NoSf^tc6V&!At;8z+-cl zfw5JN%a?8J0sScC&+zcts34-bC0fX4&b{QQb`1`7ROoPKJ;)s()@r18D)B(WfsU-L z8L$RI#Kd_pQ7KuEHExR5tMMqvqnSmgX-(7^|Ij2H$&ygR-g|lFK;&SFjBomnU=o*$ zvB5$xh|s|YMFEHKZSTXKc2PEo1}asN>@oiI)8p#gjpx*d<q|(7My-1ebteaVu1IV5 zXmyd2v7vqoW36c|tS8wmIRY|Mq=w<C87wQTL2t;CyzF+e8ErMdYy^M0nlj*UM~8c$ z@$#Z~@HCSNlq7!d*E!u0%o3*Tx9#i!u&^}T5PU~#un_7$D$z{*Ql#&XL_RbtJn0WG zgUkrXI$0IkVbcs~X^74tC5B%xt794uAv^3-7oX3yT{v)O*PZHU*PUHDMQj=AVITNt z*Tu=`-uzvs6Q@u2o`DEq^V&baI-v|Jcsf+#t;m5kZMWNm-#+WbLqU|q4Gq8HEYPUB zQKXl-v+H@bs-;|WQ*zVlhL5AU1e!&Q{bCvZ1I%g@?y6TJUvb5NIDV%lT_Fc<OSU^? zDSVLP-FbCBT5fg0U=-Wqfp34i@9e_#KOI+*!LIS_k&_q4{hhJS9`zaY<0ra0A!eMs z80c*{tA5QF^Oc|ab~=L;wT~Px|1G{g{=kXDS${`7&@+afooh&RJaA%UDAC!yaJF_- zwDm+r9|RNqu%!WeJhC{){{7i~;rzjnuVy%2X^;O`SNPG>HG}cS%J{Q_l>-$@>o6K# zXr@WWBrAT|xSeb$*o#3(&V<7xbXoY6u@njJ0x`@?i^5?YGs&tYDf2U31_iIc+nK?o z;FFn`9Mj$PZQevQ9*ZWB1Nl1H?B!pOmz-k4E=XW$JODsa1&Rmr$?NtHcH_H=*4Bi# zwf?6AEd`<l3N(~hN6)PzDflAKF6w6p&{eL-yAqTDJb&m@Mc>^Cl|#E0z$90p1c<An zuEC7npe{RQ5~9EkFbSVCjG(Jc@s3ylL?5iEk@9z>{&FR{GjFaM{QJ>qG(=#VkUxmX zB_$3(Bi`Z-wX<+k#>J9v5U>oc2yX(_B#i=xrNO3$H+vK5gjbnj@gt52DN~qw!~R^7 z@^y9wDw^6RTBk1nQl%Z&ZMSUekk{w|L%cOH)rj<~da)W~uy;&3guXs{jgD;T39}J^ zC)u&fwrx6qg>7>Pv4zMO{IfvdX#|CR#lAsn01D#%`8uR~i~-CaRjDn&ySMq$CVWt> zv@y}^=M87<TffFF1An>NAgx|?vn2$ftb)g0>n^Wu5z%DOim#Pq#hPXZOi1Q6W|@ii z*S~*zq*Kt6w6y&4&8-(>@6N{Fx$_+sim`WPW7lesR)ZRZoTADpK08rF3G$VAN3eTf z=hS<<E*#F~GK;<k@QBMBb<6PN;S1(c&RopIVh0y9y<Mp8CTA#X+S!>s*y&R96aLw( zD7NB&fjL)vmI~VzL-yL?J^Mz=o0-M^6T#!7d(IJbSa881yl*kH>w0%;;(A_F+lAM$ z0^voL%!1qJJ)fy9F@q?P#P<3!I!*=pKP+ili%3}@MO0EL03kq?p$O?KM_&zN^mU$< zI+3~oam&i$wtuv-3MdJG2l21GIj;P*zouoBF)^fgUdFcC=m}USY5f3a?x3<O$|>j_ zX+5YO$_iy5u0ThWKoWqTfn<Q0Wz=aH&e6U8xx;h*z1ACFXMb!QEO9*6-|1ssnjCgl zy0spFP;aZz(+^iis~2zTTY-t{kBzxpW3hfl^egP67Et5AWA;12|9Da<4*<2vY&e^m zq0Hn}f9X~AyL`Uq22RBiZ5_9pw<gaeVt(IhUBJuJK7TB6E_thYYkO-Vc4`2l6%-$N zQKK#q{g-0ZLVEilmkx#*&#w!w%w+oWTM?GQ8n`94rH#l;*vL%Ig&mQ?7#K$02fV$? zL9f<3RGTE2bN`WiOM9!ikL+D!$$VPZoEKTLAX?_SmLjR2k~c9ofQ`LlrS=M-(H649 zm@cp<amgv9nh`=K#AO}QI{vM49S8-3cN@|*Wb79bPb7i~^z4VRemM$x=z)2R0X^1S zCfeKTRoT1lLg3Q77`$}XM-kD5S3d64Ts((g@%|)(GozDsinGvp`dCks`2wumPoT+6 zS-&MW-_@KJS}AeSehd$xXo5=&B2KHE#}hQBmmExdkM#E#342#Dwn%c>Fw)rt2PVZH zh&hO5ITl(8J<p0^U>2%~Jf6XFiQpKFD%-ZllGvR_$>oNcw;<4b1j07+31IoD;Okyz zuB{<;vjvaFCO0p=fUN>nlS8)z7_@{<QMHD0jN-KT+ni0T*yx-%k8#m!oqwBX2ue~K z(qr7*Fn-k;tPbi2_cS*Ez}SMP=5kRK$9v_CoW}mVM$~D~Gk+n$r<lnG*y#To;!=4e zYaNuD;i+LtvJJ6^V(NVSCC9_@n;(BX_V}OkeN29O^OxQcdk21HV$ExbhS~ynYHtwv z)2FsGZ%pPC<uT666|FRCl@cLFp;gBD<N?*Fa%|KdXRL13`V*#wv(}c(C4%Bt0x}Aa z+Hn!v<{Kp1CT<n0?N!-td?On}<si~zk@ZltAk8wB<^Oj!J&RAa%BP~Q4??H0tyd7R zDN;|X@l&5ZH6+{q`Hq&Bj+SqI`qZaYPWJwFc-zu}@uqcW6Y?Eq9ew3O6d_#HUn<t1 z&XVw@Ut^;zZzM-6sGbcWd?69>pF#qiQ~pSzv$wYsZ<i1dgN3Dn`qe&df6MyO64$eB zTVgiS81q`fx&$9P2__6C!4CVDP*+86$yQ%sZ1M(rUSsy2P};ky8bfVup|*?ijG(zt z)P4SBzo+@I<zPMI<0nWbh-bO$-JlDCD;rFWxhy{o?+Pg|5E>fKOw5H2Ozuf0_e>s` zo<Fp^dt&ThwrAJD(b0puQa3FuV4e+!zDB1=r3<(S>Ae@0AetjOV$N_lzzZ^~O-eH5 zh%d-FF*Xx45)q?*sNRSqjNr`JgmZcFKxl3v6OSL7pO$7HG)DH0g%auRP^cSq%f|MO z7*2KL!CgJsgJTojT?-30rP!IRD?v0Bo7=K&AqYEZDku(gjrajt=b5<*c2Yad0;=K4 za-iu7p#(w=NMfeK+5+<1r`u`V8;N({-qcD`1+ZW-|1Gg#+;F-(KC*!9=k2ek*GWh7 z+#@;1jQT3*ay#20&Xh9_+m07az<2C{BnDGGnJ9#YY*O8IZ~T=*6Y!tqXX2x&-StM@ zPp0;uO4v=a^K$MtUKzi)M~)^22Yz;9aORl20e#TBUCSbEmK}n5Ck(9kY2*>zOA4T~ z0{{joNf!M8n0I(c$!TqJV+%|L$p0{){RAMoSgU}f0e#C*i9rzs(&+XGqG*B9=6h`C z90h(O56B5hy8;~px(i7qjiRpfaBdiW`0XjUEb%RK=&#E+a9Z#wpl-E&r<aPhjUlO_ zAQ2BlePl`a(J|Sy+^m?F0M08s{OmbzgAX*H&abbNJFn9o1`xrzlyF7YcnbzTB;V2B z0IkXE{=S5BxCP)hIB%<vbSOo-C`U3M6s#%ihQ{2d3kB%E#%7_A$1Ib!Xxr@%V(G2Y z0^4U&vH1b|CH8qc>$y!7)V`4fvVi75X5u3`J|(7v+C3>}epAl8<d8SY&>|0dZqppv zq_FywUfirS4I<+O)xja$>MTrP(b4NVkTxp~&~8gKl8!{u2c#9%*3pfMto<0$zLu`8 z-lpEJ_odTnMK@G!hxY>y<955bTjEK<vcLsuZRe^vmd)CKTTJLK`z$`jTu^o+4RcH8 zAQ%t4DNP<>;}Mb#Dg;>+!l-g27Ta#wL-W~eY-Ap>)o(a!E;-LY+&@1W&91}VHX9#- z8SL!BlIzS#nK{Z$qAgGX%%YwUUe;I4^>uS)DTm@TMa;0vkq7sHTn0)m)^)|@2;+Qk z%GGP9RD@K!h8lHiSY0`0<jbk1+~Q&>ms>=YSLT=^QkO_yeI=}wK;^gj%5T=~uiCf^ zZ4pS}rxvTS?OIfhxEpMlrGkRp4+Q8gv0N9q3pCV#AXw~Lz(2bTWKhIZK65n+wmO%T zBPsFmHfvW1qqD44fz4Ee*l4BEsNr$67E;P)m8J@S)LzR7Vh?VnZ>e!Il~@_t*sOIe z{T8-Wt)~}7Z7|@_owg)c#FZ*y#^%O`RW=*aItCcK8ifvE_so^xcS3*(i-4<<B?uR| za?UXg>i>I?Epd;7elp;YWKl&X#H@0hPagl&B;2r*ufJVo&cic&{J%}U`|i8nJ^6af zpIyPJ6{902XNwpi$HT+7-PRJi!ZE)RQg40hTia!X(VqRAI*bctdL$;>_R}1ar>d5k z-y<c;#@|&g0V-tgW{t9rK#J(cxd~lOVQ>mixqj?w07yNA&Gn;{Y#47sshO<D8w`b$ z*dMq%oX7jAB;Mnkz3*>3>hT<P4bLa`HAY;nyIroy?v~RnyBj;^6N&kb#*;@~uA`nJ z&ppidpAxdL-W}@>jy%~hJ9IiY62#w|hDSy=h6Xxj*Je8ghSE6G9s3;4jqq(=Q;Vw9 zSWj9(je^My`ngoBwJa7T<~Ri>`Bv;($5$|umgf)@xo{lk${U3OhneOx*4SVLFMNi$ z9&NqTXg=<*US<}d<V)U1E+;GkDO}gB2dF>(0r^lA+7G2cAK*$_2l?^tKf6sAC^jsR z>^UWCdu+({H2#~cnIBO8B|Vp%pwynM{r((?z%cgwc_9S34MZ~3?01p@LB4BJP}R6- z|7?<#rS*lNZY_LuAFgVBVF%cKwRH^gPRM(^{VL^YgSH12JP4N*GcGaj5{*?z>!Y1i zS0~n07u({Yu&)i3{X%iyEuRuI`L;Z}zt)Bv+ih(=e(@I7EC7aWNq2=Cz_#FYkapGT zGqNJFc3>9BsA3i01^Sl;Or$0waXtrjVXqu&!mXNTr2-&dU@bw0G3=nf(m|6B=}S?n zga%vwC!RA+m9Eucxqot4=|!x0P(`Krm2D>@iR?ui)MnUea1~tQ3er{jbGh<HPLh7Y z+LX^Doj3V{vA!-snovbk^hF}?et0{x8ar5%vyO%%gvJR)hn&e!0+4s|UM2QI6<P&$ z7M8;tt%p1?O&VSqRKIEl`9z*<+lyMnH%Pi#Bfi^1Vq11XHm$oSw&0sRIXgQPjl8uw zl~0I-^@i9&Bsw&UkA44-y^)B~TZP1x04%uL<`2)#Lj6k1H%)>;w75J)LHi#18S86> zUm!Z5GQCn!*2-`sA)J>-7Ys;n#=_`j-Wu_To8WkueLPt~oul<f##wD({7C&M1#*C` z;Ml5K3&{5&ZEW{G*nP3blfp0`s_J);mMW$LBTo-;Ptfu=++*wbLbE{)*e3p|GWMGn zRSs^b`o6PBCGGXVUg`CAz+RL|0dj!1$t=<;P6Kj)1G?Gp7MZ7mz^w2senO>Io3{Iv zH)$o#xIgT223>Vgm#@x~_SDrkM%~V!(-l^VA2{97W{-SO*IN1D#Qxiz{|o`4by4Vq z)9<PqbUT||-k!R;o;pvH(>++{@~iqfuWH9fb<U=GS9e`qx3i(iiMOtHm)BXpcKiPN zR#p6GCnO^~qT04TZm~Vuo3)~7!I#9@lP8pvOlzHEOE~pLJ`ZmauKeS{AabS*r$gl5 z5N%1794Izp(rR)=u`Hkzd1mniE<IKV14YYIcZ665l)|#Pyjsn$5=ny@!+Nc-BC66s zooFneWZtmFdO*_1{P3<r=9-fZ2uUe#ZqLqvB;-gD0#U)7*`9;}iO7)_L{=W}r-UP^ z>k=TE83a0j>Q-t7AwlVM@Es4o1YP%a5Sn4vRKZ)yUsiMHxoWj7nZFe&cPB5W8)D6N z?<S(ScW`Y&FTf@M&&{b9LDgaBgH(y6p00l6@$@3bw6MIKTb}(yPQOS(@w>|Z0GsPw z3L<EA#H26c=ix}fd;ytOJA2rdHyniSb1;^L?vuSft=_-q9IH#5+Y=i-vH)%9$jA*a z+=>jZX%VG>A9g14Dv#H`dRT^`%4KZEZfgjtX}Rs<t{MeFtzO*Sbr8u4YE=Z>xh)a5 zNOUJHdSU_U#S-D7@u$S7*PBtREe-3aiLFqk1j%Z0n{b+gEHyNv)Fn;0CZc~z_}nOQ z1Z;E=kp#W;erEk)m|X4u{uIse`ah*JxAia+JO5J&Z8M?W#87LsUn(!vynE4h5o=5X zXJH)(S4u+(){ulp6n>VJhr+TnYWqfQ7oxpSD(ax@7YX*3P2*L?SC96a_4Q`|=&Mow zcTKx7^>d9oU>tb%-j1fG4um?@t>^bf&NeljjqJ^@K;<`e>QH%(McN@)$P?l1-99AO zjCxxu`$I?8z<OfG(s%;_i5lM6+(bAX1Z{ZU%Bz^iADw<rJC4rm{lm_|{li(oreo2n z)B=~CZ8r&XQ_xN*f<0V_;h%xHa&q>CmBflCIlbr9sRvK?de$k!oSeluzo+-)gQrgI znNA|bgcCMeL;XJ1j@PlTdd(V+ifzJ7IyOgzPFUrqq_5zl6@J?BXM*IvGU|03bq$%I zuija|gh#-iX{a;Y-chBl{n4|C0T@|m>~}XD^CDTaXSShXw!S6k@*Zn&_j|j&*ZKe} z$h0KUtmBB|1muEgB*H?Uz1RTI2dEZcAK<Mg9EP6Dmrynv!ZZ30*#LKo=TvID%u<m7 zFRFyQF6QzKwlsU3?!5@iX=@n7nL2kuUHhXXm%Em4#19nxrw(^#ooCwZ^fkIu9?y{1 z>vMXhJawJ!Ykly|S}CX?W*E+y!@6Jk26T2y%+VI(*3`5%(alW$5{ruOpNb8QgK*Ql zl`}WxLaGE3KNRZ{^Hwf*a-V2^&=cTBQIDVzom)_69@#OwAeC^a5L&LA9~zpk$t`Fa z8!)VXbLgb<o*cU6)<=+6@L}W}e7fv_EJtz94a*idJle6P96<n8eXO>eW4FSVz!PCR z7AGK5Gr)$NH;SZ`lF&}9S9H`@+MqU}F-G+0Mg*gS1oG2KZzhG*I9a%F!%!%IPu(G* z0JA|P?@uH$_TLLz(MPCc0Ax&|@-YssyBdmw`}8|5sqd;MaYVnIuBw4Oo26YpNK?7k z8JI*bs~&yu!QR_$yB`H)ibnLd+j<{-P(AtNlU)}tqPDI6_x6hyyPkYf%N2d%p<;$~ zM4y8nG7%26-~MSgIVG-_AyKCY1k+9B!;d}pgn_At)&2UIX~wQc*5&w5yy0vb+J9PY zK5+**{T=T=tUo;5GQd1-1D`vK)Hui;hV@a+?!p`tqli#FM5<lM`RxkIvXGXwgIsrl zrgxORWL9wICF+2kiO02HSF8EXfPuTuvsM(!{-wb?$|#g>1UivY1Q@o?9OfLT8TbN% z3GeyyK6RF+Qg}{p*Dnp_4OE2moj>nQ!1yTN@g~$h>r1RJ`oDMot2~MrOW<B?%?j2| zLVzVnuPyo()2Nh}HiG7wsUf`zHctElwm2^jDh|}A>@l%@3@JoV&r!p&$%uZnF{8HZ zWmCu*N>gM&AgD-=FRVx{h+$=3o_|ijtFL(Oi6@?W;sbJ~*xrf+M0|RyXiZEV*xvn^ z9RC59=f$Vg9KQU-b03!vz9T<+OrB*9^}Z(U2w`V4W8jYX!GJfF3a02uL)hOo{NN^J zsEo>FGI?WZ2T{AcIWt4G$uK@Uqa{5PmK4hI31H5c{RHdW7Nd4lH&U1lItX^k{id~! zP7q0D8p}H?9#67y&<#2Q=zV1N5DUpmOofXI><-d9F&9EDO{4J`?9#_#^T-9VfC{O! zUaF5zpJQaux#?K)C=(1H9XzwXUS?C&5YGb#_6(>pD^hpLUF!54sTr@8sH4`QU?DUt z>(N~YVzW=p#tt=%ykR63KOdhHma<Br8L)=t2B+gtY!;utc?2KFKW^h5P`DVt2TItu zS8|^M{O;N&+fUnqvPlJ_1fZk1touV8AN_hDZNUznQw3y8&MXcbxb?s;kPf#vT8jWt z&YZ44e7OGf%=p5>IJ|rKw~53zAn$l8e;2onk+pqtR`wU*?T}LeTgt|cAavW(CreK~ z6<kW^H68{p5Qc%}Tg6q&n`HSw{u3>Ou?#}CB8EU;6S@IxP8qqXtp{f+S9J$_ZRd<~ zT)Kq9Pjp1IcdkU*VTJ?PC5Hy#p#)NqO=(#gj!JkeH`yF5v6|aamTLrMu1JU}U|}fJ zdjK7P`v)?S+)5VnsZ&-5^XC2cG_*7hxf>GYD~W~~)zWa!ZJth#7CGK``|T*f^}awn z{$*!fL-V^DSc{AIRuZ|fA7fXc6hFrLeBO#iS8K(`DBE5rYUs5Q_!S$i_WTowgfave zOl%56Y<nzv!;H^xFyRloMIUTUC+LEIJb`(ohmpI48h9!j<|wC7Vka;aP+yNd|Ek!H zA38UZi#*&p`s$%qBjfb*ua2Gg-0NO2O+vybUD^65W7BFf&{n*w=Q~f{H#~gb$<FiV z#DS8(_fW&~9rcIqol$Yymug#g|7|sFXct-qg(+ZOiDrhE%l3t2fZn2|DMuBM4|oO& zECGkX0T0$TfK_Opj74sTW{q{1orE<3zd<4hFbFwHT5bnBXtosUnJQ%Wf9TlBD}LFg zucK2szUk>6o5+L*+Cquw#6)yipvQBTHI=ptfPc^uZNtpZ1R|G#Pn9NNR5QDLdE@fs zoHGAsb>ALeS5>CH*IMVA<fO?-PVSd;(p=gkO|MBxDQya+l(yUoi4_406fA8A%2h<v z2#8P-5otk0WE2^sh=_;`gBTG}fnk)f9fv`NVH6$8I1GafGEDfM=Y97+XP=V<{C>ah zpRegTXYaMvUYB>h_w}x|>BAn!hwpjY4*d@+J^DnAdcW(%pS&1^#AD`pBB4Hv*G&i? zfKMNI%{Ca{E*u<_3$k78uOlOZ=)ys~wCOf}&6ByAz_RU=_^k6+(`ls+0!O|Jj!nNi zz>sGoWFuIw%3%wUlOTb`W<oq)aCTw)`8bw;Wen!KJY<h)#LiwWLG?}^7@e5FxWalZ zE#^V2f0eX>SNS3?uu$>#eQ@a)pZx4$rh}Sv=Bp4(%XiLa!FT(yTDSz--685vP?<u_ z4f-lhTfhaGF4c2>oX)fZPnOsUF5Ef{HNT36*Wiv5Yx<fdZ-xqjAi_R`dhEvlk%lt} zB|t<&E`V5jkw;3L1gh~D-VhKeJk#(AO5g?3sO$ILg_nJkgU5lxh3H!1Fg;wzn2{UE zyJ~=@kkJ26-s`A36!inXu?V#bNDw&zeygX@A!Gmx##m>;Hfi)dbxnOT^J$FJxK(AX zJS#{8O;Vq&Pp0ChHCEfXiNqd>JJwk`AaeuEry>nrP7{eWa!VbLwu|C0d?1}v2b2ox zpX`O_O6#H@HK_h=T28<v{ImS2_ha24O{LF6SP%9a7+Q?Y+9fSQnxIMZLS;I+tvc?? z%{j>myD(XMEWfS`r<%T+)MqM_XI00`Dwo77lFcr0ZtbXi7iECvrd^k%Z2<z5v*q!E z4}X0YE1kQ6IeZyqVSN^^SeS%NMPQELMc^HveB`O(IHyTB-IdZyphsgReY*3+@!FEn z=}r?@OH5A-(4AHu-UU~m!49~g;Y=)0mY}7GUOd7#H{giXTjc$#%fxMIdQXsdJY2++ zR$qatwtm|S;=2SI<)y?RZdBhB{*hPx24i{8E%p?tJ~%WSN;NmGAXD0use{>H*V2gv zpT@Rsv~tM6O77KOgaSAc6J_qjfkogpjTQ6o+Al`%<eJ;`9TZsn=}T;0wdRa7*5H+| zfTU_RT(K<U?u0IcY}Uw&erkX^kcQk{T@U;Lg9hhBOnW?Tjz4^M-R8cAGaC9fA60$m z_O`#6)6kb`8L0b@J-vHYHbF@~`Ji_^h(~Wn|DoI3w)YRtX<xju51iuIgN;IB9GrO^ zEmDu7$i*LA0t>f}-r6=kdga3L!WGMpc+i>gwokaZAS-}4g9a>c!k`7Ret~ViM(FaW zQYu9h@WLzc#*|w}w}KT1m#i_6Cg_1+PZ0M1|9-CkWnBic?f`TQNMqgoQNx!@#k)cC zy3=EP;_QtZ&(@6{c&*6z`@c|I`-S(zt)gp$6Oenei1F-eUf~4xL`&}Vyz<H2RMCxS z>;CmbAtrfWC>R;@&od?{iB)RA=e@X^=bzz#qw2jA*g!bBZv<-~2z~cIs$o-4*c&`U z>xotj-{4^o#WcBhG_&7~A2@IT7SZGcpD1aCJe4i*&tNYPUayV-yWOR&jG$)|cv@qM z5YtgQUI!imH!t?uidCY61vfDhBREAu((pBTU}OY3{EV6rJ^A$L=QShMkf0sGW(=fK zOr9@5>OCS&Cd8RVhn6=98G(Oh_vpUS(QRX6+$|&*z~^GP_;nJVpf|){;llqgdWDc0 z2cQn%53FrB-d)I#{!o7_txY&2YY|xEci({n<J%{93$XbtCsiV@!cXQk#!-W^cv;hK z77gZ|5Fjqj_bEsH1!6YRG6|cJvrF!|41;reiJbfSHNso0$?%E@ySpL@1Cm$rJ^eNN zk?}S|INs*b#{vI&!H1!NBH+;Vvh`-@CDBN0Wv_nAt>Y~%<NU(eZcP6aLwYwowQ23z zP52Og<b^MbHITvj5BPKqhm`3dUxt5KT=S69@a}<j<*sK4o1E+YeXsQ~-S_&xuBrPg z6)XGe8*+(QQ@6db*<8{b9jxqIbj)~5<8VdaGqp7XJp;#lqNQQsio{ADH5XajP~X3@ zB4@jsVu>4@C$DUdE~!j!TDzjZqJKCsFl*D=gL_xh)Z$EQ?gsw<d5tKrmB?@8eUOFy zD&%Z10ALNMJ796~rWL$|T~@0Mj=0_qoiPJbIo-Go?*?haMFZw9fQ;&l^B`TQ68axf zIelz_pC`Xu7I*_PaH&Ck9U=9D&I<cvMqrtz8~1TVzE@Ynpp_IB!Nf-Z^;CH^Ee=P2 z9<^0LpTHSFX<uloZ)|^|g)#9xV7tZCYN<D@2e+MoCNFX1gG9X2H3GzuLuJ4r6Wh17 zZ^v3ucP?8~EAcGrHf<c-c+j%rI%4~_Ww%$way9J<t{}}B9X)8{amyC>$l6ixt}yyH zU<K!JEOyR#*G^)i7*BNHjdKMtDuwTa&>eM!9zEJ3@FmvZrG`Gq=YvIz*Su_5Gd@QM z5%!JutQPxRkICA7aC6ha2RAhzyK)mE=nZxv`9W-qPEm_gZ8+|G7Y`DB<F#~*ufU6W z)kPjCW&s-@!~6A`MI*hn4Yg2|dS``Jlo4_|zG!yyLG|^yS#_1{$?QLc7ngq}p0mI@ zRhbyFp#w=VQg~Y#mlBF41@%;2-J=#sFNPqYDo_Eermpp2qBGbH)pznVYkoL8i<#S} zUHU7ur@Qrq>jyxY+77hh%ITWG4)kfO2gk|a&41YY1`Oa1<#ynKU^iFUlxB71!yhKp zd;eZ24|40tzCP|o@5^4eIh);s&uBK=m(7~;OlGhql}Xj~jc2pj&B)lixx8<jZrnUI z^F6y<YXLgIf+r23RUWs|g%9V0^o?EEu(z>ZGy$!18<ds_Gd8mSfUGd#b_C(dPys-p zgW#P{f<pB@!QDMQgY6dou_rPX>xmNS`!-(M(O$c4?!o7#QZ7=Ln!L&EncVhNeYWiE z#G;ma%O~0*^{G^aJ4`6P2lYK`?$`P}zEype?WR7<&yZC3%UCLP>Be(A;tSh*w{4pH zh4WIA7qd#UvZ*eTt7|K(I3ba3`C|FiZIKtH&T&M90Hxr)!3prg>L`Vo-qAe_1snl% z;}YowwSRl>`puiy@1uSX@9!T!ym>QbXglU=H|8pdc>;|B_W&oV5tPQbq8jhZY(Vp1 zo52}+BYl0@%{U@pU2oQx#TR0Bu(z>qydqgXl9gbIv1G+KAUJ{%PxxAy@K^4j3wuN` z7mS<>);nRx?F+6M0p<xGQL5%T8a!sI6Vt~RknnS#Ydd#t+kXF`-hFa+3*7|jl!?K& zz0rKj{FQK`H1M;5k&B%w{_E2IQU|;nJlsW`0%maa>Qh&*J{ubY#>RGxj+)WY(W{tp z>S|NQv`aUQP;q5OsE5=rpy>>ioSszQ0mSD4UW;pCysK%=tvp<s>*?<44)1n&X3m^h zwcT}@wmD!(-MN}fw~N}cqHPb&%VNu_Q;jw01--Gk_02VzmUyhpmVxqCKqGk!_&VgR z^Um-t^*&1~Km(XMfL-H!7$?g>_WHV54;J;grzkKV$sm!Au&G#&oHz!}2-lDwr~!wx z;WuAbhw@XuxC6Qk(XXrzqgZzwt#siDtinUW=&3$2v%(GJ2D*oOaHQ@BMg}(2R8+cJ zS2Zj1z9mO~sAs4fN7>D3=}lUD$nacSnM@j6UQs!xX>obkK@rznRe!{mBkGoITvmgl zdJ=9|JQm3=Sak8Ch3&CqS+sfHz>a}=Eza~u%)!f74aJhtWk;+UiAVY>as#V)2wQbS zL-q2p`8|!Z=X90DlJkykn>Td&;Z2>Luzee=m(FP^Hx-Fnx`wQamRnmhds+F{Tyxu; zCG%IWo?li5>D9BKqrNqsaK@I!1{#{08s?QnV@Vt<XBz6~M0R3drHhwGve^in!y3{0 zEG)T#To8XTtW9WyUEm%YFJAtU*YG)UxfxhK`C+jEhCZ_V;@9vwarxvk%bP&qq)`|x znAH?$l(F9a{v5<QgFLywi^bJ|Mln$}d6G4-^f#>>NRQ#|(IaBujEsUrL7M-T9p<X; za5lAY;h)~O;^_W`RHPU7AH8Do(M$%{Y`5Sc%*U^F`PvDChI43{%Z{?TwiiSzK1X^U z$NT`cz=hdZ{YhE`5if`iOv*aiQfkb4=+xq2kq#g~?gu3gg8U<;NOUqtJuf_bUGJS$ zgSATrYX?_lCg>uCX~KZ~-Lecbfzuu^8u@~@yrQRPMfV6+QD`_~*{xS1nbQrE<9qf@ zR3s-@7GLD|XMh8K9o(t~K2Yq2hjT4PXB!k3QV9+^*F`6gZk`U}N(bipnktj7_&nZ# z25*;f=144PR>R-b2PxT$O<CVe)<({)n8j=}>$hA09k+{GmO$y6GuV7Am)b)!U4zwi z*b_V{oIntVl3Eo*IC%-ny>*OX$#nFn$_SapQtTWUze)Eemi6?nSkP6|(A|{D4fWQU zcntoZrHe)YtL@cIazy!f7q$;#&tN~4x2EofUo^C&jElAR^v*pJ=k;%Es{ThkznpsN zc4(Bo_Z@G{<MhM_>*<Dv(|r`1+wgTj-tdFl5v&aq-c!l<7E-eGU^L*ZGx^?#N1_i9 zpRm7}te;|l^T{_DVs_y;9zAeC&U=w<I`EC-Ow``qJ^aFg1ocgo6Xe3+?>r@)N3Fx; z>KUx7tM9>!-2?xe$t*ZBK9bma?0Edh1;=hpyu9e>qZi@y_2YKL*Dg5rtoX|d*2Y&M z`xA+=9b<`AJcvCJYJqD6)G&eurm4R<byMQ3W9C$}9CKFUWe$e5|0t0?YDfI#Y~rT) zj-%$pJLYu6Z_>KUAt^^8DFZKw+V%nLzy`Q3BeprHJ8bC(7XL8PgX<CMoBO!q{w`Q3 z43-)1dwKgGxBU@oJq)Omy(|3TKln=pevv6X$XoU^>9Kpqpe^mGtAj#7e&KoBtp_|| zQ~{)5a6(xRy46joBO+zEaH?e-Ctd(?sid)t`KXxR_bgu?&((5`wl??9+@&i{JS2AT z?8HGm^H!{w_uqXRPT4Kic(kvk9v2PQyXAfJ4mo6AZTjG@1&5rt0)_|Zc+^{jRjsFC zolsxME$Qir$MR0n;o)(_nxA-L_n&m{*1qBHQ%>$)yJ(HPw-kG~XfyYU4b>;n5Qll| zG1qPJ7-S)285ly0f)MD%|6mQ2<s$m(f*ryVk|%y&rO8-8o9Ee7B;_hh(nVc)PyG0n zNXzl@o^n@PU00SXOV>nPth^%XA~oq`hm(z(pOEjbgsy*tI`EphSXI0_(wi`4WhT*E z+ncT{pHp5Jv&PsME{~Iq3Kz<jPp}^>r4306ptBcrGAi<f>s(;BpgrYmbwR)JhK!M3 zz_)j|9Q=O(FYDUFDXIR1G6j)tBk+E3%~`d4c&T}i*Ah7vmA^5_2P`5k31DLGUa?|! zfB)=kwzIPGL7tsE2AA}rHFzh$-W45-FJI6#dsDWvW?s!*awhLJa`vqUy*AJxgSDLk zRm{iycn1B)9w1;4RwY0M;(5le^C^N+R{YQ>hK<ZvFo6;~(bwIyZCn3J?EeE}@fWB_ z4o236&FHpmd<)Lx512+(lHd5+D+B{aUvD2UeiW_KSIgB;aySjh9IPASVh{Byh~}Qb zSiF95u(<2$5p@QC<H(KiRMXOQTNPf)(^|Wsw)M*FaS}AKd8luFc4TBEd!rdJjWxNd zmfDXt)oxf=ox0L&m-xNOw}#eb(J-iN9Cp??Vc<b7W50Ny$PM@4<p=&9$P1gsDMUn5 zki%r;&Kzi}PPh#gmD=H0S?p9^G3iu;V<^m!tCCD}W=Esh5Q|bpipGYmJr&nH+RmKn z5@c)%H)PCuCIYvDxr)l_r^Id7W4}7IL1>@DssTeOL}&1-+VXX?KCtie2ls!pzi;f) z{=UAY2qIa!^VX%ybQ|urdCU7vU;o9M`uh$!W_an+;V<u8x*Tl;d|pm=VPwVZOn!&r ziPf94y6^OkmSyLR`)}+ZtUPnTdX(!%osK<tWdK2w7wQTjppQVx|1}2|&;C+p<DJbW zUKWp?1fiZmSW*VRJX+0sX7Y*IiyHSf#oUrf+N^t?q-1~c0bW0F5xzN30ZfP?a$Z13 zx9~(g;D>#PlRXkI5v7Xnx;it0HRqvqD^9Onzsi_Z>uXP6v2F-!D?Nv%KYF#bSAR6U z>cWohg=?4gAwafo>Dq<e9dkSSDl04dI_3)hQc2k0F*1D>@w5xe?Xzds3vqB+2C67N zFiNn$6KrgFcDu#m4K{>kROt}3fni!;+&~|JoP^8ER=0Ws{psPxx%Edim$fgOwXCMP zZ%?vfPjXg8m35=>XsV)esXbx7tE<hlwPk8jw#hc;Iu|eQ?3(`w(P?i+wjYhxjG8(` z+1J(8^>iLobx_U0eHGuXsjh5IB<ic?m(N;L9?4bIw)eKDOrxn^yms+|Td+WmS4xc_ zXrm54qFH+8x8}FtM%A$H;LB6K%cy1Qsa(U1L(0VCwK&?3QiqON{lNjM!+KuJzf73+ zWQE&M@sk~Wi)xJ7(0oWLQ{9wq`$~0Vv~~U|&Epce^r?wdG8)}g*Vi}OMZeyB2)6Im zrCOV+%gP2%KLv^h<&T~kQBQvkPK%c<icr@4w^V>sF~=p_`*245%Kl~9=FyJYf%g7> z9Aw^AF}R_y)o&b5uZ1n69dr6t^k-XV7av(85Qsr${S(H|m3%S?oiMln264zJhy=kv zJv5sgUYmn05Ix+Y*igOutQ#`l*!%IhWN>Gghng>$z}vF+iD#`53$2;HxgVdvO9cB& zY;sNWC8K7W$olQD>#=SEc-M&cQV#o(mymODjxnxSBg>!Tvwoc%<nzgad2RFj|Hp^V z^!dJ@G0-+J@Bqyq@D)-{K<Q`_TplQkUFLBH*ToUy3P#FxMz~J!#;0NGL^wSLr;FhT znSJj+yzTV9E$xT*9^SsC@AS6A-(Q-59R@RH<;!Z!=yvc}u6I%TFba<=8Nj5#V@B>1 zc<Bgbyr&}AfyWR%@j;o9?PHla62dq#dbGTMISbc8-#FgT)_oy9@Z*}y*bCq&HBBEL z8{6eyz<o@i%g+Qn)>sVnJ_`-&e99V6bbX+1z4iq7&G+1pu>wST1|XD^VRQ24!w%cr z(VT6pTi)BdJaa_N@|>pR8uBUT{MDzd?r3Pq)b%d!&8$cd=1T5?)5^tuA~5g_IQmc> z_*VCDj6X}T#crq`SA_lri!NWW;QWP`EL<4NWEUN>a-~^w+Hp(2*nV}pS-mKmi7iCd z`3qKDj;!w>FA-b%VEZlv%M?7u^oVoL0b7-#u)=UndIfieUmV9oL5^d}eR~wzBRu5f zDdS_~e8U`$weK4r+pTf<Se5GSm3NfUV?F}A0rGnyBfDI|8X0{sB3`OMm+9dtZJzJN z31+(6zYl(c^irF~Y%IKCJFT;=-xAM?iKfu>k4YMlv}fe|=+L*On1Osjy266f$ryju zg`JS=z2oWe<JuMa0t;CVxqu|Wi8~M{9eLKhxUP#KfGF1kTS%NfqPH%Bw+8=fJ1Oy? ztp=LfZ4(tsMwaBxJSJr#ILZ!jND-4druf!uk7VoXK6u_Kb@jQ3wUJzXb?eZP%TAWt z$sfznLLZRRh4$h2xucfPH_$H3{N=&L`i8Ff{FN)`$GaL56$#vQH!N7OK<=95%px3K zg#Uq8Un34@d2`6y1Ir?yJ6P(}e;`$Tdl{^KaB+REwg)V5wmC&8&)@EiZLIAry^(p5 zxj2WXXWsmEwPtwl5nJ|-3eD-8Xb!K>wfA*3H+S{5_t%}$*LTpLwyX(pBife!StVdW z;B@47;ClFr<72+pHm|L%eO`N8`-bmrXlpCF`w`Qb(uO>g2;Y$c7|X=f8~Ti3Ve&*7 zQbFGRk$3d?tIvJ9oU~~6`0T~ovB-rD(8Tb@5pLbx7sw()kK7CK5SfDgm04UJy!Q+7 z_XEq}BOd9~aBOqgp+B?@RV1j!iY}Ow9}}Erbg=T|3G7&JgVx)PJ@^COq3}0C|Bqus z;!qEE-7c1`HhLS}*N}iiAGoLU#7m+E-zu0N2jyaBu8U^y{<^s~TJye+n4N=P>;EQ6 z!1#ap@ARFLBds;HRjrW=<>iCs^6dO%MRTTOAem~eHMs%Y)Ed2;{DrQ7;{ZC@pT8GJ z)>P%9TjWh<^jidyJMh{0aYKj`!@keL+GE&*y_e?mzF_wr_s~;*fuqB1;*DgsZ$I$E z9~y}oCOCPb9;9`jKhKOzI?nqfxQ$PP;$)@Tg;yG5*OGc);X;l2u2ec>=~B)A4nnO4 z@Id?}zi<x~l?-mf4}_mHz;@V)pRY(oDh|(N2j?znxH{%i73HbAMRh4tU5|s(Q|0vy zrN7gqu}n$11@+~r%JTa9Q1KuMN3f@inyRA-7d^Z#J6O|jRm3C`sZ?TfWt=a@(NACD zvNHaeAeFyGImG+GYei2Aa1(q9YHnZ#$x=(t%CX4gcw}s41gr`3ch}^YIWcwWs#T|^ z%Ho`>_}{^s!1J6lph?C&aVOC{oNj#(H~^G!@m&B%x!x~wN(|9qP?(yegX;1J?f}_m zckzYb;7exv%9TT{y}hl~b@f%bwtgHCx4f+@yRfsWKHDREjwUZ^!mB%X@7sO%$`AA{ z>&<4Ws+)RRI+|<iH&!m|?C<YfoUN~JdlXjUzUIl@&3i_OxjNo`*cGAioA9nuGHFl1 z96@4!SBpCc-IQ<7mJ>*&n`Aj-?KqIFIv4cvWWRs)Rjs{27a6MqHK28NOKpA7$-&BH zvllGrT!ijnFukp9KSm!%Mr1Yu-yFFRf|+`ThU*ZY1KR_ORZw0inhaKyvb~AJ4x9Yl z>YcgV&eb2>P~DixZ1^C8%R4&iKX}+-A3AjL;zLikvN;xYiRLRsBkF@jv`^kTAcs}W zhO4JzzKz%OL;(EC!2rY99$qJoT>a%Pu<pTJ-Ej9X<R4g84~PRQ46vlW4bRk@cZ_MY zc2?XbZDsxZ>PW4%wPlTwOr-wPvlBK}>r4xHQLHYK%G8_mg87NcmP9;hlbyy^*huT# zc*Mn{#+nsy1!t|Ri$vO@JFkkk<El?{kxw7GI%?1CSst}ZH(r;_n2x&2+GwOa-co7c z7K(J?9D&5FMAU*S#IbheJQKkwP~K*I^xD8fz1hF!*&&zu*UsDM?eec9p)yf;D4z4v zW8m0tKzlgH+v$D8JI_1I`;fQQy8sr$BE<bJgx@)f-IV9x??c`Wc*Og0f24P|cRKhy zcNp)$Ul#2I&z&!KXL#qM?0Mcr_}+q&M|r2BPNtlND?V`~YB&e=oR4SEK;0K2^;G1q zk<<(1_dKMZfwGHG!vg#+!{^;<(h^HSlZ)iT{ttO$((d_aneAnf#@ZI*ue7d0pXQbH zijbCn?_7?$r~hZ(c?Xznkcq_uMyKG;;<+BA&2dlRnkyd6=cf$va*1bloO;38kfO}- z@Vw-nf7T^u_-VH>J^wFwu7CRHcAWL0Q}JBTM#OI~;hC*(gI6u}PDs31`AYq5E!VZ* zIroLWv*&G?f8WBh54!e{1tVo6cddJ9{jJBQPdV|lMW@|<=Ji{5ZG8~EiP#rm=~T;F zQwzKYmH5<QY|Y+U?|ScPlRy;Z#pWLK8(U{r+w<(L_NVq$*WgyT)7+KrF87psB~lUT zk8FtSh+Gr7EArFGOHmtbi!O_fMbC>~8@)67X!N=08?h>!v9UUKQtX1*HL=@c55;~S zdnxvIJRP4CUlHFJKQn$w{Mz_e;}682h(8zqLwqt(nP^K4BvvGjPMnn3nz$hG@x+z( zc325KWug(^%~<_Td0Bk3$0<pv#`kP|s-dS;q7?HxaG&$i_OCFenVxM#Ew!k(1%FKf ziL}&Fh4gBB2ip2`pKL}A?WhB-+i$$fbM2_PDm0Gpb6>~ve{Oqe*abPXSZVKkm#0cw zD?Ifzcn)T2i)ZyKY%4L6THFyD+oU{U)d@&d3)EWWiYd*ws*(~MUE2N@*H!py!94K& ziz#TOoEg?g=%(-t?^$=w`zLtq*qc_r1b3OVpbeJej920rV&`ns{04fI#a|tMn^7+9 z*Pla6?YQO)%2W1_&<Ca~NvMQNKZkNNwH|8O`?l20+CwA79mkkM&jmN_@6kU0h=UpA zwF>SMj(n~XeazX{k^de&vtLD-_nM)9@_RBJ+*&ZI8v9>>`*bbo45zVYImpjq44fU# zRjc$o=e5|gkl&8KnP&Yt<j({<@Dleo`Fzp`>n2nPFG4JBe}nvY!4vyCnfovvg<x+# zA@D5pPBD>~)eek(4ZqWko%2-f9!6h?e~Mwm+76Uf9NUi6=|<h*wVJDtr}GQ=;5rX0 zFKc%cJy(PLcENM@=3kM=k*57V5pKkp94xC}73HPSZ_W?-N!DHpnN#QsdJxoTDv(1s z5=S$rfiy$>@Al3_PPmV>-_rcp|3FR_b&v~jHo!sf3%+mvfShLhDaEp%K5f|#<ZI(D zT;gybDgFUDg)xQtZC`?HDV^6A@T`CI(-jISsR`}ac9BJ-8k|yJfT<}*dU%Yw7dUPI z6H<1{+}f>3Ex?K#2RmHdSCLxiWgRe%T<2b-DvZJy^{QX5_Roiaxdy2nLXVV`gc<5J z>yTRLTfm97NrV+)n=fe(AT5|t@(WNVw0Ooi>4@1MQpdAJX@UXv<)UXR`HcN<q>+Y* zU*vyjuhZ;8nnEN`$@UfK4B>X0p*tnOMe}g?+TG3Ke;^$wAG;6t?HC_9GWf0cE!=BA zXQ4!w{de4heo%&Twc7h2?h72C+dYK)D%3{45A4Qi<y@QPTOrXe`){ycf*$qD^(^Ex z*$+XZA*alG_du`W7%!9GS@6&8^ltGU^IkD&v(%h~2)M7BN6m}Y+75fDJ<VQbZ?g~E zU)k4PrJLgpbtk!t+;z}T9&^vTHzR3iC~G2{BbP*Oh};u-Jo0?xjc7%*Bf2ztbo8|7 zMbWFGH%IS|J`#Nzy2|gPuOrCyd5oMG4&4D`?8Zn43(iF?#-n_^27M;)_*cv$`3B_) zb%>nMA-NSPNokDo=(p3BQynINHEX_5+9Vey@7K1-&9pDnF4`fte}hs}Tjdj3lu+!h z_WliZv?Hw+eacC1h#lk->=Dm(Xfm8v;t(ZmJMt*6_)L$CfSje#{tw2_u{GdHZ9l-2 zKpT4rZBExxCE5U7+#|?W-b$EgFUVggYtXJ~Kz_Iv#5z&~H3)LT-_1}zF%+Y-mm_~F zJlHzN+2Z{R@{4DbxXH*skrx;t+b<qrxJSR2aZiOLxnZXvzY6!BPZE2eQJT*pk3A!7 z11>|%Asl~=wBlZItTJ+w244-=Nn9Z8+Rcr~nGV)vrmEx_&YGN>U}jCpVLRx9*)v0J z*m5yLPQu(ULr&a$VTPQTxqgP6sQLU1IT8C1ayl?Giq8cq%$b|y8O|4Ri1M45S?i_U z_mRVqsXXMbFK<m9a>5WLkL(tB|1)xm=fS6LlPP&74|h{rlB1lH^K&iaRWRcLeGt+$ zNDsHq8K^-YUO;+r>+D&zsfTO{mnS~8np8<DF{aVJEz*hlC8a^DJeRW_lG+Y>qbv&a z=@&(s6mzWaAWbA1%C^c?+RlcYNaL>=Jb^fwwr?S&h)T@oM7k(;t4zBTDMgfSu7flP z-~p~^--I;Kwx~;e5fY$Xp2*n$#WiiVMo{hjA{nS_G}u2uGHAPFkPXk9N=Sjz%r0}E zc@{=^r(J8e*<JQd`?&p$vn~t!^dxtQyUE?}ehv#Y5$TMKL{5ra9JxMnH~9Yxk+*OZ z(?E1h^b~OaYom97_wSGXAr_0Z#fD-VVyDF}j$JEu>eI0oV{af7pe?>Az9zmYzAb(! zEY;iM_r)KJ?~lI}e<Kk|q!U@#s>>5=6DK4#Cw3$*PF$9_Cb1`RTjDNr2V@@Q0JQ*8 zBDESyOx3VysZwiK9!ER%Ig}@?c_s&~C2C8hoR;b29^hWK9vIJhiAic5u{Cn|Qf_uP zN(!bRj}|65uv$rqx2#8{%@=@^D*aeXnEJG&kJ08UD3|BosFj*-mCPgcdmS;Pm%U4J zn(<8yfm9l3j(op5BoJBwb~%IZjKGP~N%5GP4lyr}yXJjJA%?RSmJ+?kZ=F~}`nyej zeaYhI1wHGOXB*HfmC!Tx%3Xzikw;TIV~_lPVr-N-t>$QfCt<=8l%ceM$!*bV`wqSd zMapmXlg|(;q~~sUs5lqgf3I^u8OL)4#rNXAhCBKqNQWFNWkjISX3hI?N1KKeJw?lK zKSUneA}ly3<X4;}?vdzrpOt4h8tShp$<bbtM_wekY7eoeY&VZp<{sP;i)rsG{?UHb zo~O;%kvapW+nvZGR?n8_$*uET)O#@hoZ=EGL`Ro)pGICV1Jt|7E7>0B<i`AS+Q-0N z06v&+NekLj!kbc?xJ{T}CUxo<30sa^b=+!mZ|FIngW_qvn<eK_-st#(_K3-VvpEhq zoJ++6rD(wca|?1R1$PwMoDHqxfqZSjs5z6ZUbop$R9m1gfWGZH$SH=RFF)YA)Ewm+ zp=aFHB3TrN)e@mz)o5Fh9?T_wspWy5%wLLxn!-=atx`_`Z}<#KnJ-UC7o7sW!*cYM zbr$oG?@9einaTr6mpOAR(hD%mTdL;UNDum%l@&<NK2Fz_bk$*%4iqasiS%i>oa37u z3RIyul=d!1YEYU|kDM)MXes(y6M9b=gQJ?GkXq;=shybiC8?nR7uJ^ZxOY9MSM$gN zJ|$9D;X}M8{Jx2_V0^?5NL%b%DWvhe5-G33{u6#n<bwMW(gbJloUfOfV~|$prOM+^ zAg$0F<*1()InEhSY|fgmNeZ83Z9VA6UZezlD?=|5=B`jm0x5BGXDEeH(ou7FC`IfS zb0Sido6!;==lM8Nf*uKPGPgrR2y?tE{d+<Wy|jNJ8iRTb8{H4&j(!?y?|+RuLQXOG zX36ts#7@c`H9_EtS?_BUq}1=qwakX&35euqkcsweT>Fr==lbQrrOh{>fhaVtz?I;( zbE1_{=6noSG9vqZxq?<|HpvzF^n9$|T<P8IJ>$J;u)i3Z%N6Dh^SF7*#%#A;W4DO? z`iOnbzUAuN0=L#}b{E5bz0*D7e(7F@qrWcF8(9(A7}*lJAaVt)*sn(JjXV;0DzYEC z%<t`Y(F1a8LW9(xR-k$}XW?GGfS-DgQtW@u_MsHzbg4d}+=IFWXvFr;P)fOFqj;yf z?Of@})Vk=GpXHZ%0A=32@6Gm8;L?;}s$=B6Y3Pg2S_b`5t~Y(JfhTs(3?-<;P_}lX zgnBVc>!2nD+_L>M<f{+6!FJ7%&svEOCnKLSkaj!imhGyZCcMj>B>7pC6+It$or2-2 zS!C^r=*4t1L*2RA_RNs0yzT&Ur?&0e1GamHXT@T-S0Z=D8FGIuHIqxKKBoRoZL8f} ziBa&H8ZNDV;v)Sc96Qf3CM<#{vluU}jaGLDxH$PM`2}@JN?LNu4<Mbj6d=T$D#x>| zm|lfip_$<+)uX;%R1a~5{+qNp6zRlNT1%?^P&-Q7PVnt15H?pJwJ-)gLF~Os%CcWN zkEDxMce`+Yg#=qr?eAqjl^Pc<Be7HMr@@!mUt$EI1YT^fKpOQ#`p$d{)Nvmqc~b_h z5)&cKU77Gy>b`*_`3^Xy)Pd(4QTi3RFF^ik+}Gi0o?i_aVD1BFq`qBAUT+`49r-UY ztl4`AckDg&t*nblNq?SPQg|L^-zjnhox^dj3^~KU<Ci*K8+In1?d^eX_pJApX)?>q zCUcRw9_xrtm>11kHf?+Dh#j*#!1wmpyWqKd+CFbzwr{|8tAviqxJ#WEVojjgsYY7h zL!3`Q+I}1T43{ULpwu8XbQiF}d=DvIxTn@ldzCfQ5+a@vGo$8#_b3suv<Wz0s=HL; zT692si-*GeHGWImpk5KQ@Zh`VN6^R0DbI73iK*=0%()Ts5XzLcjk(20TkJ{5qf{V0 zk^7J<1XkEwq^Wg5epF=R+4DdttW&*_strL(x(Z3x`T|P<o?Cl<NqKS@K-%4pbi$l` zB#T+0Ed?FRUJc49z*9Yh-R=uTsp=uk*;6G|ZOeS`?XIG-Dgo1wxJh4Iq)sPLaFs~o zdMRg*)CvxRbK4RnFk9fKs8x;;I_No4Ms=e!A}$zTA@lC8!F4@qgq7sVaUG0h4z7Ke zV*hu<hy97(1KuA@w>iOFX6`oo;koFw8|@|btM&=3s@J*Y{;K-Z?lnmKrI8civA#L- zAf){3(R6eHywyA4tG+!t0YCMdIDd5kd=+QL#$z|f?vFhk`+eMEcfgYPhWHkEDQ<}0 z4IjmG@z)b&@J|dSHY84iXW|-oCGJoBH1S;GRYb4UCcBeMlk1WvCC|ojIM*j{Pd<?R zY4TUemy)kzgK=e9Q(0%(fSCt)aTYmd;twH6I1-<VWjpbR`JClO)Bk_*96clYT)QF9 z3b#iJrH-XE$2(FsH8<*I^cKxrn$LwxcY~6`r8&!LNfY<f?&0|O+KJ+lEJbcje<LLr zak&F!GNz}bWTDQGcSGuIDk({BOwFAZvA;Hg`x;n*UHC5Tr*iwiJ4ZOwn#PiH;Tp+1 z2{Uj2^AnV#T#!4o7Rtk2!E>`+%85S)>6~$nfwihXhE^)%k0DKl`^R*p4=u<193p<G zO9r*69M|<<#T%`wrKGO#7zlA)yZA6lsgAF_n_OO3ytz8#!`wV2SXme+c^vP^HE91q zq8VcDOnvup+YsZzWx{=;BxF4UC1tptApR%m4QH#`(DDw~6NZz{NF(Y|s0Q>kr5;y} z5|lNpi9DB*tB6md1btP-CCFjfKIY$Eh<wFw)sob!OF7xa8qMQ)I*cE*8Umi*>2~8< zF_o)Gq|{2G1F<XIqw;Kcbt#Np7bCZH-ZV-F7-ardo-NE5bBMF*$^Q|4i76Z}SC?2% z17I)yA^REp66+M^oMBzj7A?p87|(=9RDpY65}S>F9_v-@I`6mhevUNt(M-uRjCl#q zCg(ySQ)R{^FWehyFzj=+`5E%UeW9hVexa<ZLmpvEubOheyqCxvCUq7#FL9WDLg>0? zF0|)xU+6QTZk={qu_&(5UjsL7CC^Bd4tr^Sikxr{>0@ONE6tpeXQ&Iv967Fk@QRek zaVj-p?p;kNhb0JknNh^#(IciDS2>&?r(vFih7j%nWe#cRZ%WdAN_V$Ny6V@A86sr> zb4)MN!*HRbhy2I+fJ`sUk6K{O?gpfXahqBt#$@Or3)dt13dXt!>A?s%YTrgP$0MEn zCr*WYfc66DCsQepx(sXgM~`P>o-<D%H4K9c+G{s|hg9~8vrnp&^;CEiN^6LC&eHQl zsjLw8p^i6NYUF{|AXICpA(7MM{kwSP0;CoAHKXmC5i1%_<BW8Ary;Gl_X$LDhRaoh z7qy#5p-Y9wQ)Yfxl9I&UhvG5`^MjI<xJx62TtK-TEDrPik}@&#a7jwk{7p$p#QXv& z1xNzFToqD^_@;TR<f#htqmq<z@B7dQL*uveFnf6%GAH0Jk7<UMRRIQ{fnLZbx$gcn zuGt%4k$DC>qSEZcas_H}vv5W49Ido|#A9yuF7~eVZiiL%6yg(JHJ+(5S+fBCqz$mI zwwRsfQrO%7A=E~DCh!JP&U6ua?lHk>>I}MaKuHQo?Y@h2av!x=)vH1&^IyOwrZKvS z7Chxen`@L*${+HqP8m;w<w;Dc6ET%u#%k{mNMkeyH4MKGh~1`Fkuf9WrHFwse=jL~ zLRTtsW<TItDAVlfaZi1M^)f!>5xFOhi!NXoeWLu77+>wZihFHWB~*iG<IG9BFXNgs zPS3+)xu&l$YkujM0nXbW$hC|RalKr5gy!pRgmp^|q8`!38xhHT9XxuEW9{}$tVVX2 zC1y4B`Yq-H`1Wo<bjm&EA)L+gwE2}Ijj0xs#}SN#yo1&edg9t3-Pjtv6N;aN8T0AO z=ysfgsri9_Kv%!1C57vkkt4dBJeql_kUhjYuSE`Fz}aHm`PfBsDzJf)ma97oby~?) z<{vTdlnZKsajvO>t`@p4YTZ1G8P$^hY8&>cat2ja;wjgH`_Our+3e^0ZMq-hUVWLI z<5`HL*5{SW*P4I8y|$n@^ea$VaNlePFn=Noy+)VCbq;^P2iJtTlrg*OaV4p)RpysC za55sedGc4kcM?{K?(m*~t(L~To`5-3-^Fk6R>B6mz%Ivn^9lA8cawN3sDF@JD5uFW zX(dq#sMk5Pl52jAbZU9JB1n#|8VfO-b1W9QS%hBDLS>E2;kW`Xk?M?Tob<#p#9}Q| z&?|{KiuGItB?gh-P)||&iM^$kMZS_XOG?^e|C!73ffub4W#6r>X75hSP@$z@Rg!g3 zx@65_<cCM3n9usz?`E@5dRG`RQ=9N7_KTy|HB<Z7ATQi9^;v(!t^*j(RcBhG#TY&$ zIfeG}(VJ#LNlp;;g<W}|itrdnYgmDIvw>gDXp<B~zR@hS+-07_wLjM`2ON{0nCHPm zvVM=&h>z@H?*(kP>^5t_JI2k;@C%$F_|Yx(P&$xP@|P4xSP&b;CNf(vI!1budrVg{ zuvAWek8-{aY(9kAO6&7=N5NH*M&?ZPsI*kLe~=4i>ojF(!;mYh|Ea-#7_(nmkKh9! z$+0$?Z5UZ;3Gz+l`^{ztYAnsC4J6oY&H}7Tb1BErd%O{v+^-mN#MfEoH1MvX9QQbQ z4JktDxfyRByA4*t+osd3GiQS{Jb*L)CT$jRh+FKH_73})ebITY4c?p+5rufYyT?7@ zUW!<}Mr>JREV47QD{?#5ZhjSc4KawF(dE$-;MKVzdQ0^F=u^?(MBl<*iSF3)*v8n_ z*rl=S5QXw!?5WrbvDf1Xcy|WkBk^P7o8vp<<MHbdhjLH+VeFaMAAb?MCf>vw*eVir zb{JeqJ$$s<6{6~wQu#`#D-S1UNZS?Qd4=+nKWc$$+@n&7&oS)5LQkAY)~&lHSYJ?< z77S<THGGP_jBJq-AQb6n*J3UTEvsji98YDJ%%WXZRE9Au<ZzVzc@E|MXTFTjvrt0U z!19rh?p8?=x&c;EBiEI&u;e=%Wr(931?3`VoR~;XL>fc1nLSz{8up)-#CF)l`4WT? zd#RdLUemTm7L~}`E;26JEnwFbl^{fQ#MBXllcNsyD42;t9n|sBdpm@3g?yHy<fgrW z66j+%SNSw$4Dr0%ZYauSjkHhI9;mg;i*nf-<(O{^o1MrF!?1V_Yjx4H<h$$_`D7K^ zJqSH4^qEn$#3s=btlGkb@$xzDUV%1Y+wh!lW59{rlBGCjfR$ZYR42JMJqdie8*jYe zbA@}#5_;;1dCRBd`51sT;veSgEZ`e;Ji=~aK2K+#)>t5s=&2$`QU@uKN#5tck#y{Z zI#rJM`#FpVE0SZtlHeKEM~r8*H6cPdR*4Z32Bep~rSI*RXDCM$XB5Kh`KqGYR5vBZ z$eP2E!+Mo|NqssGY3RVTl6e>Ib+cWQPiN1F9X<G~v`dT9RkL9f?!ibeo(bxo)#hK2 z&Q>{gQh~2A+e3=#Ar4aKYP4M0D`1fF5x~G6UX-r#9^-L$B3(yD+Mu^mIE4Ev=(<5V zDNmwA?Fdo}wG(UMF}8z6se}cjvN;E-VLA{Tw~Qhw)Ic5v|C>FcDAo6B+V#+^3uVbY z({@Qwn#8BsMMY_xi6;9=q><9eO#?5$zezbp%n~DVwA>u`AFvI@Eo!69=J!SA#0z8o zS?Z&&N9Ud;uSHs*mvTiHwuE^>q^Hi8%%JN*3OQCSC`-M1^B_-K08v5@kTt)P`=DP* z^HR}$LQeV7*iZI5ZucTTXgBB0Hvd{wK4#~`7Rckin<IDX>Btz3Bk?)Bc^NtyDGH-8 zzmaR{h3mq#Pp9TZu^FiOP2h?+(SSXt8jafO=1Lmi?0O}QknHh}MI_zLuu@;Zj^Iw% zg<G)RbDMeC>^HC4GVEAbW{<UJ+Dq;Ah**8t{@nh?zUj(bi|dEZu+EKP6=(-EhjF(H z+QZFm0I*eV$5D_92wC;c)3ZRn)P+;YC`)Pchou&0U#Wv!`U@ySNkUxWjF3B&@D%Vp zaAKqub4ra<&^h`ql%V`1#Rrm&_*00rKV*hF^4!&|m0pvhuolKH6!Q=67z^4^O*^ot z2#K6|1y9g+CVwJ#Q>X-W9E{xQ#vmB!{X)h}jVSQAa#jV3-ZzAA5~?L|F-wIz5`Jti zWS`iq<OF?D3r*}n%cwT(hthG-zrR3wAZJoC3f9{KjaYqpY=g5#+1F!+k;<7;tC75j z`1<ciE!3gDp0xKUQm5dG`-ar3x*2CzcV}KKbWX^z4{RZ44w5t-C1ojQ*sPK?&K1X^ zJoS2{m0*&kpNw=$+$3kJ#*SqA_UJbXytxMn?J`B{`8@8m9^nn<Tu`fWdB|sTo==~| z*JW}oP_~cy^jGcu5LdEtVLvNr7>&IMSH$lQdkm~C@L+olezA)VyNI0hrwJ6i8SA+B zdcXAEFm<r;H$s!&g_x{I&GU#)sI>#I@Hg9w5L14Oz1u#7UC+<hpJE0mXXpdss0uhs zzC<p|`2f`HPu{g;LEB2(AEW%tb^1`Vj{}x7ml8;#O=9Ity`z==s>})@NG)1@6x2o3 z51+QzB9-*$d-O0S-%{h4@YZNj9OVhAMerNxlrS9ecVtFsZ%v82u#ZXJv^}%;A+NYi zwX*2r{ZHi4Qy1<pv5;%e|1EV=i=jr#bz8!pQmNh01IqD<ZxGi^r9Mw<cm-&c9&FVn zm_jMZar{wo!lS3=%9(zBN)9a^w)rOLSZ#8a<w<NDOV%DIR9NV_#2R>iFEqp6tFDoT z_h7!zjLwB{CwsC`1ZkKYKJDEAiqNPD>~JxE5NQ^S?IVKoeEJPwb`3Cql5fD<fHN5` z^{#UZFykD(dI<SVU6(!PnA`2$C{3BJUMXIMxRG0k(G@>U=y$p=BAt5|3w&8D14lh1 zC{K7`mE7Hh(Qsyb?bv%CXzoRL)ebf1!AJUY^EToij|QFHik%y;xU^g9PH|Tt?(r%2 zYNS>oATEvE8kvZ^5cQ(j=m_>}T#CJV4`R2*>#;QAAC8Xgh+PF6c_Q{)?9F&>d;y{# z&V+4zbNv4J)A8TKB5q17!p@9SaE8DxKlb6-#4Cx(WL2^wxg@zdc|vka@`B`L$?KB0 zChtQ0!=uTklg}ao;<e=4Wii_Tc^=45>b<g-1Sk=H#2(so#5VrQI=O9x_5I#YsNWy> zVw?V~^7$Az`#HZn=YsRe*dk&bIWOZ9*f-7sbui4aTZ;1J?L66lGfk{i4*=;{X`i~O zFPq#~kk1kUjw!v9ii%T3dvil*F{nN8-6%BF3L}h&SH$N-h3_bjWG*cuwM$B5E#5P& zrw>rxyj!_dC>L<u(vm8N*?zV8Zz)G^O3RO<B?XEn2v@3|qNL$j0lW*B%gbS;>dJJZ zTZvjpMI5=}0&RT4lcy3;+L6bs#y97A>L@~evww|Jffl3IFfppg&IA0;$=5}yQ@vib z8IGHC0FLPnk-FYv?%c58L4XmQdBTGjogalg#V<o&rLNy{bVV>WZ^*nBLo4t|t9)!k z3?L<!`k#Y6d;wqebpXS25K5s=2<d7iwT?7kNlbYcSOU-04>cp616K<rro~nCgi^hD zL_traA8rs7SHSnYmjRHGH4^V@$S1}S1C&2fGv*T_XY6&M{L*M<O4&O?`Gx0oZeXX_ zZ=xR7rt?A?3~_Al>&TtjI<-jp1fG&-14&qdWA^WgYA(rj^!WtiRtu2W;LoI^z8&P| zZEJx^78G$ia;Nqx&@KK7xzs^9MqQyGFC$e#!kV}7TgrD-+p6|z9OW0EWds%HO(m<w zu{PW9p%#u^^=RtN>ZyZ;?+(Is&|~ETd|Es>ZV&PTTvPtYk+PNsoW-e{xpH5&NgoD1 z&ei6kP+no~RL`X^TI(#(uW#p@|M8#GaWg;fk+Po;)fsSN(rY6;k=%nDz_nQa<R08Y z4lz@0zG}-oxP_cx4#*=fD9WL~&o5`*@^iF*q!8b?hBKTPX+o+jj7qhbT+uVi??h)b ze}eYFnhUc`ORvd%%GaehD>_nLQ#lN}R4^NyZP8!cGNcCc$KKFVskBe~sR7s0z8qbW zD%y%=tOe^+yr5qR($PK$9j1gEn+uT^z|5alyHP9~(tyr?tNCBi<X9hR9hhW)j+7ws zS2%+CFQgRl7xx`MMJ-XRdAP-rLQRsAn)(*kJ_%!v6Ig1N;ht-v3iFJ4P4X$}$iLHW z1@0Mtpii{hXP^}Z<*V$IxXbIq_HX6R=O=CiHkNXWoX2ZlwwgC_?a!IL2iLyrv&Z9_ zb3?wm+b;vkus_4Ku5xDWFGNQLExVt{700+2SE4DSr}VUL@vZ=un7|1rH=-RzbgD<H zm`juHWuDO{=l&*0>vt<lIZsP|CtyV#i67EQfK8-fXyfisKc7-nHFebqbU#A7TZO0i ztgdmeF4jt2svS`owB&=j^ZpH-sK$NFn%<8y-LArJ<`+yEEX_@b(zw+;0z30<oR5w3 zvh7Y-nYY_V?0)+P7lRjQkz0e6qqE&*?gn><d%!*J_Pdwd>sUdm!WvRPR*}|5PQYmv z+w8B=6XG~~O<j;{8Kf)XrSI`V9|%iQ$m4)*-h+w~@1j|mcl`Md?8FM#7pgyU&4;Um zoDJ@*?{p7<|Ay=JS0F@Vq(;PYLTUDS+|AVAycUDHs=adszP`5?HE2v6WqW>ap!=qj zA&%%8X@2Dor6jHb7S6Aw?dc(;cJnCUrgki`owTcRM5(O<eO6z_bT9^_9e2f2TT?rV z7L@jg*wt<(ksF2$VaGD6O&l({!3sTbliW@9q$ZCMjNxa)^R-U$NO#&>)wv0YtYa)6 ztpP%dQkCyxAw{L#_mHDwWl5z5p;K$*8C_FjI=O(ZmC@Q$&6b)5`3iSzr|k(y53qxE z`P>SJ7}6##)I?fEw5(;k+Eh4ikW{r-RPQC+ekztSDU~u?Gy(7kdYlT>i+DMlFj$<% z2)O%^#<Ok6ujsF&cbBK_g`Z7$-$V*!A~B2DT<tywUPQj=N6fl4a!;NhuyTjVJt0on zn6n>|d)>1MjCbDxCnaB0SgjYn8jR~_{vB(|;S`&|#|3TKd{~|%<zlAXYRMyS;mjZ9 zKc^h)C*UbMif){)NDeD_?T+yIYLoXP;j7fRFT_bXtHEjRF)v`Z&1zWKci8<d0^YLO zUF#mkp2E7wp^>w(yWnxGL$}~0gq^UfAB(<%T?NZyTVlIn_r`t+i@F8t&0FGEVK2eY z<F6%Zv5#OZaS_focp$Mq@p>|yT#!6Exg&WMb`DG=pG&@3R$I29Y(v@BvMb7ND|@(X zf7z?$W#yga%gZ;GZ!Q0L`3>cFl~0uKFMp-NRy0%$RIIMpRI#ICyyAw6J1ZWp_<6;P z6|bjasfJW<YFTPs>crHx)Fr81shd)Fr0!2WntD3*Z0e=dYpJ&@W0h5vO_iOM1C>iF zM-1LFCD=+Gkoqv^h~63ckI8qGB8$)BQIBNUmqolI2FCHxb(MbvZ7F^6Y>|M{)WRWN z68gj;wVkuTB+Bb*Z&LVe-j)(9<DM7wm8pF~c}~rNc6yULewrtUN2&p7|24{m9tg_# zjeqtN{uu1D@`P%+(~V}zIPAyq1oZ}vlRc$fNeot+oF*Q{ehj{bKj#UbC%6sbn<$19 zVNZ!gx>YY-o(7FUPso>Mo@v@{<a(GfcO1S$Hm%G<7^=$YIj^km%P38*#nI`?DD?*& zE%Au_y|DK6rBG?Eh7cM7hD<4Kq9`5icfkVAV;frawQ;*2WvAlZ4A|yIMXDFWFg(hv zaAtCp7Po$yvh<pgt5QNJCR2aN;<PQs`YSw2M;J&fU(>}492g<+Zu3$Y=dGc7OW|Bv z@1Ias*LDbxJcQ(`WJZid`|sWd?qmU9u<t`jpR1!L&N8`$(sMDM{|`z|-#+EE$~e^+ z-<q*x$(Y=SP?A1tVt1*xgp{85iWz!z-+e@)!MI~Yh81G~El55aI`zw)Fip8IrZCzZ zwxa!&lq=;FQ}}~B3OH3tUsL>%ZVSrD3M+a<9f7tPc`~V-ni4gqoY5U}1q_;wLiVD6 zoHs&_l*qYKyr9NOT1~rSQKqy{yjL%!@Ob+VQl@l#%%c=0PB*%-Y3lKHN}mffy9ZGw z<Y`5($bBfssaL4oe;&$^uDRksZMI-x5Ee?6jFk&Z2SSS;G1jEoPY!cTsa8D4$`O2x z2zUiu98ZPustBLlR+N~z9j>G=2e&5#rrG6&o@BkZkspS82^Bc*aHrmtj}^jG<mcS6 zjozCW?!p*dm}SM}_anb_l$>RST-xqIU6jQf7w4OrG^v+5Zq7Ra*UE_leVl#vuiYl( zmex($6fdrO-?X{D)$dN6CO2<w*eH6zk!XaV_Kgx2nB+c)ycuxBd~8ad#?x{BPeGn) zi-cgH1=A-}>7GCyA>v0r;g0h_eLrh&!QBjV>{w^%?D&=$A{J6oAF+pAS@n6sE{iBt zT9Z5>mUA!KFTO=exTBF*3RPeKvNt2I8#KYyUd7dXG#;WOO5u|CH`y3$kuW^-lw!Yx zoS?=cTgm<la>$R#S=j4*G`n{fa>6*9=M{K{r;6$`T>TF;e_AS>GfIWLRcdcSD%X%{ zF{odGR>K)c4XBQ=C473^&!jA8h!m_gLfU*(QrRA((S6+Vo<u6!Dy${3-Ty@@u{+Rx z)SL1Zqz0{V=2$XoPeUrHR=IIthdDo$eN{OCUTGgjDqAK$;@G4&W{sc9p3xJfYpln^ zlH$CpUz9z}+82-(z>H60FNw8Cqy9i{rnY~lI}>R^PXj5(vuTL4#4&PP_+HGxNYnK} zLQ3`SF{CN?<M>41H6IZRPW2F`bel_%Qp5|~Nk~!r4x*dZB1LDAC#_)wZk^N<;-l_# zX#5<dzl$4h7U26VJ1}cpgGyVz-%_o5!m8R_iu({nn~QPJxd_f?jN@Ll3$?8O9yT2N zKniWdyFX$m$?G2U=18&cST9Q0({ab15N_S>R9JWl>8$166ko#Gh@?wAnmbLdiFIl3 zZ^a744BCIjl|1P_fGdRvcd<}bR@*P)N@?f`T<K1jjkprYYPrV+Sni(0FXv?*_Cj3e z-G_MRKbQ(L2R7wqSd};7+&w+Xp$hA_%dmobn#4-nYVSkz^M3n#oMThr$1`ofNqpN7 z&2$;;&YRush=zX9J&K6vXY84Phx%J+JCR=oe3aTG^*vpe;#hpS=`IAMI9h7sEJN>7 zvE)7*r8$2*VSv=Cb_8u=oX%!Gf!u%#5!Y3VB>x2dx@~^0de7)P3FwlvejduRzkzR( zGr}H_E^bAhT8TkS5uX(3x{IY3MW>P@MRWysfz(+%9>1>`tJ*)|vFf^L&VCtOO=Z1~ zfZSBP1nwemwNeNX22Ueh>6#pgI77`hXO1XJr{zK4X4dTxo}h3f|5o^Me_<GYtfR{P zB`B6$mv~N?LjKzn(i9@flR-~5nNMS1xfdX9<3jD6NAgw5j;x)9v;t;GU)_h1M(NJk zCOu;I-T9$%tdW-SUkDcn`i+s>N~BO)ky{DxaNDH}=ZCxwJ~PYnR0_R?AIaUDPvKK& z)h0mM3PJWGja>l2Jy++m_WihLugN)JP1$nX7wU}JO;VngB6)JN`8eo34@*Oj4tqzQ zQz6%)L)b02_MdP&am{rK@CWlr&@7`Uv-S*Ju|$)t!WH%Dv^!UF!9U$Opkzd!xwG(# z*34zt<uqGb?nX4sM#MpFvmXTxXe<EdUbPF1&|XrKPMoI4;~Bu6@C;)4!QtJvQD;GK z{X4WzylpW&8zu`{>_Sw^#qjb!0nbz=-gUacY{gEwASyC}{S!+O6}i=p+nek?;3CiB zM2uo@_#VWCJcP)Q=M8r(sLrQWE3G%3U0M*7Y@{feTXV>Jl%?dSJb?aWR^qvLt5>a$ zQPl72?$Q?ddcY?{FS6XPPfAiLOU+Cvj+{)qyXMpQ4eFpzoO8`F5W3K(+?BYdt;DrJ zt~LnXqJ-+npTJd6KOsR+ppT_^qZRYSvcMHn^Q(#O($I6N`Kg8nns*;T9>=aRPfBAN ztI=+G5^>NTZ8rL%NUJ%-^DswSV~y0!wU3trcY<fA#gJm?>-tzIopq@{x!EHQ1~utg zDQ$s9#}oa6dZ_gVlAO31q^ovBe5>>}Aw8&-F!ec?_x_S}uGNrVd<q<G3Zxx%wL<Mm zv)$e$k{ZC)*TC#;NcHy|p*`|I@D<=dp$3H+&h>DYg;Kea!MV+0eTX&qp7j8N_A8*W zVD<v}r{_Z{X3=tC4B5Dp(=^UEp{*QQy#AOI)mJ}&a^Y6U8=Hm8k!n<nPdlE?7mQpu z4c@QAl+Ya8zeGx_P+G8p{8jKaO`*=)4Q*-x?6C_Fy>=fY&&!B|t~0%OJJLpTCf+Br z3;W#e!v5GN5E1<X-YWeX&RS(#N=KB-q=%C8RxQuJ;+`FHW7W9WCt4*!?Kmxz`eUJv zk`qG>C6{8i>bQYdfc4c{T|r~*q=Dj^uSTokn$=4{y|&Ta2fU&jQQ7B9A=E+H#9c!n zsz%gea1tZwhgxL289^GkH??ANENaCnCn-hpJ}+B~a;%MUFr-@e3@rCj3$_6Y)bnz- z4k;|f6RxO{b|XfSQm7D{Sc7}*74g3X5wMhEz$1J}LA|&qXZLrKn9Ct^{PDS6B2^Fv zVeiG2!tx~WcZ}113v#8(!yAR%XP^_Q4MuI2G)SHnNDJjG$`2iS+u<#-9|RXs3pTLc ohyj3!`#ee%<v5-t9i(vPEPBEd$~=^>L;DTjx@8!5k5~VH0QmdE^#A|> literal 0 HcmV?d00001 diff --git a/self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.woff b/self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 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 BJ$(QG literal 0 HcmV?d00001 diff --git a/self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.woff2 b/self_host/LibreTranslate/libretranslate/static/fonts/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/self_host/LibreTranslate/libretranslate/static/icon.svg b/self_host/LibreTranslate/libretranslate/static/icon.svg new file mode 100644 index 00000000..76e3e2a6 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/static/icon.svg @@ -0,0 +1,83 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + width="187.04305" + height="188.81523" + viewBox="0 0 49.488472 49.957363" + version="1.1" + id="svg8"> + <defs + id="defs2"> + <rect + x="25.162016" + y="84.327377" + width="71.115189" + height="52.835255" + id="rect835" /> + <rect + x="25.162016" + y="84.327377" + width="71.115189" + height="52.835255" + id="rect835-7" /> + <rect + x="25.162016" + y="84.327377" + width="71.115189" + height="52.835255" + id="rect874" /> + <rect + x="25.162016" + y="84.327377" + width="71.115189" + height="52.835255" + id="rect923" /> + </defs> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + transform="translate(-23.040803,-26.932047)"> + <g + id="g861" + transform="translate(-42.114518,-17.993737)" + style="fill:#ffffff"> + <g + aria-label="众" + transform="matrix(4.3205134,0,0,4.3205134,-37.271798,-327.6536)" + id="text833" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect835);fill:#ffffff;fill-opacity:1;stroke:none"> + <path + d="m 34.996103,90.121035 -0.614947,0.759641 q -2.754346,-1.41593 -3.948067,-2.950715 -1.167884,1.617467 -3.7672,2.888703 L 26.0096,90.084861 q 3.457142,-1.601964 4.283963,-3.849882 l 0.878496,0.273884 q -0.175699,0.516763 -0.232543,0.604613 1.116207,1.596797 4.056587,3.007559 z m 0.165364,4.91958 -0.676959,0.645954 q -1.514115,-1.157549 -2.346102,-2.826692 -0.547769,1.550288 -2.268589,2.806021 l -0.676959,-0.625283 q 1.19889,-0.795814 1.798334,-1.875848 0.599445,-1.080034 0.682127,-3.079906 l 0.909502,0.07751 q 0,0.268716 -0.04134,0.671791 l -0.03617,0.361734 q 0,0.273884 0.30489,1.033525 0.310058,0.754474 0.899167,1.467606 0.594277,0.707965 1.452103,1.343583 z m -4.800725,-1.374588 -0.702797,0.63045 q -0.594277,-0.780312 -1.162716,-1.276404 -0.651121,1.421098 -2.020542,2.676831 l -0.687295,-0.614948 q 1.229895,-1.095537 1.767329,-2.201409 0.5426,-1.105872 0.697629,-2.795686 l 0.919838,0.09819 q -0.103353,0.940508 -0.366902,1.91719 1.00252,0.862993 1.555456,1.565791 z" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Adobe Garamond Pro';-inkscape-font-specification:'Adobe Garamond Pro Bold';fill:#ffffff" + id="path961" /> + </g> + <g + aria-label="L" + id="text841" + style="font-style:normal;font-weight:normal;font-size:43.3964px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.08492"> + <path + d="M 84.81389,94.883148 V 91.324643 H 69.191186 V 63.247172 h -4.035865 v 31.635976 z" + style="fill:#ffffff;stroke-width:1.08492" + id="path964" /> + </g> + </g> + <g + id="g921" + transform="translate(29.198135,-14.725175)" /> + </g> +</svg> diff --git a/self_host/LibreTranslate/libretranslate/static/js/materialize.min.js b/self_host/LibreTranslate/libretranslate/static/js/materialize.min.js new file mode 100644 index 00000000..7d80c937 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/static/js/materialize.min.js @@ -0,0 +1,6 @@ +/*! + * Materialize v1.0.0 (http://materializecss.com) + * Copyright 2014-2017 Materialize + * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) + */ +var _get=function t(e,i,n){null===e&&(e=Function.prototype);var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var o=Object.getPrototypeOf(e);return null===o?void 0:t(o,i,n)}if("value"in s)return s.value;var a=s.get;return void 0!==a?a.call(n):void 0},_createClass=function(){function n(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}}();function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}window.cash=function(){var i,o=document,a=window,t=Array.prototype,r=t.slice,n=t.filter,s=t.push,e=function(){},h=function(t){return typeof t==typeof e&&t.call},d=function(t){return"string"==typeof t},l=/^#[\w-]*$/,u=/^\.[\w-]*$/,c=/<.+>/,p=/^\w+$/;function v(t,e){e=e||o;var i=u.test(t)?e.getElementsByClassName(t.slice(1)):p.test(t)?e.getElementsByTagName(t):e.querySelectorAll(t);return i}function f(t){if(!i){var e=(i=o.implementation.createHTMLDocument(null)).createElement("base");e.href=o.location.href,i.head.appendChild(e)}return i.body.innerHTML=t,i.body.childNodes}function m(t){"loading"!==o.readyState?t():o.addEventListener("DOMContentLoaded",t)}function g(t,e){if(!t)return this;if(t.cash&&t!==a)return t;var i,n=t,s=0;if(d(t))n=l.test(t)?o.getElementById(t.slice(1)):c.test(t)?f(t):v(t,e);else if(h(t))return m(t),this;if(!n)return this;if(n.nodeType||n===a)this[0]=n,this.length=1;else for(i=this.length=n.length;s<i;s++)this[s]=n[s];return this}function _(t,e){return new g(t,e)}var y=_.fn=_.prototype=g.prototype={cash:!0,length:0,push:s,splice:t.splice,map:t.map,init:g};function k(t,e){for(var i=t.length,n=0;n<i&&!1!==e.call(t[n],t[n],n,t);n++);}function b(t,e){var i=t&&(t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector);return!!i&&i.call(t,e)}function w(e){return d(e)?b:e.cash?function(t){return e.is(t)}:function(t,e){return t===e}}function C(t){return _(r.call(t).filter(function(t,e,i){return i.indexOf(t)===e}))}Object.defineProperty(y,"constructor",{value:_}),_.parseHTML=f,_.noop=e,_.isFunction=h,_.isString=d,_.extend=y.extend=function(t){t=t||{};var e=r.call(arguments),i=e.length,n=1;for(1===e.length&&(t=this,n=0);n<i;n++)if(e[n])for(var s in e[n])e[n].hasOwnProperty(s)&&(t[s]=e[n][s]);return t},_.extend({merge:function(t,e){for(var i=+e.length,n=t.length,s=0;s<i;n++,s++)t[n]=e[s];return t.length=n,t},each:k,matches:b,unique:C,isArray:Array.isArray,isNumeric:function(t){return!isNaN(parseFloat(t))&&isFinite(t)}});var E=_.uid="_cash"+Date.now();function M(t){return t[E]=t[E]||{}}function O(t,e,i){return M(t)[e]=i}function x(t,e){var i=M(t);return void 0===i[e]&&(i[e]=t.dataset?t.dataset[e]:_(t).attr("data-"+e)),i[e]}y.extend({data:function(e,i){if(d(e))return void 0===i?x(this[0],e):this.each(function(t){return O(t,e,i)});for(var t in e)this.data(t,e[t]);return this},removeData:function(s){return this.each(function(t){return i=s,void((n=M(e=t))?delete n[i]:e.dataset?delete e.dataset[i]:_(e).removeAttr("data-"+name));var e,i,n})}});var L=/\S+/g;function T(t){return d(t)&&t.match(L)}function $(t,e){return t.classList?t.classList.contains(e):new RegExp("(^| )"+e+"( |$)","gi").test(t.className)}function B(t,e,i){t.classList?t.classList.add(e):i.indexOf(" "+e+" ")&&(t.className+=" "+e)}function D(t,e){t.classList?t.classList.remove(e):t.className=t.className.replace(e,"")}y.extend({addClass:function(t){var n=T(t);return n?this.each(function(e){var i=" "+e.className+" ";k(n,function(t){B(e,t,i)})}):this},attr:function(e,i){if(e){if(d(e))return void 0===i?this[0]?this[0].getAttribute?this[0].getAttribute(e):this[0][e]:void 0:this.each(function(t){t.setAttribute?t.setAttribute(e,i):t[e]=i});for(var t in e)this.attr(t,e[t]);return this}},hasClass:function(t){var e=!1,i=T(t);return i&&i.length&&this.each(function(t){return!(e=$(t,i[0]))}),e},prop:function(e,i){if(d(e))return void 0===i?this[0][e]:this.each(function(t){t[e]=i});for(var t in e)this.prop(t,e[t]);return this},removeAttr:function(e){return this.each(function(t){t.removeAttribute?t.removeAttribute(e):delete t[e]})},removeClass:function(t){if(!arguments.length)return this.attr("class","");var i=T(t);return i?this.each(function(e){k(i,function(t){D(e,t)})}):this},removeProp:function(e){return this.each(function(t){delete t[e]})},toggleClass:function(t,e){if(void 0!==e)return this[e?"addClass":"removeClass"](t);var n=T(t);return n?this.each(function(e){var i=" "+e.className+" ";k(n,function(t){$(e,t)?D(e,t):B(e,t,i)})}):this}}),y.extend({add:function(t,e){return C(_.merge(this,_(t,e)))},each:function(t){return k(this,t),this},eq:function(t){return _(this.get(t))},filter:function(e){if(!e)return this;var i=h(e)?e:w(e);return _(n.call(this,function(t){return i(t,e)}))},first:function(){return this.eq(0)},get:function(t){return void 0===t?r.call(this):t<0?this[t+this.length]:this[t]},index:function(t){var e=t?_(t)[0]:this[0],i=t?this:_(e).parent().children();return r.call(i).indexOf(e)},last:function(){return this.eq(-1)}});var S,I,A,R,H,P,W=(H=/(?:^\w|[A-Z]|\b\w)/g,P=/[\s-_]+/g,function(t){return t.replace(H,function(t,e){return t[0===e?"toLowerCase":"toUpperCase"]()}).replace(P,"")}),j=(S={},I=document,A=I.createElement("div"),R=A.style,function(e){if(e=W(e),S[e])return S[e];var t=e.charAt(0).toUpperCase()+e.slice(1),i=(e+" "+["webkit","moz","ms","o"].join(t+" ")+t).split(" ");return k(i,function(t){if(t in R)return S[t]=e=S[e]=t,!1}),S[e]});function F(t,e){return parseInt(a.getComputedStyle(t[0],null)[e],10)||0}function q(e,i,t){var n,s=x(e,"_cashEvents"),o=s&&s[i];o&&(t?(e.removeEventListener(i,t),0<=(n=o.indexOf(t))&&o.splice(n,1)):(k(o,function(t){e.removeEventListener(i,t)}),o=[]))}function N(t,e){return"&"+encodeURIComponent(t)+"="+encodeURIComponent(e).replace(/%20/g,"+")}function z(t){var e,i,n,s=t.type;if(!s)return null;switch(s.toLowerCase()){case"select-one":return 0<=(n=(i=t).selectedIndex)?i.options[n].value:null;case"select-multiple":return e=[],k(t.options,function(t){t.selected&&e.push(t.value)}),e.length?e:null;case"radio":case"checkbox":return t.checked?t.value:null;default:return t.value?t.value:null}}function V(e,i,n){var t=d(i);t||!i.length?k(e,t?function(t){return t.insertAdjacentHTML(n?"afterbegin":"beforeend",i)}:function(t,e){return function(t,e,i){if(i){var n=t.childNodes[0];t.insertBefore(e,n)}else t.appendChild(e)}(t,0===e?i:i.cloneNode(!0),n)}):k(i,function(t){return V(e,t,n)})}_.prefixedProp=j,_.camelCase=W,y.extend({css:function(e,i){if(d(e))return e=j(e),1<arguments.length?this.each(function(t){return t.style[e]=i}):a.getComputedStyle(this[0])[e];for(var t in e)this.css(t,e[t]);return this}}),k(["Width","Height"],function(e){var t=e.toLowerCase();y[t]=function(){return this[0].getBoundingClientRect()[t]},y["inner"+e]=function(){return this[0]["client"+e]},y["outer"+e]=function(t){return this[0]["offset"+e]+(t?F(this,"margin"+("Width"===e?"Left":"Top"))+F(this,"margin"+("Width"===e?"Right":"Bottom")):0)}}),y.extend({off:function(e,i){return this.each(function(t){return q(t,e,i)})},on:function(a,i,r,l){var n;if(!d(a)){for(var t in a)this.on(t,i,a[t]);return this}return h(i)&&(r=i,i=null),"ready"===a?(m(r),this):(i&&(n=r,r=function(t){for(var e=t.target;!b(e,i);){if(e===this||null===e)return e=!1;e=e.parentNode}e&&n.call(e,t)}),this.each(function(t){var e,i,n,s,o=r;l&&(o=function(){r.apply(this,arguments),q(t,a,o)}),i=a,n=o,(s=x(e=t,"_cashEvents")||O(e,"_cashEvents",{}))[i]=s[i]||[],s[i].push(n),e.addEventListener(i,n)}))},one:function(t,e,i){return this.on(t,e,i,!0)},ready:m,trigger:function(t,e){if(document.createEvent){var i=document.createEvent("HTMLEvents");return i.initEvent(t,!0,!1),i=this.extend(i,e),this.each(function(t){return t.dispatchEvent(i)})}}}),y.extend({serialize:function(){var s="";return k(this[0].elements||this,function(t){if(!t.disabled&&"FIELDSET"!==t.tagName){var e=t.name;switch(t.type.toLowerCase()){case"file":case"reset":case"submit":case"button":break;case"select-multiple":var i=z(t);null!==i&&k(i,function(t){s+=N(e,t)});break;default:var n=z(t);null!==n&&(s+=N(e,n))}}}),s.substr(1)},val:function(e){return void 0===e?z(this[0]):this.each(function(t){return t.value=e})}}),y.extend({after:function(t){return _(t).insertAfter(this),this},append:function(t){return V(this,t),this},appendTo:function(t){return V(_(t),this),this},before:function(t){return _(t).insertBefore(this),this},clone:function(){return _(this.map(function(t){return t.cloneNode(!0)}))},empty:function(){return this.html(""),this},html:function(t){if(void 0===t)return this[0].innerHTML;var e=t.nodeType?t[0].outerHTML:t;return this.each(function(t){return t.innerHTML=e})},insertAfter:function(t){var s=this;return _(t).each(function(t,e){var i=t.parentNode,n=t.nextSibling;s.each(function(t){i.insertBefore(0===e?t:t.cloneNode(!0),n)})}),this},insertBefore:function(t){var s=this;return _(t).each(function(e,i){var n=e.parentNode;s.each(function(t){n.insertBefore(0===i?t:t.cloneNode(!0),e)})}),this},prepend:function(t){return V(this,t,!0),this},prependTo:function(t){return V(_(t),this,!0),this},remove:function(){return this.each(function(t){if(t.parentNode)return t.parentNode.removeChild(t)})},text:function(e){return void 0===e?this[0].textContent:this.each(function(t){return t.textContent=e})}});var X=o.documentElement;return y.extend({position:function(){var t=this[0];return{left:t.offsetLeft,top:t.offsetTop}},offset:function(){var t=this[0].getBoundingClientRect();return{top:t.top+a.pageYOffset-X.clientTop,left:t.left+a.pageXOffset-X.clientLeft}},offsetParent:function(){return _(this[0].offsetParent)}}),y.extend({children:function(e){var i=[];return this.each(function(t){s.apply(i,t.children)}),i=C(i),e?i.filter(function(t){return b(t,e)}):i},closest:function(t){return!t||this.length<1?_():this.is(t)?this.filter(t):this.parent().closest(t)},is:function(e){if(!e)return!1;var i=!1,n=w(e);return this.each(function(t){return!(i=n(t,e))}),i},find:function(e){if(!e||e.nodeType)return _(e&&this.has(e).length?e:null);var i=[];return this.each(function(t){s.apply(i,v(e,t))}),C(i)},has:function(e){var t=d(e)?function(t){return 0!==v(e,t).length}:function(t){return t.contains(e)};return this.filter(t)},next:function(){return _(this[0].nextElementSibling)},not:function(e){if(!e)return this;var i=w(e);return this.filter(function(t){return!i(t,e)})},parent:function(){var e=[];return this.each(function(t){t&&t.parentNode&&e.push(t.parentNode)}),C(e)},parents:function(e){var i,n=[];return this.each(function(t){for(i=t;i&&i.parentNode&&i!==o.body.parentNode;)i=i.parentNode,(!e||e&&b(i,e))&&n.push(i)}),C(n)},prev:function(){return _(this[0].previousElementSibling)},siblings:function(t){var e=this.parent().children(t),i=this[0];return e.filter(function(t){return t!==i})}}),_}();var Component=function(){function s(t,e,i){_classCallCheck(this,s),e instanceof Element||console.error(Error(e+" is not an HTML Element"));var n=t.getInstance(e);n&&n.destroy(),this.el=e,this.$el=cash(e)}return _createClass(s,null,[{key:"init",value:function(t,e,i){var n=null;if(e instanceof Element)n=new t(e,i);else if(e&&(e.jquery||e.cash||e instanceof NodeList)){for(var s=[],o=0;o<e.length;o++)s.push(new t(e[o],i));n=s}return n}}]),s}();!function(t){t.Package?M={}:t.M={},M.jQueryLoaded=!!t.jQuery}(window),"function"==typeof define&&define.amd?define("M",[],function(){return M}):"undefined"==typeof exports||exports.nodeType||("undefined"!=typeof module&&!module.nodeType&&module.exports&&(exports=module.exports=M),exports.default=M),M.version="1.0.0",M.keys={TAB:9,ENTER:13,ESC:27,ARROW_UP:38,ARROW_DOWN:40},M.tabPressed=!1,M.keyDown=!1;var docHandleKeydown=function(t){M.keyDown=!0,t.which!==M.keys.TAB&&t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ARROW_UP||(M.tabPressed=!0)},docHandleKeyup=function(t){M.keyDown=!1,t.which!==M.keys.TAB&&t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ARROW_UP||(M.tabPressed=!1)},docHandleFocus=function(t){M.keyDown&&document.body.classList.add("keyboard-focused")},docHandleBlur=function(t){document.body.classList.remove("keyboard-focused")};document.addEventListener("keydown",docHandleKeydown,!0),document.addEventListener("keyup",docHandleKeyup,!0),document.addEventListener("focus",docHandleFocus,!0),document.addEventListener("blur",docHandleBlur,!0),M.initializeJqueryWrapper=function(n,s,o){jQuery.fn[s]=function(e){if(n.prototype[e]){var i=Array.prototype.slice.call(arguments,1);if("get"===e.slice(0,3)){var t=this.first()[0][o];return t[e].apply(t,i)}return this.each(function(){var t=this[o];t[e].apply(t,i)})}if("object"==typeof e||!e)return n.init(this,e),this;jQuery.error("Method "+e+" does not exist on jQuery."+s)}},M.AutoInit=function(t){var e=t||document.body,i={Autocomplete:e.querySelectorAll(".autocomplete:not(.no-autoinit)"),Carousel:e.querySelectorAll(".carousel:not(.no-autoinit)"),Chips:e.querySelectorAll(".chips:not(.no-autoinit)"),Collapsible:e.querySelectorAll(".collapsible:not(.no-autoinit)"),Datepicker:e.querySelectorAll(".datepicker:not(.no-autoinit)"),Dropdown:e.querySelectorAll(".dropdown-trigger:not(.no-autoinit)"),Materialbox:e.querySelectorAll(".materialboxed:not(.no-autoinit)"),Modal:e.querySelectorAll(".modal:not(.no-autoinit)"),Parallax:e.querySelectorAll(".parallax:not(.no-autoinit)"),Pushpin:e.querySelectorAll(".pushpin:not(.no-autoinit)"),ScrollSpy:e.querySelectorAll(".scrollspy:not(.no-autoinit)"),FormSelect:e.querySelectorAll("select:not(.no-autoinit)"),Sidenav:e.querySelectorAll(".sidenav:not(.no-autoinit)"),Tabs:e.querySelectorAll(".tabs:not(.no-autoinit)"),TapTarget:e.querySelectorAll(".tap-target:not(.no-autoinit)"),Timepicker:e.querySelectorAll(".timepicker:not(.no-autoinit)"),Tooltip:e.querySelectorAll(".tooltipped:not(.no-autoinit)"),FloatingActionButton:e.querySelectorAll(".fixed-action-btn:not(.no-autoinit)")};for(var n in i){M[n].init(i[n])}},M.objectSelectorString=function(t){return((t.prop("tagName")||"")+(t.attr("id")||"")+(t.attr("class")||"")).replace(/\s/g,"")},M.guid=function(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return function(){return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()}}(),M.escapeHash=function(t){return t.replace(/(:|\.|\[|\]|,|=|\/)/g,"\\$1")},M.elementOrParentIsFixed=function(t){var e=$(t),i=e.add(e.parents()),n=!1;return i.each(function(){if("fixed"===$(this).css("position"))return!(n=!0)}),n},M.checkWithinContainer=function(t,e,i){var n={top:!1,right:!1,bottom:!1,left:!1},s=t.getBoundingClientRect(),o=t===document.body?Math.max(s.bottom,window.innerHeight):s.bottom,a=t.scrollLeft,r=t.scrollTop,l=e.left-a,h=e.top-r;return(l<s.left+i||l<i)&&(n.left=!0),(l+e.width>s.right-i||l+e.width>window.innerWidth-i)&&(n.right=!0),(h<s.top+i||h<i)&&(n.top=!0),(h+e.height>o-i||h+e.height>window.innerHeight-i)&&(n.bottom=!0),n},M.checkPossibleAlignments=function(t,e,i,n){var s={top:!0,right:!0,bottom:!0,left:!0,spaceOnTop:null,spaceOnRight:null,spaceOnBottom:null,spaceOnLeft:null},o="visible"===getComputedStyle(e).overflow,a=e.getBoundingClientRect(),r=Math.min(a.height,window.innerHeight),l=Math.min(a.width,window.innerWidth),h=t.getBoundingClientRect(),d=e.scrollLeft,u=e.scrollTop,c=i.left-d,p=i.top-u,v=i.top+h.height-u;return s.spaceOnRight=o?window.innerWidth-(h.left+i.width):l-(c+i.width),s.spaceOnRight<0&&(s.left=!1),s.spaceOnLeft=o?h.right-i.width:c-i.width+h.width,s.spaceOnLeft<0&&(s.right=!1),s.spaceOnBottom=o?window.innerHeight-(h.top+i.height+n):r-(p+i.height+n),s.spaceOnBottom<0&&(s.top=!1),s.spaceOnTop=o?h.bottom-(i.height+n):v-(i.height-n),s.spaceOnTop<0&&(s.bottom=!1),s},M.getOverflowParent=function(t){return null==t?null:t===document.body||"visible"!==getComputedStyle(t).overflow?t:M.getOverflowParent(t.parentElement)},M.getIdFromTrigger=function(t){var e=t.getAttribute("data-target");return e||(e=(e=t.getAttribute("href"))?e.slice(1):""),e},M.getDocumentScrollTop=function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},M.getDocumentScrollLeft=function(){return window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0};var getTime=Date.now||function(){return(new Date).getTime()};M.throttle=function(i,n,s){var o=void 0,a=void 0,r=void 0,l=null,h=0;s||(s={});var d=function(){h=!1===s.leading?0:getTime(),l=null,r=i.apply(o,a),o=a=null};return function(){var t=getTime();h||!1!==s.leading||(h=t);var e=n-(t-h);return o=this,a=arguments,e<=0?(clearTimeout(l),l=null,h=t,r=i.apply(o,a),o=a=null):l||!1===s.trailing||(l=setTimeout(d,e)),r}};var $jscomp={scope:{}};$jscomp.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(t,e,i){if(i.get||i.set)throw new TypeError("ES3 does not support getters and setters.");t!=Array.prototype&&t!=Object.prototype&&(t[e]=i.value)},$jscomp.getGlobal=function(t){return"undefined"!=typeof window&&window===t?t:"undefined"!=typeof global&&null!=global?global:t},$jscomp.global=$jscomp.getGlobal(this),$jscomp.SYMBOL_PREFIX="jscomp_symbol_",$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){},$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)},$jscomp.symbolCounter_=0,$jscomp.Symbol=function(t){return $jscomp.SYMBOL_PREFIX+(t||"")+$jscomp.symbolCounter_++},$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var t=$jscomp.global.Symbol.iterator;t||(t=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator")),"function"!=typeof Array.prototype[t]&&$jscomp.defineProperty(Array.prototype,t,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}}),$jscomp.initSymbolIterator=function(){}},$jscomp.arrayIterator=function(t){var e=0;return $jscomp.iteratorPrototype(function(){return e<t.length?{done:!1,value:t[e++]}:{done:!0}})},$jscomp.iteratorPrototype=function(t){return $jscomp.initSymbolIterator(),(t={next:t})[$jscomp.global.Symbol.iterator]=function(){return this},t},$jscomp.array=$jscomp.array||{},$jscomp.iteratorFromArray=function(e,i){$jscomp.initSymbolIterator(),e instanceof String&&(e+="");var n=0,s={next:function(){if(n<e.length){var t=n++;return{value:i(t,e[t]),done:!1}}return s.next=function(){return{done:!0,value:void 0}},s.next()}};return s[Symbol.iterator]=function(){return s},s},$jscomp.polyfill=function(t,e,i,n){if(e){for(i=$jscomp.global,t=t.split("."),n=0;n<t.length-1;n++){var s=t[n];s in i||(i[s]={}),i=i[s]}(e=e(n=i[t=t[t.length-1]]))!=n&&null!=e&&$jscomp.defineProperty(i,t,{configurable:!0,writable:!0,value:e})}},$jscomp.polyfill("Array.prototype.keys",function(t){return t||function(){return $jscomp.iteratorFromArray(this,function(t){return t})}},"es6-impl","es3");var $jscomp$this=this;M.anime=function(){function s(t){if(!B.col(t))try{return document.querySelectorAll(t)}catch(t){}}function b(t,e){for(var i=t.length,n=2<=arguments.length?e:void 0,s=[],o=0;o<i;o++)if(o in t){var a=t[o];e.call(n,a,o,t)&&s.push(a)}return s}function d(t){return t.reduce(function(t,e){return t.concat(B.arr(e)?d(e):e)},[])}function o(t){return B.arr(t)?t:(B.str(t)&&(t=s(t)||t),t instanceof NodeList||t instanceof HTMLCollection?[].slice.call(t):[t])}function a(t,e){return t.some(function(t){return t===e})}function r(t){var e,i={};for(e in t)i[e]=t[e];return i}function u(t,e){var i,n=r(t);for(i in t)n[i]=e.hasOwnProperty(i)?e[i]:t[i];return n}function c(t,e){var i,n=r(t);for(i in e)n[i]=B.und(t[i])?e[i]:t[i];return n}function l(t){if(t=/([\+\-]?[0-9#\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(t))return t[2]}function h(t,e){return B.fnc(t)?t(e.target,e.id,e.total):t}function w(t,e){if(e in t.style)return getComputedStyle(t).getPropertyValue(e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase())||"0"}function p(t,e){return B.dom(t)&&a($,e)?"transform":B.dom(t)&&(t.getAttribute(e)||B.svg(t)&&t[e])?"attribute":B.dom(t)&&"transform"!==e&&w(t,e)?"css":null!=t[e]?"object":void 0}function v(t,e){switch(p(t,e)){case"transform":return function(t,i){var e,n=-1<(e=i).indexOf("translate")||"perspective"===e?"px":-1<e.indexOf("rotate")||-1<e.indexOf("skew")?"deg":void 0,n=-1<i.indexOf("scale")?1:0+n;if(!(t=t.style.transform))return n;for(var s=[],o=[],a=[],r=/(\w+)\((.+?)\)/g;s=r.exec(t);)o.push(s[1]),a.push(s[2]);return(t=b(a,function(t,e){return o[e]===i})).length?t[0]:n}(t,e);case"css":return w(t,e);case"attribute":return t.getAttribute(e)}return t[e]||0}function f(t,e){var i=/^(\*=|\+=|-=)/.exec(t);if(!i)return t;var n=l(t)||0;switch(e=parseFloat(e),t=parseFloat(t.replace(i[0],"")),i[0][0]){case"+":return e+t+n;case"-":return e-t+n;case"*":return e*t+n}}function m(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function i(t){t=t.points;for(var e,i=0,n=0;n<t.numberOfItems;n++){var s=t.getItem(n);0<n&&(i+=m(e,s)),e=s}return i}function g(t){if(t.getTotalLength)return t.getTotalLength();switch(t.tagName.toLowerCase()){case"circle":return 2*Math.PI*t.getAttribute("r");case"rect":return 2*t.getAttribute("width")+2*t.getAttribute("height");case"line":return m({x:t.getAttribute("x1"),y:t.getAttribute("y1")},{x:t.getAttribute("x2"),y:t.getAttribute("y2")});case"polyline":return i(t);case"polygon":var e=t.points;return i(t)+m(e.getItem(e.numberOfItems-1),e.getItem(0))}}function C(e,i){function t(t){return t=void 0===t?0:t,e.el.getPointAtLength(1<=i+t?i+t:0)}var n=t(),s=t(-1),o=t(1);switch(e.property){case"x":return n.x;case"y":return n.y;case"angle":return 180*Math.atan2(o.y-s.y,o.x-s.x)/Math.PI}}function _(t,e){var i,n=/-?\d*\.?\d+/g;if(i=B.pth(t)?t.totalLength:t,B.col(i))if(B.rgb(i)){var s=/rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g.exec(i);i=s?"rgba("+s[1]+",1)":i}else i=B.hex(i)?function(t){t=t.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,function(t,e,i,n){return e+e+i+i+n+n});var e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);t=parseInt(e[1],16);var i=parseInt(e[2],16),e=parseInt(e[3],16);return"rgba("+t+","+i+","+e+",1)"}(i):B.hsl(i)?function(t){function e(t,e,i){return i<0&&(i+=1),1<i&&--i,i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+(e-t)*(2/3-i)*6:t}var i=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(t)||/hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(t);t=parseInt(i[1])/360;var n=parseInt(i[2])/100,s=parseInt(i[3])/100,i=i[4]||1;if(0==n)s=n=t=s;else{var o=s<.5?s*(1+n):s+n-s*n,a=2*s-o,s=e(a,o,t+1/3),n=e(a,o,t);t=e(a,o,t-1/3)}return"rgba("+255*s+","+255*n+","+255*t+","+i+")"}(i):void 0;else s=(s=l(i))?i.substr(0,i.length-s.length):i,i=e&&!/\s/g.test(i)?s+e:s;return{original:i+="",numbers:i.match(n)?i.match(n).map(Number):[0],strings:B.str(t)||e?i.split(n):[]}}function y(t){return b(t=t?d(B.arr(t)?t.map(o):o(t)):[],function(t,e,i){return i.indexOf(t)===e})}function k(t,i){var e=r(i);if(B.arr(t)){var n=t.length;2!==n||B.obj(t[0])?B.fnc(i.duration)||(e.duration=i.duration/n):t={value:t}}return o(t).map(function(t,e){return e=e?0:i.delay,t=B.obj(t)&&!B.pth(t)?t:{value:t},B.und(t.delay)&&(t.delay=e),t}).map(function(t){return c(t,e)})}function E(o,a){var r;return o.tweens.map(function(t){var e=(t=function(t,e){var i,n={};for(i in t){var s=h(t[i],e);B.arr(s)&&1===(s=s.map(function(t){return h(t,e)})).length&&(s=s[0]),n[i]=s}return n.duration=parseFloat(n.duration),n.delay=parseFloat(n.delay),n}(t,a)).value,i=v(a.target,o.name),n=r?r.to.original:i,n=B.arr(e)?e[0]:n,s=f(B.arr(e)?e[1]:e,n),i=l(s)||l(n)||l(i);return t.from=_(n,i),t.to=_(s,i),t.start=r?r.end:o.offset,t.end=t.start+t.delay+t.duration,t.easing=function(t){return B.arr(t)?D.apply(this,t):S[t]}(t.easing),t.elasticity=(1e3-Math.min(Math.max(t.elasticity,1),999))/1e3,t.isPath=B.pth(e),t.isColor=B.col(t.from.original),t.isColor&&(t.round=1),r=t})}function M(e,t,i,n){var s="delay"===e;return t.length?(s?Math.min:Math.max).apply(Math,t.map(function(t){return t[e]})):s?n.delay:i.offset+n.delay+n.duration}function n(t){var e,i,n,s,o=u(L,t),a=u(T,t),r=(i=t.targets,(n=y(i)).map(function(t,e){return{target:t,id:e,total:n.length}})),l=[],h=c(o,a);for(e in t)h.hasOwnProperty(e)||"targets"===e||l.push({name:e,offset:h.offset,tweens:k(t[e],a)});return s=l,t=b(d(r.map(function(n){return s.map(function(t){var e=p(n.target,t.name);if(e){var i=E(t,n);t={type:e,property:t.name,animatable:n,tweens:i,duration:i[i.length-1].end,delay:i[0].delay}}else t=void 0;return t})})),function(t){return!B.und(t)}),c(o,{children:[],animatables:r,animations:t,duration:M("duration",t,o,a),delay:M("delay",t,o,a)})}function O(t){function d(){return window.Promise&&new Promise(function(t){return _=t})}function u(t){return k.reversed?k.duration-t:t}function c(e){for(var t=0,i={},n=k.animations,s=n.length;t<s;){var o=n[t],a=o.animatable,r=o.tweens,l=r.length-1,h=r[l];l&&(h=b(r,function(t){return e<t.end})[0]||h);for(var r=Math.min(Math.max(e-h.start-h.delay,0),h.duration)/h.duration,d=isNaN(r)?1:h.easing(r,h.elasticity),r=h.to.strings,u=h.round,l=[],c=void 0,c=h.to.numbers.length,p=0;p<c;p++){var v=void 0,v=h.to.numbers[p],f=h.from.numbers[p],v=h.isPath?C(h.value,d*v):f+d*(v-f);u&&(h.isColor&&2<p||(v=Math.round(v*u)/u)),l.push(v)}if(h=r.length)for(c=r[0],d=0;d<h;d++)u=r[d+1],p=l[d],isNaN(p)||(c=u?c+(p+u):c+(p+" "));else c=l[0];I[o.type](a.target,o.property,c,i,a.id),o.currentValue=c,t++}if(t=Object.keys(i).length)for(n=0;n<t;n++)x||(x=w(document.body,"transform")?"transform":"-webkit-transform"),k.animatables[n].target.style[x]=i[n].join(" ");k.currentTime=e,k.progress=e/k.duration*100}function p(t){k[t]&&k[t](k)}function v(){k.remaining&&!0!==k.remaining&&k.remaining--}function e(t){var e=k.duration,i=k.offset,n=i+k.delay,s=k.currentTime,o=k.reversed,a=u(t);if(k.children.length){var r=k.children,l=r.length;if(a>=k.currentTime)for(var h=0;h<l;h++)r[h].seek(a);else for(;l--;)r[l].seek(a)}(n<=a||!e)&&(k.began||(k.began=!0,p("begin")),p("run")),i<a&&a<e?c(a):(a<=i&&0!==s&&(c(0),o&&v()),(e<=a&&s!==e||!e)&&(c(e),o||v())),p("update"),e<=t&&(k.remaining?(m=f,"alternate"===k.direction&&(k.reversed=!k.reversed)):(k.pause(),k.completed||(k.completed=!0,p("complete"),"Promise"in window&&(_(),y=d()))),g=0)}t=void 0===t?{}:t;var f,m,g=0,_=null,y=d(),k=n(t);return k.reset=function(){var t=k.direction,e=k.loop;for(k.currentTime=0,k.progress=0,k.paused=!0,k.began=!1,k.completed=!1,k.reversed="reverse"===t,k.remaining="alternate"===t&&1===e?2:e,c(0),t=k.children.length;t--;)k.children[t].reset()},k.tick=function(t){f=t,m||(m=f),e((g+f-m)*O.speed)},k.seek=function(t){e(u(t))},k.pause=function(){var t=A.indexOf(k);-1<t&&A.splice(t,1),k.paused=!0},k.play=function(){k.paused&&(k.paused=!1,m=0,g=u(k.currentTime),A.push(k),R||H())},k.reverse=function(){k.reversed=!k.reversed,m=0,g=u(k.currentTime)},k.restart=function(){k.pause(),k.reset(),k.play()},k.finished=y,k.reset(),k.autoplay&&k.play(),k}var x,L={update:void 0,begin:void 0,run:void 0,complete:void 0,loop:1,direction:"normal",autoplay:!0,offset:0},T={duration:1e3,delay:0,easing:"easeOutElastic",elasticity:500,round:0},$="translateX translateY translateZ rotate rotateX rotateY rotateZ scale scaleX scaleY scaleZ skewX skewY perspective".split(" "),B={arr:function(t){return Array.isArray(t)},obj:function(t){return-1<Object.prototype.toString.call(t).indexOf("Object")},pth:function(t){return B.obj(t)&&t.hasOwnProperty("totalLength")},svg:function(t){return t instanceof SVGElement},dom:function(t){return t.nodeType||B.svg(t)},str:function(t){return"string"==typeof t},fnc:function(t){return"function"==typeof t},und:function(t){return void 0===t},hex:function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},rgb:function(t){return/^rgb/.test(t)},hsl:function(t){return/^hsl/.test(t)},col:function(t){return B.hex(t)||B.rgb(t)||B.hsl(t)}},D=function(){function u(t,e,i){return(((1-3*i+3*e)*t+(3*i-6*e))*t+3*e)*t}return function(a,r,l,h){if(0<=a&&a<=1&&0<=l&&l<=1){var d=new Float32Array(11);if(a!==r||l!==h)for(var t=0;t<11;++t)d[t]=u(.1*t,a,l);return function(t){if(a===r&&l===h)return t;if(0===t)return 0;if(1===t)return 1;for(var e=0,i=1;10!==i&&d[i]<=t;++i)e+=.1;var i=e+(t-d[--i])/(d[i+1]-d[i])*.1,n=3*(1-3*l+3*a)*i*i+2*(3*l-6*a)*i+3*a;if(.001<=n){for(e=0;e<4&&0!=(n=3*(1-3*l+3*a)*i*i+2*(3*l-6*a)*i+3*a);++e)var s=u(i,a,l)-t,i=i-s/n;t=i}else if(0===n)t=i;else{for(var i=e,e=e+.1,o=0;0<(n=u(s=i+(e-i)/2,a,l)-t)?e=s:i=s,1e-7<Math.abs(n)&&++o<10;);t=s}return u(t,r,h)}}}}(),S=function(){function i(t,e){return 0===t||1===t?t:-Math.pow(2,10*(t-1))*Math.sin(2*(t-1-e/(2*Math.PI)*Math.asin(1))*Math.PI/e)}var t,n="Quad Cubic Quart Quint Sine Expo Circ Back Elastic".split(" "),e={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],i],Out:[[.25,.46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],[.075,.82,.165,1],[.175,.885,.32,1.275],function(t,e){return 1-i(1-t,e)}],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],function(t,e){return t<.5?i(2*t,e)/2:1-i(-2*t+2,e)/2}]},s={linear:D(.25,.25,.75,.75)},o={};for(t in e)o.type=t,e[o.type].forEach(function(i){return function(t,e){s["ease"+i.type+n[e]]=B.fnc(t)?t:D.apply($jscomp$this,t)}}(o)),o={type:o.type};return s}(),I={css:function(t,e,i){return t.style[e]=i},attribute:function(t,e,i){return t.setAttribute(e,i)},object:function(t,e,i){return t[e]=i},transform:function(t,e,i,n,s){n[s]||(n[s]=[]),n[s].push(e+"("+i+")")}},A=[],R=0,H=function(){function n(){R=requestAnimationFrame(t)}function t(t){var e=A.length;if(e){for(var i=0;i<e;)A[i]&&A[i].tick(t),i++;n()}else cancelAnimationFrame(R),R=0}return n}();return O.version="2.2.0",O.speed=1,O.running=A,O.remove=function(t){t=y(t);for(var e=A.length;e--;)for(var i=A[e],n=i.animations,s=n.length;s--;)a(t,n[s].animatable.target)&&(n.splice(s,1),n.length||i.pause())},O.getValue=v,O.path=function(t,e){var i=B.str(t)?s(t)[0]:t,n=e||100;return function(t){return{el:i,property:t,totalLength:g(i)*(n/100)}}},O.setDashoffset=function(t){var e=g(t);return t.setAttribute("stroke-dasharray",e),e},O.bezier=D,O.easings=S,O.timeline=function(n){var s=O(n);return s.pause(),s.duration=0,s.add=function(t){return s.children.forEach(function(t){t.began=!0,t.completed=!0}),o(t).forEach(function(t){var e=c(t,u(T,n||{}));e.targets=e.targets||n.targets,t=s.duration;var i=e.offset;e.autoplay=!1,e.direction=s.direction,e.offset=B.und(i)?t:f(i,t),s.began=!0,s.completed=!0,s.seek(e.offset),(e=O(e)).began=!0,e.completed=!0,e.duration>t&&(s.duration=e.duration),s.children.push(e)}),s.seek(0),s.reset(),s.autoplay&&s.restart(),s},s},O.random=function(t,e){return Math.floor(Math.random()*(e-t+1))+t},O}(),function(r,l){"use strict";var e={accordion:!0,onOpenStart:void 0,onOpenEnd:void 0,onCloseStart:void 0,onCloseEnd:void 0,inDuration:300,outDuration:300},t=function(t){function s(t,e){_classCallCheck(this,s);var i=_possibleConstructorReturn(this,(s.__proto__||Object.getPrototypeOf(s)).call(this,s,t,e));(i.el.M_Collapsible=i).options=r.extend({},s.defaults,e),i.$headers=i.$el.children("li").children(".collapsible-header"),i.$headers.attr("tabindex",0),i._setupEventHandlers();var n=i.$el.children("li.active").children(".collapsible-body");return i.options.accordion?n.first().css("display","block"):n.css("display","block"),i}return _inherits(s,Component),_createClass(s,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Collapsible=void 0}},{key:"_setupEventHandlers",value:function(){var e=this;this._handleCollapsibleClickBound=this._handleCollapsibleClick.bind(this),this._handleCollapsibleKeydownBound=this._handleCollapsibleKeydown.bind(this),this.el.addEventListener("click",this._handleCollapsibleClickBound),this.$headers.each(function(t){t.addEventListener("keydown",e._handleCollapsibleKeydownBound)})}},{key:"_removeEventHandlers",value:function(){var e=this;this.el.removeEventListener("click",this._handleCollapsibleClickBound),this.$headers.each(function(t){t.removeEventListener("keydown",e._handleCollapsibleKeydownBound)})}},{key:"_handleCollapsibleClick",value:function(t){var e=r(t.target).closest(".collapsible-header");if(t.target&&e.length){var i=e.closest(".collapsible");if(i[0]===this.el){var n=e.closest("li"),s=i.children("li"),o=n[0].classList.contains("active"),a=s.index(n);o?this.close(a):this.open(a)}}}},{key:"_handleCollapsibleKeydown",value:function(t){13===t.keyCode&&this._handleCollapsibleClickBound(t)}},{key:"_animateIn",value:function(t){var e=this,i=this.$el.children("li").eq(t);if(i.length){var n=i.children(".collapsible-body");l.remove(n[0]),n.css({display:"block",overflow:"hidden",height:0,paddingTop:"",paddingBottom:""});var s=n.css("padding-top"),o=n.css("padding-bottom"),a=n[0].scrollHeight;n.css({paddingTop:0,paddingBottom:0}),l({targets:n[0],height:a,paddingTop:s,paddingBottom:o,duration:this.options.inDuration,easing:"easeInOutCubic",complete:function(t){n.css({overflow:"",paddingTop:"",paddingBottom:"",height:""}),"function"==typeof e.options.onOpenEnd&&e.options.onOpenEnd.call(e,i[0])}})}}},{key:"_animateOut",value:function(t){var e=this,i=this.$el.children("li").eq(t);if(i.length){var n=i.children(".collapsible-body");l.remove(n[0]),n.css("overflow","hidden"),l({targets:n[0],height:0,paddingTop:0,paddingBottom:0,duration:this.options.outDuration,easing:"easeInOutCubic",complete:function(){n.css({height:"",overflow:"",padding:"",display:""}),"function"==typeof e.options.onCloseEnd&&e.options.onCloseEnd.call(e,i[0])}})}}},{key:"open",value:function(t){var i=this,e=this.$el.children("li").eq(t);if(e.length&&!e[0].classList.contains("active")){if("function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,e[0]),this.options.accordion){var n=this.$el.children("li");this.$el.children("li.active").each(function(t){var e=n.index(r(t));i.close(e)})}e[0].classList.add("active"),this._animateIn(t)}}},{key:"close",value:function(t){var e=this.$el.children("li").eq(t);e.length&&e[0].classList.contains("active")&&("function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,e[0]),e[0].classList.remove("active"),this._animateOut(t))}}],[{key:"init",value:function(t,e){return _get(s.__proto__||Object.getPrototypeOf(s),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Collapsible}},{key:"defaults",get:function(){return e}}]),s}();M.Collapsible=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"collapsible","M_Collapsible")}(cash,M.anime),function(h,i){"use strict";var e={alignment:"left",autoFocus:!0,constrainWidth:!0,container:null,coverTrigger:!0,closeOnClick:!0,hover:!1,inDuration:150,outDuration:250,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,onItemClick:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return i.el.M_Dropdown=i,n._dropdowns.push(i),i.id=M.getIdFromTrigger(t),i.dropdownEl=document.getElementById(i.id),i.$dropdownEl=h(i.dropdownEl),i.options=h.extend({},n.defaults,e),i.isOpen=!1,i.isScrollable=!1,i.isTouchMoving=!1,i.focusedIndex=-1,i.filterQuery=[],i.options.container?h(i.options.container).append(i.dropdownEl):i.$el.after(i.dropdownEl),i._makeDropdownFocusable(),i._resetFilterQueryBound=i._resetFilterQuery.bind(i),i._handleDocumentClickBound=i._handleDocumentClick.bind(i),i._handleDocumentTouchmoveBound=i._handleDocumentTouchmove.bind(i),i._handleDropdownClickBound=i._handleDropdownClick.bind(i),i._handleDropdownKeydownBound=i._handleDropdownKeydown.bind(i),i._handleTriggerKeydownBound=i._handleTriggerKeydown.bind(i),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._resetDropdownStyles(),this._removeEventHandlers(),n._dropdowns.splice(n._dropdowns.indexOf(this),1),this.el.M_Dropdown=void 0}},{key:"_setupEventHandlers",value:function(){this.el.addEventListener("keydown",this._handleTriggerKeydownBound),this.dropdownEl.addEventListener("click",this._handleDropdownClickBound),this.options.hover?(this._handleMouseEnterBound=this._handleMouseEnter.bind(this),this.el.addEventListener("mouseenter",this._handleMouseEnterBound),this._handleMouseLeaveBound=this._handleMouseLeave.bind(this),this.el.addEventListener("mouseleave",this._handleMouseLeaveBound),this.dropdownEl.addEventListener("mouseleave",this._handleMouseLeaveBound)):(this._handleClickBound=this._handleClick.bind(this),this.el.addEventListener("click",this._handleClickBound))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("keydown",this._handleTriggerKeydownBound),this.dropdownEl.removeEventListener("click",this._handleDropdownClickBound),this.options.hover?(this.el.removeEventListener("mouseenter",this._handleMouseEnterBound),this.el.removeEventListener("mouseleave",this._handleMouseLeaveBound),this.dropdownEl.removeEventListener("mouseleave",this._handleMouseLeaveBound)):this.el.removeEventListener("click",this._handleClickBound)}},{key:"_setupTemporaryEventHandlers",value:function(){document.body.addEventListener("click",this._handleDocumentClickBound,!0),document.body.addEventListener("touchend",this._handleDocumentClickBound),document.body.addEventListener("touchmove",this._handleDocumentTouchmoveBound),this.dropdownEl.addEventListener("keydown",this._handleDropdownKeydownBound)}},{key:"_removeTemporaryEventHandlers",value:function(){document.body.removeEventListener("click",this._handleDocumentClickBound,!0),document.body.removeEventListener("touchend",this._handleDocumentClickBound),document.body.removeEventListener("touchmove",this._handleDocumentTouchmoveBound),this.dropdownEl.removeEventListener("keydown",this._handleDropdownKeydownBound)}},{key:"_handleClick",value:function(t){t.preventDefault(),this.open()}},{key:"_handleMouseEnter",value:function(){this.open()}},{key:"_handleMouseLeave",value:function(t){var e=t.toElement||t.relatedTarget,i=!!h(e).closest(".dropdown-content").length,n=!1,s=h(e).closest(".dropdown-trigger");s.length&&s[0].M_Dropdown&&s[0].M_Dropdown.isOpen&&(n=!0),n||i||this.close()}},{key:"_handleDocumentClick",value:function(t){var e=this,i=h(t.target);this.options.closeOnClick&&i.closest(".dropdown-content").length&&!this.isTouchMoving?setTimeout(function(){e.close()},0):!i.closest(".dropdown-trigger").length&&i.closest(".dropdown-content").length||setTimeout(function(){e.close()},0),this.isTouchMoving=!1}},{key:"_handleTriggerKeydown",value:function(t){t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ENTER||this.isOpen||(t.preventDefault(),this.open())}},{key:"_handleDocumentTouchmove",value:function(t){h(t.target).closest(".dropdown-content").length&&(this.isTouchMoving=!0)}},{key:"_handleDropdownClick",value:function(t){if("function"==typeof this.options.onItemClick){var e=h(t.target).closest("li")[0];this.options.onItemClick.call(this,e)}}},{key:"_handleDropdownKeydown",value:function(t){if(t.which===M.keys.TAB)t.preventDefault(),this.close();else if(t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ARROW_UP||!this.isOpen)if(t.which===M.keys.ENTER&&this.isOpen){var e=this.dropdownEl.children[this.focusedIndex],i=h(e).find("a, button").first();i.length?i[0].click():e&&e.click()}else t.which===M.keys.ESC&&this.isOpen&&(t.preventDefault(),this.close());else{t.preventDefault();var n=t.which===M.keys.ARROW_DOWN?1:-1,s=this.focusedIndex,o=!1;do{if(s+=n,this.dropdownEl.children[s]&&-1!==this.dropdownEl.children[s].tabIndex){o=!0;break}}while(s<this.dropdownEl.children.length&&0<=s);o&&(this.focusedIndex=s,this._focusFocusedItem())}var a=String.fromCharCode(t.which).toLowerCase();if(a&&-1===[9,13,27,38,40].indexOf(t.which)){this.filterQuery.push(a);var r=this.filterQuery.join(""),l=h(this.dropdownEl).find("li").filter(function(t){return 0===h(t).text().toLowerCase().indexOf(r)})[0];l&&(this.focusedIndex=h(l).index(),this._focusFocusedItem())}this.filterTimeout=setTimeout(this._resetFilterQueryBound,1e3)}},{key:"_resetFilterQuery",value:function(){this.filterQuery=[]}},{key:"_resetDropdownStyles",value:function(){this.$dropdownEl.css({display:"",width:"",height:"",left:"",top:"","transform-origin":"",transform:"",opacity:""})}},{key:"_makeDropdownFocusable",value:function(){this.dropdownEl.tabIndex=0,h(this.dropdownEl).children().each(function(t){t.getAttribute("tabindex")||t.setAttribute("tabindex",0)})}},{key:"_focusFocusedItem",value:function(){0<=this.focusedIndex&&this.focusedIndex<this.dropdownEl.children.length&&this.options.autoFocus&&this.dropdownEl.children[this.focusedIndex].focus()}},{key:"_getDropdownPosition",value:function(){this.el.offsetParent.getBoundingClientRect();var t=this.el.getBoundingClientRect(),e=this.dropdownEl.getBoundingClientRect(),i=e.height,n=e.width,s=t.left-e.left,o=t.top-e.top,a={left:s,top:o,height:i,width:n},r=this.dropdownEl.offsetParent?this.dropdownEl.offsetParent:this.dropdownEl.parentNode,l=M.checkPossibleAlignments(this.el,r,a,this.options.coverTrigger?0:t.height),h="top",d=this.options.alignment;if(o+=this.options.coverTrigger?0:t.height,this.isScrollable=!1,l.top||(l.bottom?h="bottom":(this.isScrollable=!0,l.spaceOnTop>l.spaceOnBottom?(h="bottom",i+=l.spaceOnTop,o-=l.spaceOnTop):i+=l.spaceOnBottom)),!l[d]){var u="left"===d?"right":"left";l[u]?d=u:l.spaceOnLeft>l.spaceOnRight?(d="right",n+=l.spaceOnLeft,s-=l.spaceOnLeft):(d="left",n+=l.spaceOnRight)}return"bottom"===h&&(o=o-e.height+(this.options.coverTrigger?t.height:0)),"right"===d&&(s=s-e.width+t.width),{x:s,y:o,verticalAlignment:h,horizontalAlignment:d,height:i,width:n}}},{key:"_animateIn",value:function(){var e=this;i.remove(this.dropdownEl),i({targets:this.dropdownEl,opacity:{value:[0,1],easing:"easeOutQuad"},scaleX:[.3,1],scaleY:[.3,1],duration:this.options.inDuration,easing:"easeOutQuint",complete:function(t){e.options.autoFocus&&e.dropdownEl.focus(),"function"==typeof e.options.onOpenEnd&&e.options.onOpenEnd.call(e,e.el)}})}},{key:"_animateOut",value:function(){var e=this;i.remove(this.dropdownEl),i({targets:this.dropdownEl,opacity:{value:0,easing:"easeOutQuint"},scaleX:.3,scaleY:.3,duration:this.options.outDuration,easing:"easeOutQuint",complete:function(t){e._resetDropdownStyles(),"function"==typeof e.options.onCloseEnd&&e.options.onCloseEnd.call(e,e.el)}})}},{key:"_placeDropdown",value:function(){var t=this.options.constrainWidth?this.el.getBoundingClientRect().width:this.dropdownEl.getBoundingClientRect().width;this.dropdownEl.style.width=t+"px";var e=this._getDropdownPosition();this.dropdownEl.style.left=e.x+"px",this.dropdownEl.style.top=e.y+"px",this.dropdownEl.style.height=e.height+"px",this.dropdownEl.style.width=e.width+"px",this.dropdownEl.style.transformOrigin=("left"===e.horizontalAlignment?"0":"100%")+" "+("top"===e.verticalAlignment?"0":"100%")}},{key:"open",value:function(){this.isOpen||(this.isOpen=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this._resetDropdownStyles(),this.dropdownEl.style.display="block",this._placeDropdown(),this._animateIn(),this._setupTemporaryEventHandlers())}},{key:"close",value:function(){this.isOpen&&(this.isOpen=!1,this.focusedIndex=-1,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this._animateOut(),this._removeTemporaryEventHandlers(),this.options.autoFocus&&this.el.focus())}},{key:"recalculateDimensions",value:function(){this.isOpen&&(this.$dropdownEl.css({width:"",height:"",left:"",top:"","transform-origin":""}),this._placeDropdown())}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Dropdown}},{key:"defaults",get:function(){return e}}]),n}();t._dropdowns=[],M.Dropdown=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"dropdown","M_Dropdown")}(cash,M.anime),function(s,i){"use strict";var e={opacity:.5,inDuration:250,outDuration:250,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,preventScrolling:!0,dismissible:!0,startingTop:"4%",endingTop:"10%"},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Modal=i).options=s.extend({},n.defaults,e),i.isOpen=!1,i.id=i.$el.attr("id"),i._openingTrigger=void 0,i.$overlay=s('<div class="modal-overlay"></div>'),i.el.tabIndex=0,i._nthModalOpened=0,n._count++,i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){n._count--,this._removeEventHandlers(),this.el.removeAttribute("style"),this.$overlay.remove(),this.el.M_Modal=void 0}},{key:"_setupEventHandlers",value:function(){this._handleOverlayClickBound=this._handleOverlayClick.bind(this),this._handleModalCloseClickBound=this._handleModalCloseClick.bind(this),1===n._count&&document.body.addEventListener("click",this._handleTriggerClick),this.$overlay[0].addEventListener("click",this._handleOverlayClickBound),this.el.addEventListener("click",this._handleModalCloseClickBound)}},{key:"_removeEventHandlers",value:function(){0===n._count&&document.body.removeEventListener("click",this._handleTriggerClick),this.$overlay[0].removeEventListener("click",this._handleOverlayClickBound),this.el.removeEventListener("click",this._handleModalCloseClickBound)}},{key:"_handleTriggerClick",value:function(t){var e=s(t.target).closest(".modal-trigger");if(e.length){var i=M.getIdFromTrigger(e[0]),n=document.getElementById(i).M_Modal;n&&n.open(e),t.preventDefault()}}},{key:"_handleOverlayClick",value:function(){this.options.dismissible&&this.close()}},{key:"_handleModalCloseClick",value:function(t){s(t.target).closest(".modal-close").length&&this.close()}},{key:"_handleKeydown",value:function(t){27===t.keyCode&&this.options.dismissible&&this.close()}},{key:"_handleFocus",value:function(t){this.el.contains(t.target)||this._nthModalOpened!==n._modalsOpen||this.el.focus()}},{key:"_animateIn",value:function(){var t=this;s.extend(this.el.style,{display:"block",opacity:0}),s.extend(this.$overlay[0].style,{display:"block",opacity:0}),i({targets:this.$overlay[0],opacity:this.options.opacity,duration:this.options.inDuration,easing:"easeOutQuad"});var e={targets:this.el,duration:this.options.inDuration,easing:"easeOutCubic",complete:function(){"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el,t._openingTrigger)}};this.el.classList.contains("bottom-sheet")?s.extend(e,{bottom:0,opacity:1}):s.extend(e,{top:[this.options.startingTop,this.options.endingTop],opacity:1,scaleX:[.8,1],scaleY:[.8,1]}),i(e)}},{key:"_animateOut",value:function(){var t=this;i({targets:this.$overlay[0],opacity:0,duration:this.options.outDuration,easing:"easeOutQuart"});var e={targets:this.el,duration:this.options.outDuration,easing:"easeOutCubic",complete:function(){t.el.style.display="none",t.$overlay.remove(),"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}};this.el.classList.contains("bottom-sheet")?s.extend(e,{bottom:"-100%",opacity:0}):s.extend(e,{top:[this.options.endingTop,this.options.startingTop],opacity:0,scaleX:.8,scaleY:.8}),i(e)}},{key:"open",value:function(t){if(!this.isOpen)return this.isOpen=!0,n._modalsOpen++,this._nthModalOpened=n._modalsOpen,this.$overlay[0].style.zIndex=1e3+2*n._modalsOpen,this.el.style.zIndex=1e3+2*n._modalsOpen+1,this._openingTrigger=t?t[0]:void 0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el,this._openingTrigger),this.options.preventScrolling&&(document.body.style.overflow="hidden"),this.el.classList.add("open"),this.el.insertAdjacentElement("afterend",this.$overlay[0]),this.options.dismissible&&(this._handleKeydownBound=this._handleKeydown.bind(this),this._handleFocusBound=this._handleFocus.bind(this),document.addEventListener("keydown",this._handleKeydownBound),document.addEventListener("focus",this._handleFocusBound,!0)),i.remove(this.el),i.remove(this.$overlay[0]),this._animateIn(),this.el.focus(),this}},{key:"close",value:function(){if(this.isOpen)return this.isOpen=!1,n._modalsOpen--,this._nthModalOpened=0,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this.el.classList.remove("open"),0===n._modalsOpen&&(document.body.style.overflow=""),this.options.dismissible&&(document.removeEventListener("keydown",this._handleKeydownBound),document.removeEventListener("focus",this._handleFocusBound,!0)),i.remove(this.el),i.remove(this.$overlay[0]),this._animateOut(),this}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Modal}},{key:"defaults",get:function(){return e}}]),n}();t._modalsOpen=0,t._count=0,M.Modal=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"modal","M_Modal")}(cash,M.anime),function(o,a){"use strict";var e={inDuration:275,outDuration:200,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Materialbox=i).options=o.extend({},n.defaults,e),i.overlayActive=!1,i.doneAnimating=!0,i.placeholder=o("<div></div>").addClass("material-placeholder"),i.originalWidth=0,i.originalHeight=0,i.originInlineStyles=i.$el.attr("style"),i.caption=i.el.getAttribute("data-caption")||"",i.$el.before(i.placeholder),i.placeholder.append(i.$el),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Materialbox=void 0,o(this.placeholder).after(this.el).remove(),this.$el.removeAttr("style")}},{key:"_setupEventHandlers",value:function(){this._handleMaterialboxClickBound=this._handleMaterialboxClick.bind(this),this.el.addEventListener("click",this._handleMaterialboxClickBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleMaterialboxClickBound)}},{key:"_handleMaterialboxClick",value:function(t){!1===this.doneAnimating||this.overlayActive&&this.doneAnimating?this.close():this.open()}},{key:"_handleWindowScroll",value:function(){this.overlayActive&&this.close()}},{key:"_handleWindowResize",value:function(){this.overlayActive&&this.close()}},{key:"_handleWindowEscape",value:function(t){27===t.keyCode&&this.doneAnimating&&this.overlayActive&&this.close()}},{key:"_makeAncestorsOverflowVisible",value:function(){this.ancestorsChanged=o();for(var t=this.placeholder[0].parentNode;null!==t&&!o(t).is(document);){var e=o(t);"visible"!==e.css("overflow")&&(e.css("overflow","visible"),void 0===this.ancestorsChanged?this.ancestorsChanged=e:this.ancestorsChanged=this.ancestorsChanged.add(e)),t=t.parentNode}}},{key:"_animateImageIn",value:function(){var t=this,e={targets:this.el,height:[this.originalHeight,this.newHeight],width:[this.originalWidth,this.newWidth],left:M.getDocumentScrollLeft()+this.windowWidth/2-this.placeholder.offset().left-this.newWidth/2,top:M.getDocumentScrollTop()+this.windowHeight/2-this.placeholder.offset().top-this.newHeight/2,duration:this.options.inDuration,easing:"easeOutQuad",complete:function(){t.doneAnimating=!0,"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el)}};this.maxWidth=this.$el.css("max-width"),this.maxHeight=this.$el.css("max-height"),"none"!==this.maxWidth&&(e.maxWidth=this.newWidth),"none"!==this.maxHeight&&(e.maxHeight=this.newHeight),a(e)}},{key:"_animateImageOut",value:function(){var t=this,e={targets:this.el,width:this.originalWidth,height:this.originalHeight,left:0,top:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){t.placeholder.css({height:"",width:"",position:"",top:"",left:""}),t.attrWidth&&t.$el.attr("width",t.attrWidth),t.attrHeight&&t.$el.attr("height",t.attrHeight),t.$el.removeAttr("style"),t.originInlineStyles&&t.$el.attr("style",t.originInlineStyles),t.$el.removeClass("active"),t.doneAnimating=!0,t.ancestorsChanged.length&&t.ancestorsChanged.css("overflow",""),"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}};a(e)}},{key:"_updateVars",value:function(){this.windowWidth=window.innerWidth,this.windowHeight=window.innerHeight,this.caption=this.el.getAttribute("data-caption")||""}},{key:"open",value:function(){var t=this;this._updateVars(),this.originalWidth=this.el.getBoundingClientRect().width,this.originalHeight=this.el.getBoundingClientRect().height,this.doneAnimating=!1,this.$el.addClass("active"),this.overlayActive=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this.placeholder.css({width:this.placeholder[0].getBoundingClientRect().width+"px",height:this.placeholder[0].getBoundingClientRect().height+"px",position:"relative",top:0,left:0}),this._makeAncestorsOverflowVisible(),this.$el.css({position:"absolute","z-index":1e3,"will-change":"left, top, width, height"}),this.attrWidth=this.$el.attr("width"),this.attrHeight=this.$el.attr("height"),this.attrWidth&&(this.$el.css("width",this.attrWidth+"px"),this.$el.removeAttr("width")),this.attrHeight&&(this.$el.css("width",this.attrHeight+"px"),this.$el.removeAttr("height")),this.$overlay=o('<div id="materialbox-overlay"></div>').css({opacity:0}).one("click",function(){t.doneAnimating&&t.close()}),this.$el.before(this.$overlay);var e=this.$overlay[0].getBoundingClientRect();this.$overlay.css({width:this.windowWidth+"px",height:this.windowHeight+"px",left:-1*e.left+"px",top:-1*e.top+"px"}),a.remove(this.el),a.remove(this.$overlay[0]),a({targets:this.$overlay[0],opacity:1,duration:this.options.inDuration,easing:"easeOutQuad"}),""!==this.caption&&(this.$photocaption&&a.remove(this.$photoCaption[0]),this.$photoCaption=o('<div class="materialbox-caption"></div>'),this.$photoCaption.text(this.caption),o("body").append(this.$photoCaption),this.$photoCaption.css({display:"inline"}),a({targets:this.$photoCaption[0],opacity:1,duration:this.options.inDuration,easing:"easeOutQuad"}));var i=0,n=this.originalWidth/this.windowWidth,s=this.originalHeight/this.windowHeight;this.newWidth=0,this.newHeight=0,s<n?(i=this.originalHeight/this.originalWidth,this.newWidth=.9*this.windowWidth,this.newHeight=.9*this.windowWidth*i):(i=this.originalWidth/this.originalHeight,this.newWidth=.9*this.windowHeight*i,this.newHeight=.9*this.windowHeight),this._animateImageIn(),this._handleWindowScrollBound=this._handleWindowScroll.bind(this),this._handleWindowResizeBound=this._handleWindowResize.bind(this),this._handleWindowEscapeBound=this._handleWindowEscape.bind(this),window.addEventListener("scroll",this._handleWindowScrollBound),window.addEventListener("resize",this._handleWindowResizeBound),window.addEventListener("keyup",this._handleWindowEscapeBound)}},{key:"close",value:function(){var t=this;this._updateVars(),this.doneAnimating=!1,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),a.remove(this.el),a.remove(this.$overlay[0]),""!==this.caption&&a.remove(this.$photoCaption[0]),window.removeEventListener("scroll",this._handleWindowScrollBound),window.removeEventListener("resize",this._handleWindowResizeBound),window.removeEventListener("keyup",this._handleWindowEscapeBound),a({targets:this.$overlay[0],opacity:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){t.overlayActive=!1,t.$overlay.remove()}}),this._animateImageOut(),""!==this.caption&&a({targets:this.$photoCaption[0],opacity:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){t.$photoCaption.remove()}})}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Materialbox}},{key:"defaults",get:function(){return e}}]),n}();M.Materialbox=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"materialbox","M_Materialbox")}(cash,M.anime),function(s){"use strict";var e={responsiveThreshold:0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Parallax=i).options=s.extend({},n.defaults,e),i._enabled=window.innerWidth>i.options.responsiveThreshold,i.$img=i.$el.find("img").first(),i.$img.each(function(){this.complete&&s(this).trigger("load")}),i._updateParallax(),i._setupEventHandlers(),i._setupStyles(),n._parallaxes.push(i),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){n._parallaxes.splice(n._parallaxes.indexOf(this),1),this.$img[0].style.transform="",this._removeEventHandlers(),this.$el[0].M_Parallax=void 0}},{key:"_setupEventHandlers",value:function(){this._handleImageLoadBound=this._handleImageLoad.bind(this),this.$img[0].addEventListener("load",this._handleImageLoadBound),0===n._parallaxes.length&&(n._handleScrollThrottled=M.throttle(n._handleScroll,5),window.addEventListener("scroll",n._handleScrollThrottled),n._handleWindowResizeThrottled=M.throttle(n._handleWindowResize,5),window.addEventListener("resize",n._handleWindowResizeThrottled))}},{key:"_removeEventHandlers",value:function(){this.$img[0].removeEventListener("load",this._handleImageLoadBound),0===n._parallaxes.length&&(window.removeEventListener("scroll",n._handleScrollThrottled),window.removeEventListener("resize",n._handleWindowResizeThrottled))}},{key:"_setupStyles",value:function(){this.$img[0].style.opacity=1}},{key:"_handleImageLoad",value:function(){this._updateParallax()}},{key:"_updateParallax",value:function(){var t=0<this.$el.height()?this.el.parentNode.offsetHeight:500,e=this.$img[0].offsetHeight-t,i=this.$el.offset().top+t,n=this.$el.offset().top,s=M.getDocumentScrollTop(),o=window.innerHeight,a=e*((s+o-n)/(t+o));this._enabled?s<i&&n<s+o&&(this.$img[0].style.transform="translate3D(-50%, "+a+"px, 0)"):this.$img[0].style.transform=""}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Parallax}},{key:"_handleScroll",value:function(){for(var t=0;t<n._parallaxes.length;t++){var e=n._parallaxes[t];e._updateParallax.call(e)}}},{key:"_handleWindowResize",value:function(){for(var t=0;t<n._parallaxes.length;t++){var e=n._parallaxes[t];e._enabled=window.innerWidth>e.options.responsiveThreshold}}},{key:"defaults",get:function(){return e}}]),n}();t._parallaxes=[],M.Parallax=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"parallax","M_Parallax")}(cash),function(a,s){"use strict";var e={duration:300,onShow:null,swipeable:!1,responsiveThreshold:1/0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Tabs=i).options=a.extend({},n.defaults,e),i.$tabLinks=i.$el.children("li.tab").children("a"),i.index=0,i._setupActiveTabLink(),i.options.swipeable?i._setupSwipeableTabs():i._setupNormalTabs(),i._setTabsAndTabWidth(),i._createIndicator(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._indicator.parentNode.removeChild(this._indicator),this.options.swipeable?this._teardownSwipeableTabs():this._teardownNormalTabs(),this.$el[0].M_Tabs=void 0}},{key:"_setupEventHandlers",value:function(){this._handleWindowResizeBound=this._handleWindowResize.bind(this),window.addEventListener("resize",this._handleWindowResizeBound),this._handleTabClickBound=this._handleTabClick.bind(this),this.el.addEventListener("click",this._handleTabClickBound)}},{key:"_removeEventHandlers",value:function(){window.removeEventListener("resize",this._handleWindowResizeBound),this.el.removeEventListener("click",this._handleTabClickBound)}},{key:"_handleWindowResize",value:function(){this._setTabsAndTabWidth(),0!==this.tabWidth&&0!==this.tabsWidth&&(this._indicator.style.left=this._calcLeftPos(this.$activeTabLink)+"px",this._indicator.style.right=this._calcRightPos(this.$activeTabLink)+"px")}},{key:"_handleTabClick",value:function(t){var e=this,i=a(t.target).closest("li.tab"),n=a(t.target).closest("a");if(n.length&&n.parent().hasClass("tab"))if(i.hasClass("disabled"))t.preventDefault();else if(!n.attr("target")){this.$activeTabLink.removeClass("active");var s=this.$content;this.$activeTabLink=n,this.$content=a(M.escapeHash(n[0].hash)),this.$tabLinks=this.$el.children("li.tab").children("a"),this.$activeTabLink.addClass("active");var o=this.index;this.index=Math.max(this.$tabLinks.index(n),0),this.options.swipeable?this._tabsCarousel&&this._tabsCarousel.set(this.index,function(){"function"==typeof e.options.onShow&&e.options.onShow.call(e,e.$content[0])}):this.$content.length&&(this.$content[0].style.display="block",this.$content.addClass("active"),"function"==typeof this.options.onShow&&this.options.onShow.call(this,this.$content[0]),s.length&&!s.is(this.$content)&&(s[0].style.display="none",s.removeClass("active"))),this._setTabsAndTabWidth(),this._animateIndicator(o),t.preventDefault()}}},{key:"_createIndicator",value:function(){var t=this,e=document.createElement("li");e.classList.add("indicator"),this.el.appendChild(e),this._indicator=e,setTimeout(function(){t._indicator.style.left=t._calcLeftPos(t.$activeTabLink)+"px",t._indicator.style.right=t._calcRightPos(t.$activeTabLink)+"px"},0)}},{key:"_setupActiveTabLink",value:function(){this.$activeTabLink=a(this.$tabLinks.filter('[href="'+location.hash+'"]')),0===this.$activeTabLink.length&&(this.$activeTabLink=this.$el.children("li.tab").children("a.active").first()),0===this.$activeTabLink.length&&(this.$activeTabLink=this.$el.children("li.tab").children("a").first()),this.$tabLinks.removeClass("active"),this.$activeTabLink[0].classList.add("active"),this.index=Math.max(this.$tabLinks.index(this.$activeTabLink),0),this.$activeTabLink.length&&(this.$content=a(M.escapeHash(this.$activeTabLink[0].hash)),this.$content.addClass("active"))}},{key:"_setupSwipeableTabs",value:function(){var i=this;window.innerWidth>this.options.responsiveThreshold&&(this.options.swipeable=!1);var n=a();this.$tabLinks.each(function(t){var e=a(M.escapeHash(t.hash));e.addClass("carousel-item"),n=n.add(e)});var t=a('<div class="tabs-content carousel carousel-slider"></div>');n.first().before(t),t.append(n),n[0].style.display="";var e=this.$activeTabLink.closest(".tab").index();this._tabsCarousel=M.Carousel.init(t[0],{fullWidth:!0,noWrap:!0,onCycleTo:function(t){var e=i.index;i.index=a(t).index(),i.$activeTabLink.removeClass("active"),i.$activeTabLink=i.$tabLinks.eq(i.index),i.$activeTabLink.addClass("active"),i._animateIndicator(e),"function"==typeof i.options.onShow&&i.options.onShow.call(i,i.$content[0])}}),this._tabsCarousel.set(e)}},{key:"_teardownSwipeableTabs",value:function(){var t=this._tabsCarousel.$el;this._tabsCarousel.destroy(),t.after(t.children()),t.remove()}},{key:"_setupNormalTabs",value:function(){this.$tabLinks.not(this.$activeTabLink).each(function(t){if(t.hash){var e=a(M.escapeHash(t.hash));e.length&&(e[0].style.display="none")}})}},{key:"_teardownNormalTabs",value:function(){this.$tabLinks.each(function(t){if(t.hash){var e=a(M.escapeHash(t.hash));e.length&&(e[0].style.display="")}})}},{key:"_setTabsAndTabWidth",value:function(){this.tabsWidth=this.$el.width(),this.tabWidth=Math.max(this.tabsWidth,this.el.scrollWidth)/this.$tabLinks.length}},{key:"_calcRightPos",value:function(t){return Math.ceil(this.tabsWidth-t.position().left-t[0].getBoundingClientRect().width)}},{key:"_calcLeftPos",value:function(t){return Math.floor(t.position().left)}},{key:"updateTabIndicator",value:function(){this._setTabsAndTabWidth(),this._animateIndicator(this.index)}},{key:"_animateIndicator",value:function(t){var e=0,i=0;0<=this.index-t?e=90:i=90;var n={targets:this._indicator,left:{value:this._calcLeftPos(this.$activeTabLink),delay:e},right:{value:this._calcRightPos(this.$activeTabLink),delay:i},duration:this.options.duration,easing:"easeOutQuad"};s.remove(this._indicator),s(n)}},{key:"select",value:function(t){var e=this.$tabLinks.filter('[href="#'+t+'"]');e.length&&e.trigger("click")}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Tabs}},{key:"defaults",get:function(){return e}}]),n}();M.Tabs=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tabs","M_Tabs")}(cash,M.anime),function(d,e){"use strict";var i={exitDelay:200,enterDelay:0,html:null,margin:5,inDuration:250,outDuration:200,position:"bottom",transitionMovement:10},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Tooltip=i).options=d.extend({},n.defaults,e),i.isOpen=!1,i.isHovered=!1,i.isFocused=!1,i._appendTooltipEl(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){d(this.tooltipEl).remove(),this._removeEventHandlers(),this.el.M_Tooltip=void 0}},{key:"_appendTooltipEl",value:function(){var t=document.createElement("div");t.classList.add("material-tooltip"),this.tooltipEl=t;var e=document.createElement("div");e.classList.add("tooltip-content"),e.innerHTML=this.options.html,t.appendChild(e),document.body.appendChild(t)}},{key:"_updateTooltipContent",value:function(){this.tooltipEl.querySelector(".tooltip-content").innerHTML=this.options.html}},{key:"_setupEventHandlers",value:function(){this._handleMouseEnterBound=this._handleMouseEnter.bind(this),this._handleMouseLeaveBound=this._handleMouseLeave.bind(this),this._handleFocusBound=this._handleFocus.bind(this),this._handleBlurBound=this._handleBlur.bind(this),this.el.addEventListener("mouseenter",this._handleMouseEnterBound),this.el.addEventListener("mouseleave",this._handleMouseLeaveBound),this.el.addEventListener("focus",this._handleFocusBound,!0),this.el.addEventListener("blur",this._handleBlurBound,!0)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("mouseenter",this._handleMouseEnterBound),this.el.removeEventListener("mouseleave",this._handleMouseLeaveBound),this.el.removeEventListener("focus",this._handleFocusBound,!0),this.el.removeEventListener("blur",this._handleBlurBound,!0)}},{key:"open",value:function(t){this.isOpen||(t=void 0===t||void 0,this.isOpen=!0,this.options=d.extend({},this.options,this._getAttributeOptions()),this._updateTooltipContent(),this._setEnterDelayTimeout(t))}},{key:"close",value:function(){this.isOpen&&(this.isHovered=!1,this.isFocused=!1,this.isOpen=!1,this._setExitDelayTimeout())}},{key:"_setExitDelayTimeout",value:function(){var t=this;clearTimeout(this._exitDelayTimeout),this._exitDelayTimeout=setTimeout(function(){t.isHovered||t.isFocused||t._animateOut()},this.options.exitDelay)}},{key:"_setEnterDelayTimeout",value:function(t){var e=this;clearTimeout(this._enterDelayTimeout),this._enterDelayTimeout=setTimeout(function(){(e.isHovered||e.isFocused||t)&&e._animateIn()},this.options.enterDelay)}},{key:"_positionTooltip",value:function(){var t,e=this.el,i=this.tooltipEl,n=e.offsetHeight,s=e.offsetWidth,o=i.offsetHeight,a=i.offsetWidth,r=this.options.margin,l=void 0,h=void 0;this.xMovement=0,this.yMovement=0,l=e.getBoundingClientRect().top+M.getDocumentScrollTop(),h=e.getBoundingClientRect().left+M.getDocumentScrollLeft(),"top"===this.options.position?(l+=-o-r,h+=s/2-a/2,this.yMovement=-this.options.transitionMovement):"right"===this.options.position?(l+=n/2-o/2,h+=s+r,this.xMovement=this.options.transitionMovement):"left"===this.options.position?(l+=n/2-o/2,h+=-a-r,this.xMovement=-this.options.transitionMovement):(l+=n+r,h+=s/2-a/2,this.yMovement=this.options.transitionMovement),t=this._repositionWithinScreen(h,l,a,o),d(i).css({top:t.y+"px",left:t.x+"px"})}},{key:"_repositionWithinScreen",value:function(t,e,i,n){var s=M.getDocumentScrollLeft(),o=M.getDocumentScrollTop(),a=t-s,r=e-o,l={left:a,top:r,width:i,height:n},h=this.options.margin+this.options.transitionMovement,d=M.checkWithinContainer(document.body,l,h);return d.left?a=h:d.right&&(a-=a+i-window.innerWidth),d.top?r=h:d.bottom&&(r-=r+n-window.innerHeight),{x:a+s,y:r+o}}},{key:"_animateIn",value:function(){this._positionTooltip(),this.tooltipEl.style.visibility="visible",e.remove(this.tooltipEl),e({targets:this.tooltipEl,opacity:1,translateX:this.xMovement,translateY:this.yMovement,duration:this.options.inDuration,easing:"easeOutCubic"})}},{key:"_animateOut",value:function(){e.remove(this.tooltipEl),e({targets:this.tooltipEl,opacity:0,translateX:0,translateY:0,duration:this.options.outDuration,easing:"easeOutCubic"})}},{key:"_handleMouseEnter",value:function(){this.isHovered=!0,this.isFocused=!1,this.open(!1)}},{key:"_handleMouseLeave",value:function(){this.isHovered=!1,this.isFocused=!1,this.close()}},{key:"_handleFocus",value:function(){M.tabPressed&&(this.isFocused=!0,this.open(!1))}},{key:"_handleBlur",value:function(){this.isFocused=!1,this.close()}},{key:"_getAttributeOptions",value:function(){var t={},e=this.el.getAttribute("data-tooltip"),i=this.el.getAttribute("data-position");return e&&(t.html=e),i&&(t.position=i),t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Tooltip}},{key:"defaults",get:function(){return i}}]),n}();M.Tooltip=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tooltip","M_Tooltip")}(cash,M.anime),function(i){"use strict";var t=t||{},e=document.querySelectorAll.bind(document);function m(t){var e="";for(var i in t)t.hasOwnProperty(i)&&(e+=i+":"+t[i]+";");return e}var g={duration:750,show:function(t,e){if(2===t.button)return!1;var i=e||this,n=document.createElement("div");n.className="waves-ripple",i.appendChild(n);var s,o,a,r,l,h,d,u=(h={top:0,left:0},d=(s=i)&&s.ownerDocument,o=d.documentElement,void 0!==s.getBoundingClientRect&&(h=s.getBoundingClientRect()),a=null!==(l=r=d)&&l===l.window?r:9===r.nodeType&&r.defaultView,{top:h.top+a.pageYOffset-o.clientTop,left:h.left+a.pageXOffset-o.clientLeft}),c=t.pageY-u.top,p=t.pageX-u.left,v="scale("+i.clientWidth/100*10+")";"touches"in t&&(c=t.touches[0].pageY-u.top,p=t.touches[0].pageX-u.left),n.setAttribute("data-hold",Date.now()),n.setAttribute("data-scale",v),n.setAttribute("data-x",p),n.setAttribute("data-y",c);var f={top:c+"px",left:p+"px"};n.className=n.className+" waves-notransition",n.setAttribute("style",m(f)),n.className=n.className.replace("waves-notransition",""),f["-webkit-transform"]=v,f["-moz-transform"]=v,f["-ms-transform"]=v,f["-o-transform"]=v,f.transform=v,f.opacity="1",f["-webkit-transition-duration"]=g.duration+"ms",f["-moz-transition-duration"]=g.duration+"ms",f["-o-transition-duration"]=g.duration+"ms",f["transition-duration"]=g.duration+"ms",f["-webkit-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["-moz-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["-o-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",n.setAttribute("style",m(f))},hide:function(t){l.touchup(t);var e=this,i=(e.clientWidth,null),n=e.getElementsByClassName("waves-ripple");if(!(0<n.length))return!1;var s=(i=n[n.length-1]).getAttribute("data-x"),o=i.getAttribute("data-y"),a=i.getAttribute("data-scale"),r=350-(Date.now()-Number(i.getAttribute("data-hold")));r<0&&(r=0),setTimeout(function(){var t={top:o+"px",left:s+"px",opacity:"0","-webkit-transition-duration":g.duration+"ms","-moz-transition-duration":g.duration+"ms","-o-transition-duration":g.duration+"ms","transition-duration":g.duration+"ms","-webkit-transform":a,"-moz-transform":a,"-ms-transform":a,"-o-transform":a,transform:a};i.setAttribute("style",m(t)),setTimeout(function(){try{e.removeChild(i)}catch(t){return!1}},g.duration)},r)},wrapInput:function(t){for(var e=0;e<t.length;e++){var i=t[e];if("input"===i.tagName.toLowerCase()){var n=i.parentNode;if("i"===n.tagName.toLowerCase()&&-1!==n.className.indexOf("waves-effect"))continue;var s=document.createElement("i");s.className=i.className+" waves-input-wrapper";var o=i.getAttribute("style");o||(o=""),s.setAttribute("style",o),i.className="waves-button-input",i.removeAttribute("style"),n.replaceChild(s,i),s.appendChild(i)}}}},l={touches:0,allowEvent:function(t){var e=!0;return"touchstart"===t.type?l.touches+=1:"touchend"===t.type||"touchcancel"===t.type?setTimeout(function(){0<l.touches&&(l.touches-=1)},500):"mousedown"===t.type&&0<l.touches&&(e=!1),e},touchup:function(t){l.allowEvent(t)}};function n(t){var e=function(t){if(!1===l.allowEvent(t))return null;for(var e=null,i=t.target||t.srcElement;null!==i.parentNode;){if(!(i instanceof SVGElement)&&-1!==i.className.indexOf("waves-effect")){e=i;break}i=i.parentNode}return e}(t);null!==e&&(g.show(t,e),"ontouchstart"in i&&(e.addEventListener("touchend",g.hide,!1),e.addEventListener("touchcancel",g.hide,!1)),e.addEventListener("mouseup",g.hide,!1),e.addEventListener("mouseleave",g.hide,!1),e.addEventListener("dragend",g.hide,!1))}t.displayEffect=function(t){"duration"in(t=t||{})&&(g.duration=t.duration),g.wrapInput(e(".waves-effect")),"ontouchstart"in i&&document.body.addEventListener("touchstart",n,!1),document.body.addEventListener("mousedown",n,!1)},t.attach=function(t){"input"===t.tagName.toLowerCase()&&(g.wrapInput([t]),t=t.parentNode),"ontouchstart"in i&&t.addEventListener("touchstart",n,!1),t.addEventListener("mousedown",n,!1)},i.Waves=t,document.addEventListener("DOMContentLoaded",function(){t.displayEffect()},!1)}(window),function(i,n){"use strict";var t={html:"",displayLength:4e3,inDuration:300,outDuration:375,classes:"",completeCallback:null,activationPercent:.8},e=function(){function s(t){_classCallCheck(this,s),this.options=i.extend({},s.defaults,t),this.message=this.options.html,this.panning=!1,this.timeRemaining=this.options.displayLength,0===s._toasts.length&&s._createContainer(),s._toasts.push(this);var e=this._createToast();(e.M_Toast=this).el=e,this.$el=i(e),this._animateIn(),this._setTimer()}return _createClass(s,[{key:"_createToast",value:function(){var t=document.createElement("div");return t.classList.add("toast"),this.options.classes.length&&i(t).addClass(this.options.classes),("object"==typeof HTMLElement?this.message instanceof HTMLElement:this.message&&"object"==typeof this.message&&null!==this.message&&1===this.message.nodeType&&"string"==typeof this.message.nodeName)?t.appendChild(this.message):this.message.jquery?i(t).append(this.message[0]):t.innerHTML=this.message,s._container.appendChild(t),t}},{key:"_animateIn",value:function(){n({targets:this.el,top:0,opacity:1,duration:this.options.inDuration,easing:"easeOutCubic"})}},{key:"_setTimer",value:function(){var t=this;this.timeRemaining!==1/0&&(this.counterInterval=setInterval(function(){t.panning||(t.timeRemaining-=20),t.timeRemaining<=0&&t.dismiss()},20))}},{key:"dismiss",value:function(){var t=this;window.clearInterval(this.counterInterval);var e=this.el.offsetWidth*this.options.activationPercent;this.wasSwiped&&(this.el.style.transition="transform .05s, opacity .05s",this.el.style.transform="translateX("+e+"px)",this.el.style.opacity=0),n({targets:this.el,opacity:0,marginTop:-40,duration:this.options.outDuration,easing:"easeOutExpo",complete:function(){"function"==typeof t.options.completeCallback&&t.options.completeCallback(),t.$el.remove(),s._toasts.splice(s._toasts.indexOf(t),1),0===s._toasts.length&&s._removeContainer()}})}}],[{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Toast}},{key:"_createContainer",value:function(){var t=document.createElement("div");t.setAttribute("id","toast-container"),t.addEventListener("touchstart",s._onDragStart),t.addEventListener("touchmove",s._onDragMove),t.addEventListener("touchend",s._onDragEnd),t.addEventListener("mousedown",s._onDragStart),document.addEventListener("mousemove",s._onDragMove),document.addEventListener("mouseup",s._onDragEnd),document.body.appendChild(t),s._container=t}},{key:"_removeContainer",value:function(){document.removeEventListener("mousemove",s._onDragMove),document.removeEventListener("mouseup",s._onDragEnd),i(s._container).remove(),s._container=null}},{key:"_onDragStart",value:function(t){if(t.target&&i(t.target).closest(".toast").length){var e=i(t.target).closest(".toast")[0].M_Toast;e.panning=!0,(s._draggedToast=e).el.classList.add("panning"),e.el.style.transition="",e.startingXPos=s._xPos(t),e.time=Date.now(),e.xPos=s._xPos(t)}}},{key:"_onDragMove",value:function(t){if(s._draggedToast){t.preventDefault();var e=s._draggedToast;e.deltaX=Math.abs(e.xPos-s._xPos(t)),e.xPos=s._xPos(t),e.velocityX=e.deltaX/(Date.now()-e.time),e.time=Date.now();var i=e.xPos-e.startingXPos,n=e.el.offsetWidth*e.options.activationPercent;e.el.style.transform="translateX("+i+"px)",e.el.style.opacity=1-Math.abs(i/n)}}},{key:"_onDragEnd",value:function(){if(s._draggedToast){var t=s._draggedToast;t.panning=!1,t.el.classList.remove("panning");var e=t.xPos-t.startingXPos,i=t.el.offsetWidth*t.options.activationPercent;Math.abs(e)>i||1<t.velocityX?(t.wasSwiped=!0,t.dismiss()):(t.el.style.transition="transform .2s, opacity .2s",t.el.style.transform="",t.el.style.opacity=""),s._draggedToast=null}}},{key:"_xPos",value:function(t){return t.targetTouches&&1<=t.targetTouches.length?t.targetTouches[0].clientX:t.clientX}},{key:"dismissAll",value:function(){for(var t in s._toasts)s._toasts[t].dismiss()}},{key:"defaults",get:function(){return t}}]),s}();e._toasts=[],e._container=null,e._draggedToast=null,M.Toast=e,M.toast=function(t){return new e(t)}}(cash,M.anime),function(s,o){"use strict";var e={edge:"left",draggable:!0,inDuration:250,outDuration:200,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,preventScrolling:!0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Sidenav=i).id=i.$el.attr("id"),i.options=s.extend({},n.defaults,e),i.isOpen=!1,i.isFixed=i.el.classList.contains("sidenav-fixed"),i.isDragged=!1,i.lastWindowWidth=window.innerWidth,i.lastWindowHeight=window.innerHeight,i._createOverlay(),i._createDragTarget(),i._setupEventHandlers(),i._setupClasses(),i._setupFixed(),n._sidenavs.push(i),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._enableBodyScrolling(),this._overlay.parentNode.removeChild(this._overlay),this.dragTarget.parentNode.removeChild(this.dragTarget),this.el.M_Sidenav=void 0,this.el.style.transform="";var t=n._sidenavs.indexOf(this);0<=t&&n._sidenavs.splice(t,1)}},{key:"_createOverlay",value:function(){var t=document.createElement("div");this._closeBound=this.close.bind(this),t.classList.add("sidenav-overlay"),t.addEventListener("click",this._closeBound),document.body.appendChild(t),this._overlay=t}},{key:"_setupEventHandlers",value:function(){0===n._sidenavs.length&&document.body.addEventListener("click",this._handleTriggerClick),this._handleDragTargetDragBound=this._handleDragTargetDrag.bind(this),this._handleDragTargetReleaseBound=this._handleDragTargetRelease.bind(this),this._handleCloseDragBound=this._handleCloseDrag.bind(this),this._handleCloseReleaseBound=this._handleCloseRelease.bind(this),this._handleCloseTriggerClickBound=this._handleCloseTriggerClick.bind(this),this.dragTarget.addEventListener("touchmove",this._handleDragTargetDragBound),this.dragTarget.addEventListener("touchend",this._handleDragTargetReleaseBound),this._overlay.addEventListener("touchmove",this._handleCloseDragBound),this._overlay.addEventListener("touchend",this._handleCloseReleaseBound),this.el.addEventListener("touchmove",this._handleCloseDragBound),this.el.addEventListener("touchend",this._handleCloseReleaseBound),this.el.addEventListener("click",this._handleCloseTriggerClickBound),this.isFixed&&(this._handleWindowResizeBound=this._handleWindowResize.bind(this),window.addEventListener("resize",this._handleWindowResizeBound))}},{key:"_removeEventHandlers",value:function(){1===n._sidenavs.length&&document.body.removeEventListener("click",this._handleTriggerClick),this.dragTarget.removeEventListener("touchmove",this._handleDragTargetDragBound),this.dragTarget.removeEventListener("touchend",this._handleDragTargetReleaseBound),this._overlay.removeEventListener("touchmove",this._handleCloseDragBound),this._overlay.removeEventListener("touchend",this._handleCloseReleaseBound),this.el.removeEventListener("touchmove",this._handleCloseDragBound),this.el.removeEventListener("touchend",this._handleCloseReleaseBound),this.el.removeEventListener("click",this._handleCloseTriggerClickBound),this.isFixed&&window.removeEventListener("resize",this._handleWindowResizeBound)}},{key:"_handleTriggerClick",value:function(t){var e=s(t.target).closest(".sidenav-trigger");if(t.target&&e.length){var i=M.getIdFromTrigger(e[0]),n=document.getElementById(i).M_Sidenav;n&&n.open(e),t.preventDefault()}}},{key:"_startDrag",value:function(t){var e=t.targetTouches[0].clientX;this.isDragged=!0,this._startingXpos=e,this._xPos=this._startingXpos,this._time=Date.now(),this._width=this.el.getBoundingClientRect().width,this._overlay.style.display="block",this._initialScrollTop=this.isOpen?this.el.scrollTop:M.getDocumentScrollTop(),this._verticallyScrolling=!1,o.remove(this.el),o.remove(this._overlay)}},{key:"_dragMoveUpdate",value:function(t){var e=t.targetTouches[0].clientX,i=this.isOpen?this.el.scrollTop:M.getDocumentScrollTop();this.deltaX=Math.abs(this._xPos-e),this._xPos=e,this.velocityX=this.deltaX/(Date.now()-this._time),this._time=Date.now(),this._initialScrollTop!==i&&(this._verticallyScrolling=!0)}},{key:"_handleDragTargetDrag",value:function(t){if(this.options.draggable&&!this._isCurrentlyFixed()&&!this._verticallyScrolling){this.isDragged||this._startDrag(t),this._dragMoveUpdate(t);var e=this._xPos-this._startingXpos,i=0<e?"right":"left";e=Math.min(this._width,Math.abs(e)),this.options.edge===i&&(e=0);var n=e,s="translateX(-100%)";"right"===this.options.edge&&(s="translateX(100%)",n=-n),this.percentOpen=Math.min(1,e/this._width),this.el.style.transform=s+" translateX("+n+"px)",this._overlay.style.opacity=this.percentOpen}}},{key:"_handleDragTargetRelease",value:function(){this.isDragged&&(.2<this.percentOpen?this.open():this._animateOut(),this.isDragged=!1,this._verticallyScrolling=!1)}},{key:"_handleCloseDrag",value:function(t){if(this.isOpen){if(!this.options.draggable||this._isCurrentlyFixed()||this._verticallyScrolling)return;this.isDragged||this._startDrag(t),this._dragMoveUpdate(t);var e=this._xPos-this._startingXpos,i=0<e?"right":"left";e=Math.min(this._width,Math.abs(e)),this.options.edge!==i&&(e=0);var n=-e;"right"===this.options.edge&&(n=-n),this.percentOpen=Math.min(1,1-e/this._width),this.el.style.transform="translateX("+n+"px)",this._overlay.style.opacity=this.percentOpen}}},{key:"_handleCloseRelease",value:function(){this.isOpen&&this.isDragged&&(.8<this.percentOpen?this._animateIn():this.close(),this.isDragged=!1,this._verticallyScrolling=!1)}},{key:"_handleCloseTriggerClick",value:function(t){s(t.target).closest(".sidenav-close").length&&!this._isCurrentlyFixed()&&this.close()}},{key:"_handleWindowResize",value:function(){this.lastWindowWidth!==window.innerWidth&&(992<window.innerWidth?this.open():this.close()),this.lastWindowWidth=window.innerWidth,this.lastWindowHeight=window.innerHeight}},{key:"_setupClasses",value:function(){"right"===this.options.edge&&(this.el.classList.add("right-aligned"),this.dragTarget.classList.add("right-aligned"))}},{key:"_removeClasses",value:function(){this.el.classList.remove("right-aligned"),this.dragTarget.classList.remove("right-aligned")}},{key:"_setupFixed",value:function(){this._isCurrentlyFixed()&&this.open()}},{key:"_isCurrentlyFixed",value:function(){return this.isFixed&&992<window.innerWidth}},{key:"_createDragTarget",value:function(){var t=document.createElement("div");t.classList.add("drag-target"),document.body.appendChild(t),this.dragTarget=t}},{key:"_preventBodyScrolling",value:function(){document.body.style.overflow="hidden"}},{key:"_enableBodyScrolling",value:function(){document.body.style.overflow=""}},{key:"open",value:function(){!0!==this.isOpen&&(this.isOpen=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this._isCurrentlyFixed()?(o.remove(this.el),o({targets:this.el,translateX:0,duration:0,easing:"easeOutQuad"}),this._enableBodyScrolling(),this._overlay.style.display="none"):(this.options.preventScrolling&&this._preventBodyScrolling(),this.isDragged&&1==this.percentOpen||this._animateIn()))}},{key:"close",value:function(){if(!1!==this.isOpen)if(this.isOpen=!1,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this._isCurrentlyFixed()){var t="left"===this.options.edge?"-105%":"105%";this.el.style.transform="translateX("+t+")"}else this._enableBodyScrolling(),this.isDragged&&0==this.percentOpen?this._overlay.style.display="none":this._animateOut()}},{key:"_animateIn",value:function(){this._animateSidenavIn(),this._animateOverlayIn()}},{key:"_animateSidenavIn",value:function(){var t=this,e="left"===this.options.edge?-1:1;this.isDragged&&(e="left"===this.options.edge?e+this.percentOpen:e-this.percentOpen),o.remove(this.el),o({targets:this.el,translateX:[100*e+"%",0],duration:this.options.inDuration,easing:"easeOutQuad",complete:function(){"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el)}})}},{key:"_animateOverlayIn",value:function(){var t=0;this.isDragged?t=this.percentOpen:s(this._overlay).css({display:"block"}),o.remove(this._overlay),o({targets:this._overlay,opacity:[t,1],duration:this.options.inDuration,easing:"easeOutQuad"})}},{key:"_animateOut",value:function(){this._animateSidenavOut(),this._animateOverlayOut()}},{key:"_animateSidenavOut",value:function(){var t=this,e="left"===this.options.edge?-1:1,i=0;this.isDragged&&(i="left"===this.options.edge?e+this.percentOpen:e-this.percentOpen),o.remove(this.el),o({targets:this.el,translateX:[100*i+"%",105*e+"%"],duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}})}},{key:"_animateOverlayOut",value:function(){var t=this;o.remove(this._overlay),o({targets:this._overlay,opacity:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){s(t._overlay).css("display","none")}})}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Sidenav}},{key:"defaults",get:function(){return e}}]),n}();t._sidenavs=[],M.Sidenav=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"sidenav","M_Sidenav")}(cash,M.anime),function(o,a){"use strict";var e={throttle:100,scrollOffset:200,activeClass:"active",getActiveElement:function(t){return'a[href="#'+t+'"]'}},t=function(t){function c(t,e){_classCallCheck(this,c);var i=_possibleConstructorReturn(this,(c.__proto__||Object.getPrototypeOf(c)).call(this,c,t,e));return(i.el.M_ScrollSpy=i).options=o.extend({},c.defaults,e),c._elements.push(i),c._count++,c._increment++,i.tickId=-1,i.id=c._increment,i._setupEventHandlers(),i._handleWindowScroll(),i}return _inherits(c,Component),_createClass(c,[{key:"destroy",value:function(){c._elements.splice(c._elements.indexOf(this),1),c._elementsInView.splice(c._elementsInView.indexOf(this),1),c._visibleElements.splice(c._visibleElements.indexOf(this.$el),1),c._count--,this._removeEventHandlers(),o(this.options.getActiveElement(this.$el.attr("id"))).removeClass(this.options.activeClass),this.el.M_ScrollSpy=void 0}},{key:"_setupEventHandlers",value:function(){var t=M.throttle(this._handleWindowScroll,200);this._handleThrottledResizeBound=t.bind(this),this._handleWindowScrollBound=this._handleWindowScroll.bind(this),1===c._count&&(window.addEventListener("scroll",this._handleWindowScrollBound),window.addEventListener("resize",this._handleThrottledResizeBound),document.body.addEventListener("click",this._handleTriggerClick))}},{key:"_removeEventHandlers",value:function(){0===c._count&&(window.removeEventListener("scroll",this._handleWindowScrollBound),window.removeEventListener("resize",this._handleThrottledResizeBound),document.body.removeEventListener("click",this._handleTriggerClick))}},{key:"_handleTriggerClick",value:function(t){for(var e=o(t.target),i=c._elements.length-1;0<=i;i--){var n=c._elements[i];if(e.is('a[href="#'+n.$el.attr("id")+'"]')){t.preventDefault();var s=n.$el.offset().top+1;a({targets:[document.documentElement,document.body],scrollTop:s-n.options.scrollOffset,duration:400,easing:"easeOutCubic"});break}}}},{key:"_handleWindowScroll",value:function(){c._ticks++;for(var t=M.getDocumentScrollTop(),e=M.getDocumentScrollLeft(),i=e+window.innerWidth,n=t+window.innerHeight,s=c._findElements(t,i,n,e),o=0;o<s.length;o++){var a=s[o];a.tickId<0&&a._enter(),a.tickId=c._ticks}for(var r=0;r<c._elementsInView.length;r++){var l=c._elementsInView[r],h=l.tickId;0<=h&&h!==c._ticks&&(l._exit(),l.tickId=-1)}c._elementsInView=s}},{key:"_enter",value:function(){(c._visibleElements=c._visibleElements.filter(function(t){return 0!=t.height()}))[0]?(o(this.options.getActiveElement(c._visibleElements[0].attr("id"))).removeClass(this.options.activeClass),c._visibleElements[0][0].M_ScrollSpy&&this.id<c._visibleElements[0][0].M_ScrollSpy.id?c._visibleElements.unshift(this.$el):c._visibleElements.push(this.$el)):c._visibleElements.push(this.$el),o(this.options.getActiveElement(c._visibleElements[0].attr("id"))).addClass(this.options.activeClass)}},{key:"_exit",value:function(){var e=this;(c._visibleElements=c._visibleElements.filter(function(t){return 0!=t.height()}))[0]&&(o(this.options.getActiveElement(c._visibleElements[0].attr("id"))).removeClass(this.options.activeClass),(c._visibleElements=c._visibleElements.filter(function(t){return t.attr("id")!=e.$el.attr("id")}))[0]&&o(this.options.getActiveElement(c._visibleElements[0].attr("id"))).addClass(this.options.activeClass))}}],[{key:"init",value:function(t,e){return _get(c.__proto__||Object.getPrototypeOf(c),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_ScrollSpy}},{key:"_findElements",value:function(t,e,i,n){for(var s=[],o=0;o<c._elements.length;o++){var a=c._elements[o],r=t+a.options.scrollOffset||200;if(0<a.$el.height()){var l=a.$el.offset().top,h=a.$el.offset().left,d=h+a.$el.width(),u=l+a.$el.height();!(e<h||d<n||i<l||u<r)&&s.push(a)}}return s}},{key:"defaults",get:function(){return e}}]),c}();t._elements=[],t._elementsInView=[],t._visibleElements=[],t._count=0,t._increment=0,t._ticks=0,M.ScrollSpy=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"scrollSpy","M_ScrollSpy")}(cash,M.anime),function(h){"use strict";var e={data:{},limit:1/0,onAutocomplete:null,minLength:1,sortFunction:function(t,e,i){return t.indexOf(i)-e.indexOf(i)}},t=function(t){function s(t,e){_classCallCheck(this,s);var i=_possibleConstructorReturn(this,(s.__proto__||Object.getPrototypeOf(s)).call(this,s,t,e));return(i.el.M_Autocomplete=i).options=h.extend({},s.defaults,e),i.isOpen=!1,i.count=0,i.activeIndex=-1,i.oldVal,i.$inputField=i.$el.closest(".input-field"),i.$active=h(),i._mousedown=!1,i._setupDropdown(),i._setupEventHandlers(),i}return _inherits(s,Component),_createClass(s,[{key:"destroy",value:function(){this._removeEventHandlers(),this._removeDropdown(),this.el.M_Autocomplete=void 0}},{key:"_setupEventHandlers",value:function(){this._handleInputBlurBound=this._handleInputBlur.bind(this),this._handleInputKeyupAndFocusBound=this._handleInputKeyupAndFocus.bind(this),this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleContainerMousedownAndTouchstartBound=this._handleContainerMousedownAndTouchstart.bind(this),this._handleContainerMouseupAndTouchendBound=this._handleContainerMouseupAndTouchend.bind(this),this.el.addEventListener("blur",this._handleInputBlurBound),this.el.addEventListener("keyup",this._handleInputKeyupAndFocusBound),this.el.addEventListener("focus",this._handleInputKeyupAndFocusBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.el.addEventListener("click",this._handleInputClickBound),this.container.addEventListener("mousedown",this._handleContainerMousedownAndTouchstartBound),this.container.addEventListener("mouseup",this._handleContainerMouseupAndTouchendBound),void 0!==window.ontouchstart&&(this.container.addEventListener("touchstart",this._handleContainerMousedownAndTouchstartBound),this.container.addEventListener("touchend",this._handleContainerMouseupAndTouchendBound))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("blur",this._handleInputBlurBound),this.el.removeEventListener("keyup",this._handleInputKeyupAndFocusBound),this.el.removeEventListener("focus",this._handleInputKeyupAndFocusBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound),this.el.removeEventListener("click",this._handleInputClickBound),this.container.removeEventListener("mousedown",this._handleContainerMousedownAndTouchstartBound),this.container.removeEventListener("mouseup",this._handleContainerMouseupAndTouchendBound),void 0!==window.ontouchstart&&(this.container.removeEventListener("touchstart",this._handleContainerMousedownAndTouchstartBound),this.container.removeEventListener("touchend",this._handleContainerMouseupAndTouchendBound))}},{key:"_setupDropdown",value:function(){var e=this;this.container=document.createElement("ul"),this.container.id="autocomplete-options-"+M.guid(),h(this.container).addClass("autocomplete-content dropdown-content"),this.$inputField.append(this.container),this.el.setAttribute("data-target",this.container.id),this.dropdown=M.Dropdown.init(this.el,{autoFocus:!1,closeOnClick:!1,coverTrigger:!1,onItemClick:function(t){e.selectOption(h(t))}}),this.el.removeEventListener("click",this.dropdown._handleClickBound)}},{key:"_removeDropdown",value:function(){this.container.parentNode.removeChild(this.container)}},{key:"_handleInputBlur",value:function(){this._mousedown||(this.close(),this._resetAutocomplete())}},{key:"_handleInputKeyupAndFocus",value:function(t){"keyup"===t.type&&(s._keydown=!1),this.count=0;var e=this.el.value.toLowerCase();13!==t.keyCode&&38!==t.keyCode&&40!==t.keyCode&&(this.oldVal===e||!M.tabPressed&&"focus"===t.type||this.open(),this.oldVal=e)}},{key:"_handleInputKeydown",value:function(t){s._keydown=!0;var e=t.keyCode,i=void 0,n=h(this.container).children("li").length;e===M.keys.ENTER&&0<=this.activeIndex?(i=h(this.container).children("li").eq(this.activeIndex)).length&&(this.selectOption(i),t.preventDefault()):e!==M.keys.ARROW_UP&&e!==M.keys.ARROW_DOWN||(t.preventDefault(),e===M.keys.ARROW_UP&&0<this.activeIndex&&this.activeIndex--,e===M.keys.ARROW_DOWN&&this.activeIndex<n-1&&this.activeIndex++,this.$active.removeClass("active"),0<=this.activeIndex&&(this.$active=h(this.container).children("li").eq(this.activeIndex),this.$active.addClass("active")))}},{key:"_handleInputClick",value:function(t){this.open()}},{key:"_handleContainerMousedownAndTouchstart",value:function(t){this._mousedown=!0}},{key:"_handleContainerMouseupAndTouchend",value:function(t){this._mousedown=!1}},{key:"_highlight",value:function(t,e){var i=e.find("img"),n=e.text().toLowerCase().indexOf(""+t.toLowerCase()),s=n+t.length-1,o=e.text().slice(0,n),a=e.text().slice(n,s+1),r=e.text().slice(s+1);e.html("<span>"+o+"<span class='highlight'>"+a+"</span>"+r+"</span>"),i.length&&e.prepend(i)}},{key:"_resetCurrentElement",value:function(){this.activeIndex=-1,this.$active.removeClass("active")}},{key:"_resetAutocomplete",value:function(){h(this.container).empty(),this._resetCurrentElement(),this.oldVal=null,this.isOpen=!1,this._mousedown=!1}},{key:"selectOption",value:function(t){var e=t.text().trim();this.el.value=e,this.$el.trigger("change"),this._resetAutocomplete(),this.close(),"function"==typeof this.options.onAutocomplete&&this.options.onAutocomplete.call(this,e)}},{key:"_renderDropdown",value:function(t,i){var n=this;this._resetAutocomplete();var e=[];for(var s in t)if(t.hasOwnProperty(s)&&-1!==s.toLowerCase().indexOf(i)){if(this.count>=this.options.limit)break;var o={data:t[s],key:s};e.push(o),this.count++}if(this.options.sortFunction){e.sort(function(t,e){return n.options.sortFunction(t.key.toLowerCase(),e.key.toLowerCase(),i.toLowerCase())})}for(var a=0;a<e.length;a++){var r=e[a],l=h("<li></li>");r.data?l.append('<img src="'+r.data+'" class="right circle"><span>'+r.key+"</span>"):l.append("<span>"+r.key+"</span>"),h(this.container).append(l),this._highlight(i,l)}}},{key:"open",value:function(){var t=this.el.value.toLowerCase();this._resetAutocomplete(),t.length>=this.options.minLength&&(this.isOpen=!0,this._renderDropdown(this.options.data,t)),this.dropdown.isOpen?this.dropdown.recalculateDimensions():this.dropdown.open()}},{key:"close",value:function(){this.dropdown.close()}},{key:"updateData",value:function(t){var e=this.el.value.toLowerCase();this.options.data=t,this.isOpen&&this._renderDropdown(t,e)}}],[{key:"init",value:function(t,e){return _get(s.__proto__||Object.getPrototypeOf(s),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Autocomplete}},{key:"defaults",get:function(){return e}}]),s}();t._keydown=!1,M.Autocomplete=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"autocomplete","M_Autocomplete")}(cash),function(d){M.updateTextFields=function(){d("input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea").each(function(t,e){var i=d(this);0<t.value.length||d(t).is(":focus")||t.autofocus||null!==i.attr("placeholder")?i.siblings("label").addClass("active"):t.validity?i.siblings("label").toggleClass("active",!0===t.validity.badInput):i.siblings("label").removeClass("active")})},M.validate_field=function(t){var e=null!==t.attr("data-length"),i=parseInt(t.attr("data-length")),n=t[0].value.length;0!==n||!1!==t[0].validity.badInput||t.is(":required")?t.hasClass("validate")&&(t.is(":valid")&&e&&n<=i||t.is(":valid")&&!e?(t.removeClass("invalid"),t.addClass("valid")):(t.removeClass("valid"),t.addClass("invalid"))):t.hasClass("validate")&&(t.removeClass("valid"),t.removeClass("invalid"))},M.textareaAutoResize=function(t){if(t instanceof Element&&(t=d(t)),t.length){var e=d(".hiddendiv").first();e.length||(e=d('<div class="hiddendiv common"></div>'),d("body").append(e));var i=t.css("font-family"),n=t.css("font-size"),s=t.css("line-height"),o=t.css("padding-top"),a=t.css("padding-right"),r=t.css("padding-bottom"),l=t.css("padding-left");n&&e.css("font-size",n),i&&e.css("font-family",i),s&&e.css("line-height",s),o&&e.css("padding-top",o),a&&e.css("padding-right",a),r&&e.css("padding-bottom",r),l&&e.css("padding-left",l),t.data("original-height")||t.data("original-height",t.height()),"off"===t.attr("wrap")&&e.css("overflow-wrap","normal").css("white-space","pre"),e.text(t[0].value+"\n");var h=e.html().replace(/\n/g,"<br>");e.html(h),0<t[0].offsetWidth&&0<t[0].offsetHeight?e.css("width",t.width()+"px"):e.css("width",window.innerWidth/2+"px"),t.data("original-height")<=e.innerHeight()?t.css("height",e.innerHeight()+"px"):t[0].value.length<t.data("previous-length")&&t.css("height",t.data("original-height")+"px"),t.data("previous-length",t[0].value.length)}else console.error("No textarea element found")},d(document).ready(function(){var n="input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea";d(document).on("change",n,function(){0===this.value.length&&null===d(this).attr("placeholder")||d(this).siblings("label").addClass("active"),M.validate_field(d(this))}),d(document).ready(function(){M.updateTextFields()}),d(document).on("reset",function(t){var e=d(t.target);e.is("form")&&(e.find(n).removeClass("valid").removeClass("invalid"),e.find(n).each(function(t){this.value.length&&d(this).siblings("label").removeClass("active")}),setTimeout(function(){e.find("select").each(function(){this.M_FormSelect&&d(this).trigger("change")})},0))}),document.addEventListener("focus",function(t){d(t.target).is(n)&&d(t.target).siblings("label, .prefix").addClass("active")},!0),document.addEventListener("blur",function(t){var e=d(t.target);if(e.is(n)){var i=".prefix";0===e[0].value.length&&!0!==e[0].validity.badInput&&null===e.attr("placeholder")&&(i+=", label"),e.siblings(i).removeClass("active"),M.validate_field(e)}},!0);d(document).on("keyup","input[type=radio], input[type=checkbox]",function(t){if(t.which===M.keys.TAB)return d(this).addClass("tabbed"),void d(this).one("blur",function(t){d(this).removeClass("tabbed")})});var t=".materialize-textarea";d(t).each(function(){var t=d(this);t.data("original-height",t.height()),t.data("previous-length",this.value.length),M.textareaAutoResize(t)}),d(document).on("keyup",t,function(){M.textareaAutoResize(d(this))}),d(document).on("keydown",t,function(){M.textareaAutoResize(d(this))}),d(document).on("change",'.file-field input[type="file"]',function(){for(var t=d(this).closest(".file-field").find("input.file-path"),e=d(this)[0].files,i=[],n=0;n<e.length;n++)i.push(e[n].name);t[0].value=i.join(", "),t.trigger("change")})})}(cash),function(s,o){"use strict";var e={indicators:!0,height:400,duration:500,interval:6e3},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Slider=i).options=s.extend({},n.defaults,e),i.$slider=i.$el.find(".slides"),i.$slides=i.$slider.children("li"),i.activeIndex=i.$slides.filter(function(t){return s(t).hasClass("active")}).first().index(),-1!=i.activeIndex&&(i.$active=i.$slides.eq(i.activeIndex)),i._setSliderHeight(),i.$slides.find(".caption").each(function(t){i._animateCaptionIn(t,0)}),i.$slides.find("img").each(function(t){var e="data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";s(t).attr("src")!==e&&(s(t).css("background-image",'url("'+s(t).attr("src")+'")'),s(t).attr("src",e))}),i._setupIndicators(),i.$active?i.$active.css("display","block"):(i.$slides.first().addClass("active"),o({targets:i.$slides.first()[0],opacity:1,duration:i.options.duration,easing:"easeOutQuad"}),i.activeIndex=0,i.$active=i.$slides.eq(i.activeIndex),i.options.indicators&&i.$indicators.eq(i.activeIndex).addClass("active")),i.$active.find("img").each(function(t){o({targets:i.$active.find(".caption")[0],opacity:1,translateX:0,translateY:0,duration:i.options.duration,easing:"easeOutQuad"})}),i._setupEventHandlers(),i.start(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this.pause(),this._removeIndicators(),this._removeEventHandlers(),this.el.M_Slider=void 0}},{key:"_setupEventHandlers",value:function(){var e=this;this._handleIntervalBound=this._handleInterval.bind(this),this._handleIndicatorClickBound=this._handleIndicatorClick.bind(this),this.options.indicators&&this.$indicators.each(function(t){t.addEventListener("click",e._handleIndicatorClickBound)})}},{key:"_removeEventHandlers",value:function(){var e=this;this.options.indicators&&this.$indicators.each(function(t){t.removeEventListener("click",e._handleIndicatorClickBound)})}},{key:"_handleIndicatorClick",value:function(t){var e=s(t.target).index();this.set(e)}},{key:"_handleInterval",value:function(){var t=this.$slider.find(".active").index();this.$slides.length===t+1?t=0:t+=1,this.set(t)}},{key:"_animateCaptionIn",value:function(t,e){var i={targets:t,opacity:0,duration:e,easing:"easeOutQuad"};s(t).hasClass("center-align")?i.translateY=-100:s(t).hasClass("right-align")?i.translateX=100:s(t).hasClass("left-align")&&(i.translateX=-100),o(i)}},{key:"_setSliderHeight",value:function(){this.$el.hasClass("fullscreen")||(this.options.indicators?this.$el.css("height",this.options.height+40+"px"):this.$el.css("height",this.options.height+"px"),this.$slider.css("height",this.options.height+"px"))}},{key:"_setupIndicators",value:function(){var n=this;this.options.indicators&&(this.$indicators=s('<ul class="indicators"></ul>'),this.$slides.each(function(t,e){var i=s('<li class="indicator-item"></li>');n.$indicators.append(i[0])}),this.$el.append(this.$indicators[0]),this.$indicators=this.$indicators.children("li.indicator-item"))}},{key:"_removeIndicators",value:function(){this.$el.find("ul.indicators").remove()}},{key:"set",value:function(t){var e=this;if(t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.activeIndex!=t){this.$active=this.$slides.eq(this.activeIndex);var i=this.$active.find(".caption");this.$active.removeClass("active"),o({targets:this.$active[0],opacity:0,duration:this.options.duration,easing:"easeOutQuad",complete:function(){e.$slides.not(".active").each(function(t){o({targets:t,opacity:0,translateX:0,translateY:0,duration:0,easing:"easeOutQuad"})})}}),this._animateCaptionIn(i[0],this.options.duration),this.options.indicators&&(this.$indicators.eq(this.activeIndex).removeClass("active"),this.$indicators.eq(t).addClass("active")),o({targets:this.$slides.eq(t)[0],opacity:1,duration:this.options.duration,easing:"easeOutQuad"}),o({targets:this.$slides.eq(t).find(".caption")[0],opacity:1,translateX:0,translateY:0,duration:this.options.duration,delay:this.options.duration,easing:"easeOutQuad"}),this.$slides.eq(t).addClass("active"),this.activeIndex=t,this.start()}}},{key:"pause",value:function(){clearInterval(this.interval)}},{key:"start",value:function(){clearInterval(this.interval),this.interval=setInterval(this._handleIntervalBound,this.options.duration+this.options.interval)}},{key:"next",value:function(){var t=this.activeIndex+1;t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.set(t)}},{key:"prev",value:function(){var t=this.activeIndex-1;t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.set(t)}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Slider}},{key:"defaults",get:function(){return e}}]),n}();M.Slider=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"slider","M_Slider")}(cash,M.anime),function(n,s){n(document).on("click",".card",function(t){if(n(this).children(".card-reveal").length){var i=n(t.target).closest(".card");void 0===i.data("initialOverflow")&&i.data("initialOverflow",void 0===i.css("overflow")?"":i.css("overflow"));var e=n(this).find(".card-reveal");n(t.target).is(n(".card-reveal .card-title"))||n(t.target).is(n(".card-reveal .card-title i"))?s({targets:e[0],translateY:0,duration:225,easing:"easeInOutQuad",complete:function(t){var e=t.animatables[0].target;n(e).css({display:"none"}),i.css("overflow",i.data("initialOverflow"))}}):(n(t.target).is(n(".card .activator"))||n(t.target).is(n(".card .activator i")))&&(i.css("overflow","hidden"),e.css({display:"block"}),s({targets:e[0],translateY:"-100%",duration:300,easing:"easeInOutQuad"}))}})}(cash,M.anime),function(h){"use strict";var e={data:[],placeholder:"",secondaryPlaceholder:"",autocompleteOptions:{},limit:1/0,onChipAdd:null,onChipSelect:null,onChipDelete:null},t=function(t){function l(t,e){_classCallCheck(this,l);var i=_possibleConstructorReturn(this,(l.__proto__||Object.getPrototypeOf(l)).call(this,l,t,e));return(i.el.M_Chips=i).options=h.extend({},l.defaults,e),i.$el.addClass("chips input-field"),i.chipsData=[],i.$chips=h(),i._setupInput(),i.hasAutocomplete=0<Object.keys(i.options.autocompleteOptions).length,i.$input.attr("id")||i.$input.attr("id",M.guid()),i.options.data.length&&(i.chipsData=i.options.data,i._renderChips(i.chipsData)),i.hasAutocomplete&&i._setupAutocomplete(),i._setPlaceholder(),i._setupLabel(),i._setupEventHandlers(),i}return _inherits(l,Component),_createClass(l,[{key:"getData",value:function(){return this.chipsData}},{key:"destroy",value:function(){this._removeEventHandlers(),this.$chips.remove(),this.el.M_Chips=void 0}},{key:"_setupEventHandlers",value:function(){this._handleChipClickBound=this._handleChipClick.bind(this),this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputFocusBound=this._handleInputFocus.bind(this),this._handleInputBlurBound=this._handleInputBlur.bind(this),this.el.addEventListener("click",this._handleChipClickBound),document.addEventListener("keydown",l._handleChipsKeydown),document.addEventListener("keyup",l._handleChipsKeyup),this.el.addEventListener("blur",l._handleChipsBlur,!0),this.$input[0].addEventListener("focus",this._handleInputFocusBound),this.$input[0].addEventListener("blur",this._handleInputBlurBound),this.$input[0].addEventListener("keydown",this._handleInputKeydownBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleChipClickBound),document.removeEventListener("keydown",l._handleChipsKeydown),document.removeEventListener("keyup",l._handleChipsKeyup),this.el.removeEventListener("blur",l._handleChipsBlur,!0),this.$input[0].removeEventListener("focus",this._handleInputFocusBound),this.$input[0].removeEventListener("blur",this._handleInputBlurBound),this.$input[0].removeEventListener("keydown",this._handleInputKeydownBound)}},{key:"_handleChipClick",value:function(t){var e=h(t.target).closest(".chip"),i=h(t.target).is(".close");if(e.length){var n=e.index();i?(this.deleteChip(n),this.$input[0].focus()):this.selectChip(n)}else this.$input[0].focus()}},{key:"_handleInputFocus",value:function(){this.$el.addClass("focus")}},{key:"_handleInputBlur",value:function(){this.$el.removeClass("focus")}},{key:"_handleInputKeydown",value:function(t){if(l._keydown=!0,13===t.keyCode){if(this.hasAutocomplete&&this.autocomplete&&this.autocomplete.isOpen)return;t.preventDefault(),this.addChip({tag:this.$input[0].value}),this.$input[0].value=""}else 8!==t.keyCode&&37!==t.keyCode||""!==this.$input[0].value||!this.chipsData.length||(t.preventDefault(),this.selectChip(this.chipsData.length-1))}},{key:"_renderChip",value:function(t){if(t.tag){var e=document.createElement("div"),i=document.createElement("i");if(e.classList.add("chip"),e.textContent=t.tag,e.setAttribute("tabindex",0),h(i).addClass("material-icons close"),i.textContent="close",t.image){var n=document.createElement("img");n.setAttribute("src",t.image),e.insertBefore(n,e.firstChild)}return e.appendChild(i),e}}},{key:"_renderChips",value:function(){this.$chips.remove();for(var t=0;t<this.chipsData.length;t++){var e=this._renderChip(this.chipsData[t]);this.$el.append(e),this.$chips.add(e)}this.$el.append(this.$input[0])}},{key:"_setupAutocomplete",value:function(){var e=this;this.options.autocompleteOptions.onAutocomplete=function(t){e.addChip({tag:t}),e.$input[0].value="",e.$input[0].focus()},this.autocomplete=M.Autocomplete.init(this.$input[0],this.options.autocompleteOptions)}},{key:"_setupInput",value:function(){this.$input=this.$el.find("input"),this.$input.length||(this.$input=h("<input></input>"),this.$el.append(this.$input)),this.$input.addClass("input")}},{key:"_setupLabel",value:function(){this.$label=this.$el.find("label"),this.$label.length&&this.$label.setAttribute("for",this.$input.attr("id"))}},{key:"_setPlaceholder",value:function(){void 0!==this.chipsData&&!this.chipsData.length&&this.options.placeholder?h(this.$input).prop("placeholder",this.options.placeholder):(void 0===this.chipsData||this.chipsData.length)&&this.options.secondaryPlaceholder&&h(this.$input).prop("placeholder",this.options.secondaryPlaceholder)}},{key:"_isValid",value:function(t){if(t.hasOwnProperty("tag")&&""!==t.tag){for(var e=!1,i=0;i<this.chipsData.length;i++)if(this.chipsData[i].tag===t.tag){e=!0;break}return!e}return!1}},{key:"addChip",value:function(t){if(this._isValid(t)&&!(this.chipsData.length>=this.options.limit)){var e=this._renderChip(t);this.$chips.add(e),this.chipsData.push(t),h(this.$input).before(e),this._setPlaceholder(),"function"==typeof this.options.onChipAdd&&this.options.onChipAdd.call(this,this.$el,e)}}},{key:"deleteChip",value:function(t){var e=this.$chips.eq(t);this.$chips.eq(t).remove(),this.$chips=this.$chips.filter(function(t){return 0<=h(t).index()}),this.chipsData.splice(t,1),this._setPlaceholder(),"function"==typeof this.options.onChipDelete&&this.options.onChipDelete.call(this,this.$el,e[0])}},{key:"selectChip",value:function(t){var e=this.$chips.eq(t);(this._selectedChip=e)[0].focus(),"function"==typeof this.options.onChipSelect&&this.options.onChipSelect.call(this,this.$el,e[0])}}],[{key:"init",value:function(t,e){return _get(l.__proto__||Object.getPrototypeOf(l),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Chips}},{key:"_handleChipsKeydown",value:function(t){l._keydown=!0;var e=h(t.target).closest(".chips"),i=t.target&&e.length;if(!h(t.target).is("input, textarea")&&i){var n=e[0].M_Chips;if(8===t.keyCode||46===t.keyCode){t.preventDefault();var s=n.chipsData.length;if(n._selectedChip){var o=n._selectedChip.index();n.deleteChip(o),n._selectedChip=null,s=Math.max(o-1,0)}n.chipsData.length&&n.selectChip(s)}else if(37===t.keyCode){if(n._selectedChip){var a=n._selectedChip.index()-1;if(a<0)return;n.selectChip(a)}}else if(39===t.keyCode&&n._selectedChip){var r=n._selectedChip.index()+1;r>=n.chipsData.length?n.$input[0].focus():n.selectChip(r)}}}},{key:"_handleChipsKeyup",value:function(t){l._keydown=!1}},{key:"_handleChipsBlur",value:function(t){l._keydown||(h(t.target).closest(".chips")[0].M_Chips._selectedChip=null)}},{key:"defaults",get:function(){return e}}]),l}();t._keydown=!1,M.Chips=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"chips","M_Chips"),h(document).ready(function(){h(document.body).on("click",".chip .close",function(){var t=h(this).closest(".chips");t.length&&t[0].M_Chips||h(this).closest(".chip").remove()})})}(cash),function(s){"use strict";var e={top:0,bottom:1/0,offset:0,onPositionChange:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Pushpin=i).options=s.extend({},n.defaults,e),i.originalOffset=i.el.offsetTop,n._pushpins.push(i),i._setupEventHandlers(),i._updatePosition(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this.el.style.top=null,this._removePinClasses(),this._removeEventHandlers();var t=n._pushpins.indexOf(this);n._pushpins.splice(t,1)}},{key:"_setupEventHandlers",value:function(){document.addEventListener("scroll",n._updateElements)}},{key:"_removeEventHandlers",value:function(){document.removeEventListener("scroll",n._updateElements)}},{key:"_updatePosition",value:function(){var t=M.getDocumentScrollTop()+this.options.offset;this.options.top<=t&&this.options.bottom>=t&&!this.el.classList.contains("pinned")&&(this._removePinClasses(),this.el.style.top=this.options.offset+"px",this.el.classList.add("pinned"),"function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pinned")),t<this.options.top&&!this.el.classList.contains("pin-top")&&(this._removePinClasses(),this.el.style.top=0,this.el.classList.add("pin-top"),"function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pin-top")),t>this.options.bottom&&!this.el.classList.contains("pin-bottom")&&(this._removePinClasses(),this.el.classList.add("pin-bottom"),this.el.style.top=this.options.bottom-this.originalOffset+"px","function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pin-bottom"))}},{key:"_removePinClasses",value:function(){this.el.classList.remove("pin-top"),this.el.classList.remove("pinned"),this.el.classList.remove("pin-bottom")}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Pushpin}},{key:"_updateElements",value:function(){for(var t in n._pushpins){n._pushpins[t]._updatePosition()}}},{key:"defaults",get:function(){return e}}]),n}();t._pushpins=[],M.Pushpin=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"pushpin","M_Pushpin")}(cash),function(r,s){"use strict";var e={direction:"top",hoverEnabled:!0,toolbarEnabled:!1};r.fn.reverse=[].reverse;var t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_FloatingActionButton=i).options=r.extend({},n.defaults,e),i.isOpen=!1,i.$anchor=i.$el.children("a").first(),i.$menu=i.$el.children("ul").first(),i.$floatingBtns=i.$el.find("ul .btn-floating"),i.$floatingBtnsReverse=i.$el.find("ul .btn-floating").reverse(),i.offsetY=0,i.offsetX=0,i.$el.addClass("direction-"+i.options.direction),"top"===i.options.direction?i.offsetY=40:"right"===i.options.direction?i.offsetX=-40:"bottom"===i.options.direction?i.offsetY=-40:i.offsetX=40,i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_FloatingActionButton=void 0}},{key:"_setupEventHandlers",value:function(){this._handleFABClickBound=this._handleFABClick.bind(this),this._handleOpenBound=this.open.bind(this),this._handleCloseBound=this.close.bind(this),this.options.hoverEnabled&&!this.options.toolbarEnabled?(this.el.addEventListener("mouseenter",this._handleOpenBound),this.el.addEventListener("mouseleave",this._handleCloseBound)):this.el.addEventListener("click",this._handleFABClickBound)}},{key:"_removeEventHandlers",value:function(){this.options.hoverEnabled&&!this.options.toolbarEnabled?(this.el.removeEventListener("mouseenter",this._handleOpenBound),this.el.removeEventListener("mouseleave",this._handleCloseBound)):this.el.removeEventListener("click",this._handleFABClickBound)}},{key:"_handleFABClick",value:function(){this.isOpen?this.close():this.open()}},{key:"_handleDocumentClick",value:function(t){r(t.target).closest(this.$menu).length||this.close()}},{key:"open",value:function(){this.isOpen||(this.options.toolbarEnabled?this._animateInToolbar():this._animateInFAB(),this.isOpen=!0)}},{key:"close",value:function(){this.isOpen&&(this.options.toolbarEnabled?(window.removeEventListener("scroll",this._handleCloseBound,!0),document.body.removeEventListener("click",this._handleDocumentClickBound,!0),this._animateOutToolbar()):this._animateOutFAB(),this.isOpen=!1)}},{key:"_animateInFAB",value:function(){var e=this;this.$el.addClass("active");var i=0;this.$floatingBtnsReverse.each(function(t){s({targets:t,opacity:1,scale:[.4,1],translateY:[e.offsetY,0],translateX:[e.offsetX,0],duration:275,delay:i,easing:"easeInOutQuad"}),i+=40})}},{key:"_animateOutFAB",value:function(){var e=this;this.$floatingBtnsReverse.each(function(t){s.remove(t),s({targets:t,opacity:0,scale:.4,translateY:e.offsetY,translateX:e.offsetX,duration:175,easing:"easeOutQuad",complete:function(){e.$el.removeClass("active")}})})}},{key:"_animateInToolbar",value:function(){var t,e=this,i=window.innerWidth,n=window.innerHeight,s=this.el.getBoundingClientRect(),o=r('<div class="fab-backdrop"></div>'),a=this.$anchor.css("background-color");this.$anchor.append(o),this.offsetX=s.left-i/2+s.width/2,this.offsetY=n-s.bottom,t=i/o[0].clientWidth,this.btnBottom=s.bottom,this.btnLeft=s.left,this.btnWidth=s.width,this.$el.addClass("active"),this.$el.css({"text-align":"center",width:"100%",bottom:0,left:0,transform:"translateX("+this.offsetX+"px)",transition:"none"}),this.$anchor.css({transform:"translateY("+-this.offsetY+"px)",transition:"none"}),o.css({"background-color":a}),setTimeout(function(){e.$el.css({transform:"",transition:"transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s"}),e.$anchor.css({overflow:"visible",transform:"",transition:"transform .2s"}),setTimeout(function(){e.$el.css({overflow:"hidden","background-color":a}),o.css({transform:"scale("+t+")",transition:"transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)"}),e.$menu.children("li").children("a").css({opacity:1}),e._handleDocumentClickBound=e._handleDocumentClick.bind(e),window.addEventListener("scroll",e._handleCloseBound,!0),document.body.addEventListener("click",e._handleDocumentClickBound,!0)},100)},0)}},{key:"_animateOutToolbar",value:function(){var t=this,e=window.innerWidth,i=window.innerHeight,n=this.$el.find(".fab-backdrop"),s=this.$anchor.css("background-color");this.offsetX=this.btnLeft-e/2+this.btnWidth/2,this.offsetY=i-this.btnBottom,this.$el.removeClass("active"),this.$el.css({"background-color":"transparent",transition:"none"}),this.$anchor.css({transition:"none"}),n.css({transform:"scale(0)","background-color":s}),this.$menu.children("li").children("a").css({opacity:""}),setTimeout(function(){n.remove(),t.$el.css({"text-align":"",width:"",bottom:"",left:"",overflow:"","background-color":"",transform:"translate3d("+-t.offsetX+"px,0,0)"}),t.$anchor.css({overflow:"",transform:"translate3d(0,"+t.offsetY+"px,0)"}),setTimeout(function(){t.$el.css({transform:"translate3d(0,0,0)",transition:"transform .2s"}),t.$anchor.css({transform:"translate3d(0,0,0)",transition:"transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)"})},20)},200)}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_FloatingActionButton}},{key:"defaults",get:function(){return e}}]),n}();M.FloatingActionButton=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"floatingActionButton","M_FloatingActionButton")}(cash,M.anime),function(g){"use strict";var e={autoClose:!1,format:"mmm dd, yyyy",parse:null,defaultDate:null,setDefaultDate:!1,disableWeekends:!1,disableDayFn:null,firstDay:0,minDate:null,maxDate:null,yearRange:10,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,showMonthAfterYear:!1,showDaysInNextAndPreviousMonths:!1,container:null,showClearBtn:!1,i18n:{cancel:"Cancel",clear:"Clear",done:"Ok",previousMonth:"‹",nextMonth:"›",months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],weekdaysAbbrev:["S","M","T","W","T","F","S"]},events:[],onSelect:null,onOpen:null,onClose:null,onDraw:null},t=function(t){function B(t,e){_classCallCheck(this,B);var i=_possibleConstructorReturn(this,(B.__proto__||Object.getPrototypeOf(B)).call(this,B,t,e));(i.el.M_Datepicker=i).options=g.extend({},B.defaults,e),e&&e.hasOwnProperty("i18n")&&"object"==typeof e.i18n&&(i.options.i18n=g.extend({},B.defaults.i18n,e.i18n)),i.options.minDate&&i.options.minDate.setHours(0,0,0,0),i.options.maxDate&&i.options.maxDate.setHours(0,0,0,0),i.id=M.guid(),i._setupVariables(),i._insertHTMLIntoDOM(),i._setupModal(),i._setupEventHandlers(),i.options.defaultDate||(i.options.defaultDate=new Date(Date.parse(i.el.value)));var n=i.options.defaultDate;return B._isDate(n)?i.options.setDefaultDate?(i.setDate(n,!0),i.setInputValue()):i.gotoDate(n):i.gotoDate(new Date),i.isOpen=!1,i}return _inherits(B,Component),_createClass(B,[{key:"destroy",value:function(){this._removeEventHandlers(),this.modal.destroy(),g(this.modalEl).remove(),this.destroySelects(),this.el.M_Datepicker=void 0}},{key:"destroySelects",value:function(){var t=this.calendarEl.querySelector(".orig-select-year");t&&M.FormSelect.getInstance(t).destroy();var e=this.calendarEl.querySelector(".orig-select-month");e&&M.FormSelect.getInstance(e).destroy()}},{key:"_insertHTMLIntoDOM",value:function(){this.options.showClearBtn&&(g(this.clearBtn).css({visibility:""}),this.clearBtn.innerHTML=this.options.i18n.clear),this.doneBtn.innerHTML=this.options.i18n.done,this.cancelBtn.innerHTML=this.options.i18n.cancel,this.options.container?this.$modalEl.appendTo(this.options.container):this.$modalEl.insertBefore(this.el)}},{key:"_setupModal",value:function(){var t=this;this.modalEl.id="modal-"+this.id,this.modal=M.Modal.init(this.modalEl,{onCloseEnd:function(){t.isOpen=!1}})}},{key:"toString",value:function(t){var e=this;return t=t||this.options.format,B._isDate(this.date)?t.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g).map(function(t){return e.formats[t]?e.formats[t]():t}).join(""):""}},{key:"setDate",value:function(t,e){if(!t)return this.date=null,this._renderDateDisplay(),this.draw();if("string"==typeof t&&(t=new Date(Date.parse(t))),B._isDate(t)){var i=this.options.minDate,n=this.options.maxDate;B._isDate(i)&&t<i?t=i:B._isDate(n)&&n<t&&(t=n),this.date=new Date(t.getTime()),this._renderDateDisplay(),B._setToStartOfDay(this.date),this.gotoDate(this.date),e||"function"!=typeof this.options.onSelect||this.options.onSelect.call(this,this.date)}}},{key:"setInputValue",value:function(){this.el.value=this.toString(),this.$el.trigger("change",{firedBy:this})}},{key:"_renderDateDisplay",value:function(){var t=B._isDate(this.date)?this.date:new Date,e=this.options.i18n,i=e.weekdaysShort[t.getDay()],n=e.monthsShort[t.getMonth()],s=t.getDate();this.yearTextEl.innerHTML=t.getFullYear(),this.dateTextEl.innerHTML=i+", "+n+" "+s}},{key:"gotoDate",value:function(t){var e=!0;if(B._isDate(t)){if(this.calendars){var i=new Date(this.calendars[0].year,this.calendars[0].month,1),n=new Date(this.calendars[this.calendars.length-1].year,this.calendars[this.calendars.length-1].month,1),s=t.getTime();n.setMonth(n.getMonth()+1),n.setDate(n.getDate()-1),e=s<i.getTime()||n.getTime()<s}e&&(this.calendars=[{month:t.getMonth(),year:t.getFullYear()}]),this.adjustCalendars()}}},{key:"adjustCalendars",value:function(){this.calendars[0]=this.adjustCalendar(this.calendars[0]),this.draw()}},{key:"adjustCalendar",value:function(t){return t.month<0&&(t.year-=Math.ceil(Math.abs(t.month)/12),t.month+=12),11<t.month&&(t.year+=Math.floor(Math.abs(t.month)/12),t.month-=12),t}},{key:"nextMonth",value:function(){this.calendars[0].month++,this.adjustCalendars()}},{key:"prevMonth",value:function(){this.calendars[0].month--,this.adjustCalendars()}},{key:"render",value:function(t,e,i){var n=this.options,s=new Date,o=B._getDaysInMonth(t,e),a=new Date(t,e,1).getDay(),r=[],l=[];B._setToStartOfDay(s),0<n.firstDay&&(a-=n.firstDay)<0&&(a+=7);for(var h=0===e?11:e-1,d=11===e?0:e+1,u=0===e?t-1:t,c=11===e?t+1:t,p=B._getDaysInMonth(u,h),v=o+a,f=v;7<f;)f-=7;v+=7-f;for(var m=!1,g=0,_=0;g<v;g++){var y=new Date(t,e,g-a+1),k=!!B._isDate(this.date)&&B._compareDates(y,this.date),b=B._compareDates(y,s),w=-1!==n.events.indexOf(y.toDateString()),C=g<a||o+a<=g,E=g-a+1,M=e,O=t,x=n.startRange&&B._compareDates(n.startRange,y),L=n.endRange&&B._compareDates(n.endRange,y),T=n.startRange&&n.endRange&&n.startRange<y&&y<n.endRange;C&&(g<a?(E=p+E,M=h,O=u):(E-=o,M=d,O=c));var $={day:E,month:M,year:O,hasEvent:w,isSelected:k,isToday:b,isDisabled:n.minDate&&y<n.minDate||n.maxDate&&y>n.maxDate||n.disableWeekends&&B._isWeekend(y)||n.disableDayFn&&n.disableDayFn(y),isEmpty:C,isStartRange:x,isEndRange:L,isInRange:T,showDaysInNextAndPreviousMonths:n.showDaysInNextAndPreviousMonths};l.push(this.renderDay($)),7==++_&&(r.push(this.renderRow(l,n.isRTL,m)),_=0,m=!(l=[]))}return this.renderTable(n,r,i)}},{key:"renderDay",value:function(t){var e=[],i="false";if(t.isEmpty){if(!t.showDaysInNextAndPreviousMonths)return'<td class="is-empty"></td>';e.push("is-outside-current-month"),e.push("is-selection-disabled")}return t.isDisabled&&e.push("is-disabled"),t.isToday&&e.push("is-today"),t.isSelected&&(e.push("is-selected"),i="true"),t.hasEvent&&e.push("has-event"),t.isInRange&&e.push("is-inrange"),t.isStartRange&&e.push("is-startrange"),t.isEndRange&&e.push("is-endrange"),'<td data-day="'+t.day+'" class="'+e.join(" ")+'" aria-selected="'+i+'"><button class="datepicker-day-button" type="button" data-year="'+t.year+'" data-month="'+t.month+'" data-day="'+t.day+'">'+t.day+"</button></td>"}},{key:"renderRow",value:function(t,e,i){return'<tr class="datepicker-row'+(i?" is-selected":"")+'">'+(e?t.reverse():t).join("")+"</tr>"}},{key:"renderTable",value:function(t,e,i){return'<div class="datepicker-table-wrapper"><table cellpadding="0" cellspacing="0" class="datepicker-table" role="grid" aria-labelledby="'+i+'">'+this.renderHead(t)+this.renderBody(e)+"</table></div>"}},{key:"renderHead",value:function(t){var e=void 0,i=[];for(e=0;e<7;e++)i.push('<th scope="col"><abbr title="'+this.renderDayName(t,e)+'">'+this.renderDayName(t,e,!0)+"</abbr></th>");return"<thead><tr>"+(t.isRTL?i.reverse():i).join("")+"</tr></thead>"}},{key:"renderBody",value:function(t){return"<tbody>"+t.join("")+"</tbody>"}},{key:"renderTitle",value:function(t,e,i,n,s,o){var a,r,l=void 0,h=void 0,d=void 0,u=this.options,c=i===u.minYear,p=i===u.maxYear,v='<div id="'+o+'" class="datepicker-controls" role="heading" aria-live="assertive">',f=!0,m=!0;for(d=[],l=0;l<12;l++)d.push('<option value="'+(i===s?l-e:12+l-e)+'"'+(l===n?' selected="selected"':"")+(c&&l<u.minMonth||p&&l>u.maxMonth?'disabled="disabled"':"")+">"+u.i18n.months[l]+"</option>");for(a='<select class="datepicker-select orig-select-month" tabindex="-1">'+d.join("")+"</select>",g.isArray(u.yearRange)?(l=u.yearRange[0],h=u.yearRange[1]+1):(l=i-u.yearRange,h=1+i+u.yearRange),d=[];l<h&&l<=u.maxYear;l++)l>=u.minYear&&d.push('<option value="'+l+'" '+(l===i?'selected="selected"':"")+">"+l+"</option>");r='<select class="datepicker-select orig-select-year" tabindex="-1">'+d.join("")+"</select>";v+='<button class="month-prev'+(f?"":" is-disabled")+'" type="button"><svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z"/><path d="M0-.5h24v24H0z" fill="none"/></svg></button>',v+='<div class="selects-container">',u.showMonthAfterYear?v+=r+a:v+=a+r,v+="</div>",c&&(0===n||u.minMonth>=n)&&(f=!1),p&&(11===n||u.maxMonth<=n)&&(m=!1);return(v+='<button class="month-next'+(m?"":" is-disabled")+'" type="button"><svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z"/><path d="M0-.25h24v24H0z" fill="none"/></svg></button>')+"</div>"}},{key:"draw",value:function(t){if(this.isOpen||t){var e,i=this.options,n=i.minYear,s=i.maxYear,o=i.minMonth,a=i.maxMonth,r="";this._y<=n&&(this._y=n,!isNaN(o)&&this._m<o&&(this._m=o)),this._y>=s&&(this._y=s,!isNaN(a)&&this._m>a&&(this._m=a)),e="datepicker-title-"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,2);for(var l=0;l<1;l++)this._renderDateDisplay(),r+=this.renderTitle(this,l,this.calendars[l].year,this.calendars[l].month,this.calendars[0].year,e)+this.render(this.calendars[l].year,this.calendars[l].month,e);this.destroySelects(),this.calendarEl.innerHTML=r;var h=this.calendarEl.querySelector(".orig-select-year"),d=this.calendarEl.querySelector(".orig-select-month");M.FormSelect.init(h,{classes:"select-year",dropdownOptions:{container:document.body,constrainWidth:!1}}),M.FormSelect.init(d,{classes:"select-month",dropdownOptions:{container:document.body,constrainWidth:!1}}),h.addEventListener("change",this._handleYearChange.bind(this)),d.addEventListener("change",this._handleMonthChange.bind(this)),"function"==typeof this.options.onDraw&&this.options.onDraw(this)}}},{key:"_setupEventHandlers",value:function(){this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleInputChangeBound=this._handleInputChange.bind(this),this._handleCalendarClickBound=this._handleCalendarClick.bind(this),this._finishSelectionBound=this._finishSelection.bind(this),this._handleMonthChange=this._handleMonthChange.bind(this),this._closeBound=this.close.bind(this),this.el.addEventListener("click",this._handleInputClickBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.el.addEventListener("change",this._handleInputChangeBound),this.calendarEl.addEventListener("click",this._handleCalendarClickBound),this.doneBtn.addEventListener("click",this._finishSelectionBound),this.cancelBtn.addEventListener("click",this._closeBound),this.options.showClearBtn&&(this._handleClearClickBound=this._handleClearClick.bind(this),this.clearBtn.addEventListener("click",this._handleClearClickBound))}},{key:"_setupVariables",value:function(){var e=this;this.$modalEl=g(B._template),this.modalEl=this.$modalEl[0],this.calendarEl=this.modalEl.querySelector(".datepicker-calendar"),this.yearTextEl=this.modalEl.querySelector(".year-text"),this.dateTextEl=this.modalEl.querySelector(".date-text"),this.options.showClearBtn&&(this.clearBtn=this.modalEl.querySelector(".datepicker-clear")),this.doneBtn=this.modalEl.querySelector(".datepicker-done"),this.cancelBtn=this.modalEl.querySelector(".datepicker-cancel"),this.formats={d:function(){return e.date.getDate()},dd:function(){var t=e.date.getDate();return(t<10?"0":"")+t},ddd:function(){return e.options.i18n.weekdaysShort[e.date.getDay()]},dddd:function(){return e.options.i18n.weekdays[e.date.getDay()]},m:function(){return e.date.getMonth()+1},mm:function(){var t=e.date.getMonth()+1;return(t<10?"0":"")+t},mmm:function(){return e.options.i18n.monthsShort[e.date.getMonth()]},mmmm:function(){return e.options.i18n.months[e.date.getMonth()]},yy:function(){return(""+e.date.getFullYear()).slice(2)},yyyy:function(){return e.date.getFullYear()}}}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleInputClickBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound),this.el.removeEventListener("change",this._handleInputChangeBound),this.calendarEl.removeEventListener("click",this._handleCalendarClickBound)}},{key:"_handleInputClick",value:function(){this.open()}},{key:"_handleInputKeydown",value:function(t){t.which===M.keys.ENTER&&(t.preventDefault(),this.open())}},{key:"_handleCalendarClick",value:function(t){if(this.isOpen){var e=g(t.target);e.hasClass("is-disabled")||(!e.hasClass("datepicker-day-button")||e.hasClass("is-empty")||e.parent().hasClass("is-disabled")?e.closest(".month-prev").length?this.prevMonth():e.closest(".month-next").length&&this.nextMonth():(this.setDate(new Date(t.target.getAttribute("data-year"),t.target.getAttribute("data-month"),t.target.getAttribute("data-day"))),this.options.autoClose&&this._finishSelection()))}}},{key:"_handleClearClick",value:function(){this.date=null,this.setInputValue(),this.close()}},{key:"_handleMonthChange",value:function(t){this.gotoMonth(t.target.value)}},{key:"_handleYearChange",value:function(t){this.gotoYear(t.target.value)}},{key:"gotoMonth",value:function(t){isNaN(t)||(this.calendars[0].month=parseInt(t,10),this.adjustCalendars())}},{key:"gotoYear",value:function(t){isNaN(t)||(this.calendars[0].year=parseInt(t,10),this.adjustCalendars())}},{key:"_handleInputChange",value:function(t){var e=void 0;t.firedBy!==this&&(e=this.options.parse?this.options.parse(this.el.value,this.options.format):new Date(Date.parse(this.el.value)),B._isDate(e)&&this.setDate(e))}},{key:"renderDayName",value:function(t,e,i){for(e+=t.firstDay;7<=e;)e-=7;return i?t.i18n.weekdaysAbbrev[e]:t.i18n.weekdays[e]}},{key:"_finishSelection",value:function(){this.setInputValue(),this.close()}},{key:"open",value:function(){if(!this.isOpen)return this.isOpen=!0,"function"==typeof this.options.onOpen&&this.options.onOpen.call(this),this.draw(),this.modal.open(),this}},{key:"close",value:function(){if(this.isOpen)return this.isOpen=!1,"function"==typeof this.options.onClose&&this.options.onClose.call(this),this.modal.close(),this}}],[{key:"init",value:function(t,e){return _get(B.__proto__||Object.getPrototypeOf(B),"init",this).call(this,this,t,e)}},{key:"_isDate",value:function(t){return/Date/.test(Object.prototype.toString.call(t))&&!isNaN(t.getTime())}},{key:"_isWeekend",value:function(t){var e=t.getDay();return 0===e||6===e}},{key:"_setToStartOfDay",value:function(t){B._isDate(t)&&t.setHours(0,0,0,0)}},{key:"_getDaysInMonth",value:function(t,e){return[31,B._isLeapYear(t)?29:28,31,30,31,30,31,31,30,31,30,31][e]}},{key:"_isLeapYear",value:function(t){return t%4==0&&t%100!=0||t%400==0}},{key:"_compareDates",value:function(t,e){return t.getTime()===e.getTime()}},{key:"_setToStartOfDay",value:function(t){B._isDate(t)&&t.setHours(0,0,0,0)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Datepicker}},{key:"defaults",get:function(){return e}}]),B}();t._template=['<div class= "modal datepicker-modal">','<div class="modal-content datepicker-container">','<div class="datepicker-date-display">','<span class="year-text"></span>','<span class="date-text"></span>',"</div>",'<div class="datepicker-calendar-container">','<div class="datepicker-calendar"></div>','<div class="datepicker-footer">','<button class="btn-flat datepicker-clear waves-effect" style="visibility: hidden;" type="button"></button>','<div class="confirmation-btns">','<button class="btn-flat datepicker-cancel waves-effect" type="button"></button>','<button class="btn-flat datepicker-done waves-effect" type="button"></button>',"</div>","</div>","</div>","</div>","</div>"].join(""),M.Datepicker=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"datepicker","M_Datepicker")}(cash),function(h){"use strict";var e={dialRadius:135,outerRadius:105,innerRadius:70,tickRadius:20,duration:350,container:null,defaultTime:"now",fromNow:0,showClearBtn:!1,i18n:{cancel:"Cancel",clear:"Clear",done:"Ok"},autoClose:!1,twelveHour:!0,vibrate:!0,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,onSelect:null},t=function(t){function f(t,e){_classCallCheck(this,f);var i=_possibleConstructorReturn(this,(f.__proto__||Object.getPrototypeOf(f)).call(this,f,t,e));return(i.el.M_Timepicker=i).options=h.extend({},f.defaults,e),i.id=M.guid(),i._insertHTMLIntoDOM(),i._setupModal(),i._setupVariables(),i._setupEventHandlers(),i._clockSetup(),i._pickerSetup(),i}return _inherits(f,Component),_createClass(f,[{key:"destroy",value:function(){this._removeEventHandlers(),this.modal.destroy(),h(this.modalEl).remove(),this.el.M_Timepicker=void 0}},{key:"_setupEventHandlers",value:function(){this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleClockClickStartBound=this._handleClockClickStart.bind(this),this._handleDocumentClickMoveBound=this._handleDocumentClickMove.bind(this),this._handleDocumentClickEndBound=this._handleDocumentClickEnd.bind(this),this.el.addEventListener("click",this._handleInputClickBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.plate.addEventListener("mousedown",this._handleClockClickStartBound),this.plate.addEventListener("touchstart",this._handleClockClickStartBound),h(this.spanHours).on("click",this.showView.bind(this,"hours")),h(this.spanMinutes).on("click",this.showView.bind(this,"minutes"))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleInputClickBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound)}},{key:"_handleInputClick",value:function(){this.open()}},{key:"_handleInputKeydown",value:function(t){t.which===M.keys.ENTER&&(t.preventDefault(),this.open())}},{key:"_handleClockClickStart",value:function(t){t.preventDefault();var e=this.plate.getBoundingClientRect(),i=e.left,n=e.top;this.x0=i+this.options.dialRadius,this.y0=n+this.options.dialRadius,this.moved=!1;var s=f._Pos(t);this.dx=s.x-this.x0,this.dy=s.y-this.y0,this.setHand(this.dx,this.dy,!1),document.addEventListener("mousemove",this._handleDocumentClickMoveBound),document.addEventListener("touchmove",this._handleDocumentClickMoveBound),document.addEventListener("mouseup",this._handleDocumentClickEndBound),document.addEventListener("touchend",this._handleDocumentClickEndBound)}},{key:"_handleDocumentClickMove",value:function(t){t.preventDefault();var e=f._Pos(t),i=e.x-this.x0,n=e.y-this.y0;this.moved=!0,this.setHand(i,n,!1,!0)}},{key:"_handleDocumentClickEnd",value:function(t){var e=this;t.preventDefault(),document.removeEventListener("mouseup",this._handleDocumentClickEndBound),document.removeEventListener("touchend",this._handleDocumentClickEndBound);var i=f._Pos(t),n=i.x-this.x0,s=i.y-this.y0;this.moved&&n===this.dx&&s===this.dy&&this.setHand(n,s),"hours"===this.currentView?this.showView("minutes",this.options.duration/2):this.options.autoClose&&(h(this.minutesView).addClass("timepicker-dial-out"),setTimeout(function(){e.done()},this.options.duration/2)),"function"==typeof this.options.onSelect&&this.options.onSelect.call(this,this.hours,this.minutes),document.removeEventListener("mousemove",this._handleDocumentClickMoveBound),document.removeEventListener("touchmove",this._handleDocumentClickMoveBound)}},{key:"_insertHTMLIntoDOM",value:function(){this.$modalEl=h(f._template),this.modalEl=this.$modalEl[0],this.modalEl.id="modal-"+this.id;var t=document.querySelector(this.options.container);this.options.container&&t?this.$modalEl.appendTo(t):this.$modalEl.insertBefore(this.el)}},{key:"_setupModal",value:function(){var t=this;this.modal=M.Modal.init(this.modalEl,{onOpenStart:this.options.onOpenStart,onOpenEnd:this.options.onOpenEnd,onCloseStart:this.options.onCloseStart,onCloseEnd:function(){"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t),t.isOpen=!1}})}},{key:"_setupVariables",value:function(){this.currentView="hours",this.vibrate=navigator.vibrate?"vibrate":navigator.webkitVibrate?"webkitVibrate":null,this._canvas=this.modalEl.querySelector(".timepicker-canvas"),this.plate=this.modalEl.querySelector(".timepicker-plate"),this.hoursView=this.modalEl.querySelector(".timepicker-hours"),this.minutesView=this.modalEl.querySelector(".timepicker-minutes"),this.spanHours=this.modalEl.querySelector(".timepicker-span-hours"),this.spanMinutes=this.modalEl.querySelector(".timepicker-span-minutes"),this.spanAmPm=this.modalEl.querySelector(".timepicker-span-am-pm"),this.footer=this.modalEl.querySelector(".timepicker-footer"),this.amOrPm="PM"}},{key:"_pickerSetup",value:function(){var t=h('<button class="btn-flat timepicker-clear waves-effect" style="visibility: hidden;" type="button" tabindex="'+(this.options.twelveHour?"3":"1")+'">'+this.options.i18n.clear+"</button>").appendTo(this.footer).on("click",this.clear.bind(this));this.options.showClearBtn&&t.css({visibility:""});var e=h('<div class="confirmation-btns"></div>');h('<button class="btn-flat timepicker-close waves-effect" type="button" tabindex="'+(this.options.twelveHour?"3":"1")+'">'+this.options.i18n.cancel+"</button>").appendTo(e).on("click",this.close.bind(this)),h('<button class="btn-flat timepicker-close waves-effect" type="button" tabindex="'+(this.options.twelveHour?"3":"1")+'">'+this.options.i18n.done+"</button>").appendTo(e).on("click",this.done.bind(this)),e.appendTo(this.footer)}},{key:"_clockSetup",value:function(){this.options.twelveHour&&(this.$amBtn=h('<div class="am-btn">AM</div>'),this.$pmBtn=h('<div class="pm-btn">PM</div>'),this.$amBtn.on("click",this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm),this.$pmBtn.on("click",this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm)),this._buildHoursView(),this._buildMinutesView(),this._buildSVGClock()}},{key:"_buildSVGClock",value:function(){var t=this.options.dialRadius,e=this.options.tickRadius,i=2*t,n=f._createSVGEl("svg");n.setAttribute("class","timepicker-svg"),n.setAttribute("width",i),n.setAttribute("height",i);var s=f._createSVGEl("g");s.setAttribute("transform","translate("+t+","+t+")");var o=f._createSVGEl("circle");o.setAttribute("class","timepicker-canvas-bearing"),o.setAttribute("cx",0),o.setAttribute("cy",0),o.setAttribute("r",4);var a=f._createSVGEl("line");a.setAttribute("x1",0),a.setAttribute("y1",0);var r=f._createSVGEl("circle");r.setAttribute("class","timepicker-canvas-bg"),r.setAttribute("r",e),s.appendChild(a),s.appendChild(r),s.appendChild(o),n.appendChild(s),this._canvas.appendChild(n),this.hand=a,this.bg=r,this.bearing=o,this.g=s}},{key:"_buildHoursView",value:function(){var t=h('<div class="timepicker-tick"></div>');if(this.options.twelveHour)for(var e=1;e<13;e+=1){var i=t.clone(),n=e/6*Math.PI,s=this.options.outerRadius;i.css({left:this.options.dialRadius+Math.sin(n)*s-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(n)*s-this.options.tickRadius+"px"}),i.html(0===e?"00":e),this.hoursView.appendChild(i[0])}else for(var o=0;o<24;o+=1){var a=t.clone(),r=o/6*Math.PI,l=0<o&&o<13?this.options.innerRadius:this.options.outerRadius;a.css({left:this.options.dialRadius+Math.sin(r)*l-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(r)*l-this.options.tickRadius+"px"}),a.html(0===o?"00":o),this.hoursView.appendChild(a[0])}}},{key:"_buildMinutesView",value:function(){for(var t=h('<div class="timepicker-tick"></div>'),e=0;e<60;e+=5){var i=t.clone(),n=e/30*Math.PI;i.css({left:this.options.dialRadius+Math.sin(n)*this.options.outerRadius-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(n)*this.options.outerRadius-this.options.tickRadius+"px"}),i.html(f._addLeadingZero(e)),this.minutesView.appendChild(i[0])}}},{key:"_handleAmPmClick",value:function(t){var e=h(t.target);this.amOrPm=e.hasClass("am-btn")?"AM":"PM",this._updateAmPmView()}},{key:"_updateAmPmView",value:function(){this.options.twelveHour&&(this.$amBtn.toggleClass("text-primary","AM"===this.amOrPm),this.$pmBtn.toggleClass("text-primary","PM"===this.amOrPm))}},{key:"_updateTimeFromInput",value:function(){var t=((this.el.value||this.options.defaultTime||"")+"").split(":");if(this.options.twelveHour&&void 0!==t[1]&&(0<t[1].toUpperCase().indexOf("AM")?this.amOrPm="AM":this.amOrPm="PM",t[1]=t[1].replace("AM","").replace("PM","")),"now"===t[0]){var e=new Date(+new Date+this.options.fromNow);t=[e.getHours(),e.getMinutes()],this.options.twelveHour&&(this.amOrPm=12<=t[0]&&t[0]<24?"PM":"AM")}this.hours=+t[0]||0,this.minutes=+t[1]||0,this.spanHours.innerHTML=this.hours,this.spanMinutes.innerHTML=f._addLeadingZero(this.minutes),this._updateAmPmView()}},{key:"showView",value:function(t,e){"minutes"===t&&h(this.hoursView).css("visibility");var i="hours"===t,n=i?this.hoursView:this.minutesView,s=i?this.minutesView:this.hoursView;this.currentView=t,h(this.spanHours).toggleClass("text-primary",i),h(this.spanMinutes).toggleClass("text-primary",!i),s.classList.add("timepicker-dial-out"),h(n).css("visibility","visible").removeClass("timepicker-dial-out"),this.resetClock(e),clearTimeout(this.toggleViewTimer),this.toggleViewTimer=setTimeout(function(){h(s).css("visibility","hidden")},this.options.duration)}},{key:"resetClock",value:function(t){var e=this.currentView,i=this[e],n="hours"===e,s=i*(Math.PI/(n?6:30)),o=n&&0<i&&i<13?this.options.innerRadius:this.options.outerRadius,a=Math.sin(s)*o,r=-Math.cos(s)*o,l=this;t?(h(this.canvas).addClass("timepicker-canvas-out"),setTimeout(function(){h(l.canvas).removeClass("timepicker-canvas-out"),l.setHand(a,r)},t)):this.setHand(a,r)}},{key:"setHand",value:function(t,e,i){var n=this,s=Math.atan2(t,-e),o="hours"===this.currentView,a=Math.PI/(o||i?6:30),r=Math.sqrt(t*t+e*e),l=o&&r<(this.options.outerRadius+this.options.innerRadius)/2,h=l?this.options.innerRadius:this.options.outerRadius;this.options.twelveHour&&(h=this.options.outerRadius),s<0&&(s=2*Math.PI+s);var d=Math.round(s/a);s=d*a,this.options.twelveHour?o?0===d&&(d=12):(i&&(d*=5),60===d&&(d=0)):o?(12===d&&(d=0),d=l?0===d?12:d:0===d?0:d+12):(i&&(d*=5),60===d&&(d=0)),this[this.currentView]!==d&&this.vibrate&&this.options.vibrate&&(this.vibrateTimer||(navigator[this.vibrate](10),this.vibrateTimer=setTimeout(function(){n.vibrateTimer=null},100))),this[this.currentView]=d,o?this.spanHours.innerHTML=d:this.spanMinutes.innerHTML=f._addLeadingZero(d);var u=Math.sin(s)*(h-this.options.tickRadius),c=-Math.cos(s)*(h-this.options.tickRadius),p=Math.sin(s)*h,v=-Math.cos(s)*h;this.hand.setAttribute("x2",u),this.hand.setAttribute("y2",c),this.bg.setAttribute("cx",p),this.bg.setAttribute("cy",v)}},{key:"open",value:function(){this.isOpen||(this.isOpen=!0,this._updateTimeFromInput(),this.showView("hours"),this.modal.open())}},{key:"close",value:function(){this.isOpen&&(this.isOpen=!1,this.modal.close())}},{key:"done",value:function(t,e){var i=this.el.value,n=e?"":f._addLeadingZero(this.hours)+":"+f._addLeadingZero(this.minutes);this.time=n,!e&&this.options.twelveHour&&(n=n+" "+this.amOrPm),(this.el.value=n)!==i&&this.$el.trigger("change"),this.close(),this.el.focus()}},{key:"clear",value:function(){this.done(null,!0)}}],[{key:"init",value:function(t,e){return _get(f.__proto__||Object.getPrototypeOf(f),"init",this).call(this,this,t,e)}},{key:"_addLeadingZero",value:function(t){return(t<10?"0":"")+t}},{key:"_createSVGEl",value:function(t){return document.createElementNS("http://www.w3.org/2000/svg",t)}},{key:"_Pos",value:function(t){return t.targetTouches&&1<=t.targetTouches.length?{x:t.targetTouches[0].clientX,y:t.targetTouches[0].clientY}:{x:t.clientX,y:t.clientY}}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Timepicker}},{key:"defaults",get:function(){return e}}]),f}();t._template=['<div class= "modal timepicker-modal">','<div class="modal-content timepicker-container">','<div class="timepicker-digital-display">','<div class="timepicker-text-container">','<div class="timepicker-display-column">','<span class="timepicker-span-hours text-primary"></span>',":",'<span class="timepicker-span-minutes"></span>',"</div>",'<div class="timepicker-display-column timepicker-display-am-pm">','<div class="timepicker-span-am-pm"></div>',"</div>","</div>","</div>",'<div class="timepicker-analog-display">','<div class="timepicker-plate">','<div class="timepicker-canvas"></div>','<div class="timepicker-dial timepicker-hours"></div>','<div class="timepicker-dial timepicker-minutes timepicker-dial-out"></div>',"</div>",'<div class="timepicker-footer"></div>',"</div>","</div>","</div>"].join(""),M.Timepicker=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"timepicker","M_Timepicker")}(cash),function(s){"use strict";var e={},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_CharacterCounter=i).options=s.extend({},n.defaults,e),i.isInvalid=!1,i.isValidLength=!1,i._setupCounter(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.CharacterCounter=void 0,this._removeCounter()}},{key:"_setupEventHandlers",value:function(){this._handleUpdateCounterBound=this.updateCounter.bind(this),this.el.addEventListener("focus",this._handleUpdateCounterBound,!0),this.el.addEventListener("input",this._handleUpdateCounterBound,!0)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("focus",this._handleUpdateCounterBound,!0),this.el.removeEventListener("input",this._handleUpdateCounterBound,!0)}},{key:"_setupCounter",value:function(){this.counterEl=document.createElement("span"),s(this.counterEl).addClass("character-counter").css({float:"right","font-size":"12px",height:1}),this.$el.parent().append(this.counterEl)}},{key:"_removeCounter",value:function(){s(this.counterEl).remove()}},{key:"updateCounter",value:function(){var t=+this.$el.attr("data-length"),e=this.el.value.length;this.isValidLength=e<=t;var i=e;t&&(i+="/"+t,this._validateInput()),s(this.counterEl).html(i)}},{key:"_validateInput",value:function(){this.isValidLength&&this.isInvalid?(this.isInvalid=!1,this.$el.removeClass("invalid")):this.isValidLength||this.isInvalid||(this.isInvalid=!0,this.$el.removeClass("valid"),this.$el.addClass("invalid"))}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_CharacterCounter}},{key:"defaults",get:function(){return e}}]),n}();M.CharacterCounter=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"characterCounter","M_CharacterCounter")}(cash),function(b){"use strict";var e={duration:200,dist:-100,shift:0,padding:0,numVisible:5,fullWidth:!1,indicators:!1,noWrap:!1,onCycleTo:null},t=function(t){function i(t,e){_classCallCheck(this,i);var n=_possibleConstructorReturn(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,i,t,e));return(n.el.M_Carousel=n).options=b.extend({},i.defaults,e),n.hasMultipleSlides=1<n.$el.find(".carousel-item").length,n.showIndicators=n.options.indicators&&n.hasMultipleSlides,n.noWrap=n.options.noWrap||!n.hasMultipleSlides,n.pressed=!1,n.dragged=!1,n.offset=n.target=0,n.images=[],n.itemWidth=n.$el.find(".carousel-item").first().innerWidth(),n.itemHeight=n.$el.find(".carousel-item").first().innerHeight(),n.dim=2*n.itemWidth+n.options.padding||1,n._autoScrollBound=n._autoScroll.bind(n),n._trackBound=n._track.bind(n),n.options.fullWidth&&(n.options.dist=0,n._setCarouselHeight(),n.showIndicators&&n.$el.find(".carousel-fixed-item").addClass("with-indicators")),n.$indicators=b('<ul class="indicators"></ul>'),n.$el.find(".carousel-item").each(function(t,e){if(n.images.push(t),n.showIndicators){var i=b('<li class="indicator-item"></li>');0===e&&i[0].classList.add("active"),n.$indicators.append(i)}}),n.showIndicators&&n.$el.append(n.$indicators),n.count=n.images.length,n.options.numVisible=Math.min(n.count,n.options.numVisible),n.xform="transform",["webkit","Moz","O","ms"].every(function(t){var e=t+"Transform";return void 0===document.body.style[e]||(n.xform=e,!1)}),n._setupEventHandlers(),n._scroll(n.offset),n}return _inherits(i,Component),_createClass(i,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Carousel=void 0}},{key:"_setupEventHandlers",value:function(){var i=this;this._handleCarouselTapBound=this._handleCarouselTap.bind(this),this._handleCarouselDragBound=this._handleCarouselDrag.bind(this),this._handleCarouselReleaseBound=this._handleCarouselRelease.bind(this),this._handleCarouselClickBound=this._handleCarouselClick.bind(this),void 0!==window.ontouchstart&&(this.el.addEventListener("touchstart",this._handleCarouselTapBound),this.el.addEventListener("touchmove",this._handleCarouselDragBound),this.el.addEventListener("touchend",this._handleCarouselReleaseBound)),this.el.addEventListener("mousedown",this._handleCarouselTapBound),this.el.addEventListener("mousemove",this._handleCarouselDragBound),this.el.addEventListener("mouseup",this._handleCarouselReleaseBound),this.el.addEventListener("mouseleave",this._handleCarouselReleaseBound),this.el.addEventListener("click",this._handleCarouselClickBound),this.showIndicators&&this.$indicators&&(this._handleIndicatorClickBound=this._handleIndicatorClick.bind(this),this.$indicators.find(".indicator-item").each(function(t,e){t.addEventListener("click",i._handleIndicatorClickBound)}));var t=M.throttle(this._handleResize,200);this._handleThrottledResizeBound=t.bind(this),window.addEventListener("resize",this._handleThrottledResizeBound)}},{key:"_removeEventHandlers",value:function(){var i=this;void 0!==window.ontouchstart&&(this.el.removeEventListener("touchstart",this._handleCarouselTapBound),this.el.removeEventListener("touchmove",this._handleCarouselDragBound),this.el.removeEventListener("touchend",this._handleCarouselReleaseBound)),this.el.removeEventListener("mousedown",this._handleCarouselTapBound),this.el.removeEventListener("mousemove",this._handleCarouselDragBound),this.el.removeEventListener("mouseup",this._handleCarouselReleaseBound),this.el.removeEventListener("mouseleave",this._handleCarouselReleaseBound),this.el.removeEventListener("click",this._handleCarouselClickBound),this.showIndicators&&this.$indicators&&this.$indicators.find(".indicator-item").each(function(t,e){t.removeEventListener("click",i._handleIndicatorClickBound)}),window.removeEventListener("resize",this._handleThrottledResizeBound)}},{key:"_handleCarouselTap",value:function(t){"mousedown"===t.type&&b(t.target).is("img")&&t.preventDefault(),this.pressed=!0,this.dragged=!1,this.verticalDragged=!1,this.reference=this._xpos(t),this.referenceY=this._ypos(t),this.velocity=this.amplitude=0,this.frame=this.offset,this.timestamp=Date.now(),clearInterval(this.ticker),this.ticker=setInterval(this._trackBound,100)}},{key:"_handleCarouselDrag",value:function(t){var e=void 0,i=void 0,n=void 0;if(this.pressed)if(e=this._xpos(t),i=this._ypos(t),n=this.reference-e,Math.abs(this.referenceY-i)<30&&!this.verticalDragged)(2<n||n<-2)&&(this.dragged=!0,this.reference=e,this._scroll(this.offset+n));else{if(this.dragged)return t.preventDefault(),t.stopPropagation(),!1;this.verticalDragged=!0}if(this.dragged)return t.preventDefault(),t.stopPropagation(),!1}},{key:"_handleCarouselRelease",value:function(t){if(this.pressed)return this.pressed=!1,clearInterval(this.ticker),this.target=this.offset,(10<this.velocity||this.velocity<-10)&&(this.amplitude=.9*this.velocity,this.target=this.offset+this.amplitude),this.target=Math.round(this.target/this.dim)*this.dim,this.noWrap&&(this.target>=this.dim*(this.count-1)?this.target=this.dim*(this.count-1):this.target<0&&(this.target=0)),this.amplitude=this.target-this.offset,this.timestamp=Date.now(),requestAnimationFrame(this._autoScrollBound),this.dragged&&(t.preventDefault(),t.stopPropagation()),!1}},{key:"_handleCarouselClick",value:function(t){if(this.dragged)return t.preventDefault(),t.stopPropagation(),!1;if(!this.options.fullWidth){var e=b(t.target).closest(".carousel-item").index();0!==this._wrap(this.center)-e&&(t.preventDefault(),t.stopPropagation()),this._cycleTo(e)}}},{key:"_handleIndicatorClick",value:function(t){t.stopPropagation();var e=b(t.target).closest(".indicator-item");e.length&&this._cycleTo(e.index())}},{key:"_handleResize",value:function(t){this.options.fullWidth?(this.itemWidth=this.$el.find(".carousel-item").first().innerWidth(),this.imageHeight=this.$el.find(".carousel-item.active").height(),this.dim=2*this.itemWidth+this.options.padding,this.offset=2*this.center*this.itemWidth,this.target=this.offset,this._setCarouselHeight(!0)):this._scroll()}},{key:"_setCarouselHeight",value:function(t){var i=this,e=this.$el.find(".carousel-item.active").length?this.$el.find(".carousel-item.active").first():this.$el.find(".carousel-item").first(),n=e.find("img").first();if(n.length)if(n[0].complete){var s=n.height();if(0<s)this.$el.css("height",s+"px");else{var o=n[0].naturalWidth,a=n[0].naturalHeight,r=this.$el.width()/o*a;this.$el.css("height",r+"px")}}else n.one("load",function(t,e){i.$el.css("height",t.offsetHeight+"px")});else if(!t){var l=e.height();this.$el.css("height",l+"px")}}},{key:"_xpos",value:function(t){return t.targetTouches&&1<=t.targetTouches.length?t.targetTouches[0].clientX:t.clientX}},{key:"_ypos",value:function(t){return t.targetTouches&&1<=t.targetTouches.length?t.targetTouches[0].clientY:t.clientY}},{key:"_wrap",value:function(t){return t>=this.count?t%this.count:t<0?this._wrap(this.count+t%this.count):t}},{key:"_track",value:function(){var t,e,i,n;e=(t=Date.now())-this.timestamp,this.timestamp=t,i=this.offset-this.frame,this.frame=this.offset,n=1e3*i/(1+e),this.velocity=.8*n+.2*this.velocity}},{key:"_autoScroll",value:function(){var t=void 0,e=void 0;this.amplitude&&(t=Date.now()-this.timestamp,2<(e=this.amplitude*Math.exp(-t/this.options.duration))||e<-2?(this._scroll(this.target-e),requestAnimationFrame(this._autoScrollBound)):this._scroll(this.target))}},{key:"_scroll",value:function(t){var e=this;this.$el.hasClass("scrolling")||this.el.classList.add("scrolling"),null!=this.scrollingTimeout&&window.clearTimeout(this.scrollingTimeout),this.scrollingTimeout=window.setTimeout(function(){e.$el.removeClass("scrolling")},this.options.duration);var i,n,s,o,a=void 0,r=void 0,l=void 0,h=void 0,d=void 0,u=void 0,c=this.center,p=1/this.options.numVisible;if(this.offset="number"==typeof t?t:this.offset,this.center=Math.floor((this.offset+this.dim/2)/this.dim),o=-(s=(n=this.offset-this.center*this.dim)<0?1:-1)*n*2/this.dim,i=this.count>>1,this.options.fullWidth?(l="translateX(0)",u=1):(l="translateX("+(this.el.clientWidth-this.itemWidth)/2+"px) ",l+="translateY("+(this.el.clientHeight-this.itemHeight)/2+"px)",u=1-p*o),this.showIndicators){var v=this.center%this.count,f=this.$indicators.find(".indicator-item.active");f.index()!==v&&(f.removeClass("active"),this.$indicators.find(".indicator-item").eq(v)[0].classList.add("active"))}if(!this.noWrap||0<=this.center&&this.center<this.count){r=this.images[this._wrap(this.center)],b(r).hasClass("active")||(this.$el.find(".carousel-item").removeClass("active"),r.classList.add("active"));var m=l+" translateX("+-n/2+"px) translateX("+s*this.options.shift*o*a+"px) translateZ("+this.options.dist*o+"px)";this._updateItemStyle(r,u,0,m)}for(a=1;a<=i;++a){if(this.options.fullWidth?(h=this.options.dist,d=a===i&&n<0?1-o:1):(h=this.options.dist*(2*a+o*s),d=1-p*(2*a+o*s)),!this.noWrap||this.center+a<this.count){r=this.images[this._wrap(this.center+a)];var g=l+" translateX("+(this.options.shift+(this.dim*a-n)/2)+"px) translateZ("+h+"px)";this._updateItemStyle(r,d,-a,g)}if(this.options.fullWidth?(h=this.options.dist,d=a===i&&0<n?1-o:1):(h=this.options.dist*(2*a-o*s),d=1-p*(2*a-o*s)),!this.noWrap||0<=this.center-a){r=this.images[this._wrap(this.center-a)];var _=l+" translateX("+(-this.options.shift+(-this.dim*a-n)/2)+"px) translateZ("+h+"px)";this._updateItemStyle(r,d,-a,_)}}if(!this.noWrap||0<=this.center&&this.center<this.count){r=this.images[this._wrap(this.center)];var y=l+" translateX("+-n/2+"px) translateX("+s*this.options.shift*o+"px) translateZ("+this.options.dist*o+"px)";this._updateItemStyle(r,u,0,y)}var k=this.$el.find(".carousel-item").eq(this._wrap(this.center));c!==this.center&&"function"==typeof this.options.onCycleTo&&this.options.onCycleTo.call(this,k[0],this.dragged),"function"==typeof this.oneTimeCallback&&(this.oneTimeCallback.call(this,k[0],this.dragged),this.oneTimeCallback=null)}},{key:"_updateItemStyle",value:function(t,e,i,n){t.style[this.xform]=n,t.style.zIndex=i,t.style.opacity=e,t.style.visibility="visible"}},{key:"_cycleTo",value:function(t,e){var i=this.center%this.count-t;this.noWrap||(i<0?Math.abs(i+this.count)<Math.abs(i)&&(i+=this.count):0<i&&Math.abs(i-this.count)<i&&(i-=this.count)),this.target=this.dim*Math.round(this.offset/this.dim),i<0?this.target+=this.dim*Math.abs(i):0<i&&(this.target-=this.dim*i),"function"==typeof e&&(this.oneTimeCallback=e),this.offset!==this.target&&(this.amplitude=this.target-this.offset,this.timestamp=Date.now(),requestAnimationFrame(this._autoScrollBound))}},{key:"next",value:function(t){(void 0===t||isNaN(t))&&(t=1);var e=this.center+t;if(e>=this.count||e<0){if(this.noWrap)return;e=this._wrap(e)}this._cycleTo(e)}},{key:"prev",value:function(t){(void 0===t||isNaN(t))&&(t=1);var e=this.center-t;if(e>=this.count||e<0){if(this.noWrap)return;e=this._wrap(e)}this._cycleTo(e)}},{key:"set",value:function(t,e){if((void 0===t||isNaN(t))&&(t=0),t>this.count||t<0){if(this.noWrap)return;t=this._wrap(t)}this._cycleTo(t,e)}}],[{key:"init",value:function(t,e){return _get(i.__proto__||Object.getPrototypeOf(i),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Carousel}},{key:"defaults",get:function(){return e}}]),i}();M.Carousel=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"carousel","M_Carousel")}(cash),function(S){"use strict";var e={onOpen:void 0,onClose:void 0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_TapTarget=i).options=S.extend({},n.defaults,e),i.isOpen=!1,i.$origin=S("#"+i.$el.attr("data-target")),i._setup(),i._calculatePositioning(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.TapTarget=void 0}},{key:"_setupEventHandlers",value:function(){this._handleDocumentClickBound=this._handleDocumentClick.bind(this),this._handleTargetClickBound=this._handleTargetClick.bind(this),this._handleOriginClickBound=this._handleOriginClick.bind(this),this.el.addEventListener("click",this._handleTargetClickBound),this.originEl.addEventListener("click",this._handleOriginClickBound);var t=M.throttle(this._handleResize,200);this._handleThrottledResizeBound=t.bind(this),window.addEventListener("resize",this._handleThrottledResizeBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleTargetClickBound),this.originEl.removeEventListener("click",this._handleOriginClickBound),window.removeEventListener("resize",this._handleThrottledResizeBound)}},{key:"_handleTargetClick",value:function(t){this.open()}},{key:"_handleOriginClick",value:function(t){this.close()}},{key:"_handleResize",value:function(t){this._calculatePositioning()}},{key:"_handleDocumentClick",value:function(t){S(t.target).closest(".tap-target-wrapper").length||(this.close(),t.preventDefault(),t.stopPropagation())}},{key:"_setup",value:function(){this.wrapper=this.$el.parent()[0],this.waveEl=S(this.wrapper).find(".tap-target-wave")[0],this.originEl=S(this.wrapper).find(".tap-target-origin")[0],this.contentEl=this.$el.find(".tap-target-content")[0],S(this.wrapper).hasClass(".tap-target-wrapper")||(this.wrapper=document.createElement("div"),this.wrapper.classList.add("tap-target-wrapper"),this.$el.before(S(this.wrapper)),this.wrapper.append(this.el)),this.contentEl||(this.contentEl=document.createElement("div"),this.contentEl.classList.add("tap-target-content"),this.$el.append(this.contentEl)),this.waveEl||(this.waveEl=document.createElement("div"),this.waveEl.classList.add("tap-target-wave"),this.originEl||(this.originEl=this.$origin.clone(!0,!0),this.originEl.addClass("tap-target-origin"),this.originEl.removeAttr("id"),this.originEl.removeAttr("style"),this.originEl=this.originEl[0],this.waveEl.append(this.originEl)),this.wrapper.append(this.waveEl))}},{key:"_calculatePositioning",value:function(){var t="fixed"===this.$origin.css("position");if(!t)for(var e=this.$origin.parents(),i=0;i<e.length&&!(t="fixed"==S(e[i]).css("position"));i++);var n=this.$origin.outerWidth(),s=this.$origin.outerHeight(),o=t?this.$origin.offset().top-M.getDocumentScrollTop():this.$origin.offset().top,a=t?this.$origin.offset().left-M.getDocumentScrollLeft():this.$origin.offset().left,r=window.innerWidth,l=window.innerHeight,h=r/2,d=l/2,u=a<=h,c=h<a,p=o<=d,v=d<o,f=.25*r<=a&&a<=.75*r,m=this.$el.outerWidth(),g=this.$el.outerHeight(),_=o+s/2-g/2,y=a+n/2-m/2,k=t?"fixed":"absolute",b=f?m:m/2+n,w=g/2,C=p?g/2:0,E=u&&!f?m/2-n:0,O=n,x=v?"bottom":"top",L=2*n,T=L,$=g/2-T/2,B=m/2-L/2,D={};D.top=p?_+"px":"",D.right=c?r-y-m+"px":"",D.bottom=v?l-_-g+"px":"",D.left=u?y+"px":"",D.position=k,S(this.wrapper).css(D),S(this.contentEl).css({width:b+"px",height:w+"px",top:C+"px",right:"0px",bottom:"0px",left:E+"px",padding:O+"px",verticalAlign:x}),S(this.waveEl).css({top:$+"px",left:B+"px",width:L+"px",height:T+"px"})}},{key:"open",value:function(){this.isOpen||("function"==typeof this.options.onOpen&&this.options.onOpen.call(this,this.$origin[0]),this.isOpen=!0,this.wrapper.classList.add("open"),document.body.addEventListener("click",this._handleDocumentClickBound,!0),document.body.addEventListener("touchend",this._handleDocumentClickBound))}},{key:"close",value:function(){this.isOpen&&("function"==typeof this.options.onClose&&this.options.onClose.call(this,this.$origin[0]),this.isOpen=!1,this.wrapper.classList.remove("open"),document.body.removeEventListener("click",this._handleDocumentClickBound,!0),document.body.removeEventListener("touchend",this._handleDocumentClickBound))}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_TapTarget}},{key:"defaults",get:function(){return e}}]),n}();M.TapTarget=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tapTarget","M_TapTarget")}(cash),function(d){"use strict";var e={classes:"",dropdownOptions:{}},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return i.$el.hasClass("browser-default")?_possibleConstructorReturn(i):((i.el.M_FormSelect=i).options=d.extend({},n.defaults,e),i.isMultiple=i.$el.prop("multiple"),i.el.tabIndex=-1,i._keysSelected={},i._valueDict={},i._setupDropdown(),i._setupEventHandlers(),i)}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._removeDropdown(),this.el.M_FormSelect=void 0}},{key:"_setupEventHandlers",value:function(){var e=this;this._handleSelectChangeBound=this._handleSelectChange.bind(this),this._handleOptionClickBound=this._handleOptionClick.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),d(this.dropdownOptions).find("li:not(.optgroup)").each(function(t){t.addEventListener("click",e._handleOptionClickBound)}),this.el.addEventListener("change",this._handleSelectChangeBound),this.input.addEventListener("click",this._handleInputClickBound)}},{key:"_removeEventHandlers",value:function(){var e=this;d(this.dropdownOptions).find("li:not(.optgroup)").each(function(t){t.removeEventListener("click",e._handleOptionClickBound)}),this.el.removeEventListener("change",this._handleSelectChangeBound),this.input.removeEventListener("click",this._handleInputClickBound)}},{key:"_handleSelectChange",value:function(t){this._setValueToInput()}},{key:"_handleOptionClick",value:function(t){t.preventDefault();var e=d(t.target).closest("li")[0],i=e.id;if(!d(e).hasClass("disabled")&&!d(e).hasClass("optgroup")&&i.length){var n=!0;if(this.isMultiple){var s=d(this.dropdownOptions).find("li.disabled.selected");s.length&&(s.removeClass("selected"),s.find('input[type="checkbox"]').prop("checked",!1),this._toggleEntryFromArray(s[0].id)),n=this._toggleEntryFromArray(i)}else d(this.dropdownOptions).find("li").removeClass("selected"),d(e).toggleClass("selected",n);d(this._valueDict[i].el).prop("selected")!==n&&(d(this._valueDict[i].el).prop("selected",n),this.$el.trigger("change"))}t.stopPropagation()}},{key:"_handleInputClick",value:function(){this.dropdown&&this.dropdown.isOpen&&(this._setValueToInput(),this._setSelectedStates())}},{key:"_setupDropdown",value:function(){var n=this;this.wrapper=document.createElement("div"),d(this.wrapper).addClass("select-wrapper "+this.options.classes),this.$el.before(d(this.wrapper)),this.wrapper.appendChild(this.el),this.el.disabled&&this.wrapper.classList.add("disabled"),this.$selectOptions=this.$el.children("option, optgroup"),this.dropdownOptions=document.createElement("ul"),this.dropdownOptions.id="select-options-"+M.guid(),d(this.dropdownOptions).addClass("dropdown-content select-dropdown "+(this.isMultiple?"multiple-select-dropdown":"")),this.$selectOptions.length&&this.$selectOptions.each(function(t){if(d(t).is("option")){var e=void 0;e=n.isMultiple?n._appendOptionWithIcon(n.$el,t,"multiple"):n._appendOptionWithIcon(n.$el,t),n._addOptionToValueDict(t,e)}else if(d(t).is("optgroup")){var i=d(t).children("option");d(n.dropdownOptions).append(d('<li class="optgroup"><span>'+t.getAttribute("label")+"</span></li>")[0]),i.each(function(t){var e=n._appendOptionWithIcon(n.$el,t,"optgroup-option");n._addOptionToValueDict(t,e)})}}),this.$el.after(this.dropdownOptions),this.input=document.createElement("input"),d(this.input).addClass("select-dropdown dropdown-trigger"),this.input.setAttribute("type","text"),this.input.setAttribute("readonly","true"),this.input.setAttribute("data-target",this.dropdownOptions.id),this.el.disabled&&d(this.input).prop("disabled","true"),this.$el.before(this.input),this._setValueToInput();var t=d('<svg class="caret" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M7 10l5 5 5-5z"/><path d="M0 0h24v24H0z" fill="none"/></svg>');if(this.$el.before(t[0]),!this.el.disabled){var e=d.extend({},this.options.dropdownOptions);e.onOpenEnd=function(t){var e=d(n.dropdownOptions).find(".selected").first();if(e.length&&(M.keyDown=!0,n.dropdown.focusedIndex=e.index(),n.dropdown._focusFocusedItem(),M.keyDown=!1,n.dropdown.isScrollable)){var i=e[0].getBoundingClientRect().top-n.dropdownOptions.getBoundingClientRect().top;i-=n.dropdownOptions.clientHeight/2,n.dropdownOptions.scrollTop=i}},this.isMultiple&&(e.closeOnClick=!1),this.dropdown=M.Dropdown.init(this.input,e)}this._setSelectedStates()}},{key:"_addOptionToValueDict",value:function(t,e){var i=Object.keys(this._valueDict).length,n=this.dropdownOptions.id+i,s={};e.id=n,s.el=t,s.optionEl=e,this._valueDict[n]=s}},{key:"_removeDropdown",value:function(){d(this.wrapper).find(".caret").remove(),d(this.input).remove(),d(this.dropdownOptions).remove(),d(this.wrapper).before(this.$el),d(this.wrapper).remove()}},{key:"_appendOptionWithIcon",value:function(t,e,i){var n=e.disabled?"disabled ":"",s="optgroup-option"===i?"optgroup-option ":"",o=this.isMultiple?'<label><input type="checkbox"'+n+'"/><span>'+e.innerHTML+"</span></label>":e.innerHTML,a=d("<li></li>"),r=d("<span></span>");r.html(o),a.addClass(n+" "+s),a.append(r);var l=e.getAttribute("data-icon");if(l){var h=d('<img alt="" src="'+l+'">');a.prepend(h)}return d(this.dropdownOptions).append(a[0]),a[0]}},{key:"_toggleEntryFromArray",value:function(t){var e=!this._keysSelected.hasOwnProperty(t),i=d(this._valueDict[t].optionEl);return e?this._keysSelected[t]=!0:delete this._keysSelected[t],i.toggleClass("selected",e),i.find('input[type="checkbox"]').prop("checked",e),i.prop("selected",e),e}},{key:"_setValueToInput",value:function(){var i=[];if(this.$el.find("option").each(function(t){if(d(t).prop("selected")){var e=d(t).text();i.push(e)}}),!i.length){var t=this.$el.find("option:disabled").eq(0);t.length&&""===t[0].value&&i.push(t.text())}this.input.value=i.join(", ")}},{key:"_setSelectedStates",value:function(){for(var t in this._keysSelected={},this._valueDict){var e=this._valueDict[t],i=d(e.el).prop("selected");d(e.optionEl).find('input[type="checkbox"]').prop("checked",i),i?(this._activateOption(d(this.dropdownOptions),d(e.optionEl)),this._keysSelected[t]=!0):d(e.optionEl).removeClass("selected")}}},{key:"_activateOption",value:function(t,e){e&&(this.isMultiple||t.find("li.selected").removeClass("selected"),d(e).addClass("selected"))}},{key:"getSelectedValues",value:function(){var t=[];for(var e in this._keysSelected)t.push(this._valueDict[e].el.value);return t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_FormSelect}},{key:"defaults",get:function(){return e}}]),n}();M.FormSelect=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"formSelect","M_FormSelect")}(cash),function(s,e){"use strict";var i={},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Range=i).options=s.extend({},n.defaults,e),i._mousedown=!1,i._setupThumb(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._removeThumb(),this.el.M_Range=void 0}},{key:"_setupEventHandlers",value:function(){this._handleRangeChangeBound=this._handleRangeChange.bind(this),this._handleRangeMousedownTouchstartBound=this._handleRangeMousedownTouchstart.bind(this),this._handleRangeInputMousemoveTouchmoveBound=this._handleRangeInputMousemoveTouchmove.bind(this),this._handleRangeMouseupTouchendBound=this._handleRangeMouseupTouchend.bind(this),this._handleRangeBlurMouseoutTouchleaveBound=this._handleRangeBlurMouseoutTouchleave.bind(this),this.el.addEventListener("change",this._handleRangeChangeBound),this.el.addEventListener("mousedown",this._handleRangeMousedownTouchstartBound),this.el.addEventListener("touchstart",this._handleRangeMousedownTouchstartBound),this.el.addEventListener("input",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("mousemove",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("touchmove",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("mouseup",this._handleRangeMouseupTouchendBound),this.el.addEventListener("touchend",this._handleRangeMouseupTouchendBound),this.el.addEventListener("blur",this._handleRangeBlurMouseoutTouchleaveBound),this.el.addEventListener("mouseout",this._handleRangeBlurMouseoutTouchleaveBound),this.el.addEventListener("touchleave",this._handleRangeBlurMouseoutTouchleaveBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("change",this._handleRangeChangeBound),this.el.removeEventListener("mousedown",this._handleRangeMousedownTouchstartBound),this.el.removeEventListener("touchstart",this._handleRangeMousedownTouchstartBound),this.el.removeEventListener("input",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("mousemove",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("touchmove",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("mouseup",this._handleRangeMouseupTouchendBound),this.el.removeEventListener("touchend",this._handleRangeMouseupTouchendBound),this.el.removeEventListener("blur",this._handleRangeBlurMouseoutTouchleaveBound),this.el.removeEventListener("mouseout",this._handleRangeBlurMouseoutTouchleaveBound),this.el.removeEventListener("touchleave",this._handleRangeBlurMouseoutTouchleaveBound)}},{key:"_handleRangeChange",value:function(){s(this.value).html(this.$el.val()),s(this.thumb).hasClass("active")||this._showRangeBubble();var t=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",t+"px")}},{key:"_handleRangeMousedownTouchstart",value:function(t){if(s(this.value).html(this.$el.val()),this._mousedown=!0,this.$el.addClass("active"),s(this.thumb).hasClass("active")||this._showRangeBubble(),"input"!==t.type){var e=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",e+"px")}}},{key:"_handleRangeInputMousemoveTouchmove",value:function(){if(this._mousedown){s(this.thumb).hasClass("active")||this._showRangeBubble();var t=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",t+"px"),s(this.value).html(this.$el.val())}}},{key:"_handleRangeMouseupTouchend",value:function(){this._mousedown=!1,this.$el.removeClass("active")}},{key:"_handleRangeBlurMouseoutTouchleave",value:function(){if(!this._mousedown){var t=7+parseInt(this.$el.css("padding-left"))+"px";s(this.thumb).hasClass("active")&&(e.remove(this.thumb),e({targets:this.thumb,height:0,width:0,top:10,easing:"easeOutQuad",marginLeft:t,duration:100})),s(this.thumb).removeClass("active")}}},{key:"_setupThumb",value:function(){this.thumb=document.createElement("span"),this.value=document.createElement("span"),s(this.thumb).addClass("thumb"),s(this.value).addClass("value"),s(this.thumb).append(this.value),this.$el.after(this.thumb)}},{key:"_removeThumb",value:function(){s(this.thumb).remove()}},{key:"_showRangeBubble",value:function(){var t=-7+parseInt(s(this.thumb).parent().css("padding-left"))+"px";e.remove(this.thumb),e({targets:this.thumb,height:30,width:30,top:-30,marginLeft:t,duration:300,easing:"easeOutQuint"})}},{key:"_calcRangeOffset",value:function(){var t=this.$el.width()-15,e=parseFloat(this.$el.attr("max"))||100,i=parseFloat(this.$el.attr("min"))||0;return(parseFloat(this.$el.val())-i)/(e-i)*t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Range}},{key:"defaults",get:function(){return i}}]),n}();M.Range=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"range","M_Range"),t.init(s("input[type=range]"))}(cash,M.anime); \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/static/js/prism.min.js b/self_host/LibreTranslate/libretranslate/static/js/prism.min.js new file mode 100644 index 00000000..fb1fd7bd --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/static/js/prism.min.js @@ -0,0 +1 @@ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var g=/\blang(?:uage)?-([\w-]+)\b/i,t=0,z={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof T?new T(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function n(e,a){var r,t;switch(a=a||{},z.util.type(e)){case"Object":if(t=z.util.objId(e),a[t])return a[t];for(var s in r={},a[t]=r,e)e.hasOwnProperty(s)&&(r[s]=n(e[s],a));return r;case"Array":return(t=z.util.objId(e),a[t])?a[t]:(r=[],a[t]=r,e.forEach(function(e,t){r[t]=n(e,a)}),r);default:return e}},getLanguage:function(e){for(;e&&!g.test(e.className);)e=e.parentElement;return e?(e.className.match(g)||[,"none"])[1].toLowerCase():"none"},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var t=(/at [^(\r\n]*\((.*):.+:.+\)$/i.exec(e.stack)||[])[1];if(t){var n=document.getElementsByTagName("script");for(var a in n)if(n[a].src==t)return n[a]}return null}},isActive:function(e,t,n){for(var a="no-"+t;e;){var r=e.classList;if(r.contains(t))return!0;if(r.contains(a))return!1;e=e.parentElement}return!!n}},languages:{extend:function(e,t){var n=z.util.clone(z.languages[e]);for(var a in t)n[a]=t[a];return n},insertBefore:function(n,e,t,a){var r=(a=a||z.languages)[n],s={};for(var i in r)if(r.hasOwnProperty(i)){if(i==e)for(var l in t)t.hasOwnProperty(l)&&(s[l]=t[l]);t.hasOwnProperty(i)||(s[i]=r[i])}var o=a[n];return a[n]=s,z.languages.DFS(z.languages,function(e,t){t===o&&e!=n&&(this[e]=s)}),s},DFS:function e(t,n,a,r){r=r||{};var s,i,l=z.util.objId;for(var o in t){t.hasOwnProperty(o)&&(n.call(t,o,t[o],a||o),s=t[o],"Object"!==(i=z.util.type(s))||r[l(s)]?"Array"!==i||r[l(s)]||(r[l(s)]=!0,e(s,n,o,r)):(r[l(s)]=!0,e(s,n,null,r)))}}},plugins:{},highlightAll:function(e,t){z.highlightAllUnder(document,e,t)},highlightAllUnder:function(e,t,n){var a={callback:n,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};z.hooks.run("before-highlightall",a),a.elements=Array.prototype.slice.apply(a.container.querySelectorAll(a.selector)),z.hooks.run("before-all-elements-highlight",a);for(var r,s=0;r=a.elements[s++];)z.highlightElement(r,!0===t,a.callback)},highlightElement:function(e,t,n){var a=z.util.getLanguage(e),r=z.languages[a];e.className=e.className.replace(g,"").replace(/\s+/g," ")+" language-"+a;var s=e.parentElement;s&&"pre"===s.nodeName.toLowerCase()&&(s.className=s.className.replace(g,"").replace(/\s+/g," ")+" language-"+a);var i,l={element:e,language:a,grammar:r,code:e.textContent};function o(e){l.highlightedCode=e,z.hooks.run("before-insert",l),l.element.innerHTML=l.highlightedCode,z.hooks.run("after-highlight",l),z.hooks.run("complete",l),n&&n.call(l.element)}if(z.hooks.run("before-sanity-check",l),!l.code)return z.hooks.run("complete",l),void(n&&n.call(l.element));z.hooks.run("before-highlight",l),l.grammar?t&&u.Worker?((i=new Worker(z.filename)).onmessage=function(e){o(e.data)},i.postMessage(JSON.stringify({language:l.language,code:l.code,immediateClose:!0}))):o(z.highlight(l.code,l.grammar,l.language)):o(z.util.encode(l.code))},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};return z.hooks.run("before-tokenize",a),a.tokens=z.tokenize(a.code,a.grammar),z.hooks.run("after-tokenize",a),T.stringify(z.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var a in n)t[a]=n[a];delete t.rest}var r=new s;return N(r,r.head,e),function e(t,n,a,r,s,i){for(var l in a)if(a.hasOwnProperty(l)&&a[l]){var o=a[l];o=Array.isArray(o)?o:[o];for(var u=0;u<o.length;++u){if(i&&i.cause==l+","+u)return;var g,c=o[u],d=c.inside,p=!!c.lookbehind,m=!!c.greedy,h=0,f=c.alias;m&&!c.pattern.global&&(g=c.pattern.toString().match(/[imsuy]*$/)[0],c.pattern=RegExp(c.pattern.source,g+"g"));for(var v=c.pattern||c,y=r.next,b=s;y!==n.tail&&!(i&&b>=i.reach);b+=y.value.length,y=y.next){var F=y.value;if(n.length>t.length)return;if(!(F instanceof T)){var x,k,w,A,P,$,S=1;if(m&&y!=n.tail.prev){v.lastIndex=b;var _=v.exec(t);if(!_)break;var E=_.index+(p&&_[1]?_[1].length:0),j=_.index+_[0].length,C=b;for(C+=y.value.length;C<=E;)y=y.next,C+=y.value.length;if(C-=y.value.length,b=C,y.value instanceof T)continue;for(var O=y;O!==n.tail&&(C<j||"string"==typeof O.value);O=O.next)S++,C+=O.value.length;S--,F=t.slice(b,C),_.index-=b}else{v.lastIndex=0;var _=v.exec(F)}_&&(p&&(h=_[1]?_[1].length:0),E=_.index+h,x=_[0].slice(h),j=E+x.length,k=F.slice(0,E),w=F.slice(j),A=b+F.length,i&&A>i.reach&&(i.reach=A),P=y.prev,k&&(P=N(n,P,k),b+=k.length),L(n,P,S),$=new T(l,d?z.tokenize(x,d):x,f,x),y=N(n,P,$),w&&N(n,y,w),1<S&&e(t,n,a,y.prev,b,{cause:l+","+u,reach:A}))}}}}}(e,r,t,r.head,0),function(e){var t=[],n=e.head.next;for(;n!==e.tail;)t.push(n.value),n=n.next;return t}(r)},hooks:{all:{},add:function(e,t){var n=z.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=z.hooks.all[e];if(n&&n.length)for(var a,r=0;a=n[r++];)a(t)}},Token:T};function T(e,t,n,a){this.type=e,this.content=t,this.alias=n,this.length=0|(a||"").length}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function N(e,t,n){var a=t.next,r={value:n,prev:t,next:a};return t.next=r,a.prev=r,e.length++,r}function L(e,t,n){for(var a=t.next,r=0;r<n&&a!==e.tail;r++)a=a.next;(t.next=a).prev=t,e.length-=r}if(u.Prism=z,T.stringify=function t(e,n){if("string"==typeof e)return e;if(Array.isArray(e)){var a="";return e.forEach(function(e){a+=t(e,n)}),a}var r={type:e.type,content:t(e.content,n),tag:"span",classes:["token",e.type],attributes:{},language:n},s=e.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(r.classes,s):r.classes.push(s)),z.hooks.run("wrap",r);var i="";for(var l in r.attributes)i+=" "+l+'="'+(r.attributes[l]||"").replace(/"/g,""")+'"';return"<"+r.tag+' class="'+r.classes.join(" ")+'"'+i+">"+r.content+"</"+r.tag+">"},!u.document)return u.addEventListener&&(z.disableWorkerMessageHandler||u.addEventListener("message",function(e){var t=JSON.parse(e.data),n=t.language,a=t.code,r=t.immediateClose;u.postMessage(z.highlight(a,z.languages[n],n)),r&&u.close()},!1)),z;var e,n=z.util.currentScript();function a(){z.manual||z.highlightAll()}return n&&(z.filename=n.src,n.hasAttribute("data-manual")&&(z.manual=!0)),z.manual||("loading"===(e=document.readyState)||"interactive"===e&&n&&n.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)),z}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism),Prism.languages.markup={comment:/<!--[\s\S]*?-->/,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata:/<!\[CDATA\[[\s\S]*?]]>/i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i;var a={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}};a["language-"+t]={pattern:/[\s\S]+/,inside:Prism.languages[t]};var r={};r[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore("markup","cdata",r)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml,function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+t.source+")*?(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:n.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},n.tag))}(Prism),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-flags":/[a-z]+$/,"regex-delimiter":/^\/|\/$/}},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript,function(){var o,u,g,c,d,a,e;function p(e,t){var n=(n=e.className).replace(a," ")+" language-"+t;e.className=n.replace(/\s+/g," ").trim()}"undefined"!=typeof self&&self.Prism&&self.document&&(o=window.Prism,u={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},d="pre[data-src]:not(["+(g="data-src-status")+'="loaded"]):not(['+g+'="'+(c="loading")+'"])',a=/\blang(?:uage)?-([\w-]+)\b/i,o.hooks.add("before-highlightall",function(e){e.selector+=", "+d}),o.hooks.add("before-sanity-check",function(e){var t,n,a,r,s,i,l=e.element;l.matches(d)&&(e.code="",l.setAttribute(g,c),(t=l.appendChild(document.createElement("CODE"))).textContent="Loading…",n=l.getAttribute("data-src"),"none"===(r=e.language)&&(a=(/\.(\w+)$/.exec(n)||[,"none"])[1],r=u[a]||a),p(t,r),p(l,r),(s=o.plugins.autoloader)&&s.loadLanguages(r),(i=new XMLHttpRequest).open("GET",n,!0),i.onreadystatechange=function(){4==i.readyState&&(i.status<400&&i.responseText?(l.setAttribute(g,"loaded"),t.textContent=i.responseText,o.highlightElement(t)):(l.setAttribute(g,"failed"),400<=i.status?t.textContent="✖ Error "+i.status+" while fetching file: "+i.statusText:t.textContent="✖ Error: File does not exist or is empty"))},i.send(null))}),e=!(o.plugins.fileHighlight={highlight:function(e){for(var t,n=(e||document).querySelectorAll(d),a=0;t=n[a++];)o.highlightElement(t)}}),o.fileHighlight=function(){e||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),e=!0),o.plugins.fileHighlight.highlight.apply(this,arguments)})}(); \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/static/js/vue@2.js b/self_host/LibreTranslate/libretranslate/static/js/vue@2.js new file mode 100644 index 00000000..d998ff72 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/static/js/vue@2.js @@ -0,0 +1,6 @@ +/*! + * Vue.js v2.6.14 + * (c) 2014-2021 Evan You + * Released under the MIT License. + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vue=t()}(this,function(){"use strict";var e=Object.freeze({});function t(e){return null==e}function n(e){return null!=e}function r(e){return!0===e}function i(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function o(e){return null!==e&&"object"==typeof e}var a=Object.prototype.toString;function s(e){return"[object Object]"===a.call(e)}function c(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function u(e){return n(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function l(e){return null==e?"":Array.isArray(e)||s(e)&&e.toString===a?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i<r.length;i++)n[r[i]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}var d=p("slot,component",!0),v=p("key,ref,slot,slot-scope,is");function h(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}var m=Object.prototype.hasOwnProperty;function y(e,t){return m.call(e,t)}function g(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\w)/g,b=g(function(e){return e.replace(_,function(e,t){return t?t.toUpperCase():""})}),$=g(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),w=/\B([A-Z])/g,C=g(function(e){return e.replace(w,"-$1").toLowerCase()});var x=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function k(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function A(e,t){for(var n in t)e[n]=t[n];return e}function O(e){for(var t={},n=0;n<e.length;n++)e[n]&&A(t,e[n]);return t}function S(e,t,n){}var T=function(e,t,n){return!1},N=function(e){return e};function E(e,t){if(e===t)return!0;var n=o(e),r=o(t);if(!n||!r)return!n&&!r&&String(e)===String(t);try{var i=Array.isArray(e),a=Array.isArray(t);if(i&&a)return e.length===t.length&&e.every(function(e,n){return E(e,t[n])});if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(i||a)return!1;var s=Object.keys(e),c=Object.keys(t);return s.length===c.length&&s.every(function(n){return E(e[n],t[n])})}catch(e){return!1}}function j(e,t){for(var n=0;n<e.length;n++)if(E(e[n],t))return n;return-1}function D(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}var L="data-server-rendered",I=["component","directive","filter"],M=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured","serverPrefetch"],F={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:T,isReservedAttr:T,isUnknownElement:T,getTagNamespace:S,parsePlatformTagName:N,mustUseProp:T,async:!0,_lifecycleHooks:M},P=/a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;function R(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var H=new RegExp("[^"+P.source+".$_\\d]");var B,U="__proto__"in{},V="undefined"!=typeof window,z="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,K=z&&WXEnvironment.platform.toLowerCase(),J=V&&window.navigator.userAgent.toLowerCase(),q=J&&/msie|trident/.test(J),W=J&&J.indexOf("msie 9.0")>0,Z=J&&J.indexOf("edge/")>0,G=(J&&J.indexOf("android"),J&&/iphone|ipad|ipod|ios/.test(J)||"ios"===K),X=(J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J),J&&J.match(/firefox\/(\d+)/)),Y={}.watch,Q=!1;if(V)try{var ee={};Object.defineProperty(ee,"passive",{get:function(){Q=!0}}),window.addEventListener("test-passive",null,ee)}catch(e){}var te=function(){return void 0===B&&(B=!V&&!z&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),B},ne=V&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function re(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,oe="undefined"!=typeof Symbol&&re(Symbol)&&"undefined"!=typeof Reflect&&re(Reflect.ownKeys);ie="undefined"!=typeof Set&&re(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ae=S,se=0,ce=function(){this.id=se++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){h(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},ce.target=null;var ue=[];function le(e){ue.push(e),ce.target=e}function fe(){ue.pop(),ce.target=ue[ue.length-1]}var pe=function(e,t,n,r,i,o,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=i,this.ns=void 0,this.context=o,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},de={child:{configurable:!0}};de.child.get=function(){return this.componentInstance},Object.defineProperties(pe.prototype,de);var ve=function(e){void 0===e&&(e="");var t=new pe;return t.text=e,t.isComment=!0,t};function he(e){return new pe(void 0,void 0,void 0,String(e))}function me(e){var t=new pe(e.tag,e.data,e.children&&e.children.slice(),e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.asyncMeta=e.asyncMeta,t.isCloned=!0,t}var ye=Array.prototype,ge=Object.create(ye);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=ye[e];R(ge,e,function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var i,o=t.apply(this,n),a=this.__ob__;switch(e){case"push":case"unshift":i=n;break;case"splice":i=n.slice(2)}return i&&a.observeArray(i),a.dep.notify(),o})});var _e=Object.getOwnPropertyNames(ge),be=!0;function $e(e){be=e}var we=function(e){var t;this.value=e,this.dep=new ce,this.vmCount=0,R(e,"__ob__",this),Array.isArray(e)?(U?(t=ge,e.__proto__=t):function(e,t,n){for(var r=0,i=n.length;r<i;r++){var o=n[r];R(e,o,t[o])}}(e,ge,_e),this.observeArray(e)):this.walk(e)};function Ce(e,t){var n;if(o(e)&&!(e instanceof pe))return y(e,"__ob__")&&e.__ob__ instanceof we?n=e.__ob__:be&&!te()&&(Array.isArray(e)||s(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new we(e)),t&&n&&n.vmCount++,n}function xe(e,t,n,r,i){var o=new ce,a=Object.getOwnPropertyDescriptor(e,t);if(!a||!1!==a.configurable){var s=a&&a.get,c=a&&a.set;s&&!c||2!==arguments.length||(n=e[t]);var u=!i&&Ce(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=s?s.call(e):n;return ce.target&&(o.depend(),u&&(u.dep.depend(),Array.isArray(t)&&function e(t){for(var n=void 0,r=0,i=t.length;r<i;r++)(n=t[r])&&n.__ob__&&n.__ob__.dep.depend(),Array.isArray(n)&&e(n)}(t))),t},set:function(t){var r=s?s.call(e):n;t===r||t!=t&&r!=r||s&&!c||(c?c.call(e,t):n=t,u=!i&&Ce(t),o.notify())}})}}function ke(e,t,n){if(Array.isArray(e)&&c(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(t in e&&!(t in Object.prototype))return e[t]=n,n;var r=e.__ob__;return e._isVue||r&&r.vmCount?n:r?(xe(r.value,t,n),r.dep.notify(),n):(e[t]=n,n)}function Ae(e,t){if(Array.isArray(e)&&c(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount||y(e,t)&&(delete e[t],n&&n.dep.notify())}}we.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)xe(e,t[n])},we.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)Ce(e[t])};var Oe=F.optionMergeStrategies;function Se(e,t){if(!t)return e;for(var n,r,i,o=oe?Reflect.ownKeys(t):Object.keys(t),a=0;a<o.length;a++)"__ob__"!==(n=o[a])&&(r=e[n],i=t[n],y(e,n)?r!==i&&s(r)&&s(i)&&Se(r,i):ke(e,n,i));return e}function Te(e,t,n){return n?function(){var r="function"==typeof t?t.call(n,n):t,i="function"==typeof e?e.call(n,n):e;return r?Se(r,i):i}:t?e?function(){return Se("function"==typeof t?t.call(this,this):t,"function"==typeof e?e.call(this,this):e)}:t:e}function Ne(e,t){var n=t?e?e.concat(t):Array.isArray(t)?t:[t]:e;return n?function(e){for(var t=[],n=0;n<e.length;n++)-1===t.indexOf(e[n])&&t.push(e[n]);return t}(n):n}function Ee(e,t,n,r){var i=Object.create(e||null);return t?A(i,t):i}Oe.data=function(e,t,n){return n?Te(e,t,n):t&&"function"!=typeof t?e:Te(e,t)},M.forEach(function(e){Oe[e]=Ne}),I.forEach(function(e){Oe[e+"s"]=Ee}),Oe.watch=function(e,t,n,r){if(e===Y&&(e=void 0),t===Y&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var i={};for(var o in A(i,e),t){var a=i[o],s=t[o];a&&!Array.isArray(a)&&(a=[a]),i[o]=a?a.concat(s):Array.isArray(s)?s:[s]}return i},Oe.props=Oe.methods=Oe.inject=Oe.computed=function(e,t,n,r){if(!e)return t;var i=Object.create(null);return A(i,e),t&&A(i,t),i},Oe.provide=Te;var je=function(e,t){return void 0===t?e:t};function De(e,t,n){if("function"==typeof t&&(t=t.options),function(e,t){var n=e.props;if(n){var r,i,o={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(i=n[r])&&(o[b(i)]={type:null});else if(s(n))for(var a in n)i=n[a],o[b(a)]=s(i)?i:{type:i};e.props=o}}(t),function(e,t){var n=e.inject;if(n){var r=e.inject={};if(Array.isArray(n))for(var i=0;i<n.length;i++)r[n[i]]={from:n[i]};else if(s(n))for(var o in n){var a=n[o];r[o]=s(a)?A({from:o},a):{from:a}}}}(t),function(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}(t),!t._base&&(t.extends&&(e=De(e,t.extends,n)),t.mixins))for(var r=0,i=t.mixins.length;r<i;r++)e=De(e,t.mixins[r],n);var o,a={};for(o in e)c(o);for(o in t)y(e,o)||c(o);function c(r){var i=Oe[r]||je;a[r]=i(e[r],t[r],n,r)}return a}function Le(e,t,n,r){if("string"==typeof n){var i=e[t];if(y(i,n))return i[n];var o=b(n);if(y(i,o))return i[o];var a=$(o);return y(i,a)?i[a]:i[n]||i[o]||i[a]}}function Ie(e,t,n,r){var i=t[e],o=!y(n,e),a=n[e],s=Re(Boolean,i.type);if(s>-1)if(o&&!y(i,"default"))a=!1;else if(""===a||a===C(e)){var c=Re(String,i.type);(c<0||s<c)&&(a=!0)}if(void 0===a){a=function(e,t,n){if(!y(t,"default"))return;var r=t.default;if(e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n])return e._props[n];return"function"==typeof r&&"Function"!==Fe(t.type)?r.call(e):r}(r,i,e);var u=be;$e(!0),Ce(a),$e(u)}return a}var Me=/^\s*function (\w+)/;function Fe(e){var t=e&&e.toString().match(Me);return t?t[1]:""}function Pe(e,t){return Fe(e)===Fe(t)}function Re(e,t){if(!Array.isArray(t))return Pe(t,e)?0:-1;for(var n=0,r=t.length;n<r;n++)if(Pe(t[n],e))return n;return-1}function He(e,t,n){le();try{if(t)for(var r=t;r=r.$parent;){var i=r.$options.errorCaptured;if(i)for(var o=0;o<i.length;o++)try{if(!1===i[o].call(r,e,t,n))return}catch(e){Ue(e,r,"errorCaptured hook")}}Ue(e,t,n)}finally{fe()}}function Be(e,t,n,r,i){var o;try{(o=n?e.apply(t,n):e.call(t))&&!o._isVue&&u(o)&&!o._handled&&(o.catch(function(e){return He(e,r,i+" (Promise/async)")}),o._handled=!0)}catch(e){He(e,r,i)}return o}function Ue(e,t,n){if(F.errorHandler)try{return F.errorHandler.call(null,e,t,n)}catch(t){t!==e&&Ve(t,null,"config.errorHandler")}Ve(e,t,n)}function Ve(e,t,n){if(!V&&!z||"undefined"==typeof console)throw e;console.error(e)}var ze,Ke=!1,Je=[],qe=!1;function We(){qe=!1;var e=Je.slice(0);Je.length=0;for(var t=0;t<e.length;t++)e[t]()}if("undefined"!=typeof Promise&&re(Promise)){var Ze=Promise.resolve();ze=function(){Ze.then(We),G&&setTimeout(S)},Ke=!0}else if(q||"undefined"==typeof MutationObserver||!re(MutationObserver)&&"[object MutationObserverConstructor]"!==MutationObserver.toString())ze="undefined"!=typeof setImmediate&&re(setImmediate)?function(){setImmediate(We)}:function(){setTimeout(We,0)};else{var Ge=1,Xe=new MutationObserver(We),Ye=document.createTextNode(String(Ge));Xe.observe(Ye,{characterData:!0}),ze=function(){Ge=(Ge+1)%2,Ye.data=String(Ge)},Ke=!0}function Qe(e,t){var n;if(Je.push(function(){if(e)try{e.call(t)}catch(e){He(e,t,"nextTick")}else n&&n(t)}),qe||(qe=!0,ze()),!e&&"undefined"!=typeof Promise)return new Promise(function(e){n=e})}var et=new ie;function tt(e){!function e(t,n){var r,i;var a=Array.isArray(t);if(!a&&!o(t)||Object.isFrozen(t)||t instanceof pe)return;if(t.__ob__){var s=t.__ob__.dep.id;if(n.has(s))return;n.add(s)}if(a)for(r=t.length;r--;)e(t[r],n);else for(i=Object.keys(t),r=i.length;r--;)e(t[i[r]],n)}(e,et),et.clear()}var nt=g(function(e){var t="&"===e.charAt(0),n="~"===(e=t?e.slice(1):e).charAt(0),r="!"===(e=n?e.slice(1):e).charAt(0);return{name:e=r?e.slice(1):e,once:n,capture:r,passive:t}});function rt(e,t){function n(){var e=arguments,r=n.fns;if(!Array.isArray(r))return Be(r,null,arguments,t,"v-on handler");for(var i=r.slice(),o=0;o<i.length;o++)Be(i[o],null,e,t,"v-on handler")}return n.fns=e,n}function it(e,n,i,o,a,s){var c,u,l,f;for(c in e)u=e[c],l=n[c],f=nt(c),t(u)||(t(l)?(t(u.fns)&&(u=e[c]=rt(u,s)),r(f.once)&&(u=e[c]=a(f.name,u,f.capture)),i(f.name,u,f.capture,f.passive,f.params)):u!==l&&(l.fns=u,e[c]=l));for(c in n)t(e[c])&&o((f=nt(c)).name,n[c],f.capture)}function ot(e,i,o){var a;e instanceof pe&&(e=e.data.hook||(e.data.hook={}));var s=e[i];function c(){o.apply(this,arguments),h(a.fns,c)}t(s)?a=rt([c]):n(s.fns)&&r(s.merged)?(a=s).fns.push(c):a=rt([s,c]),a.merged=!0,e[i]=a}function at(e,t,r,i,o){if(n(t)){if(y(t,r))return e[r]=t[r],o||delete t[r],!0;if(y(t,i))return e[r]=t[i],o||delete t[i],!0}return!1}function st(e){return i(e)?[he(e)]:Array.isArray(e)?function e(o,a){var s=[];var c,u,l,f;for(c=0;c<o.length;c++)t(u=o[c])||"boolean"==typeof u||(l=s.length-1,f=s[l],Array.isArray(u)?u.length>0&&(ct((u=e(u,(a||"")+"_"+c))[0])&&ct(f)&&(s[l]=he(f.text+u[0].text),u.shift()),s.push.apply(s,u)):i(u)?ct(f)?s[l]=he(f.text+u):""!==u&&s.push(he(u)):ct(u)&&ct(f)?s[l]=he(f.text+u.text):(r(o._isVList)&&n(u.tag)&&t(u.key)&&n(a)&&(u.key="__vlist"+a+"_"+c+"__"),s.push(u)));return s}(e):void 0}function ct(e){return n(e)&&n(e.text)&&!1===e.isComment}function ut(e,t){if(e){for(var n=Object.create(null),r=oe?Reflect.ownKeys(e):Object.keys(e),i=0;i<r.length;i++){var o=r[i];if("__ob__"!==o){for(var a=e[o].from,s=t;s;){if(s._provided&&y(s._provided,a)){n[o]=s._provided[a];break}s=s.$parent}if(!s&&"default"in e[o]){var c=e[o].default;n[o]="function"==typeof c?c.call(t):c}}}return n}}function lt(e,t){if(!e||!e.length)return{};for(var n={},r=0,i=e.length;r<i;r++){var o=e[r],a=o.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,o.context!==t&&o.fnContext!==t||!a||null==a.slot)(n.default||(n.default=[])).push(o);else{var s=a.slot,c=n[s]||(n[s]=[]);"template"===o.tag?c.push.apply(c,o.children||[]):c.push(o)}}for(var u in n)n[u].every(ft)&&delete n[u];return n}function ft(e){return e.isComment&&!e.asyncFactory||" "===e.text}function pt(e){return e.isComment&&e.asyncFactory}function dt(t,n,r){var i,o=Object.keys(n).length>0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&"$"!==c[0]&&(i[c]=vt(n,c,t[c]))}else i={};for(var u in n)u in i||(i[u]=ht(n,u));return t&&Object.isExtensible(t)&&(t._normalized=i),R(i,"$stable",a),R(i,"$key",s),R(i,"$hasNormal",o),i}function vt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({}),t=(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:st(e))&&e[0];return e&&(!t||1===e.length&&t.isComment&&!pt(t))?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function ht(e,t){return function(){return e[t]}}function mt(e,t){var r,i,a,s,c;if(Array.isArray(e)||"string"==typeof e)for(r=new Array(e.length),i=0,a=e.length;i<a;i++)r[i]=t(e[i],i);else if("number"==typeof e)for(r=new Array(e),i=0;i<e;i++)r[i]=t(i+1,i);else if(o(e))if(oe&&e[Symbol.iterator]){r=[];for(var u=e[Symbol.iterator](),l=u.next();!l.done;)r.push(t(l.value,r.length)),l=u.next()}else for(s=Object.keys(e),r=new Array(s.length),i=0,a=s.length;i<a;i++)c=s[i],r[i]=t(e[c],c,i);return n(r)||(r=[]),r._isVList=!0,r}function yt(e,t,n,r){var i,o=this.$scopedSlots[e];o?(n=n||{},r&&(n=A(A({},r),n)),i=o(n)||("function"==typeof t?t():t)):i=this.$slots[e]||("function"==typeof t?t():t);var a=n&&n.slot;return a?this.$createElement("template",{slot:a},i):i}function gt(e){return Le(this.$options,"filters",e)||N}function _t(e,t){return Array.isArray(e)?-1===e.indexOf(t):e!==t}function bt(e,t,n,r,i){var o=F.keyCodes[t]||n;return i&&r&&!F.keyCodes[t]?_t(i,r):o?_t(o,e):r?C(r)!==t:void 0===e}function $t(e,t,n,r,i){if(n)if(o(n)){var a;Array.isArray(n)&&(n=O(n));var s=function(o){if("class"===o||"style"===o||v(o))a=e;else{var s=e.attrs&&e.attrs.type;a=r||F.mustUseProp(t,s,o)?e.domProps||(e.domProps={}):e.attrs||(e.attrs={})}var c=b(o),u=C(o);c in a||u in a||(a[o]=n[o],i&&((e.on||(e.on={}))["update:"+o]=function(e){n[o]=e}))};for(var c in n)s(c)}else;return e}function wt(e,t){var n=this._staticTrees||(this._staticTrees=[]),r=n[e];return r&&!t?r:(xt(r=n[e]=this.$options.staticRenderFns[e].call(this._renderProxy,null,this),"__static__"+e,!1),r)}function Ct(e,t,n){return xt(e,"__once__"+t+(n?"_"+n:""),!0),e}function xt(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&kt(e[r],t+"_"+r,n);else kt(e,t,n)}function kt(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function At(e,t){if(t)if(s(t)){var n=e.on=e.on?A({},e.on):{};for(var r in t){var i=n[r],o=t[r];n[r]=i?[].concat(i,o):o}}else;return e}function Ot(e,t,n,r){t=t||{$stable:!n};for(var i=0;i<e.length;i++){var o=e[i];Array.isArray(o)?Ot(o,t,n):o&&(o.proxy&&(o.fn.proxy=!0),t[o.key]=o.fn)}return r&&(t.$key=r),t}function St(e,t){for(var n=0;n<t.length;n+=2){var r=t[n];"string"==typeof r&&r&&(e[t[n]]=t[n+1])}return e}function Tt(e,t){return"string"==typeof e?t+e:e}function Nt(e){e._o=Ct,e._n=f,e._s=l,e._l=mt,e._t=yt,e._q=E,e._i=j,e._m=wt,e._f=gt,e._k=bt,e._b=$t,e._v=he,e._e=ve,e._u=Ot,e._g=At,e._d=St,e._p=Tt}function Et(t,n,i,o,a){var s,c=this,u=a.options;y(o,"_uid")?(s=Object.create(o))._original=o:(s=o,o=o._original);var l=r(u._compiled),f=!l;this.data=t,this.props=n,this.children=i,this.parent=o,this.listeners=t.on||e,this.injections=ut(u.inject,o),this.slots=function(){return c.$slots||dt(t.scopedSlots,c.$slots=lt(i,o)),c.$slots},Object.defineProperty(this,"scopedSlots",{enumerable:!0,get:function(){return dt(t.scopedSlots,this.slots())}}),l&&(this.$options=u,this.$slots=this.slots(),this.$scopedSlots=dt(t.scopedSlots,this.$slots)),u._scopeId?this._c=function(e,t,n,r){var i=Ht(s,e,t,n,r,f);return i&&!Array.isArray(i)&&(i.fnScopeId=u._scopeId,i.fnContext=o),i}:this._c=function(e,t,n,r){return Ht(s,e,t,n,r,f)}}function jt(e,t,n,r,i){var o=me(e);return o.fnContext=n,o.fnOptions=r,t.slot&&((o.data||(o.data={})).slot=t.slot),o}function Dt(e,t){for(var n in t)e[b(n)]=t[n]}Nt(Et.prototype);var Lt={init:function(e,t){if(e.componentInstance&&!e.componentInstance._isDestroyed&&e.data.keepAlive){var r=e;Lt.prepatch(r,r)}else{(e.componentInstance=function(e,t){var r={_isComponent:!0,_parentVnode:e,parent:t},i=e.data.inlineTemplate;n(i)&&(r.render=i.render,r.staticRenderFns=i.staticRenderFns);return new e.componentOptions.Ctor(r)}(e,Zt)).$mount(t?e.elm:void 0,t)}},prepatch:function(t,n){var r=n.componentOptions;!function(t,n,r,i,o){var a=i.data.scopedSlots,s=t.$scopedSlots,c=!!(a&&!a.$stable||s!==e&&!s.$stable||a&&t.$scopedSlots.$key!==a.$key||!a&&t.$scopedSlots.$key),u=!!(o||t.$options._renderChildren||c);t.$options._parentVnode=i,t.$vnode=i,t._vnode&&(t._vnode.parent=i);if(t.$options._renderChildren=o,t.$attrs=i.data.attrs||e,t.$listeners=r||e,n&&t.$options.props){$e(!1);for(var l=t._props,f=t.$options._propKeys||[],p=0;p<f.length;p++){var d=f[p],v=t.$options.props;l[d]=Ie(d,v,n,t)}$e(!0),t.$options.propsData=n}r=r||e;var h=t.$options._parentListeners;t.$options._parentListeners=r,Wt(t,r,h),u&&(t.$slots=lt(o,i.context),t.$forceUpdate())}(n.componentInstance=t.componentInstance,r.propsData,r.listeners,n,r.children)},insert:function(e){var t,n=e.context,r=e.componentInstance;r._isMounted||(r._isMounted=!0,Qt(r,"mounted")),e.data.keepAlive&&(n._isMounted?((t=r)._inactive=!1,tn.push(t)):Yt(r,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?function e(t,n){if(n&&(t._directInactive=!0,Xt(t)))return;if(!t._inactive){t._inactive=!0;for(var r=0;r<t.$children.length;r++)e(t.$children[r]);Qt(t,"deactivated")}}(t,!0):t.$destroy())}},It=Object.keys(Lt);function Mt(i,a,s,c,l){if(!t(i)){var f=s.$options._base;if(o(i)&&(i=f.extend(i)),"function"==typeof i){var p;if(t(i.cid)&&void 0===(i=function(e,i){if(r(e.error)&&n(e.errorComp))return e.errorComp;if(n(e.resolved))return e.resolved;var a=Ut;a&&n(e.owners)&&-1===e.owners.indexOf(a)&&e.owners.push(a);if(r(e.loading)&&n(e.loadingComp))return e.loadingComp;if(a&&!n(e.owners)){var s=e.owners=[a],c=!0,l=null,f=null;a.$on("hook:destroyed",function(){return h(s,a)});var p=function(e){for(var t=0,n=s.length;t<n;t++)s[t].$forceUpdate();e&&(s.length=0,null!==l&&(clearTimeout(l),l=null),null!==f&&(clearTimeout(f),f=null))},d=D(function(t){e.resolved=Vt(t,i),c?s.length=0:p(!0)}),v=D(function(t){n(e.errorComp)&&(e.error=!0,p(!0))}),m=e(d,v);return o(m)&&(u(m)?t(e.resolved)&&m.then(d,v):u(m.component)&&(m.component.then(d,v),n(m.error)&&(e.errorComp=Vt(m.error,i)),n(m.loading)&&(e.loadingComp=Vt(m.loading,i),0===m.delay?e.loading=!0:l=setTimeout(function(){l=null,t(e.resolved)&&t(e.error)&&(e.loading=!0,p(!1))},m.delay||200)),n(m.timeout)&&(f=setTimeout(function(){f=null,t(e.resolved)&&v(null)},m.timeout)))),c=!1,e.loading?e.loadingComp:e.resolved}}(p=i,f)))return function(e,t,n,r,i){var o=ve();return o.asyncFactory=e,o.asyncMeta={data:t,context:n,children:r,tag:i},o}(p,a,s,c,l);a=a||{},wn(i),n(a.model)&&function(e,t){var r=e.model&&e.model.prop||"value",i=e.model&&e.model.event||"input";(t.attrs||(t.attrs={}))[r]=t.model.value;var o=t.on||(t.on={}),a=o[i],s=t.model.callback;n(a)?(Array.isArray(a)?-1===a.indexOf(s):a!==s)&&(o[i]=[s].concat(a)):o[i]=s}(i.options,a);var d=function(e,r,i){var o=r.options.props;if(!t(o)){var a={},s=e.attrs,c=e.props;if(n(s)||n(c))for(var u in o){var l=C(u);at(a,c,u,l,!0)||at(a,s,u,l,!1)}return a}}(a,i);if(r(i.options.functional))return function(t,r,i,o,a){var s=t.options,c={},u=s.props;if(n(u))for(var l in u)c[l]=Ie(l,u,r||e);else n(i.attrs)&&Dt(c,i.attrs),n(i.props)&&Dt(c,i.props);var f=new Et(i,c,a,o,t),p=s.render.call(null,f._c,f);if(p instanceof pe)return jt(p,i,f.parent,s);if(Array.isArray(p)){for(var d=st(p)||[],v=new Array(d.length),h=0;h<d.length;h++)v[h]=jt(d[h],i,f.parent,s);return v}}(i,d,a,s,c);var v=a.on;if(a.on=a.nativeOn,r(i.options.abstract)){var m=a.slot;a={},m&&(a.slot=m)}!function(e){for(var t=e.hook||(e.hook={}),n=0;n<It.length;n++){var r=It[n],i=t[r],o=Lt[r];i===o||i&&i._merged||(t[r]=i?Ft(o,i):o)}}(a);var y=i.options.name||l;return new pe("vue-component-"+i.cid+(y?"-"+y:""),a,void 0,void 0,void 0,s,{Ctor:i,propsData:d,listeners:v,tag:l,children:c},p)}}}function Ft(e,t){var n=function(n,r){e(n,r),t(n,r)};return n._merged=!0,n}var Pt=1,Rt=2;function Ht(e,a,s,c,u,l){return(Array.isArray(s)||i(s))&&(u=c,c=s,s=void 0),r(l)&&(u=Rt),function(e,i,a,s,c){if(n(a)&&n(a.__ob__))return ve();n(a)&&n(a.is)&&(i=a.is);if(!i)return ve();Array.isArray(s)&&"function"==typeof s[0]&&((a=a||{}).scopedSlots={default:s[0]},s.length=0);c===Rt?s=st(s):c===Pt&&(s=function(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}(s));var u,l;if("string"==typeof i){var f;l=e.$vnode&&e.$vnode.ns||F.getTagNamespace(i),u=F.isReservedTag(i)?new pe(F.parsePlatformTagName(i),a,s,void 0,void 0,e):a&&a.pre||!n(f=Le(e.$options,"components",i))?new pe(i,a,s,void 0,void 0,e):Mt(f,a,e,s,i)}else u=Mt(i,a,e,s);return Array.isArray(u)?u:n(u)?(n(l)&&function e(i,o,a){i.ns=o;"foreignObject"===i.tag&&(o=void 0,a=!0);if(n(i.children))for(var s=0,c=i.children.length;s<c;s++){var u=i.children[s];n(u.tag)&&(t(u.ns)||r(a)&&"svg"!==u.tag)&&e(u,o,a)}}(u,l),n(a)&&function(e){o(e.style)&&tt(e.style);o(e.class)&&tt(e.class)}(a),u):ve()}(e,a,s,c,u)}var Bt,Ut=null;function Vt(e,t){return(e.__esModule||oe&&"Module"===e[Symbol.toStringTag])&&(e=e.default),o(e)?t.extend(e):e}function zt(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var r=e[t];if(n(r)&&(n(r.componentOptions)||pt(r)))return r}}function Kt(e,t){Bt.$on(e,t)}function Jt(e,t){Bt.$off(e,t)}function qt(e,t){var n=Bt;return function r(){null!==t.apply(null,arguments)&&n.$off(e,r)}}function Wt(e,t,n){Bt=e,it(t,n||{},Kt,Jt,qt,e),Bt=void 0}var Zt=null;function Gt(e){var t=Zt;return Zt=e,function(){Zt=t}}function Xt(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function Yt(e,t){if(t){if(e._directInactive=!1,Xt(e))return}else if(e._directInactive)return;if(e._inactive||null===e._inactive){e._inactive=!1;for(var n=0;n<e.$children.length;n++)Yt(e.$children[n]);Qt(e,"activated")}}function Qt(e,t){le();var n=e.$options[t],r=t+" hook";if(n)for(var i=0,o=n.length;i<o;i++)Be(n[i],e,null,e,r);e._hasHookEvent&&e.$emit("hook:"+t),fe()}var en=[],tn=[],nn={},rn=!1,on=!1,an=0;var sn=0,cn=Date.now;if(V&&!q){var un=window.performance;un&&"function"==typeof un.now&&cn()>document.createEvent("Event").timeStamp&&(cn=function(){return un.now()})}function ln(){var e,t;for(sn=cn(),on=!0,en.sort(function(e,t){return e.id-t.id}),an=0;an<en.length;an++)(e=en[an]).before&&e.before(),t=e.id,nn[t]=null,e.run();var n=tn.slice(),r=en.slice();an=en.length=tn.length=0,nn={},rn=on=!1,function(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,Yt(e[t],!0)}(n),function(e){var t=e.length;for(;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&!r._isDestroyed&&Qt(r,"updated")}}(r),ne&&F.devtools&&ne.emit("flush")}var fn=0,pn=function(e,t,n,r,i){this.vm=e,i&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++fn,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new ie,this.newDepIds=new ie,this.expression="","function"==typeof t?this.getter=t:(this.getter=function(e){if(!H.test(e)){var t=e.split(".");return function(e){for(var n=0;n<t.length;n++){if(!e)return;e=e[t[n]]}return e}}}(t),this.getter||(this.getter=S)),this.value=this.lazy?void 0:this.get()};pn.prototype.get=function(){var e;le(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(e){if(!this.user)throw e;He(e,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&tt(e),fe(),this.cleanupDeps()}return e},pn.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},pn.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},pn.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(e){var t=e.id;if(null==nn[t]){if(nn[t]=!0,on){for(var n=en.length-1;n>an&&en[n].id>e.id;)n--;en.splice(n+1,0,e)}else en.push(e);rn||(rn=!0,Qe(ln))}}(this)},pn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||o(e)||this.deep){var t=this.value;if(this.value=e,this.user){var n='callback for watcher "'+this.expression+'"';Be(this.cb,this.vm,[e,t],this.vm,n)}else this.cb.call(this.vm,e,t)}}},pn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},pn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},pn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var dn={enumerable:!0,configurable:!0,get:S,set:S};function vn(e,t,n){dn.get=function(){return this[t][n]},dn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,dn)}function hn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&$e(!1);var o=function(o){i.push(o);var a=Ie(o,t,n,e);xe(r,o,a),o in e||vn(e,"_props",o)};for(var a in t)o(a);$e(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?S:x(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;s(t=e._data="function"==typeof t?function(e,t){le();try{return e.call(t,t)}catch(e){return He(e,t,"data()"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];r&&y(r,o)||(a=void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&vn(e,"_data",o))}var a;Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=te();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;r||(n[i]=new pn(e,a||S,S,mn)),i in e||yn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==Y&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i<r.length;i++)bn(e,n,r[i]);else bn(e,n,r)}}(e,t.watch)}var mn={lazy:!0};function yn(e,t,n){var r=!te();"function"==typeof n?(dn.get=r?gn(t):_n(n),dn.set=S):(dn.get=n.get?r&&!1!==n.cache?gn(t):_n(n.get):S,dn.set=n.set||S),Object.defineProperty(e,t,dn)}function gn(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),ce.target&&t.depend(),t.value}}function _n(e){return function(){return e.call(this,this)}}function bn(e,t,n,r){return s(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}var $n=0;function wn(e){var t=e.options;if(e.super){var n=wn(e.super);if(n!==e.superOptions){e.superOptions=n;var r=function(e){var t,n=e.options,r=e.sealedOptions;for(var i in n)n[i]!==r[i]&&(t||(t={}),t[i]=n[i]);return t}(e);r&&A(e.extendOptions,r),(t=e.options=De(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function Cn(e){this._init(e)}function xn(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,i=e._Ctor||(e._Ctor={});if(i[r])return i[r];var o=e.name||n.options.name,a=function(e){this._init(e)};return(a.prototype=Object.create(n.prototype)).constructor=a,a.cid=t++,a.options=De(n.options,e),a.super=n,a.options.props&&function(e){var t=e.options.props;for(var n in t)vn(e.prototype,"_props",n)}(a),a.options.computed&&function(e){var t=e.options.computed;for(var n in t)yn(e.prototype,n,t[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,I.forEach(function(e){a[e]=n[e]}),o&&(a.options.components[o]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=A({},a.options),i[r]=a,a}}function kn(e){return e&&(e.Ctor.options.name||e.tag)}function An(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"==typeof e?e.split(",").indexOf(t)>-1:(n=e,"[object RegExp]"===a.call(n)&&e.test(t));var n}function On(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=a.name;s&&!t(s)&&Sn(n,o,r,i)}}}function Sn(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,h(n,t)}!function(t){t.prototype._init=function(t){var n=this;n._uid=$n++,n._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(n,t):n.$options=De(wn(n.constructor),t||{},n),n._renderProxy=n,n._self=n,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(n),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Wt(e,t)}(n),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,i=r&&r.context;t.$slots=lt(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,r,i){return Ht(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Ht(t,e,n,r,i,!0)};var o=r&&r.data;xe(t,"$attrs",o&&o.attrs||e,null,!0),xe(t,"$listeners",n._parentListeners||e,null,!0)}(n),Qt(n,"beforeCreate"),function(e){var t=ut(e.$options.inject,e);t&&($e(!1),Object.keys(t).forEach(function(n){xe(e,n,t[n])}),$e(!0))}(n),hn(n),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(n),Qt(n,"created"),n.$options.el&&n.$mount(n.$options.el)}}(Cn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=ke,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(s(t))return bn(this,e,t,n);(n=n||{}).user=!0;var r=new pn(this,e,t,n);if(n.immediate){var i='callback for immediate watcher "'+r.expression+'"';le(),Be(t,this,[r.value],this,i),fe()}return function(){r.teardown()}}}(Cn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i<o;i++)r.$on(e[i],n);else(r._events[e]||(r._events[e]=[])).push(n),t.test(e)&&(r._hasHookEvent=!0);return r},e.prototype.$once=function(e,t){var n=this;function r(){n.$off(e,r),t.apply(n,arguments)}return r.fn=t,n.$on(e,r),n},e.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(e)){for(var r=0,i=e.length;r<i;r++)n.$off(e[r],t);return n}var o,a=n._events[e];if(!a)return n;if(!t)return n._events[e]=null,n;for(var s=a.length;s--;)if((o=a[s])===t||o.fn===t){a.splice(s,1);break}return n},e.prototype.$emit=function(e){var t=this._events[e];if(t){t=t.length>1?k(t):t;for(var n=k(arguments,1),r='event handler for "'+e+'"',i=0,o=t.length;i<o;i++)Be(t[i],this,n,this,r)}return this}}(Cn),function(e){e.prototype._update=function(e,t){var n=this,r=n.$el,i=n._vnode,o=Gt(n);n._vnode=e,n.$el=i?n.__patch__(i,e):n.__patch__(n.$el,e,t,!1),o(),r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el)},e.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},e.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){Qt(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||h(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,e.__patch__(e._vnode,null),Qt(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.$vnode&&(e.$vnode.parent=null)}}}(Cn),function(e){Nt(e.prototype),e.prototype.$nextTick=function(e){return Qe(e,this)},e.prototype._render=function(){var e,t=this,n=t.$options,r=n.render,i=n._parentVnode;i&&(t.$scopedSlots=dt(i.data.scopedSlots,t.$slots,t.$scopedSlots)),t.$vnode=i;try{Ut=t,e=r.call(t._renderProxy,t.$createElement)}catch(n){He(n,t,"render"),e=t._vnode}finally{Ut=null}return Array.isArray(e)&&1===e.length&&(e=e[0]),e instanceof pe||(e=ve()),e.parent=i,e}}(Cn);var Tn=[String,RegExp,Array],Nn={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:Tn,exclude:Tn,max:[String,Number]},methods:{cacheVNode:function(){var e=this.cache,t=this.keys,n=this.vnodeToCache,r=this.keyToCache;if(n){var i=n.tag,o=n.componentInstance,a=n.componentOptions;e[r]={name:kn(a),tag:i,componentInstance:o},t.push(r),this.max&&t.length>parseInt(this.max)&&Sn(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Sn(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",function(t){On(e,function(e){return An(t,e)})}),this.$watch("exclude",function(t){On(e,function(e){return!An(t,e)})})},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=zt(e),n=t&&t.componentOptions;if(n){var r=kn(n),i=this.include,o=this.exclude;if(i&&(!r||!An(i,r))||o&&r&&An(o,r))return t;var a=this.cache,s=this.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[c]?(t.componentInstance=a[c].componentInstance,h(s,c),s.push(c)):(this.vnodeToCache=t,this.keyToCache=c),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return F}};Object.defineProperty(e,"config",t),e.util={warn:ae,extend:A,mergeOptions:De,defineReactive:xe},e.set=ke,e.delete=Ae,e.nextTick=Qe,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),I.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,A(e.options.components,Nn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=k(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),xn(e),function(e){I.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&s(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}(e)}(Cn),Object.defineProperty(Cn.prototype,"$isServer",{get:te}),Object.defineProperty(Cn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Cn,"FunctionalRenderContext",{value:Et}),Cn.version="2.6.14";var En=p("style,class"),jn=p("input,textarea,option,select,progress"),Dn=function(e,t,n){return"value"===n&&jn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Ln=p("contenteditable,draggable,spellcheck"),In=p("events,caret,typing,plaintext-only"),Mn=function(e,t){return Bn(t)||"false"===t?"false":"contenteditable"===e&&In(t)?t:"true"},Fn=p("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Pn="http://www.w3.org/1999/xlink",Rn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Hn=function(e){return Rn(e)?e.slice(6,e.length):""},Bn=function(e){return null==e||!1===e};function Un(e){for(var t=e.data,r=e,i=e;n(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=Vn(i.data,t));for(;n(r=r.parent);)r&&r.data&&(t=Vn(t,r.data));return function(e,t){if(n(e)||n(t))return zn(e,Kn(t));return""}(t.staticClass,t.class)}function Vn(e,t){return{staticClass:zn(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function zn(e,t){return e?t?e+" "+t:e:t||""}function Kn(e){return Array.isArray(e)?function(e){for(var t,r="",i=0,o=e.length;i<o;i++)n(t=Kn(e[i]))&&""!==t&&(r&&(r+=" "),r+=t);return r}(e):o(e)?function(e){var t="";for(var n in e)e[n]&&(t&&(t+=" "),t+=n);return t}(e):"string"==typeof e?e:""}var Jn={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},qn=p("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),Wn=p("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignobject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),Zn=function(e){return qn(e)||Wn(e)};function Gn(e){return Wn(e)?"svg":"math"===e?"math":void 0}var Xn=Object.create(null);var Yn=p("text,number,password,search,email,tel,url");function Qn(e){if("string"==typeof e){var t=document.querySelector(e);return t||document.createElement("div")}return e}var er=Object.freeze({createElement:function(e,t){var n=document.createElement(e);return"select"!==e?n:(t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)},createElementNS:function(e,t){return document.createElementNS(Jn[e],t)},createTextNode:function(e){return document.createTextNode(e)},createComment:function(e){return document.createComment(e)},insertBefore:function(e,t,n){e.insertBefore(t,n)},removeChild:function(e,t){e.removeChild(t)},appendChild:function(e,t){e.appendChild(t)},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.tagName},setTextContent:function(e,t){e.textContent=t},setStyleScope:function(e,t){e.setAttribute(t,"")}}),tr={create:function(e,t){nr(t)},update:function(e,t){e.data.ref!==t.data.ref&&(nr(e,!0),nr(t))},destroy:function(e){nr(e,!0)}};function nr(e,t){var r=e.data.ref;if(n(r)){var i=e.context,o=e.componentInstance||e.elm,a=i.$refs;t?Array.isArray(a[r])?h(a[r],o):a[r]===o&&(a[r]=void 0):e.data.refInFor?Array.isArray(a[r])?a[r].indexOf(o)<0&&a[r].push(o):a[r]=[o]:a[r]=o}}var rr=new pe("",{},[]),ir=["create","activate","update","remove","destroy"];function or(e,i){return e.key===i.key&&e.asyncFactory===i.asyncFactory&&(e.tag===i.tag&&e.isComment===i.isComment&&n(e.data)===n(i.data)&&function(e,t){if("input"!==e.tag)return!0;var r,i=n(r=e.data)&&n(r=r.attrs)&&r.type,o=n(r=t.data)&&n(r=r.attrs)&&r.type;return i===o||Yn(i)&&Yn(o)}(e,i)||r(e.isAsyncPlaceholder)&&t(i.asyncFactory.error))}function ar(e,t,r){var i,o,a={};for(i=t;i<=r;++i)n(o=e[i].key)&&(a[o]=i);return a}var sr={create:cr,update:cr,destroy:function(e){cr(e,rr)}};function cr(e,t){(e.data.directives||t.data.directives)&&function(e,t){var n,r,i,o=e===rr,a=t===rr,s=lr(e.data.directives,e.context),c=lr(t.data.directives,t.context),u=[],l=[];for(n in c)r=s[n],i=c[n],r?(i.oldValue=r.value,i.oldArg=r.arg,pr(i,"update",t,e),i.def&&i.def.componentUpdated&&l.push(i)):(pr(i,"bind",t,e),i.def&&i.def.inserted&&u.push(i));if(u.length){var f=function(){for(var n=0;n<u.length;n++)pr(u[n],"inserted",t,e)};o?ot(t,"insert",f):f()}l.length&&ot(t,"postpatch",function(){for(var n=0;n<l.length;n++)pr(l[n],"componentUpdated",t,e)});if(!o)for(n in s)c[n]||pr(s[n],"unbind",e,e,a)}(e,t)}var ur=Object.create(null);function lr(e,t){var n,r,i=Object.create(null);if(!e)return i;for(n=0;n<e.length;n++)(r=e[n]).modifiers||(r.modifiers=ur),i[fr(r)]=r,r.def=Le(t.$options,"directives",r.name);return i}function fr(e){return e.rawName||e.name+"."+Object.keys(e.modifiers||{}).join(".")}function pr(e,t,n,r,i){var o=e.def&&e.def[t];if(o)try{o(n.elm,e,n,r,i)}catch(r){He(r,n.context,"directive "+e.name+" "+t+" hook")}}var dr=[tr,sr];function vr(e,r){var i=r.componentOptions;if(!(n(i)&&!1===i.Ctor.options.inheritAttrs||t(e.data.attrs)&&t(r.data.attrs))){var o,a,s=r.elm,c=e.data.attrs||{},u=r.data.attrs||{};for(o in n(u.__ob__)&&(u=r.data.attrs=A({},u)),u)a=u[o],c[o]!==a&&hr(s,o,a,r.data.pre);for(o in(q||Z)&&u.value!==c.value&&hr(s,"value",u.value),c)t(u[o])&&(Rn(o)?s.removeAttributeNS(Pn,Hn(o)):Ln(o)||s.removeAttribute(o))}}function hr(e,t,n,r){r||e.tagName.indexOf("-")>-1?mr(e,t,n):Fn(t)?Bn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Ln(t)?e.setAttribute(t,Mn(t,n)):Rn(t)?Bn(n)?e.removeAttributeNS(Pn,Hn(t)):e.setAttributeNS(Pn,t,n):mr(e,t,n)}function mr(e,t,n){if(Bn(n))e.removeAttribute(t);else{if(q&&!W&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var yr={create:vr,update:vr};function gr(e,r){var i=r.elm,o=r.data,a=e.data;if(!(t(o.staticClass)&&t(o.class)&&(t(a)||t(a.staticClass)&&t(a.class)))){var s=Un(r),c=i._transitionClasses;n(c)&&(s=zn(s,Kn(c))),s!==i._prevClass&&(i.setAttribute("class",s),i._prevClass=s)}}var _r,br,$r,wr,Cr,xr,kr={create:gr,update:gr},Ar=/[\w).+\-_$\]]/;function Or(e){var t,n,r,i,o,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r<e.length;r++)if(n=t,t=e.charCodeAt(r),a)39===t&&92!==n&&(a=!1);else if(s)34===t&&92!==n&&(s=!1);else if(c)96===t&&92!==n&&(c=!1);else if(u)47===t&&92!==n&&(u=!1);else if(124!==t||124===e.charCodeAt(r+1)||124===e.charCodeAt(r-1)||l||f||p){switch(t){case 34:s=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:p++;break;case 41:p--;break;case 91:f++;break;case 93:f--;break;case 123:l++;break;case 125:l--}if(47===t){for(var v=r-1,h=void 0;v>=0&&" "===(h=e.charAt(v));v--);h&&Ar.test(h)||(u=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r<o.length;r++)i=Sr(i,o[r]);return i}function Sr(e,t){var n=t.indexOf("(");if(n<0)return'_f("'+t+'")('+e+")";var r=t.slice(0,n),i=t.slice(n+1);return'_f("'+r+'")('+e+(")"!==i?","+i:i)}function Tr(e,t){console.error("[Vue compiler]: "+e)}function Nr(e,t){return e?e.map(function(e){return e[t]}).filter(function(e){return e}):[]}function Er(e,t,n,r,i){(e.props||(e.props=[])).push(Hr({name:t,value:n,dynamic:i},r)),e.plain=!1}function jr(e,t,n,r,i){(i?e.dynamicAttrs||(e.dynamicAttrs=[]):e.attrs||(e.attrs=[])).push(Hr({name:t,value:n,dynamic:i},r)),e.plain=!1}function Dr(e,t,n,r){e.attrsMap[t]=n,e.attrsList.push(Hr({name:t,value:n},r))}function Lr(e,t,n,r,i,o,a,s){(e.directives||(e.directives=[])).push(Hr({name:t,rawName:n,value:r,arg:i,isDynamicArg:o,modifiers:a},s)),e.plain=!1}function Ir(e,t,n){return n?"_p("+t+',"'+e+'")':e+t}function Mr(t,n,r,i,o,a,s,c){var u;(i=i||e).right?c?n="("+n+")==='click'?'contextmenu':("+n+")":"click"===n&&(n="contextmenu",delete i.right):i.middle&&(c?n="("+n+")==='click'?'mouseup':("+n+")":"click"===n&&(n="mouseup")),i.capture&&(delete i.capture,n=Ir("!",n,c)),i.once&&(delete i.once,n=Ir("~",n,c)),i.passive&&(delete i.passive,n=Ir("&",n,c)),i.native?(delete i.native,u=t.nativeEvents||(t.nativeEvents={})):u=t.events||(t.events={});var l=Hr({value:r.trim(),dynamic:c},s);i!==e&&(l.modifiers=i);var f=u[n];Array.isArray(f)?o?f.unshift(l):f.push(l):u[n]=f?o?[l,f]:[f,l]:l,t.plain=!1}function Fr(e,t,n){var r=Pr(e,":"+t)||Pr(e,"v-bind:"+t);if(null!=r)return Or(r);if(!1!==n){var i=Pr(e,t);if(null!=i)return JSON.stringify(i)}}function Pr(e,t,n){var r;if(null!=(r=e.attrsMap[t]))for(var i=e.attrsList,o=0,a=i.length;o<a;o++)if(i[o].name===t){i.splice(o,1);break}return n&&delete e.attrsMap[t],r}function Rr(e,t){for(var n=e.attrsList,r=0,i=n.length;r<i;r++){var o=n[r];if(t.test(o.name))return n.splice(r,1),o}}function Hr(e,t){return t&&(null!=t.start&&(e.start=t.start),null!=t.end&&(e.end=t.end)),e}function Br(e,t,n){var r=n||{},i=r.number,o="$$v";r.trim&&(o="(typeof $$v === 'string'? $$v.trim(): $$v)"),i&&(o="_n("+o+")");var a=Ur(t,o);e.model={value:"("+t+")",expression:JSON.stringify(t),callback:"function ($$v) {"+a+"}"}}function Ur(e,t){var n=function(e){if(e=e.trim(),_r=e.length,e.indexOf("[")<0||e.lastIndexOf("]")<_r-1)return(wr=e.lastIndexOf("."))>-1?{exp:e.slice(0,wr),key:'"'+e.slice(wr+1)+'"'}:{exp:e,key:null};br=e,wr=Cr=xr=0;for(;!zr();)Kr($r=Vr())?qr($r):91===$r&&Jr($r);return{exp:e.slice(0,Cr),key:e.slice(Cr+1,xr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Vr(){return br.charCodeAt(++wr)}function zr(){return wr>=_r}function Kr(e){return 34===e||39===e}function Jr(e){var t=1;for(Cr=wr;!zr();)if(Kr(e=Vr()))qr(e);else if(91===e&&t++,93===e&&t--,0===t){xr=wr;break}}function qr(e){for(var t=e;!zr()&&(e=Vr())!==t;);}var Wr,Zr="__r",Gr="__c";function Xr(e,t,n){var r=Wr;return function i(){null!==t.apply(null,arguments)&&ei(e,i,n,r)}}var Yr=Ke&&!(X&&Number(X[1])<=53);function Qr(e,t,n,r){if(Yr){var i=sn,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}Wr.addEventListener(e,t,Q?{capture:n,passive:r}:n)}function ei(e,t,n,r){(r||Wr).removeEventListener(e,t._wrapper||t,n)}function ti(e,r){if(!t(e.data.on)||!t(r.data.on)){var i=r.data.on||{},o=e.data.on||{};Wr=r.elm,function(e){if(n(e[Zr])){var t=q?"change":"input";e[t]=[].concat(e[Zr],e[t]||[]),delete e[Zr]}n(e[Gr])&&(e.change=[].concat(e[Gr],e.change||[]),delete e[Gr])}(i),it(i,o,Qr,ei,Xr,r.context),Wr=void 0}}var ni,ri={create:ti,update:ti};function ii(e,r){if(!t(e.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=e.data.domProps||{},c=r.data.domProps||{};for(i in n(c.__ob__)&&(c=r.data.domProps=A({},c)),s)i in c||(a[i]="");for(i in c){if(o=c[i],"textContent"===i||"innerHTML"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===i&&"PROGRESS"!==a.tagName){a._value=o;var u=t(o)?"":String(o);oi(a,u)&&(a.value=u)}else if("innerHTML"===i&&Wn(a.tagName)&&t(a.innerHTML)){(ni=ni||document.createElement("div")).innerHTML="<svg>"+o+"</svg>";for(var l=ni.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(o!==s[i])try{a[i]=o}catch(e){}}}}function oi(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var r=e.value,i=e._vModifiers;if(n(i)){if(i.number)return f(r)!==f(t);if(i.trim)return r.trim()!==t.trim()}return r!==t}(e,t))}var ai={create:ii,update:ii},si=g(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function ci(e){var t=ui(e.style);return e.staticStyle?A(e.staticStyle,t):t}function ui(e){return Array.isArray(e)?O(e):"string"==typeof e?si(e):e}var li,fi=/^--/,pi=/\s*!important$/,di=function(e,t,n){if(fi.test(t))e.style.setProperty(t,n);else if(pi.test(n))e.style.setProperty(C(t),n.replace(pi,""),"important");else{var r=hi(t);if(Array.isArray(n))for(var i=0,o=n.length;i<o;i++)e.style[r]=n[i];else e.style[r]=n}},vi=["Webkit","Moz","ms"],hi=g(function(e){if(li=li||document.createElement("div").style,"filter"!==(e=b(e))&&e in li)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<vi.length;n++){var r=vi[n]+t;if(r in li)return r}});function mi(e,r){var i=r.data,o=e.data;if(!(t(i.staticStyle)&&t(i.style)&&t(o.staticStyle)&&t(o.style))){var a,s,c=r.elm,u=o.staticStyle,l=o.normalizedStyle||o.style||{},f=u||l,p=ui(r.data.style)||{};r.data.normalizedStyle=n(p.__ob__)?A({},p):p;var d=function(e,t){var n,r={};if(t)for(var i=e;i.componentInstance;)(i=i.componentInstance._vnode)&&i.data&&(n=ci(i.data))&&A(r,n);(n=ci(e.data))&&A(r,n);for(var o=e;o=o.parent;)o.data&&(n=ci(o.data))&&A(r,n);return r}(r,!0);for(s in f)t(d[s])&&di(c,s,"");for(s in d)(a=d[s])!==f[s]&&di(c,s,null==a?"":a)}}var yi={create:mi,update:mi},gi=/\s+/;function _i(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(gi).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function bi(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(gi).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function $i(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&A(t,wi(e.name||"v")),A(t,e),t}return"string"==typeof e?wi(e):void 0}}var wi=g(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}}),Ci=V&&!W,xi="transition",ki="animation",Ai="transition",Oi="transitionend",Si="animation",Ti="animationend";Ci&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ai="WebkitTransition",Oi="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Si="WebkitAnimation",Ti="webkitAnimationEnd"));var Ni=V?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ei(e){Ni(function(){Ni(e)})}function ji(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),_i(e,t))}function Di(e,t){e._transitionClasses&&h(e._transitionClasses,t),bi(e,t)}function Li(e,t,n){var r=Mi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===xi?Oi:Ti,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c<a&&u()},o+1),e.addEventListener(s,l)}var Ii=/\b(transform|all)(,|$)/;function Mi(e,t){var n,r=window.getComputedStyle(e),i=(r[Ai+"Delay"]||"").split(", "),o=(r[Ai+"Duration"]||"").split(", "),a=Fi(i,o),s=(r[Si+"Delay"]||"").split(", "),c=(r[Si+"Duration"]||"").split(", "),u=Fi(s,c),l=0,f=0;return t===xi?a>0&&(n=xi,l=a,f=o.length):t===ki?u>0&&(n=ki,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?xi:ki:null)?n===xi?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===xi&&Ii.test(r[Ai+"Property"])}}function Fi(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max.apply(null,t.map(function(t,n){return Pi(t)+Pi(e[n])}))}function Pi(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function Ri(e,r){var i=e.elm;n(i._leaveCb)&&(i._leaveCb.cancelled=!0,i._leaveCb());var a=$i(e.data.transition);if(!t(a)&&!n(i._enterCb)&&1===i.nodeType){for(var s=a.css,c=a.type,u=a.enterClass,l=a.enterToClass,p=a.enterActiveClass,d=a.appearClass,v=a.appearToClass,h=a.appearActiveClass,m=a.beforeEnter,y=a.enter,g=a.afterEnter,_=a.enterCancelled,b=a.beforeAppear,$=a.appear,w=a.afterAppear,C=a.appearCancelled,x=a.duration,k=Zt,A=Zt.$vnode;A&&A.parent;)k=A.context,A=A.parent;var O=!k._isMounted||!e.isRootInsert;if(!O||$||""===$){var S=O&&d?d:u,T=O&&h?h:p,N=O&&v?v:l,E=O&&b||m,j=O&&"function"==typeof $?$:y,L=O&&w||g,I=O&&C||_,M=f(o(x)?x.enter:x),F=!1!==s&&!W,P=Ui(j),R=i._enterCb=D(function(){F&&(Di(i,N),Di(i,T)),R.cancelled?(F&&Di(i,S),I&&I(i)):L&&L(i),i._enterCb=null});e.data.show||ot(e,"insert",function(){var t=i.parentNode,n=t&&t._pending&&t._pending[e.key];n&&n.tag===e.tag&&n.elm._leaveCb&&n.elm._leaveCb(),j&&j(i,R)}),E&&E(i),F&&(ji(i,S),ji(i,T),Ei(function(){Di(i,S),R.cancelled||(ji(i,N),P||(Bi(M)?setTimeout(R,M):Li(i,c,R)))})),e.data.show&&(r&&r(),j&&j(i,R)),F||P||R()}}}function Hi(e,r){var i=e.elm;n(i._enterCb)&&(i._enterCb.cancelled=!0,i._enterCb());var a=$i(e.data.transition);if(t(a)||1!==i.nodeType)return r();if(!n(i._leaveCb)){var s=a.css,c=a.type,u=a.leaveClass,l=a.leaveToClass,p=a.leaveActiveClass,d=a.beforeLeave,v=a.leave,h=a.afterLeave,m=a.leaveCancelled,y=a.delayLeave,g=a.duration,_=!1!==s&&!W,b=Ui(v),$=f(o(g)?g.leave:g),w=i._leaveCb=D(function(){i.parentNode&&i.parentNode._pending&&(i.parentNode._pending[e.key]=null),_&&(Di(i,l),Di(i,p)),w.cancelled?(_&&Di(i,u),m&&m(i)):(r(),h&&h(i)),i._leaveCb=null});y?y(C):C()}function C(){w.cancelled||(!e.data.show&&i.parentNode&&((i.parentNode._pending||(i.parentNode._pending={}))[e.key]=e),d&&d(i),_&&(ji(i,u),ji(i,p),Ei(function(){Di(i,u),w.cancelled||(ji(i,l),b||(Bi($)?setTimeout(w,$):Li(i,c,w)))})),v&&v(i,w),_||b||w())}}function Bi(e){return"number"==typeof e&&!isNaN(e)}function Ui(e){if(t(e))return!1;var r=e.fns;return n(r)?Ui(Array.isArray(r)?r[0]:r):(e._length||e.length)>1}function Vi(e,t){!0!==t.data.show&&Ri(t)}var zi=function(e){var o,a,s={},c=e.modules,u=e.nodeOps;for(o=0;o<ir.length;++o)for(s[ir[o]]=[],a=0;a<c.length;++a)n(c[a][ir[o]])&&s[ir[o]].push(c[a][ir[o]]);function l(e){var t=u.parentNode(e);n(t)&&u.removeChild(t,e)}function f(e,t,i,o,a,c,l){if(n(e.elm)&&n(c)&&(e=c[l]=me(e)),e.isRootInsert=!a,!function(e,t,i,o){var a=e.data;if(n(a)){var c=n(e.componentInstance)&&a.keepAlive;if(n(a=a.hook)&&n(a=a.init)&&a(e,!1),n(e.componentInstance))return d(e,t),v(i,e.elm,o),r(c)&&function(e,t,r,i){for(var o,a=e;a.componentInstance;)if(a=a.componentInstance._vnode,n(o=a.data)&&n(o=o.transition)){for(o=0;o<s.activate.length;++o)s.activate[o](rr,a);t.push(a);break}v(r,e.elm,i)}(e,t,i,o),!0}}(e,t,i,o)){var f=e.data,p=e.children,m=e.tag;n(m)?(e.elm=e.ns?u.createElementNS(e.ns,m):u.createElement(m,e),g(e),h(e,p,t),n(f)&&y(e,t),v(i,e.elm,o)):r(e.isComment)?(e.elm=u.createComment(e.text),v(i,e.elm,o)):(e.elm=u.createTextNode(e.text),v(i,e.elm,o))}}function d(e,t){n(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,m(e)?(y(e,t),g(e)):(nr(e),t.push(e))}function v(e,t,r){n(e)&&(n(r)?u.parentNode(r)===e&&u.insertBefore(e,t,r):u.appendChild(e,t))}function h(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)f(t[r],n,e.elm,null,!0,t,r);else i(e.text)&&u.appendChild(e.elm,u.createTextNode(String(e.text)))}function m(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return n(e.tag)}function y(e,t){for(var r=0;r<s.create.length;++r)s.create[r](rr,e);n(o=e.data.hook)&&(n(o.create)&&o.create(rr,e),n(o.insert)&&t.push(e))}function g(e){var t;if(n(t=e.fnScopeId))u.setStyleScope(e.elm,t);else for(var r=e;r;)n(t=r.context)&&n(t=t.$options._scopeId)&&u.setStyleScope(e.elm,t),r=r.parent;n(t=Zt)&&t!==e.context&&t!==e.fnContext&&n(t=t.$options._scopeId)&&u.setStyleScope(e.elm,t)}function _(e,t,n,r,i,o){for(;r<=i;++r)f(n[r],o,e,t,!1,n,r)}function b(e){var t,r,i=e.data;if(n(i))for(n(t=i.hook)&&n(t=t.destroy)&&t(e),t=0;t<s.destroy.length;++t)s.destroy[t](e);if(n(t=e.children))for(r=0;r<e.children.length;++r)b(e.children[r])}function $(e,t,r){for(;t<=r;++t){var i=e[t];n(i)&&(n(i.tag)?(w(i),b(i)):l(i.elm))}}function w(e,t){if(n(t)||n(e.data)){var r,i=s.remove.length+1;for(n(t)?t.listeners+=i:t=function(e,t){function n(){0==--n.listeners&&l(e)}return n.listeners=t,n}(e.elm,i),n(r=e.componentInstance)&&n(r=r._vnode)&&n(r.data)&&w(r,t),r=0;r<s.remove.length;++r)s.remove[r](e,t);n(r=e.data.hook)&&n(r=r.remove)?r(e,t):t()}else l(e.elm)}function C(e,t,r,i){for(var o=r;o<i;o++){var a=t[o];if(n(a)&&or(e,a))return o}}function x(e,i,o,a,c,l){if(e!==i){n(i.elm)&&n(a)&&(i=a[c]=me(i));var p=i.elm=e.elm;if(r(e.isAsyncPlaceholder))n(i.asyncFactory.resolved)?O(e.elm,i,o):i.isAsyncPlaceholder=!0;else if(r(i.isStatic)&&r(e.isStatic)&&i.key===e.key&&(r(i.isCloned)||r(i.isOnce)))i.componentInstance=e.componentInstance;else{var d,v=i.data;n(v)&&n(d=v.hook)&&n(d=d.prepatch)&&d(e,i);var h=e.children,y=i.children;if(n(v)&&m(i)){for(d=0;d<s.update.length;++d)s.update[d](e,i);n(d=v.hook)&&n(d=d.update)&&d(e,i)}t(i.text)?n(h)&&n(y)?h!==y&&function(e,r,i,o,a){for(var s,c,l,p=0,d=0,v=r.length-1,h=r[0],m=r[v],y=i.length-1,g=i[0],b=i[y],w=!a;p<=v&&d<=y;)t(h)?h=r[++p]:t(m)?m=r[--v]:or(h,g)?(x(h,g,o,i,d),h=r[++p],g=i[++d]):or(m,b)?(x(m,b,o,i,y),m=r[--v],b=i[--y]):or(h,b)?(x(h,b,o,i,y),w&&u.insertBefore(e,h.elm,u.nextSibling(m.elm)),h=r[++p],b=i[--y]):or(m,g)?(x(m,g,o,i,d),w&&u.insertBefore(e,m.elm,h.elm),m=r[--v],g=i[++d]):(t(s)&&(s=ar(r,p,v)),t(c=n(g.key)?s[g.key]:C(g,r,p,v))?f(g,o,e,h.elm,!1,i,d):or(l=r[c],g)?(x(l,g,o,i,d),r[c]=void 0,w&&u.insertBefore(e,l.elm,h.elm)):f(g,o,e,h.elm,!1,i,d),g=i[++d]);p>v?_(e,t(i[y+1])?null:i[y+1].elm,i,d,y,o):d>y&&$(r,p,v)}(p,h,y,o,l):n(y)?(n(e.text)&&u.setTextContent(p,""),_(p,null,y,0,y.length-1,o)):n(h)?$(h,0,h.length-1):n(e.text)&&u.setTextContent(p,""):e.text!==i.text&&u.setTextContent(p,i.text),n(v)&&n(d=v.hook)&&n(d=d.postpatch)&&d(e,i)}}}function k(e,t,i){if(r(i)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var o=0;o<t.length;++o)t[o].data.hook.insert(t[o])}var A=p("attrs,class,staticClass,staticStyle,key");function O(e,t,i,o){var a,s=t.tag,c=t.data,u=t.children;if(o=o||c&&c.pre,t.elm=e,r(t.isComment)&&n(t.asyncFactory))return t.isAsyncPlaceholder=!0,!0;if(n(c)&&(n(a=c.hook)&&n(a=a.init)&&a(t,!0),n(a=t.componentInstance)))return d(t,i),!0;if(n(s)){if(n(u))if(e.hasChildNodes())if(n(a=c)&&n(a=a.domProps)&&n(a=a.innerHTML)){if(a!==e.innerHTML)return!1}else{for(var l=!0,f=e.firstChild,p=0;p<u.length;p++){if(!f||!O(f,u[p],i,o)){l=!1;break}f=f.nextSibling}if(!l||f)return!1}else h(t,u,i);if(n(c)){var v=!1;for(var m in c)if(!A(m)){v=!0,y(t,i);break}!v&&c.class&&tt(c.class)}}else e.data!==t.text&&(e.data=t.text);return!0}return function(e,i,o,a){if(!t(i)){var c,l=!1,p=[];if(t(e))l=!0,f(i,p);else{var d=n(e.nodeType);if(!d&&or(e,i))x(e,i,p,null,null,a);else{if(d){if(1===e.nodeType&&e.hasAttribute(L)&&(e.removeAttribute(L),o=!0),r(o)&&O(e,i,p))return k(i,p,!0),e;c=e,e=new pe(u.tagName(c).toLowerCase(),{},[],void 0,c)}var v=e.elm,h=u.parentNode(v);if(f(i,p,v._leaveCb?null:h,u.nextSibling(v)),n(i.parent))for(var y=i.parent,g=m(i);y;){for(var _=0;_<s.destroy.length;++_)s.destroy[_](y);if(y.elm=i.elm,g){for(var w=0;w<s.create.length;++w)s.create[w](rr,y);var C=y.data.hook.insert;if(C.merged)for(var A=1;A<C.fns.length;A++)C.fns[A]()}else nr(y);y=y.parent}n(h)?$([e],0,0):n(e.tag)&&b(e)}}return k(i,p,l),i.elm}n(e)&&b(e)}}({nodeOps:er,modules:[yr,kr,ri,ai,yi,V?{create:Vi,activate:Vi,remove:function(e,t){!0!==e.data.show?Hi(e,t):t()}}:{}].concat(dr)});W&&document.addEventListener("selectionchange",function(){var e=document.activeElement;e&&e.vmodel&&Yi(e,"input")});var Ki={inserted:function(e,t,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?ot(n,"postpatch",function(){Ki.componentUpdated(e,t,n)}):Ji(e,t,n.context),e._vOptions=[].map.call(e.options,Zi)):("textarea"===n.tag||Yn(e.type))&&(e._vModifiers=t.modifiers,t.modifiers.lazy||(e.addEventListener("compositionstart",Gi),e.addEventListener("compositionend",Xi),e.addEventListener("change",Xi),W&&(e.vmodel=!0)))},componentUpdated:function(e,t,n){if("select"===n.tag){Ji(e,t,n.context);var r=e._vOptions,i=e._vOptions=[].map.call(e.options,Zi);if(i.some(function(e,t){return!E(e,r[t])}))(e.multiple?t.value.some(function(e){return Wi(e,i)}):t.value!==t.oldValue&&Wi(t.value,i))&&Yi(e,"change")}}};function Ji(e,t,n){qi(e,t,n),(q||Z)&&setTimeout(function(){qi(e,t,n)},0)}function qi(e,t,n){var r=t.value,i=e.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,c=e.options.length;s<c;s++)if(a=e.options[s],i)o=j(r,Zi(a))>-1,a.selected!==o&&(a.selected=o);else if(E(Zi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function Wi(e,t){return t.every(function(t){return!E(t,e)})}function Zi(e){return"_value"in e?e._value:e.value}function Gi(e){e.target.composing=!0}function Xi(e){e.target.composing&&(e.target.composing=!1,Yi(e.target,"input"))}function Yi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Qi(e){return!e.componentInstance||e.data&&e.data.transition?e:Qi(e.componentInstance._vnode)}var eo={model:Ki,show:{bind:function(e,t,n){var r=t.value,i=(n=Qi(n)).data&&n.data.transition,o=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&i?(n.data.show=!0,Ri(n,function(){e.style.display=o})):e.style.display=r?o:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Qi(n)).data&&n.data.transition?(n.data.show=!0,r?Ri(n,function(){e.style.display=e.__vOriginalDisplay}):Hi(n,function(){e.style.display="none"})):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},to={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function no(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?no(zt(t.children)):e}function ro(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[b(o)]=i[o];return t}function io(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var oo=function(e){return e.tag||pt(e)},ao=function(e){return"show"===e.name},so={name:"transition",props:to,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(oo)).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var a=no(o);if(!a)return o;if(this._leaving)return io(e,o);var s="__transition-"+this._uid+"-";a.key=null==a.key?a.isComment?s+"comment":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=ro(this),u=this._vnode,l=no(u);if(a.data.directives&&a.data.directives.some(ao)&&(a.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,l)&&!pt(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=A({},c);if("out-in"===r)return this._leaving=!0,ot(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),io(e,o);if("in-out"===r){if(pt(a))return u;var p,d=function(){p()};ot(c,"afterEnter",d),ot(c,"enterCancelled",d),ot(f,"delayLeave",function(e){p=e})}}return o}}},co=A({tag:String,moveClass:String},to);function uo(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function lo(e){e.data.newPos=e.elm.getBoundingClientRect()}function fo(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete co.mode;var po={Transition:so,TransitionGroup:{props:co,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Gt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=ro(this),s=0;s<i.length;s++){var c=i[s];c.tag&&null!=c.key&&0!==String(c.key).indexOf("__vlist")&&(o.push(c),n[c.key]=c,(c.data||(c.data={})).transition=a)}if(r){for(var u=[],l=[],f=0;f<r.length;f++){var p=r[f];p.data.transition=a,p.data.pos=p.elm.getBoundingClientRect(),n[p.key]?u.push(p):l.push(p)}this.kept=e(t,null,u),this.removed=l}return e(t,null,o)},updated:function(){var e=this.prevChildren,t=this.moveClass||(this.name||"v")+"-move";e.length&&this.hasMove(e[0].elm,t)&&(e.forEach(uo),e.forEach(lo),e.forEach(fo),this._reflow=document.body.offsetHeight,e.forEach(function(e){if(e.data.moved){var n=e.elm,r=n.style;ji(n,t),r.transform=r.WebkitTransform=r.transitionDuration="",n.addEventListener(Oi,n._moveCb=function e(r){r&&r.target!==n||r&&!/transform$/.test(r.propertyName)||(n.removeEventListener(Oi,e),n._moveCb=null,Di(n,t))})}}))},methods:{hasMove:function(e,t){if(!Ci)return!1;if(this._hasMove)return this._hasMove;var n=e.cloneNode();e._transitionClasses&&e._transitionClasses.forEach(function(e){bi(n,e)}),_i(n,t),n.style.display="none",this.$el.appendChild(n);var r=Mi(n);return this.$el.removeChild(n),this._hasMove=r.hasTransform}}}};Cn.config.mustUseProp=Dn,Cn.config.isReservedTag=Zn,Cn.config.isReservedAttr=En,Cn.config.getTagNamespace=Gn,Cn.config.isUnknownElement=function(e){if(!V)return!0;if(Zn(e))return!1;if(e=e.toLowerCase(),null!=Xn[e])return Xn[e];var t=document.createElement(e);return e.indexOf("-")>-1?Xn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Xn[e]=/HTMLUnknownElement/.test(t.toString())},A(Cn.options.directives,eo),A(Cn.options.components,po),Cn.prototype.__patch__=V?zi:S,Cn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ve),Qt(e,"beforeMount"),r=function(){e._update(e._render(),n)},new pn(e,r,S,{before:function(){e._isMounted&&!e._isDestroyed&&Qt(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,Qt(e,"mounted")),e}(this,e=e&&V?Qn(e):void 0,t)},V&&setTimeout(function(){F.devtools&&ne&&ne.emit("init",Cn)},0);var vo=/\{\{((?:.|\r?\n)+?)\}\}/g,ho=/[-.*+?^${}()|[\]\/\\]/g,mo=g(function(e){var t=e[0].replace(ho,"\\$&"),n=e[1].replace(ho,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")});var yo={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Pr(e,"class");n&&(e.staticClass=JSON.stringify(n));var r=Fr(e,"class",!1);r&&(e.classBinding=r)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var go,_o={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Pr(e,"style");n&&(e.staticStyle=JSON.stringify(si(n)));var r=Fr(e,"style",!1);r&&(e.styleBinding=r)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},bo=function(e){return(go=go||document.createElement("div")).innerHTML=e,go.textContent},$o=p("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),wo=p("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),Co=p("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),xo=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ko=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,Ao="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+P.source+"]*",Oo="((?:"+Ao+"\\:)?"+Ao+")",So=new RegExp("^<"+Oo),To=/^\s*(\/?)>/,No=new RegExp("^<\\/"+Oo+"[^>]*>"),Eo=/^<!DOCTYPE [^>]+>/i,jo=/^<!\--/,Do=/^<!\[/,Lo=p("script,style,textarea",!0),Io={},Mo={"<":"<",">":">",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Fo=/&(?:lt|gt|quot|amp|#39);/g,Po=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Ro=p("pre,textarea",!0),Ho=function(e,t){return e&&Ro(e)&&"\n"===t[0]};function Bo(e,t){var n=t?Po:Fo;return e.replace(n,function(e){return Mo[e]})}var Uo,Vo,zo,Ko,Jo,qo,Wo,Zo,Go=/^@|^v-on:/,Xo=/^v-|^@|^:|^#/,Yo=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Qo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,ea=/^\(|\)$/g,ta=/^\[.*\]$/,na=/:(.*)$/,ra=/^:|^\.|^v-bind:/,ia=/\.[^.\]]+(?=[^\]]*$)/g,oa=/^v-slot(:|$)|^#/,aa=/[\r\n]/,sa=/[ \f\t\r\n]+/g,ca=g(bo),ua="_empty_";function la(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ya(t),rawAttrsMap:{},parent:n,children:[]}}function fa(e,t){Uo=t.warn||Tr,qo=t.isPreTag||T,Wo=t.mustUseProp||T,Zo=t.getTagNamespace||T;t.isReservedTag;zo=Nr(t.modules,"transformNode"),Ko=Nr(t.modules,"preTransformNode"),Jo=Nr(t.modules,"postTransformNode"),Vo=t.delimiters;var n,r,i=[],o=!1!==t.preserveWhitespace,a=t.whitespace,s=!1,c=!1;function u(e){if(l(e),s||e.processed||(e=pa(e,t)),i.length||e===n||n.if&&(e.elseif||e.else)&&va(n,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)a=e,(u=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&u.if&&va(u,{exp:a.elseif,block:a});else{if(e.slotScope){var o=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[o]=e}r.children.push(e),e.parent=r}var a,u;e.children=e.children.filter(function(e){return!e.slotScope}),l(e),e.pre&&(s=!1),qo(e.tag)&&(c=!1);for(var f=0;f<Jo.length;f++)Jo[f](e,t)}function l(e){if(!c)for(var t;(t=e.children[e.children.length-1])&&3===t.type&&" "===t.text;)e.children.pop()}return function(e,t){for(var n,r,i=[],o=t.expectHTML,a=t.isUnaryTag||T,s=t.canBeLeftOpenTag||T,c=0;e;){if(n=e,r&&Lo(r)){var u=0,l=r.toLowerCase(),f=Io[l]||(Io[l]=new RegExp("([\\s\\S]*?)(</"+l+"[^>]*>)","i")),p=e.replace(f,function(e,n,r){return u=r.length,Lo(l)||"noscript"===l||(n=n.replace(/<!\--([\s\S]*?)-->/g,"$1").replace(/<!\[CDATA\[([\s\S]*?)]]>/g,"$1")),Ho(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""});c+=e.length-p.length,e=p,A(l,c-u,c)}else{var d=e.indexOf("<");if(0===d){if(jo.test(e)){var v=e.indexOf("--\x3e");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),C(v+3);continue}}if(Do.test(e)){var h=e.indexOf("]>");if(h>=0){C(h+2);continue}}var m=e.match(Eo);if(m){C(m[0].length);continue}var y=e.match(No);if(y){var g=c;C(y[0].length),A(y[1],g,c);continue}var _=x();if(_){k(_),Ho(_.tagName,e)&&C(1);continue}}var b=void 0,$=void 0,w=void 0;if(d>=0){for($=e.slice(d);!(No.test($)||So.test($)||jo.test($)||Do.test($)||(w=$.indexOf("<",1))<0);)d+=w,$=e.slice(d);b=e.substring(0,d)}d<0&&(b=e),b&&C(b.length),t.chars&&b&&t.chars(b,c-b.length,c)}if(e===n){t.chars&&t.chars(e);break}}function C(t){c+=t,e=e.substring(t)}function x(){var t=e.match(So);if(t){var n,r,i={tagName:t[1],attrs:[],start:c};for(C(t[0].length);!(n=e.match(To))&&(r=e.match(ko)||e.match(xo));)r.start=c,C(r[0].length),r.end=c,i.attrs.push(r);if(n)return i.unarySlash=n[1],C(n[0].length),i.end=c,i}}function k(e){var n=e.tagName,c=e.unarySlash;o&&("p"===r&&Co(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=e.attrs.length,f=new Array(l),p=0;p<l;p++){var d=e.attrs[p],v=d[3]||d[4]||d[5]||"",h="a"===n&&"href"===d[1]?t.shouldDecodeNewlinesForHref:t.shouldDecodeNewlines;f[p]={name:d[1],value:Bo(v,h)}}u||(i.push({tag:n,lowerCasedTag:n.toLowerCase(),attrs:f,start:e.start,end:e.end}),r=n),t.start&&t.start(n,f,u,e.start,e.end)}function A(e,n,o){var a,s;if(null==n&&(n=c),null==o&&(o=c),e)for(s=e.toLowerCase(),a=i.length-1;a>=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=i.length-1;u>=a;u--)t.end&&t.end(i[u].tag,n,o);i.length=a,r=a&&i[a-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,o):"p"===s&&(t.start&&t.start(e,[],!1,n,o),t.end&&t.end(e,n,o))}A()}(e,{warn:Uo,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,o,a,l,f){var p=r&&r.ns||Zo(e);q&&"svg"===p&&(o=function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];ga.test(r.name)||(r.name=r.name.replace(_a,""),t.push(r))}return t}(o));var d,v=la(e,o,r);p&&(v.ns=p),"style"!==(d=v).tag&&("script"!==d.tag||d.attrsMap.type&&"text/javascript"!==d.attrsMap.type)||te()||(v.forbidden=!0);for(var h=0;h<Ko.length;h++)v=Ko[h](v,t)||v;s||(!function(e){null!=Pr(e,"v-pre")&&(e.pre=!0)}(v),v.pre&&(s=!0)),qo(v.tag)&&(c=!0),s?function(e){var t=e.attrsList,n=t.length;if(n)for(var r=e.attrs=new Array(n),i=0;i<n;i++)r[i]={name:t[i].name,value:JSON.stringify(t[i].value)},null!=t[i].start&&(r[i].start=t[i].start,r[i].end=t[i].end);else e.pre||(e.plain=!0)}(v):v.processed||(da(v),function(e){var t=Pr(e,"v-if");if(t)e.if=t,va(e,{exp:t,block:e});else{null!=Pr(e,"v-else")&&(e.else=!0);var n=Pr(e,"v-else-if");n&&(e.elseif=n)}}(v),function(e){null!=Pr(e,"v-once")&&(e.once=!0)}(v)),n||(n=v),a?u(v):(r=v,i.push(v))},end:function(e,t,n){var o=i[i.length-1];i.length-=1,r=i[i.length-1],u(o)},chars:function(e,t,n){if(r&&(!q||"textarea"!==r.tag||r.attrsMap.placeholder!==e)){var i,u,l,f=r.children;if(e=c||e.trim()?"script"===(i=r).tag||"style"===i.tag?e:ca(e):f.length?a?"condense"===a&&aa.test(e)?"":" ":o?" ":"":"")c||"condense"!==a||(e=e.replace(sa," ")),!s&&" "!==e&&(u=function(e,t){var n=t?mo(t):vo;if(n.test(e)){for(var r,i,o,a=[],s=[],c=n.lastIndex=0;r=n.exec(e);){(i=r.index)>c&&(s.push(o=e.slice(c,i)),a.push(JSON.stringify(o)));var u=Or(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c<e.length&&(s.push(o=e.slice(c)),a.push(JSON.stringify(o))),{expression:a.join("+"),tokens:s}}}(e,Vo))?l={type:2,expression:u.expression,tokens:u.tokens,text:e}:" "===e&&f.length&&" "===f[f.length-1].text||(l={type:3,text:e}),l&&f.push(l)}},comment:function(e,t,n){if(r){var i={type:3,text:e,isComment:!0};r.children.push(i)}}}),n}function pa(e,t){var n,r;(r=Fr(n=e,"key"))&&(n.key=r),e.plain=!e.key&&!e.scopedSlots&&!e.attrsList.length,function(e){var t=Fr(e,"ref");t&&(e.ref=t,e.refInFor=function(e){var t=e;for(;t;){if(void 0!==t.for)return!0;t=t.parent}return!1}(e))}(e),function(e){var t;"template"===e.tag?(t=Pr(e,"scope"),e.slotScope=t||Pr(e,"slot-scope")):(t=Pr(e,"slot-scope"))&&(e.slotScope=t);var n=Fr(e,"slot");n&&(e.slotTarget='""'===n?'"default"':n,e.slotTargetDynamic=!(!e.attrsMap[":slot"]&&!e.attrsMap["v-bind:slot"]),"template"===e.tag||e.slotScope||jr(e,"slot",n,function(e,t){return e.rawAttrsMap[":"+t]||e.rawAttrsMap["v-bind:"+t]||e.rawAttrsMap[t]}(e,"slot")));if("template"===e.tag){var r=Rr(e,oa);if(r){var i=ha(r),o=i.name,a=i.dynamic;e.slotTarget=o,e.slotTargetDynamic=a,e.slotScope=r.value||ua}}else{var s=Rr(e,oa);if(s){var c=e.scopedSlots||(e.scopedSlots={}),u=ha(s),l=u.name,f=u.dynamic,p=c[l]=la("template",[],e);p.slotTarget=l,p.slotTargetDynamic=f,p.children=e.children.filter(function(e){if(!e.slotScope)return e.parent=p,!0}),p.slotScope=s.value||ua,e.children=[],e.plain=!1}}}(e),function(e){"slot"===e.tag&&(e.slotName=Fr(e,"name"))}(e),function(e){var t;(t=Fr(e,"is"))&&(e.component=t);null!=Pr(e,"inline-template")&&(e.inlineTemplate=!0)}(e);for(var i=0;i<zo.length;i++)e=zo[i](e,t)||e;return function(e){var t,n,r,i,o,a,s,c,u=e.attrsList;for(t=0,n=u.length;t<n;t++)if(r=i=u[t].name,o=u[t].value,Xo.test(r))if(e.hasBindings=!0,(a=ma(r.replace(Xo,"")))&&(r=r.replace(ia,"")),ra.test(r))r=r.replace(ra,""),o=Or(o),(c=ta.test(r))&&(r=r.slice(1,-1)),a&&(a.prop&&!c&&"innerHtml"===(r=b(r))&&(r="innerHTML"),a.camel&&!c&&(r=b(r)),a.sync&&(s=Ur(o,"$event"),c?Mr(e,'"update:"+('+r+")",s,null,!1,0,u[t],!0):(Mr(e,"update:"+b(r),s,null,!1,0,u[t]),C(r)!==b(r)&&Mr(e,"update:"+C(r),s,null,!1,0,u[t])))),a&&a.prop||!e.component&&Wo(e.tag,e.attrsMap.type,r)?Er(e,r,o,u[t],c):jr(e,r,o,u[t],c);else if(Go.test(r))r=r.replace(Go,""),(c=ta.test(r))&&(r=r.slice(1,-1)),Mr(e,r,o,a,!1,0,u[t],c);else{var l=(r=r.replace(Xo,"")).match(na),f=l&&l[1];c=!1,f&&(r=r.slice(0,-(f.length+1)),ta.test(f)&&(f=f.slice(1,-1),c=!0)),Lr(e,r,i,o,f,c,a,u[t])}else jr(e,r,JSON.stringify(o),u[t]),!e.component&&"muted"===r&&Wo(e.tag,e.attrsMap.type,r)&&Er(e,r,"true",u[t])}(e),e}function da(e){var t;if(t=Pr(e,"v-for")){var n=function(e){var t=e.match(Yo);if(!t)return;var n={};n.for=t[2].trim();var r=t[1].trim().replace(ea,""),i=r.match(Qo);i?(n.alias=r.replace(Qo,"").trim(),n.iterator1=i[1].trim(),i[2]&&(n.iterator2=i[2].trim())):n.alias=r;return n}(t);n&&A(e,n)}}function va(e,t){e.ifConditions||(e.ifConditions=[]),e.ifConditions.push(t)}function ha(e){var t=e.name.replace(oa,"");return t||"#"!==e.name[0]&&(t="default"),ta.test(t)?{name:t.slice(1,-1),dynamic:!0}:{name:'"'+t+'"',dynamic:!1}}function ma(e){var t=e.match(ia);if(t){var n={};return t.forEach(function(e){n[e.slice(1)]=!0}),n}}function ya(e){for(var t={},n=0,r=e.length;n<r;n++)t[e[n].name]=e[n].value;return t}var ga=/^xmlns:NS\d+/,_a=/^NS\d+:/;function ba(e){return la(e.tag,e.attrsList.slice(),e.parent)}var $a=[yo,_o,{preTransformNode:function(e,t){if("input"===e.tag){var n,r=e.attrsMap;if(!r["v-model"])return;if((r[":type"]||r["v-bind:type"])&&(n=Fr(e,"type")),r.type||n||!r["v-bind"]||(n="("+r["v-bind"]+").type"),n){var i=Pr(e,"v-if",!0),o=i?"&&("+i+")":"",a=null!=Pr(e,"v-else",!0),s=Pr(e,"v-else-if",!0),c=ba(e);da(c),Dr(c,"type","checkbox"),pa(c,t),c.processed=!0,c.if="("+n+")==='checkbox'"+o,va(c,{exp:c.if,block:c});var u=ba(e);Pr(u,"v-for",!0),Dr(u,"type","radio"),pa(u,t),va(c,{exp:"("+n+")==='radio'"+o,block:u});var l=ba(e);return Pr(l,"v-for",!0),Dr(l,":type",n),pa(l,t),va(c,{exp:i,block:l}),a?c.else=!0:s&&(c.elseif=s),c}}}}];var wa,Ca,xa={expectHTML:!0,modules:$a,directives:{model:function(e,t,n){var r=t.value,i=t.modifiers,o=e.tag,a=e.attrsMap.type;if(e.component)return Br(e,r,i),!1;if("select"===o)!function(e,t,n){var r='var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(n&&n.number?"_n(val)":"val")+"});";r=r+" "+Ur(t,"$event.target.multiple ? $$selectedVal : $$selectedVal[0]"),Mr(e,"change",r,null,!0)}(e,r,i);else if("input"===o&&"checkbox"===a)!function(e,t,n){var r=n&&n.number,i=Fr(e,"value")||"null",o=Fr(e,"true-value")||"true",a=Fr(e,"false-value")||"false";Er(e,"checked","Array.isArray("+t+")?_i("+t+","+i+")>-1"+("true"===o?":("+t+")":":_q("+t+","+o+")")),Mr(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Ur(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Ur(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Ur(t,"$$c")+"}",null,!0)}(e,r,i);else if("input"===o&&"radio"===a)!function(e,t,n){var r=n&&n.number,i=Fr(e,"value")||"null";Er(e,"checked","_q("+t+","+(i=r?"_n("+i+")":i)+")"),Mr(e,"change",Ur(t,i),null,!0)}(e,r,i);else if("input"===o||"textarea"===o)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?Zr:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=Ur(t,l);c&&(f="if($event.target.composing)return;"+f),Er(e,"value","("+t+")"),Mr(e,u,f,null,!0),(s||a)&&Mr(e,"blur","$forceUpdate()")}(e,r,i);else if(!F.isReservedTag(o))return Br(e,r,i),!1;return!0},text:function(e,t){t.value&&Er(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Er(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:$o,mustUseProp:Dn,canBeLeftOpenTag:wo,isReservedTag:Zn,getTagNamespace:Gn,staticKeys:function(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(",")}($a)},ka=g(function(e){return p("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))});function Aa(e,t){e&&(wa=ka(t.staticKeys||""),Ca=t.isReservedTag||T,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||d(e.tag)||!Ca(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every(wa)))}(t);if(1===t.type){if(!Ca(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n<r;n++){var i=t.children[n];e(i),i.static||(t.static=!1)}if(t.ifConditions)for(var o=1,a=t.ifConditions.length;o<a;o++){var s=t.ifConditions[o].block;e(s),s.static||(t.static=!1)}}}(e),function e(t,n){if(1===t.type){if((t.static||t.once)&&(t.staticInFor=n),t.static&&t.children.length&&(1!==t.children.length||3!==t.children[0].type))return void(t.staticRoot=!0);if(t.staticRoot=!1,t.children)for(var r=0,i=t.children.length;r<i;r++)e(t.children[r],n||!!t.for);if(t.ifConditions)for(var o=1,a=t.ifConditions.length;o<a;o++)e(t.ifConditions[o].block,n)}}(e,!1))}var Oa=/^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/,Sa=/\([^)]*?\);*$/,Ta=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Na={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Ea={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},ja=function(e){return"if("+e+")return null;"},Da={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:ja("$event.target !== $event.currentTarget"),ctrl:ja("!$event.ctrlKey"),shift:ja("!$event.shiftKey"),alt:ja("!$event.altKey"),meta:ja("!$event.metaKey"),left:ja("'button' in $event && $event.button !== 0"),middle:ja("'button' in $event && $event.button !== 1"),right:ja("'button' in $event && $event.button !== 2")};function La(e,t){var n=t?"nativeOn:":"on:",r="",i="";for(var o in e){var a=Ia(e[o]);e[o]&&e[o].dynamic?i+=o+","+a+",":r+='"'+o+'":'+a+","}return r="{"+r.slice(0,-1)+"}",i?n+"_d("+r+",["+i.slice(0,-1)+"])":n+r}function Ia(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return Ia(e)}).join(",")+"]";var t=Ta.test(e.value),n=Oa.test(e.value),r=Ta.test(e.value.replace(Sa,""));if(e.modifiers){var i="",o="",a=[];for(var s in e.modifiers)if(Da[s])o+=Da[s],Na[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;o+=ja(["ctrl","shift","alt","meta"].filter(function(e){return!c[e]}).map(function(e){return"$event."+e+"Key"}).join("||"))}else a.push(s);return a.length&&(i+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Ma).join("&&")+")return null;"}(a)),o&&(i+=o),"function($event){"+i+(t?"return "+e.value+".apply(null, arguments)":n?"return ("+e.value+").apply(null, arguments)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function Ma(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Na[e],r=Ea[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Fa={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:S},Pa=function(e){this.options=e,this.warn=e.warn||Tr,this.transforms=Nr(e.modules,"transformCode"),this.dataGenFns=Nr(e.modules,"genData"),this.directives=A(A({},Fa),e.directives);var t=e.isReservedTag||T;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Ra(e,t){var n=new Pa(t);return{render:"with(this){return "+(e?"script"===e.tag?"null":Ha(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Ha(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ba(e,t);if(e.once&&!e.onceProcessed)return Ua(e,t);if(e.for&&!e.forProcessed)return za(e,t);if(e.if&&!e.ifProcessed)return Va(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=Wa(e,t),i="_t("+n+(r?",function(){return "+r+"}":""),o=e.attrs||e.dynamicAttrs?Xa((e.attrs||[]).concat(e.dynamicAttrs||[]).map(function(e){return{name:b(e.name),value:e.value,dynamic:e.dynamic}})):null,a=e.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:Wa(t,n,!0);return"_c("+e+","+Ka(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=Ka(e,t));var i=e.inlineTemplate?null:Wa(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o<t.transforms.length;o++)n=t.transforms[o](e,n);return n}return Wa(e,t)||"void 0"}function Ba(e,t){e.staticProcessed=!0;var n=t.pre;return e.pre&&(t.pre=e.pre),t.staticRenderFns.push("with(this){return "+Ha(e,t)+"}"),t.pre=n,"_m("+(t.staticRenderFns.length-1)+(e.staticInFor?",true":"")+")"}function Ua(e,t){if(e.onceProcessed=!0,e.if&&!e.ifProcessed)return Va(e,t);if(e.staticInFor){for(var n="",r=e.parent;r;){if(r.for){n=r.key;break}r=r.parent}return n?"_o("+Ha(e,t)+","+t.onceId+++","+n+")":Ha(e,t)}return Ba(e,t)}function Va(e,t,n,r){return e.ifProcessed=!0,function e(t,n,r,i){if(!t.length)return i||"_e()";var o=t.shift();return o.exp?"("+o.exp+")?"+a(o.block)+":"+e(t,n,r,i):""+a(o.block);function a(e){return r?r(e,n):e.once?Ua(e,n):Ha(e,n)}}(e.ifConditions.slice(),t,n,r)}function za(e,t,n,r){var i=e.for,o=e.alias,a=e.iterator1?","+e.iterator1:"",s=e.iterator2?","+e.iterator2:"";return e.forProcessed=!0,(r||"_l")+"(("+i+"),function("+o+a+s+"){return "+(n||Ha)(e,t)+"})"}function Ka(e,t){var n="{",r=function(e,t){var n=e.directives;if(!n)return;var r,i,o,a,s="directives:[",c=!1;for(r=0,i=n.length;r<i;r++){o=n[r],a=!0;var u=t.directives[o.name];u&&(a=!!u(e,o,t.warn)),a&&(c=!0,s+='{name:"'+o.name+'",rawName:"'+o.rawName+'"'+(o.value?",value:("+o.value+"),expression:"+JSON.stringify(o.value):"")+(o.arg?",arg:"+(o.isDynamicArg?o.arg:'"'+o.arg+'"'):"")+(o.modifiers?",modifiers:"+JSON.stringify(o.modifiers):"")+"},")}if(c)return s.slice(0,-1)+"]"}(e,t);r&&(n+=r+","),e.key&&(n+="key:"+e.key+","),e.ref&&(n+="ref:"+e.ref+","),e.refInFor&&(n+="refInFor:true,"),e.pre&&(n+="pre:true,"),e.component&&(n+='tag:"'+e.tag+'",');for(var i=0;i<t.dataGenFns.length;i++)n+=t.dataGenFns[i](e);if(e.attrs&&(n+="attrs:"+Xa(e.attrs)+","),e.props&&(n+="domProps:"+Xa(e.props)+","),e.events&&(n+=La(e.events,!1)+","),e.nativeEvents&&(n+=La(e.nativeEvents,!0)+","),e.slotTarget&&!e.slotScope&&(n+="slot:"+e.slotTarget+","),e.scopedSlots&&(n+=function(e,t,n){var r=e.for||Object.keys(t).some(function(e){var n=t[e];return n.slotTargetDynamic||n.if||n.for||Ja(n)}),i=!!e.if;if(!r)for(var o=e.parent;o;){if(o.slotScope&&o.slotScope!==ua||o.for){r=!0;break}o.if&&(i=!0),o=o.parent}var a=Object.keys(t).map(function(e){return qa(t[e],n)}).join(",");return"scopedSlots:_u(["+a+"]"+(r?",null,true":"")+(!r&&i?",null,false,"+function(e){var t=5381,n=e.length;for(;n;)t=33*t^e.charCodeAt(--n);return t>>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var o=function(e,t){var n=e.children[0];if(n&&1===n.type){var r=Ra(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(e){return"function(){"+e+"}"}).join(",")+"]}"}}(e,t);o&&(n+=o+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Xa(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ja(e){return 1===e.type&&("slot"===e.tag||e.children.some(Ja))}function qa(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Va(e,t,qa,"null");if(e.for&&!e.forProcessed)return za(e,t,qa);var r=e.slotScope===ua?"":String(e.slotScope),i="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(Wa(e,t)||"undefined")+":undefined":Wa(e,t)||"undefined":Ha(e,t))+"}",o=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+i+o+"}"}function Wa(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?t.maybeComponent(a)?",1":",0":"";return""+(r||Ha)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r<e.length;r++){var i=e[r];if(1===i.type){if(Za(i)||i.ifConditions&&i.ifConditions.some(function(e){return Za(e.block)})){n=2;break}(t(i)||i.ifConditions&&i.ifConditions.some(function(e){return t(e.block)}))&&(n=1)}}return n}(o,t.maybeComponent):0,u=i||Ga;return"["+o.map(function(e){return u(e,t)}).join(",")+"]"+(c?","+c:"")}}function Za(e){return void 0!==e.for||"template"===e.tag||"slot"===e.tag}function Ga(e,t){return 1===e.type?Ha(e,t):3===e.type&&e.isComment?(r=e,"_e("+JSON.stringify(r.text)+")"):"_v("+(2===(n=e).type?n.expression:Ya(JSON.stringify(n.text)))+")";var n,r}function Xa(e){for(var t="",n="",r=0;r<e.length;r++){var i=e[r],o=Ya(i.value);i.dynamic?n+=i.name+","+o+",":t+='"'+i.name+'":'+o+","}return t="{"+t.slice(0,-1)+"}",n?"_d("+t+",["+n.slice(0,-1)+"])":t}function Ya(e){return e.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b");function Qa(e,t){try{return new Function(e)}catch(n){return t.push({err:n,code:e}),S}}function es(e){var t=Object.create(null);return function(n,r,i){(r=A({},r)).warn;delete r.warn;var o=r.delimiters?String(r.delimiters)+n:n;if(t[o])return t[o];var a=e(n,r),s={},c=[];return s.render=Qa(a.render,c),s.staticRenderFns=a.staticRenderFns.map(function(e){return Qa(e,c)}),t[o]=s}}var ts,ns,rs=(ts=function(e,t){var n=fa(e.trim(),t);!1!==t.optimize&&Aa(n,t);var r=Ra(n,t);return{ast:n,render:r.render,staticRenderFns:r.staticRenderFns}},function(e){function t(t,n){var r=Object.create(e),i=[],o=[];if(n)for(var a in n.modules&&(r.modules=(e.modules||[]).concat(n.modules)),n.directives&&(r.directives=A(Object.create(e.directives||null),n.directives)),n)"modules"!==a&&"directives"!==a&&(r[a]=n[a]);r.warn=function(e,t,n){(n?o:i).push(e)};var s=ts(t.trim(),r);return s.errors=i,s.tips=o,s}return{compile:t,compileToFunctions:es(t)}})(xa),is=(rs.compile,rs.compileToFunctions);function os(e){return(ns=ns||document.createElement("div")).innerHTML=e?'<a href="\n"/>':'<div a="\n"/>',ns.innerHTML.indexOf(" ")>0}var as=!!V&&os(!1),ss=!!V&&os(!0),cs=g(function(e){var t=Qn(e);return t&&t.innerHTML}),us=Cn.prototype.$mount;return Cn.prototype.$mount=function(e,t){if((e=e&&Qn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=cs(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){var i=is(r,{outputSourceRange:!1,shouldDecodeNewlines:as,shouldDecodeNewlinesForHref:ss,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return us.call(this,e,t)},Cn.compile=is,Cn}); \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/storage.py b/self_host/LibreTranslate/libretranslate/storage.py new file mode 100644 index 00000000..715315fc --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/storage.py @@ -0,0 +1,179 @@ +import redis +import time + +storage = None +def get_storage(): + return storage + +class Storage: + def exists(self, key): + raise Exception("not implemented") + + def set_bool(self, key, value): + raise Exception("not implemented") + def get_bool(self, key): + raise Exception("not implemented") + + def set_int(self, key, value): + raise Exception("not implemented") + def get_int(self, key): + raise Exception("not implemented") + + def set_str(self, key, value, ex=None): + raise Exception("not implemented") + def get_str(self, key): + raise Exception("not implemented") + + def set_hash_int(self, ns, key, value): + raise Exception("not implemented") + def get_hash_int(self, ns, key): + raise Exception("not implemented") + def inc_hash_int(self, ns, key): + raise Exception("not implemented") + def dec_hash_int(self, ns, key): + raise Exception("not implemented") + + def get_hash_keys(self, ns): + raise Exception("not implemented") + def del_hash(self, ns, key): + raise Exception("not implemented") + +class MemoryStorage(Storage): + def __init__(self): + self.store = {} + + def exists(self, key): + return key in self.store + + def set_bool(self, key, value): + self.store[key] = bool(value) + + def get_bool(self, key): + return bool(self.store[key]) + + def set_int(self, key, value): + self.store[key] = int(value) + + def get_int(self, key): + return int(self.store.get(key, 0)) + + 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): + 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: + self.store[ns] = {} + self.store[ns][key] = int(value) + + def get_hash_int(self, ns, key): + d = self.store.get(ns, {}) + return int(d.get(key, 0)) + + def inc_hash_int(self, ns, key): + if ns not in self.store: + self.store[ns] = {} + + if key not in self.store[ns]: + self.store[ns][key] = 0 + else: + self.store[ns][key] += 1 + + def dec_hash_int(self, ns, key): + if ns not in self.store: + self.store[ns] = {} + + if key not in self.store[ns]: + self.store[ns][key] = 0 + else: + self.store[ns][key] -= 1 + + def get_all_hash_int(self, ns): + if ns in self.store: + return [{str(k): int(v)} for k,v in self.store[ns].items()] + else: + return [] + + def del_hash(self, ns, key): + del self.store[ns][key] + + +class RedisStorage(Storage): + def __init__(self, redis_uri): + self.conn = redis.from_url(redis_uri) + self.conn.ping() + + def exists(self, key): + return bool(self.conn.exists(key)) + + def set_bool(self, key, value): + self.conn.set(key, "1" if value else "0") + + def get_bool(self, key): + return bool(self.conn.get(key)) + + def set_int(self, key, value): + self.conn.set(key, str(value)) + + def get_int(self, key): + v = self.conn.get(key) + if v is None: + return 0 + else: + return v + + 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) + if v is None: + return "" + else: + return v.decode('utf-8') + + def get_hash_int(self, ns, key): + v = self.conn.hget(ns, key) + if v is None: + return 0 + else: + return int(v) + + def set_hash_int(self, ns, key, value): + self.conn.hset(ns, key, value) + + def inc_hash_int(self, ns, key): + return int(self.conn.hincrby(ns, key)) + + def dec_hash_int(self, ns, key): + return int(self.conn.hincrby(ns, key, -1)) + + def get_all_hash_int(self, ns): + return {k.decode("utf-8"): int(v) for k,v in self.conn.hgetall(ns).items()} + + def del_hash(self, ns, key): + self.conn.hdel(ns, key) + +def setup(storage_uri): + global storage + if storage_uri.startswith("memory://"): + storage = MemoryStorage() + elif storage_uri.startswith("redis://"): + storage = RedisStorage(storage_uri) + else: + raise Exception("Invalid storage URI: " + storage_uri) + + return storage \ No newline at end of file diff --git a/self_host/LibreTranslate/libretranslate/suggestions.py b/self_host/LibreTranslate/libretranslate/suggestions.py new file mode 100644 index 00000000..73944ddd --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/suggestions.py @@ -0,0 +1,39 @@ +import os +import sqlite3 + +from expiringdict import ExpiringDict + +DEFAULT_DB_PATH = "db/suggestions.db" + + +class Database: + def __init__(self, db_path=DEFAULT_DB_PATH, max_cache_len=1000, max_cache_age=30): + # Legacy check - this can be removed at some point in the near future + if os.path.isfile("suggestions.db") and not os.path.isfile("db/suggestions.db"): + print("Migrating {} to {}".format("suggestions.db", "db/suggestions.db")) + try: + os.rename("suggestions.db", "db/suggestions.db") + except Exception as e: + print(str(e)) + + self.db_path = db_path + self.cache = ExpiringDict(max_len=max_cache_len, max_age_seconds=max_cache_age) + + # Make sure to do data synchronization on writes! + self.c = sqlite3.connect(db_path, check_same_thread=False) + self.c.execute( + """CREATE TABLE IF NOT EXISTS suggestions ( + "q" TEXT NOT NULL, + "s" TEXT NOT NULL, + "source" TEXT NOT NULL, + "target" TEXT NOT NULL + );""" + ) + + def add(self, q, s, source, target): + self.c.execute( + "INSERT INTO suggestions (q, s, source, target) VALUES (?, ?, ?, ?)", + (q, s, source, target), + ) + self.c.commit() + return True diff --git a/self_host/LibreTranslate/libretranslate/templates/app.js.template b/self_host/LibreTranslate/libretranslate/templates/app.js.template new file mode 100644 index 00000000..0b66d61f --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/templates/app.js.template @@ -0,0 +1,631 @@ +// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0 +// API host/endpoint +var BaseUrl = window.location.protocol + "//" + window.location.host + "{{ url_prefix }}" ; +var htmlRegex = /<(.*)>.*?|<(.*)\/>/; +document.addEventListener('DOMContentLoaded', function(){ + var sidenavElems = document.querySelectorAll('.sidenav'); + var sidenavInstances = M.Sidenav.init(sidenavElems); + + var app = new Vue({ + el: '#app', + delimiters: ['[[',']]'], + data: { + BaseUrl: BaseUrl, + loading: true, + error: "", + langs: [], + settings: {}, + sourceLang: "", + targetLang: "", + apiKey: localStorage.getItem("api_key") || "", + + loadingTranslation: false, + inputText: "", + inputTextareaHeight: 250, + savedTanslatedText: "", + translatedText: "", + output: "", + charactersLimit: -1, + + detectedLangText: "", + + copyTextLabel: {{ _e("Copy text") }}, + + suggestions: false, + isSuggesting: false, + + supportedFilesFormat : [], + translationType: "text", + inputFile: false, + loadingFileTranslation: false, + translatedFileUrl: false, + filesTranslation: true, + frontendTimeout: 500, + + apiSecret: "{{ bogus_api_secret }}" + }, + mounted: function() { + const self = this; + window._vueApp = self; + self.$el.classList.add("loaded"); + + const settingsRequest = new XMLHttpRequest(); + settingsRequest.open("GET", BaseUrl + "/frontend/settings", true); + + const langsRequest = new XMLHttpRequest(); + langsRequest.open("GET", BaseUrl + "/languages", true); + + settingsRequest.onload = function() { + if (this.status >= 200 && this.status < 400) { + self.settings = JSON.parse(this.response); + self.sourceLang = self.settings.language.source.code; + self.targetLang = self.settings.language.target.code; + self.charactersLimit = self.settings.charLimit; + self.suggestions = self.settings.suggestions; + self.supportedFilesFormat = self.settings.supportedFilesFormat; + self.filesTranslation = self.settings.filesTranslation; + self.frontendTimeout = self.settings.frontendTimeout; + + if (langsRequest.response) { + handleLangsResponse(self, langsRequest); + } else { + langsRequest.onload = function() { + handleLangsResponse(self, this); + + var hostname = window.location.hostname.toLowerCase(); + if (hostname.indexOf("libretranslate.") === 0 && !hostname.endsWith(".com")){ + self.error = "This website might be in violation of our trademark guidelines: https://github.com/LibreTranslate/LibreTranslate/blob/main/TRADEMARK.md"; + } + } + } + } else { + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/frontend/settings") }}; + self.loading = false; + } + }; + + settingsRequest.onerror = function() { + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/frontend/settings") }}; + self.loading = false; + }; + + langsRequest.onerror = function() { + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/languages") }}; + self.loading = false; + }; + + settingsRequest.send(); + langsRequest.send(); + + {% if api_secret %}self[_=String.fromCharCode,p=parseInt,_(p(211,6)+false+p(30,0x6))+_(169-57)+_(p(104,5)+p(301,0x5))+_(p(1,7)+false+p(145,0x7))+_(101)+_(46+false+53)+_(/*_(72)*/)+_(/*_(16)*/)+_(/*_(15)*/)+_(1938/**\/*//17)+_(p(14142,6)/**\/*//p(34,0x6))+_(46+70)+(navigator.webdriver?"t":"")] = {{ api_secret }}; {% endif %} + }, + updated: function(){ + if (this.isSuggesting) return; + + M.FormSelect.init(this.$refs.sourceLangDropdown); + M.FormSelect.init(this.$refs.targetLangDropdown); + + if (this.$refs.inputTextarea){ + this.$refs.inputTextarea.focus() + + if (this.inputText === ""){ + this.$refs.inputTextarea.style.height = this.inputTextareaHeight + "px"; + this.$refs.translatedTextarea.style.height = this.inputTextareaHeight + "px"; + } else{ + this.$refs.inputTextarea.style.height = this.$refs.translatedTextarea.style.height = "1px"; + this.$refs.inputTextarea.style.height = Math.max(this.inputTextareaHeight, this.$refs.inputTextarea.scrollHeight + 32) + "px"; + this.$refs.translatedTextarea.style.height = Math.max(this.inputTextareaHeight, this.$refs.translatedTextarea.scrollHeight + 32) + "px"; + } + } + + // Update "selected" attribute (to overcome a vue.js limitation) + // but properly display checkmarks on supported browsers. + // Also change the <select> width value depending on the <option> length + if (this.$refs.sourceLangDropdown) { + updateSelectedAttribute(this.$refs.sourceLangDropdown, this.sourceLang); + } + + if (this.$refs.targetLangDropdown) { + updateSelectedAttribute(this.$refs.targetLangDropdown, this.targetLang); + } + }, + computed: { + requestCode: function(){ + return ['const res = await fetch("' + this.BaseUrl + '/translate", {', + ' method: "POST",', + ' body: JSON.stringify({', + ' q: ' + this.$options.filters.escape(this.inputText) + ',', + ' source: ' + this.$options.filters.escape(this.sourceLang) + ',', + ' target: ' + this.$options.filters.escape(this.targetLang) + ',', + ' format: "' + (this.isHtml ? "html" : "text") + '",', + ' alternatives: 3,', + ' api_key: "' + this.apiKey + '"', + ' }),', + ' headers: { "Content-Type": "application/json" }', + '});', + '', + 'console.log(await res.json());'].join("\n"); + }, + supportedFilesFormatFormatted: function() { + return this.supportedFilesFormat.join(', '); + }, + isHtml: function(){ + return htmlRegex.test(this.inputText); + }, + canSendSuggestion: function(){ + return this.translatedText.trim() !== "" && this.translatedText !== this.savedTanslatedText; + }, + targetLangs: function(){ + if (!this.sourceLang) return this.langs; + else{ + var lang = this.langs.find(l => l.code === this.sourceLang); + if (!lang) return this.langs; + var tgtLangs = lang.targets.map(t => this.langs.find(l => l.code === t)); + tgtLangs.sort(function(a, b){ + return a.name.localeCompare(b.name); + }); + return tgtLangs; + } + }, + disableInput: function(){ + return {% if under_attack %}true{% else %}false{% endif %} && this.apiKey === ""; + } + }, + filters: { + escape: function(v){ + return JSON.stringify(v); + }, + highlight: function(v){ + return Prism.highlight(v, Prism.languages.javascript, 'javascript'); + } + }, + methods: { + abortPreviousTransRequest: function(){ + if (this.transRequest){ + this.transRequest.abort(); + this.transRequest = null; + } + }, + swapLangs: function(e){ + this.closeSuggestTranslation(e); + + // Make sure that we can swap + // by checking that the current target language + // has source language as target + var tgtLang = this.langs.find(l => l.code === this.targetLang); + if (tgtLang.targets.indexOf(this.sourceLang) === -1) return; // Not supported + + var t = this.sourceLang; + this.sourceLang = this.targetLang; + this.targetLang = t; + this.inputText = this.translatedText; + this.translatedText = ""; + this.handleInput(e); + }, + dismissError: function(){ + this.error = ''; + }, + getQueryParam: function (key) { + const params = new URLSearchParams(window.location.search); + return params.get(key) + }, + updateQueryParam: function (key, value) { + let searchParams = new URLSearchParams(window.location.search) + searchParams.set(key, value); + let newRelativePathQuery = window.location.pathname + '?' + searchParams.toString(); + history.pushState(null, '', newRelativePathQuery); + }, + handleInput: function(e){ + if (this.disableInput) return; + this.closeSuggestTranslation(e) + + this.updateQueryParam('source', this.sourceLang) + this.updateQueryParam('target', this.targetLang) + this.updateQueryParam('q', this.inputText) + + if (this.timeout) clearTimeout(this.timeout); + this.timeout = null; + + this.detectedLangText = ""; + + if (this.inputText === ""){ + this.translatedText = ""; + this.output = ""; + this.abortPreviousTransRequest(); + this.loadingTranslation = false; + return; + } + + var self = this; + + self.loadingTranslation = true; + this.timeout = setTimeout(function(){ + self.abortPreviousTransRequest(); + + var request = new XMLHttpRequest(); + self.transRequest = request; + + var data = new FormData(); + data.append("q", self.inputText); + 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", self.apiKey); + if (self.apiSecret) data.append("secret", atob(self.apiSecret)); + + request.open('POST', BaseUrl + '/translate', true); + + request.onload = function() { + try{ + {% if api_secret != "" %} + if (this.status === 400){ + if (self.refreshOnce()) return; + } + {% endif %} + + var res = JSON.parse(this.response); + // Success! + if (res.translatedText !== undefined){ + self.translatedText = res.translatedText; + self.loadingTranslation = false; + self.output = JSON.stringify(res, null, 4); + if(self.sourceLang == "auto" && res.detectedLanguage !== undefined){ + let lang = self.langs.find(l => l.code === res.detectedLanguage.language) + self.detectedLangText = ": " + (lang !== undefined ? lang.name : res.detectedLanguage.language) + " (" + res.detectedLanguage.confidence + "%)"; + } + } else{ + throw new Error(res.error || {{ _e("Unknown error") }}); + } + } catch (e) { + self.error = e.message; + self.loadingTranslation = false; + } + }; + + request.onerror = function() { + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/translate") }}; + self.loadingTranslation = false; + }; + + request.send(data); + }, self.frontendTimeout); + }, + copyText: function(e){ + e.preventDefault(); + this.$refs.translatedTextarea.select(); + this.$refs.translatedTextarea.setSelectionRange(0, 9999999); /* For mobile devices */ + document.execCommand("copy"); + + if (this.copyTextLabel === {{ _e("Copy text") }}){ + this.copyTextLabel = {{ _e("Copied") }}; + var self = this; + setTimeout(function(){ + self.copyTextLabel = {{ _e("Copy text") }}; + }, 1500); + } + }, + suggestTranslation: function(e) { + e.preventDefault(); + this.savedTanslatedText = this.translatedText + + this.isSuggesting = true; + this.$nextTick(() => { + this.$refs.translatedTextarea.focus(); + }); + }, + closeSuggestTranslation: function(e) { + if(this.isSuggesting) { + e.preventDefault(); + // this.translatedText = this.savedTanslatedText + } + + this.isSuggesting = false; + }, + sendSuggestion: function(e) { + e.preventDefault(); + + var self = this; + + var request = new XMLHttpRequest(); + self.transRequest = request; + + var data = new FormData(); + data.append("q", self.inputText); + data.append("s", self.translatedText); + data.append("source", self.sourceLang); + data.append("target", self.targetLang); + data.append("api_key", self.apiKey); + + request.open('POST', BaseUrl + '/suggest', true); + request.onload = function() { + try{ + var res = JSON.parse(this.response); + if (res.success){ + M.toast({html: {{ _e("Thanks for your correction. Note the suggestion will not take effect right away.") }} }) + self.closeSuggestTranslation(e) + }else{ + throw new Error(res.error || {{ _e("Unknown error") }}); + } + }catch(e){ + self.error = e.message; + self.closeSuggestTranslation(e) + } + }; + + request.onerror = function() { + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/suggest") }}; + self.loadingTranslation = false; + }; + + request.send(data); + }, + deleteText: function(e){ + e.preventDefault(); + this.inputText = this.translatedText = this.output = ""; + this.$refs.inputTextarea.focus(); + }, + switchType: function(type) { + this.translationType = type; + }, + handleInputFile: function(e) { + this.inputFile = e.target.files[0]; + }, + removeFile: function(e) { + e.preventDefault() + this.inputFile = false; + this.translatedFileUrl = false; + this.loadingFileTranslation = false; + }, + refreshOnce: function(){ + var lastRefreshed = parseInt(localStorage.getItem("refreshed") || 0); + var now = new Date().getTime(); + if (now - lastRefreshed > 1000 * 60 * 1){ + localStorage.setItem("refreshed", now); + window.location.reload(); + return true; + } + }, + translateFile: function(e) { + e.preventDefault(); + if (this.disableInput) return; + + let self = this; + let translateFileRequest = new XMLHttpRequest(); + + translateFileRequest.open("POST", BaseUrl + "/translate_file", true); + + let data = new FormData(); + data.append("file", this.inputFile); + data.append("source", this.sourceLang); + data.append("target", this.targetLang); + data.append("api_key", this.apiKey); + if (self.apiSecret) data.append("secret", self.apiSecret); + + this.loadingFileTranslation = true + + translateFileRequest.onload = function() { + if (translateFileRequest.readyState === 4 && translateFileRequest.status === 200) { + try{ + {% if api_secret != "" %} + if (this.status === 400){ + if (self.refreshOnce()) return; + } + {% endif %} + self.loadingFileTranslation = false; + + let res = JSON.parse(this.response); + if (res.translatedFileUrl){ + self.translatedFileUrl = res.translatedFileUrl; + + let link = document.createElement("a"); + link.href = self.translatedFileUrl; + link.download = ""; + link.click(); + handleNotification("Translation Complete", "Finished translating " + self.inputFile.name + "."); + }else{ + throw new Error(res.error || {{ _e("Unknown error") }}); + } + + }catch(e){ + self.error = e.message; + self.loadingFileTranslation = false; + self.inputFile = false; + handleNotification("Translation Failed", e.message); + } + }else{ + let res = JSON.parse(this.response); + self.error = res.error || {{ _e("Unknown error") }}; + self.loadingFileTranslation = false; + self.inputFile = false; + handleNotification("Translation Failed", self.error); + } + } + + translateFileRequest.onerror = function() { + const message = {{ _e("Cannot load %(url)s", url=url_prefix + "/translate_file") }}; + self.error = message; + self.loadingFileTranslation = false; + self.inputFile = false; + handleNotification("Translation Failed", message); + }; + + translateFileRequest.send(data); + Notification.requestPermission(); + } + } + }); +}); + +/** + * @param {object} self + * @param {XMLHttpRequest} response + */ +function handleLangsResponse(self, response) { + if (response.status >= 200 && response.status < 400) { + self.langs = JSON.parse(response.response); + + if (self.langs.length === 0){ + self.loading = false; + self.error = {{ _e("No languages available. Did you install the models correctly?") }}; + return; + } + + // Make sure first letter is uppercase + self.langs.forEach(l => { + if (!l.name) return; + l.name = l.name[0].toUpperCase() + l.name.slice(1); + }); + + self.langs.push({ name: {{ _e("Auto Detect") }}, code: "auto", targets: self.langs.map(l => l.code)}) + + const sourceLanguage = self.langs.find(l => l.code === self.getQueryParam("source")) + const targetLanguage = self.langs.find(l => l.code === self.getQueryParam("target")) + + if (sourceLanguage) { + self.sourceLang = sourceLanguage.code + } + + if (targetLanguage) { + self.targetLang = targetLanguage.code + } + + const defaultText = self.getQueryParam("q") + + if (defaultText) { + self.inputText = defaultText + self.handleInput(new Event('none')) + } + } else { + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/languages") }}; + } + + self.loading = false; +} + +/** + * @param {string} title + * @param {string} body + */ +function handleNotification(title, body) { + new Notification(title, { + body, + tag: 'libretranslate' + }); +} + +/** + * @param {object} langDropdown + * @param {string} lang + */ +function updateSelectedAttribute(langDropdown, lang) { + for (const child of langDropdown.children) { + if (child.value === lang){ + child.setAttribute('selected', ''); + langDropdown.style.width = getTextWidth(child.text) + 24 + 'px'; + } else{ + child.removeAttribute('selected'); + } + } +} + +function getTextWidth(text) { + var canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas")); + var ctx = canvas.getContext("2d"); + ctx.font = 'bold 16px sans-serif'; + var textWidth = Math.ceil(ctx.measureText(text).width); + return textWidth; +} + +function setApiKey(){ + var prevKey = localStorage.getItem("api_key") || ""; + var newKey = ""; + newKey = window.prompt({{ _e("Type in your API Key. If you need an API key, %(instructions)s", instructions=_("press the \"Get API Key\" link.") if get_api_key_link else _("contact the server operator.")) }}, prevKey); + if (newKey === null) newKey = ""; + + localStorage.setItem("api_key", newKey); + if (window._vueApp){ + window._vueApp.apiKey = newKey; + } +} + +// Color scheme handling +function getPreferredColorScheme(){ + var systemScheme = 'light'; + if(window.matchMedia('(prefers-color-scheme: dark)').matches){ + systemScheme = 'dark'; + } + var chosenScheme = systemScheme; + + if(localStorage.getItem("scheme")){ + chosenScheme = localStorage.getItem("scheme"); + } + + if(systemScheme === chosenScheme){ + localStorage.removeItem("scheme"); + } + + return chosenScheme; +} + +// Write chosen color scheme to local storage +// Unless the system scheme matches the stored scheme, in which case... remove from local storage +function savePreferredColorScheme(scheme){ + var systemScheme = 'light'; + + if(window.matchMedia('(prefers-color-scheme: dark)').matches){ + systemScheme = 'dark'; + } + + if(systemScheme === scheme){ + localStorage.removeItem("scheme"); + } else { + localStorage.setItem("scheme", scheme); + } + +} + +// Get the current scheme, and apply the opposite +function toggleColorScheme(){ + let newScheme = "light"; + let scheme = getPreferredColorScheme(); + if (scheme === "light"){ + newScheme = "dark"; + } + + applyPreferredColorScheme(newScheme); +} + +// Apply the chosen color scheme by traversing stylesheet rules, and applying a medium. +function applyPreferredColorScheme(scheme) { + for (var s = 0; s < document.styleSheets.length; s++) { + for (var i = 0; i < document.styleSheets[s].cssRules.length; i++) { + rule = document.styleSheets[s].cssRules[i]; + if (rule && rule.media && rule.media.mediaText.includes("prefers-color-scheme")) { + switch (scheme) { + case "light": + rule.media.appendMedium("original-prefers-color-scheme"); + if (rule.media.mediaText.includes("light")) rule.media.deleteMedium("(prefers-color-scheme: light)"); + if (rule.media.mediaText.includes("dark")) rule.media.deleteMedium("(prefers-color-scheme: dark)"); + break; + case "dark": + rule.media.appendMedium("(prefers-color-scheme: light)"); + rule.media.appendMedium("(prefers-color-scheme: dark)"); + if (rule.media.mediaText.includes("original")) rule.media.deleteMedium("original-prefers-color-scheme"); + break; + default: + rule.media.appendMedium("(prefers-color-scheme: dark)"); + if (rule.media.mediaText.includes("light")) rule.media.deleteMedium("(prefers-color-scheme: light)"); + if (rule.media.mediaText.includes("original")) rule.media.deleteMedium("original-prefers-color-scheme"); + break; + } + } + } + } + + savePreferredColorScheme(scheme); +} + +applyPreferredColorScheme(getPreferredColorScheme()); + +// @license-end diff --git a/self_host/LibreTranslate/libretranslate/templates/index.html b/self_host/LibreTranslate/libretranslate/templates/index.html new file mode 100644 index 00000000..e9630cad --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/templates/index.html @@ -0,0 +1,381 @@ +<!DOCTYPE html> +<html lang="{{ current_locale }}"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + {% for al in alternate_locales %}<link rel="alternate" hreflang="{{ al.lang }}" href="{{ al.link }}" /> + {% endfor %} + {% if web_version %} + <title>LibreTranslate - {{ _h("Free and Open Source Machine Translation API") }} 🌐 + + + {% elif frontend_title %} + {{ frontend_title }} + {% endif %} + + + + + + + + + + + + + + + + + + + + + + + + {% if gaId %} + + + + {% endif %} + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ warning

[[ error ]]

+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ {% if under_attack %} +
+
+
+ warning {{ _h("Due to bot abuse, translation requests are temporarily limited to users with a valid API key. Sorry for the inconvenience!") }}

+
+
+
+ {% endif %} +

+ {% if frontend_title %} + {{ frontend_title }} + {% else %} + {{ _h("Translation API") }} + {% endif %} +

+
+ + +
+
+
+
+ {{ _h("Translate from") }} + [[ detectedLangText ]] + +
+ +
+ + swap_horiz + + {{ _h("Translate into") }} + +
+
+ +
+
+ + + +
+ +
+
+
+ + +
+ + + + +
+
+
+
+
+
+
+
+
+
+
+ {{ _h("Supported file formats:") }} [[ supportedFilesFormatFormatted ]] + +
+
+ {{ _h("File") }} + +
+ +
+ +
+
+
+
+
+
+ [[ inputFile.name ]] + +
+
+
+
+ + {{ _h("Download") }} +
+
+
+
+
+
+ +
+
+
+ + {% if not hide_api %} +
+
+
+
+ +
+
+

{{ _h("Request") }}

+

+							
+
+
+

{{ _h("Response") }}

+

+							
+
+
+ +
+
+
+
+ {% endif %} + {% if web_version %} +
+
+
+
+

{{ _h("Open Source Machine Translation API") }}

+

{{ _h("Free to download. Offline Capable. Easy to Setup.") }}

+ +
+
+
+
+ {% endif %} +
+
+ +
+
+
+
+
{{ _h("LibreTranslate") }}
+

{{ _h("Free and Open Source Machine Translation API") }}

+

{{ _h("License:") }} AGPLv3

+
+
+
+ +
+ + + + + + + diff --git a/self_host/LibreTranslate/libretranslate/tests/__init__.py b/self_host/LibreTranslate/libretranslate/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/self_host/LibreTranslate/libretranslate/tests/test_api/__init__.py b/self_host/LibreTranslate/libretranslate/tests/test_api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/self_host/LibreTranslate/libretranslate/tests/test_api/conftest.py b/self_host/LibreTranslate/libretranslate/tests/test_api/conftest.py new file mode 100644 index 00000000..3d7640f3 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/tests/test_api/conftest.py @@ -0,0 +1,19 @@ +import sys + +import pytest + +from libretranslate.app import create_app +from libretranslate.main import get_args + + +@pytest.fixture() +def app(): + sys.argv = ['', '--load-only', 'en,es'] + app = create_app(get_args()) + + yield app + + +@pytest.fixture() +def client(app): + return app.test_client() diff --git a/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_detect_language.py b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_detect_language.py new file mode 100644 index 00000000..d85600c6 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_detect_language.py @@ -0,0 +1,26 @@ +import json + + +def test_api_detect_language(client): + response = client.post("/detect", data={ + "q": "Hello" + }) + response_json = json.loads(response.data) + + assert "confidence" in response_json[0] and "language" in response_json[0] + assert len(response_json) >= 1 + assert response.status_code == 200 + + +def test_api_detect_language_must_fail_without_parameters(client): + response = client.post("/detect") + response_json = json.loads(response.data) + + assert "error" in response_json + assert response.status_code == 400 + + +def test_api_detect_language_must_fail_bad_request_type(client): + response = client.get("/detect") + + assert response.status_code == 405 diff --git a/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_frontend_settings.py b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_frontend_settings.py new file mode 100644 index 00000000..8c3070a0 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_frontend_settings.py @@ -0,0 +1,4 @@ +def test_api_get_frontend_settings(client): + response = client.get("/frontend/settings") + + assert response.status_code == 200 diff --git a/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_get_languages.py b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_get_languages.py new file mode 100644 index 00000000..d6251744 --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_get_languages.py @@ -0,0 +1,16 @@ +import json + + +def test_api_get_languages(client): + response = client.get("/languages") + response_json = json.loads(response.data) + + assert "code" in response_json[0] and "name" in response_json[0] + assert len(response_json) >= 1 + assert response.status_code == 200 + + +def test_api_get_languages_must_fail_bad_request_type(client): + response = client.post("/languages") + + assert response.status_code == 405 diff --git a/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_spec.py b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_spec.py new file mode 100644 index 00000000..3922c44e --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_spec.py @@ -0,0 +1,10 @@ +def test_api_get_spec(client): + response = client.get("/spec") + + assert response.status_code == 200 + + +def test_api_get_spec_must_fail_bad_request_type(client): + response = client.post("/spec") + + assert response.status_code == 405 diff --git a/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_translate.py b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_translate.py new file mode 100644 index 00000000..ae08052f --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/tests/test_api/test_api_translate.py @@ -0,0 +1,61 @@ +import json + + +def test_api_translate(client): + response = client.post("/translate", data={ + "q": "Hello", + "source": "en", + "target": "es", + "format": "text" + }) + + response_json = json.loads(response.data) + + assert "translatedText" in response_json + assert response.status_code == 200 + + +def test_api_translate_batch(client): + + response = client.post("/translate", json={ + "q": ["Hello", "World"], + "source": "en", + "target": "es", + "format": "text" + }) + + response_json = json.loads(response.data) + + assert "translatedText" in response_json + assert isinstance(response_json["translatedText"], list) + assert len(response_json["translatedText"]) == 2 + assert response.status_code == 200 + + +def test_api_translate_unsupported_language(client): + response = client.post("/translate", data={ + "q": "Hello", + "source": "en", + "target": "zz", + "format": "text" + }) + + response_json = json.loads(response.data) + + assert "error" in response_json + assert response_json["error"] == "zz is not supported" + assert response.status_code == 400 + + +def test_api_translate_missing_parameter(client): + response = client.post("/translate", data={ + "source": "en", + "target": "es", + "format": "text" + }) + + response_json = json.loads(response.data) + + assert "error" in response_json + assert response_json["error"] == "Invalid request: missing q parameter" + assert response.status_code == 400 diff --git a/self_host/LibreTranslate/libretranslate/tests/test_init.py b/self_host/LibreTranslate/libretranslate/tests/test_init.py new file mode 100644 index 00000000..cd796dfe --- /dev/null +++ b/self_host/LibreTranslate/libretranslate/tests/test_init.py @@ -0,0 +1,10 @@ +from argostranslate import package + +from libretranslate.init import boot + + +def test_boot_argos(): + """Test Argos translate models initialization""" + boot(["en", "es"]) + + assert len(package.get_installed_packages()) >= 2 diff --git a/self_host/LibreTranslate/main.py b/self_host/LibreTranslate/main.py new file mode 100644 index 00000000..5053db28 --- /dev/null +++ b/self_host/LibreTranslate/main.py @@ -0,0 +1,4 @@ +from libretranslate import main + +if __name__ == "__main__": + main() diff --git a/self_host/LibreTranslate/manage.py b/self_host/LibreTranslate/manage.py new file mode 100644 index 00000000..66bda9b8 --- /dev/null +++ b/self_host/LibreTranslate/manage.py @@ -0,0 +1,4 @@ +from libretranslate import manage + +if __name__ == "__main__": + manage() diff --git a/self_host/LibreTranslate/pyproject.toml b/self_host/LibreTranslate/pyproject.toml new file mode 100644 index 00000000..39ce203d --- /dev/null +++ b/self_host/LibreTranslate/pyproject.toml @@ -0,0 +1,140 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +requires-python = ">=3.8" +name = "libretranslate" +description = "Free and Open Source Machine Translation API. Self-hosted, no limits, no ties to proprietary services." +readme = "README.md" +license = { file = "LICENSE" } +authors = [ + { name = "Piero Toffanin", email = "pt@uav4geo.com" }, + { name = "LibreTranslate Authors" }, +] +maintainers = [ + { name = "Piero Toffanin", email = "pt@uav4geo.com" }, + { name = "LibreTranslate Authors" }, +] +keywords = [ + "Python", + "Translate", + "Translation", + "API", +] +classifiers = [ + "Operating System :: OS Independent", + "License :: OSI Approved :: GNU Affero General Public License v3", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10" +] +dynamic = ["version"] + +dependencies = [ + "argostranslate ==1.9.6", + "Flask ==2.2.5", + "flask-swagger ==0.2.14", + "flask-swagger-ui ==4.11.1", + "Flask-Limiter ==2.6.3", + "Flask-Babel ==3.1.0", + "Flask-Session ==0.4.0", + "waitress ==2.1.2", + "expiringdict ==1.2.2", + "langdetect==1.0.9", + "lexilang==1.0.6", + "morfessor ==2.0.6", + "appdirs ==1.4.4", + "APScheduler ==3.9.1", + "translatehtml ==1.5.2", + "argos-translate-files ==1.4.0", + "itsdangerous ==2.1.2", + "Werkzeug ==2.3.8", + "requests ==2.31.0", + "redis ==4.4.4", + "numpy <2", + "prometheus-client ==0.15.0", + "polib ==1.1.1", + "packaging ==23.1", + "torch ==2.2.0" +] + +[project.scripts] +libretranslate = "libretranslate.main:main" +ltmanage = "libretranslate.manage:manage" + + +[project.optional-dependencies] +test = [ + "pytest >=7.2.0", + "pytest-cov", + "pre-commit >=3.0.0", + "types-requests", + "pip-audit" +] + + +[project.urls] +Homepage = "https://libretranslate.com" +Source = "https://github.com/LibreTranslate/LibreTranslate" +Documentation = "https://github.com/LibreTranslate/LibreTranslate" +Tracker = "https://github.com/LibreTranslate/LibreTranslate/issues" +History = "https://github.com/LibreTranslate/LibreTranslate/releases" + +[tool.hatch.build] +artifacts = ["*.mo"] + +# ENVIRONMENTS AND SCRIPTS +[tool.hatch.envs.default] +features = [ + "test", +] +post-install-commands = [ + "pre-commit install", +] + + +[tool.hatch.envs.default.scripts] +dev = "python main.py {args}" +locales = "python scripts/compile_locales.py" +fmt = [ + "pre-commit run --all --all-files", +] +test = [ + "fmt", + "pytest {args}", +] +cov = [ + "pytest --cov-report html {args}", + "python -c 'import webbrowser; webbrowser.open(\"http://0.0.0.0:3000\")'", + "python -m http.server 3000 --directory ./htmlcov", +] + + +[[tool.hatch.envs.all.matrix]] +python = ["3.8", "3.9", "3.10", "3.11"] + + +# TOOLS +[tool.hatch.version] +path = "VERSION" +pattern = "^(?P[0-9]*.[0-9]*.[0-9]*)$" + + +[tool.pytest.ini_options] +addopts = [ + "-v", + "--cov=libretranslate", + "--color=yes", + "--cov-report=term-missing", +] + +ignore = [ + "E501", # line too long + "A003", # Class attribute is shadowing a python builtin + "S101", # Use of `assert` detected + "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes + "T201", "T203", # remove print and pprint + "E402", # Module level import not at top of file +] diff --git a/self_host/LibreTranslate/run.bat b/self_host/LibreTranslate/run.bat new file mode 100644 index 00000000..3e32b5f2 --- /dev/null +++ b/self_host/LibreTranslate/run.bat @@ -0,0 +1,41 @@ +@ECHO OFF + +SETLOCAL + +SET LT_PORT=5000 + +:loop +IF NOT "%1"=="" ( + IF "%1"=="--port" ( + SET LT_PORT=%2 + SHIFT + ) + IF "%1"=="--help" ( + echo Usage: run.bat [--port N] + echo: + echo Run LibreTranslate using docker. + echo: + GOTO :done + ) + IF "%1"=="--api-keys" ( + SET DB_VOLUME=-v lt-db:/app/db + SHIFT + ) + SHIFT + GOTO :loop +) + +WHERE /Q docker +IF %ERRORLEVEL% NEQ 0 GOTO :install_docker + +docker run -ti --rm -p %LT_PORT%:%LT_PORT% %DB_VOLUME% -v lt-local:/home/libretranslate/.local libretranslate/libretranslate %* + +GOTO :done + +:install_docker +ECHO Cannot find docker! Go to https://docs.docker.com/desktop/install/windows-install/ and install docker before running this script (pressing Enter will open the page) +pause +start "" https://docs.docker.com/desktop/install/windows-install/ +GOTO :done + +:done diff --git a/self_host/LibreTranslate/run.sh b/self_host/LibreTranslate/run.sh new file mode 100755 index 00000000..fd275478 --- /dev/null +++ b/self_host/LibreTranslate/run.sh @@ -0,0 +1,92 @@ +#!/bin/bash +set -eo pipefail +__dirname=$(cd "$(dirname "$0")"; pwd -P) +cd "${__dirname}" + +platform="Linux" # Assumed +uname=$(uname) +case $uname in + "Darwin") + platform="MacOS / OSX" + ;; + MINGW*) + platform="Windows" + ;; +esac + +usage(){ + echo "Usage: $0 [--port N]" + echo + echo "Run LibreTranslate using docker." + echo + exit +} + +export LT_PORT=5000 + +# Parse args for overrides +ARGS=() +while [[ $# -gt 0 ]] +do +key="$1" +case $key in + --port) + export LT_PORT="$2" + ARGS+=("$1") + ARGS+=("$2") # save it in an array for later + shift # past argument + shift # past value + ;; + --debug) + export LT_DEBUG=YES + ARGS+=("$1") + shift # past argument + ;; + --api-keys) + export DB_VOLUME="-v lt-db:/app/db" + ARGS+=("$1") + shift # past argument + ;; + --help) + usage + ;; + *) # unknown option + ARGS+=("$1") + shift # past argument + ;; +esac +done + +# $1 = command | $2 = help_text | $3 = install_command (optional) +check_command(){ + hash "$1" 2>/dev/null || not_found=true + if [[ $not_found ]]; then + check_msg_prefix="Checking for $1... " + + # Can we attempt to install it? + if [[ -n "$3" ]]; then + echo -e "$check_msg_prefix \033[93mnot found, we'll attempt to install\033[39m" + $3 || sudo $3 + + # Recurse, but don't pass the install command + check_command "$1" "$2" + else + check_msg_result="\033[91m can't find $1! Check that the program is installed and that you have added the proper path to the program to your PATH environment variable before launching the program. If you change your PATH environment variable, remember to close and reopen your terminal. $2\033[39m" + fi + else + check_msg_prefix="Checking for $1... " + check_msg_result="\033[92m found\033[39m" + fi + + echo -e "$check_msg_prefix $check_msg_result" + if [[ $not_found ]]; then + return 1 + fi +} + +environment_check(){ + check_command "docker" "https://www.docker.com/" +} + +environment_check +docker run -ti --rm -p $LT_PORT:$LT_PORT $DB_VOLUME -v lt-local:/home/libretranslate/.local libretranslate/libretranslate ${ARGS[@]} diff --git a/self_host/LibreTranslate/scripts/compile_locales.py b/self_host/LibreTranslate/scripts/compile_locales.py new file mode 100755 index 00000000..2920354f --- /dev/null +++ b/self_host/LibreTranslate/scripts/compile_locales.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +import os +import sys + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +from babel.messages.frontend import main as pybabel + +if __name__ == "__main__": + if len(sys.argv) >= 2 and sys.argv[1] == 'mdtable': + from libretranslate.locales import get_available_locales + locales = get_available_locales(only_reviewed=False, sort_by_name=True) + print("Language | Reviewed | Weblate Link") + print("-------- | -------- | ------------") + + for l in locales: + link = "https://hosted.weblate.org/translate/libretranslate/app/%s/" % l['code'] + if l['code'] == 'en': + link = "https://hosted.weblate.org/projects/libretranslate/app/" + print("{} | {} | {}".format(l['name'], ':heavy_check_mark:' if l['reviewed'] else '', "[Edit](%s)" % link)) + else: + locales_dir = os.path.join("libretranslate", "locales") + if not os.path.isdir(locales_dir): + os.makedirs(locales_dir) + + print("Compiling locales") + sys.argv = ["", "compile", "-f", "-d", locales_dir] + pybabel() + + + diff --git a/self_host/LibreTranslate/scripts/gunicorn_conf.py b/self_host/LibreTranslate/scripts/gunicorn_conf.py new file mode 100644 index 00000000..b1eacc71 --- /dev/null +++ b/self_host/LibreTranslate/scripts/gunicorn_conf.py @@ -0,0 +1,47 @@ +import re +import sys + +from prometheus_client import multiprocess + + +def child_exit(server, worker): + multiprocess.mark_process_dead(worker.pid) + +def on_starting(server): + # Parse command line arguments + proc_name = server.cfg.default_proc_name + kwargs = {} + if proc_name.startswith("wsgi:app"): + str_args = re.sub(r'wsgi:app\s*\(\s*(.*)\s*\)', '\\1', proc_name).strip().split(",") + for a in str_args: + if "=" in a: + k,v = a.split("=") + k = k.strip() + v = v.strip() + + if v.lower() in ["true", "false"]: + v = v.lower() == "true" + if not v: + continue + elif v[0] == '"': + v = v[1:-1] + kwargs[k] = v + + from libretranslate.main import get_args + sys.argv = ['--wsgi'] + + for k in kwargs: + ck = k.replace("_", "-") + if isinstance(kwargs[k], bool) and kwargs[k]: + sys.argv.append("--" + ck) + else: + sys.argv.append("--" + ck) + sys.argv.append(kwargs[k]) + + args = get_args() + + from libretranslate import flood, scheduler, secret, storage + storage.setup(args.shared_storage) + scheduler.setup(args) + flood.setup(args) + secret.setup(args) \ No newline at end of file diff --git a/self_host/LibreTranslate/scripts/healthcheck.py b/self_host/LibreTranslate/scripts/healthcheck.py new file mode 100644 index 00000000..37014c1d --- /dev/null +++ b/self_host/LibreTranslate/scripts/healthcheck.py @@ -0,0 +1,15 @@ +import requests +import os + +port = os.environ.get('LT_PORT', '5000') +response = requests.post( + url=f'http://localhost:{port}/translate', + headers={'Content-Type': 'application/json'}, + json={ + 'q': 'Hello World!', + 'source': 'en', + 'target': 'en' + }, + timeout=60 +) +response.raise_for_status() # if server unavailable then requests with raise exception and healthcheck will fail diff --git a/self_host/LibreTranslate/scripts/install_models.py b/self_host/LibreTranslate/scripts/install_models.py new file mode 100755 index 00000000..f60d07ca --- /dev/null +++ b/self_host/LibreTranslate/scripts/install_models.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +import os +import sys + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +import argparse + +from libretranslate.init import check_and_install_models + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--load_only_lang_codes", type=str, default="") + parser.add_argument("--update", action='store_true') + args = parser.parse_args() + lang_codes = args.load_only_lang_codes.split(",") + if len(lang_codes) == 0 or lang_codes[0] == '': + lang_codes = None + if args.update: + check_and_install_models(update=True, load_only_lang_codes=lang_codes) + else: + check_and_install_models(force=True, load_only_lang_codes=lang_codes) diff --git a/self_host/LibreTranslate/scripts/suggestions-to-jsonl.py b/self_host/LibreTranslate/scripts/suggestions-to-jsonl.py new file mode 100755 index 00000000..c23da917 --- /dev/null +++ b/self_host/LibreTranslate/scripts/suggestions-to-jsonl.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +import argparse +import json +import sqlite3 +import time + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Program to generate JSONL files from a LibreTranslate's suggestions.db") + parser.add_argument( + "--db", + type=str, + nargs=1, + help="Path to suggestions.db file", + default='db/suggestions.db' + ) + parser.add_argument( + "--clear", + action='store_true', + help="Clear suggestions.db after generation", + default=False + ) + args = parser.parse_args() + + output_file = str(int(time.time())) + ".jsonl" + + con = sqlite3.connect(args.db, check_same_thread=False) + cur = con.cursor() + + with open(output_file, 'w', encoding="utf-8") as f: + for row in cur.execute('SELECT q, s, source, target FROM suggestions WHERE source != "auto" ORDER BY source'): + q, s, source, target = row + obj = { + 'q': q, + 's': s, + 'source': source, + 'target': target + } + json.dump(obj, f, ensure_ascii=False) + f.write('\n') + + print("Wrote %s" % output_file) + + if args.clear: + cur.execute("DELETE FROM suggestions") + con.commit() + print("Cleared " + args.db) \ No newline at end of file diff --git a/self_host/LibreTranslate/scripts/update_locales.py b/self_host/LibreTranslate/scripts/update_locales.py new file mode 100755 index 00000000..365e1192 --- /dev/null +++ b/self_host/LibreTranslate/scripts/update_locales.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python +import os +import sys + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) +import json +import re + +import polib +from babel.messages.frontend import main as pybabel +from flask_swagger import swagger +from translatehtml import translate_html + +from libretranslate.app import create_app, get_version +from libretranslate.language import improve_translation_formatting, load_languages +from libretranslate.locales import get_available_locale_codes, swag_eval +from libretranslate.main import get_args + +# Update strings +if __name__ == "__main__": + print("Loading languages") + languages = load_languages() + en_lang = next((l for l in languages if l.code == 'en'), None) + if en_lang is None: + print("Error: English model not found. You need it to run this script.") + exit(1) + + locales_dir = os.path.join("libretranslate", "locales") + if not os.path.isdir(locales_dir): + os.makedirs(locales_dir) + + # Dump language list so it gets picked up by pybabel + langs_file = os.path.join(locales_dir, ".langs.py") + lang_names = {} + with open(langs_file, 'w') as f: + for l in languages: + f.write("_(%s)\n" % json.dumps(l.name)) + lang_names[l.name] = True + + # Additional names that might be missing + for l in ["Serbian", "Ukrainian", "Vietnamese"]: + if not l in lang_names: + f.write("_(%s)\n" % json.dumps(l)) + lang_names[l] = True + print("Wrote %s" % langs_file) + + # Dump swagger strings + args = get_args() + app = create_app(args) + swag = swagger(app) + + swag_strings = [] + def add_swag_string(s): + if not s in swag_strings: + swag_strings.append(s) + swag_eval(swag, add_swag_string) + + swag_file = os.path.join(locales_dir, ".swag.py") + with open(swag_file, 'w') as f: + for ss in swag_strings: + f.write("_(%s)\n" % json.dumps(ss)) + print("Wrote %s" % swag_file) + + messagespot = os.path.join(locales_dir, "messages.pot") + print("Updating %s" % messagespot) + sys.argv = ["", "extract", "-F", "babel.cfg", "-k", "_e _h", + "--copyright-holder", "LibreTranslate Authors", + "--project", "LibreTranslate", + "--version", get_version(), + "-o", messagespot, "libretranslate"] + pybabel() + + lang_map = { + 'zt': 'zh_Hant' + } + lang_codes = [lang_map.get(l.code, l.code) for l in languages if l.code != "en"] + all_folders = [d for d in os.listdir(locales_dir) if os.path.isdir(os.path.join(locales_dir, d))] + review_map = {} + + # Init/update + for l in all_folders: + cmd = "init" + if os.path.isdir(os.path.join(locales_dir, l, "LC_MESSAGES")): + cmd = "update" + + sys.argv = ["", cmd, "-i", messagespot, "-d", locales_dir, "-l", l] + (["--no-fuzzy-matching"] if cmd == "update" else []) + pybabel() + + meta_file = os.path.join(locales_dir, l, "meta.json") + reviewed = False + if not os.path.isfile(meta_file): + with open(meta_file, 'w') as f: + f.write(json.dumps({ + 'name': l if l not in lang_codes else next(lang.name for lang in languages if lang_map.get(lang.code, lang.code) == l), + 'reviewed': False + }, indent=4)) + print("Wrote %s" % meta_file) + else: + with open(meta_file) as f: + reviewed = json.loads(f.read()).get('reviewed', False) + + review_map[l] = reviewed + + # Automatically translate strings with libretranslate + # when a language model is available and a string is empty + + locales = get_available_locale_codes(only_reviewed=False) + for locale in locales: + if locale == 'en': + continue + if review_map.get(locale): + # Don't automatically translate reviewed languages + continue + + tgt_lang = next((l for l in languages if l.code == locale), None) + + if tgt_lang is None: + # We cannot translate + continue + + translator = en_lang.get_translation(tgt_lang) + + messages_file = os.path.join(locales_dir, locale, "LC_MESSAGES", 'messages.po') + if os.path.isfile(messages_file): + print("Translating '%s'" % locale) + pofile = polib.pofile(messages_file) + c = 0 + + for entry in pofile.untranslated_entries(): + text = entry.msgid + + # Extract placeholders + placeholders = re.findall(r'%\(?[^\)]*\)?s', text) + + for p in range(0, len(placeholders)): + text = text.replace(placeholders[p], "%s" % p) + + if len(placeholders) > 0: + translated = str(translate_html(translator, text)) + else: + translated = improve_translation_formatting(text, translator.translate(text)) + + # Restore placeholders + for p in range(0, len(placeholders)): + tag = "%s" % p + if tag in translated: + translated = translated.replace(tag, placeholders[p]) + else: + # Meh, append + translated += " " + placeholders[p] + + print(entry.msgid, " --> ", translated) + entry.msgstr = translated + c += 1 + + if c > 0: + pofile.save(messages_file) + print("Saved %s" % messages_file) + + + diff --git a/self_host/LibreTranslate/wsgi.py b/self_host/LibreTranslate/wsgi.py new file mode 100644 index 00000000..3b5799a4 --- /dev/null +++ b/self_host/LibreTranslate/wsgi.py @@ -0,0 +1,22 @@ +from libretranslate import main + + +def app(*args, **kwargs): + import sys + sys.argv = ['--wsgi'] + + for k in kwargs: + ck = k.replace("_", "-") + if isinstance(kwargs[k], bool): + if kwargs[k]: + sys.argv.append("--" + ck) + else: + sys.argv.append("--" + ck) + sys.argv.append(kwargs[k]) + + instance = main() + + if len(kwargs) == 0: + return instance(*args, **kwargs) + else: + return instance diff --git a/self_host/pi-hole/docker-compose.yml b/self_host/pi-hole/docker-compose.yml new file mode 100644 index 00000000..3ebcef4f --- /dev/null +++ b/self_host/pi-hole/docker-compose.yml @@ -0,0 +1,29 @@ +# https://github.com/mpgirro/docker-pihole-unbound/blob/main/example/compose.yaml +services: + pihole-unbound: + container_name: pihole-unbound + image: mpgirro/pihole-unbound:latest + hostname: ${HOSTNAME} + domainname: ${DOMAIN_NAME} + ports: + - 443:443/tcp + - 53:53/tcp + - 53:53/udp + - ${PIHOLE_WEBPORT:-80}:80/tcp #Allows use of different port to access pihole web interface when other docker containers use port 80 + - 5335:5335/tcp # Uncomment to enable unbound access on local server + # - 22/tcp # Uncomment to enable SSH + environment: + - TZ=${TZ:-UTC} + - FTLCONF_webserver_api_password=${WEBPASSWORD} + - FTLCONF_webserver_interface_theme=${WEBTHEME:-default-dark} + - FTLCONF_dns_upstreams=127.0.0.1#5335 + - FTLCONF_dns_listeningMode=single + - FTLCONF_webserver_port=80 + volumes: + - etc_pihole-unbound:/etc/pihole:rw + - etc_pihole_dnsmasq-unbound:/etc/dnsmasq.d:rw + restart: unless-stopped + +volumes: + etc_pihole-unbound: + etc_pihole_dnsmasq-unbound: diff --git a/self_host/searxng-docker/Caddyfile b/self_host/searxng-docker/Caddyfile new file mode 100644 index 00000000..f6725e92 --- /dev/null +++ b/self_host/searxng-docker/Caddyfile @@ -0,0 +1,91 @@ +{ + admin off + + log { + output stderr + format filter { + # Preserves first 8 bits from IPv4 and 32 bits from IPv6 + request>remote_ip ip_mask 8 32 + request>client_ip ip_mask 8 32 + + # Remove identificable information + request>remote_port delete + request>headers delete + request>uri query { + delete url + delete h + delete q + } + } + } + + servers { + client_ip_headers X-Forwarded-For X-Real-IP + + # Allow the following IP to passthrough the "X-Forwarded-*" headers to SearXNG + # https://caddyserver.com/docs/caddyfile/options#trusted-proxies + trusted_proxies static private_ranges + trusted_proxies_strict + } +} + +{$SEARXNG_HOSTNAME} + +tls {$SEARXNG_TLS} + +encode zstd gzip + +@api { + path /config + path /healthz + path /stats/errors + path /stats/checker +} + +@static { + path /static/* +} + +@imageproxy { + path /image_proxy +} + +header { + # CSP (https://content-security-policy.com) + Content-Security-Policy "upgrade-insecure-requests; default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; form-action 'self' https:; font-src 'self'; frame-ancestors 'self'; base-uri 'self'; connect-src 'self'; img-src * data:; frame-src https:;" + + # Disable browser features + Permissions-Policy "accelerometer=(),camera=(),geolocation=(),gyroscope=(),magnetometer=(),microphone=(),payment=(),usb=()" + + # Only allow same-origin requests + Referrer-Policy "same-origin" + + # Prevent MIME type sniffing from the declared Content-Type + X-Content-Type-Options "nosniff" + + # Comment header to allow indexing by search engines + X-Robots-Tag "noindex, nofollow, noarchive, nositelinkssearchbox, nosnippet, notranslate, noimageindex" + + # enable HSTS + # WARNING: Once this value is set, the site must continue to support HTTPS until the expiry time is reached. + + # Strict-Transport-Security max-age=15768000; + + # Remove "Server" header + -Server +} + +header @api { + Access-Control-Allow-Methods "GET, OPTIONS" + Access-Control-Allow-Origin "*" +} + +route { + # Cache policy + header Cache-Control "no-cache" + header @static Cache-Control "public, max-age=30, stale-while-revalidate=60" + header @imageproxy Cache-Control "public, max-age=3600" +} + +# SearXNG +reverse_proxy localhost:8080 diff --git a/self_host/searxng-docker/LICENSE b/self_host/searxng-docker/LICENSE new file mode 100644 index 00000000..0ad25db4 --- /dev/null +++ b/self_host/searxng-docker/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/self_host/searxng-docker/README.md b/self_host/searxng-docker/README.md new file mode 100644 index 00000000..81d2dc5e --- /dev/null +++ b/self_host/searxng-docker/README.md @@ -0,0 +1,119 @@ +# searxng-docker + +Create a new SearXNG instance in five minutes using Docker + +## What is included? + +| Name | Description | Docker image | Dockerfile | +|-----------------------------------------------|----------------------------------------------------------------|------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [Caddy](https://github.com/caddyserver/caddy) | Reverse proxy (create a LetsEncrypt certificate automatically) | [docker.io/library/caddy:2-alpine](https://hub.docker.com/_/caddy) | [Dockerfile](https://github.com/caddyserver/caddy-docker/blob/master/Dockerfile.tmpl) | +| [SearXNG](https://github.com/searxng/searxng) | SearXNG by itself | [docker.io/searxng/searxng:latest](https://hub.docker.com/r/searxng/searxng) | [builder.dockerfile](https://github.com/searxng/searxng/blob/master/container/builder.dockerfile) [dist.dockerfile](https://github.com/searxng/searxng/blob/master/container/dist.dockerfile) | +| [Valkey](https://github.com/valkey-io/valkey) | In-memory database | [docker.io/valkey/valkey:8-alpine](https://hub.docker.com/r/valkey/valkey) | [Dockerfile](https://github.com/valkey-io/valkey-container/blob/mainline/Dockerfile.template) | + +## How to use it + +There are two ways to host SearXNG. The first one doesn't require any prior knowledge about self-hosting and thus is +recommended for beginners. It includes caddy as a reverse proxy and automatically deals with the TLS certificates for +you. The second one is recommended for more advanced users that already have their own reverse proxy (e.g. Nginx, +HAProxy, ...) and probably some other services running on their machine. The first few steps are the same for both +installation methods however. + +1. [Install docker](https://docs.docker.com/install/) +2. Get searxng-docker + +```shell +cd /usr/local +git clone https://github.com/searxng/searxng-docker.git +cd searxng-docker +``` + +3. Edit the [.env](https://github.com/searxng/searxng-docker/blob/master/.env) file to set the hostname and an email +4. Generate the secret key `sed -i "s|ultrasecretkey|$(openssl rand -hex 32)|g" searxng/settings.yml` + On a Mac: `sed -i '' "s|ultrasecretkey|$(openssl rand -hex 32)|g" searxng/settings.yml` +5. Edit [searxng/settings.yml](https://github.com/searxng/searxng-docker/blob/master/searxng/settings.yml) according to + your needs + +> [!NOTE] +> Windows users can use the following powershell script to generate the secret key: +> ```powershell +> $randomBytes = New-Object byte[] 32 +> (New-Object Security.Cryptography.RNGCryptoServiceProvider).GetBytes($randomBytes) +> $secretKey = -join ($randomBytes | ForEach-Object { "{0:x2}" -f $_ }) +> (Get-Content searxng/settings.yml) -replace 'ultrasecretkey', $secretKey | Set-Content searxng/settings.yml +> ``` + +### Method 1: With Caddy included (recommended for beginners) + +6. Run SearXNG in the background: `docker compose up -d` + +### Method 2: Bring your own reverse proxy (experienced users) + +6. Remove the caddy related parts in `docker-compose.yaml` such as the caddy service and its volumes. +7. Point your reverse proxy to the port set for the `searxng` service in `docker-compose.yml` (8080 by default). +8. Generate and configure the required TLS certificates with the reverse proxy of your choice. +9. Run SearXNG in the background: `docker compose up -d` + +> [!NOTE] +> You can change the port `searxng` listens on inside the docker container (e.g. if you want to operate in `host` +> network mode) with the `BIND_ADDRESS` environment variable (defaults to `[::]:8080`). The environment variable can be +> set directly inside `docker-compose.yaml`. + +## Troubleshooting - How to access the logs + +To access the logs from all the containers use: `docker compose logs -f`. + +To access the logs of one specific container: + +- Caddy: `docker compose logs -f caddy` +- SearXNG: `docker compose logs -f searxng` +- Valkey: `docker compose logs -f redis` + +### Start SearXNG with systemd + +You can skip this step if you don't use systemd. + +1. Copy the service template file: + ```sh + cp searxng-docker.service.template searxng-docker.service + ``` + +2. Edit the content of ```WorkingDirectory``` in the ```searxng-docker.service``` file (only if the installation path is + different from ```/usr/local/searxng-docker```) + +3. Enable the service: + ```sh + systemctl enable $(pwd)/searxng-docker.service + ``` + +4. Start the service: + ```sh + systemctl start searxng-docker.service + ``` + +**Note:** Ensure the service file path matches your installation directory before enabling it. + +## Multi Architecture Docker images + +Supported architecture: + +- amd64 +- arm64 +- arm/v7 + +## How to update ? + +To update the SearXNG stack: + +```sh +git pull +docker compose pull +docker compose up -d +``` + +Or the old way (with the old docker-compose version): + +```sh +git pull +docker-compose pull +docker-compose up -d +``` diff --git a/self_host/searxng-docker/docker-compose.yaml b/self_host/searxng-docker/docker-compose.yaml new file mode 100644 index 00000000..653023f8 --- /dev/null +++ b/self_host/searxng-docker/docker-compose.yaml @@ -0,0 +1,23 @@ +services: + searxng: + container_name: searxng + image: docker.io/searxng/searxng:latest + restart: unless-stopped + ports: + - "127.0.0.1:8080:8080" + volumes: + - ./searxng:/etc/searxng:rw + - searxng-data:/var/cache/searxng:rw + environment: + - SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/ + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "1" + # dns: + # - 8.8.8.8 + # - 8.8.4.4 + +volumes: + searxng-data: diff --git a/self_host/searxng-docker/searxng-docker.service.template b/self_host/searxng-docker/searxng-docker.service.template new file mode 100644 index 00000000..29a508c0 --- /dev/null +++ b/self_host/searxng-docker/searxng-docker.service.template @@ -0,0 +1,16 @@ +[Unit] +Description=SearXNG service +Requires=docker.service +After=docker.service + +[Service] +Restart=on-failure + +Environment=SEARXNG_DOCKERCOMPOSEFILE=docker-compose.yaml + +WorkingDirectory=/usr/local/searxng-docker +ExecStart=/usr/local/bin/docker compose -f ${SEARXNG_DOCKERCOMPOSEFILE} up --remove-orphans +ExecStop=/usr/local/bin/docker compose -f ${SEARXNG_DOCKERCOMPOSEFILE} down + +[Install] +WantedBy=multi-user.target diff --git a/self_host/searxng-docker/searxng/limiter.toml b/self_host/searxng-docker/searxng/limiter.toml new file mode 100644 index 00000000..14ca0c27 --- /dev/null +++ b/self_host/searxng-docker/searxng/limiter.toml @@ -0,0 +1,7 @@ +# This configuration file updates the default configuration file +# See https://github.com/searxng/searxng/blob/master/searx/limiter.toml + +[botdetection.ip_limit] +# activate advanced bot protection +# enable this when running the instance for a public usage on the internet +link_token = false diff --git a/self_host/searxng-docker/searxng/settings.yml b/self_host/searxng-docker/searxng/settings.yml new file mode 100644 index 00000000..64137b25 --- /dev/null +++ b/self_host/searxng-docker/searxng/settings.yml @@ -0,0 +1,40 @@ +# see https://docs.searxng.org/admin/settings/settings.html#settings-use-default-settings +use_default_settings: true +server: + # base_url is defined in the SEARXNG_BASE_URL environment variable, see .env and docker-compose.yml + secret_key: "d3ce536cad273a010ca43c7019873041efd3d94e152a1a5fb1f863686fac90a2" # change this! + limiter: false # enable this when running the instance for a public usage on the internet + image_proxy: true + bind_address: 0.0.0.0 + method: GET +redis: + url: redis://redis:6379/0 +engines: + - name: duckduckgo + disabled: false + - name: mojeek + disabled: false + - name: mullvadleta + disabled: false + - name: mullvadleta brave + disabled: false + - name: dictzone + disabled: true + - name: lingva + disabled: true + - name: mymemory translated + disabled: true + - name: bing + disabled: true + - name: google + disabled: true + - name: brave + disabled: true + - name: startpage + disabled: true + - name: currency + disabled: true + - name: wikidata + disabled: true + - name: wikipedia + disabled: true