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

إنشاء معرفات اللغة المحلية عن طريق دمج رموز اللغة والنص والمنطقة في جافا سكريبت

مقدمة

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

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

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

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

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

رمز اللغة يحدد اللغة المراد استخدامها. يستخدم حرفين أو ثلاثة أحرف صغيرة من معيار 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: "١٢٬٣٤٥" (الأرقام العربية-الهندية)

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

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

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

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

// صالح نحوياً ولكن مشكوك فيه دلالياً
const locale = new Intl.Locale("en", {
  script: "Arab",
  region: "JP"
});

console.log(locale.toString());
// الناتج: "en-Arab-JP"

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

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

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

console.log(maximized.toString());
// الناتج: "en-Latn-JP"

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

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

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

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

const locale = new Intl.Locale("fr", { region: "CA" });
console.log(locale.language);
// الناتج: "fr"

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

const locale = new Intl.Locale("fr", { region: "CA" });
console.log(locale.region);
// الناتج: "CA"

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

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

console.log(locale.script);
// الناتج: "Hans"

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

const locale = new Intl.Locale("en", { region: "US" });
console.log(locale.script);
// الناتج: undefined

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

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

console.log(locale.baseName);
// الناتج: "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)

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

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

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

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

// مناسب للغات المحلية الثابتة
const locale = new Intl.Locale("en-US");

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

// مناسب للغات المحلية الديناميكية
const locale = new Intl.Locale(userLanguage, {
  region: userRegion
});

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

دعم المتصفح

يعمل منشئ Intl.Locale في جميع المتصفحات الحديثة. تدعم متصفحات كروم وفايرفوكس وسفاري وإيدج المنشئ وكائن الخيارات لبناء اللغات المحلية من المكونات.

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

الملخص

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

المفاهيم الرئيسية:

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

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