在运行时设置弹簧固定语言环境解析器(用于i18n)默认语言环境

时间:2013-05-22 14:29:26

标签: java spring spring-mvc internationalization locale

我目前正在使用Spring Framework创建一个java Web应用程序。我的应用程序有一个管理员帐户和几个普通用户帐户。我希望我的管理员帐户能够通过从管理站点选择语言来选择应该在哪种语言中解析应用程序。

它以这种方式工作: 1.管理员转到管理页面,在那里他可以选择应该呈现应用程序的语言。 2.当他选择保存设置按钮时,他会更新我在Web应用程序类路径中的属性文件。

我的问题是,在使用新语言更新此属性文件时,我无法在运行时更改语言环境。它仍然使用旧语言。我使用的是fixedLocaleResolver,因为我已经读过每个用户的cookie和会话都不同。

这是我的代码

配置文件

//Other code omitted

@PropertySource("classpath:/configuration/system.properties")
public class DefaultWebConfigurationContext extends WebMvcConfigurationSupport {

    @Autowired
    Environment env;

    @Bean
    public LocaleResolver localeResolver() {
        FixedLocaleResolver localeResolver = new FixedLocaleResolver();
        localeResolver.setDefaultLocale(new Locale(env.getProperty("system.default.language")));
        return localeResolver;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/languages/lang");
        messageSource.setUseCodeAsDefaultMessage(true);
        return messageSource;
    }
//Other code omitted

system.properties

system.default.language=en

我希望你们中的任何人都可以指导我如何使这个功能正常工作,所以管理员可以更改语言环境,而不必停止tomcat服务器,手动更改system.properties,以及开始再次使用tomcat服务器。


我的解决方案(23-05-2013) 我被告知要实现我自己的LocaleResolver,我已经完成了。到目前为止它似乎工作,所以我将在这里选择自定义Locale Resolver的解决方案

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Locale;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.LocaleResolver;
/**
 *
 * @author Martin Rohwedder
 * @since 23-05-2013
 * @version 1.0
 */
public class PropertyLocaleResolver implements LocaleResolver {

    private Properties prop = new Properties();
    private Locale defaultLocale = Locale.getDefault();

    public void setDefaultLocale(Locale locale) {
        this.defaultLocale = locale;
    }

    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        return this.defaultLocale;
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale)     {
        try {
            this.prop.load(new FileInputStream("classpath:/configuration/system.properties"));
            this.defaultLocale = new Locale(this.prop.getProperty("system.default.language"));
        }
        catch (IOException e) {
            this.defaultLocale = (defaultLocale != null ? defaultLocale : Locale.getDefault());
        }
    }

}

1 个答案:

答案 0 :(得分:1)

实现您自己的LocaleResolver,该LocaleResolver保存当前区域设置并具有admin更新。