Reden wir über die Internationalisierung (i18n) für Angular (nicht AngularJS, nicht Angular 2, nur Angular 😉).
Wenn es um die JavaScript-Lokalisierung geht, ist eines der beliebtesten Frameworks i18next. Eine der bekanntesten Angular-Erweiterungen für i18next ist angular-i18next.
Es wurde bereits im April 2017 von Sergey Romanchuk erstellt.
i18next wurde Ende 2011 erstellt. Es ist älter als die meisten Bibliotheken, die Sie heutzutage verwenden, einschliesslich Ihrer wichtigsten Frontend-Technologie (React, Angular, Vue, ...). ➡️ nachhaltig
Basierend darauf, wie lange i18next bereits Open Source verfügbar ist, gibt es keinen echten i18n-Fall, der nicht mit i18next gelöst werden könnte. ➡️ reif
i18next kann in jeder Umgebung mit Javascript (und einigen Nicht-Javascript - .net, elm, iOS, Android, Ruby, ...) verwendet werden, mit jedem UI-Framework, mit jedem i18n-Format, ... die Möglichkeiten sind endlos. ➡️ erweiterbar
Es gibt viele Funktionen und Möglichkeiten, die Sie mit i18next im Vergleich zu anderen regulären 18n-Frameworks erhalten. ➡️ reich
Hier finden Sie weitere Informationen darüber, warum i18next so besonders ist und wie es funktioniert.
Fangen wir an...
Voraussetzungen
Stellen Sie sicher, dass Sie Node.js und npm installiert haben. Wenn Sie etwas Erfahrung mit einfachem HTML, JavaScript und grundlegendem Angular haben, ist es am besten, bevor Sie zu angular-i18next springen.
Einstieg
Nehmen Sie Ihr eigenes Angular-Projekt oder erstellen Sie ein neues, z. B. mit der Angular-Cli.
npx @angular/cli new my-app
Entfernen wir der Einfachheit halber den "generierten" Inhalt der Angular-Cli:
Wir werden die App anpassen, um die Sprache gemäss den Vorlieben des Benutzers zu erkennen.
Und wir werden einen Sprachumschalter erstellen, um den Inhalt zwischen verschiedenen Sprachen zu ändern.
Lassen Sie uns einige i18next-Abhängigkeiten installieren:
const i18nextOptions = { debug: true, fallbackLng: 'en', resources: { en: { translation: { "welcome": "Welcome to Your Angular App", "descr": "For a guide and recipes on how to configure / customize this project, check out {{-url}}." } }, de: { translation: { "welcome": "Willkommen zu Deiner Vue.js App", "descr": "Eine Anleitung und Rezepte für das Konfigurieren / Anpassen dieses Projekts findest du in {{-url}}." } } }, interpolation: { format: I18NextModule.interpolationFormat(defaultInterpolationFormat) } };
Funktioniert es? - Na sicher!
Und dank des Sprach-Detektors können Sie auch versuchen, die Sprache mit dem Abfrageparameter ?lng=de umzuschalten:
Sprachumschalter
Wir wollen gerne die Möglichkeit anbieten, die Sprache über eine Art Sprachumschalter zu ändern.
Fügen wir also einen Fusszeilenabschnitt in unserer Datei app.component.html hinzu:
🥳 Grossartig, Sie haben gerade Ihren ersten Sprachumschalter erstellt!
Dank i18next-browser-languageDetector versucht es jetzt, die Browsersprache zu erkennen und diese Sprache automatisch zu verwenden, wenn Sie die Übersetzungen dafür bereitgestellt haben. Die manuell ausgewählte Sprache im Sprachumschalter wird im localStorage beibehalten, beim nächsten Besuch der Seite wird diese Sprache als bevorzugte Sprache verwendet.
Übersetzungen vom Code trennen
Die Übersetzungen in unserer Datei i18n.js zu haben, funktioniert, ist aber für Übersetzer nicht so geeignet, damit zu arbeiten.
Lassen Sie uns die Übersetzungen vom Code trennen und sie in dedizierte JSON-Dateien einfügen.
Passen Sie die Datei app.modules.ts an, um das i18next-locize-backend zu verwenden, und stellen Sie sicher, dass Sie die Projekt-ID aus Ihrem Locize-Projekt kopieren:
Die App sieht immer noch gleich aus, aber die Übersetzungen sind jetzt komplett von der App getrennt und können separat verwaltet und freigegeben werden.
save missing translations
fehlende Übersetzungen speichern
Dank der Verwendung der saveMissing-Funktion werden während der Entwicklung der App neue Schlüssel automatisch zu locize hinzugefügt.
Übergeben Sie einfach saveMissing: true in den i18next-Optionen und stellen Sie sicher, dass Sie den API-Schlüssel aus Ihrem Locize-Projekt kopieren:
1 2 3 4 5 6 7 8 9 10 11 12
const i18nextOptions = { debug: true, saveMissing: true, // do not use the saveMissing functionality in production: https://docs.locize.com/guides-tips-and-tricks/going-production fallbackLng: 'en', backend: { projectId: 'my-locize-project-id', apiKey: 'my-api-key'// used for handleMissing functionality, do not add your api-key in a production build }, interpolation: { format: I18NextModule.interpolationFormat(defaultInterpolationFormat) } };
Jedes Mal, wenn Sie einen neuen Schlüssel verwenden, wird dieser zu locize gesendet, d. h.:
1
<p>{{ 'cool' | i18next: { defaultValue: 'This is very cool!' } }}</p>
Schliesslch werden mit Hilfe des Arbeitsablaufs für automatische maschinelle Übersetzung nicht nur neue Schlüssel in locize hinzugefügt, während die App entwickelt wird, sondern werden auch automatisch per maschineller Übersetzung in die Zielsprachen übersetzt:
const locizeOptions = { projectId: 'my-locize-project-id', apiKey: 'my-api-key'// used for handleMissing functionality, do not add your api-key in a production buildyour };
const i18nextOptions = { debug: true, fallbackLng: 'en', saveMissing: true, // do not use the saveMissing functionality in production: https://docs.locize.com/guides-tips-and-tricks/going-production backend: locizeOptions, locizeLastUsed: locizeOptions, interpolation: { format: I18NextModule.interpolationFormat(defaultInterpolationFormat) } };
exportfunctionappInit(i18next: ITranslationService) { return() => { let promise: Promise<I18NextLoadResult> = i18next // locize-lastused // sets a timestamp of last access on every translation segment on locize // -> safely remove the ones not being touched for weeks/months // https://github.com/locize/locize-lastused // do not use the lastused functionality in production: https://docs.locize.com/guides-tips-and-tricks/going-production .use(LastUsed) // locize-editor // InContext Editor of locize .use(locizePlugin) // i18next-locize-backend // loads translations from your project, saves new keys to it (saveMissing: true) // https://github.com/locize/i18next-locize-backend .use(LocizeApi) .use<any>(LanguageDetector) .init(i18nextOptions); return promise; }; }