IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

I18n - discussion sur des choix à faire


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut I18n - discussion sur des choix à faire
    Bonjour,
    Au niveau du dev, je travaille sur un projet Java actuellement. J'utilise les ResourceBundle pour la partie internationalisation. A ce niveau là pas de souci.

    Cependant, je me pose quelques questions existentielles
    - Vaut-il mieux traduire toute l'application au chargement de celle-ci et une fois pour toute (la langue ne changera jamais de manière dynamique) ou alors juste à chaque fois que je construits un objet. Vu de loin et sans avoir trop creusé, je dirai que la première solution semble être la plus coûteuse au démarrage mais fera moins d'appel à la ressource. L'avantage de la première solution c'est qu'on n'internationalise que ce dont a besoin ... mais on le fait souvent et surtout on risque de le faire plusieurs fois.
    - Si la bonne solution est l'internationalisation de toutes les chaînes une fois pour toute et au démarrage, est-ce un erreur de déclarer en static toutes mes chaînes internationalisées ? L'avantage est bien sur que la traduction est faite une fois pour toute au démarrage sans avoir à mettre en place de mécanisme compliqué. Les deux questions sont bien évidement très fortement liées.

    J'ai pas forcément des besoins de perfs exceptionnels dans mon cas précis, mais c'est plus pour ma culture... Car pour le moment, dans mon projet, quand une fenêtre est crée je l'internationalise. Je la ferme et je la ré-ouvre et je la ré-internationalise ... je trouve ça dommage .. et je me dis que sur le long terme ça peut-être coûteux. Le risque du static, c'est que dans un environnement multithreadé c'est que j'imposerai la langue à tout le monde Donc j'exclus ce cas là.

    Ou alors je me fais des films et c'est vraiment pas coûteux d'internationaliser à chaque fois que je fais une action et suivant les actions plusieurs fois les mêmes choses.


    Autre question, moins importante.... dans le cas d'un gros projet je précise.
    - Vaut-il mieux un très gros fichiers de ressource qui englobe toutes les traductions de l'appli, ou alors plusieurs fichiers si c'est possible (parties de l'application très différentes)

  2. #2
    Membre extrêmement actif
    Profil pro
    Développeur Java Indépendant
    Inscrit en
    Mai 2007
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java Indépendant

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 333
    Par défaut
    Moi ce que je ferrais, je mettre toutes les chaines en français dans un fichier.property.

    Tu créer donc un fichier .property par langue, et tu le choisis au démarrage. Ensuite, chaque éléments viendra chercher les chaines de caractère à leur instanciation dans le fichier choisis.

    Je crois qu'en struts c'est comme ça que ça marche.
    A +

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Petite question avant de commencer : il s'agit d'une application desktop ou d'une application web ?



    Perso j'aurais plutôt tendance à utiliser le ResourceBundle à chaque fois que j'en ai besoin plutôt que de remplir une multitude de champs static. C'est long et fastidieux mais surtout cela n'apporte pas grand chose : je ne pense pas que l'accès à un ResourceBundle entraine des problèmes de performances...


    Quand à découper les fichiers en plusieurs cela peut être une éventualité, en particulier si ton application est découpé en plusieurs section bien différente. Tu pourrais avoir un fichier commum + 1 fichier par "section".


    a++

    PS : zag-yoshi, c'est ce que fait les ResourceBundle

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut
    Petite question avant de commencer : il s'agit d'une application desktop ou d'une application web ?
    Alors dans mon cas actuel, il s'agit d'une application desktop. Mais c'est plus de la réflexion générale sur des choix à adopter pour de l'internationalisation pas coûteuse. Qu'elles seraient les différences entre les deux types d'appli dans ce cas là? Je ne vois pas de différence mais c'est sûrement parce que je n'ai pas suffisamment de recul vis-à-vis des applis web. .

    Quand à découper les fichiers en plusieurs cela peut être une éventualité, en particulier si ton application est découpé en plusieurs section bien différente. Tu pourrais avoir un fichier commum + 1 fichier par "section".
    c'était la philo qui avait été adoptée sur un précédent projet sur lequel j'avais travaillé... j'avais trouvé le principe pas mal mais je ne l'ai pas retrouvé systématiquement donc je voulais savoir si c'était un bon choix.
    On avait une appli serveur et des applis clientes. Chacune des applis avaient leur dicos + une partie commune pour certains points qui étaient identiques.

    Bon ok, je me suis peut-être fait une frayeur pour rien.... je sais pas, ça m'a pris comme ça ce matin en regardant le code et me rendant compte que très souvent les mêmes clés étaient traduites plusieurs fois.
    Je n'ai pas remarqué des pbs de perfs de mon côté, c'est juste que je me pose des questions pour mes futurs projets

    @zag-yoshi : ouais effectivement, les RessourcesBundle font déjà ça et c'est ce que je fais. En fait côté implémentation j'ai pas de pbs, ce sont plus des questions de conception que je me pose pour voir si en réfléchissant mieux au départ j'aurais pu faire mieux.

    J'attends quand même d'autres avis

    merci à vous deux pour le moment.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kisame Voir le message
    Qu'elles seraient les différences entre les deux types d'appli dans ce cas là? Je ne vois pas de différence mais c'est sûrement parce que je n'ai pas suffisamment de recul vis-à-vis des applis web.
    Dans une appli web la langue dépend du client et peut donc varier d'une requête à l'autre. Il est donc préférable de laisser le Resourcebundle s'en charger

    Citation Envoyé par kisame Voir le message
    Je n'ai pas remarqué des pbs de perfs de mon côté, c'est juste que je me pose des questions pour mes futurs projets
    Ben en fait la solution du static alourdirait surtout le développement.
    Sans compter que les EDIs savent très bien gérer les ResourceBundle et ont généralement une fonction "externalize string" qui fait tout cela automatiquement (et qui permet d'éviter d'en oublier )

    a++

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut
    ok pour la remarque sur les applis web.

    --

    Je connaissais cette fonctionnalité mais il y a un truc que j'avais trouvé moyen top quand même.

    si j'ai une chaîne construite de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String toto = "le résultat de cette opération vaut " + variable + " patates"
    L'externaliseur crée deux clés. Une pour le résultat de cette opération vaut et une pour patates.
    donc je me retrouve avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String toto = Messages.getString("clé1") + variable + Messages.getString("clé2").
    et provoque donc la création de deux entrée dans message properties
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    clé1=le résultat de cette opération vaut
    cle2= patates
    J'aurais préféré que ça me génère un truc dans le genre :
    Object[] params= new Object[1];
    params[0]=variable;
    String toto = Messages.getString("cle1",params)
    Avec une fonction getString adaptée. Ainsi je n'aurai plus qu'une clé dans mon fichier de ressource :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cle1=le résultat de cette opération vaut {0} patates
    Au delà du fait qu'il y a moins de clé, car je ne suis pas avare à ce point, je trouve plus normal de proposer une mécanisme pour traduire une telle chaîne en une fois, plutôt que de se créer 2 mots.

    bon après libre à moi d'adapter le code généré pour ces cas là. C'était juste pour faire une parenthèse sur la fonctionnalité d'externalisation d'eclipse.
    -----

    Si ça se trouve, le truc est faisable via l'interface mais j'ai rien trouvé....

    en tout cas merci pour les remarques

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Concernant les performances, je trouve que les ResourceBundle çà marche très bien, il n'y a vraiment pas de soucis à les utiliser et çà peut vraiment simplifier le développement.

    Après, sur la manière de faire, je te conseillerais d'utiliser plutôt des outils tel que gettext de GNU. C'est ce que j'utilise sur plusieurs applis, et c'est vraiment très pratique. Ca gère par exemple le cas du {0}, mais surtout çà simplifie la prise en compte de l'i18n dans le code, et aussi le travail des traducteurs.

    J'ai mis çà en place sur ce projet et sur celui-ci.
    Si tu veux plus d'infos, n'hésite pas.

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Tu peux très bien utiliser des {0} avec des ResourceBundle même si eclipse ne le gère pas directement.

    Il suffit de rajouter cette méthode dans la classe Messages qu'il te génère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public static String format(String key, Object...args) {
    		return MessageFormat.format(getString(key), args);
    	}
    Et avec la clef suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clef=le r\u00E9sultat de cette op\u00E9ration vaut {0} patates
    Tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String toto = Messages.format("clef", variable);
    Plus d'info : http://javasearch.developpez.com/j2s...ageFormat.html



    Tu peux même utiliser une syntaxe à la printf() en utilisant String.format() à la place de MessageFormat.format() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public static String format(String key, Object...args) {
    		return String.format(getString(key), args);
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clef=le r\u00E9sultat de cette op\u00E9ration vaut %0$d patates
    Plus d'info : http://javasearch.developpez.com/j2s...Formatter.html


    a++

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 909
    Billets dans le blog
    54
    Par défaut
    Tant qu'a faire autant utilise {0, number, integer} ca le fera mieux sur les grands nombres.

    A noter que j'ai deja vu certaines applications C/C++ (certains jeux nottament) qui geraient des informations de genre et de nombre pour se faire de veritable dicos en utilisant des mecanismes similaires aux bundles Java.

    Citation Envoyé par en
    POTATO.SINGULAR=potato
    POTATO.SINGULAR.GENDER=N
    POTATO.PLURAL=potatoes
    POTATO.PLURAL.GENDER=N
    Citation Envoyé par fr
    POTATO.SINGULAR=patate
    POTATO.SINGULAR.GENDER=F
    POTATO.PLURAL=patates
    POTATO.PLURAL.GENDER=F
    Ce qui permet de gerer les messages complexes un peu plus efficacement dans les langues utilisants plus de declinaisons que l'anglais et le francais.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Firefox 3 le fait, d'ailleurs, d'une manière remarquable, sachant qu'il gère les différents pluriels du russe.

    Ref: (en) http://ed.agadak.net/2007/12/one-pot...ee-potato-four

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 151
    Par défaut
    bon après libre à moi d'adapter le code généré pour ces cas là. C'était juste pour faire une parenthèse sur la fonctionnalité d'externalisation d'eclipse.
    Le fait de rajouter une fonction et de modifier les clés générés c'est grosso modo ce que j'ai voulu dire par cette phrase. J'aurais du être plus précis.

    La fonction que tu proposes adibuga je l'avais déjà faite. C'étit juste pour savoir si l'outil le faisait tout seul ou si j'avais à le faire.


    Tu peux même utiliser une syntaxe à la printf() en utilisant String.format() à la place de MessageFormat.format() :
    ça par contre, j'y avais pas pensé.

    Merci pour les infos d'implémentation

    Je pense avoir eu les réponses que je cherchais concernant la partie internationalisation et si ça valait le coup de revoir la manière de faire pour avoir un gain de perf... mais j'en conclue que ces gains seraient :
    - pas garantis
    - lourds ou moche à mettre en oeuvre

    Merci tout le monde.

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kisame Voir le message
    Le fait de rajouter une fonction et de modifier les clés générés c'est grosso modo ce que j'ai voulu dire par cette phrase. J'aurais du être plus précis.
    Non non c'est assez clair en fait ! J'ai dû lire un peu trop vite

    a++

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/10/2014, 18h08
  2. [VB6] Comment faire un update sur des textbox qui sont créés
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 27
    Dernier message: 16/02/2006, 14h52
  3. Faire des retry sur des erreurs FTP
    Par fejjal dans le forum Réseau
    Réponses: 4
    Dernier message: 15/02/2006, 23h34
  4. Réponses: 8
    Dernier message: 24/08/2004, 22h25
  5. [VB.Net] Faire du JS sur des contrôles côté serveur
    Par TagadaTsoin dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/11/2003, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo