【问题标题】:How to implement internationalization in java如何在java中实现国际化
【发布时间】:2012-11-29 18:51:51
【问题描述】:

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

public class Info{

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

}

我希望以Info.stringTwo 的身份从其他类访问这些变量。

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

【问题讨论】:

标签: java internationalization


【解决方案1】:

看看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”。在上面的例子中,值也是字符串——“OK”和“Cancel”——但它们不是必须的。这些值可以是任何类型的对象。 您可以使用适当的 getter 方法从资源包中检索对象。因为 "OkKey" 和 "CancelKey" 都是字符串,所以您可以使用 getString 来检索它们:

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

【讨论】:

    【解决方案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"));
      }
     }
    

    【讨论】:

      【解决方案3】:

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

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

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

      添加到Map 子类的s() 方法可以负责处理用户偏好和通过语言键从Map 中进行选择。

      也就是说,剩下的任务就是为所有这些制定一个方便的 API...欢迎您在我的博客页面 Look Ma, no ResourceBundle :) ...next page 上查看这样的实现消息格式参数。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-12
          • 2016-08-13
          • 1970-01-01
          • 2017-02-03
          • 2011-10-22
          • 2010-10-03
          • 1970-01-01
          相关资源
          最近更新 更多