Skip to main content

Translation File Sync: أبقِ مفاتيح i18n متزامنة عبر اللغات

في كل مرة يضيف فيها مطور مفتاحًا إلى لغة المصدر، تخرج 15 ملف locale أخرى عن التزامن. تُظهر المفاتيح المفقودة مسارات مفاتيح خام للمستخدمين. وتهدر المفاتيح المتقادمة وقت المترجمين وتزيد حجم الحزمة. تُبقي المزامنة الآلية كل شيء متوافقًا.

1

مشكلة المزامنة

تنحرف ملفات الترجمة عن بعضها باستمرار. يضيف مطور 'settings.notifications.title' إلى en.json لكنه ينسى إضافته إلى ملفات locale الخمسة عشر الأخرى. يزيل مطور آخر 'onboarding.welcome' من الكود لكنه يتركه في جميع ملفات locale. ويغيّر مطور ثالث 'user.name' إلى 'user.displayName' في الإنجليزية دون إجراء التغيير نفسه في اللغات الأخرى. على مدى أشهر، تتباعد ملفات locale لديك: مفاتيح مفقودة، أو متقادمة، أو غير متطابقة عبر اللغات.

The drift problem
// 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
}
المفاتيح المفقودة أسوأ من الترجمات المفقودة. يمكن للترجمة المفقودة أن تعود إلى لغة المصدر. أما المفتاح المفقود فيتسبب في خطأ وقت التشغيل، أو يعرض مسار مفتاح خام للمستخدم، أو يقدّم سلسلة فارغة. يجب فرض المزامنة، لا التعويل على حدوثها.
2

كشف المفاتيح المفقودة

المفتاح المفقود هو مفتاح يوجد في لغة المصدر لكنه غير موجود في لغة مستهدفة. هذه أكثر مشكلات المزامنة شيوعًا وأكثرها ضررًا؛ إذ يرى المستخدمون مسارات مفاتيح خام مثل 'settings.notifications.title' بدلًا من نص مترجم. يكتشف i18n-validate المفاتيح المفقودة عبر مقارنة بنية المفاتيح في كل لغة مقابل لغة المصدر.

Terminal
# 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)
شغّل i18n-validate مع العلامة --check missing-keys للتركيز تحديدًا على مشكلات المزامنة. استخدم --severity error لجعل المفاتيح المفقودة تُفشل CI، بما يضمن إصلاحها قبل الدمج.
3

كشف المفاتيح المتقادمة (Stale Keys)

المفتاح المتقادم هو مفتاح يوجد في ملفات الترجمة لكنه لم يعد مُشارًا إليه في الكود. تهدر المفاتيح المتقادمة وقت المترجمين (يترجمون سلاسل لا يراها أحد)، وتزيد حجم الحزمة، وتُحدث التباسًا في الصيانة. يتطلب كشف المفاتيح المتقادمة إجراء مطابقة بين ملفات locale ومراجع الكود.

Terminal
# 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
4

أتمتة المزامنة

تجمع أكثر استراتيجية مزامنة فعالية بين ثلاث طبقات: 1) خطافات pre-commit تتحقق من المزامنة في كل التزام. 2) فحوصات خط أنابيب CI تمنع الدمج عند وجود مشكلات مزامنة. 3) تدقيقات كاملة دورية تلتقط الانجراف المتراكم بسبب الإصلاحات السريعة والتعديلات اليدوية.

.husky/pre-commit
# .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
# .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.'
            })
5

إعداد تقارير تغطية الترجمة

تغطية الترجمة هي نسبة مفاتيح المصدر التي لديها ترجمات في كل لغة مستهدفة. ينشئ i18n-validate تقرير تغطية يوضح النسب لكل لغة، مع إبراز اللغات التي تتأخر. استخدم عتبات التغطية في CI لحظر عمليات الدمج عندما تنخفض التغطية عن مستوى مقبول.

Namespace-based sync
// 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
عيّن عتبات تغطية مختلفة لكل لغة. قد تتطلب لغاتك الأساسية (de, fr, ja) تغطية بنسبة 100%، بينما قد تبدأ اللغات المضافة حديثًا (th, vi) عند 80% ثم ترتفع تدريجيًا بمرور الوقت.

جرّب i18n Agent الآن

أفلت ملف الترجمة هنا

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

أو انقر للاستعراض

اللغات المستهدفة

لا حاجة إلى التسجيلتقدير فوري

أسئلة شائعة حول مزامنة ملفات الترجمة