i18n 语言环境
概述
GWT 将locale
表示为一个客户端属性,其值可以通过嵌入在主机页面中的元标记或主机页面 URL 的查询字符串来设置。locale
客户端属性的可能值集不是由 GWT 提供的,而是完全取决于您的模块配置。
客户端属性和 GWT 编译过程
客户端属性是键值对,可用于配置 GWT 模块。例如,用户代理由客户端属性表示。每个客户端属性可以具有任意数量的值,但所有值在 GWT 编译器运行时都必须是可枚举的。GWT 模块可以使用<extend-property>
指令定义和扩展可用客户端属性集以及每个属性在最终用户浏览器中加载时可能假设的潜在值。在编译时,GWT 编译器会确定模块客户端属性的所有可能的排列,并从中生成多个编译。每个编译都针对一组不同的客户端属性进行了优化,并被记录到以后缀.cache.html
结尾的文件中。
在部署中,最终用户的浏览器只需要一个特定的编译,该编译是通过将最终用户的客户端属性映射到可用的已编译排列来确定的。因此,只有最终用户需要的代码才会被下载,不多不少。通过将语言环境设为客户端属性,<module>.nocache.js
中的标准启动过程会选择应用程序的适当本地化版本,从而提供易用性、优化的性能和最小的脚本大小。有关<modulename>.nocache.js
文件逻辑的更多信息,请参见知识库。
向模块添加语言环境选择
在任何实际应用程序中,您将定义至少一个语言环境,除了默认语言环境之外。“添加语言环境”意味着使用<extend-property>
元素扩展locale
客户端属性的值集,该元素位于您的模块 XML中。例如,以下模块添加了多个语言环境值
<module>
<inherits name="com.google.gwt.user.User"/>
<inherits name="com.google.gwt.i18n.I18N"/>
<!-- French language, independent of country -->
<extend-property name="locale" values="fr"/>
<!-- French in France -->
<extend-property name="locale" values="fr_FR"/>
<!-- French in Canada -->
<extend-property name="locale" values="fr_CA"/>
<!-- English language, independent of country -->
<extend-property name="locale" values="en"/>
</module>
默认语言环境
com.google.gwt.i18n.I18N
模块默认只定义一个语言环境,称为default
。当部署中未指定locale
客户端属性时,会使用此默认语言环境。默认语言环境在内部用作Localizable
接口和本地化资源或类之间的最后手段匹配。
通常,您应该避免在default
语言环境中运行应用程序——许多情况会产生意外的结果。例如,只支持一小部分货币,这会导致使用其他货币的应用程序出现错误,并且不支持复数形式(因为语言未知)。如果您真的希望允许应用程序在用户请求不支持的语言环境时继续运行,那么您可能最好选择一种真实的语言作为默认语言,例如en
。您可以通过在您的模块 XML中包含以下内容来设置用于默认值的价值
<extend-property name="locale" values="en,es,de,fr,it" /> <!-- 1. full list of supported locales -->
<set-property name="locale" value="en,es,de,fr,it" /> <!-- 2. remove the 'default' locale permutation -->
<set-property-fallback name="locale" value="en" /> <!-- 3. set the fallback locale, in replacement for the default 'default' locale -->
指定要加载的语言环境
可以使用元标记或作为主机页面 URL 中查询字符串的一部分来指定语言环境客户端属性。如果两者都指定了,则查询字符串优先。要使用主机页面中的元标记指定locale
客户端属性,请嵌入一个gwt:property
的元标记,如下所示
<meta name="gwt:property" content="locale=x_Y">
例如,以下主机 HTML 页面将语言环境设置为“ja_JP”
<html>
<head>
<meta name="gwt:property" content="locale=ja_JP">
</head>
<body>
<!-- Load the GWT compiled module code -->
<script src="com.google.gwt.examples.i18n.ColorNameLookupExample.nocache.js " />
</body>
</html>
要使用查询字符串指定locale
客户端属性,请为名称locale
指定一个值。例如,
http://www.example.org/myapp.html?locale=fr_CA
提示:明确设置locale
的首选时间是在您的 GWT 模块被调用之前进行。您可以在 GWT 模块内部更改locale
,方法是在当前 URL 中添加或更改locale
查询字符串,然后重新加载页面。请记住,重新加载页面后,您的模块将重新启动。
运行时语言环境
对于翻译值相同但仍需要特定于国家/地区详细信息的情况,您可以使用运行时语言环境来减少编译排列的数量,但仍然获得特定于国家/地区的详细信息,例如默认货币、数字/日期格式规则等。
例如,您可能有一组适用于拉丁美洲所有西班牙语的翻译 (es_419
),但允许用户选择特定于国家/地区的语言环境,例如阿根廷西班牙语 (es_AR
)。
使用运行时语言环境的简便方法是在您的模块 XML文件中添加
<inherits name="com.google.gwt.i18n.CldrLocales"/>
,GWT 知道的继承自编译时语言环境的所有语言环境都将自动包含在内。您可以在Showcase
示例应用程序中看到结果。
警告
- 所有包含的运行时语言环境的所有表格都包含在每个相应的编译排列中,因此这会增加下载大小。
- 非明显语言环境继承和别名的表格太大,无法包含在选择脚本中,因此在所有情况下,继承都无法正常工作。这意味着您要么需要专门控制可能的语言环境集,例如
Showcase
示例应用程序中的语言环境选择器,要么让服务器使用正确的继承表来选择语言环境 (GwtLocaleFactoryImpl
在此将有所帮助,您将需要一种方法来获取应用程序构建时使用的语言环境集)。 - 目前,只有货币数据、数字格式和日期/时间格式会受到运行时语言环境的影响——所有其他内容将只使用来自语言环境延迟绑定属性的编译时语言环境。
创建新的属性提供程序
如果您将模块嵌入到现有应用程序中,可能还有其他方法可以确定语言环境,这些方法不适合使用<meta>
标记或将locale=
指定为查询字符串。在这种情况下,您可以编写自己的属性提供程序。
属性提供程序在模块 XML 文件中指定为 JavaScript 片段,该片段将在运行时返回指定属性的值。在这种情况下,您将希望使用属性提供程序来定义语言环境属性。要查看<property-provider>
定义的实际示例,请参见 GWT 源代码中的文件I18N.gwt.xml和UserAgent.gwt.xml。
以编程方式访问语言环境信息
要获取有关当前语言环境或可用语言环境集的信息,请参见LocaleInfo类。例如
- 要检查当前语言环境是否为从右到左的语言环境
if (LocaleInfo.getCurrentLocale().isRTL()) {
...
}
- 要获取支持的语言环境列表,例如用于语言环境选择器
for (String localeName : LocaleInfo.getAvailableLocaleNames()) {
String displayName = LocaleInfo.getLocaleNativeDisplayName(localeName);
...
}
服务器/生成器对语言环境的操作
GWT 提供了两个类来操作语言环境,这些类完全支持别名和语言环境继承。
GwtLocale表示 GWT 语言环境,并支持转换为规范形式、生成语言环境继承和别名的搜索列表,以及提供对语言环境组件的访问器。
GwtLocaleFactory 提供了一种从区域设置名称或其组件创建新的
GwtLocale
对象的方法(对于从java.util.Locale
对象转换很有用)。LocaleUtils 为生成器提供了对 GWT 区域设置基础设施的轻松访问。
- 获取 GwtLocaleFactory 实例
GwtLocaleFactory factory = LocaleUtils.getLocaleFactory();
- 获取此编译的所有区域设置,包括运行时区域设置
Set<GwtLocale> locales = localeUtils.getAllLocales();
- GwtLocaleFactoryImpl 提供了一种在服务器上创建 GwtLocale 实例的方法。