@umijs/plugins 4.0.0-beta.13 → 4.0.0-beta.17

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.
Files changed (41) hide show
  1. package/README.md +4 -1
  2. package/dist/antd.js +2 -2
  3. package/dist/dva.js +4 -5
  4. package/dist/layout.js +47 -13
  5. package/dist/locale.d.ts +1 -0
  6. package/dist/locale.js +199 -1
  7. package/dist/qiankun/constants.d.ts +5 -0
  8. package/dist/qiankun/constants.js +8 -0
  9. package/dist/qiankun/master.d.ts +6 -0
  10. package/dist/qiankun/master.js +114 -0
  11. package/dist/qiankun/slave.d.ts +3 -0
  12. package/dist/qiankun/slave.js +141 -0
  13. package/dist/qiankun.js +15 -1
  14. package/dist/request.js +297 -1
  15. package/dist/tailwindcss.d.ts +3 -0
  16. package/dist/tailwindcss.js +38 -0
  17. package/dist/unocss.d.ts +3 -0
  18. package/dist/unocss.js +57 -0
  19. package/dist/utils/localeUtils.d.ts +33 -0
  20. package/dist/utils/localeUtils.js +135 -0
  21. package/dist/utils/modelUtils.d.ts +1 -0
  22. package/dist/utils/modelUtils.js +17 -3
  23. package/libs/locale/SelectLang.tpl +478 -0
  24. package/libs/locale/locale.tpl +82 -0
  25. package/libs/locale/localeExports.tpl +271 -0
  26. package/libs/locale/runtime.tpl +33 -0
  27. package/libs/qiankun/master/AntdErrorBoundary.tsx +34 -0
  28. package/libs/qiankun/master/AntdLoader.tsx +15 -0
  29. package/libs/qiankun/master/ErrorBoundary.tsx +7 -0
  30. package/libs/qiankun/master/MicroApp.tsx +262 -0
  31. package/libs/qiankun/master/MicroAppWithMemoHistory.tsx +43 -0
  32. package/libs/qiankun/master/common.ts +133 -0
  33. package/libs/qiankun/master/constants.ts +7 -0
  34. package/libs/qiankun/master/getMicroAppRouteComponent.tsx.tpl +45 -0
  35. package/libs/qiankun/master/masterRuntimePlugin.tsx +130 -0
  36. package/libs/qiankun/master/types.ts +44 -0
  37. package/libs/qiankun/slave/connectMaster.tsx +15 -0
  38. package/libs/qiankun/slave/lifecycles.ts +149 -0
  39. package/libs/qiankun/slave/qiankunModel.ts +19 -0
  40. package/libs/qiankun/slave/slaveRuntimePlugin.ts +21 -0
  41. package/package.json +12 -4
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.isNeedPolyfill = exports.exactLocalePaths = exports.getLocaleList = exports.getAntdLocale = exports.getMomentLocale = void 0;
13
+ const utils_1 = require("@umijs/utils");
14
+ const fs_1 = require("fs");
15
+ const path_1 = require("path");
16
+ /**
17
+ * 获取 moment 包的 locale 名称
18
+ * @param lang 语言
19
+ * @param country 国家
20
+ * @param resolveKey 用来resolve的key,moment 或者 dayjs,为了使 dayjs 可以替换 moment
21
+ */
22
+ const getMomentLocale = (lang, country, resolveKey) => {
23
+ var _a, _b;
24
+ const momentLocation = require
25
+ .resolve(`${resolveKey}/locale/zh-cn`)
26
+ .replace(/zh\-cn\.js$/, '');
27
+ if ((0, fs_1.existsSync)((0, path_1.join)(momentLocation, `${lang}-${(_a = country === null || country === void 0 ? void 0 : country.toLocaleLowerCase) === null || _a === void 0 ? void 0 : _a.call(country)}.js`))) {
28
+ const momentLocale = `${lang}-${(_b = country === null || country === void 0 ? void 0 : country.toLocaleLowerCase) === null || _b === void 0 ? void 0 : _b.call(country)}`;
29
+ return {
30
+ momentLocale,
31
+ };
32
+ }
33
+ if ((0, fs_1.existsSync)((0, path_1.join)(momentLocation, `${lang}.js`))) {
34
+ return {
35
+ momentLocale: lang,
36
+ };
37
+ }
38
+ return { momentLocale: '' };
39
+ };
40
+ exports.getMomentLocale = getMomentLocale;
41
+ const getAntdLocale = (lang, country) => `${lang}_${(country || lang).toLocaleUpperCase()}`;
42
+ exports.getAntdLocale = getAntdLocale;
43
+ /**
44
+ * 有些情况下可能项目包含的locale和antd的不匹配
45
+ * 这个方法用于检测
46
+ * @param localePath
47
+ * @returns
48
+ */
49
+ const modulesHasLocale = (localePath) => {
50
+ try {
51
+ require.resolve(localePath);
52
+ return true;
53
+ }
54
+ catch (error) {
55
+ return false;
56
+ }
57
+ };
58
+ const getLocaleList = (opts) => __awaiter(void 0, void 0, void 0, function* () {
59
+ const { localeFolder, separator = '-', absSrcPath = '', absPagesPath = '', addAntdLocales, resolveKey = 'moment', } = opts;
60
+ const localeFileMath = new RegExp(`^([a-z]{2})${separator}?([A-Z]{2})?\.(js|json|ts)$`);
61
+ const localeFiles = utils_1.glob
62
+ .sync('*.{ts,js,json}', {
63
+ cwd: (0, utils_1.winPath)((0, path_1.join)(absSrcPath, localeFolder)),
64
+ })
65
+ .map((name) => (0, utils_1.winPath)((0, path_1.join)(absSrcPath, localeFolder, name)))
66
+ .concat(utils_1.glob
67
+ .sync(`**/${localeFolder}/*.{ts,js,json}`, {
68
+ cwd: absPagesPath,
69
+ })
70
+ .map((name) => (0, utils_1.winPath)((0, path_1.join)(absPagesPath, name))))
71
+ .filter((p) => localeFileMath.test((0, path_1.basename)(p)) && (0, fs_1.existsSync)(p))
72
+ .map((fullName) => {
73
+ var _a, _b;
74
+ const fileName = (0, path_1.basename)(fullName);
75
+ const fileInfo = (_b = (_a = localeFileMath
76
+ .exec(fileName)) === null || _a === void 0 ? void 0 : _a.slice(1, 3)) === null || _b === void 0 ? void 0 : _b.filter(Boolean);
77
+ return {
78
+ name: (fileInfo || []).join(separator),
79
+ path: fullName,
80
+ };
81
+ });
82
+ const groups = utils_1.lodash.groupBy(localeFiles, 'name');
83
+ const promises = Object.keys(groups).map((name) => __awaiter(void 0, void 0, void 0, function* () {
84
+ const [lang, country = ''] = name.split(separator);
85
+ const { momentLocale } = (0, exports.getMomentLocale)(lang, country, resolveKey);
86
+ const antdLocale = utils_1.lodash
87
+ .uniq(yield addAntdLocales({ lang, country }))
88
+ .filter((localePath) => modulesHasLocale(localePath));
89
+ return {
90
+ lang,
91
+ name,
92
+ // react-intl Function.supportedLocalesOf
93
+ // Uncaught RangeError: Incorrect locale information provided
94
+ locale: name.split(separator).join('-'),
95
+ country,
96
+ antdLocale,
97
+ paths: groups[name].map((item) => (0, utils_1.winPath)(item.path)),
98
+ momentLocale,
99
+ };
100
+ }));
101
+ return Promise.all(promises);
102
+ });
103
+ exports.getLocaleList = getLocaleList;
104
+ const exactLocalePaths = (data) => {
105
+ return utils_1.lodash.flatten(data.map((item) => item.paths));
106
+ };
107
+ exports.exactLocalePaths = exactLocalePaths;
108
+ function isNeedPolyfill(targets = {}) {
109
+ // data come from https://caniuse.com/#search=intl
110
+ // you can find all browsers in https://github.com/browserslist/browserslist#browsers
111
+ const polyfillTargets = {
112
+ ie: 10,
113
+ firefox: 28,
114
+ chrome: 23,
115
+ safari: 9.1,
116
+ opera: 12.1,
117
+ ios: 9.3,
118
+ ios_saf: 9.3,
119
+ operamini: Infinity,
120
+ op_mini: Infinity,
121
+ android: 4.3,
122
+ blackberry: Infinity,
123
+ operamobile: 12.1,
124
+ op_mob: 12.1,
125
+ explorermobil: 10,
126
+ ie_mob: 10,
127
+ ucandroid: Infinity,
128
+ };
129
+ return (Object.keys(targets).find((key) => {
130
+ const lowKey = key.toLocaleLowerCase();
131
+ // @ts-ignore
132
+ return polyfillTargets[lowKey] && polyfillTargets[lowKey] >= targets[key];
133
+ }) !== undefined);
134
+ }
135
+ exports.isNeedPolyfill = isNeedPolyfill;
@@ -11,6 +11,7 @@ export declare class Model {
11
11
  file: string;
12
12
  namespace: string;
13
13
  id: string;
14
+ exportName: string;
14
15
  constructor(file: string, id: number);
15
16
  }
16
17
  export declare class ModelUtils {
@@ -32,9 +32,18 @@ const path_1 = require("path");
32
32
  const astUtils_1 = require("./astUtils");
33
33
  class Model {
34
34
  constructor(file, id) {
35
- this.file = file;
36
- this.namespace = (0, path_1.basename)(file, (0, path_1.extname)(file));
35
+ let namespace;
36
+ let exportName;
37
+ const [_file, meta] = file.split('#');
38
+ if (meta) {
39
+ const metaObj = JSON.parse(meta);
40
+ namespace = metaObj.namespace;
41
+ exportName = metaObj.exportName;
42
+ }
43
+ this.file = _file;
37
44
  this.id = `model_${id}`;
45
+ this.namespace = namespace || (0, path_1.basename)(file, (0, path_1.extname)(file));
46
+ this.exportName = exportName || 'default';
38
47
  }
39
48
  }
40
49
  exports.Model = Model;
@@ -117,7 +126,12 @@ class ModelUtils {
117
126
  const imports = [];
118
127
  const modelProps = [];
119
128
  models.forEach((model) => {
120
- imports.push(`import ${model.id} from '${model.file}';`);
129
+ if (model.exportName !== 'default') {
130
+ imports.push(`import { ${model.exportName} as ${model.id} } from '${model.file}';`);
131
+ }
132
+ else {
133
+ imports.push(`import ${model.id} from '${model.file}';`);
134
+ }
121
135
  modelProps.push(`${model.id}: { namespace: '${model.namespace}', model: ${model.id} },`);
122
136
  });
123
137
  return `
@@ -0,0 +1,478 @@
1
+ import React,{ useState } from 'react';
2
+ {{#Antd}}
3
+ import { Menu, Dropdown } from 'antd';
4
+ import { ClickParam } from 'antd/{{{antdFiles}}}/menu';
5
+ import { DropDownProps } from 'antd/{{{antdFiles}}}/dropdown';
6
+ {{/Antd}}
7
+ import { getLocale, getAllLocales, setLocale } from './localeExports';
8
+
9
+ {{#Antd}}
10
+ export interface HeaderDropdownProps extends DropDownProps {
11
+ overlayClassName?: string;
12
+ placement?:
13
+ | 'bottomLeft'
14
+ | 'bottomRight'
15
+ | 'topLeft'
16
+ | 'topCenter'
17
+ | 'topRight'
18
+ | 'bottomCenter';
19
+ }
20
+
21
+ const HeaderDropdown: React.FC<HeaderDropdownProps> = ({
22
+ overlayClassName: cls,
23
+ ...restProps
24
+ }) => (
25
+ <Dropdown
26
+ overlayClassName={cls}
27
+ {...restProps}
28
+ />
29
+ );
30
+ {{/Antd}}
31
+
32
+ interface LocalData {
33
+ lang: string,
34
+ label?: string,
35
+ icon?: string,
36
+ title?: string,
37
+ }
38
+
39
+ interface SelectLangProps {
40
+ globalIconClassName?: string;
41
+ postLocalesData?: (locales: LocalData[]) => LocalData[];
42
+ onItemClick?: (params: ClickParam) => void;
43
+ className?: string;
44
+ reload?: boolean;
45
+ icon?: React.ReactNode;
46
+ }
47
+
48
+ const transformArrayToObject = (allLangUIConfig:LocalData[])=>{
49
+ return allLangUIConfig.reduce((obj, item) => {
50
+ if(!item.lang){
51
+ return obj;
52
+ }
53
+
54
+ return {
55
+ ...obj,
56
+ [item.lang]: item,
57
+ };
58
+ }, {});
59
+ }
60
+
61
+ const defaultLangUConfigMap = {
62
+ 'ar-EG': {
63
+ lang: 'ar-EG',
64
+ label: 'العربية',
65
+ icon: '🇪🇬',
66
+ title: 'لغة'
67
+ },
68
+ 'az-AZ': {
69
+ lang: 'az-AZ',
70
+ label: 'Azərbaycan dili',
71
+ icon: '🇦🇿',
72
+ title: 'Dil'
73
+ },
74
+ 'bg-BG': {
75
+ lang: 'bg-BG',
76
+ label: 'Български език',
77
+ icon: '🇧🇬',
78
+ title: 'език'
79
+ },
80
+ 'bn-BD': {
81
+ lang: 'bn-BD',
82
+ label: 'বাংলা',
83
+ icon: '🇧🇩',
84
+ title: 'ভাষা'
85
+ },
86
+ 'ca-ES': {
87
+ lang: 'ca-ES',
88
+ label: 'Catalá',
89
+ icon: '🇨🇦',
90
+ title: 'llengua'
91
+ },
92
+ 'cs-CZ': {
93
+ lang: 'cs-CZ',
94
+ label: 'Čeština',
95
+ icon: '🇨🇿',
96
+ title: 'Jazyk'
97
+ },
98
+ 'da-DK': {
99
+ lang: 'da-DK',
100
+ label: 'Dansk',
101
+ icon: '🇩🇰',
102
+ title: 'Sprog'
103
+ },
104
+ 'de-DE': {
105
+ lang: 'de-DE',
106
+ label: 'Deutsch',
107
+ icon: '🇩🇪',
108
+ title: 'Sprache'
109
+ },
110
+ 'el-GR': {
111
+ lang: 'el-GR',
112
+ label: 'Ελληνικά',
113
+ icon: '🇬🇷',
114
+ title: 'Γλώσσα'
115
+ },
116
+ 'en-GB': {
117
+ lang: 'en-GB',
118
+ label: 'English',
119
+ icon: '🇬🇧',
120
+ title: 'Language'
121
+ },
122
+ 'en-US': {
123
+ lang: 'en-US',
124
+ label: 'English',
125
+ icon: '🇺🇸',
126
+ title: 'Language'
127
+ },
128
+ 'es-ES': {
129
+ lang: 'es-ES',
130
+ label: 'Español',
131
+ icon: '🇪🇸',
132
+ title: 'Idioma'
133
+ },
134
+ 'et-EE': {
135
+ lang: 'et-EE',
136
+ label: 'Eesti',
137
+ icon: '🇪🇪',
138
+ title: 'Keel'
139
+ },
140
+ 'fa-IR': {
141
+ lang: 'fa-IR',
142
+ label: 'فارسی',
143
+ icon: '🇮🇷',
144
+ title: 'زبان'
145
+ },
146
+ 'fi-FI': {
147
+ lang: 'fi-FI',
148
+ label: 'Suomi',
149
+ icon: '🇫🇮',
150
+ title: 'Kieli'
151
+ },
152
+ 'fr-BE': {
153
+ lang: 'fr-BE',
154
+ label: 'Français',
155
+ icon: '🇧🇪',
156
+ title: 'Langue'
157
+ },
158
+ 'fr-FR': {
159
+ lang: 'fr-FR',
160
+ label: 'Français',
161
+ icon: '🇫🇷',
162
+ title: 'Langue'
163
+ },
164
+ 'ga-IE': {
165
+ lang: 'ga-IE',
166
+ label: 'Gaeilge',
167
+ icon: '🇮🇪',
168
+ title: 'Teanga'
169
+ },
170
+ 'he-IL': {
171
+ lang: 'he-IL',
172
+ label: 'עברית',
173
+ icon: '🇮🇱',
174
+ title: 'שפה'
175
+ },
176
+ 'hi-IN': {
177
+ lang: 'hi-IN',
178
+ label: 'हिन्दी, हिंदी',
179
+ icon: '🇮🇳',
180
+ title: 'भाषा: हिन्दी'
181
+ },
182
+ 'hr-HR': {
183
+ lang: 'hr-HR',
184
+ label: 'Hrvatski jezik',
185
+ icon: '🇭🇷',
186
+ title: 'Jezik'
187
+ },
188
+ 'hu-HU': {
189
+ lang: 'hu-HU',
190
+ label: 'Magyar',
191
+ icon: '🇭🇺',
192
+ title: 'Nyelv'
193
+ },
194
+ 'hy-AM': {
195
+ lang: 'hu-HU',
196
+ label: 'Հայերեն',
197
+ icon: '🇦🇲',
198
+ title: 'Լեզու'
199
+ },
200
+ 'id-ID': {
201
+ lang: 'id-ID',
202
+ label: 'Bahasa Indonesia',
203
+ icon: '🇮🇩',
204
+ title: 'Bahasa'
205
+ },
206
+ 'it-IT': {
207
+ lang: 'it-IT',
208
+ label: 'Italiano',
209
+ icon: '🇮🇹',
210
+ title: 'Linguaggio'
211
+ },
212
+ 'is-IS': {
213
+ lang: 'is-IS',
214
+ label: 'Íslenska',
215
+ icon: '🇮🇸',
216
+ title: 'Tungumál'
217
+ },
218
+ 'ja-JP': {
219
+ lang: 'ja-JP',
220
+ label: '日本語',
221
+ icon: '🇯🇵',
222
+ title: '言語'
223
+ },
224
+ 'ku-IQ': {
225
+ lang: 'ku-IQ',
226
+ label: 'کوردی',
227
+ icon: '🇮🇶',
228
+ title: 'Ziman'
229
+ },
230
+ 'kn-IN': {
231
+ lang: 'zh-TW',
232
+ label: 'ಕನ್ನಡ',
233
+ icon: '🇮🇳',
234
+ title: 'ಭಾಷೆ'
235
+ },
236
+ 'ko-KR': {
237
+ lang: 'ko-KR',
238
+ label: '한국어',
239
+ icon: '🇰🇷',
240
+ title: '언어'
241
+ },
242
+ 'lv-LV': {
243
+ lang: 'lv-LV',
244
+ label: 'Latviešu valoda',
245
+ icon: '🇱🇮',
246
+ title: 'Kalba'
247
+ },
248
+ 'mk-MK': {
249
+ lang: 'mk-MK',
250
+ label: 'македонски јазик',
251
+ icon: '🇲🇰',
252
+ title: 'Јазик'
253
+ },
254
+ 'mn-MN': {
255
+ lang: 'mn-MN',
256
+ label: 'Монгол хэл',
257
+ icon: '🇲🇳',
258
+ title: 'Хэл'
259
+ },
260
+ 'ms-MY': {
261
+ lang: 'ms-MY',
262
+ label: 'بهاس ملايو‎',
263
+ icon: '🇲🇾',
264
+ title: 'Bahasa'
265
+ },
266
+ 'nb-NO': {
267
+ lang: 'nb-NO',
268
+ label: 'Norsk',
269
+ icon: '🇳🇴',
270
+ title: 'Språk'
271
+ },
272
+ 'ne-NP': {
273
+ lang: 'ne-NP',
274
+ label: 'नेपाली',
275
+ icon: '🇳🇵',
276
+ title: 'भाषा'
277
+ },
278
+ 'nl-BE': {
279
+ lang: 'nl-BE',
280
+ label: 'Vlaams',
281
+ icon: '🇧🇪',
282
+ title: 'Taal'
283
+ },
284
+ 'nl-NL': {
285
+ lang: 'nl-NL',
286
+ label: 'Vlaams',
287
+ icon: '🇳🇱',
288
+ title: 'Taal'
289
+ },
290
+ 'pl-PL': {
291
+ lang: 'pl-PL',
292
+ label: 'Polski',
293
+ icon: '🇵🇱',
294
+ title: 'Język'
295
+ },
296
+ 'pt-BR': {
297
+ lang: 'pt-BR',
298
+ label: 'Português',
299
+ icon: '🇧🇷',
300
+ title: 'Idiomas'
301
+ },
302
+ 'pt-PT': {
303
+ lang: 'pt-PT',
304
+ label: 'Português',
305
+ icon: '🇵🇹',
306
+ title: 'Idiomas'
307
+ },
308
+ 'ro-RO': {
309
+ lang: 'ro-RO',
310
+ label: 'Română',
311
+ icon: '🇷🇴',
312
+ title: 'Limba'
313
+ },
314
+ 'ru-RU': {
315
+ lang: 'ru-RU',
316
+ label: 'Русский',
317
+ icon: '🇷🇺',
318
+ title: 'язык'
319
+ },
320
+ 'sk-SK': {
321
+ lang: 'sk-SK',
322
+ label: 'Slovenčina',
323
+ icon: '🇸🇰',
324
+ title: 'Jazyk'
325
+ },
326
+ 'sr-RS': {
327
+ lang: 'sr-RS',
328
+ label: 'српски језик',
329
+ icon: '🇸🇷',
330
+ title: 'Језик'
331
+ },
332
+ 'sl-SI': {
333
+ lang: 'sl-SI',
334
+ label: 'Slovenščina',
335
+ icon: '🇸🇱',
336
+ title: 'Jezik'
337
+ },
338
+ 'sv-SE': {
339
+ lang: 'sv-SE',
340
+ label: 'Svenska',
341
+ icon: '🇸🇪',
342
+ title: 'Språk'
343
+ },
344
+ 'ta-IN': {
345
+ lang: 'ta-IN',
346
+ label: 'தமிழ்',
347
+ icon: '🇮🇳',
348
+ title: 'மொழி'
349
+ },
350
+ 'th-TH': {
351
+ lang: 'th-TH',
352
+ label: 'ไทย',
353
+ icon: '🇹🇭',
354
+ title: 'ภาษา'
355
+ },
356
+ 'tr-TR': {
357
+ lang: 'tr-TR',
358
+ label: 'Türkçe',
359
+ icon: '🇹🇷',
360
+ title: 'Dil'
361
+ },
362
+ 'uk-UA': {
363
+ lang: 'uk-UA',
364
+ label: 'Українська',
365
+ icon: '🇺🇰',
366
+ title: 'Мова'
367
+ },
368
+ 'vi-VN': {
369
+ lang: 'vi-VN',
370
+ label: 'Tiếng Việt',
371
+ icon: '🇻🇳',
372
+ title: 'Ngôn ngữ'
373
+ },
374
+ 'zh-CN': {
375
+ lang: 'zh-CN',
376
+ label: '简体中文',
377
+ icon: '🇨🇳',
378
+ title: '语言'
379
+ },
380
+ 'zh-TW': {
381
+ lang: 'zh-TW',
382
+ label: '繁體中文',
383
+ icon: '🇭🇰',
384
+ title: '語言'
385
+ }
386
+ };
387
+
388
+ export const SelectLang: React.FC<SelectLangProps> = (props) => {
389
+ {{#ShowSelectLang}}
390
+ const {
391
+ globalIconClassName,
392
+ postLocalesData,
393
+ onItemClick,
394
+ icon,
395
+ style,
396
+ reload,
397
+ ...restProps
398
+ } = props;
399
+ const [selectedLang, setSelectedLang] = useState(() => getLocale());
400
+
401
+ const changeLang = ({ key }: ClickParam): void => {
402
+ setLocale(key, reload);
403
+ setSelectedLang(getLocale())
404
+ };
405
+
406
+
407
+ const defaultLangUConfig = getAllLocales().map(
408
+ (key) =>
409
+ defaultLangUConfigMap[key] || {
410
+ lang: key,
411
+ label: key,
412
+ icon: "🌐",
413
+ title: key,
414
+ }
415
+ );
416
+
417
+ const allLangUIConfig =
418
+ postLocalesData?.(defaultLangUConfig) || defaultLangUConfig;
419
+ const handleClick = onItemClick
420
+ ? (params: ClickParam) => onItemClick(params)
421
+ : changeLang;
422
+
423
+ const menuItemStyle = { minWidth: "160px" };
424
+ const menuItemIconStyle = { marginRight: "8px" };
425
+ const langMenu = (
426
+ <Menu selectedKeys={[selectedLang]} onClick={handleClick}>
427
+ {allLangUIConfig.map((localeObj) => {
428
+ return (
429
+ <Menu.Item key={localeObj.lang || localeObj.key} style={menuItemStyle}>
430
+ <span role="img" aria-label={localeObj?.label || "en-US"} style={menuItemIconStyle}>
431
+ {localeObj?.icon || "🌐"}
432
+ </span>
433
+ {localeObj?.label || "en-US"}
434
+ </Menu.Item>
435
+ );
436
+ })}
437
+ </Menu>
438
+ );
439
+
440
+ const inlineStyle = {
441
+ cursor: "pointer",
442
+ padding: "12px",
443
+ display: "inline-flex",
444
+ alignItems: "center",
445
+ justifyContent: "center",
446
+ fontSize: 18,
447
+ verticalAlign: "middle",
448
+ ...style,
449
+ };
450
+
451
+ return (
452
+ <HeaderDropdown overlay={langMenu} placement="bottomRight" {...restProps}>
453
+ <span className={globalIconClassName} style={inlineStyle}>
454
+ <i className="anticon" title={allLangUIConfig[selectedLang]?.title}>
455
+ { icon ?
456
+ icon : (
457
+ <svg
458
+ viewBox="0 0 24 24"
459
+ focusable="false"
460
+ width="1em"
461
+ height="1em"
462
+ fill="currentColor"
463
+ aria-hidden="true"
464
+ >
465
+ <path d="M0 0h24v24H0z" fill="none" />
466
+ <path
467
+ d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z "
468
+ className="css-c4d79v"
469
+ />
470
+ </svg>
471
+ )}
472
+ </i>
473
+ </span>
474
+ </HeaderDropdown>
475
+ );
476
+ {{/ShowSelectLang}}
477
+ return <></>
478
+ };