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 +370 -79
- package/build/cli.cjs +1 -1
- package/build/cli.cjs.map +1 -1
- package/build/cli.mjs +1 -1
- package/build/cli.mjs.map +1 -1
- package/package.json +4 -4
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.
|
|
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
|
|
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="
|
|
15
|
-
<a href="
|
|
16
|
-
<a href="
|
|
17
|
-
<a href="
|
|
18
|
-
<a href="
|
|
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
|
-
##
|
|
47
|
+
## Quick Start
|
|
48
48
|
|
|
49
|
-
|
|
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
|
-
|
|
57
|
+
---
|
|
52
58
|
|
|
53
|
-
|
|
59
|
+
### Lingo.dev MCP
|
|
54
60
|
|
|
55
|
-
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
import type { NextConfig } from "next";
|
|
63
|
-
import { withLingo } from "@lingo.dev/compiler/next";
|
|
65
|
+
**Supported IDEs:**
|
|
64
66
|
|
|
65
|
-
|
|
67
|
+
- Claude Code
|
|
68
|
+
- Cursor
|
|
69
|
+
- GitHub Copilot Agents
|
|
70
|
+
- Codex (OpenAI)
|
|
66
71
|
|
|
67
|
-
|
|
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
|
-
|
|
74
|
+
- Next.js (App Router & Pages Router v13-16)
|
|
75
|
+
- TanStack Start (v1)
|
|
76
|
+
- React Router (v7)
|
|
77
77
|
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
168
|
+
### Lingo.dev CI/CD
|
|
110
169
|
|
|
111
|
-
|
|
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
|
-
|
|
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
|
-
|
|
192
|
+
translate:
|
|
120
193
|
runs-on: ubuntu-latest
|
|
121
194
|
steps:
|
|
122
195
|
- uses: actions/checkout@v4
|
|
123
|
-
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
289
|
+
// Translate HTML (preserves markup)
|
|
290
|
+
const html = await lingoDotDev.localizeHtml("<h1>Welcome</h1>", {
|
|
152
291
|
sourceLocale: "en",
|
|
153
|
-
targetLocale: "
|
|
292
|
+
targetLocale: "de",
|
|
154
293
|
});
|
|
155
|
-
|
|
294
|
+
|
|
295
|
+
// Detect language
|
|
296
|
+
const locale = await lingoDotDev.recognizeLocale("Bonjour le monde");
|
|
297
|
+
// "fr"
|
|
156
298
|
```
|
|
157
299
|
|
|
158
|
-
|
|
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
|
-
|
|
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
|
-
|
|
332
|
+
# Or use direct LLM providers (Groq, OpenAI, Anthropic, Google)
|
|
333
|
+
GROQ_API_KEY=your_key
|
|
334
|
+
```
|
|
167
335
|
|
|
168
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
[](https://www.star-history.com/#lingodotdev/lingo.dev&Date)
|
|
177
463
|
|
|
178
|
-
##
|
|
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
|
-
|
|
470
|
+
**Adding a new language:**
|
|
181
471
|
|
|
182
|
-
|
|
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
|
-
**
|
|
475
|
+
**BCP-47 locale format:** `language[-Script][-REGION]`
|
|
185
476
|
|
|
186
|
-
-
|
|
187
|
-
- Script
|
|
188
|
-
-
|
|
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.
|
|
15181
|
+
version: "0.129.0",
|
|
15182
15182
|
description: "Lingo.dev CLI",
|
|
15183
15183
|
private: false,
|
|
15184
15184
|
repository: {
|