
TMS olmadan sürekli yerelleştirme
Kodunuz sürekli dağıtılıyor. Çevirileriniz de öyle olmalı. Yerelleştirmeyi geliştirme iş akışınızda nasıl otomatikleştirebileceğinizi öğrenin.
Sürekli yerelleştirme nedir?
Sürekli yerelleştirme, çevirileri dönemsel sürümlerde toplu olarak yapmak yerine yeni dizeleri geliştirme iş akışınızın bir parçası olarak otomatik biçimde çevirme uygulamasıdır. Bir geliştirici arayüz dizeleri içeren yeni bir özellik eklediğinde bu dizeler özellik yayımlanmadan önce çevrilir.
Geleneksel yaklaşım
Çoğu ekip çevirileri toplu olarak yapar: yeni dizeleri toplar, bir TMS'ye aktarır, çevirmenleri bekler, sonuçları içe aktarır ve ardından yayımlar. Bu süreç, uluslararası sürümleri günlerce veya haftalarca geciktiren bir yerelleştirme darboğazı oluşturur.
Geliştirici kaynak yerel ayar dosyasına yeni dizeler ekler
Dizeler dışa aktarılır ve bir TMS platformuna yüklenir
Çevirmenlere bildirim gönderilir ve çalışmalar başlar
Çeviriler incelenir ve onaylanır
Çevrilmiş dosyalar indirilir ve yeniden birleştirilir
Özellik çevirileriyle birlikte yayımlanır (günler veya haftalar sonra)
IDE'ye özgü yaklaşım
IDE'ye özgü çeviriyle geliştirici, dizeleri normal kodlama iş akışının bir parçası olarak çevirir. Dışa aktarma, yükleme veya bekleme gerekmez; çeviriler geliştirmeyle aynı oturumda yapılır.
Geliştirici kaynak yerel ayar dosyasına yeni dizeler ekler
Geliştirici yapay zeka asistanından dosyayı çevirmesini ister
Çevrilmiş dosyalar doğrudan projeye yazılır
Özellik aynı işlemede çevirileriyle birlikte yayımlanır
Geleneksel yaklaşım
6 steps
Multiple tools and platforms
Days to weeks per cycle
IDE'ye özgü yaklaşım
4 steps
Inside your editor
Same commit
Çeviri işlem hattınızı kurun
IDE dışında da otomatik çeviri isteyen ekipler için main dalına yapılan her gönderimde yeni veya değiştirilmiş dizeleri çeviren bir CI/CD adımı ekleyin. Bu yaklaşım GitHub Actions, GitLab CI veya herhangi bir CI/CD sistemiyle çalışır.
Küçük ekiplerde IDE'ye özgü çeviriyle başlayın. Ekibiniz 3-4 geliştiriciyi aştığında veya main dalındaki her birleştirmede çevirilerin bulunmasını güvence altına almanız gerektiğinde CI/CD otomasyonu ekleyin.
# .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 pushCI'a çeviri kalite güvencesi ekleyin
CI işlem hattınızdaki otomatik denetimler eksik çevirileri, bozuk yer tutucuları ve geçersiz ICU ileti biçimlerini üretime ulaşmadan önce yakalar. Bunlar, kaynak yerel ayar dosyanızı tüm hedef yerel ayarlarla karşılaştıran basit betiklerdir.
#!/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
doneCI'da çevirileri doğrulayın
Çeviri sapmasını algılayın ve yönetin
Kaynak dizeler değişirken çeviriler güncellenmediğinde çeviri sapması oluşur. İngilizce metinde "Save changes" yazarken Almanca hâlâ eski metni gösterir. Sapma algılama, kaynak ve çeviri dosyalarının zaman damgalarını veya içerik karmalarını karşılaştırır.
#!/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"Çeviri yaklaşımınızı seçin
Her içerik aynı çeviri yaklaşımını gerektirmez. Arayüz dizeleri ve etiketler yapay zeka çevirisiyle çok iyi sonuç verir. Pazarlama metinleri yapay zeka ve insan incelemesinden yararlanır. Hukuk ve mevzuata uygunluk metinlerinde daima profesyonel insan çevirmenler kullanılmalıdır.
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Çeviriler için Git iş akışı
Çevirileri birleştirmeden sonra değil önce, özellik dalınızda yapın. Böylece main dalındaki her birleştirme eksiksiz çeviriler içerir. Desteklenen tüm yerel ayarlarda çevirilerin eksiksizliğini doğrulayan bir birleştirme öncesi denetim ekleyin.
Birden fazla dal aynı anda değişiklik yaptığında büyük JSON yerel ayar dosyaları sık sık birleştirme çakışmalarına yol açar. Fark boyutunu küçültmek ve çakışmaların çözümünü kolaylaştırmak için anahtarları alfabetik olarak sıralayın ve her satıra tek bir anahtar yazın.
# .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');
\""Yaygın sorunlar
Yerelleştirmeyi geliştirme sonrası bir işlem olarak görmek
CI düzeyinde çeviri doğrulamasının olmaması
TMS ile gereğinden fazla karmaşıklaştırma
Çevirilerin güncelliğini izlememek
i18n Agent'ı şimdi deneyin
Çeviri dosyanızı buraya bırakın
JSON, YAML, PO, XML, CSV, Markdown, Properties
veya göz atmak için tıklayın
Hedef diller