我在github上的项目:https://github.com/QuentinVaut/JavaquariumEE
我跟随很多讲不同内容的教程,我试图实现教程中的解决方案,但没有错,我理解为什么。
你能告诉我我的项目有什么问题并解释一下吗?
许多教程和Github示例中的一个:
http://memorynotfound.com/spring-mvc-internationalization-i18n-example/
答案 0 :(得分:6)
我粗略地看了一下这个教程。我将如何做到这一点:
首先配置它:
在配置类中创建一个返回MessageSource的Bean 实现。
@Bean
public MessageSource messageSource() //The bean must be named messageSource.
{
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
messageSource.setCacheSeconds(-1); //cache time in seconds was set to -1. This disables reloading and makes the message source cache messages forever (until the JVM restarts).
messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
messageSource.setBasenames(
"/WEB-INF/i18n/messages", "/WEB-INF/i18n/errors"); //the message source is configured with the basenames /WEB-INF/i18n/messages and /WEB-INF/i18n/errors. This means that the message source will look for filenames like /WEB-INF/i18n/messages_en_US.properties, /WEB-INF/i18n/errors_fr_FR.properties
return messageSource;
}
现在创建一个返回LocaleResolver的bean:
@Bean
public LocaleResolver localeResolver() //The bean must be named localeResolver.
{
return new SessionLocaleResolver();
}
这使得LocaleResolver可用于DispatcherServlet执行的任何代码。这意味着其他非视图JSP无法访问LocaleResolver。要解决此问题,您可以创建一个过滤器并将其设置如下:
private ServletContext servletContext;
private LocaleResolver = new SessionLocaleResolver();
@Inject MessageSource messageSource;
...
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
request.setAttribute(
DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver
);
JstlUtils.exposeLocalizationContext(
(HttpServletRequest)request, this.messageSource
);
现在您需要配置处理程序拦截器:
您在配置类中覆盖WebMvcConfigurerAdapter的addInterceptors方法,以设置LocaleChangeInterceptor(或任何其他拦截器)。
@Override
public void addInterceptors(InterceptorRegistry registry)
{
super.addInterceptors(registry);
registry.addInterceptor(new LocaleChangeInterceptor());
}
现在您可以在控制器上使用@Injected LocaleResolver。您只需在解析程序上调用setLocale即可更新当前语言环境。
编辑:更具体的示例:
假设您有一个简单的控制器:
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(Map<String, Object> model)
{
model.put("date", new Date());
model.put("alerts", 12);
model.put("numCritical", 0);
model.put("numImportant", 11);
model.put("numTrivial", 1);
return "home/index";
}
然后说你在/ WEB-INF / i18n /下面有messages_en_US.properties文件。此属性文件包含本地化为美国英语的消息。
title.alerts =服务器提醒页面
alerts.current.date =当前日期和时间:
number.alerts =有{0,选择,0#没有警报| 1#是一个警报| 1
alert.details = {0,choice,0#没有警报| 1#一个警报是| 1&lt; {0,number,integer}&gt; \ 警报是关键的。 {1,选择,0#没有警报| 1#一个警报是| 1&lt; {1,number,\ 整数}警报是重要的。 {2,选择,0#没有警报| 1#一个警报\ 是| 1&lt; {2,数字,整数}警报是微不足道的。
然后,假设您在/ WEB-INF / i18n /下有messages_es_MX.properties文件,并且此文件包含本地化的消息 墨西哥西班牙语。
title.alerts = ServerAlertasPágina
alerts.current.date = Fecha y hora actual: number.alerts = {0,choice,0#No hay alertas | 1#Hay una alerta | 1
alert.details = {0,choice,0#No hay alertassoncríticos| 1#Una alerta es \ crítica| 1&lt; {0,number,integer} alertassoncríticos}。 \ {1,选择,0#No hay alertas son importantes | 1#Una alerta es importante \ | 1&lt; {1,number,integer} alertas son importantes}。 \ {2,选择,0#没有干草警报儿子琐事| 1#Una alerta esvvial \ | 1&lt; {2,number,integer} alertas son triviales}。
现在,您需要在JSP中使用<spring:message>
标记来翻译英语和西班牙语。这就是你的jsp页面的样子:
<spring:htmlEscape defaultHtmlEscape="true" />
<%--@elvariable id="date" type="java.util.Date"--%>
<%--@elvariable id="alerts" type="int"--%>
<%--@elvariable id="numCritical" type="int"--%>
<%--@elvariable id="numImportant" type="int"--%>
<%--@elvariable id="numTrivial" type="int"--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<title><spring:message code="title.alerts" /></title>
</head>
<body>
<h2><spring:message code="title.alerts" /></h2>
<i><fmt:message key="alerts.current.date">
<fmt:param value="${date}" />
</fmt:message></i><br /><br />
<fmt:message key="number.alerts">
<fmt:param value="${alerts}" />
</fmt:message><c:if test="${alerts > 0}">
<spring:message code="alert.details">
<spring:argument value="${numCritical}" />
<spring:argument value="${numImportant}" />
<spring:argument value="${numTrivial}" />
</spring:message>
</c:if>
</body>
</html>
答案 1 :(得分:1)
在我的application.properties中,我添加了这一行:
spring.messages.basename=i18n/messages
spring.messages.cache-seconds=-1
spring.messages.encoding=UTF-8
您可以使用此删除MessageSource bean。
在我使用之前
<spring:message code="javaquarium.welcome" text="default text" />
但我的thymleaf需要这一行:
<h1 th:text="#{javaquarium.welcome}"></h1>
现在来自messages.properties的消息显示正确。