@modern-js/plugin-i18n 2.69.7 → 3.0.0-alpha.1
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 +6 -0
- package/dist/cjs/cli/index.cjs +154 -0
- package/dist/cjs/runtime/I18nLink.cjs +68 -0
- package/dist/cjs/runtime/context.cjs +138 -0
- package/dist/cjs/runtime/hooks.cjs +189 -0
- package/dist/cjs/runtime/i18n/backend/config.cjs +39 -0
- package/dist/cjs/runtime/i18n/backend/defaults.cjs +56 -0
- package/dist/cjs/runtime/i18n/backend/defaults.node.cjs +56 -0
- package/dist/cjs/runtime/i18n/backend/index.cjs +108 -0
- package/dist/cjs/runtime/i18n/backend/middleware.cjs +54 -0
- package/dist/cjs/runtime/i18n/backend/middleware.common.cjs +105 -0
- package/dist/cjs/runtime/i18n/backend/middleware.node.cjs +58 -0
- package/dist/cjs/runtime/i18n/backend/sdk-backend.cjs +171 -0
- package/dist/cjs/runtime/i18n/detection/config.cjs +63 -0
- package/dist/cjs/runtime/i18n/detection/index.cjs +309 -0
- package/dist/cjs/runtime/i18n/detection/middleware.cjs +185 -0
- package/dist/cjs/runtime/i18n/detection/middleware.node.cjs +74 -0
- package/dist/cjs/runtime/i18n/index.cjs +43 -0
- package/dist/cjs/runtime/i18n/instance.cjs +132 -0
- package/dist/cjs/runtime/i18n/utils.cjs +185 -0
- package/dist/cjs/runtime/index.cjs +172 -0
- package/dist/cjs/runtime/types.cjs +18 -0
- package/dist/cjs/runtime/utils.cjs +134 -0
- package/dist/cjs/server/index.cjs +178 -0
- package/dist/cjs/shared/deepMerge.cjs +54 -0
- package/dist/cjs/shared/detection.cjs +105 -0
- package/dist/cjs/shared/type.cjs +18 -0
- package/dist/cjs/shared/utils.cjs +78 -0
- package/dist/esm/cli/index.js +106 -0
- package/dist/esm/runtime/I18nLink.js +31 -0
- package/dist/esm/runtime/context.js +101 -0
- package/dist/esm/runtime/hooks.js +146 -0
- package/dist/esm/runtime/i18n/backend/config.js +5 -0
- package/dist/esm/runtime/i18n/backend/defaults.js +19 -0
- package/dist/esm/runtime/i18n/backend/defaults.node.js +19 -0
- package/dist/esm/runtime/i18n/backend/index.js +74 -0
- package/dist/esm/runtime/i18n/backend/middleware.common.js +61 -0
- package/dist/esm/runtime/i18n/backend/middleware.js +7 -0
- package/dist/esm/runtime/i18n/backend/middleware.node.js +8 -0
- package/dist/esm/runtime/i18n/backend/sdk-backend.js +137 -0
- package/dist/esm/runtime/i18n/detection/config.js +26 -0
- package/dist/esm/runtime/i18n/detection/index.js +260 -0
- package/dist/esm/runtime/i18n/detection/middleware.js +132 -0
- package/dist/esm/runtime/i18n/detection/middleware.node.js +31 -0
- package/dist/esm/runtime/i18n/index.js +3 -0
- package/dist/esm/runtime/i18n/instance.js +77 -0
- package/dist/esm/runtime/i18n/utils.js +136 -0
- package/dist/esm/runtime/index.js +129 -0
- package/dist/esm/runtime/types.js +0 -0
- package/dist/esm/runtime/utils.js +82 -0
- package/dist/esm/server/index.js +168 -0
- package/dist/esm/shared/deepMerge.js +20 -0
- package/dist/esm/shared/detection.js +71 -0
- package/dist/esm/shared/type.js +0 -0
- package/dist/esm/shared/utils.js +35 -0
- package/dist/esm-node/cli/index.js +106 -0
- package/dist/esm-node/runtime/I18nLink.js +31 -0
- package/dist/esm-node/runtime/context.js +101 -0
- package/dist/esm-node/runtime/hooks.js +146 -0
- package/dist/esm-node/runtime/i18n/backend/config.js +5 -0
- package/dist/esm-node/runtime/i18n/backend/defaults.js +19 -0
- package/dist/esm-node/runtime/i18n/backend/defaults.node.js +19 -0
- package/dist/esm-node/runtime/i18n/backend/index.js +74 -0
- package/dist/esm-node/runtime/i18n/backend/middleware.common.js +61 -0
- package/dist/esm-node/runtime/i18n/backend/middleware.js +7 -0
- package/dist/esm-node/runtime/i18n/backend/middleware.node.js +8 -0
- package/dist/esm-node/runtime/i18n/backend/sdk-backend.js +137 -0
- package/dist/esm-node/runtime/i18n/detection/config.js +26 -0
- package/dist/esm-node/runtime/i18n/detection/index.js +260 -0
- package/dist/esm-node/runtime/i18n/detection/middleware.js +132 -0
- package/dist/esm-node/runtime/i18n/detection/middleware.node.js +31 -0
- package/dist/esm-node/runtime/i18n/index.js +3 -0
- package/dist/esm-node/runtime/i18n/instance.js +77 -0
- package/dist/esm-node/runtime/i18n/utils.js +136 -0
- package/dist/esm-node/runtime/index.js +129 -0
- package/dist/esm-node/runtime/types.js +0 -0
- package/dist/esm-node/runtime/utils.js +82 -0
- package/dist/esm-node/server/index.js +168 -0
- package/dist/esm-node/shared/deepMerge.js +20 -0
- package/dist/esm-node/shared/detection.js +71 -0
- package/dist/esm-node/shared/type.js +0 -0
- package/dist/esm-node/shared/utils.js +35 -0
- package/dist/types/cli/index.d.ts +21 -0
- package/dist/types/runtime/I18nLink.d.ts +8 -0
- package/dist/types/runtime/context.d.ts +38 -0
- package/dist/types/runtime/hooks.d.ts +28 -0
- package/dist/types/runtime/i18n/backend/config.d.ts +2 -0
- package/dist/types/runtime/i18n/backend/defaults.d.ts +13 -0
- package/dist/types/runtime/i18n/backend/defaults.node.d.ts +8 -0
- package/dist/types/runtime/i18n/backend/index.d.ts +3 -0
- package/dist/types/runtime/i18n/backend/middleware.common.d.ts +14 -0
- package/dist/types/runtime/i18n/backend/middleware.d.ts +12 -0
- package/dist/types/runtime/i18n/backend/middleware.node.d.ts +13 -0
- package/dist/types/runtime/i18n/backend/sdk-backend.d.ts +52 -0
- package/dist/types/runtime/i18n/detection/config.d.ts +11 -0
- package/dist/types/runtime/i18n/detection/index.d.ts +50 -0
- package/dist/types/runtime/i18n/detection/middleware.d.ts +24 -0
- package/dist/types/runtime/i18n/detection/middleware.node.d.ts +17 -0
- package/dist/types/runtime/i18n/index.d.ts +3 -0
- package/dist/types/runtime/i18n/instance.d.ts +93 -0
- package/dist/types/runtime/i18n/utils.d.ts +29 -0
- package/dist/types/runtime/index.d.ts +20 -0
- package/dist/types/runtime/types.d.ts +15 -0
- package/dist/types/runtime/utils.d.ts +33 -0
- package/dist/types/server/index.d.ts +8 -0
- package/dist/types/shared/deepMerge.d.ts +1 -0
- package/dist/types/shared/detection.d.ts +11 -0
- package/dist/types/shared/type.d.ts +156 -0
- package/dist/types/shared/utils.d.ts +5 -0
- package/package.json +100 -34
- package/rslib.config.mts +4 -0
- package/src/cli/index.ts +245 -0
- package/src/runtime/I18nLink.tsx +76 -0
- package/src/runtime/context.tsx +256 -0
- package/src/runtime/hooks.ts +274 -0
- package/src/runtime/i18n/backend/config.ts +10 -0
- package/src/runtime/i18n/backend/defaults.node.ts +31 -0
- package/src/runtime/i18n/backend/defaults.ts +37 -0
- package/src/runtime/i18n/backend/index.ts +181 -0
- package/src/runtime/i18n/backend/middleware.common.ts +116 -0
- package/src/runtime/i18n/backend/middleware.node.ts +32 -0
- package/src/runtime/i18n/backend/middleware.ts +28 -0
- package/src/runtime/i18n/backend/sdk-backend.ts +292 -0
- package/src/runtime/i18n/detection/config.ts +32 -0
- package/src/runtime/i18n/detection/index.ts +641 -0
- package/src/runtime/i18n/detection/middleware.node.ts +84 -0
- package/src/runtime/i18n/detection/middleware.ts +251 -0
- package/src/runtime/i18n/index.ts +8 -0
- package/src/runtime/i18n/instance.ts +227 -0
- package/src/runtime/i18n/utils.ts +333 -0
- package/src/runtime/index.tsx +281 -0
- package/src/runtime/types.ts +17 -0
- package/src/runtime/utils.ts +151 -0
- package/src/server/index.ts +336 -0
- package/src/shared/deepMerge.ts +38 -0
- package/src/shared/detection.ts +131 -0
- package/src/shared/type.ts +170 -0
- package/src/shared/utils.ts +82 -0
- package/tsconfig.json +12 -0
- package/dist/cjs/index.js +0 -73
- package/dist/cjs/languageDetector.js +0 -51
- package/dist/cjs/utils/index.js +0 -39
- package/dist/esm/index.js +0 -61
- package/dist/esm/languageDetector.js +0 -33
- package/dist/esm/utils/index.js +0 -16
- package/dist/esm-node/index.js +0 -49
- package/dist/esm-node/languageDetector.js +0 -26
- package/dist/esm-node/utils/index.js +0 -15
- package/dist/types/index.d.ts +0 -34
- package/dist/types/languageDetector.d.ts +0 -6
- package/dist/types/utils/index.d.ts +0 -5
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
LanguageDetectorOptions,
|
|
3
|
+
Resources,
|
|
4
|
+
} from '../runtime/i18n/instance';
|
|
5
|
+
|
|
6
|
+
export interface BaseLocaleDetectionOptions {
|
|
7
|
+
localePathRedirect?: boolean;
|
|
8
|
+
i18nextDetector?: boolean;
|
|
9
|
+
languages?: string[];
|
|
10
|
+
fallbackLanguage?: string;
|
|
11
|
+
detection?: LanguageDetectorOptions;
|
|
12
|
+
ignoreRedirectRoutes?: string[] | ((pathname: string) => boolean);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface LocaleDetectionOptions extends BaseLocaleDetectionOptions {
|
|
16
|
+
localeDetectionByEntry?: Record<string, BaseLocaleDetectionOptions>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Options for loading i18n resources via SDK
|
|
21
|
+
*/
|
|
22
|
+
export interface I18nSdkLoadOptions {
|
|
23
|
+
/** Single language code to load (e.g., 'en', 'zh') */
|
|
24
|
+
lng?: string;
|
|
25
|
+
/** Single namespace to load (e.g., 'translation', 'common') */
|
|
26
|
+
ns?: string;
|
|
27
|
+
/** Multiple language codes to load */
|
|
28
|
+
lngs?: string[];
|
|
29
|
+
/** Multiple namespaces to load */
|
|
30
|
+
nss?: string[];
|
|
31
|
+
/** Load all available languages and namespaces */
|
|
32
|
+
all?: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* SDK function to load i18n resources
|
|
37
|
+
* Supports multiple loading modes:
|
|
38
|
+
* 1. Single resource: sdk({ lng: 'en', ns: 'translation' })
|
|
39
|
+
* 2. Batch by languages: sdk({ lngs: ['en', 'zh'], ns: 'translation' })
|
|
40
|
+
* 3. Batch by namespaces: sdk({ lng: 'en', nss: ['translation', 'common'] })
|
|
41
|
+
* 4. Batch by both: sdk({ lngs: ['en', 'zh'], nss: ['translation', 'common'] })
|
|
42
|
+
* 5. Load all: sdk({ all: true }) or sdk()
|
|
43
|
+
*
|
|
44
|
+
* @param options - Loading options
|
|
45
|
+
* @returns Promise that resolves to resources object or the resources object directly
|
|
46
|
+
* Resources format: { [lng]: { [ns]: { [key]: value } } }
|
|
47
|
+
*/
|
|
48
|
+
export type I18nSdkLoader = (
|
|
49
|
+
options: I18nSdkLoadOptions,
|
|
50
|
+
) => Promise<Resources> | Resources;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Chained backend configuration
|
|
54
|
+
* Used internally when both loadPath and sdk are provided
|
|
55
|
+
*/
|
|
56
|
+
export interface ChainedBackendConfig {
|
|
57
|
+
_useChainedBackend: boolean;
|
|
58
|
+
_chainedBackendConfig: {
|
|
59
|
+
backendOptions: Array<Record<string, unknown>>;
|
|
60
|
+
};
|
|
61
|
+
cacheHitMode?: 'none' | 'refresh' | 'refreshAndUpdateStore';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Extended backend options that may include chained backend configuration
|
|
66
|
+
*/
|
|
67
|
+
export type ExtendedBackendOptions = BaseBackendOptions &
|
|
68
|
+
Partial<ChainedBackendConfig>;
|
|
69
|
+
|
|
70
|
+
export interface BaseBackendOptions {
|
|
71
|
+
enabled?: boolean;
|
|
72
|
+
loadPath?: string;
|
|
73
|
+
addPath?: string;
|
|
74
|
+
/**
|
|
75
|
+
* Cache hit mode for chained backend (only effective when both `loadPath` and `sdk` are provided)
|
|
76
|
+
*
|
|
77
|
+
* - `'none'` (default): If the first backend returns resources, stop and don't try the next backend
|
|
78
|
+
* - `'refresh'`: Try to refresh the cache by loading from the next backend and update the cache
|
|
79
|
+
* - `'refreshAndUpdateStore'`: Try to refresh the cache by loading from the next backend,
|
|
80
|
+
* update the cache and also update the i18next resource store. This allows FS/HTTP resources
|
|
81
|
+
* to be displayed first, then SDK resources will update them asynchronously.
|
|
82
|
+
*
|
|
83
|
+
* @default 'refreshAndUpdateStore' when both loadPath and sdk are provided
|
|
84
|
+
*/
|
|
85
|
+
cacheHitMode?: 'none' | 'refresh' | 'refreshAndUpdateStore';
|
|
86
|
+
/**
|
|
87
|
+
* SDK function to load i18n resources dynamically
|
|
88
|
+
*
|
|
89
|
+
* **Important**: In `modern.config.ts`, you can only set this to `true` or any identifier
|
|
90
|
+
* to enable SDK mode. The actual SDK function must be provided in `modern.runtime.ts`
|
|
91
|
+
* via `initOptions.backend.sdk`.
|
|
92
|
+
*
|
|
93
|
+
* When both `loadPath` (or FS backend) and `sdk` are provided, the plugin will automatically
|
|
94
|
+
* use `i18next-chained-backend` to chain multiple backends. The order will be:
|
|
95
|
+
* 1. HTTP/FS backend (primary) - loads from `loadPath` or file system first for quick initial display
|
|
96
|
+
* 2. SDK backend (fallback/update) - loads from the SDK function to update/refresh translations
|
|
97
|
+
*
|
|
98
|
+
* With `cacheHitMode: 'refreshAndUpdateStore'` (default), FS/HTTP resources will be displayed
|
|
99
|
+
* immediately, then SDK resources will be loaded asynchronously to update the translations.
|
|
100
|
+
*
|
|
101
|
+
* If only `sdk` is provided, it will be used instead of the default HTTP/FS backend
|
|
102
|
+
*
|
|
103
|
+
* @example In modern.config.ts - enable SDK mode
|
|
104
|
+
* ```ts
|
|
105
|
+
* backend: {
|
|
106
|
+
* enabled: true,
|
|
107
|
+
* sdk: true, // or any identifier, just to enable SDK mode
|
|
108
|
+
* }
|
|
109
|
+
* ```
|
|
110
|
+
*
|
|
111
|
+
* @example In modern.runtime.ts - provide the actual SDK function
|
|
112
|
+
* ```ts
|
|
113
|
+
* export default defineRuntimeConfig({
|
|
114
|
+
* i18n: {
|
|
115
|
+
* initOptions: {
|
|
116
|
+
* backend: {
|
|
117
|
+
* sdk: async (options) => {
|
|
118
|
+
* // Your SDK implementation
|
|
119
|
+
* if (options.all) {
|
|
120
|
+
* return await mySdk.getAllResources();
|
|
121
|
+
* }
|
|
122
|
+
* if (options.lng && options.ns) {
|
|
123
|
+
* return await mySdk.getResource(options.lng, options.ns);
|
|
124
|
+
* }
|
|
125
|
+
* // Handle other cases...
|
|
126
|
+
* }
|
|
127
|
+
* }
|
|
128
|
+
* }
|
|
129
|
+
* }
|
|
130
|
+
* });
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* @example Single resource loading
|
|
134
|
+
* ```ts
|
|
135
|
+
* sdk: async (options) => {
|
|
136
|
+
* if (options.lng && options.ns) {
|
|
137
|
+
* const response = await fetch(`/api/i18n/${options.lng}/${options.ns}`);
|
|
138
|
+
* return response.json();
|
|
139
|
+
* }
|
|
140
|
+
* }
|
|
141
|
+
* ```
|
|
142
|
+
*
|
|
143
|
+
* @example Load all resources at once
|
|
144
|
+
* ```ts
|
|
145
|
+
* sdk: async (options) => {
|
|
146
|
+
* if (options?.all) {
|
|
147
|
+
* // Load all languages and namespaces
|
|
148
|
+
* return await mySdk.getAllResources();
|
|
149
|
+
* }
|
|
150
|
+
* // Handle other cases...
|
|
151
|
+
* }
|
|
152
|
+
* ```
|
|
153
|
+
*
|
|
154
|
+
* @example Batch loading
|
|
155
|
+
* ```ts
|
|
156
|
+
* sdk: async (options) => {
|
|
157
|
+
* if (options?.lngs && options?.nss) {
|
|
158
|
+
* // Load multiple languages and namespaces
|
|
159
|
+
* return await mySdk.getBatchResources(options.lngs, options.nss);
|
|
160
|
+
* }
|
|
161
|
+
* // Handle single or other cases...
|
|
162
|
+
* }
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
sdk?: I18nSdkLoader | boolean | string;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export interface BackendOptions extends BaseBackendOptions {
|
|
169
|
+
backendOptionsByEntry?: Record<string, BaseBackendOptions>;
|
|
170
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
BackendOptions,
|
|
3
|
+
BaseBackendOptions,
|
|
4
|
+
BaseLocaleDetectionOptions,
|
|
5
|
+
LocaleDetectionOptions,
|
|
6
|
+
} from './type';
|
|
7
|
+
|
|
8
|
+
export function getEntryConfig<T extends Record<string, any>>(
|
|
9
|
+
entryName: string,
|
|
10
|
+
config: T,
|
|
11
|
+
entryKey: string,
|
|
12
|
+
): T | undefined {
|
|
13
|
+
const entryConfigMap = (config as any)[entryKey] as
|
|
14
|
+
| Record<string, T>
|
|
15
|
+
| undefined;
|
|
16
|
+
return entryConfigMap?.[entryName];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function removeEntryConfigKey<T extends Record<string, any>>(
|
|
20
|
+
config: T,
|
|
21
|
+
entryKey: string,
|
|
22
|
+
): Omit<T, typeof entryKey> {
|
|
23
|
+
const { [entryKey]: _, ...rest } = config;
|
|
24
|
+
return rest;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function getLocaleDetectionOptions(
|
|
28
|
+
entryName: string,
|
|
29
|
+
localeDetection: BaseLocaleDetectionOptions,
|
|
30
|
+
): BaseLocaleDetectionOptions {
|
|
31
|
+
const fullConfig = localeDetection as LocaleDetectionOptions;
|
|
32
|
+
const entryConfig = getEntryConfig(
|
|
33
|
+
entryName,
|
|
34
|
+
fullConfig,
|
|
35
|
+
'localeDetectionByEntry',
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
if (entryConfig) {
|
|
39
|
+
const globalConfig = removeEntryConfigKey(
|
|
40
|
+
fullConfig,
|
|
41
|
+
'localeDetectionByEntry',
|
|
42
|
+
);
|
|
43
|
+
return {
|
|
44
|
+
...globalConfig,
|
|
45
|
+
...entryConfig,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if ('localeDetectionByEntry' in fullConfig) {
|
|
50
|
+
return removeEntryConfigKey(fullConfig, 'localeDetectionByEntry');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return localeDetection;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function getBackendOptions(
|
|
57
|
+
entryName: string,
|
|
58
|
+
backend: BaseBackendOptions,
|
|
59
|
+
): BaseBackendOptions {
|
|
60
|
+
const fullConfig = backend as BackendOptions;
|
|
61
|
+
const entryConfig = getEntryConfig(
|
|
62
|
+
entryName,
|
|
63
|
+
fullConfig,
|
|
64
|
+
'backendOptionsByEntry',
|
|
65
|
+
);
|
|
66
|
+
if (entryConfig) {
|
|
67
|
+
const globalConfig = removeEntryConfigKey(
|
|
68
|
+
fullConfig,
|
|
69
|
+
'backendOptionsByEntry',
|
|
70
|
+
);
|
|
71
|
+
return {
|
|
72
|
+
...globalConfig,
|
|
73
|
+
...entryConfig,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if ('backendOptionsByEntry' in fullConfig) {
|
|
78
|
+
return removeEntryConfigKey(fullConfig, 'backendOptionsByEntry');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return backend;
|
|
82
|
+
}
|
package/tsconfig.json
ADDED
package/dist/cjs/index.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var src_exports = {};
|
|
20
|
-
__export(src_exports, {
|
|
21
|
-
I18n: () => I18n
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(src_exports);
|
|
24
|
-
var import_lodash = require("@modern-js/utils/lodash");
|
|
25
|
-
var import_utils = require("./utils");
|
|
26
|
-
class I18n {
|
|
27
|
-
format(msg, vars) {
|
|
28
|
-
return msg.replace(/\{(\w+)\}/g, (_match, capture) => Object.prototype.hasOwnProperty.call(vars, capture) ? vars[capture] : capture);
|
|
29
|
-
}
|
|
30
|
-
getMessage(lang, key, vars, fallbackText) {
|
|
31
|
-
const languages = Object.keys(this.languageMap);
|
|
32
|
-
const resultLang = languages.find((l) => l === lang);
|
|
33
|
-
if (!resultLang && languages.length === 0) {
|
|
34
|
-
return fallbackText || key;
|
|
35
|
-
}
|
|
36
|
-
const model = this.languageMap[resultLang || "en"];
|
|
37
|
-
if (!model) {
|
|
38
|
-
return fallbackText || key;
|
|
39
|
-
}
|
|
40
|
-
const message = (0, import_lodash.get)(model, key);
|
|
41
|
-
const value = message || fallbackText || key;
|
|
42
|
-
if (typeof value === "string") {
|
|
43
|
-
return this.format(value, vars || {});
|
|
44
|
-
}
|
|
45
|
-
throw new Error("key is not a string");
|
|
46
|
-
}
|
|
47
|
-
init(language, languageMap) {
|
|
48
|
-
this.language = language || "en";
|
|
49
|
-
if (languageMap) {
|
|
50
|
-
this.languageMap = languageMap;
|
|
51
|
-
}
|
|
52
|
-
return (0, import_utils.getObjKeyMap)(this.languageMap[this.language]);
|
|
53
|
-
}
|
|
54
|
-
changeLanguage(config) {
|
|
55
|
-
this.language = config.locale || "en";
|
|
56
|
-
}
|
|
57
|
-
t(key, vars, fallbackText) {
|
|
58
|
-
return this.getMessage(this.language, key, vars, fallbackText);
|
|
59
|
-
}
|
|
60
|
-
lang(lang) {
|
|
61
|
-
return {
|
|
62
|
-
t: (key, vars, fallbackText) => this.getMessage(lang, key, vars, fallbackText)
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
constructor() {
|
|
66
|
-
this.language = "en";
|
|
67
|
-
this.languageMap = {};
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
71
|
-
0 && (module.exports = {
|
|
72
|
-
I18n
|
|
73
|
-
});
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var languageDetector_exports = {};
|
|
20
|
-
__export(languageDetector_exports, {
|
|
21
|
-
I18CLILanguageDetector: () => I18CLILanguageDetector,
|
|
22
|
-
getLocaleLanguage: () => getLocaleLanguage
|
|
23
|
-
});
|
|
24
|
-
module.exports = __toCommonJS(languageDetector_exports);
|
|
25
|
-
class I18CLILanguageDetector {
|
|
26
|
-
formatShellLocale(rawLC) {
|
|
27
|
-
if (!rawLC) {
|
|
28
|
-
return "";
|
|
29
|
-
}
|
|
30
|
-
const LCs = rawLC.split(":");
|
|
31
|
-
const LC = LCs[0].split(".")[0].split("_")[0].split("-")[0];
|
|
32
|
-
if (LC === "C") {
|
|
33
|
-
return "";
|
|
34
|
-
}
|
|
35
|
-
return LC;
|
|
36
|
-
}
|
|
37
|
-
detect() {
|
|
38
|
-
var _process_env_LC_ALL, _ref, _ref1, _ref2;
|
|
39
|
-
const shellLocale = (_ref2 = (_ref1 = (_ref = (_process_env_LC_ALL = process.env.LC_ALL) !== null && _process_env_LC_ALL !== void 0 ? _process_env_LC_ALL : process.env.LC_MESSAGES) !== null && _ref !== void 0 ? _ref : process.env.LANG) !== null && _ref1 !== void 0 ? _ref1 : process.env.LANGUAGE) !== null && _ref2 !== void 0 ? _ref2 : Intl.DateTimeFormat().resolvedOptions().locale;
|
|
40
|
-
return this.formatShellLocale(shellLocale);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
function getLocaleLanguage() {
|
|
44
|
-
const detector = new I18CLILanguageDetector();
|
|
45
|
-
return detector.detect();
|
|
46
|
-
}
|
|
47
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
48
|
-
0 && (module.exports = {
|
|
49
|
-
I18CLILanguageDetector,
|
|
50
|
-
getLocaleLanguage
|
|
51
|
-
});
|
package/dist/cjs/utils/index.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var utils_exports = {};
|
|
20
|
-
__export(utils_exports, {
|
|
21
|
-
getObjKeyMap: () => getObjKeyMap
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(utils_exports);
|
|
24
|
-
var import_lodash = require("@modern-js/utils/lodash");
|
|
25
|
-
function getObjKeyMap(obj, prefix = "") {
|
|
26
|
-
const result = {};
|
|
27
|
-
Object.keys(obj).forEach((key) => {
|
|
28
|
-
if ((0, import_lodash.isString)(obj[key])) {
|
|
29
|
-
result[key] = prefix ? `${prefix}.${key}` : key;
|
|
30
|
-
} else if ((0, import_lodash.isObject)(obj[key])) {
|
|
31
|
-
result[key] = getObjKeyMap(obj[key], prefix ? `${prefix}.${key}` : key);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
return result;
|
|
35
|
-
}
|
|
36
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
37
|
-
0 && (module.exports = {
|
|
38
|
-
getObjKeyMap
|
|
39
|
-
});
|
package/dist/esm/index.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
|
|
2
|
-
import { get } from "@modern-js/utils/lodash";
|
|
3
|
-
import { getObjKeyMap } from "./utils";
|
|
4
|
-
var I18n = /* @__PURE__ */ function() {
|
|
5
|
-
"use strict";
|
|
6
|
-
function I18n2() {
|
|
7
|
-
_class_call_check(this, I18n2);
|
|
8
|
-
this.language = "en";
|
|
9
|
-
this.languageMap = {};
|
|
10
|
-
}
|
|
11
|
-
var _proto = I18n2.prototype;
|
|
12
|
-
_proto.format = function format(msg, vars) {
|
|
13
|
-
return msg.replace(/\{(\w+)\}/g, function(_match, capture) {
|
|
14
|
-
return Object.prototype.hasOwnProperty.call(vars, capture) ? vars[capture] : capture;
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
|
-
_proto.getMessage = function getMessage(lang, key, vars, fallbackText) {
|
|
18
|
-
var languages = Object.keys(this.languageMap);
|
|
19
|
-
var resultLang = languages.find(function(l) {
|
|
20
|
-
return l === lang;
|
|
21
|
-
});
|
|
22
|
-
if (!resultLang && languages.length === 0) {
|
|
23
|
-
return fallbackText || key;
|
|
24
|
-
}
|
|
25
|
-
var model = this.languageMap[resultLang || "en"];
|
|
26
|
-
if (!model) {
|
|
27
|
-
return fallbackText || key;
|
|
28
|
-
}
|
|
29
|
-
var message = get(model, key);
|
|
30
|
-
var value = message || fallbackText || key;
|
|
31
|
-
if (typeof value === "string") {
|
|
32
|
-
return this.format(value, vars || {});
|
|
33
|
-
}
|
|
34
|
-
throw new Error("key is not a string");
|
|
35
|
-
};
|
|
36
|
-
_proto.init = function init(language, languageMap) {
|
|
37
|
-
this.language = language || "en";
|
|
38
|
-
if (languageMap) {
|
|
39
|
-
this.languageMap = languageMap;
|
|
40
|
-
}
|
|
41
|
-
return getObjKeyMap(this.languageMap[this.language]);
|
|
42
|
-
};
|
|
43
|
-
_proto.changeLanguage = function changeLanguage(config) {
|
|
44
|
-
this.language = config.locale || "en";
|
|
45
|
-
};
|
|
46
|
-
_proto.t = function t(key, vars, fallbackText) {
|
|
47
|
-
return this.getMessage(this.language, key, vars, fallbackText);
|
|
48
|
-
};
|
|
49
|
-
_proto.lang = function lang(lang) {
|
|
50
|
-
var _this = this;
|
|
51
|
-
return {
|
|
52
|
-
t: function(key, vars, fallbackText) {
|
|
53
|
-
return _this.getMessage(lang, key, vars, fallbackText);
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
};
|
|
57
|
-
return I18n2;
|
|
58
|
-
}();
|
|
59
|
-
export {
|
|
60
|
-
I18n
|
|
61
|
-
};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
|
|
2
|
-
var I18CLILanguageDetector = /* @__PURE__ */ function() {
|
|
3
|
-
"use strict";
|
|
4
|
-
function I18CLILanguageDetector2() {
|
|
5
|
-
_class_call_check(this, I18CLILanguageDetector2);
|
|
6
|
-
}
|
|
7
|
-
var _proto = I18CLILanguageDetector2.prototype;
|
|
8
|
-
_proto.formatShellLocale = function formatShellLocale(rawLC) {
|
|
9
|
-
if (!rawLC) {
|
|
10
|
-
return "";
|
|
11
|
-
}
|
|
12
|
-
var LCs = rawLC.split(":");
|
|
13
|
-
var LC = LCs[0].split(".")[0].split("_")[0].split("-")[0];
|
|
14
|
-
if (LC === "C") {
|
|
15
|
-
return "";
|
|
16
|
-
}
|
|
17
|
-
return LC;
|
|
18
|
-
};
|
|
19
|
-
_proto.detect = function detect() {
|
|
20
|
-
var _process_env_LC_ALL, _ref, _ref1, _ref2;
|
|
21
|
-
var shellLocale = (_ref2 = (_ref1 = (_ref = (_process_env_LC_ALL = process.env.LC_ALL) !== null && _process_env_LC_ALL !== void 0 ? _process_env_LC_ALL : process.env.LC_MESSAGES) !== null && _ref !== void 0 ? _ref : process.env.LANG) !== null && _ref1 !== void 0 ? _ref1 : process.env.LANGUAGE) !== null && _ref2 !== void 0 ? _ref2 : Intl.DateTimeFormat().resolvedOptions().locale;
|
|
22
|
-
return this.formatShellLocale(shellLocale);
|
|
23
|
-
};
|
|
24
|
-
return I18CLILanguageDetector2;
|
|
25
|
-
}();
|
|
26
|
-
function getLocaleLanguage() {
|
|
27
|
-
var detector = new I18CLILanguageDetector();
|
|
28
|
-
return detector.detect();
|
|
29
|
-
}
|
|
30
|
-
export {
|
|
31
|
-
I18CLILanguageDetector,
|
|
32
|
-
getLocaleLanguage
|
|
33
|
-
};
|
package/dist/esm/utils/index.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { isObject, isString } from "@modern-js/utils/lodash";
|
|
2
|
-
function getObjKeyMap(obj) {
|
|
3
|
-
var prefix = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "";
|
|
4
|
-
var result = {};
|
|
5
|
-
Object.keys(obj).forEach(function(key) {
|
|
6
|
-
if (isString(obj[key])) {
|
|
7
|
-
result[key] = prefix ? "".concat(prefix, ".").concat(key) : key;
|
|
8
|
-
} else if (isObject(obj[key])) {
|
|
9
|
-
result[key] = getObjKeyMap(obj[key], prefix ? "".concat(prefix, ".").concat(key) : key);
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
return result;
|
|
13
|
-
}
|
|
14
|
-
export {
|
|
15
|
-
getObjKeyMap
|
|
16
|
-
};
|
package/dist/esm-node/index.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { get } from "@modern-js/utils/lodash";
|
|
2
|
-
import { getObjKeyMap } from "./utils";
|
|
3
|
-
class I18n {
|
|
4
|
-
format(msg, vars) {
|
|
5
|
-
return msg.replace(/\{(\w+)\}/g, (_match, capture) => Object.prototype.hasOwnProperty.call(vars, capture) ? vars[capture] : capture);
|
|
6
|
-
}
|
|
7
|
-
getMessage(lang, key, vars, fallbackText) {
|
|
8
|
-
const languages = Object.keys(this.languageMap);
|
|
9
|
-
const resultLang = languages.find((l) => l === lang);
|
|
10
|
-
if (!resultLang && languages.length === 0) {
|
|
11
|
-
return fallbackText || key;
|
|
12
|
-
}
|
|
13
|
-
const model = this.languageMap[resultLang || "en"];
|
|
14
|
-
if (!model) {
|
|
15
|
-
return fallbackText || key;
|
|
16
|
-
}
|
|
17
|
-
const message = get(model, key);
|
|
18
|
-
const value = message || fallbackText || key;
|
|
19
|
-
if (typeof value === "string") {
|
|
20
|
-
return this.format(value, vars || {});
|
|
21
|
-
}
|
|
22
|
-
throw new Error("key is not a string");
|
|
23
|
-
}
|
|
24
|
-
init(language, languageMap) {
|
|
25
|
-
this.language = language || "en";
|
|
26
|
-
if (languageMap) {
|
|
27
|
-
this.languageMap = languageMap;
|
|
28
|
-
}
|
|
29
|
-
return getObjKeyMap(this.languageMap[this.language]);
|
|
30
|
-
}
|
|
31
|
-
changeLanguage(config) {
|
|
32
|
-
this.language = config.locale || "en";
|
|
33
|
-
}
|
|
34
|
-
t(key, vars, fallbackText) {
|
|
35
|
-
return this.getMessage(this.language, key, vars, fallbackText);
|
|
36
|
-
}
|
|
37
|
-
lang(lang) {
|
|
38
|
-
return {
|
|
39
|
-
t: (key, vars, fallbackText) => this.getMessage(lang, key, vars, fallbackText)
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
constructor() {
|
|
43
|
-
this.language = "en";
|
|
44
|
-
this.languageMap = {};
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
export {
|
|
48
|
-
I18n
|
|
49
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
class I18CLILanguageDetector {
|
|
2
|
-
formatShellLocale(rawLC) {
|
|
3
|
-
if (!rawLC) {
|
|
4
|
-
return "";
|
|
5
|
-
}
|
|
6
|
-
const LCs = rawLC.split(":");
|
|
7
|
-
const LC = LCs[0].split(".")[0].split("_")[0].split("-")[0];
|
|
8
|
-
if (LC === "C") {
|
|
9
|
-
return "";
|
|
10
|
-
}
|
|
11
|
-
return LC;
|
|
12
|
-
}
|
|
13
|
-
detect() {
|
|
14
|
-
var _process_env_LC_ALL, _ref, _ref1, _ref2;
|
|
15
|
-
const shellLocale = (_ref2 = (_ref1 = (_ref = (_process_env_LC_ALL = process.env.LC_ALL) !== null && _process_env_LC_ALL !== void 0 ? _process_env_LC_ALL : process.env.LC_MESSAGES) !== null && _ref !== void 0 ? _ref : process.env.LANG) !== null && _ref1 !== void 0 ? _ref1 : process.env.LANGUAGE) !== null && _ref2 !== void 0 ? _ref2 : Intl.DateTimeFormat().resolvedOptions().locale;
|
|
16
|
-
return this.formatShellLocale(shellLocale);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
function getLocaleLanguage() {
|
|
20
|
-
const detector = new I18CLILanguageDetector();
|
|
21
|
-
return detector.detect();
|
|
22
|
-
}
|
|
23
|
-
export {
|
|
24
|
-
I18CLILanguageDetector,
|
|
25
|
-
getLocaleLanguage
|
|
26
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { isObject, isString } from "@modern-js/utils/lodash";
|
|
2
|
-
function getObjKeyMap(obj, prefix = "") {
|
|
3
|
-
const result = {};
|
|
4
|
-
Object.keys(obj).forEach((key) => {
|
|
5
|
-
if (isString(obj[key])) {
|
|
6
|
-
result[key] = prefix ? `${prefix}.${key}` : key;
|
|
7
|
-
} else if (isObject(obj[key])) {
|
|
8
|
-
result[key] = getObjKeyMap(obj[key], prefix ? `${prefix}.${key}` : key);
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
return result;
|
|
12
|
-
}
|
|
13
|
-
export {
|
|
14
|
-
getObjKeyMap
|
|
15
|
-
};
|
package/dist/types/index.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
type Language = string;
|
|
2
|
-
interface LanguageModel {
|
|
3
|
-
[Key: string]: string | LanguageModel;
|
|
4
|
-
}
|
|
5
|
-
type TFunc = (key: string, vars?: {
|
|
6
|
-
[key: string]: string;
|
|
7
|
-
}, fallbackText?: string) => string;
|
|
8
|
-
type TI18n = {
|
|
9
|
-
t: TFunc;
|
|
10
|
-
changeLanguage: (config: ChangeLanguageConfig) => void;
|
|
11
|
-
lang: (lang: Language) => {
|
|
12
|
-
t: TFunc;
|
|
13
|
-
};
|
|
14
|
-
};
|
|
15
|
-
export interface ChangeLanguageConfig {
|
|
16
|
-
locale?: Language;
|
|
17
|
-
}
|
|
18
|
-
declare class I18n implements TI18n {
|
|
19
|
-
private language;
|
|
20
|
-
private languageMap;
|
|
21
|
-
private format;
|
|
22
|
-
private getMessage;
|
|
23
|
-
init<T extends LanguageModel>(language?: Language, languageMap?: Record<Language, T>): T;
|
|
24
|
-
changeLanguage(config: ChangeLanguageConfig): void;
|
|
25
|
-
t(key: string, vars?: {
|
|
26
|
-
[key: string]: string;
|
|
27
|
-
}, fallbackText?: string): string;
|
|
28
|
-
lang(lang: string): {
|
|
29
|
-
t: (key: string, vars?: {
|
|
30
|
-
[key: string]: string;
|
|
31
|
-
}, fallbackText?: string) => string;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
export { I18n };
|