تدويل تطبيقات Rust: من الصفر إلى تعدد اللغات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا يحتاج تطبيق Rust الخاص بك إلى التدويل (وكيف لا تفسد الأمور)

\n\n

لقد كتبت محللًا مثاليًا بلغة Rust. إنه يعمل أسرع من البرق ويستهلك ذاكرة أقل من عصفور متواضع. لكن هناك مشكلة واحدة: نصك يظهر باللغة الإنجليزية فقط. والمستخدمون من طوكيو وبرلين وسانت بطرسبرغ يريدون رؤية الواجهة بلغتهم الأم.

\n\n

التدويل (i18n) ليس مجرد "ترجمة الأزرار". إنه قرار معماري يمكن أن يحول كودك إلى منشئ أنيق أو إلى مكب نفايات جحيمي من if-else. في هذه المقالة، سنشرح كيفية تنفيذ التدويل في Rust بشكل صحيح: بدون ألم، مع أمثلة، ومع احترام لعقول المطور المستقبلي (عقلك).

\n\n

سنتحدث عن نهجين قويين: مكتبة fluent (توصية من Mozilla) و rust-i18n الكلاسيكي القائم على gettext. في نهاية المقال، ستتمكن من إضافة دعم اللغة الروسية والإنجليزية وأي لغة أخرى إلى أداتك في 15 دقيقة.

\n\n

خطة المعركة: ما هو i18n و l10n في عالم Rust

\n\n

قبل أن ننغمس في الكود، دعونا نتفق على المصطلحات:

\n
    \n
  • التدويل (i18n) — إعداد الكود للترجمة. تقوم بإخراج جميع السلاسل النصية إلى ملفات منفصلة وتعليم البرنامج كيفية تحميل اللغة المناسبة.
  • \n
  • التوطين (l10n) — الترجمة نفسها. إنشاء ملفات لكل لغة.
  • \n
  • اللغة المحلية — مزيج من اللغة والمنطقة (مثل ru-RU، en-US، de-DE).
  • \n
\n\n

في Rust، هناك عدة طرق. سننظر في اثنتين من الأكثر شيوعًا:

\n
    \n
  • Fluent — نظام حديث من Mozilla. قوي، مرن، مع دعم الجمع والسياق.
  • \n
  • rust-i18n — وحدات ماكرو مستوحاة من Ruby on Rails. أبسط، لكنها أقل مرونة.
  • \n
\n\n

الاختيار يعتمد على المهمة. بالنسبة لأدوات CLI، فإن rust-i18n كافٍ. بالنسبة لتطبيقات الويب أو واجهات المستخدم الرسومية المعقدة (مثل Tauri)، من الأفضل استخدام Fluent.

\n\n

الطريقة رقم 1: تدويل Rust باستخدام Fluent (النهج الاحترافي)

\n\n

تثبيت وإعداد Fluent

\n\n

لنقم بإنشاء مشروع جديد وإضافة التبعيات:

\n\n
cargo new i18n_demo\ncd i18n_demo\ncargo add fluent fluent-bundle fluent-langtag unic-langid\n
\n\n

سيكون هيكل الملفات كالتالي:

\n\n
مشروع/\n├── Cargo.toml\n├── locales/\n│   ├── ru/\n│   │   └── main.ftl\n│   └── en/\n│       └── main.ftl\n└── src/\n    └── main.rs\n
\n\n

إنشاء ملفات التوطين (FTL)

\n\n

يستخدم Fluent تنسيق FTL (قائمة ترجمة Fluent). إنه النقاء والقوة:

\n\n

locales/en/main.ftl:

\n
greeting = Hello, { $name }!\ngoodbye = Goodbye\napples = { $count ->\n    [one] { $count } apple\n    [few] { $count } apples\n    *[other] { $count } apples\n}\n
\n\n

locales/ru/main.ftl:

\n
greeting = Привет, { $name }!\ngoodbye = До свидания\napples = { $count ->\n    [one] { $count } яблоко\n    [few] { $count } яблока\n    [many] { $count } яблок\n    *[other] { $count } яблок\n}\n
\n\n

لاحظ الجمع. في اللغة الروسية، هناك أربع صيغ (واحد، اثنان-أربعة، خمسة-عشرون، والباقي)، بينما في الإنجليزية هناك اثنتان (واحد، والباقي). يتعامل Fluent مع هذا تلقائيًا.

\n\n

كتابة كود Rust لتحميل اللغات المحلية

\n\n

الآن الجزء الممتع — الكود الذي سيختار اللغة المناسبة بناءً على نظام المستخدم:

\n\n
use fluent_bundle::{FluentBundle, FluentResource};\nuse unic_langid::LanguageIdentifier;\nuse std::fs;\nuse std::path::Path;\n\nfn load_locale(locale: &str) -> FluentBundle<FluentResource> {\n    let langid: LanguageIdentifier = locale.parse().expect("لغة محلية غير صالحة");\n    let mut bundle = FluentBundle::new(vec![langid]);\n\n    let file_path = format!("locales/{}/main.ftl", locale);\n    let source = fs::read_to_string(&file_path)\n        .expect(&fo                

المدونات

توصيات الكتب