@lytjs/plugin-i18n 4.2.0 → 5.0.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/README.md ADDED
@@ -0,0 +1,145 @@
1
+ # @lytjs/plugin-i18n
2
+
3
+ > Lyt.js 国际化插件 - 提供多语言支持、消息格式化和语言切换功能
4
+
5
+ **版本:** 4.2.0
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ npm install @lytjs/plugin-i18n
11
+ ```
12
+
13
+ ## 使用
14
+
15
+ ### 注册插件
16
+
17
+ ```typescript
18
+ import { createApp } from '@lytjs/core'
19
+ import { createI18n } from '@lytjs/plugin-i18n'
20
+
21
+ const i18n = createI18n({
22
+ locale: 'zh-CN',
23
+ fallbackLocale: 'en',
24
+ messages: {
25
+ 'zh-CN': {
26
+ hello: '你好',
27
+ welcome: '欢迎',
28
+ user: { profile: { name: '张三' } },
29
+ },
30
+ en: {
31
+ hello: 'Hello',
32
+ welcome: 'Welcome',
33
+ user: { profile: { name: 'John' } },
34
+ },
35
+ },
36
+ })
37
+
38
+ const app = createApp({})
39
+ app.use(i18n)
40
+ ```
41
+
42
+ ### 在模板中使用
43
+
44
+ 安装插件后,会注入全局 `$t` 方法,可在模板中直接使用:
45
+
46
+ ```html
47
+ <template>
48
+ <p>{{ $t('hello') }}</p>
49
+ <p>{{ $t('user.profile.name') }}</p>
50
+ </template>
51
+ ```
52
+
53
+ ### 在 JS 中使用
54
+
55
+ ```typescript
56
+ // 通过注入获取
57
+ const i18n = inject('i18n')
58
+
59
+ // 翻译
60
+ i18n.t('hello') // '你好'
61
+
62
+ // 带参数插值
63
+ i18n.t('greeting', { name: 'World' }) // 'Hello, World!'
64
+
65
+ // 带默认值
66
+ i18n.t('missing.key', {}, '默认文本') // '默认文本'
67
+
68
+ // 切换语言
69
+ i18n.setLocale('en')
70
+
71
+ // 获取当前语言
72
+ i18n.getLocale() // 'en'
73
+
74
+ // 可用语言列表
75
+ i18n.availableLocales // ['zh-CN', 'en']
76
+ ```
77
+
78
+ ### 复数形式
79
+
80
+ ```typescript
81
+ // 定义复数消息(使用 | 分隔符)
82
+ const messages = {
83
+ 'zh-CN': {
84
+ apple: '没有苹果 | 1 个苹果 | {count} 个苹果',
85
+ },
86
+ }
87
+
88
+ i18n.t('apple', { count: 0 }) // '没有苹果'
89
+ i18n.t('apple', { count: 1 }) // '1 个苹果'
90
+ i18n.t('apple', { count: 5 }) // '5 个苹果'
91
+ ```
92
+
93
+ ### 运行时加载语言包
94
+
95
+ ```typescript
96
+ // 浅合并新翻译
97
+ i18n.mergeMessage('zh-CN', { newKey: '新翻译' })
98
+
99
+ // 懒加载替换整个语言包
100
+ i18n.loadLocaleMessages('ja', {
101
+ hello: 'こんにちは',
102
+ welcome: 'ようこそ',
103
+ })
104
+ ```
105
+
106
+ ### 监听语言变化
107
+
108
+ ```typescript
109
+ const unsubscribe = i18n.onLocaleChange((locale) => {
110
+ console.log('语言已切换为:', locale)
111
+ })
112
+
113
+ // 取消监听
114
+ unsubscribe()
115
+ ```
116
+
117
+ ## API
118
+
119
+ ### Options
120
+
121
+ | 选项 | 类型 | 默认值 | 描述 |
122
+ |------|------|--------|------|
123
+ | `locale` | `string` | **必填** | 当前语言 |
124
+ | `fallbackLocale` | `string` | - | 回退语言,当前语言找不到翻译时使用 |
125
+ | `messages` | `Record<string, Record<string, string>>` | **必填** | 语言包映射表 |
126
+ | `datetimeFormats` | `Record<string, any>` | - | 日期格式配置(预留) |
127
+ | `numberFormats` | `Record<string, any>` | - | 数字格式配置(预留) |
128
+ | `legacy` | `boolean` | - | 兼容模式(预留) |
129
+
130
+ ### global 方法
131
+
132
+ | 方法 | 签名 | 描述 |
133
+ |------|------|------|
134
+ | `t` | `(key: string, params?: Record<string, any>, defaultValue?: string) => string` | 翻译函数,支持路径式 key、参数插值、回退语言、默认值、复数形式 |
135
+ | `setLocale` | `(locale: string) => void` | 切换语言 |
136
+ | `getLocale` | `() => string` | 获取当前语言 |
137
+ | `availableLocales` | `string[]` | 可用语言列表 |
138
+ | `mergeMessage` | `(locale: string, messages: Record<string, string>) => void` | 运行时合并新翻译(浅合并) |
139
+ | `mergeLocaleMessages` | `(locale: string, messages: Record<string, string>) => void` | 运行时合并翻译(已废弃,请使用 `mergeMessage`) |
140
+ | `loadLocaleMessages` | `(locale: string, messages: Record<string, string>) => void` | 懒加载翻译包(替换指定语言的全部翻译) |
141
+ | `onLocaleChange` | `(callback: (locale: string) => void) => () => void` | 注册语言变更监听器,返回取消监听函数 |
142
+
143
+ ## License
144
+
145
+ MIT
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var u=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var j=Object.prototype.hasOwnProperty;var x=(r,i)=>{for(var o in i)u(r,o,{get:i[o],enumerable:!0})},C=(r,i,o,e)=>{if(i&&typeof i=="object"||typeof i=="function")for(let t of P(i))!j.call(r,t)&&t!==o&&u(r,t,{get:()=>i[t],enumerable:!(e=M(i,t))||e.enumerable});return r};var A=r=>C(u({},"__esModule",{value:!0}),r);var z={};x(z,{createI18n:()=>$});module.exports=A(z);function m(r,i){let o=i.split("."),e=r;for(let t of o){if(e==null||typeof e!="object")return;e=e[t]}return typeof e=="string"?e:void 0}function y(r,i){return r.replace(/\{(\w+)\}/g,(o,e)=>i[e]!==void 0?String(i[e]):o)}function F(r,i,o){if(!r.includes("|"))return y(r,o);let e=r.split("|").map(g=>g.trim()),t;return i===0&&e.length>0?t=(e.length>=3,e[0]):i===1?t=e.length>=2?e[1]:e[0]:t=e.length>=3?e[2]:e.length>=2?e[1]:e[0],y(t,{...o,count:i})}function $(r){let{locale:i,fallbackLocale:o,messages:e}=r,t={};for(let n of Object.keys(e))t[n]={...e[n]};let g=i,f=[];function L(n){return f.push(n),()=>{let s=f.indexOf(n);s>-1&&f.splice(s,1)}}function R(n){for(let s of f)s(n)}function v(n,s,c){let a=s||{},l=m(t[g]||{},n);if(l===void 0&&o&&(l=m(t[o]||{},n)),l===void 0)if(c!==void 0)l=c;else return n;return a.count!==void 0&&typeof a.count=="number"?F(l,a.count,a):y(l,a)}function p(n){n!==g&&(g=n,R(n))}function h(){return g}function I(){return Object.keys(t)}function b(n,s){t[n]||(t[n]={});for(let c of Object.keys(s))t[n][c]=s[c]}function O(n,s){b(n,s)}function k(n,s){t[n]={...s}}let d={install(n,s){n.config=n.config||{},n.config.globalProperties=n.config.globalProperties||{},n.config.globalProperties.$t=v,n.config.globalProperties.$i18n=d.global,typeof n.provide=="function"&&n.provide("i18n",d.global)},global:{t:v,get locale(){return g},setLocale:p,getLocale:h,get availableLocales(){return I()},mergeMessage:b,mergeLocaleMessages:O,loadLocaleMessages:k,onLocaleChange:L}};return d}
1
+ "use strict";var u=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var j=Object.prototype.hasOwnProperty;var x=(r,i)=>{for(var o in i)u(r,o,{get:i[o],enumerable:!0})},A=(r,i,o,e)=>{if(i&&typeof i=="object"||typeof i=="function")for(let t of M(i))!j.call(r,t)&&t!==o&&u(r,t,{get:()=>i[t],enumerable:!(e=P(i,t))||e.enumerable});return r};var w=r=>A(u({},"__esModule",{value:!0}),r);var $={};x($,{createI18n:()=>F});module.exports=w($);function p(r,i){let o=i.split("."),e=r;for(let t of o){if(e==null||typeof e!="object")return;e=e[t]}return typeof e=="string"?e:void 0}function v(r,i){return r.replace(/\{(\w+)\}/g,(o,e)=>i[e]!==void 0?String(i[e]):o)}function C(r,i,o){if(!r.includes("|"))return v(r,o);let e=r.split("|").map(g=>g.trim()),t;return i===0&&e.length>0?t=(e.length>=3,e[0]):i===1?t=e.length>=2?e[1]:e[0]:t=e.length>=3?e[2]:e.length>=2?e[1]:e[0],v(t,{...o,count:i})}function F(r){let{locale:i,fallbackLocale:o,messages:e}=r,t={};for(let n of Object.keys(e))t[n]={...e[n]};let g=i,f=[];function m(n){return f.push(n),()=>{let s=f.indexOf(n);s>-1&&f.splice(s,1)}}function L(n){for(let s of f)s(n)}function y(n,s,c){let a=s||{},l=p(t[g]||{},n);if(l===void 0&&o&&(l=p(t[o]||{},n)),l===void 0)if(c!==void 0)l=c;else return n;return a.count!==void 0&&typeof a.count=="number"?C(l,a.count,a):v(l,a)}function R(n){n!==g&&(g=n,L(n))}function I(){return g}function h(){return Object.keys(t)}function b(n,s){t[n]||(t[n]={});for(let c of Object.keys(s))t[n][c]=s[c]}function k(n,s){b(n,s)}function O(n,s){t[n]={...s}}let d={install(n,s){n.config=n.config||{},n.config.globalProperties=n.config.globalProperties||{},n.config.globalProperties.$t=y,n.config.globalProperties.$i18n=d.global,typeof n.provide=="function"&&n.provide("i18n",d.global)},global:{t:y,get locale(){return g},setLocale:R,getLocale:I,get availableLocales(){return h()},mergeMessage:b,mergeLocaleMessages:k,loadLocaleMessages:O,onLocaleChange:m}};return d}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- function b(o,r){let s=r.split("."),e=o;for(let t of s){if(e==null||typeof e!="object")return;e=e[t]}return typeof e=="string"?e:void 0}function u(o,r){return o.replace(/\{(\w+)\}/g,(s,e)=>r[e]!==void 0?String(r[e]):s)}function k(o,r,s){if(!o.includes("|"))return u(o,s);let e=o.split("|").map(g=>g.trim()),t;return r===0&&e.length>0?t=(e.length>=3,e[0]):r===1?t=e.length>=2?e[1]:e[0]:t=e.length>=3?e[2]:e.length>=2?e[1]:e[0],u(t,{...s,count:r})}function M(o){let{locale:r,fallbackLocale:s,messages:e}=o,t={};for(let n of Object.keys(e))t[n]={...e[n]};let g=r,f=[];function m(n){return f.push(n),()=>{let i=f.indexOf(n);i>-1&&f.splice(i,1)}}function L(n){for(let i of f)i(n)}function y(n,i,c){let a=i||{},l=b(t[g]||{},n);if(l===void 0&&s&&(l=b(t[s]||{},n)),l===void 0)if(c!==void 0)l=c;else return n;return a.count!==void 0&&typeof a.count=="number"?k(l,a.count,a):u(l,a)}function R(n){n!==g&&(g=n,L(n))}function p(){return g}function h(){return Object.keys(t)}function v(n,i){t[n]||(t[n]={});for(let c of Object.keys(i))t[n][c]=i[c]}function I(n,i){v(n,i)}function O(n,i){t[n]={...i}}let d={install(n,i){n.config=n.config||{},n.config.globalProperties=n.config.globalProperties||{},n.config.globalProperties.$t=y,n.config.globalProperties.$i18n=d.global,typeof n.provide=="function"&&n.provide("i18n",d.global)},global:{t:y,get locale(){return g},setLocale:R,getLocale:p,get availableLocales(){return h()},mergeMessage:v,mergeLocaleMessages:I,loadLocaleMessages:O,onLocaleChange:m}};return d}export{M as createI18n};
1
+ function b(o,r){let s=r.split("."),e=o;for(let t of s){if(e==null||typeof e!="object")return;e=e[t]}return typeof e=="string"?e:void 0}function u(o,r){return o.replace(/\{(\w+)\}/g,(s,e)=>r[e]!==void 0?String(r[e]):s)}function O(o,r,s){if(!o.includes("|"))return u(o,s);let e=o.split("|").map(g=>g.trim()),t;return r===0&&e.length>0?t=(e.length>=3,e[0]):r===1?t=e.length>=2?e[1]:e[0]:t=e.length>=3?e[2]:e.length>=2?e[1]:e[0],u(t,{...s,count:r})}function P(o){let{locale:r,fallbackLocale:s,messages:e}=o,t={};for(let n of Object.keys(e))t[n]={...e[n]};let g=r,f=[];function p(n){return f.push(n),()=>{let i=f.indexOf(n);i>-1&&f.splice(i,1)}}function m(n){for(let i of f)i(n)}function v(n,i,c){let a=i||{},l=b(t[g]||{},n);if(l===void 0&&s&&(l=b(t[s]||{},n)),l===void 0)if(c!==void 0)l=c;else return n;return a.count!==void 0&&typeof a.count=="number"?O(l,a.count,a):u(l,a)}function L(n){n!==g&&(g=n,m(n))}function R(){return g}function I(){return Object.keys(t)}function y(n,i){t[n]||(t[n]={});for(let c of Object.keys(i))t[n][c]=i[c]}function h(n,i){y(n,i)}function k(n,i){t[n]={...i}}let d={install(n,i){n.config=n.config||{},n.config.globalProperties=n.config.globalProperties||{},n.config.globalProperties.$t=v,n.config.globalProperties.$i18n=d.global,typeof n.provide=="function"&&n.provide("i18n",d.global)},global:{t:v,get locale(){return g},setLocale:L,getLocale:R,get availableLocales(){return I()},mergeMessage:y,mergeLocaleMessages:h,loadLocaleMessages:k,onLocaleChange:p}};return d}export{P as createI18n};
@@ -13,10 +13,15 @@ interface I18nOptions {
13
13
  /** 兼容模式(预留) */
14
14
  legacy?: boolean;
15
15
  }
16
+ /** 国际化插件应用接口(最小化) */
17
+ interface I18nPluginApp {
18
+ use(plugin: unknown, options?: unknown): void;
19
+ [key: string]: unknown;
20
+ }
16
21
  /** 国际化插件实例 */
17
22
  interface I18n {
18
23
  /** 安装到 Lyt 应用 */
19
- install: (app: any, options?: any) => void;
24
+ install: (app: I18nPluginApp, options?: I18nOptions) => void;
20
25
  /** 全局国际化 API */
21
26
  global: {
22
27
  /** 翻译函数,支持路径式 key、参数插值、回退语言、默认值、复数形式 */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAkBA,cAAc;AACd,UAAU,WAAW;IACnB,WAAW;IACX,MAAM,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAChD,aAAa;IACb,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACrC,aAAa;IACb,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACnC,eAAe;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,cAAc;AACd,UAAU,IAAI;IACZ,iBAAiB;IACjB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IAC1C,gBAAgB;IAChB,MAAM,EAAE;QACN,wCAAwC;QACxC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;QAC/E,WAAW;QACX,MAAM,EAAE,MAAM,CAAA;QACd,WAAW;QACX,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;QACnC,aAAa;QACb,SAAS,EAAE,MAAM,MAAM,CAAA;QACvB,aAAa;QACb,gBAAgB,EAAE,MAAM,EAAE,CAAA;QAC1B,oBAAoB;QACpB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;QACxE,mCAAmC;QACnC,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;QAC/E,0BAA0B;QAC1B,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;QAC9E,yBAAyB;QACzB,cAAc,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;KACnE,CAAA;CACF;AAkED;;;;GAIG;AACH,iBAAS,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CA4I9C;AAED,OAAO,EAAE,UAAU,EAAE,CAAA;AACrB,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAkBA,cAAc;AACd,UAAU,WAAW;IACnB,WAAW;IACX,MAAM,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAChD,aAAa;IACb,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACrC,aAAa;IACb,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACnC,eAAe;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,qBAAqB;AACrB,UAAU,aAAa;IACrB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,cAAc;AACd,UAAU,IAAI;IACZ,iBAAiB;IACjB,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,IAAI,CAAA;IAC5D,gBAAgB;IAChB,MAAM,EAAE;QACN,wCAAwC;QACxC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;QAC/E,WAAW;QACX,MAAM,EAAE,MAAM,CAAA;QACd,WAAW;QACX,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;QACnC,aAAa;QACb,SAAS,EAAE,MAAM,MAAM,CAAA;QACvB,aAAa;QACb,gBAAgB,EAAE,MAAM,EAAE,CAAA;QAC1B,oBAAoB;QACpB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;QACxE,mCAAmC;QACnC,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;QAC/E,0BAA0B;QAC1B,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;QAC9E,yBAAyB;QACzB,cAAc,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;KACnE,CAAA;CACF;AAkED;;;;GAIG;AACH,iBAAS,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CA+I9C;AAED,OAAO,EAAE,UAAU,EAAE,CAAA;AACrB,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lytjs/plugin-i18n",
3
- "version": "4.2.0",
3
+ "version": "5.0.0",
4
4
  "description": "Lyt.js 国际化插件 - 提供多语言支持、消息格式化和语言切换功能",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",