Spring Boot i18n 解析

问题描述 投票:0回答:3

我的 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??

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

解决方案


这里的问题是我使用的基本名称路径,我必须在类路径中定义完整路径,没有区域设置后缀和文件扩展名(对于我的使用,这个):

@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”

spring spring-boot internationalization
3个回答
3
投票

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

这里的问题是我使用的基本名称路径,我必须在类路径中定义完整路径,没有区域设置后缀和文件扩展名(对于我的使用,这个):

@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”


0
投票

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

spring.messages.basename=messages/messages

第一条消息是 src 内文件夹的名称 资源。其他示例,为了最终澄清,是 src 内名为 bundles 的目录 资源,像这样:

spring.messages.basename=bundles/messages

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

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

0
投票

我正在使用 Spring Boot 2.7.18 和

ResourceBundleMessageSource
。就我而言,解决方案是完全删除
classpath:
部分。之后,资源包和代码就被正确找到并解决了。

Java配置:

@Bean
public MessageSource messageSource()
{
    ResourceBundleMessageSource source = new ResourceBundleMessageSource();
    source.setBasename("i18n/messages");
    source.setDefaultEncoding(StandardCharsets.UTF_8.name());
    source.setDefaultLocale(Locale.ENGLISH);
    return source;
}

房产档案:

/src/main/resources/i18n/messages_en.properties
© www.soinside.com 2019 - 2024. All rights reserved.