zoukankan      html  css  js  c++  java
  • 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美元。呵呵。

     

  • 相关阅读:
    changing a pointer rather than erasing memory cells
    验证码识别 edge enhancement 轮廓增强 region finding 区域查找
    Manipulating Data Structures
    passing parameters by value is inefficient when the parameters represent large blocks of data
    Aliasing 走样
    Artificial Intelligence Research Methodologies 人工智能研究方法
    Thread safety
    include pointers as a primitive data type
    flat file
    functional cohesion
  • 原文地址:https://www.cnblogs.com/atong/p/3098339.html
Copyright © 2011-2022 走看看