最近在做将一个系统多语言化的项目,系统使用的是ASP.NET,直接使用了一种已有的方案:在页面渲染时采用正则表达式替换{XXX:001 确定}格式的标记。但是这个方式增加了服务端的字符串处理,对页面性能有影响。

        protected override void Render(HtmlTextWriter writer)
{
System.IO.StringWriter sw = new System.IO.StringWriter();
HtmlTextWriter htmltw = new HtmlTextWriter(sw);
base.Render(htmltw);
htmltw.Close();
sw.Close(); writer.Write(MultiLanguageUtil.Translate(sw.ToString()));
}

所以在考虑是否可以将多语言的处理转移到前端,首先想到了一种简单暴力的js正则替换方式,先写个demo:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<div id="container">
<div>{TMP:001 苹果}</div>
<div>{TMP:002 梨子}</div>
<div>{TMP:003 橙子}</div>
<div>{TMP:004 葡萄}</div>
<div>{TMP:005 全部}</div>
<div>{TMPPPPP:005 全部}</div>
<div>{TMP:105 张三</div>
<div>TMP:106 李四}</div>
</div> <script type="text/javascript"> var allResources = {
'TMP:001': {
cn: '苹果',
en: 'Apple'
},
'TMP:002': {
cn: '梨子',
en: 'Pear'
},
'TMP:003': {
cn: '橙子',
en: 'Orange'
},
'TMP:004': {
cn: '葡萄',
en: 'Grape'
},
'TMP:005': {
cn: '全部',
en: 'All'
}
}; var env = 'en';
//var env = 'cn';
var container = document.getElementById('container');
var docHtml = container.innerHTML;
var docNew = [];
var reg = /\{([A-Z][^\ }]+?) ([^\} ]+?)\}/g;
var result;
var lastIdx = 0; while ((result = reg.exec(docHtml)) != null) {
var key = result[1];
var val = result[2];
cw(result[0], key, val); var resource = allResources[key];
if (resource) {
var replacer = resource[env];
if (!replacer) {
replacer = val;
} docNew.push(docHtml.substring(lastIdx, result.index));
docNew.push(replacer);
} else {
docNew.push(docHtml.substring(lastIdx, result.index));
docNew.push(val);
}
lastIdx = result.index + result[0].length;
}
if (lastIdx < docHtml.length - 1) {
docNew.push(docHtml.substring(lastIdx, docHtml.length));
} cw(docNew.join('').length);
cw(docHtml.length); container.innerHTML = docNew.join(''); function cw(args) {
console && console.log && console.log.apply(console, arguments);
} </script> </body>
</html>

这个很明显的一个缺陷是会使页面上的事件等丢失,这个可以通过调整事件绑定的顺序到替换模板之后来解决。

所以正在考虑另一种方式,也是正则替换:通过遍历dom的各个节点,替换innerText和attribute。(Todo)

2017-08-20 00:38:20更新:已经过去一年了,已经忘记这个todo了,哈哈哈,估计是没下文了的,:)

最新文章

  1. MyEclipse使用心得:集成和使用Maven的方法
  2. 解决使用osgModeling的Loft生成管子时的bug(续)
  3. Android 强烈推荐:程序员接私活那点事
  4. runtime使用小例子 - 给对象O-C属性赋值
  5. C# 代码笔记
  6. 浅谈线程池(上):线程池的作用及CLR线程池
  7. IOS时间格式转换
  8. HDU 5919 -- Sequence II (主席树)
  9. Android Studio 复制粘贴图片到drawable文件夹没有效果 - 解决方法
  10. BZOJ_1588_&amp;_Codevs_1296_[HNOI2002]_营业额统计(平衡树/set)
  11. Head First --- Python 第一章
  12. Spark SQL 初步
  13. 证明中序遍历O(n)
  14. Spring揭秘 读书笔记 七 BeanFactory的启动分析
  15. python函数之协程与面向过程编程
  16. SpringBoot使用外置的Servlet容器
  17. c# 二分查找法
  18. NO.4: 确定对象被使用前已被初始化
  19. python常用模块-调用系统命令模块(subprocess)
  20. Carbon 的 diffForHumans 方法

热门文章

  1. DELPHI XE5 UP2 无真机输出 APP并转换为IPA(实践整理)
  2. Android下拉选择框之PopupWindow
  3. HTML5游戏开发进阶指南 中文pdf扫描版​
  4. Oracle Cannot Update TOP N Issue, 请专家解答
  5. C# / .Net Core 访问MongoDb库
  6. c# 解析MP3文件
  7. python 中如何判断list中是否包含某个元素
  8. GitHub 十大 CI 工具
  9. win10+anaconda环境下pyqt5+qt tools+eric6.18安装及汉化过程
  10. 如果你是后台开发者,InnoDB的小秘密,你应该知道