Skip to main content

Безперервна локалізація без TMS

Ваш код розгортається безперервно. Переклади мають оновлюватися так само. Дізнайтеся, як автоматизувати локалізацію у Вашому процесі розробки.

Що таке безперервна локалізація?

Безперервна локалізація — це підхід, за якого нові рядки автоматично перекладаються в межах процесу розробки, а не накопичуються для періодичних випусків перекладу. Коли розробник додає нову функцію з рядками інтерфейсу, ці рядки перекладаються до її випуску.

Традиційний підхід

Більшість команд накопичує рядки для пакетного перекладу: збирає нові рядки, експортує їх до TMS, очікує на перекладачів, імпортує результати й лише тоді випускає оновлення. Це створює вузьке місце в локалізації, через яке міжнародні випуски затримуються на кілька днів або тижнів.

1

Розробник додає нові рядки до файлу вихідної локалі

2

Рядки експортують і завантажують на платформу TMS

3

Перекладачі отримують сповіщення й починають роботу

4

Переклади перевіряють і затверджують

5

Перекладені файли завантажують і знову об’єднують із проєктом

6

Функцію випускають із перекладами (через кілька днів або тижнів)

Days to weeks

Підхід із перекладом безпосередньо в IDE

Завдяки перекладу безпосередньо в IDE розробник перекладає рядки в межах звичного процесу написання коду. Жодного експорту, завантаження чи очікування: переклад виконується в тому самому сеансі, що й розробка.

1

Розробник додає нові рядки до файлу вихідної локалі

2

Розробник просить свого ШІ-асистента перекласти файл

3

Перекладені файли записуються безпосередньо до проєкту

4

Функцію випускають із перекладами в тому самому commit

Same commit

Традиційний підхід

6 steps

Multiple tools and platforms

Days to weeks per cycle

Підхід із перекладом безпосередньо в IDE

4 steps

Inside your editor

Same commit

3

Налаштувати конвеєр перекладу

Команди, яким потрібна автоматизація перекладу поза межами IDE, можуть додати етап CI/CD, що перекладатиме нові або змінені рядки під час кожного push до main. Це працює з GitHub Actions, GitLab CI та будь-якою іншою системою CI/CD.

Для невеликих команд почніть із перекладу безпосередньо в IDE. Додайте автоматизацію CI/CD, коли Ваша команда виросте з 3-4 розробників або коли потрібно гарантувати наявність перекладів під час кожного merge до main.

Додайте переклад як етап до наявного конвеєра CI/CD. Переклад запускається після успішного збирання й перед розгортанням, тому кожен випуск містить актуальні переклади.
.github/workflows/translate.yml
# .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
# .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
4

Додати перевірку якості перекладу до CI

Автоматизовані перевірки у Вашому конвеєрі CI виявляють відсутні переклади, пошкоджені заповнювачі й недійсні формати повідомлень ICU до того, як вони потраплять у виробниче середовище. Це прості сценарії, які порівнюють файл вихідної локалі з усіма цільовими локалями.

Без перевірки перекладів на рівні CI відсутні переклади непомітно потрапляють у виробниче середовище. Користувачі бачать необроблені ключі на зразок "settings.title" або порожні рядки замість перекладеного тексту. П’ятихвилинна перевірка CI повністю запобігає цьому.
check-translations.sh
#!/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
check-placeholders.sh
#!/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

Додайте i18n-validate до свого конвеєра CI, щоб автоматично виявляти відсутні ключі, пошкоджені заповнювачі та проблеми з формами множини. Використовуйте i18n-pseudo для створення псевдоперекладів під час візуального регресійного тестування.
5

Виявляти й усувати розбіжності в перекладах

Розбіжність у перекладах виникає, коли вихідні рядки змінюються, а переклади не оновлюються. В англійському тексті вже написано «Зберегти зміни», а в німецькому досі залишається старий текст. Для виявлення розбіжностей порівнюють часові позначки файлів вихідного тексту й перекладу або хеші їхнього вмісту.

Застарілі переклади гірші за відсутні. Відсутній переклад очевидно неправильний: користувачі бачать ключ або резервну мову. Натомість застарілий переклад переконливо повідомляє неправильну інформацію, що може ввести користувачів в оману або спричинити звернення до підтримки.
detect-drift.sh
#!/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"
6

Вибрати підхід до перекладу

Не весь вміст потребує однакового підходу до перекладу. ШІ добре перекладає рядки й мітки інтерфейсу. Для маркетингових текстів корисне поєднання ШІ та перевірки людиною. Юридичні тексти й матеріали з питань дотримання вимог завжди мають перекладати професійні перекладачі.

ШІ перекладає понад 80% типових рядків застосунку з якістю, придатною для виробничого середовища. Залучайте перекладачів до юридичних текстів, матеріалів із фірмовим стилем і культурно чутливого вмісту, де особливо важливі нюанси.
Cost Comparison
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 | Premium
7

Процес роботи з перекладами в Git

Перекладайте у своїй робочій гілці до об’єднання, а не після нього. Так кожне об’єднання з main міститиме повні переклади. Додайте перевірку перед об’єднанням, яка підтверджуватиме повноту перекладів для всіх підтримуваних локалей.

Великі файли локалей JSON часто спричиняють конфлікти об’єднання, коли кілька гілок змінюють їх одночасно. Сортуйте ключі за абеткою та записуйте кожен ключ в окремому рядку, щоб зменшити обсяг змін і полегшити розв’язання конфліктів.

Файли перекладу зберігаються у Вашому репозиторії разом із кодом. Вони перебувають під контролем версій, доступні для перевірки в pull request і розгортаються через той самий конвеєр, що й решта проєкту.
.gitattributes + package.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

Без автоматизованих перевірок відсутні переклади, пошкоджені заповнювачі й недійсні формати потрапляють у виробниче середовище. Додайте до свого конвеєра CI перевірку повноти та форматів.

Надмірне ускладнення за допомогою TMS

TMS розроблено для керування процесами роботи перекладачів. Якщо Ви використовуєте переклад за допомогою ШІ, додаткові витрати на TMS можуть бути непотрібними. Почніть із простого: перекладайте в IDE або CI/CD, а TMS додавайте лише за потреби керувати роботою перекладачів.

Відсутність відстеження актуальності перекладів

Без відстеження актуальності Ви не знаєте, які переклади застаріли. Вихідні рядки змінюються, а старі переклади залишаються. Додайте до свого процесу виявлення розбіжностей, щоб знаходити застарілий вміст.

Спробуйте i18n Agent зараз

Перетягніть сюди файл для перекладу

JSON, YAML, PO, XML, CSV, Markdown, Properties

або натисніть, щоб вибрати

Цільові мови

Реєстрація не потрібнаМиттєвий розрахунок

Поширені запитання