
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.
Pembangun menambahkan rentetan baharu pada fail bahasa sumber
Rentetan dieksport dan dimuat naik ke platform TMS
Penterjemah dimaklumkan dan mula bekerja
Terjemahan disemak dan diluluskan
Fail terjemahan dimuat turun dan digabungkan semula
Ciri dikeluarkan dengan terjemahan (beberapa hari hingga minggu kemudian)
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.
Pembangun menambahkan rentetan baharu pada fail bahasa sumber
Pembangun meminta pembantu AI menterjemah fail
Fail terjemahan ditulis terus ke projek
Ciri dikeluarkan dengan terjemahan dalam commit yang sama
Pendekatan Tradisional
6 steps
Multiple tools and platforms
Days to weeks per cycle
Pendekatan Natif IDE
4 steps
Inside your editor
Same commit
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.
# .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 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.
#!/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
doneSahkan Terjemahan dalam CI
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.
#!/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 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.
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 | PremiumAliran 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.
# .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
Tiada Pengesahan Terjemahan Peringkat CI
Kejuruteraan Berlebihan dengan TMS
Tidak Menjejaki Kesegaran Terjemahan
Cuba i18n Agent Sekarang
Lepaskan fail terjemahan anda di sini
JSON, YAML, PO, XML, CSV, Markdown, Properties
atau klik untuk semak imbas
Bahasa sasaran