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

Collection et Stream Java Discussion :

ResourceBundle Vs Properties


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut ResourceBundle Vs Properties
    Bonjour,

    Suite à un problème d'internationalisation (http://www.developpez.net/forums/sho...83#post1557683),
    je me suis penché sur les ResourceBundle et les Properties d'un peu plus près.

    Jusqu'à présent lorsque j'avais besoin de récupérer une chaine dans un fichier properties je le faisais de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String message = "";
    ResourceBundle helloWorldResourceBundle = ResourceBundle.getBundle("Ressources.helloWorld");
    try{
      message = helloWorldResourceBundle.getString("firstWords");
    }catch( Exception e){
      message = "I don't know what to say!";
    }
    System.out.println(message);
    Mais apparement on peut aussi le faire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String message = "";
    try{
      Properties helloWorldProperties = new Properties();
      FileInputStream tmpFile = new FileInputStream("helloWorld.properties");
      helloWorldProperties.load(tmpFile);
      message = helloWorldProperties.getProperty("firstWords");
    }catch( Exception e){
      message = "I don't know what to say!";
    }
    System.out.println(message);
    Ce qui m'a l'air d'être a peu de chose près équivalent à ce que je faisais avant, en un peu moins ramassé.
    Par contre, si je veux utiliser un fichier XML à la place d'un fichier properties, il ne semble y avoir que l'option de passer par la classe properties:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String message = "";
    try{
      Properties helloWorldProperties = new Properties();
      FileInputStream tmpFile = new FileInputStream("helloWorld.xml");
      helloWorldProperties.loadFromXML(tmpFile);
      message = helloWorldProperties.getProperty("firstWords");
    }catch( Exception e){
      message = "I don't know what to say!";
    }
    System.out.println(message);
    Avant de basculer tout mon appli de "fichiers properties" vers "fichiers XML" (pour des raisons de compatibilité UTF-8), je voudrai m'assurer que rien ne m'a échappé.
    Si c'est le cas, merci de me prévenir.

    Je vais attendre un peu avant de me lancer dans la migration...

    sources: http://www-128.ibm.com/developerwork...On-JDK_5.0-XML

  2. #2
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Je ne suis pas certain que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FileInputStream tmpFile = new FileInputStream("helloWorld.xml");
    Effectivement c'est ce que fait le ResourceBundle car le fichier doit aussi être dans le classpath.

  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,


    Properties permet d'obtenir des couples clef/valeur à partir d'un fichier texte.

    ResourceBundle permet de gérer facilement la localisation d'une application en gérant de multiples sources (par exemple des fichiers properties différents pour chaque langue)

    a++

  4. #4
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Citation Envoyé par thibaut
    Je ne suis pas certain que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     FileInputStream tmpFile = new FileInputStream("helloWorld.xml");
    Effectivement c'est ce que fait le ResourceBundle car le fichier doit aussi être dans le classpath.
    Désolé j'avais oublié de préciser le nom du fichier avec le ResourceBundle.
    Je viens de corriger.

  5. #5
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    Properties permet d'obtenir des couples clef/valeur à partir d'un fichier texte.

    ResourceBundle permet de gérer facilement la localisation d'une application en gérant de multiples sources (par exemple des fichiers properties différents pour chaque langue)

    a++
    Ce qui veut dire que toute la gestion intelligente des helloWorld_fr.properties, helloWorld_en.properties, helloWorld_ru.properties et autre helloWorld_xx.properties doit être fait à la mimine?

    J'entend par gestion intelligente:
    -récuperer tout les fichiers pouvant être concerné
    -établir une "hierarchie" entre les différentes langues lorsque le premier choix de langue n'est pas disponible (en_US vs en_GB par exemple).

    Même si ce n'est pas insurmontable c'est quand même génant si on veut passer sur du XML sans avoir chaque couple key/value présent dans chaque fichier.

  6. #6
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par JMLLB
    Ce qui veut dire que toute la gestion intelligente des helloWorld_fr.properties, helloWorld_en.properties, helloWorld_ru.properties et autre helloWorld_xx.properties doit être fait à la mimine?

    J'entend par gestion intelligente:
    -récuperer tout les fichiers pouvant être concerné
    -établir une "hierarchie" entre les différentes langues lorsque le premier choix de langue n'est pas disponible (en_US vs en_GB par exemple).

    Même si ce n'est pas insurmontable c'est quand même génant si on veut passer sur du XML sans avoir chaque couple key/value présent dans chaque fichier.
    voyons remontons le temps ....
    tu fais un resourceBundle.getBundle("helloworld")
    ensuite par exemple bundle.getString("FIN")
    et selon le contexte culturel dans lequel tu te trouves le système de Bundle te trouve la bonne ressource en remontant la hiérarchie.

    seul truc auquel il faut faire attention: les performances (faire le getBundle une seule fois si possible)
    bon ça c'était l'ancienne version avec .properties .... avec XML tu peux faire un nouveau truc en 1.6 : ResourceBundle.Control (il me semble ...)

    par ailleurs pour faire un load de Properties il n'est pas politiquement correct de passer par un nom de fichier
    faire un : load(clazz.getResourceAsStream("nomressource"))
    (avec touskif comme try/catch)
    -idem pour le loadXeuMeuLeu-

  7. #7
    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 JMLLB
    Ce qui veut dire que toute la gestion intelligente des helloWorld_fr.properties, helloWorld_en.properties, helloWorld_ru.properties et autre helloWorld_xx.properties doit être fait à la mimine?
    Heu... oui car c'est ResourceBundle qui gère tout cela (Properties n'est rien que le fournisseur de contenu en quelque sorte).

    Citation Envoyé par JMLLB
    Même si ce n'est pas insurmontable c'est quand même génant si on veut passer sur du XML sans avoir chaque couple key/value présent dans chaque fichier.
    Pas forcément...

    Avec Java 6 (qui devrait sortir en version final durant le mois de décembre), il est désormais possible de mieux créer la création de ResourceBundle, ce qui permettrait éventuellement de gérer le format XML simplement : ResourceBundle.getBundle(String, Locale, ClassLoader, ResourceBundle.Control)

    Sinon tu peux jouer avec le fait que la méthode getBundle() attend soit un fichier properties, soit une classe Java qui hérite de ResourceBundle.

    Si tu fais en sorte que ces classes charge le XML ca marche !


    Par exemple, tu crées une classe fille de ResourceBundle qui se charge :
    1. De charger le fichier xml du même nom dans un Properties.
    2. D'implémenter les méthodes abtraites de ResourceBundle.


    Ce qui donne par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public abstract class XMLResourceBundle extends ResourceBundle {
     
    	private final Properties xmlProperties = new Properties();
     
    	protected XMLResourceBundle() throws IOException {
    		String resName = getClass().getName().replace('.', '/') + ".xml";
    		InputStream stream = getClass().getClassLoader().getResourceAsStream(resName);
    		try {
    			this.xmlProperties.loadFromXML(stream);
    		} finally {
    			stream.close();
    		}
    	}
     
    	public Object handleGetObject(String key) {
    		return this.xmlProperties.get(key);
    	}
     
    	public Enumeration getKeys() {
    		return this.xmlProperties.keys();
    	}
     
    }

    Ensuite tu transformes tout tes *.properties en XML, et pour chaque fichier tu crée une classe du même nom.
    Par exemple, si tes fichiers *.xml sont placé dans le package ressources (nota : les noms de packages commencent par une minuscule), et que tu as un fichier helloWorld_fr_FR.xml, il te faut la classe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    package ressources;
     
    public class helloWorld_fr_FR extends XMLResourceBundle {
     
    	public helloWorld_fr_FR() throws java.io.IOException {
    		super();
    	}
    }
    C'est cette classe qui te sera retourné par la méthode ResourceBundle.getBundle() et qui te permettra de charger le XML


    Le seul défaut c'est que tu devra avoir autant de classe que de fichier XML...

    a++

  8. #8
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut Merci!
    Merci pour la démo, maintenant c'est plus clair.

    Cela étant dit, je pense que je vais attendre Noël voir ce que papa-Sun a mis sous le sapin.

    Je vais attendre la Nouvelle année et ses bonnes résolutions pour transcrire mes fichiers properties en XML.

    @+

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 141
    Par défaut
    Bonjour,

    j'ai utilisé le code de ce message pour paramétrer un ResourceBundle mais le fichier est dit introuvable. Quelqu'un peut-il m'aider....

    Fichier properties placer dans src :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    # Fiche utilisateur 
    ErrorFicheUser.1=Veuillez renseigner le service
    ErrorFicheUser.2=Veuillez renseigner la civilité
    ErrorFicheUser.3=Veuillez renseigner le nom
    ErrorFicheUser.4=Veuillez renseigner le prénom
    ErrorFicheUser.5=Veuillez renseigner la fonction
    ErrorFicheUser.6=Veuillez renseigner votre adresse mail
    ErrorFicheUser.7=Votre adresse mail est non valide
    ErrorFicheUser.8=L'email saisi est déjà* enregistré
     
    # Oubli mot de passe   
    ErrorOubliPswd.1=Veuillez saisir votre identifiant ou votre adresse mail
    ErrorOubliPswd.2=Votre adresse email est non valide
    ErrorOubliPswd.3=Votre adresse mail ou votre identifiant est inconnu
     
    # Modification du mot de passe  
    ErrorModifPswd.1=Veuillez saisir votre ancien mot de passe
    ErrorModifPswd.2=Veuillez choisir votre nouveau mot de passe
    ErrorModifPswd.3=Veuillez confirmer votre mot de passe
    ErrorModifPswd.4=Votre mot de passe doit contenir au moins 5 caractéres
    ErrorModifPswd.5=La confirmation de votre mot de passe ne correspond pas à* votre mot de passe
    ErrorModifPswd.6=L'ancien mot de passe est erroné
    ErrorModifPswd.7=Le format du nouveau mot de passe est incorrect
    ErrorModifPswd.8=Le format de confirmation du nouveau mot de passe est incorrect
     
    # Modification du Login  
    ErrorModifLogin.1=Veuillez saisir votre ancien login
    ErrorModifLogin.2=Veuillez choisir votre nouveau login
    ErrorModifLogin.3=Veuillez confirmer votre login
    ErrorModifLogin.4=Votre mot de passe doit contenir au moins 8 caractéres
    ErrorModifLogin.5=La confirmation de votre login ne correspond pas à* votre login
    ErrorModifLogin.6=L'ancien login est erroné
    ErrorModifLogin.7=Le format du nouveau login est incorrect
    ErrorModifLogin.9=Le format de confirmation du nouveau login est incorrect
    Code JAVA pour l'accès au fichier properties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String message = "";
    			ResourceBundle helloWorldResourceBundle = ResourceBundle.getBundle("Ressources.ErrorMessages");
    			try{
    			  message = helloWorldResourceBundle.getString("ErrorFicheUser.8");
    			}catch( Exception e){
    			  message = "I don't know what to say!";
    			}			
    			errorMessage.append(message);

    Question subsidiaire, peut-on utilisé les messages des fichiers properties dans le Javascript ?

    Merci d'avance

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 141
    Par défaut
    j'ai lu qu'il fallait ajouter le fichier properties au classpath...mon problème viendrais-t-il de là ?
    comment fait-on cela dans eclipse ...

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 141
    Par défaut
    je sais que l'on ne fait pas de up mais la jsui dessus depuis 3 jour et je n'y arrive pas

  12. #12
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 704
    Par défaut
    Ou as tu mis ton fichier properties?

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 141
    Par défaut
    le fichier properties est placer à la racine de src de mon projet web JAVA

  14. #14
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    le properties ne doit pas être au même endroit que les .class par hasard ?

    enfin il me semble avoir déjà vu cela quelque part

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ResourceBundle] emplacement du fichier properties
    Par zaboug dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 28/05/2010, 10h52
  2. ResourceBundle et properties : emplacement des fichiers
    Par HunTR dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 16/04/2010, 22h21
  3. ResourceBundle et emplacement des .properties
    Par Anubis dans le forum Langage
    Réponses: 2
    Dernier message: 19/02/2009, 22h54
  4. ResourceBundle fichier properties
    Par totoche dans le forum Débuter
    Réponses: 2
    Dernier message: 09/09/2008, 00h37
  5. [ResourceBundle] accéder à un fichier properties
    Par sylsau dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 04/12/2007, 22h10

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