Discuss / Java / 老大写的createExtension好像就是pebbletemplate已实现的功能SpringExtension,代码高度相似

老大写的createExtension好像就是pebbletemplate已实现的功能SpringExtension,代码高度相似

Topic source

我们可以直接把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添加一个别名:

    @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 )也不行

强颜欢笑

#3 Created at ... [Delete] [Delete and Lock User]

感谢!!!

向SpringExtension注入MessageSource其实可以直接写成这样:new SpringExtension(messageSource)


  • 1

Reply