ملفات Xcode .strings

الترجمة بالذكاء الاصطناعي لملفات Xcode .strings باستخدام واجهة سطر أوامر Lingo.dev

ما هي ملفات Xcode .strings؟

ملفات Xcode .strings هي تنسيق Apple لتخزين النصوص المترجمة في تطبيقات iOS وmacOS. تستخدم تنسيق بسيط للمفتاح والقيمة مع دعم للتعليقات والأحرف الخاصة.

على سبيل المثال:

/* أمثلة أساسية */
"welcome_message" = "Hello, world!";
"login_button" = "Log In";
"error_message" = "Something went wrong";

/* أحرف مهربة */
"quote_example" = "She said \"Hello world!\"";
"newline_example" = "First line\nSecond line";

/* يونيكود وأحرف خاصة */
"unicode_example" = "Hello 世界 🌍";
"emoji" = "👋 Hello! 🎉";

ما هي واجهة سطر أوامر Lingo.dev؟

واجهة سطر أوامر Lingo.dev هي أداة مجانية ومفتوحة المصدر لترجمة التطبيقات والمحتوى باستخدام الذكاء الاصطناعي. تم تصميمها لتحل محل برامج إدارة الترجمة التقليدية مع التكامل مع خطوط الإنتاج الحالية.

لمعرفة المزيد، راجع نظرة عامة.

حول هذا الدليل

يشرح هذا الدليل كيفية ترجمة ملفات Xcode .strings باستخدام واجهة سطر أوامر Lingo.dev.

ستتعلم كيفية:

  • إنشاء مشروع من الصفر
  • تكوين خط إنتاج الترجمة
  • إنشاء ترجمات باستخدام الذكاء الاصطناعي

المتطلبات الأساسية

لاستخدام واجهة سطر أوامر Lingo.dev، تأكد من تثبيت Node.js الإصدار 18 أو أحدث:

❯ node -v
v22.17.0

الخطوة 1. إعداد مشروع

في دليل مشروعك، قم بإنشاء ملف i18n.json:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {}
}

يحدد هذا الملف سلوك خط إنتاج الترجمة، بما في ذلك اللغات التي سيتم الترجمة بينها وأين يوجد المحتوى القابل للترجمة في نظام الملفات.

لمعرفة المزيد حول الخصائص المتاحة، راجع i18n.json.

الخطوة 2. تكوين اللغة المصدر

اللغة المصدر هي اللغة والمنطقة الأصلية التي تمت كتابة المحتوى بها. لتكوين اللغة المصدر، قم بتعيين خاصية locale.source في ملف i18n.json:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {}
}

يجب توفير اللغة المصدر كـ علامة لغة BCP 47.

للحصول على القائمة الكاملة لرموز اللغات التي تدعمها واجهة سطر أوامر Lingo.dev، راجع رموز اللغات المدعومة.

الخطوة 3. تكوين اللغات المستهدفة

اللغات المستهدفة هي اللغات والمناطق التي تريد ترجمة المحتوى الخاص بك إليها. لتكوين اللغات المستهدفة، قم بتعيين خاصية locale.targets في ملف i18n.json:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {}
}

الخطوة 4. إنشاء المحتوى المصدر

إذا لم تقم بذلك بالفعل، قم بإنشاء ملف أو أكثر من ملفات Xcode .strings التي تحتوي على المحتوى المراد ترجمته. يجب أن تكون هذه الملفات موجودة في مسار يتضمن اللغة المصدر في مكان ما في المسار (مثل اسم دليل مثل en/ أو كجزء من اسم الملف مثل messages.en.strings).

الخطوة 5. إنشاء حاوية

  1. في ملف i18n.json، أضف كائن "xcode-strings" إلى كائن buckets:

    {
      "$schema": "https://lingo.dev/schema/i18n.json",
      "version": "1.10",
      "locale": {
        "source": "en",
        "targets": ["es"]
      },
      "buckets": {
        "xcode-strings": {}
      }
    }
    
  2. في كائن "xcode-strings"، حدد مصفوفة تحتوي على نمط include واحد أو أكثر:

    {
      "$schema": "https://lingo.dev/schema/i18n.json",
      "version": "1.10",
      "locale": {
        "source": "en",
        "targets": ["es"]
      },
      "buckets": {
        "xcode-strings": {
          "include": ["./[locale]/example.strings"]
        }
      }
    }
    

    تحدد هذه الأنماط الملفات التي سيتم ترجمتها.

    الأنماط نفسها:

    • يجب أن تحتوي على [locale] كعنصر نائب للغة المكونة
    • يمكن أن تشير إلى مسارات الملفات (مثل "[locale]/Localizable.strings")
    • يمكن استخدام علامات النجمة كعناصر نائبة عامة (مثل "[locale]/*.strings")

    أنماط glob المتكررة (مثل **/*.strings) غير مدعومة.

الخطوة 6. تكوين نموذج لغوي كبير (LLM)

تستخدم واجهة سطر أوامر Lingo.dev نماذج لغوية كبيرة (LLMs) لترجمة المحتوى باستخدام الذكاء الاصطناعي. لاستخدام أحد هذه النماذج، تحتاج إلى مفتاح API من مزود مدعوم.

للبدء بأسرع وقت ممكن، نوصي باستخدام محرك Lingo.dev — منصتنا المستضافة التي توفر 10,000 رمز من الاستخدام المجاني الشهري:

  1. قم بالتسجيل للحصول على حساب Lingo.dev.

  2. قم بتشغيل الأمر التالي:

    npx lingo.dev@latest login
    

    سيؤدي هذا إلى فتح متصفح الويب الافتراضي الخاص بك ويطلب منك المصادقة.

  3. اتبع التعليمات.

الخطوة 7. إنشاء الترجمات

في الدليل الذي يحتوي على ملف i18n.json، قم بتشغيل الأمر التالي:

npx lingo.dev@latest run

هذا الأمر:

  1. يقرأ ملف i18n.json.
  2. يجد الملفات التي تحتاج إلى ترجمة.
  3. يستخرج المحتوى القابل للترجمة من الملفات.
  4. يستخدم نموذج اللغة الكبير (LLM) المُكوّن لترجمة المحتوى المستخرج.
  5. يكتب المحتوى المترجم مرة أخرى إلى نظام الملفات.

عند إنشاء الترجمات لأول مرة، يتم إنشاء ملف i18n.lock. يحتفظ هذا الملف بسجل للمحتوى الذي تمت ترجمته، مما يمنع إعادة الترجمة غير الضرورية في عمليات التشغيل اللاحقة.

مثال

en/example.strings

/* Basic examples */
"welcome_message" = "Hello, world!";
"login_button" = "Log In";
"error_message" = "Something went wrong";

"user_profile_title" = "User Profile";

/* Escaped characters */
"quote_example" = "She said \"Hello world!\"";
"newline_example" = "First line\nSecond line";

/* Unicode and special characters */
"unicode_example" = "Hello 世界 🌍";
"emoji" = "👋 Hello! 🎉";
"accents" = "Café, naïve, résumé";

/* Valid entries */
"settings_title" = "Settings";
"save_button" = "Save";

es/example.strings

/* Basic examples */
"welcome_message" = "¡Hola, mundo!";
"login_button" = "Iniciar Sesión";
"error_message" = "Algo salió mal";

"user_profile_title" = "Perfil de Usuario";

/* Escaped characters */
"quote_example" = "Ella dijo \"Hola mundo!\"";
"newline_example" = "Primera línea\nSegunda línea";

/* Unicode and special characters */
"unicode_example" = "Hola 世界 🌍";
"emoji" = "👋 ¡Hola! 🎉";
"accents" = "Café, naïve, résumé";

/* Valid entries */
"settings_title" = "Configuración";
"save_button" = "Guardar";

i18n.json

{
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {
    "xcode-strings": {
      "include": ["./[locale]/example.strings"]
    }
  },
  "$schema": "https://lingo.dev/schema/i18n.json"
}

i18n.lock

version: 1
checksums:
  c0001027bc43a90fe59344ea57847e7a:
    welcome_message: 0468579ef2fbc83c9d520c2f2f1c5059
    login_button: 0029e5a35676c0051e761fcd046ef9ee
    error_message: a3cd2f01c073f1f5ff436d4b132d39cf
    user_profile_title: bee775ff7216747b2111e93cefa57ddc
    quote_example: c519c83fe2629c0e9a6e7a14f64b6317
    newline_example: ae9313a2231a16f17e2367a4e5b322ee
    backslash_example: acf69a7273edf9f932f66027f699bbbe
    mixed_escapes: 9285b600baf307f7c060e20dc5778fad
    tab_example: 1451b8323511459dac68316a2594bb82
    multiline_literal: a4c5d1c388a06e29d96833e4d2f14a26
    multiline_mixed: f5d741606567d78281bc455074eb8f6c
    multiline_with_quotes: c82ec05ec488644808917b9c958da8cc
    after_comment: b7c19db10622cb67d4dd28270e85a428
    after_multiline_comment: 759d0ffce80451996a5a45b33a0870cc
    long_value: a54e8485e571c671e35865ba72cbcaf5
    unicode_example: 2de42b1aef6d20b314928b9c2554759d
    emoji: 1b387c2b5ce6c2cd608081ebcb5e6a94
    accents: 8c054e17f9b960d9317ca110a6fedf8c
    spaces_only: 8af60e2ee58a2e1e42071066e9c225da
    many_quotes: e2ff57b8058ab2c03c5b07cf901a7a48
    missing_semicolon: b2b5f0c3f552a348188de51bd4fcf511
    settings_title: 8df6777277469c1fd88cc18dde2f1cc3
    save_button: f7a2929f33bc420195e59ac5a8bcd454