@lytjs/plugin-i18n 6.5.0 → 6.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +52 -52
- package/dist/index.d.cts +0 -65
- package/dist/index.d.ts +0 -65
package/dist/index.cjs
CHANGED
|
@@ -91,7 +91,7 @@ function createI18n(options = {}) {
|
|
|
91
91
|
...localeMessages[locale],
|
|
92
92
|
...deepClone(messages2)
|
|
93
93
|
};
|
|
94
|
-
console.
|
|
94
|
+
console.warn(`[i18n] Locale "${locale}" registered successfully`);
|
|
95
95
|
}
|
|
96
96
|
function getMessages() {
|
|
97
97
|
return deepClone(localeMessages);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["signal","isObject","isString","registerLocale","messages","definePlugin"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * @lytjs/plugin-i18n\r\n *\r\n * LytJS official i18n plugin for internationalization and localization support.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport { signal } from '@lytjs/reactivity';\r\nimport { isString, isObject } from '@lytjs/common-is';\r\nimport type { I18nOptions, I18nInstance, Locale, LocaleMessages, TranslateFn } from './types';\r\n\r\n/**\r\n * 深度克隆对象,防止直接修改\r\n */\r\nfunction deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(deepClone) as T;\r\n }\r\n\r\n const cloned = {} as Record<string, any>;\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n cloned[key] = deepClone((obj as Record<string, any>)[key]);\r\n }\r\n }\r\n return cloned as T;\r\n}\r\n\r\n/**\r\n * 创建 i18n 实例\r\n */\r\nfunction createI18n(options: I18nOptions = {}): I18nInstance {\r\n const {\r\n locale: defaultLocale = 'zh-CN',\r\n fallbackLocale = 'en-US',\r\n messages = {},\r\n warnHtmlMessage = true,\r\n } = options;\r\n\r\n // 当前语言\r\n const currentLocale = signal(defaultLocale);\r\n\r\n // 可用语言列表(响应式)\r\n const availableLocalesState = signal<string[]>(Object.keys(messages));\r\n\r\n // 语言包存储(深度克隆以防止外部修改)\r\n const localeMessages: Locale = deepClone(messages);\r\n\r\n /**\r\n * 获取嵌套对象的值\r\n */\r\n function getNestedValue(obj: LocaleMessages, path: string): string | undefined {\r\n const keys = path.split('.');\r\n let current: any = obj;\r\n\r\n for (const key of keys) {\r\n if (!isObject(current) || !(key in current)) {\r\n return undefined;\r\n }\r\n current = current[key as keyof typeof current];\r\n }\r\n\r\n return isString(current) ? current : undefined;\r\n }\r\n\r\n /**\r\n * 替换插值\r\n */\r\n function interpolate(message: string, args: any[]): string {\r\n if (args.length === 0) return message;\r\n\r\n // 支持命名参数 {name} 和位置参数 {0}\r\n return message.replace(/\\{(\\w+)\\}/g, (match, key) => {\r\n const index = parseInt(key, 10);\r\n if (!isNaN(index)) {\r\n return args[index] !== undefined ? String(args[index]) : match;\r\n }\r\n // 命名参数(从对象中获取)\r\n if (isObject(args[0])) {\r\n return (args[0] as Record<string, any>)[key] !== undefined\r\n ? String((args[0] as Record<string, any>)[key])\r\n : match;\r\n }\r\n return match;\r\n });\r\n }\r\n\r\n /**\r\n * 翻译函数\r\n */\r\n function t(key: string, ...args: any[]): string {\r\n const locale = currentLocale();\r\n const msgs = localeMessages[locale];\r\n const fallbackMessages = localeMessages[fallbackLocale];\r\n\r\n // 尝试获取翻译\r\n let message = msgs ? getNestedValue(msgs, key) : undefined;\r\n\r\n // 回退到默认语言\r\n if (!message && fallbackMessages) {\r\n message = getNestedValue(fallbackMessages, key);\r\n }\r\n\r\n // 找不到翻译,返回 key\r\n if (!message) {\r\n if (warnHtmlMessage) {\r\n console.warn(`[i18n] Missing translation for key: \"${key}\"`);\r\n }\r\n return key;\r\n }\r\n\r\n return interpolate(message, args);\r\n }\r\n\r\n /**\r\n * 检查翻译是否存在\r\n */\r\n function te(key: string, locale?: string): boolean {\r\n const targetLocale = locale || currentLocale();\r\n const msgs = localeMessages[targetLocale];\r\n\r\n if (!msgs) return false;\r\n return getNestedValue(msgs, key) !== undefined;\r\n }\r\n\r\n /**\r\n * 设置当前语言\r\n */\r\n function setLocale(locale: string): void {\r\n currentLocale.set(locale);\r\n }\r\n\r\n /**\r\n * 注册语言包\r\n */\r\n function registerLocale(locale: string, messages: LocaleMessages): void {\r\n // 如果是新语言,添加到可用语言列表\r\n if (!localeMessages[locale]) {\r\n localeMessages[locale] = {};\r\n // 更新可用语言列表\r\n const newLocales = [...Object.keys(localeMessages)];\r\n availableLocalesState.set(newLocales);\r\n }\r\n // 合并语言包(支持部分更新,深度克隆以防止外部修改)\r\n localeMessages[locale] = {\r\n ...localeMessages[locale],\r\n ...deepClone(messages),\r\n };\r\n console.log(`[i18n] Locale \"${locale}\" registered successfully`);\r\n }\r\n\r\n /**\r\n * 获取所有语言包\r\n */\r\n function getMessages(): Locale {\r\n // 返回深度克隆以防止外部直接修改\r\n return deepClone(localeMessages);\r\n }\r\n\r\n return {\r\n locale: {\r\n get value() { return currentLocale(); },\r\n set value(v: string) { currentLocale.set(v); }\r\n },\r\n setLocale,\r\n t,\r\n te,\r\n get availableLocales() { return availableLocalesState(); },\r\n registerLocale,\r\n getMessages,\r\n };\r\n}\r\n\r\n/**\r\n * 注册语言包(独立函数版本)\r\n */\r\nfunction registerLocale(i18n: I18nInstance, locale: string, messages: LocaleMessages): void {\r\n i18n.registerLocale(locale, messages);\r\n}\r\n\r\nconst pluginI18n = definePlugin({\r\n name: 'i18n',\r\n version: '6.0.0',\r\n description: 'LytJS official i18n plugin for internationalization and localization support',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'i18n', 'internationalization', 'localization'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n locale: { type: 'string', default: 'zh-CN' },\r\n fallbackLocale: { type: 'string', default: 'en-US' },\r\n messages: { type: 'object', default: {} },\r\n warnHtmlMessage: { type: 'boolean', default: true },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const i18n = createI18n(options as I18nOptions);\r\n\r\n app.config.globalProperties.$i18n = i18n;\r\n app.config.globalProperties.$t = i18n.t;\r\n\r\n app.provide('lyt-i18n', i18n);\r\n },\r\n});\r\n\r\nexport default pluginI18n;\r\nexport type { I18nOptions, I18nInstance, Locale, LocaleMessages, TranslateFn };\r\nexport { createI18n, registerLocale };\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["signal","isObject","isString","registerLocale","messages","definePlugin"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @lytjs/plugin-i18n\n *\n * LytJS official i18n plugin for internationalization and localization support.\n *\n * @packageDocumentation\n */\n\nimport { definePlugin } from '@lytjs/core';\nimport { signal } from '@lytjs/reactivity';\nimport { isString, isObject } from '@lytjs/common-is';\nimport type { I18nOptions, I18nInstance, Locale, LocaleMessages, TranslateFn } from './types';\n\n/**\n * 深度克隆对象,防止直接修改\n */\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(deepClone) as T;\n }\n\n const cloned = {} as Record<string, unknown>;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\n/**\n * 创建 i18n 实例\n */\nfunction createI18n(options: I18nOptions = {}): I18nInstance {\n const {\n locale: defaultLocale = 'zh-CN',\n fallbackLocale = 'en-US',\n messages = {},\n warnHtmlMessage = true,\n } = options;\n\n // 当前语言\n const currentLocale = signal(defaultLocale);\n\n // 可用语言列表(响应式)\n const availableLocalesState = signal<string[]>(Object.keys(messages));\n\n // 语言包存储(深度克隆以防止外部修改)\n const localeMessages: Locale = deepClone(messages);\n\n /**\n * 获取嵌套对象的值\n */\n function getNestedValue(obj: LocaleMessages, path: string): string | undefined {\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (!isObject(current) || !(key in current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return isString(current) ? current : undefined;\n }\n\n /**\n * 替换插值\n */\n function interpolate(message: string, args: unknown[]): string {\n if (args.length === 0) return message;\n\n // 支持命名参数 {name} 和位置参数 {0}\n return message.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const index = parseInt(key, 10);\n if (!isNaN(index)) {\n return args[index] !== undefined ? String(args[index]) : match;\n }\n // 命名参数(从对象中获取)\n if (isObject(args[0])) {\n return (args[0] as Record<string, unknown>)[key] !== undefined\n ? String((args[0] as Record<string, unknown>)[key])\n : match;\n }\n return match;\n });\n }\n\n /**\n * 翻译函数\n */\n function t(key: string, ...args: unknown[]): string {\n const locale = currentLocale();\n const msgs = localeMessages[locale];\n const fallbackMessages = localeMessages[fallbackLocale];\n\n // 尝试获取翻译\n let message = msgs ? getNestedValue(msgs, key) : undefined;\n\n // 回退到默认语言\n if (!message && fallbackMessages) {\n message = getNestedValue(fallbackMessages, key);\n }\n\n // 找不到翻译,返回 key\n if (!message) {\n if (warnHtmlMessage) {\n console.warn(`[i18n] Missing translation for key: \"${key}\"`);\n }\n return key;\n }\n\n return interpolate(message, args);\n }\n\n /**\n * 检查翻译是否存在\n */\n function te(key: string, locale?: string): boolean {\n const targetLocale = locale || currentLocale();\n const msgs = localeMessages[targetLocale];\n\n if (!msgs) return false;\n return getNestedValue(msgs, key) !== undefined;\n }\n\n /**\n * 设置当前语言\n */\n function setLocale(locale: string): void {\n currentLocale.set(locale);\n }\n\n /**\n * 注册语言包\n */\n function registerLocale(locale: string, messages: LocaleMessages): void {\n // 如果是新语言,添加到可用语言列表\n if (!localeMessages[locale]) {\n localeMessages[locale] = {};\n // 更新可用语言列表\n const newLocales = [...Object.keys(localeMessages)];\n availableLocalesState.set(newLocales);\n }\n // 合并语言包(支持部分更新,深度克隆以防止外部修改)\n localeMessages[locale] = {\n ...localeMessages[locale],\n ...deepClone(messages),\n };\n console.warn(`[i18n] Locale \"${locale}\" registered successfully`);\n }\n\n /**\n * 获取所有语言包\n */\n function getMessages(): Locale {\n // 返回深度克隆以防止外部直接修改\n return deepClone(localeMessages);\n }\n\n return {\n locale: {\n get value() {\n return currentLocale();\n },\n set value(v: string) {\n currentLocale.set(v);\n },\n },\n setLocale,\n t,\n te,\n get availableLocales() {\n return availableLocalesState();\n },\n registerLocale,\n getMessages,\n };\n}\n\n/**\n * 注册语言包(独立函数版本)\n */\nfunction registerLocale(i18n: I18nInstance, locale: string, messages: LocaleMessages): void {\n i18n.registerLocale(locale, messages);\n}\n\nconst pluginI18n = definePlugin({\n name: 'i18n',\n version: '6.0.0',\n description: 'LytJS official i18n plugin for internationalization and localization support',\n author: 'LytJS Team',\n keywords: ['lytjs', 'i18n', 'internationalization', 'localization'],\n schema: {\n type: 'object',\n object: {\n properties: {\n locale: { type: 'string', default: 'zh-CN' },\n fallbackLocale: { type: 'string', default: 'en-US' },\n messages: { type: 'object', default: {} },\n warnHtmlMessage: { type: 'boolean', default: true },\n },\n },\n },\n install(app, options) {\n const i18n = createI18n(options as I18nOptions);\n\n app.config.globalProperties.$i18n = i18n;\n app.config.globalProperties.$t = i18n.t;\n\n app.provide('lyt-i18n', i18n);\n },\n});\n\nexport default pluginI18n;\nexport type { I18nOptions, I18nInstance, Locale, LocaleMessages, TranslateFn };\nexport { createI18n, registerLocale };\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -87,7 +87,7 @@ function createI18n(options = {}) {
|
|
|
87
87
|
...localeMessages[locale],
|
|
88
88
|
...deepClone(messages2)
|
|
89
89
|
};
|
|
90
|
-
console.
|
|
90
|
+
console.warn(`[i18n] Locale "${locale}" registered successfully`);
|
|
91
91
|
}
|
|
92
92
|
function getMessages() {
|
|
93
93
|
return deepClone(localeMessages);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["registerLocale","messages"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * @lytjs/plugin-i18n\r\n *\r\n * LytJS official i18n plugin for internationalization and localization support.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport { signal } from '@lytjs/reactivity';\r\nimport { isString, isObject } from '@lytjs/common-is';\r\nimport type { I18nOptions, I18nInstance, Locale, LocaleMessages, TranslateFn } from './types';\r\n\r\n/**\r\n * 深度克隆对象,防止直接修改\r\n */\r\nfunction deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== 'object') {\r\n return obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(deepClone) as T;\r\n }\r\n\r\n const cloned = {} as Record<string, any>;\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n cloned[key] = deepClone((obj as Record<string, any>)[key]);\r\n }\r\n }\r\n return cloned as T;\r\n}\r\n\r\n/**\r\n * 创建 i18n 实例\r\n */\r\nfunction createI18n(options: I18nOptions = {}): I18nInstance {\r\n const {\r\n locale: defaultLocale = 'zh-CN',\r\n fallbackLocale = 'en-US',\r\n messages = {},\r\n warnHtmlMessage = true,\r\n } = options;\r\n\r\n // 当前语言\r\n const currentLocale = signal(defaultLocale);\r\n\r\n // 可用语言列表(响应式)\r\n const availableLocalesState = signal<string[]>(Object.keys(messages));\r\n\r\n // 语言包存储(深度克隆以防止外部修改)\r\n const localeMessages: Locale = deepClone(messages);\r\n\r\n /**\r\n * 获取嵌套对象的值\r\n */\r\n function getNestedValue(obj: LocaleMessages, path: string): string | undefined {\r\n const keys = path.split('.');\r\n let current: any = obj;\r\n\r\n for (const key of keys) {\r\n if (!isObject(current) || !(key in current)) {\r\n return undefined;\r\n }\r\n current = current[key as keyof typeof current];\r\n }\r\n\r\n return isString(current) ? current : undefined;\r\n }\r\n\r\n /**\r\n * 替换插值\r\n */\r\n function interpolate(message: string, args: any[]): string {\r\n if (args.length === 0) return message;\r\n\r\n // 支持命名参数 {name} 和位置参数 {0}\r\n return message.replace(/\\{(\\w+)\\}/g, (match, key) => {\r\n const index = parseInt(key, 10);\r\n if (!isNaN(index)) {\r\n return args[index] !== undefined ? String(args[index]) : match;\r\n }\r\n // 命名参数(从对象中获取)\r\n if (isObject(args[0])) {\r\n return (args[0] as Record<string, any>)[key] !== undefined\r\n ? String((args[0] as Record<string, any>)[key])\r\n : match;\r\n }\r\n return match;\r\n });\r\n }\r\n\r\n /**\r\n * 翻译函数\r\n */\r\n function t(key: string, ...args: any[]): string {\r\n const locale = currentLocale();\r\n const msgs = localeMessages[locale];\r\n const fallbackMessages = localeMessages[fallbackLocale];\r\n\r\n // 尝试获取翻译\r\n let message = msgs ? getNestedValue(msgs, key) : undefined;\r\n\r\n // 回退到默认语言\r\n if (!message && fallbackMessages) {\r\n message = getNestedValue(fallbackMessages, key);\r\n }\r\n\r\n // 找不到翻译,返回 key\r\n if (!message) {\r\n if (warnHtmlMessage) {\r\n console.warn(`[i18n] Missing translation for key: \"${key}\"`);\r\n }\r\n return key;\r\n }\r\n\r\n return interpolate(message, args);\r\n }\r\n\r\n /**\r\n * 检查翻译是否存在\r\n */\r\n function te(key: string, locale?: string): boolean {\r\n const targetLocale = locale || currentLocale();\r\n const msgs = localeMessages[targetLocale];\r\n\r\n if (!msgs) return false;\r\n return getNestedValue(msgs, key) !== undefined;\r\n }\r\n\r\n /**\r\n * 设置当前语言\r\n */\r\n function setLocale(locale: string): void {\r\n currentLocale.set(locale);\r\n }\r\n\r\n /**\r\n * 注册语言包\r\n */\r\n function registerLocale(locale: string, messages: LocaleMessages): void {\r\n // 如果是新语言,添加到可用语言列表\r\n if (!localeMessages[locale]) {\r\n localeMessages[locale] = {};\r\n // 更新可用语言列表\r\n const newLocales = [...Object.keys(localeMessages)];\r\n availableLocalesState.set(newLocales);\r\n }\r\n // 合并语言包(支持部分更新,深度克隆以防止外部修改)\r\n localeMessages[locale] = {\r\n ...localeMessages[locale],\r\n ...deepClone(messages),\r\n };\r\n console.log(`[i18n] Locale \"${locale}\" registered successfully`);\r\n }\r\n\r\n /**\r\n * 获取所有语言包\r\n */\r\n function getMessages(): Locale {\r\n // 返回深度克隆以防止外部直接修改\r\n return deepClone(localeMessages);\r\n }\r\n\r\n return {\r\n locale: {\r\n get value() { return currentLocale(); },\r\n set value(v: string) { currentLocale.set(v); }\r\n },\r\n setLocale,\r\n t,\r\n te,\r\n get availableLocales() { return availableLocalesState(); },\r\n registerLocale,\r\n getMessages,\r\n };\r\n}\r\n\r\n/**\r\n * 注册语言包(独立函数版本)\r\n */\r\nfunction registerLocale(i18n: I18nInstance, locale: string, messages: LocaleMessages): void {\r\n i18n.registerLocale(locale, messages);\r\n}\r\n\r\nconst pluginI18n = definePlugin({\r\n name: 'i18n',\r\n version: '6.0.0',\r\n description: 'LytJS official i18n plugin for internationalization and localization support',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'i18n', 'internationalization', 'localization'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n locale: { type: 'string', default: 'zh-CN' },\r\n fallbackLocale: { type: 'string', default: 'en-US' },\r\n messages: { type: 'object', default: {} },\r\n warnHtmlMessage: { type: 'boolean', default: true },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const i18n = createI18n(options as I18nOptions);\r\n\r\n app.config.globalProperties.$i18n = i18n;\r\n app.config.globalProperties.$t = i18n.t;\r\n\r\n app.provide('lyt-i18n', i18n);\r\n },\r\n});\r\n\r\nexport default pluginI18n;\r\nexport type { I18nOptions, I18nInstance, Locale, LocaleMessages, TranslateFn };\r\nexport { createI18n, registerLocale };\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["registerLocale","messages"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @lytjs/plugin-i18n\n *\n * LytJS official i18n plugin for internationalization and localization support.\n *\n * @packageDocumentation\n */\n\nimport { definePlugin } from '@lytjs/core';\nimport { signal } from '@lytjs/reactivity';\nimport { isString, isObject } from '@lytjs/common-is';\nimport type { I18nOptions, I18nInstance, Locale, LocaleMessages, TranslateFn } from './types';\n\n/**\n * 深度克隆对象,防止直接修改\n */\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(deepClone) as T;\n }\n\n const cloned = {} as Record<string, unknown>;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n return cloned as T;\n}\n\n/**\n * 创建 i18n 实例\n */\nfunction createI18n(options: I18nOptions = {}): I18nInstance {\n const {\n locale: defaultLocale = 'zh-CN',\n fallbackLocale = 'en-US',\n messages = {},\n warnHtmlMessage = true,\n } = options;\n\n // 当前语言\n const currentLocale = signal(defaultLocale);\n\n // 可用语言列表(响应式)\n const availableLocalesState = signal<string[]>(Object.keys(messages));\n\n // 语言包存储(深度克隆以防止外部修改)\n const localeMessages: Locale = deepClone(messages);\n\n /**\n * 获取嵌套对象的值\n */\n function getNestedValue(obj: LocaleMessages, path: string): string | undefined {\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (!isObject(current) || !(key in current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return isString(current) ? current : undefined;\n }\n\n /**\n * 替换插值\n */\n function interpolate(message: string, args: unknown[]): string {\n if (args.length === 0) return message;\n\n // 支持命名参数 {name} 和位置参数 {0}\n return message.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const index = parseInt(key, 10);\n if (!isNaN(index)) {\n return args[index] !== undefined ? String(args[index]) : match;\n }\n // 命名参数(从对象中获取)\n if (isObject(args[0])) {\n return (args[0] as Record<string, unknown>)[key] !== undefined\n ? String((args[0] as Record<string, unknown>)[key])\n : match;\n }\n return match;\n });\n }\n\n /**\n * 翻译函数\n */\n function t(key: string, ...args: unknown[]): string {\n const locale = currentLocale();\n const msgs = localeMessages[locale];\n const fallbackMessages = localeMessages[fallbackLocale];\n\n // 尝试获取翻译\n let message = msgs ? getNestedValue(msgs, key) : undefined;\n\n // 回退到默认语言\n if (!message && fallbackMessages) {\n message = getNestedValue(fallbackMessages, key);\n }\n\n // 找不到翻译,返回 key\n if (!message) {\n if (warnHtmlMessage) {\n console.warn(`[i18n] Missing translation for key: \"${key}\"`);\n }\n return key;\n }\n\n return interpolate(message, args);\n }\n\n /**\n * 检查翻译是否存在\n */\n function te(key: string, locale?: string): boolean {\n const targetLocale = locale || currentLocale();\n const msgs = localeMessages[targetLocale];\n\n if (!msgs) return false;\n return getNestedValue(msgs, key) !== undefined;\n }\n\n /**\n * 设置当前语言\n */\n function setLocale(locale: string): void {\n currentLocale.set(locale);\n }\n\n /**\n * 注册语言包\n */\n function registerLocale(locale: string, messages: LocaleMessages): void {\n // 如果是新语言,添加到可用语言列表\n if (!localeMessages[locale]) {\n localeMessages[locale] = {};\n // 更新可用语言列表\n const newLocales = [...Object.keys(localeMessages)];\n availableLocalesState.set(newLocales);\n }\n // 合并语言包(支持部分更新,深度克隆以防止外部修改)\n localeMessages[locale] = {\n ...localeMessages[locale],\n ...deepClone(messages),\n };\n console.warn(`[i18n] Locale \"${locale}\" registered successfully`);\n }\n\n /**\n * 获取所有语言包\n */\n function getMessages(): Locale {\n // 返回深度克隆以防止外部直接修改\n return deepClone(localeMessages);\n }\n\n return {\n locale: {\n get value() {\n return currentLocale();\n },\n set value(v: string) {\n currentLocale.set(v);\n },\n },\n setLocale,\n t,\n te,\n get availableLocales() {\n return availableLocalesState();\n },\n registerLocale,\n getMessages,\n };\n}\n\n/**\n * 注册语言包(独立函数版本)\n */\nfunction registerLocale(i18n: I18nInstance, locale: string, messages: LocaleMessages): void {\n i18n.registerLocale(locale, messages);\n}\n\nconst pluginI18n = definePlugin({\n name: 'i18n',\n version: '6.0.0',\n description: 'LytJS official i18n plugin for internationalization and localization support',\n author: 'LytJS Team',\n keywords: ['lytjs', 'i18n', 'internationalization', 'localization'],\n schema: {\n type: 'object',\n object: {\n properties: {\n locale: { type: 'string', default: 'zh-CN' },\n fallbackLocale: { type: 'string', default: 'en-US' },\n messages: { type: 'object', default: {} },\n warnHtmlMessage: { type: 'boolean', default: true },\n },\n },\n },\n install(app, options) {\n const i18n = createI18n(options as I18nOptions);\n\n app.config.globalProperties.$i18n = i18n;\n app.config.globalProperties.$t = i18n.t;\n\n app.provide('lyt-i18n', i18n);\n },\n});\n\nexport default pluginI18n;\nexport type { I18nOptions, I18nInstance, Locale, LocaleMessages, TranslateFn };\nexport { createI18n, registerLocale };\n"]}
|
package/package.json
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@lytjs/plugin-i18n",
|
|
3
|
-
"version": "6.
|
|
4
|
-
"description": "LytJS Internationalization plugin",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.cjs",
|
|
7
|
-
"module": "./dist/index.mjs",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/index.mjs",
|
|
13
|
-
"require": "./dist/index.cjs"
|
|
14
|
-
},
|
|
15
|
-
"./package.json": "./package.json"
|
|
16
|
-
},
|
|
17
|
-
"files": [
|
|
18
|
-
"dist"
|
|
19
|
-
],
|
|
20
|
-
"scripts": {
|
|
21
|
-
"build": "tsup",
|
|
22
|
-
"dev": "tsup --watch",
|
|
23
|
-
"test": "vitest run",
|
|
24
|
-
"test:watch": "vitest",
|
|
25
|
-
"test:coverage": "vitest run --coverage",
|
|
26
|
-
"type-check": "tsc --noEmit",
|
|
27
|
-
"lint": "eslint \"src/**/*.ts\"",
|
|
28
|
-
"clean": "rm -rf dist"
|
|
29
|
-
},
|
|
30
|
-
"dependencies": {
|
|
31
|
-
"@lytjs/core": "
|
|
32
|
-
"@lytjs/reactivity": "
|
|
33
|
-
"@lytjs/common-is": "
|
|
34
|
-
},
|
|
35
|
-
"devDependencies": {
|
|
36
|
-
"tsup": "^8.0.0",
|
|
37
|
-
"typescript": "^5.4.0",
|
|
38
|
-
"vitest": "^3.0.0"
|
|
39
|
-
},
|
|
40
|
-
"license": "MIT",
|
|
41
|
-
"repository": {
|
|
42
|
-
"type": "git",
|
|
43
|
-
"url": "https://gitee.com/lytjs/lytjs.git",
|
|
44
|
-
"directory": "packages/plugins/packages/plugin-i18n"
|
|
45
|
-
},
|
|
46
|
-
"keywords": [
|
|
47
|
-
"lytjs",
|
|
48
|
-
"i18n",
|
|
49
|
-
"internationalization",
|
|
50
|
-
"localization"
|
|
51
|
-
]
|
|
52
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@lytjs/plugin-i18n",
|
|
3
|
+
"version": "6.6.0",
|
|
4
|
+
"description": "LytJS Internationalization plugin",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"dev": "tsup --watch",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"test:coverage": "vitest run --coverage",
|
|
26
|
+
"type-check": "tsc --noEmit",
|
|
27
|
+
"lint": "eslint \"src/**/*.ts\"",
|
|
28
|
+
"clean": "rm -rf dist"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@lytjs/core": "workspace:*",
|
|
32
|
+
"@lytjs/reactivity": "workspace:*",
|
|
33
|
+
"@lytjs/common-is": "workspace:*"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"tsup": "^8.0.0",
|
|
37
|
+
"typescript": "^5.4.0",
|
|
38
|
+
"vitest": "^3.0.0"
|
|
39
|
+
},
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://gitee.com/lytjs/lytjs.git",
|
|
44
|
+
"directory": "packages/plugins/packages/plugin-i18n"
|
|
45
|
+
},
|
|
46
|
+
"keywords": [
|
|
47
|
+
"lytjs",
|
|
48
|
+
"i18n",
|
|
49
|
+
"internationalization",
|
|
50
|
+
"localization"
|
|
51
|
+
]
|
|
52
|
+
}
|
package/dist/index.d.cts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import * as _lytjs_core from '@lytjs/core';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @lytjs/plugin-i18n - 类型定义
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* 语言消息定义
|
|
8
|
-
*/
|
|
9
|
-
type LocaleMessages = Record<string, string | Record<string, any>>;
|
|
10
|
-
/**
|
|
11
|
-
* 语言包
|
|
12
|
-
*/
|
|
13
|
-
interface Locale {
|
|
14
|
-
[locale: string]: LocaleMessages;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* i18n 配置选项
|
|
18
|
-
*/
|
|
19
|
-
interface I18nOptions {
|
|
20
|
-
/** 默认语言 */
|
|
21
|
-
locale?: string;
|
|
22
|
-
/** 回退语言 */
|
|
23
|
-
fallbackLocale?: string;
|
|
24
|
-
/** 语言包 */
|
|
25
|
-
messages?: Locale;
|
|
26
|
-
/** 是否在控制台警告缺失的翻译 */
|
|
27
|
-
warnHtmlMessage?: boolean;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 翻译函数
|
|
31
|
-
*/
|
|
32
|
-
type TranslateFn = (key: string, ...args: any[]) => string;
|
|
33
|
-
/**
|
|
34
|
-
* i18n 实例
|
|
35
|
-
*/
|
|
36
|
-
interface I18nInstance {
|
|
37
|
-
/** 当前语言 */
|
|
38
|
-
locale: {
|
|
39
|
-
value: string;
|
|
40
|
-
};
|
|
41
|
-
/** 设置语言 */
|
|
42
|
-
setLocale(locale: string): void;
|
|
43
|
-
/** 获取翻译 */
|
|
44
|
-
t: TranslateFn;
|
|
45
|
-
/** 是否存在翻译 */
|
|
46
|
-
te(key: string, locale?: string): boolean;
|
|
47
|
-
/** 获取语言列表 */
|
|
48
|
-
availableLocales: string[];
|
|
49
|
-
/** 注册语言包 */
|
|
50
|
-
registerLocale(locale: string, messages: LocaleMessages): void;
|
|
51
|
-
/** 获取所有语言包 */
|
|
52
|
-
getMessages(): Locale;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 创建 i18n 实例
|
|
57
|
-
*/
|
|
58
|
-
declare function createI18n(options?: I18nOptions): I18nInstance;
|
|
59
|
-
/**
|
|
60
|
-
* 注册语言包(独立函数版本)
|
|
61
|
-
*/
|
|
62
|
-
declare function registerLocale(i18n: I18nInstance, locale: string, messages: LocaleMessages): void;
|
|
63
|
-
declare const pluginI18n: _lytjs_core.PluginDefinition<unknown>;
|
|
64
|
-
|
|
65
|
-
export { type I18nInstance, type I18nOptions, type Locale, type LocaleMessages, type TranslateFn, createI18n, pluginI18n as default, registerLocale };
|
package/dist/index.d.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import * as _lytjs_core from '@lytjs/core';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @lytjs/plugin-i18n - 类型定义
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* 语言消息定义
|
|
8
|
-
*/
|
|
9
|
-
type LocaleMessages = Record<string, string | Record<string, any>>;
|
|
10
|
-
/**
|
|
11
|
-
* 语言包
|
|
12
|
-
*/
|
|
13
|
-
interface Locale {
|
|
14
|
-
[locale: string]: LocaleMessages;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* i18n 配置选项
|
|
18
|
-
*/
|
|
19
|
-
interface I18nOptions {
|
|
20
|
-
/** 默认语言 */
|
|
21
|
-
locale?: string;
|
|
22
|
-
/** 回退语言 */
|
|
23
|
-
fallbackLocale?: string;
|
|
24
|
-
/** 语言包 */
|
|
25
|
-
messages?: Locale;
|
|
26
|
-
/** 是否在控制台警告缺失的翻译 */
|
|
27
|
-
warnHtmlMessage?: boolean;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* 翻译函数
|
|
31
|
-
*/
|
|
32
|
-
type TranslateFn = (key: string, ...args: any[]) => string;
|
|
33
|
-
/**
|
|
34
|
-
* i18n 实例
|
|
35
|
-
*/
|
|
36
|
-
interface I18nInstance {
|
|
37
|
-
/** 当前语言 */
|
|
38
|
-
locale: {
|
|
39
|
-
value: string;
|
|
40
|
-
};
|
|
41
|
-
/** 设置语言 */
|
|
42
|
-
setLocale(locale: string): void;
|
|
43
|
-
/** 获取翻译 */
|
|
44
|
-
t: TranslateFn;
|
|
45
|
-
/** 是否存在翻译 */
|
|
46
|
-
te(key: string, locale?: string): boolean;
|
|
47
|
-
/** 获取语言列表 */
|
|
48
|
-
availableLocales: string[];
|
|
49
|
-
/** 注册语言包 */
|
|
50
|
-
registerLocale(locale: string, messages: LocaleMessages): void;
|
|
51
|
-
/** 获取所有语言包 */
|
|
52
|
-
getMessages(): Locale;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 创建 i18n 实例
|
|
57
|
-
*/
|
|
58
|
-
declare function createI18n(options?: I18nOptions): I18nInstance;
|
|
59
|
-
/**
|
|
60
|
-
* 注册语言包(独立函数版本)
|
|
61
|
-
*/
|
|
62
|
-
declare function registerLocale(i18n: I18nInstance, locale: string, messages: LocaleMessages): void;
|
|
63
|
-
declare const pluginI18n: _lytjs_core.PluginDefinition<unknown>;
|
|
64
|
-
|
|
65
|
-
export { type I18nInstance, type I18nOptions, type Locale, type LocaleMessages, type TranslateFn, createI18n, pluginI18n as default, registerLocale };
|