【问题标题】:Multilanguage localizzation in JavaJava中的多语言本地化
【发布时间】:2014-03-25 09:48:25
【问题描述】:

我正在尝试用 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);
    }
}

在课堂上,我尝试用两种不同的语言(意大利语和英语)打印一个单词。我有两个属性文件

  • Language.propeties
  • Language_it.propeties

在课堂上:

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)仍然有错误

【问题讨论】:

  • 你的问题是什么?你的程序看起来像 Localization not I18n
  • @anish 请问,有什么区别?
  • 您正在使用 Locale 概念为您的产品添加语言支持,请参阅 WIki,en.wikipedia.org/wiki/Language_localization,对于 I18n,您必须了解产品中的 UTF 支持

标签: java internationalization locale


【解决方案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 在文件位置方面非常敏感,您必须提供属性文件的完全限定路径。 Java 8 和 ResourceBundle 的 SPI 提供程序会发生一些变化,但这是另一回事。

最后但并非最不重要的一点是,您似乎正在尝试实现常见的反模式,即语言切换器。如果您正在实现桌面应用程序,请不要犯此错误! 获取用户界面默认语言环境就足够了:

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

信不信由你,ResourceBundle 类将尝试回退到最适合用户的语言。如果我已经在我的操作系统偏好设置中设置了 UI 语言,你为什么还要费心再做选择?
老实说,语言切换器有时适用于静态网站,但不适用于 Web 应用程序,而且绝对不适用于桌面应用程序。

【讨论】:

  • 很清楚,但我看不懂最后一部分。你对反模式意味着什么?我正在做一个有多种语言的程序,只是为了好玩和学习,如果我想要一个多语言程序,我只需要创建专有文件,操作系统会选择正确的吗?
  • @AlessioMTX:正确,您所要做的就是在您的案例 language.properties、language_it.properties 中创建每种语言的属性文件,并从操作系统读取默认语言环境。这样,使用意大利语版本操作系统的用户将看到意大利语翻译,而无需选择任何内容。
猜你喜欢
  • 2013-01-31
  • 2011-07-22
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多