كيف أعرض أسماء اللغات مثل 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"
}
// ... more languages
};
يصبح هذا سريعاً غير قابل للصيانة. تحتاج إلى حل أفضل.
استخدام 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);
}
// User interface is in English
console.log(getLocalizedLanguageName("ja", "en"));
// "Japanese"
// User interface is in French
console.log(getLocalizedLanguageName("ja", "fr"));
// "japonais"
// User interface is in Spanish
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، على الرغم من فقدان ميزات الترجمة التلقائية.