lingo.dev 0.128.0 → 0.129.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,21 +1,21 @@
1
1
  <p align="center">
2
2
  <a href="https://lingo.dev">
3
- <img src="https://raw.githubusercontent.com/lingodotdev/lingo.dev/main/content/banner.compiler.png" width="100%" alt="Lingo.dev" />
3
+ <img src="https://raw.githubusercontent.com/lingodotdev/lingo.dev/main/content/banner.png" width="100%" alt="Lingo.dev" />
4
4
  </a>
5
5
  </p>
6
6
 
7
7
  <p align="center">
8
- <strong>⚡ Lingo.dev - open-source, AI-powered i18n toolkit for instant localization with LLMs.</strong>
8
+ <strong>Lingo.dev - Open-source i18n toolkit for LLM-powered localization</strong>
9
9
  </p>
10
10
 
11
11
  <br />
12
12
 
13
13
  <p align="center">
14
- <a href="https://lingo.dev/compiler">Lingo.dev Compiler</a> •
15
- <a href="https://lingo.dev/mcp">Lingo.dev MCP</a> •
16
- <a href="https://lingo.dev/cli">Lingo.dev CLI</a> •
17
- <a href="https://lingo.dev/ci">Lingo.dev CI/CD</a> •
18
- <a href="https://lingo.dev/sdk">Lingo.dev SDK</a>
14
+ <a href="#lingodev-mcp">MCP</a> •
15
+ <a href="#lingodev-cli">CLI</a> •
16
+ <a href="#lingodev-cicd">CI/CD</a> •
17
+ <a href="#lingodev-sdk">SDK</a> •
18
+ <a href="#lingodev-compiler">Compiler</a>
19
19
  </p>
20
20
 
21
21
  <p align="center">
@@ -44,146 +44,437 @@
44
44
 
45
45
  ---
46
46
 
47
- ## Meet the Compiler 🆕
47
+ ## Quick Start
48
48
 
49
- **Lingo.dev Compiler** is a free, open-source compiler middleware, designed to make any React app multilingual at build time without requiring any changes to the existing React components.
49
+ | Tool | Use Case | Quick Command |
50
+ | ---------------------------------- | --------------------------------------------------- | ---------------------------------- |
51
+ | [**MCP**](#lingodev-mcp) | AI-assisted i18n setup for React apps | Prompt: `Set up i18n` |
52
+ | [**CLI**](#lingodev-cli) | Translate JSON, YAML, markdown, CSV, PO files | `npx lingo.dev@latest run` |
53
+ | [**CI/CD**](#lingodev-cicd) | Automated translation pipeline in GitHub Actions | `uses: lingodotdev/lingo.dev@main` |
54
+ | [**SDK**](#lingodev-sdk) | Runtime translation for dynamic content | `npm install lingo.dev` |
55
+ | [**Compiler**](#lingodev-compiler) | Build-time React localization without i18n wrappers | `withLingo()` plugin |
50
56
 
51
- > **Note:** If you're using the legacy compiler (`@lingo.dev/_compiler`), please migrate to `@lingo.dev/compiler`. The legacy compiler is deprecated and will be removed in a future release.
57
+ ---
52
58
 
53
- Install once:
59
+ ### Lingo.dev MCP
54
60
 
55
- ```bash
56
- npm install @lingo.dev/compiler
57
- ```
61
+ Setting up i18n in React apps is notoriously error-prone - even for experienced developers. AI coding assistants make it worse: they hallucinate non-existent APIs, forget middleware configurations, break routing, or implement half a solution before getting lost. The problem is that i18n setup requires a precise sequence of coordinated changes across multiple files (routing, middleware, components, configuration), and LLMs struggle to maintain that context.
58
62
 
59
- Enable in your build config:
63
+ Lingo.dev MCP solves this by giving AI assistants structured access to framework-specific i18n knowledge. Instead of guessing, your assistant follows verified implementation patterns for Next.js, React Router, and TanStack Start.
60
64
 
61
- ```ts
62
- import type { NextConfig } from "next";
63
- import { withLingo } from "@lingo.dev/compiler/next";
65
+ **Supported IDEs:**
64
66
 
65
- const nextConfig: NextConfig = {};
67
+ - Claude Code
68
+ - Cursor
69
+ - GitHub Copilot Agents
70
+ - Codex (OpenAI)
66
71
 
67
- export default async function (): Promise<NextConfig> {
68
- return await withLingo(nextConfig, {
69
- sourceLocale: "en",
70
- targetLocales: ["es", "fr"],
71
- models: "lingo.dev",
72
- });
73
- }
74
- ```
72
+ **Supported frameworks:**
75
73
 
76
- Run `next build` and watch Spanish and French bundles pop out ✨
74
+ - Next.js (App Router & Pages Router v13-16)
75
+ - TanStack Start (v1)
76
+ - React Router (v7)
77
77
 
78
- [Read the docs →](https://lingo.dev/compiler) for the full guide, and [Join our Discord](https://lingo.dev/go/discord) to get help with your setup.
78
+ **Usage:**
79
79
 
80
- ---
80
+ After configuring the MCP server in your IDE ([see quickstart guides](https://lingo.dev/en/mcp)), prompt your assistant:
81
81
 
82
- ### What's inside this repo?
82
+ ```
83
+ Set up i18n with the following locales: en, es, and pt-BR. The default locale is 'en'.
84
+ ```
85
+
86
+ The assistant will:
83
87
 
84
- | Tool | TL;DR | Docs |
85
- | ------------ | ------------------------------------------------------------------------------ | --------------------------------------- |
86
- | **Compiler** | Build-time React localization | [/compiler](https://lingo.dev/compiler) |
87
- | **CLI** | One-command localization for web and mobile apps, JSON, YAML, markdown, + more | [/cli](https://lingo.dev/cli) |
88
- | **CI/CD** | Auto-commit translations on every push + create pull requests if needed | [/ci](https://lingo.dev/ci) |
89
- | **SDK** | Realtime translation for user-generated content | [/sdk](https://lingo.dev/sdk) |
88
+ 1. Configure locale-based routing (e.g., `/en`, `/es`, `/pt-BR`)
89
+ 2. Set up language switching components
90
+ 3. Implement automatic locale detection
91
+ 4. Generate necessary configuration files
90
92
 
91
- Below are the quick hits for each 👇
93
+ **Note:** AI-assisted code generation is non-deterministic. Review generated code before committing.
94
+
95
+ [Read the docs →](https://lingo.dev/en/mcp)
92
96
 
93
97
  ---
94
98
 
95
- ### ⚡️ Lingo.dev CLI
99
+ ### Lingo.dev CLI
100
+
101
+ Keeping translations in sync is tedious. You add a new string, forget to translate it, ship broken UI to international users. Or you send JSON files to translators, wait days, then manually merge their work back. Scaling to 10+ languages means managing hundreds of files that constantly drift out of sync.
96
102
 
97
- Translate code & content straight from your terminal.
103
+ Lingo.dev CLI automates this. Point it at your translation files, run one command, and every locale updates. A lockfile tracks what's already translated, so you only pay for new or changed content. Supports JSON, YAML, CSV, PO files, and markdown.
104
+
105
+ **Setup:**
98
106
 
99
107
  ```bash
108
+ # Initialize project
109
+ npx lingo.dev@latest init
110
+
111
+ # Run translations
100
112
  npx lingo.dev@latest run
101
113
  ```
102
114
 
103
- It fingerprints every string, caches results, and only re-translates what changed.
115
+ **How it works:**
116
+
117
+ 1. Extracts translatable content from configured files
118
+ 2. Sends content to LLM provider for translation
119
+ 3. Writes translated content back to filesystem
120
+ 4. Creates `i18n.lock` file to track completed translations (avoids redundant processing)
121
+
122
+ **Configuration:**
123
+
124
+ The `init` command generates an `i18n.json` file. Configure locales and buckets:
125
+
126
+ ```json
127
+ {
128
+ "$schema": "https://lingo.dev/schema/i18n.json",
129
+ "version": "1.10",
130
+ "locale": {
131
+ "source": "en",
132
+ "targets": ["es", "fr", "de"]
133
+ },
134
+ "buckets": {
135
+ "json": {
136
+ "include": ["locales/[locale].json"]
137
+ }
138
+ }
139
+ }
140
+ ```
104
141
 
105
- [Follow the docs →](https://lingo.dev/cli) to learn how to set it up.
142
+ The `provider` field is optional (defaults to Lingo.dev Engine). For custom LLM providers:
143
+
144
+ ```json
145
+ {
146
+ "provider": {
147
+ "id": "openai",
148
+ "model": "gpt-4o-mini",
149
+ "prompt": "Translate from {source} to {target}"
150
+ }
151
+ }
152
+ ```
153
+
154
+ **Supported LLM providers:**
155
+
156
+ - Lingo.dev Engine (recommended)
157
+ - OpenAI
158
+ - Anthropic
159
+ - Google
160
+ - Mistral
161
+ - OpenRouter
162
+ - Ollama
163
+
164
+ [Read the docs →](https://lingo.dev/en/cli)
106
165
 
107
166
  ---
108
167
 
109
- ### 🔄 Lingo.dev CI/CD
168
+ ### Lingo.dev CI/CD
110
169
 
111
- Ship perfect translations automatically.
170
+ Translations are the feature that's always "almost done." Engineers merge code without updating locales. QA catches missing translations in staging - or worse, users catch them in production. The root cause: translation is a manual step that's easy to skip under deadline pressure.
112
171
 
113
- ```yaml
114
- # .github/workflows/i18n.yml
115
- name: Lingo.dev i18n
116
- on: [push]
172
+ Lingo.dev CI/CD makes translations automatic. Every push triggers translation. Missing strings get filled before code reaches production. No discipline required - the pipeline handles it.
117
173
 
174
+ **Supported platforms:**
175
+
176
+ - GitHub Actions
177
+ - GitLab CI/CD
178
+ - Bitbucket Pipelines
179
+
180
+ **GitHub Actions setup:**
181
+
182
+ Create `.github/workflows/translate.yml`:
183
+
184
+ ```yaml
185
+ name: Translate
186
+ on:
187
+ push:
188
+ branches: [main]
189
+ permissions:
190
+ contents: write
118
191
  jobs:
119
- i18n:
192
+ translate:
120
193
  runs-on: ubuntu-latest
121
194
  steps:
122
195
  - uses: actions/checkout@v4
123
- - uses: lingodotdev/lingo.dev@main
196
+ - name: Lingo.dev
197
+ uses: lingodotdev/lingo.dev@main
124
198
  with:
125
199
  api-key: ${{ secrets.LINGODOTDEV_API_KEY }}
126
200
  ```
127
201
 
128
- Keeps your repo green and your product multilingual without the manual steps.
202
+ **Setup requirements:**
203
+
204
+ 1. Add `LINGODOTDEV_API_KEY` to repository secrets (Settings > Secrets and variables > Actions)
205
+ 2. For PR workflows: Enable "Allow GitHub Actions to create and approve pull requests" in Settings > Actions > General
206
+
207
+ **Workflow options:**
208
+
209
+ Commit translations directly:
210
+
211
+ ```yaml
212
+ uses: lingodotdev/lingo.dev@main
213
+ with:
214
+ api-key: ${{ secrets.LINGODOTDEV_API_KEY }}
215
+ ```
216
+
217
+ Create pull requests with translations:
218
+
219
+ ```yaml
220
+ uses: lingodotdev/lingo.dev@main
221
+ with:
222
+ api-key: ${{ secrets.LINGODOTDEV_API_KEY }}
223
+ pull-request: true
224
+ env:
225
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
226
+ ```
227
+
228
+ **Available inputs:**
229
+
230
+ | Input | Default | Description |
231
+ | -------------------- | ---------------------------------------------- | ---------------------------------------- |
232
+ | `api-key` | (required) | Lingo.dev API key |
233
+ | `pull-request` | `false` | Create PR instead of committing directly |
234
+ | `commit-message` | `"feat: update translations via @LingoDotDev"` | Custom commit message |
235
+ | `pull-request-title` | `"feat: update translations via @LingoDotDev"` | Custom PR title |
236
+ | `working-directory` | `"."` | Directory to run in |
237
+ | `parallel` | `false` | Enable parallel processing |
129
238
 
130
- [Read the docs →](https://lingo.dev/ci)
239
+ [Read the docs →](https://lingo.dev/en/ci/github)
131
240
 
132
241
  ---
133
242
 
134
- ### 🧩 Lingo.dev SDK
243
+ ### Lingo.dev SDK
244
+
245
+ Static translation files work for UI labels, but what about user-generated content? Chat messages, product descriptions, support tickets - content that doesn't exist at build time can't be pre-translated. You're stuck showing untranslated text or building a custom translation pipeline.
246
+
247
+ Lingo.dev SDK translates content at runtime. Pass any text, object, or HTML and get back a localized version. Works for real-time chat, dynamic notifications, or any content that arrives after deployment. Available for JavaScript, PHP, Python, and Ruby.
248
+
249
+ **Installation:**
250
+
251
+ ```bash
252
+ npm install lingo.dev
253
+ ```
135
254
 
136
- Instant per-request translation for dynamic content.
255
+ **Usage:**
137
256
 
138
257
  ```ts
139
258
  import { LingoDotDevEngine } from "lingo.dev/sdk";
140
259
 
141
260
  const lingoDotDev = new LingoDotDevEngine({
142
- apiKey: "your-api-key-here",
261
+ apiKey: process.env.LINGODOTDEV_API_KEY,
262
+ });
263
+
264
+ // Translate objects (preserves structure)
265
+ const translated = await lingoDotDev.localizeObject(
266
+ { greeting: "Hello", farewell: "Goodbye" },
267
+ { sourceLocale: "en", targetLocale: "es" },
268
+ );
269
+ // { greeting: "Hola", farewell: "Adiós" }
270
+
271
+ // Translate text
272
+ const text = await lingoDotDev.localizeText("Hello!", {
273
+ sourceLocale: "en",
274
+ targetLocale: "fr",
275
+ });
276
+
277
+ // Translate to multiple languages at once
278
+ const results = await lingoDotDev.batchLocalizeText("Hello!", {
279
+ sourceLocale: "en",
280
+ targetLocales: ["es", "fr", "de"],
143
281
  });
144
282
 
145
- const content = {
146
- greeting: "Hello",
147
- farewell: "Goodbye",
148
- message: "Welcome to our platform",
149
- };
283
+ // Translate chat (preserves speaker names)
284
+ const chat = await lingoDotDev.localizeChat(
285
+ [{ name: "Alice", text: "Hello!" }],
286
+ { sourceLocale: "en", targetLocale: "es" },
287
+ );
150
288
 
151
- const translated = await lingoDotDev.localizeObject(content, {
289
+ // Translate HTML (preserves markup)
290
+ const html = await lingoDotDev.localizeHtml("<h1>Welcome</h1>", {
152
291
  sourceLocale: "en",
153
- targetLocale: "es",
292
+ targetLocale: "de",
154
293
  });
155
- // Returns: { greeting: "Hola", farewell: "Adiós", message: "Bienvenido a nuestra plataforma" }
294
+
295
+ // Detect language
296
+ const locale = await lingoDotDev.recognizeLocale("Bonjour le monde");
297
+ // "fr"
156
298
  ```
157
299
 
158
- Perfect for chat, user comments, and other real-time flows.
300
+ **Available SDKs:**
301
+
302
+ - [JavaScript SDK](https://lingo.dev/en/sdk/javascript) - Web apps, Node.js
303
+ - [PHP SDK](https://lingo.dev/en/sdk/php) - PHP, Laravel
304
+ - [Python SDK](https://lingo.dev/en/sdk/python) - Django, Flask
305
+ - [Ruby SDK](https://lingo.dev/en/sdk/ruby) - Rails
159
306
 
160
- [Read the docs →](https://lingo.dev/sdk)
307
+ [Read the docs →](https://lingo.dev/en/sdk)
161
308
 
162
309
  ---
163
310
 
164
- ## 🤝 Community
311
+ ### Lingo.dev Compiler
312
+
313
+ Traditional i18n is invasive. You wrap every string in `t()` functions, invent translation keys (`home.hero.title.v2`), maintain parallel JSON files, and watch your components bloat with localization boilerplate. It's so tedious that teams delay internationalization until it becomes a massive refactor.
314
+
315
+ Lingo.dev Compiler eliminates the ceremony. Write React components with plain English text. The compiler detects translatable strings at build time and generates localized variants automatically. No keys, no JSON files, no wrapper functions - just React code that happens to work in multiple languages.
316
+
317
+ **Installation:**
318
+
319
+ ```bash
320
+ pnpm install @lingo.dev/compiler
321
+ ```
322
+
323
+ **Authentication:**
324
+
325
+ ```bash
326
+ # Recommended: Sign up at lingo.dev and login
327
+ npx lingo.dev@latest login
328
+
329
+ # Alternative: Add API key to .env
330
+ LINGODOTDEV_API_KEY=your_key_here
165
331
 
166
- We're community-driven and love contributions!
332
+ # Or use direct LLM providers (Groq, OpenAI, Anthropic, Google)
333
+ GROQ_API_KEY=your_key
334
+ ```
167
335
 
168
- - Got an idea? [Open an issue](https://github.com/lingodotdev/lingo.dev/issues)
169
- - Want to fix something? [Send a PR](https://github.com/lingodotdev/lingo.dev/pulls)
170
- - Need help? [Join our Discord](https://lingo.dev/go/discord)
336
+ **Configuration (Next.js):**
171
337
 
172
- ## ⭐ Star History
338
+ ```ts
339
+ // next.config.ts
340
+ import type { NextConfig } from "next";
341
+ import { withLingo } from "@lingo.dev/compiler/next";
342
+
343
+ const nextConfig: NextConfig = {};
344
+
345
+ export default async function (): Promise<NextConfig> {
346
+ return await withLingo(nextConfig, {
347
+ sourceRoot: "./app",
348
+ sourceLocale: "en",
349
+ targetLocales: ["es", "fr", "de"],
350
+ models: "lingo.dev",
351
+ dev: { usePseudotranslator: true },
352
+ });
353
+ }
354
+ ```
355
+
356
+ **Configuration (Vite):**
357
+
358
+ ```ts
359
+ // vite.config.ts
360
+ import { lingoCompilerPlugin } from "@lingo.dev/compiler/vite";
361
+
362
+ export default defineConfig({
363
+ plugins: [
364
+ lingoCompilerPlugin({
365
+ sourceRoot: "src",
366
+ sourceLocale: "en",
367
+ targetLocales: ["es", "fr", "de"],
368
+ models: "lingo.dev",
369
+ dev: { usePseudotranslator: true },
370
+ }),
371
+ react(),
372
+ ],
373
+ });
374
+ ```
173
375
 
174
- If you like what we're doing, give us a ⭐ and help us reach 10,000 stars! 🌟
376
+ **Provider setup:**
377
+
378
+ ```tsx
379
+ // app/layout.tsx (Next.js)
380
+ import { LingoProvider } from "@lingo.dev/compiler/react";
381
+
382
+ export default function RootLayout({ children }) {
383
+ return (
384
+ <LingoProvider>
385
+ <html>
386
+ <body>{children}</body>
387
+ </html>
388
+ </LingoProvider>
389
+ );
390
+ }
391
+ ```
392
+
393
+ **Language switcher:**
394
+
395
+ ```tsx
396
+ import { useLocale, setLocale } from "@lingo.dev/compiler/react";
397
+
398
+ export function LanguageSwitcher() {
399
+ const locale = useLocale();
400
+ return (
401
+ <select value={locale} onChange={(e) => setLocale(e.target.value)}>
402
+ <option value="en">English</option>
403
+ <option value="es">Español</option>
404
+ </select>
405
+ );
406
+ }
407
+ ```
408
+
409
+ **Development:** `npm run dev` (uses pseudotranslator, no API calls)
410
+
411
+ **Production:** Set `usePseudotranslator: false`, then `next build`
412
+
413
+ Commit the `.lingo/` directory to version control.
414
+
415
+ **Key features:**
416
+
417
+ - Zero runtime performance cost
418
+ - No translation keys or JSON files
419
+ - No `t()` functions or `<T>` wrapper components
420
+ - Automatic detection of translatable text in JSX
421
+ - TypeScript support
422
+ - ICU MessageFormat for plurals
423
+ - Manual overrides via `data-lingo-override` attribute
424
+ - Built-in translation editor widget
425
+
426
+ **Build modes:**
427
+
428
+ - `pseudotranslator`: Development mode with placeholder translations (no API costs)
429
+ - `real`: Generate actual translations using LLMs
430
+ - `cache-only`: Production mode using pre-generated translations from CI (no API calls)
431
+
432
+ **Supported frameworks:**
433
+
434
+ - Next.js (App Router with React Server Components)
435
+ - Vite + React (SPA and SSR)
436
+
437
+ Additional framework support planned.
438
+
439
+ [Read the docs →](https://lingo.dev/en/compiler)
440
+
441
+ ---
442
+
443
+ ## Contributing
444
+
445
+ Contributions welcome. Please follow these guidelines:
446
+
447
+ 1. **Issues:** [Report bugs or request features](https://github.com/lingodotdev/lingo.dev/issues)
448
+ 2. **Pull Requests:** [Submit changes](https://github.com/lingodotdev/lingo.dev/pulls)
449
+ - Every PR requires a changeset: `pnpm new` (or `pnpm new:empty` for non-release changes)
450
+ - Ensure tests pass before submitting
451
+ 3. **Development:** This is a pnpm + turborepo monorepo
452
+ - Install dependencies: `pnpm install`
453
+ - Run tests: `pnpm test`
454
+ - Build: `pnpm build`
455
+
456
+ **Support:** [Discord community](https://lingo.dev/go/discord)
457
+
458
+ ## Star History
459
+
460
+ If you find Lingo.dev useful, give us a star and help us reach 10,000 stars!
175
461
 
176
462
  [![Star History Chart](https://api.star-history.com/svg?repos=lingodotdev/lingo.dev&type=Date)](https://www.star-history.com/#lingodotdev/lingo.dev&Date)
177
463
 
178
- ## 🌐 Readme in other languages
464
+ ## Localized Documentation
465
+
466
+ **Available translations:**
467
+
468
+ [English](https://github.com/lingodotdev/lingo.dev) • [中文](/readme/zh-Hans.md) • [日本語](/readme/ja.md) • [한국어](/readme/ko.md) • [Español](/readme/es.md) • [Français](/readme/fr.md) • [Русский](/readme/ru.md) • [Українська](/readme/uk-UA.md) • [Deutsch](/readme/de.md) • [Italiano](/readme/it.md) • [العربية](/readme/ar.md) • [עברית](/readme/he.md) • [हिन्दी](/readme/hi.md) • [Português (Brasil)](/readme/pt-BR.md) • [বাংলা](/readme/bn.md) • [فارسی](/readme/fa.md) • [Polski](/readme/pl.md) • [Türkçe](/readme/tr.md) • [اردو](/readme/ur.md) • [भोजपुरी](/readme/bho.md) • [অসমীয়া](/readme/as-IN.md) • [ગુજરાતી](/readme/gu-IN.md) • [मराठी](/readme/mr-IN.md) • [ଓଡ଼ିଆ](/readme/or-IN.md) • [ਪੰਜਾਬੀ](/readme/pa-IN.md) • [සිංහල](/readme/si-LK.md) • [தமிழ்](/readme/ta-IN.md) • [తెలుగు](/readme/te-IN.md)
179
469
 
180
- [English](https://github.com/lingodotdev/lingo.dev) [中文](/readme/zh-Hans.md) • [日本語](/readme/ja.md) • [한국어](/readme/ko.md) • [Español](/readme/es.md) • [Français](/readme/fr.md) • [Русский](/readme/ru.md) • [Українська](/readme/uk-UA.md) • [Deutsch](/readme/de.md) • [Italiano](/readme/it.md) • [العربية](/readme/ar.md) • [עברית](/readme/he.md) • [हिन्दी](/readme/hi.md) • [Português (Brasil)](/readme/pt-BR.md) • [বাংলা](/readme/bn.md) • [فارسی](/readme/fa.md) • [Polski](/readme/pl.md) • [Türkçe](/readme/tr.md) • [اردو](/readme/ur.md) • [भोजपुरी](/readme/bho.md) • [অসমীয়া](/readme/as-IN.md) • [ગુજરાતી](/readme/gu-IN.md) • [മലയാളം (IN)](/readme/ml-IN.md) • [मराठी](/readme/mr-IN.md) • [ଓଡ଼ିଆ](/readme/or-IN.md) • [ਪੰਜਾਬੀ](/readme/pa-IN.md) • [සිංහල](/readme/si-LK.md) • [தமிழ்](/readme/ta-IN.md) • [తెలుగు](/readme/te-IN.md)
470
+ **Adding a new language:**
181
471
 
182
- Don't see your language? Add it to [`i18n.json`](./i18n.json) and open a PR!
472
+ 1. Add locale code to [`i18n.json`](./i18n.json) using [BCP-47 format](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale)
473
+ 2. Submit a pull request
183
474
 
184
- **Locale format:** Use [BCP-47](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) codes: `language[-Script][-REGION]`
475
+ **BCP-47 locale format:** `language[-Script][-REGION]`
185
476
 
186
- - Language: ISO 639-1/2/3 lowercase (`en`, `zh`, `bho`)
187
- - Script: ISO 15924 title case (`Hans`, `Hant`, `Latn`)
188
- - Region: ISO 3166-1 alpha-2 uppercase (`US`, `CN`, `IN`)
477
+ - `language`: ISO 639-1/2/3 (lowercase): `en`, `zh`, `bho`
478
+ - `Script`: ISO 15924 (title case): `Hans`, `Hant`, `Latn`
479
+ - `REGION`: ISO 3166-1 alpha-2 (uppercase): `US`, `CN`, `IN`
189
480
  - Examples: `en`, `pt-BR`, `zh-Hans`, `sr-Cyrl-RS`
package/build/cli.cjs CHANGED
@@ -15178,7 +15178,7 @@ async function renderHero2() {
15178
15178
  // package.json
15179
15179
  var package_default = {
15180
15180
  name: "lingo.dev",
15181
- version: "0.128.0",
15181
+ version: "0.129.0",
15182
15182
  description: "Lingo.dev CLI",
15183
15183
  private: false,
15184
15184
  repository: {