Spring MVC:多语言支持

时间:2013-10-09 12:34:11

标签: java spring spring-mvc

我正在使用spring MVC。在我的应用程序中,用户应该能够以多种语言发布评论/文本(英语,日本语,中文,波兰语等)。这些帖子也将存储在DB中。那么如何在我的UI端和服务器端启用多语言支持

我需要做些什么。我看到了一些国际化的例子,但我的困惑是它使用属性文件来存储每个单词的含义。这就是我如何存储每一个单词的问题。这是我需要的东西吗?一个例子就足够了

3 个答案:

答案 0 :(得分:2)

是的,你需要做的例子告诉你。您不必存储含义,但是您必须为要在UI中进行国际化的每个字符串都有一个属性。

您需要意识到Spring I18N示例仅处理不同语言的UI显示。数据库中的多语言需要单独的努力。

您需要比此处或网络上的示例更多的专业知识。

答案 1 :(得分:0)

大多数网站都有语言链接(例如英语为 en ,法语为 fr 等)。因此,您可以根据用户选择的语言链接对不同的语言进行排序。

另一种方法是进行某种自动检测,因此如果用户输入一些特定于某种语言的常用词,那么您可以突出显示自动选择的语言,并为用户提供覆盖选项自动检测并手动选择语言。一个很好的例子是Google的translate website

此外,请确保将前端到后端的每个组件都设置为UTF-8编码。也就是说,您的Web /应用程序服务器(例如Tomcat),您的应用程序框架(例如Spring)和您的数据库(包括您的IDE设置)以及包含jsp / html文件的所有文件都保存为UTF-8编码并声明了UTF-8(例如在你的jsp / html文件中有... <%@ page language="java" session="false" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >

答案 2 :(得分:0)

对于具有数据库用法的Spring l18n,扩展了AbstractMessageSource。 Java conifg:

    @Bean
    public MessageSource messageSource(){
        DataBaseMessageSource source = new DatabaseMessageSource();

        return source;
    }

    @Bean
    public LocaleResolver localeResolver(){
        SessionLocaleResolver resolver = new SessionLocaleResolver();
        resolver.setDefaultLocale(Locale.ENGLISH); //setup default locale
       return resolver;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        interceptor.setParamName("lang"); //will change current user locale when hit url with ?lang
        registry.addInterceptor(interceptor);
    }

public class DatabaseMessageBandle extends AbstractMessageSource {

@Autowired
private FooRepository fooRepo;


@Override
protected MessageFormat resolveCode(String code, Locale locale) {
    String message = getMessage(code, locale);

    MessageFormat messageFormat = createMessageFormat(message, locale);

    return messageFormat;
}

@Override
protected String resolveCodeWithoutArguments(String code, Locale locale) {
    return getMessage(code, locale);
}

private String getMessage(String code, Locale locale) {
   String message = fooRepo.getMeesageByCodeAndLocale(code, locale); //better not do this 
    return message;
}

}

如果您需要在控制器中获取当前区域设置:

@RequestMapping
public String index(Locale locale) {  //you will have it
//or use LocaleContextHolder.getLocale, and it will return current thread locale

return "index";
}