كيفية إزالة المعلومات الزائدة من معرّفات اللغات المحلية

استخدم طريقة minimize لإنشاء معرّفات لغات محلية مدمجة دون فقدان المعنى

مقدمة

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

طريقة minimize() تزيل هذه المكونات الزائدة لإنشاء أقصر معرّف لغة محلية مكافئ. ينتج عن هذا معرّفات مدمجة تحافظ على المعنى مع تقليل حجم التخزين وتحسين سهولة القراءة.

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

يصبح معرّف اللغة المحلية زائداً عندما يذكر صراحةً معلومات مضمنة بالفعل في مكونات أخرى. يحدث التكرار لأن كل لغة لديها قيم افتراضية محتملة للنص والمنطقة.

لنأخذ المعرّف en-Latn-US. يحدد هذا المعرّف:

  • اللغة: الإنجليزية (en)
  • النص: اللاتيني (Latn)
  • المنطقة: الولايات المتحدة (US)

الإنجليزية تُكتب فقط بالنص اللاتيني، وعندما لا يتم تحديد منطقة، تكون الإنجليزية افتراضياً للولايات المتحدة. كلا مكوني النص والمنطقة زائدان لأنهما يطابقان القيم الافتراضية المحتملة للإنجليزية. المعرّف en ينقل نفس المعلومات.

ينطبق نفس المبدأ على اللغات الأخرى. الكورية (ko) تُكتب بنص الهانغول (Kore) ويتم التحدث بها بشكل أساسي في كوريا الجنوبية (KR). المعرّف ko-Kore-KR يحتوي على معلومات زائدة لأن ko وحده يشير إلى هذه القيم الافتراضية.

كيفية عمل طريقة minimize

طريقة minimize() متاحة على نسخ Intl.Locale. تقوم بتحليل معرّف اللغة المحلية وإزالة المكونات التي تطابق القيم الافتراضية المحتملة.

const locale = new Intl.Locale("en-Latn-US");
const minimized = locale.minimize();

console.log(minimized.baseName);
// Output: "en"

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

تتبع عملية التصغير خوارزمية "إزالة العلامات الفرعية المحتملة" من Unicode CLDR. تستخدم هذه الخوارزمية قاعدة بيانات من ارتباطات العلامات الفرعية المحتملة لتحديد المكونات التي يمكن إزالتها دون فقدان المعلومات.

المكونات المتأثرة بـ minimize

تؤثر طريقة minimize() فقط على مكونات اللغة المحلية الأساسية: اللغة والنص والمنطقة. لا تقوم بإزالة أو تعديل العلامات الفرعية لامتداد Unicode التي تحدد تفضيلات التنسيق.

const locale = new Intl.Locale("en-Latn-US-u-ca-gregory-nu-latn");
const minimized = locale.minimize();

console.log(minimized.toString());
// Output: "en-u-ca-gregory-nu-latn"

تظل امتدادات التقويم (ca-gregory) ونظام الترقيم (nu-latn) كما هي. يتم إزالة مكونات النص (Latn) والمنطقة (US) الزائدة فقط.

أمثلة على التصغير

تُصغّر معرّفات اللغة المحلية المختلفة إلى أطوال مختلفة اعتمادًا على المكونات الزائدة.

إزالة النص والمنطقة

عندما يطابق كل من النص والمنطقة القيم الافتراضية، تتم إزالة كليهما:

const english = new Intl.Locale("en-Latn-US");
console.log(english.minimize().baseName);
// Output: "en"

const korean = new Intl.Locale("ko-Kore-KR");
console.log(korean.minimize().baseName);
// Output: "ko"

const japanese = new Intl.Locale("ja-Jpan-JP");
console.log(japanese.minimize().baseName);
// Output: "ja"

الاحتفاظ بالمناطق غير الافتراضية

عندما تختلف المنطقة عن القيمة الافتراضية، تبقى في المعرّف المُصغّر:

const britishEnglish = new Intl.Locale("en-Latn-GB");
console.log(britishEnglish.minimize().baseName);
// Output: "en-GB"

const canadianFrench = new Intl.Locale("fr-Latn-CA");
console.log(canadianFrench.minimize().baseName);
// Output: "fr-CA"

const mexicanSpanish = new Intl.Locale("es-Latn-MX");
console.log(mexicanSpanish.minimize().baseName);
// Output: "es-MX"

تتم إزالة مكون النص لأنه يطابق القيمة الافتراضية، لكن يتم الاحتفاظ بالمنطقة لأنها تحدد متغيرًا غير افتراضي من اللغة.

الاحتفاظ بالنصوص غير الافتراضية

عندما يختلف النص عن القيمة الافتراضية، يبقى في المعرّف المُصغّر:

const simplifiedChinese = new Intl.Locale("zh-Hans-CN");
console.log(simplifiedChinese.minimize().baseName);
// Output: "zh-Hans"

const traditionalChinese = new Intl.Locale("zh-Hant-TW");
console.log(traditionalChinese.minimize().baseName);
// Output: "zh-Hant"

const serbianCyrillic = new Intl.Locale("sr-Cyrl-RS");
console.log(serbianCyrillic.minimize().baseName);
// Output: "sr-Cyrl"

تتطلب اللغة الصينية مكون النص للتمييز بين المتغيرات المبسطة والتقليدية. تتطلب اللغة الصربية مكون النص للتمييز بين النصوص السيريلية واللاتينية.

معرّفات مُصغّرة بالفعل

عندما يكون معرّف اللغة مُصغّرًا بالفعل، تُرجع الدالة لغة مكافئة دون تغييرات:

const minimal = new Intl.Locale("fr");
console.log(minimal.minimize().baseName);
// Output: "fr"

العلاقة مع maximize

دالة minimize() هي عكس دالة maximize(). تضيف دالة maximize() علامات فرعية محتملة لإنشاء معرّف كامل، بينما تزيل دالة minimize() العلامات الفرعية الزائدة لإنشاء معرّف مُصغّر.

تشكّل هاتان الدالتان زوجًا يسمح بالتحويل ثنائي الاتجاه بين الأشكال الكاملة والمُصغّرة:

const compact = new Intl.Locale("en");
const complete = compact.maximize();
console.log(complete.baseName);
// Output: "en-Latn-US"

const compactAgain = complete.minimize();
console.log(compactAgain.baseName);
// Output: "en"

الرحلة ذهابًا وإيابًا من الشكل المُصغّر إلى الكامل ثم العودة إلى المُصغّر تُنتج الشكل الأصلي.

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

const locale = new Intl.Locale("en-US");
const maximized = locale.maximize();
console.log(maximized.baseName);
// Output: "en-Latn-US"

const minimized = maximized.minimize();
console.log(minimized.baseName);
// Output: "en"

احتوى المعرّف الأصلي en-US على منطقة غير زائدة، لكن بعد التكبير والتصغير، يصبح en. يحدث هذا لأن الولايات المتحدة هي المنطقة الافتراضية المحتملة للغة الإنجليزية.

متى تستخدم minimize

استخدم minimize() عندما تحتاج إلى معرّفات لغة مُصغّرة تظل واضحة. تستفيد عدة سيناريوهات من التصغير.

تخزين تفضيلات اللغة

تُقلل المعرّفات المُصغّرة من مساحة التخزين في قواعد البيانات أو التخزين المحلي أو ملفات التكوين:

function saveUserLocale(localeString) {
  const locale = new Intl.Locale(localeString);
  const minimized = locale.minimize().toString();

  localStorage.setItem("userLocale", minimized);
}

saveUserLocale("en-Latn-US");
// Stores "en" instead of "en-Latn-US"

يُقلل هذا من حجم البيانات المُخزّنة دون فقدان المعلومات.

إنشاء عناوين URL قابلة للقراءة

تُنتج المعرّفات المُصغّرة عناوين URL أنظف لاختيار اللغة:

function createLocalizedURL(path, localeString) {
  const locale = new Intl.Locale(localeString);
  const minimized = locale.minimize().baseName;

  return `/${minimized}${path}`;
}

const url = createLocalizedURL("/products", "en-Latn-US");
console.log(url);
// Output: "/en/products"

عنوان URL /en/products أكثر قابلية للقراءة من /en-Latn-US/products.

مقارنة معرّفات اللغة

يساعد التصغير في تحديد ما إذا كان معرّفا لغة يمثلان نفس اللغة:

function areLocalesEquivalent(locale1String, locale2String) {
  const locale1 = new Intl.Locale(locale1String).minimize();
  const locale2 = new Intl.Locale(locale2String).minimize();

  return locale1.toString() === locale2.toString();
}

console.log(areLocalesEquivalent("en", "en-Latn-US"));
// Output: true

console.log(areLocalesEquivalent("en-US", "en-Latn-US"));
// Output: true

console.log(areLocalesEquivalent("en-US", "en-GB"));
// Output: false

ينتج التصغير شكلاً قياسياً يتيح المقارنة المباشرة.

تطبيع مدخلات المستخدم

عند قبول معرفات اللغة من المستخدمين أو الأنظمة الخارجية، قم بتصغيرها إلى شكل قياسي:

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

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

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

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

تقبل هذه الدالة أشكالاً مختلفة من نفس اللغة وتُرجع تمثيلاً متسقاً.

دمج التصغير مع عمليات اللغة الأخرى

تعمل طريقة minimize() مع ميزات Intl.Locale الأخرى لإنشاء معالجة مرنة للغة.

التصغير بعد تعديل خصائص اللغة

عند إنشاء لغة من مكونات، قم بتصغيرها لإزالة الأجزاء غير الضرورية:

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

const minimized = locale.minimize();
console.log(minimized.baseName);
// Output: "en"

يضمن هذا أن يكون المعرف النهائي مضغوطاً بقدر ما تسمح به مكونات المدخلات.

الحفاظ على الامتدادات أثناء التصغير

تظل الامتدادات سليمة أثناء التصغير، مما يسمح لك بتصغير المكونات الأساسية مع الاحتفاظ بتفضيلات التنسيق:

function createCompactLocaleWithPreferences(language, region, preferences) {
  const locale = new Intl.Locale(language, {
    region: region,
    ...preferences
  });

  return locale.minimize().toString();
}

const localeString = createCompactLocaleWithPreferences("en", "US", {
  hourCycle: "h23",
  calendar: "gregory"
});

console.log(localeString);
// Output: "en-u-ca-gregory-hc-h23"

تتقلص المكونات الأساسية إلى en، لكن امتدادات التقويم ودورة الساعة تظل كما هي.