您的位置:首页 > 其它

flex多语言切换方式-i18n

2014-03-22 14:38 417 查看
Flex使用ResourceManager,可以实现Flex多语言解决方案,新建不同的语言版本文件,通过设定采用哪种语言,即可实现相关字段显示对应的语言版本。

(注:可参考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"));

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: