您的位置:首页 > 其它

Dreamer的FLEX教程翻译:在Flex中使用资源包

2007-04-14 12:53 375 查看
这是转贴人家的翻译的一篇文章:

英文原文:《Using Resource Bundles in Flex》
原文作者:Brian Deitte
原文地址:http://webddj.sys-con.com/read/276863.htm
译者:Dreamer。未经同意,谢绝转载。

[align=center]在Flex中使用资源包[/align]

现在是一个需要多国语言应用程序的时代。Eso es la verdad(这是一个不争的事实,西班牙语)。在Flex中,这个问题的解决方案就是资源包。在这篇文章中,我将描述资源包的基本用法并使用Flex Builder创建了一个小例子。同时我也提供了一些关于更深层次探索的资源以及关于这个特性在未来可能的趋势的一些想法。

资源包基本用法

一个资源包是一个简单的文件,通常叫做属性(properties)文件,里面保存的是key和value。资源包的文件格式和Java属性文件格式很类似,每一行都是 “key=value” 这种格式。它同Java属性文件格式的主要区别是包含非ASCII码的文件需要被保存为UTF-8格式。

属性文件应该放到可以被编译器检测到的路径下,编译器检测资源文件的方式和检测其他源文件的方式相同。属性文件应该以一个特殊的方式被放在一个文件夹下,我会在下面的例子中说明这种方式。

在Flex中可以通过MXML中的 @Resource,ResourceBundle元数据以及ActionScript中的ResourceBundle 类来访问资源包中的值。在MXML或ActionScript中访问资源包需要两个信息—— 包名和key。包名就是属性文件的文件名。所以如果你创建了一个HelloWorldBundle.properties,包名就是HelloWorldBundle。key可以在属性文件中value的左边找到。

配置 Flex Builder 工程

我们现在要在Flex Builder中创建一个新的Flex工程开始我们的例子。创建工程的时候,在data access 选项卡上选择 Basic 并且为工程起一个你喜欢的名字。然后点击 “Next” 输入更多信息。

在编码之前,我们需要为属性文件创建一个目录。这些文件需要呆在它们的目录里,这些目录不能是当前的源路径(source path)。我在项目的默认目录里已经为属性文件创建了一个主文件夹:

程序代码
C:/Documents and Settings/bdeitte/My Documents/Flex Builder 2/locale

我们还需要为拥有资源包的每一种语言分别创建一个子目录。这些子目录的名字必须是我们想要使用的本地名字。 我们将使用对英文字符串使用en_US并且对西班牙字符串使用sp。所以现在我们的子目录有:

程序代码
C:/Documents and Settings/bdeitte/My Documents/Flex Builder 2/locale/en_US
C:/Documents and Settings/bdeitte/My Documents/Flex Builder 2/locale/sp

我们稍候再回来把文件放到这些文件夹里。现在要继续配置Flex Builder工程。为了让工程可以找到这些资源包,我们需要将刚才创建的目录添加到源路径(source path)。我们不会为en_US和sp都添加一个源路径,而是使用特殊的”{locale}”标记。在Flex Builder 中我将这个文件夹添加为一个源路径:

程序代码
C:/Documents and Settings/bdeitte/My Documents/Flex Builder 2/locale/{locale}
然后主程序文件的名改为 HelloWorld.mxml ,点击结束。

编写HelloWorld.mxml

现在在Flex Builder中已经有了一个HelloWorld.mxml。在代码模式下,将HelloWorld.mxml编写成下面这样:

程序代码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Label text="@Resource(key='hello', bundle='HelloWorldBundle')"/>
</mx:Application>

这就是我们创建的 Hello World 程序的MXML文件的所有代码。注意这里的Label的text使用了@Resource 以及key和包的信息。这个时候你可以试着编译HelloWorld.mxml,你会得到下面的错误:

程序代码
Unable to resolve a class for ResourceBundle: HelloWorldBundle.
这里提到了一个类,因为Flex编译器将属性文件看作了一个类,但是它无法找到一个属性文件。

添加属性文件

在早先创建的en_US文件夹中创建HelloWorldBundle.properties。向文件中添加如下内容:

程序代码
hello=Hello World
在sp文件夹下创建HelloWorldBundle.properties,并向其中添加如下内容:

程序代码
hello=Hola Mundo

属性文件的文件名以及等号的左边和我们在@Resource中定义的包名和key是相对应的。如果需要我们可以像下面这样添加更多的key。

程序代码
hello=Hola Mundo
one=uno
bye=Adios

编译并运行

现在我们可以返回到Flex Builder中并运行 HelloWorld了。当运行程序的时候,你可以看到屏幕上最令人兴奋的东西,"Hello World"。

在西班牙语环境下打开该工程,右键点击工程名然后选择属性。在附加的编译器参数里,将locale从”en_US”改为”sp”。 “sp”就是我们放置第二个HelloWorldBundle.properties文件的文件夹名。然后运行该工程,你将看到"Hola Mundo"。

如果你创建这些程序是为了以后使用的话,你需要在创建西班牙语版本的程序之前将英语版程序的输出文件拷贝出来,你也可以在创建最终的SWF文件的时候使用命令行编译器创建这些文件。你或许还需要创建一个HTML或者Flash页面让用户选择使用哪种语言。

进一步的探索

这里我们只是使用了MXML中的@Resource而并没有使用ActionScript中的ResourceBundle元数据。这个是使用资源包的一个重要部分。你可以查看Flex文档中的 "Flex 2 Developer's Guide" 的 "Localizing Flex Applications" 章节来学习这一部分。

在这篇文章中我们并没有讨论资源包的一些更高级的特性:

•如果你创建了资源包SWC,可以在SWC中使用资源包。
•通过使用自定义的资源包可以将全部的类和像图像这样的媒体文件国际化。
•所有的框架都使用了属性文件,而且通过使用框架的源代码你可以将框架本地化。

更多关于这些特性的信息也可以在文档中 "Localizing Flex Applications" 章节找到。

ResourceBundle API文档可以用来更深入地学习资源包,不过不要在意页面上的摘要。说明中的重要篇章通常并不正确。

未来的趋势

使用资源包时会有一些问题,这些问题将会在下一次对Flex更新的时候修正。最明显的一个问题是,Flex Builder会在更新一个属性文件的时候显示错误信息。如果你看到了一个 "Unable to resolve a class for ResourceBundle" 错误并且类的名字以 "_properties" 结尾,你就能知道你是遇到了这种问题。你可以选择清洁工程来除掉这个错误。

Flex Builder在创建本地程序的时候可能会移除需要拷贝的目录,虽然我们以前并没有决定这样做。这个问题可以通过一个可以让用户在多个地区之间选择的对话框来解决。

Flex可以允许资源在运行时被动态检索,虽然我们并没有决定这样。目前,Flex只支持将资源包编译到SWF中。我们计划允许向属性文件中添加媒体和类。这意味着复合资源包将不再需要自定义资源包了。

在更远的将来,Flex可能会使用不同的翻译格式来代替属性文件,比如XML本地化交换文件格式(XML Localization Interchange File Format)。

如果你想要资源包将来有更多特性,你可以通过这个地址bdeitte@adobe.com向我发电子邮件。我也将会在www.deitte.com上发布关于资源包的更新以及以后对资源包的研究。

------------------------------------------------------------------------------------------

关于Brian Deitte

Brian Deitte 是Flex小组的高级软件工程师。四年前他在Allaire从事Jrun的工作,后来转向ColdFusion。现在他专注于所有和Flash有关的东西。他的个人网站是 www.deitte.com。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: