我有点困惑,因为我有一个工作系统,但我无法获得实际/当前的语言环境。
工作系统就是这样:
例如来自:http://www.mkyong.com/spring-mvc/spring-mvc-internationalization-example/
一些messages.properties文件,
带有以下内容的servlet-context.xml文件:
<!-- Additional i18n -->
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="en" />
</bean>
<bean id="translationService" class="inbiz.webapp.service.TranslationService">
</bean>
<alias name="translationService" alias="t" />
<mvc:interceptors>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
</mvc:interceptors>
<!-- END: Additional i18n -->
对于TranslationService(即使与问题检查没有直接关系也是:java spring mvc @service method: nullpointerexception | newbie and translation)
这显然已经使所有事情都在第一个链接的内部工作。所以我可以这样做:
<a href="" th:text="#{help}">Help</a>
这是thymeleaf(http://www.thymeleaf.org/),但与JSP或JSF基本相同。消息加载了正确的语言环境。
但对于我的TranslationService,我需要像消息包一样获取语言环境。
关注:https://templth.wordpress.com/2010/07/21/configuring-locale-switching-with-spring-mvc-3/,我设置了此过滤器:
package inbiz.webapp.filters;
import java.io.IOException;
import java.util.Map;
import java.util.Locale;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.filter.OncePerRequestFilter;
public class LocaleConfigurerFilter extends OncePerRequestFilter {
private LocaleResolver localeResolver;
protected void initFilterBean() throws ServletException {
Locale locale;
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
Map resolvers = wac.getBeansOfType(LocaleResolver.class);
if (resolvers.size()==1) {
localeResolver = (LocaleResolver) resolvers.values().iterator().next();
}
locale = LocaleContextHolder.getLocale();
System.out.println("DEBUG FILTER LOCALE LCH - INIT: "+locale);
}
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain)
throws IOException, ServletException {
Locale locale;
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
Map resolvers = wac.getBeansOfType(LocaleResolver.class);
if (resolvers.size()==1) {
localeResolver = (LocaleResolver) resolvers.values().iterator().next();
}
if (localeResolver!=null) {
locale = localeResolver.resolveLocale(req);
System.out.println("DEBUG FILTER LOCALE LRS: "+locale);
LocaleContextHolder.setLocale(locale);
}
locale = LocaleContextHolder.getLocale();
System.out.println("DEBUG FILTER LOCALE LCH: "+locale);
locale = RequestContextUtils.getLocale((HttpServletRequest) req);
System.out.println("DEBUG FILTER LOCALE RCU: "+locale);
LocaleContextHolder.setLocale(locale);
chain.doFilter(req, res);
}
}
调用过滤器,但输出只是:
DEBUG FILTER LOCALE LCH - INIT: en_US
DEBUG FILTER LOCALE LCH: en_US
DEBUG FILTER LOCALE RCU: en_US
DEBUG FILTER LOCALE LCH: en_US
DEBUG FILTER LOCALE RCU: en_US
DEBUG FILTER LOCALE LCH: en_US
DEBUG FILTER LOCALE RCU: en_US
即使使用以下内容调用任何页面:?lang = it_IT
(确实适用于messages.properties)
我很抱歉这可能是太多的信息...但正如我所说,我在理解谁保持实际的语言环境方面有点迷失。此外,下一步是从用户配置文件设置区域设置,但如果用户未登录,则需要受控制的默认值。
所以最后一个问题:我如何获得语言环境?
我认为,我错过了一些基本要点......解决方案只是一条线。但是目前我已经完成了我的&#34; web&#34;资源..;)也许是一个错误的搜索..
另一方面,我提供了一些信息,以便它可能有所帮助 其他人试图实现&#34; gnu gettext&#34;版本
答案 0 :(得分:7)
首先,让我们考虑如何在Spring上下文中注册LocaleResolver
(注意,默认语言环境已设置):
@Configuration
@EnableWebMvc
@ComponentScan(value = "com.locales.package")
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean(name = "localeResolver")
public LocaleResolver getLocaleResolver(){
CookieLocaleResolver localeResolver = new CookieLocaleResolver();
localeResolver.setDefaultLocale(Locale.ENGLISH);
return localeResolver;
}
...
// Other beans
...
}
最后在我们的控制器(或其他地方),我们可以获得当前的语言环境:
@Autowired
private LocaleResolver localeResolver;
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView resolveLocale(ModelMap model, HttpServletRequest request) {
Locale locale = localeResolver.resolveLocale(request);
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("currentLocale", locale.getDisplayLanguage());
return modelAndView;
}
然后我们可以在JSP
(index.jsp)显示结果:
<h1>Current locale = ${currentLocale}</h1>
答案 1 :(得分:2)
尝试使用我在JSP中使用的以下代码来显示语言环境:
${pageContext.response.locale}
答案 2 :(得分:0)
一旦你的Spring Boot i18n配置为消息工作,你可以通过这种方式使用Thymeleaf获得当前的语言环境:
<input th:value="${#locale.language}"/>
价值得像:“en”。
当然你可以使用另一个有效标签或者:组合;)
希望它有所帮助!