
Průběžná lokalizace bez TMS
Váš kód se nasazuje průběžně. Překlady by měly také. Zde je návod, jak automatizovat lokalizaci ve Vašem vývojovém workflow.
Co je průběžná lokalizace?
Průběžná lokalizace je praxe automatického překládání nových řetězců jako součást Vašeho vývojového workflow, místo dávkování překladů do periodických vydání. Když vývojář přidá novou funkci s UI řetězci, tyto řetězce se přeloží ještě před nasazením funkce.
Tradiční přístup
Většina týmů dávkuje překlady: shromáždí nové řetězce, exportuje je do TMS, počká na překladatele, importuje výsledky a teprve pak vydá. Tím vzniká lokalizační úzké hrdlo, které zpožďuje mezinárodní vydání o dny až týdny.
Vývojář přidá nové řetězce do souboru zdrojové lokality
Řetězce se exportují a nahrají do platformy TMS
Překladatelé dostanou oznámení a začnou pracovat
Překlady jsou zkontrolovány a schváleny
Přeložené soubory se stáhnou a sloučí zpět
Funkce se vydá s překlady (o dny až týdny později)
Přístup nativní pro IDE
U překladu nativního pro IDE vývojář překládá řetězce jako součást běžného vývojového workflow. Žádný export, žádné nahrávání, žádné čekání — překlady probíhají ve stejné relaci jako vývoj.
Vývojář přidá nové řetězce do souboru zdrojové lokality
Vývojář požádá svého AI asistenta o překlad souboru
Přeložené soubory se zapíší přímo do projektu
Funkce se vydá s překlady ve stejném commitu
Tradiční přístup
6 steps
Multiple tools and platforms
Days to weeks per cycle
Přístup nativní pro IDE
4 steps
Inside your editor
Same commit
Nastavte si překladovou pipeline
Pro týmy, které chtějí automatizovat překlady i mimo IDE, přidejte CI/CD krok, který při každém pushi do main přeloží nové nebo změněné řetězce. Funguje to s GitHub Actions, GitLab CI nebo jakýmkoli CI/CD systémem.
U malých týmů začněte s překladem nativním pro IDE. CI/CD automatizaci přidejte, až Váš tým přeroste 3-4 vývojáře nebo když potřebujete mít překlady garantované při každém merge do main.
# .github/workflows/translate.yml
name: Translate
on:
push:
branches: [main]
paths: ['locales/en/**']
jobs:
translate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Translate changed strings
run: |
npx i18n-agent translate locales/en.json \
--to de,ja,es,fr,ko,zh-Hans \
--api-key ${{ secrets.I18N_AGENT_API_KEY }}
- name: Commit translations
run: |
git config user.name "github-actions"
git config user.email "[email protected]"
git add locales/
git diff --cached --quiet || git commit -m "chore: update translations"
git push# .gitlab-ci.yml
translate:
stage: deploy
only:
changes:
- locales/en/**
script:
- npx i18n-agent translate locales/en.json
--to de,ja,es,fr --api-key $I18N_AGENT_API_KEY
- git add locales/ && git commit -m "chore: translations" && git pushPřidejte do CI QA pro překlady
Automatizované kontroly ve Vaší CI pipeline zachytí chybějící překlady, rozbité zástupné znaky a neplatné formáty zpráv ICU ještě před tím, než se dostanou do produkce. Jde o jednoduché skripty, které porovnávají soubor zdrojové lokality se všemi cílovými lokalitami.
#!/bin/bash
# check-translations.sh — Run in CI to catch missing translations
SOURCE="locales/en.json"
LANGS=("de" "ja" "es" "fr")
EXIT_CODE=0
# Extract all keys from source
SOURCE_KEYS=$(jq -r '[paths(scalars)] | map(join(".")) | .[]' "$SOURCE" | sort)
SOURCE_COUNT=$(echo "$SOURCE_KEYS" | wc -l)
for lang in "${LANGS[@]}"; do
TARGET="locales/$lang.json"
if [ ! -f "$TARGET" ]; then
echo "❌ Missing: $TARGET"
EXIT_CODE=1
continue
fi
TARGET_KEYS=$(jq -r '[paths(scalars)] | map(join(".")) | .[]' "$TARGET" | sort)
MISSING=$(comm -23 <(echo "$SOURCE_KEYS") <(echo "$TARGET_KEYS"))
if [ -n "$MISSING" ]; then
COUNT=$(echo "$MISSING" | wc -l)
echo "❌ $lang: $COUNT missing keys"
echo "$MISSING" | head -5
EXIT_CODE=1
else
echo "✅ $lang: all $SOURCE_COUNT keys present"
fi
done
exit $EXIT_CODE#!/bin/bash
# check-placeholders.sh — Validate placeholder consistency
SOURCE="locales/en.json"
LANGS=("de" "ja" "es")
for lang in "${LANGS[@]}"; do
TARGET="locales/$lang.json"
# Compare placeholders like {{name}}, {count}, %s, %d
jq -r 'paths(scalars) as $p | [($p | join(".")), (getpath($p))]
| @tsv' "$SOURCE" | while IFS=$'\t' read -r key value; do
SOURCE_PH=$(echo "$value" | grep -oE '\{\{[^}]+\}\}|%[sd@]' | sort)
TARGET_VAL=$(jq -r "getpath($(echo $key | jq -R 'split(".")'))" "$TARGET")
TARGET_PH=$(echo "$TARGET_VAL" | grep -oE '\{\{[^}]+\}\}|%[sd@]' | sort)
if [ "$SOURCE_PH" != "$TARGET_PH" ]; then
echo "❌ $lang/$key: placeholder mismatch"
echo " Source: $SOURCE_PH"
echo " Target: $TARGET_PH"
fi
done
doneOvěřujte překlady v CI
Detekujte a řešte odchylky v překladech
K odchylkám v překladech dochází, když se zdrojové řetězce změní, ale překlady se neaktualizují. Angličtina říká „Save changes“, ale němčina stále obsahuje starý text. Detekce odchylek porovnává časová razítka nebo hashe obsahu zdrojových a překladových souborů.
#!/bin/bash
# detect-drift.sh — Find stale translations
SOURCE="locales/en.json"
SOURCE_HASH=$(md5sum "$SOURCE" | cut -d' ' -f1)
HASH_FILE=".translation-hashes"
# Compare current source hash with stored hash
if [ -f "$HASH_FILE" ]; then
STORED_HASH=$(grep "^en:" "$HASH_FILE" | cut -d: -f2)
if [ "$SOURCE_HASH" != "$STORED_HASH" ]; then
echo "⚠️ Source strings changed since last translation"
echo " Run translations to update all locales"
# Show which keys changed
git diff HEAD~1 "$SOURCE" | grep '^[+-]' | grep -v '^[+-][+-]'
fi
fi
# Update stored hash
echo "en:$SOURCE_HASH" > "$HASH_FILE"Zvolte si přístup k překladu
Ne veškerý obsah vyžaduje stejný přístup k překladu. UI řetězce a popisky skvěle fungují s AI překladem. Marketingové texty těží z kombinace AI + lidské revize. Právní a compliance texty by měli vždy překládat profesionální lidští překladatelé.
Translation Approach Comparison:
Content Type | Approach | Cost/word | Quality
─────────────────────┼───────────────────┼────────────┼──────────
UI strings, labels | AI/LLM | $0.001-01 | Production
Tooltips, help text | AI/LLM | $0.001-01 | Production
Marketing copy | AI + human review | $0.05-0.15 | High
Legal / compliance | Human translator | $0.15-0.40 | Certified
Brand voice content | Human translator | $0.20-0.50 | PremiumGit workflow pro překlady
Překládejte na své feature větvi před merge, ne až po něm. Tím zajistíte, že každý merge do main bude obsahovat kompletní překlady. Přidejte pre-merge kontrolu, která ověří úplnost překladů pro všechny podporované lokality.
Velké JSON soubory s lokalitami způsobují časté merge konflikty, když je více větví upravuje současně. Seřaďte klíče abecedně a používejte jeden klíč na řádek, abyste minimalizovali velikost diffu a usnadnili řešení konfliktů.
# .gitattributes — reduce merge conflicts in locale files
locales/*.json merge=union
# Sort keys alphabetically to minimize diffs:
# package.json script:
"sort-locales": "node -e \"
const fs = require('fs');
const f = process.argv[1];
const d = JSON.parse(fs.readFileSync(f));
const s = (o) => Object.keys(o).sort().reduce((r,k) =>
({...r, [k]: typeof o[k]==='object' ? s(o[k]) : o[k]}), {});
fs.writeFileSync(f, JSON.stringify(s(d), null, 2)+'\\n');
\""Běžné problémy
Považování lokalizace za krok po vývoji
Žádná validace překladů na úrovni CI
Překomplikování pomocí TMS
Nesledování aktuálnosti překladů
Vyzkoušejte i18n Agent nyní
Sem přetáhněte svůj překladový soubor
JSON, YAML, PO, XML, CSV, Markdown, Properties
nebo klikněte a vyberte soubor
Cílové jazyky