
Непрекъсната локализация без TMS
Вашият код се внедрява непрекъснато. Преводите Ви също трябва да се обновяват непрекъснато. Ето как да автоматизирате локализацията в процеса си на разработка.
Какво представлява непрекъснатата локализация?
Непрекъснатата локализация е практика, при която новите текстове се превеждат автоматично като част от процеса на разработка, вместо преводите да се събират на партиди за периодични версии. Когато разработчик добави нова функционалност с текстове за интерфейса, те се превеждат преди пускането ѝ.
Традиционният подход
Повечето екипи обработват преводите на партиди: събират новите текстове, експортират ги в TMS, изчакват преводачите, импортират резултатите и едва тогава пускат версията. Така локализацията се превръща в тясно място, което забавя версиите за международните пазари с дни или седмици.
Разработчикът добавя нови текстове във файла на изходната езикова версия
Текстовете се експортират и качват в TMS платформа
Преводачите получават известие и започват работа
Преводите се проверяват и одобряват
Преведените файлове се свалят и обединяват обратно с проекта
Функционалността се пуска с преводите дни или седмици по-късно
Подходът с превод директно в IDE
При превод директно в IDE разработчикът превежда текстовете като част от обичайния процес на програмиране. Без експортиране, без качване и без чакане — преводите се създават в същата работна сесия като разработката.
Разработчикът добавя нови текстове във файла на изходната езикова версия
Разработчикът иска от своя AI асистент да преведе файла
Преведените файлове се записват директно в проекта
Функционалността се пуска с преводите в същия commit
Традиционният подход
6 steps
Multiple tools and platforms
Days to weeks per cycle
Подходът с превод директно в IDE
4 steps
Inside your editor
Same commit
Настройте процеса си за превод
Ако екипът Ви иска автоматизиран превод и извън IDE, добавете CI/CD стъпка, която превежда новите или променените текстове при всяко изпращане към main. Това работи с GitHub Actions, GitLab CI и всяка друга CI/CD система.
За малки екипи започнете с превод директно в IDE. Добавете CI/CD автоматизация, когато екипът Ви надхвърли 3-4 разработчици или когато трябва да гарантирате преводи при всяко сливане в 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 pushДобавете контрол на качеството на преводите в CI
Автоматизираните проверки във Вашия CI процес откриват липсващи преводи, повредени заместители и невалидни формати на ICU съобщения, преди да достигнат до реалната среда. Това са прости скриптове, които сравняват файла на изходната езикова версия с всички целеви версии.
#!/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
doneПроверявайте преводите в CI
Откривайте и отстранявайте разминаванията в преводите
Разминаване възниква, когато изходните текстове се променят, но преводите не се обновят. Английският текст вече гласи „Save changes", а немският все още съдържа стария текст. Откриването на разминавания сравнява времевите отметки или хешовете на съдържанието на изходните файлове и преводите.
#!/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"Изберете подхода си за превод
Не всяко съдържание изисква един и същ подход за превод. Текстовете и етикетите на интерфейса се превеждат отлично с AI. За рекламните текстове е подходящ AI превод с последваща човешка проверка. Правните текстове и съдържанието за съответствие с изискванията винаги трябва да се поверяват на професионални преводачи.
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 процес за преводите
Превеждайте във Вашия клон за функционалността преди сливането, а не след него. Така всяко сливане в main включва пълни преводи. Добавете проверка преди сливане, която потвърждава пълнотата на преводите за всички поддържани езикови версии.
Големите JSON файлове за езикови версии често предизвикват конфликти при сливане, когато няколко клона ги променят едновременно. Подреждайте ключовете по азбучен ред и използвайте по един ключ на ред, за да намалите размера на разликите и да улесните разрешаването на конфликтите.
# .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');
\""Често срещани грешки
Локализация едва след разработката
Липса на проверка на преводите в CI
Излишна сложност с TMS
Липса на проследяване на актуалността на преводите
Изпробвайте i18n Agent сега
Пуснете тук Вашия файл за превод
JSON, YAML, PO, XML, CSV, Markdown, Properties
или натиснете, за да изберете файл
Целеви езици