Skip to content

Commit 003f94e

Browse files
committed
feat: add next-internalional plugin but not finished yet
1 parent d9aab46 commit 003f94e

File tree

26 files changed

+1797
-87
lines changed

26 files changed

+1797
-87
lines changed

package-lock.json

Lines changed: 878 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/plugin-i18next-vue/test/test-suites/localization.ts

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ const testLocalization = (engine: TestEngineBase<'vitest-browser'>) => {
8686
.expect(weekLabels)
8787
.toEqual(Array.from(weekEnum.items.map((item) => AltLocales[`alternative:${item.raw.label}`])));
8888
const sunday = weekEnum.items[0];
89-
engine.expect(text(() => sunday.label)).toBe(AltLocales['alternative:weekday.sunday']);
90-
engine.expect(text(() => sunday.toString())).toBe(AltLocales['alternative:weekday.sunday']);
91-
engine.expect(text(() => sunday.toLocaleString())).toBe(AltLocales['alternative:weekday.sunday']);
89+
engine.expect(text(() => sunday.label)).toBe(AltLocales['alternative:weekday.Sunday']);
90+
engine.expect(text(() => sunday.toString())).toBe(AltLocales['alternative:weekday.Sunday']);
91+
engine.expect(text(() => sunday.toLocaleString())).toBe(AltLocales['alternative:weekday.Sunday']);
9292
}
9393
);
9494
engine.test(
@@ -118,9 +118,9 @@ const testLocalization = (engine: TestEngineBase<'vitest-browser'>) => {
118118
.expect(text(() => weekEnum.labels.join(',')).split(','))
119119
.toEqual(Array.from(weekEnum.items).map((item) => AltLocales[`alternative:foo.${item.raw.label}`]));
120120
const sunday = weekEnum.items[0];
121-
engine.expect(text(() => sunday.label)).toBe(AltLocales['alternative:foo.weekday.sunday']);
122-
engine.expect(text(() => sunday.toString())).toBe(AltLocales['alternative:foo.weekday.sunday']);
123-
engine.expect(text(() => sunday.toLocaleString())).toBe(AltLocales['alternative:foo.weekday.sunday']);
121+
engine.expect(text(() => sunday.label)).toBe(AltLocales['alternative:foo.weekday.Sunday']);
122+
engine.expect(text(() => sunday.toString())).toBe(AltLocales['alternative:foo.weekday.Sunday']);
123+
engine.expect(text(() => sunday.toLocaleString())).toBe(AltLocales['alternative:foo.weekday.Sunday']);
124124
}
125125
);
126126

@@ -153,9 +153,9 @@ const testLocalization = (engine: TestEngineBase<'vitest-browser'>) => {
153153
.expect(text(() => weekEnum.labels.join(',')).split(','))
154154
.toEqual(Array.from(weekEnum.items).map((item) => AltLocales[`alternative:${item.raw.label}`]));
155155
const sunday = weekEnum.items[0];
156-
engine.expect(text(() => sunday.label)).toBe(AltLocales['alternative:weekday.sunday']);
157-
engine.expect(text(() => sunday.toString())).toBe(AltLocales['alternative:weekday.sunday']);
158-
engine.expect(text(() => sunday.toLocaleString())).toBe(AltLocales['alternative:weekday.sunday']);
156+
engine.expect(text(() => sunday.label)).toBe(AltLocales['alternative:weekday.Sunday']);
157+
engine.expect(text(() => sunday.toString())).toBe(AltLocales['alternative:weekday.Sunday']);
158+
engine.expect(text(() => sunday.toLocaleString())).toBe(AltLocales['alternative:weekday.Sunday']);
159159
}
160160
);
161161

@@ -184,9 +184,9 @@ const testLocalization = (engine: TestEngineBase<'vitest-browser'>) => {
184184
.expect(text(() => weekEnum.labels.join(',')).split(','))
185185
.toEqual(Array.from(weekEnum.items).map((item) => `${item.raw.label}(overridden)`));
186186
const sunday = weekEnum.items[0];
187-
engine.expect(text(() => sunday.label)).toBe(`weekday.sunday(overridden)`);
188-
engine.expect(text(() => sunday.toString())).toBe(`weekday.sunday(overridden)`);
189-
engine.expect(text(() => sunday.toLocaleString())).toBe(`weekday.sunday(overridden)`);
187+
engine.expect(text(() => sunday.label)).toBe(`weekday.Sunday(overridden)`);
188+
engine.expect(text(() => sunday.toString())).toBe(`weekday.Sunday(overridden)`);
189+
engine.expect(text(() => sunday.toLocaleString())).toBe(`weekday.Sunday(overridden)`);
190190
}
191191
);
192192

@@ -210,9 +210,9 @@ const testLocalization = (engine: TestEngineBase<'vitest-browser'>) => {
210210
engine.expect(weekEnum.name).toBe(Locales['weekDay.name']);
211211
engine.expect(weekEnum.labels).toEqual(Array.from(weekEnum.items).map((item) => Locales[item.raw.label]));
212212
const sunday = weekEnum.items[0];
213-
engine.expect(sunday.label).toBe(Locales['weekday.sunday']);
214-
engine.expect(sunday.toString()).toBe(Locales['weekday.sunday']);
215-
engine.expect(sunday.toLocaleString()).toBe(Locales['weekday.sunday']);
213+
engine.expect(sunday.label).toBe(Locales['weekday.Sunday']);
214+
engine.expect(sunday.toString()).toBe(Locales['weekday.Sunday']);
215+
engine.expect(sunday.toLocaleString()).toBe(Locales['weekday.Sunday']);
216216
}
217217
);
218218

@@ -248,9 +248,9 @@ const testLocalization = (engine: TestEngineBase<'vitest-browser'>) => {
248248
.expect(weekEnum.labels)
249249
.toEqual(Array.from(weekEnum.items).map((item) => AltLocales[`alternative:foo.${item.raw.label}`]));
250250
const sunday = weekEnum.items[0];
251-
engine.expect(sunday.label).toBe(AltLocales['alternative:foo.weekday.sunday']);
252-
engine.expect(sunday.toString()).toBe(AltLocales['alternative:foo.weekday.sunday']);
253-
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:foo.weekday.sunday']);
251+
engine.expect(sunday.label).toBe(AltLocales['alternative:foo.weekday.Sunday']);
252+
engine.expect(sunday.toString()).toBe(AltLocales['alternative:foo.weekday.Sunday']);
253+
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:foo.weekday.Sunday']);
254254
}
255255
);
256256

@@ -286,9 +286,9 @@ const testLocalization = (engine: TestEngineBase<'vitest-browser'>) => {
286286
.expect(weekEnum.labels)
287287
.toEqual(Array.from(weekEnum.items).map((item) => AltLocales[`alternative:foo.${item.raw.label}`]));
288288
const sunday = weekEnum.items[0];
289-
engine.expect(sunday.label).toBe(AltLocales['alternative:foo.weekday.sunday']);
290-
engine.expect(sunday.toString()).toBe(AltLocales['alternative:foo.weekday.sunday']);
291-
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:foo.weekday.sunday']);
289+
engine.expect(sunday.label).toBe(AltLocales['alternative:foo.weekday.Sunday']);
290+
engine.expect(sunday.toString()).toBe(AltLocales['alternative:foo.weekday.Sunday']);
291+
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:foo.weekday.Sunday']);
292292
}
293293
);
294294
});
@@ -384,18 +384,18 @@ const testLocalization = (engine: TestEngineBase<'vitest-browser'>) => {
384384
engine.expect(weekName).toEqual(Locales['weekDay.name']);
385385
engine.expect(weekLabels).toEqual(Array.from(weekEnum.items).map((item) => Locales[item.raw.label]));
386386

387-
engine.expect(sundayLabel).toBe(Locales['weekday.sunday']);
388-
engine.expect(sundayToString).toBe(Locales['weekday.sunday']);
389-
engine.expect(sundayToLocaleString).toBe(Locales['weekday.sunday']);
387+
engine.expect(sundayLabel).toBe(Locales['weekday.Sunday']);
388+
engine.expect(sundayToString).toBe(Locales['weekday.Sunday']);
389+
engine.expect(sundayToLocaleString).toBe(Locales['weekday.Sunday']);
390390

391391
engine.expect(altWeekName).toEqual(AltLocales['alternative:weekDay.name']);
392392
engine
393393
.expect(altWeekLabels)
394394
.toEqual(Array.from(altWeekEnum.items).map((item) => AltLocales[item.raw.label as keyof typeof AltLocales]));
395395

396-
engine.expect(altSundayLabel).toBe(AltLocales['alternative:weekday.sunday']);
397-
engine.expect(altSundayToString).toBe(AltLocales['alternative:weekday.sunday']);
398-
engine.expect(altSundayToLocaleString).toBe(AltLocales['alternative:weekday.sunday']);
396+
engine.expect(altSundayLabel).toBe(AltLocales['alternative:weekday.Sunday']);
397+
engine.expect(altSundayToString).toBe(AltLocales['alternative:weekday.Sunday']);
398+
engine.expect(altSundayToLocaleString).toBe(AltLocales['alternative:weekday.Sunday']);
399399
}
400400
};
401401

packages/plugin-i18next/test/test-suites/localization.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ const testLocalization = (engine: TestEngineBase<'jest'>) => {
8282
.expect(Array.from(weekEnum.labels))
8383
.toEqual(Array.from(weekEnum.items).map((item) => AltLocales[`alternative:${item.raw.label}`]));
8484
const sunday = weekEnum.items[0];
85-
engine.expect(sunday.label).toBe(AltLocales['alternative:weekday.sunday']);
86-
engine.expect(sunday.toString()).toBe(AltLocales['alternative:weekday.sunday']);
87-
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:weekday.sunday']);
85+
engine.expect(sunday.label).toBe(AltLocales['alternative:weekday.Sunday']);
86+
engine.expect(sunday.toString()).toBe(AltLocales['alternative:weekday.Sunday']);
87+
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:weekday.Sunday']);
8888
}
8989
);
9090
engine.test(
@@ -131,9 +131,9 @@ const testLocalization = (engine: TestEngineBase<'jest'>) => {
131131
.expect(Array.from(weekEnum.labels))
132132
.toEqual(Array.from(weekEnum.items).map((item) => AltLocales[`alternative:${item.raw.label}`]));
133133
const sunday = weekEnum.items[0];
134-
engine.expect(sunday.label).toBe(AltLocales['alternative:weekday.sunday']);
135-
engine.expect(sunday.toString()).toBe(AltLocales['alternative:weekday.sunday']);
136-
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:weekday.sunday']);
134+
engine.expect(sunday.label).toBe(AltLocales['alternative:weekday.Sunday']);
135+
engine.expect(sunday.toString()).toBe(AltLocales['alternative:weekday.Sunday']);
136+
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:weekday.Sunday']);
137137
}
138138
);
139139

@@ -166,9 +166,9 @@ const testLocalization = (engine: TestEngineBase<'jest'>) => {
166166
.expect(Array.from(weekEnum.labels))
167167
.toEqual(Array.from(weekEnum.items).map((item) => AltLocales[`alternative:${item.raw.label}`]));
168168
const sunday = weekEnum.items[0];
169-
engine.expect(sunday.label).toBe(AltLocales['alternative:weekday.sunday']);
170-
engine.expect(sunday.toString()).toBe(AltLocales['alternative:weekday.sunday']);
171-
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:weekday.sunday']);
169+
engine.expect(sunday.label).toBe(AltLocales['alternative:weekday.Sunday']);
170+
engine.expect(sunday.toString()).toBe(AltLocales['alternative:weekday.Sunday']);
171+
engine.expect(sunday.toLocaleString()).toBe(AltLocales['alternative:weekday.Sunday']);
172172
}
173173
);
174174

@@ -197,9 +197,9 @@ const testLocalization = (engine: TestEngineBase<'jest'>) => {
197197
.expect(Array.from(weekEnum.labels))
198198
.toEqual(Array.from(weekEnum.items).map((item) => `${item.raw.label}(overridden)`));
199199
const sunday = weekEnum.items[0];
200-
engine.expect(sunday.label).toBe(`weekday.sunday(overridden)`);
201-
engine.expect(sunday.toString()).toBe(`weekday.sunday(overridden)`);
202-
engine.expect(sunday.toLocaleString()).toBe(`weekday.sunday(overridden)`);
200+
engine.expect(sunday.label).toBe(`weekday.Sunday(overridden)`);
201+
engine.expect(sunday.toString()).toBe(`weekday.Sunday(overridden)`);
202+
engine.expect(sunday.toLocaleString()).toBe(`weekday.Sunday(overridden)`);
203203
}
204204
);
205205
});
@@ -246,19 +246,19 @@ const testLocalization = (engine: TestEngineBase<'jest'>) => {
246246
engine.expect(weekEnum.labels).toEqual(Array.from(weekEnum.items).map((item) => Locales[item.raw.label]));
247247

248248
const sunday = weekEnum.items[0];
249-
engine.expect(sunday.label).toBe(Locales['weekday.sunday']);
250-
engine.expect(sunday.toString()).toBe(Locales['weekday.sunday']);
251-
engine.expect(sunday.toLocaleString()).toBe(Locales['weekday.sunday']);
249+
engine.expect(sunday.label).toBe(Locales['weekday.Sunday']);
250+
engine.expect(sunday.toString()).toBe(Locales['weekday.Sunday']);
251+
engine.expect(sunday.toLocaleString()).toBe(Locales['weekday.Sunday']);
252252

253253
engine.expect(altWeekEnum.name).toEqual(AltLocales['alternative:weekDay.name']);
254254
engine
255255
.expect(Array.from(altWeekEnum.labels))
256256
.toEqual(Array.from(altWeekEnum.items).map((item) => AltLocales[item.raw.label as keyof typeof AltLocales]));
257257

258258
const altSunday = altWeekEnum.items[0];
259-
engine.expect(altSunday.label).toBe(AltLocales['alternative:weekday.sunday']);
260-
engine.expect(altSunday.toString()).toBe(AltLocales['alternative:weekday.sunday']);
261-
engine.expect(altSunday.toLocaleString()).toBe(AltLocales['alternative:weekday.sunday']);
259+
engine.expect(altSunday.label).toBe(AltLocales['alternative:weekday.Sunday']);
260+
engine.expect(altSunday.toString()).toBe(AltLocales['alternative:weekday.Sunday']);
261+
engine.expect(altSunday.toLocaleString()).toBe(AltLocales['alternative:weekday.Sunday']);
262262
}
263263
};
264264

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { defineConfig } from 'father';
2+
3+
const legacy = process.env.LEGACY === '1';
4+
export default defineConfig({
5+
esm: { input: 'src', output: legacy ? 'es-legacy' : 'es', transformer: 'babel' },
6+
sourcemap: true,
7+
targets: legacy ? /* ES2015 */ { ie: 11 } : /* ES2020 */ { chrome: 80 },
8+
});
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<!-- markdownlint-disable MD009 MD024 -->
2+
3+
# Changelog
4+
5+
## 1.0.0
6+
7+
2025-10-5
8+
9+
Initial release of `@enum-plus/plugin-i18next`.
10+
11+
### ✨ Features
12+
13+
- Seamless integration of `enum-plus` with `i18next`.
14+
- Global `localize` options:
15+
- `instance`: custom `i18next` instance (defaults to global).
16+
- `tOptions`: static object passed to `i18next.t`.
17+
- Functional `tOptions(key)` returning:
18+
- A dynamic options object, or
19+
- A final translated string (short‑circuit translation).
20+
- Supports enum item `label` fields as i18next keys (e.g. `week.monday`).
21+
- Supports enum type `name` localization key.
22+
23+
### Not Included
24+
25+
- Automatic UI repaint after language change.
26+
27+
> Please consider framework plugins like [@enum-plus/plugin-react](https://www.npmjs.com/package/@enum-plus/plugin-react) / [@enum-plus/plugin-i18next-vue](https://www.npmjs.com/package/@enum-plus/plugin-i18next-vue).
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<!-- markdownlint-disable MD001 MD009 MD033 MD041 -->
2+
3+
[English](./README.md) | [中文](./README.zh-CN.md) | [CHANGELOG](./CHANGELOG.md)
4+
5+
# @enum-plus/plugin-i18next
6+
7+
[![npm version](https://img.shields.io/npm/v/@enum-plus/plugin-i18next.svg)](https://www.npmjs.com/package/@enum-plus/plugin-i18next)
8+
[![license](https://img.shields.io/npm/l/@enum-plus/plugin-i18next.svg)](https://www.npmjs.com/package/@enum-plus/plugin-i18next)
9+
10+
> Integrates with [i18next](https://www.i18next.com) to enable internationalization of enum labels.
11+
12+
## Introduction
13+
14+
`@enum-plus/plugin-i18next` is a plugin for [enum-plus](https://github.com/shijistar/enum-plus) that automatically integrates with [i18next](https://www.i18next.com/) to achieve internationalization of enum labels. It allows you to use i18next localization keys in your enum definitions, which are dynamically displayed as translated text for the current language.
15+
16+
> This plugin does not support automatic UI updates after switching languages, which requires integration with front-end frameworks (such as React, Vue, etc.). Please consider using the [@enum-plus/plugin-react](https://github.com/shijistar/enum-plus/tree/main/packages/plugin-react) or [@enum-plus/plugin-i18next-vue](https://github.com/shijistar/enum-plus/tree/main/packages/plugin-i18next-vue) plugins.
17+
18+
## Installation
19+
20+
```bash
21+
npm install @enum-plus/plugin-i18next
22+
```
23+
24+
Import the `@enum-plus/plugin-i18next` plugin and install it in the entry file of your application:
25+
26+
```js
27+
import i18nPlugin from '@enum-plus/plugin-i18next';
28+
import { Enum } from 'enum-plus';
29+
30+
Enum.install(i18nPlugin);
31+
```
32+
33+
## Plugin Options
34+
35+
When installing the plugin, you can pass a configuration object to set global options for the plugin:
36+
37+
```ts
38+
Enum.install(i18nextPlugin, {
39+
localize: {
40+
// Set the i18next instance, defaults to the global i18next instance if necessary
41+
instance: i18next,
42+
// Options to pass to the i18next.t method
43+
tOptions: {
44+
// Set the namespace
45+
ns: 'my-namespace',
46+
// Set the default value for the return value
47+
defaultValue: '-',
48+
// Other options supported by the i18next.t method
49+
// Please refer to https://www.i18next.com/translation-function/essentials#overview-options
50+
},
51+
},
52+
});
53+
```
54+
55+
`tOptions` also supports a function form to dynamically generate options, and can even directly return the final translated text.
56+
57+
```ts
58+
// Use function form to dynamically generate tOptions
59+
Enum.install(i18nextPlugin, {
60+
localize: {
61+
tOptions: (key) => {
62+
if (key === 'week.sunday') {
63+
return { ns: 'my-namespace' };
64+
}
65+
return { ns: 'translation' }; // Default namespace
66+
},
67+
},
68+
});
69+
```
70+
71+
You can even return a string directly in `tOptions` as the final translated text to have full control over the behavior of the `localize` method.
72+
73+
```ts
74+
Enum.install(i18nextPlugin, {
75+
localize: {
76+
tOptions: (key) => {
77+
if (key === 'week.sunday') {
78+
return 'Sunday'; // Directly return the translated text
79+
}
80+
return instance.t(key); // Return the default translation in other cases
81+
},
82+
},
83+
});
84+
```
85+
86+
## Basic Usage
87+
88+
You can achieve internationalization of enum labels by using localization keys in the enum definition.
89+
90+
```js
91+
import { Enum } from 'enum-plus';
92+
93+
const WeekEnum = Enum(
94+
{
95+
Monday: { value: 1, label: 'week.monday' },
96+
Tuesday: { value: 2, label: 'week.tuesday' },
97+
},
98+
{
99+
name: 'weekDays.name', // Optional enum type name
100+
}
101+
);
102+
WeekEnum.label(1); // Monday
103+
WeekEnum.name; // Week
104+
105+
i18next.changeLanguage('zh-CN');
106+
WeekEnum.label(1); // 星期一
107+
WeekEnum.name; //
108+
```

0 commit comments

Comments
 (0)