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

Taglibs Java Discussion :

i18n avec fmt [JSTL]


Sujet :

Taglibs Java

  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut i18n avec fmt
    Bonjour,

    Je réalise une applie en Servlet/jsp. J'utilise Tomcat 5.5 et eclipse europa 3.3 plugin WTP.

    J'ai commencé ma première page index.jsp sur laquelle l'utilisateur aura le choix de la langue. J'utilise la balise fmt:SetLocal pour pose le locale soit en "en" soit en "fr". J'ai deux fichiers suffixés _fr ou _en.properties avec les cles.Ensuite grace à la balise "fmt:message " je récupère la valeur de la cle. En statique la page fonction sans problème mais lorsque j'ajoute un menu déroulant avec les langues j'ai des erreurs.
    J'ai fait une servlet qui met le Locale en français ou en anglais en fonction de la valeur dans le menu déroulant et ensuite recharge la page index. Là j'ai l'erreur suivante :
    java.lang.NullPointerException
    ServletInternalisation.doGet(ServletInternalisation.java:25)
    ServletInternalisation.doPost(ServletInternalisation.java:41)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    Erreur dans la servlet..???
    Voici le code de la servlet:
    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
     public class ServletInternalisation extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
       static final long serialVersionUID = 1L;
     
     
    	public ServletInternalisation() {
    		super();
    	}   	
     
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    			//compare la valeur de l'ttribue langue et je met le locale 		
    	        if (request.getAttribute("langue").equals("Français") )
    	        {
    			Locale locale = Locale.FRENCH; 
    	    	response.setLocale(locale);
    	    	getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
    	        }
    	        if (request.getAttribute("langue").equals("English"))
    	        {
    			Locale locale = Locale.ENGLISH; 
    		   	response.setLocale(locale);
    		   	//appel de la page index.jsp
    getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
    		    }
    	}  	
     
     
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request,response);
    	}   	  	    
    }
    Cela est le premier souci que je ne voit pas pourqoui il ne marche pas!

    Secondo:
    dans la page index :
    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
    <%@ taglib uri="cjstl" prefix= "c" %>
    <%@ taglib uri="fmtjstl" prefix="fmt"%>
     
     
    	<fmt:setLocale value="<%=response.getLocale().toString().substring(0,2)%>" />
     
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     
    <title>Authentification GestionProspect</title>
    </head>
     
    <hr>
    <table>
    	<tr>
    		<td><fmt:bundle basename="prospect">
    			<fmt:message key="p_langue" />
    		</fmt:bundle></td>
    		<td>
    		<form action="ServletInternalisation" method="POST">
    		<select name="langue" size="1" onChange="this.form.submit()">
    			<option value="fr">Français</option>
    			<option value="en">English</option>
    		</select>
    		<noscript><input type="submit" value="Changer"></noscript>
    		</form>
    		</td>
    	</tr>
    </table>
    Ici j'ai remarqué que la balise <fmt:setLocale value="qqch" scope="session"/>
    n'accepte pas la variable session. Et pourtant j'ai utilisé la doc sur le site jsp2.pdf qui donne un exemple avec scope="session". En plus j'ai fait des recherches sur internet mais des forums sans suite au sujet. Donc si quelqu'un a un explication svp à l'aide.

  2. #2
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Hello,

    Quelques éléments de réponses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getAttribute("langue").equals("Français")
    -> attention: peut générer un NullPointerException si l'attribut n'est pas dans le request!

    Peut tu préciser laquelle est la ligne qui plante?

    Sinon, pour ta JSP c'est bizzare moi j'ai sans pb utilisé le scope='session'. Sinon, tu peut directement passer la locale, pas besion de passer une String.
    Donc, le code suivant devrait marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <fmt:setLocale value="<%=response.getLocale()%>" />

  3. #3
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Sinon, dans ta servlet tu peut directement faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Config.set(request.getSession(),Config.FMT_LOCALE,Locale.EN);

  4. #4
    Membre averti
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    Je suis en train de tester les pistes que tu viens de donnés et si j'arrive à le faire fonctionner je mes le code.

    Par contre la variable scope="session" me génère tjs le même message d'erreur:
    org.apache.jasper.JasperException: <h3>Message d'erreurs de validation provenant du TagLibraryValidator pour fmt en /index.jsp</h3><p>2: Illegal scope attribute without var in "fmt:setLocale" tag.</p>
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:74)
    org.apache.jasper.compiler.Validator.validateXmlView(Validator.java:1545)
    org.apache.jasper.compiler.Validator.validate(Validator.java:1490)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:167)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:296)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:277)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:265)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:302)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    Et donc pour l'instant je ne mes de scope mais cela peut avoir un impacte sur les variables qui sont justement stokées dans session. Est-ce correct comme logique?

  5. #5
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Si tu regarde ici: http://jakarta.apache.org/taglibs/do...easeNotes.html, tu peut voir que cette erreur a été corrigé dans la vers 1.0.5 de la JSTL!

    Donc, soit tu utilise un plus vielle, soit ...

  6. #6
    Membre averti
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    OK je viens de copié les bons .jar 1.1.2 et plus d'erreur au niveau de la balise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <fmt:setLocale value="<%=response.getLocale()%>" scope="session" />
    Pour ceux qui auront le problème il faut télécharger du site de jakarta:http://jakarta.apache.org/site/downl...s_taglibs.html

    Prendre le
    Standard 1.1 (plus récent) Taglib
    Merci encore woodwai.

    Pour le reste je suis en train de faire...

  7. #7
    Membre averti
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    La ligne qui envoit l'erreur est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (request.getAttribute("langue").equals("Français") )
    Depuis j'essaie de corriger cela mais je ne sais pas pourquoi la valeur de la balise
    suivante n'est pas récuperé!

    Avez vous une idée, comment je peut récupérer cette valeur et lorsque j'affiche à nouveau la page index.jsp elle est par défaut?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <select name="langue">
    <option value=fr>Français</option>  
    </select>

  8. #8
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Pour récupérer la valeur de langue, il faut utiliser un request.getParameter("langue").

  9. #9
    Membre averti
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    J'ai testé avec getParameter("nomParametre") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     String tmp=(String) request.getParameter("siteLocale");
    if (tmp.equalsIgnoreCase("en"))
    				{	
    		     	Locale locale = Locale.ENGLISH;
    				locale = Locale.UK;
    				response.setLocale(locale);
    				getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
    				}
    Mais lorsque je change de langue via le menu déroulant j'ai une page BLANCHE .

  10. #10
    Membre averti
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    Ca y est
    Donc voilà je fait la récapitulative de cette internalisation J2EE.
    J'ai utilisé:
    JSTL dans dans les jsp(code HTML et SJTL)
    Servlet qui change le locale en fonction du choix de langue de l'utilisateur(code java)

    La partie jsp: je ne mes pas tout le code juste la partie intéressante:
    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
    <fmt:setLocale value="<%=response.getLocale()%>" />
    <hr>
    <table class="table">
    	<tr>
    		<td><fmt:bundle basename="prospect">
    			<fmt:message key="p_langue" />
    		</fmt:bundle></td>
    		<td>
    		<form action="ServletInternalisation" method="POST">
    			<select name="siteLocale" size="1" onChange="this.form.submit()" >
    				<option ></option>
    				<option value="fr">Français</option>
    				<option value="en">English</option>
    			</select>
    		<noscript><input type="submit" value="Changer"></noscript>
    		</form>
    		</td>
    	</tr>
    </table>
    .......rien d'intéressant
    Donc la servlet:
    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
     
    import java.io.IOException;
    import java.util.Locale;
     
    import javax.servlet.ServletException;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
     public class ServletInternalisation extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
       static final long serialVersionUID = 1L;
     
     
    	public ServletInternalisation() {
    		super();
    	}   	
     
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
    		String tmp=(String) request.getParameter("siteLocale");
     
    		if (tmp.equalsIgnoreCase("en"))
    		{	
    		     	Locale locale = Locale.ENGLISH;
    				locale = Locale.UK;
    				response.setLocale(locale);
    				getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
    		}
    		if (tmp.equalsIgnoreCase("fr"))
    		{	
    		     	Locale locale = Locale.FRENCH;
    				locale = Locale.FRANCE;
    				response.setLocale(locale);
    				getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
    		}
     
    	}  	
     
     
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request,response);
    	}   	  	    
    }
    Voilà j'éspère être utile à d'autres...

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

Discussions similaires

  1. I18N avec Accept-Language Header et StaticInterceptor
    Par kolodz dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 11/06/2014, 17h20
  2. [JSF] I18N avec HTML
    Par Le Singe dans le forum JSF
    Réponses: 2
    Dernier message: 16/12/2010, 14h06
  3. traduction de dom du modèle avec I18n
    Par Javix dans le forum Ruby on Rails
    Réponses: 3
    Dernier message: 04/01/2010, 15h14
  4. [JSTL] pattern pour parser un entier avec fmt:parseNumber
    Par javadool dans le forum Taglibs
    Réponses: 0
    Dernier message: 11/09/2009, 11h21

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