我正在使用spring MVC。在我的应用程序中,用户应该能够以多种语言发布评论/文本(英语,日本语,中文,波兰语等)。这些帖子也将存储在DB中。那么如何在我的UI端和服务器端启用多语言支持
我需要做些什么。我看到了一些国际化的例子,但我的困惑是它使用属性文件来存储每个单词的含义。这就是我如何存储每一个单词的问题。这是我需要的东西吗?一个例子就足够了
答案 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";
}