كيفية إزالة المعلومات الزائدة من معرفات اللغة المحلية
استخدم طريقة التصغير لإنشاء معرفات لغة محلية مضغوطة دون فقدان المعنى
مقدمة
تحتوي معرفات اللغات المحلية مثل 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);
// الناتج: "en"
تعيد الطريقة كائن Intl.Locale جديد مع إزالة العلامات الفرعية الزائدة. لا تقوم بتعديل كائن اللغة المحلية الأصلي.
تتبع عملية التصغير خوارزمية "إزالة العلامات الفرعية المحتملة" من Unicode CLDR. تستخدم هذه الخوارزمية قاعدة بيانات من ارتباطات العلامات الفرعية المحتملة لتحديد المكونات التي يمكن إزالتها دون فقدان المعلومات.
المكونات المتأثرة بالتصغير
تؤثر طريقة minimize() فقط على مكونات اللغة المحلية الأساسية: اللغة، والنص، والمنطقة. لا تقوم بإزالة أو تعديل العلامات الفرعية لامتداد يونيكود التي تحدد تفضيلات التنسيق.
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);
// الناتج: "fr"
العلاقة مع maximize
طريقة minimize() هي عكس maximize(). تقوم طريقة maximize() بإضافة العلامات الفرعية المحتملة لإنشاء معرف كامل، بينما تقوم minimize() بإزالة العلامات الفرعية الزائدة لإنشاء معرف مختصر.
تشكل هذه الطرق زوجًا يسمح بالتحويل ثنائي الاتجاه بين الأشكال الكاملة والمختصرة:
const compact = new Intl.Locale("en");
const complete = compact.maximize();
console.log(complete.baseName);
// الناتج: "en-Latn-US"
const compactAgain = complete.minimize();
console.log(compactAgain.baseName);
// الناتج: "en"
الرحلة من الشكل المختصر إلى الكامل ثم العودة إلى المختصر تنتج الشكل الأصلي.
ومع ذلك، ليست كل اللغات تعود إلى شكلها الأصلي بالضبط بعد رحلة كاملة. تنتج الطريقة شكلاً مختصرًا قياسيًا بدلاً من الحفاظ على البنية الأصلية:
const locale = new Intl.Locale("en-US");
const maximized = locale.maximize();
console.log(maximized.baseName);
// الناتج: "en-Latn-US"
const minimized = maximized.minimize();
console.log(minimized.baseName);
// الناتج: "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");
// يخزن "en" بدلاً من "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، لكن امتدادات التقويم ودورة الساعة تبقى كما هي.