如果你打算发布你的应用程序到全球各地,你可能需要为不同地区的用户界 面准备不同的版本。至少,这需要解决将文本翻译成适当的语言;同样需要解决 UI改变的问题。你可能需要特定的外观适应为本地化的文化习俗。或者,你可能 会发现原始的外观在翻译后并不能正常工作,因为词的长度是不一样的。(虽然 WPF的外观体系避免了这一问题,更易于创建更弹性的外观。)
为你的软件在不同的市场创建不同的版本是可能的。尽管如此,更加普遍的 办法是创建一个单独的版本来适应于不同的场所,通过在运行期选取一个合适的 资源文件。WPF的底层架构ResourceManager可以相当直接地使用这个办法。
Microsoft对本地化和全球化加以区别。本地化是一个支持一个应用程序在意 个特定的场所使用的过程,通过创建特定文化的资源如文本的翻译。全球化是一 个确保一个应用程序可以被本地化而不用编译的过程。使用ResourceManager可 以帮助我们对应用程序进行全球化,因为这个类的在运行期选择的资源支持一个 单独的应用程序版本通过提供合适的资源进行本地化。更多信息请参考微软国际 站点http://msdn.microsoft.com/library/default.asp?url=/library/en- us/vbcon/html/vboriInternationalization.asp (http://shrinkster.com/6m9).
当一个ResourceManager被要求按名称获取资源流时,首先它要决定使用哪种 文化。文化时语言与区域的合称,被典型地表示为一个短字符串。例如,en-US 表示在美国使用的英语。而en-GB则代表在英国使用的英语。前两个字母表明语 言,后两个表示区域。同时指明语言和区域是因为即使两种文化共用一种语言, 在方言和习语上还是有差别的。例如,本书的作者之一来自en-GB,因此喜欢使 用color而不是colour。
ResourceManager的GetStream方法使用一个CultureInfo对象作为参数。如果 你想使用用户最终配置过的文化,你可以从Thread.CurrentThread的 CurrentUICulture属性重新获取一个CultureInfo对象。
虽然可执行体经常将资源编译到其中,ResourceManager仍然会先寻找指定文 化的资源,在求诸于内嵌资源之前。首先会在包含应用程序目录的子目录中按文 化名称搜索。因此,如果你的应用程序运行在French-Canadian的文化上,会在 名为fr-CA的子目录中寻找一个叫做MyApp.resources.dll的文件,这里MyApp是 应用程序或组件的名称。如果不存在,会接着在寻找名为fr的目录寻找相同的文 件。这意味着一旦你的翻译预算并不扩展到为全世界所有使用法语的不同区域产 生不同的版本,你可以取代的提供一套单独的法语资源,专门用于使用法语的区 域。如果这些子目录都不存在这个文件,它将求助于使用内嵌资源。
这些被ResourceManager寻找的DLL资源称为全球化编译资源,命名的原因是 这些资源都是很小的资源,聚集为一个大的编译集。
注意到,一旦你提供了一个全球化编译集,你就不需要提供所有资源的本地 化版本。这样那些内嵌在你的主编译集的资源对于所有资源都是很是的。例如, 图6-6中的应用程序有一个内嵌的bmp文件Sunset.jpg。世界大部分都会有日落, 所以你仍可能需要为南极和北极的版本做特殊的工作。基本的Sunset.jpg可以为 大多数文化使用。这将要浪费空间对于每个全球化资源都要获取同一张图片的副 本。幸运的是,这不是必须的。如果一个特定的命名资源在全球化编译资源中并 不存在,ResourceManager将会回到内嵌资源中来。
你可以把全球化编译资源想象为仅包含内嵌资源和目标文化所需资源之间的 差别。任何普通的资源都单独位于主编译集中。一个特定语言但不限区域的编译 集所在的子目录(如fr子目录),包含不同于特定语言的所需资源。而且,完全 特定文化的子目录(如fr-CA,fr-FR,fr-BE等)包含那些需要考虑当地习语的 资源(在这里的上下文中,“资源”是一个通过ResourceManager重新获得的流 ,而不是通过ResourceDictionary重新获取到的对象)