`
luhantu
  • 浏览: 204090 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Flex 国际化(flex Localize)

    博客分类:
  • Flex
阅读更多

项目中用到flex国际化,虽然以前也用过,也是直接嵌入到程序中,现在有要求要放到外面模块中去,虽然网上教程多多,但是遇到还是遇到很多问题,籍此写下此文,加深印象之用。如果有哪位仁兄只好也用到此,希望能有所帮助,废话至此,正文开始。

先说说编译到主程序中去的方法吧。

1.创建资源文件夹

譬如可以在src文件夹下创建Locale文件夹,然后在此文件夹再次创建每个地区的资源文件夹,譬如de_DE,zh_CN.

然后分别创建后缀名为.properties的资源文件,分别放到各个地区的文件夹中。资源文件是可以包括任何事情,从字符串,数字,格式化和图片到样式。每个地区可以生成一个单独的文件。参考:CreateLocaleFiles.png

2.创建资源文件

创建了名为resources.properties的资源文件,内容为:

 

## resources.properties file for locale de_DE ## 

# contact-form labels and assets 
contact.title=Contact Form 
contact.flagImg=assets/us.gif 
contact.submit=Submit 

# contact-form fields 
contact.field.name=Name 
contact.field.streetAddress=Street Address 
contact.field.city=City 
contact.field.state=State 
contact.field.zipCode=ZIP Code 
contact.field.country=Country

 

3.创建mxml文件

 

<?xml version="1.0" encoding="utf-8"?>
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
		  xmlns:s="library://ns.adobe.com/flex/spark" 
		  xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="100%">
	<fx:Metadata>
		[ResourceBundle("resources")]
	</fx:Metadata>
	<fx:Script>
		<![CDATA[
			private var locales:Array = [{label:"English (United States)", locale:"en_US"},
				{label:"中文 (中国)", locale:"zh_CN"},
				{label:"German (Denmark)", locale:"de_DE"},
				{label:"French (France)", locale:"fr_FR"},
				{label:"Japanese (Japan)", locale:"ja_JP"}];
			
			private function comboChangeHandler():void
			{
				resourceManager.localeChain = [localeComboBox.selectedItem.locale];
			}
		]]>
	</fx:Script>
	
	<s:Panel title="{resourceManager.getString('resources','contact.title')}" color="black" borderAlpha="0.15" width="350">
		<s:layout>
			<s:VerticalLayout horizontalAlign="center" paddingLeft="10" paddingRight="10" paddingTop="10" paddingBottom="10" />
		</s:layout>
		
		<mx:Form width="100%" color="0x323232">
			<mx:FormItem label="{resourceManager.getString('resources','contact.field.name')}">
				<s:TextInput />
			</mx:FormItem>
			<mx:FormItem label="{resourceManager.getString('resources','contact.field.streetAddress')}">
				<s:TextInput />
			</mx:FormItem>
			<mx:FormItem label="{resourceManager.getString('resources','contact.field.city')}">
				<s:TextInput />
			</mx:FormItem>
			<mx:FormItem label="{resourceManager.getString('resources','contact.field.state')}">
				<s:TextInput />
			</mx:FormItem>
			<mx:FormItem label="{resourceManager.getString('resources','contact.field.zipCode')}">
				<s:TextInput />
			</mx:FormItem>
			<mx:FormItem label="{resourceManager.getString('resources','contact.field.country')}">
				<s:TextInput />
			</mx:FormItem>
			<mx:FormItem>
				<s:Button label="{resourceManager.getString('resources','contact.submit')}" />
			</mx:FormItem>
		</mx:Form>
	</s:Panel>
	<mx:Spacer height="15" />
	
	<s:HGroup width="350" verticalAlign="middle">
		<mx:Spacer width="100%" />
		<mx:Image source="{resourceManager.getString('resources','contact.flagImg')}"/>
		<mx:ComboBox id="localeComboBox" dataProvider="{locales}" change="comboChangeHandler()"/>
	</s:HGroup>
</s:VGroup>

 

 4.配置Flex 编译参数

选中项目名称右键-Properties-Flex Complier-Addtional compiler arguments中添加

 

-locale=en_US,zh_CN -allow-source-path-overlap=true -source-path=Locale/{locale}

 这样就可以了,你可以通过切换发现可以实现国际化了,哈哈,不过只有两种地区的简单demo。

 

再谈谈用module分别加载不同地区资源

 

到底怎样加载这些资源文件决定于你的程序许多支持多少地区本地化。

a.如果你仅仅只是支持一到两个地区的本地化,那么一般来说就是直接编译到程序中。

b.如果要支持很多种本地化,一般选择在运行时加载所需的本地化资源。资源模块和编译入主程序相比,资源模块是一种比较好的本地化方式,因为它指定的资源模块可以在运行时加载。这样可以减小主程序的文件大小,但是如你所见你必须为每个资源模块加载一个单独的swf文件。这样的话会增加网络请求并且合成的主程序的大小比直接编译入主程序的方式更大。尽管如此,如果你有很多本地化的需求,分别单独的加载它们从长远来看会节省资源。

1.2 和上面一样

3.建立mxml文件

 

<?xml version="1.0" encoding="utf-8"?>
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
		  xmlns:s="library://ns.adobe.com/flex/spark" 
		  xmlns:mx="library://ns.adobe.com/flex/mx" 
		  width="100%" 
		  height="100%" 
		  creationComplete="initApp()">
	<fx:Script>
		<![CDATA[
		import mx.controls.Alert;
		import mx.events.ResourceEvent;
		import mx.resources.ResourceBundle;
		
		[Bindable]
		private var locales:Array = [ "zh_CN","de_DE" ];
		
		private function initApp():void {
			/* Set the index to -1 so that the prompt appears 
			when the application first loads. */
			localeComboBox.selectedIndex = -1;            
		}
		
		private function registrationComplete():void {
			Alert.show(resourceManager.getString('resources', 'thanks'));
		}  
		
		private function comboChangeHandler():void {
			var newLocale:String = String(localeComboBox.selectedItem);
			
			/* Ensure that you are not loading the same resource module more than once. */
			if (resourceManager.getLocales().indexOf(newLocale) != -1) {
				completeHandler(null);
			} else {
				// Build the file name of the resource module.
				var resourceModuleURL:String = newLocale + "_ResourceModule.swf";
				
				var eventDispatcher:IEventDispatcher = 
					resourceManager.loadResourceModule(resourceModuleURL);
				eventDispatcher.addEventListener(ResourceEvent.COMPLETE, completeHandler);
			}            
		}
		
		private function completeHandler(event:ResourceEvent):void {
			resourceManager.localeChain = [ localeComboBox.selectedItem ];
			
			/* This style is not bound to the resource bundle, so it must be reset when 
			the new locale is selected. */
			var test:String = resourceManager.getString('resources','contact.field.city');
			b1.setStyle("downSkin", resourceManager.getClass("RegistrationForm", "flag"));            
		}        
	]]></fx:Script>
	<s:Image source="{resourceManager.getClass('resources', 'flag')}"/>
	<mx:ComboBox id="localeComboBox" 
				 prompt="Select One..."
				 dataProvider="{locales}"
				 change="comboChangeHandler()"/>
	<mx:Form width="100%" color="0x323232">
		<mx:FormItem label="{resourceManager.getString('resources','contact.field.name')}">
			<s:TextInput />
		</mx:FormItem>
		<mx:FormItem label="{resourceManager.getString('resources','contact.field.streetAddress')}">
			<s:TextInput />
		</mx:FormItem>
		<mx:FormItem label="{resourceManager.getString('resources','contact.field.city')}">
			<s:TextInput />
		</mx:FormItem>
		<mx:FormItem label="{resourceManager.getString('resources','contact.field.state')}">
			<s:TextInput />
		</mx:FormItem>
		<mx:FormItem label="{resourceManager.getString('resources','contact.field.zipCode')}">
			<s:TextInput />
		</mx:FormItem>
		<!--<mx:FormItem label="@Resource(key='contact.field.zipCode', bundle='resources')">
			<s:TextInput />
		</mx:FormItem>-->
		<mx:FormItem>
			<s:Button label="{resourceManager.getString('resources','contact.submit')}" />
		</mx:FormItem>
	</mx:Form>
	
	<s:Button id="b1" 
			  label="{resourceManager.getString('resources','submit_button')}" 
			  click="registrationComplete()"/>
</s:VGroup>
 

4.确定需要哪些资源束

在你编译资源模块之前,你必须知道那些资源束应该放到它里面。换句话说,你必须要知道那些资源是你的主程序-包括它的框架-真正需要的。这不仅仅包括你所创建程序需要的的资源,而且也包括程序框架需要的资源

在你的flex bulider中找到mxmlc.exe 文件,例如我的在:C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\bin,执行

 

mxmlc -locale= -resource-bundle-list=myresources.txt F:\demo\Demo\src\view\resource\ResourceMoudleDemo.mxml

 

当你使用resource-bundle-list选项时,你还必须设置locale的值为空。

myresource.txt 就是待会要把你所有要国际化的页面和框架所需的所有文件名输出到这个文件中,地址就在mxmlc.exe文件的同一目录

F:\demo\Demo\src\view\resource\ResourceMoudleDemo.mxml 就是你要国际化的页面的绝对路径

执行完后到myresource.txt中查看,内容为:

 

bundles = collections components containers controls core effects layout resources skins styles textLayout 

 其中的resources就是自定义的资源文件,其他就是框架所用的文件了

5.把所有的文件都编译到一个swf中

 

mxmlc -locale=de_DE
-source-path=F:\demo\Demo\src\Locale\{locale} -include-resource-bundles=resources,collections,components,containers,controls,core,effects,layout,skins,styles,
textLayout -output de_DE_ResourceModule.swf

 这个时候就会在mxmlc.exe中相同的目录中生成de_DE_ResourceModule.swf。

然后你再改变下-locale=zh_CN,生成zh_CN_ResourceModule.swf。

然后把这两个swf放到主程序相同目录下,测试加载即可。

 

 

  • 大小: 15.2 KB
分享到:
评论

相关推荐

    swift-Localize一个swift框架用于本地化您的项目提高国际化

    Swift编程语言以其强大的功能和简洁的语法在iOS和macOS应用开发中占据着核心地位。在构建全球化应用程序时,本地化是一项至关...在实际项目中采用`Localize-Swift`,可以显著提升开发效率,同时确保应用的国际化质量。

    Flex中采用Flex-config.xml进行命令行的编译

    `&lt;keep-as3-metadata&gt;`可以保留AS3元数据,例如用于处理资源国际化的`Localize-behavior`。 博客链接中提到的`flex-config.xml`修改,可能涉及上述某一项或多项配置,具体修改需查看博主提供的具体内容。通常,...

    前端项目-jquery-localize.zip

    【前端项目-jquery-localize.zip】是一个包含jQuery插件的压缩包,主要目的是为静态网站提供国际化(i18n)支持。这个插件被称为jQuery-localize,它使得开发者能够轻松地根据用户所在的地区或语言,展示不同的内容...

    jquery.localize.zip

    《jQuery.Localize:JavaScript 国际化插件详解与应用》 在当今全球化背景下,网站和应用程序需要支持多语言环境,以满足不同地区用户的需求。jQuery.Localize 是一个优秀的 JavaScript 插件,专为实现这一目标而...

    nicen-localize-image,是一款用于本地化文章的外部图片的插件

    nicen-localize-image 是一款专为WordPress平台设计的高效工具,其主要目标是帮助用户实现文章中外部图片的本地化处理。这款插件的强大之处在于它能无缝集成到您的WordPress站点,提供多种自动化和手动方式,确保您...

    Visual Localize 6.1 Setup

    是一款与 Visual Localize 相似的功能强大的可视化软件本地化工具。 支持 VC、VB、.NET、文本等软件的本地化。CATALYST 的特色包括:方案以资源树的方式显现;与 LocStudio 一样也支持“伪翻译”;支持.rc 文档的...

    Visual Localize 6.1 汉化包

    Visual Localize是一款强大的本地化工具,专为软件的多语言版本提供便捷的翻译和管理服务。6.1版本作为其一重要迭代,引入了多项改进和新功能,以满足用户在处理全球化软件项目时的需求。 首先,Visual Localize ...

    iOS国际化(APP国际化)

    iOS国际化,也称为APP国际化,是指为iOS应用开发过程中实现多语言支持的过程,使得应用程序能够适应不同国家和地区的用户需求。这一过程涉及到资源文件、代码、用户界面等多方面的调整和优化,确保无论用户身处何处...

    jquery.localize.js

    jquery.localize.js,系统多语言支持相关js,自定义语言包

    MVC国际化,MVC多语言,.NET多语言

    MVC国际化的实现是为了使应用程序能够支持多种语言,包括中英文切换,这对于全球化的网站和应用至关重要。下面将详细讨论MVC国际化、MVC多语言以及.NET多语言的实现策略。 1. **MVC国际化基础** - **Resource ...

    Angular-nativescript-localize.zip

    Angular-nativescript-localize.zip,不推荐使用nativescript的本机国际化插件,该插件使用每个platformnativescript本地化的本机功能,Angularjs于2016年发布,是Angularjs的重写版。它专注于良好的移动开发、模块化...

    asp.net实现国际化的例子

    3. 在ASP.NET页面中应用:在ASP.NET Web Forms中,可以使用`Localize`控件或`Global.asax`文件的`Application_AcquireRequestState`事件来实现页面内容的国际化。`Localize`控件可以直接与资源文件关联,显示相应...

    国际化支持

    国际化支持是软件开发中的一个重要环节,它使得应用能够适应不同国家和地区的用户需求,提供多语言界面和本地化内容。在iOS应用开发中,苹果提供了强大的国际化和本地化框架,帮助开发者轻松实现这一功能。本教程...

    Winform国际化.zip

    当我们谈论“Winform国际化”时,我们实际上是指使Winform应用程序能够适应不同语言和文化背景的过程。这涉及到对用户界面(UI)元素,如按钮文本、菜单项、对话框消息等进行多语言支持。在本文中,我们将深入探讨...

    前端 JQuery 网页国际化 中英繁切换的实现示例

    在前端开发中,实现网页的国际化是一个常见的需求,它允许网站根据用户所在的地区或语言设置显示相应的内容。在这个示例中,我们关注的是如何利用JQuery实现中英繁三种语言的切换。`JQuery`是一种广泛使用的...

    swift国际化.zip

    开源项目"swift国际化.zip"提供的Localize-Swift-master是一个专为Swift开发者设计的本地化工具,旨在简化Swift应用的国际化过程,并支持在应用内部动态切换语言。 首先,我们需要理解什么是i18n和l10n。i18n代表...

    angular国际化i18n

    Angular 国际化(i18n)是 Angular 框架提供的一项功能,它使得开发者能够轻松地构建多语言应用,以适应全球化的市场需求。在本文中,我们将深入探讨 Angular i18n 的核心概念、工作原理以及如何在实际项目中实现这一...

    go-localize:Go编写的i18n(国际化和本地化)引擎,用于翻译语言环境字符串

    本地化 使用Go编写的简单易用的i18n(国际化和本地化)引擎,用于翻译语言环境字符串。 在或。 目前支持JSON,YAML,TOML和CSV转换文件为什么要使用另一个i18n库? 该程序包旨在尽可能简单易用。 它还从其他语言的...

    iOS国际化 应用内切换语言更新版

    在iOS应用开发中,国际化(Internationalization)是一个重要的特性,它允许你的应用程序支持多种语言,以便全球用户可以使用他们的首选语言来与应用交互。本文将深入探讨如何在iOS应用中实现国际化,特别是如何实现...

Global site tag (gtag.js) - Google Analytics