如何加载字符串资源 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
你可以从资源文件、库、控件以及应用包和清单等对象中加载字符串资源。
从资源文件加载字符串
字符串资源在资源文件中编写,使用资源标识符引用。有关加载字符串资源的基本介绍,请参阅快速入门:使用字符串资源。
大部分应用的每种语言仅需要单个默认资源文件 (<language>/Resources.resjson),并且它们可以使用该文件内键的相对路径引用它们的资源(例如 /String1
)。但在一些应用程序中,最好将资源分离到多个资源文件中,以实现组件分离。
例如:
文件名:
Strings/en-US/Errors.resjson
从标记引用:
<span data-win-res="{textContent: '/Errors/AlreadyRegistered'}"></span>
从代码引用:
WinJS.Resources.getString('/Errors/AlreadyRegistered');
资源标识符的格式为 **/ResourceFileName/**StringName。注意,资源文件名不包含扩展名或文件夹路径。因此,在一个组件或项目中所有资源文件名需要保持唯一。
从库和控件加载字符串
应用通常具有多个组件或依赖于库,如 .NET 可移植类库、其他兼容类库和控件库。
如果可能,控件和库应尝试减少资源数量,并且依赖于应用来提供它们。当一个库需要提供资源时,它应该允许应用将这些资源替换为输入。如果库与使用它的应用程序具有不同的本地化范围,可能有必要这么做。
例如:
var rating = new WinJS.UI.RatingsControl(el, {label: 'Please Rate', image: 'images/star.png'});
该控件应原封不动地显示传递给它的自定义字符串,如果可能,让应用处理本地化问题。
var control = new Control(el, {commands: [
{label: R.getString('Reply')},
{label: R.getString('ReplyAll')
]});
通常会在生成过程中将组件或库文件添加到包含它们的包的子文件夹中,类似于它们的字符串资源。它们的资源标识符通常采用以下格式:
ClassLibraryOrAssemblyName**/ResourceFileName/**StringName
从编程上讲,库也可针对其资源获取自己的 ResourceLoader。例如,下面的代码演示了一个库如何获取它自己的资源文件的 ResourceLoader:
var resources = Windows.ApplicationModel.Resources;
var RL = new resources.ResourceLoader('ContosoControl/Resources');
RL.getString('loadingStr'); // which came from ContosoControl's Resources
从其他包加载字符串
每个应用包的资源可单独管理,并可通过可从当前 ResourceManager 访问的单独顶级 ResourceMap 对象进行访问。在每个包中,各个组件可拥有其自己 ResourceMap Subtree 值。
框架包可通过一种更加绝对的资源标识符 URI 访问它们自己的资源:
有关 ms-resource URI 的更多详细信息,请参阅 URI 方案。
从 JavaScript 控件加载字符串
提供默认字符串的 JavaScript 控件应利用 WinJS.Resources.getString 获取它们自己的字符串。
加载到 Web 上下文(带有 ms-app-web:)中的 HTML 文档不能访问 Windows 运行时 API。因此在 JavaScript 代码中,包括为了使用 WinJS.Resources.getString 而编写的 JavaScript 控件。在 Web 上下文中,WinJS.Resources.getString 会回退查找给定的标识符作为全局字符串对象的属性。
var strings = { 'String1' : 'Hello' };
WinJS.Resources.getString('String1');
你也可以重写 WinJS.Resources.getString,从不同的位置获取资源。
WinJS.Resources.getString = function(id){
return getStringFromOtherService(id);
}
从应用清单加载字符串
清单中所有可显示的字符串和徽标都可本地化。也可针对比例和高对比度模式调整徽标。可以添加字符串引用替代硬编码的字符串,方法是将 ms-resource: 方案指定的 URI 置于清单数据中(这通常是在用于编辑 appxmanifest 的 Visual Studio 选项卡式 UI 中完成的)。例如,ms-resource:String1
引用 Resources.resw 资源文件中名为 String1
的字符串,而 ms-resource:/ManifestStrings/Shortname
引用 ManifestStrings.resw 资源文件中名为 Shortname
的字符串。
加载针对特定语言或上下文的字符串
默认 ResourceContext(一个从 ResourceManager 获取的对象)表示资源匹配的当前状态。ResourceContext 包含针对当前用户和机器的所有各种限定符值。尽管每个限定符都可重写,但不建议重写它们。大部分限定符都有一个系统数据提供程序,在某些情况下最好通过一个单独的 API(即 PrimaryLanguageOverride)来修改,否则最好保持不变。
请参阅如何使用限定符命名资源,了解各种限定符的详细信息。
ResourceManager 维护对其执行资源查找的默认上下文对象。在某些情况下,在应用加载资源时显式指定语言、比例或其他上下文限定符会很有帮助。例如,一个应用可能允许用户为工具提示或错误消息选择一种备用语言。查找可指定其自己的显式重写上下文对象,以影响对资源的选择。若要指定显式上下文,其中 Languages 属性要特意重写:
var rcns = Windows.ApplicationModel.Resources.Core;
var context = new rcns.ResourceContext(); // deliberately not using getForCurrentView()
context.languages = new Array('fr-fr');
var resourceMap = rcns.ResourceManager.current.mainResourceMap.getSubtree('Resources');
var str = resourceMap.getValue('string1', context).ValueAsString;
你可以使用的另一种方法是在调用 ResourceContext.GetForCurrentView 之前调用 ResourceContext.SetGlobalQualifierContext。对于语言方案,你需要将 language 限定符设置为新值。执行此操作的区别是限定符和上下文更改现在适用于所有资源查找,不只是你为单个 GetValue 调用创建的特定 ResourceContext。另请参阅 ApplicationLanguages.PrimaryLanguageOverride。
事件和上下文更改
当系统更改时,应用仍然可能会处于运行状态。这将导致使用一组不同的限定符。这样的一个更改可能是在用户启用高对比度时。各种系统更改将调用 ResourceContext 对象上的事件。
在 JavaScript 中,侦听这些事件的最简单方式是通过 addEventListener 方法:
WinJS.Resources.addEventListener('contextchanged', refresh, false);
检测到事件后,应用可重新处理文档,以便可加载正确的资源。
function refresh(){
WinJS.Resources.processAll(); // Refetch string resources.
}
重新处理资源可能会导致在将新资源直接应用到元素的属性时,重置资源中的数据绑定值。如果资源包含数据绑定槽,请确保在重新处理时重新绑定它们。
相关主题
Windows.ApplicationModel.Resources.ResourceLoader
Windows.ApplicationModel.Resources.Core.ResourceContext
Windows.ApplicationModel.Resources.Core.ResourceManager
Windows.ApplicationModel.Resources.Core.ResourceMap
Windows.Globalization.ApplicationPreferences.PrimaryLanguageOverride