2012-11-29 177 views
4

我有一个叫Info的类,我有一堆static String变量在其中描述。如何在java中实现国际化

public class Info{ 

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

} 

,我希望能够从其他类访问这些变量Info.stringTwo

1.)我需要知道这是我在这里应用的java-Internationalization? (我有所有我将在这个类分配的应用程序中显示的信息。而且,我希望能有不同语言的应用程序支持以及)

+3

你读过[本教程](http://docs.oracle.com/javase/tutorial/i18n/index.html)吗? – assylias

+0

[Java首选项和国际化(i18n)]的可能的重复(http://stackoverflow.com/questions/5588837/java-preferences-and-internationalization-i18n) – CoolBeans

+0

不,它不是java-Internationalization。这是一些轮子重新发明技术,没有任何意义。请遵循标准方式(请参阅assylias的评论)。 –

回答

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

虽然使用ResourceBundle是传统和最着名的Java国际化方法,可以使国际化数据作为类成员提供,与您寻求的方式有些类似。

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

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

并且s()方法将被添加到您的Map子类中,以便处理用户偏好和从Map通过语言键进行选择。

这就是说,剩下的任务就是制定一个方便的API为这一切......欢迎您来看看我的博客页面Look Ma, no ResourceBundle :) ...,并next page在这样的实现与消息格式化参数向前走。

0

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