From 7b9d097f20def222da25659c3dd6cbff4bdc9614 Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 08:45:07 +0800 Subject: [PATCH 01/10] =?UTF-8?q?chore:=20=E6=8C=89=E7=85=A7=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E7=BF=BB=E8=AF=91=E8=A7=84=E8=8C=83=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=8B=B1=E6=96=87=E6=8F=90=E7=A4=BA=EF=BC=9B=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E9=9B=86=E6=88=90=E5=A4=9A=E8=AF=AD=E5=BD=95?= =?UTF-8?q?=E5=85=A5=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/locale/locales/en.json | 34 +++++++++---------- .../data-grid-component-config-resolver.ts | 32 +++++++++++++++-- .../component-config-resolver/providers.ts | 2 +- 3 files changed, 48 insertions(+), 20 deletions(-) diff --git a/packages/command-services/lib/locale/locales/en.json b/packages/command-services/lib/locale/locales/en.json index 20d66f856d1..b1085e0505b 100644 --- a/packages/command-services/lib/locale/locales/en.json +++ b/packages/command-services/lib/locale/locales/en.json @@ -3,24 +3,24 @@ "no": "No", "confirm": "Confirm", "cancel": "Cancel", - "saveSuccess": "Successfully saved!", + "saveSuccess": "Successfully saved.", "saveFailed": "Save failed!", - "deleteSuccess": "Successfully deleted!", - "deleteFaild": "Failed to delete!", + "deleteSuccess": "Successfully deleted.", + "deleteFaild": "Failed to delete.", "confirmDeletion": "Confirm deletion?", "confirmClosing": "There is unsaved data. Do you want to continue closing?", "confirmCancel": "Exist unsaved change,Confirm to cancel?", "unauthorized": "Your login has expired, please login again.", - "noDataExist": "Data does not exist to access the edit state!", - "pleaseSelectDeleteData": "Please select the data to delete!", - "pleaseSelectParentNode": "Please select parent node!", - "deleteChildFirst": "Please delete the child nodes first!", - "pleaseSelectDetailFormData": "Please select a detail form data first!", - "pleaseSelectEditData": "Please select the data you want to edit!", - "pleaseSelectViewData": "Please select the data you want to view!", + "noDataExist": "Data does not exist to access the edit state.", + "pleaseSelectDeleteData": "Please select the data to delete.", + "pleaseSelectParentNode": "Please select parent node.", + "deleteChildFirst": "Please delete the child nodes first.", + "pleaseSelectDetailFormData": "Please select a detail form data first.", + "pleaseSelectEditData": "Please select the data you want to edit.", + "pleaseSelectViewData": "Please select the data you want to view.", "hasChangeCheckFaild": "An error occurred while checking the page for unsaved changes! Please make sure the data has been saved. Do you want to continue closing?", - "pleaseSelectCopyData": "Please select the data you want to copy!", - "unallowEmptyBizBillId": "Please select the data you want to print!", + "pleaseSelectCopyData": "Please select the data you want to copy.", + "unallowEmptyBizBillId": "Please select the data you want to print.", "required": "Please input '$property'", "maxLength": "'$property' should not longer than $constraint1", "minLength": "'$property' should not shorter than $constraint1 charactor`", @@ -32,10 +32,10 @@ "errorTypeVertifyMessages": "Error", "emptyTypeVertifyMessages": "Empty", "verifyMessageWithRowIndex": "row $constraint1", - "pleaseSelectUpdateRow":"Please select the row where you want to update the attachment!", - "pleaseUploadFirst":"Please upload attachment first!", - "pleaseSelectDownloadAttachment":"Please select the attachment you want to download!", - "noDownloadAttachment":"There are no attachments to download!", + "pleaseSelectUpdateRow":"Please select the row where you want to update the attachment.", + "pleaseUploadFirst":"Please upload attachment first.", + "pleaseSelectDownloadAttachment":"Please select the attachment you want to download.", + "noDownloadAttachment":"There are no attachments to download.", "noAttachment":"There are no attachments to preview.", - "noParentData":"Please select the parent data!" + "noParentData":"Please select the parent data." } \ No newline at end of file diff --git a/packages/renderer/src/component-config-resolver/data-grid-component-config-resolver.ts b/packages/renderer/src/component-config-resolver/data-grid-component-config-resolver.ts index 1ec23c04bb5..806d46622f1 100644 --- a/packages/renderer/src/component-config-resolver/data-grid-component-config-resolver.ts +++ b/packages/renderer/src/component-config-resolver/data-grid-component-config-resolver.ts @@ -4,7 +4,7 @@ import { ConfigResolver } from "../config"; import { isNil } from "lodash-es"; import { TemplateTransformService } from "../template-transformer"; import { ViewModel, ViewModelState } from "@farris/devkit-vue"; -import { GlobalTranslate } from "../i18n"; +import { GlobalTranslate, LanguageListManager } from "../i18n"; export class DataGridComponentConfigResolver extends ComponentConfigResolver { public type: string = 'data-grid'; @@ -14,7 +14,9 @@ export class DataGridComponentConfigResolver extends ComponentConfigResolver { private configResolver: ConfigResolver, private templateTransformService: TemplateTransformService, private viewModel: ViewModel, - private translate: GlobalTranslate, private formMetadataId: string + private translate: GlobalTranslate, + private formMetadataId: string, + private languageListManager: LanguageListManager ) { super(); } @@ -54,9 +56,11 @@ export class DataGridComponentConfigResolver extends ComponentConfigResolver { if (!isNil(visible)) { column.visible = this.configResolver.resolve(visible, id); } + this.resolveLoolupColumn(metadata, column); if (!editor) { return; } + this.resolveLanguageTextboxEditor(editor); const { readonly, required, disabled } = editor; editor.readonly = this.configResolver.resolve(readonly, id); editor.readonlyConfig = readonly; @@ -72,4 +76,28 @@ export class DataGridComponentConfigResolver extends ComponentConfigResolver { } return relatedComponent.id; } + private resolveLanguageTextboxEditor(editor: Record) { + const { type } = editor; + if (type === 'language-textbox') { + const languageList: any[] = []; + const languages = this.languageListManager.getLanguageList() || []; + languageList.push(...languages); + if (!languageList || languageList.length < 1) { + languageList.push(...[{ code: 'en', name: 'English' }, { code: 'zh-CHS', name: '中文简体' }]); + } + editor.languages = languageList; + } + } + private resolveLoolupColumn(viewSchema: Record, column: Record) { + const { editor, dictPicking } = column; + if (!editor || editor.type !== 'lookup') { + return; + } + if (dictPicking) { + const { id } = viewSchema; + const relatedComponent = this.formMetadataService.getRelatedComponent(id); + const viewModel = this.viewModel.getModule().getViewModel(relatedComponent.id); + editor.dictPicking = (payload: any) => (viewModel as any)[dictPicking]({ payload, schema: viewSchema }); + } + } } diff --git a/packages/renderer/src/component-config-resolver/providers.ts b/packages/renderer/src/component-config-resolver/providers.ts index 066cc35a767..5d9107e3714 100644 --- a/packages/renderer/src/component-config-resolver/providers.ts +++ b/packages/renderer/src/component-config-resolver/providers.ts @@ -20,7 +20,7 @@ import { LanguageListManager, GlobalTranslate } from "../i18n"; export const componentConfigResolverProviders: StaticProvider[] = [ { provide: COMPONENT_CONFIG_RESOLVER_TOKEN, useClass: FormGroupComponentConfigResolver, deps: [FormMetadataService, ConfigResolver, LanguageListManager, GlobalTranslate, FORM_METADATA_ID_TOKEN], multi: true }, - { provide: COMPONENT_CONFIG_RESOLVER_TOKEN, useClass: DataGridComponentConfigResolver, deps: [FormMetadataService, ConfigResolver, TemplateTransformService, ViewModel, GlobalTranslate, FORM_METADATA_ID_TOKEN], multi: true }, + { provide: COMPONENT_CONFIG_RESOLVER_TOKEN, useClass: DataGridComponentConfigResolver, deps: [FormMetadataService, ConfigResolver, TemplateTransformService, ViewModel, GlobalTranslate, FORM_METADATA_ID_TOKEN, LanguageListManager], multi: true }, { provide: COMPONENT_CONFIG_RESOLVER_TOKEN, useClass: PageHeaderComponentConfigResolver, deps: [FormMetadataService, ConfigResolver, GlobalTranslate, FORM_METADATA_ID_TOKEN], multi: true }, { provide: COMPONENT_CONFIG_RESOLVER_TOKEN, useClass: TabPageComponentConfigResolver, deps: [FormMetadataService, ConfigResolver, GlobalTranslate, FORM_METADATA_ID_TOKEN], multi: true }, { provide: COMPONENT_CONFIG_RESOLVER_TOKEN, useClass: ResponseToolbarConfigResolver, deps: [FormMetadataService, ConfigResolver, GlobalTranslate, FORM_METADATA_ID_TOKEN], multi: true }, -- Gitee From 5a5ee77a6dd6e848e5b979f655cd45f22490dd6c Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 16:11:01 +0800 Subject: [PATCH 02/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BF=85?= =?UTF-8?q?=E5=A1=AB=E3=80=81=E6=A0=A1=E9=AA=8C=E3=80=81=E5=B8=AE=E5=8A=A9?= =?UTF-8?q?=E5=89=8D=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=9C=AA=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF=E5=9C=BA=E6=99=AF=E4=B8=8B?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E8=BF=90=E8=A1=8C=E6=97=B6=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E6=9C=AA=E6=94=AF=E6=8C=81=E5=A4=9A=E8=AF=AD=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command-services/lib/locale/locale.service.ts | 4 ++-- .../command-services/lib/locale/locales/en.json | 15 +++++++++------ .../lib/locale/locales/zh-CHS.json | 5 ++++- .../lib/locale/locales/zh-CHT.json | 5 ++++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/command-services/lib/locale/locale.service.ts b/packages/command-services/lib/locale/locale.service.ts index 14ef65efc35..aa0828bd258 100644 --- a/packages/command-services/lib/locale/locale.service.ts +++ b/packages/command-services/lib/locale/locale.service.ts @@ -9,12 +9,12 @@ export class LocaleService { public static async setup(config: LocaleConfig) { LocaleService.config = { ...DEFAULT_LOCALE_CONFIG, ...config }; const locale = LocaleService.config.locale; - const uri = `${LocaleService.config.uri}/${locale}.json`; + const uri = `${LocaleService.config.uri}/${locale}.json?version=${new Date().valueOf()}`; try { const resources = await LocaleService.loadResource(uri); LocaleService.localeResources[locale] = resources; } catch (error) { - const uri = `${LocaleService.config.uri}/${DEFAULT_LOCALE}.json`; + const uri = `${LocaleService.config.uri}/${DEFAULT_LOCALE}.json?version=${new Date().valueOf()}`; const resources = await LocaleService.loadResource(uri); LocaleService.localeResources[locale] = resources; } diff --git a/packages/command-services/lib/locale/locales/en.json b/packages/command-services/lib/locale/locales/en.json index b1085e0505b..51a2bb2f2e3 100644 --- a/packages/command-services/lib/locale/locales/en.json +++ b/packages/command-services/lib/locale/locales/en.json @@ -32,10 +32,13 @@ "errorTypeVertifyMessages": "Error", "emptyTypeVertifyMessages": "Empty", "verifyMessageWithRowIndex": "row $constraint1", - "pleaseSelectUpdateRow":"Please select the row where you want to update the attachment.", - "pleaseUploadFirst":"Please upload attachment first.", - "pleaseSelectDownloadAttachment":"Please select the attachment you want to download.", - "noDownloadAttachment":"There are no attachments to download.", - "noAttachment":"There are no attachments to preview.", - "noParentData":"Please select the parent data." + "pleaseSelectUpdateRow": "Please select the row where you want to update the attachment.", + "pleaseUploadFirst": "Please upload attachment first.", + "pleaseSelectDownloadAttachment": "Please select the attachment you want to download.", + "noDownloadAttachment": "There are no attachments to download.", + "noAttachment": "There are no attachments to preview.", + "noParentData": "Please select the parent data.", + "appOrFuncIdRequired": "No menu or application parameters are configured, please configure them in the designer.", + "validate": "'$property' calibration failed", + "dataPicking": "Failed to verify the expression before help" } \ No newline at end of file diff --git a/packages/command-services/lib/locale/locales/zh-CHS.json b/packages/command-services/lib/locale/locales/zh-CHS.json index 4f178def69d..5476841d7c2 100644 --- a/packages/command-services/lib/locale/locales/zh-CHS.json +++ b/packages/command-services/lib/locale/locales/zh-CHS.json @@ -37,5 +37,8 @@ "pleaseSelectDownloadAttachment":"请选择要下载的附件!", "noDownloadAttachment":"找不到要下载的附件!", "noAttachment":"请选择上级数据!", - "noParentData":"请选择上级数据!" + "noParentData":"请选择上级数据!", + "appOrFuncIdRequired":"未配置菜单或应用参数,请在设计器中配置。", + "validate": "'$property'校验不通过", + "dataPicking": "帮助前表达式校验不通过" } \ No newline at end of file diff --git a/packages/command-services/lib/locale/locales/zh-CHT.json b/packages/command-services/lib/locale/locales/zh-CHT.json index 1812c8beb59..8f049c18493 100644 --- a/packages/command-services/lib/locale/locales/zh-CHT.json +++ b/packages/command-services/lib/locale/locales/zh-CHT.json @@ -37,5 +37,8 @@ "pleaseSelectDownloadAttachment":"請選擇要下載的附件!", "noDownloadAttachment":"找不到要下載的附件!", "noAttachment":"沒有可以預覽的附件。", - "noParentData":"請選擇上級數據!" + "noParentData":"請選擇上級數據!", + "appOrFuncIdRequired":"未配置菜單或應用參數,請在設計器中配置。", + "validate": "'$property'校驗不通過", + "dataPicking": "幫助前表達式校驗不通過" } \ No newline at end of file -- Gitee From 827b98308790792332bf05ed800d692dbd2a2527 Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 16:13:12 +0800 Subject: [PATCH 03/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E4=BA=BA=E5=91=98=E6=9C=AA=E9=85=8D=E7=BD=AE=E8=8F=9C?= =?UTF-8?q?=E5=8D=95id=E5=8F=82=E6=95=B0=E6=97=B6=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=99=A8=E6=9C=AA=E5=AF=B9=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E5=A4=9A=E8=AF=AD=E5=A4=84=E7=90=86=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/navigation.service.ts | 25 ++++++++++++++++++- packages/command-services/lib/providers.ts | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/command-services/lib/navigation.service.ts b/packages/command-services/lib/navigation.service.ts index 4d88e3b2ea7..6b5067d54a2 100644 --- a/packages/command-services/lib/navigation.service.ts +++ b/packages/command-services/lib/navigation.service.ts @@ -5,6 +5,8 @@ import { AppType, BuildFrameworkTabIdOptions } from './types'; import lodash from 'lodash'; import { NavigationEventService } from './navigation-event.service'; import { NavigationHistoryService } from './navigation-history.service'; +import { FormNotifyService } from './form-notify.service'; +import { LocaleService } from './locale'; /** * 导航服务 */ @@ -19,7 +21,8 @@ export class NavigationService { private viewModel: ViewModel, private injector: Injector, private navigationEventService: NavigationEventService, - private navigationHistoryService: NavigationHistoryService + private navigationHistoryService: NavigationHistoryService, + private formNotifyService: FormNotifyService ) { } public set context(commandContext: CommandContext) { @@ -46,6 +49,10 @@ export class NavigationService { * @param destructuring 是否解构参数 */ public openMenu(tabId: string, funcId: string, params: any, reload?: boolean, enableRefresh?: any, tabName?: string, destructuring?: any) { + if (!funcId) { + this.formNotifyService.warning(LocaleService.translate('appOrFuncIdRequired')); + return Promise.reject(); + } let queryStringParams = this.buildParamMap(params); destructuring = this.convertToBoolean(destructuring, false); if (destructuring === true) { @@ -82,6 +89,10 @@ export class NavigationService { * @param destructuring 解构参数 */ public openMenu$(tabId: string, funcId: string, params: any, reload?: boolean, enableRefresh?: any, tabName?: string, destructuring?: any) { + if (!funcId) { + this.formNotifyService.warning(LocaleService.translate('appOrFuncIdRequired')); + return Promise.reject(); + } let queryStringParams = this.buildParamMap(params); destructuring = this.convertToBoolean(destructuring, false); if (destructuring === true) { @@ -119,6 +130,10 @@ export class NavigationService { * @param destructuring 解构参数 */ public openMenuWithDimension(tabId: string, funcId: string, params: any, enableRefresh?: any, dim1?: any, dim2?: any, tabName?: string, metadataId?: string, destructuring?: any) { + if (!funcId) { + this.formNotifyService.warning(LocaleService.translate('appOrFuncIdRequired')); + return Promise.reject(); + } if (metadataId === undefined || metadataId === null) { metadataId = ''; } @@ -171,6 +186,10 @@ export class NavigationService { */ public openApp(tabId: string, appId: string, appEntrance: string, params: any, reload?: boolean, tabName?: string, enableRefresh?: any, destructuring?: any) { + if (!appId) { + this.formNotifyService.warning(LocaleService.translate('appOrFuncIdRequired')); + return Promise.reject(); + } let queryStringParams = this.buildParamMap(params); destructuring = this.convertToBoolean(destructuring, false); if (destructuring === true) { @@ -205,6 +224,10 @@ export class NavigationService { * @param destructuring 解构参数 */ public openApp$(tabId: string, appId: string, appEntrance: string, params: any, reload?: boolean, tabName?: string, enableRefresh?: any, destructuring?: any) { + if (!appId) { + this.formNotifyService.warning(LocaleService.translate('appOrFuncIdRequired')); + return Promise.reject(); + } let queryStringParams = this.buildParamMap(params); destructuring = this.convertToBoolean(destructuring, false); if (destructuring === true) { diff --git a/packages/command-services/lib/providers.ts b/packages/command-services/lib/providers.ts index 011ff089a84..f1653cd5209 100644 --- a/packages/command-services/lib/providers.ts +++ b/packages/command-services/lib/providers.ts @@ -119,7 +119,7 @@ const commandServiceProviders: StaticProvider[] = [ { provide: TemplateService, useClass: TemplateService, deps: [ViewModel] }, { provide: PrintService, useClass: PrintService, deps: [CloudPrintService, FormNotifyService] }, // 导航相关服务 - { provide: NavigationService, useClass: NavigationService, deps: [RuntimeFrameworkService, QuerystringService, ViewModel, Injector, NavigationEventService, NavigationHistoryService] }, + { provide: NavigationService, useClass: NavigationService, deps: [RuntimeFrameworkService, QuerystringService, ViewModel, Injector, NavigationEventService, NavigationHistoryService, FormNotifyService] }, // 参数解析服务 { provide: ParamService, useClass: ParamService, deps: [QuerystringService, RuntimeFrameworkService] }, { provide: ApplicationParamService, useClass: ApplicationParamService, deps: [ParamService, RuntimeFrameworkService, ViewModel] }, -- Gitee From 4cca04a69fdd374a195cea3d5aca372cd2c0acf4 Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 16:14:32 +0800 Subject: [PATCH 04/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E7=BB=84=E4=BB=B6=E3=80=81=E5=8D=A1=E7=89=87=E5=86=85?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E7=BB=84=E4=BB=B6=E9=83=A8=E5=88=86=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=BC=BA=E5=B0=91=E5=A4=9A=E8=AF=AD=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transformer/data-grid-i18n-transformer.ts | 15 ++++-- .../form-group-i18n-transformer.ts | 46 ++++++++++++++++++- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/packages/renderer/src/i18n/transformer/data-grid-i18n-transformer.ts b/packages/renderer/src/i18n/transformer/data-grid-i18n-transformer.ts index b22fc8feb0b..7e44157e639 100644 --- a/packages/renderer/src/i18n/transformer/data-grid-i18n-transformer.ts +++ b/packages/renderer/src/i18n/transformer/data-grid-i18n-transformer.ts @@ -16,14 +16,15 @@ export class DataGridI18nTransformer { return; } columns.forEach((column: Record) => { - const { editor, visible, id: columnId, title, dataType, formatter } = column; + const { id: columnId, title } = column; column.title = this.translate.transform(this.formMetadataId, columnId, title); this.resolveEnumColumn(id, column); this.resolveBooleanColumn(id, column); + this.resolveEditorPlaceholder(column); }); } private resolveEnumColumn(schemaId: string, column: Record) { - const { title, dataType, formatter } = column; + const { dataType, formatter } = column; if (dataType === 'enum' && formatter) { // eslint-disable-next-line prefer-destructuring const data: any[] = formatter.data; @@ -35,11 +36,19 @@ export class DataGridI18nTransformer { } } private resolveBooleanColumn(schemaId: string, column: Record) { - const { title, dataType, formatter } = column; + const { dataType, formatter } = column; if (dataType === 'boolean' && formatter) { const { trueText, falseText } = formatter; formatter.trueText = this.translate.transform(this.formMetadataId, `${schemaId}/formatter/trueText`, trueText); formatter.falseText = this.translate.transform(this.formMetadataId, `${schemaId}/formatter/falseText`, falseText); } } + private resolveEditorPlaceholder(column: Record) { + const { editor, id: columnId } = column; + if (!editor) { + return; + } + const { placeholder } = editor; + editor.placeholder = this.translate.transform(this.formMetadataId, `${columnId}/placeholder`, placeholder); + } } diff --git a/packages/renderer/src/i18n/transformer/form-group-i18n-transformer.ts b/packages/renderer/src/i18n/transformer/form-group-i18n-transformer.ts index 980b7592ceb..1fc23fc01f0 100644 --- a/packages/renderer/src/i18n/transformer/form-group-i18n-transformer.ts +++ b/packages/renderer/src/i18n/transformer/form-group-i18n-transformer.ts @@ -3,7 +3,51 @@ import { GlobalTranslate } from "../global-translate"; export class FormGroupI18nTransformer { constructor(private metadata: Record, private translate: GlobalTranslate, private formMetadataId: string) { } public transform() { - const { visible, editor = null, id, label } = this.metadata; + const { editor = null, id, label } = this.metadata; this.metadata.label = this.translate.transform(this.formMetadataId, id, label); + this.resolveEditorPlaceholder(this.metadata); + this.resolveEditorData(this.metadata); + this.resolveValidationMessage(this.metadata); + this.resolveLookupTitle(this.metadata); + } + private resolveEditorData(viewSchema: Record) { + const { editor, id } = viewSchema; + const { data } = editor || {}; + if (!Array.isArray(data) || data.length < 1) { + return; + } + data.forEach((item) => { + const { value, name } = item; + item.name = this.translate.transform(this.formMetadataId, `${id}/editor/data/${value}`, name); + }); + } + private resolveValidationMessage(viewSchema: Record) { + const { editor, id } = viewSchema; + const { formatValidation } = editor || {}; + if (!formatValidation) { + return; + } + const { message } = formatValidation; + formatValidation.message = this.translate.transform(this.formMetadataId, `${id}/formatValidation/message`, message); + } + private resolveEditorPlaceholder(viewSchema: Record) { + const { editor, id } = viewSchema; + if (!editor) { + return; + } + const { placeholder } = editor; + editor.placeholder = this.translate.transform(this.formMetadataId, `${id}/editor/placeholder`, placeholder); + } + private resolveLookupTitle(viewSchema: Record) { + const { editor, id } = viewSchema; + if (!editor) { + return; + } + const { type, dialog } = editor; + if (type !== 'lookup' || !dialog) { + return; + } + const { title } = dialog; + dialog.title = this.translate.transform(this.formMetadataId, `${id}/dialog/title`, title); } } -- Gitee From c2571d79e8e795db9c8f6a95c454d10913135eaf Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 16:15:51 +0800 Subject: [PATCH 05/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E8=A1=A8=E5=8D=95=E5=A4=9A=E8=AF=AD=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E3=80=81=E5=8A=A0=E8=BD=BD=E6=8E=A7=E5=88=B6=E5=99=A8=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E8=B5=84=E6=BA=90=E5=AD=98=E5=9C=A8=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/renderer/src/i18n/resource-loader.ts | 4 ++-- packages/ui-vue/components/locale/src/lib/locale.service.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/renderer/src/i18n/resource-loader.ts b/packages/renderer/src/i18n/resource-loader.ts index 32f1bcdd5ff..21e6eea850e 100644 --- a/packages/renderer/src/i18n/resource-loader.ts +++ b/packages/renderer/src/i18n/resource-loader.ts @@ -31,7 +31,7 @@ export class ResourceLoader { return; } const resourceMetadata = resourceMetadatas.pop(); - const resources: any[] = resourceMetadata.content.StringResources; + const resources: any[] = resourceMetadata?.content?.StringResources; if (!resources) { return; } @@ -52,7 +52,7 @@ export class ResourceLoader { const su = paths[1]; const projectName = paths[3]; const basePath = `/apps/${app}/${su}/web/${projectName}/${code}/i18n`.toLowerCase(); - const path = `${basePath}/${this.languageListManager.getLanguageCode()}.json`; + const path = `${basePath}/${this.languageListManager.getLanguageCode()}.json?version=${new Date().valueOf()}`; return this.httpClient.get(path, {}).then((data: any) => { this.resourceManager.setResourceCache(formMetadataId, data); return data; diff --git a/packages/ui-vue/components/locale/src/lib/locale.service.ts b/packages/ui-vue/components/locale/src/lib/locale.service.ts index 626ddae9a47..fb9f0ce45e4 100644 --- a/packages/ui-vue/components/locale/src/lib/locale.service.ts +++ b/packages/ui-vue/components/locale/src/lib/locale.service.ts @@ -76,7 +76,7 @@ export class LocaleService { const { loadResource } = useResourceLoader(); // 优先加载远程资源 if (LocaleService.config.uri) { - const url = `${LocaleService.config.uri}/${locale}.json`; + const url = `${LocaleService.config.uri}/${locale}.json?version=${new Date().valueOf()}`; resources = await loadResource(url); } // 合并本地资源 -- Gitee From 97db73cc181b53a9b5cd8210c77762d4e714fbe2 Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 16:16:35 +0800 Subject: [PATCH 06/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E5=A4=84=E7=90=86=E6=97=B6=E6=97=A0=E6=B3=95=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=BD=93=E5=89=8D=E8=AF=AD=E8=A8=80=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E9=A1=B9=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/devkit/lib/expression/expression-registry.ts | 9 +++++++-- packages/devkit/lib/expression/providers.ts | 2 +- packages/renderer/src/app.vue | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/devkit/lib/expression/expression-registry.ts b/packages/devkit/lib/expression/expression-registry.ts index f729dcf71a7..4aec4402831 100644 --- a/packages/devkit/lib/expression/expression-registry.ts +++ b/packages/devkit/lib/expression/expression-registry.ts @@ -1,9 +1,13 @@ +import { Injector, Translate, TRANSLATE_TOKEN } from "../common"; +import { Locale } from "../i18n"; import { ViewModel, ViewModelState } from "../viewmodel/index"; import { DEFAULT_EXPRESSION_VALIDATE_MESSAGE, ExpressionConfig, ExpressionObject, ExpressionRule, ExpressionType } from "./types"; export class ExpressionRegistry { private expressionObjects: ExpressionObject[] | null = null; - constructor(private expressionConfigs: ExpressionConfig[], private viewModel: ViewModel) { + private translate: Translate; + constructor(private expressionConfigs: ExpressionConfig[], private viewModel: ViewModel, private injector: Injector) { + this.translate = this.injector.get(TRANSLATE_TOKEN); } public get expressions(): ExpressionObject[] { const expressions: ExpressionConfig[] = this.expressionConfigs; @@ -54,6 +58,7 @@ export class ExpressionRegistry { if (!(expressionType === ExpressionType.Validate || expressionType === ExpressionType.Required || expressionType === ExpressionType.DataPicking)) { return null; } - return DEFAULT_EXPRESSION_VALIDATE_MESSAGE['zh-CHS'][expressionType]; + const localeId = Locale.getLocaleId(); + return this.translate.transform(expressionType, DEFAULT_EXPRESSION_VALIDATE_MESSAGE[localeId][expressionType]); } } diff --git a/packages/devkit/lib/expression/providers.ts b/packages/devkit/lib/expression/providers.ts index d8c1ee58b90..7015b7e0f7f 100644 --- a/packages/devkit/lib/expression/providers.ts +++ b/packages/devkit/lib/expression/providers.ts @@ -16,6 +16,6 @@ export const expressionProviders: StaticProvider[] = [ { provide: ExpressionEventEmitter, useClass: ExpressionEventEmitter, deps: [ChangeObserverRegistry] }, { provide: ExpressionEngineProxy, useClass: ExpressionEngineProxy, deps: [CHANGE_HANDLERS_TOKEN, ExpressionEventEmitter, ExpressionRegistry, ExpressionDependencyResolverRegistry, ExpressionDependencyResolver, ExpressionExecutor, ExpressionResult, forwardRef(() => ViewModel)] }, { provide: ExpressionExecutor, useClass: ExpressionExecutor, deps: [] }, - { provide: ExpressionRegistry, useClass: ExpressionRegistry, deps: [EXPRESSIONS_TOKEN, forwardRef(() => ViewModel)] }, + { provide: ExpressionRegistry, useClass: ExpressionRegistry, deps: [EXPRESSIONS_TOKEN, forwardRef(() => ViewModel), Injector] }, { provide: ExpressionEvaluator, useClass: ExpressionEvaluator, deps: [forwardRef(() => ViewModel), ExpressionExecutor, ExpressionRegistry] } ]; diff --git a/packages/renderer/src/app.vue b/packages/renderer/src/app.vue index fe4ecc7b947..67f7cadd192 100644 --- a/packages/renderer/src/app.vue +++ b/packages/renderer/src/app.vue @@ -28,7 +28,7 @@ function resolveQuery(query: LocationQuery) { router.beforeResolve(async (to: RouteLocationNormalizedGeneric) => { const router = to.name; const localeQuery = devkitInjector.get(LocaleQuery, undefined); - LocaleService.setup({ locale: localeQuery.locale }); + await LocaleService.setup({ locale: localeQuery.locale }); const metadataLoader = devkitInjector.get(MetadataLoader, undefined); const languageListLoader = devkitInjector.get(LanguageListLoader); const resourceLoader = devkitInjector.get(ResourceLoader); -- Gitee From b20256dee0dfd1a6b7c800c9410f222711a835c2 Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 16:17:33 +0800 Subject: [PATCH 07/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=99=A8=E5=BD=93=E5=89=8D=E8=AF=AD=E8=A8=80=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E9=97=AE=E9=A2=98=20fix:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE=E6=97=B6=E5=A4=9A=E8=AF=AD?= =?UTF-8?q?=E5=BD=95=E5=85=A5=E7=BB=84=E4=BB=B6=E5=80=BC=E6=9C=AA=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devkit/lib/store/entity-store/entity-data-loader.ts | 6 +----- packages/renderer/src/main.ts | 7 +++++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/devkit/lib/store/entity-store/entity-data-loader.ts b/packages/devkit/lib/store/entity-store/entity-data-loader.ts index 292e6694750..1701159e600 100644 --- a/packages/devkit/lib/store/entity-store/entity-data-loader.ts +++ b/packages/devkit/lib/store/entity-store/entity-data-loader.ts @@ -45,11 +45,7 @@ class EntityDataLoader { const multiLanguage = fieldSchema.multiLanguage; const dataField = multiLanguage ? `${fieldSchema.name}_MULTILANGUAGE` : fieldSchema.name; const propName = fieldSchema.name; - if (multiLanguage) { - entity[propName] = entityData[dataField] || {}; - } else { - entity[propName] = entityData[dataField]; - } + entity[propName] = entityData[dataField]; }); } diff --git a/packages/renderer/src/main.ts b/packages/renderer/src/main.ts index 92b4b5ba280..47a1e9b9fe7 100644 --- a/packages/renderer/src/main.ts +++ b/packages/renderer/src/main.ts @@ -8,20 +8,23 @@ import router from './router'; import App from './app.vue'; import { i18nProviders } from './i18n'; +const localeId = localStorage.getItem('languageCode') || 'zh-CHS'; + const devkit = createDevkit({ providers: [ ...commandServiceDevkitProviders, ...metadataProviders, ...communicationProviders, ...i18nProviders - ] + ], + localeId }); const app = createApp(App); app.use(router); app.use(devkit); app.use(FarrisVue, { - locale: localStorage.getItem('languageCode') || 'zh-CHS', + locale: localeId, uri: '/platform/common/web/@farris/i18n/ui' }); app.mount('#app'); -- Gitee From 6886b0b7eff0b9b60b7c8162c8802cb11473d4c6 Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 17:58:09 +0800 Subject: [PATCH 08/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=9A?= =?UTF-8?q?=E8=AF=AD=E5=BD=95=E5=85=A5=E5=BF=85=E5=A1=AB=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/devkit/lib/store/form/validation/types.ts | 1 + .../form/validation/validators/required-validator.ts | 2 +- .../form/validation/validators/validator-util.ts | 12 +++++++++--- .../form-group-required-effector.ts | 5 +++-- .../config-builders/form/validation-rule-creator.ts | 4 ++-- .../expression-required-effector.ts | 4 ++++ .../renderer/src/validator/expression-validator.ts | 9 +++++++-- packages/renderer/src/validator/providers.ts | 2 +- .../src/validator/response-required-validator.ts | 5 +++-- 9 files changed, 31 insertions(+), 13 deletions(-) diff --git a/packages/devkit/lib/store/form/validation/types.ts b/packages/devkit/lib/store/form/validation/types.ts index 5de3c04ff27..f989651567c 100644 --- a/packages/devkit/lib/store/form/validation/types.ts +++ b/packages/devkit/lib/store/form/validation/types.ts @@ -5,6 +5,7 @@ interface ValidationRule { name: string; message?: string; + multiLanguage?: boolean; [key: string]: any; } diff --git a/packages/devkit/lib/store/form/validation/validators/required-validator.ts b/packages/devkit/lib/store/form/validation/validators/required-validator.ts index 3f3c4b4524e..0490b0de66e 100644 --- a/packages/devkit/lib/store/form/validation/validators/required-validator.ts +++ b/packages/devkit/lib/store/form/validation/validators/required-validator.ts @@ -20,7 +20,7 @@ class RequiredValidator extends BaseValidator { return null; } - if (ValidatorUtil.isEmptyInput(value)) { + if (ValidatorUtil.isEmptyInput(value, rule.multiLanguage)) { const name = rule.name; const message = rule.message || '输入的值不能为空'; const error = { name, message, actualValue: value }; diff --git a/packages/devkit/lib/store/form/validation/validators/validator-util.ts b/packages/devkit/lib/store/form/validation/validators/validator-util.ts index 4f18568ba64..3b2f19d10ae 100644 --- a/packages/devkit/lib/store/form/validation/validators/validator-util.ts +++ b/packages/devkit/lib/store/form/validation/validators/validator-util.ts @@ -1,3 +1,4 @@ +import { Locale } from "../../../../i18n"; /** * 验证器工具类 @@ -14,11 +15,16 @@ class ValidatorUtil { /** * 是否为空输入 */ - public static isEmptyInput(value: any): boolean { + public static isEmptyInput(value: any, multiLanguage = false): boolean { if (value === null || value === undefined || value === '') { return true; } - + if (multiLanguage && typeof value === 'object') { + const currentLanguageValue = value[Locale.getLocaleId()]; + if (currentLanguageValue === null || currentLanguageValue === undefined || currentLanguageValue === '') { + return true; + } + } return false; } @@ -29,7 +35,7 @@ class ValidatorUtil { // 排除不是字符串、数字、布尔的值 if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean') { - return false + return false; } // 排除NaN diff --git a/packages/renderer/src/component-effectors/form-group-required-effector.ts b/packages/renderer/src/component-effectors/form-group-required-effector.ts index c5954934934..428fc18faaa 100644 --- a/packages/renderer/src/component-effectors/form-group-required-effector.ts +++ b/packages/renderer/src/component-effectors/form-group-required-effector.ts @@ -105,11 +105,12 @@ export class FormGroupRequiredEffector { const { name: controlId, validationRules } = controlConfig; const rules = validationRules.filter((rule: any) => rule.name !== 'required'); - const { required } = viewSchema.editor; + const { required, type } = viewSchema.editor; const isRequired = this.configResolver.resolve(required, viewSchema.id); if (isRequired) { - rules.push({ name: 'required', message: this.buildRequiredMessage(controlConfig) }); + const multiLanguage = type === 'language-textbox'; + rules.push({ name: 'required', message: this.buildRequiredMessage(controlConfig), multiLanguage }); } viewModel.formStore!.setControlRules(controlId, rules); diff --git a/packages/renderer/src/config-builders/form/validation-rule-creator.ts b/packages/renderer/src/config-builders/form/validation-rule-creator.ts index e13d2bfb452..6758912aed9 100644 --- a/packages/renderer/src/config-builders/form/validation-rule-creator.ts +++ b/packages/renderer/src/config-builders/form/validation-rule-creator.ts @@ -37,7 +37,7 @@ class ValidationRuleCreator { * 必填 */ public required(controlNode: any): RequiredValidationRule | undefined { - const { required } = controlNode.editor; + const { required, type } = controlNode.editor; if (!this.isValidValue(required)) { return; } @@ -49,7 +49,7 @@ class ValidationRuleCreator { const displayName = this.getDisplayName(controlNode); const originalMessage = LocaleService.translate('required'); const message = originalMessage.replace(/\$property/g, displayName); - return { name: 'required', message }; + return { name: 'required', message, multiLanguage: 'language-textbox' === type }; } /** diff --git a/packages/renderer/src/expression-effectors/expression-required-effector.ts b/packages/renderer/src/expression-effectors/expression-required-effector.ts index 9cca4b4569f..2742f2f4720 100644 --- a/packages/renderer/src/expression-effectors/expression-required-effector.ts +++ b/packages/renderer/src/expression-effectors/expression-required-effector.ts @@ -2,6 +2,7 @@ import { EffectOption, Effector, ENTITY_TEMPLATE, ExpressionObject, FormControlC import { ComponentConfigRegistry } from "../config"; import { FormMetadataService } from "../service"; import { compile, createVNode } from "vue"; +import { FieldResolver } from "../resolvers"; export class ExpressionRequiredEffector implements Effector { constructor( @@ -141,11 +142,14 @@ export class ExpressionRequiredEffector implements Effector { return propertyName && message && message.replace(/\$property/g, propertyName) || undefined; } private buildValidationRules(result: boolean, validationRules: ValidationRule[], expressionObject: ExpressionObject, controlConfig?: FormControlConfig | null): ValidationRule[] { + const entitySchema = this.formMetadataService.getEntity(); + const resolvedField = FieldResolver.resolve(entitySchema, expressionObject.fieldId); validationRules = validationRules.filter((rule) => rule.name !== 'required'); if (result === true) { validationRules?.splice(0, 0, { name: 'required', message: this.formatMessage(expressionObject.message, controlConfig?.displayName) || undefined, + multiLanguage: resolvedField?.multiLanguage }); } return validationRules; diff --git a/packages/renderer/src/validator/expression-validator.ts b/packages/renderer/src/validator/expression-validator.ts index a48afc8c226..9d5b4884757 100644 --- a/packages/renderer/src/validator/expression-validator.ts +++ b/packages/renderer/src/validator/expression-validator.ts @@ -1,7 +1,9 @@ import { Entity, ExpressionBindingType, ExpressionEvaluator, ExpressionObject, ExpressionRegistry, ExpressionType, FormControlConfig, ValidationRule, FormValidator, ViewModel, ViewModelState } from "@farris/devkit-vue"; +import { FieldResolver } from "../resolvers"; +import { FormMetadataService } from "../service"; -export class ExpressionValidator implements FormValidator{ - constructor(private viewModel: ViewModel){} +export class ExpressionValidator implements FormValidator { + constructor(private viewModel: ViewModel, private formMetadataService: FormMetadataService) { } validate(entities: Entity[]): void { const expressions = this.getValidationExpressions(); if (!expressions?.length) { @@ -69,12 +71,15 @@ export class ExpressionValidator implements FormValidator{ return viewModel.formStore ? viewModel.formStore.getControlRules(controlName) : viewModel.formArrayStore?.getControlRules(id, controlName); } private buildValidationRules(result: boolean, validationRules: ValidationRule[], expressionObject: ExpressionObject, controlConfig?: FormControlConfig | null): ValidationRule[] { + const entitySchema = this.formMetadataService.getEntity(); + const resolvedField = FieldResolver.resolve(entitySchema, expressionObject.fieldId); if (expressionObject.type === ExpressionType.Required) { validationRules = validationRules.filter((rule) => rule.name !== 'required'); if (result === true) { validationRules?.splice(0, 0, { name: 'required', message: this.formatMessage(expressionObject.message, controlConfig?.displayName) || undefined, + multiLanguage: resolvedField?.multiLanguage }); } return validationRules; diff --git a/packages/renderer/src/validator/providers.ts b/packages/renderer/src/validator/providers.ts index 14a8f835842..0cbe31061fd 100644 --- a/packages/renderer/src/validator/providers.ts +++ b/packages/renderer/src/validator/providers.ts @@ -7,5 +7,5 @@ import { ExpressionValidator } from "./expression-validator"; export const validatorProviders: StaticProvider[] = [ { provide: RESPONSE_REQUIRED_VALIDATOR_TOKEN, useClass: ResponseRequiredValidator, deps: [ComponentConfigRegistry, ComponentConfigDependencyResolveService, FormMetadataService, ConfigResolver, ViewModel] }, - { provide: EXPRESSION_VALIDATOR_TOKEN, useClass: ExpressionValidator, deps: [ViewModel] }, + { provide: EXPRESSION_VALIDATOR_TOKEN, useClass: ExpressionValidator, deps: [ViewModel, FormMetadataService] }, ]; diff --git a/packages/renderer/src/validator/response-required-validator.ts b/packages/renderer/src/validator/response-required-validator.ts index 942db935c17..760b154fb5e 100644 --- a/packages/renderer/src/validator/response-required-validator.ts +++ b/packages/renderer/src/validator/response-required-validator.ts @@ -70,7 +70,7 @@ export class ResponseRequiredValidator implements FormValidator { if (rules?.some(rule => rule.type === 'required')) { continue; } - + const requiredRule = rules?.find((rule: any) => rule.name === 'required'); const newRules = rules?.filter(rule => rule.type !== 'required') || []; const controlConfig = viewModel.formArrayStore?.getConfigManager().getControlConfig(fieldId); if (!controlConfig) { @@ -78,7 +78,8 @@ export class ResponseRequiredValidator implements FormValidator { } newRules?.splice(0, 0, { name: 'required', - message: this.buildRequiredMessage(controlConfig) + message: this.buildRequiredMessage(controlConfig), + multiLanguage: requiredRule?.multiLanguage }); viewModel.formArrayStore?.setControlRules( entity.idValue, -- Gitee From a8dcc4de6bbb62b85cf3d5413e501894a52ee320 Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 20:07:27 +0800 Subject: [PATCH 09/10] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E7=BB=84?= =?UTF-8?q?=E5=90=88=E8=A1=A8=E5=8D=95=E6=9C=AA=E5=A4=9A=E8=AF=AD=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/renderer/src/i18n/resource-loader.ts | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/renderer/src/i18n/resource-loader.ts b/packages/renderer/src/i18n/resource-loader.ts index 21e6eea850e..0924bbd2532 100644 --- a/packages/renderer/src/i18n/resource-loader.ts +++ b/packages/renderer/src/i18n/resource-loader.ts @@ -3,6 +3,7 @@ import { MetadataManager, ResourceMetadataDataService } from "../metadata"; import { LanguageListManager } from "./language-list-manager"; import { Metadata } from "../types"; import { ResourceManager } from "./resource-manager"; +import { FormMetadataQuery } from "../service"; export class ResourceLoader { private metadataManager: MetadataManager; @@ -17,7 +18,7 @@ export class ResourceLoader { this.httpClient = this.injector.get(HttpClient); this.resourceManager = this.injector.get(ResourceManager); } - public loadByProjectPath(formMetadataId: string, projectPath: string) { + public async loadByProjectPath(formMetadataId: string, projectPath: string) { const metadata = this.metadataManager.getMetadataCache(formMetadataId); const formMetadata = metadata.form; const resourceMetadatas = formMetadata.refs && formMetadata.refs.filter((ref: any) => { @@ -26,6 +27,7 @@ export class ResourceLoader { const resourceMetadataPromise = resourceMetadatas.map((id: string) => { return this.loadResourceMetadataByPath(projectPath, id); }); + await this.loadExternalMetadataByPath(formMetadata); return Promise.all(resourceMetadataPromise).then((resourceMetadatas) => { if (!resourceMetadatas || resourceMetadatas.length < 1) { return; @@ -43,7 +45,7 @@ export class ResourceLoader { this.resourceManager.setResourceCache(formMetadataId, resourceObject); }); } - public loadByMetadataId(formMetadataId: string) { + public async loadByMetadataId(formMetadataId: string) { const metadata = this.metadataManager.getMetadataCache(formMetadataId); const formMetadata = metadata.form; const { relativePath, code } = formMetadata; @@ -53,13 +55,36 @@ export class ResourceLoader { const projectName = paths[3]; const basePath = `/apps/${app}/${su}/web/${projectName}/${code}/i18n`.toLowerCase(); const path = `${basePath}/${this.languageListManager.getLanguageCode()}.json?version=${new Date().valueOf()}`; + await this.loadExternalMetadataById(formMetadata); return this.httpClient.get(path, {}).then((data: any) => { this.resourceManager.setResourceCache(formMetadataId, data); return data; - }).catch(()=>{ + }).catch(() => { console.warn('国际化资源加载失败!'); }); } + private async loadExternalMetadataByPath(formMetadata: any) { + const formMetadataQuery = new FormMetadataQuery(formMetadata); + const externalFormInfos = formMetadataQuery.getExternalFormInfos(); + + for (const externalFormInfo of externalFormInfos) { + await this.loadByProjectPath(externalFormInfo.id, externalFormInfo.projectPath); + this.correctExternalFormCode(externalFormInfo); + } + } + private async loadExternalMetadataById(formMetadata: any){ + const formMetadataQuery = new FormMetadataQuery(formMetadata); + const externalFormInfos = formMetadataQuery.getExternalFormInfos(); + + for (const externalFormInfo of externalFormInfos) { + await this.loadByMetadataId(externalFormInfo.id); + this.correctExternalFormCode(externalFormInfo); + } + } + private correctExternalFormCode(externalFormInfo: any) { + const externalMetadata = this.metadataManager.getMetadataCache(externalFormInfo.id); + externalMetadata.form.content.module.externalContainerId = externalFormInfo.externalContainerId; + } private loadResourceMetadataByPath(projectPath: string, metadataId: string) { const resourceMetadata = this.resourceMetadataDataService.loadByProjectPath(projectPath, metadataId); const languageCode = this.languageListManager.getLanguageCode(); -- Gitee From 4d54b3b7d90d40dabbd2357a0e45161062233663 Mon Sep 17 00:00:00 2001 From: aalizzwell Date: Wed, 6 Aug 2025 20:23:18 +0800 Subject: [PATCH 10/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E6=9E=9A=E4=B8=BE=E5=88=97=E6=9C=AA=E5=A4=9A=E8=AF=AD?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transformer/data-grid-i18n-transformer.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/renderer/src/i18n/transformer/data-grid-i18n-transformer.ts b/packages/renderer/src/i18n/transformer/data-grid-i18n-transformer.ts index 7e44157e639..cae00cfccbd 100644 --- a/packages/renderer/src/i18n/transformer/data-grid-i18n-transformer.ts +++ b/packages/renderer/src/i18n/transformer/data-grid-i18n-transformer.ts @@ -24,13 +24,24 @@ export class DataGridI18nTransformer { }); } private resolveEnumColumn(schemaId: string, column: Record) { - const { dataType, formatter } = column; - if (dataType === 'enum' && formatter) { + const { dataType, formatter, id: columnId, editor } = column; + if (dataType !== 'enum') { + return; + } + if (formatter) { // eslint-disable-next-line prefer-destructuring const data: any[] = formatter.data; if (data && data.length > 0) { data.forEach((item: any) => { - item.name = this.translate.transform(this.formMetadataId, `${schemaId}/editor/data/${item.value}`, item.name); + item.name = this.translate.transform(this.formMetadataId, `${columnId}/editor/data/${item.value}`, item.name); + }); + } + } + if (editor) { + const { data } = editor; + if (data && data.length > 0) { + data.forEach((item: any) => { + item.name = this.translate.transform(this.formMetadataId, `${columnId}/editor/data/${item.value}`, item.name); }); } } -- Gitee