2020-12-19 20:19:35 +01:00
# LibreTranslate
2020-12-20 21:52:02 +01:00
2020-12-21 00:56:05 +01:00
[Try it online! ](https://libretranslate.com ) | [API Docs ](https://libretranslate.com/docs )
2021-02-10 01:01:24 +01:00
[![Python versions ](https://img.shields.io/pypi/pyversions/libretranslate )](https://pypi.org/project/libretranslate) [![Run tests ](https://github.com/uav4geo/LibreTranslate/workflows/Run%20tests/badge.svg )](https://github.com/uav4geo/LibreTranslate/actions?query=workflow%3A%22Run+tests%22) [![Publish to DockerHub ](https://github.com/uav4geo/LibreTranslate/workflows/Publish%20to%20DockerHub/badge.svg )](https://hub.docker.com/r/libretranslate/libretranslate) [![Publish to GitHub Container Registry ](https://github.com/uav4geo/LibreTranslate/workflows/Publish%20to%20GitHub%20Container%20Registry/badge.svg )](https://github.com/uav4geo/LibreTranslate/actions?query=workflow%3A%22Publish+to+GitHub+Container+Registry%22)
2020-12-29 19:13:40 +01:00
2021-01-02 18:17:11 +01:00
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.
2020-12-20 21:52:02 +01:00
![image ](https://user-images.githubusercontent.com/1951843/102724116-32a6df00-42db-11eb-8cc0-129ab39cdfb5.png )
2020-12-20 22:04:48 +01:00
[Try it online! ](https://libretranslate.com ) | [API Docs ](https://libretranslate.com/docs )
2020-12-20 21:52:02 +01:00
2020-12-20 22:13:38 +01:00
## API Examples
Request:
```javascript
const res = await fetch("https://libretranslate.com/translate", {
method: "POST",
body: JSON.stringify({
q: "Hello!",
source: "en",
target: "es"
}),
2021-01-15 18:12:00 +01:00
headers: { "Content-Type": "application/json" }
2021-01-15 18:13:42 +01:00
});
2020-12-20 22:13:38 +01:00
console.log(await res.json());
```
Response:
```javascript
{
"translatedText": "¡Hola!"
}
```
2021-02-09 14:17:06 +01:00
## Install and Run
2020-12-20 21:52:02 +01:00
2020-12-20 22:13:38 +01:00
You can run your own API server in just a few lines of setup!
2021-02-10 01:01:24 +01:00
Make sure you have installed Python (3.8 or higher is recommended), then simply issue:
2020-12-20 21:52:02 +01:00
2021-02-09 14:17:06 +01:00
```bash
pip install libretranslate
libretranslate [args]
```
Then open a web browser to http://localhost:5000
2021-02-09 21:20:46 +01:00
If you're on Windows, we recommend you [Run with Docker ](#run-with-docker ) instead.
2021-02-09 14:17:06 +01:00
## Build and Run
If you want to make some changes to the code, you can build from source, and run the API:
2020-12-20 21:52:02 +01:00
```bash
2021-02-09 01:24:34 +01:00
git clone https://github.com/uav4geo/LibreTranslate
2020-12-20 21:52:02 +01:00
cd LibreTranslate
2021-02-09 14:17:06 +01:00
pip install -e .
libretranslate [args]
2021-02-10 17:05:23 +01:00
# Or
python main.py [args]
2020-12-20 21:52:02 +01:00
```
2020-12-20 22:13:38 +01:00
Then open a web browser to http://localhost:5000
2020-12-21 19:39:53 +01:00
### Run with Docker
2020-12-29 16:55:53 +01:00
Simply run:
```bash
docker run -ti --rm -p 5000:5000 libretranslate/libretranslate
```
Then open a web browser to http://localhost:5000
### Build with Docker
2020-12-21 19:39:53 +01:00
```bash
docker build -t libretranslate .
```
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/uav4geo/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.
2020-12-20 21:52:02 +01:00
## Arguments
| Argument | Description | Default |
| ------------- | ------------------------------ | -------------------- |
| --host | Set host to bind the server to | `127.0.0.1` |
| --port | Set port to bind the server to | `5000` |
| --char-limit | Set character limit | `No limit` |
| --req-limit | Set maximum number of requests per minute per client | `No limit` |
2021-01-19 18:53:53 +01:00
| --batch-limit | Set maximum number of texts to translate in a batch request | `No limit` |
2020-12-20 21:52:02 +01:00
| --ga-id | Enable Google Analytics on the API client page by providing an ID | `No tracking` |
| --debug | Enable debug environment | `False` |
2020-12-21 00:56:46 +01:00
| --ssl | Whether to enable SSL | `False` |
2021-01-10 09:15:55 +01:00
| --frontend-language-source | Set frontend default language - source | `en` |
| --frontend-language-target | Set frontend default language - target | `es` |
2021-01-28 17:20:13 +01:00
| --frontend-timeout | Set frontend translation timeout | `500` |
2021-02-15 19:30:28 +01:00
| --offline | Run user-interface entirely offline (don't use internet CDNs) | `false` |
| --api-keys | Enable API keys database for per-user rate limits lookup | `Don't use API keys` |
2020-12-20 21:52:02 +01:00
2021-02-15 19:30:28 +01:00
## Manage API Keys
LibreTranslate 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 optional `api_key` parameter to the REST endpoints allows a user to enjoy higher request limits.
To use API keys simply start LibreTranslate with the `--api-keys` option.
### Add New Keys
To issue a new API key with 120 requests per minute limits:
```bash
ltmanage keys add 120
```
### Remove Keys
```bash
ltmanage keys remove < api-key >
```
### View Keys
```bash
ltmanage keys
```
2020-12-20 21:52:02 +01:00
2021-02-26 15:07:02 +01:00
## Language Bindings
You can use the LibreTranslate API using the following bindings:
- Rust: https://github.com/DefunctLizard/libretranslate-rs
2021-02-27 16:27:14 +01:00
- Node.js: https://github.com/franciscop/translate
2021-03-03 15:20:19 +01:00
- .Net: https://github.com/sigaloid/LibreTranslate.Net
2021-02-26 15:07:02 +01:00
More coming soon!
2020-12-20 21:52:02 +01:00
## Roadmap
Help us by opening a pull request!
2020-12-21 20:31:50 +01:00
- [x] A docker image (thanks [@vemonet ](https://github.com/vemonet ) !)
2021-01-15 18:15:03 +01:00
- [x] Auto-detect input language (thanks [@vemonet ](https://github.com/vemonet ) !)
2021-02-15 19:30:28 +01:00
- [X] User authentication / tokens
2020-12-21 19:55:14 +01:00
- [ ] Language bindings for every computer language
2020-12-20 21:52:02 +01:00
2021-01-10 15:55:26 +01:00
## FAQ
### Can I use your API server at libretranslate.com for my application in production?
2021-02-15 19:30:28 +01:00
The API on libretranslate.com should be used for testing, personal or infrequent use. If you're going to run an application in production, please [get in touch ](https://uav4geo.com/contact ) to get an API key or discuss other options.
2021-01-10 15:55:26 +01:00
2021-02-26 17:19:02 +01:00
### Can I use this behind a reverse proxy, like Apache2?
Yes, here is an example Apache2 config that redirects a subdomain (with HTTPS certificate) to LibreTranslate running on a docker at localhost.
```
sudo docker run -ti --rm -p 127.0.0.1:5000:5000 libretranslate/libretranslate
```
You can remove `127.0.0.1` on the above command if you want to be able to access it from `domain.tld:5000` , in addition to `subdomain.domain.tld` (this can be helpful to determine if there is an issue with Apache2 or the docker container).
Add `--restart unless-stopped` if you want this docker to start on boot, unless manually stopped.
< details >
< summary > Apache config< / summary >
< br >
2021-02-26 17:24:58 +01:00
Replace [YOUR_DOMAIN] with your full domain; for example, `translate.domain.tld` or `libretranslate.domain.tld` .
2021-02-26 17:19:02 +01:00
Remove `#` on the ErrorLog and CustomLog lines to log requests.
2021-02-26 17:24:58 +01:00
2021-02-26 17:19:02 +01:00
```ApacheConf
#Libretranslate
#Redirect http to https
< VirtualHost * :80 >
ServerName http://[YOUR_DOMAIN]
Redirect / https://[YOUR_DOMAIN]
# ErrorLog ${APACHE_LOG_DIR}/error.log
# CustomLog ${APACHE_LOG_DIR}/tr-access.log combined
< / VirtualHost >
#https
< VirtualHost * :443 >
ServerName https://[YOUR_DOMAIN]
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/[YOUR_DOMAIN]/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/[YOUR_DOMAIN]/privkey.pem
SSLCertificateChainFile /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.conf` and run `sudo a2ensite new-site.conf` .
2021-02-26 17:24:58 +01:00
To get a HTTPS subdomain certificate, install `certbot` (snap), run `sudo certbot certonly --manual --preferred-challenges dns` and enter your information (with `subdomain.domain.tld` as 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.
2021-02-26 17:19:02 +01:00
< / details >
2020-12-20 21:52:02 +01:00
## Credits
This work is largely possible thanks to [Argos Translate ](https://github.com/argosopentech/argos-translate ), which powers the translation engine.
## License
2020-12-21 00:56:05 +01:00
[GNU Affero General Public License v3 ](https://www.gnu.org/licenses/agpl-3.0.en.html )