Flutter ARB

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

ما هو Flutter ARB؟

Flutter ARB (حزمة موارد التطبيق) هو تنسيق قائم على JSON تستخدمه إطار عمل Flutter من Google لإدارة النصوص المترجمة. يدعم البيانات الوصفية والعناصر النائبة وتنسيق رسائل ICU لبناء تطبيقات مترجمة بشكل أصلي.

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

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

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

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

يشرح هذا الدليل كيفية ترجمة ملفات Flutter ARB باستخدام واجهة سطر أوامر 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. إنشاء المحتوى المصدر

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

بالنسبة لملفات Flutter ARB، تنطبق المتطلبات التالية:

  • يجب أن يكون لكل مفتاح رسالة قيمة ترجمة مقابلة
  • يتم الحفاظ على إدخالات البيانات الوصفية (التي تبدأ بـ @) ولكن لا تتم ترجمتها
  • حقل البيانات الوصفية @@locale يحدد اللغة
  • يتم الحفاظ على العناصر النائبة ({name}) أثناء الترجمة
  • يتم دعم تنسيق رسائل ICU للصيغ الجمعية والاختيارات

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

{
  "@@locale": "en",
  "welcome_message": "Welcome to our Flutter app",
  "@welcome_message": {
    "description": "The main welcome message shown on the home screen"
  },
  "login_button": "Log In",
  "greeting_with_name": "Hello {name}!",
  "@greeting_with_name": {
    "placeholders": {
      "name": {
        "type": "String"
      }
    }
  }
}

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

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

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

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

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

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

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

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

الخطوة 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.arb

{
  "@@locale": "en",
  "welcome_message": "Welcome to our Flutter app",
  "@welcome_message": {
    "description": "The main welcome message shown on the home screen",
    "context": "greeting"
  },
  "login_button": "Log In",
  "signup_button": "Sign Up",
  "greeting_with_name": "Hello {name}!",
  "@greeting_with_name": {
    "description": "Greeting message with user's name",
    "placeholders": {
      "name": {
        "type": "String",
        "description": "The user's display name"
      }
    }
  },
  "item_count": "{count, plural, =0 {No items} one {# item} other {# items}}",
  "@item_count": {
    "description": "Message showing the number of items with proper pluralization",
    "placeholders": {
      "count": {
        "type": "int",
        "description": "The number of items"
      }
    }
  }
}

es/example.arb

{
  "@@locale": "es",
  "welcome_message": "Bienvenido a nuestra aplicación Flutter",
  "@welcome_message": {
    "description": "The main welcome message shown on the home screen",
    "context": "greeting"
  },
  "login_button": "Iniciar sesión",
  "signup_button": "Registrarse",
  "greeting_with_name": "¡Hola {name}!",
  "@greeting_with_name": {
    "description": "Greeting message with user's name",
    "placeholders": {
      "name": {
        "type": "String",
        "description": "The user's display name"
      }
    }
  },
  "item_count": "{count, plural, =0 {Sin elementos} one {# elemento} other {# elementos}}",
  "@item_count": {
    "description": "Message showing the number of items with proper pluralization",
    "placeholders": {
      "count": {
        "type": "int",
        "description": "The number of items"
      }
    }
  }
}

i18n.json

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

i18n.lock

version: 1
checksums:
  88559ecadc7cff52625bd3a47e51dd78:
    welcome_message: 9c56d00796c3c7facba6a25275de5b7b
    login_button: 0029e5a35676c0051e761fcd046ef9ee
    signup_button: 0dd2ae69be4618c1f9e615774a4509ca
    error_network: e0becd5fc88e85a97c6987b96c80fb11
    success_message: e6dcd73052dc41dbe05d86af9887d2c4
    user_profile_title: bee775ff7216747b2111e93cefa57ddc
    settings_screen_title: 8df6777277469c1fd88cc18dde2f1cc3
    cancel_action: 2e2a849c2223911717de8caa2c71bade
    confirm_action: 90930b51154032f119fa75c1bd422d8b
    greeting_with_name: 218521f06746e82ba44d68c8a5bb210c
    item_count: d8d083b56bc155cf0997ea6ae989b83f
    user_status: 903b5a6edde5368dd9089accdc1b1f9d