我们可以直接把pebble-spring已经实现的SpringExtension拿来用:
@Bean public SpringExtension springExtension() { return new SpringExtension(); } @Bean public PebbleEngine pebbleEngine() { return new PebbleEngine.Builder().autoEscaping(true) // cache: .cacheActive(false) // loader: .loader(this.templateLoader()) // extension: .extension(this.springExtension()) // build: .build(); }
但是有一个问题是怎么给这个springExtension注入我们的MessageSource,这个问题我折腾了一天,发现springExtension有一个private成员字段MessageSource,没有setter方法没有带这个参数的构造方法(下个版本就会有了),只能field注入,折腾了半天发现其实只要给我们的MessageSource bean添加一个@Primary注解就可以了:
@Bean("i18n") @Primary MessageSource createMessageSource() { var messageSource = new ResourceBundleMessageSource(); messageSource.setDefaultEncoding("UTF-8"); messageSource.setBasename("messages"); return messageSource; }
这样Spring给其他组件注入MessageSource时除非注入时指定别名,都会优先注入我们的MessageSource。
然后在模板里,我们可以直接使用MessageSourceFunction定义的函数message(...),用法和廖大的_(...)函数基本一致:
<h5>{{ message('copyright', 2019) }}</h5>
(参见https://pebbletemplates.io/wiki/guide/spring-integration/)
还有就是spring还自带了一个通过GET请求参数传递并修改locale的LocaleChangeInterceptor:
@Override public void addInterceptors(InterceptorRegistry registry) { LocaleChangeInterceptor l = new LocaleChangeInterceptor(); l.setParamName("lang"); registry.addInterceptor(l); }
可以代替MvcInterceptor和LocaleController组合,直接通过类似request_url/?lang=en方式修改locale,他的要点则是需要注入我们自己的CookieLocaleResolver作为他的LocaleResolver,办法也很简单,给我们的bean添加一个别名:
request_url/?lang=en
@Bean("localeResolver") LocaleResolver createLocaleResolver() { var clr = new CookieLocaleResolver(); clr.setDefaultLocale(Locale.ENGLISH); clr.setDefaultTimeZone(TimeZone.getDefault()); return clr; }
就行了(参见https://zhuanlan.zhihu.com/p/138375291)
另外其实pebble内置了一个i18n函数,和message也大致相同,不同的是没有用到ResourceBundleMessageSource,需要我们在用的时候给出bundle名,如:
<h5>{{ i18n("messages", "copyright", 2020) }}</h5>
最后我发现默认语言资源文件不等于en资源文件,需要启用英语还需要添加一个messages_en.properties(messages_en_US.properties )也不行
详细修改见https://github.com/tzwjkl/spring-web-mvc-i18n
感谢!!!
向SpringExtension注入MessageSource其实可以直接写成这样:new SpringExtension(messageSource)
Sign in to make a reply
SNH48-刘慈欣
我们可以直接把pebble-spring已经实现的SpringExtension拿来用:
但是有一个问题是怎么给这个springExtension注入我们的MessageSource,这个问题我折腾了一天,发现springExtension有一个private成员字段MessageSource,没有setter方法没有带这个参数的构造方法(下个版本就会有了),只能field注入,折腾了半天发现其实只要给我们的MessageSource bean添加一个@Primary注解就可以了:
这样Spring给其他组件注入MessageSource时除非注入时指定别名,都会优先注入我们的MessageSource。
然后在模板里,我们可以直接使用MessageSourceFunction定义的函数message(...),用法和廖大的_(...)函数基本一致:
(参见https://pebbletemplates.io/wiki/guide/spring-integration/)
还有就是spring还自带了一个通过GET请求参数传递并修改locale的LocaleChangeInterceptor:
可以代替MvcInterceptor和LocaleController组合,直接通过类似
request_url/?lang=en
方式修改locale,他的要点则是需要注入我们自己的CookieLocaleResolver作为他的LocaleResolver,办法也很简单,给我们的bean添加一个别名:就行了(参见https://zhuanlan.zhihu.com/p/138375291)
另外其实pebble内置了一个i18n函数,和message也大致相同,不同的是没有用到ResourceBundleMessageSource,需要我们在用的时候给出bundle名,如:
最后我发现默认语言资源文件不等于en资源文件,需要启用英语还需要添加一个messages_en.properties(messages_en_US.properties )也不行