AS3 中实现多语言替换的方法

一、项目需求

1 1、顺序替换--“您确定要花费{money}金币,来购买{amount}个红瓶吗?”
2 2、全局替换--“{name},奖励所有人{money}人民币和{exp}美元。呵呵。”

二、函数的基本轮廓

1 public function printf( str:String, ... rest ):String
2 {
3     //... parse
4     return string;
5 }

三、顺序替换的实现
我们可以用正则来描述顺序替换中需要替换的关键词:\{[a-z0-9_]+\}
这个正则所表示的意思:所以形如{字母/数字/下划线}的内容,并且你可能需要忽略大小写,最终为:/\{[a-z0-9_]+\}/i
接着,我们只要用一个循环来遍历替换参数指定的值就行了。
扩展:我们不但可以将rest直接传入多个数据参数,也可以传入将这些数据参数整合成一个数组来只传入一个参数

四、全局替换的分析
由于字符串替换方法replace好像只能替换第一个匹配的项,因此我们还得借助正则表达式来实现。
实现方法:参数rest我们传入一个Object,例如{name:"天地会"},而这个Object的字段名与全局替换中的关键词{XXX}是相互对应的。如此就简单了,我们只要遍历这个Object,替换源字符串中所有相对应的关键词即可。

五、最终代码

 1 package
 2 {
 3 
 4         /**
 5          *  使用传入的各个参数替换指定的字符串内的 <code>{n}</code> 标记。
 6          *
 7          *  @param str  - 用来进行替换的源字符串。
 8          *  @param rest  - 可在 str 参数中的每个 <code>{n}</code> 位置被替换的值。
 9          *  如果第一个参数是一个数组,则该数组将用作参数列表。若第一个参数为数据对象,则会进行全局替换,否则为顺序替换。
10          *
11          *  <p>源字符串可包含 <code>{n}</code> 形式的特殊标记,其中 n 为任意标识符(由字母、数字、下划线组成),
12          *  它将被替换成具体的值。</p>
13          *  <p>因为允许 rest 第一个参数为数组,因此允许在其它想要使用... rest 参数的方法中重复使用此例程。例如:
14          *         <table><tr><td style="padding:10px;color:#334455"><code>
15          *     public function myTracer(str:String, ... rest):void<br>
16          *     {<br>
17          *                     label.text += printf(str, rest) + "\n";<br>
18          *     }
19          *         </code></td></tr></table><p>
20          *
21          *  @return 使用指定的各个参数替换了所有 <code>{n}</code> 标记的新字符串。
22          *
23          *  <table><tr><td style="padding:10px;color:#334455"><code>
24          *  var str:String = "here is some info {number} and {boolean}";<br>
25          *  trace(printf(str, 15.4, true));<br>
26          *  <br>
27          *  // this will output the following string:<br>
28          *  // "here is some info 15.4 and true"<br>
29          *        </code></td></tr></table>
30          */
31         public function printf( str:String, ... rest ):String
32         {
33                 if( str == null || str == "" )
34                         return "";
35 
36                 var lng:int; // 最终需要计算替换的次数
37                 var args:Array; // 最终需要替换的数据
38                 var i:int;
39 
40                 switch( typeof( rest[ 0 ]))
41                 {
42                         case "number":
43                         case "boolean":
44                         case "string":
45                         {
46                                 lng = rest.length;
47                                 args = rest;
48 
49                                 for( i = 0; i < lng; i++ )
50                                 {
51                                         str = str.replace( PATTERN_PRINTF, args[ i ]);
52                                 }
53                                 break;
54                         }
55                         case "object":
56                         {
57                                 if( rest[ 0 ] is Array )
58                                 {
59                                         args = rest[ 0 ] as Array;
60                                         lng = args.length;
61 
62                                         for( i = 0; i < lng; i++ )
63                                         {
64                                                 str = str.replace( PATTERN_PRINTF, args[ i ]);
65                                         }
66                                 }
67                                 else
68                                 {
69                                         var reg:RegExp;
70 
71                                         for( var prop:String in rest[ 0 ])
72                                         {
73                                                 reg = new RegExp( "\{" + prop + "\}", "ig" );
74                                                 str = str.replace( reg, rest[ 0 ][ prop ]);
75                                         }
76                                 }
77                                 break;
78                         }
79                 }
80 
81                 return str;
82         }
83 }
84 
85 const PATTERN_PRINTF:RegExp = /\{[a-z0-9_]+\}/i;

你可以直接将以上代码,保存为一个AS3文件,来放到你的项目中使用。
养成写注释的习惯,是你成功和成长的其中一步。

六、使用方法

1 trace( printf( "您确定要花费{money}金币,来购买{amount}个红瓶吗?", 100, 5 ));
2 trace( printf( "{name},奖励所有人{money}人民币和{exp}美元。呵呵。", { name: "看完这篇文章", money: 100, exp: 2000 }));

输出结果:

1 您确定要花费100金币,来购买5个红瓶吗?
2 看完这篇文章,奖励所有人100人民币和2000美元。呵呵。

 

posted @ 2013-05-25 08:57  【Winco】  阅读(501)  评论(0编辑  收藏  举报