Package: libretranslate
LibreTranslateTry it online!|API Docs|Community ForumFree 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 sourceArgos Translatelibrary.Try it online!|API DocsAPI ExamplesSimpleRequest:constres=awaitfetch("https://libretranslate.com/translate",{method:"POST",body:JSON.stringify({q:"Hello!",source:"en",target:"es"}),headers:{"Content-Type":"application/json"}});console.log(awaitres.json());Response:{"translatedText":"¡Hola!"}Auto Detect LanguageRequest:constres=awaitfetch("https://libretranslate.com/translate",{method:"POST",body:JSON.stringify({q:"Ciao!",source:"auto",target:"en"}),headers:{"Content-Type":"application/json"}});console.log(awaitres.json());Response:{"detectedLanguage":{"confidence":83,"language":"it"},"translatedText":"Bye!"}HTML (beta)Request:constres=awaitfetch("https://libretranslate.com/translate",{method:"POST",body:JSON.stringify({q:'<p class="green">Hello!</p>',source:"en",target:"es",format:"html"}),headers:{"Content-Type":"application/json"}});console.log(awaitres.json());Response:{"translatedText":"<p class=\"green\">¡Hola!</p>"}Install and RunYou can run your own API server with just a few lines of setup!Make sure you have Python installed (3.8 or higher is recommended), then simply run:pipinstalllibretranslate
libretranslate[args]Then open a web browser tohttp://localhost:5000On Ubuntu 20.04 you can also use the install script available athttps://github.com/argosopentech/LibreTranslate-initRun with DockerYou can also run the application withdocker:Linux/macOS./run.sh[args]Windowsrun.bat[args]Build and RunSeeCONTIRBUTING.mdfor information on how to build and run the project yourself.CUDAYou can use hardware acceleration to speed up translations on a GPU machine with CUDA 11.2 andnvidia-dockerinstalled.Run this version with:dockercompose-fdocker-compose.cuda.ymlup-d--buildArgumentsArguments passed to the process or set via environment variables are split into two kinds.Settings or runtime flags used to toggle specific runmodes or disable parts of the application. These act as toggle when added or removed.Configuration parameters to set various limits and configure the application. These require a parameter to be passed to function, if removed the default parameters are used.Settings / FlagsArgumentDescriptionDefault SettingEnv. name--debugEnable debug environmentDisabledLT_DEBUG--sslWhether to enable SSLDisabledLT_SSL--api-keysEnable API keys database for per-client rate limits when --req-limit is reachedDon't use API keysLT_API_KEYS--require-api-key-originRequire use of an API key for programmatic access to the API, unless the request origin matches this domainNo restrictions on domain originLT_REQUIRE_API_KEY_ORIGIN--require-api-key-secretRequire use of an API key for programmatic access to the API, unless the client also sends a secret matchNo secrets requiredLT_REQUIRE_API_KEY_SECRET--suggestionsAllow user suggestionsDisabledLT_SUGGESTIONS--disable-files-translationDisable files translationFile translation allowedLT_DISABLE_FILES_TRANSLATION--disable-web-uiDisable web uiWeb Ui enabledLT_DISABLE_WEB_UI--update-modelsUpdate language models at startupOnly on if no models foundLT_UPDATE_MODELS--metricsEnable the /metrics endpoint for exportingPrometheususage metricsDisabledLT_METRICSConfiguration ParametersArgumentDescriptionDefault ParameterEnv. name--hostSet host to bind the server to127.0.0.1LT_HOST--portSet port to bind the server to5000LT_PORT--char-limitSet character limitNo limitLT_CHAR_LIMIT--req-limitSet maximum number of requests per minute per client (outside of limits set by api keys)No limitLT_REQ_LIMIT--req-limit-storageStorage URI to use for request limit data storage. SeeFlask Limitermemory://LT_REQ_LIMIT_STORAGE--batch-limitSet maximum number of texts to translate in a batch requestNo limitLT_BATCH_LIMIT--ga-idEnable Google Analytics on the API client page by providing an IDEmpty (no tracking)LT_GA_ID--frontend-language-sourceSet frontend default language - sourceautoLT_FRONTEND_LANGUAGE_SOURCE--frontend-language-targetSet frontend default language - targetlocale(match site's locale)LT_FRONTEND_LANGUAGE_TARGET--frontend-timeoutSet frontend translation timeout500LT_FRONTEND_TIMEOUT--api-keys-db-pathUse a specific path inside the container for the local database. Can be absolute or relativedb/api_keys.dbLT_API_KEYS_DB_PATH--api-keys-remoteUse this remote endpoint to query for valid API keys instead of using the local databaseEmpty (use local db instead)LT_API_KEYS_REMOTE--get-api-key-linkShow a link in the UI where to direct users to get an API keyEmpty (no link shown on web ui)LT_GET_API_KEY_LINK--shared-storageShared storage URI to use for multi-process data sharing (e.g. when using gunicorn)memory://LT_SHARED_STORAGE--load-onlySet available languagesEmpty (use all from argostranslate)LT_LOAD_ONLY--threadsSet number of threads4LT_THREADS--metrics-auth-tokenProtect the /metrics endpoint by allowing only clients that have a valid Authorization Bearer tokenEmpty (no auth required)LT_METRICS_AUTH_TOKEN--url-prefixAdd prefix to URL: example.com:5000/url-prefix//LT_URL_PREFIXNotes:Each argument has an equivalent environment variable that can be used instead. The env. variables overwrite the default values but have lower priority than the command arguments and are particularly useful if used with Docker. The environment variable names are the upper-snake-case of the equivalent command argument's name with aLTprefix.To configure requirement for api key to use, set--req-limitto0and add the--api-keysflag. Requests made without a proper api key will be rejected.Setting--update-modelswill update models regardless of whether updates are available or not.UpdateSoftwareIf you installed with pip:pip install -U libretranslateIf you're using docker:docker pull libretranslate/libretranslateLanguage ModelsStart the program with the--update-modelsargument. For example:libretranslate --update-modelsor./run.sh --update-models.Alternatively you can also run thescripts/install_models.pyscript.Run with WSGI and Gunicornpipinstallgunicorn
gunicorn--bind0.0.0.0:5000'wsgi:app'You can pass application arguments directly to Gunicorn via:gunicorn--bind0.0.0.0:5000'wsgi:app(api_keys=True)'Kubernetes DeploymentSeeMedium article by JM Roblesand the improvedk8s.yamlby @rasos.Helm ChartBased on @rasos work you can now install LibreTranslate on Kubernetes using Helm.A Helm chart is now available in thehelm-chartrepository where you can find more details.You can quickly install LibreTranslate on Kubernetes using Helm with the following command:helmrepoaddlibretranslatehttps://libretranslate.github.io/helm-chart/
helmrepoupdate
helmsearchrepolibretranslate

helminstalllibretranslatelibretranslate/libretranslate--namespacelibretranslate--create-namespaceManage API KeysLibreTranslate supports per-user limit quotas, e.g. you can issue API keys to users so that they can enjoy higher requests limits per minute (if you also set--req-limit). By default all users are rate-limited based on--req-limit, but passing an optionalapi_keyparameter to the REST endpoints allows a user to enjoy higher request limits. You can also specify different character limits that bypass the default--char-limitvalue on a per-key basis.To use API keys simply start LibreTranslate with the--api-keysoption. If you modified the API keys database path with the option--api-keys-db-path, you must specify the path with the same argument flag when using theltmanage keyscommand.Add New KeysTo issue a new API key with 120 requests per minute limits:ltmanagekeysadd120To issue a new API key with 120 requests per minute and a maximum of 5,000 characters per request:ltmanagekeysadd120--char-limit5000If you changed the API keys database path:ltmanagekeys--api-keys-db-pathpath/to/db/dbName.dbadd120Remove Keysltmanagekeysremove<api-key>View KeysltmanagekeysPrometheus MetricsLibreTranslate has Prometheusexportercapabilities when you pass the--metricsargument at startup (disabled by default). When metrics are enabled, a/metricsendpoint is mounted on the instance:http://localhost:5000/metrics# HELP libretranslate_http_requests_in_flight Multiprocess metric# TYPE libretranslate_http_requests_in_flight gaugelibretranslate_http_requests_in_flight{api_key="",endpoint="/translate",request_ip="127.0.0.1"}0.0# HELP libretranslate_http_request_duration_seconds Multiprocess metric# TYPE libretranslate_http_request_duration_seconds summarylibretranslate_http_request_duration_seconds_count{api_key="",endpoint="/translate",request_ip="127.0.0.1",status="200"}0.0libretranslate_http_request_duration_seconds_sum{api_key="",endpoint="/translate",request_ip="127.0.0.1",status="200"}0.0You can then configureprometheus.ymlto read the metrics:scrape_configs:-job_name:"libretranslate"# Needed only if you use --metrics-auth-token#authorization:#credentials: "mytoken"static_configs:-targets:["localhost:5000"]To secure the/metricsendpoint you can also use--metrics-auth-token mytoken.If you use Gunicorn, make sure to create a directory for storing multiprocess data metrics and setPROMETHEUS_MULTIPROC_DIR:mkdir-p/tmp/prometheus_data
rm/tmp/prometheus_data/*exportPROMETHEUS_MULTIPROC_DIR=/tmp/prometheus_data
gunicorn-cscripts/gunicorn_conf.py--bind0.0.0.0:5000'wsgi:app(metrics=True)'Language BindingsYou can use the LibreTranslate API using the following bindings:Rust:https://github.com/DefunctLizard/libretranslate-rsNode.js:https://github.com/franciscop/translate.Net:https://github.com/sigaloid/LibreTranslate.NetGo:https://github.com/SnakeSel/libretranslatePython:https://github.com/argosopentech/LibreTranslate-pyPHP:https://github.com/jefs42/libretranslateC++:https://github.com/argosopentech/LibreTranslate-cppSwift:https://github.com/wacumov/libretranslateUnix:https://github.com/argosopentech/LibreTranslate-shShell:https://github.com/Hayao0819/Hayao-Tools/tree/master/libretranslate-shJava:https://github.com/suuft/libretranslate-javaRuby:https://github.com/noesya/libretranslateDiscourse PluginYou can use theofficial discourse translator pluginto translateDiscoursetopics with LibreTranslate. To install it simply modify/var/discourse/containers/app.yml:## Plugins go here## see https://meta.discourse.org/t/19157 for detailshooks:after_code:-exec:cd:$home/pluginscmd:-git clone https://github.com/discourse/docker_manager.git-git clone https://github.com/discourse/discourse-translator...Then issue./launcher rebuild app. From the Discourse's admin panel then select "LibreTranslate" as a translation provider and set the relevant endpoint configurations.See it in action on thispage.Mobile AppsLibreTranslatoris an Android appavailable on the Play Storeandin the F-Droid storethat uses the LibreTranslate API.LiTranslateis an iOS appavailable on the App Storethat uses the LibreTranslate API.Web browserminbrowseris a web browser withintegrated LibreTranslate support.A LibreTranslate Firefox addon iscurrently a work in progress.MirrorsThis is a list of public LibreTranslate instances, some require an API key. If you want to add a new URL, please open a pull request.URLAPI Key RequiredLinkslibretranslate.com:heavy_check_mark:[Get API Key] [Service Status]translate.terraprint.co-trans.zillyhuhn.com-libretranslate.eownerdead.dedyn.io-TOR/i2p MirrorsURLlt.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onionlt.vern.i2pAdding New Language ModelsYou have two options to create new language models:LocomotiveArgos Train(video tutorial)Most of the training data is fromOpus, which is an open source parallel corpus. Check alsoNLLULocalizationThe LibreTranslate Web UI is available in all the languages for which LibreTranslate can translate to. It can also (roughly)translate itself!Some languages might not appear in the UI since they haven't been reviewed by a human yet. You can enable all languages by turning on--debugmode.To help improve or review the UI translations:Go tohttps://hosted.weblate.org/projects/libretranslate/app/#translations. All changes are automatically pushed to this repository.Once all strings have been reviewed/edited, open a pull request and changelibretranslate/locales/{code}/meta.json:{"name":"<Language>","reviewed":true<--Changethisfromfalsetotrue}UI LanguagesLanguageReviewedWeblate LinkArabicEditAzerbaijaniEditChineseEditChinese (Traditional)EditCzech:heavy_check_mark:EditDanishEditDutchEditEnglish:heavy_check_mark:EditEsperanto:heavy_check_mark:EditFinnishEditFrench:heavy_check_mark:EditGerman:heavy_check_mark:EditGreekEditHebrewEditHindiEditHungarianEditIndonesianEditIrishEditItalian:heavy_check_mark:EditJapaneseEditKabyleEditKorean:heavy_check_mark:EditOccitanEditPersianEditPolishEditPortuguese:heavy_check_mark:EditRussian:heavy_check_mark:EditSlovakEditSpanish:heavy_check_mark:EditSwedishEditTurkishEditUkranian:heavy_check_mark:EditVietnameseEditRoadmapHelp us by opening a pull request!Language bindings for every computer languageImproved translationsAny other idea is welcome also.FAQCan I use your API server at libretranslate.com for my application in production?In short, yes,but only if you buy an API key. You can always run LibreTranslate for free on your own server of course.Some translations on libretranslate.com are different than the self-hosted ones. Why?By default language models are loaded from theargos-index. Sometimes we deploy models on libretranslate.com that haven't been added to the argos-index yet, such as those converted from OPUS (thread)Can I use LibreTranslate behind a reverse proxy, like Apache2 or Caddy?Yes, here are config examples for Apache2 and Caddy that redirect a subdomain (with HTTPS certificate) to LibreTranslate running on a docker at localhost.sudodockerrun-ti--rm-p127.0.0.1:5000:5000libretranslate/libretranslateYou can remove127.0.0.1on the above command if you want to be able to access it fromdomain.tld:5000, in addition tosubdomain.domain.tld(this can be helpful to determine if there is an issue with Apache2 or the docker container).Add--restart unless-stoppedif you want this docker to start on boot, unless manually stopped.Apache configReplace [YOUR_DOMAIN] with your full domain; for example,translate.domain.tldorlibretranslate.domain.tld.Remove#on the ErrorLog and CustomLog lines to log requests.#Libretranslate#Redirect http to https<VirtualHost*:80>ServerNamehttp://[YOUR_DOMAIN]Redirect/https://[YOUR_DOMAIN]# ErrorLog ${APACHE_LOG_DIR}/error.log# CustomLog ${APACHE_LOG_DIR}/tr-access.log combined</VirtualHost>#https<VirtualHost*:443>ServerNamehttps://[YOUR_DOMAIN]ProxyPass/http://127.0.0.1:5000/ProxyPassReverse/http://127.0.0.1:5000/ProxyPreserveHostOnSSLEngineonSSLCertificateFile/etc/letsencrypt/live/[YOUR_DOMAIN]/fullchain.pemSSLCertificateKeyFile/etc/letsencrypt/live/[YOUR_DOMAIN]/privkey.pemSSLCertificateChainFile/etc/letsencrypt/live/[YOUR_DOMAIN]/fullchain.pem# ErrorLog ${APACHE_LOG_DIR}/tr-error.log# CustomLog ${APACHE_LOG_DIR}/tr-access.log combined</VirtualHost>Add this to an existing site config, or a new file in/etc/apache2/sites-available/new-site.confand runsudo a2ensite new-site.conf.To get a HTTPS subdomain certificate, installcertbot(snap), runsudo certbot certonly --manual --preferred-challenges dnsand enter your information (withsubdomain.domain.tldas the domain). Add a DNS TXT record with your domain registrar when asked. This will save your certificate and key to/etc/letsencrypt/live/{subdomain.domain.tld}/. Alternatively, comment the SSL lines out if you don't want to use HTTPS.Caddy configReplace [YOUR_DOMAIN] with your full domain; for example,translate.domain.tldorlibretranslate.domain.tld.#Libretranslate
[YOUR_DOMAIN] {
  reverse_proxy localhost:5000
}Add this to an existing Caddyfile or save it asCaddyfilein any directory and runsudo caddy reloadin that same directory.NGINX configReplace [YOUR_DOMAIN] with your full domain; for example,translate.domain.tldorlibretranslate.domain.tld.Remove#on theaccess_loganderror_loglines to disable logging.server {
  listen 80;
  server_name [YOUR_DOMAIN];
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 http2 ssl;
  server_name [YOUR_DOMAIN];

  #access_log off;
  #error_log off;

  # SSL Section
  ssl_certificate /etc/letsencrypt/live/[YOUR_DOMAIN]/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/[YOUR_DOMAIN]/privkey.pem;

  ssl_protocols TLSv1.2 TLSv1.3;

  # Using the recommended cipher suite from: 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;  # about 40000 sessions
  ssl_session_tickets off;

  # Specifies a curve for ECDHE ciphers.
  ssl_ecdh_curve prime256v1;
  # Server should determine the ciphers, not the client
  ssl_prefer_server_ciphers on;


  # Header section
  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; mode=block" always;
  add_header X-Content-Type-Options     "nosniff"       always;
  add_header X-Download-Options         "noopen"        always;
  add_header X-Robots-Tag               "none"          always;

  add_header Feature-Policy             "microphone 'none'; camera 'none'; geolocation 'none';"  always;
  # Newer header but not everywhere supported
  add_header Permissions-Policy         "microphone=(), camera=(), geolocation=()" always;

  # Remove X-Powered-By, which is an information leak
  fastcgi_hide_header X-Powered-By;

  # Do not send nginx server header
  server_tokens off;

  # GZIP Section
  gzip on;
  gzip_disable "msie6";

  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_min_length 256;
  gzip_types text/xml text/javascript font/ttf font/eot font/otf application/x-javascript application/atom+xml application/javascript application/json application/manifest+json application/rss+xml application/x-web-app-manifest+json application/xhtml+xml application/xml image/svg+xml image/x-icon text/css text/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;
  }
}Add this to an existing NGINX config or save it aslibretranslatein the/etc/nginx/site-enableddirectory and runsudo nginx -s reload.Can I do batch translations?Yes, pass an array of strings instead of a string to theqfield:constres=awaitfetch("https://libretranslate.com/translate",{method:"POST",body:JSON.stringify({q:["Hello","world"],source:"en",target:"es"}),headers:{"Content-Type":"application/json"}});console.log(awaitres.json());// {//     "translatedText": [//         "Hola",//         "mundo"//     ]// }CreditsThis work is largely possible thanks toArgos Translate, which powers the translation engine.LicenseGNU Affero General Public License v3TrademarkSeeTrademark Guidelines