在项目中只用到了三种语言:英文、中文简体、中文繁体。所以我首先想到了最笨的方法:1.直接将三种语言写在html中,显示当前设置的语言隐藏其它两种来实现。2.使用css伪元素的content:attr(en)形式,将语言写在元素属性中,这种也是一种笨方法。3.前两种由于自己觉得不够完美不适合更多语言的情况,所以又想到了一种更方便一点的方法,原理与第2种类似。

实现

说明:以下所代码自己测试在firefox新版本和ie8中有效,如果自己测试兼容性不好,请网友们自己改一下代码吧

文档目录

languagetest/

├───test.html

├───zh.css

└───en.css

原理

三种方法都是通过加载对应语言的css来实现,一般在vc或其它程序嵌套浏览器内核中使用不了cookie来存放当前设置的语言(我同事那个不行,他是通过读取注册表来设置的),读取当前设置的语言部分在本文中不体现。

第一种

代码如下test.html:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <script>
  5. //创建一个link来引入控制语言的css
  6. function languageLink (type) {
  7. var link = document.createElement('link');
  8. link.id = "lang";
  9. link.type = "text/css";
  10. link.rel = "stylesheet";
  11. link.href = type+".css";
  12. link.langType = type;
  13. return link;
  14. }
  15. //根据语言类型切换
  16. function changeLang(type){
  17. var defaultLang = "zh";
  18. if(type) defaultLang= type;
  19. var link = document.getElementById('lang');
  20. if(link) {
  21. if(link.langType == defaultLang) return;
  22. link.parentNode.removeChild(link);
  23. }
  24. var head = document.getElementsByTagName('head');
  25. head[0].appendChild(languageLink(defaultLang));
  26. }
  27. //文档加载到这里时加载默认语言
  28. +function () {
  29. changeLang();
  30. }();
  31. //toggle 两种语言切换
  32. function changeLanguage (){
  33. var link = document.getElementById('lang');
  34. var currentLangType = 'zh';
  35. if(link){
  36. var langtype = link.langType;
  37. switch(langtype){
  38. case 'zh': currentLangType = 'en';break;
  39. case 'en': currentLangType = 'zh';break;
  40. }
  41. }
  42. changeLang(currentLangType);
  43. }
  44. </script>
  45. </head>
  46. <body>
  47. <button onclick="changeLanguage()">切换</button>
  48. <button onclick="changeLang('en')">英文</button>
  49. <button onclick="changeLang('zh')">中文</button>
  50. <span style="font-size:14px;"><strong></strong></span><pre name="code" class="html"><!-- 一种方法 显示隐藏元素法-->

<h2>一种方法 利用伪元素显示属性法 该方法不能选中文字</h2> <div class="language" lang-zh = "这里中文1" lang-en = "here Enlish1"></div> <div class="language" lang-zh = "这里中文2" lang-en = "here Enlish12"></div> <div class="language" lang-zh = "这里中文3" lang-en = "here Enlish13"></div> <div class="language" lang-zh = "这里中文4" lang-en = "here Enlish14"></div>

  1. <!-- 第二种方法 利用伪元素显示属性法-->
  2. <h2>另一种方法 显示隐藏元素法  该方法比较合适,麻烦一点点</h2>
  3. <div><span class="language-zh">我是中文</span><span class="language-en"> i am English</span></div>
  4. <div><span class="language-zh">我是中文111</span><span class="language-en"> i am English111</span></div>
  5. <br/>
  6. <br/>
  7. <br/>
  8. <h2>两种方法都是通过切换css实现</h2>
  9. </body>
  10. </html>

zh.css:

  1. <span style="font-size:14px;"><strong><span style="font-size:14px;"><strong></strong></span></strong></span><pre name="code" class="css">/* 显示lang-zh属性内容 */

.language:before{content:attr(lang-zh);}

  1. /* 隐藏英文 */

.language-en{display:none;}


en.css:

  1. /* 显示lang-en属性内容 */
  2. .language:before{
  3. content:attr(lang-en);
  4. }
  5. /* 隐藏中文 */
  6. .language-zh{
  7. display:none;
  8. }

第二种方法

代码同上(第一种方法)

第三种方法

下面就介绍第三种方法

由于上面两种方法都是把语言写在html中,这样不容易维护和实现更多种语言,其实我们可以将语言包定义为css文件,通过切换css来实现不同语言的展现。下面看一下代码片段:

test.html

下面是一个展示姓名和地址表单的列表

  1. <table>
  2. <tr>
  3. <td><label for="name"><span class="language-name"></span></label></td>
  4. <pre class="html" name="code">        <td><label for="address"><span class="language-address"></span></label></td>
  1. </tr>
  1. <tr>
  2. <td><input type="text" id="name" name="name"/></td>
  3. <td><input type="text" id="address" name="address"/></td>
  4. </tr>

</table>



zh.css

  1. .language-name:before{
  2. content:"名称";
  3. }
  4. .language-address:before{
  5. content:"地址";
  6. }

en.css

  1. .language-name:before{
  2. content:"name";
  3. }
  4. .language-address:before{
  5. content:"address";
  6. }

原理不多说了,就是css引用的切换。至于css的伪元素有不太明白的自行查询一下吧。

 
 
 
 
 

前端开发中的多语言切换,可使用js动态替换内容

1、在用户点击切换语言后,把选择的语言版本保存在cookie中

//写入cookie函数
function setCookie(name,value)
{
var Days = 30;
var exp = new Date();
exp.setTime(exp.getTime() + Days*24*60*60*1000);
document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
} //获取cookie
function getCookie(name)
{
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
} //setCookie('lan','hk'); 繁体中文
//setCookie('lan','cn'); 简体中文
//setCookie('lan','en'); 英文

2、在包含静态文本的标签中,添加一个属性:set-lan=”html:name” 
属性值中的html代表内容的位置,name代表要替换的文字的标识 
例如:

<span set-lan="html:name">名字</span>
<input type="text" value="名字" set-lan="val:name" /> 这些就需要前端工程师在开发过程中添加进去,并且,要切换语言文字的外面都必须要有一个标签包裹,否则无法进行切换;
如:
<span set-lan="html:name"><i class="icon"></i>名字</span>
这样的代码,是无法把“名字”替换成“Name”的,会把“名字”前面的i标签也一起替换掉,如果不想把i标签也替换掉,就要在“名字”外面添加一个标签,改成:
<span><i class="icon"></i><lan set-lan="html:name">名字</lan></span>

3、定义3个语言的标识+内容的json字符串

var cn = {
"name" : "姓名",
"tel" : "电话",
"email" : "邮箱",
}; var hk = {
"name" : "姓名",
"tel" : "電話",
"email" : "郵箱",
}; var en = {
"name" : "Name",
"tel" : "Tel",
"email" : "Email",
};

4、遍历带set-lan属性的标签,进行文本替换

$('[set-lan]').each(function(){
var me = $(this);
var a = me.attr('set-lan').split(':');
var p = a[0]; //文字放置位置
var m = a[1]; //文字的标识 //用户选择语言后保存在cookie中,这里读取cookie中的语言版本
var lan = getCookie('lan'); //选取语言文字
switch(lan){
case 'cn':
var t = cn[m]; //这里cn[m]中的cn是上面定义的json字符串的变量名,m是json中的键,用此方式读取到json中的值
break;
case 'en':
var t = en[m];
break;
default:
var t = hk[m];
} //如果所选语言的json中没有此内容就选取其他语言显示
if(t==undefined) t = cn[m];
if(t==undefined) t = en[m];
if(t==undefined) t = hk[m]; if(t==undefined) return true; //如果还是没有就跳出 //文字放置位置有(html,val等,可以自己添加)
switch(p){
case 'html':
me.html(t);
break;
case 'val':
case 'value':
me.val(t);
break;
default:
me.html(t);
} });

以上是html中的文字替换,但是写在js中的文字怎么办? 
可以定义一个函数,来读取

function get_lan(m)
{
//获取文字
var lan = getCookie('lan'); //语言版本
//选取语言文字
switch(lan){
case 'cn':
var t = cn[m];
break;
case 'hk':
var t = hk[m];
break;
default:
var t = en[m];
} //如果所选语言的json中没有此内容就选取其他语言显示
if(t==undefined) t = cn[m];
if(t==undefined) t = en[m];
if(t==undefined) t = hk[m]; if(t==undefined) t = m; //如果还是没有就返回他的标识 return t;
}
 

那么在js中使用的文字就只要用此函数来读取就可以了 

alert('姓名');
改成
alert(get_lan('name'));

关于在静态html中实现语言切换的思路与实现的更多相关文章

  1. react中多语言切换的实现方式

    目前正在进行的项目就是一个多语言切换的项目,有些前情知识我们可以 从https://react.i18next.com/getting-started进行了解. 说到使用方法,当然首先是要$ npm ...

  2. Android app应用多语言切换功能实现

    最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...

  3. 在SOUI中使用动态多语言切换

    动态语言切换是很多国际化产品的需求,SOUI之前的版本支持静态多语言翻译,通过在程序启动时设置好语言翻译模块,在程序中打开的UI都会自动调用该翻译模块进行文字翻译,但是不支持运行进语言切换. 最近几个 ...

  4. vue-i18n vue-cli项目中实现国际化 多语言切换功能 一

    vue-cli项目中引入vue-i18n 安装: npm install vue-i18n可参考vue-i18n官网文档 main.js中引入: import Vue from 'vue' impor ...

  5. 动态语言切换(续)-designer中的retranslateUi(带源码)

    本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...

  6. vue 双语言切换中,data内翻译文字不正常切换的解决方案

    背景 有这么一个登录页面,相关功能如下: 支持双语言,点击切换语言 表单内部有一个自定义的select,里面option的label.value都是的名字由外部提供:其中预设的option的label ...

  7. Android 应用内多语言切换

    最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果用户在 App 内进行了语言设置,那么就使用用户设置的语言.当然,你会发现,App 的 ...

  8. 在使用Qt5.8完成程序动态语言切换时遇到的问题

    因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文 ...

  9. 史上最简单的springboot国际化多语言切换实现方案

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 前提: 在resources目录下建立 messages_en_US.properti ...

随机推荐

  1. LeetCode 237. 删除链表中的节点(Python3)

    题目: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入: head ...

  2. nodejs入门最简单例子

    一.mac话,先安装nodejs环境: brew install nodejs 二.先写一个main.js var http = require("http"); http.cre ...

  3. 图片上传的ImageIO工具类

    ImageIO类说明 最近的项目中遇到ImageIO,因此记录下这个类的用法 一.ImageIO: 这个类中的方法都是静态方法,可以用来进行简单的图片IO操作 1.读入的三种方法 public sta ...

  4. Python全栈开发:线程、进程和协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env pytho ...

  5. php日期

    PHP Date() 函数 PHP date() 函数用于格式化时间/日期. 该函数可把时间戳格式化为可读性更好的日期和时间. 时间戳是一个字符序列,表示一定的事件发生的日期/时间. 语法 date( ...

  6. 修改cmd命令默认路径

    未修改之前: 修改方法: 1.win+r打开运行对话框,输入 regedit 打开注册表编辑器 2.在注册表中找到:HKEY_CURRENT_USER\Software\Microsoft\Comma ...

  7. js 类数组转化数组

    一.常见类数组集合 (1).arguements function fn(){ var arr = [].slice.call(arguements,0); } (2).HTMLCollection  ...

  8. LintCode刷题笔记-- A+B problem

    标签: 位运算 描述 Write a function that add two numbers A and B. You should not use + or any arithmetic ope ...

  9. matlab调用keras深度学习模型(环境搭建)

    matlab没有直接调用tensorflow模型的接口,但是有调用keras模型的接口,而keras又是tensorflow的高级封装版本,所以就研究一下这个……可以将model-based方法和le ...

  10. 新手redis集群搭建

    redis集群搭建在开始redis集群搭建之前,我们先简单回顾一下redis单机版的搭建过程 下载redis压缩包,然后解压压缩文件:进入到解压缩后的redis文件目录(此时可以看到Makefile文 ...