Java ListResourceBundle
是 ResourceBundle
的抽象类,用于管理区域设置的资源。资源被创建为 Java 类。要创建资源类,我们需要为每个所需的语言环境创建 ListResourceBundle
的子类并覆盖 getContents()
方法。要获取 ResourceBundle
实例,我们需要调用 ResourceBundle.getBundle
方法并传递资源库名称和语言环境。要从资源中获取键的值,我们需要在 ResourceBundle
的实例上调用 getObject
方法。在这里,我们将提供在我们的应用程序中使用 ListResourceBundle
的完整示例。
要通过扩展 ListResourceBundle
创建资源类,我们需要遵循一个模式。资源类名称将是基本名称和语言环境的组合。
假设我们的资源库名称是 MyDataBundle
。
1. 对于 Locale("en", "US")
,资源类名称将为 MyDataBundle_en_US.class
。
2. 对于 Locale("de", "DE")
,资源类名称将为 MyDataBundle_de_DE.class
。
3. 对于 Locale("fr", "FR")
,资源类名称将为 MyDataBundle_fr_FR.class
。
资源类需要重写 ListResourceBundle
的 getContents()
方法。 getContents()
方法返回表示键值对的二维 Object
数组。每对的第一个元素是应该是 String
的键,第二个元素是与该键关联的值。与键关联的值不必是 String
,但它可以是任何类型的对象。
现在找到我们所有的资源类。
MyDataBundle_en_US.java
package com.concretepage.lsbundles;
import java.util.ListResourceBundle;
import com.concretepage.President;
public class MyDataBundle_en_US extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return contents;
}
private Object[][] contents = {
{ "Country", "United States" },
{ "President", new President("Donald Trump", 73) },
{ "Literacy", Double.valueOf(99.20) },
};
}
MyDataBundle_de_DE.java
package com.concretepage.lsbundles;
import java.util.ListResourceBundle;
import com.concretepage.President;
public class MyDataBundle_de_DE extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return contents;
}
private Object[][] contents = {
{ "Country", "Germany" },
{ "President", new President("Frank-Walter", 63) },
{ "Literacy", Double.valueOf(98.40) },
};
}
MyDataBundle_fr_FR.java
package com.concretepage.lsbundles;
import java.util.ListResourceBundle;
import com.concretepage.President;
public class MyDataBundle_fr_FR extends ListResourceBundle {
@Override
protected Object[][] getContents() {
return contents;
}
private Object[][] contents = {
{ "Country", "France" },
{ "President", new President("Emmanuel Macron", 41) },
{ "Literacy", Double.valueOf(99.50) },
};
}
President.java
package com.concretepage;
public class President {
private String presidentName;
private int age;
public President(String presidentName, int age) {
this.presidentName = presidentName;
this.age = age;
}
//Setters and getters
}
要创建 ResourceBundle
,我们需要调用 ResourceBundle.getBundle
方法并传递资源库名称和语言环境。在我们的示例中,资源类基名是 MyDataBundle
,我们需要将其作为完全限定的类名传递。找到代码。
ResourceBundle rs =
ResourceBundle.getBundle("com.concretepage.lsbundles.MyDataBundle", new Locale("en", "US"));
要从资源中获取键的值,我们需要在 ResourceBundle
的实例上调用 getObject
方法。
String country = (String) rs.getObject("Country");
President president = (President) rs.getObject("President");
Double literacy = (Double) rs.getObject("Literacy");
getObject
返回 Object
类型的对象。我们需要将其转换为所需的数据类型。
现在找到我们示例中创建 ResourceBundle
并获取本地化对象的类。
MyDataBundleDemo.java
package com.concretepage;
import java.util.Locale;
import java.util.ResourceBundle;
public class MyDataBundleDemo {
public static void main(String[] args) {
System.out.println("---For Locale en_US---");
ResourceBundle rs = ResourceBundle.getBundle("com.concretepage.lsbundles.MyDataBundle", new Locale("en", "US"));
displayStateDetails(rs);
System.out.println("---For Locale de_DE---");
rs = ResourceBundle.getBundle("com.concretepage.lsbundles.MyDataBundle", new Locale("de", "DE"));
displayStateDetails(rs);
System.out.println("---For Locale fr_FR---");
rs = ResourceBundle.getBundle("com.concretepage.lsbundles.MyDataBundle", new Locale("fr", "FR"));
displayStateDetails(rs);
}
private static void displayStateDetails(ResourceBundle rs) {
String country = (String) rs.getObject("Country");
President president = (President) rs.getObject("President");
Double literacy = (Double) rs.getObject("Literacy");
System.out.println(country);
System.out.println(president.getPresidentName() + "-" + president.getAge());
System.out.println(literacy);
}
}
输出
---For Locale en_US---
United States
Donald Trump-73
99.2
---For Locale de_DE---
Germany
Frank-Walter-63
98.4
---For Locale fr_FR---
France
Emmanuel Macron-41
99.5
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.concretepage.com/java/java-listresourcebundle
内容来源于网络,如有侵权,请联系作者删除!