Java中的国际化多语言本地化
我正在尝试用Java本地化一个程序
package javaapplication8;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
public class LanguageController {
private final Map supportedLanguages;
private final ResourceBundle translation;
public LanguageController(String language){
supportedLanguages = new HashMap();
supportedLanguages.put("English",Locale.ENGLISH);
supportedLanguages.put("Italiano",Locale.ITALIAN);
//here I get error
translation = ResourceBundle.getBundle("language", supportedLanguages.get(language));
}
public String getWord(String keyword)
{
return translation.getString(keyword);
}
}
在课堂上,我试着用意大利语和英语两种不同的语言打印一个单词。我有两个礼节档案
- 语言。礼节
- 语言就是它。礼节
在课堂上:
LanguageController langController_it = new LanguageController("Italiano");
System.out.println(langController_it.getWord("Option"));
LanguageController langController_en = new LanguageController("English");
System.out.println(langController_en.getWord("Option"));
编辑:第一个问题解决方案java.util.MissingResourceException: Can't find bundle for base name 'property_file name', locale en_US
我在那行仍然有错误supportedLanguages.get(language)
# 1 楼答案
你的申请(以及你的问题)有几个问题
首先,不要使用参数化集合:
此映射将始终返回
Object
,但getBundle()
方法具有不同的签名:我相信这正是Netbeans所抱怨的。解决这个问题的丑陋方法是将参数强制转换为
Locale
:更好的方法是在
Map
声明中使用类型参数:应用程序的另一个可能问题是,在哪里保存带有翻译的属性文件。不幸的是,Java对文件位置非常敏感,必须提供属性文件的完全限定路径。Java8和ResourceBundle的SPI提供程序有一些变化,但情况不同
最后,但并非最不重要的是,您似乎正在尝试实现常见的反模式,即语言切换器。如果您正在实施桌面应用程序,请不要犯这个错误! 只需获得用户界面默认语言环境即可:
信不信由你,但是
ResourceBundle
类将尝试退回到最适合用户的语言。如果我已经在我的操作系统首选项中设置了UI语言,你为什么还要费心再次做出选择老实说,语言切换器有时对静态网站有意义,但对web应用程序没有意义,对桌面应用程序也没有意义