我要求能够提供英语和几种亚洲语言的flex组件。我看过flex文档,似乎我必须构建几个swf,这感觉不对。
有没有人知道用不同语言捆绑字符串资源并处理字体的简单实用方法?
答案 0 :(得分:7)
我想你知道如何本地化Flex应用程序的基础知识,但是如果你想了解更多,那么这里有一个很好的详细描述:Runtime Localization。
在Flex 3中,您有三种方法可以解决问题:
第一种选择可能是最常见的,最不复杂的并且没有很多缺点。如果您有特殊需求,可以使用另外两个,例如必须不惜一切代价降低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"];
通过上面显示的设置,资源管理器将首先查看瑞典资源包,其次是美国英语资源包。您可以随时设置其他订单,这样做会改变应用程序中的所有文本。
我建议您阅读the description I referred to above,它会更详细地解释这一点,并且最有可能以更易懂的方式解释。它还解释了在使用en_US以外的语言环境编译应用程序之前,如何做一些准备工作。
你遇到的另一个问题是字体。那个比较棘手。最好的方法是使用具有完整Unicode字符范围的字体,这样您只需要嵌入该字体,并且可以显示任何文本。但是,这意味着您的选择有限。我知道在Windows中至少有一个版本的Aria拥有大量的角色,在Mac上有一个Helvetica(我认为,或者它可能是Lucida Grande,或两者兼而有)也有大多数版本的你需要展示许多亚洲语言。
将所有语言嵌入到同一个SWF中通常对增加文件大小没什么影响,因为文本非常轻量级,但字体绝对不是。嵌入整个Unicode版本的Arial可以将SWF的文件大小增加几兆字节,这对于Web应用程序来说很糟糕。根据情况,您可能必须为每种语言编译一个SWF,因为否则字体数据会使SWF变得难以处理。
答案 1 :(得分:1)
小心字体。系统字体不是最漂亮但亚洲字体太大而无法嵌入。我们使用拉丁字体嵌入英文并切换到中文的系统字体。
小心旋转系统字体 - 您的文字将消失。我认为Flash 10可能已经解决了这个问题。
另外,要非常小心为中文指定的字体字符串。
大多数操作系统都有漂亮的回退逻辑 - 如果指定Trebuchet并尝试渲染中文字符,您的操作系统可能会决定使用某种亚洲字体。 Flash似乎搞砸了这个后备逻辑并动态地在两个或更多亚洲字体之间切换。我们遇到过鼠标悬停在文本块上会切换字体的情况。
要解决此问题,请指定包含所需字符的字体(不要回退到其他字体)。您需要在操作系统等方面进行测试。
答案 2 :(得分:0)
我们将Flex用于我们应用程序的客户端部分,并通过ResourceBundle
支持I18N。
答案 3 :(得分:0)
在Flex 2.01中,语言必须内置到SWF中 - 您无法在运行时更改它。在Flex 3中,您可以在运行时切换语言。
http://labs.adobe.com/wiki/index.php/Flex_3:Feature_Introductions:_Runtime_Localization
答案 4 :(得分:0)
上面遗漏的一个重要步骤是运行命令:
copylocale.exe en_US sv_SE
来自sdk的bin文件夹。这是在文章中。