كيفية العمل مع علامات اللغة مثل en-US و fr-CA
فهم بنية ومعنى علامات اللغة BCP 47 لاتخاذ قرارات أفضل في التدويل
مقدمة
علامات اللغة هي رموز موحدة تحدد لغات معينة وتنوعاتها الإقليمية. تظهر هذه العلامات في جميع أعمال التدويل. عندما تكتشف اللغة المفضلة للمستخدم، يعيد المتصفح علامات اللغة. عندما تقوم بتنسيق التواريخ أو الأرقام، تمرر علامات اللغة إلى واجهة برمجة التطبيقات Intl. عندما تقوم بتحميل الترجمات، تستخدم علامات اللغة لتحديد المحتوى الذي سيتم عرضه.
فهم كيفية عمل هذه العلامات يساعدك على اتخاذ قرارات أفضل بشأن اختيار اللغة، وسلوك الاحتياطي، وتنظيم المحتوى. يشرح هذا الدرس بنية علامات اللغة ويوضح لك كيفية العمل معها في JavaScript.
ما هي علامات اللغة
علامة اللغة هي سلسلة نصية مثل 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.
اتباع هذه الاصطلاحات يجعل علاماتك أسهل في القراءة ويطابق التنسيق المستخدم في الوثائق والمواصفات. ومع ذلك، يجب أن يقبل الكود الخاص بك علامات اللغة بغض النظر عن استخدام الأحرف الكبيرة، لأن التنسيق رسميًا غير حساس لحالة الأحرف.
تحليل علامات اللغة باستخدام JavaScript
توفر JavaScript منشئ Intl.Locale لتحليل علامات اللغة واستخراج مكوناتها. يقبل هذا المنشئ سلسلة علامة لغة ويعيد كائنًا يحتوي على خصائص لكل علامة فرعية.
const locale = new Intl.Locale("en-US");
console.log(locale.language);
// Output: "en"
console.log(locale.region);
// Output: "US"
يحتوي كائن Intl.Locale على خصائص لكل مكون من مكونات علامة اللغة. تُرجع هذه الخصائص قيمة غير معرّفة إذا لم تكن العلامة الفرعية المقابلة موجودة في العلامة الأصلية.
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 API
تقبل Intl API علامات اللغة مباشرة في جميع الـ constructors الخاصة بها. لا تحتاج إلى تحليل العلامة بنفسك إلا إذا كنت بحاجة إلى فحص مكونات محددة.
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 API علامة اللغة لتحديد اصطلاحات التنسيق المراد تطبيقها. تنسق المناطق المختلفة التواريخ والأرقام والعملات بشكل مختلف، حتى عندما يتحدثون نفس اللغة.
يمكنك تمرير علامة اللغة التي تحصل عليها من المتصفح مباشرة إلى Intl constructors.
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 constructor استثناء 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"
}
معظم علامات اللغة من المتصفحات صالحة، لكن إدخال المستخدم أو مصادر البيانات الخارجية قد تحتوي على علامات مشوهة. يمنع تغليف الـ constructor في معالجة الأخطاء هذه العلامات غير الصالحة من تعطيل تطبيقك.