时光博客 - WEB开发中的可用性和用户体验

JS多语言设计方案

公司目前碰到一个项目,客户是美国CDC,因为考虑到中方与美方的合作机构,所以需要设计出多版本语言切换。要求前台实现。因为语言包不需要经常修改没必要入库操作,所以将语言包写在一个配置文件里面是最好的(自我感觉)。

先看DEMOJS多语言设计方案(带记忆效果)

于是第一次尝试,我写了一个语言包(js文件):

  1. message.en={ 
  2.         "1""Application Form for Project Activity"
  3.         "2""Project Name:"
  4.         "3""National Level:"
  5.         "4""Provincial Level:"
  6.         "5""Implementing Unit (NCAIDS division, provincial unit, or other):"
  7.         "6""Project ID #:" 
  8.        } 
  9.  
  10. message.chs={ 
  11.         "1""项目活动申请表"
  12.         "2""项目名称:"
  13.         "3""国家级单位:"
  14.         "4""省级单位:"
  15.         "5""项目执行单位(注明性艾中心科室,省级单位,或其他):"
  16.         "6""项目活动序号:" 
  17.      } 

然后给需要替换的语言包文字

  1. <p class="LANGS">Form Submission Date:</p> 

然后通过获取 具有class="LANGS"的对象,组成数组集合。

  1. var oLangArea = document.getElementsByTagName("p"); 

然后循环遍历oLangArea数组,进行语言替换,刚开始觉得很不错。后来,由于疏忽漏掉一个元素,结果BUG就出来了。
因为这种方案是按oLangArea数组的自然顺序排序的,比如在2:National Level:的前面加入一个元素,这样2以后的顺序都需要更改,项目中有43个语言块,结果带来了大量的重复劳动力...于是最后放弃了这种做法。

第二种解决方案

顺利的解决了上面的问题,但是需要多添加一些HTML代码,语言包不变。
HTML代码如下:

  1. <p class="LANGS" id="L7">Form Submission Date:</p> 

 

  1. for(var i=0;i<=oLangArea.length;i++){ 
  2.             j = (oLangArea[i].getAttribute("id")).substring(1); 
  3.             oLangArea[i].innerHTML = eval('message.'+lang+'['+j+']'); 

可以看出来这个可以适应以后的语言包顺序更改。只需要在相应位置加入HTML代码,然后在语言包中指定对应多语言通过ID来绑定,效率方面应该比第一种方案要低一些,但是少量的语言包应该不会有多大的差别,且JS语言包已经载入,细微的效率差别,却换来了长期的可维护性。

以上是个人愚见,因为JS还很差,正在努力学习中。分享一下自己实践的项目,大家一起进步。

«  上一篇 |  下一篇  »

赞助商广告

10 Responses

  1. Lin Says:
    2009-11-10, 9:09 AM

    缓存数组长度对提高效率很有效
    http://blogs.sun.com/greimer/resource/loop-test.html

  2. Kevin Says:
    2009-11-10, 10:20 AM

    确实,看了JS优化文章,建议用局部变量缓存对象属性和函数指针,在大数据量的循环中,的确可以提高不少效率!

  3. 双色球 Says:
    2009-11-16, 2:07 AM

    大数据量的循环中,的确可以提高不少效率!

  4. 双色球 Says:
    2009-11-16, 2:08 AM

    分享一下自己实践的项目,大家一起进步。

  5. cp Says:
    2009-11-17, 3:19 PM

    测试飞信class类错误?

  6. James Says:
    2009-11-19, 4:39 PM

    这种写法还是不过优雅,个人感觉,使用语言配置文件是OK,但是不要使用数字做为key,还是用英文缩写作为key,这样以后方便些,再者不建议使用标记class为langs然后使用DOM操作进行语言的变更,性能不高,可以借鉴tinyMCE的做法,在初始化的时候,初始化语言设置。
    关于use case的思考:用户是否需要动态的变更语言设置?

  7. 天津婚纱摄影 Says:
    2009-11-19, 5:23 PM

    进到你博客,想起了我以前...
    我们一起用Sablog-x的时代了!!

  8. Liupeng Says:
    2009-11-20, 12:31 AM

    @James我感觉数字索引会比字母索引要快,因为对比的字母会少些。不过维护起来的确有麻烦。USE CASE里面的确需要动态载入双语,客户是中外办事机构。表单要填写2份

  9. Kevin Says:
    2009-11-20, 12:48 AM

    再次测试留言是否有短信提示

  10. Kuhn Says:
    2010-05-06, 3:34 PM

    我要做个多语言的切换,但是页面图片太多,切换的时候图片的切换不太好做,可不可以帮帮我,谢谢了.

Leave a Reply





验证码(*):