
Lokalisasi Berkelanjutan Tanpa TMS
Kode Anda di-deploy secara berkelanjutan. Terjemahan Anda juga seharusnya demikian. Berikut cara mengotomatiskan lokalisasi dalam alur kerja pengembangan.
Apa Itu Lokalisasi Berkelanjutan?
Lokalisasi berkelanjutan adalah praktik menerjemahkan string baru secara otomatis sebagai bagian dari alur kerja pengembangan, bukan mengumpulkan terjemahan dalam rilis berkala. Saat pengembang menambahkan fitur baru dengan string UI, string tersebut diterjemahkan sebelum fitur dirilis.
Pendekatan Tradisional
Sebagian besar tim mengumpulkan terjemahan: kumpulkan string baru, ekspor ke TMS, tunggu penerjemah, impor hasil, lalu rilis. Ini menimbulkan hambatan lokalisasi yang menunda rilis internasional selama berhari-hari atau berminggu-minggu.
Pengembang menambahkan string baru ke file bahasa sumber
String diekspor dan diunggah ke platform TMS
Penerjemah diberi tahu dan mulai bekerja
Terjemahan ditinjau dan disetujui
File terjemahan diunduh dan digabungkan kembali
Fitur dirilis dengan terjemahan (beberapa hari hingga minggu kemudian)
Pendekatan Native IDE
Dengan penerjemahan native IDE, pengembang menerjemahkan string sebagai bagian dari alur kerja coding normal. Tanpa ekspor, unggahan, atau penantian—penerjemahan berlangsung dalam sesi yang sama dengan pengembangan.
Pengembang menambahkan string baru ke file bahasa sumber
Pengembang meminta asisten AI menerjemahkan file
File terjemahan ditulis langsung ke proyek
Fitur dirilis dengan terjemahan dalam commit yang sama
Pendekatan Tradisional
6 steps
Multiple tools and platforms
Days to weeks per cycle
Pendekatan Native IDE
4 steps
Inside your editor
Same commit
Siapkan Pipeline Terjemahan
Untuk tim yang menginginkan penerjemahan otomatis di luar IDE, tambahkan langkah CI/CD yang menerjemahkan string baru atau yang berubah pada setiap push ke main. Ini berfungsi dengan GitHub Actions, GitLab CI, atau sistem CI/CD apa pun.
Mulailah dengan penerjemahan native IDE untuk tim kecil. Tambahkan otomatisasi CI/CD saat tim berkembang melampaui 3-4 pengembang atau saat terjemahan harus dijamin ada pada setiap merge ke 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 pushTambahkan QA Terjemahan ke CI
Pemeriksaan otomatis dalam pipeline CI menemukan terjemahan yang hilang, placeholder rusak, dan format pesan ICU tidak valid sebelum mencapai produksi. Pemeriksaan ini berupa skrip sederhana yang membandingkan file bahasa sumber dengan semua bahasa target.
#!/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
doneValidasi Terjemahan di CI
Deteksi dan Tangani Penyimpangan Terjemahan
Penyimpangan terjemahan terjadi saat string sumber berubah, tetapi terjemahan tidak diperbarui. Bahasa Inggris berbunyi "Save changes", tetapi bahasa Jerman masih menampilkan teks lama. Deteksi penyimpangan membandingkan timestamp file sumber dan terjemahan atau hash kontennya.
#!/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"Pilih Pendekatan Penerjemahan
Tidak semua konten memerlukan pendekatan penerjemahan yang sama. String dan label UI sangat cocok untuk penerjemahan AI. Naskah pemasaran mendapat manfaat dari AI + peninjauan manusia. Teks hukum dan kepatuhan harus selalu menggunakan penerjemah manusia profesional.
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 | PremiumAlur Kerja Git untuk Terjemahan
Terjemahkan di branch fitur sebelum merge, bukan setelahnya. Ini memastikan setiap merge ke main menyertakan terjemahan lengkap. Tambahkan pemeriksaan sebelum merge yang memverifikasi kelengkapan terjemahan untuk semua bahasa yang didukung.
File bahasa JSON besar sering menimbulkan konflik merge saat beberapa branch mengubahnya bersamaan. Urutkan kunci menurut abjad dan gunakan satu kunci per baris untuk meminimalkan ukuran diff serta mempermudah penyelesaian konflik.
# .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');
\""Kesalahan Umum
Menganggap Lokalisasi sebagai Pascapengembangan
Tanpa Validasi Terjemahan Tingkat CI
Rekayasa Berlebihan dengan TMS
Tidak Melacak Kebaruan Terjemahan
Coba i18n Agent Sekarang
Lepaskan file terjemahan Anda di sini
JSON, YAML, PO, XML, CSV, Markdown, Properties
atau klik untuk menjelajahi
Bahasa target