{"id":43562589,"url":"https://github.com/tuist/l10n","last_synced_at":"2026-02-11T18:01:23.951Z","repository":{"id":336270499,"uuid":"1148055333","full_name":"tuist/l10n","owner":"tuist","description":"Agentic localization for software projects","archived":false,"fork":false,"pushed_at":"2026-02-03T22:22:38.000Z","size":247,"stargazers_count":4,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-04T05:44:00.763Z","etag":null,"topics":["l10n","localization"],"latest_commit_sha":null,"homepage":"https://l10n.tuist.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tuist.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-02T14:25:01.000Z","updated_at":"2026-02-04T02:11:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tuist/l10n","commit_stats":null,"previous_names":["tuist/l10n"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/tuist/l10n","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuist%2Fl10n","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuist%2Fl10n/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuist%2Fl10n/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuist%2Fl10n/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tuist","download_url":"https://codeload.github.com/tuist/l10n/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuist%2Fl10n/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29340382,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T16:14:43.024Z","status":"ssl_error","status_checked_at":"2026-02-11T16:14:15.258Z","response_time":97,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["l10n","localization"],"created_at":"2026-02-03T21:08:21.932Z","updated_at":"2026-02-11T18:01:23.945Z","avatar_url":"https://github.com/tuist.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# l10n 🌍\n\n\u003e [!WARNING]\n\u003e This project is in an **experimental phase**. APIs and behavior may change without notice. Please don't expect high responsiveness to issues or pull requests.\n\nLocalize like you ship software. `l10n` is a Rust CLI that translates files locally using LLMs, keeps content in-repo, and validates output with your own tooling.\n\n## Install 📦\n\n```bash\nmise use github:tuist/l10n\n```\n\nOr build from source:\n\n```bash\ncargo build --release\n```\n\n## Quick start 🚀\n\nRun `l10n init` for a guided setup, or create a `L10N.md` at the repo root with TOML frontmatter:\n\n```markdown\n+++\n[llm]\nprovider = \"openai\"\n\n[[llm.agent]]\nrole = \"coordinator\"\nmodel = \"gpt-4o-mini\"\n\n[[llm.agent]]\nrole = \"translator\"\nmodel = \"gpt-4o\"\n\n[[translate]]\nsource = \"docs/*.md\"\ntargets = [\"es\", \"de\"]\noutput = \"docs/i18n/{lang}/{relpath}\"\n+++\n\nProject context for translators goes here.\n```\n\nTranslate:\n\n```bash\nl10n translate\n```\n\nCheck what’s stale:\n\n```bash\nl10n status\n```\n\nValidate outputs:\n\n```bash\nl10n check\n```\n\n## Configuration ⚙️\n\n### `L10N.md` frontmatter\n\n- `[[translate]]` entries (required)\n  - `source` or `path` (required): glob, relative to the `L10N.md` directory\n  - `targets` (required): list of locales\n  - `output` (required): template using `{lang}`, `{relpath}`, `{basename}`, `{ext}`\n  - `exclude` (optional): list of globs to skip\n  - `preserve` (optional): list of preserve categories (`code_blocks`, `inline_code`, `urls`, `placeholders`, or `none`)\n  - `frontmatter` (optional): `preserve` or `translate` (Markdown only)\n  - `check_cmd` (optional): external check command template (uses `{path}`)\n  - `check_cmds` (optional): map of format → command\n  - `retries` (optional): retry count when validation fails\n\n### LLM config\n\n```toml\n[llm]\nprovider = \"openai\" # openai | vertex | anthropic | custom\nbase_url = \"https://api.openai.com/v1\" # optional for openai\napi_key_env = \"OPENAI_API_KEY\"\n# or api_key = \"{{env.OPENAI_API_KEY}}\"\n\n[[llm.agent]]\nrole = \"coordinator\"\nmodel = \"gpt-4o-mini\"\n\n[[llm.agent]]\nrole = \"translator\"\nmodel = \"gpt-4o\"\n\n[llm.headers]\n# Authorization = \"Bearer env:YOUR_TOKEN\"\n```\n\nYou can also set different providers per agent:\n\n```toml\n[[llm.agent]]\nrole = \"coordinator\"\nprovider = \"vertex\"\nbase_url = \"https://aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/endpoints/ENDPOINT\"\nmodel = \"gemma-2\"\n\n[[llm.agent]]\nrole = \"translator\"\nprovider = \"openai\"\nmodel = \"gpt-4o\"\n```\n\nIf the translator provider is omitted, it inherits the coordinator provider and connection settings.\n\n- `provider = \"vertex\"` uses the OpenAI‑compatible `chat.completions` endpoint.\n- `provider = \"anthropic\"` uses the Messages API (`/v1/messages`) and `x-api-key` auth.\n- `chat_completions_path` defaults to `/chat/completions` (OpenAI/Vertex) or `/v1/messages` (Anthropic).\n\n### Output paths\n\n`{relpath}` is the path relative to the source glob’s base directory. Example:\n\n```\nsource = \"docs/guide/*.md\"\noutput = \"docs/i18n/{lang}/{relpath}\"\n```\n\n`docs/guide/intro.md` → `docs/i18n/es/intro.md`\n\n### Language‑specific context\n\nAdd optional language context next to any `L10N.md`:\n\n```\nL10N.md\nL10N/\n  es.md\n  ja.md\n```\n\nContext is additive per language: general `L10N.md` bodies plus matching `L10N/\u003clang\u003e.md` bodies from root to nearest.\n\n### Translation state\n\nPer‑file lockfiles are written to `.l10n/locks/` and include source hash plus per‑language context hashes and output metadata.\n\n## Commands ⌨️\n\n- `l10n init` — initialize a repo with a starter `L10N.md`\n- `l10n translate` — generate translations (YOLO by default)\n- `l10n check` — validate outputs (fails if missing)\n- `l10n status` — report missing/stale outputs\n- `l10n clean` — remove generated outputs and lockfiles (`--orphans` removes outputs from stale lockfiles)\n\nUse `--no-color` or set `NO_COLOR=1` to disable styled output.\nUse `--path \u003cdir\u003e` to run commands as if you were in a different directory.\n\n## Development 🧪\n\n```bash\ncargo test\n```\n\nFor the website:\n\n```bash\ncd site\nnpm install\nnpm run dev\n```\n\n## License 📄\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuist%2Fl10n","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftuist%2Fl10n","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuist%2Fl10n/lists"}