在过滤器中设置默认语言后,JSP i18n 分别在每个页面上工作

Posted

技术标签:

【中文标题】在过滤器中设置默认语言后,JSP i18n 分别在每个页面上工作【英文标题】:JSP i18n works on each page separately after setting default language in filter 【发布时间】:2016-04-29 08:37:32 【问题描述】:

简介

我正在尝试国际化 (i18n) 我的基于基本 JSP/Servlet 的 Java Web 应用程序。

我正在结合使用 JSTL fmt taglibResource Bundle 来实现我的应用程序的 i18n。我也在关注this answer/guide。


问题和疑问

当我在某个页面上选择所需的语言eg index.jsp,然后这个页面被翻译成所选语言,但是当我通过某个链接eg @987654325 @ 然后将语言更改为默认语言,因此 i18n 单独在每个页面上工作。

问题是如何在所有页面之间共享语言值?


代码

首先我有一个过滤器,它指定页面的默认/初始语言。

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 是我的资源包的路径(我使用的是 Maven 的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>

【问题讨论】:

【参考方案1】:

您的过滤器会覆盖每个请求的所选语言。

您应该仅在用户未选择任何语言时设置默认语言。

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

但是,更好的是完全删除 servlet 过滤器并将&lt;c:set var="language"&gt; 中的pageContext.request.locale 替换为'ru'

<c:set var="language" value="$not empty param.language ? param.language : not empty language ? language : 'ru'" scope="session" />

【讨论】:

你是最棒的,感谢你的帮助:)

以上是关于在过滤器中设置默认语言后,JSP i18n 分别在每个页面上工作的主要内容,如果未能解决你的问题,请参考以下文章

defaultLocale 未在 Next.js i18n 中保留默认语言

在MyEclipse中设置jsp页面为默认utf-8编码

如何在JSP中设置文件上传中的默认值

MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码

如何在 Apache FOP 中设置默认语言

如何在JSP中设置WEB应用的默认访问页面