有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
    }
}

在课堂上,我试着用意大利语和英语两种不同的语言打印一个单词。我有两个礼节档案

  • 语言。礼节
  • 语言就是它。礼节

screen

在课堂上:

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) 个答案

  1. # 1 楼答案

    你的申请(以及你的问题)有几个问题
    首先,不要使用参数化集合:

    private final Map supportedLanguages;
    

    此映射将始终返回Object,但getBundle()方法具有不同的签名:

    public static ResourceBundle getBundle(String baseName, Locale locale);
    

    我相信这正是Netbeans所抱怨的。解决这个问题的丑陋方法是将参数强制转换为Locale

    translation = ResourceBundle.getBundle("language", (Locale) supportedLanguages.get(language));
    

    更好的方法是在Map声明中使用类型参数:

    private final Map<String, Locale> supportedLanguages = new HashMap<>();
    

    应用程序的另一个可能问题是,在哪里保存带有翻译的属性文件。不幸的是,Java对文件位置非常敏感,必须提供属性文件的完全限定路径。Java8和ResourceBundle的SPI提供程序有一些变化,但情况不同

    最后,但并非最不重要的是,您似乎正在尝试实现常见的反模式,即语言切换器。如果您正在实施桌面应用程序,请不要犯这个错误! 只需获得用户界面默认语言环境即可:

    Locale locale = Locale.getDefault(LocaleCategory.DISPLAY);
    

    信不信由你,但是ResourceBundle类将尝试退回到最适合用户的语言。如果我已经在我的操作系统首选项中设置了UI语言,你为什么还要费心再次做出选择
    老实说,语言切换器有时对静态网站有意义,但对web应用程序没有意义,对桌面应用程序也没有意义