Flex使用ResourceManager,可以实现Flex多语言解决方案,新建不同的语言版本文件,通过设定采用哪种语言,即可实现相关字段显示对应的语言版本。
(注:可参考Tour de Flex中的输入resource可以找到例子 Localization供参考)
实现步骤如下:
参考资料:http://www.cnblogs.com/WideWeide/archive/2010/03/16/1687668.html
右击项目,选择属性,在Flex 编译器中输入:(这里提供中文和英文两种版本)
-locale en_US -locale zh_CN -source-path=locale/{locale}
在src目录下,新建locale文件夹,在locale文件夹;
在locale文件夹下,新建en_US文件夹,在文件夹内新建rtis.properties文件:
admin=user_Id
password=password
在locale文件夹下,新建zh_CN文件夹,在文件夹内新建rtis.properties文件:
admin=登录名称
password=登录密码
(注:两种方法都要添加引用的资源,rits与新建的rtis.properties文件名相对应
<fx:Metadata>
[ResourceBundle("rtis")]
</fx:Metadata>)
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<!--添加资源文件-->
<fx:Metadata>
[ResourceBundle("rtis")]
</fx:Metadata>
<fx:Script>
<![CDATA[
import base.ResourceUtil;
import mx.resources.ResourceManager;
[Bindable]
public var nameString:String;
[Bindable]
public var passwordString:String;
[Bindable]
private var locales:Array = [
{label: "English", code:"en_US"},
{label: "Chinese", code:"zh_CN"} ];
//方法一,直接使用resourceManager
private function changeHandler(event:Event):void
{
//修改采用的语言版本
resourceManager.localeChain = [ localeComboBox.selectedItem.code ];
nameString=ResourceManager.getInstance().getString("rtis","admin");
passwordString=ResourceManager.getInstance().getString("rtis","password");
}
//方法二,采用resourceUitl自定义的ResourceManager封装
private function changeHandler2(event:Event):void
{
//修改采用的语言版本
ResourceUtil.getInstance().changeLanguage(localeComboBox2.selectedItem.code);
nameString=ResourceUtil.getInstance().getString("admin");
passwordString=ResourceUtil.getInstance().getString("password");
}
]]>
</fx:Script>
<s:VGroup width="100%"
height="100%">
<s:HGroup gap="30">
<s:Label text="方法一"/>
<mx:ComboBox id="localeComboBox" dataProvider="{locales}"
change="changeHandler(event)"/>
</s:HGroup>
<s:HGroup gap="30">
<s:Label text="方法二"/>
<mx:ComboBox id="localeComboBox2" dataProvider="{locales}"
change="changeHandler2(event)"/>
</s:HGroup>
<s:Label id="label1" text="{nameString}"/>
<s:Label id="label2" text="{passwordString}"/>
</s:VGroup>
</s:WindowedApplication>
参考资料:http://hackerzhou.me/2011/04/develop-flex-exprience-chapter-two-localization.html
package base
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class ResourceUtil extends EventDispatcher
{
import mx.resources.IResourceManager;
import mx.resources.ResourceManager;
import mx.controls.Alert;
private static const BUNDLE_NAME:String ="rtis";
[Bindable]
public static var resourceManager:IResourceManager = null;
private static var instance:ResourceUtil = null;
private static var currentLanguage:String = "zh_CN";
public static function getInstance():ResourceUtil {
if(instance == null) {
instance = new ResourceUtil();
resourceManager = ResourceManager.getInstance();
resourceManager.initializeLocaleChain([currentLanguage]);
}
return instance;
}
public function changeLanguage(languageName:String):void {
resourceManager.localeChain.localeChain = [languageName];
currentLanguage = languageName;
dispatchChange();
}
[Bindable("change")]
public function getImage(resName:String):Class {
var result:Class = resourceManager.getClass(BUNDLE_NAME, resName
, currentLanguage);
return result;
}
[Bindable("change")]
public function getString(resName:String, para:Array = null):String {
var result:String = resourceManager.getString(BUNDLE_NAME, resName, para
, currentLanguage);
return result;
}
private function dispatchChange():void
{
dispatchEvent(new Event("change"));
}
}
}
(注:可参考Tour de Flex中的输入resource可以找到例子 Localization供参考)
实现步骤如下:
参考资料:http://www.cnblogs.com/WideWeide/archive/2010/03/16/1687668.html
1、设置编译参数
右击项目,选择属性,在Flex 编译器中输入:(这里提供中文和英文两种版本)
-locale en_US -locale zh_CN -source-path=locale/{locale}
2、新建语言资源文件
在src目录下,新建locale文件夹,在locale文件夹;
在locale文件夹下,新建en_US文件夹,在文件夹内新建rtis.properties文件:
admin=user_Id
password=password
在locale文件夹下,新建zh_CN文件夹,在文件夹内新建rtis.properties文件:
admin=登录名称
password=登录密码
3、编码实现以I18NTest.mxml为例,采用两种方式
(注:两种方法都要添加引用的资源,rits与新建的rtis.properties文件名相对应
<fx:Metadata>
[ResourceBundle("rtis")]
</fx:Metadata>)
I18NTest.mxml:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<!--添加资源文件-->
<fx:Metadata>
[ResourceBundle("rtis")]
</fx:Metadata>
<fx:Script>
<![CDATA[
import base.ResourceUtil;
import mx.resources.ResourceManager;
[Bindable]
public var nameString:String;
[Bindable]
public var passwordString:String;
[Bindable]
private var locales:Array = [
{label: "English", code:"en_US"},
{label: "Chinese", code:"zh_CN"} ];
//方法一,直接使用resourceManager
private function changeHandler(event:Event):void
{
//修改采用的语言版本
resourceManager.localeChain = [ localeComboBox.selectedItem.code ];
nameString=ResourceManager.getInstance().getString("rtis","admin");
passwordString=ResourceManager.getInstance().getString("rtis","password");
}
//方法二,采用resourceUitl自定义的ResourceManager封装
private function changeHandler2(event:Event):void
{
//修改采用的语言版本
ResourceUtil.getInstance().changeLanguage(localeComboBox2.selectedItem.code);
nameString=ResourceUtil.getInstance().getString("admin");
passwordString=ResourceUtil.getInstance().getString("password");
}
]]>
</fx:Script>
<s:VGroup width="100%"
height="100%">
<s:HGroup gap="30">
<s:Label text="方法一"/>
<mx:ComboBox id="localeComboBox" dataProvider="{locales}"
change="changeHandler(event)"/>
</s:HGroup>
<s:HGroup gap="30">
<s:Label text="方法二"/>
<mx:ComboBox id="localeComboBox2" dataProvider="{locales}"
change="changeHandler2(event)"/>
</s:HGroup>
<s:Label id="label1" text="{nameString}"/>
<s:Label id="label2" text="{passwordString}"/>
</s:VGroup>
</s:WindowedApplication>
附上base.ResourceUtil自定义的ResourceManager封装ResourceUtil.as代码:
该类采用了单例的模式参考资料:http://hackerzhou.me/2011/04/develop-flex-exprience-chapter-two-localization.html
package base
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class ResourceUtil extends EventDispatcher
{
import mx.resources.IResourceManager;
import mx.resources.ResourceManager;
import mx.controls.Alert;
private static const BUNDLE_NAME:String ="rtis";
[Bindable]
public static var resourceManager:IResourceManager = null;
private static var instance:ResourceUtil = null;
private static var currentLanguage:String = "zh_CN";
public static function getInstance():ResourceUtil {
if(instance == null) {
instance = new ResourceUtil();
resourceManager = ResourceManager.getInstance();
resourceManager.initializeLocaleChain([currentLanguage]);
}
return instance;
}
public function changeLanguage(languageName:String):void {
resourceManager.localeChain.localeChain = [languageName];
currentLanguage = languageName;
dispatchChange();
}
[Bindable("change")]
public function getImage(resName:String):Class {
var result:Class = resourceManager.getClass(BUNDLE_NAME, resName
, currentLanguage);
return result;
}
[Bindable("change")]
public function getString(resName:String, para:Array = null):String {
var result:String = resourceManager.getString(BUNDLE_NAME, resName, para
, currentLanguage);
return result;
}
private function dispatchChange():void
{
dispatchEvent(new Event("change"));
}
}
}