2010-12-14 78 views
1

Je suis à la recherche d'une solution élégante pour le problème suivant:GWT - internationalisation des propriétés des entités

Dans ma base de données, j'ai des entités prédéfinies (!). Ces entités ont des noms et des descriptions (Strings). Autour de la couche d'accès aux données, il existe des EJB contenant une logique métier pour charger/rechercher/etc. ces entités.

Maintenant, pour le frontend, nous développons une application GWT qui appelle les méthodes EJB sur notre backend. Le problème est que le nom et les descriptions des entités mentionnées ci-dessus doivent être internationalisés - par exemple, en fonction des paramètres régionaux de l'utilisateur, la description d'une entité doit être "My cool description" (anglais) ou "Beschreibung bla" (Allemand) ou autre :)

Ma première approche consistait à utiliser une chaîne de ressources dans la base de données. Donc l'entité A a une description "descriptionA", l'entité B a une description "descriptionB" ... Plus tard, l'application GWT (ou tout autre client) traduit cette chaîne de ressource dans la description réelle en utilisant une sorte de "bundle de ressources". Exemples:

* resources_en.properties *:

DescriptionUn = Description effective de l'entité A

descriptionB = Description effective de l'entité B

* resources_de.properties *:

DescriptionUn = Beschreibung A

descriptionB = Beschreibung B

(Rappelez-vous que les entités sont prédéfinies, il est donc possible de "connaître" toutes les descriptions au moment de la compilation. MAIS il serait préférable que le regroupement de ressources puisse être amélioré sans avoir à recompiler l'application).

Est-ce possible avec GWT? Comment puis-je faire ceci? Est-il préférable de "traduire" sur le serveur ou sur le côté client? Sinon, je dois faire face à toutes ces choses i18n sur le côté backend. Eh bien, cela permettrait de conserver les données ensemble (au lieu de définir les descriptions du côté client). Mais le gros inconvénient est que le backend doit être conscient de la localisation de l'appelant.

Cordialement, Frank

Répondre

0

Il est principalement une décision entre le temps de téléchargement/vitesse vs flexibilité. Si vous le compilez, GWT met en ligne les messages et peut générer un code un peu plus rapide, car aucune recherche de chaîne ne doit être effectuée. Cependant, si vous devez apporter des modifications et que vous ne souhaitez pas recompiler ou que vous souhaitez autoriser les utilisateurs à modifier les messages de façon dynamique, vous avez besoin de messages dynamiques.

En ce qui concerne ce dernier cas, la classe Dictionary peut vous aider, vous pouvez aussi consulter: http://code.google.com/webtoolkit/doc/latest/DevGuideI18n.html#DevGuideDynamicStringInternationalization avec le dictionnaire que vous générez tous les messages dans la page statique envoyé à l'utilisateur. Les paramètres régionaux des utilisateurs peuvent être trouvés dans l'en-tête Accept-Language, qui est envoyé par le navigateur lorsqu'une page est demandée.

Dans les deux cas (compilé ou dynamique), vous pouvez utiliser les paramètres régionaux définis par l'utilisateur dans certaines propriétés de configuration et, dans ce cas, vous avez besoin de logique pour les deux cas.

0

Tout est possible pour ceux qui tentent ...

Retour à votre question: il y a plusieurs façons de résoudre votre problème. L'un serait d'introduire une sorte de façade i18n et de traiter vos descriptions et noms comme des clés de ressources. Vous pouvez ensuite définir des méthodes de commodité pour accéder aux traductions, c'est-à-dire public String translate(String message, Locale locale);. Cette méthode peut utiliser la classe Java ResourceBundle standard pour accéder aux ressources lors de l'exécution.

Le seul vrai problème que je vois est de savoir comment traiter les messages composés (c'est-à-dire "Blah, blah 4 items" où 4 est un espace réservé). Eh bien, ce que nous avons fait dans un projet dans une situation similaire, nous avons ajouté un délimiteur et une clé de ressource réelle puis un autre délimiteur et compte: "Blah, blah 4 items ## items.in.your.whatever ## 4". Dans le cas de l'anglais, vous pouvez simplement couper la première partie et pour les autres langues, vous devrez traiter toute la chaîne.