JSP 在过滤器中设置默认语言后,i18n 分别在每个页面上工作
JSP i18n works on each page separately after setting default language in filter
简介
我正在尝试国际化 (i18n) 我的 Java Web 应用程序,它基于基本的 JSP/Servlets.
我正在使用 JSTL fmt taglib
结合 Resource Bundle
来实现 i18n我的申请。我也在关注 this answer/guide.
问题与问题
当我在某个页面上选择所需的语言时 例如 index.jsp
,然后该页面会根据所选语言进行翻译,但是当我经过一些 link 例如 signup.jsp
然后语言更改为默认语言,因此 i18n 在每个页面上单独工作。
问题 是如何在所有页面之间共享语言值?
代码
首先,我有一个过滤器,它指定页面的 default/initial 语言。
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>
<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>
您的过滤器在每次请求时都会覆盖所选语言。
您应该仅在用户未选择任何语言时设置默认语言。
if (req.getSession().getAttribute("language") == null) {
req.getSession().setAttribute("language", "ru");
}
但是,更好的办法是完全删除 servlet 过滤器,并将 <c:set var="language">
中的 pageContext.request.locale
替换为 'ru'
。
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : 'ru'}" scope="session" />
简介
我正在尝试国际化 (i18n) 我的 Java Web 应用程序,它基于基本的 JSP/Servlets.
我正在使用 JSTL fmt taglib
结合 Resource Bundle
来实现 i18n我的申请。我也在关注 this answer/guide.
问题与问题
当我在某个页面上选择所需的语言时 例如 index.jsp
,然后该页面会根据所选语言进行翻译,但是当我经过一些 link 例如 signup.jsp
然后语言更改为默认语言,因此 i18n 在每个页面上单独工作。
问题 是如何在所有页面之间共享语言值?
代码
首先,我有一个过滤器,它指定页面的 default/initial 语言。
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>
<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>
您的过滤器在每次请求时都会覆盖所选语言。
您应该仅在用户未选择任何语言时设置默认语言。
if (req.getSession().getAttribute("language") == null) {
req.getSession().setAttribute("language", "ru");
}
但是,更好的办法是完全删除 servlet 过滤器,并将 <c:set var="language">
中的 pageContext.request.locale
替换为 'ru'
。
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : 'ru'}" scope="session" />