كيفية بناء معرّفات اللغة من المكونات

إنشاء معرّفات اللغة من خلال دمج رموز اللغة والنص والمنطقة في JavaScript

مقدمة

معرّفات اللغة مثل en-US أو zh-Hans-CN تحتوي على معلومات حول اللغة ونظام الكتابة والمنطقة. في بعض الأحيان تحتاج إلى إنشاء هذه المعرّفات برمجياً بدلاً من استخدام نص ثابت. على سبيل المثال، قد تسمح للمستخدمين باختيار لغتهم ومنطقتهم بشكل منفصل، ثم دمجهما في معرّف لغة صالح.

دالة البناء Intl.Locale في JavaScript تتيح لك بناء معرّفات اللغة من مكونات فردية. يمكنك تحديد اللغة والنص والمنطقة كمعاملات منفصلة، وتقوم دالة البناء بتجميعها في معرّف منسق بشكل صحيح.

يشرح هذا الدليل كيفية إنشاء معرّفات اللغة من المكونات، ومتى يتم استخدام هذا النهج، وكيفية التعامل مع الحالات الاستثنائية.

فهم مكونات معرّف اللغة

تتكون معرّفات اللغة من مكونات مفصولة بشرطات. يمثل كل مكون جانباً مختلفاً من التفضيلات الثقافية.

يحدد رمز اللغة اللغة المراد استخدامها. يستخدم حرفين أو ثلاثة أحرف صغيرة من ISO 639:

  • en للإنجليزية
  • es للإسبانية
  • fr للفرنسية
  • zh للصينية
  • ar للعربية

يحدد رمز النص نظام الكتابة. يستخدم أربعة أحرف مع كتابة الحرف الأول بحرف كبير، من ISO 15924:

  • Hans للأحرف الصينية المبسطة
  • Hant للأحرف الصينية التقليدية
  • Cyrl للنص السيريلي
  • Latn للنص اللاتيني

يحدد رمز المنطقة المنطقة الجغرافية. يستخدم حرفين كبيرين من ISO 3166-1 أو ثلاثة أرقام من UN M.49:

  • US للولايات المتحدة
  • GB للمملكة المتحدة
  • CN للصين
  • MX للمكسيك

تتحد هذه المكونات بترتيب محدد: اللغة، ثم الكتابة، ثم المنطقة. على سبيل المثال، zh-Hans-CN يعني اللغة الصينية، الكتابة المبسطة، منطقة الصين.

بناء اللغات المحلية باستخدام اللغة والمنطقة فقط

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

يمكنك إنشاء لغة محلية عن طريق تمرير رمز اللغة كوسيطة أولى وكائن خيارات يحتوي على المنطقة:

const locale = new Intl.Locale("en", {
  region: "US"
});

console.log(locale.toString());
// Output: "en-US"

ينشئ هذا معرف لغة محلية للإنجليزية الأمريكية.

يمكنك بناء متغيرات إقليمية مختلفة لنفس اللغة:

const usEnglish = new Intl.Locale("en", { region: "US" });
const britishEnglish = new Intl.Locale("en", { region: "GB" });
const canadianEnglish = new Intl.Locale("en", { region: "CA" });

console.log(usEnglish.toString()); // "en-US"
console.log(britishEnglish.toString()); // "en-GB"
console.log(canadianEnglish.toString()); // "en-CA"

يستخدم كل متغير نفس اللغة ولكن اتفاقيات تنسيق إقليمية مختلفة.

بناء اللغات المحلية باستخدام اللغة والكتابة والمنطقة

تتطلب بعض اللغات رموز كتابة صريحة. تستخدم الصينية والصربية وبعض اللغات الأخرى أنظمة كتابة متعددة. يجب عليك تحديد الكتابة لتجنب الغموض.

يمكنك إضافة مكون الكتابة إلى كائن الخيارات:

const simplifiedChinese = new Intl.Locale("zh", {
  script: "Hans",
  region: "CN"
});

console.log(simplifiedChinese.toString());
// Output: "zh-Hans-CN"

ينشئ هذا لغة محلية للصينية المبسطة كما تُستخدم في الصين.

تستخدم الصينية التقليدية كتابة ومنطقة مختلفة:

const traditionalChinese = new Intl.Locale("zh", {
  script: "Hant",
  region: "TW"
});

console.log(traditionalChinese.toString());
// Output: "zh-Hant-TW"

يميز رمز الكتابة بين نظامي الكتابة.

تستخدم الصربية كلاً من الكتابة السيريلية واللاتينية. تحتاج إلى تحديد الكتابة المراد استخدامها:

const serbianCyrillic = new Intl.Locale("sr", {
  script: "Cyrl",
  region: "RS"
});

const serbianLatin = new Intl.Locale("sr", {
  script: "Latn",
  region: "RS"
});

console.log(serbianCyrillic.toString()); // "sr-Cyrl-RS"
console.log(serbianLatin.toString()); // "sr-Latn-RS"

تستخدم كلتا اللغتين المحليتين اللغة الصربية في صربيا، ولكن بأنظمة كتابة مختلفة.

بناء اللغات المحلية من اختيارات المستخدم

غالبًا ما تتيح واجهات المستخدم للمستخدمين تحديد اللغة والمنطقة بشكل منفصل. يمكنك دمج هذه الاختيارات في معرّف لغة محلية.

لنأخذ في الاعتبار نموذج إعدادات يحتوي على قائمتين منسدلتين:

function buildLocaleFromSelections(languageCode, regionCode) {
  const locale = new Intl.Locale(languageCode, {
    region: regionCode
  });

  return locale.toString();
}

const userLocale = buildLocaleFromSelections("es", "MX");
console.log(userLocale);
// Output: "es-MX"

ينشئ هذا معرّف لغة محلية من اختيارات مستقلة.

يمكنك التحقق من صحة الاختيارات من خلال اعتراض الأخطاء من المُنشئ:

function buildLocaleFromSelections(languageCode, regionCode) {
  try {
    const locale = new Intl.Locale(languageCode, {
      region: regionCode
    });
    return {
      success: true,
      locale: locale.toString()
    };
  } catch (error) {
    return {
      success: false,
      error: error.message
    };
  }
}

const valid = buildLocaleFromSelections("fr", "CA");
console.log(valid);
// Output: { success: true, locale: "fr-CA" }

const invalid = buildLocaleFromSelections("invalid", "XX");
console.log(invalid);
// Output: { success: false, error: "..." }

يطرح المُنشئ RangeError إذا كان أي مكون غير صالح.

بناء اللغات المحلية مع مكونات اختيارية

ليست كل لغة محلية بحاجة إلى كل مكون. يمكنك حذف المكونات غير المطلوبة.

تحذف اللغة المحلية التي تحتوي على اللغة فقط المنطقة والنص:

const locale = new Intl.Locale("fr");
console.log(locale.toString());
// Output: "fr"

يمثل هذا اللغة الفرنسية دون تحديد منطقة أو نص معين.

يمكنك تضمين المكونات بشكل مشروط بناءً على إدخال المستخدم:

function buildLocale(language, options = {}) {
  const localeOptions = {};

  if (options.region) {
    localeOptions.region = options.region;
  }

  if (options.script) {
    localeOptions.script = options.script;
  }

  const locale = new Intl.Locale(language, localeOptions);
  return locale.toString();
}

console.log(buildLocale("en"));
// Output: "en"

console.log(buildLocale("en", { region: "US" }));
// Output: "en-US"

console.log(buildLocale("zh", { script: "Hans", region: "CN" }));
// Output: "zh-Hans-CN"

تبني الدالة أبسط معرّف لغة محلية صالح بناءً على المعلومات المتاحة.

تجاوز المكونات في اللغات المحلية الموجودة

يمكنك أخذ معرّف لغة محلية موجود وتجاوز مكونات محددة. يكون هذا مفيدًا عندما تحتاج إلى تغيير جزء واحد مع الحفاظ على الأجزاء الأخرى سليمة.

يتجاوز الوسيط الثاني للمُنشئ المكونات من الوسيط الأول:

const baseLocale = new Intl.Locale("en-US");
const withDifferentRegion = new Intl.Locale(baseLocale, {
  region: "GB"
});

console.log(withDifferentRegion.toString());
// Output: "en-GB"

تحتفظ اللغة المحلية الجديدة باللغة ولكنها تغير المنطقة.

يمكنك تجاوز مكونات متعددة:

const original = new Intl.Locale("zh-Hans-CN");
const modified = new Intl.Locale(original, {
  script: "Hant",
  region: "TW"
});

console.log(modified.toString());
// Output: "zh-Hant-TW"

يغير هذا كلاً من النص والمنطقة مع الحفاظ على اللغة.

إضافة تفضيلات التنسيق إلى اللغات المحلية المُنشأة

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

يمكنك إضافة تفضيلات التقويم عند إنشاء لغة محلية:

const locale = new Intl.Locale("ar", {
  region: "SA",
  calendar: "islamic"
});

console.log(locale.toString());
// Output: "ar-SA-u-ca-islamic"

console.log(locale.calendar);
// Output: "islamic"

يظهر تفضيل التقويم كامتداد يونيكود في سلسلة المعرّف.

يمكنك تحديد تفضيلات تنسيق متعددة:

const locale = new Intl.Locale("en", {
  region: "US",
  calendar: "gregory",
  numberingSystem: "latn",
  hourCycle: "h12"
});

console.log(locale.toString());
// Output: "en-US-u-ca-gregory-hc-h12-nu-latn"

يرتب المُنشئ مفاتيح الامتداد أبجديًا.

تؤثر هذه التفضيلات على كيفية عرض المنسقات للبيانات:

const locale = new Intl.Locale("ar", {
  region: "EG",
  numberingSystem: "arab"
});

const formatter = new Intl.NumberFormat(locale);
console.log(formatter.format(12345));
// Output: "١٢٬٣٤٥" (Arabic-Indic numerals)

يتحكم تفضيل نظام الترقيم في الأرقام التي تظهر.

التحقق من صحة مجموعات المكونات

ليست كل مجموعات اللغة والنص والمنطقة ذات معنى. يقبل المُنشئ أي مكونات صالحة من الناحية النحوية، لكن بعض المجموعات قد لا تمثل لغات محلية حقيقية.

يتحقق المُنشئ من صحة البناء النحوي وليس الصحة الدلالية:

// Syntactically valid but semantically questionable
const locale = new Intl.Locale("en", {
  script: "Arab",
  region: "JP"
});

console.log(locale.toString());
// Output: "en-Arab-JP"

ينشئ هذا لغة محلية للإنجليزية بالنص العربي في اليابان. المعرّف صالح وفقًا لـ BCP 47، لكنه لا يمثل لغة محلية حقيقية.

يمكنك استخدام طريقة maximize() للتحقق مما إذا كانت اللغة المحلية تطابق الأنماط الشائعة:

const locale = new Intl.Locale("en", { region: "JP" });
const maximized = locale.maximize();

console.log(maximized.toString());
// Output: "en-Latn-JP"

تضيف الطريقة النص الأكثر احتمالاً للغة. إذا طابقت النتيجة الأنماط المتوقعة، فإن المجموعة معقولة.

قراءة المكونات من اللغات المحلية المُنشأة

بعد إنشاء لغة محلية، يمكنك قراءة مكوناتها كخصائص.

تُرجع خاصية language رمز اللغة:

const locale = new Intl.Locale("fr", { region: "CA" });
console.log(locale.language);
// Output: "fr"

تُرجع خاصية region رمز المنطقة:

const locale = new Intl.Locale("fr", { region: "CA" });
console.log(locale.region);
// Output: "CA"

تُرجع خاصية script رمز النص إذا تم تحديده:

const locale = new Intl.Locale("zh", {
  script: "Hans",
  region: "CN"
});

console.log(locale.script);
// Output: "Hans"

إذا لم يتم تحديد النص، تُرجع الخاصية undefined:

const locale = new Intl.Locale("en", { region: "US" });
console.log(locale.script);
// Output: undefined

تُرجع الخاصية baseName المعرّف الكامل بدون الامتدادات:

const locale = new Intl.Locale("ar", {
  region: "SA",
  calendar: "islamic",
  numberingSystem: "arab"
});

console.log(locale.baseName);
// Output: "ar-SA"

يمنحك هذا الجزء الخاص باللغة والنص والمنطقة بدون تفضيلات التنسيق.

تحويل معرّفات اللغة المحلية إلى نصوص

تُرجع الدالة toString() معرّف اللغة المحلية الكامل كنص:

const locale = new Intl.Locale("es", { region: "MX" });
const identifier = locale.toString();

console.log(identifier);
// Output: "es-MX"

يمكنك استخدام النص مع واجهات برمجة التطبيقات الأخرى لـ Intl:

const locale = new Intl.Locale("de", { region: "DE" });
const formatter = new Intl.NumberFormat(locale.toString());

const price = 1234.56;
console.log(formatter.format(price));
// Output: "1.234,56"

يقبل المنسّق التمثيل النصي.

تقبل معظم واجهات برمجة التطبيقات لـ Intl أيضًا كائنات اللغة المحلية مباشرةً:

const locale = new Intl.Locale("de", { region: "DE" });
const formatter = new Intl.NumberFormat(locale);

تستدعي واجهة برمجة التطبيقات toString() داخليًا عند الحاجة.

حالات الاستخدام العملية

يحل بناء معرّفات اللغة المحلية من المكونات العديد من المشكلات الشائعة في التطبيقات المُدوَّلة.

إنشاء محددات اللغة المحلية

غالبًا ما تتيح واجهات المستخدم للمستخدمين اختيار اللغة والمنطقة بشكل منفصل. يمكنك دمج الاختيارات:

function createLocaleFromPicker(languageSelect, regionSelect) {
  const language = languageSelect.value;
  const region = regionSelect.value;

  const locale = new Intl.Locale(language, { region });
  return locale.toString();
}

// User selects "Spanish" and "Mexico"
const selectedLocale = createLocaleFromPicker(
  { value: "es" },
  { value: "MX" }
);

console.log(selectedLocale);
// Output: "es-MX"

إنشاء متغيرات اللغة المحلية

يمكنك إنشاء متغيرات إقليمية متعددة من رمز لغة واحد:

function generateRegionalVariants(languageCode, regionCodes) {
  return regionCodes.map(regionCode => {
    const locale = new Intl.Locale(languageCode, {
      region: regionCode
    });
    return locale.toString();
  });
}

const englishVariants = generateRegionalVariants("en", [
  "US",
  "GB",
  "CA",
  "AU",
  "NZ"
]);

console.log(englishVariants);
// Output: ["en-US", "en-GB", "en-CA", "en-AU", "en-NZ"]

ينشئ هذا قائمة بمعرّفات اللغة المحلية لمناطق مختلفة ناطقة بالإنجليزية.

بناء اللغات المحلية من معاملات URL

غالبًا ما تُشفّر عناوين URL تفضيلات اللغة المحلية كمعاملات منفصلة. يمكنك إنشاء لغة محلية من هذه المعاملات:

function getLocaleFromURL(url) {
  const params = new URL(url).searchParams;
  const language = params.get("lang");
  const region = params.get("region");

  if (!language) {
    return null;
  }

  const options = {};
  if (region) {
    options.region = region;
  }

  try {
    const locale = new Intl.Locale(language, options);
    return locale.toString();
  } catch (error) {
    return null;
  }
}

const locale1 = getLocaleFromURL("https://example.com?lang=fr&region=CA");
console.log(locale1);
// Output: "fr-CA"

const locale2 = getLocaleFromURL("https://example.com?lang=ja");
console.log(locale2);
// Output: "ja"

تطبيع معرفات اللغة المحلية

يمكنك تطبيع معرفات اللغة المحلية عن طريق تحليلها وإعادة بنائها:

function normalizeLocale(identifier) {
  try {
    const locale = new Intl.Locale(identifier);
    return locale.toString();
  } catch (error) {
    return null;
  }
}

console.log(normalizeLocale("EN-us"));
// Output: "en-US"

console.log(normalizeLocale("zh_Hans_CN"));
// Output: null (invalid separator)

يقوم المُنشئ بتطبيع حالة الأحرف والتحقق من صحة البنية.

تكوين أدوات التنسيق باستخدام تفضيلات المستخدم

يمكنك بناء معرفات اللغة المحلية مع تفضيلات التنسيق بناءً على إعدادات المستخدم:

function buildFormatterLocale(language, region, preferences) {
  const locale = new Intl.Locale(language, {
    region,
    hourCycle: preferences.use24Hour ? "h23" : "h12",
    numberingSystem: preferences.numberingSystem
  });

  return locale;
}

const userPreferences = {
  use24Hour: true,
  numberingSystem: "latn"
};

const locale = buildFormatterLocale("fr", "FR", userPreferences);

const timeFormatter = new Intl.DateTimeFormat(locale, {
  hour: "numeric",
  minute: "numeric"
});

const now = new Date("2025-10-15T14:30:00");
console.log(timeFormatter.format(now));
// Output: "14:30" (24-hour format)

تتضمن اللغة المحلية تفضيلات التنسيق من إعدادات المستخدم.

متى يتم بناء اللغات المحلية من المكونات

يُعد بناء اللغات المحلية من المكونات مفيداً في سيناريوهات محددة. استخدم هذا النهج عندما يكون لديك بيانات لغة ومنطقة منفصلة، أو عند معالجة إدخال المستخدم، أو عند إنشاء متغيرات اللغة المحلية برمجياً.

استخدم سلسلة نصية حرفية للغات المحلية الثابتة:

// Good for fixed locales
const locale = new Intl.Locale("en-US");

قم بالبناء من المكونات عندما تأتي القيم من متغيرات:

// Good for dynamic locales
const locale = new Intl.Locale(userLanguage, {
  region: userRegion
});

يتحقق المُنشئ من صحة المكونات وينشئ معرفاً منسقاً بشكل صحيح.

دعم المتصفحات

يعمل المُنشئ Intl.Locale في جميع المتصفحات الحديثة. تدعم Chrome وFirefox وSafari وEdge المُنشئ وكائن الخيارات لبناء اللغات المحلية من المكونات.

يدعم Node.js المُنشئ Intl.Locale بدءاً من الإصدار 12، مع دعم كامل لجميع خيارات المُنشئ في الإصدار 14 وما بعده.

الملخص

يقوم المُنشئ Intl.Locale ببناء معرفات اللغة المحلية من المكونات الفردية. تقوم بتمرير رمز اللغة كوسيطة أولى وتوفير النص والمنطقة وتفضيلات التنسيق في كائن خيارات.

المفاهيم الأساسية:

  • تتكون معرفات اللغة المحلية من مكونات اللغة والنص والمنطقة
  • يقبل المُنشئ كائن خيارات يحتوي على خصائص language وscript وregion
  • يمكنك تجاوز المكونات من لغة محلية موجودة عن طريق تمريرها كوسيطة أولى
  • تظهر تفضيلات التنسيق مثل calendar وhourCycle كامتدادات Unicode
  • تُرجع الدالة toString() سلسلة المعرف الكاملة
  • تتيح لك الخصائص مثل language وregion وscript قراءة المكونات
  • يتحقق المُنشئ من صحة بناء الجملة وليس الصحة الدلالية

استخدم هذا الأسلوب عند إنشاء اللغات من مدخلات المستخدم، أو إنشاء متغيرات إقليمية، أو دمج اختيارات اللغة والمنطقة المنفصلة. بالنسبة للغات الثابتة، استخدم السلاسل النصية الحرفية بدلاً من ذلك.