wip(i18n): laydate 国际化

pull/2695/head
sight 2025-05-22 20:34:34 +08:00
parent ac8d5ccc30
commit 908ff7f59f
15 changed files with 366 additions and 149 deletions

View File

@ -11,11 +11,61 @@
var document = window.document;
var location = window.location;
var zhCn = {
locale: 'zh-cn',
/** 未使用的字段为保留字段,将来可能会使用 */
laydate: {
month: {
long: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
short: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二']
},
week:{
long: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
short: ['日', '一', '二', '三', '四', '五', '六']
},
time: ['时', '分', '秒'],
selectTime: '选择时间',
startTime: '开始时间',
endTime: '结束时间',
selectDate: '选择日期',
tools: {
confirm: '确定',
clear: '清空',
now: '现在',
reset: '重置'
},
timeout: {
date: '结束日期不能早于开始日期<br>请重新选择',
time: '结束时间不能早于开始时间<br>请重新选择'
},
invalidDate: '不在有效日期或时间范围内',
formatError: ['日期格式不合法<br>必须遵循下述格式:<br>', '<br>已为你重置'],
preview: '当前选中的结果',
panelHeaderFormat: {
year: function(y){return y + ' 年'},
month: function(m){return m + ' 月'},
monthBeforeYear: false
},
/** 面板中某些字符串拼接使用 */
view: {
year: '年',
month: '月',
week: '周',
day: '天'
}
}
}
// 基础配置
var config = {
timeout: 10, // 符合规范的模块请求最长等待秒数
debug: false, // 是否开启调试模式
version: false // 是否在模块请求时加入版本号参数(以更新模块缓存)
version: false, // 是否在模块请求时加入版本号参数(以更新模块缓存)
locale: 'zh-cn', // 设置全局配置的语言
i18nMessages: { // 语言包,格式为:{locale: {namespace:{component:{...}}}}
'zh-cn': {
lay: zhCn
}
}
};
// 模块加载缓存信息
@ -55,7 +105,13 @@
// 异常提示
var error = function(msg, type) {
type = type || 'log';
window.console && console[type] && console[type]('layui error hint: ' + msg);
msg = 'layui error hint: ' + msg
if (window.console && console[type]) {
console[type](msg);
} else if (window.console && console.log) {
console.log(msg);
}
};
// 内置模块
@ -1029,6 +1085,107 @@
}
};
/**
* 根据给定的键从国际化消息中获取翻译后的内容
* @overload
* @param {string} key 要翻译的键
* @param {Record<string, any>} opts 国际化消息对象替换 {key} 形式的占位符
* @returns {string} 翻译后的文本
* @example
* ```
* message: {
* hello: '{msg} world'
* }
* layui.$t('message.hello', {msg: 'Hello'})
* ```
*
* @overload
* @param {string} key 要翻译的键
* @param {any[]} opts 国际化消息数组替换 {0}, {1}... 形式的占位符
* @returns {string} 翻译后的文本
* @example
* ```
* message: {
* hello: '{0} world'
* }
* layui.$t('message.hello', ['Hello'])
* ```
*
* @overload
* @param {string} key 要翻译的键
* @param {...*} args 国际化消息可变参数替换 {0}, {1}... 形式的占位符
* @returns {string} 翻译后的文本
* @example
* ```
* message: {
* hello: '{0} world'
* }
* layui.$t('message.hello', 'Hello')
* ```
*
* @param {string} key
* @param {any[]} args
*/
Class.prototype.i18nTranslation = function(key){
var that = this;
var args = arguments;
var locale = that.cache.locale;
var i18nMessage = that.cache.i18nMessages[locale];
if(!i18nMessage){
error('Locale "' + locale + '" not found. Please add i18n messages for this locale first.', 'warn');
}
var result = get(i18nMessage, key, key);
// 替换占位符
if(typeof result === 'string'){
if(args.length > 1){
var opts = args[1];
// 第二个参数为对象或数组,替换占位符 {key} 或 {0}, {1}...
if(typeof opts === 'object'){
return result.replace(/\{(\w+)\}/g, function(match, key) {
return opts[key] !== undefined ? opts[key] : match;
});
}
// 处理可变参数,替换占位符 {0}, {1}...
return result.replace(/\{(\d+)\}/g, function(match, index) {
var arg = args[index + 1];
return arg !== undefined ? arg : match;
});
}
}
return result;
}
/**
* i18nTranslation 的别名
*/
Class.prototype.$t = Class.prototype.i18nTranslation;
/**
* 获取对象中的值lodash _.get 简易版
* @param {Record<string, any>} obj
* @param {string} path
* @param {any} defaultValue
*/
function get(obj, path, defaultValue){
// 'a[0].b.c' ==> ['a', '0', 'b', 'c']
var casePath = path.replace(/\[(\d+)\]/g, '.$1').split('.');
var result = obj;
for(var i = 0; i < casePath.length; i++) {
result = result && result[casePath[i]];
if(result === null || result === undefined){
return defaultValue;
}
}
return result;
}
// export layui
window.layui = new Class();
})(window);

View File

@ -201,7 +201,7 @@ layui.define(['lay', 'util', 'element', 'tabs', 'form'], function(exports){
var tools = {
copy: {
className: 'file-b',
title: ['复制代码'],
title: [layui.$t('复制代码')],
event: function(obj){
var code = util.unescape(finalCode(options.code));
var hasOnCopy = typeof options.onCopy === 'function';
@ -215,14 +215,14 @@ layui.define(['lay', 'util', 'element', 'tabs', 'form'], function(exports){
if(ret === false) return;
}
layer.msg('已复制', {icon: 1});
layer.msg(layui.$t('已复制'), {icon: 1});
},
error: function() {
if(hasOnCopy){
var ret = options.onCopy(code, false);
if(ret === false) return;
}
layer.msg('复制失败', {icon: 2});
layer.msg(layui.$t('复制失败'), {icon: 2});
}
});
}
@ -277,7 +277,7 @@ layui.define(['lay', 'util', 'element', 'tabs', 'form'], function(exports){
$.extend(tools, {
'full': {
className: 'screen-full',
title: ['最大化显示', '还原显示'],
title: [layui.$t('最大化显示'), layui.$t('还原显示')],
event: function(obj){
var el = obj.elem;
var elemView = el.closest('.'+ CONST.ELEM_PREVIEW);
@ -302,7 +302,7 @@ layui.define(['lay', 'util', 'element', 'tabs', 'form'], function(exports){
},
'window': {
className: 'release',
title: ['在新窗口预览'],
title: [layui.$t('在新窗口预览')],
event: function(obj){
util.openWin({
content: finalCode(options.code)
@ -562,7 +562,7 @@ layui.define(['lay', 'util', 'element', 'tabs', 'form'], function(exports){
// 若开启复制,且未开启预览,则单独生成复制图标
if(options.copy && !options.preview){
var copyElem = $(['<span class="layui-code-copy">',
'<i class="layui-icon layui-icon-file-b" title="复制"></i>',
layui.$t('<i class="layui-icon layui-icon-file-b" title="复制"></i>'),
'</span>'].join(''));
// 点击复制

View File

@ -285,8 +285,8 @@ layui.define(['jquery', 'lay'], function(exports) {
,'<input type="text" class="layui-input">'
,'</div>'
,'<div class="layui-btn-container">'
,'<button class="layui-btn layui-btn-primary layui-btn-sm" colorpicker-events="clear">清空</button>'
,'<button class="layui-btn layui-btn-sm" colorpicker-events="confirm">确定</button>'
,layui.$t('<button class="layui-btn layui-btn-primary layui-btn-sm" colorpicker-events="clear">清空</button>')
,layui.$t('<button class="layui-btn layui-btn-sm" colorpicker-events="confirm">确定</button>')
,'</div'
,'</div>'
,'</div>'].join(''))

View File

@ -181,7 +181,7 @@ layui.define(['jquery', 'laytpl', 'lay', 'util'], function(exports) {
if(options.data.length > 0 ){
eachItemView(elemUl, options.data)
} else {
elemUl.html('<li class="layui-menu-item-none">暂无数据</li>');
elemUl.html(layui.$t('<li class="layui-menu-item-none">暂无数据</li>'));
}
return elemUl;
};

View File

@ -20,8 +20,8 @@ layui.define('jquery', function(exports) {
var scrollElem = $(options.scrollElem || document); // 滚动条所在元素
var threshold = 'mb' in options ? options.mb : 50; // 临界距离
var isAuto = 'isAuto' in options ? options.isAuto : true; // 否自动滚动加载
var moreText = options.moreText || "加载更多"; // 手动加载时,加载更多按钮文案
var end = options.end || '没有更多了'; // “末页”显示文案
var moreText = options.moreText || layui.$t('加载更多'); // 手动加载时,加载更多按钮文案
var end = options.end || layui.$t('没有更多了'); // “末页”显示文案
var direction = options.direction || 'bottom';
var isTop = direction === 'top';

View File

@ -31,42 +31,42 @@ layui.define(['lay', 'layer', 'util'], function(exports){
verify: {
required: function(value) {
if (!/[\S]+/.test(value) || value === undefined || value === null) {
return '必填项不能为空';
return layui.$t('必填项不能为空');
}
},
phone: function(value) {
var EXP = /^1\d{10}$/;
if (value && !EXP.test(value)) {
return '手机号格式不正确';
return layui.$t('手机号格式不正确');
}
},
email: function(value) {
var EXP = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (value && !EXP.test(value)) {
return '邮箱格式不正确';
return layui.$t('邮箱格式不正确');
}
},
url: function(value) {
var EXP = /^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/;
if (value && !EXP.test(value)) {
return '链接格式不正确';
return layui.$t('链接格式不正确');
}
},
number: function(value){
if (value && isNaN(value)) {
return '只能填写数字';
return layui.$t('只能填写数字');
}
},
date: function(value){
var EXP = /^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/;
if (value && !EXP.test(value)) {
return '日期格式不正确';
return layui.$t('日期格式不正确');
}
},
identity: function(value) {
var EXP = /(^\d{15}$)|(^\d{17}(x|X|\d)$)/;
if (value && !EXP.test(value)) {
return '身份证号格式不正确';
return layui.$t('身份证号格式不正确');
}
}
},
@ -466,7 +466,7 @@ layui.define(['lay', 'layer', 'util'], function(exports){
// 下拉选择框
,select: function(elem){
var TIPS = '请选择';
var TIPS = layui.$t('请选择');
var CLASS = 'layui-form-select';
var TITLE = 'layui-select-title';
var NONE = 'layui-select-none';
@ -765,7 +765,7 @@ layui.define(['lay', 'layer', 'util'], function(exports){
}
}else{
if(none){
dl.find('.'+NONE)[0] || dl.append('<p class="'+ NONE +'">无匹配项</p>');
dl.find('.'+NONE)[0] || dl.append('<p class="'+ NONE +layui.$t('">无匹配项</p>'));
} else {
dl.find('.'+NONE).remove();
}
@ -956,7 +956,7 @@ layui.define(['lay', 'layer', 'util'], function(exports){
}
});
if (arr.length === 0) {
arr.push('<dd lay-value="" class="'+ DISABLED +'">None</dd>');
arr.push('<dd lay-value="" class="'+ DISABLED +layui.$t('">None</dd>'));
}
return arr.join('');
}();
@ -1241,7 +1241,7 @@ layui.define(['lay', 'layer', 'util'], function(exports){
}
} else {
type ? (
items[type] ? items[type]() : hint.error('不支持的 "'+ type + '" 表单渲染')
items[type] ? items[type]() : hint.error(layui.$t('不支持的 "')+ type + layui.$t('" 表单渲染'))
) : renderItem();
}
return that;
@ -1367,7 +1367,7 @@ layui.define(['lay', 'layer', 'util'], function(exports){
return othis;
}(), {tips: 1});
} else if(verType === 'alert') {
layer.alert(errorText, {title: '提示', shadeClose: true});
layer.alert(errorText, {title: layui.$t('提示'), shadeClose: true});
}
// 若返回的为字符或数字,则自动弹出默认提示框;否则由 verify 方法中处理提示
else if(/\b(string|number)\b/.test(typeof errorText)) {

View File

@ -176,7 +176,7 @@
,showBottom: true //是否显示底部栏
,isPreview: true //是否显示值预览
,btns: ['clear', 'now', 'confirm'] //右下角显示的按钮,会按照数组顺序排列
,lang: 'cn' //语言只支持cn/en即中文和英文
,lang: (isLayui && layui.cache.locale) || 'cn' //语言只支持cn/en即中文和英文
,theme: 'default' //主题
,position: null //控件定位方式定位, 默认absolute支持fixed/absolute/static
,calendar: false //是否开启公历重要节日,仅支持中文版
@ -191,50 +191,107 @@
//多语言
Class.prototype.lang = function(){
var that = this
,options = that.config
,text = {
var that = this;
var options = that.config;
var enMonthShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var text = {
cn: {
weeks: ['日', '一', '二', '三', '四', '五', '六']
,time: ['时', '分', '秒']
,timeTips: '选择时间'
,startTime: '开始时间'
,endTime: '结束时间'
,dateTips: '返回日期'
,month: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二']
,tools: {
confirm: '确定'
,clear: '清空'
,now: '现在'
month: {
long: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
short: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二']
},
week: {
long: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
short: ['日', '一', '二', '三', '四', '五', '六']
},
time: ['时', '分', '秒'],
selectTime: '选择时间',
startTime: '开始时间',
endTime: '结束时间',
selectDate: '选择日期',
tools: {
confirm: '确定',
clear: '清空',
now: '现在',
reset: '重置'
},
timeout: {
date: '结束日期不能早于开始日期<br>请重新选择',
time: '结束时间不能早于开始时间<br>请重新选择'
},
invalidDate: '不在有效日期或时间范围内',
formatError: ['日期格式不合法<br>必须遵循下述格式:<br>', '<br>已为你重置'],
preview: '当前选中的结果',
panelHeaderFormat: {
year: function (y) { return y + ' 年' },
month: function (m) { return m + ' 月' },
monthBeforeYear: false
},
/** 面板中某些字符串拼接使用 */
view: {
year: '年',
month: '月',
week: '周',
day: '天'
},
},
en: {
month: {
long: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
short: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
},
week: {
long: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
short: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
},
time: ['Hours', 'Minutes', 'Seconds'],
selectTime: 'Select Time',
startTime: 'Start Time',
endTime: 'End Time',
selectDate: 'Select Date',
tools: {
confirm: 'Confirm',
clear: 'Clear',
now: 'Now',
reset: 'Reset'
},
timeout: {
date: 'End time cannot be less than start Time<br>Please re-select',
time: 'End time cannot be less than start Time<br>Please re-select'
},
invalidDate: 'Invalid date',
formatError: ['The date format error<br>Must be followed<br>', '<br>It has been reset'],
preview: 'The selected result',
// IE11- Date.prototype.toLocaleDateString 不支持第二个参数,所以这里直接使用英文短格式
panelHeaderFormat: {
year: function (y) { return y},
month: function (m) { return enMonthShort[m - 1]},
monthBeforeYear: true
},
/** 面板中某些字符串拼接使用 */
view: {
year: '',
month: '',
week: '',
day: ''
}
,timeout: '结束时间不能早于开始时间<br>请重新选择'
,invalidDate: '不在有效日期或时间范围内'
,formatError: ['日期格式不合法<br>必须遵循下述格式:<br>', '<br>已为你重置']
,preview: '当前选中的结果'
}
,en: {
weeks: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
,time: ['Hours', 'Minutes', 'Seconds']
,timeTips: 'Select Time'
,startTime: 'Start Time'
,endTime: 'End Time'
,dateTips: 'Select Date'
,month: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
,tools: {
confirm: 'Confirm'
,clear: 'Clear'
,now: 'Now'
}
,timeout: 'End time cannot be less than start Time<br>Please re-select'
,invalidDate: 'Invalid date'
,formatError: ['The date format error<br>Must be followed<br>', '<br>It has been reset']
,preview: 'The selected result'
}
};
if(isLayui){
var message = layui.cache.i18nMessages[layui.cache.locale];
if(message){
text[layui.cache.locale] = message.lay.laydate;
}else{
window.console && console.log && console.log('layui[laydate]: Locale "' + layui.cache.locale + '" not found. Please add i18n messages for this locale first.');
}
}
return text[options.lang] || text['cn'];
};
Class.prototype.markerOfChineseFestivals = {
// 仅 /(zh|cn)/i 生效,不做国际化
'0-1-1': '元旦',
'0-2-14': '情人' ,
'0-3-8': '妇女',
@ -328,7 +385,7 @@
if (options.weekStart) {
if (!/^[0-6]$/.test(options.weekStart)) {
var lang = that.lang();
options.weekStart = lang.weeks.indexOf(options.weekStart);
options.weekStart = lang.week.short.indexOf(options.weekStart);
if (options.weekStart === -1) options.weekStart = 0;
}
}
@ -551,7 +608,7 @@
lay.each(new Array(7), function(j){
if(i === 0){
var th = lay.elem('th');
th.innerHTML = lang.weeks[(j + options.weekStart) % 7];
th.innerHTML = lang.week.short[(j + options.weekStart) % 7];
theadTr.appendChild(th);
}
tr.insertCell(j);
@ -576,7 +633,7 @@
lay(divFooter).html(function(){
var html = [], btns = [];
if(options.type === 'datetime'){
html.push('<span lay-type="datetime" class="'+ ELEM_TIME_BTN +'">'+ lang.timeTips +'</span>');
html.push('<span lay-type="datetime" class="'+ ELEM_TIME_BTN +'">'+ lang.selectTime +'</span>');
}
if(!(!options.range && options.type === 'datetime') || options.fullPanel){
html.push('<span class="'+ ELEM_PREVIEW +'" title="'+ lang.preview +'"></span>')
@ -585,7 +642,7 @@
lay.each(options.btns, function(i, item){
var title = lang.tools[item] || 'btn';
if(options.range && item === 'now') return;
if(isStatic && item === 'clear') title = options.lang === 'cn' ? '重置' : 'Reset';
if(isStatic && item === 'clear') title = lang.tools.reset;
btns.push('<span lay-type="'+ item +'" class="laydate-btns-'+ item +'">'+ title +'</span>');
});
html.push('<div class="laydate-footer-btns">'+ btns.join('') +'</div>');
@ -1101,7 +1158,7 @@
that.markRender(td, YMD, markers);
}
if(options.calendar && options.lang === 'cn'){
if(options.calendar && /(zh|cn)/i.test(options.lang)){
render(that.markerOfChineseFestivals);
}
@ -1499,14 +1556,17 @@
if(!that.panelYM) that.panelYM = {};
that.panelYM[index] = {year: dateTime.year, month: dateTime.month};
if(options.lang === 'cn'){
lay(elemYM[0]).attr('lay-type', 'year').html(dateTime.year + ' 年')
lay(elemYM[1]).attr('lay-type', 'month').html((dateTime.month + 1) + ' 月');
} else {
lay(elemYM[0]).attr('lay-type', 'month').html(lang.month[dateTime.month]);
lay(elemYM[1]).attr('lay-type', 'year').html(dateTime.year);
var formatArr = [
{type: 'year', value: lang.panelHeaderFormat.year(dateTime.year)},
{type: 'month', value: lang.panelHeaderFormat.month(dateTime.month + 1)}
];
if(lang.panelHeaderFormat.monthBeforeYear){
formatArr = formatArr.reverse();
}
lay(elemYM[0]).attr('lay-type', formatArr[0]['type']).html(formatArr[0]['value']);
lay(elemYM[1]).attr('lay-type', formatArr[1]['type']).html(formatArr[1]['value']);
//初始默认选择器
if(isAlone){ //年、月等独立选择器
if(options.range){
@ -1518,7 +1578,7 @@
that.list(options.type, 0).list(options.type, 1);
//同步按钮可点状态
options.type === 'time' ? that.setBtnStatus('时间'
options.type === 'time' ? that.setBtnStatus('isTime'
,lay.extend({}, that.systemDate(), that.startTime)
,lay.extend({}, that.systemDate(), that.endTime)
) : that.setBtnStatus(true);
@ -1595,8 +1655,8 @@
,elemYM = lay(elemHeader[2]).find('span')
,elemCont = that.elemCont[index || 0]
,haveList = lay(elemCont).find('.'+ ELEM_LIST)[0]
,isCN = options.lang === 'cn'
,text = isCN ? '年' : ''
,isMonthBeforeYear = lang.panelHeaderFormat.monthBeforeYear
,text = lang.view.year
,listYM = that.listYM[index] || {}
,hms = ['hours', 'minutes', 'seconds']
@ -1644,7 +1704,7 @@
yearNum++;
});
lay(elemYM[isCN ? 0 : 1]).attr('lay-ym', (yearNum - 8) + '-' + listYM[1])
lay(elemYM[!isMonthBeforeYear ? 0 : 1]).attr('lay-ym', (yearNum - 8) + '-' + listYM[1])
.html((startY + text) + ' - ' + (yearNum - 1 + text));
}
@ -1661,7 +1721,7 @@
};
i + 1 == listYM[1] && lay(li).addClass(THIS);
li.innerHTML = lang.month[i] + (isCN ? '月' : '');
li.innerHTML = lang.month.short[i] + lang.view.month;
ul.appendChild(li);
/*
@ -1683,7 +1743,7 @@
that.cellRender(li, {year: listYM[0], month: i + 1, date: 1}, 'month');
});
lay(elemYM[isCN ? 0 : 1]).attr('lay-ym', listYM[0] + '-' + listYM[1])
lay(elemYM[!isMonthBeforeYear ? 0 : 1]).attr('lay-ym', listYM[0] + '-' + listYM[1])
.html(listYM[0] + text);
}
@ -1843,7 +1903,7 @@
,haveSpan = lay(elemHeader[2]).find('.'+ ELEM_TIME_TEXT);
scroll();
span.innerHTML = options.range ? [lang.startTime,lang.endTime][index] : lang.timeTips;
span.innerHTML = options.range ? [lang.startTime,lang.endTime][index] : lang.selectTime;
lay(that.elemMain[index]).addClass('laydate-time-show');
if(haveSpan[0]) haveSpan.remove();
@ -1930,7 +1990,7 @@
//是否异常提示
if(tips && isOut) that.hint(
typeof tips === 'string' ? lang.timeout.replace(/日期/g, tips) : lang.timeout
typeof tips === 'string' ? lang.timeout.time : lang.timeout.date
);
}
};
@ -2320,13 +2380,13 @@
if(lay(btn).hasClass(DISABLED)) return;
that.list('time', 0);
options.range && that.list('time', 1);
lay(btn).attr('lay-type', 'date').html(that.lang().dateTips);
lay(btn).attr('lay-type', 'date').html(that.lang().selectDate);
}
//选择日期
,date: function(){
that.closeList();
lay(btn).attr('lay-type', 'datetime').html(that.lang().timeTips);
lay(btn).attr('lay-type', 'datetime').html(that.lang().selectTime);
}
//清空、重置
@ -2374,7 +2434,7 @@
: that.startDate && that.endDate && that.newDate(lay.extend({},that.startDate, that.startTime || {})) > that.newDate(lay.extend({},that.endDate, that.endTime || {}));
return isTimeout
? that.hint(options.type === 'time' ? lang.timeout.replace(/日期/g, '时间') : lang.timeout)
? that.hint(options.type === 'time' ? lang.timeout.time : lang.timeout.date)
: that.hint(lang.invalidDate);
}
} else {

View File

@ -34,7 +34,7 @@ var ready = {
events: {resize: {}},
minStackIndex: 0,
minStackArr: [],
btn: ['确定', '取消'],
btn: [layui.$t('确定'), layui.$t('取消')],
// 五种原始层模式
type: ['dialog', 'page', 'iframe', 'loading', 'tips'],
@ -268,7 +268,7 @@ Class.pt.config = {
shade: 0.3,
fixed: true,
move: doms[1],
title: '信息',
title: layui.$t('信息'),
offset: 'auto',
area: 'auto',
closeBtn: 1,
@ -1444,7 +1444,7 @@ layer.prompt = function(options, yes){
return layer.open($.extend({
type: 1,
btn: ['确定','取消'],
btn: [layui.$t('确定'),layui.$t('取消')],
content: content,
skin: 'layui-layer-prompt' + skin('prompt'),
maxWidth: win.width(),
@ -1457,7 +1457,7 @@ layer.prompt = function(options, yes){
yes: function(index){
var value = prompt.val();
if(value.length > (options.maxlength||500)) {
layer.tips('最多输入'+ (options.maxlength || 500) +'个字符', prompt, {tips: 1});
layer.tips(layui.$t('最多输入')+ (options.maxlength || 500) +layui.$t('个字符'), prompt, {tips: 1});
} else {
yes && yes(value, index, prompt);
}
@ -1571,7 +1571,7 @@ layer.photos = function(options, loop, key){
// 不直接弹出
if (!loop) return;
} else if (data.length === 0){
return layer.msg('没有图片');
return layer.msg(layui.$t('没有图片'));
}
// 上一张
@ -1819,12 +1819,12 @@ layer.photos = function(options, loop, key){
if (options.toolbar) {
arr.push([
'<div class="layui-layer-photos-toolbar layui-layer-photos-header">',
'<span toolbar-event="rotate" data-option="90" title="旋转"><i class="layui-icon layui-icon-refresh"></i></span>',
'<span toolbar-event="scalex" title="变换"><i class="layui-icon layui-icon-slider"></i></span>',
'<span toolbar-event="zoom" data-option="0.1" title="放大"><i class="layui-icon layui-icon-add-circle"></i></span>',
'<span toolbar-event="zoom" data-option="-0.1" title="缩小"><i class="layui-icon layui-icon-reduce-circle"></i></span>',
'<span toolbar-event="reset" title="还原"><i class="layui-icon layui-icon-refresh-1"></i></span>',
'<span toolbar-event="close" title="关闭"><i class="layui-icon layui-icon-close"></i></span>',
layui.$t('<span toolbar-event="rotate" data-option="90" title="旋转"><i class="layui-icon layui-icon-refresh"></i></span>'),
layui.$t('<span toolbar-event="scalex" title="变换"><i class="layui-icon layui-icon-slider"></i></span>'),
layui.$t('<span toolbar-event="zoom" data-option="0.1" title="放大"><i class="layui-icon layui-icon-add-circle"></i></span>'),
layui.$t('<span toolbar-event="zoom" data-option="-0.1" title="缩小"><i class="layui-icon layui-icon-reduce-circle"></i></span>'),
layui.$t('<span toolbar-event="reset" title="还原"><i class="layui-icon layui-icon-refresh-1"></i></span>'),
layui.$t('<span toolbar-event="close" title="关闭"><i class="layui-icon layui-icon-close"></i></span>'),
'</div>'
].join(''));
}
@ -1834,7 +1834,7 @@ layer.photos = function(options, loop, key){
arr.push(['<div class="layui-layer-photos-toolbar layui-layer-photos-footer">',
'<h3>'+ alt +'</h3>',
'<em>'+ dict.imgIndex +' / '+ data.length +'</em>',
'<a href="'+ data[start].src +'" target="_blank">查看原图</a>',
'<a href="'+ data[start].src +layui.$t('" target="_blank">查看原图</a>'),
'</div>'].join(''));
}
@ -1856,9 +1856,9 @@ layer.photos = function(options, loop, key){
}, options));
}, function(){
layer.close(dict.loadi);
layer.msg('当前图片地址异常,<br>是否继续查看下一张?', {
layer.msg(layui.$t('当前图片地址异常,<br>是否继续查看下一张?'), {
time: 30000,
btn: ['下一张', '不看了'],
btn: [layui.$t('下一张'), layui.$t('不看了')],
yes: function(){
data.length > 1 && dict.imgnext(true,true);
}

View File

@ -72,8 +72,8 @@ layui.define(function(exports) {
groups = config.pages;
}
config.prev = 'prev' in config ? config.prev : '上一页'; // 上一页文本
config.next = 'next' in config ? config.next : '下一页'; // 下一页文本
config.prev = 'prev' in config ? config.prev : layui.$t('上一页'); // 上一页文本
config.next = 'next' in config ? config.next : layui.$t('下一页'); // 下一页文本
// 计算当前组
var index = config.pages > groups
@ -100,7 +100,7 @@ layui.define(function(exports) {
// 首页
if(index > 1 && config.first !== false && groups !== 0){
pager.push('<a class="layui-laypage-first" data-page="1" title="首页">'+ (config.first || 1) +'</a>');
pager.push(layui.$t('<a class="layui-laypage-first" data-page="1" title="首页">')+ (config.first || 1) +'</a>');
}
// 计算当前页码组的起始页
@ -137,7 +137,7 @@ layui.define(function(exports) {
pager.push('<span class="layui-laypage-spr">...</span>');
}
if(groups !== 0){
pager.push('<a class="layui-laypage-last" title="尾页" data-page="'+ config.pages +'">'+ (config.last || config.pages) +'</a>');
pager.push(layui.$t('<a class="layui-laypage-last" title="尾页" data-page="')+ config.pages +'">'+ (config.last || config.pages) +'</a>');
}
}
@ -153,7 +153,7 @@ layui.define(function(exports) {
// 数据总数
count: function(){
var countText = typeof config.countText === 'object' ? config.countText : ['共 ', ' 条'];
var countText = typeof config.countText === 'object' ? config.countText : [layui.$t('共')+ ' ', ' ' + layui.$t('条')];
return '<span class="layui-laypage-count">'+ countText[0] + config.count + countText[1] +'</span>'
}(),
@ -161,7 +161,7 @@ layui.define(function(exports) {
limit: function(){
var elemArr = ['<span class="layui-laypage-limits"><select lay-ignore>'];
var template = function(item) {
var def = item +' 条/页';
var def = item +' ' + layui.$t('条/页');
return typeof config.limitTemplet === 'function'
? (config.limitTemplet(item) || def)
: def;
@ -189,9 +189,9 @@ layui.define(function(exports) {
// 跳页区域
skip: function(){
var skipText = typeof config.skipText === 'object' ? config.skipText : [
'到第',
'页',
'确定'
layui.$t('到第'),
layui.$t('页'),
layui.$t('确定')
];
return [
'<span class="layui-laypage-skip">'+ skipText[0],

View File

@ -192,7 +192,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports) {
,'{{# } else { }}'
,'<span>{{-item2.title||""}}</span>'
,'{{# if(isSort){ }}'
,'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc" title="升序"></i><i class="layui-edge layui-table-sort-desc" title="降序"></i></span>'
,layui.$t('<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc" title="升序"></i><i class="layui-edge layui-table-sort-desc" title="降序"></i></span>')
,'{{# } }}'
,'{{# } }}'
,'</div>'
@ -302,7 +302,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports) {
defaultContextmenu: true, // 显示默认上下文菜单
autoSort: true, // 是否前端自动排序。如果否,则需自主排序(通常为服务端处理好排序)
text: {
none: '无数据'
none: layui.$t('无数据')
},
cols: []
};
@ -650,7 +650,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports) {
// 头部工具栏右上角默认工具
var defaultConfig = {
filter: {
title: '筛选列',
title: layui.$t('筛选列'),
layEvent: 'LAYTABLE_COLS',
icon: 'layui-icon-cols',
onClick: function(obj) {
@ -703,7 +703,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports) {
}
},
exports: {
title: '导出',
title: layui.$t('导出'),
layEvent: 'LAYTABLE_EXPORT',
icon: 'layui-icon-export',
onClick: function(obj) { // 自带导出
@ -712,16 +712,16 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports) {
var openPanel = obj.openPanel;
var elem = obj.elem;
if (!data.length) return layer.tips('当前表格无数据', elem, {tips: 3});
if (!data.length) return layer.tips(layui.$t('当前表格无数据'), elem, {tips: 3});
if(device.ie){
layer.tips('导出功能不支持 IE请用 Chrome 等高级浏览器导出', elem, {
layer.tips(layui.$t('导出功能不支持 IE请用 Chrome 等高级浏览器导出'), elem, {
tips: 3
});
} else {
openPanel({
list: function(){
return [
'<li data-type="csv">导出 CSV 文件</li>'
layui.$t('<li data-type="csv">导出 CSV 文件</li>')
].join('')
}(),
done: function(panel, list){
@ -735,7 +735,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports) {
}
},
print: {
title: '打印',
title: layui.$t('打印'),
layEvent: 'LAYTABLE_PRINT',
icon: 'layui-icon-print',
onClick: function(obj) {
@ -743,7 +743,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports) {
var options = obj.config;
var elem = obj.elem;
if (!data.length) return layer.tips('当前表格无数据', elem, {tips: 3});
if (!data.length) return layer.tips(layui.$t('当前表格无数据'), elem, {tips: 3});
var printWin = window.open('about:blank', '_blank');
var style = ['<style>',
'body{font-size: 12px; color: #5F5F5F;}',
@ -1219,7 +1219,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports) {
if(res[response.statusName] != response.statusCode){
that.errorView(
res[response.msgName] ||
('返回的数据不符合规范,正确的成功状态码应为:"'+ response.statusName +'": '+ response.statusCode)
(layui.$t('返回的数据不符合规范,正确的成功状态码应为:"')+ response.statusName +'": '+ response.statusCode)
);
} else {
// 当前页不能超过总页数
@ -1246,7 +1246,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports) {
that._xhrAbort = false;
return;
}
that.errorView('请求异常,错误提示:'+ msg);
that.errorView(layui.$t('请求异常,错误提示:')+ msg);
typeof options.error === 'function' && options.error(e, msg);
}
});

View File

@ -80,7 +80,7 @@ layui.define(['laytpl', 'form'], function(exports) {
'{{# if(d.data.showSearch){ }}',
'<div class="layui-transfer-search">',
'<i class="layui-icon layui-icon-search"></i>',
'<input type="text" class="layui-input" placeholder="关键词搜索">',
layui.$t('<input type="text" class="layui-input" placeholder="关键词搜索">'),
'</div>',
'{{# } }}',
'<ul class="layui-transfer-data"></ul>',
@ -117,7 +117,7 @@ layui.define(['laytpl', 'form'], function(exports) {
// 默认配置
Class.prototype.config = {
title: ['列表一', '列表二'],
title: [layui.$t('列表一'), layui.$t('列表二')],
width: 200,
height: 360,
data: [], // 数据源
@ -125,8 +125,8 @@ layui.define(['laytpl', 'form'], function(exports) {
showSearch: false, // 是否开启搜索
id: '', // 唯一索引,默认自增 index
text: {
none: '无数据',
searchNone: '无匹配数据'
none: layui.$t('无数据'),
searchNone: layui.$t('无匹配数据')
}
};

View File

@ -108,8 +108,8 @@ layui.define(['form','util'], function(exports) {
edit: false, // 是否开启节点的操作图标
text: {
defaultNodeName: '未命名', // 节点默认名称
none: '无数据' // 数据为空时的文本提示
defaultNodeName: layui.$t('未命名'), // 节点默认名称
none: layui.$t('无数据') // 数据为空时的文本提示
}
};
@ -576,7 +576,7 @@ layui.define(['form','util'], function(exports) {
// 删除
} else {
layer.confirm('确认删除该节点 "<span style="color: #999;">'+ (item[customName.title] || '') +'</span>" 吗?', function(index){
layer.confirm(layui.$t('确认删除该节点 "<span style="color: #999;">')+ (item[customName.title] || '') +layui.$t('</span>" 吗?'), function(index){
options.operate && options.operate(returnObj); // 节点删除的回调
returnObj.status = 'remove'; // 标注节点删除

View File

@ -400,7 +400,7 @@ layui.define(['table'], function (exports) {
Class.prototype.getTreeNode = function (data) {
var that = this;
if (!data) {
return hint.error('找不到节点数据');
return hint.error(layui.$t('找不到节点数据'));
}
var options = that.getOptions();
var treeOptions = options.tree;
@ -422,7 +422,7 @@ layui.define(['table'], function (exports) {
var that = this;
var treeNodeData = that.getNodeDataByIndex(index);
if (!treeNodeData) {
return hint.error('找不到节点数据');
return hint.error(layui.$t('找不到节点数据'));
}
var options = that.getOptions();
var treeOptions = options.tree;
@ -881,7 +881,7 @@ layui.define(['table'], function (exports) {
* */
treeTable.expandAll = function (id, expandFlag) {
if (layui.type(expandFlag) !== 'boolean') {
return hint.error('expandAll 的展开状态参数只接收true/false')
return hint.error(layui.$t('expandAll 的展开状态参数只接收true/false'))
}
var that = getThisTable(id);

View File

@ -524,11 +524,11 @@ layui.define(['lay', 'layer'], function(exports) {
// 文件类型名称
var typeName = ({
file: '文件',
images: '图片',
video: '视频',
audio: '音频'
})[options.accept] || '文件';
file: layui.$t('文件'),
images: layui.$t('图片'),
video: layui.$t('视频'),
audio: layui.$t('音频')
})[options.accept] || layui.$t('文件');
// 校验文件格式
value = value.length === 0
@ -572,7 +572,7 @@ layui.define(['lay', 'layer'], function(exports) {
// 校验失败提示
if(check){
that.msg(text['check-error'] || ('选择的'+ typeName +'中包含不支持的格式'));
that.msg(text['check-error'] || (layui.$t('选择的')+ typeName +layui.$t('中包含不支持的格式')));
return elemFile.value = '';
}
@ -598,8 +598,8 @@ layui.define(['lay', 'layer'], function(exports) {
return that.msg(typeof text['limit-number'] === 'function'
? text['limit-number'](options, that.fileLength)
: (
'同时最多只能上传: '+ options.number + ' 个文件'
+'<br>您当前已经选择了: '+ that.fileLength +' 个文件'
layui.$t('同时最多只能上传:')+ ' '+ options.number + ' ' + layui.$t('个文件')
+layui.$t('<br>您当前已经选择了:')+ ' '+ that.fileLength +' ' + layui.$t('个文件')
));
}
@ -617,7 +617,7 @@ layui.define(['lay', 'layer'], function(exports) {
});
if(limitSize) return that.msg(typeof text['limit-size'] === 'function'
? text['limit-size'](options, limitSize)
: '文件大小不能超过 '+ limitSize);
: layui.$t('文件大小不能超过')+ ' '+ limitSize);
}
send();
@ -642,7 +642,7 @@ layui.define(['lay', 'layer'], function(exports) {
var elemFile = that.elemFile;
var item = options.item ? options.item : options.elem;
var value = files.length > 1
? files.length + '个文件'
? files.length + layui.$t('个文件')
: ((files[0] || {}).name || (elemFile[0].value.match(/[^\/\\]+\..+/g)||[]) || '');
if(elemFile.next().hasClass(ELEM_CHOOSE)){

View File

@ -230,15 +230,15 @@ layui.define('jquery', function(exports) {
// 30 天以内,返回「多久前」
if(stamp >= 1000*60*60*24){
return ((stamp/1000/60/60/24)|0) + ' 天前';
return ((stamp/1000/60/60/24)|0) + ' ' + layui.$t('天前');
} else if(stamp >= 1000*60*60){
return ((stamp/1000/60/60)|0) + ' 小时前';
return ((stamp/1000/60/60)|0) + ' ' + layui.$t('小时前');
} else if(stamp >= 1000*60*3){ // 3 分钟以内为:刚刚
return ((stamp/1000/60)|0) + ' 分钟前';
return ((stamp/1000/60)|0) + ' ' + layui.$t('分钟前');
} else if(stamp < 0){
return '未来';
return layui.$t('未来');
} else {
return '刚刚';
return layui.$t('刚刚');
}
},
@ -305,17 +305,17 @@ layui.define('jquery', function(exports) {
var defaultMeridiem = function(hours, minutes){
var hm = hours * 100 + minutes;
if (hm < 600) {
return '凌晨';
return layui.$t('凌晨');
} else if (hm < 900) {
return '早上';
return layui.$t('早上');
} else if (hm < 1100) {
return '上午';
return layui.$t('上午');
} else if (hm < 1300) {
return '中午';
return layui.$t('中午');
} else if (hm < 1800) {
return '下午';
return layui.$t('下午');
}
return '晚上';
return layui.$t('晚上');
};
var meridiem = (options && options.customMeridiem) || defaultMeridiem;