
Samfelld staðfærsla án TMS
Kóðinn þinn er gefinn út samfellt. Þýðingarnar ættu að vera það líka. Svona gerirðu staðfærslu sjálfvirka í þróunarferlinu.
Hvað er samfelld staðfærsla?
Samfelld staðfærsla felst í því að þýða nýja strengi sjálfkrafa sem hluta af þróunarferlinu í stað þess að safna þýðingum saman fyrir reglulegar útgáfur. Þegar forritari bætir við nýjum eiginleika með notandaviðmótsstrengjum eru strengirnir þýddir áður en eiginleikinn er gefinn út.
Hefðbundna aðferðin
Flest teymi safna þýðingum saman: þau safna nýjum strengjum, flytja þá út í TMS, bíða eftir þýðendum, flytja niðurstöðurnar inn og gefa síðan út. Þetta skapar flöskuháls í staðfærslu sem tefur alþjóðlegar útgáfur um daga eða vikur.
Forritari bætir nýjum strengjum við skrá frummálsins
Strengirnir eru fluttir út og hlaðið upp á TMS-kerfi
Þýðendur fá tilkynningu og hefja vinnu
Þýðingarnar eru yfirfarnar og samþykktar
Þýddu skrárnar eru sóttar og sameinaðar verkefninu á ný
Eiginleikinn er gefinn út með þýðingum (dögum eða vikum síðar)
Aðferðin sem er innbyggð í þróunarumhverfið
Með þýðingu sem er innbyggð í þróunarumhverfið þýðir forritarinn strengi sem hluta af venjulegu kóðunarferli sínu. Enginn útflutningur, ekkert upphleðsluferli, engin bið — þýðingarnar verða til í sömu lotu og þróunin.
Forritari bætir nýjum strengjum við skrá frummálsins
Forritarinn biður gervigreindaraðstoðina sína um að þýða skrána
Þýddu skrárnar eru skrifaðar beint í verkefnið
Eiginleikinn er gefinn út með þýðingum í sömu innfærslu
Hefðbundna aðferðin
6 steps
Multiple tools and platforms
Days to weeks per cycle
Aðferðin sem er innbyggð í þróunarumhverfið
4 steps
Inside your editor
Same commit
Settu upp þýðingarvinnslurásina
Fyrir teymi sem vilja sjálfvirkar þýðingar utan þróunarumhverfisins má bæta við CI/CD-skrefi sem þýðir nýja eða breytta strengi við hverja innsendingu á main. Þetta virkar með GitHub Actions, GitLab CI og öllum öðrum CI/CD-kerfum.
Byrjaðu á þýðingu í þróunarumhverfinu fyrir lítil teymi. Bættu við CI/CD-sjálfvirkni þegar forriturum í teyminu fjölgar umfram 3-4 eða þegar þú þarft að tryggja þýðingar við hverja sameiningu við 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 pushBættu gæðaprófun þýðinga við CI
Sjálfvirkar prófanir í CI-vinnslurásinni finna þýðingar sem vantar, skemmda staðgengla og ógild ICU-skilaboðasnið áður en þau berast í rekstrarumhverfið. Þetta eru einfaldar skriftur sem bera skrá frummálsins saman við öll markmálin.
#!/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
doneSannprófaðu þýðingar í CI
Greindu og meðhöndlaðu þýðingarek
Þýðingarek verður þegar frumstrengir breytast en þýðingar uppfærast ekki. Á ensku stendur "Save changes" en þýski textinn er enn sá gamli. Rekgreining ber saman tímastimpla eða tætigildi frum- og þýðingarskráa.
#!/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"Veldu þýðingaraðferð
Ekki þarf að þýða allt efni með sömu aðferð. Notandaviðmótsstrengir og merkingar henta vel fyrir gervigreindarþýðingar. Markaðstexti nýtur góðs af gervigreind og mannlegum yfirlestri. Lögfræðitexta og texta um reglufylgni ættu faglærðir þýðendur alltaf að þýða.
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 | PremiumGit-vinnuferli fyrir þýðingar
Þýddu á eiginleikagreininni áður en hún er sameinuð, ekki eftir á. Þannig inniheldur hver sameining við main fullgerðar þýðingar. Bættu við prófun fyrir sameiningu sem staðfestir að þýðingar séu fullgerðar fyrir öll studd tungumál.
Stórar JSON-tungumálaskrár valda oft sameiningarárekstrum þegar margar greinar breyta þeim samtímis. Raðaðu lyklum í stafrófsröð og hafðu einn lykil í hverri línu til að minnka breytingasamanburðinn og auðvelda úrlausn árekstra.
# .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');
\""Algengar gryfjur
Að meðhöndla staðfærslu sem eftiráverk
Engin sannprófun þýðinga á CI-stigi
Óþarflega flókin TMS-lausn
Ekki fylgst með hversu nýlegar þýðingar eru
Prófaðu i18n Agent núna
Slepptu þýðingarskránni þinni hér
JSON, YAML, PO, XML, CSV, Markdown, Properties
eða smelltu til að fletta
Markmál