
Translation File Sync: أبقِ مفاتيح i18n متزامنة عبر اللغات
في كل مرة يضيف فيها مطور مفتاحًا إلى لغة المصدر، تخرج 15 ملف locale أخرى عن التزامن. تُظهر المفاتيح المفقودة مسارات مفاتيح خام للمستخدمين. وتهدر المفاتيح المتقادمة وقت المترجمين وتزيد حجم الحزمة. تُبقي المزامنة الآلية كل شيء متوافقًا.
مشكلة المزامنة
تنحرف ملفات الترجمة عن بعضها باستمرار. يضيف مطور 'settings.notifications.title' إلى en.json لكنه ينسى إضافته إلى ملفات locale الخمسة عشر الأخرى. يزيل مطور آخر 'onboarding.welcome' من الكود لكنه يتركه في جميع ملفات locale. ويغيّر مطور ثالث 'user.name' إلى 'user.displayName' في الإنجليزية دون إجراء التغيير نفسه في اللغات الأخرى. على مدى أشهر، تتباعد ملفات locale لديك: مفاتيح مفقودة، أو متقادمة، أو غير متطابقة عبر اللغات.
// The problem: translation files drift out of sync
// Developer adds a new feature with new keys:
// en.json (source of truth)
{
"nav.home": "Home",
"nav.about": "About",
"nav.pricing": "Pricing", // NEW
"nav.changelog": "Changelog" // NEW
}
// de.json (out of sync - missing new keys)
{
"nav.home": "Startseite",
"nav.about": "Über uns"
// nav.pricing - MISSING
// nav.changelog - MISSING
}
// de.json also has stale keys from deleted features:
{
"nav.home": "Startseite",
"nav.about": "Über uns",
"nav.legacy_page": "Alte Seite" // STALE - removed from en.json
}كشف المفاتيح المفقودة
المفتاح المفقود هو مفتاح يوجد في لغة المصدر لكنه غير موجود في لغة مستهدفة. هذه أكثر مشكلات المزامنة شيوعًا وأكثرها ضررًا؛ إذ يرى المستخدمون مسارات مفاتيح خام مثل 'settings.notifications.title' بدلًا من نص مترجم. يكتشف i18n-validate المفاتيح المفقودة عبر مقارنة بنية المفاتيح في كل لغة مقابل لغة المصدر.
# Detect missing and stale keys
npx i18n-validate sync \
--source locales/en.json \
--targets 'locales/*.json'
# Output:
# locales/de.json:
# Missing keys (2):
# - nav.pricing
# - nav.changelog
# Stale keys (1):
# - nav.legacy_page
# Coverage: 66.7% (2/3 keys)
#
# locales/ja.json:
# Missing keys (5):
# - nav.pricing
# - nav.changelog
# - settings.theme
# - settings.language
# - settings.notifications
# Coverage: 50.0% (5/10 keys)كشف المفاتيح المتقادمة (Stale Keys)
المفتاح المتقادم هو مفتاح يوجد في ملفات الترجمة لكنه لم يعد مُشارًا إليه في الكود. تهدر المفاتيح المتقادمة وقت المترجمين (يترجمون سلاسل لا يراها أحد)، وتزيد حجم الحزمة، وتُحدث التباسًا في الصيانة. يتطلب كشف المفاتيح المتقادمة إجراء مطابقة بين ملفات locale ومراجع الكود.
# Step 1: Check which files are out of sync
npx i18n-validate sync --source locales/en.json --targets 'locales/*.json'
# Step 2: Auto-fill missing keys with source values (as placeholders)
npx i18n-validate sync \
--source locales/en.json \
--targets 'locales/*.json' \
--fill-missing \
--fill-value "[NEEDS TRANSLATION] {{source}}"
# Step 3: Remove stale keys no longer in source
npx i18n-validate sync \
--source locales/en.json \
--targets 'locales/*.json' \
--remove-stale
# Step 4: Sort keys to match source order (cleaner diffs)
npx i18n-validate sync \
--source locales/en.json \
--targets 'locales/*.json' \
--sort-keys
# All at once:
npx i18n-validate sync \
--source locales/en.json \
--targets 'locales/*.json' \
--fill-missing \
--remove-stale \
--sort-keysأتمتة المزامنة
تجمع أكثر استراتيجية مزامنة فعالية بين ثلاث طبقات: 1) خطافات pre-commit تتحقق من المزامنة في كل التزام. 2) فحوصات خط أنابيب CI تمنع الدمج عند وجود مشكلات مزامنة. 3) تدقيقات كاملة دورية تلتقط الانجراف المتراكم بسبب الإصلاحات السريعة والتعديلات اليدوية.
# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
# Check if source locale file changed
SOURCE_CHANGED=$(git diff --cached --name-only | grep -c 'locales/en.json')
if [ "$SOURCE_CHANGED" -gt 0 ]; then
echo "Source locale changed - checking sync..."
npx i18n-validate sync \
--source locales/en.json \
--targets 'locales/*.json' \
--fail-on-missing \
--min-coverage 90
if [ $? -ne 0 ]; then
echo ""
echo "Translation files are out of sync!"
echo "Run: npx i18n-validate sync --fill-missing"
exit 1
fi
fi# .github/workflows/i18n-sync.yml
name: Translation Sync Check
on:
pull_request:
paths:
- 'locales/**'
jobs:
sync-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check translation sync
run: npx i18n-validate sync \
--source locales/en.json \
--targets 'locales/*.json' \
--fail-on-missing \
--min-coverage 95
- name: Comment on PR if out of sync
if: failure()
uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: 'Translation files are out of sync. Please run npx i18n-validate sync --fill-missing and commit.'
})إعداد تقارير تغطية الترجمة
تغطية الترجمة هي نسبة مفاتيح المصدر التي لديها ترجمات في كل لغة مستهدفة. ينشئ i18n-validate تقرير تغطية يوضح النسب لكل لغة، مع إبراز اللغات التي تتأخر. استخدم عتبات التغطية في CI لحظر عمليات الدمج عندما تنخفض التغطية عن مستوى مقبول.
// Split large translation files by feature/namespace
// locales/
// ├── en/
// │ ├── common.json (nav, footer, errors)
// │ ├── auth.json (login, register, reset)
// │ ├── dashboard.json (dashboard-specific)
// │ └── settings.json (settings page)
// ├── de/
// │ ├── common.json
// │ ├── auth.json
// │ ├── dashboard.json
// │ └── settings.json
// Sync with namespace support:
npx i18n-validate sync \
--source 'locales/en/*.json' \
--targets 'locales/*/%.json' \
--namespace-pattern '{locale}/{namespace}.json'
// Benefits:
// - Smaller files, easier to review
// - Feature teams own their translations
// - Lazy-load only needed namespaces
// - Parallel translation workflowsجرّب i18n Agent الآن
أفلت ملف الترجمة هنا
JSON, YAML, PO, XML, CSV, Markdown, Properties
أو انقر للاستعراض
اللغات المستهدفة