Java ResourceBundle类介绍

x33g5p2x  于2022-09-24 转载在 Java  
字(9.1k)|赞(0)|评价(0)|浏览(351)

ResourceBundle 通过加载特定于区域设置的资源来包含特定于区域设置的对象。 ResourceBundle 根据当前用户的语言环境加载资源。这有助于开发人员编写独立于用户语言环境的程序。使用 ResourceBundle,我们可以轻松地在不同的语言环境中优化我们的应用程序,处理多个语言环境,并且以后可以针对更多语言环境修改应用程序。要使用 ResourceBundle,我们的所有资源名称都应该包含一个基本名称作为前缀,语言环境作为后缀。
ResourceBundle 有两个已知的子类,即 ListResourceBundlePropertyResourceBundleListResourceBundle 以 Java 类的形式与资源包一起使用,而 PropertyResourceBundle 与属性文件一起使用。两种方法都必须遵循相同的命名约定,即基本名称和语言环境的组合。要获取 ResourceBundle 实例,我们需要调用 ResourceBundle.getBundle 方法并传递资源库名称和语言环境。要从资源中获取键的值,我们需要在 ResourceBundle 的实例上调用 ResourceBundlegetObjectgetStringgetStringArray 方法,并将键作为字符串传递。

资源包的命名

资源包可以是属性文件或 Java 类。资源包名称是通过组合基本名称和语言环境来创建的。查找示例示例。
1。属性文件:假设 myapp 是属性文件的基本名称,那么我们将创建资源包文件,如下所示。

myapp.properties 
myapp_en_CA.properties
myapp_de_DE.properties
myapp_fr_FR.properties

资源包属性文件将根据用户当前的 Locale 加载。
a. 对于默认的 Locale,资源文件名将是 myapp.properties
b. 对于 Locale("en", "CA"),资源文件名将是 myapp_en_CA.properties
c. 对于 Locale("de", "DE"),资源文件名将是 myapp_de_DE.properties
d. 对于 Locale("fr", "FR"),资源文件名将是 myapp_fr_FR.properties

2。 Java 类:资源束类被创建为 ListResourceBundle 的子类。假设 MyApp 是基类名称,我们将创建资源包类如下。

MyApp.class 
MyApp_en_CA.class
MyApp_de_DE.class
MyApp_fr_FR.class

资源包类将根据用户当前的 Locale 加载。
a. 对于默认的 Locale,资源类名称将为 MyApp.class
b. 对于 Locale("en", "CA"),资源类名称将为 MyApp_en_CA.class
c. 对于 Locale("de", "DE"),资源类名称将为 MyApp_de_DE.class
d. 对于 Locale("fr", "FR"),资源类名称将为 MyApp_fr_FR.class

属性文件作为 ResourceBundle

我们将使用具有语言环境 en_CA、de_DE、fr_FR 和默认语言环境的属性文件创建一个 ResourceBundle 示例。
1。创建资源包属性文件
myapp.properties

user.name= Enter user name
user.pwd= Enter password
user.submit= Submit

myapp_en_CA.properties

user.name= Enter user name (CA)
user.pwd= Enter password (CA)
user.submit= Submit (CA)

myapp_de_DE.properties

user.name= Benutzernamen eingeben
user.pwd= Passwort eingeben
user.submit= einreichen

myapp_fr_FR.properties

user.name= Saisissez votre nom d'utilisateur
user.pwd= Entrer le mot de passe
user.submit= Soumettre

2。创建 ResourceBundle 并获取值
要创建 ResourceBundle,我们需要调用 ResourceBundle.getBundle 方法并传递资源库名称和语言环境。在我们的示例中,资源文件的基本名称是 myapp。找到代码。

ResourceBundle rs = 
    ResourceBundle.getBundle("com.concretepage.lsbundles.MyDataBundle", new Locale("de", "DE"));

要从资源中获取键的值,我们可以调用 ResourceBundlegetObjectgetStringgetStringArray 方法并将键作为字符串传递。

String username = rs.getString("user.name");
String password = rs.getString("user.pwd");
String submit = rs.getString("user.submit");

找到例子。
MyApplication.java

package com.concretepage;
import java.util.Locale;
import java.util.ResourceBundle;
public class MyApplication {
  public static void main(String[] args) {
        System.out.println("---For Locale de_DE---");
	ResourceBundle rs = ResourceBundle.getBundle("myapp", new Locale("de", "DE"));
	displayPropDetails(rs);

	System.out.println("---For Locale en_CA---");
	rs = ResourceBundle.getBundle("myapp", new Locale("en", "CA"));
	displayPropDetails(rs);

	System.out.println("---For Locale fr_FR---");
	rs = ResourceBundle.getBundle("myapp", new Locale("fr", "FR"));
	displayPropDetails(rs);
	
	System.out.println("---For Default Locale---");
	rs = ResourceBundle.getBundle("myapp", Locale.getDefault());
	displayPropDetails(rs);	
  }

  private static void displayPropDetails(ResourceBundle rs) {
	String username = rs.getString("user.name");
	String password = rs.getString("user.pwd");
	String submit = rs.getString("user.submit");	

	System.out.println(username + " | " + password + " | " + submit);
  }
}

输出

---For Locale de_DE---
Benutzernamen eingeben | Passwort eingeben | einreichen
---For Locale en_CA---
Enter user name (CA) | Enter password (CA) | Submit (CA)
---For Locale fr_FR---
Saisissez votre nom d'utilisateur | Entrer le mot de passe | Soumettre
---For Default Locale---
Enter user name | Enter password | Submit

使用 getKeys()
:我们可以使用 ResourceBundlegetKeys() 方法迭代所有键并使用键获取值。

ResourceBundle rs = ResourceBundle.getBundle("myapp", new Locale("de", "DE"));
Enumeration<String> en = rs.getKeys();
while(en.hasMoreElements()){
    String key= en.nextElement();
    System.out.println("key:"+ key +", Values:"+rs.getString(key));
}

ResourceBundle

要将类用作资源包,我们需要创建 Java ListResourceBundle 的子类。 ListResourceBundleResourceBundle 的抽象类,用于管理区域设置的资源。资源被创建为 Java 类。要创建资源类,我们需要为每个所需的语言环境创建 ListResourceBundle 的子类并覆盖其 getContents() 方法。
我们将使用具有语言环境 en_CA、de_DE、fr_FR 和默认语言环境的 Java 类创建一个 ResourceBundle 示例。
1。创建资源包类
MyApp.java

package com.concretepage.resourcebundle;
import java.util.Arrays;
import java.util.ListResourceBundle;
import com.concretepage.StateHead;

public class MyApp extends ListResourceBundle {
  @Override
  protected Object[][] getContents() {
	return contents;
  }
  private Object[][] contents = {
      { "location", "United States" },
      { "literacy", Double.valueOf(99.20) },
      { "famousCities", Arrays.asList("New York", "Chicago", "Charleston") }, 
      { "stateHead", new StateHead("Donald Trump", 73) }   
  };
}

MyApp_en_CA.java

package com.concretepage.resourcebundle;
import java.util.Arrays;
import java.util.ListResourceBundle;
import com.concretepage.StateHead;

public class MyApp_en_CA extends ListResourceBundle {
  @Override
  protected Object[][] getContents() {
	return contents;
  }
  private Object[][] contents = {
      { "location", "Canada" },
      { "literacy", Double.valueOf(99.00) },
      { "famousCities", Arrays.asList("Toronto", "Vancouver", "Montreal") }, 
      { "stateHead", new StateHead("Justin Trudeau", 47) }   
  };
}

MyApp_de_DE.java

package com.concretepage.resourcebundle;
import java.util.Arrays;
import java.util.ListResourceBundle;
import com.concretepage.StateHead;

public class MyApp_de_DE extends ListResourceBundle {
  @Override
  protected Object[][] getContents() {
	return contents;
  }
  private Object[][] contents = {
      { "location", "Germany" },
      { "literacy", Double.valueOf(98.40) },
      { "famousCities", Arrays.asList("Berlin", "Munich", "Frankfurt") }, 
      { "stateHead", new StateHead("Frank-Walter", 63) }   
  };
}

MyApp_fr_FR.java

package com.concretepage.resourcebundle;
import java.util.Arrays;
import java.util.ListResourceBundle;
import com.concretepage.StateHead;

public class MyApp_fr_FR extends ListResourceBundle {
  @Override
  protected Object[][] getContents() {
	return contents;
  }
  private Object[][] contents = {
      { "location", "France" },
      { "literacy", Double.valueOf(99.50) },
      { "famousCities", Arrays.asList("Paris", "Lyon", "Nice") }, 
      { "stateHead", new StateHead("Emmanuel Macron", 41) }   
  };
}

StateHead.java

package com.concretepage;
public class StateHead {
  private String name;
  private int age;
  public StateHead(String name, int age) {
	this.name = name;
	this.age = age;
  }
  public String getName() {
	return name;
  }
  public int getAge() {
	return age;
  }
}

2。创建 ResourceBundle 并获取值
要创建 ResourceBundle,我们需要调用 ResourceBundle.getBundle 方法并传递资源库名称和语言环境。资源类基名是完全限定的类基名。在我们的示例中,资源类基名称如下。

com.concretepage.resourcebundle.MyApp

现在实例化 ResourceBundle

ResourceBundle rs = 
    ResourceBundle.getBundle("com.concretepage.lsbundles.MyDataBundle", new Locale("de", "DE"));

要从资源中获取键的值,我们可以调用 ResourceBundlegetObjectgetStringgetStringArray 方法并将键作为字符串传递。当我们调用 getObject 时,它​​返回 Object 数据类型的对象,我们可以将它类型转换为我们需要的数据类型。

String location = rs.getString("location");
Double literacy = (Double)rs.getObject("literacy");
List<?> famousCities = (List<?>) rs.getObject("famousCities");	
StateHead stateHead = (StateHead)rs.getObject("stateHead");

例子
MyApplication.java

package com.concretepage;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;

public class MyApplication {
  public static void main(String[] args) {
	
    System.out.println("---For Locale de_DE---");
	ResourceBundle rs = ResourceBundle.getBundle("com.concretepage.resourcebundle.MyApp", new Locale("de", "DE"));
	displayDetails(rs);

	System.out.println("---For Locale en_CA---");
	rs = ResourceBundle.getBundle("com.concretepage.resourcebundle.MyApp", new Locale("en", "CA"));
	displayDetails(rs);

	System.out.println("---For Locale fr_FR---");
	rs = ResourceBundle.getBundle("com.concretepage.resourcebundle.MyApp", new Locale("fr", "FR"));
	displayDetails(rs);
	
	System.out.println("---For Default Locale---");
	rs = ResourceBundle.getBundle("com.concretepage.resourcebundle.MyApp", Locale.getDefault());
	displayDetails(rs);	
  }

  private static void displayDetails(ResourceBundle rs) {
	String location = rs.getString("location");
	Double literacy = (Double)rs.getObject("literacy");
	List<?> famousCities = (List<?>) rs.getObject("famousCities");	
	StateHead stateHead = (StateHead)rs.getObject("stateHead");
	
	System.out.println(location);
	System.out.println(literacy);	
	famousCities.forEach(s -> System.out.print(s + " "));
	System.out.println("\n" + stateHead.getName() + "-" + stateHead.getAge());
  }
}

输出

---For Locale de_DE---
Germany
98.4
Berlin Munich Frankfurt 
Frank-Walter-63
---For Locale en_CA---
Canada
99.0
Toronto Vancouver Montreal 
Justin Trudeau-47
---For Locale fr_FR---
France
99.5
Paris Lyon Nice 
Emmanuel Macron-41
---For Default Locale---
United States
99.2
New York Chicago Charleston 
Donald Trump-73

相关文章

微信公众号

最新文章

更多