关于在静态html中实现语言切换的思路与实现
实现
说明:以下所代码自己测试在firefox新版本和ie8中有效,如果自己测试兼容性不好,请网友们自己改一下代码吧
文档目录
languagetest/
├───test.html
├───zh.css
└───en.css
原理
三种方法都是通过加载对应语言的css来实现,一般在vc或其它程序嵌套浏览器内核中使用不了cookie来存放当前设置的语言(我同事那个不行,他是通过读取注册表来设置的),读取当前设置的语言部分在本文中不体现。
第一种
代码如下test.html:
- <!doctype html>
- <html>
- <head>
- <script>
- //创建一个link来引入控制语言的css
- function languageLink (type) {
- var link = document.createElement('link');
- link.id = "lang";
- link.type = "text/css";
- link.rel = "stylesheet";
- link.href = type+".css";
- link.langType = type;
- return link;
- }
- //根据语言类型切换
- function changeLang(type){
- var defaultLang = "zh";
- if(type) defaultLang= type;
- var link = document.getElementById('lang');
- if(link) {
- if(link.langType == defaultLang) return;
- link.parentNode.removeChild(link);
- }
- var head = document.getElementsByTagName('head');
- head[0].appendChild(languageLink(defaultLang));
- }
- //文档加载到这里时加载默认语言
- +function () {
- changeLang();
- }();
- //toggle 两种语言切换
- function changeLanguage (){
- var link = document.getElementById('lang');
- var currentLangType = 'zh';
- if(link){
- var langtype = link.langType;
- switch(langtype){
- case 'zh': currentLangType = 'en';break;
- case 'en': currentLangType = 'zh';break;
- }
- }
- changeLang(currentLangType);
- }
- </script>
- </head>
- <body>
- <button onclick="changeLanguage()">切换</button>
- <button onclick="changeLang('en')">英文</button>
- <button onclick="changeLang('zh')">中文</button>
- <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>
- <!-- 第二种方法 利用伪元素显示属性法-->
- <h2>另一种方法 显示隐藏元素法 该方法比较合适,麻烦一点点</h2>
- <div><span class="language-zh">我是中文</span><span class="language-en"> i am English</span></div>
- <div><span class="language-zh">我是中文111</span><span class="language-en"> i am English111</span></div>
- <br/>
- <br/>
- <br/>
- <h2>两种方法都是通过切换css实现</h2>
- </body>
- </html>
zh.css:
- <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);}
- /* 隐藏英文 */
.language-en{display:none;}
en.css:
- /* 显示lang-en属性内容 */
- .language:before{
- content:attr(lang-en);
- }
- /* 隐藏中文 */
- .language-zh{
- display:none;
- }
第二种方法
代码同上(第一种方法)
第三种方法
下面就介绍第三种方法
由于上面两种方法都是把语言写在html中,这样不容易维护和实现更多种语言,其实我们可以将语言包定义为css文件,通过切换css来实现不同语言的展现。下面看一下代码片段:
test.html
下面是一个展示姓名和地址表单的列表
- <table>
- <tr>
- <td><label for="name"><span class="language-name"></span></label></td>
- <pre class="html" name="code"> <td><label for="address"><span class="language-address"></span></label></td>
- </tr>
- <tr>
- <td><input type="text" id="name" name="name"/></td>
- <td><input type="text" id="address" name="address"/></td>
- </tr>
</table>
zh.css
- .language-name:before{
- content:"名称";
- }
- .language-address:before{
- content:"地址";
- }
en.css
- .language-name:before{
- content:"name";
- }
- .language-address:before{
- content:"address";
- }
原理不多说了,就是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中实现语言切换的思路与实现的更多相关文章
- react中多语言切换的实现方式
目前正在进行的项目就是一个多语言切换的项目,有些前情知识我们可以 从https://react.i18next.com/getting-started进行了解. 说到使用方法,当然首先是要$ npm ...
- Android app应用多语言切换功能实现
最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...
- 在SOUI中使用动态多语言切换
动态语言切换是很多国际化产品的需求,SOUI之前的版本支持静态多语言翻译,通过在程序启动时设置好语言翻译模块,在程序中打开的UI都会自动调用该翻译模块进行文字翻译,但是不支持运行进语言切换. 最近几个 ...
- vue-i18n vue-cli项目中实现国际化 多语言切换功能 一
vue-cli项目中引入vue-i18n 安装: npm install vue-i18n可参考vue-i18n官网文档 main.js中引入: import Vue from 'vue' impor ...
- 动态语言切换(续)-designer中的retranslateUi(带源码)
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...
- vue 双语言切换中,data内翻译文字不正常切换的解决方案
背景 有这么一个登录页面,相关功能如下: 支持双语言,点击切换语言 表单内部有一个自定义的select,里面option的label.value都是的名字由外部提供:其中预设的option的label ...
- Android 应用内多语言切换
最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果用户在 App 内进行了语言设置,那么就使用用户设置的语言.当然,你会发现,App 的 ...
- 在使用Qt5.8完成程序动态语言切换时遇到的问题
因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文 ...
- 史上最简单的springboot国际化多语言切换实现方案
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 前提: 在resources目录下建立 messages_en_US.properti ...
随机推荐
- java关于lombok(包括父类参数)
java关于lombok对bean对象进行自动设置 使用说明 使用方式 注释类型 @NonNull @Data(常用) @NoArgsConstructor(常用)/@RequiredArgsCons ...
- gdb调试工具的使用
GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调 ...
- 廖雪峰Java14Java操作XML和JSON-1XML-1XML介绍
1.XML:可扩展标记语言(extensible Markup Language) 是一种数据表示格式 可以描述非常复杂的数据结构 用于存储和传输数据 1.1XML特点: 1.纯文本,默认utf-8编 ...
- Python-线程(1)
目录 什么是线程 进程与线程的区别 开启线程 为什么要使用线程 线程之间数据是共享的 什么是线程 线程与进程都是虚拟单位,目的是为了更好的描述某种事物 进程与线程的区别 进程:资源单位 线程:执行单位 ...
- 对比两个String无规律包含连续4个相同字符返回true的方法
package com.qif.dsa.util; import java.util.ArrayList; import java.util.List; /** * @author * @Title: ...
- iPhone开发关于UDID和UUID的一些理解
一.UDID(Unique Device Identifier) UDID是Unique Device Identifier的缩写,中文意思是设备唯一标识. 在很多需要限制一台设备一个账号的应用中 ...
- 杂项-公司:AT&T
ylbtech-杂项-公司:AT&T AT&T公司(英语:AT&T Inc.,原为American Telephone & Telegraph的缩写,也是中文译名美国电 ...
- java基础之Random类
Random类 Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed), 在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子 ...
- 【牛客挑战赛31D】 雷的打字机
题目 首先看到这个出现长度至少为\(2\)的回文子串 这就等价于不能出现两个连续且相同的字符 于是我们用概率生成函数来搞 设\(g_i\)表示\(i\)次操作后游戏没有结束的概率,\(f_{i,j}\ ...
- FFmpeg工具
[0]安装ffmpeg //Linux系统下安装sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next sudo apt-get update ...