
Nepārtraukta lokalizācija bez TMS
Jūsu kods tiek izvietots nepārtraukti. Arī tulkojumiem tā jānotiek. Lūk, kā automatizēt lokalizāciju izstrādes darbplūsmā.
Kas ir nepārtraukta lokalizācija?
Nepārtraukta lokalizācija ir prakse, kurā jaunas virknes automātiski tulko izstrādes darbplūsmas ietvaros, nevis uzkrāj tulkojumus periodiskiem laidieniem. Kad izstrādātājs pievieno jaunu funkciju ar UI virknēm, tās tiek iztulkotas pirms funkcijas izlaišanas.
Tradicionālā pieeja
Vairums komandu tulkojumus grupē: savāc jaunas virknes, eksportē uz TMS, gaida tulkotājus, importē rezultātus un tikai tad izlaiž. Tas rada lokalizācijas sastrēgumu, kas starptautiskos laidienus aizkavē par dienām vai nedēļām.
Izstrādātājs pievieno jaunas virknes avota lokalizācijas failam
Virknes tiek eksportētas un augšupielādētas TMS platformā
Tulkotāji saņem paziņojumu un sāk darbu
Tulkojumi tiek pārskatīti un apstiprināti
Iztulkotie faili tiek lejupielādēti un sapludināti atpakaļ
Funkcija tiek izlaista ar tulkojumiem (pēc vairākām dienām vai nedēļām)
IDE vietējā pieeja
Izmantojot IDE vietējo tulkošanu, izstrādātājs tulko virknes savā parastajā kodēšanas darbplūsmā. Bez eksportēšanas, augšupielādes vai gaidīšanas — tulkojumi tiek veikti tajā pašā izstrādes sesijā.
Izstrādātājs pievieno jaunas virknes avota lokalizācijas failam
Izstrādātājs lūdz MI asistentam iztulkot failu
Iztulkotie faili tiek ierakstīti tieši projektā
Funkcija tiek izlaista ar tulkojumiem tajā pašā komitā
Tradicionālā pieeja
6 steps
Multiple tools and platforms
Days to weeks per cycle
IDE vietējā pieeja
4 steps
Inside your editor
Same commit
Izveidot tulkošanas konveijeru
Komandas, kas vēlas automatizētu tulkošanu arī ārpus IDE, var pievienot CI/CD soli, kas katrā izmaiņu nosūtīšanā uz main iztulko jaunas vai mainītas virknes. Tas darbojas ar GitHub Actions, GitLab CI vai jebkuru CI/CD sistēmu.
Mazās komandās sāciet ar IDE vietējo tulkošanu. Pievienojiet CI/CD automatizāciju, kad komanda izaug pāri 3-4 izstrādātājiem vai kad tulkojumiem jābūt garantēti iekļautiem katrā sapludināšanā ar 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 pushPievienot tulkojumu kvalitātes pārbaudi CI
Automātiskas CI konveijera pārbaudes atrod trūkstošus tulkojumus, bojātus vietturus un nederīgus ICU ziņojumu formātus, pirms tie nonāk produkcijas vidē. Tie ir vienkārši skripti, kas salīdzina avota lokalizācijas failu ar visām mērķa lokalizācijām.
#!/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
doneValidēt tulkojumus CI
Noteikt un pārvaldīt tulkojumu novirzi
Tulkojumu novirze rodas, kad avota virknes mainās, bet tulkojumi netiek atjaunināti. Angļu teksts saka „Save changes“, bet vācu tulkojumā joprojām ir vecais teksts. Novirzi nosaka, salīdzinot avota un tulkojuma failu laikspiedolus vai satura jaucējkodus.
#!/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"Izvēlēties tulkošanas pieeju
Ne visam saturam vajadzīga viena tulkošanas pieeja. UI virknēm un etiķetēm lieliski der MI tulkošana. Mārketinga tekstam noder MI un cilvēka pārskatīšanas kombinācija. Juridiskais un atbilstības teksts vienmēr jāuztic profesionāliem tulkotājiem.
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 darbplūsma tulkojumiem
Tulkojiet funkcijas zarā pirms sapludināšanas, nevis pēc tās. Tas nodrošina, ka katrā sapludināšanā ar main ir pilnīgi tulkojumi. Pievienojiet pārbaudi pirms sapludināšanas, kas apstiprina tulkojumu pilnīgumu visās atbalstītajās lokalizācijās.
Ja vairāki zari vienlaikus maina lielus JSON lokalizācijas failus, bieži rodas sapludināšanas konflikti. Kārtojiet atslēgas alfabētiski un katrā rindā ievietojiet vienu atslēgu, lai izmaiņas būtu mazākas un konfliktus vieglāk atrisināt.
# .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');
\""Biežākās kļūdas
Lokalizācijas uzskatīšana par darbu pēc izstrādes
Nav CI līmeņa tulkojumu validācijas
Pārlieka sarežģīšana ar TMS
Tulkojumu aktualitāte netiek izsekota
Izmēģiniet i18n Agent tūlīt
Nometiet tulkošanas failu šeit
JSON, YAML, PO, XML, CSV, Markdown, Properties
vai noklikšķiniet, lai izvēlētos
Mērķa valodas