
Συνεχής τοπική προσαρμογή χωρίς TMS
Ο κώδικάς σας διατίθεται συνεχώς στην παραγωγή. Το ίδιο πρέπει να συμβαίνει και με τις μεταφράσεις σας. Δείτε πώς να αυτοματοποιήσετε την τοπική προσαρμογή στη ροή εργασίας ανάπτυξης.
Τι είναι η συνεχής τοπική προσαρμογή;
Η συνεχής τοπική προσαρμογή είναι η πρακτική της αυτόματης μετάφρασης νέων συμβολοσειρών στο πλαίσιο της ροής εργασίας ανάπτυξης, αντί της ομαδοποίησης των μεταφράσεων σε περιοδικές εκδόσεις. Όταν ένας προγραμματιστής προσθέτει μια νέα λειτουργία με συμβολοσειρές UI, αυτές μεταφράζονται προτού κυκλοφορήσει η λειτουργία.
Η παραδοσιακή προσέγγιση
Οι περισσότερες ομάδες μεταφράζουν μαζικά: συλλέγουν τις νέες συμβολοσειρές, τις εξάγουν σε ένα TMS, περιμένουν τους μεταφραστές, εισάγουν τα αποτελέσματα και κατόπιν κυκλοφορούν την έκδοση. Έτσι δημιουργείται ένα σημείο συμφόρησης στην τοπική προσαρμογή, το οποίο καθυστερεί τις διεθνείς εκδόσεις κατά ημέρες ή εβδομάδες.
Ο προγραμματιστής προσθέτει νέες συμβολοσειρές στο αρχείο γλώσσας-πηγής
Οι συμβολοσειρές εξάγονται και μεταφορτώνονται σε μια πλατφόρμα TMS
Οι μεταφραστές ειδοποιούνται και αρχίζουν να εργάζονται
Οι μεταφράσεις ελέγχονται και εγκρίνονται
Γίνεται λήψη των μεταφρασμένων αρχείων και ενσωμάτωσή τους στο έργο
Η λειτουργία κυκλοφορεί με τις μεταφράσεις, έπειτα από ημέρες ή εβδομάδες
Η προσέγγιση μέσα από το IDE
Με τη μετάφραση μέσα από το IDE, ο προγραμματιστής μεταφράζει τις συμβολοσειρές στο πλαίσιο της συνήθους ροής εργασίας προγραμματισμού. Χωρίς εξαγωγή, χωρίς μεταφόρτωση, χωρίς αναμονή — οι μεταφράσεις ολοκληρώνονται στην ίδια συνεδρία με την ανάπτυξη.
Ο προγραμματιστής προσθέτει νέες συμβολοσειρές στο αρχείο γλώσσας-πηγής
Ο προγραμματιστής ζητά από τον βοηθό AI να μεταφράσει το αρχείο
Τα μεταφρασμένα αρχεία εγγράφονται απευθείας στο έργο
Η λειτουργία κυκλοφορεί με τις μεταφράσεις στο ίδιο commit
Η παραδοσιακή προσέγγιση
6 steps
Multiple tools and platforms
Days to weeks per cycle
Η προσέγγιση μέσα από το IDE
4 steps
Inside your editor
Same commit
Ρυθμίστε το pipeline μετάφρασης
Για τις ομάδες που θέλουν αυτοματοποιημένη μετάφραση πέρα από το IDE, προσθέστε ένα βήμα CI/CD που μεταφράζει τις νέες ή τροποποιημένες συμβολοσειρές σε κάθε push στο main. Λειτουργεί με GitHub Actions, GitLab CI ή οποιοδήποτε σύστημα CI/CD.
Ξεκινήστε με μετάφραση μέσα από το IDE για μικρές ομάδες. Προσθέστε αυτοματοποίηση CI/CD όταν η ομάδα σας ξεπεράσει τους 3-4 προγραμματιστές ή όταν χρειάζεστε εγγυημένες μεταφράσεις σε κάθε συγχώνευση στο 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 pushΠροσθέστε έλεγχο ποιότητας μετάφρασης στο CI
Οι αυτοματοποιημένοι έλεγχοι στο pipeline CI εντοπίζουν ελλείπουσες μεταφράσεις, κατεστραμμένα placeholders και μη έγκυρες μορφές μηνυμάτων ICU προτού φτάσουν στην παραγωγή. Πρόκειται για απλά scripts που συγκρίνουν το αρχείο γλώσσας-πηγής με όλες τις γλώσσες-στόχους.
#!/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
doneΕπικυρώστε τις μεταφράσεις στο CI
Εντοπίστε και αντιμετωπίστε την απόκλιση των μεταφράσεων
Η απόκλιση μετάφρασης προκύπτει όταν αλλάζουν οι συμβολοσειρές-πηγές, αλλά οι μεταφράσεις δεν ενημερώνονται. Το αγγλικό κείμενο λέει «Save changes», αλλά το γερμανικό εξακολουθεί να εμφανίζει το παλιό κείμενο. Ο εντοπισμός απόκλισης συγκρίνει τις χρονικές σημάνσεις ή τα hash περιεχομένου των αρχείων προέλευσης και μετάφρασης.
#!/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"Επιλέξτε την προσέγγιση μετάφρασης
Δεν χρειάζεται όλο το περιεχόμενο την ίδια προσέγγιση μετάφρασης. Οι συμβολοσειρές και οι ετικέτες UI αποδίδονται εξαιρετικά με μετάφραση AI. Τα κείμενα μάρκετινγκ ωφελούνται από AI και ανθρώπινο έλεγχο. Τα νομικά κείμενα και τα κείμενα συμμόρφωσης πρέπει πάντα να ανατίθενται σε επαγγελματίες μεταφραστές.
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Ροή εργασίας Git για μεταφράσεις
Μεταφράστε στον κλάδο της λειτουργίας σας πριν από τη συγχώνευση, όχι μετά. Έτσι διασφαλίζετε ότι κάθε συγχώνευση στο main περιλαμβάνει ολοκληρωμένες μεταφράσεις. Προσθέστε έναν έλεγχο πριν από τη συγχώνευση, ο οποίος επαληθεύει την πληρότητα των μεταφράσεων για όλες τις υποστηριζόμενες γλώσσες.
Τα μεγάλα αρχεία γλώσσας JSON προκαλούν συχνές διενέξεις συγχώνευσης όταν τροποποιούνται ταυτόχρονα από πολλούς κλάδους. Ταξινομήστε τα κλειδιά αλφαβητικά και χρησιμοποιήστε ένα κλειδί ανά γραμμή, ώστε να περιορίσετε το μέγεθος των diff και να επιλύετε ευκολότερα τις διενέξεις.
# .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');
\""Συνήθεις παγίδες
Αντιμετώπιση της τοπικής προσαρμογής ως μεταγενέστερου σταδίου ανάπτυξης
Απουσία επικύρωσης μεταφράσεων σε επίπεδο CI
Υπερβολικά σύνθετη υλοποίηση με TMS
Παράλειψη παρακολούθησης της ενημερότητας των μεταφράσεων
Δοκιμάστε τώρα το i18n Agent
Αφήστε εδώ το αρχείο μετάφρασής σας
JSON, YAML, PO, XML, CSV, Markdown, Properties
ή κάντε κλικ για να επιλέξετε αρχείο
Γλώσσες-στόχοι