كيفية العمل مع علامات اللغة مثل en-US و fr-CA
فهم بنية ومعنى علامات اللغة BCP 47 لاتخاذ قرارات أفضل في التدويل
مقدمة
علامات اللغة هي رموز موحدة تحدد لغات معينة وتنوعاتها الإقليمية. تظهر هذه العلامات في جميع أعمال التدويل. عندما تكتشف اللغة المفضلة للمستخدم، يقوم المتصفح بإرجاع علامات اللغة. عندما تقوم بتنسيق التواريخ أو الأرقام، تمرر علامات اللغة إلى واجهة برمجة التطبيقات Intl. عندما تقوم بتحميل الترجمات، تستخدم علامات اللغة لتحديد المحتوى الذي سيتم عرضه.
فهم كيفية عمل هذه العلامات يساعدك على اتخاذ قرارات أفضل بشأن اختيار اللغة، وسلوك الرجوع، وتنظيم المحتوى. يشرح هذا الدرس بنية علامات اللغة ويوضح لك كيفية العمل معها في جافا سكريبت.
ما هي علامات اللغة
علامة اللغة هي سلسلة مثل en، en-US، أو zh-Hans-CN تحدد اللغة وتحدد اختيارياً النص والمنطقة. تتبع هذه العلامات معيار BCP 47، الذي تحتفظ به فرقة عمل هندسة الإنترنت وهيئة أرقام الإنترنت المخصصة.
BCP 47 تعني أفضل الممارسات الحالية 47. يحدد المعيار كيفية بناء علامات اللغة من مكونات أصغر تسمى العلامات الفرعية. تمثل كل علامة فرعية جانباً محدداً من اللغة، مثل اللغة المستخدمة، أو نظام الكتابة المستخدم، أو البلد المرتبط بها.
تستخدم كل لغة برمجة ومكتبة تدويل علامات BCP 47. هذا الاتساق يعني أنه يمكنك استخدام نفس معرفات اللغة عبر تطبيقك بأكمله، من اكتشاف المتصفح إلى تنسيق الخادم إلى أسماء ملفات الترجمة.
بنية علامات اللغة
تتكون علامات اللغة من علامات فرعية مفصولة بواسطة واصلات. العلامات الفرعية الثلاث الأكثر شيوعاً هي اللغة، والنص، والمنطقة. تظهر هذه العلامات الفرعية دائماً بهذا الترتيب المحدد عند وجودها.
تأتي العلامة الفرعية للغة أولاً وهي المكون الوحيد المطلوب. تستخدم رمزاً من حرفين أو ثلاثة أحرف من ISO 639. على سبيل المثال، en تمثل الإنجليزية، fr تمثل الفرنسية، وzh تمثل الصينية.
تأتي العلامة الفرعية للنص ثانياً عند وجودها. تستخدم رمزاً من أربعة أحرف من ISO 15924 يحدد نظام الكتابة. على سبيل المثال، Latn يمثل الأبجدية اللاتينية، Cyrl يمثل السيريلية، وHans يمثل الحروف الصينية المبسطة.
تأتي العلامة الفرعية للمنطقة أخيراً عند وجودها. تستخدم رمزاً من حرفين من ISO 3166-1 يمثل عادةً بلداً. على سبيل المثال، US تمثل الولايات المتحدة، CA تمثل كندا، وCN تمثل الصين.
أمثلة على علامات اللغة الشائعة
فيما يلي أمثلة توضح المستويات المختلفة من التحديد التي يمكنك التعبير عنها باستخدام علامات اللغة.
علامات بسيطة تحتوي على لغة فقط:
en- الإنجليزية (بدون منطقة أو نص محدد)fr- الفرنسية (بدون منطقة أو نص محدد)es- الإسبانية (بدون منطقة أو نص محدد)
علامات تحتوي على لغة ومنطقة:
en-US- الإنجليزية كما تُستخدم في الولايات المتحدةen-GB- الإنجليزية كما تُستخدم في بريطانيا العظمىfr-CA- الفرنسية كما تُستخدم في كنداes-MX- الإسبانية كما تُستخدم في المكسيك
علامات تحتوي على لغة ونص ومنطقة:
zh-Hans-CN- الصينية باستخدام الأحرف المبسطة في الصينzh-Hant-TW- الصينية باستخدام الأحرف التقليدية في تايوانsr-Latn-RS- الصربية باستخدام النص اللاتيني في صربياsr-Cyrl-RS- الصربية باستخدام النص السيريلي في صربيا
يعتمد مستوى التحديد الذي تحتاجه على تطبيقك. إذا كنت تقوم بترجمة النص فقط، فقد تحتاج فقط إلى اللغة والمنطقة. إذا كنت تعمل مع لغات تستخدم أنظمة كتابة متعددة، فأنت بحاجة إلى علامات فرعية للنصوص.
اصطلاحات الحالة لعلامات اللغة
علامات اللغة غير حساسة لحالة الأحرف. العلامات en-US وEN-US وen-us وEn-Us كلها تمثل نفس اللغة. ومع ذلك، هناك أنماط استخدام الأحرف الكبيرة التقليدية التي تجعل العلامات أكثر قابلية للقراءة.
تستخدم العلامات الفرعية للغة تقليديًا الأحرف الصغيرة. اكتب en، وليس EN أو En.
تستخدم العلامات الفرعية للنصوص تقليديًا حالة العنوان مع الحرف الأول بحرف كبير. اكتب Latn، وليس latn أو LATN.
تستخدم العلامات الفرعية للمنطقة تقليديًا الأحرف الكبيرة. اكتب US، وليس us أو Us.
اتباع هذه الاصطلاحات يجعل علاماتك أسهل للقراءة ويتطابق مع التنسيق المستخدم في الوثائق والمواصفات. ومع ذلك، يجب أن يقبل الكود الخاص بك علامات اللغة بغض النظر عن حالة الأحرف، لأن التنسيق رسميًا غير حساس لحالة الأحرف.
تحليل علامات اللغة باستخدام جافا سكريبت
توفر جافا سكريبت منشئ Intl.Locale لتحليل علامات اللغة واستخراج مكوناتها. يقبل هذا المنشئ سلسلة علامة لغة ويعيد كائنًا بخصائص لكل علامة فرعية.
const locale = new Intl.Locale("en-US");
console.log(locale.language);
// Output: "en"
console.log(locale.region);
// Output: "US"
يحتوي كائن Intl.Locale على خصائص لكل مكون من مكونات علامة اللغة. تعيد هذه الخصائص قيمة undefined إذا لم تكن العلامة الفرعية المقابلة موجودة في العلامة الأصلية.
const simple = new Intl.Locale("fr");
console.log(simple.language);
// Output: "fr"
console.log(simple.region);
// Output: undefined
يمكنك تحليل العلامات ذات العلامات الفرعية للنص بنفس الطريقة.
const complex = new Intl.Locale("zh-Hans-CN");
console.log(complex.language);
// Output: "zh"
console.log(complex.script);
// Output: "Hans"
console.log(complex.region);
// Output: "CN"
تعتبر هذه القدرة على التحليل مفيدة عندما تحتاج إلى اتخاذ قرارات بناءً على مكونات محددة من علامة اللغة. على سبيل المثال، قد ترغب في تحميل خطوط مختلفة بناءً على النص، أو عرض محتوى مختلف بناءً على المنطقة.
متى تستخدم العلامات المحددة مقابل العلامات العامة
يعتمد اختيار المستوى المناسب من التحديد لعلامات اللغة على جوانب اللغة والثقافة التي يحتاج تطبيقك إلى التعامل معها.
استخدم علامات اللغة فقط مثل en أو fr عندما يكون لديك ترجمة واحدة تعمل لجميع المتحدثين بتلك اللغة. هذا شائع للتطبيقات ذات ميزانيات التوطين المحدودة أو اللغات ذات الاختلافات الإقليمية الضئيلة.
استخدم علامات اللغة والمنطقة مثل en-US أو fr-CA عندما تحتاج إلى مراعاة الاختلافات الإقليمية في المفردات أو الإملاء أو الاتفاقيات الثقافية. تستخدم الإنجليزية البريطانية والإنجليزية الأمريكية تهجئات مختلفة للعديد من الكلمات. الفرنسية الكندية والفرنسية الأوروبية لديهما مفردات وتعبيرات مختلفة.
استخدم علامات اللغة والنص والمنطقة مثل zh-Hans-CN عندما تعمل مع لغات تستخدم أنظمة كتابة متعددة. يمكن كتابة الصينية بأحرف مبسطة أو تقليدية. يمكن كتابة الصربية بالأبجدية اللاتينية أو السيريلية. تميز العلامة الفرعية للنص بين هذه المتغيرات.
استخراج رموز اللغة لملفات الترجمة
تنظم العديد من أنظمة الترجمة الملفات حسب رمز اللغة. يمكنك استخراج اللغة والمنطقة فقط من علامة اللغة الكاملة لتحديد ملف الترجمة الذي يجب تحميله.
const userLanguage = "zh-Hans-CN";
const locale = new Intl.Locale(userLanguage);
const translationKey = `${locale.language}-${locale.region}`;
console.log(translationKey);
// Output: "zh-CN"
يعمل هذا النهج حتى إذا كانت علامة لغة المستخدم تتضمن مكونات لا تحتاجها لاختيار الملف.
تستخدم بعض التطبيقات رمز اللغة فقط بدون المنطقة.
const userLanguage = "fr-CA";
const locale = new Intl.Locale(userLanguage);
const translationKey = locale.language;
console.log(translationKey);
// Output: "fr"
يجب أن تتطابق البنية التي تختارها لأسماء ملفات الترجمة مع كيفية استخراج المكونات من علامات اللغة.
استخدام علامات اللغة مع واجهة برمجة التطبيقات Intl
تقبل واجهة برمجة التطبيقات Intl علامات اللغة مباشرة في جميع منشئاتها. لا تحتاج إلى تحليل العلامة بنفسك ما لم تكن بحاجة إلى فحص مكونات محددة.
const date = new Date("2025-03-15");
const usFormat = new Intl.DateTimeFormat("en-US").format(date);
console.log(usFormat);
// Output: "3/15/2025"
const gbFormat = new Intl.DateTimeFormat("en-GB").format(date);
console.log(gbFormat);
// Output: "15/03/2025"
تستخدم واجهة برمجة التطبيقات Intl علامة اللغة لتحديد اتفاقيات التنسيق التي يجب تطبيقها. تقوم المناطق المختلفة بتنسيق التواريخ والأرقام والعملات بشكل مختلف، حتى عندما يتحدثون نفس اللغة.
يمكنك تمرير علامة اللغة التي تحصل عليها من المتصفح مباشرة إلى منشئات Intl.
const userLanguage = navigator.language;
const formatter = new Intl.NumberFormat(userLanguage);
console.log(formatter.format(1234.5));
// Output varies by language
// For "en-US": "1,234.5"
// For "de-DE": "1.234,5"
هذا هو النمط الأكثر شيوعًا في التدويل على جانب العميل. اكتشف لغة المستخدم، ثم استخدم علامة اللغة تلك في جميع أنحاء تطبيقك لتنسيق المحتوى بشكل مناسب.
التعامل مع علامات اللغة غير الصالحة
يقوم منشئ Intl.Locale برمي خطأ RangeError إذا قمت بتمرير علامة لغة غير صالحة. يجب عليك معالجة هذا الخطأ عند العمل مع علامات اللغة من مصادر غير موثوقة.
try {
const locale = new Intl.Locale("invalid-tag-format");
} catch (error) {
console.log(error.name);
// Output: "RangeError"
console.log(error.message);
// Output: "invalid language tag: invalid-tag-format"
}
معظم علامات اللغة من المتصفحات تكون صالحة، ولكن إدخال المستخدم أو مصادر البيانات الخارجية قد تحتوي على علامات مشوهة. إن تغليف المنشئ في معالجة الأخطاء يمنع هذه العلامات غير الصالحة من تعطيل تطبيقك.