Meilleures pratiques pour la localisation et la mondialisation des cordes et des étiquettes

Je suis membre d'une équipe avec plus de 20 développeurs. Chaque développeur travaille sur un module distinct (quelque chose près de 10 modules). Dans chaque module, nous pouvons avoir au moins 50 formulaires CRUD, ce qui signifie que nous avons actuellement près de 500 boutons d'ajout, des boutons de sauvegarde , des boutons d'édition , etc.

Cependant, parce que nous voulons globaliser notre application, nous devons être en mesure de traduire des textes dans notre application. Par exemple, partout, le mot add devrait devenir quelque chose pour les utilisateurs français.

Ce que nous avons fait jusqu'ici, c'est que, pour chaque vue dans UI ou Presentation Layer, nous avons un dictionnaire de paires de traductions clés / valeur. Ensuite, lors du rendu de la vue, nous traduisons les textes et les chaînes requis à l'aide de ce dictionnaire. Cependant, cette approche, nous avons eu quelque chose près de 500 ajouter dans 500 dictionnaires. Cela signifie que nous avons violé le principal DRY.

D'autre part, si nous centralisons les chaînes communes, comme la mise en place dans un endroit, et demandons aux développeurs de l'utiliser partout, nous rencontrons le problème de ne pas être sûr si une chaîne est déjà définie dans le dictionnaire centralisé ou non.

Une autre option pourrait être d'avoir un dictionnaire de traduction et d'utiliser des services de traduction en ligne comme Google Translate, Bing Translator, etc.

Un autre problème que nous avons rencontré est que certains développeurs sous le stress de la livraison du projet à temps ne peuvent pas se souvenir des clés de traduction . Par exemple, pour le texte du bouton add, un développeur a utilisé add pendant qu'un autre développeur a utilisé de nouveaux , etc.

Quelle est la meilleure pratique ou la méthode la plus connue pour la mondialisation et la localisation des ressources de chaîne d'une application?

Pour autant que je sache, il existe une bonne bibliothèque appelée localeplanet pour la localisation et l'internationalisation en JavaScript. En outre, je pense qu'il est natif et n'a pas de dépendances avec d'autres bibliothèques (p. Ex. JQuery)

Voici le site de la bibliothèque: http://www.localeplanet.com/

Regardez également cet article par Mozilla, vous pouvez trouver une très bonne méthode et des algorithmes pour la traduction côté client: http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with- A-little-help-from-json-and-the-server /

La partie commune de tous ces articles / bibliothèques est qu'ils utilisent une classe i18n et une méthode get (en définissant également un nom de fonction plus petit comme _ ) pour récupérer / convertir la key sur la value . Dans mon explication, la key signifie que la chaîne que vous voulez traduire et la value signifie chaîne traduite.
Ensuite, vous avez juste besoin d'un document JSON pour stocker les key et les value .

Par exemple:

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

Et ici, le JSON:

 { test: "blah blah" } 

Je crois que l'utilisation des solutions de bibliothèques populaires actuelles est une bonne approche.

Lorsque vous êtes confronté à un problème à résoudre (et franchement, qui n'est-il pas aujourd'hui?), La stratégie de base habituellement utilisée par les gens de l'ordinateur s'appelle "diviser et conquérir". Cela se passe ainsi:

  • Concevoir le problème spécifique en tant que sous-problèmes plus petits.
  • Résolvez chaque problème plus petit.
  • Combinez les résultats en une solution du problème spécifique.

Mais «diviser et conquérir» n'est pas la seule stratégie possible. Nous pouvons également adopter une approche plus généraliste:

  • Concevoir le problème spécifique en cas particulier d'un problème plus général.
  • D'une manière ou d'une autre, résoudre le problème général.
  • Adapter la solution du problème général au problème spécifique.

Eric Lippert

Je crois que de nombreuses solutions existent déjà pour ce problème dans les langues côté serveur telles que ASP.Net/C#.

J'ai décrit quelques-uns des principaux aspects du problème

  • Problème : Nous devons charger les données uniquement pour la langue souhaitée

    Solution : Pour cela, nous sauvegardons les données dans un fichier séparé pour chaque langue.

ex. Res.de.js, res.fr.js, res.en.js, res.js (pour la langue par défaut)

  • Problème: les fichiers de ressources pour chaque page doivent être séparés afin que nous obtenions uniquement les données dont nous avons besoin

    Solution : Nous pouvons utiliser certains outils qui existent déjà comme https://github.com/rgrove/lazyload

  • Problème: Nous avons besoin d'une structure de paire clé / valeur pour sauvegarder nos données

    Solution : je suggère un objet javascript au lieu de chaîne / chaîne d'air. Nous pouvons bénéficier de l'Intellisense d'un IDE

  • Problème: les membres généraux doivent être stockés dans un fichier public et toutes les pages doivent y accéder

    Solution : À cet effet, je crée un dossier dans la racine de l'application Web appelée Global_Resources et un dossier pour stocker un fichier global pour chaque sous-répertoire, nous l'avons nommé 'Local_Resources'

  • Problème: chaque membre des sous-systèmes / sous-dossiers / modules doit remplacer les membres Global_Resources sur leur portée

    Solution : j'ai considéré un fichier pour chacun

Structure de l'application

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

Le code correspondant pour les fichiers:

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" }; 

Le fichier de ressource pour la langue souhaitée doit être chargé sur la page sélectionnée parmi Global_Resource – Ce doit être le premier fichier chargé sur toutes les pages.

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"; 

Fichier manager.js (ce fichier devrait être chargé en dernier)

 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"); 

J'espère que cela aide 🙂

JQuery.i18n est un plugin jQuery léger pour permettre l'internationalisation dans vos pages Web. Il vous permet d'emballer des chaînes de ressource personnalisées dans les fichiers '.properties', tout comme dans Java Resource Bundles. Il charge et analyse les faisceaux de ressources (.properties) en fonction de la langue ou de la langue fournie par le navigateur.

Pour en savoir plus, regardez la façon d'internationaliser vos pages en utilisant JQuery?