كيف أعرض أسماء الأنظمة الكتابية مثل اللاتينية والسيريلية والعربية؟
استخدم Intl.DisplayNames لتحويل رموز الأنظمة الكتابية إلى أسماء مقروءة للبشر بأي لغة.
مقدمة
النظام الكتابي هو نظام للكتابة. اللاتينية هي النظام الكتابي المستخدم للإنجليزية والفرنسية والإسبانية. السيريلية هي النظام الكتابي المستخدم للروسية والبلغارية والأوكرانية. العربية هي النظام الكتابي المستخدم للعربية والفارسية والأردية. تختلف الأنظمة الكتابية عن اللغات لأن اللغة نفسها يمكن كتابتها بأنظمة كتابية متعددة. الصربية تستخدم كلاً من النظامين السيريلي واللاتيني. يختار المستخدمون في صربيا النظام الكتابي الذي يفضلونه.
عندما تقوم ببناء محددات اللغة أو منتقيات الخطوط أو عناصر التحكم في إدخال النص، تحتاج إلى عرض أسماء الأنظمة الكتابية حتى يتمكن المستخدمون من تحديد أنظمة الكتابة. واجهة برمجة التطبيقات Intl.DisplayNames تحول رموز الأنظمة الكتابية إلى أسماء محلية ومقروءة للبشر دون الحاجة إلى صيانة جداول الترجمة.
فهم الأنظمة الكتابية واللغات
الأنظمة الكتابية واللغات ليست نفس الشيء. اللغة هي ما يتحدث به الناس. النظام الكتابي هو كيفية كتابته.
الإنجليزية لغة. اللاتينية نظام كتابي. الإنجليزية تستخدم النظام الكتابي اللاتيني، لكن كذلك تفعل عشرات اللغات الأخرى بما في ذلك الإسبانية والفرنسية والألمانية والفيتنامية والتركية.
الصربية لغة يمكن كتابتها بنظامين كتابيين. الصربية المكتوبة بالسيريلية تبدو هكذا "Српски". الصربية المكتوبة باللاتينية تبدو هكذا "Srpski". كلاهما يمثل نفس اللغة بنفس الكلمات والقواعد. الفرق فقط في نظام الكتابة.
الصينية لها نوعان شائعان من الأنظمة الكتابية. الصينية المبسطة تستخدم أحرف هان المبسطة. الصينية التقليدية تستخدم أحرف هان التقليدية. نفس الجملة تظهر بشكل مختلف حسب النظام الكتابي المستخدم.
هذا التمييز مهم عند بناء الواجهات. قد يفضل المستخدم الصربي النص بالأحرف السيريلية على النص بالأحرف اللاتينية. يحتاج المستخدم الصيني إلى الاختيار بين الأحرف المبسطة والتقليدية. يجب أن تعرض واجهتك أسماء الأنظمة الكتابية حتى يتمكن المستخدمون من إجراء هذه الاختيارات.
المشكلة في ترميز أسماء الأنظمة الكتابية بشكل ثابت
يمكنك إنشاء جدول بحث يربط رموز الأنظمة الكتابية بأسماء الأنظمة الكتابية.
const scriptNames = {
Latn: "Latin",
Cyrl: "Cyrillic",
Arab: "Arabic",
Hans: "Simplified Chinese",
Hant: "Traditional Chinese"
};
console.log(scriptNames.Latn);
// "Latin"
هذا النهج يعمل فقط للمتحدثين بالإنجليزية. المستخدمون الذين يتحدثون لغات أخرى يرون أسماء الأنظمة الكتابية بالإنجليزية قد لا يفهمونها. تحتاج إلى ترجمات لكل لغة تدعمها.
const scriptNames = {
en: {
Latn: "Latin",
Cyrl: "Cyrillic",
Arab: "Arabic"
},
es: {
Latn: "latino",
Cyrl: "cirílico",
Arab: "árabe"
},
fr: {
Latn: "latin",
Cyrl: "cyrillique",
Arab: "arabe"
}
};
يصبح هذا غير قابل للصيانة بسرعة. كل لغة جديدة تتطلب مجموعة كاملة من الترجمات. كل نظام كتابي جديد يتطلب إدخالات في كل لغة. تحتاج إلى حل أفضل.
استخدام Intl.DisplayNames للحصول على أسماء الأنظمة الكتابية
ينشئ المُنشئ Intl.DisplayNames مُنسِّقاً يحول رموز الأنظمة الكتابية إلى أسماء قابلة للقراءة. تحدد لغة محلية وتضبط النوع على "script".
const names = new Intl.DisplayNames(["en"], { type: "script" });
console.log(names.of("Latn"));
// "Latin"
الوسيطة الأولى هي مصفوفة من معرفات اللغات المحلية. الوسيطة الثانية هي كائن خيارات حيث type: "script" يخبر المُنسِّق أنك تريد أسماء الأنظمة الكتابية. تأخذ الطريقة of() رمز نظام كتابي وتُرجع اسمه.
تتبع رموز الأنظمة الكتابية معيار ISO 15924. كل نظام كتابي له رمز مكون من أربعة أحرف مع الحرف الأول بحرف كبير والأحرف الثلاثة المتبقية بأحرف صغيرة. اللاتينية هي Latn. السيريلية هي Cyrl. العربية هي Arab.
const names = new Intl.DisplayNames(["en"], { type: "script" });
console.log(names.of("Latn"));
// "Latin"
console.log(names.of("Cyrl"));
// "Cyrillic"
console.log(names.of("Arab"));
// "Arabic"
console.log(names.of("Hani"));
// "Han"
console.log(names.of("Hira"));
// "Hiragana"
console.log(names.of("Kana"));
// "Katakana"
يتعامل المُنسِّق مع كل تعقيدات صيانة ترجمات أسماء الأنظمة الكتابية. تحتاج فقط إلى توفير رمز النظام الكتابي.
رموز الكتابة الشائعة
يحدد معيار ISO 15924 رموزًا لأكثر من 160 نظام كتابة. هذه هي الرموز الأكثر استخدامًا.
const names = new Intl.DisplayNames(["en"], { type: "script" });
console.log(names.of("Latn"));
// "Latin"
console.log(names.of("Cyrl"));
// "Cyrillic"
console.log(names.of("Arab"));
// "Arabic"
console.log(names.of("Hebr"));
// "Hebrew"
console.log(names.of("Deva"));
// "Devanagari"
console.log(names.of("Thai"));
// "Thai"
console.log(names.of("Hani"));
// "Han"
console.log(names.of("Hans"));
// "Simplified Han"
console.log(names.of("Hant"));
// "Traditional Han"
console.log(names.of("Hang"));
// "Hangul"
console.log(names.of("Hira"));
// "Hiragana"
console.log(names.of("Kana"));
// "Katakana"
console.log(names.of("Beng"));
// "Bengali"
console.log(names.of("Grek"));
// "Greek"
تغطي اللاتينية معظم لغات أوروبا الغربية. تغطي السيريلية الروسية والبلغارية والأوكرانية ولغات سلافية أخرى. تغطي العربية اللغة العربية والفارسية والأردية. تغطي هان اللغة الصينية، مع Hans للصينية المبسطة وHant للصينية التقليدية. تغطي هانغول اللغة الكورية. هيراغانا وكاتاكانا هما نظاما كتابة يابانيان.
عرض أسماء أنظمة الكتابة بلغات مختلفة
تُترجم أسماء أنظمة الكتابة بناءً على لغة العرض. أنشئ منسقات بلغات مختلفة لرؤية الأسماء بلغات مختلفة.
const enNames = new Intl.DisplayNames(["en"], { type: "script" });
const esNames = new Intl.DisplayNames(["es"], { type: "script" });
const frNames = new Intl.DisplayNames(["fr"], { type: "script" });
const jaNames = new Intl.DisplayNames(["ja"], { type: "script" });
console.log(enNames.of("Latn"));
// "Latin"
console.log(esNames.of("Latn"));
// "latino"
console.log(frNames.of("Latn"));
// "latin"
console.log(jaNames.of("Latn"));
// "ラテン文字"
يُرجع كل منسق اسم نظام الكتابة بلغة العرض الخاصة به. يتعامل هذا مع كل تعقيدات الحفاظ على ترجمات أسماء أنظمة الكتابة.
يعمل نفس النمط مع أي رمز كتابة.
const enNames = new Intl.DisplayNames(["en"], { type: "script" });
const deNames = new Intl.DisplayNames(["de"], { type: "script" });
const zhNames = new Intl.DisplayNames(["zh"], { type: "script" });
console.log(enNames.of("Cyrl"));
// "Cyrillic"
console.log(deNames.of("Cyrl"));
// "Kyrillisch"
console.log(zhNames.of("Cyrl"));
// "西里尔文"
console.log(enNames.of("Arab"));
// "Arabic"
console.log(deNames.of("Arab"));
// "Arabisch"
console.log(zhNames.of("Arab"));
// "阿拉伯文"
يطبق المنسق الاصطلاحات اللغوية الصحيحة لكل لغة تلقائيًا.
بناء محدد نظام كتابة لمتغيرات اللغة
تقدم بعض اللغات للمستخدمين خيارًا بين أنظمة الكتابة. يمكن كتابة الصربية بالسيريلية أو اللاتينية. يمكن كتابة الصينية بالأحرف المبسطة أو التقليدية. تحتاج إلى عرض هذه الخيارات حتى يتمكن المستخدمون من الاختيار.
function getScriptOptions(language, userLocale) {
const names = new Intl.DisplayNames([userLocale], { type: "script" });
if (language === "sr") {
return [
{ code: "Cyrl", name: names.of("Cyrl") },
{ code: "Latn", name: names.of("Latn") }
];
}
if (language === "zh") {
return [
{ code: "Hans", name: names.of("Hans") },
{ code: "Hant", name: names.of("Hant") }
];
}
return [];
}
console.log(getScriptOptions("sr", "en"));
// [
// { code: "Cyrl", name: "Cyrillic" },
// { code: "Latn", name: "Latin" }
// ]
console.log(getScriptOptions("zh", "en"));
// [
// { code: "Hans", name: "Simplified Han" },
// { code: "Hant", name: "Traditional Han" }
// ]
console.log(getScriptOptions("zh", "es"));
// [
// { code: "Hans", name: "han simplificado" },
// { code: "Hant", name: "han tradicional" }
// ]
تُرجع هذه الدالة خيارات نظام الكتابة بلغة واجهة المستخدم. يرى المستخدمون الصرب خيارات لأنظمة الكتابة السيريلية واللاتينية. يرى المستخدمون الصينيون خيارات للأحرف المبسطة والتقليدية. تظهر الأسماء باللغة التي يفهمها المستخدم.
عرض معرفات اللغة الكاملة مع معلومات نظام الكتابة
يمكن أن تتضمن معرفات اللغة رموز أنظمة الكتابة للتمييز بين أنظمة الكتابة. التنسيق هو language-script-region، مثل sr-Cyrl-RS للصربية المكتوبة بالسيريلية في صربيا أو zh-Hans-CN للصينية المبسطة في الصين.
عند عرض معرّفات اللغات هذه، استخرج رمز النظام الكتابي وحوّله إلى اسم قابل للقراءة.
function parseLocaleWithScript(locale) {
const parts = locale.split("-");
if (parts.length < 2) {
return null;
}
const [language, script] = parts;
if (script.length === 4) {
return {
language,
script: script.charAt(0).toUpperCase() + script.slice(1).toLowerCase()
};
}
return null;
}
function formatLocaleWithScriptName(locale, displayLocale) {
const parsed = parseLocaleWithScript(locale);
if (!parsed) {
return locale;
}
const languageNames = new Intl.DisplayNames([displayLocale], {
type: "language"
});
const scriptNames = new Intl.DisplayNames([displayLocale], { type: "script" });
const languageName = languageNames.of(parsed.language);
const scriptName = scriptNames.of(parsed.script);
return `${languageName} (${scriptName})`;
}
console.log(formatLocaleWithScriptName("sr-Cyrl", "en"));
// "Serbian (Cyrillic)"
console.log(formatLocaleWithScriptName("sr-Latn", "en"));
// "Serbian (Latin)"
console.log(formatLocaleWithScriptName("zh-Hans", "en"));
// "Chinese (Simplified Han)"
console.log(formatLocaleWithScriptName("zh-Hant", "en"));
// "Chinese (Traditional Han)"
console.log(formatLocaleWithScriptName("sr-Cyrl", "es"));
// "serbio (cirílico)"
يجعل هذا النمط معرّفات اللغات قابلة للقراءة من قبل البشر من خلال دمج أسماء اللغات مع أسماء الأنظمة الكتابية. يرى المستخدمون "الصربية (السيريلية)" بدلاً من "sr-Cyrl".
إنشاء محدد خطوط مع أسماء الأنظمة الكتابية
غالباً ما تجمع واجهات اختيار الخطوط الخطوط حسب الأنظمة الكتابية التي تدعمها. تحتاج إلى عرض أسماء الأنظمة الكتابية حتى يفهم المستخدمون الأنظمة الكتابية التي يغطيها كل خط.
function createFontOptions() {
const fonts = [
{
name: "Arial",
scripts: ["Latn", "Cyrl", "Grek", "Hebr", "Arab"]
},
{
name: "Noto Sans CJK",
scripts: ["Hans", "Hant", "Hira", "Kana", "Hang"]
},
{
name: "Noto Sans Devanagari",
scripts: ["Deva"]
}
];
const names = new Intl.DisplayNames(["en"], { type: "script" });
return fonts.map((font) => ({
name: font.name,
scripts: font.scripts.map((code) => names.of(code))
}));
}
console.log(createFontOptions());
// [
// {
// name: "Arial",
// scripts: ["Latin", "Cyrillic", "Greek", "Hebrew", "Arabic"]
// },
// {
// name: "Noto Sans CJK",
// scripts: ["Simplified Han", "Traditional Han", "Hiragana", "Katakana", "Hangul"]
// },
// {
// name: "Noto Sans Devanagari",
// scripts: ["Devanagari"]
// }
// ]
ينشئ هذا قائمة بالخطوط مع الأنظمة الكتابية المدعومة بشكل قابل للقراءة من قبل البشر. يمكن للمستخدمين اختيار الخطوط بناءً على أنظمة الكتابة التي يحتاجونها.
عرض طرق الإدخال المتاحة حسب النظام الكتابي
توفر أنظمة التشغيل والمتصفحات طرق إدخال لأنظمة كتابية مختلفة. تحوّل طريقة الإدخال اليابانية الأحرف اللاتينية إلى هيراغانا أو كاتاكانا أو كانجي. تحوّل طريقة الإدخال الصينية البينيين إلى أحرف صينية مبسطة أو تقليدية. يمكنك عرض طرق الإدخال المتاحة مع أسماء أنظمتها الكتابية.
function getInputMethods(userLocale) {
const inputMethods = [
{ id: "latin-ime", script: "Latn" },
{ id: "japanese-ime", script: "Hira" },
{ id: "chinese-pinyin-simplified", script: "Hans" },
{ id: "chinese-pinyin-traditional", script: "Hant" },
{ id: "korean-ime", script: "Hang" },
{ id: "arabic-ime", script: "Arab" },
{ id: "hebrew-ime", script: "Hebr" }
];
const names = new Intl.DisplayNames([userLocale], { type: "script" });
return inputMethods.map((method) => ({
id: method.id,
name: names.of(method.script)
}));
}
console.log(getInputMethods("en"));
// [
// { id: "latin-ime", name: "Latin" },
// { id: "japanese-ime", name: "Hiragana" },
// { id: "chinese-pinyin-simplified", name: "Simplified Han" },
// { id: "chinese-pinyin-traditional", name: "Traditional Han" },
// { id: "korean-ime", name: "Hangul" },
// { id: "arabic-ime", name: "Arabic" },
// { id: "hebrew-ime", name: "Hebrew" }
// ]
console.log(getInputMethods("ja"));
// [
// { id: "latin-ime", name: "ラテン文字" },
// { id: "japanese-ime", name: "ひらがな" },
// { id: "chinese-pinyin-simplified", name: "簡体字" },
// { id: "chinese-pinyin-traditional", name: "繁体字" },
// { id: "korean-ime", name: "ハングル" },
// { id: "arabic-ime", name: "アラビア文字" },
// { id: "hebrew-ime", name: "ヘブライ文字" }
// ]
يعرض هذا أسماء طرق الإدخال بلغة المستخدم. يرى المستخدمون "Hiragana" عندما تكون الواجهة بالإنجليزية و"ひらがな" عندما تكون الواجهة باليابانية.
فهم استخدام الأحرف الكبيرة في رموز الأنظمة الكتابية
تتبع رموز الأنظمة الكتابية نمطاً محدداً لاستخدام الأحرف الكبيرة. الحرف الأول كبير. الأحرف الثلاثة المتبقية صغيرة. Latn صحيح. LATN وlatn وLaTn ليست قياسية.
تقبل الدالة of() رموز الأنظمة الكتابية بغض النظر عن استخدام الأحرف الكبيرة.
const names = new Intl.DisplayNames(["en"], { type: "script" });
console.log(names.of("Latn"));
// "Latin"
console.log(names.of("LATN"));
// "Latin"
console.log(names.of("latn"));
// "Latin"
console.log(names.of("LaTn"));
// "Latin"
يتعامل المنسّق مع جميع الأشكال بشكل صحيح. ومع ذلك، فإن استخدام نمط الأحرف الكبيرة القياسي يجعل الكود الخاص بك أكثر قابلية للقراءة واتساقاً مع معيار ISO 15924.
التعامل مع اللغات الاحتياطية
يقبل منشئ Intl.DisplayNames مصفوفة من اللغات. إذا لم تكن اللغة الأولى متاحة، يعود المنسق إلى اللغة التالية في المصفوفة.
const names = new Intl.DisplayNames(["xx-XX", "en"], { type: "script" });
console.log(names.of("Latn"));
// "Latin"
يحاول المنسق "xx-XX" أولاً، والتي غير موجودة، ثم يعود إلى "en". هذا يضمن عمل الكود الخاص بك حتى عندما تكون اللغة المطلوبة غير متاحة.
يمكنك التحقق من اللغة التي يستخدمها المنسق فعلياً باستخدام طريقة resolvedOptions().
const names = new Intl.DisplayNames(["xx-XX", "en"], { type: "script" });
console.log(names.resolvedOptions().locale);
// "en"
يوضح هذا أن المنسق انتقل إلى الإنجليزية بعد الرجوع الاحتياطي.
بناء نظام إدارة محتوى متعدد اللغات
تحتاج أنظمة إدارة المحتوى التي تدعم نصوصاً متعددة إلى إظهار النصوص المتاحة لكل جزء من المحتوى. يمكنك عرض أسماء النصوص لمساعدة محرري المحتوى على اختيار الإصدار الصحيح.
function getContentVersions(contentId, userLocale) {
const versions = [
{ script: "Latn", url: `/content/${contentId}/latn` },
{ script: "Cyrl", url: `/content/${contentId}/cyrl` },
{ script: "Arab", url: `/content/${contentId}/arab` }
];
const names = new Intl.DisplayNames([userLocale], { type: "script" });
return versions.map((version) => ({
script: version.script,
name: names.of(version.script),
url: version.url
}));
}
console.log(getContentVersions("article-123", "en"));
// [
// { script: "Latn", name: "Latin", url: "/content/article-123/latn" },
// { script: "Cyrl", name: "Cyrillic", url: "/content/article-123/cyrl" },
// { script: "Arab", name: "Arabic", url: "/content/article-123/arab" }
// ]
يساعد هذا النمط محرري المحتوى على رؤية إصدارات النصوص الموجودة والتنقل بينها.
دعم المتصفحات
واجهة برمجة التطبيقات Intl.DisplayNames مع دعم نوع النص متاحة في جميع المتصفحات الحديثة. تم دعمها منذ مارس 2021 عبر المتصفحات الرئيسية بما في ذلك Chrome وFirefox وSafari وEdge.
يمكنك التحقق من توفر واجهة برمجة التطبيقات قبل استخدامها.
if (typeof Intl.DisplayNames !== "undefined") {
const names = new Intl.DisplayNames(["en"], { type: "script" });
console.log(names.of("Latn"));
} else {
console.log("Intl.DisplayNames is not supported");
}
بالنسبة للمتصفحات القديمة، تحتاج إلى توفير بديل احتياطي أو استخدام polyfill. يستخدم البديل الاحتياطي البسيط تعييناً ثابتاً لرموز النصوص إلى الأسماء.
function getScriptName(code, locale) {
if (typeof Intl.DisplayNames !== "undefined") {
const names = new Intl.DisplayNames([locale], { type: "script" });
return names.of(code);
}
const fallbackNames = {
Latn: "Latin",
Cyrl: "Cyrillic",
Arab: "Arabic",
Hans: "Simplified Han",
Hant: "Traditional Han"
};
return fallbackNames[code] || code;
}
console.log(getScriptName("Latn", "en"));
// "Latin"
يضمن هذا عمل الكود الخاص بك حتى في المتصفحات التي لا تدعم Intl.DisplayNames، على الرغم من فقدان ميزات الترجمة التلقائية.