2013-10-09 134 views
0

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

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

+0

多语言支持不涉及翻译用户的内容,只是内容提供由应用程序。如果用户使用波兰语进行评论,则所有其他用户都将看到波兰语评论,无论他们选择了哪种语言。 – Qwerky

+0

所以如果已经设置了UTF-8编码并且在数据库中存储任何语言的用户类型。当我在没有做任何额外工作的情况下将它显示在网页上时,我会得到同样的结果吗? – manish

回答

1

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

你需要认识到Spring I18N的例子只涉及不同语言的UI显示。数据库中的多语言将需要单独的努力。

你需要更多的专业知识,比你从这里或网上的例子中得到的更多。

+0

我们可以管理UI部分,因为它的数量是固定的。所以这不是一个大问题。问题开始如何管理帖子,评论?如果有人写波兰语,它应该在页面上显示波兰语......但如何:( – manish

+0

他们的浏览器语言环境将必须设置为波兰语。您必须编码适当的内容,这不是微不足道的,你需要了解Unicode和编码的前后向。 – duffymo

0

网站大多具有语言链接(即EN英语,FR为法语等)。因此,根据用户选择的语言链接,您可以找出不同的语言。

另一种方法是进行某种自动检测,因此如果用户输入某些特定语言的常用单词,则可以突出显示自动选择的语言,并且还可以让用户选择重写自动检测并手动选择语言。一个很好的例子就是谷歌的translate website

此外,请确保从前端到后端的每个组件均设置为UTF-8编码。也就是说,您的Web /应用程序服务器(例如Tomcat),您的应用程序框架(例如Spring)和您的数据库(包括IDE设置),并且包括jsp/html文件的所有文件都保存为UTF-8编码并声明UTF-如在您的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" >)。

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"; 
}