0

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

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

4

3 回答 3

2

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

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

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

于 2013-10-09T12:37:00.937 回答
0

大多数网站都有语言链接(即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 文件中)。

于 2013-10-09T13:14:40.277 回答
0

对于使用数据库的 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";
}
于 2015-11-21T22:26:10.630 回答