From 2ad09cb3fc9f77e821bf847aebbf1d85055bd81c Mon Sep 17 00:00:00 2001 From: sight <26325820+Sight-wcg@users.noreply.github.com> Date: Fri, 23 May 2025 13:35:36 +0800 Subject: [PATCH] =?UTF-8?q?wip(i18n):=20=E4=BF=AE=E6=94=B9=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E6=B6=88=E6=81=AF=E5=AF=B9=E8=B1=A1=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layui.js | 71 +++++++++++++++++++++++++++++++++++------- src/modules/laydate.js | 16 +++++----- 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/layui.js b/src/layui.js index 34628521..4743b458 100644 --- a/src/layui.js +++ b/src/layui.js @@ -75,10 +75,12 @@ timeout: 10, // 符合规范的模块请求最长等待秒数 debug: false, // 是否开启调试模式 version: false, // 是否在模块请求时加入版本号参数(以更新模块缓存) - locale: 'zh-cn', // 设置全局配置的语言 - i18nMessages: { // 语言包,格式为:{locale: {namespace:{component:{...}}}} - 'zh-cn': { - lay: zhCn + i18n:{ + locale: 'zh-cn', // 设置全局配置的语言 + messages: { // 全局国际化消息对象,格式为:{locale: {namespace:{component:{...}}}} + 'zh-cn': { + lay: zhCn // layui 使用 `lay` 命名空间,外部自定义模块应使用自定义命名空间 + } } } }; @@ -232,10 +234,17 @@ /** * 全局配置 - * @param {Object} options + * @param {Object} options - 配置对象 + * @param {boolean} deepMerged - 是否深度合并配置信息,默认为 false */ - Class.prototype.config = function(options) { - Object.assign(config, options); + Class.prototype.config = function(options, deepMerged) { + + if(deepMerged){ + deepClone(config, options); + }else{ + Object.assign(config, options); + } + return this; }; @@ -1102,6 +1111,9 @@ /** * 根据给定的键从国际化消息中获取翻译后的内容 + * + * 未文档化的私有方法,仅限内部使用 + * @internal * @overload * @param {string} key 要翻译的键 * @param {Record} opts 国际化消息对象,替换 {key} 形式的占位符 @@ -1144,11 +1156,11 @@ Class.prototype.i18nTranslation = function(key){ var that = this; var args = arguments; - var locale = that.cache.locale; - var i18nMessage = that.cache.i18nMessages[locale]; + var i18n = that.cache.i18n; + var i18nMessage = i18n.messages[i18n.locale]; if(!i18nMessage){ - error('Locale "' + locale + '" not found. Please add i18n messages for this locale first.', 'warn'); + error('Locale "' + i18n.locale + '" not found. Please add i18n messages for this locale first.', 'warn'); } var result = get(i18nMessage, key, key); @@ -1176,7 +1188,9 @@ } /** - * i18nTranslation 的别名 + * 根据给定的键从国际化消息中获取翻译后的内容 + * + * layui.i18nTranslation 的别名,用于简化代码书写,未文档化仅限内部使用 */ Class.prototype.$t = Class.prototype.i18nTranslation; @@ -1201,6 +1215,41 @@ return result; } + /** + * 将两个或多个对象的内容深度合并到第一个对象中 + * 复制自 lay.extend + * @callback ExtendFunc + * @param {*} target - 一个对象 + * @param {...*} objectN - 包含额外的属性合并到第一个参数 + * @returns {*} 返回合并后的对象 + */ + /** @type ExtendFunc*/ + function deepClone(){ + var ai = 1; + var length; + var args = arguments; + var clone = function(target, obj){ + target = target || (layui.type(obj) === 'array' ? [] : {}); // 目标对象 + for(var i in obj){ + // 若值为普通对象,则进入递归,继续深度合并 + target[i] = (obj[i] && obj[i].constructor === Object) + ? clone(target[i], obj[i]) + : obj[i]; + } + return target; + }; + + args[0] = typeof args[0] === 'object' ? args[0] : {}; + length = args.length + + for(; ai < length; ai++){ + if(typeof args[ai] === 'object'){ + clone(args[0], args[ai]); + } + } + return args[0]; + }; + // export layui window.layui = new Class(); })(window); diff --git a/src/modules/laydate.js b/src/modules/laydate.js index d890ecc1..5504d643 100644 --- a/src/modules/laydate.js +++ b/src/modules/laydate.js @@ -193,7 +193,6 @@ Class.prototype.lang = function(){ var that = this; var options = that.config; - var enMonthShort = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; var text = { cn: { month: { @@ -262,10 +261,10 @@ invalidDate: 'Invalid date', formatError: ['The date format error
Must be followed:
', '
It has been reset'], preview: 'The selected result', - // IE11- Date.prototype.toLocaleDateString 不支持第二个参数,所以这里直接使用英文短格式 + // IE11- Date.prototype.toLocaleDateString 不支持第二个参数,所以这里用函数实现,直接使用英文短格式 panelHeaderFormat: { year: function (y) { return y}, - month: function (m) { return enMonthShort[m - 1]}, + month: function (m) { return text.en.month.short[m - 1]}, monthBeforeYear: true }, /** 面板中某些字符串拼接使用 */ @@ -279,12 +278,15 @@ }; if(isLayui){ - options.lang = layui.cache.locale; - var message = layui.cache.i18nMessages[layui.cache.locale]; + var i18n = layui.cache.i18n; + var isBuiltinEn = options.lang === 'en'; + // TODO 此处无法得知 render option 中是否设置了 lang,因此不能遵循选项就近原则 + options.lang = options.lang === 'en' ? options.lang : i18n.locale; + var message = i18n.messages[i18n.locale]; if(message){ - text[layui.cache.locale] = message.lay.laydate; + text[i18n.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.'); + !isBuiltinEn && window.console && console.log && console.log('layui[laydate]: Locale "' + i18n.locale + '" not found. Please add i18n messages for this locale first.'); } }