@eggjs/i18n 4.0.0-beta.19 → 4.0.0-beta.21

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/app.d.ts CHANGED
@@ -1,7 +1,4 @@
1
- import { Application, ILifecycleBoot } from "egg";
2
-
3
- //#region src/app.d.ts
4
-
1
+ import type { ILifecycleBoot, Application } from 'egg';
5
2
  /**
6
3
  * I18n 国际化
7
4
  *
@@ -49,10 +46,8 @@ import { Application, ILifecycleBoot } from "egg";
49
46
  * }
50
47
  * ```
51
48
  */
52
- declare class I18n implements ILifecycleBoot {
53
- private readonly app;
54
- constructor(app: Application);
55
- didLoad(): Promise<void>;
49
+ export default class I18n implements ILifecycleBoot {
50
+ private readonly app;
51
+ constructor(app: Application);
52
+ didLoad(): Promise<void>;
56
53
  }
57
- //#endregion
58
- export { I18n as default };
package/dist/app.js CHANGED
@@ -1,96 +1,97 @@
1
- import { formatLocale } from "./utils.js";
1
+ import path from 'node:path';
2
+ import { debuglog } from 'node:util';
3
+ import { exists } from 'utility';
4
+ import { ms } from 'humanize-ms';
2
5
  import { loadLocaleResources } from "./locales.js";
3
- import path from "node:path";
4
- import { debuglog } from "node:util";
5
- import { exists } from "utility";
6
- import { ms } from "humanize-ms";
7
-
8
- //#region src/app.ts
9
- const debug = debuglog("egg/i18n/app");
6
+ import { formatLocale } from "./utils.js";
7
+ const debug = debuglog('egg/i18n/app');
10
8
  /**
11
- * I18n 国际化
12
- *
13
- * 通过设置 Plugin 配置 `i18n: true`,开启多语言支持。
14
- *
15
- * #### 语言文件存储路径
16
- *
17
- * 统一存放在 `config/locale/*.js` 下( 兼容`config/locales/*.js` ),如包含英文,简体中文,繁体中文的语言文件:
18
- *
19
- * ```
20
- * - config/locale/
21
- * - en-US.js
22
- * - zh-CN.js
23
- * - zh-TW.js
24
- * ```
25
- * @class I18n
26
- * @param {App} app Application object.
27
- * @example
28
- *
29
- * #### I18n 文件内容
30
- *
31
- * ```js
32
- * // config/locale/zh-CN.js
33
- * module.exports = {
34
- * "Email": "邮箱",
35
- * "Welcome back, %s!": "欢迎回来, %s!",
36
- * "Hello %s, how are you today?": "你好 %s, 今天过得咋样?",
37
- * };
38
- * ```
39
- *
40
- * ```js
41
- * // config/locale/en-US.js
42
- * module.exports = {
43
- * "Email": "Email",
44
- * };
45
- * ```
46
- * 或者也可以用 JSON 格式的文件:
47
- *
48
- * ```js
49
- * // config/locale/zh-CN.json
50
- * {
51
- * "email": "邮箱",
52
- * "login": "帐号",
53
- * "createdAt": "注册时间"
54
- * }
55
- * ```
56
- */
57
- var I18n = class {
58
- app;
59
- constructor(app) {
60
- this.app = app;
61
- }
62
- async didLoad() {
63
- const i18nConfig = this.app.config.i18n;
64
- i18nConfig.defaultLocale = formatLocale(i18nConfig.defaultLocale);
65
- i18nConfig.cookieMaxAge = ms(i18nConfig.cookieMaxAge);
66
- i18nConfig.dirs = Array.isArray(i18nConfig.dirs) ? i18nConfig.dirs : [];
67
- for (const unit of this.app.loader.getLoadUnits()) {
68
- let localePath = path.join(unit.path, "config/locale");
69
- /**
70
- * 优先选择 `config/locale` 目录下的多语言文件,不存在时再选择 `config/locales` 目录
71
- * 避免 2 个目录同时存在时可能导致的冲突
72
- */
73
- if (!await exists(localePath)) localePath = path.join(unit.path, "config/locales");
74
- i18nConfig.dirs.push(localePath);
75
- }
76
- debug("app.config.i18n.dirs:", i18nConfig.dirs);
77
- await loadLocaleResources(this.app, i18nConfig);
78
- const app = this.app;
79
- function gettextInContext(key, ...args) {
80
- return app.ctxStorage.getStore().gettext(key, ...args);
81
- }
82
- Object.defineProperties(app.locals, {
83
- __: {
84
- value: gettextInContext,
85
- enumerable: true
86
- },
87
- gettext: {
88
- value: gettextInContext,
89
- enumerable: true
90
- }
91
- });
92
- }
93
- };
94
-
95
- //#endregion
96
- export { I18n as default };
9
+ * I18n 国际化
10
+ *
11
+ * 通过设置 Plugin 配置 `i18n: true`,开启多语言支持。
12
+ *
13
+ * #### 语言文件存储路径
14
+ *
15
+ * 统一存放在 `config/locale/*.js` 下( 兼容`config/locales/*.js` ),如包含英文,简体中文,繁体中文的语言文件:
16
+ *
17
+ * ```
18
+ * - config/locale/
19
+ * - en-US.js
20
+ * - zh-CN.js
21
+ * - zh-TW.js
22
+ * ```
23
+ * @class I18n
24
+ * @param {App} app Application object.
25
+ * @example
26
+ *
27
+ * #### I18n 文件内容
28
+ *
29
+ * ```js
30
+ * // config/locale/zh-CN.js
31
+ * module.exports = {
32
+ * "Email": "邮箱",
33
+ * "Welcome back, %s!": "欢迎回来, %s!",
34
+ * "Hello %s, how are you today?": "你好 %s, 今天过得咋样?",
35
+ * };
36
+ * ```
37
+ *
38
+ * ```js
39
+ * // config/locale/en-US.js
40
+ * module.exports = {
41
+ * "Email": "Email",
42
+ * };
43
+ * ```
44
+ * 或者也可以用 JSON 格式的文件:
45
+ *
46
+ * ```js
47
+ * // config/locale/zh-CN.json
48
+ * {
49
+ * "email": "邮箱",
50
+ * "login": "帐号",
51
+ * "createdAt": "注册时间"
52
+ * }
53
+ * ```
54
+ */
55
+ export default class I18n {
56
+ app;
57
+ constructor(app) {
58
+ this.app = app;
59
+ }
60
+ async didLoad() {
61
+ const i18nConfig = this.app.config.i18n;
62
+ i18nConfig.defaultLocale = formatLocale(i18nConfig.defaultLocale);
63
+ i18nConfig.cookieMaxAge = ms(i18nConfig.cookieMaxAge);
64
+ i18nConfig.dirs = Array.isArray(i18nConfig.dirs) ? i18nConfig.dirs : [];
65
+ // egg > 插件 > 框架 > 应用的顺序遍历 config/locale(config/locales) 目录,加载所有配置文件
66
+ for (const unit of this.app.loader.getLoadUnits()) {
67
+ let localePath = path.join(unit.path, 'config/locale');
68
+ /**
69
+ * 优先选择 `config/locale` 目录下的多语言文件,不存在时再选择 `config/locales` 目录
70
+ * 避免 2 个目录同时存在时可能导致的冲突
71
+ */
72
+ if (!(await exists(localePath))) {
73
+ localePath = path.join(unit.path, 'config/locales');
74
+ }
75
+ i18nConfig.dirs.push(localePath);
76
+ }
77
+ debug('app.config.i18n.dirs:', i18nConfig.dirs);
78
+ await loadLocaleResources(this.app, i18nConfig);
79
+ const app = this.app;
80
+ function gettextInContext(key, ...args) {
81
+ const ctx = app.ctxStorage.getStore();
82
+ return ctx.gettext(key, ...args);
83
+ }
84
+ // 在 view 中使用 `__(key, value, ...args)`
85
+ Object.defineProperties(app.locals, {
86
+ __: {
87
+ value: gettextInContext,
88
+ enumerable: true,
89
+ },
90
+ gettext: {
91
+ value: gettextInContext,
92
+ enumerable: true,
93
+ },
94
+ });
95
+ }
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHakMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFMUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRXZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOENHO0FBRUgsTUFBTSxDQUFDLE9BQU8sT0FBTyxJQUFJO0lBQ04sR0FBRyxDQUFDO0lBRXJCLFlBQVksR0FBZ0I7UUFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRSxVQUFVLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdEQsVUFBVSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hFLHNFQUFzRTtRQUN0RSxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDbEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3ZEOzs7ZUFHRztZQUNILElBQUksQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBRUQsS0FBSyxDQUFDLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoRCxNQUFNLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNyQixTQUFTLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxHQUFHLElBQVc7WUFDbkQsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUcsQ0FBQztZQUN2QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELHVDQUF1QztRQUN2QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNsQyxFQUFFLEVBQUU7Z0JBQ0YsS0FBSyxFQUFFLGdCQUFnQjtnQkFDdkIsVUFBVSxFQUFFLElBQUk7YUFDakI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsS0FBSyxFQUFFLGdCQUFnQjtnQkFDdkIsVUFBVSxFQUFFLElBQUk7YUFDakI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YifQ==
@@ -1,54 +1,52 @@
1
- //#region src/config/config.default.d.ts
2
- interface I18nConfig {
3
- /**
4
- * 默认语言是美式英语,毕竟支持多语言,基本都是以英语为母板
5
- * 默认值是 `en_US`
6
- */
7
- defaultLocale: string;
8
- /**
9
- * 多语言资源文件存放路径,不建议修改
10
- * 默认值是 `[]`
11
- */
12
- dirs: string[];
13
- /**
14
- * @deprecated please use `dirs` instead
15
- */
16
- dir?: string;
17
- /**
18
- * 设置当前语言的 query 参数字段名,默认通过 `query.locale` 获取
19
- * 如果你想修改为 `query.lang`,那么请通过修改此配置实现
20
- * 默认值是 `locale`
21
- */
22
- queryField: string;
23
- /**
24
- * 如果当前请求用户语言有变化,都会设置到 cookie 中保持着,
25
- * 默认是存储在key locale 的 cookie 中
26
- * 默认值是 `locale`
27
- */
28
- cookieField: string;
29
- /**
30
- * 存储 locale 的 cookie domain 配置,默认不设置,为当前域名才有效
31
- * 默认值是 `''`
32
- */
33
- cookieDomain: string;
34
- /**
35
- * cookie 默认一年后过期,如果设置为 Number,则单位为 ms
36
- * 默认值是 `'1y'`
37
- */
38
- cookieMaxAge: string | number;
39
- /**
40
- * locale 别名,比如 zh_CN => cn
41
- * 默认值是 `{}`
42
- */
43
- localeAlias: Record<string, string>;
44
- /**
45
- * 是否写入 cookie
46
- * 默认值是 `true`
47
- */
48
- writeCookie: boolean;
1
+ export interface I18nConfig {
2
+ /**
3
+ * 默认语言是美式英语,毕竟支持多语言,基本都是以英语为母板
4
+ * 默认值是 `en_US`
5
+ */
6
+ defaultLocale: string;
7
+ /**
8
+ * 多语言资源文件存放路径,不建议修改
9
+ * 默认值是 `[]`
10
+ */
11
+ dirs: string[];
12
+ /**
13
+ * @deprecated please use `dirs` instead
14
+ */
15
+ dir?: string;
16
+ /**
17
+ * 设置当前语言的 query 参数字段名,默认通过 `query.locale` 获取
18
+ * 如果你想修改为 `query.lang`,那么请通过修改此配置实现
19
+ * 默认值是 `locale`
20
+ */
21
+ queryField: string;
22
+ /**
23
+ * 如果当前请求用户语言有变化,都会设置到 cookie 中保持着,
24
+ * 默认是存储在key 为 locale 的 cookie
25
+ * 默认值是 `locale`
26
+ */
27
+ cookieField: string;
28
+ /**
29
+ * 存储 locale 的 cookie domain 配置,默认不设置,为当前域名才有效
30
+ * 默认值是 `''`
31
+ */
32
+ cookieDomain: string;
33
+ /**
34
+ * cookie 默认一年后过期,如果设置为 Number,则单位为 ms
35
+ * 默认值是 `'1y'`
36
+ */
37
+ cookieMaxAge: string | number;
38
+ /**
39
+ * locale 别名,比如 zh_CN => cn
40
+ * 默认值是 `{}`
41
+ */
42
+ localeAlias: Record<string, string>;
43
+ /**
44
+ * 是否写入 cookie
45
+ * 默认值是 `true`
46
+ */
47
+ writeCookie: boolean;
49
48
  }
50
49
  declare const _default: {
51
- i18n: I18nConfig;
50
+ i18n: I18nConfig;
52
51
  };
53
- //#endregion
54
- export { I18nConfig, _default as default };
52
+ export default _default;
@@ -1,15 +1,14 @@
1
- //#region src/config/config.default.ts
2
- var config_default_default = { i18n: {
3
- defaultLocale: "en_US",
4
- dirs: [],
5
- queryField: "locale",
6
- cookieField: "locale",
7
- cookieDomain: "",
8
- cookieMaxAge: "1y",
9
- localeAlias: {},
10
- writeCookie: true,
11
- dir: void 0
12
- } };
13
-
14
- //#endregion
15
- export { config_default_default as default };
1
+ export default {
2
+ i18n: {
3
+ defaultLocale: 'en_US',
4
+ dirs: [],
5
+ queryField: 'locale',
6
+ cookieField: 'locale',
7
+ cookieDomain: '',
8
+ cookieMaxAge: '1y',
9
+ localeAlias: {},
10
+ writeCookie: true,
11
+ dir: undefined,
12
+ },
13
+ };
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2NvbmZpZy5kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlEQSxlQUFlO0lBQ2IsSUFBSSxFQUFFO1FBQ0osYUFBYSxFQUFFLE9BQU87UUFDdEIsSUFBSSxFQUFFLEVBQUU7UUFDUixVQUFVLEVBQUUsUUFBUTtRQUNwQixXQUFXLEVBQUUsUUFBUTtRQUNyQixZQUFZLEVBQUUsRUFBRTtRQUNoQixZQUFZLEVBQUUsSUFBSTtRQUNsQixXQUFXLEVBQUUsRUFBRTtRQUNmLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLEdBQUcsRUFBRSxTQUFTO0tBQ0Q7Q0FDaEIsQ0FBQyJ9
package/dist/index.d.ts CHANGED
@@ -1 +1,4 @@
1
- export { };
1
+ import './config/config.default.ts';
2
+ import './app/extend/context.ts';
3
+ import './app/extend/application.ts';
4
+ import './types.ts';
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
- import "./app/extend/application.js";
1
+ import "./config/config.default.js";
2
2
  import "./app/extend/context.js";
3
-
4
- export { };
3
+ import "./app/extend/application.js";
4
+ import "./types.js";
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxZQUFZLENBQUMifQ==
package/dist/locales.d.ts CHANGED
@@ -1,7 +1,3 @@
1
- import { I18nConfig } from "./config/config.default.js";
2
- import { Application } from "egg";
3
-
4
- //#region src/locales.d.ts
5
- declare function loadLocaleResources(app: Application, options: I18nConfig): Promise<void>;
6
- //#endregion
7
- export { loadLocaleResources };
1
+ import type { Application } from 'egg';
2
+ import type { I18nConfig } from './config/config.default.ts';
3
+ export declare function loadLocaleResources(app: Application, options: I18nConfig): Promise<void>;
package/dist/locales.js CHANGED
@@ -1,53 +1,66 @@
1
- import { formatLocale, isObject } from "./utils.js";
1
+ import { debuglog } from 'node:util';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import ini from 'ini';
5
+ import yaml from 'js-yaml';
6
+ import { exists, readJSON } from 'utility';
7
+ import { importModule } from '@eggjs/utils';
2
8
  import { I18N_RESOURCES } from "./app/extend/application.js";
3
- import path from "node:path";
4
- import { debuglog } from "node:util";
5
- import { exists, readJSON } from "utility";
6
- import fs from "node:fs/promises";
7
- import ini from "ini";
8
- import yaml from "js-yaml";
9
- import { importModule } from "@eggjs/utils";
10
-
11
- //#region src/locales.ts
12
- const debug = debuglog("egg/i18n/locales");
13
- async function loadLocaleResources(app, options) {
14
- const localeDirs = options.dirs;
15
- const resources = {};
16
- if (options.dir && !localeDirs.includes(options.dir)) {
17
- app.deprecate("[@eggjs/i18n] `config.i18n.dir` is deprecated, please use `config.i18n.dirs` instead");
18
- localeDirs.push(options.dir);
19
- }
20
- for (const dir of localeDirs) {
21
- if (!await exists(dir)) continue;
22
- const names = await fs.readdir(dir);
23
- for (const name of names) {
24
- const filepath = path.join(dir, name);
25
- const locale = formatLocale(name.split(".")[0]);
26
- let resource = {};
27
- if (name.endsWith(".js") || name.endsWith(".ts")) resource = flattening(await importModule(filepath, { importDefaultOnly: true }));
28
- else if (name.endsWith(".json")) resource = flattening(await readJSON(filepath));
29
- else if (name.endsWith(".properties")) resource = ini.parse(await fs.readFile(filepath, "utf8"));
30
- else if (name.endsWith(".yml") || name.endsWith(".yaml")) resource = flattening(yaml.load(await fs.readFile(filepath, "utf8")));
31
- resources[locale] = resources[locale] || {};
32
- Object.assign(resources[locale], resource);
33
- }
34
- }
35
- debug("Init locales with %j, got %j resources", options, Object.keys(resources));
36
- app[I18N_RESOURCES] = resources;
9
+ import { formatLocale, isObject } from "./utils.js";
10
+ const debug = debuglog('egg/i18n/locales');
11
+ export async function loadLocaleResources(app, options) {
12
+ const localeDirs = options.dirs;
13
+ const resources = {};
14
+ if (options.dir && !localeDirs.includes(options.dir)) {
15
+ app.deprecate('[@eggjs/i18n] `config.i18n.dir` is deprecated, please use `config.i18n.dirs` instead');
16
+ localeDirs.push(options.dir);
17
+ }
18
+ for (const dir of localeDirs) {
19
+ if (!(await exists(dir))) {
20
+ continue;
21
+ }
22
+ const names = await fs.readdir(dir);
23
+ for (const name of names) {
24
+ const filepath = path.join(dir, name);
25
+ // support en_US.js => en-US.js
26
+ const locale = formatLocale(name.split('.')[0]);
27
+ let resource = {};
28
+ if (name.endsWith('.js') || name.endsWith('.ts')) {
29
+ resource = flattening(await importModule(filepath, {
30
+ importDefaultOnly: true,
31
+ }));
32
+ }
33
+ else if (name.endsWith('.json')) {
34
+ resource = flattening(await readJSON(filepath));
35
+ }
36
+ else if (name.endsWith('.properties')) {
37
+ resource = ini.parse(await fs.readFile(filepath, 'utf8'));
38
+ }
39
+ else if (name.endsWith('.yml') || name.endsWith('.yaml')) {
40
+ resource = flattening(yaml.load(await fs.readFile(filepath, 'utf8')));
41
+ }
42
+ resources[locale] = resources[locale] || {};
43
+ Object.assign(resources[locale], resource);
44
+ }
45
+ }
46
+ debug('Init locales with %j, got %j resources', options, Object.keys(resources));
47
+ app[I18N_RESOURCES] = resources;
37
48
  }
38
49
  function flattening(data) {
39
- const result = {};
40
- function deepFlat(data$1, prefix) {
41
- for (const key in data$1) {
42
- const value = data$1[key];
43
- const k = prefix ? prefix + "." + key : key;
44
- if (isObject(value)) deepFlat(value, k);
45
- else result[k] = String(value);
46
- }
47
- }
48
- deepFlat(data, "");
49
- return result;
50
+ const result = {};
51
+ function deepFlat(data, prefix) {
52
+ for (const key in data) {
53
+ const value = data[key];
54
+ const k = prefix ? prefix + '.' + key : key;
55
+ if (isObject(value)) {
56
+ deepFlat(value, k);
57
+ }
58
+ else {
59
+ result[k] = String(value);
60
+ }
61
+ }
62
+ }
63
+ deepFlat(data, '');
64
+ return result;
50
65
  }
51
-
52
- //#endregion
53
- export { loadLocaleResources };
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2NhbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBRTdCLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN0QixPQUFPLElBQUksTUFBTSxTQUFTLENBQUM7QUFDM0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUk1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFcEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFM0MsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxHQUFnQixFQUFFLE9BQW1CO0lBQzdFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDaEMsTUFBTSxTQUFTLEdBQTJDLEVBQUUsQ0FBQztJQUU3RCxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxTQUFTLENBQUMsc0ZBQXNGLENBQUMsQ0FBQztRQUN0RyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxH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
package/dist/types.d.ts CHANGED
@@ -1,29 +1,27 @@
1
- import { I18nConfig } from "./config/config.default.js";
2
-
3
- //#region src/types.d.ts
1
+ import type { I18nConfig } from './config/config.default.ts';
4
2
  declare module 'egg' {
5
- interface EggAppConfig {
6
- /**
7
- * I18n options
8
- * @member Config#i18n
9
- */
10
- i18n: I18nConfig;
11
- }
12
- interface Application {
13
- isSupportLocale(locale: string): boolean;
14
- gettext(locale: string, key: string, value?: any, ...args: any[]): string;
15
- __(locale: string, key: string, value?: any, ...args: any[]): string;
16
- }
17
- interface Context {
18
- /**
19
- * get and set current request locale
20
- * @member Context#locale
21
- * @return {String} lower case locale string, e.g.: 'zh-cn', 'en-us'
22
- */
23
- locale: string;
24
- gettext(key: string, value?: any, ...args: any[]): string;
25
- __(key: string, value?: any, ...args: any[]): string;
26
- __getLocale(): string;
27
- __setLocale(l: string): void;
28
- }
29
- }
3
+ interface EggAppConfig {
4
+ /**
5
+ * I18n options
6
+ * @member Config#i18n
7
+ */
8
+ i18n: I18nConfig;
9
+ }
10
+ interface Application {
11
+ isSupportLocale(locale: string): boolean;
12
+ gettext(locale: string, key: string, value?: any, ...args: any[]): string;
13
+ __(locale: string, key: string, value?: any, ...args: any[]): string;
14
+ }
15
+ interface Context {
16
+ /**
17
+ * get and set current request locale
18
+ * @member Context#locale
19
+ * @return {String} lower case locale string, e.g.: 'zh-cn', 'en-us'
20
+ */
21
+ locale: string;
22
+ gettext(key: string, value?: any, ...args: any[]): string;
23
+ __(key: string, value?: any, ...args: any[]): string;
24
+ __getLocale(): string;
25
+ __setLocale(l: string): void;
26
+ }
27
+ }
package/dist/types.js CHANGED
@@ -1 +1,2 @@
1
- export { };
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
package/dist/utils.d.ts CHANGED
@@ -1,5 +1,2 @@
1
- //#region src/utils.d.ts
2
- declare function isObject(obj: any): boolean;
3
- declare function formatLocale(locale: string): string;
4
- //#endregion
5
- export { formatLocale, isObject };
1
+ export declare function isObject(obj: any): boolean;
2
+ export declare function formatLocale(locale: string): string;
package/dist/utils.js CHANGED
@@ -1,10 +1,8 @@
1
- //#region src/utils.ts
2
- function isObject(obj) {
3
- return Object.prototype.toString.call(obj) === "[object Object]";
1
+ export function isObject(obj) {
2
+ return Object.prototype.toString.call(obj) === '[object Object]';
4
3
  }
5
- function formatLocale(locale) {
6
- return locale.replaceAll("_", "-").toLowerCase();
4
+ export function formatLocale(locale) {
5
+ // support zh_CN, en_US, zh_Hans_CN, zh_Hant_CN => zh-CN, en-US, zh-hans-cn, zh-hant-cn
6
+ return locale.replaceAll('_', '-').toLowerCase();
7
7
  }
8
-
9
- //#endregion
10
- export { formatLocale, isObject };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFFBQVEsQ0FBQyxHQUFRO0lBQy9CLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLGlCQUFpQixDQUFDO0FBQ25FLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQWM7SUFDekMsdUZBQXVGO0lBQ3ZGLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDbkQsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eggjs/i18n",
3
- "version": "4.0.0-beta.19",
3
+ "version": "4.0.0-beta.21",
4
4
  "description": "i18n plugin for egg",
5
5
  "eggPlugin": {
6
6
  "name": "i18n"
@@ -45,10 +45,10 @@
45
45
  "ini": "^5.0.0",
46
46
  "js-yaml": "^4.1.0",
47
47
  "utility": "^2.5.0",
48
- "@eggjs/utils": "5.0.0-beta.19"
48
+ "@eggjs/utils": "5.0.0-beta.21"
49
49
  },
50
50
  "peerDependencies": {
51
- "egg": "4.1.0-beta.19"
51
+ "egg": "4.1.0-beta.21"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/ini": "^4.1.1",
@@ -58,8 +58,8 @@
58
58
  "tsdown": "^0.15.4",
59
59
  "typescript": "^5.9.3",
60
60
  "vitest": "4.0.0-beta.16",
61
- "@eggjs/tsconfig": "3.1.0-beta.19",
62
- "@eggjs/mock": "7.0.0-beta.19"
61
+ "@eggjs/mock": "7.0.0-beta.21",
62
+ "@eggjs/tsconfig": "3.1.0-beta.21"
63
63
  },
64
64
  "files": [
65
65
  "dist"
@@ -68,7 +68,7 @@
68
68
  "module": "./dist/index.js",
69
69
  "types": "./dist/index.d.ts",
70
70
  "scripts": {
71
- "build": "tsdown",
71
+ "build": "tsdown && rimraf dist && tsc -b --clean && tsc",
72
72
  "typecheck": "tsc --noEmit",
73
73
  "lint": "oxlint --type-aware",
74
74
  "lint:fix": "npm run lint -- --fix",