@geekron/strapi 0.2.7 → 0.2.9
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/admin/index.d.ts +5 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/src/App.d.ts +4 -0
- package/dist/admin/src/App.d.ts.map +1 -0
- package/dist/admin/src/boot/handle-missing-translations.d.ts +2 -0
- package/dist/admin/src/boot/handle-missing-translations.d.ts.map +1 -0
- package/dist/admin/src/boot/index.d.ts +3 -0
- package/dist/admin/src/boot/index.d.ts.map +1 -0
- package/dist/admin/src/boot/remove-links.d.ts +2 -0
- package/dist/admin/src/boot/remove-links.d.ts.map +1 -0
- package/dist/admin/src/bootstrap.d.ts +4 -0
- package/dist/admin/src/bootstrap.d.ts.map +1 -0
- package/dist/admin/src/components/ApiErrorAlert.d.ts +42 -0
- package/dist/admin/src/components/ApiErrorAlert.d.ts.map +1 -0
- package/dist/admin/src/components/DashboardStats.d.ts +30 -0
- package/dist/admin/src/components/DashboardStats.d.ts.map +1 -0
- package/dist/admin/src/components/DataSelector.d.ts +22 -0
- package/dist/admin/src/components/DataSelector.d.ts.map +1 -0
- package/dist/admin/src/components/DataTable.d.ts +24 -0
- package/dist/admin/src/components/DataTable.d.ts.map +1 -0
- package/dist/admin/src/contract.d.ts +2 -0
- package/dist/admin/src/contract.d.ts.map +1 -0
- package/dist/admin/src/fields/ColorPicker.d.ts +9 -0
- package/dist/admin/src/fields/ColorPicker.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/SortableTree.d.ts +13 -0
- package/dist/admin/src/fields/DataNested/SortableTree.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/components/Action.d.ts +11 -0
- package/dist/admin/src/fields/DataNested/components/Action.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/components/Handle.d.ts +3 -0
- package/dist/admin/src/fields/DataNested/components/Handle.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/components/ItemModal.d.ts +11 -0
- package/dist/admin/src/fields/DataNested/components/ItemModal.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/components/Remove.d.ts +3 -0
- package/dist/admin/src/fields/DataNested/components/Remove.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/components/SortableTreeItem.d.ts +8 -0
- package/dist/admin/src/fields/DataNested/components/SortableTreeItem.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/components/TreeItem.d.ts +24 -0
- package/dist/admin/src/fields/DataNested/components/TreeItem.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/components/index.d.ts +9 -0
- package/dist/admin/src/fields/DataNested/components/index.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/constants.d.ts +16 -0
- package/dist/admin/src/fields/DataNested/constants.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/hooks/index.d.ts +4 -0
- package/dist/admin/src/fields/DataNested/hooks/index.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/hooks/useAnnouncements.d.ts +10 -0
- package/dist/admin/src/fields/DataNested/hooks/useAnnouncements.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/hooks/useDragState.d.ts +21 -0
- package/dist/admin/src/fields/DataNested/hooks/useDragState.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/hooks/useTreeItems.d.ts +23 -0
- package/dist/admin/src/fields/DataNested/hooks/useTreeItems.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/icons/AddChildIcon.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/icons/AddChildIcon.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/icons/AddSiblingIcon.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/icons/AddSiblingIcon.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/icons/CollapseIcon.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/icons/CollapseIcon.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/icons/DragHandleIcon.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/icons/DragHandleIcon.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/icons/EditIcon.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/icons/EditIcon.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/icons/RemoveIcon.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/icons/RemoveIcon.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/icons/index.d.ts +7 -0
- package/dist/admin/src/fields/DataNested/icons/index.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/keyboardCoordinates.d.ts +4 -0
- package/dist/admin/src/fields/DataNested/keyboardCoordinates.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/styles/Action.d.ts +5 -0
- package/dist/admin/src/fields/DataNested/styles/Action.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/styles/Collapse.d.ts +8 -0
- package/dist/admin/src/fields/DataNested/styles/Collapse.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/styles/Count.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/styles/Count.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/styles/EmptyItem.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/styles/EmptyItem.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/styles/EmptyText.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/styles/EmptyText.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/styles/Text.d.ts +4 -0
- package/dist/admin/src/fields/DataNested/styles/Text.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/styles/TreeItem.d.ts +4 -0
- package/dist/admin/src/fields/DataNested/styles/TreeItem.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/styles/Wrapper.d.ts +9 -0
- package/dist/admin/src/fields/DataNested/styles/Wrapper.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/styles/index.d.ts +9 -0
- package/dist/admin/src/fields/DataNested/styles/index.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/types.d.ts +27 -0
- package/dist/admin/src/fields/DataNested/types.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/utilities.d.ts +21 -0
- package/dist/admin/src/fields/DataNested/utilities.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/utils/common.d.ts +2 -0
- package/dist/admin/src/fields/DataNested/utils/common.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/utils/index.d.ts +4 -0
- package/dist/admin/src/fields/DataNested/utils/index.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/utils/projection.d.ts +9 -0
- package/dist/admin/src/fields/DataNested/utils/projection.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested/utils/tree.d.ts +15 -0
- package/dist/admin/src/fields/DataNested/utils/tree.d.ts.map +1 -0
- package/dist/admin/src/fields/DataNested.d.ts +3 -0
- package/dist/admin/src/fields/DataNested.d.ts.map +1 -0
- package/dist/admin/src/fields/DataSelect.d.ts +9 -0
- package/dist/admin/src/fields/DataSelect.d.ts.map +1 -0
- package/dist/admin/src/fields/IconPicker.d.ts +9 -0
- package/dist/admin/src/fields/IconPicker.d.ts.map +1 -0
- package/dist/admin/src/fields/SlugInput.d.ts +14 -0
- package/dist/admin/src/fields/SlugInput.d.ts.map +1 -0
- package/dist/admin/src/fields/icons.d.ts +11 -0
- package/dist/admin/src/fields/icons.d.ts.map +1 -0
- package/dist/admin/src/fields/index.d.ts +3 -0
- package/dist/admin/src/fields/index.d.ts.map +1 -0
- package/dist/admin/src/handlers.d.ts +3 -0
- package/dist/admin/src/handlers.d.ts.map +1 -0
- package/dist/admin/src/icons/ColorIcon.d.ts +3 -0
- package/dist/admin/src/icons/ColorIcon.d.ts.map +1 -0
- package/dist/admin/src/icons/DataIcon.d.ts +3 -0
- package/dist/admin/src/icons/DataIcon.d.ts.map +1 -0
- package/dist/admin/src/icons/IconsIcon.d.ts +3 -0
- package/dist/admin/src/icons/IconsIcon.d.ts.map +1 -0
- package/dist/admin/src/icons/NestedIcon.d.ts +3 -0
- package/dist/admin/src/icons/NestedIcon.d.ts.map +1 -0
- package/dist/admin/src/icons/SlugIcon.d.ts +3 -0
- package/dist/admin/src/icons/SlugIcon.d.ts.map +1 -0
- package/dist/admin/src/icons/index.d.ts +6 -0
- package/dist/admin/src/icons/index.d.ts.map +1 -0
- package/dist/admin/src/index.d.ts +5 -0
- package/dist/admin/src/index.d.ts.map +1 -0
- package/dist/admin/src/pages/Dashboard.d.ts +4 -0
- package/dist/admin/src/pages/Dashboard.d.ts.map +1 -0
- package/dist/admin/src/pages/Inquiry.d.ts +4 -0
- package/dist/admin/src/pages/Inquiry.d.ts.map +1 -0
- package/dist/admin/src/pages/InquiryDetail.d.ts +4 -0
- package/dist/admin/src/pages/InquiryDetail.d.ts.map +1 -0
- package/dist/admin/src/pages/Visitor.d.ts +4 -0
- package/dist/admin/src/pages/Visitor.d.ts.map +1 -0
- package/dist/admin/src/register.d.ts +4 -0
- package/dist/admin/src/register.d.ts.map +1 -0
- package/dist/admin/src/utils/getTrad.d.ts +2 -0
- package/dist/admin/src/utils/getTrad.d.ts.map +1 -0
- package/dist/admin/src/utils/index.d.ts +3 -0
- package/dist/admin/src/utils/index.d.ts.map +1 -0
- package/dist/admin/src/utils/toAlphabet.d.ts +6 -0
- package/dist/admin/src/utils/toAlphabet.d.ts.map +1 -0
- package/dist/admin/src/widgets/WelcomeWidget.d.ts +4 -0
- package/dist/admin/src/widgets/WelcomeWidget.d.ts.map +1 -0
- package/dist/admin/src/widgets/index.d.ts +3 -0
- package/dist/admin/src/widgets/index.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +79 -35
- package/dist/i18n/index.mjs +79 -35
- package/dist/i18n/translations/index.d.ts +56 -0
- package/dist/i18n/translations/index.d.ts.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/src/api/common/controllers/common.d.ts +8 -0
- package/dist/server/src/api/common/controllers/common.d.ts.map +1 -0
- package/dist/server/src/api/common/index.d.ts +89 -0
- package/dist/server/src/api/common/index.d.ts.map +1 -0
- package/dist/server/src/api/common/routes/common.d.ts +6 -0
- package/dist/server/src/api/common/routes/common.d.ts.map +1 -0
- package/dist/server/src/api/common/services/common.d.ts +8 -0
- package/dist/server/src/api/common/services/common.d.ts.map +1 -0
- package/dist/server/src/api/index.d.ts +12 -0
- package/dist/server/src/api/index.d.ts.map +1 -0
- package/dist/server/src/api/menu/controllers/menu.d.ts +8 -0
- package/dist/server/src/api/menu/controllers/menu.d.ts.map +1 -0
- package/dist/server/src/api/menu/index.d.ts +48 -0
- package/dist/server/src/api/menu/index.d.ts.map +1 -0
- package/dist/server/src/api/menu/routes/menu.d.ts +6 -0
- package/dist/server/src/api/menu/routes/menu.d.ts.map +1 -0
- package/dist/server/src/api/menu/services/menu.d.ts +8 -0
- package/dist/server/src/api/menu/services/menu.d.ts.map +1 -0
- package/dist/server/src/api/site/controllers/site.d.ts +8 -0
- package/dist/server/src/api/site/controllers/site.d.ts.map +1 -0
- package/dist/server/src/api/site/index.d.ts +106 -0
- package/dist/server/src/api/site/index.d.ts.map +1 -0
- package/dist/server/src/api/site/routes/site.d.ts +6 -0
- package/dist/server/src/api/site/routes/site.d.ts.map +1 -0
- package/dist/server/src/api/site/services/site.d.ts +8 -0
- package/dist/server/src/api/site/services/site.d.ts.map +1 -0
- package/dist/server/src/api/theme/controllers/theme.d.ts +8 -0
- package/dist/server/src/api/theme/controllers/theme.d.ts.map +1 -0
- package/dist/server/src/api/theme/index.d.ts +71 -0
- package/dist/server/src/api/theme/index.d.ts.map +1 -0
- package/dist/server/src/api/theme/routes/theme.d.ts +6 -0
- package/dist/server/src/api/theme/routes/theme.d.ts.map +1 -0
- package/dist/server/src/api/theme/services/theme.d.ts +8 -0
- package/dist/server/src/api/theme/services/theme.d.ts.map +1 -0
- package/dist/server/src/api/translation/controllers/translation.d.ts +8 -0
- package/dist/server/src/api/translation/controllers/translation.d.ts.map +1 -0
- package/dist/server/src/api/translation/index.d.ts +49 -0
- package/dist/server/src/api/translation/index.d.ts.map +1 -0
- package/dist/server/src/api/translation/routes/translation.d.ts +6 -0
- package/dist/server/src/api/translation/routes/translation.d.ts.map +1 -0
- package/dist/server/src/api/translation/services/translation.d.ts +8 -0
- package/dist/server/src/api/translation/services/translation.d.ts.map +1 -0
- package/dist/server/src/bootstrap.d.ts +4 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -0
- package/dist/server/src/components/index.d.ts +12 -0
- package/dist/server/src/components/index.d.ts.map +1 -0
- package/dist/server/src/config/index.d.ts +8 -0
- package/dist/server/src/config/index.d.ts.map +1 -0
- package/dist/server/src/contentTypes/index.d.ts +4 -0
- package/dist/server/src/contentTypes/index.d.ts.map +1 -0
- package/dist/server/src/controllers/fields.d.ts +4 -0
- package/dist/server/src/controllers/fields.d.ts.map +1 -0
- package/dist/server/src/controllers/index.d.ts +4 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -0
- package/dist/server/src/controllers/inquiries.d.ts +4 -0
- package/dist/server/src/controllers/inquiries.d.ts.map +1 -0
- package/dist/server/src/controllers/utils/request.d.ts +66 -0
- package/dist/server/src/controllers/utils/request.d.ts.map +1 -0
- package/dist/server/src/controllers/visitors.d.ts +4 -0
- package/dist/server/src/controllers/visitors.d.ts.map +1 -0
- package/dist/server/src/controllers/website.d.ts +4 -0
- package/dist/server/src/controllers/website.d.ts.map +1 -0
- package/dist/server/src/destroy.d.ts +4 -0
- package/dist/server/src/destroy.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +4 -0
- package/dist/server/src/index.d.ts.map +1 -0
- package/dist/server/src/middlewares/index.d.ts +4 -0
- package/dist/server/src/middlewares/index.d.ts.map +1 -0
- package/dist/server/src/policies/index.d.ts +4 -0
- package/dist/server/src/policies/index.d.ts.map +1 -0
- package/dist/server/src/register.d.ts +4 -0
- package/dist/server/src/register.d.ts.map +1 -0
- package/dist/server/src/routes/index.d.ts +4 -0
- package/dist/server/src/routes/index.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +4 -0
- package/dist/server/src/services/index.d.ts.map +1 -0
- package/i18n/translations/index.ts +230 -50
- package/package.json +21 -9
|
@@ -1,53 +1,233 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 为翻译对象添加前缀
|
|
3
|
+
* @param translations - 原始翻译对象
|
|
4
|
+
* @param prefix - 前缀字符串
|
|
5
|
+
* @returns 添加前缀后的翻译对象
|
|
6
|
+
*/
|
|
7
|
+
const addPrefix = (translations: Record<string, any>, prefix: string): Record<string, any> => {
|
|
8
|
+
return Object.keys(translations).reduce((acc, key) => {
|
|
9
|
+
acc[`${prefix}.${key}`] = translations[key];
|
|
10
|
+
return acc;
|
|
11
|
+
}, {} as Record<string, any>);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 判断文件是否在子目录中
|
|
16
|
+
* @param modulePath - 模块路径
|
|
17
|
+
* @param baseDepth - 基础路径深度(默认为 3,即 ./locale/*.json)
|
|
18
|
+
* @returns 是否为子目录文件
|
|
19
|
+
*/
|
|
20
|
+
const isNestedFile = (modulePath: string, baseDepth = 3): boolean => {
|
|
21
|
+
return modulePath.split('/').length > baseDepth;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 从路径中提取文件名(不含扩展名)
|
|
26
|
+
* @param modulePath - 模块路径
|
|
27
|
+
* @returns 文件名
|
|
28
|
+
*/
|
|
29
|
+
const extractFileName = (modulePath: string): string => {
|
|
30
|
+
const match = modulePath.match(/\/([^/]+)\.json$/);
|
|
31
|
+
return match?.[1] || '';
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 处理单个语言目录下的所有翻译文件
|
|
36
|
+
* @param modules - 导入的模块对象
|
|
37
|
+
* @param locale - 语言代码
|
|
38
|
+
* @param basePath - 基础路径前缀(用于自定义目录)
|
|
39
|
+
* @returns 合并后的翻译对象
|
|
40
|
+
*/
|
|
41
|
+
const processLocaleModules = (
|
|
42
|
+
modules: Record<string, any>,
|
|
43
|
+
locale: string,
|
|
44
|
+
basePath = '.'
|
|
45
|
+
): Record<string, any> => {
|
|
46
|
+
const localePrefix = `${basePath}/${locale}/`;
|
|
47
|
+
|
|
48
|
+
return Object.keys(modules).reduce((acc, modulePath) => {
|
|
49
|
+
// 只处理指定语言目录下的文件
|
|
50
|
+
if (!modulePath.startsWith(localePrefix)) {
|
|
51
|
+
return acc;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const fileName = extractFileName(modulePath);
|
|
55
|
+
if (!fileName) {
|
|
56
|
+
return acc;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const translation = modules[modulePath] as Record<string, any>;
|
|
60
|
+
|
|
61
|
+
// 判断是否为子目录文件,子目录文件添加文件名作为前缀
|
|
62
|
+
if (isNestedFile(modulePath)) {
|
|
63
|
+
return {
|
|
64
|
+
...acc,
|
|
65
|
+
...addPrefix(translation, fileName)
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 根目录文件,直接合并(不添加前缀)
|
|
70
|
+
return {
|
|
71
|
+
...acc,
|
|
72
|
+
...translation
|
|
73
|
+
};
|
|
74
|
+
}, {} as Record<string, any>);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 自动发现翻译目录下的所有语言
|
|
79
|
+
* @param modules - 导入的模块对象
|
|
80
|
+
* @param basePath - 基础路径前缀
|
|
81
|
+
* @returns 语言代码数组
|
|
82
|
+
*/
|
|
83
|
+
const discoverLocales = (modules: Record<string, any>, basePath = '.'): string[] => {
|
|
84
|
+
const locales = new Set<string>();
|
|
85
|
+
const pattern = new RegExp(`^${basePath.replace('.', '\\.')}/([^/]+)/`);
|
|
45
86
|
|
|
46
|
-
|
|
47
|
-
|
|
87
|
+
Object.keys(modules).forEach(modulePath => {
|
|
88
|
+
const match = modulePath.match(pattern);
|
|
89
|
+
if (match?.[1]) {
|
|
90
|
+
locales.add(match[1]);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
return Array.from(locales);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 深度合并翻译对象(后面的值会覆盖前面的值)
|
|
99
|
+
* @param target - 目标对象(基础对象)
|
|
100
|
+
* @param source - 源对象(覆盖对象,优先级更高)
|
|
101
|
+
* @returns 合并后的新对象
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* const base = { a: { b: 1, c: 2 }, d: 3 };
|
|
105
|
+
* const override = { a: { b: 10 }, e: 4 };
|
|
106
|
+
* const result = deepMerge(base, override);
|
|
107
|
+
* // 结果:{ a: { b: 10, c: 2 }, d: 3, e: 4 }
|
|
108
|
+
* // 说明:override.a.b 覆盖了 base.a.b,但 base.a.c 保留
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
const deepMerge = (
|
|
112
|
+
target: Record<string, any>,
|
|
113
|
+
source: Record<string, any>
|
|
114
|
+
): Record<string, any> => {
|
|
115
|
+
// 创建新对象,避免修改原始对象
|
|
116
|
+
const result = { ...target };
|
|
117
|
+
|
|
118
|
+
// 遍历源对象的所有键
|
|
119
|
+
for (const key in source) {
|
|
120
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
121
|
+
const sourceValue = source[key];
|
|
122
|
+
const targetValue = result[key];
|
|
123
|
+
|
|
124
|
+
// 判断是否需要深度合并(两者都是对象且不是数组)
|
|
125
|
+
const shouldDeepMerge =
|
|
126
|
+
typeof sourceValue === 'object' &&
|
|
127
|
+
sourceValue !== null &&
|
|
128
|
+
!Array.isArray(sourceValue) &&
|
|
129
|
+
typeof targetValue === 'object' &&
|
|
130
|
+
targetValue !== null &&
|
|
131
|
+
!Array.isArray(targetValue);
|
|
132
|
+
|
|
133
|
+
if (shouldDeepMerge) {
|
|
134
|
+
// 递归深度合并对象
|
|
135
|
+
result[key] = deepMerge(targetValue, sourceValue);
|
|
136
|
+
} else {
|
|
137
|
+
// 直接覆盖(包括基本类型、数组、null、undefined)
|
|
138
|
+
result[key] = sourceValue;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return result;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* 翻译加载器配置接口
|
|
148
|
+
*/
|
|
149
|
+
interface TranslationsConfig {
|
|
150
|
+
/** 扩展翻译目录配置数组(自定义目录的值会覆盖默认目录的值) */
|
|
151
|
+
extensions?: Array<{
|
|
152
|
+
/** 扩展目录的模块对象(使用 import.meta.glob 导入) */
|
|
153
|
+
modules: Record<string, any>;
|
|
154
|
+
/** 扩展目录的基础路径(用于路径匹配) */
|
|
155
|
+
basePath?: string;
|
|
156
|
+
}>;
|
|
157
|
+
/** 指定要加载的语言列表,如果不指定则自动发现 */
|
|
158
|
+
locales?: string[];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* 创建多语言翻译对象
|
|
163
|
+
* @param config - 翻译加载器配置(可选)
|
|
164
|
+
* @returns 以语言为 key 的翻译对象
|
|
165
|
+
*
|
|
166
|
+
* @description
|
|
167
|
+
* 该方法实现了多目录翻译文件的深度合并机制:
|
|
168
|
+
* 1. 自动加载默认目录 (translations/) 下的 JSON 文件
|
|
169
|
+
* 2. 支持扩展自定义目录,可以添加多个自定义来源
|
|
170
|
+
* 3. 合并顺序:默认目录 → 自定义目录 1 → 自定义目录 2 → ...
|
|
171
|
+
* 4. 覆盖机制:后面的目录会 **深度覆盖**前面目录的值
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```typescript
|
|
175
|
+
* // 基础用法:只加载默认目录
|
|
176
|
+
* const t = translations();
|
|
177
|
+
*
|
|
178
|
+
* // 高级用法:加载默认目录 + 自定义扩展目录(自定义目录会深度覆盖默认目录)
|
|
179
|
+
* const t = translations({
|
|
180
|
+
* extensions: [
|
|
181
|
+
* {
|
|
182
|
+
* modules: import.meta.glob('../custom/ * \/ ** \/ *.json', { eager: true, import: 'default' }),
|
|
183
|
+
* basePath: '../custom'
|
|
184
|
+
* }
|
|
185
|
+
* ]
|
|
186
|
+
* });
|
|
187
|
+
*
|
|
188
|
+
* // 指定语言列表
|
|
189
|
+
* const t = translations({
|
|
190
|
+
* locales: ['en', 'zh-Hans', 'zh-Hant']
|
|
191
|
+
* });
|
|
192
|
+
*
|
|
193
|
+
* // 深度覆盖示例:
|
|
194
|
+
* // 默认目录的 en.json: { common: { hello: "Hello", world: "World" }, home: { title: "Home" } }
|
|
195
|
+
* // 自定义目录的 en.json: { common: { hello: "Hi" }, about: { title: "About" } }
|
|
196
|
+
* // 最终结果: { common: { hello: "Hi", world: "World" }, home: { title: "Home" }, about: { title: "About" } }
|
|
197
|
+
* ```
|
|
198
|
+
*/
|
|
199
|
+
export const translations = (config?: TranslationsConfig): Record<string, Record<string, any>> => {
|
|
200
|
+
const { extensions = [], locales: specifiedLocales } = config || {};
|
|
201
|
+
|
|
202
|
+
// @ts-ignore
|
|
203
|
+
// 自动加载默认翻译目录
|
|
204
|
+
const defaultModules = import.meta.glob('./*/**/*.json', { eager: true, import: 'default' });
|
|
205
|
+
|
|
206
|
+
// 收集所有模块(默认目录在前,自定义目录在后,确保自定义目录覆盖默认目录)
|
|
207
|
+
const allModuleSources = [
|
|
208
|
+
{ modules: defaultModules, basePath: '.' },
|
|
209
|
+
...extensions
|
|
210
|
+
];
|
|
211
|
+
|
|
212
|
+
// 自动发现所有语言或使用指定的语言列表
|
|
213
|
+
const allLocales = specifiedLocales || [
|
|
214
|
+
...new Set(
|
|
215
|
+
allModuleSources.flatMap(({ modules, basePath = '.' }) =>
|
|
216
|
+
discoverLocales(modules, basePath)
|
|
217
|
+
)
|
|
218
|
+
)
|
|
219
|
+
];
|
|
220
|
+
|
|
221
|
+
// 为每个语言构建翻译对象
|
|
222
|
+
return allLocales.reduce((result, locale) => {
|
|
223
|
+
// 合并所有来源的翻译(后面的会覆盖前面的)
|
|
224
|
+
result[locale] = allModuleSources.reduce((acc, {modules, basePath = '.'}) => {
|
|
225
|
+
const localeTranslations = processLocaleModules(modules, locale, basePath);
|
|
226
|
+
return deepMerge(acc, localeTranslations);
|
|
227
|
+
}, {} as Record<string, any>);
|
|
228
|
+
return result;
|
|
229
|
+
}, {} as Record<string, Record<string, any>>);
|
|
48
230
|
};
|
|
49
231
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
'zh-Hans': loadTranslations('zh-Hans'),
|
|
53
|
-
}
|
|
232
|
+
// 默认导出:加载默认翻译目录
|
|
233
|
+
export default translations();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geekron/strapi",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"description": "极客领航网站管理插件",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"author": "Geekron",
|
|
@@ -30,28 +30,40 @@
|
|
|
30
30
|
],
|
|
31
31
|
"exports": {
|
|
32
32
|
"./package.json": "./package.json",
|
|
33
|
+
"./admin": {
|
|
34
|
+
"source": "./admin/src/index.ts",
|
|
35
|
+
"import": "./dist/admin/index.mjs",
|
|
36
|
+
"require": "./dist/admin/index.js",
|
|
37
|
+
"default": "./dist/admin/index.js",
|
|
38
|
+
"types": "./dist/admin/index.d.ts"
|
|
39
|
+
},
|
|
40
|
+
"./server": {
|
|
41
|
+
"source": "./server/src/index.ts",
|
|
42
|
+
"import": "./dist/server/index.mjs",
|
|
43
|
+
"require": "./dist/server/index.js",
|
|
44
|
+
"default": "./dist/server/index.js",
|
|
45
|
+
"types": "./dist/server/index.d.ts"
|
|
46
|
+
},
|
|
33
47
|
"./strapi-admin": {
|
|
34
48
|
"source": "./admin/src/index.ts",
|
|
35
49
|
"import": "./dist/admin/index.mjs",
|
|
36
50
|
"require": "./dist/admin/index.js",
|
|
37
|
-
"default": "./dist/admin/index.js"
|
|
51
|
+
"default": "./dist/admin/index.js",
|
|
52
|
+
"types": "./dist/admin/index.d.ts"
|
|
38
53
|
},
|
|
39
54
|
"./strapi-server": {
|
|
40
55
|
"source": "./server/src/index.ts",
|
|
41
56
|
"import": "./dist/server/index.mjs",
|
|
42
57
|
"require": "./dist/server/index.js",
|
|
43
|
-
"default": "./dist/server/index.js"
|
|
58
|
+
"default": "./dist/server/index.js",
|
|
59
|
+
"types": "./dist/server/index.d.ts"
|
|
44
60
|
},
|
|
45
61
|
"./i18n": {
|
|
46
62
|
"source": "./i18n/index.ts",
|
|
47
63
|
"import": "./dist/i18n/index.mjs",
|
|
48
64
|
"require": "./dist/i18n/index.js",
|
|
49
|
-
"default": "./dist/i18n/index.js"
|
|
50
|
-
|
|
51
|
-
"./i18n/translations": {
|
|
52
|
-
"source": "./i18n/translations/index.ts",
|
|
53
|
-
"import": "./i18n/translations/index.ts",
|
|
54
|
-
"default": "./i18n/translations/index.ts"
|
|
65
|
+
"default": "./dist/i18n/index.js",
|
|
66
|
+
"types": "./dist/i18n/index.d.ts"
|
|
55
67
|
}
|
|
56
68
|
},
|
|
57
69
|
"peerDependencies": {
|