CLI podporuje monorepa nativně. Můžete použít jeden i18n.json v kořeni s rekurzivním globem ** pro automatické objevování balíčků, jednu kořenovou konfiguraci s explicitními cestami pro jednotlivé balíčky nebo samostatné soubory i18n.json v každém balíčku v kombinaci s GitHub Action s maticovou strategií.
Kdy který způsob použít#
| Scénář | Způsob | Konfigurační soubory | GitHub Action |
|---|---|---|---|
| Všechny balíčky mají stejné rozvržení i jazyky a chcete, aby se nové balíčky přidávaly automaticky | Jedna rekurzivní konfigurace | Jeden i18n.json v kořeni s globem ** | Jeden krok, výchozí working-directory |
| Všechny balíčky sdílejí zdrojový i cílové jazyky | Jedna konfigurace | Jeden i18n.json v kořeni | Jeden krok, výchozí working-directory |
| Balíčky potřebují různé cílové jazyky | Konfigurace pro jednotlivé balíčky | Jeden i18n.json pro každý balíček | Maticová strategie s working-directory |
| Balíčky potřebují různé enginy (glosář, hlas značky) | Konfigurace pro jednotlivé balíčky + samostatné enginy | Jeden i18n.json pro každý balíček, každý s vlastním engineId | Maticová strategie s working-directory |
Způsob 1: Jedna rekurzivní konfigurace#
Když má každý balíček stejné rozvržení (např. apps/<name>/locales/[locale].json), použijte rekurzivní glob ** v jednom kořenovém i18n.json. Nové balíčky se budou zachytávat automaticky, pokud tomuto rozvržení odpovídají:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr", "de", "ja"]
},
"buckets": {
"json": {
"include": ["apps/**/locales/[locale].json"]
}
}
}CLI ve výchozím nastavení ignoruje node_modules, .git, dist, build, .next a .turbo, takže rekurzivní vzory neprocházejí do vendorovaných nebo build stromů. Pro cokoli dalšího, co chcete přeskočit, přidejte vlastní položky exclude.
GitHub Action je stejná jako ve způsobu 2 níže – jeden krok, výchozí working directory.
Tohle použijte ve chvíli, kdy všechny balíčky sdílejí stejný zdrojový jazyk, cílové jazyky, rozvržení i lokalizační engine a nechcete upravovat i18n.json pokaždé, když přidáte nový balíček.
Způsob 2: Jedna konfigurace, sdílené jazyky#
Jeden i18n.json v kořeni repozitáře. Cesty bucketů míří explicitně do jednotlivých balíčků:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr", "de", "ja"]
},
"buckets": {
"json": {
"include": [
"apps/web/locales/[locale].json",
"apps/dashboard/locales/[locale].json"
]
},
"markdown": {
"include": ["packages/docs/content/[locale]/*.md"]
}
}
}GitHub Action – standardní jeden krok:
name: Translate
on:
push:
branches: [main]
permissions:
contents: write
pull-requests: write
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}
pull-request: true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}Tohle použijte ve chvíli, kdy všechny balíčky sdílejí stejný zdrojový jazyk, cílové jazyky i lokalizační engine, ale jejich rozvržení se liší natolik, že by rekurzivní glob byl příliš široký.
Způsob 3: Konfigurace pro jednotlivé balíčky, různé jazyky#
Každý balíček má vlastní i18n.json s nezávislými cílovými jazyky:
apps/web/i18n.json:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr", "de", "ja", "ko", "zh-Hans"]
},
"buckets": {
"json": {
"include": ["locales/[locale].json"]
}
}
}apps/marketing/i18n.json:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr", "de"]
},
"buckets": {
"json": {
"include": ["locales/[locale].json"]
},
"markdown": {
"include": ["content/[locale]/*.md"]
}
}
}GitHub Action – maticová strategie s working-directory:
name: Translate
on:
push:
branches: [main]
permissions:
contents: write
pull-requests: write
jobs:
translate:
runs-on: ubuntu-latest
strategy:
matrix:
package: [apps/web, apps/marketing]
steps:
- uses: actions/checkout@v4
- uses: lingodotdev/lingo.dev@main
with:
api-key: ${{ secrets.LINGODOTDEV_API_KEY }}
working-directory: ${{ matrix.package }}
pull-request: true
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}Každá položka matice spouští CLI v rozsahu i18n.json daného balíčku. Action překládá jen soubory, které daný balíček deklaruje.
Způsob 4: Konfigurace pro jednotlivé balíčky, samostatné enginy#
Stejná struktura jako u způsobu 3, ale každý balíček je připojený k jinému lokalizačnímu enginu. Díky tomu má každý balíček vlastní glosář, hlas značky a konfiguraci modelu.
apps/product/i18n.json:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr", "de", "ja"]
},
"buckets": {
"json": {
"include": ["locales/[locale].json"]
}
},
"engineId": "eng_ProductApp123"
}apps/docs/i18n.json:
{
"$schema": "https://lingo.dev/schema/i18n.json",
"version": "1.15",
"locale": {
"source": "en",
"targets": ["es", "fr"]
},
"buckets": {
"markdown": {
"include": ["content/[locale]/*.md"]
}
},
"engineId": "eng_DocsEngine456"
}GitHub Action YAML je stejný jako u způsobu 3 – engineId v každém i18n.json automaticky směruje překlady do správného enginu.
Jak funguje lockfile#
Každé umístění i18n.json vytváří ve stejném adresáři vlastní soubor i18n.lock. Lockfile sleduje, který zdrojový obsah už byl přeložen, a umožňuje přírůstkové aktualizace. Ve způsobech 1 a 2 je v kořeni jeden lockfile. Ve způsobech 3 a 4 má každý balíček vlastní lockfile.
FAQ#
Budou se nové balíčky přidávat automaticky?
Pouze u způsobu 1 (rekurzivní **). U způsobů 3 a 4 přidáte při přidání nového balíčku nový záznam do seznamu matrix.package ve workflow.
Můžu mít pro každý balíček jiné jazyky?
Ano. Použijte způsob 3 nebo 4. i18n.json každého balíčku deklaruje vlastní pole locale.targets nezávisle na ostatních.
Potřebuji jeden workflow soubor, nebo víc?
Jeden workflow soubor s maticovou strategií obslouží všechny balíčky. Každá položka matice běží proti jinému working-directory, takže CLI omezí jen na konfiguraci daného balíčku.
Můžou balíčky sdílet glosář, ale mít různé jazyky?
Ano. Nasměrujte oba balíčky na stejný engineId, ale v každém i18n.json nastavte jiné locale.targets. Glosář enginu se použije na všechny požadované dvojice jazyků.
