التدويل: جعل الويب في متناول الجميع

Ecma International ، اللجنة الفنية 39 ، أو ببساطة TC39 ، هي مجموعة من مطوري جافا سكريبت ، منفذي التكنولوجيا ، الأكاديميين والأطراف المهتمة الأخرى الذين يدعمون ويطورون جافا سكريبت كمنصة مع المجتمع.

عادة ما يشارك المشاركون في TC39 شيئًا مثيرًا للاهتمام باستخدام فهمهم العميق لجافا سكريبت. لكن بعض الناس يعتقدون أنهم ذهبوا بعيدًا جدًا عن مشاكل المطورين العاديين. أين مطور اللغة ، وأين الشخص الذي يكتب الواجهات الأمامية كل يوم في الممارسة؟

دعنا نتعرف على التقرير ، الذي يجمع بين عمق الفهم والتطبيق العملي العالي . تعرّف على قصة Romulo Cintra الجديدة حول قضايا التدويل التي ستعالجها واجهة برمجة التطبيقات الجديدة ، والتي ستظهر قريبًا في جافا سكريبت.



يعمل Romulo Cintra - مندوب TC39 ، في مجال التطوير والهندسة المعمارية منذ أكثر من 10 سنوات ، وهو متخصص في تطوير الويب والجوال والسحب. في هذا التقرير ، ستتعلم مباشرة الرئيس المشارك لمجموعة عمل MessageFormat ، وهي الخيارات المتاحة بالفعل لحل المشكلات الحالية ، وفي أي شكل سيتم حلها باستخدام واجهة برمجة التطبيقات الجديدة في JavaScript نفسها.

تحت النص ، النص الكامل لتقرير رومولو ورابط إلى الفيديو. إذا كنت تحب القراءة - فهذه المقالة تحتوي على كل شيء ؛ فلن تفوت أي شيء. إذا كان لديك الوقت لبدء تسجيل الفيديو ، فسيكون لديك حوالي ساعة من تسجيل الفيديو الجيد مع شرائح ممتعة ولغة إنجليزية مفهومة.

مزيد من السرد نيابة عن المتحدث.


هناك ثلاثة أشياء تحتاج إلى معرفتها عن حالة التدويل والتوطين: كل شيء سيئ جدًا جدًا. اسمي رومولو سينترا ، وأنا منخرط في تطبيقات الهندسة المالية. أتحدث كثيرًا مع أشخاص من TC39 وأرى كيف يحاولون جعل عالم JavaScript مكانًا أفضل. بالإضافة إلى ذلك ، أنا مؤيد قوي للمصدر المفتوح ، وفي وقت فراغي أنا مدرس في مدرسة التكنولوجيا في برشلونة.

إن قضية التدويل مهمة للغاية. حدث أن هناك على الأرض العديد من الشعوب واللغات المختلفة. يوجد في العالم اليوم حوالي 195 دولة و 6 آلاف لغة. هذا يجعل مهمتنا صعبة للغاية. فكر في شيء آخر: أكتب مقالات وأقرأ التقارير باللغة الإنجليزية ، وليس باللغة الروسية. لدينا بالفعل مشكلة التدويل. إذا كان شخص ما لا يتحدث الإنجليزية ، فسيتم استبعاده من محادثتنا معك. لمنع حدوث ذلك ، تم اختراع التدويل.

اختصار تدويل اللغة الإنجليزية باسم i18n. الرقم 18 هو عدد الأحرف بين الحرفين i و n في هذه الكلمة. باختصار ، التدويل هو تصميم البرمجيات من أجل تبسيط الأقلمة قدر الإمكان. بفضل التدويل ، يمكن للبرنامج دعم الإعدادات المحلية واللغة والعملة وما إلى ذلك. يجعل التدويل الويب أكثر سهولة للجميع. هنا يمكنك رسم موازٍ للتطوير من خلال الاختبار (التطوير القائم على الاختبار): هناك أولاً يكتب الاختبار ، ثم الرمز ؛ مع التدويل من الضروري أن تفعل الشيء نفسه. عادة يفكر الناس في التدويل بعد كتابة الرمز ، لكن هذا خطأ.

على غرار i18n ، l10n هو اختصار الترجمة ، و 10 هو عدد الأحرف بين l الأول والأخير n. التعريب هو تكييف المنتج مع اللغة والبيئة الثقافية التي يتم توزيعها فيها. أي أنك لا تحتاج فقط إلى ترجمة "مرحبًا" إلى "مرحبًا" ، ولكن أيضًا استخدام العملة المحلية والفاصل العشري وما إلى ذلك ، أي جعل البرنامج أكثر إلمامًا للمستخدم. إنها أكثر من مجرد ترجمة.

كم عدد اللغات التي تدعمها مشاريع الويب الخاصة بك؟ لدى الكثير منهم أكثر من اثنين. هل يوجد من لديه أكثر من خمسة؟ ماذا عن 15؟ ندعم حوالي 25 لغة. ليس لدينا دعم جيد للغاية ، لأن التدويل غير منظم بأفضل طريقة. في سياق التقرير ، سأشرح كيفية تحسين التدويل ، وسأتحدث عن التدابير التي نتخذها.

لذا ، أكرر مرة أخرى: التدويل يعني تبسيط الأقلمة ، وتقديم الدعم لها على مستوى الهندسة المعمارية. والتوطين هو تكييف البرمجيات مع الحقائق المحلية. لا تتوافق الترجمة في كثير من الأحيان مع النص الأصلي - لنأخذ مثالاً من صناعة الأفلام ، حيث تمت ترجمة اسم فيلم "ألم واكتساب" على أنه "دم وعرق: الابتنائية".



أو مثال آخر: إعلان لحمام روسي تقول فيه الترجمة الإنجليزية "المحرقة الروسية" (المحرقة الروسية).



أشك في أن هذا سيجذب العملاء ، على الأقل على قيد الحياة. إن التدويل والتوطين مهمان للغاية على وجه التحديد لأنهما يسمحان لنا بنقل ما نريد قوله بالضبط للمستخدم. في الأساس ، التدويل هو توفير إمكانية الوصول ، لأنه إذا لم تتمكن من فهم البرنامج الذي تعمل معه ، فإن خياراتك في الواقع محدودة. من المفيد للجميع أن البرنامج أكثر سهولة في الوصول إليه ، لأنه يوفر نطاقًا أوسع من المستخدمين ، وبالتالي دخلًا أعلى ؛ كما أنه يجعل الويب أفضل.

Messageformat


خذ بعين الاعتبار أمثلة التعليمات البرمجية:

'es-ES': { 
    HELLO_WORLD: '¡Hola mundo!' 
}, 
'en-GB': { 
    HELLO_WORLD: 'Hello world!'

نحن بحاجة إلى ترجمة كائنات السلسلة لدينا. لدينا متغير HELLO_WORLDمع السطور المقابلة في كل لغة. لمثل هذه الترجمة في العديد من اللغات (على سبيل المثال ، جافا) ، يوجد تنسيق MessageFormat . دعونا نحاول معرفة ما هو. أولاً ، القليل عن بعض التقنيات الأساسية - لنبدأ بـ Unicode. هذا معيار يخلق مساحة واحدة لشخصيات من لغات مختلفة. دعنا نرسم التشابه مع الشطرنج: يمكن أن يكون لكل نوع من القطع شكل مختلف ، لكننا نعرف دائمًا أين يجب أن تكون بالضبط على اللوحة. حسنًا ، بالطبع ، هناك تنسيقات Unicode مختلفة بأعداد مختلفة من وحدات البايت: UTF-8 و UTF-16 و UTF-32. الآن العلامة الوصفية الأكثر استخدامًا هي UTF-8. باستخدام Unicode ، يمكن للمستعرض عرض أحرف خاصة ، إذا كانت هذه العلامة`metaننسى ، لن يفهم أحد نوع الرموز الموجودة على الصفحة.

بالإضافة إلى Unicode ، هناك تقنيتان مهمتان أخريان هما CLDR و ICU. CLDR هو نوع من قاعدة البيانات من الحروف الهجائية والبلدان والعملات والمناطق الزمنية ، وما إلى ذلك ، المخزنة بلغات مختلفة من العالم. ليست كل لغات العالم البالغ عددها 6 آلاف موجودة ، ولا يزال العمل جارياً على قاعدة البيانات هذه. آخر تحديث كان في أكتوبر الماضي. مشروع مهم آخر هو وحدة العناية المركزة. هذه قاعدة بيانات ضخمة من الكلمات والأرقام والرموز من لغات مختلفة ، والتي يتم توفيرها في شكل طرق للفرز والتطبيع والتنسيق ، وما إلى ذلك. يتم استخدام هذه المكتبات في العديد من لغات البرمجة. في JavaScript ، يعتبر ICU في صميم واجهة برمجة التطبيقات الدولية. ولكن هناك العديد من المواد المتنوعة بلغات العالم التي يجب عرضها في المتصفحات لدرجة أن العمل على إدراجها في هذه المعايير بعيد عن الاكتمال.

MessageFormat هو تنسيق يسمح لك بربط مفتاح معين برسالة معينة بلغة معينة. في بعض الحالات ، يمكن تمرير المتغيرات إلى MessageFormat ، وهي تحددها وتدخلها في السطر الأخير. تم حل نفس المشكلة بطريقة مختلفة قليلاً في لغات أخرى. في Android ، يتم تنفيذ MessageFormat في Java. هناك ، للعمل مع هذا التنسيق ، ليست هناك حاجة إلى مكتبة خاصة ؛ Android قادر على التفاعل معها نفسها. في iOS ، هناك واجهة برمجة تطبيقات تشبه إلى حد كبير تلك الموجودة في JavaScript. إنه مدمج في النظام ، ليست هناك حاجة لتنزيل أي شيء هناك أيضًا ، فقط قم بتمرير الخط الضروري إلى طريقة واجهة برمجة التطبيقات هذه.

كيف تم حل هذه المشكلة في JavaScript؟ ليس بعد. ولكن لدينا العديد من المكتبات التي تقدم حلاً.



يظهر عدد التنزيلات الأكثر شيوعًا منها (واثنان أقل شعبية ، بطلاقة من Mozilla و fbt من Facebook). يتم إجراء ما يقرب من مليوني عملية تنزيل كل أسبوع ، لذلك هناك حاجة للمكتبات للتدويل.

مكتبات


سنقدم بإيجاز بعض هذه المكتبات ، ونبدأ بـ i18next. قام مطوروها بإجراء العديد من التغييرات على MessageFormat ، ولا تتبع وحدة العناية المركزة بالكامل. ومع ذلك ، فهي مكتبة جيدة للغاية. يتمتع تطبيق MessageFormat بالعديد من المزايا ، على سبيل المثال ، القدرة على استخدام استيفاء السلسلة (التي لا تتوفر بتنسيق ICU). ومع ذلك ، هناك أيضًا عيوب ، على سبيل المثال ، لا يمكن وضع رسائل الجمع على نفس السطر مثل الخط الوحيد ، كما يمكن القيام به في وحدة العناية المركزة.

واحدة من أشهر مكتبات التدويل هي intl-messageformat. يتم تنزيله كل أسبوع أكثر من 700 ألف مرة. يتم التعامل مع دعمها من قبل زميلي Long Hu. يتم تفسير شعبيته من خلال حقيقة أن رد الفعل intl يتم إنشاؤه فوقه. لذا إذا كنت تستخدم React ، فعلى الأرجح أن لديك هذه المكتبة. يشارك مطورها أيضًا في ECMA-402 ، وبالتالي يحاول الامتثال لمعيار وحدة العناية المركزة.

var MESSAGES = { 
    'en-US': { 
        NUM_PHOTOS: 'You have {numPhotos, plural, ' +
            '=0 {no photos.}' +
            '=1 {one photo.}' +
            'other {# photos.}}'
}, 
    'es-MX': {
        NUM_PHOTOS: 'Usted {numPhotos, plural, ' +
            '=0 {no tiene fotos.}' + 
            '=1 {tiene una foto.}' 
            +'other {tiene # fotos.}}' 
    } 
};

تطبيقه يشبه إلى حد كبير MessageFormat . هنا يمكنك تمرير المتغيرات وبيان الحاجة إلى الجمع.

قبل الانتقال إلى أمثلة التعليمات البرمجية ، سأتحدث عن مكتبتين جديدتين جديدتين في الموضة الآن ، تم إنشاؤها بواسطة Facebook و Mozilla.



لا يمكن عرض واجهة برمجة التطبيقات بأكملها ككل ، ولكن خذ كلمتي من أجلها: لقد بذل مطورو هذه المكتبات قصارى جهدهم ، وهناك بالضبط ما نفتقده الآن. صحيح ، لقد جعلها Facebook بأسلوبها الخاص: ترميزها الخاص ، والقدرة على التشغيل أثناء التخطيط ، واستخراج خرائط التجزئة من السلاسل التي يمكن ترجمتها تلقائيًا. المشكلة هي أن كل هذا يركز على النطاق الذي نادرا ما يعمل المبرمج العادي. المشروع صغير جدًا ، ويريدون دمجه مع مكتبات أخرى معروفة ، على سبيل المثال ، مع React. في المستقبل ، من المرجح أن يكتسب شعبية.

كل ما سبق عبارة عن مكتبات تحتاج إلى تنزيل إضافي ، فهي ليست مدمجة في المتصفح. مع متصفح واحد فقط ، لن نذهب بعيدًا ، لذلك كل شيء سيء مع التعريب. يمكن أن يساعدنا MessageFormat في تغيير هذا الوضع . بينما لا يمكننا استخدامه ، ولكن صدقوني: المستقبل يكمن معه. نحن نعمل الآن بنشاط على ذلك ، وإنشاء أصحاب المصلحة ، والبحث عن أفكار جديدة لـ MessageFormat الجديد . في نسخته الأصلية ، هذا التنسيق أصبح قديمًا بالفعل ، وقد تطورت احتياجات المطورين بشكل كبير منذ إنشائه. يجب أن يتم التنسيق الجديد بجودة عالية وأن يكون سهل الاستخدام.

IntL.DateTimeFormat


لدى المتصفحات بالفعل العديد من الآليات المضمنة للتدويل والتعريب ، ومعظمها ببساطة لا يعرف عنها ولا يستخدمها. هل سمعت عن Intl.DateTimeFormat؟ في هذا المشروع ، نقوم باستمرار بإنشاء واجهات برمجة تطبيقات جديدة. من المحتمل أنه لم تعد هناك حاجة إلى Moment.js و Day.js و date-fns .

const myDate = new Date(); 
new Intl.DateTimeFormat('ru', { timeStyle : 'short'}).format(myDate); 
// short → 19:49 
// medium → 19:49:17 
// long → 19:49:17 GMT+2
// full → 19:49:17  ,  

هناك timeStyle ، تم إنشاؤه قبل بضعة أشهر ويسمح لك بتنسيق التاريخ والوقت دون اللجوء إلى Moment.js. بالإضافة إلى ذلك ، هناك طريقة formatRange . دائمًا ما تكون أي مهمة مرتبطة باختيار نطاق زمني (مثل المواقع ذات وظيفة الحجز) صعبة. لكن طريقة ذلك موجودة بالفعل في المتصفح. والأهم من ذلك ، تدعم هذه الطريقة التدويل ، مع التخلص من الحاجة إلى تنزيل مكتبات إضافية.

تنسيق الوقت النسبي الدولي


لقد عملت على توثيق الجزء الثاني من هذا المشروع ، وإذا كنت ترغب أيضًا في المشاركة ، فنحن بحاجة إلى المساعدة في الترجمة إلى اللغة الروسية والامتثال للمعايير. هناك حاجة إلى RelativeTimeFormat عندما تحتاج إلى إجراء العد التنازلي.

const myTime = new Intl.RelativeTimeFormat('ru', { style: 'narrow' }); 
myTime.format(2 , 'quarter'); 
//Style Narrow : +2 . → in 2 qtrs. → dentro de 2 trim. 
//Style Long :  2  → in 2 quarters → dentro de 2 trimestres

الآن أصبح من السهل جدًا القيام بذلك ، يمكنك تحديد الوقت خلال يومين أو أسبوعين أو ربع سنة ، إلخ. في السابق ، لم يكن مثل هذا التنسيق على الويب موجودًا.

const myTime = new Intl.RelativeTimeFormat('ru', { style: 'narrow' }); 
myTime.format(2 , 'day'); 
//Style Narrow : +2 . → in 2 days → dentro de 2 días 
//Style Long :  2  → dentro de 2 días myTime.format(-1 , 'day');
//Style Narrow : -1 . → 1 day ago → hace 1 día 
//Style Long : 1   → 1 day ago → hace 1 día //Numeric(auto) :  → yesterday → ayer 

هنا مثال بالروسية. يمكنك بنفسك اختبار تشغيل هذا الرمز ، لأنه موجود بالفعل في متصفحك.

const myTime = new Intl.RelativeTimeFormat('ru', { style: 'narrow' }); 
myTime.format(20 , 'seconds'); 
//Style Narrow : +20  → in 20 sec. → dentro de 20 s 
//Style Long :  20  → in 20 seconds → dentro de 20 segundos

هذه الطريقة مفيدة للغاية ، ويمكن أن تعطي الوقت بالتنسيق القصير الذي تراه أعلاه. أؤكد أنه لكل هذا لا تحتاج إلى استخدام أي مكتبات طرف ثالث.

تنسيق الرقم الدولي


الشيء التالي الذي أردت مشاركته هو Intl.NumberFormat . سأتحدث عن المرحلة الثالثة ، ولكن يتم عرض المرحلة الثانية فقط في الأمثلة ، لأن بعض التغييرات لا تزال قيد المناقشة. يعمل Intl.NumberFormat مع الوحدات وأشكال التسجيل. يجدر الانتباه إلى ما يفعله بالوحدات: فهو يسمح لك بالعمل مع أنماط مختلفة.

new Intl.NumberFormat("ru", { 
style: "unit", 
unit: "liter", unitDisplay: "long" 
}).format(16); 
// → 16  → 16 liters → 16 litros

يتم أخذ جميع الوحدات من UTC 35 ، وهناك الكثير منها. في المجموع ، يتم تقديم حوالي 140 وحدة للتنسيق هنا. حتى الآن أصبح التدويل أسهل من أي وقت مضى. تحتاج فقط إلى ترجمة خطوطك ، وكل الديناميكيات الضرورية موجودة بالفعل في المتصفح.

const nbr = 987654321; 
new Intl.NumberFormat('ru', { notation: 'scientific' }).format(nbr); 
// → 9,877E8 → 9.877E8 (en-US) 
new Intl.NumberFormat('ru', { notation: 'engineering' }).format(nbr); 
// → 987,654E6 → 987.654E6 (en-US) 
new Intl.NumberFormat('ru', { notation: 'compact' }).format(nbr); 
// → 988  → 988M (en-US) → 9.9亿 (zn-CN) 
new Intl.NumberFormat('ru', { notation: 'compact', compactDisplay: 'long' }).format(nbr); 
// → 988  → 988 millions (fr)

الآن لنماذج التسجيل. لأكون صريحًا ، لا أستخدمها كثيرًا لأنني لا أستخدم شكل التسجيل مع الأس (السجل العلمي) ، ولا يتعين علي تقديم أعداد كبيرة. ولكن إذا كنت بحاجة إليها ، فهناك واجهة برمجة تطبيقات مقابلة خاصة لك.

تنسيق القائمة الدولية


واجهة برمجة تطبيقات أخرى مفيدة هي Intl.ListFormat ، والتي هي بالفعل في المرحلة الثالثة وتسمح لك بتنسيق القوائم بطريقتين مختلفتين. لنفترض أنني بحاجة لقول عبارة "أنا ذاهب إلى HolyJS". يمكننا عمل قائمة تتضمن الخطين "موسكو" و "سانت. بطرسبرغ "، حدد معلمة" الاقتران "، وسيتم الجمع بين السطور من قبل اتحاد اللغة الروسية" و ". هذه ميزة جديدة تمامًا ومفيدة جدًا.



إذا حددت "الفصل" ، نحصل على الاتحاد "أو".



أخيرًا ، يمكن للوظيفة تحديد اللغة والأبجدية المستخدمة تلقائيًا وفرز عناصر القائمة وفقًا لذلك.

قواعد الجمع الدولية


واجهة برمجة تطبيقات مهمة أخرى هي Intl.PluralRules . واجهة برمجة التطبيقات هذه هي الأقدم على الإطلاق ، ولكن لسبب ما لا يستخدمها أحد.



عندما أرى قوائم المتأهلين للتصفيات النهائية في السباقات أو في كرة القدم ، يتم دائمًا الإشارة إلى الأرقام بجوار الأسماء: "1" ، "2" ، "3" ، إلخ. ولكن هذا لا يتوافق مع الطريقة التي نقول أنها ستكون أقرب كثيرًا للحديث ، اكتب "الأول" ، "الثاني" ، "الثالث". ولهذا ، هناك واجهات برمجة تطبيقات خاصة ، ليس من الصعب استخدامها.



على سبيل المثال ، يمكننا كتابة العبارات "قطة واحدة" و "0 قطط" و "0.5 قطط" و "1.5 قطط" ، وسيقوم API تلقائيًا بتحديد نهاية الجمع الصحيحة.

Inti.DisplayNames


هذه واحدة من واجهات برمجة التطبيقات الأكثر شيوعًا ، لأننا غالبًا ما نضطر إلى عرض قوائم البلدان. لنفترض أن لدينا قائمة بالدول - على سبيل المثال ، في قاعدة بيانات أو في JSON. بعد ذلك ، في كل مرة تقوم فيها بتغيير اللغة ، نحتاج إلى تحميل ملف JSON منفصل بقائمة جديدة من البلدان والعملات وما إلى ذلك. هناك عدد كبير جدًا من JSONs هذه ، وكيف تنتهي؟ نحن ننشئ خدمة صغيرة يتم فيها تضمين قاعدة بيانات تحتوي على لغات مختلفة ، ونستخرج جميع البيانات منها. بالطبع ، في المثال مع قائمة البلدان ، كنا محظوظين ونحتاج إلى تحديث البيانات بشكل غير متكرر - ولكن لن يكون الأمر كذلك دائمًا ، أليس كذلك؟ لا يمكننا حل جميع المشاكل في وقت واحد ، ولكن DisplayNames يحل بعضها. لديك واجهة برمجة التطبيقات كما هو موضح في المثال أدناه ، ولا يمكنك طلب سوى قائمة بالعملات أو قائمة البلدان فقط:

const currencyNames = new Intl.DisplayNames(['en'], {type: 'currency'}); currencyNames.of('USD'); // "US Dollar" 
currencyNames.of('EUR'); // "Euro" 
currencyNames.of('TWD'); // "New Taiwan Dollar" 
currencyNames.of('CNY'); // "Chinese Yuan"


const languageNames = new Intl.DisplayNames(['en'], {type: 'language'}); languageNames.of('fr'); // "French" 
languageNames.of('de'); // "German" 
languageNames.of('fr-CA'); // "Canadian French" 
languageNames.of('zh-Hant'); // "Traditional Chinese"

هذا شيء مفيد للغاية. إنه لا يعمل فقط مع البلدان والعملات: بنفس الطريقة ، يمكنك العمل مع الأشهر وأيام الأسبوع والعديد من الأشياء الأخرى التي تحتاجها كمطور.

النتائج والخطط للمستقبل


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

بالنسبة لنا MessageFormatملائم للغاية ، وسيظهر قريبًا. هناك مكتبات ، وهناك مطورين يعملون عليها. يعمل جميع هؤلاء المطورين على قضايا ذات صلة. يتفق معظم منشئي المكتبات الأكثر شعبية ومعظم الشركات الكبرى (Netflix و Amazon و Facebook) على شيء واحد على الأقل: الآن هناك حاجة ملحة للتدويل. يشار إلى ذلك أيضًا من خلال مليوني تنزيل في الأسبوع. حتى الآن يمكننا أن نكتب MessageFormat مرة أخرى ، ونفعل ذلك بطريقة جيدة.

من سيستفيد من التدويل المناسب؟ الويب بالكامل: جميع الشركات وجميع المشاريع والمكتبات. مكتبات مثل Intl.MessageFormatلن تختفي في أي مكان ، لكنها ستبدأ في العمل بطريقة جديدة. لن تحتاج إلى تنزيل البيانات ، نظرًا لأن جميع البيانات ستكون موجودة بالفعل في المتصفح. على الأرجح ، لن تحتاج إلى التبديل إلى مكتبة جديدة. تعمل بعض هذه المكتبات بالفعل كملفات متعددة لبعض عمليات التنفيذ. بعض عمليات التنفيذ التي ذكرتها هي في المرحلة الثالثة ولا يتم تنفيذها في جميع المتصفحات. لكن المكتبات مثل Intl.MessageFormat توفر تعدد الوسائط لهذه الوظيفة. بشكل عام ، يأتي فصل جديد في تاريخ الويب - ثورة حقيقية. ستصبح شبكة الإنترنت متاحة ومفهومة للجميع. هذا مهم للغاية.

أعتقد أنه من المهم جدًا ضمان تفرد مشروعنا. إذا كان هناك تنسيق واحد يمكن استخدامه في C ++ و Java و JavaScript ، فلماذا لا تستخدم هذا التنسيق في كل مكان؟ عندما نكتب صفحات الويب ، غالبًا ما نحتاج إلى إنشاء إصدارات للجوال منها ، وفي هذه الحالة يتعين علينا القيام بالكثير من العمل مرتين. إذا كان لدينا تنسيق واحد لكل شيء ، فيمكننا فقط استخدام الموارد الحالية و API. نحن بحاجة إلى مستوى جديد من التكامل مع الأدوات. يتم توفير التدويل ليس فقط من خلال عمل المطورين المشاركين مباشرة فيه. بالنسبة لها ، تعد الوحدات النمطية مهمة للغاية ، لأنه غالبًا ما يكون من المناسب استخدام أدوات التنسيق الخاصة بك ، التعليمات البرمجية الخاصة بك. لذلك ، لا يجب إغلاق واجهة برمجة التطبيقات ، يجب أن تكون مفتوحة حتى يتمكنوا من ربط ما يتطلبه الموقف.نقطة أخرى مهمة: يجب أن تكون واجهات برمجة التطبيقات هذه أصلية. توفر CLDRs البيانات التي تحتاجها واجهة برمجة تطبيقات التدويل. إذا كنت تقوم بتشغيل Windows أو MacOS ، فأنت تقوم بالفعل بتنزيل البيانات من CLDR. CLDR هو مستودع فريد من نوعه ؛ لا أحد يكرر وظيفته. وهذا يعني أنه يمكن تنزيل البيانات مرة واحدة فقط وجعلها مشتركة في نظام التشغيل بالكامل. إذا تم تحميل جميع البيانات الخاصة بواجهة برمجة التطبيقات Intl API بالفعل في نظام التشغيل ، فلماذا لا يتم توفيرها لجميع البرامج الموجودة على هذا النظام؟إذا تم تحميل جميع البيانات الخاصة بواجهة برمجة التطبيقات Intl API بالفعل في نظام التشغيل ، فلماذا لا يتم توفيرها لجميع البرامج الموجودة على هذا النظام؟إذا تم تحميل جميع البيانات الخاصة بواجهة برمجة التطبيقات Intl API بالفعل في نظام التشغيل ، فلماذا لا يتم توفيرها لجميع البرامج الموجودة على هذا النظام؟

علمتنا تجربتنا أن نتذكر أننا لسنا وحدنا ، وأن المبرمجين لا يعملون فقط على التدويل. نحن مطورون ولسنا مترجمين. لنفترض أننا بحاجة إلى تغذية خط في واجهتنا ، نرسلها إلى شركة الترجمة. لكن المترجمين في كثير من الأحيان ليس لديهم سياق لهذه السطور. هذا غير موجود أيضًا في MessageFormat . في بعض الأحيان يؤدي هذا إلى أخطاء ، كما رأينا بالفعل في المثال المذكور مع محرقة الجثث الروسية.

أخيرًا ، أعتقد أن واجهات برمجة التطبيقات للتدويل يجب أن تكون سهلة الاستخدام ، ويجب أن يكون الجميع قادرين على القيام بالتدويل - وهذا لا ينبغي أن يستغرق الكثير من الوقت والجهد. عند كتابة التعليمات البرمجية للتدويل ، تحتاج إلى الاسترشاد منذ البداية. بعد كل شيء ، مع TDD ، يكتبون أولاً اختبارًا ، ثم يرمزون ؛ دعونا نبدأ مشاريع الويب الخاصة بنا على هذا المبدأ مع التدويل والتوطين المناسبين. سيتيح لنا ذلك إنشاء مواقع ملائمة وفي متناول الجميع.
HolyJS 2020 Piter «Speak my language %app%». , , : . HolyJS 2020 Piter . , .

All Articles