{"id":49146415,"url":"https://github.com/l10n-dev/strapi-plugin-ai-translator","last_synced_at":"2026-04-22T04:04:45.171Z","repository":{"id":351055011,"uuid":"1204093389","full_name":"l10n-dev/strapi-plugin-ai-translator","owner":"l10n-dev","description":"Strapi v5 plugin to translate i18n content with l10n.dev AI translation service directly from the Admin Panel","archived":false,"fork":false,"pushed_at":"2026-04-13T13:01:24.000Z","size":5,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T13:21:41.238Z","etag":null,"topics":["ai","i18n","internationalization","l10n","localization","multilanguage","strapi","strapi-admin-panel","strapi-cms","strapi-plugin","strapi-v5","strapi5","strapijs","translation","translator"],"latest_commit_sha":null,"homepage":"https://l10n.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/l10n-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-07T17:25:04.000Z","updated_at":"2026-04-13T13:15:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/l10n-dev/strapi-plugin-ai-translator","commit_stats":null,"previous_names":["l10n-dev/strapi-plugin-ai-translator"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/l10n-dev/strapi-plugin-ai-translator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/l10n-dev%2Fstrapi-plugin-ai-translator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/l10n-dev%2Fstrapi-plugin-ai-translator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/l10n-dev%2Fstrapi-plugin-ai-translator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/l10n-dev%2Fstrapi-plugin-ai-translator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/l10n-dev","download_url":"https://codeload.github.com/l10n-dev/strapi-plugin-ai-translator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/l10n-dev%2Fstrapi-plugin-ai-translator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32120408,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T00:31:26.853Z","status":"online","status_checked_at":"2026-04-22T02:00:05.693Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","i18n","internationalization","l10n","localization","multilanguage","strapi","strapi-admin-panel","strapi-cms","strapi-plugin","strapi-v5","strapi5","strapijs","translation","translator"],"created_at":"2026-04-22T04:04:25.668Z","updated_at":"2026-04-22T04:04:45.166Z","avatar_url":"https://github.com/l10n-dev.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Strapi Plugin - AI Translator (l10n.dev)\r\n\r\n[![npm version](https://img.shields.io/npm/v/strapi-plugin-ai-translator.svg)](https://www.npmjs.com/package/strapi-plugin-ai-translator)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\r\n\r\nTranslate your Strapi v5 i18n content with l10n.dev [AI localization](https://l10n.dev) service - directly from the Admin Panel. Supports bulk auto translation, per-field translation, and a side-by-side editor for reviewing and editing results. The AI engine understands context, supports 165 languages, preserves formatting and structure, and follows grammar and plural form rules - producing natural, human-like translations.\r\n\r\n**30,000 characters free every month** - no credit card required.\r\n\r\n---\r\n\r\n## Features\r\n\r\n- **Main Dashboard** — See all your i18n-enabled Content Types at a glance with translation progress per target language.\r\n- **Bulk Auto-translate** — Select multiple Content Types and translate them all with one click. Parallel processing with real-time progress bar.\r\n- **Translate button in Content Manager** — A \"Translate from {language}\" button appears directly in the entry edit panel when you switch to a non-default locale. Translate the current entry without leaving the Content Manager.\r\n- **Side-by-Side Editor** — Click \"Edit\" on any Content Type to open a split view: read-only source on the left, editable target on the right. Translate, revert, or manually edit per field.\r\n- **Per-field Translate** — Translate individual fields without touching the rest.\r\n- **Incremental Mode** — Only translate new/changed entries, saving your character quota.\r\n- **Usage Tracking** — Monitor usage and remaining balance.\r\n- **Persistent Preferences** — Selected target language, incremental toggle, and category selections are saved across sessions.\r\n- **Localized UI** — The plugin interface is available in 11 languages. It follows the language you select in your Strapi profile.\r\n\r\n---\r\n\r\n## Screenshots\r\n\r\n| Dashboard | Side-by-Side Editor |\r\n|-----------|-------------------|\r\n| ![Dashboard](docs/screenshots/dashboard.png) | ![Editor](docs/screenshots/editor.jpg) |\r\n\r\n---\r\n\r\n## Installation\r\n\r\n### 1. Install the package\r\n\r\n```bash\r\nnpm install strapi-plugin-ai-translator\r\n# or\r\nyarn add strapi-plugin-ai-translator\r\n```\r\n\r\n### 2. Enable the plugin\r\n\r\nAdd to your Strapi project's `config/plugins.ts` (or `config/plugins.js`):\r\n\r\n**TypeScript** (`config/plugins.ts`):\r\n```ts\r\nexport default () =\u003e ({\r\n  'ai-translator': {\r\n    enabled: true,\r\n  },\r\n});\r\n```\r\n\r\n**JavaScript** (`config/plugins.js`):\r\n```js\r\n'use strict';\r\n\r\nmodule.exports = () =\u003e ({\r\n  'ai-translator': {\r\n    enabled: true,\r\n  },\r\n});\r\n```\r\n\r\n### 3. Rebuild and start\r\n\r\n```bash\r\nnpm run build\r\nnpm run develop\r\n```\r\n\r\n---\r\n\r\n## Configuration\r\n\r\n### Get your API Key\r\n\r\n1. Go to [l10n.dev/ws/keys](https://l10n.dev/ws/keys) and create a free API key.\r\n2. Open the Strapi Admin Panel and navigate to **L10n.dev - AI Translator** in the sidebar.\r\n3. You will see a **\"Paste your l10n.dev API key to start translating\"** input at the top of the page.\r\n4. Paste your key into the field and click **\"Save\"**.\r\n5. The plugin is ready to use.\r\n\r\n\u003e To update the key later, find the **\"API key configured\"** label at the top of the dashboard and click **\"Change\"**.\r\n\r\n### Plugin Settings (stored in Strapi)\r\n\r\n| Setting | Description | Default |\r\n|---------|-------------|---------|\r\n| `apiKey` | Your l10n.dev API key | _(empty)_ |\r\n| `incremental` | Only translate new/changed entries | `true` |\r\n| `lastTargetLocale` | Remembers your last selected target language | _(auto)_ |\r\n| `selectedCategories` | Remembers which Content Types are checked for bulk translate | `[]` |\r\n\r\nAll settings are managed through the Admin Panel UI — no file-based configuration needed.\r\n\r\n---\r\n\r\n## Usage\r\n\r\n### Prerequisites\r\n\r\n- **Strapi i18n plugin** must be enabled (ships with Strapi by default).\r\n- At least **two locales** must be configured in Settings → Internationalization.\r\n- Content Types you want to translate must have **\"Enable localization for this content-type\"** turned on, with individual fields marked as localizable.\r\n\r\n\u003e **Important — per-field localization required.** Each field you want translated must have `\"pluginOptions\": { \"i18n\": { \"localized\": true } }` set in its schema. Without this, Strapi treats the field as shared across all locales — saving a translation would overwrite the source locale. When you enable localization for a Content Type through the Content-Type Builder UI, this is set automatically. If you edit schemas manually or use a Strapi CLI-generated project, verify each translatable field is marked accordingly. See the [Strapi i18n documentation](https://docs.strapi.io/cms/features/internationalization) for details.\r\n\r\n### Dashboard\r\n\r\n1. Open **L10n.dev - AI Translator** from the sidebar.\r\n2. Select your **target language** from the dropdown.\r\n3. The table shows all i18n-enabled Content Types with their translation status (e.g., \"17/17\", \"0/39\").\r\n4. Check the boxes for the Content Types you want to translate, then click **\"Auto-translate\"**.\r\n5. A progress bar shows real-time translation status.\r\n\r\n### Translate from Content Manager\r\n\r\n1. Open any i18n-enabled Content Type entry in the **Content Manager**.\r\n2. Switch to a **non-default locale** using the locale picker in the top-right.\r\n3. A **\"Translate from {language}\"** button appears in the right panel (e.g. \"Translate from English\").\r\n4. Click it — all localizable fields are translated.\r\n5. Review and save when ready.\r\n\r\n\u003e The button is hidden when you are already viewing the default locale.\r\n\r\n### Side-by-Side Editor\r\n\r\n1. Click **\"Edit\"** (pencil icon) on any Content Type row.\r\n2. Browse entries in the left sidebar; select one to see its fields.\r\n3. Each field shows the source text (read-only) on the left and the editable target on the right.\r\n4. Use **\"Translate\"** to AI-translate a single field, or **\"Revert\"** to undo changes.\r\n5. Click **\"Save\"** to persist all changes back to Strapi.\r\n\r\n### Incremental Mode\r\n\r\nWhen enabled, entries that are already up-to-date are skipped entirely, saving your character quota. For entries where the source has been updated since the last translation, all fields are retranslated — Strapi does not track which specific field changed. To translate or edit a single field independently, open the entry in the [Editor](#side-by-side-editor).\r\n\r\n---\r\n\r\n## API Endpoints\r\n\r\nAll endpoints are admin-authenticated (`admin::isAuthenticatedAdmin`) and prefixed with `/ai-translator`.\r\n\r\n| Method | Path | Description |\r\n|--------|------|-------------|\r\n| `GET` | `/settings` | Get plugin settings |\r\n| `PUT` | `/settings` | Update plugin settings |\r\n| `GET` | `/content-types` | List i18n Content Types with translation stats |\r\n| `GET` | `/content-types/:uid/entries` | List entries for a Content Type |\r\n| `GET` | `/content-types/:uid/entries/:documentId` | Get single entry with source/target fields |\r\n| `POST` | `/translate` | Translate a single field of an entry |\r\n| `POST` | `/translate/bulk` | Start bulk translation (auto translation) |\r\n| `POST` | `/translate/save` | Save translated fields to Strapi |\r\n| `GET` | `/translate/status` | Poll bulk translation progress |\r\n| `POST` | `/translate/cancel` | Cancel a running bulk translation |\r\n\r\n---\r\n\r\n## Compatibility\r\n\r\n| Dependency | Version |\r\n|------------|---------|\r\n| Strapi | `^5.0.0` |\r\n| Node.js | `\u003e=18.0.0` |\r\n| `@strapi/design-system` | `^2.0.0` |\r\n| `ai-l10n-core` | `^1.4.1` |\r\n\r\n\u003e This plugin is **Strapi v5 only**. It is not compatible with Strapi v4.\r\n\r\n---\r\n\r\n## How it works\r\n\r\n1. The plugin introspects your Strapi content types at runtime to find those with i18n localization enabled.\r\n2. For each localizable field (`string`, `text`, `richtext`, `blocks`, `email`), it extracts the source-language value and sends it to the [ai translation API](https://api.l10n.dev/doc) via the [`ai-l10n-core`](https://www.npmjs.com/package/ai-l10n-core) client library.\r\n3. Translated fields are saved as **draft** entries in Strapi via the Document Service API. You publish them using Strapi's native publish workflow.\r\n4. The API key and preferences are stored securely in Strapi's plugin store — never exposed to the client in full.\r\n\r\n---\r\n\r\n## Pricing\r\n\r\n- **Free tier** — 30,000 characters free every month, no credit card required.\r\n- **Pay-as-you-go** — Affordable character-based pricing with no subscription required.\r\n- **Current rates** — Visit [l10n.dev/#pricing](https://l10n.dev/#pricing) for up-to-date pricing.\r\n\r\n---\r\n\r\n## Privacy \u0026 Security\r\n\r\n- **Secure API keys** — Stored in Strapi's plugin store, never exposed to the browser in full.\r\n- **No data retention** — Source text and translations are not stored on l10n.dev servers beyond the time needed to process the request.\r\n- **Encrypted communication** — All API calls use HTTPS.\r\n- **Privacy first** — Built by developers for developers, with privacy, reliability, and quality as core priorities.\r\n\r\n---\r\n\r\n## Support\r\n\r\n| | |\r\n|---|---|\r\n| 📧 Email | [support@l10n.dev](mailto:support@l10n.dev) |\r\n| 🐛 Issues | [GitHub Issues](https://github.com/l10n-dev/strapi-plugin-ai-translator/issues) |\r\n| 📚 API Docs | [api.l10n.dev/doc](https://api.l10n.dev/doc) |\r\n| 🌐 Website | [l10n](https://l10n.dev).dev |\r\n\r\n---\r\n\r\n## Localization\r\n\r\nThe plugin interface is translated into the following languages:\r\n\r\n| Code | Language |\r\n|------|----------|\r\n| `en` | English (default) |\r\n| `de` | German |\r\n| `es` | Spanish |\r\n| `fr` | French |\r\n| `id` | Indonesian |\r\n| `it` | Italian |\r\n| `ja` | Japanese |\r\n| `ko` | Korean |\r\n| `pt` | Portuguese (Brazil) |\r\n| `zh-CN` | Chinese (Simplified) |\r\n| `zh-TW` | Chinese (Traditional) |\r\n\r\nTo switch the plugin UI language:\r\n\r\n1. Click your avatar in the top-right corner of the Strapi admin panel and go to **Profile**.\r\n2. Under **Preferences → Interface language**, select your language.\r\n3. The plugin UI (labels, messages, notifications) will display in the chosen language immediately.\r\n\r\nTo make these languages available in the profile picker, add them to your project's `src/admin/app.js`:\r\n\r\n```js\r\nexport default {\r\n  config: {\r\n    locales: ['de', 'es', 'fr', 'id', 'it', 'ja', 'ko', 'pt', 'zh-CN', 'zh-TW'],\r\n  },\r\n  bootstrap() {},\r\n};\r\n```\r\n\r\n---\r\n\r\n## License\r\n\r\n[MIT](LICENSE) — see the [LICENSE](LICENSE) file for details.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fl10n-dev%2Fstrapi-plugin-ai-translator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fl10n-dev%2Fstrapi-plugin-ai-translator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fl10n-dev%2Fstrapi-plugin-ai-translator/lists"}