This plugin adds automatic article translation to Tiny Tiny RSS using any LibreTranslate-compatible REST API (e.g. LibreTranslate, Argos Translate, TranslateLocally). It can optionally add translated titles and replace original content inline, providing a smoother reading experience for multilingual feeds.
- Automatic translation: Translate article bodies on view, or request translation manually.
- Title translation: Extend translation to article titles with selectable display (append or replace).
- Flexible display: Choose to append translations under the original text or replace the article content entirely.
- LibreTranslate-compatible: Works with self-hosted instances (recommended) or public endpoints.
- Language detection aware: Skips translation if the detected language already matches your target.
- TT-RSS 2024.XX or newer (Plugin API v2).
- PHP with curl/Guzzle (available in standard TT-RSS containers).
- A LibreTranslate-compatible service reachable from the TT-RSS backend (examples below).
-
Clone or drop this plugin into
plugins.local/auto_translate/. -
Enable the plugin:
- For system-wide usage, add
auto_translateto theTTRSS_PLUGINSenvironment variable (e.g. in.env) or the advanced configuration as a system plugin. - For per-user usage, enable it in Preferences → Plugins.
- For system-wide usage, add
-
Restart the TT-RSS containers if running under Docker so the environment variable change is loaded:
docker compose restart app updater web-nginx
Open Preferences → Preferences → Article auto-translation to configure:
| Option | Description |
|---|---|
| Service URL | Base URL of your LibreTranslate-compatible API (e.g. http://translate). |
| API key | Optional API key for services requiring authentication. |
| Target language | ISO-639-1 code of your preferred language (e.g. en, de). |
| Mode | Translate automatically and append or Translate manually. |
| Display translated content | Append translation below original content, or replace the article content inline. |
| Translate article titles | Toggle title translation. |
| Display translated titles | Append translated titles under the original or replace the headline text (with a translate icon indicator). |
translate:
image: libretranslate/libretranslate:latest
restart: unless-stopped
environment:
LT_LOAD_ONLY: "en,es,fr,de,nl,ru"
LT_UPDATE_MODELS: "true"
LT_HOST: "0.0.0.0"
LT_PORT: "80"
ports:
- "5000:80"
volumes:
- argos_translate_data:/root/.local/share/argos-translatePoint the plugin at http://translate inside the Docker network (default). For host access, use http://localhost:5000.
- Add the service: Drop the snippet above into the
services:section of your maindocker-compose.ymlalongside the TT-RSS containers. Keep theargos_translate_datanamed volume (defined at the bottom) so downloaded models persist across restarts. - Match your networks: If your stack defines custom networks, attach the
translateservice to the same network as the TT-RSSappcontainer. Otherwise the default network is sufficient and no extra configuration is required. - Expose or hide the API: The service maps to port
80internally and5000externally by default. Override the public port withTRANSLATE_PORT=<port>in your.envfile (e.g.TRANSLATE_PORT=5555) or remove theportsentry if you only want in-cluster access. - Start the translator: Run
docker compose up -d translate(ordocker-compose up -d translate) from your stack directory. First boot downloads language models to the named volume and can take several minutes; track progress withdocker compose logs -f translate. - Wire it into the plugin: Once the container reports
Server is runningin the logs, set the plugin's Service URL tohttp://translate(orhttp://localhost:<port>if you kept the public mapping) and save the preferences.
- Translation requests happen on-demand per article; results are cached client-side during the session.
- A subtle translate icon (
material-icons) marks translated sections and titles. Tooltips show language hints. - The plugin sanitizes translation responses and removes
SC_ON/SC_OFFmarkers returned by some services. - Manual translation is available via the article toolbar button when automatic mode is disabled.
- “Requested URL failed extended validation.” Ensure the translation service listens on port 80 or 443; TT-RSS blocks non-standard ports for security reasons. Map your container to host port 5000 but keep the internal service on 80.
- 401/403 errors: Supply the API key if your service requires one.
- Translation skipped: The detected input language already matches your target; adjust the target language or disable detection by setting
sourceto your desired language in the plugin code. - Service unreachable: Verify network connectivity from the TT-RSS backend container (
docker compose exec app curl http://translate/languageswith curl installed).
MIT License © 2024 — see repository root if bundled.
- Original implementation: Derek Linz