`

SpringBoot thymeleaf 多语言显示

阅读更多

在日常开发中,如果涉及到网站需要多语言显示的话,那么利用Spring Boot要怎么做呢?又涉及到了哪些内容呢,下面是我开发中用的的一些记录。仅供参考。

 

我这边需要的语言有,假定需要的语言有:中文zh,英文en

使用到的主要技术有:SpringBoot,Thymeleaf,

关键的类:CookieLocaleResolver,LocaleChangeInterceptor,WebMvcConfigurerAdapter的addInterceptors

另外很多内容都是参照: http://412887952-qq-com.iteye.com/blog/2312274

这个关于SpringBoot讲解的很全面了。

 

1、首先我们先定义国际化资源文件,spring boot默认就支持国际化的,而且不需要你过多的做什么配置,只需要在resources/下定义国际化配置文件即可

如果想修改文件的位置,可以在application.properties中定义

 

spring.messages.basename=message/messages

 

那么messages_en.properties,messages_zh.properties 就可以放到resources/message文件夹下了

 

上面链接的博客中是使用

 

@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter {
@Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("message/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}

 

 

   

@Autowired
protected MessageSource messageSource;

String msg = messageSource.getMessage("welcome", null,locale);

 

 

这种形式,然后put到前台,但是这种如果前台全是静态的页面,都通过put形式未免太麻烦了。有没有什么其他方式呢?

 

 

 

thymeleaf支持#{welcome}形式读取message信息。

 

那么就可以使用LocaleChangeInterceptor 拦截器,来拦截语言的变化,然后CookieLocaleResolver设置cookie,前段也自然就跟着变化了。

 

 

@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter {
   @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");
        return lci;
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

 这样,就可以捕获浏览器地址栏lang参数的变化了

 

 http://localhost:8080/index?lang=zh

 http://localhost:8080/index?lang=en

通过查看拦截器的源码可以看到:

 

@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws ServletException {

		String newLocale = request.getParameter(getParamName());
		if (newLocale != null) {
			if (checkHttpMethod(request.getMethod())) {
				LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
				if (localeResolver == null) {
					throw new IllegalStateException(
							"No LocaleResolver found: not in a DispatcherServlet request?");
				}
				try {
					localeResolver.setLocale(request, response, parseLocaleValue(newLocale));
				}
				catch (IllegalArgumentException ex) {
					if (isIgnoreInvalidLocale()) {
						logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage());
					}
					else {
						throw ex;
					}
				}
			}
		}
		// Proceed in any case.
		return true;
	}

 

 

LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
这句如果没有特意指定localeResolver 的话,在执行过程中会报错:
java.lang.UnsupportedOperationException:
     Cannot change HTTP accept header - use a different locale resolution strategy
     ...AcceptHeaderLocaleResolver.setLocale(AcceptHeaderLocaleResolver.java:45)

原因是:

In Spring MVC application, if you do not configure the Spring’s LocaleResolver, it will use the default AcceptHeaderLocaleResolver, which does not allow to change the locale. To solve it, try declare a SessionLocaleResolver bean in the Spring bean configuration file, it should be suits in most cases.

 

<beans ...

	<bean id="localeResolver"
		class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
		<property name="defaultLocale" value="en" />
	</bean>

	<bean id="localeChangeInterceptor"
		class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
		<property name="paramName" value="language" />
	</bean>

	<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
		<property name="interceptors">
			<list>
				<ref bean="localeChangeInterceptor" />
			</list>
		</property>
	</bean>

</beans>

  咱们使用的是SpringBoot,所以可以通过注解@Bean的形式注入一个localeResolver

@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter {
   @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("lang");
        return lci;
    }
@Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver cl = new CookieLocaleResolver();
        cl.setCookieName("language");
        return cl;
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

 

  此处用的是Cookie记录,所以注入Cookie,当然也可以Session什么的,自己随意。

 

 

通过以上,就可以通过在浏览器lang的切换,然后页面显示不同配置的语言了。

 

但是现在开发中语言设置一般遵循restful的风格,即访问地址为:

http://localhost:8080/en/

http://localhost:8080/zh/

这种形式,这样LocaleChangeInterceptorgetParameter就获取不到lang了。

所以就需要自己重新写一个拦截器,只需要继承LocaleChangeInterceptor,然后覆写preHandle即可。

 

 

@Component
public class LanguageInterceptor extends LocaleChangeInterceptor {
    @Autowired
    private LocaleResolver localeResolver;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws ServletException {
        //获取   @pathvariable  的参数  /{lang}
        Map map = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
        String lang = MapUtils.getString(map, "lang", "");
        Locale l = new Locale(lang);
        localeResolver.setLocale(request, response, l);
    }
}

 只要在localeResolver中设置了Locale,那么就是按照Locale的语言进行显示了。

然后修改addInterceptors

 

@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter {
   @Autowired
    private LanguageInterceptor languageInterceptor;
   
   @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver cl = new CookieLocaleResolver();
        cl.setCookieName("language");
        return cl;
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(languageInterceptor);
    }
}

 

 

 

分享到:
评论

相关推荐

    springboot整合thymeleaf模板

    7. **国际化支持**:Thymeleaf可以配合Spring的`MessageSource`实现多语言支持,通过`#{key}`语法引用资源文件中的消息。 8. **表单处理**:Thymeleaf的`th:field`、`th:error`等标签可以方便地与Spring表单绑定,...

    一个基于SpringBoot+Thymeleaf渲染的图书管理系统

    以上是基于SpringBoot+Thymeleaf实现图书管理系统的概述,实际项目中还可能涉及到更多的技术细节,如使用Maven或Gradle进行依赖管理,使用Git进行版本控制,以及单元测试、集成测试等最佳实践。通过这个系统,开发者...

    springboot+thymeleaf.zip

    SpringBoot与Thymeleaf是两个非常流行的Java技术框架,它们在现代Web开发中有着广泛的应用。SpringBoot简化了Spring框架的配置,使得开发者能够快速搭建一个运行的Web应用。而Thymeleaf则是一个服务器端的模板引擎,...

    springboot整合thymeleaf,下载即用

    6. **国际化支持**:Thymeleaf可以通过`th:i18n`属性支持多语言,配合Spring Boot的国际化配置,可以轻松实现不同语言的页面内容切换。 7. **Thymeleaf缓存**:Thymeleaf允许开发者配置模板的缓存策略,以提高性能...

    SpringBoot整合Jpa和Thymeleaf实现CRUD

    SpringBoot2带来了更多改进和新特性,例如更好的Actuator监控、健康检查和Spring Cloud的集成。 2. **JPA(Java Persistence API)**: JPA是Java平台上的ORM(对象关系映射)规范,它允许开发者用面向对象的方式来...

    springboot- thymeleaf-tiles-demo

    Thymeleaf 2.x版本支持表达式语言和条件语句,可以方便地与SpringBoot结合,实现动态数据的渲染。它的优点在于代码清晰,易于阅读,同时在开发阶段可以直接在浏览器中查看静态HTML,提高了开发效率。 Tiles,全名...

    SpringBoot中使用Thymeleaf的常用功能代码

    在Spring Boot框架中,Thymeleaf是一款非常流行的模板引擎,用于处理动态HTML内容。...在`SpringBoot_thymeleaftest`项目中,你可以找到具体的代码示例,进一步加深对Thymeleaf在Spring Boot中的应用理解。

    Java学习资料-SpringBoot自带模板引擎Thymeleaf使用详解

    Thymeleaf 可以配合 Spring Boot 的多语言支持,通过 `th:text="#{message.key}"` 访问消息资源文件中的本地化字符串。 8. **集成其他技术**: Thymeleaf 可以与其他技术(如 Spring Security)无缝集成,例如,`...

    springboot + thymeleaf配置

    Thymeleaf的强大之处在于它的表达式语言(EL),它支持条件判断、循环、逻辑运算等功能,使得模板文件可以编写出复杂的业务逻辑。同时,Thymeleaf还支持国际化、表单处理、标签库等特性,大大提高了开发效率。 在...

    基于SpringBoot及thymeleaf搭建的疫情信息管理系统.zip

    总的来说,"基于SpringBoot及thymeleaf搭建的疫情信息管理系统"是一个综合性的Web开发项目,涵盖了后端开发、前端展示、数据库操作、数据分析等多个方面,是学习和实践Java Web开发技术的优秀实例。通过这个项目,...

    springboot用thymeleaf模板引擎

    - 国际化:Thymeleaf支持多语言切换,方便构建全球化应用。 6. **最佳实践** - 分离模板和静态资源:将CSS、JavaScript等静态资源放在单独的目录下,避免与模板文件混淆。 - 使用Thymeleaf的条件和循环结构,...

    基于springboot +mybatis +thymeleaf 的学生信息管理系统

    系统基于Java编程语言,采用SpringBoot框架,结合MyBatis持久层框架和Thymeleaf模板引擎,打造了一个完整的后端服务和前端展示平台。 SpringBoot是Spring框架的简化版本,它极大地简化了Spring应用的初始搭建以及...

    springboot-thymeleaf素材.rar

    - **国际化支持**:Thymeleaf可以轻松实现多语言切换。 - **条件和循环**:在模板中,可以使用`th:if`,`th:each`等进行逻辑控制。 3. **文件结构**: - **css**:存放CSS样式文件,用于定义页面的布局和样式。 ...

    idea+springboot+thymeleaf

    - **国际化**:通过`th:text`、`th:title`等属性处理多语言内容。 在压缩包中的"demo10"可能是一个示例项目,包含了以下组成部分: - `pom.xml`:Maven或Gradle的构建文件,定义项目依赖和构建过程。 - `src/main/...

    基于SpringBoot+Thymeleaf的招聘系统.zip

    这个系统的设计和实现涵盖了Java Web开发的多个重要知识点,包括SpringBoot的自动配置、Thymeleaf的模板引擎、数据库操作以及安全控制,对于初学者和有经验的开发者来说,都是一个极好的学习和实践案例。通过深入...

    一个简单的springboot整合thymeleaf#资源达人分享计划#

    5. **国际化**:支持多语言,可以使用`th:text`和`th:utext`结合`#{message.key}`来实现。 6. **集成其他技术**:Thymeleaf可以与SpringMVC、SpringBoot等框架无缝集成,也可以与JavaScript、jQuery等前端技术配合...

    SpringBoot+Thymeleaf 系统查询工具

    本项目名为“SpringBoot+Thymeleaf 系统查询工具”,它旨在解决多模块项目中复杂查询的问题,提供一个高效、便捷且灵活的解决方案。 SpringBoot简化了Spring框架的配置和启动过程,使得开发人员可以快速地搭建应用...

    基于springboot+thymeleaf的理财管理系统源码.zip

    3. 支持国际化:Thymeleaf内置了对多语言的支持,可以轻松实现理财管理系统的国际化功能。 4. 与Spring Boot集成:Thymeleaf可以与Spring Boot的ModelAndView或Model接口完美配合,方便地将后端数据传递到前端展示。...

    Springboot+thymeleaf动吧旅游管理系统代码

    3. **国际化支持**:Thymeleaf支持多语言,对于一个面向全球用户的旅游管理系统来说,这是一项重要的功能。 4. **条件和循环**:在模板中,Thymeleaf的条件和循环语句有助于根据业务逻辑生成不同的内容。 标签中...

    基于springboot +thymeleaf 的小米商城管理系统.zip

    总的来说,这是一个涵盖Web开发多个方面的综合项目,涉及到的技术包括SpringBoot框架、Thymeleaf模板引擎、Java编程、数据库设计与管理、以及可能的其他辅助框架和服务。对于学习和理解Java Web开发,特别是...

Global site tag (gtag.js) - Google Analytics