it-swarm.com.de

Best Practice für die Lokalisierung und Globalisierung von Strings und Labels

Ich bin Mitglied eines Teams mit mehr als 20 Entwicklern. Jeder Entwickler arbeitet an einem separaten Modul (etwas in der Nähe von 10 Modulen). In jedem Modul haben wir möglicherweise mindestens 50 CRUD-Formulare, was bedeutet, dass wir derzeit in der Nähe von 500 Schaltflächen hinzufügen, Schaltflächen speichern, Schaltflächen bearbeiten, etc.

Da wir jedoch unsere Anwendung globalisieren möchten, müssen wir in der Lage sein, Texte in unserer Anwendung zu übersetzen. Beispielsweise sollte das Wort add für französische Benutzer überall ajouter werden.

Was wir bis jetzt gemacht haben, ist, dass wir für jede Ansicht in UI oder Presentation Layer ein Wörterbuch mit Schlüssel/Wert-Übersetzungspaaren haben. Beim Rendern der Ansicht übersetzen wir dann die erforderlichen Texte und Zeichenfolgen mithilfe dieses Wörterbuchs. Bei diesem Ansatz haben wir jedoch in 500 Wörterbüchern etwas in der Nähe von 500 add. Dies bedeutet, dass wir gegen DRY Prinzipal verstoßen haben.

Wenn wir dagegen allgemeine Zeichenfolgen wie add an einer Stelle zentralisieren und die Entwickler bitten, sie überall zu verwenden, stellen wir das Problem fest, dass wir nicht sicher sind, ob in der zentralisierten Zeichenfolge bereits eine Zeichenfolge definiert ist Wörterbuch oder nicht.

Eine andere Möglichkeit ist, 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, besteht darin, dass sich einige Entwickler unter dem Druck, das Projekt pünktlich zu liefern, 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 Ne usw. verwendet hat.

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

106
user1968030

Soweit ich weiß, gibt es eine gute Bibliothek mit dem Namen localeplanet für die Lokalisierung und Internationalisierung in JavaScript. Darüber hinaus denke ich, es ist native und hat keine Abhängigkeiten zu anderen Bibliotheken (z. B. jQuery)

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

In diesem Artikel von Mozilla finden Sie auch sehr gute Methoden und Algorithmen für die clientseitige Übersetzung: http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your- javascript-mit-ein-wenig-hilfe-von-json-und-dem-server /

Allen diesen Artikeln/Bibliotheken ist gemeinsam, dass sie ein i18n Klasse und eine get Methode (in gewisser Weise auch die Definition eines kleineren Funktionsnamens wie _) zum Abrufen/Konvertieren von key in value. In meiner Erklärung bedeutet key die zu übersetzende Zeichenfolge und value die übersetzte Zeichenfolge.
Dann brauchen Sie nur noch ein JSON-Dokument, um key und value zu speichern.

Beispielsweise:

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

Und hier der JSON:

{ test: "blah blah" }

Ich halte die Verwendung der gängigen Bibliothekslösungen für einen guten Ansatz.

48

Wenn Sie mit einem zu lösenden Problem konfrontiert sind (und ehrlich gesagt, wer ist das nicht?), Wird die grundlegende Strategie, die wir Computerleute normalerweise verfolgen, als "Teilen und Erobern" bezeichnet.

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

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

  • Stellen Sie sich das spezifische Problem als einen speziellen Fall eines allgemeineren Problems vor.
  • Irgendwie das allgemeine Problem lösen.
  • Passen Sie die Lösung des allgemeinen Problems an das spezifische Problem an.

Eric Lippert

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

Ich habe einige der Hauptaspekte des Problems umrissen

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

    Lösung : Zu diesem Zweck speichern wir die 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-Paarstruktur, um unsere Daten zu speichern

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

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

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

  • Problem: Jedes Mitglied eines Subsystems/Unterordners/Moduls sollte die Mitglieder von Global_Resources in ihrem Bereich überschreiben

    Lösung : Ich habe für jede Datei 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 der Seite geladen werden, die unter Global_Resource ausgewählt wurde. Dies sollte die erste Datei sein, die auf alle 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 :)

43
Omid Shariati

jQuery.i18n ist ein leichtes jQuery-Plugin, mit dem Sie die Internationalisierung Ihrer Webseiten aktivieren können. Sie können benutzerdefinierte Ressourcenzeichenfolgen wie in Java Resource Bundles) in '.properties'-Dateien packen. Sie laden und analysieren Ressourcenpakete (.properties) basierend auf der vom Browser angegebenen Sprache oder Sprache .

um mehr darüber zu erfahren, werfen Sie einen Blick auf Wie internationalisieren Sie Ihre Seiten mit JQuery?

13
BalaKrishnan웃