Best Practice für die Lokalisierung und Globalisierung von Zeichenfolgen und Labels [geschlossen]


124

Ich bin Mitglied eines Teams mit mehr als 20 Entwicklern. Jeder Entwickler arbeitet an einem separaten Modul (ungefähr 10 Module). In jedem Modul haben wir möglicherweise mindestens 50 CRUD-Formulare, was bedeutet, dass wir derzeit fast 500 Schaltflächen zum Hinzufügen , Speichern von Schaltflächen , Bearbeiten von Schaltflächen usw. haben.

Da wir unsere Anwendung jedoch globalisieren möchten, müssen wir in der Lage sein, Texte in unserer Anwendung zu übersetzen. Zum Beispiel, überall, das Wort Add sollte sich ajouter für Französisch - Nutzer.

Was wir bisher getan haben, ist, dass wir für jede Ansicht in der Benutzeroberfläche oder in der Präsentationsebene ein Wörterbuch mit Schlüssel / Wert-Übersetzungspaaren haben. Während des Renderns der Ansicht übersetzen wir die erforderlichen Texte und Zeichenfolgen mit diesem Wörterbuch. Bei diesem Ansatz haben wir jedoch 500 Wörterbücher in der Nähe von 500 hinzugefügt . Dies bedeutet, dass wir gegen das DRY-Prinzip verstoßen haben.

Wenn wir andererseits allgemeine Zeichenfolgen zentralisieren, z. B. Add an einer Stelle platzieren, und Entwickler bitten, sie überall zu verwenden, tritt das Problem auf, nicht sicher zu sein, ob eine Zeichenfolge bereits im zentralisierten Wörterbuch definiert ist oder nicht.

Eine andere Möglichkeit besteht darin, kein Übersetzungswörterbuch zu haben und Online-Übersetzungsdienste wie Google Translate, Bing Translator usw. zu verwenden.

Ein weiteres Problem, auf das wir gestoßen sind, ist, dass einige Entwickler, die unter dem Stress stehen, das Projekt pünktlich zu liefern, sich nicht an die Übersetzungsschlüssel erinnern können . Für den Text der Schaltfläche "Hinzufügen" hat beispielsweise ein Entwickler " Hinzufügen" verwendet , während ein anderer Entwickler " Neu" usw. verwendet hat.

Was ist die beste Vorgehensweise oder bekannteste Methode zur Globalisierung und Lokalisierung von Zeichenfolgenressourcen einer Anwendung?


2
Der Vortrag von Alex Sexton zum Thema Client Side Internationalization von der JS EU-Konferenz ist ein guter Anfang.
Minko Gechev

Antworten:


51

Soweit ich weiß, gibt es eine gute Bibliothek localeplanetfür Lokalisierung und Internationalisierung in JavaScript. Darüber hinaus denke ich, dass es nativ ist und keine Abhängigkeiten zu anderen Bibliotheken (z. B. jQuery) hat.

Hier ist die Website der Bibliothek: http://www.localeplanet.com/

Schauen Sie sich auch diesen Artikel von Mozilla an. Dort finden Sie sehr gute Methoden und Algorithmen für die clientseitige Übersetzung: http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with- ein wenig Hilfe von json und dem Server /

Allen diesen Artikeln / Bibliotheken ist gemeinsam, dass sie eine i18nKlasse und eine getMethode (in gewisser Weise auch einen kleineren Funktionsnamen wie _) definieren, um die keyin die zu rufen / zu konvertieren value. In meiner Erklärung der keyMittel, die Sie übersetzen möchten, und der valueMittel, die die Zeichenfolge übersetzt hat.
Dann benötigen Sie nur noch ein JSON-Dokument zum Speichern von key's und value' s.

Beispielsweise:

var _ = document.webL10n.get;
alert(_('test'));

Und hier der JSON:

{ test: "blah blah" }

Ich glaube, dass die Verwendung aktueller gängiger Bibliothekslösungen ein guter Ansatz ist.


1
Nichts für ungut, aber hat Afshin das nicht schon versucht? Sein Problem ist, dass verschiedene Entwickler Schwierigkeiten haben, sich zu merken, welche Schlüssel sie verwenden sollen. Ich bin damit einverstanden, dass Ihre beschriebene Methode der richtige Weg ist. Ich sehe nicht, wie es anders sein kann. Danke übrigens für die tollen Links.
Spock

47

Wenn Sie vor einem zu lösenden Problem stehen (und ehrlich gesagt, wer ist das heutzutage nicht?), Heißt die grundlegende Strategie, die wir Computer-Leute normalerweise verfolgen, „Teilen und Erobern“. Es geht so:

  • Stellen Sie sich das spezifische Problem als eine Reihe kleinerer Unterprobleme vor.
  • Lösen Sie jedes kleinere Problem.
  • Kombinieren Sie die Ergebnisse zu einer Lösung des spezifischen Problems.

Aber „Teilen und Erobern“ ist nicht die einzig mögliche Strategie. Wir können auch einen allgemeineren Ansatz verfolgen:

  • Stellen Sie sich das spezifische Problem als Sonderfall eines allgemeineren Problems vor.
  • Löse irgendwie das allgemeine Problem.
  • Passen Sie die Lösung des allgemeinen Problems an das spezifische Problem an.

- Eric Lippert

Ich glaube, dass es in serverseitigen Sprachen wie ASP.Net/C# bereits viele Lösungen für dieses Problem gibt.

Ich habe einige der Hauptaspekte des Problems skizziert

  • Problem : Wir müssen nur Daten für die gewünschte Sprache laden

    Lösung : Zu diesem Zweck speichern wir Daten für jede Sprache in separaten Dateien

Ex. res.de.js, res.fr.js, res.en.js, res.js (für Standardsprache)

  • Problem: Ressourcendateien für jede Seite sollten getrennt werden, damit wir nur die Daten erhalten, die wir benötigen

    Lösung : Wir können einige bereits vorhandene Tools wie https://github.com/rgrove/lazyload verwenden

  • Problem: Wir benötigen eine Schlüssel / Wert-Paar-Struktur, um unsere Daten zu speichern

    Lösung : Ich schlage ein Javascript-Objekt anstelle von String / String Air vor. Wir können von der Intelligenz einer IDE profitieren

  • Problem: Allgemeine Mitglieder sollten in einer öffentlichen Datei gespeichert sein und alle Seiten sollten darauf zugreifen

    Lösung : Zu diesem Zweck erstelle ich einen Ordner im Stammverzeichnis der Webanwendung mit dem Namen Global_Resources und einen Ordner zum Speichern der globalen Datei für jeden Unterordner, den wir als "Local_Resources" bezeichnet haben.

  • Problem: Jedes Mitglied von Subsystemen / Unterordnern / Modulen sollte die Global_Resources-Mitglieder in ihrem Bereich überschreiben

    Lösung : Ich habe für jede eine Datei in Betracht gezogen

Anwendungsstruktur

root/
    Global_Resources/
        default.js
        default.fr.js
    UserManagementSystem/
        Local_Resources/
            default.js
            default.fr.js
            createUser.js
        Login.htm
        CreateUser.htm

Der entsprechende Code für die Dateien:

Global_Resources / default.js

var res = {
    Create : "Create",
    Update : "Save Changes",
    Delete : "Delete"
};

Global_Resources / default.fr.js

var res = {
    Create : "créer",
    Update : "Enregistrer les modifications",
    Delete : "effacer"
};

Die Ressourcendatei für die gewünschte Sprache sollte auf die unter Global_Resource ausgewählte Seite geladen werden. Dies sollte die erste Datei sein, die auf allen Seiten geladen wird.

UserManagementSystem / Local_Resources / default.js

res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";

UserManagementSystem / Local_Resources / default.fr.js

res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";

UserManagementSystem / Local_Resources / createUser.js

// Override res.Create on Global_Resources/default.js
res.Create = "Create User"; 

UserManagementSystem / Local_Resources / createUser.fr.js

// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";

manager.js Datei (diese Datei sollte zuletzt geladen werden)

res.lang = "fr";

var globalResourcePath = "Global_Resources";
var resourceFiles = [];

var currentFile = globalResourcePath + "\\default" + res.lang + ".js" ;

if(!IsFileExist(currentFile))
    currentFile = globalResourcePath + "\\default.js" ;
if(!IsFileExist(currentFile)) throw new Exception("File Not Found");

resourceFiles.push(currentFile);

// Push parent folder on folder into folder
foreach(var folder in parent folder of current page)
{
    currentFile = folder + "\\Local_Resource\\default." + res.lang + ".js";

    if(!IsExist(currentFile))
        currentFile = folder + "\\Local_Resource\\default.js";
    if(!IsExist(currentFile)) throw new Exception("File Not Found");

    resourceFiles.push(currentFile);
}

for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); }

// Get current page name
var pageNameWithoutExtension = "SomePage";

currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ;

if(!IsExist(currentFile))
    currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ;
if(!IsExist(currentFile)) throw new Exception("File Not Found");

Ich hoffe es hilft :)


7
Das einzige, was mir an diesem Ansatz nicht gefällt, ist, dass Lokalisierung und Entwicklung eng miteinander verbunden sind. Wenn also eine englische Zeichenfolge (unabhängig von der Standardeinstellung) hinzugefügt wird, müssen die restlichen Sprachen über den Code aktualisiert werden. Ich möchte JSON lieber mit einem Tool aus einer Art Übersetzungsdatei erstellen lassen. Immer noch eine gute Darstellung!
Nate-Wilkins

Wenn Sie auf die gleiche Weise wie bei der Lokalisierung vorgegangen sind , können Sie dies in dieser Abfrage sehen: stackoverflow.com/q/53864279/4061006 . Die einzige Sache ist, wie Sie Global_Resources / default.js in Global_Resources / default.fr.js übersetzen? Mit welchem ​​Tool / Kit konvertieren Sie diese Dateien in die gewünschten Sprachen? Da brauche ich das auch
Jayavel

Sie sollten neben jedem Schlüssel einen für Menschen lesbaren Kommentar speichern, der beschreibt, wohin die Zeichenfolge geht und was sie bedeutet, damit Sie dem Übersetzer (oder sich selbst) mehr Kontext bieten können, wenn Sie eine neue Sprache hinzufügen und einige vergessen haben der Saiten bedeuten. Machen Sie so etwas wie zum Beispiel "Create" : {"message": "Create", "description": "text on the button that opens the editor with a blank Foo"}zum Lokalisieren von Chrome-Erweiterungen . Oder erstellen Sie eine separate Datei mit diesen Kommentaren.
Boris

13

jQuery.i18n ist ein leichtes jQuery-Plugin, mit dem Sie die Internationalisierung Ihrer Webseiten ermöglichen können. Sie können benutzerdefinierte Ressourcenzeichenfolgen in ".properties" -Dateien packen, genau wie in Java-Ressourcenpaketen. Es lädt und analysiert Ressourcenpakete (.properties) basierend auf der angegebenen Sprache oder der vom Browser gemeldeten Sprache.

Weitere Informationen hierzu finden Sie unter So internationalisieren Sie Ihre Seiten mit JQuery?


Der Link ist weg
Alexander Farber
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.