返回介绍

10.2 国际化 Spring MVC 应用程序

发布于 2025-04-22 20:10:02 字数 3333 浏览 0 评论 0 收藏

国际化和本地化应用程序时,需要具备以下条件:

(1)将文本组件隔离成属性文件。

(2)选择和读取正确的属性文件。

下面详细介绍这两个步骤,并进行简单的示范。

10.2.1 将文本组件隔离成属性文件

国际化的应用程序是将每一个语言区域的文本元素都单独保存在一个独立的属性文件中。每个文件中都包含 key/value 对,并且每个 key 都唯一表示一个特定语言区域的对象。key 始终是字符串,value 则可以是字符串,也可以是其他任意类型的对象。例如,为了支持美国英语、德语以及汉语,就要有 3 个属性文件,它们都有着相同的 key。

以下是英语版的属性文件。注意,它有 greetings 和 farewell 两个 key。

greetings = Hello
farewell = Goodbye

德国版的属性文件如下:

greetings = Hallo
farewell = Tschüß

汉语版的属性文件如下:

greetings=\u4f60\u597d
farewell=\u518d\u89c1

如果你是中文用户,你可以使用任何中文文本编辑器并写入汉字字符。 完成后,将文件转换为 Unicode。

现在,要学习 java.util.ResourceBundle 类。它能使你轻松地选择和读取特定于用户语言区域的属性,以及查找值。ResourceBundle 是一个抽象类,但它提供了静态的 getBundle 方法,返回一个具体子类的实例。

ResourceBundle 有一个基准名,它可以是任意名称。但是,为了让 ResourceBundle 正确地选择属性文件,这个文件名中最好必须包含基准名 ResourceBundle,后面再接下划线、语言码,还可以选择再加一条下划线和国家码。属性文件名的格式如下所示:

basename_languageCode_countryCode

例如,假设基准名为 MyResources,并且定义了以下 3 个语言区域:

  • US-en;

  • DE-de;

  • CN-zh。

那么,就会得到下面这 3 个属性文件:

  • MyResources_en_US.properties;

  • MyResources_de_DE.properties;

  • MyResources_zh_CN.properties。

10.2.2 选择和读取正确的属性文件

如前所述,ResourceBundle 是一个抽象类。尽管如此,还是可以通过调用它的静态 getBundle 方法来获得一个 ResourceBundle 实例。它的重载签名如下:

public static ResourceBundle getBundle(java.lang.String baseName)
public static ResourceBundle getBundle(java.lang.String baseName,
    Locale locale)

例如:

ResourceBundle rb = ResourceBundle.getBundle("MyResources", Locale.US);

这样将会加载 ResourceBundle 在相应属性文件中的值。

如果没有找到合适的属性文件,ResourceBundle 对象就会返回到默认的属性文件。默认属性文件的名称为基准名加一个扩展名 properties。在这个例子中,默认文件就是 MyResources. properties。如果没有找到默认文件,将抛出 java.util.MissingResourceException。

随后,读取值,利用 ResourceBundle 类的 getString 方法传入一个 key。

public java.lang.String getString(java.lang.String key)

如果没有找到指定 key 的入口,将会抛出 java.util.MissingResourceException。

在 Spring MVC 中,不直接使用 ResourceBundle,而是利用 messageSource bean 告诉 Spring MVC 要将属性文件保存在哪里。例如,下面的 messageSource bean 读取了两个属性文件。

<bean id="messageSource" class="org.springframework.context.support.
ReloadableResourceBundleMessageSource">
  <property name="basenames" >
    <list>
      <value>resource/messages</value>
      <value>resource/labels</value>
    </list>
  </property>
</bean>

上面的 bean 定义中用 ReloadableResourceBundleMessageSource 类作为实现。另一个实现中包含了 ResourceBundleMessageSource,它是不能重新加载的。这意味着,如果在任意属性文件中修改了某一个属性 key 或者 value,并且正在使用 ResourceBundleMessageSource,那么要使修改生效,就必须先重启 JVM。另一方面,也可以将 ReloadableResourceBundleMessageSource 设为可重新加载。

这两个实现之间的另一个区别是:使用 ReloadableResourceBundleMessageSource 时,是在应用程序目录下搜索这些属性文件。而使用 ResourceBundleMessageSource 时,属性文件则必须放在类路径下,即 WEB-INF/class 目录下。

还要注意,如果只有一组属性文件,则可以用 basename 属性代替 basenames,像下面这样:

< bean id="messageSource" class="org.springframework.context.support.
→ ResourceBundleMessageSource">
  < property name="basename" value="resource/messages"/>
< /bean>

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。