Skip to main content

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.

1

Pengembang menambahkan string baru ke file bahasa sumber

2

String diekspor dan diunggah ke platform TMS

3

Penerjemah diberi tahu dan mulai bekerja

4

Terjemahan ditinjau dan disetujui

5

File terjemahan diunduh dan digabungkan kembali

6

Fitur dirilis dengan terjemahan (beberapa hari hingga minggu kemudian)

Days to weeks

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.

1

Pengembang menambahkan string baru ke file bahasa sumber

2

Pengembang meminta asisten AI menerjemahkan file

3

File terjemahan ditulis langsung ke proyek

4

Fitur dirilis dengan terjemahan dalam commit yang sama

Same commit

Pendekatan Tradisional

6 steps

Multiple tools and platforms

Days to weeks per cycle

Pendekatan Native IDE

4 steps

Inside your editor

Same commit

3

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.

Tambahkan penerjemahan sebagai langkah dalam pipeline CI/CD yang ada. Penerjemahan berjalan setelah build berhasil dan sebelum deployment sehingga setiap rilis menyertakan terjemahan terbaru.
.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

Tambahkan 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.

Tanpa validasi terjemahan tingkat CI, terjemahan yang hilang mencapai produksi tanpa disadari. Pengguna melihat kunci mentah seperti "settings.title" atau string kosong alih-alih teks terjemahan. Pemeriksaan CI selama 5 menit mencegahnya sepenuhnya.
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

Validasi Terjemahan di CI

Tambahkan i18n-validate ke pipeline CI untuk menemukan kunci hilang, placeholder rusak, dan masalah bentuk jamak secara otomatis. Gunakan i18n-pseudo untuk membuat terjemahan palsu bagi pengujian regresi visual.
5

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.

Terjemahan usang lebih buruk daripada terjemahan hilang. Terjemahan hilang jelas salah—pengguna melihat kunci atau bahasa fallback. Terjemahan usang menyampaikan hal yang salah secara meyakinkan sehingga dapat menyesatkan pengguna atau menimbulkan masalah dukungan.
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

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.

Penerjemahan AI menangani lebih dari 80% string aplikasi umum dengan kualitas produksi. Gunakan penerjemah manusia untuk teks hukum, karakter merek, dan konten sensitif budaya yang paling memerlukan nuansa.
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

Alur 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.

File terjemahan berada di repositori bersama kode. File dikontrol versi, dapat ditinjau dalam pull request, dan di-deploy melalui pipeline yang sama dengan semua hal lainnya.
.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');
\""

Kesalahan Umum

Menganggap Lokalisasi sebagai Pascapengembangan

Kesalahan terbesar adalah menunggu hingga pengembangan selesai untuk menerjemahkan. Ini menimbulkan hambatan, menunda rilis, dan menjadikan terjemahan sekadar pemikiran belakangan. Terjemahkan selama pengembangan, bukan setelahnya.

Tanpa Validasi Terjemahan Tingkat CI

Tanpa pemeriksaan otomatis, terjemahan hilang, placeholder rusak, dan format tidak valid akan mencapai produksi. Tambahkan validasi kelengkapan dan format ke pipeline CI.

Rekayasa Berlebihan dengan TMS

TMS dirancang untuk mengelola alur kerja penerjemah manusia. Jika menggunakan penerjemahan AI, Anda mungkin tidak memerlukan beban TMS. Mulailah secara sederhana—terjemahkan di IDE atau CI/CD—dan tambahkan TMS hanya jika memerlukan manajemen penerjemah manusia.

Tidak Melacak Kebaruan Terjemahan

Tanpa pelacakan kebaruan, Anda tidak tahu terjemahan mana yang usang. String sumber berubah, tetapi terjemahan lama tetap ada. Tambahkan deteksi penyimpangan ke alur kerja untuk menemukan konten usang.

Coba i18n Agent Sekarang

Lepaskan file terjemahan Anda di sini

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

atau klik untuk menjelajahi

Bahasa target

Tidak perlu mendaftarEstimasi instan

Pertanyaan yang Sering Diajukan