1

Intro

I am trying to internationalize (i18n) my Java Web Application which is based on basic JSPs/Servlets.

I am using JSTL fmt taglib in combination with Resource Bundle to achieve i18n of my application. I am also following this answer/guide.


Problem & Question

When I choose desired language on some page e.g. index.jsp, then this page is translated on selected language, but when I am going by some link e.g. signup.jsp then the language is changed to the default, thus i18n works on each page individually.

The Question is how do i share the language value across all pages?


Code

First of all I have a Filter which specifies the default/initial language of page.

DefaultLocaleFilter.java

@WebFilter(filterName = "DefaultLocaleFilter", urlPatterns = {"/app/*"})
public class DefaultLocaleFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletResponse resp = (HttpServletResponse) response;
        HttpServletRequest req = (HttpServletRequest) request;

        req.getSession().setAttribute("language", "ru");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {}
}



i18n.lang is the path to my Resource Bundle (I am using Maven's archetype-webapp)

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}"/>
<fmt:setBundle basename="i18n.lang"/>

<!DOCTYPE html>
<html lang="${language}">
<head>
    <title><fmt:message key="index.title"/></title>
</head>
<body>

    <h3 class="hero"><fmt:message key="index.text.welcome"/></h3>

    <p><fmt:message key="index.text.overview"/></p><br>

    <a class="button" href="signup"><fmt:message key="index.button.signup"/></a> &nbsp;
    <a class="button" href="login"><fmt:message key="index.button.login"/></a>

    <span class="lang">
        <form>
            <select name="language" onchange="submit()">
                <option value="en" ${language == 'en' ? 'selected' : ''}>EN</option>
                <option value="ru" ${language == 'ru' ? 'selected' : ''}>RU</option>
            </select>
        </form>
    </span>            

</body>
</html>



signup.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}"/>
<fmt:setBundle basename="i18n.lang"/>

<!DOCTYPE html>
<html lang="${language}">
<head>
    <title><fmt:message key="signup.title"/></title>
</head>
<body>

    <h3 class="hero"><fmt:message key="signup.text.welcome"/></h3>

    <%-- Here is the form to Sign Up --%>


    <span class="lang">
        <form>
            <select name="language" onchange="submit()">
                <option value="en" ${language == 'en' ? 'selected' : ''}>EN</option>
                <option value="ru" ${language == 'ru' ? 'selected' : ''}>RU</option>
            </select>
        </form>
    </span>            

</body>
</html>
Community
  • 1
  • 1
rand0rn
  • 678
  • 2
  • 12
  • 29

1 Answers1

1

Your filter is overridding the selected language on every request.

You should be setting a default language only when user hasn't chosen any.

if (req.getSession().getAttribute("language") == null) {
    req.getSession().setAttribute("language", "ru");
}

But, better is to just remove the servlet filter altogether and replace pageContext.request.locale in <c:set var="language"> by 'ru'.

<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : 'ru'}" scope="session" />
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555