Internationalisierung: Das Web für alle zugänglich machen

Ecma International, Technical Committee 39 oder einfach TC39, ist eine Gruppe von JavaScript-Entwicklern, Technologie-Implementierern, Wissenschaftlern und anderen interessierten Parteien, die zusammen mit der Community JavaScript als Plattform unterstĂĽtzen und entwickeln.

TC39-Teilnehmer teilen normalerweise etwas Interessantes mit ihrem tiefen Verständnis von JavaScript. Aber einige Leute denken, dass sie zu weit von den Problemen gewöhnlicher Entwickler entfernt sind. Wo ist der Sprachentwickler und wo ist die Person, die in der Praxis jeden Tag Frontends schreibt?

Machen wir uns mit dem Bericht vertraut, der sowohl die Tiefe des Verständnisses als auch die hohe praktische Anwendbarkeit vereint . Lernen Sie die neue Geschichte von Romulo Cintra zu Internationalisierungsproblemen kennen, die in der neuen API behandelt wird, die in Kürze in JavaScript erscheinen wird.



Romulo Cintra - TC39-Delegierter, arbeitet seit über 10 Jahren in den Bereichen Entwicklung und Architektur und hat sich auf Web, mobile Entwicklung und Clouds spezialisiert. In diesem Bericht erfahren Sie aus erster Hand , welchen Co-Vorsitzenden der MessageFormat-Arbeitsgruppe bereits Optionen zur Lösung bestehender Probleme zur Verfügung stehen und in welcher Form sie mithilfe der neuen API in JavaScript selbst gelöst werden sollen.

Unter dem Schnitt das vollständige Textprotokoll des Romulo-Berichts und ein Link zum Video. Wenn Sie gerne lesen - dieser Artikel hat alles, Sie werden nichts verpassen. Wenn Sie Zeit haben, um mit der Videoaufnahme zu beginnen, haben Sie ungefähr eine Stunde gute Videoaufnahme mit interessanten Folien und verständlichem Englisch.

Weitere Erzählung im Namen des Sprechers.


Es gibt drei Dinge, die Sie ĂĽber den Stand der Internationalisierung und Lokalisierung wissen mĂĽssen: Alles ist sehr, sehr, sehr schlecht. Mein Name ist Romulo Cintra und ich bin an Finanzarchitekturanwendungen beteiligt. Ich spreche viel mit Leuten von TC39 und sehe, wie sie versuchen, die JavaScript-Welt zu einem besseren Ort zu machen. AuĂźerdem bin ich ein starker BefĂĽrworter von Open Source und in meiner Freizeit bin ich Lehrer an der School of Technology in Barcelona.

Das Thema Internationalisierung ist sehr wichtig. So kam es, dass es auf unserer Erde viele verschiedene Völker und Sprachen gibt. In der heutigen Welt gibt es ungefähr 195 Länder und 6.000 Sprachen. Dies macht unsere Aufgabe äußerst schwierig. Denken Sie an etwas anderes: Ich schreibe Artikel und lese Berichte auf Englisch, nicht auf Russisch; Wir haben bereits ein Problem der Internationalisierung. Wenn jemand kein Englisch spricht, wird er von unserem Gespräch mit Ihnen ausgeschlossen. Um dies zu verhindern, wurde die Internationalisierung erfunden.

Englische Internationalisierung abgekürzt als i18n. Die Zahl 18 ist die Anzahl der Zeichen zwischen den Buchstaben i und n in diesem Wort. Kurz gesagt, Internationalisierung ist das Design von Software, um die Lokalisierung so weit wie möglich zu vereinfachen. Dank der Internationalisierung kann die Software lokale Einstellungen, Sprache, Währung usw. unterstützen. Die Internationalisierung macht das Web für alle zugänglicher. Hier können Sie durch Testen (testgetriebene Entwicklung) eine Parallele zur Entwicklung ziehen: Dort wird zuerst der Test geschrieben und dann der Code; Mit der Internationalisierung ist es notwendig, dasselbe zu tun. Normalerweise denken die Leute nach dem Schreiben des Codes über Internationalisierung nach, aber das ist falsch.

Ähnlich wie bei i18n ist l10n die Abkürzung für Lokalisierung und 10 die Anzahl der Zeichen zwischen dem ersten l und dem letzten n. Lokalisierung ist die Anpassung eines Produkts an das sprachliche und kulturelle Umfeld, in dem es vertrieben wird. Das heißt, Sie müssen nicht nur "Hallo" in "Hallo" übersetzen, sondern auch die lokale Währung, das Dezimaltrennzeichen usw. verwenden, um die Software dem Benutzer vertrauter zu machen. Es ist mehr als nur eine Übersetzung.

Wie viele Sprachen unterstützen Ihre Webprojekte? Viele haben mehr als zwei. Gibt es jemanden, der mehr als fünf hat? Was ist mit 15? Wir unterstützen ca. 25 Sprachen. Wir haben keine sehr gute Unterstützung, weil die Internationalisierung nicht optimal organisiert ist. Im Verlauf des Berichts werde ich erläutern, wie die Internationalisierung verbessert werden kann, und über die Maßnahmen sprechen, die wir ergreifen.

Ich wiederhole noch einmal: Internationalisierung bedeutet, die Lokalisierung zu vereinfachen und sie auf Architekturebene zu unterstützen. Und Lokalisierung ist die Anpassung von Software an lokale Realitäten. Die Übersetzung entspricht sehr oft nicht dem Original - nehmen wir ein Beispiel aus der Filmindustrie, in der der Name des Films „Pain and Gain“ als „Blood and Sweat: Anabolics“ übersetzt wurde.



Oder ein anderes Beispiel: eine Werbung für ein russisches Bad, in der die englische Übersetzung „Russisches Krematorium“ (russisches Krematorium) sagt.



Ich bezweifle, dass dies Kunden anziehen wird, zumindest lebend. Internationalisierung und Lokalisierung sind gerade deshalb so wichtig, weil sie es uns ermöglichen, genau das zu vermitteln, was wir dem Benutzer sagen möchten. Internationalisierung ist im Wesentlichen die Bereitstellung von Barrierefreiheit, denn wenn Sie die Software, mit der Sie arbeiten, nicht verstehen können, sind Ihre Optionen tatsächlich begrenzt. Es ist für alle von Vorteil, dass die Software leichter zugänglich ist, da sie eine größere Bandbreite von Benutzern und damit ein höheres Einkommen bietet. es macht auch das Web besser.

Nachrichtenformat


Betrachten Sie die Codebeispiele:

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

Wir müssen unsere String-Objekte übersetzen. Wir haben eine Variable HELLO_WORLDmit entsprechenden Zeilen in jeder Sprache. Für eine solche Übersetzung in viele Sprachen (z. B. Java) existiert das MessageFormat- Format . Versuchen wir herauszufinden, was es ist. Zunächst ein wenig über einige grundlegende Technologien - beginnen wir mit Unicode. Dies ist ein Standard, der ein einzelnes Leerzeichen für Zeichen aus verschiedenen Sprachen erstellt. Lassen Sie uns eine Analogie zum Schach ziehen: Jede Art von Figuren kann eine andere Form haben, aber wir wissen immer, wo genau sie auf dem Brett sein sollten. Natürlich gibt es verschiedene Unicode-Formate mit unterschiedlicher Anzahl von Bytes: UTF-8, UTF-16 und UTF-32. Das am häufigsten verwendete Meta-Tag ist jetzt UTF-8. Mit Unicode kann der Browser Sonderzeichen anzeigen, wenn dieses Tag`metaVergiss, niemand wird verstehen, welche Art von Symbolen wir auf der Seite haben.

Neben Unicode sind CLDR und ICU zwei weitere wichtige Technologien. CLDR ist eine Art Datenbank mit Alphabeten, Ländern, Währungen, Zeitzonen usw., die in verschiedenen Sprachen der Welt gespeichert ist. Nicht alle 6.000 Sprachen der Welt sind darin vorhanden, an dieser Datenbank wird noch gearbeitet. Das letzte Update war im letzten Oktober. Ein weiteres wichtiges Projekt ist die Intensivstation. Dies ist eine riesige Datenbank mit Wörtern, Zahlen und Symbolen aus verschiedenen Sprachen, die in Form von Methoden zum Sortieren, Normalisieren, Formatieren usw. bereitgestellt werden. Diese Bibliotheken werden in vielen Programmiersprachen verwendet. In JavaScript bildet die Intensivstation den Kern der Intl-API. Es gibt jedoch so viele verschiedene Materialien in den Sprachen der Welt, die in Browsern angezeigt werden müssen, dass die Arbeit, sie in diese Standards aufzunehmen, bei weitem nicht abgeschlossen ist.

MessageFormat ist ein Format, mit dem Sie einer bestimmten Nachricht in einer bestimmten Sprache einen bestimmten Schlüssel zuordnen können. In einigen Fällen können Variablen an MessageFormat übergeben werden , es definiert sie und gibt sie in die letzte Zeile ein. Das gleiche Problem wurde in anderen Sprachen auf etwas andere Weise gelöst. In Android ist MessageFormat in Java implementiert. Um mit diesem Format zu arbeiten, wird keine spezielle Bibliothek benötigt, Android kann selbst damit interagieren. In iOS gibt es eine API, die der in JavaScript sehr ähnlich ist. Es ist in das System integriert, es muss dort auch nichts heruntergeladen werden. Übergeben Sie einfach die erforderliche Zeile an die Methode dieser API.

Wie wurde dieses Problem in JavaScript behoben? Noch nicht. Wir haben jedoch viele Bibliotheken, die eine Lösung anbieten.



Es zeigt die Anzahl der Downloads der beliebtesten von ihnen (und zwei weniger beliebte, flieĂźend von Mozilla und fbt von Facebook). Jede Woche finden fast zwei Millionen Downloads statt, daher sind Bibliotheken fĂĽr die Internationalisierung erforderlich.

Bibliotheken


Wir werden einige dieser Bibliotheken kurz vorstellen und mit i18next beginnen. Die Entwickler haben viele Änderungen an MessageFormat vorgenommen und folgen der Intensivstation nicht vollständig. Es ist jedoch eine sehr gute Bibliothek. Die Implementierung von MessageFormat bietet viele Vorteile, z. B. die Möglichkeit der Verwendung der Zeichenfolgeninterpolation (die im ICU-Format nicht verfügbar ist). Es gibt jedoch auch Nachteile, zum Beispiel können mehrere Nachrichten nicht in derselben Zeile wie die einzige platziert werden, wie dies auf der Intensivstation möglich ist.

Eine der bekanntesten Internationalisierungsbibliotheken ist das intl-messageformat. Jede Woche wird es mehr als 700.000 Mal heruntergeladen. Ihre Unterstützung wird von meiner Kollegin Long Hu übernommen. Seine Popularität erklärt sich aus der Tatsache, dass darauf reag-intl erstellt wird. Wenn Sie also React verwenden, verfügen Sie höchstwahrscheinlich über diese Bibliothek. Ihr Entwickler nimmt auch an ECMA-402 teil und versucht daher, den ICU-Standard einzuhalten.

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.}}' 
    } 
};

Die Implementierung ist MessageFormat sehr ähnlich . Hier können Sie Variablen übergeben und die Notwendigkeit des Plural angeben.

Bevor ich zu den Codebeispielen ĂĽbergehe, werde ich ĂĽber zwei weitere neue Bibliotheken sprechen, die jetzt in Mode sind und von Facebook und Mozilla erstellt wurden.



Die gesamte API kann nicht als Ganzes angezeigt werden, aber nehmen Sie mein Wort: Die Entwickler dieser Bibliotheken haben ihr Bestes gegeben, genau das fehlt uns gerade. Es stimmt, Facebook hat es in seinem eigenen Stil gemacht: seinem eigenen Markup, der Fähigkeit, während des Layouts ausgeführt zu werden, dem Extrahieren von Hash-Maps aus Strings, die automatisch übersetzt werden können. Das Problem ist, dass sich all dies auf die Skala konzentriert, mit der der durchschnittliche Programmierer selten arbeitet. Das Projekt ist sehr jung und sie möchten es in andere bekannte Bibliotheken integrieren, beispielsweise in React. In Zukunft wird er wahrscheinlich an Popularität gewinnen.

Alle oben genannten sind Bibliotheken, die zusätzlich heruntergeladen werden müssen, sie sind nicht in den Browser integriert. Mit nur einem Browser werden wir nicht weit kommen, daher ist bei der Lokalisierung alles schlecht. MessageFormat kann uns dabei helfen, diesen Zustand zu ändern . Wir können es zwar nicht benutzen, aber glauben Sie mir: Die Zukunft liegt bei ihm. Jetzt arbeiten wir aktiv daran, etablieren Stakeholder und suchen nach neuen Ideen für das neue MessageFormat . In der Originalversion ist dieses Format bereits veraltet. Die Anforderungen der Entwickler haben sich seit seiner Einführung erheblich weiterentwickelt. Das neue Format sollte effizient und einfach zu bedienen sein.

Intl.DateTimeFormat


Browser verfügen bereits über viele integrierte Mechanismen zur Internationalisierung und Lokalisierung. Die meisten von ihnen kennen sie einfach nicht und verwenden sie nicht. Haben Sie schon von Intl.DateTimeFormat gehört? In diesem Projekt erstellen wir ständig neue APIs. Es ist wahrscheinlich, dass Moment.js , Day.js , date-fns nicht mehr benötigt werden .

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  ,  

Es gibt timeStyle, das vor einigen Monaten erstellt wurde und es Ihnen ermöglicht, Datum und Uhrzeit zu formatieren, ohne auf Moment.js zurückzugreifen. Darüber hinaus gibt es eine formatRange- Methode . Jede Aufgabe, die mit der Auswahl eines Datumsbereichs verbunden ist (z. B. auf Websites mit einer Reservierungsfunktion), ist immer schwierig. Die Methode hierfür existiert jedoch bereits im Browser. Und vor allem unterstützt diese Methode die Internationalisierung, ohne dass zusätzliche Bibliotheken heruntergeladen werden müssen.

Intl.RelativeTimeFormat


Ich habe an der Dokumentation für den zweiten Teil dieses Projekts gearbeitet. Wenn Sie auch teilnehmen möchten, benötigen wir Hilfe bei der Übersetzung ins Russische und der Einhaltung der Standards. RelativeTimeFormat wird benötigt, wenn Sie einen Countdown durchführen müssen.

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

Dies ist jetzt ganz einfach. Sie können die Zeit in zwei Tagen, zwei Wochen, einem Viertel usw. angeben. Bisher gab es eine solche Formatierung im Web nicht.

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 

Hier ist ein Beispiel auf Russisch. Sie können den Betrieb dieses Codes selbst testen, da er sich bereits in Ihrem Browser befindet.

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

Diese Methode ist sehr nĂĽtzlich. Sie kann Zeit in dem oben gezeigten Kurzformat geben. Ich betone, dass Sie fĂĽr all dies keine Bibliotheken von Drittanbietern verwenden mĂĽssen.

Intl.NumberFormat


Das nächste, was ich teilen wollte, ist Intl.NumberFormat . Ich werde über die dritte Stufe sprechen, aber nur die zweite wird in den Beispielen vorgestellt, da einige Änderungen noch diskutiert werden. Intl.NumberFormat arbeitet mit Einheiten und Datensatzformularen. Es lohnt sich, darauf zu achten, was er mit Einheiten macht: Er ermöglicht es Ihnen, mit verschiedenen Stilen zu arbeiten.

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

Alle Einheiten stammen aus UTC 35, und es gibt viele davon. Insgesamt werden hier ca. 140 Formatierungseinheiten vorgestellt. Die Internationalisierung ist jetzt einfacher als je zuvor. Sie mĂĽssen nur Ihre Zeilen ĂĽbersetzen, und die gesamte erforderliche Dynamik ist bereits im Browser enthalten.

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)

Nun zu den Aufnahmeformularen. Um ehrlich zu sein, verwende ich sie nicht zu oft, weil ich nicht die Form der Aufzeichnung mit dem Exponenten (wissenschaftliche Aufzeichnung) verwende und keine groĂźen Zahlen vorlegen muss. Aber wenn Sie es brauchen, gibt es eine entsprechende API speziell fĂĽr Sie.

Intl.ListFormat


Eine weitere nützliche API ist Intl.ListFormat , die sich bereits in der dritten Phase befindet und es Ihnen ermöglicht, Listen auf zwei verschiedene Arten zu formatieren. Angenommen, ich muss den Satz "Ich gehe zu HolyJS" sagen. Wir können eine Liste erstellen, die die Zeilen „Moskau“ und „St. Petersburg “, geben Sie den Parameter„ Konjunktion “an, und die Zeilen werden durch die Vereinigung der russischen Sprache„ und “kombiniert. Dies ist eine völlig neue Funktion und sehr nützlich.



Wenn Sie "Disjunktion" angeben, erhalten wir die Vereinigung "oder".



SchlieĂźlich kann die Funktion automatisch die verwendete Sprache und das verwendete Alphabet bestimmen und die Listenelemente entsprechend sortieren.

Intl.PluralRules


Eine weitere wichtige API ist Intl.PluralRules . Diese API ist die älteste von allen, aber aus irgendeinem Grund wird sie von niemandem verwendet.



Wenn ich die Liste der Finalisten bei Rennen oder im Fußball sehe, werden die Zahlen immer neben den Namen angezeigt: "1", "2", "3" usw. Dies entspricht jedoch nicht der Art und Weise, wie wir sagen, dass es viel näher wäre Schreiben Sie für die Rede „1.“, „2.“, „3.“. Und dafür gibt es spezielle APIs, die nicht so schwer zu bedienen sind.



Zum Beispiel können wir die Sätze "1 Katze", "0 Katzen", "0,5 Katzen", "1,5 Katzen" schreiben, und die API wählt automatisch das richtige Pluralende aus.

Intl.DisplayNames


Dies ist eine der beliebtesten APIs, da wir sehr oft Listen von Ländern anzeigen müssen. Angenommen, wir haben eine Liste von Ländern - zum Beispiel in einer Datenbank oder in JSON. Jedes Mal, wenn Sie die Sprache wechseln, müssen Sie einen separaten JSON mit einer neuen Liste von Ländern, Währungen usw. laden. Es gibt zu viele dieser JSONs und wie endet sie? Wir erstellen einen Microservice, in den eine Datenbank mit verschiedenen Sprachen integriert ist, und extrahieren alle Daten daraus. Natürlich hatten wir im Beispiel mit der Liste der Länder Glück und müssen die Daten nur selten aktualisieren - aber das wird nicht immer so sein, oder? Wir können nicht alle Probleme gleichzeitig lösen, aber DisplayNames löst einige davon. Sie haben die API wie im folgenden Beispiel und können nur eine Liste von Währungen oder nur eine Liste von Ländern anfordern:

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"

Dies ist eine sehr nützliche Sache. Es funktioniert nicht nur mit Ländern und Währungen: Auf die gleiche Weise können Sie mit Monaten, Wochentagen und vielen anderen Dingen arbeiten, die Sie als Entwickler benötigen.

Ergebnisse und Pläne für die Zukunft


Bisher haben wir über vorhandene APIs gesprochen. Kommen wir zu unseren Zukunftsplänen. Meine Muttersprache ist Portugiesisch. Daher muss ich auf meinen Websites mindestens Portugiesisch und Englisch unterstützen. Und da wir ganz in der Nähe von Spanien sind, ist Spanisch auch nützlich. Portugal ist ein sehr kleines Land, und Frankreich ist auch nicht so weit entfernt, daher wäre es schön, Französisch in diese Liste aufzunehmen.

Für uns MessageFormatsehr relevant, und es wird bald erscheinen. Es gibt Bibliotheken und Entwickler, die daran arbeiten. Alle diese Entwickler arbeiten an verwandten Themen. Die meisten Schöpfer der beliebtesten Bibliotheken und die meisten großen Unternehmen (Netflix, Amazon, Facebook) sind sich in mindestens einem Punkt einig: Jetzt besteht ein dringender Internationalisierungsbedarf. Dies wird auch durch zwei Millionen Downloads pro Woche angezeigt. Jetzt können wir es uns leisten, MessageFormat erneut zu schreiben und dies auf qualitativ hochwertige Weise zu tun.

Wer wird von einer angemessenen Internationalisierung profitieren? Das ganze Web: alle Unternehmen, alle Projekte, alle Bibliotheken. Bibliotheken wie Intl.MessageFormatwird nirgendwo verschwinden, sondern auf neue Weise arbeiten. Sie müssen keine Daten herunterladen, da sich alle Daten bereits im Browser befinden. Höchstwahrscheinlich müssen Sie nicht zu einer neuen Bibliothek wechseln. Einige dieser Bibliotheken fungieren bereits für einige Implementierungen als Polyfills. Einige der von mir erwähnten Implementierungen befinden sich in der dritten Phase und sind nicht in allen Browsern implementiert. Bibliotheken wie Intl.MessageFormat bieten jedoch Polyfüllungen für diese Funktionalität. Im Allgemeinen kommt ein neues Kapitel in der Geschichte des Web - eine echte Revolution. Das Web wird für alle zugänglich und verständlich. Das ist extrem wichtig.

Ich glaube, dass es sehr wichtig ist, die Einzigartigkeit unseres Projekts sicherzustellen. Wenn es ein Format gibt, das in C ++, Java und JavaScript verwendet werden kann, warum nicht dieses Format überall verwenden? Wenn wir Webseiten schreiben, müssen wir häufig mobile Versionen davon erstellen. In diesem Fall müssen wir zweimal viel arbeiten. Wenn wir für alles ein Format hätten, könnten wir einfach die vorhandenen Ressourcen und die API verwenden. Wir brauchen eine neue Ebene der Integration mit Werkzeugen. Die Internationalisierung erfolgt nicht nur durch die Arbeit der direkt daran beteiligten Entwickler. Für sie ist Modularität äußerst wichtig, da es oft bequem ist, eigene Formatierungswerkzeuge und eigenen Code zu verwenden. Daher sollten Sie die API nicht schließen, sie müssen geöffnet sein, damit sie eine Verbindung herstellen können, die die jeweilige Situation erfordert.Ein weiterer wichtiger Punkt: Diese APIs müssen nativ sein. CLDRs stellen die Daten bereit, die die Internationalisierungs-API benötigt. Wenn Sie Windows oder MacOS ausführen, laden Sie bereits Daten von der CLDR herunter. CLDR ist ein eindeutiges Repository, niemand dupliziert seine Funktion. Dies bedeutet, dass Daten nur einmal heruntergeladen und dem gesamten Betriebssystem gemeinsam genutzt werden können. Wenn alle Daten für die Intl-API bereits im Betriebssystem geladen sind, können Sie sie dann für die gesamte Software auf diesem System bereitstellen.Wenn alle Daten für die Intl-API bereits im Betriebssystem geladen sind, können Sie sie dann für die gesamte Software auf diesem System bereitstellen.Wenn alle Daten für die Intl-API bereits im Betriebssystem geladen sind, können Sie sie dann für die gesamte Software auf diesem System bereitstellen.

Unsere Erfahrung hat uns gelehrt, uns daran zu erinnern, dass wir nicht allein sind, dass nicht nur Programmierer an der Internationalisierung arbeiten. Wir sind Entwickler, keine Übersetzer. Angenommen, wir müssen einen Zeilenvorschub in unserer Benutzeroberfläche erstellen, und senden ihn an das Übersetzungsunternehmen. Aber Übersetzer haben oft keinen Kontext für diese Zeilen. Dies fehlt auch in MessageFormat . Manchmal führt dies zu Fehlern, wie wir bereits im genannten Beispiel mit dem russischen Krematorium gesehen haben.

Schließlich glaube ich, dass APIs für die Internationalisierung einfach zu verwenden sein sollten und jeder in der Lage sein sollte, Internationalisierung durchzuführen - dies sollte nicht zu viel Zeit und Mühe kosten. Wenn Sie Code für die Internationalisierung schreiben, müssen Sie von Anfang an angeleitet werden. Schließlich schreiben sie mit TDD zuerst einen Test und dann Code. Beginnen wir unsere Webprojekte nach diesem Prinzip mit der richtigen Internationalisierung und Lokalisierung. Auf diese Weise können wir Websites erstellen, die für alle bequem und zugänglich sind.
HolyJS 2020 Piter «Speak my language %app%». , , : . HolyJS 2020 Piter . , .

All Articles