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

Struts 1 Java Discussion :

Problème multilinguisme - internationalisation


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut Problème multilinguisme - internationalisation
    Bonjour à toutes et à tous,
    Je boss actuellement sur une appli développée avec le Framework Struts. Et j'ai un problème avec notre internationalization.

    On doit gerer des utilisateurs et chaque utilisateur a la possibilité de choisir la langue dans laquel sera proposer l'application. A la connection de celui ci on récupére donc la langue choisi dans la BDD et on va ensuite tapper dans le fichier .properties correspondant à la langue choisie.

    Le problème réside je pense dans la définition de la variable Locale qui stock la langue de l'utilisateur.

    A la connection d'un utilisateur, on force la variable Locale avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Locale.setDefault(Locale.la_langue_du_user);
    Ensuite dans la classe LabelsBundle on récupere cette variable et on va tapper dans les .properties.

    Le souci est que lorsque plusieurs utilisateurs se connectent en même temps et dans des langues différentes la variable Locale qui est rattaché au serveur ne conserve uniquement que la dernier valeur affecté (ce qui est tout a fait normal) et l'application n'est pas forcement présentée dans la langue choisi par l'utilisateur. Je pense que la solution serrait de rattacher cette variable à la session des utilisateurs, mais le souci est que je n'ai pas de visibilité sur ces sessions depuis ma classe LabelsBundle:

    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
    36
     
    package rialto.tag;
     
    import java.util.Locale;
    import java.util.ResourceBundle;
     
    public class LabelsBundle {
     
     
    	public static String getLabel(String key){
     
    		Locale[] supportedLocales = {
    			    Locale.FRENCH,			   
    			    Locale.ENGLISH
    			};
     
    		//utilise la valeur locale
    		Locale localisation = Locale.getDefault();
     
    		//Si on veut forcer en anglais ou français
    		//Locale localisation=supportedLocales[0];
    		ResourceBundle labels;
    		String text;
     
            try {
            	labels = ResourceBundle.getBundle("labelsRialto", localisation);
            	text = labels.getString(key);
            }
            catch (Exception e) {
                text = key;        
            }
    		return text;
     
    	}
     
    }

    Si quelqu'un connait une petite manip pour résoudre mon problème je serais vraiment très intéressé.

    Merci @ Tous, bonne continuation !

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Par défaut
    salut,

    je ne sais pas si je reponds a ta question, mais tu peux envoyé dans ton cookie des preferences utilisateurs et dans tes pages, rechercher la langue pour afficher dans la bonne langue en attendant d avoir la session .

  3. #3
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Merci de ta réponse, mais j'aimerai trouver une solution sans utiliser des cookies, il semble qu'il devrait être possible de passer par les sessions.

    Mais avant ca j'ai une question toutes simples est-il possible de faire fonctionner une application dans 2 langue différentes au même instant sur le même serveur ???

    Et si oui si quelqu'un à une petite idée pour mon problème ca serait super cool.

    Pour l'instant j'ai tenter de définir en entré de mes actions la langue choisi par l'utilisateur mais je ne pense pas que ce soit vraiment complet.

    Car si 2 actions sont appelées l'une après l'autre la langue qui sera retenu sera celle utilisée pour la 2eme action...

    Enfin bref je suis un peu dans le flou

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Les méthodes getLocale et setLocale de la classe Action ne te suffisent pas ?

  5. #5
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Bein le souci c'est que les méthodes setLocale et getLocale de la classe Action nécessite le paramêtre "request". Or pas de problème dans mon action j'ai accès à cette variable mais pas dans ma classe qui effectue le lien avec le dictionnaire:
    "LablesBundle.java"

    Cette classe fait partie du package :"package rialto.tag;"

    Et cette classe utilise donc la variable Locale défini pour le serveur que je récupére avec Locale.getDefault();

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Tu ne peux pas modifier ta méthode getLabel en lui rajoutant la locale en paramètre ? (celle que tu auras récupérée dans l'action par un getLocale)

  7. #7
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Je pourrai effectivement, coté Java ca impliqueré peut de modification, ca va être coté "Vue" que ca va posé un problème. Car je ne connait pas cette variable locale et que je fais mes appel d'internationalization avec des tagLib du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <rialto:internationalization text="pp.titre" name="enteteTitre" />

  8. #8
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Pense tu que je puisse définir ma méthode getLabel au sein de la classe Action ???

    De cette maniere j'aurais accès à ma variable de session...
    Est ce que celon toi ca te semble cohérent ?

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Pense tu que je puisse définir ma méthode getLabel au sein de la classe Action ???
    Bof, ça ne me semble pas terrible.

    Est-ce que ce sont tes taglibs qui appellent ta métode getLabel ?
    Car tu dois avoir accès via tes taglibs à ta request et donc à ta locale.

  10. #10
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    D'un coté les tagLib font appel à cette méthode, mais j'avoue que je ne sais pas trop comment, et de l'autre mes actions aussi s'en servent pour, par exemple transmettre des libellés aux clients pour des choses qui devrait être affiché dynamiquement.

    Le truc c'est que si je reprend la définition des tagLibs il va falloir que je reprenne l'intégralité de mes vues et j'y tiens pas spécialement.

    J'envisagerai plutot une solution du style réussir à acceder à mes variables de sessions à partir de ma classe LabelsBundle

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Je ne pense pas.
    Il est peut-être possible de ne modifier que ton ou tes taglibs.
    A voir.

  12. #12
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Je t'avouerai que je ne connais pas tres bien le fonctionnement des tagLibs ...
    Tu pense qu'il est possible de faire passer ma variable request via les tagLibs?

    voici un exemple d'utilisations de mes tagLibs pour la création d'une window:

    coté vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <rialto:window name="window123" title="pp.123.title">
    définition du tagLib:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    /*
     * Créé le 20 juil. 2005
     *
     * TODO Pour changer le modèle de ce fichier généré, allez à :
     * Fenêtre - Préférences - Java - Style de code - Modèles de code
     */
    package rialto.tag;
     
    import java.io.IOException;
     
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.Tag;
    import javax.servlet.jsp.tagext.TagSupport;
     
    public class WindowTag extends TagSupport implements conteinerLib{
     
    	String name;
     
    	String refObj;
     
    	String title;
     
    	String icone="";
     
    		/**
             * @param name name à définir.
             */
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	/**
             * @return Renvoie name.
             */
    	public String getName() {
    		return name;
    	}
     
    	/**
             * @param icone icone à définir.
             */
    	public void setIcone(String icone) {
    		this.icone = icone;
    	}
     
     
    	/**
             * @param title title à définir.
             */
    	public void setTitle(String title) {
    		this.title = LabelsBundle.getLabel(title);
    	}
     
    	/* (non-Javadoc)
    	 * @see javax.servlet.jsp.tagext.TagSupport#doEndTag()
    	 */
     
    	public int doEndTag() throws JspException {
    		// TODO Raccord de méthode auto-généré
    		return super.doEndTag();
    	}
     
    	/* (non-Javadoc)
    	 * @see javax.servlet.jsp.tagext.TagSupport#doStartTag()
    	 */
     
    	public int doStartTag() throws JspException {
    		//recherche du premier ancetre de type IHM pour savoir si on utilise
    		// THIS		
    		Tag handler = findAncestorWithClass(this, LayoutTag.class);
    		if (handler != null) {
    			refObj=((LayoutTag) handler).jsPrefixe +name;
    		}
    		else{
    			this.refObj=name;
    		}
    //		 recherche du premier ancetre de type conteineur
    		handler = findAncestorWithClass(this, conteinerLib.class);
    		String oParent;
    		if (handler != null) {				
    			oParent = ((conteinerLib) handler).getRefObj();
    		}
    		else{
    			oParent = "window.document.body";
    		}
     
    		StringBuffer sbuffer=new StringBuffer();
     
     
    		String strObjPar = "{"
    		    + "parent:"				+oParent
    		    + ","
    		    + "title:'"				+title
    		    + "',"
    		    + "icone:'"				+icone
    		    + "',"
    		    + "style:'fenetre'"				
    			+"}";
     
     
    		sbuffer.append(this.refObj+" = new rialto.widget.SimpleWindow("+strObjPar+");\n");
    		try {
    			pageContext.getOut().write(sbuffer.toString());
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		return  EVAL_BODY_INCLUDE;								
    	}
     
    	/**
             * @param refParent refParent à définir.
             */
     
    	/* (non-Javadoc)
    	 * @see fr.igr.librairieJS.conteinerLib#getRefObj()
    	 */
    	public String getRefObj() {
    		// TODO Raccord de méthode auto-généré
    		return this.refObj;
    	}	
    }
    (la fonction setTitle appel la methode getLabel)

    et voici la définition dans mon fichier rialto.tld
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
     
    <taglib>
        <tag>    
            <name>window</name>
            <tagclass>rialto.tag.WindowTag</tagclass>
            <bodycontent>JSP</bodycontent>        
            <info>objet fenetre simple</info>
            <attribute>
                <name>name</name>
                <required>true</required>
                <rtexprvalue>true</rtexprvalue>
            </attribute>         
            <attribute>
                <name>title</name>
                <required>false</required>
                <rtexprvalue>true</rtexprvalue>
            </attribute>   
            <attribute>
                <name>icone</name>
                <required>false</required>
                <rtexprvalue>true</rtexprvalue>
            </attribute>           
        </tag>
    </taglib>
    Voila les fichiers qui (il me semble) sont utilisé pour les taglibs, ensuite je connait pas leur articulation exacte entre eux.

    Merci encore pour l'attention que tu porte a mon probleme...

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    A priori, la classe TagSupport, dont hérite ton tag, possède l'attribut pageContext, qui permet de récupérer la request.
    Tu pourrais ainsi récupérer la locale et la passer à ta méthode getLabel modifiée.

  14. #14
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    OOOOouuuu alors ca ca me plait beaucoup je vais m'empressé de tester ca ! (tout de suite après la pause miam miam )

    Merci encore fr1man. Tu as été d'une aide très précieuse.
    Pour tous ceux que ca intéresse je vais un petit feedback juste après avoir testé !

    Ce coup ci je le sens bien

  15. #15
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Encore une petite intérogation, l'attribut pageContext ne permet pas d'accéder à la session.

    Par contre il m'est effectivement possible de récupérer la Locale mais celle ci ne correspond t-elle pas à la Locale défini par le navigateur de l'utilisateur???

    Peut on forcer la valeur de cette variable en fonction des données présente en BDD ?

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Si tu veux accéder à la session, un request.getSession() fera l'affaire.

    Pour paramétrer la locale en fonction de ton utilisateur, tu peux utiliser le setLocale de ta classe Action.

  17. #17
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Le setLocale de ma classe action attache bien la Locale a la session ou dois-je passer par une méthode setAttribut "org.apache.struts.Globals.LOCALE_KEY" dans la session que je récupere ensuite dans ma classe LabelsBundle ???

  18. #18
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Juste un petit truc en passant, c'est pageContext.getSession() pour récupérer la session depuis le context du tag...
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre confirmé Avatar de ythim
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Citation Envoyé par OButterlin
    Juste un petit truc en passant, c'est pageContext.getSession() pour récupérer la session depuis le context du tag...
    A+
    Ehéh merci pour cette remarque, effectivement on ne peut pas accéder a la session directement avec le request...

    Reste a voir la question de l'attribut sur la session... Pensez vous que c'est une bonne solution ???

  20. #20
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Bien vu OButterlin.

    Set the user's currently selected Locale into their HttpSession.
    Ca devrait être bon.
    Pense quand même à lire les javadoc quand on te donne des tuyaux, tu y trouveras pas mal d'infos.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème d'internationalisation d'une application
    Par jbrasselet dans le forum ASP.NET
    Réponses: 5
    Dernier message: 28/06/2011, 14h58
  2. [Xaml][3.0] Problème d'internationalisation
    Par GroXx dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 09/10/2009, 16h33
  3. Réponses: 2
    Dernier message: 01/10/2009, 16h33
  4. Problème d'internationalisation sous Django
    Par LaaLaa dans le forum Django
    Réponses: 0
    Dernier message: 24/03/2009, 19h46
  5. Problème d'internationalisation par défaut
    Par walach dans le forum SpagoBI
    Réponses: 1
    Dernier message: 20/04/2008, 19h56

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