كيف أعرض أسماء اللغات مثل English وEspañol و日本語؟
استخدم Intl.DisplayNames لعرض أسماء اللغات بنصوصها الأصلية لمحددات اللغة والواجهات المعربة.
مقدمة
عندما تقوم ببناء محدد لغة أو عرض قائمة باللغات المتاحة، تحتاج إلى عرض اسم كل لغة بطريقة يمكن للمستخدمين التعرف عليها. المتحدث بالفرنسية يبحث عن "Français"، والمتحدث بالإسبانية يبحث عن "Español"، والمتحدث باليابانية يبحث عن "日本語". يتعرف المستخدمون على لغتهم من خلال نصها الأصلي وطريقة كتابتها.
إن ترميز هذه الترجمات بشكل ثابت لا يمكن أن يكون حلاً قابلاً للتوسع. ستحتاج إلى الحفاظ على ترجمات لكل اسم لغة في كل لغة أخرى. تحل واجهة برمجة التطبيقات Intl.DisplayNames هذه المشكلة من خلال توفير أسماء موحدة ومراعية للغة المحلية للغات والدول والنصوص والعملات.
مشكلة ترميز أسماء اللغات بشكل ثابت
يمكنك إنشاء محدد لغة عن طريق ترميز أسماء اللغات بشكل ثابت في كائن.
const languageNames = {
en: "English",
es: "Spanish",
fr: "French",
de: "German",
ja: "Japanese"
};
console.log(languageNames.en);
// "English"
هذا النهج يواجه ثلاث مشاكل. أولاً، هذه الأسماء تعمل فقط للمتحدثين باللغة الإنجليزية. ثانياً، لا يمكن للمستخدمين التعرف على لغتهم عندما تظهر باللغة الإنجليزية. المستخدم الياباني الذي يبحث عن لغته يبحث عن الأحرف اليابانية، وليس كلمة "Japanese". ثالثاً، تحتاج إلى الحفاظ يدوياً على ترجمات لكل لغة في كل لغة أخرى.
const languageNames = {
en: {
en: "English",
es: "Spanish",
fr: "French",
de: "German",
ja: "Japanese"
},
es: {
en: "Inglés",
es: "Español",
fr: "Francés",
de: "Alemán",
ja: "Japonés"
}
// ... المزيد من اللغات
};
هذا يصبح سريعاً غير قابل للصيانة. أنت بحاجة إلى حل أفضل.
استخدام Intl.DisplayNames للحصول على أسماء اللغات
ينشئ مُنشئ Intl.DisplayNames منسقاً يحول رموز اللغة إلى أسماء مقروءة للإنسان. تحدد اللغة المحلية ونوع الأسماء التي تريد عرضها.
const names = new Intl.DisplayNames(["en"], { type: "language" });
console.log(names.of("en"));
// "English"
الوسيط الأول هو مصفوفة من معرفات اللغة المحلية. الوسيط الثاني هو كائن خيارات حيث type: "language" يخبر المنسق أنك تريد أسماء اللغات. تأخذ طريقة of() رمز لغة وتعيد اسمها.
يمكنك الحصول على الأسماء بأي لغة عن طريق تغيير اللغة المحلية.
const enNames = new Intl.DisplayNames(["en"], { type: "language" });
const esNames = new Intl.DisplayNames(["es"], { type: "language" });
const frNames = new Intl.DisplayNames(["fr"], { type: "language" });
console.log(enNames.of("es"));
// "Spanish"
console.log(esNames.of("es"));
// "español"
console.log(frNames.of("es"));
// "espagnol"
يعيد كل منسق اسم اللغة في لغة العرض الخاصة به. هذا يتعامل مع كل تعقيدات الحفاظ على ترجمات أسماء اللغات.
عرض أسماء اللغات بشكلها الأصلي
أفضل ممارسة لمحددات اللغة هي عرض كل لغة بنصها الخاص. يتعرف المستخدمون على لغتهم بشكل أسرع عندما يرونها مكتوبة بأحرف مألوفة.
const names = new Intl.DisplayNames(["ja"], { type: "language" });
console.log(names.of("ja"));
// "日本語"
للحصول على الاسم الأصلي لكل لغة، قم بإنشاء منسق باستخدام اللغة المستهدفة كلغة العرض.
function getNativeName(languageCode) {
const names = new Intl.DisplayNames([languageCode], { type: "language" });
return names.of(languageCode);
}
console.log(getNativeName("en"));
// "English"
console.log(getNativeName("es"));
// "español"
console.log(getNativeName("fr"));
// "français"
console.log(getNativeName("de"));
// "Deutsch"
console.log(getNativeName("ja"));
// "日本語"
console.log(getNativeName("ar"));
// "العربية"
console.log(getNativeName("zh"));
// "中文"
يعمل هذا النمط مع أي رمز لغة. يقوم المنسق بإرجاع الاسم بالنص والشكل الذي يستخدمه المتحدثون الأصليون.
فهم تنسيقات رموز اللغة
تقبل طريقة of() رموز اللغة بعدة تنسيقات. يمكنك استخدام رموز اللغة الأساسية مثل "en" أو معرفات اللغة الكاملة مثل "en-US".
const names = new Intl.DisplayNames(["en"], { type: "language" });
console.log(names.of("en"));
// "English"
console.log(names.of("en-US"));
// "American English"
console.log(names.of("en-GB"));
// "British English"
console.log(names.of("zh"));
// "Chinese"
console.log(names.of("zh-Hans"));
// "Simplified Chinese"
console.log(names.of("zh-Hant"));
// "Traditional Chinese"
يتعرف المنسق على كل من الرموز القصيرة والمعرفات الموسعة مع علامات المنطقة أو النص الفرعية. هذا يسمح لك بالتمييز بين متغيرات اللغة.
التحكم في كيفية ظهور أسماء اللغات
خيار languageDisplay يتحكم في مستوى التفاصيل في الأسماء المُرجعة. وهو يقبل قيمتين.
القيمة "standard" تُرجع الأسماء الكاملة التي تتضمن معلومات اللهجة. هذا هو الإعداد الافتراضي.
const names = new Intl.DisplayNames(["en"], {
type: "language",
languageDisplay: "standard"
});
console.log(names.of("en-US"));
// "American English"
console.log(names.of("en-GB"));
// "British English"
console.log(names.of("pt-BR"));
// "Brazilian Portuguese"
console.log(names.of("pt-PT"));
// "European Portuguese"
القيمة "dialect" تُرجع أيضًا الأسماء الكاملة مع معلومات اللهجة. في معظم الحالات، تنتج نفس المخرجات مثل "standard".
const names = new Intl.DisplayNames(["en"], {
type: "language",
languageDisplay: "dialect"
});
console.log(names.of("en-US"));
// "American English"
console.log(names.of("pt-BR"));
// "Brazilian Portuguese"
بالنسبة لمحددات اللغة، يساعد التنسيق القياسي المستخدمين على اختيار المتغير الصحيح عندما تكون هناك لهجات متعددة متاحة.
الحصول على أسماء اللغات مترجمة لواجهة المستخدم
عند بناء صفحة إعدادات أو محدد لغة، تحتاج إلى عرض أسماء اللغات بلغة واجهة المستخدم الحالية. قم بإنشاء منسق باستخدام اللغة المحلية للمستخدم.
function getLocalizedLanguageName(languageCode, userLocale) {
const names = new Intl.DisplayNames([userLocale], { type: "language" });
return names.of(languageCode);
}
// واجهة المستخدم باللغة الإنجليزية
console.log(getLocalizedLanguageName("ja", "en"));
// "Japanese"
// واجهة المستخدم باللغة الفرنسية
console.log(getLocalizedLanguageName("ja", "fr"));
// "japonais"
// واجهة المستخدم باللغة الإسبانية
console.log(getLocalizedLanguageName("ja", "es"));
// "japonés"
يعرض هذا النهج أسماء وصفية باللغة التي يفهمها المستخدم. يمكنك دمج هذا مع الأسماء الأصلية لإنشاء تسميات هجينة مثل "日本語 (Japanese)" والتي تعمل لكل من المتحدثين الأصليين وغيرهم.
بناء محدد لغة بالأسماء الأصلية
من الاستخدامات الشائعة بناء قائمة منسدلة أو قائمة حيث يختار المستخدمون لغتهم المفضلة. اعرض كل لغة بشكلها الأصلي حتى يتمكن المستخدمون من العثور على خيارهم بسرعة.
const supportedLanguages = ["en", "es", "fr", "de", "ja", "ar", "zh"];
function createLanguageOptions() {
return supportedLanguages.map((code) => {
const names = new Intl.DisplayNames([code], { type: "language" });
const nativeName = names.of(code);
return { code, name: nativeName };
});
}
const options = createLanguageOptions();
console.log(options);
هذا ينتج مصفوفة من خيارات اللغة بأسمائها الأصلية.
[
{ code: "en", name: "English" },
{ code: "es", name: "español" },
{ code: "fr", name: "français" },
{ code: "de", name: "Deutsch" },
{ code: "ja", name: "日本語" },
{ code: "ar", name: "العربية" },
{ code: "zh", name: "中文" }
]
يمكنك عرض هذه الخيارات في HTML لإنشاء محدد لغة.
function renderLanguageSelector() {
const options = createLanguageOptions();
const select = document.createElement("select");
select.id = "language-selector";
options.forEach((option) => {
const optionElement = document.createElement("option");
optionElement.value = option.code;
optionElement.textContent = option.name;
select.appendChild(optionElement);
});
return select;
}
const selector = renderLanguageSelector();
document.body.appendChild(selector);
هذا ينشئ قائمة منسدلة حيث تظهر كل لغة بنصها الأصلي، مما يسهل على المستخدمين تحديد لغتهم.
إنشاء تسميات لغوية هجينة
تعرض بعض الواجهات كلاً من الاسم الأصلي للغة وترجمة بلغة المستخدم. يساعد هذا المستخدمين الذين قد لا يتعرفون على جميع النصوص كما يجعل الواجهة أكثر سهولة في الوصول.
function createHybridLabel(languageCode, userLocale) {
const nativeNames = new Intl.DisplayNames([languageCode], {
type: "language"
});
const localizedNames = new Intl.DisplayNames([userLocale], {
type: "language"
});
const nativeName = nativeNames.of(languageCode);
const localizedName = localizedNames.of(languageCode);
if (nativeName === localizedName) {
return nativeName;
}
return `${nativeName} (${localizedName})`;
}
// User interface is in English
console.log(createHybridLabel("ja", "en"));
// "日本語 (Japanese)"
console.log(createHybridLabel("ar", "en"));
// "العربية (Arabic)"
console.log(createHybridLabel("en", "en"));
// "English"
// User interface is in Spanish
console.log(createHybridLabel("ja", "es"));
// "日本語 (japonés)"
يجمع هذا النمط بين فوائد التعرف على الأسماء الأصلية مع وضوح الترجمات المحلية.
التعامل مع اللغات الاحتياطية
يقبل منشئ Intl.DisplayNames مصفوفة من اللغات المحلية. إذا لم تكن اللغة الأولى متاحة، فإن المنسق يعود إلى اللغة التالية في المصفوفة.
const names = new Intl.DisplayNames(["xx-XX", "en"], { type: "language" });
console.log(names.of("fr"));
// "French"
يحاول المنسق استخدام "xx-XX" أولاً، وهي غير موجودة، ثم يعود إلى "en". هذا يضمن عمل الكود حتى عندما تكون اللغة المطلوبة غير متوفرة.
يمكنك التحقق من اللغة التي يستخدمها المنسق فعلياً باستخدام طريقة resolvedOptions().
const names = new Intl.DisplayNames(["xx-XX", "en"], { type: "language" });
console.log(names.resolvedOptions().locale);
// "en"
هذا يوضح أن المنسق قد تم حله إلى الإنجليزية بعد الرجوع للغة الاحتياطية.
كيف تقوم اللغات المختلفة بتنسيق أسماء اللغات
لكل لغة محلية اتفاقياتها الخاصة لأسماء اللغات. يطبق المنسق هذه الاتفاقيات تلقائياً.
const supportedLanguages = ["en", "es", "fr", "de", "ja"];
function showLanguageNamesInLocale(locale) {
const names = new Intl.DisplayNames([locale], { type: "language" });
return supportedLanguages.map((code) => ({
code,
name: names.of(code)
}));
}
console.log(showLanguageNamesInLocale("en"));
// [
// { code: "en", name: "English" },
// { code: "es", name: "Spanish" },
// { code: "fr", name: "French" },
// { code: "de", name: "German" },
// { code: "ja", name: "Japanese" }
// ]
console.log(showLanguageNamesInLocale("es"));
// [
// { code: "en", name: "inglés" },
// { code: "es", name: "español" },
// { code: "fr", name: "francés" },
// { code: "de", name: "alemán" },
// { code: "ja", name: "japonés" }
// ]
console.log(showLanguageNamesInLocale("ja"));
// [
// { code: "en", name: "英語" },
// { code: "es", name: "スペイン語" },
// { code: "fr", name: "フランス語" },
// { code: "de", name: "ドイツ語" },
// { code: "ja", name: "日本語" }
// ]
يتعامل المنسق تلقائياً مع الأحرف الكبيرة والنصوص والاتفاقيات اللغوية لكل لغة.
دعم المتصفح
واجهة برمجة التطبيقات Intl.DisplayNames متاحة في جميع المتصفحات الحديثة. وهي مدعومة منذ مارس 2021 في المتصفحات الرئيسية بما في ذلك Chrome وFirefox وSafari وEdge.
يمكنك التحقق مما إذا كانت واجهة برمجة التطبيقات متاحة قبل استخدامها.
if (typeof Intl.DisplayNames !== "undefined") {
const names = new Intl.DisplayNames(["en"], { type: "language" });
console.log(names.of("fr"));
} else {
console.log("Intl.DisplayNames is not supported");
}
بالنسبة للمتصفحات القديمة، تحتاج إلى توفير بديل أو استخدام polyfill. يستخدم البديل البسيط تعيينًا ثابتًا لرموز اللغة إلى الأسماء.
function getLanguageName(code, locale) {
if (typeof Intl.DisplayNames !== "undefined") {
const names = new Intl.DisplayNames([locale], { type: "language" });
return names.of(code);
}
// Fallback for older browsers
const fallbackNames = {
en: "English",
es: "español",
fr: "français",
de: "Deutsch",
ja: "日本語"
};
return fallbackNames[code] || code;
}
console.log(getLanguageName("es", "en"));
// "español" (or "Spanish" if you adjust the fallback for localization)
هذا يضمن عمل التعليمات البرمجية الخاصة بك حتى في المتصفحات التي لا تدعم Intl.DisplayNames، على الرغم من أنك تفقد ميزات التوطين التلقائي.