【问题标题】:Spring Boot i18n resolutionSpring Boot i18n 分辨率
【发布时间】:2018-01-05 08:51:15
【问题描述】:

我的 spring boot 应用程序中的 i18n 分辨率有问题。我有这个配置:

LocaleConfiguration.java 这里我将Locale.US设置为默认语言,将消息目录设置为“src/main/resources/messages”并使用locale参数更改语言。

package com.myproject.web.config;

import java.util.Locale;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

@Configuration
public class LocaleConfiguration extends WebMvcConfigurerAdapter {

    /**
     * Este bean se encargará de resolver que idioma (locale) esta siendo usado
     * actualmente
     * 
     * @return
     */
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.US);
        return slr;
    }

    /**
     * Este bean se encargara de interceptar el locale que venga a través del
     * parámetro locale de la url
     * 
     * @return
     */
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        lci.setParamName("locale");
        return lci;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

    /**
     * Registramos los filtros
     * 
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }

}

我的消息文件:

/src/main/resources/
----/messages/
-------->messages_es_ES.properties (Spanish message file)
-------->messages.properties (Default messages file. US)

当我进入我家时,我的应用程序显示:

??home.welcome_en_US??

看起来无法解析消息文件(甚至不是默认文件!)。我应该错过一些东西,但我找不到。有什么帮助吗?

解决方案


这里的问题是我使用的 Basename 路径,我必须在没有语言环境后缀和文件扩展名的类路径中定义完整路径(供我使用,这个):

@Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:messages/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

这将搜索 /src/main/resources/ --> 类路径 消息/消息 --> 基本名称 然后添加所需的后缀(“es_ES”、“en_US”..) 和文件扩展名“.properties”

【问题讨论】:

  • 请阅读有关baseName 含义的文档。这并不意味着你认为它意味着什么。
  • 看起来消息定义了属性文件的名称,而不是路径:) 感谢您指出正确的方向

标签: spring spring-boot internationalization


【解决方案1】:

对于任何类似的问题,这就是解决方案

这里的问题是我使用的 Basename 路径,我必须在没有语言环境后缀和文件扩展名的类路径中定义完整路径(供我使用,这个):

@Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:messages/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

这将在

中搜索

/src/main/resources/ --> 类路径

消息/消息 --> 基本名称

然后加上需要的后缀(“es_ES”、“en_US”..)

以及文件扩展名“.properties”

【讨论】:

    【解决方案2】:

    另一种让它以灵活方式工作的方法是使用属性初始化文件:application.properties,其中包含以下条目:

    spring.messages.basename=messages/messages
    

    第一个消息是 src\resources 中文件夹的名称。另一个例子,为了最终澄清,是一个名为 bundles 在 src\resources 中的目录,如下所示:

    spring.messages.basename=bundles/messages
    

    使用该配置,您不需要在 Springboot 主类中进行以下硬编码配置:

    ...
    messageSource.setBasename("classpath:messages/messages");
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多