Java加载了错误的资源
我的资源文件夹中有这2个属性文件: 消息\u hr\u hr.properties和消息.properties 我不使用javas的Locale类,而是使用我的自定义Locale类:Java加载了错误的资源,java,resources,properties,locale,Java,Resources,Properties,Locale,我的资源文件夹中有这2个属性文件: 消息\u hr\u hr.properties和消息.properties 我不使用javas的Locale类,而是使用我的自定义Locale类: public class Locale { private String bundleName; private String localeName; private String iconPath; public Locale(String bundleName, String
public class Locale {
private String bundleName;
private String localeName;
private String iconPath;
public Locale(String bundleName, String localeName, String iconPath) {
super();
this.bundleName = bundleName;
this.localeName = localeName;
this.iconPath = iconPath;
}
public String getBundleName() {
return bundleName;
}
public void setBundleName(String bundleName) {
this.bundleName = bundleName;
}
public String getLocaleName() {
return localeName;
}
public void setLocaleName(String localeName) {
this.localeName = localeName;
}
public String getIconPath() {
return iconPath;
}
public void setIconPath(String iconPath) {
this.iconPath = iconPath;
}
}
我让Messages类使用静态方法返回键的值:
public class Messages {
private Messages() {
// do not instantiate
}
private static List<Locale> availableLocales;
private static Locale defaultLocale = new Locale("messages.messages", "EN", "/images/icons/locale/en.png");
static {
availableLocales = new ArrayList<Locale>();
availableLocales.add(defaultLocale);
availableLocales.add(new Locale("messages.messages_hr_HR", "HR", "/images/icons/locale/hr.png"));
}
private static Locale LOCALE = defaultLocale;
private static ResourceBundle RESOURCE_BUNDLE = loadBundle();
private static ResourceBundle loadBundle() {
return ResourceBundle.getBundle(LOCALE.getBundleName());
}
public static String getString(String key) {
try {
ResourceBundle bundle = RESOURCE_BUNDLE == null ? loadBundle() : RESOURCE_BUNDLE;
return bundle.getString(key);
} catch (MissingResourceException e) {
return "!" + key + "!";
}
}
public static void setLocale(Locale locale) {
LOCALE = locale;
RESOURCE_BUNDLE = loadBundle();
}
public static Locale getLocale() {
return LOCALE;
}
public static List<Locale> getAvailableLocales() {
return availableLocales;
}
}
公共类消息{
私人消息(){
//不要实例化
}
可用的私有静态列表;
private static Locale defaultLocale=new Locale(“messages.messages”、“EN”、“/images/icons/Locale/EN.png”);
静止的{
availableLocales=new ArrayList();
添加(默认语言环境);
添加(新的区域设置(“messages.messages\hr\u hr”、“hr”、“/images/icons/Locale/hr.png”);
}
私有静态语言环境=默认语言环境;
私有静态ResourceBundle RESOURCE_BUNDLE=loadBundle();
私有静态ResourceBundle loadBundle(){
返回ResourceBundle.getBundle(LOCALE.getBundleName());
}
公共静态字符串getString(字符串键){
试一试{
ResourceBundle bundle=RESOURCE\u bundle==null?loadBundle():资源\u bundle;
返回bundle.getString(键);
}捕获(丢失资源异常e){
返回“!”+键+“!”;
}
}
公共静态void setLocale(区域设置){
语言环境=语言环境;
资源_BUNDLE=loadBundle();
}
公共静态区域设置getLocale(){
返回区域设置;
}
公共静态列表getAvailableLocales(){
返回可用的日历;
}
}
然后,在我的GUI中,我有可用语言的radiobutton菜单,当用户单击一些时,我只调用Messages.setLocale(clickedLanguageLocale)代码>
所以您可以看到,我负责加载特定的文件,而不是java
问题是,在某些计算机上,它的行为很奇怪。有些文字是英文(messages.properties),有些文字是克罗地亚文(messages\u hr\u hr)。我首先想到的是一些操作系统默认的语言环境,但它没有任何意义,因为我使用我的类
对于这种行为有什么想法吗?如果没有看到完整的代码,很难猜测消息的加载顺序。
我猜想,如果GUI应用程序中涉及多个线程,那么在资源束上就会出现数据竞争。
GUI在加载新的资源包之前开始读取新的文本键。
这就是为什么其中一部分用英语出现,而其余用克罗地亚语出现的原因
编辑:这是实际的解决方案,如下面的评论所述:
此外,您还可以使用此版本的getBundle()docs.oracle.com/javase/6/docs/api/java/util/…显式传递您要使用的区域设置。您是否尝试过在String getString(String key)
处使用断点调试生成英文消息的键?Hmm,可能是因为这些静态加载?但我认为这不是问题所在,因为GUI必须加载才能选择我想要的语言。所以,如果GUI被加载,资源也会被加载。然后在GUI类中,我在该单选按钮组上有一个侦听器:localeMenuItem.addActionListener(新ActionListener(){@Override public void actionPerformed(ActionEvent e){Messages.setLocale(locale);setTringValue();})代码>我设置了新的区域设置。嗯,看起来您使用的是默认的getBundle(),这可能是一个问题。请阅读以下文档:。getBundle()将在用户系统中使用默认的java.util.Locale,而不一定是您在Locale类中提到的默认值。这可能就是问题所在。如何加载具有其名称的捆绑包?但另一件奇怪的事情是,locale类中不存在HR语言环境,并且不知何故,getBundle()
方法决定将其作为默认值。您可以使用java.util.locale.getAvailableCales()来查找用户系统中支持的语言环境。此外,您还可以使用此版本的getBundle()显式传递要使用的区域设置。问题是,在我的计算机上,它的行为正常。其他计算机都在我的学院(我的教授),所以我不能直接去那里安装Eclipse来调试:S