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美元。呵呵。

     

  • 相关阅读:
    一周的前端面试
    PHP导出超大的CSV格式的Excel表方案
    Java HashMap Demo
    Vmware 设置桥接模式
    Vue 模板
    SpringMVC 拦截器
    IntelliJ IDEA 修改缓存文件设置
    Maven 命令操作项目
    Maven 介绍
    Spring Boot 5 SpringSecurity身份验证
  • 原文地址:https://www.cnblogs.com/atong/p/3098339.html
Copyright © 2011-2022 走看看