¿Por qué no está mi JSP mostrando la configuración regional alemana (es_ES) cuando se utiliza ?

StackOverflow https://stackoverflow.com/questions/4171420

Pregunta

He creado la siguiente JSP:

<!-- WebContent/pages/ResourceBundlesJST.jsp -->
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="java.text.*" %>
<%@ page import="java.util.*" %>
<%@ page import="hu.flux.locale.LanguageToolkit" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%  
    Locale locale = LanguageToolkit.getLanguage(request);
    //String locale = LanguageToolkit.getLanguageString(request);
%>
<fmt:setLocale value="${locale}" />
<fmt:bundle basename="hu.flux.locale.resources.TestResources">
    <!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>Insert title here</title>
    </head>
    <body>
        <h1><fmt:message key="greetHeading"/></h1>
        <p><fmt:message key="welcomeText"/></p>
        <p>Your locale is <%= locale %>.</p>
        <form action="your_form_handler_here" method="post">
            <div>
                <label for="name"><fmt:message key="namePrompt"/></label>
                <input type="text" id="name" name="name">
            </div>
            <div>
                <label for="age"><fmt:message key="agePrompt"/></label>
                <input type="text" id="age" name="age">
            </div>
            <div>
                <label for="place"><fmt:message key="placePrompt"/></label>
                <input type="text" id="place" name="place">
            </div>
            <input type="submit" value="<fmt:message key="submitButtonText"/>">
        </form>
    </body>
    </html>
</fmt:bundle>

Cuando trato de visitar la página con la siguiente URL:

http://localhost:8080/SamsTeachYourselfJSP/pages/ResourceBundlesJSTL.jsp?languageOverride=de_DE

Esto se visualiza en la pantalla:

Hello!

Welcome to our web site. Please take a moment to fill out our survey

Your locale is de_DE.

What is your name:  
How old are you:  
Where do you live:  

La página está encontrando evidentemente, y el uso de las propiedades inglesas archivo en lugar de la alemana aunque el servidor recogió mi parámetro para establecer la configuración regional a es_ES y aceptó el comando para establecer la configuración regional.

El recurso espero que contiene llamada:

# /src/hu/flux/locale/resources/TestResources_de.properties
namePrompt=Wie hei[gb]en Sie:
agePrompt=Wie alt sind Sie:
placePrompt=Wo wohnen Sie:
greetHeading=Guten Tag!
welcomeText= Willkommen bei unserer Web-Site.  Bitte, dauern Sie einen Moment Um unsere Umfrage auszufüllen
submitButtonText=Senden

Estoy bastante seguro de que el problema no está en mi clase LanguageToolkit ya que bien trabaja con una versión no JSTL de esta página, pero si alguien quiere verlo:

/**
 * /src/hu/flux/locale/LanguageToolkit.java
 */
package hu.flux.locale;

import java.util.Locale;
import java.util.StringTokenizer;

import javax.servlet.http.HttpServletRequest;

/**
 * @author Brian Kessler
 *
 */
public class LanguageToolkit {

    /**
     * 
     */
    public LanguageToolkit() {
        // TODO Auto-generated constructor stub
    }

    public static Locale getLanguage(HttpServletRequest request)
    {
        Locale locale = Locale.getDefault();

        // Get the browser's preferred language.
        String acceptLangString = request.getHeader("ACCEPT-LANGAUGE");

        // Allow the user to override the browser's langauge setting.
        // This lets you test with tools such as Babelfish 
        // (which isn't that great at translating to begin with).
        String override = request.getParameter ("languageOverride");
        if (override != null) { acceptLangString = override; }

        // If there is an ACCEPT-LANGUAGE header, parse it.
        if (acceptLangString != null) 
        {  
            Locale acceptedLocale = parseLangString (acceptLangString);
            if (acceptedLocale != null) {locale = acceptedLocale;}
        }

        return locale;
    }

    public static String getLanguageString(HttpServletRequest request)
    {
        String locale = "EN-uk";

        // Get the browser's preferred language.
        String acceptLangString = request.getHeader("ACCEPT-LANGAUGE");

        // Allow the user to override the browser's langauge setting.
        // This lets you test with tools such as Babelfish 
        // (which isn't that great at translating to begin with).
        String override = request.getParameter ("languageOverride");
        if (override != null) { acceptLangString = override; }

        // If there is an ACCEPT-LANGUAGE header, parse it.
        if (acceptLangString != null)  {locale = acceptLangString;}

        return locale;
    }

    private static Locale parseLangString(String acceptLangString) 
    {
        // The accepted languages should be separated by commas, but also
        // add space as a separator to eliminate whitespace.
        StringTokenizer localeParser = new StringTokenizer(acceptLangString, " ,");

        // See whether there is a language in the list (you need only the first one).
        if (localeParser.hasMoreTokens())
        {
            // Get the locale.
            String localeStr = localeParser.nextToken();

            // The local should be in the format ll-CC where 11 is the language
            // and CC is the country, like en-US for English in the U.S. and
            // de-DE for German in Germany.  Allow the browser to use _ instead
            // of -, too.
            StringTokenizer localeSplitter = new StringTokenizer (localeStr, "_-");

            // Assume both values are blank.
            String language = "";
            String country = "";

            // See whether a language is specified.
            if (localeSplitter.hasMoreTokens()) {language = localeSplitter.nextToken(); }

            // See whether a country is specified (there won't always be one).
            if (localeSplitter.hasMoreTokens()) {country = localeSplitter.nextToken(); }

            // Create a local based on this language and country (if country is blank,
            // you'll still get locale-based text, but currencies won't display correctly.
            return (new Locale(language, country));
        }
        return null;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

Cualquier idea por qué estoy viendo Inglés y cómo solucionarlo?

¿Fue útil?

Solución

Hay 2 problemas:

En primer lugar, la fmt:setLocale TLDDOC dice lo siguiente:

value - java.lang.String - A cadena valor se interpreta como la representación imprimible de un local, que debe contener una de dos letras (minúsculas) código de idioma (como se define por la norma ISO-639), y puede contener un código de país de dos letras (mayúsculas) (como se define por la norma ISO-3166). códigos de idioma y país deben estar separados por un guión (-) o guión bajo (_).

En otras palabras, no se puede establecer con un java.util.Locale.

En segundo lugar, todo lo que se ha declarado en el uso de scriptles no se puede acceder en EL. EL sólo pueden atributos de acceso que se ha colocado en PageContext, HttpServletRequest, HttpSession o ServletContext por su método setAttribute(). Bajo las sábanas, EL básicamente hace un rel pageContext.findAttribute(name) para un ${name}. Básicamente, hay 4 soluciones en orden de menor a mejor recomendación:

  1. Uso scriplet en lugar de EL en <fmt:setLocale>.
  2. Poner la configuración regional en la solicitud de su alcance por el interior request.setAttribute("locale", locale); scriplet .
  3. Get deshacerse de scriptles y LanguageToolkit declarar como una función de EL.
  4. Crear un Filter el que hace el trabajo.

Dicho esto, yo recomendaría el uso de <fmt:setBundle> en lugar de <fmt:bundle> en este caso particular, ya que parece que quieren cubrir toda la página. También recomendaría usar HttpServletRequest#getLocale() en lugar de analizar manualmente el encabezado de la solicitud. El algoritmo correcto es más complejo que lo tienes tan lejos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top