在Flex应用程序中处理英语和中文的最佳方法是什么?
我要求能够提供英语和几种亚洲语言的flex组件。我看了一下flex文档,似乎我必须建立几个swf,感觉很不对劲。
有谁知道捆绑不同语言的字符串资源和处理字体的简单实用的方法吗?
解决方案
我们将Flex用于我们的应用程序的客户端,并通过ResourceBundle
s支持I18N。
在Flex 2.01中,该语言必须内置到SWF中,我们不能在运行时进行更改。在Flex 3中,我们可以在运行时切换语言。
http://labs.adobe.com/wiki/index.php/Flex_3:Feature_Introductions:_Runtime_Localization
我想我们已经知道如何本地化Flex应用程序的基础知识,但是如果我们想了解更多信息,可以在这里找到完整而完整的描述:运行时本地化。
在Flex 3中,我们可以使用三个选项来解决问题:
- 将所有语言编译成SWF并在运行时切换语言
- 为每种语言编译一个单独的SWF
- 将无语言或者默认语言编译到SWF中,并在运行时加载其他语言
第一个选项可能是最常见,最不复杂且没有很多缺点的选项。如果我们有特殊需要(例如必须不惜一切代价减小SWF的大小,或者需要在运行时从数据库加载所有字符串),则可以使用其他两个。
要实现第一个选项,我们需要为每种语言创建一个资源束(基本上是一些.properties文件,这些文件位于以语言环境命名的目录中,例如,en_US(美国英语)或者sv_SE(瑞典语))。在代码中,我们通过调用资源管理器来引用字符串:
<Label text="{resourceManager.getString('mybundle', 'mystring")'}/>
这将从当前语言环境中的" mybundle.properties"编译的资源包中检索一个名为" mystring"的字符串。
为了确保每个语言环境实际上都已编译到应用程序中,请在编译器标志中添加" -locale = en_US,sv_SE"(但将" en_US,sv_SE"部分更改为我们拥有资源包的语言)。我们还需要将目录的位置添加到源路径中:-source-path + = locale / {locale}`(" {locale}"部分将自动替换为" -locale"的值)旗帜)。
现在,我们已将所有语言编译到SWF中,并且可以在运行时更改语言。做到这一点的方法是修改资源管理器的localeChain
属性:
resourceManager.localeChain = ["sv_SE", "en_US"];
使用上面显示的设置,资源管理器将首先在瑞典资源包中查找,然后在美国英语中查找。我们可以随时设置另一个顺序,这样做会在该位置更改应用程序中的所有文本。
我鼓励我们阅读我上面提到的描述,它会更详细地对此进行解释,并且很有可能以一种更易于理解的方式进行解释。它还说明了如何使用en_US以外的语言环境编译应用程序之前,需要做一些准备工作。
我们遇到的另一个问题是字体。那个比较棘手。最好的办法是拥有一个完整的Unicode字符范围的字体,这样,我们只需嵌入该字体即可显示任何文本。但是,这意味着选择受到更多限制。我知道Windows中至少有一个版本的Aria包含大量字符,在Mac上有一个Helvetica(我想,或者可能是Lucida Grande,或者两者兼有),其中也有大多数我们需要显示许多亚洲语言。
将所有语言嵌入同一SWF文件通常不会增加文件大小,因为文本非常轻巧,但字体绝对不是。嵌入整个Unicode版本的Arial可以使SWF的文件大小增加几兆字节,这对于Web应用程序来说很糟糕。根据情况,我们可能不得不为每种语言编译一个SWF,只是因为字体数据否则会使SWF变得笨拙。
上面遗漏的重要步骤是运行命令:
copylocale.exe en_US sv_SE
从sdk的bin文件夹中。这是在文章中。
当心字体。系统字体不是最漂亮,但是亚洲字体太大而无法嵌入。我们将嵌入英语的拉丁字体和切换为中文的系统字体作为诉求。
小心旋转系统字体,文本将消失。我认为Flash 10可能已解决此问题。
另外,请特别注意为中文指定的字体字符串。
如果我们指定Trebuchet并尝试呈现中文字符,则大多数操作系统都具有精巧的后备逻辑,操作系统可能会决定使用某些亚洲字体。 Flash似乎弄乱了这种后备逻辑,并在两种或者更多种亚洲字体之间动态切换。在某些情况下,将鼠标悬停在文本块上会切换字体。
要解决此问题,请指定一种字体,其中包括所需的所有字符(而不会回退到其他字体)。我们将需要在各种操作系统之间进行测试,等等。