在做登陆界面的时候,因为涉及到中英文

因为前后台已经分离,所以前端需要自行设计中英文

做法:

编写两个文件,一个中文文件,一个是英文文件,分别放在对应的目录下面

文件的内容

{
"login":{
"welcome":"欢迎登录!",
"fail":"请求失败,请检查网络连接.",
"login":"登 录",
"enteruser":"请输入用户名",
"enterpassword":"请输入密码"
},
"comm":{
"filter":"过滤",
"export":"导出",
"ok":"确定",
"cancel":"取消",
"time":"时间",
"search":"查询",
"submit":"提交",
"delete":"删除"
},
"alarm":{
"checkall":"全选",
"timeStamp":"报警时间",
"priority":"优先级",
"location":"位置",
"regionId":"责任区",
"almType":"报警类型",
"almStatus":"确认状态",
"content":"告警事件描述",
"dev":"设备",
"key":"关键字",
"level":"等级",
"everypage":"每页显示条数:",
"config":"配置"
}
}

页面步骤:

1、首先在html中给需要设置中英文的元素添加一个标识,目前是在元素上添加了一个data-i18n的属性,这个是三级,代码可以支持多级,如果是多级,就是 data-i18n="[placeholder]login.login.enteruser",json文件对应增加一级

<input type="text" placeholder="请输入用户名" data-i18n="[placeholder]login.enteruser" v-model="user"><br>

2、根据配置的是中文还是英文的,如果配置了,就到localStorage里面存起来,如果没有配置中英文就到浏览器中取(navigator取)

var i18n='';
if(!i18n){
i18n=navigator.language=='zh-CN'?'cn':'en';
}else{
localStorage.setItem('i18n',i18n);
}

3.利用ajax本地请求文件

//ajax本地请求 i18n为变量 cn/en
$.ajax({
url:'/locales/'+i18n+'/translation.json',
type:'get',
dataType:'json',
success:function(res){
var temp=res; });
}
});

返回的接口数据

4、数据处理并赋值操作

//遍历页面中所有的data-i18n,将值赋值到页面中的地方
$('[data-i18n]').each(function(i,e){
var p=$(e).attr('data-i18n').split(/[\]\.]/);//匹配“.”或者“]”隔开
if(p[0].indexOf('[')===-1){
p.unshift('');
}
var len=p.length;//
var d=temp[p[1]];//login
//适用于多级的写法
while(d[p[p.length+1-(--len)]]){
d=d[p[p.length+1-len]];
}
//赋值
p[0]===''?$(e).html(d):$(e).attr(p[0].substring(1),d);
});

备注:

  此处注意使用的while循环,主要是为了页面配置更加灵活,支持多级操作,translation.json里面的文件目前是二级,但是写了while循环的代码,就可以支持多级

  配置多级之后,只需要在页面的data-i18n属性值做相应的更改就可以了

测试完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>中英文切换</title>
</head>
<body>
<div id="#app-6">
<h3 class="welcome" data-i18n="login.welcome">欢迎登录</h3>
<input type="text" placeholder="请输入用户名" data-i18n="[placeholder]login.enteruser" v-model="user"><br>
<input type="password" placeholder="请输入密码" data-i18n="[placeholder]login.enterpassword" v-model="password"></br>
<button data-i18n="login.login.a">登陆</button>
</div>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.12.1/jquery.js"></script>
<script type="text/javascript">
var i18n="";
if(!i18n){
i18n=navigator.language="zh-CN"?"cn":'en';
}else{
localStorage.setItem('i18n',i18n);
}
//1.在每一个需要中英文的加上一个属性 data-i18n
//2.从后台获得中英文的数据
//写死的测试数据
var temp={
"login":{
"welcome":"欢迎登录!",
"fail":"请求失败,请检查网络连接.",
"login":{
a:"22"
},
"enteruser":"111",
"enterpassword":"请输入密码"
},
"comm":{
"filter":"过滤",
"export":"导出",
"ok":"确定",
"cancel":"取消",
"time":"时间",
"search":"查询",
"submit":"提交",
"delete":"删除"
},
"alarm":{
"checkall":"全选",
"timeStamp":"报警时间",
"priority":"优先级",
"location":"位置",
"regionId":"责任区",
"almType":"报警类型",
"almStatus":"确认状态",
"content":"告警事件描述",
"dev":"设备",
"key":"关键字",
"level":"等级",
"everypage":"每页显示条数:",
"config":"配置"
}
}
$(function(){
//3.遍历页面中所有的data-i18n,将值赋值到页面中的地方
$('[data-i18n]').each(function(i,e){
var p=$(e).attr('data-i18n').split(/[\]\.]/);//匹配“.”或者“]”隔开
if(p[0].indexOf('[')===-1){
p.unshift('');
}
var len=p.length;//
var d=temp[p[1]];//login
while(d[p[p.length+1-(--len)]]){
d=d[p[p.length+1-len]];
}
//赋值
p[0]===''?$(e).html(d):$(e).attr(p[0].substring(1),d);
});
})
</script>
</body>
</html>

因为登陆页面是单独的,在其他页面中,因页面多,推荐写成公共的方法,这种方法相对于传统页面中英文切换就可以省了很多代码

公共的js方法:

$.i18n=function(opt){
if(!opt){opt={}}
if(opt.language===undefined){
opt.language=localStorage.getItem('i18n');
if(!opt.language){
opt.language=navigator.language=='zh-CN'?'cn':'en';
}
}
if(typeof opt.url!=='string'||opt.url==''){
opt.url='/locales/'+opt.language+'/translation.json'
}
$.ajax({
url:opt.url,
type:'get',
dataType:'json',
success:function(res){
var temp=res;
$('[data-i18n]').each(function(i,e){
var p=$(e).attr('data-i18n').split(/[\]\.]/);
if(p[0].indexOf('[')===-1){
p.unshift('');
}
var len=p.length;
var d=temp[p[1]];
while(d[p[p.length+1-(--len)]]){
d=d[p[p.length+1-len]];
}
if(typeof d!=='string'&&typeof d!=='number'){d='';}
p[0]==='[value'?$(e).val(d):p[0]===''?$(e).html(d):$(e).attr(p[0].substring(1),d);
});
if(typeof opt.finish==='function'){
opt.finish(temp);
}
}
});
}

正则表达式split匹配多种例如 “】”,“,”两种(页面级中英文切换方案)的更多相关文章

  1. 在jsp中常用的内置对象(5个)小总结和两种页面跳转方式(服务器端调转、客户端跳转)的区别

    jsp中常用的几个内置对象: 一.request对象 主要作用:  (1)获取请求页面的信息   比如:request.getParameter("参数名");  (2)获取客户端 ...

  2. 两种方法实现asp.net方案的前后端数据交互(aspx文件、html+ashx+ajax)

    一个HTML页面只能显示HTML代码信息,不能与数据库进行数据的交互.asp.net方案提供了网页与数据库交互的方法,这里举出两种:①aspx文件 ②ashx文件+ajax技术 一.创建数据库 这里以 ...

  3. mybatis高级(2)_数据库中的列和实体类不匹配时的两种解决方法_模糊查询_智能标签

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  4. Android两个页面之间的切换效果工具类

    import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; ...

  5. centos实现两种秒级任务的简单方法

    1.通过写shell脚本,死循环,守护进程运行 > vi /data/sec.sh #!/bin/bash while true do #写上自已的命令 echo "hello wor ...

  6. 贝叶斯A/B测试 - 一种计算两种概率分布差异性的方法过程

    1. 控制变量 0x1:控制变量主要思想 科学中对于多因素(多变量)的问题,常常采用控制因素(变量)的方法,吧多因素的问题变成多个单因素的问题.每一次只改变其中的某一个因素,而控制其余几个因素不变,从 ...

  7. OpenCV3.4两种立体匹配算法效果对比

    以OpenCV自带的Aloe图像对为例:     1.BM算法(Block Matching) 参数设置如下: ) + ) & -; cv::Ptr<cv::StereoBM> b ...

  8. 64位win10系统无法安装.Net framework3.5的两种解决方法

    参考网站: https://blog.csdn.net/zang141588761/article/details/52177290 在Windows10中,当我们安装某些软件的时候会提示“你的电脑上 ...

  9. 64位win10系统无法安装.Net framework3.5的两种解决方法【转】

    近日有网友反映在windows10_64位系统电脑上安装Net framework3.5,操作时总失败,怎么办呢?小编下面就介绍win10 64位系统无法安装Net framework3.5的两种解决 ...

随机推荐

  1. setInterval、clearInterval的回调函数,实现函数间调用的先后顺序

    定义: var waitUnitil=function (untillCallBack, nextStepCallBack, count) { if (count == null) { count = ...

  2. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_1.页面发布-需求分析

    先静态化,并存储到gridFS 然后,发消息给MQ,MQ接收到消息通知给所有监听他的Cms Client. Cms client从gridFS读取页面下载到自己的服务 业务流程如下:1.管理员进入管理 ...

  3. 用Keras搭建神经网络 简单模版(四)—— RNN Classifier 循环神经网络(手写数字图片识别)

    # -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) from keras.datasets import mnist fro ...

  4. 查看mycat日志

    查看日志: tail -f /usr/local/mycat/logs/wrapper.log

  5. JQ也要面向对象~在JQ中扩展静态方法和实例方法(jq扩展方法)

    JQ也要面向对象,事实上,无论哪种开发语言,在开发功能时,都要把面向对象拿出来,用它的思想去干事,去理解事,面向对象会使问题简单化,清晰化,今天说两个概念“静态方法”与“实现方法”,这个在面向对象的语 ...

  6. Spring Aop(九)——基于正则表达式的Pointcut

    转发地址:https://www.iteye.com/blog/elim-2396525 基于正则表达式的Pointcut JdkRegexpMethodPointcut Spring官方为我们提供了 ...

  7. Data - 数据挖掘的基础概念

    主要内容来自于<微信公众号:程SIR说> 1 数据挖掘 数据挖掘(Data Mining,简称DM),是指从大量的数据中,挖掘出未知的且有价值的信息和知识的过程. 数据挖掘是一门交叉学科, ...

  8. javascript语法 1.运算符 2. 流程控制 3. 函数 4. 四种变量 5. 数据类型的运用 6. js页面交互

    1.运算符 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  9. CF1187D Subarray Sorting

    思路: 线段树好题.对a数组中的每个元素从左到右依次操作,判断最终是否能够转化成b数组.在此过程中使用线段树维护区间最小值判断是否能够进行合法操作. 实现: #include <bits/std ...

  10. 【计算机视觉】opencv读取多个摄像头

    [计算机视觉]opencv读取多个摄像头 标签(空格分隔): [图像处理] 说明:今天蹭了机器视觉课程,讲到了stereopsis,立体视觉,讲到了关于通过多个摄像头获取object的depth信息的 ...