一种方法
支持多语言/风格的 flex 应用程序
是手动的 - 每种语言都有一个 Flex 应用程序项目,每个项目都包含适当的样式和资源文件。您可以将公共代码移动到每个应用程序所依赖的库项目中......但这不会很好地扩展到超过 3 种语言。
更好但更复杂的是只有一个应用程序,它在运行时加载一个语言资源包和一个特定于语言的 CSS 文件。
首先,您的应用程序需要“知道”它所显示的语言。也许您对用户进行身份验证,从服务器了解他们的语言环境,然后为该语言环境加载 ResourceBundle。
其次,您加载特定于语言环境的 CSS 以适应加载的语言。我建议您将样式表拆分为“main”(编译到应用程序中,具有所有不会更改的样式)和“locale”(仅包含根据语言更改的样式)。
尽早在您的应用程序启动过程中,加载您的语言 .css 文件(例如,从服务器 URL),例如
var cssLoader:URLLoader = new URLLoader();
var req:URLRequest = new URLRequest("path_to_server_side_css_file");
cssLoader.addEventListener(Event.COMPLETE, cssLoadCompleteHandler);
cssLoader.addEventListener(IOErrorEvent.IO_ERROR, someErrorHandler);
cssLoader.load(req);
在 cssLoadCompleteHandler() 中,魔法发生了。你想去掉任何可能妨碍你解析的东西,比如注释、空行,也许是命名空间。然后迭代提取每个样式、选择器等的文件。基本上你在这里是字符串黑客,这从来都不是最有趣的代码:/ 这是一个不平凡的代码块,你会想要最干净、最有纪律的CSS 文件,你必须让它工作。它与尝试解析 HTML 的复杂性没有什么不同,只是希望您可以控制 CSS 输入的质量。(你会想要对此进行一些测试,相信我)
无论如何...一旦您拥有每种样式,例如 .foo{} 或 #bar {} 等,然后调用
FlexGlobals.topLevelApplication.styleManager.setStyleDeclaration(...) ;
依次为每一个。最后打电话
FlexGlobals.topLevelApplication.styleManager.styleDeclarationsChanged();
现在,您可以使用styleManager.getStyleDeclaration("")
Skin 类中的样式(通过 )来获得您需要的样式,无论是从烘焙样式还是动态加载的样式。
希望能有所帮助。它可以做到,但实施起来并非易事。祝你好运。