如何在java中实现国际化

时间:2012-11-29 18:51:52

标签: java internationalization

我有一个名为Info的类,我在其中描述了一堆static String个变量。

public class Info{

    public static stringOne= "Hello";
    public static stringTwo = "world";

}

我希望从其他类中以Info.stringTwo的形式访问这些变量。

1。)我需要知道我在这里申请的是java-Internationalization吗? (我将在本课程中分配的应用程序中显示所有消息。并且,我希望也能为应用程序提供不同的语言支持)

4 个答案:

答案 0 :(得分:3)

查看Resource bundle

文档中的复制粘贴:

当您的程序需要特定于语言环境的对象时,它使用getBundle方法加载ResourceBundle类:

 ResourceBundle myResources =
 ResourceBundle.getBundle("MyResources", currentLocale);

资源包包含键/值对。这些键唯一地标识捆绑中特定于语言环境的对象。

以下是包含两个键/值对的ListResourceBundle示例:

 public class MyResources extends ListResourceBundle {
     protected Object[][] getContents() {
         return new Object[][] {
             // LOCALIZE THE SECOND STRING OF EACH ARRAY (e.g., "OK")
             {"OkKey", "OK"},
             {"CancelKey", "Cancel"},
             // END OF MATERIAL TO LOCALIZE
        };
     }
 }

键始终是字符串。在此示例中,键是“OkKey”和“CancelKey”。在上面的例子中,值也是字符串 - “确定”和“取消” - 但它们不一定是。值可以是任何类型的对象。 您可以使用适当的getter方法从资源包中检索对象。因为“OkKey”和“CancelKey”都是字符串,所以你可以使用getString来检索它们:

button1 = new Button(myResources.getString("OkKey"));
button2 = new Button(myResources.getString("CancelKey"));

答案 1 :(得分:2)

以下是here的示例: -

  import java.util.*;

  public class InternationalizationDemo {
  public static void main(String[] args) {
  String language;
   String country;
  Locale locale;
  ResourceBundle rb;

  if (args.length != 2) {
 language = new String("en");
  country = new String("US");
  }
 else {
 language = new String(args[0]);
 country = new String(args[1]);
 }
 locale = new Locale(language, country);
 rb = ResourceBundle.getBundle("MessagesBundle", locale);
 System.out.println(rb.getString("localeInfo") + " ( " + 
locale.getDisplayLanguage() + "," + locale.getDisplayCountry() + ").\n");
 System.out.println(rb.getString("welcome"));
 System.out.println(rb.getString("sayThanks"));
  }
 }

答案 2 :(得分:2)

尽管使用ResourceBundle是Java中传统且最着名的国际化方法,但可以将国际化数据作为类成员提供,有点类似于您所寻求的方式。

您可以在Map中以语言编制索引,在不同语言中进一步输入字符串。并使这个Map成为某个类的静态成员。因此,您可以通过编译器检查的方式通过类成员名称为消息引用这些字符串集合。接下来,如果您有办法在运行时选择首选用户语言(您必须拥有它),您只需使用其语言键从适当的集合中选择正确的字符串,煮沸至如下:

logger.info (MyClassWithMessages.MY_MULTILANGUAGE_MESSAGE.s ());

要添加到s()子类的Map方法可以通过语言键处理用户首选项和Map选择。

尽管如此,剩下的任务只是为所有这些制定一个方便的API ...欢迎您在我的博客页面Look Ma, no ResourceBundle :) ...next page上查看这样的实现。继续使用消息格式化参数。

答案 3 :(得分:0)

为了实现Java和其他应用程序的国际化,我实现了Message Compiler,它创建了资源包文件和常量定义,作为来自单个源文件的密钥的Java枚举或静态最终字符串。因此,常量可以在Java源代码中使用,这比使用普通字符串常量更安全。消息编译器不仅可以用于Java。它还为Objective-C或Swift创建资源文件和常量,并可以扩展到其他编程环境。