Skip to main content

Penyetempatan Berterusan Tanpa TMS

Kod anda digunakan secara berterusan. Terjemahan anda juga sepatutnya begitu. Berikut ialah cara mengautomatikkan penyetempatan dalam aliran kerja pembangunan.

Apakah Itu Penyetempatan Berterusan?

Penyetempatan berterusan ialah amalan menterjemah rentetan baharu secara automatik sebagai sebahagian daripada aliran kerja pembangunan, bukan mengumpulkan terjemahan dalam keluaran berkala. Apabila pembangun menambahkan ciri baharu dengan rentetan UI, rentetan tersebut diterjemahkan sebelum ciri dikeluarkan.

Pendekatan Tradisional

Kebanyakan pasukan mengumpulkan terjemahan: kumpulkan rentetan baharu, eksport ke TMS, tunggu penterjemah, import hasil, kemudian keluarkan. Ini mewujudkan halangan penyetempatan yang melambatkan keluaran antarabangsa selama berhari-hari atau berminggu-minggu.

1

Pembangun menambahkan rentetan baharu pada fail bahasa sumber

2

Rentetan dieksport dan dimuat naik ke platform TMS

3

Penterjemah dimaklumkan dan mula bekerja

4

Terjemahan disemak dan diluluskan

5

Fail terjemahan dimuat turun dan digabungkan semula

6

Ciri dikeluarkan dengan terjemahan (beberapa hari hingga minggu kemudian)

Days to weeks

Pendekatan Natif IDE

Dengan terjemahan natif IDE, pembangun menterjemah rentetan sebagai sebahagian daripada aliran kerja pengekodan biasa. Tiada eksport, muat naik, atau penantian—terjemahan berlaku dalam sesi yang sama dengan pembangunan.

1

Pembangun menambahkan rentetan baharu pada fail bahasa sumber

2

Pembangun meminta pembantu AI menterjemah fail

3

Fail terjemahan ditulis terus ke projek

4

Ciri dikeluarkan dengan terjemahan dalam commit yang sama

Same commit

Pendekatan Tradisional

6 steps

Multiple tools and platforms

Days to weeks per cycle

Pendekatan Natif IDE

4 steps

Inside your editor

Same commit

3

Sediakan Saluran Terjemahan

Untuk pasukan yang mahukan terjemahan automatik di luar IDE, tambahkan langkah CI/CD yang menterjemah rentetan baharu atau yang berubah pada setiap push ke main. Ini berfungsi dengan GitHub Actions, GitLab CI, atau sebarang sistem CI/CD.

Mulakan dengan terjemahan natif IDE untuk pasukan kecil. Tambahkan automasi CI/CD apabila pasukan berkembang melebihi 3-4 pembangun atau apabila terjemahan perlu dijamin ada pada setiap gabungan ke main.

Tambahkan terjemahan sebagai langkah dalam saluran CI/CD sedia ada. Terjemahan berjalan selepas binaan berjaya dan sebelum penggunaan supaya setiap keluaran menyertakan terjemahan terkini.
.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 pada CI

Pemeriksaan automatik dalam saluran CI mengesan terjemahan yang hilang, ruang letak rosak, dan format mesej ICU yang tidak sah sebelum mencapai pengeluaran. Pemeriksaan ini ialah skrip ringkas yang membandingkan fail bahasa sumber dengan semua bahasa sasaran.

Tanpa pengesahan terjemahan peringkat CI, terjemahan yang hilang mencapai pengeluaran tanpa disedari. Pengguna melihat kekunci mentah seperti "settings.title" atau rentetan kosong dan bukannya teks terjemahan. Pemeriksaan CI selama 5 minit 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

Sahkan Terjemahan dalam CI

Tambahkan i18n-validate pada saluran CI untuk mengesan kekunci hilang, ruang letak rosak, dan masalah bentuk jamak secara automatik. Gunakan i18n-pseudo untuk menjana terjemahan palsu bagi ujian regresi visual.
5

Kesan dan Kendalikan Penyimpangan Terjemahan

Penyimpangan terjemahan berlaku apabila rentetan sumber berubah, tetapi terjemahan tidak dikemas kini. Bahasa Inggeris menyatakan "Save changes", tetapi bahasa Jerman masih memaparkan teks lama. Pengesanan penyimpangan membandingkan cap masa fail sumber dan terjemahan atau hash kandungannya.

Terjemahan lapuk lebih buruk daripada terjemahan hilang. Terjemahan hilang jelas salah—pengguna melihat kekunci atau bahasa sandaran. Terjemahan lapuk menyampaikan perkara yang salah dengan meyakinkan, lalu boleh mengelirukan pengguna atau menimbulkan masalah sokongan.
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 Terjemahan

Tidak semua kandungan memerlukan pendekatan terjemahan yang sama. Rentetan dan label UI sangat sesuai untuk terjemahan AI. Teks pemasaran mendapat manfaat daripada AI + semakan manusia. Teks undang-undang dan pematuhan perlu sentiasa menggunakan penterjemah manusia profesional.

Terjemahan AI mengendalikan lebih daripada 80% rentetan aplikasi biasa dengan kualiti pengeluaran. Gunakan penterjemah manusia untuk teks undang-undang, suara jenama, dan kandungan 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

Aliran Kerja Git untuk Terjemahan

Terjemah pada cabang ciri sebelum gabungan, bukan selepasnya. Ini memastikan setiap gabungan ke main menyertakan terjemahan lengkap. Tambahkan pemeriksaan sebelum gabungan yang mengesahkan kelengkapan terjemahan untuk semua bahasa yang disokong.

Fail bahasa JSON besar kerap menimbulkan konflik gabungan apabila beberapa cabang mengubahnya serentak. Susun kekunci mengikut abjad dan gunakan satu kekunci bagi setiap baris untuk meminimumkan saiz perbezaan serta memudahkan penyelesaian konflik.

Fail terjemahan berada dalam repositori bersama kod. Fail dikawal versi, boleh disemak dalam permintaan tarik, dan digunakan melalui saluran yang sama dengan semua perkara lain.
.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');
\""

Kesilapan Umum

Menganggap Penyetempatan sebagai Pascapembangunan

Kesilapan terbesar ialah menunggu sehingga pembangunan selesai untuk menterjemah. Ini mewujudkan halangan, melambatkan keluaran, dan menjadikan terjemahan sekadar perkara susulan. Terjemah semasa pembangunan, bukan selepasnya.

Tiada Pengesahan Terjemahan Peringkat CI

Tanpa pemeriksaan automatik, terjemahan hilang, ruang letak rosak, dan format tidak sah akan mencapai pengeluaran. Tambahkan pengesahan kelengkapan dan format pada saluran CI.

Kejuruteraan Berlebihan dengan TMS

TMS direka untuk mengurus aliran kerja penterjemah manusia. Jika menggunakan terjemahan AI, anda mungkin tidak memerlukan overhed TMS. Mulakan secara ringkas—terjemah dalam IDE atau CI/CD—dan tambahkan TMS hanya jika memerlukan pengurusan penterjemah manusia.

Tidak Menjejaki Kesegaran Terjemahan

Tanpa penjejakan kesegaran, anda tidak tahu terjemahan mana yang lapuk. Rentetan sumber berubah, tetapi terjemahan lama kekal. Tambahkan pengesanan penyimpangan pada aliran kerja untuk mengesan kandungan lapuk.

Cuba i18n Agent Sekarang

Lepaskan fail terjemahan anda di sini

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

atau klik untuk semak imbas

Bahasa sasaran

Tidak perlu mendaftarAnggaran serta-merta

Soalan Lazim