要对一个前端使用layui的项目进行国际化,但是layui好像没有实现国际化,所以需要自己手动实现。
layui版本:layui-v2.5.6
jquery版本:3.5.1.min
- 日期输入框
- 分页栏
- 弹出框(页面)的标题、按钮等
- 弹出框(页面)的内容
- 页面其它内容
- js方法中的值
- 日期输入框:利用layui时间日期控件的lang属性
- 分页栏:重写laypage.js
- 弹出框(页面)的标题、按钮等:在js中控制值
- 弹出框(页面)的内容:在js中控制值
- 页面其它内容:在dom元素中自定义属性,并将对应的国际化code放入,页面加载完对dom属性进行遍历,替换自定义属性为对应的国际化值
- js方法中的值:在js中控制值
\resources\static\languages\systemInfo_en_US.properties:
userNo=User No
userName=User name
userType=User type
\resources\static\languages\systemInfo_zh_CN.properties:
userNo=用户编号
userName=用户名称
userType=用户类型
以下代码替换页面标签中的data-i18n、placeholder-i18n、href-i18n属性。data-i18n对应的国际化值会放入标签的innerTEXT中;placeholder-i18n的国际化值会放入placeholder属性;href-i18的国际化值会放入href属性;要替换其它属性请自行添加。
language()方法,用于根据给定的code返回国际化值。
代码还包括对easyui中linkbutton、window、panel等的处理示例,实际没有用。
使用时将initPage()方法放入要国际化页面的onload()方法中即可。
function initPage(){
if($.cookie("langType")){
loadProperties($.cookie("langType"));
}else{
loadProperties("zh_CN");
}
}
function loadProperties(language){
jQuery.i18n.properties({
name:'systemInfo_'+language,
path:"/languages/",
mode:'map',
callback: function() {
$("[data-i18n]").each(function () {
if($(this).hasClass("easyui-linkbutton")){
//初始化按鈕
$($(this).children().children()[0]).html($.i18n.prop($(this).attr('data-i18n')))
}else if($(this).hasClass("easyui-window")){
//初始化彈窗title
$($(this).prev().children()[0]).html($.i18n.prop($(this).attr('data-i18n')))
}else if($(this).hasClass("easyui-panel")){
//初始化彈窗title
$($(this).prev().children()[0]).html($.i18n.prop($(this).attr('data-i18n')))
}else{
//初始化普通標籤
$(this).prepend($.i18n.prop($(this).attr('data-i18n')))
}
});
$("[placeholder-i18n]").each(function () {
$(this).attr("placeholder",$.i18n.prop($(this).attr('placeholder-i18n')));
});
$("[href-i18n]").each(function () {
$(this).attr("href",$.i18n.prop($(this).attr('href-i18n')));
});
}
});
}
function language(key){
return $.i18n.prop(key);
}
<div class="layui-form-item">
<label class="layui-form-label" data-i18n="userNo"></label>
<div class="layui-input-block">
<input class="layui-input" placeholder-i18n="userNo" type="text"/>
</div>
</div>
其中,btn: [language('btn.confirm'), language("btn.cancel")] 用于替换layui确认框中的按钮。
function delRowOpen(){
let selected = layTable.checkStatus('qryGrid');
if(selected.data.length!==1) {
layer.msg(language('msg.selectOneToDelete'));
return;
}
selected = selected.data[0];
if(!selected.id){
layer.msg(language('msg.selectedKeyIsNull'));
return;
}
layer.confirm(
language("sys.confirmDel")
, {icon: 0, title:language("sys.info"),btn: [language('btn.confirm'), language("btn.cancel")]}
, function(index) {
let param = {
'id' : selected.id,
'random' : Math.random()
};
$.ajax({
url : ctx + "/kv/del",
type : "POST",
data : param,
success : function(res){
if(res.success){
queryList();
}
layer.msg(res.msg);
}
});
layer.close(index);
});
}
如果在js中编辑页面标签,要使用language()方法拼接,不能使用data-i18n、placeholder-i18n、href-i18n等属性,因为页面加载后onload()方法中已经执行过initPage()方法,此后再动态添加的页面dom元素不会再进行属性替换。
function aa(d){
let value = d['machineAttr'];
if(!value||value.length===0){
return "-";
}
return "<a href='javascript:void(0);' onclick='openParamDetail(\"showEquParam\",\""+d['groupCode']+"\","+JSON.stringify(value)+")'>"+language('show')+"</a>";
}
function changeLang(lang) {
$.cookie("langType",lang);
location.reload();
}