
Nuolatinis lokalizavimas be TMS
Jūsų kodas diegiamas nuolat. Vertimai taip pat turėtų būti diegiami nuolat. Štai kaip automatizuoti lokalizavimą kūrimo darbo eigoje.
Kas yra nuolatinis lokalizavimas?
Nuolatinis lokalizavimas – tai praktika, kai naujos eilutės automatiškai verčiamos kūrimo darbo eigoje, o vertimai nekaupiami periodiniams leidimams. Kai kūrėjas prideda naują funkciją su UI eilutėmis, jos išverčiamos prieš funkcijos išleidimą.
Tradicinis metodas
Dauguma komandų vertimus grupuoja: surenka naujas eilutes, eksportuoja į TMS, laukia vertėjų, importuoja rezultatus ir tik tada išleidžia. Taip atsiranda lokalizavimo kliūtis, kuri tarptautinius leidimus atideda kelioms dienoms ar savaitėms.
Kūrėjas prideda naujas eilutes prie šaltinio lokalės failo
Eilutės eksportuojamos ir įkeliamos į TMS platformą
Vertėjams pranešama ir jie pradeda darbą
Vertimai peržiūrimi ir patvirtinami
Išversti failai atsisiunčiami ir vėl sujungiami
Funkcija išleidžiama su vertimais (po kelių dienų ar savaičių)
IDE savasis metodas
Naudodamas IDE savąjį vertimą kūrėjas verčia eilutes įprastoje kodavimo darbo eigoje. Jokio eksportavimo, įkėlimo ar laukimo – vertimai atliekami toje pačioje kūrimo sesijoje.
Kūrėjas prideda naujas eilutes prie šaltinio lokalės failo
Kūrėjas paprašo DI asistento išversti failą
Išversti failai įrašomi tiesiai į projektą
Funkcija išleidžiama su vertimais tame pačiame įraše
Tradicinis metodas
6 steps
Multiple tools and platforms
Days to weeks per cycle
IDE savasis metodas
4 steps
Inside your editor
Same commit
Sukurti vertimo konvejerį
Komandos, norinčios automatizuoti vertimą ne tik IDE, gali pridėti CI/CD veiksmą, kuris kiekvieną kartą pateikus pakeitimus į main išverčia naujas ar pakeistas eilutes. Tai veikia su GitHub Actions, GitLab CI ar bet kuria CI/CD sistema.
Nedidelėms komandoms pradėkite nuo IDE savojo vertimo. CI/CD automatizavimą pridėkite, kai komanda išauga iki daugiau nei 3-4 kūrėjų arba kai vertimai privalo būti įtraukti į kiekvieną sujungimą su 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 pushPridėti vertimų kokybės tikrinimą CI
Automatiniai CI konvejerio tikrinimai aptinka trūkstamus vertimus, sugadintus vietos rezervavimo ženklus ir negaliojančius ICU pranešimų formatus prieš jiems pasiekiant gamybinę aplinką. Tai paprasti scenarijai, kurie lygina šaltinio lokalės failą su visomis tikslinėmis lokalėmis.
#!/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
doneTikrinti vertimus CI
Aptikti ir tvarkyti vertimų nukrypimą
Vertimų nukrypimas atsiranda, kai šaltinio eilutės pasikeičia, bet vertimai neatnaujinami. Angliškai rašoma „Save changes“, o vokiškai vis dar rodomas senas tekstas. Nukrypimas aptinkamas lyginant šaltinio ir vertimo failų laiko žymas arba turinio maišas.
#!/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"Pasirinkti vertimo metodą
Ne visam turiniui reikia to paties vertimo metodo. UI eilutėms ir etiketėms puikiai tinka DI vertimas. Rinkodaros tekstams naudingas DI ir žmogaus peržiūros derinys. Teisinį ir atitikties tekstą visada turėtų versti profesionalūs vertėjai.
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 darbo eiga vertimams
Verskite funkcijos šakoje prieš sujungdami, o ne po to. Taip kiekviename sujungime su main bus visi vertimai. Pridėkite patikrą prieš sujungimą, kuri patvirtina visų palaikomų lokalių vertimų išsamumą.
Kai kelios šakos vienu metu keičia didelius JSON lokalės failus, dažnai kyla sujungimo konfliktų. Surikiuokite raktus abėcėlės tvarka ir kiekvienoje eilutėje pateikite po vieną raktą, kad skirtumai būtų mažesni, o konfliktus būtų lengviau išspręsti.
# .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');
\""Dažnos klaidos
Lokalizavimo laikymas darbu po kūrimo
Nėra CI lygio vertimų tikrinimo
Per daug sudėtinga TMS
Vertimų aktualumas nestebimas
Išbandykite i18n Agent dabar
Nuvilkite vertimo failą čia
JSON, YAML, PO, XML, CSV, Markdown, Properties
arba spustelėkite norėdami pasirinkti
Tikslinės kalbos