@liujitcn/kratos-admin-system 0.0.19 → 0.0.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.
Files changed (86) hide show
  1. package/README.md +51 -50
  2. package/dist/package/declarations/src/api/system/base_language.d.ts +51 -0
  3. package/dist/package/declarations/src/api/system/base_translation.d.ts +7 -0
  4. package/dist/package/declarations/src/api/system/code_gen_i18n.d.ts +8 -0
  5. package/dist/package/declarations/src/components/DynamicTranslationCell.vue.d.ts +39 -0
  6. package/dist/package/declarations/src/components/DynamicTranslationEditor.vue.d.ts +23 -0
  7. package/dist/package/declarations/src/components/dynamicTranslation.d.ts +44 -0
  8. package/dist/package/declarations/src/rpc/system/admin/v1/base_config.d.ts +5 -0
  9. package/dist/package/declarations/src/rpc/system/admin/v1/base_dict.d.ts +79 -0
  10. package/dist/package/declarations/src/rpc/system/admin/v1/base_language.d.ts +114 -0
  11. package/dist/package/declarations/src/rpc/system/admin/v1/base_menu.d.ts +40 -0
  12. package/dist/package/declarations/src/rpc/system/admin/v1/base_translation.d.ts +102 -0
  13. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen.d.ts +2 -0
  14. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_column.d.ts +7 -0
  15. package/dist/package/declarations/src/rpc/system/admin/v1/code_gen_table.d.ts +13 -0
  16. package/dist/package/declarations/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue.d.ts +23 -0
  17. package/dist/package/declarations/src/views/tool/code-gen/config.d.ts +7 -7
  18. package/dist/package/declarations/src/views/tool/language/index.vue.d.ts +3 -0
  19. package/dist/package/src/api/base/ai_message.ts +7 -12
  20. package/dist/package/src/api/base/sse.ts +3 -1
  21. package/dist/package/src/api/system/base_language.ts +137 -0
  22. package/dist/package/src/api/system/base_translation.ts +22 -0
  23. package/dist/package/src/api/system/code_gen_column.ts +17 -3
  24. package/dist/package/src/api/system/code_gen_i18n.ts +18 -0
  25. package/dist/package/src/api/system/code_gen_table.ts +12 -4
  26. package/dist/package/src/components/DynamicTranslationCell.vue +176 -0
  27. package/dist/package/src/components/DynamicTranslationEditor.vue +166 -0
  28. package/dist/package/src/components/dynamicTranslation.ts +86 -0
  29. package/dist/package/src/locales/README.md +28 -0
  30. package/dist/package/src/locales/en-US.json +929 -0
  31. package/dist/package/src/locales/es-ES.json +928 -0
  32. package/dist/package/src/locales/fr-FR.json +928 -0
  33. package/dist/package/src/locales/ja-JP.json +929 -0
  34. package/dist/package/src/locales/ko-KR.json +928 -0
  35. package/dist/package/src/locales/zh-CN.json +929 -0
  36. package/dist/package/src/locales/zh-TW.json +928 -0
  37. package/dist/package/src/module.ts +19 -1
  38. package/dist/package/src/rpc/system/admin/v1/base_config.ts +5 -0
  39. package/dist/package/src/rpc/system/admin/v1/base_dict.ts +81 -0
  40. package/dist/package/src/rpc/system/admin/v1/base_language.ts +135 -0
  41. package/dist/package/src/rpc/system/admin/v1/base_menu.ts +41 -0
  42. package/dist/package/src/rpc/system/admin/v1/base_translation.ts +117 -0
  43. package/dist/package/src/rpc/system/admin/v1/code_gen.ts +5 -1
  44. package/dist/package/src/rpc/system/admin/v1/code_gen_column.ts +8 -0
  45. package/dist/package/src/rpc/system/admin/v1/code_gen_table.ts +15 -0
  46. package/dist/package/src/views/ai/chat/components/AiMarkdown.vue +1 -6
  47. package/dist/package/src/views/ai/chat/components/ChatPanel.vue +70 -53
  48. package/dist/package/src/views/ai/chat/components/SessionPanel.vue +20 -9
  49. package/dist/package/src/views/ai/chat/components/XSender.vue +36 -23
  50. package/dist/package/src/views/ai/chat/index.vue +55 -39
  51. package/dist/package/src/views/ai/chat/message.ts +18 -17
  52. package/dist/package/src/views/base/api/index.vue +121 -83
  53. package/dist/package/src/views/base/area/index.vue +81 -31
  54. package/dist/package/src/views/base/config/index.vue +272 -78
  55. package/dist/package/src/views/base/dept/index.vue +110 -61
  56. package/dist/package/src/views/base/dict/index.vue +137 -58
  57. package/dist/package/src/views/base/dict/item.vue +147 -61
  58. package/dist/package/src/views/base/job/index.vue +134 -81
  59. package/dist/package/src/views/base/job/log.vue +21 -22
  60. package/dist/package/src/views/base/log/index.vue +68 -46
  61. package/dist/package/src/views/base/menu/index.vue +257 -156
  62. package/dist/package/src/views/base/migration/index.vue +49 -29
  63. package/dist/package/src/views/base/post/index.vue +128 -59
  64. package/dist/package/src/views/base/role/index.vue +145 -78
  65. package/dist/package/src/views/base/tenant/index.vue +132 -63
  66. package/dist/package/src/views/base/user/components/dept-tree.vue +2 -1
  67. package/dist/package/src/views/base/user/index.vue +192 -112
  68. package/dist/package/src/views/profile/components/base.vue +44 -27
  69. package/dist/package/src/views/profile/components/password.vue +43 -27
  70. package/dist/package/src/views/profile/components/security.vue +89 -53
  71. package/dist/package/src/views/profile/index.vue +10 -9
  72. package/dist/package/src/views/tool/api-doc/index.vue +6 -2
  73. package/dist/package/src/views/tool/code-gen/code-preview/index.vue +30 -14
  74. package/dist/package/src/views/tool/code-gen/columns/index.vue +382 -273
  75. package/dist/package/src/views/tool/code-gen/columns/option-copy.ts +1 -6
  76. package/dist/package/src/views/tool/code-gen/components/CodeGenLocaleEditor.vue +118 -0
  77. package/dist/package/src/views/tool/code-gen/components/CodeGenProgressDialog.vue +65 -36
  78. package/dist/package/src/views/tool/code-gen/components/CodePreviewPane.vue +8 -5
  79. package/dist/package/src/views/tool/code-gen/config.ts +114 -77
  80. package/dist/package/src/views/tool/code-gen/preview/data.ts +19 -17
  81. package/dist/package/src/views/tool/code-gen/preview/index.vue +96 -58
  82. package/dist/package/src/views/tool/code-gen/proto/index.vue +110 -62
  83. package/dist/package/src/views/tool/code-gen/table/index.vue +197 -117
  84. package/dist/package/src/views/tool/language/index.vue +256 -0
  85. package/dist/package/src/views/tool/project-doc/index.vue +17 -15
  86. package/package.json +6 -2
@@ -0,0 +1,102 @@
1
+ /** 翻译状态 */
2
+ export declare enum TranslationStatus {
3
+ TRANSLATION_STATUS_UNSPECIFIED = 0,
4
+ TRANSLATION_STATUS_PENDING = 1,
5
+ TRANSLATION_STATUS_MACHINE = 2,
6
+ TRANSLATION_STATUS_REVIEWED = 3
7
+ }
8
+ /** 翻译资源类型 */
9
+ export declare enum TranslationResourceType {
10
+ TRANSLATION_RESOURCE_TYPE_UNSPECIFIED = 0,
11
+ TRANSLATION_RESOURCE_TYPE_MENU = 1,
12
+ TRANSLATION_RESOURCE_TYPE_DICT = 2,
13
+ TRANSLATION_RESOURCE_TYPE_DICT_ITEM = 3,
14
+ TRANSLATION_RESOURCE_TYPE_CONFIG = 4
15
+ }
16
+ /** 系统配置翻译字段 */
17
+ export declare enum BaseConfigTranslationField {
18
+ BASE_CONFIG_TRANSLATION_FIELD_UNSPECIFIED = 0,
19
+ BASE_CONFIG_TRANSLATION_FIELD_NAME = 1,
20
+ BASE_CONFIG_TRANSLATION_FIELD_VALUE = 2
21
+ }
22
+ /** 生成翻译草稿请求 */
23
+ export interface GenerateTranslationDraftRequest {
24
+ /** 资源类型 */
25
+ resource_type: TranslationResourceType;
26
+ /** 已保存资源ID */
27
+ resource_id: number;
28
+ /** 目标语言代码 */
29
+ target_locale: string;
30
+ /** 系统配置翻译字段,配置资源必填 */
31
+ field: BaseConfigTranslationField;
32
+ }
33
+ /** 生成翻译草稿响应 */
34
+ export interface GenerateTranslationDraftResponse {
35
+ /** 资源类型 */
36
+ resource_type: TranslationResourceType;
37
+ /** 资源ID */
38
+ resource_id: number;
39
+ /** 语言区域 */
40
+ locale: string;
41
+ /** 机器翻译草稿 */
42
+ translation: string;
43
+ /** 翻译状态 */
44
+ translation_status: TranslationStatus;
45
+ /** 中文源文SHA-256 */
46
+ source_hash: string;
47
+ /** 机器翻译提供方 */
48
+ translation_provider: string;
49
+ /** 最近机器翻译时间 */
50
+ translated_at: string;
51
+ /** 系统配置翻译字段 */
52
+ field: BaseConfigTranslationField;
53
+ }
54
+ /** 系统配置单语言翻译 */
55
+ export interface BaseConfigTranslation {
56
+ /** 翻译记录ID */
57
+ id: number;
58
+ /** 系统配置ID */
59
+ config_id: number;
60
+ /** 语言区域 */
61
+ locale: string;
62
+ /** 翻译字段:name或value */
63
+ field: BaseConfigTranslationField;
64
+ /** 翻译文本 */
65
+ text: string;
66
+ /** 翻译审核状态 */
67
+ translation_status: TranslationStatus;
68
+ /** 中文源文SHA-256 */
69
+ source_hash: string;
70
+ /** 中文源文是否已变化 */
71
+ source_changed: boolean;
72
+ /** 机器翻译提供方 */
73
+ translation_provider: string;
74
+ /** 最近机器翻译时间 */
75
+ translated_at: string;
76
+ /** 审核人ID */
77
+ reviewed_by: number;
78
+ /** 审核时间 */
79
+ reviewed_at: string;
80
+ /** 创建人ID */
81
+ created_by: number;
82
+ /** 更新人ID */
83
+ updated_by: number;
84
+ /** 创建时间 */
85
+ created_at: string;
86
+ /** 更新时间 */
87
+ updated_at: string;
88
+ /** 删除时间 */
89
+ deleted_at: number;
90
+ }
91
+ /** 代码生成单语言国际化配置 */
92
+ export interface CodeGenLocaleConfig {
93
+ /** 业务或字段描述 */
94
+ comment: string;
95
+ /** 左树描述 */
96
+ left_tree_comment: string;
97
+ }
98
+ /** Admin翻译草稿服务 */
99
+ export interface BaseTranslationService {
100
+ /** 为单个已保存资源生成机器翻译草稿 */
101
+ GenerateTranslationDraft(request: GenerateTranslationDraftRequest): Promise<GenerateTranslationDraftResponse>;
102
+ }
@@ -66,6 +66,8 @@ export interface PreviewCodeGenResponse {
66
66
  files: CodeGenPreviewFile[];
67
67
  /** 本次生效输出路径 */
68
68
  output_paths: CodeGenOutputPaths | undefined;
69
+ /** 正式生成前必须补齐的翻译配置 */
70
+ missing_translations: string[];
69
71
  }
70
72
  /** 启动代码生成任务条件 */
71
73
  export interface StartCodeGenTaskRequest {
@@ -1,4 +1,5 @@
1
1
  import type { Empty } from "../../../google/protobuf/empty";
2
+ import type { CodeGenLocaleConfig } from "./base_translation";
2
3
  /** 代码生成字段配置查询条件 */
3
4
  export interface ListCodeGenColumnRequest {
4
5
  /** 代码生成表配置ID */
@@ -77,6 +78,12 @@ export interface CodeGenColumn {
77
78
  form_config: CodeGenColumnFormConfig | undefined;
78
79
  /** 排序 */
79
80
  sort: number;
81
+ /** 按语言区域索引的字段国际化配置 */
82
+ i18n_config: Map<string, CodeGenLocaleConfig>;
83
+ }
84
+ export interface CodeGenColumn_I18nConfigEntry {
85
+ key: string;
86
+ value: CodeGenLocaleConfig | undefined;
80
87
  }
81
88
  /** 代码生成字段查询条件配置 */
82
89
  export interface CodeGenColumnQueryConfig {
@@ -1,5 +1,6 @@
1
1
  import type { Empty } from "../../../google/protobuf/empty";
2
2
  import type { CodeGenTableStatus } from "../../common/v1/enum";
3
+ import type { CodeGenLocaleConfig } from "./base_translation";
3
4
  /** 代码生成表配置分页查询条件 */
4
5
  export interface PageCodeGenTableRequest {
5
6
  /** 业务表名 */
@@ -65,6 +66,12 @@ export interface CodeGenTableForm {
65
66
  status: CodeGenTableStatus;
66
67
  /** 备注 */
67
68
  remark: string;
69
+ /** 按语言区域索引的表级国际化配置 */
70
+ i18n_config: Map<string, CodeGenLocaleConfig>;
71
+ }
72
+ export interface CodeGenTableForm_I18nConfigEntry {
73
+ key: string;
74
+ value: CodeGenLocaleConfig | undefined;
68
75
  }
69
76
  /** 代码生成表配置创建条件 */
70
77
  export interface CreateCodeGenTableRequest {
@@ -114,6 +121,12 @@ export interface CodeGenTable {
114
121
  updated_at: string;
115
122
  /** 是否可以还原生成结果 */
116
123
  restore_available: boolean;
124
+ /** 按语言区域索引的表级国际化配置 */
125
+ i18n_config: Map<string, CodeGenLocaleConfig>;
126
+ }
127
+ export interface CodeGenTable_I18nConfigEntry {
128
+ key: string;
129
+ value: CodeGenLocaleConfig | undefined;
117
130
  }
118
131
  /** 左树右表页面配置 */
119
132
  export interface CodeGenLeftTreeConfig {
@@ -0,0 +1,23 @@
1
+ import type { CodeGenLocaleConfig } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_translation";
2
+ /** 代码生成多语言编辑器属性。 */
3
+ interface CodeGenLocaleEditorProps {
4
+ /** 按语言区域索引的生成配置。 */
5
+ modelValue: Map<string, CodeGenLocaleConfig>;
6
+ /** 中文业务或字段描述。 */
7
+ sourceComment?: string;
8
+ /** 是否编辑左树标题。 */
9
+ showLeftTreeComment?: boolean;
10
+ /** 中文左树标题。 */
11
+ sourceLeftTreeComment?: string;
12
+ }
13
+ declare const __VLS_export: import("vue").DefineComponent<CodeGenLocaleEditorProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
14
+ "update:modelValue": (value: Map<string, CodeGenLocaleConfig>) => any;
15
+ }, string, import("vue").PublicProps, Readonly<CodeGenLocaleEditorProps> & Readonly<{
16
+ "onUpdate:modelValue"?: ((value: Map<string, CodeGenLocaleConfig>) => any) | undefined;
17
+ }>, {
18
+ sourceComment: string;
19
+ showLeftTreeComment: boolean;
20
+ sourceLeftTreeComment: string;
21
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
22
+ declare const _default: typeof __VLS_export;
23
+ export default _default;
@@ -3,21 +3,21 @@ import type { ProFormOption } from "@liujitcn/kratos-admin-core/components/ProFo
3
3
  import type { CodeGenColumnFormConfig, CodeGenColumnListConfig, CodeGenColumnOptionConfig, CodeGenColumnQueryConfig } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/code_gen_column";
4
4
  import type { CodeGenLeftTreeConfig, CodeGenTableForm } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/code_gen_table";
5
5
  /** 代码生成表配置页面类型选项。 */
6
- export declare const codeGenPageTypeOptions: ProFormOption[];
6
+ export declare function codeGenPageTypeOptions(): ProFormOption[];
7
7
  /** 判断页面类型是否使用树形表格配置。 */
8
8
  export declare function isCodeGenTreePageType(pageType?: string): pageType is "tree" | "tree_lazy";
9
9
  /** 左树数据源类型选项。 */
10
- export declare const codeGenSourceTypeOptions: ProFormOption[];
10
+ export declare function codeGenSourceTypeOptions(): ProFormOption[];
11
11
  /** 查询操作符选项。 */
12
- export declare const codeGenQueryOperatorOptions: ProFormOption[];
12
+ export declare function codeGenQueryOperatorOptions(): ProFormOption[];
13
13
  /** 查询组件选项。 */
14
- export declare const codeGenQueryComponentOptions: ProFormOption[];
14
+ export declare function codeGenQueryComponentOptions(): ProFormOption[];
15
15
  /** 列表展示组件选项。 */
16
- export declare const codeGenListComponentOptions: ProFormOption[];
16
+ export declare function codeGenListComponentOptions(): ProFormOption[];
17
17
  /** 表单录入组件选项,保持与 ProForm 支持类型完整一致。 */
18
- export declare const codeGenFormComponentOptions: ProFormOption[];
18
+ export declare function codeGenFormComponentOptions(): ProFormOption[];
19
19
  /** 代码生成表配置校验规则。 */
20
- export declare const codeGenTableRules: FormRules;
20
+ export declare function codeGenTableRules(): FormRules;
21
21
  /** 创建默认左树右表页面配置。 */
22
22
  export declare function createDefaultCodeGenLeftTreeConfig(): CodeGenLeftTreeConfig;
23
23
  /** 创建代码生成表配置默认表单。 */
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -1,12 +1,6 @@
1
- import service, {
2
- getRequestAccessToken,
3
- handleAuthExpired,
4
- requestBaseURL
5
- } from "@liujitcn/kratos-admin-core/request";
6
- import type {
7
- ListAiMessageRequest,
8
- ListAiMessageResponse
9
- } from "@liujitcn/kratos-admin-system/rpc/base/v1/ai_session";
1
+ import service, { getRequestAccessToken, handleAuthExpired, requestBaseURL } from "@liujitcn/kratos-admin-core/request";
2
+ import { getLocaleRequestHeaders, t } from "@liujitcn/kratos-admin-core";
3
+ import type { ListAiMessageRequest, ListAiMessageResponse } from "@liujitcn/kratos-admin-system/rpc/base/v1/ai_session";
10
4
  import type {
11
5
  AiMessageService,
12
6
  DeleteAiMessageRequest,
@@ -28,7 +22,7 @@ export type AiMessageStreamOptions = {
28
22
 
29
23
  /** 从 direct stream 错误响应中提取后端业务提示。 */
30
24
  async function resolveStreamErrorMessage(response: Response): Promise<string> {
31
- const fallbackMessage = `AI 助手请求失败(${response.status})`;
25
+ const fallbackMessage = t("system.ai.requestFailedWithStatus", { status: response.status });
32
26
  const contentType = response.headers.get("Content-Type") ?? "";
33
27
  if (contentType.includes("application/json")) {
34
28
  try {
@@ -51,7 +45,8 @@ export async function SendAiMessageStream(request: SendAiMessageRequest, options
51
45
  const accessToken = await getRequestAccessToken();
52
46
  const headers: Record<string, string> = {
53
47
  Accept: "text/event-stream",
54
- "Content-Type": "application/json;charset=utf-8"
48
+ "Content-Type": "application/json;charset=utf-8",
49
+ ...getLocaleRequestHeaders()
55
50
  };
56
51
  if (accessToken) headers.Authorization = accessToken;
57
52
 
@@ -65,7 +60,7 @@ export async function SendAiMessageStream(request: SendAiMessageRequest, options
65
60
  // direct stream 不经过 axios 响应拦截器,需要在这里补齐登录失效处理。
66
61
  if (response.status === 401 || response.status === 403) {
67
62
  handleAuthExpired();
68
- throw new Error("登录状态已失效,请重新登录");
63
+ throw new Error(t("core.auth.sessionExpired"));
69
64
  }
70
65
  if (!response.ok) {
71
66
  throw new Error(await resolveStreamErrorMessage(response));
@@ -1,6 +1,7 @@
1
1
  import { EventStreamContentType, fetchEventSource, type EventSourceMessage } from "@microsoft/fetch-event-source";
2
2
  import type { SubscribeSseRequest } from "@liujitcn/kratos-admin-system/rpc/base/v1/sse";
3
3
  import { getRequestAccessToken, handleAuthExpired } from "@liujitcn/kratos-admin-core/request";
4
+ import { getLocaleRequestHeaders } from "@liujitcn/kratos-admin-core";
4
5
 
5
6
  const SSE_URL = "/events";
6
7
 
@@ -105,7 +106,8 @@ export class SseServiceImpl {
105
106
  openWhenHidden: true,
106
107
  headers: {
107
108
  Accept: EventStreamContentType,
108
- Authorization: accessToken
109
+ Authorization: accessToken,
110
+ ...getLocaleRequestHeaders()
109
111
  },
110
112
  async onopen(response) {
111
113
  const contentType = response.headers.get("content-type") ?? "";
@@ -0,0 +1,137 @@
1
+ import service from "@liujitcn/kratos-admin-core/request";
2
+ import { defLanguageService } from "@liujitcn/kratos-admin-core";
3
+ import { readonly, shallowRef } from "vue";
4
+ import {
5
+ type BaseLanguage,
6
+ type BaseLanguageForm,
7
+ type BaseLanguageService,
8
+ type CreateBaseLanguageRequest,
9
+ type DeleteBaseLanguageRequest,
10
+ type GetBaseLanguageRequest,
11
+ type OptionBaseLanguageRequest,
12
+ type OptionBaseLanguageResponse,
13
+ type PageBaseLanguageRequest,
14
+ type PageBaseLanguageResponse,
15
+ type SetBaseLanguageStatusRequest,
16
+ type UpdateBaseLanguageRequest
17
+ } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_language";
18
+ import { Status } from "@liujitcn/kratos-admin-system/rpc/common/v1/enum";
19
+ import type { Empty } from "@liujitcn/kratos-admin-system/rpc/google/protobuf/empty";
20
+
21
+ const BASE_LANGUAGE_URL = "/v1/admin/base/language";
22
+
23
+ /** Admin语言服务。 */
24
+ export class BaseLanguageServiceImpl implements BaseLanguageService {
25
+ /** 查询语言选项。 */
26
+ OptionBaseLanguage(request: OptionBaseLanguageRequest = {}): Promise<OptionBaseLanguageResponse> {
27
+ return service<OptionBaseLanguageRequest, OptionBaseLanguageResponse>({
28
+ url: `${BASE_LANGUAGE_URL}/option`,
29
+ method: "get",
30
+ params: request
31
+ });
32
+ }
33
+
34
+ /** 查询语言分页列表。 */
35
+ PageBaseLanguage(request: PageBaseLanguageRequest): Promise<PageBaseLanguageResponse> {
36
+ return service<PageBaseLanguageRequest, PageBaseLanguageResponse>({
37
+ url: BASE_LANGUAGE_URL,
38
+ method: "get",
39
+ params: request
40
+ });
41
+ }
42
+
43
+ /** 查询语言详情。 */
44
+ GetBaseLanguage(request: GetBaseLanguageRequest): Promise<BaseLanguageForm> {
45
+ return service<GetBaseLanguageRequest, BaseLanguageForm>({
46
+ url: `${BASE_LANGUAGE_URL}/${request.id}`,
47
+ method: "get"
48
+ });
49
+ }
50
+
51
+ /** 创建语言。 */
52
+ CreateBaseLanguage(request: CreateBaseLanguageRequest): Promise<Empty> {
53
+ return service<BaseLanguageForm | undefined, Empty>({
54
+ url: BASE_LANGUAGE_URL,
55
+ method: "post",
56
+ data: request.base_language
57
+ });
58
+ }
59
+
60
+ /** 更新语言。 */
61
+ UpdateBaseLanguage(request: UpdateBaseLanguageRequest): Promise<Empty> {
62
+ return service<BaseLanguageForm | undefined, Empty>({
63
+ url: `${BASE_LANGUAGE_URL}/${request.base_language?.id ?? ""}`,
64
+ method: "put",
65
+ data: request.base_language
66
+ });
67
+ }
68
+
69
+ /** 删除语言。 */
70
+ DeleteBaseLanguage(request: DeleteBaseLanguageRequest): Promise<Empty> {
71
+ return service<DeleteBaseLanguageRequest, Empty>({
72
+ url: `${BASE_LANGUAGE_URL}/${request.id}`,
73
+ method: "delete"
74
+ });
75
+ }
76
+
77
+ /** 设置语言启用状态。 */
78
+ SetBaseLanguageStatus(request: SetBaseLanguageStatusRequest): Promise<Empty> {
79
+ return service<SetBaseLanguageStatusRequest, Empty>({
80
+ url: `${BASE_LANGUAGE_URL}/${request.id}/status`,
81
+ method: "put",
82
+ data: request
83
+ });
84
+ }
85
+ }
86
+
87
+ export const defBaseLanguageService = new BaseLanguageServiceImpl();
88
+
89
+ const enabledBaseLanguages = shallowRef<BaseLanguage[]>([]);
90
+ let enabledBaseLanguagesRequest: Promise<BaseLanguage[]> | undefined;
91
+
92
+ /** 加载启用语言选项并在当前管理端会话内缓存。 */
93
+ export async function loadEnabledBaseLanguages(force = false): Promise<BaseLanguage[]> {
94
+ if (force) {
95
+ enabledBaseLanguagesRequest = undefined;
96
+ }
97
+ if (enabledBaseLanguagesRequest) return enabledBaseLanguagesRequest;
98
+ if (!force && enabledBaseLanguages.value.length) return enabledBaseLanguages.value;
99
+
100
+ enabledBaseLanguagesRequest = defLanguageService
101
+ .GetLanguage({})
102
+ .then(response => {
103
+ const languages = (response.languages ?? []).map(item => ({
104
+ id: 0,
105
+ language_code: item.language_code,
106
+ language_name: item.language_name,
107
+ native_name: item.native_name,
108
+ sort: item.sort,
109
+ is_primary: item.language_code === response.primary_language_code,
110
+ status: Status.ENABLE,
111
+ created_at: "",
112
+ updated_at: ""
113
+ }));
114
+ enabledBaseLanguages.value = languages;
115
+ return languages;
116
+ })
117
+ .finally(() => {
118
+ enabledBaseLanguagesRequest = undefined;
119
+ });
120
+ return enabledBaseLanguagesRequest;
121
+ }
122
+
123
+ /** 返回响应式的启用语言选项。 */
124
+ export function useEnabledBaseLanguages() {
125
+ return { languages: readonly(enabledBaseLanguages) };
126
+ }
127
+
128
+ /** 返回当前缓存的启用语言选项快照。 */
129
+ export function getEnabledBaseLanguages(): BaseLanguage[] {
130
+ return enabledBaseLanguages.value;
131
+ }
132
+
133
+ /** 清除启用语言缓存,使下次使用时重新读取语言管理数据。 */
134
+ export function invalidateEnabledBaseLanguages() {
135
+ enabledBaseLanguages.value = [];
136
+ enabledBaseLanguagesRequest = undefined;
137
+ }
@@ -0,0 +1,22 @@
1
+ import service from "@liujitcn/kratos-admin-core/request";
2
+ import type {
3
+ BaseTranslationService,
4
+ GenerateTranslationDraftRequest,
5
+ GenerateTranslationDraftResponse
6
+ } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_translation";
7
+
8
+ const BASE_TRANSLATION_URL = "/v1/admin/base/translation";
9
+
10
+ /** BaseTranslationServiceImpl Admin 动态翻译草稿服务。 */
11
+ export class BaseTranslationServiceImpl implements BaseTranslationService {
12
+ /** GenerateTranslationDraft 为已保存资源生成机器翻译草稿。 */
13
+ GenerateTranslationDraft(request: GenerateTranslationDraftRequest): Promise<GenerateTranslationDraftResponse> {
14
+ return service<GenerateTranslationDraftRequest, GenerateTranslationDraftResponse>({
15
+ url: `${BASE_TRANSLATION_URL}/draft`,
16
+ method: "post",
17
+ data: request
18
+ });
19
+ }
20
+ }
21
+
22
+ export const defBaseTranslationService = new BaseTranslationServiceImpl();
@@ -8,6 +8,7 @@ import {
8
8
  type SaveCodeGenColumnRequest
9
9
  } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/code_gen_column";
10
10
  import type { Empty } from "@liujitcn/kratos-admin-system/rpc/google/protobuf/empty";
11
+ import { normalizeCodeGenLocaleConfigMap, serializeCodeGenLocaleConfigMap } from "./code_gen_i18n";
11
12
 
12
13
  const CODE_GEN_DATABASE_TABLE_URL = "/v1/admin/code-gen/database/table";
13
14
  const CODE_GEN_TABLE_URL = "/v1/admin/code-gen/table";
@@ -23,11 +24,18 @@ export class CodeGenColumnServiceImpl implements CodeGenColumnService {
23
24
  }
24
25
 
25
26
  /** 查询代码生成字段配置。 */
26
- ListCodeGenColumn(request: ListCodeGenColumnRequest): Promise<ListCodeGenColumnResponse> {
27
- return service<ListCodeGenColumnRequest, ListCodeGenColumnResponse>({
27
+ async ListCodeGenColumn(request: ListCodeGenColumnRequest): Promise<ListCodeGenColumnResponse> {
28
+ const response = await service<ListCodeGenColumnRequest, ListCodeGenColumnResponse>({
28
29
  url: `${CODE_GEN_TABLE_URL}/${request.table_id}/column`,
29
30
  method: "get"
30
31
  });
32
+ return {
33
+ ...response,
34
+ code_gen_columns: (response.code_gen_columns ?? []).map(column => ({
35
+ ...column,
36
+ i18n_config: normalizeCodeGenLocaleConfigMap(column.i18n_config)
37
+ }))
38
+ };
31
39
  }
32
40
 
33
41
  /** 保存代码生成字段配置。 */
@@ -35,7 +43,13 @@ export class CodeGenColumnServiceImpl implements CodeGenColumnService {
35
43
  return service<SaveCodeGenColumnRequest, Empty>({
36
44
  url: `${CODE_GEN_TABLE_URL}/${request.table_id}/column`,
37
45
  method: "put",
38
- data: request
46
+ data: {
47
+ ...request,
48
+ code_gen_columns: request.code_gen_columns.map(column => ({
49
+ ...column,
50
+ i18n_config: serializeCodeGenLocaleConfigMap(column.i18n_config)
51
+ }))
52
+ }
39
53
  });
40
54
  }
41
55
  }
@@ -0,0 +1,18 @@
1
+ import type { CodeGenLocaleConfig } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/base_translation";
2
+
3
+ /** 代码生成国际化配置的 JSON 兼容形态。 */
4
+ type CodeGenLocaleConfigRecord = Record<string, CodeGenLocaleConfig>;
5
+
6
+ /** 将 REST 响应中的 JSON 对象规范为生成 RPC 声明使用的 Map。 */
7
+ export function normalizeCodeGenLocaleConfigMap(value: unknown): Map<string, CodeGenLocaleConfig> {
8
+ if (value instanceof Map) return new Map(value);
9
+ if (!value || typeof value !== "object") return new Map();
10
+ return new Map(Object.entries(value as CodeGenLocaleConfigRecord));
11
+ }
12
+
13
+ /** 将代码生成国际化 Map 转为后端可反序列化的 JSON 对象。 */
14
+ export function serializeCodeGenLocaleConfigMap(value: unknown): CodeGenLocaleConfigRecord {
15
+ if (value instanceof Map) return Object.fromEntries(value);
16
+ if (!value || typeof value !== "object") return {};
17
+ return value as CodeGenLocaleConfigRecord;
18
+ }
@@ -12,6 +12,7 @@ import {
12
12
  type UpdateCodeGenTableRequest
13
13
  } from "@liujitcn/kratos-admin-system/rpc/system/admin/v1/code_gen_table";
14
14
  import type { Empty } from "@liujitcn/kratos-admin-system/rpc/google/protobuf/empty";
15
+ import { normalizeCodeGenLocaleConfigMap, serializeCodeGenLocaleConfigMap } from "./code_gen_i18n";
15
16
 
16
17
  const CODE_GEN_TABLE_URL = "/v1/admin/code-gen/table";
17
18
  const CODE_GEN_DATABASE_TABLE_URL = "/v1/admin/code-gen/database/table";
@@ -37,11 +38,12 @@ export class CodeGenTableServiceImpl implements CodeGenTableService {
37
38
  }
38
39
 
39
40
  /** 查询代码生成表配置。 */
40
- GetCodeGenTable(request: GetCodeGenTableRequest): Promise<CodeGenTableForm> {
41
- return service<GetCodeGenTableRequest, CodeGenTableForm>({
41
+ async GetCodeGenTable(request: GetCodeGenTableRequest): Promise<CodeGenTableForm> {
42
+ const response = await service<GetCodeGenTableRequest, CodeGenTableForm>({
42
43
  url: `${CODE_GEN_TABLE_URL}/${request.id}`,
43
44
  method: "get"
44
45
  });
46
+ return { ...response, i18n_config: normalizeCodeGenLocaleConfigMap(response.i18n_config) };
45
47
  }
46
48
 
47
49
  /** 创建代码生成表配置。 */
@@ -49,7 +51,7 @@ export class CodeGenTableServiceImpl implements CodeGenTableService {
49
51
  return service<CodeGenTableForm | undefined, Empty>({
50
52
  url: CODE_GEN_TABLE_URL,
51
53
  method: "post",
52
- data: request.code_gen_table
54
+ data: serializeCodeGenTableForm(request.code_gen_table)
53
55
  });
54
56
  }
55
57
 
@@ -58,7 +60,7 @@ export class CodeGenTableServiceImpl implements CodeGenTableService {
58
60
  return service<CodeGenTableForm | undefined, Empty>({
59
61
  url: `${CODE_GEN_TABLE_URL}/${request.id}`,
60
62
  method: "put",
61
- data: request.code_gen_table
63
+ data: serializeCodeGenTableForm(request.code_gen_table)
62
64
  });
63
65
  }
64
66
 
@@ -72,3 +74,9 @@ export class CodeGenTableServiceImpl implements CodeGenTableService {
72
74
  }
73
75
 
74
76
  export const defCodeGenTableService = new CodeGenTableServiceImpl();
77
+
78
+ /** 将表配置中的 Map 转为 REST JSON 对象。 */
79
+ function serializeCodeGenTableForm(value?: CodeGenTableForm) {
80
+ if (!value) return value;
81
+ return { ...value, i18n_config: serializeCodeGenLocaleConfigMap(value.i18n_config) };
82
+ }