我正在使用弹簧 MVC。在我的应用程序中,用户应该能够以多种语言(英语、日语、汉语、波兰语等)发布评论/文本。这些帖子也将存储在数据库中。那么如何在我的 UI 端和服务器端启用多语言支持
我需要做什么。我看到了一些国际化示例,但我的困惑是它使用属性文件来存储每个单词的含义。这就是我如何存储每个单词的问题。这是我需要的东西吗?一个例子就足够了
我正在使用弹簧 MVC。在我的应用程序中,用户应该能够以多种语言(英语、日语、汉语、波兰语等)发布评论/文本。这些帖子也将存储在数据库中。那么如何在我的 UI 端和服务器端启用多语言支持
我需要做什么。我看到了一些国际化示例,但我的困惑是它使用属性文件来存储每个单词的含义。这就是我如何存储每个单词的问题。这是我需要的东西吗?一个例子就足够了
是的,你需要按照例子告诉你的去做。您不必存储含义,但您必须为要在 UI 中国际化的每个字符串拥有一个属性。
您需要意识到 Spring I18N 示例仅处理不同语言的 UI 显示。数据库中的多语言将需要单独的努力。
您需要比从此处或网络上的示例中获得的更多专业知识。
大多数网站都有语言链接(即en表示英语,fr表示法语等)。因此,您根据用户选择的语言链接对不同的语言进行分类。
另一种方法是进行某种自动检测,因此如果用户输入了一些专门属于某种语言的常用词,那么您可以突出显示自动选择的语言,并为用户提供覆盖自动选择的选项。检测并手动选择语言。一个很好的例子是谷歌的翻译网站。
此外,请确保从前端到后端的每个组件都设置为 UTF-8 编码。也就是说,您的 Web/应用程序服务器(例如 Tomcat)、您的应用程序框架(例如 Spring)和您的数据库(包括您的 IDE 设置)以及包括 jsp/html 文件在内的所有文件都保存为 UTF-8 编码并声明了 UTF-8(例如拥有...<%@ 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" >
在您的 jsp/html 文件中)。
对于使用数据库的 Spring l18n 扩展 AbstractMessageSource。Java配置:
@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";
}