@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 +145 -0
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/types/index.d.ts +6 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
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};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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:
|
|
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,
|
|
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"}
|