From a65b1606c5353c3561158188d3a05ae316333a35 Mon Sep 17 00:00:00 2001 From: Katherine Date: Wed, 19 Mar 2025 20:26:20 +0800 Subject: [PATCH 1/9] feat: support field Style settings for font-size, font-weight, and font-style (#6489) * feat: field style support font-size\font-weight\font-style * fix: bug * fix: bug * test: field style e2e * fix: test --- packages/core/client/src/locale/zh-CN.json | 8 +- .../fields/__e2e__/styleLinkageRule.test.ts | 54 +++++ .../src/modules/fields/__e2e__/templates.ts | 224 ++++++++++++++++++ .../__tests__/collection-select.test.tsx | 4 +- .../antd/form-item/FormItem.tsx | 3 + .../FieldStyleLinkageRuleAction.tsx | 171 +++++++++++++ .../LinkageRules/LinkageRuleAction.tsx | 93 -------- .../LinkageRules/LinkageRuleActionGroup.tsx | 9 +- .../LinkageRules/compute-rules.ts | 9 +- .../src/schema-settings/LinkageRules/type.ts | 3 + .../src/client/__e2e__/datablocks1.test.ts | 15 +- .../src/e2e/e2ePageObjectModel.ts | 4 +- 12 files changed, 481 insertions(+), 116 deletions(-) create mode 100644 packages/core/client/src/modules/fields/__e2e__/styleLinkageRule.test.ts create mode 100644 packages/core/client/src/schema-settings/LinkageRules/FieldStyleLinkageRuleAction.tsx diff --git a/packages/core/client/src/locale/zh-CN.json b/packages/core/client/src/locale/zh-CN.json index 9aa45fc3bb..681880e557 100644 --- a/packages/core/client/src/locale/zh-CN.json +++ b/packages/core/client/src/locale/zh-CN.json @@ -1084,5 +1084,11 @@ "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "隐藏后,该标签将不再显示在标签栏中。要想再次显示它,你需要到路由管理页面进行设置。", "Date scope": "日期范围", "Enable index column": "启用序号列", - "Icon only": "仅显示图标" + "Icon only": "仅显示图标", + "Valid range: 100-900": "有效范围:100-900", + "Valid range: 10-40": "有效范围:10-40", + "Font Size(px)": "字体大小(像素)", + "Font Weight": "字体粗细", + "Font Style": "字体样式", + "Italic": "斜体" } diff --git a/packages/core/client/src/modules/fields/__e2e__/styleLinkageRule.test.ts b/packages/core/client/src/modules/fields/__e2e__/styleLinkageRule.test.ts new file mode 100644 index 0000000000..5912e3b9d0 --- /dev/null +++ b/packages/core/client/src/modules/fields/__e2e__/styleLinkageRule.test.ts @@ -0,0 +1,54 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { expect, test } from '@nocobase/test/e2e'; +import { oneDetailBlockFieldWidthFieldStyle } from './templates'; + +test.describe('field style linkage rule', () => { + test('field style support Color、Background Color、Text Align、Font Size、Font Weight、Font Style', async ({ + page, + mockPage, + }) => { + await mockPage(oneDetailBlockFieldWidthFieldStyle).goto(); + await page.getByLabel('block-item-CardItem-users-').hover(); + await page.getByLabel('block-item-CollectionField-users-details-users.nickname-Nickname').hover(); + await page + .getByLabel('designer-schema-settings-CollectionField-fieldSettings:FormItem-users-users.nickname', { + exact: true, + }) + .hover(); + await page.getByText('Style').click(); + await page.getByRole('button', { name: 'plus Add linkage rule' }).click(); + await page.getByText('Add property').click(); + await page.locator('div').filter({ hasText: 'Style Linkage' }).nth(2).click(); + await page.getByTestId('select-linkage-properties').click(); + await expect(page.getByText('Color', { exact: true })).toBeVisible(); + await expect(page.getByText('Background Color')).toBeVisible(); + await expect(page.getByText('Text Align')).toBeVisible(); + await expect(page.getByText('Font Size(px)')).toBeVisible(); + await expect(page.getByText('Font Weight')).toBeVisible(); + await expect(page.getByText('Font Style')).toBeVisible(); + // 配置字段样式 + await page.getByText('Font Size(px)').click(); + + await page.getByPlaceholder('Valid range: 10-').click(); + await page.getByPlaceholder('Valid range: 10-').fill('40'); + await page.getByRole('button', { name: 'OK' }).click(); + // 获取元素并断言其 font-size 为 40px + const fontSize = await page + .locator('.ant-formily-item-control-content-component') + .first() + .evaluate((element) => { + return window.getComputedStyle(element).fontSize; + }); + + // 断言 font-size 是 40px + expect(fontSize).toBe('40px'); + }); +}); diff --git a/packages/core/client/src/modules/fields/__e2e__/templates.ts b/packages/core/client/src/modules/fields/__e2e__/templates.ts index ce2b24d33b..a0fbd9545d 100644 --- a/packages/core/client/src/modules/fields/__e2e__/templates.ts +++ b/packages/core/client/src/modules/fields/__e2e__/templates.ts @@ -2476,3 +2476,227 @@ export const shouldImmediatelyShowDrawerWhenClickingEnableLinkForTheFirstTime = 'x-index': 1, }, }; + +export const oneDetailBlockFieldWidthFieldStyle = { + pageSchema: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Page', + 'x-app-version': 'v1.7.0-beta.5', + properties: { + j5rf9qdpszc: { + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'page:addBlock', + properties: { + x72noji3ol7: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.7.0-beta.5', + properties: { + '6klgaiwxs8q': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.7.0-beta.5', + properties: { + dpj7gevoiqw: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-acl-action': 'users:view', + 'x-decorator': 'DetailsBlockProvider', + 'x-use-decorator-props': 'useDetailsWithPaginationDecoratorProps', + 'x-decorator-props': { + dataSource: 'main', + collection: 'users', + readPretty: true, + action: 'list', + params: { + pageSize: 1, + }, + }, + 'x-toolbar': 'BlockSchemaToolbar', + 'x-settings': 'blockSettings:detailsWithPagination', + 'x-component': 'CardItem', + 'x-app-version': '1.7.0-beta.5', + properties: { + '5zo8ay6xu74': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Details', + 'x-read-pretty': true, + 'x-use-component-props': 'useDetailsWithPaginationProps', + 'x-app-version': '1.7.0-beta.5', + properties: { + '2u7t8s8zffc': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-initializer': 'details:configureActions', + 'x-component': 'ActionBar', + 'x-component-props': { + style: { + marginBottom: 24, + }, + }, + 'x-app-version': '1.7.0-beta.5', + 'x-uid': 'ajfbilj1eas', + 'x-async': false, + 'x-index': 1, + }, + grid: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid', + 'x-initializer': 'details:configureFields', + 'x-app-version': '1.7.0-beta.5', + properties: { + g1jwsjkiks0: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.7.0-beta.5', + properties: { + gi5z3ss61t2: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.7.0-beta.5', + properties: { + nickname: { + 'x-uid': '2a4om1os4i8', + _isJSONSchemaObject: true, + version: '2.0', + type: 'string', + 'x-toolbar': 'FormItemSchemaToolbar', + 'x-settings': 'fieldSettings:FormItem', + 'x-component': 'CollectionField', + 'x-decorator': 'FormItem', + 'x-collection-field': 'users.nickname', + 'x-component-props': {}, + 'x-app-version': '1.7.0-beta.5', + // 'x-linkage-style-rules': [ + // { + // condition: { + // $and: [], + // }, + // actions: [ + // { + // operator: 'fontSize', + // value: { + // mode: 'constant', + // value: 40, + // }, + // }, + // ], + // }, + // ], + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'ki6424bbnoa', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '387m3183ea3', + 'x-async': false, + 'x-index': 1, + }, + '1rhnbs2gcca': { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Row', + 'x-app-version': '1.7.0-beta.5', + properties: { + d5ma1xl6j2i: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Grid.Col', + 'x-app-version': '1.7.0-beta.5', + properties: { + username: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'string', + 'x-toolbar': 'FormItemSchemaToolbar', + 'x-settings': 'fieldSettings:FormItem', + 'x-component': 'CollectionField', + 'x-decorator': 'FormItem', + 'x-collection-field': 'users.username', + 'x-component-props': {}, + 'x-app-version': '1.7.0-beta.5', + 'x-uid': '1ayny4b2ylm', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'cdkqplw5ec7', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'k35rh0ef681', + 'x-async': false, + 'x-index': 2, + }, + }, + 'x-uid': 'erulf9efwvv', + 'x-async': false, + 'x-index': 2, + }, + pagination: { + _isJSONSchemaObject: true, + version: '2.0', + type: 'void', + 'x-component': 'Pagination', + 'x-use-component-props': 'useDetailsPaginationProps', + 'x-app-version': '1.7.0-beta.5', + 'x-uid': 'rcmvkgxvob9', + 'x-async': false, + 'x-index': 3, + }, + }, + 'x-uid': 'jra1fx1jp0k', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': '3u4qbg33yhg', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'g126n7qmm1k', + 'x-async': false, + 'x-index': 1, + }, + }, + 'x-uid': 'ftxf3gxjwxs', + 'x-async': false, + 'x-index': 1, + }, + }, + name: 'j8dv3zpp2l7', + 'x-uid': 'n9tpyozmuz9', + 'x-async': true, + 'x-index': 1, + }, + }, + 'x-uid': 'u3njequ14zz', + 'x-async': true, + 'x-index': 1, + }, +}; diff --git a/packages/core/client/src/schema-component/antd/collection-select/__tests__/collection-select.test.tsx b/packages/core/client/src/schema-component/antd/collection-select/__tests__/collection-select.test.tsx index 3a69dc4335..9c341903cb 100644 --- a/packages/core/client/src/schema-component/antd/collection-select/__tests__/collection-select.test.tsx +++ b/packages/core/client/src/schema-component/antd/collection-select/__tests__/collection-select.test.tsx @@ -50,7 +50,7 @@ describe('CollectionSelect', () => { >
{ >
diff --git a/packages/core/client/src/schema-settings/LinkageRules/FieldStyleLinkageRuleAction.tsx b/packages/core/client/src/schema-settings/LinkageRules/FieldStyleLinkageRuleAction.tsx new file mode 100644 index 0000000000..94a470277c --- /dev/null +++ b/packages/core/client/src/schema-settings/LinkageRules/FieldStyleLinkageRuleAction.tsx @@ -0,0 +1,171 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +import { CloseCircleOutlined } from '@ant-design/icons'; +import { css } from '@emotion/css'; +import { observer } from '@formily/react'; +import { uid } from '@formily/shared'; +import { Select, Space } from 'antd'; +import React, { useCallback, useContext, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useCompile } from '../..'; +import { ValueDynamicComponent } from './ValueDynamicComponent'; +import { RemoveActionContext } from './context'; +import { ActionType } from './type'; +import { useValues } from './useValues'; + +const colorSchema = { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'ColorPicker', + 'x-component-props': { + defaultValue: '', + }, +}; +const textAlignSchema = { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-component-props': { + defaultValue: '', + }, + enum: [ + { + label: 'left', + value: 'left', + }, + { + label: 'right', + value: 'right', + }, + { + label: 'center', + value: 'center', + }, + ], +}; + +const fontSizeSchema = { + type: 'number', + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + 'x-component-props': { + precision: 0, + min: 10, + max: 40, + placeholder: '{{t("Valid range: 10-40")}}', + }, + 'x-validator': { + maximum: 40, + minimum: 10, + }, +}; + +const fontWeightSchema = { + type: 'number', + 'x-decorator': 'FormItem', + 'x-component': 'InputNumber', + 'x-component-props': { + precision: 0, + placeholder: '{{t("Valid range: 100-900")}}', + max: 900, + min: 100, + }, + 'x-validator': { + maximum: 900, + minimum: 100, + }, +}; + +const fontStyleSchema = { + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'Select', + 'x-component-props': { + defaultValue: '', + }, + enum: [ + { + label: "{{t('Normal')}}", + value: 'normal', + }, + { + label: "{{t('Italic')}}", + value: 'italic', + }, + ], +}; + +const schemas = new Map(); +schemas.set(ActionType.Color, colorSchema); +schemas.set(ActionType.BackgroundColor, colorSchema); +schemas.set(ActionType.TextAlign, textAlignSchema); +schemas.set(ActionType.FontSize, fontSizeSchema); +schemas.set(ActionType.FontWeight, fontWeightSchema); +schemas.set(ActionType.FontStyle, fontStyleSchema); + +export const FieldStyleLinkageRuleAction = observer( + (props: any) => { + const { options, collectionName } = props; + const { t } = useTranslation(); + const compile = useCompile(); + const remove = useContext(RemoveActionContext); + const { operator, setOperator, value: fieldValue, setValue } = useValues(options); + const operators = useMemo( + () => + compile([ + { label: t('Color'), value: ActionType.Color, schema: {} }, + { label: t('Background Color'), value: ActionType.BackgroundColor, schema: {} }, + { label: t('Text Align'), value: ActionType.TextAlign, schema: {} }, + { label: t('Font Size(px)'), value: ActionType.FontSize, schema: {} }, + { label: t('Font Weight'), value: ActionType.FontWeight, schema: {} }, + { label: t('Font Style'), value: ActionType.FontStyle, schema: {} }, + ]), + [compile, t], + ); + + const onChange = useCallback( + (value) => { + setOperator(value); + }, + [setOperator], + ); + + const closeStyle = useMemo(() => ({ color: '#bfbfbf' }), []); + return ( +
+ + - {[ActionType.Color, ActionType.BackgroundColor, ActionType.TextAlign].includes(operator) && ( - - )} - {!props.disabled && ( - - - - )} - -
- ); - }, - { displayName: 'FormStyleLinkageRuleAction' }, -); diff --git a/packages/core/client/src/schema-settings/LinkageRules/LinkageRuleActionGroup.tsx b/packages/core/client/src/schema-settings/LinkageRules/LinkageRuleActionGroup.tsx index aee60dbb8d..8efada27cf 100644 --- a/packages/core/client/src/schema-settings/LinkageRules/LinkageRuleActionGroup.tsx +++ b/packages/core/client/src/schema-settings/LinkageRules/LinkageRuleActionGroup.tsx @@ -14,11 +14,8 @@ import React, { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { withDynamicSchemaProps } from '../../hoc/withDynamicSchemaProps'; import { useProps } from '../../schema-component/hooks/useProps'; -import { - FormButtonLinkageRuleAction, - FormFieldLinkageRuleAction, - FormStyleLinkageRuleAction, -} from './LinkageRuleAction'; +import { FormButtonLinkageRuleAction, FormFieldLinkageRuleAction } from './LinkageRuleAction'; +import { FieldStyleLinkageRuleAction } from './FieldStyleLinkageRuleAction'; import { RemoveActionContext } from './context'; export const LinkageRuleActions = observer( (props: any): any => { @@ -30,7 +27,7 @@ export const LinkageRuleActions = observer( } = { button: FormButtonLinkageRuleAction, field: FormFieldLinkageRuleAction, - style: FormStyleLinkageRuleAction, + style: FieldStyleLinkageRuleAction, }; return field?.value?.map((item, index) => { return ( diff --git a/packages/core/client/src/schema-settings/LinkageRules/compute-rules.ts b/packages/core/client/src/schema-settings/LinkageRules/compute-rules.ts index 2c8daf81ca..12ca65e77f 100644 --- a/packages/core/client/src/schema-settings/LinkageRules/compute-rules.ts +++ b/packages/core/client/src/schema-settings/LinkageRules/compute-rules.ts @@ -18,7 +18,14 @@ const getActionValue = (operator, value) => { } else return null; }; switch (true) { - case [ActionType.Color, ActionType.BackgroundColor, ActionType.TextAlign].includes(operator): + case [ + ActionType.Color, + ActionType.BackgroundColor, + ActionType.TextAlign, + ActionType.FontSize, + ActionType.FontWeight, + ActionType.FontStyle, + ].includes(operator): return getValueByMode(value); default: return null; diff --git a/packages/core/client/src/schema-settings/LinkageRules/type.ts b/packages/core/client/src/schema-settings/LinkageRules/type.ts index 615db26ece..1f59a6a849 100644 --- a/packages/core/client/src/schema-settings/LinkageRules/type.ts +++ b/packages/core/client/src/schema-settings/LinkageRules/type.ts @@ -24,6 +24,9 @@ export enum ActionType { TextAlign = 'textAlign', Options = 'options', DateScope = 'dateScope', + FontSize = 'fontSize', + FontWeight = 'fontWeight', + FontStyle = 'fontStyle', } export enum LinkageRuleCategory { diff --git a/packages/plugins/@nocobase/plugin-workflow-manual/src/client/__e2e__/datablocks1.test.ts b/packages/plugins/@nocobase/plugin-workflow-manual/src/client/__e2e__/datablocks1.test.ts index 369f943420..bb4878bb6b 100644 --- a/packages/plugins/@nocobase/plugin-workflow-manual/src/client/__e2e__/datablocks1.test.ts +++ b/packages/plugins/@nocobase/plugin-workflow-manual/src/client/__e2e__/datablocks1.test.ts @@ -174,10 +174,7 @@ test.describe('field data', () => { await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click(); await page.mouse.move(300, 0, { steps: 100 }); await page.waitForTimeout(300); - await page - .locator('.itemCss', { hasText: preManualNodeTitle }) - .getByLabel('action-Action.Link-View-view-') - .click(); + await page.locator('.itemCss', { hasText: preManualNodeTitle }).getByLabel('action-Action.Link-View-view-').click(); const preManualNodeRecord = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString(); await page.getByRole('textbox').fill(preManualNodeRecord); await page.getByRole('button', { name: 'Continue the process' }).click(); @@ -334,10 +331,7 @@ test.describe('field data', () => { await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click(); await page.mouse.move(300, 0, { steps: 100 }); await page.waitForTimeout(300); - await page - .locator('.itemCss', { hasText: preManualNodeTitle }) - .getByLabel('action-Action.Link-View-view-') - .click(); + await page.locator('.itemCss', { hasText: preManualNodeTitle }).getByLabel('action-Action.Link-View-view-').click(); const preManualNodeRecord = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString(); await page.getByRole('textbox').fill(preManualNodeRecord); await page.getByRole('button', { name: 'Continue the process' }).click(); @@ -542,10 +536,7 @@ test.describe('field data', () => { await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click(); await page.mouse.move(300, 0, { steps: 100 }); await page.waitForTimeout(300); - await page - .locator('.itemCss', { hasText: preManualNodeTitle }) - .getByLabel('action-Action.Link-View-view-') - .click(); + await page.locator('.itemCss', { hasText: preManualNodeTitle }).getByLabel('action-Action.Link-View-view-').click(); const preManualNodeRecord = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString(); await page.getByRole('textbox').fill(preManualNodeRecord); await page.getByRole('button', { name: 'Continue the process' }).click(); diff --git a/packages/plugins/@nocobase/plugin-workflow-test/src/e2e/e2ePageObjectModel.ts b/packages/plugins/@nocobase/plugin-workflow-test/src/e2e/e2ePageObjectModel.ts index 3d22612206..07a2a20e4f 100644 --- a/packages/plugins/@nocobase/plugin-workflow-test/src/e2e/e2ePageObjectModel.ts +++ b/packages/plugins/@nocobase/plugin-workflow-test/src/e2e/e2ePageObjectModel.ts @@ -115,7 +115,9 @@ export class ApprovalTriggerNode { .getByLabel('block-item-DataSourceCollectionCascader-workflows-Collection') .locator('.ant-select-selection-search-input'); this.dataBlocksInitiationRadio = page.getByRole('radio', { name: 'Initiate in data blocks only' }); - this.dataBlocksAndGlobalApprovalBlocksInitiationRadio = page.getByRole('radio', { name: 'Initiate in both data blocks' }); + this.dataBlocksAndGlobalApprovalBlocksInitiationRadio = page.getByRole('radio', { + name: 'Initiate in both data blocks', + }); this.allowedToBeWithdrawnCheckbox = page.getByLabel('Allowed to be withdrawn'); this.goToconfigureButton = page.getByRole('button', { name: 'Go to configure' }); this.addBlockButton = page.getByLabel(`schema-initializer-Grid-ApprovalApplyAddBlockButton-${collectionName}`); From 186463abb25419022b566c4741b4ba65cd741096 Mon Sep 17 00:00:00 2001 From: Katherine Date: Wed, 19 Mar 2025 21:01:24 +0800 Subject: [PATCH 2/9] fix: association field detection to be based on type (#6506) --- .../schema-component/antd/form-item/FormItem.Settings.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/core/client/src/schema-component/antd/form-item/FormItem.Settings.tsx b/packages/core/client/src/schema-component/antd/form-item/FormItem.Settings.tsx index 788741a5c2..aefda32ebe 100644 --- a/packages/core/client/src/schema-component/antd/form-item/FormItem.Settings.tsx +++ b/packages/core/client/src/schema-component/antd/form-item/FormItem.Settings.tsx @@ -985,12 +985,11 @@ function useFormItemCollectionField() { export function useIsAssociationField() { const collectionField = useFormItemCollectionField(); - const isAssociationField = ['obo', 'oho', 'o2o', 'o2m', 'm2m', 'm2o', 'updatedBy', 'createdBy', 'mbm'].includes( - collectionField?.interface, - ); + const isAssociationField = + collectionField && + ['hasOne', 'hasMany', 'belongsTo', 'belongsToMany', 'belongsToArray'].includes(collectionField.type); return isAssociationField; } - export function useIsFileField() { const cm = useCollectionManager(); const collectionField = useFormItemCollectionField(); From 49bd35ca5f27d0af17e15686e62fe2cc9bf7d0c6 Mon Sep 17 00:00:00 2001 From: N3tN00b3r <61335029+N3tN00b3r@users.noreply.github.com> Date: Wed, 19 Mar 2025 17:34:48 +0100 Subject: [PATCH 3/9] Updating italian translations - Plugins + Core (#6466) * Add italian translation * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Update it-IT.json * Create it-IT.json * Create it-IT.json * Update it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json The following strings have been intentionally not translated to avoid misinterpretation of the technical terms: Access Key ID Access Key Secret Secret ID Secret Key * Create it-IT.json * Create it-IT.json * Update it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Create it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Create it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Create it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json * Update it-IT.json --------- Co-authored-by: mahuantest <50297992+Albert-mah@users.noreply.github.com> --- packages/core/client/src/locale/it-IT.json | 331 +++++++++++++++--- .../src/locale/it-IT.json | 2 +- .../src/locale/it-IT.json | 8 +- .../plugin-calendar/src/locale/it-IT.json | 4 +- .../plugin-charts/src/locale/it-IT.json | 2 +- .../src/locale/it-IT.json | 4 +- .../src/locale/it-IT.json | 3 +- .../src/locale/it-IT.json | 2 +- .../plugin-file-manager/src/locale/it-IT.json | 6 +- .../plugin-map/src/locale/it-IT.json | 2 +- .../src/locale/it-IT.json | 6 +- .../src/locale/it-IT.json | 6 +- .../src/locale/it-IT.json | 2 +- .../src/locale/it-IT.json | 20 +- .../src/locale/it-IT.json | 5 +- .../src/locale/it-IT.json | 21 +- .../src/locale/it-IT.json | 15 +- .../src/locale/it-IT.json | 4 +- .../src/locale/it-IT.json | 1 + .../src/locale/it-IT.json | 12 +- .../plugin-workflow-sql/src/locale/it-IT.json | 6 +- .../plugin-workflow/src/locale/it-IT.json | 141 +++++++- 22 files changed, 484 insertions(+), 119 deletions(-) diff --git a/packages/core/client/src/locale/it-IT.json b/packages/core/client/src/locale/it-IT.json index a9818450e7..44a48bc9c8 100644 --- a/packages/core/client/src/locale/it-IT.json +++ b/packages/core/client/src/locale/it-IT.json @@ -54,7 +54,7 @@ "Insert inner": "Inserire dentro", "Delete": "Eliminare", "Disassociate": "Dissociare", - "Disassociate record": "Dissociare il record", + "Disassociate record": "Dissociare record", "Are you sure you want to disassociate it?": "Sei sicuro di voler dissociare?", "UI editor": "Editor UI", "Collection": "Raccolta", @@ -80,7 +80,7 @@ "Value": "Valore", "Disabled": "Disabilitato", "Enabled": "Abilitato", - "Problematic": "Problematico", + "Problematic": "Con problemi", "Setting": "Impostazioni", "On": "Acceso", "Off": "Spento", @@ -121,7 +121,7 @@ "pixels": "pixel", "Screen size": "Dimensione dello schermo", "Display title": "Visualizza titolo", - "Set the count of columns displayed in a row": "Imposta il conteggio delle colonne visualizzate in una riga", + "Set the count of columns displayed in a row": "Imposta conteggio delle colonne visualizzate in una riga", "Column": "Colonna", "Phone device": "Telefono", "Tablet device": "Tablet", @@ -146,7 +146,7 @@ "Half of day": "Metà del giorno", "Year": "Anno", "QuarterYear": "Quarto dell' anno", - "Select grouping field": "Seleziona il campo di raggruppamento", + "Select grouping field": "Seleziona campo di raggruppamento", "Media": "Media", "Markdown": "Markdown", "Wysiwyg": "Wysiwyg", @@ -175,7 +175,7 @@ "Expand all": "Espandi tutto", "Expand/Collapse": "Espandi/Comprimi", "Default collapse": "Comprimi di default", - "Tree table": "Tabella ad albero", + "Tree table": "Tabella struttura ad albero", "Custom field display name": "Nome visualizzato campo personalizzato ", "Display fields": "Visualizza campi", "Edit record": "Modifica record", @@ -191,8 +191,8 @@ "This is a demo text, **supports Markdown syntax**.": "Questo è un testo demo, ** supporta la sintassi di Markdown **.", "Filter": "Filtro", "Connect data blocks": "Collega blocchi di dati", - "Action type": "Tipo di operazione", - "Actions": "Operazioni", + "Action type": "Tipo di azione", + "Actions": "Azioni", "Insert": "Inserisci", "Insert if not exists": "Inserisci se non esiste", "Insert if not exists, or update": "Inserisci se non esiste o aggiorna", @@ -252,9 +252,7 @@ "Integer": "Intero", "Percent": "Percentuale", "Password": "Password", - "Advanced type": "Avanzato", - "Formula": "Formula", - "Formula description": "Calcola un valore in ciascun record in base ad altri campi nello stesso record.", + "Advanced type": "Avanzato", "Choices": "Scelte", "Checkbox": "Casella di controllo", "Single select": "Selezione singola", @@ -320,8 +318,7 @@ "Toggles the subfield mode": "Attiva la modalità Subfield", "Selector mode": "Modalità selettore", "Subtable mode": "Modalità sotto-tabella", - "Subform mode": "Modalità sotto-modulo", - "Edit block title": "Modifica titolo blocco", + "Subform mode": "Modalità sotto-modulo", "Block title": "Titolo blocco", "Pattern": "Modello", "Operator": "Operatore", @@ -341,12 +338,11 @@ "not ends with": "non termina con", "is empty": "è vuoto", "is not empty": "non è vuoto", - "Edit chart": "Modifica grafico", - "Add text": "Aggiungi testo", + "Edit chart": "Modifica grafico", "Filterable fields": "Campi filtrabili", "Edit button": "Modifica pulsante", "Hide": "Nascondi", - "Enable actions": "Abilita operazioni", + "Enable actions": "Abilita azioni", "Import": "Importa", "Export": "Esporta", "Customize": "Personalizza", @@ -354,12 +350,12 @@ "Function": "Funzione", "Popup form": "Modulo Popup", "Flexible popup": "Popup flessibile", - "Configure actions": "Configura operazioni", + "Configure actions": "Configura azioni", "Display order number": "Visualizza numero ordinamento", "Enable drag and drop sorting": "Abilita l'ordinamento con drag and drop", "Triggered when the row is clicked": "Attivato quando si fa clic sulla riga", "Add tab": "Aggiungi scheda", - "Disable tabs": "Disabilita le schede", + "Disable tabs": "Disabilita schede", "Details": "Dettagli", "Edit form": "Modifica modulo", "Create form": "Crea modulo", @@ -373,13 +369,13 @@ "Custom column name": "Nome colonna personalizzato", "Edit description": "Modifica descrizione", "Required": "Richiesto", - "Unique": "Unico", + "Unique": "Univoco", "Primary": "Primario", "Auto increment": "Incremento automatico", "Label field": "Campo etichetta", "Default is the ID field": "L'impostazione predefinita è il campo ID", - "Set default sorting rules": "Imposta le regole di ordinamento predefinite", - "Set validation rules": "Imposta le regole di convalida", + "Set default sorting rules": "Imposta regole di ordinamento predefinite", + "Set validation rules": "Imposta regole di convalida", "Max length": "Lunghezza massima", "Min length": "Lunghezza minima", "Maximum": "Massimo", @@ -430,8 +426,7 @@ "Text Align": "Allineamento testo", "Add option": "Aggiungi opzione", "Related collection": "Raccolta correlata", - "Allow linking to multiple records": "Consenti il ​collegamento a più record", - "Allow uploading multiple files": "Consenti il caricamento di più file", + "Allow linking to multiple records": "Consenti ​collegamento a più record", "Configure calendar": "Configura calendario", "Title field": "Campo titolo", "Custom title": "Titolo personalizzato", @@ -471,13 +466,13 @@ "Configure": "Configura", "Configure permissions": "Configura permessi", "Edit role": "Modifica ruolo", - "Action permissions": "Permessi su operazioni", + "Action permissions": "Permessi su azioni", "Menu permissions": "Permessi su menu", "Menu item name": "Nome voce di menu", "Allow access": "Consenti accesso", - "Action name": "Nome operazione", - "Allow action": "Consenti operazione", - "Action scope": "Ambito operazione", + "Action name": "Nome azione", + "Allow action": "Consenti azione", + "Action scope": "Ambito azione", "Operate on new data": "Operare su nuovi dati", "Operate on existing data": "Operare su dati esistenti", "Yes": "Si", @@ -503,11 +498,11 @@ "Save as block template": "Salva come modello blocco", "Block templates": "Modelli blocco", "Block template": "Modello blocco", - "Convert reference to duplicate": "Converti il ​​riferimento a duplicato", + "Convert reference to duplicate": "Converti ​​riferimento a duplicato", "Template name": "Nome modello", "Block type": "Tipo blocco", "No blocks to connect": "Nessun blocco per connettersi", - "Action column": "Colonna operazioni", + "Action column": "Colonna azioni", "Records per page": "Record per pagina", "(Fields only)": "(Solo campi)", "Button title": "Titolo pulsante", @@ -542,7 +537,7 @@ "Identifier for program usage. Support letters, numbers and underscores, must start with an letter.": "Identificatore per l'utilizzo del programma. Supporta lettere, numeri e underscore, deve iniziare con una lettera.", "Drawer": "Cassetto", "Dialog": "Dialogo", - "Delete action": "Elimina operazione", + "Delete action": "Elimina azione", "Custom column title": "Titolo colonna personalizzata", "Column title": "Titolo colonna", "Original title: ": "Titolo originale: ", @@ -556,7 +551,7 @@ "Then": "Poi", "Stay on current page": "Resta sulla pagina corrente", "Redirect to": "Reindirizza a", - "Save action": "Salva operazione", + "Save action": "Salva azione", "Exists": "Esiste", "Add condition": "Aggiungi condizione", "Add condition group": "Aggiungi gruppo di condizioni", @@ -570,11 +565,8 @@ "<": "<", "≤": "≤", "Role UID": "Ruolo UID", - "Precision": "Precisione", - "Formula mode": "Modalità formula", - "Expression": "Espressione", - "Input +, -, *, /, ( ) to calculate, input @ to open field variables.": "Input +, -, *, /, () per calcolare, input @ per aprire le variabili campo.", - "Formula error.": "Errore formula.", + "Precision": "Precisione", + "Expression": "Espressione", "Rich Text": "Testo ricco", "Junction collection": "Raccolta giunzione", "Leave it blank, unless you need a custom intermediate table": "Lascialo vuoto, a meno che tu non abbia bisogno di una tabella intermedia personalizzata", @@ -595,7 +587,7 @@ "Tab name": "Nome della scheda", "Current record blocks": "Blocchi record attuale", "Popup message": "Messaggio popup", - "Delete role": "Elimina il ruolo", + "Delete role": "Elimina ruolo", "Role display name": "Nome visualizzato ruolo", "Default role": "Ruolo predefinito", "All collections use general action permissions by default; permission configured individually will override the default one.": "Tutte le raccolte utilizzano i permessi di operazioni generali per impostazione predefinita; I permessi configurati individualmente sovrascriveranno quelli predefiniti.", @@ -612,11 +604,11 @@ "Allows to configure interface": "Consente di configurare l'interfaccia", "Allows to install, activate, disable plugins": "Consente di installare, attivare, disabilitare i plugin", "Allows to configure plugins": "Consente di configurare i plugin", - "Action display name": "Nome visualizzato operazione", + "Action display name": "Nome visualizzato azione", "Allow": "Permetti", "Data scope": "Ambito dei dati", - "Action on new records": "Operazione su nuovi record", - "Action on existing records": "Operazione su record esistenti", + "Action on new records": "Azione su nuovi record", + "Action on existing records": "Azione su record esistenti", "All records": "Tutti i record", "Own records": "Record propri", "Permission policy": "Policy di autorizzazione", @@ -624,14 +616,14 @@ "General": "Generale", "Accessible": "Accessibile", "Configure permission": "Configura permesso", - "Action permission": "Permesso operazione", + "Action permission": "Permesso azione", "Field permission": "Permesso campo", "Scope name": "Nome ambito", "Unsaved changes": "Modifiche non salvate", "Are you sure you don't want to save?": "Sei sicuro di non voler salvare?", "Dragging": "Trascina", "Popup": "Popup", - "Trigger workflow": "Trigger flusso di lavoro", + "Trigger workflow": "Trigger workflow", "Request API": "Richiesta API", "Assign field values": "Assegna valori del campo", "Constant value": "Valore costante", @@ -762,12 +754,7 @@ "Please fill in the iframe URL": "Si prega di compilare l'URL iFrame", "Fix block": "Fissa blocco", "Plugin name": "Nome plugin", - "Plugin tab name": "Nome scheda plugin", - "AutoGenId": "Campo ID generato automaticamente", - "CreatedBy": "Creato da", - "UpdatedBy": "Aggiornato da", - "CreatedAt": "Creato il", - "UpdatedAt": "Aggiornato il", + "Plugin tab name": "Nome scheda plugin", "Column width": "Larghezza colonna", "Sortable": "Ordinabile", "Enable link": "Abilita link", @@ -796,9 +783,8 @@ "Current form": "Modulo corrente", "Current object": "Oggetto corrente", "Linkage with form fields": "Collegamento con i campi del modulo", - "Allow add new, update and delete actions": "Consenti operazioni aggiungi nuovo, aggiorna ed elimina", - "Date display format": "Formato di visualizzazione della data", - "Assign data scope for the template": "Assegna l'ambito dei dati per il modello", + "Allow add new, update and delete actions": "Consenti azioni aggiungi nuovo, aggiorna ed elimina", + "Date display format": "Formato di visualizzazione della data", "Table selected records": "Tabella record selezionati", "Tag": "Etichetta", "Tag color field": "Campo colore etichetta", @@ -813,8 +799,7 @@ "Please confirm the SQL statement first": "Si prega di confermare prima l'istruzione SQL", "Automatically drop objects that depend on the collection (such as views), and in turn all objects that depend on those objects": "Elimina automaticamente gli oggetti che dipendono dalla raccolta (come le viste) e, a loro volta, tutti gli oggetti che dipendono da tali oggetti", "Sign in with another account": "Accedi con un altro account", - "Return to the main application": "Torna alla applicazione principale", - "Permission deined": "Permesso negato", + "Return to the main application": "Torna alla applicazione principale", "loading": "caricamento", "name is required": "nome richiesto", "data source": "sorgente dati", @@ -843,7 +828,7 @@ "URL search params": "Parametri di ricerca URL", "Expand All": "Espandi tutto", "Search": "Ricerca", - "Clear default value": "Cancella il valore predefinito", + "Clear default value": "Cancella valore predefinito", "Open in new window": "Apri in una nuova finestra", "Sorry, the page you visited does not exist.": "Spiacente, la pagina che hai visitato non esiste.", "is none of": "non è nessuno di", @@ -857,5 +842,243 @@ "Notification": "Notifica", "Ellipsis overflow content": "Contenuto Ellipsis overflow", "Hide column": "Nascondi colonna", - "In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.": "In modalità di configurazione, l'intera colonna diventa trasparente. In modalità non di configurazione, l'intera colonna verrà nascosta. Anche se l'intera colonna è nascosta, i suoi valori predefiniti configurati e le altre impostazioni avranno comunque effetto." + "In configuration mode, the entire column becomes transparent. In non-configuration mode, the entire column will be hidden. Even if the entire column is hidden, its configured default values and other settings will still take effect.": "In modalità di configurazione, l'intera colonna diventa trasparente. In modalità non di configurazione, l'intera colonna verrà nascosta. Anche se l'intera colonna è nascosta, i suoi valori predefiniti configurati e le altre impostazioni avranno comunque effetto.", + "Page number": "Numero di pagina", + "Page size": "Numero di voci per pagina", + "Enable": "Abilita", + "Disable": "Disabilita", + "Tab": "Scheda", + "Calculation engine": "Motore di calcolo", + "Expression collection": "Raccolta espressioni", + "Tree collection": "Raccolta struttura ad albero", + "Parent ID": "ID record padre", + "Parent": "Record padre", + "Children": "Record figlio", + "Confirm": "Conferma", + "Block": "Blocco", + "Unnamed": "Senza nome", + "SQL collection": "Raccolta dati SQL", + "Configure field": "Configura campo", + "Username": "Nome utente", + "Null": "Null", + "Boolean": "Booleano", + "String": "Stringa", + "Syntax references": "Riferimenti sintassi", + "Math.js comes with a large set of built-in functions and constants, and offers an integrated solution to work with different data types.": "Math.js include un ampio set di funzioni e costanti integrate e offre una soluzione integrata per lavorare con diversi tipi di dati.", + "Formula.js supports most Microsoft Excel formula functions.": "Formula.js supporta la maggior parte delle funzioni delle formule di Microsoft Excel.", + "String template": "Modello stringa", + "Simple string replacement, can be used to interpolate variables in a string.": "Sostituzione semplice di stringhe, può essere utilizzata per interpolare variabili in una stringa.", + "https://docs.nocobase.com/handbook/calculation-engines/formula": "https://docs-cn.nocobase.com/handbook/calculation-engines/formula", + "https://docs.nocobase.com/handbook/calculation-engines/mathjs": "https://docs-cn.nocobase.com/handbook/calculation-engines/mathjs", + "Display when unchecked": "Visualizza quando deselezionato", + "Allow dissociate": "Consenti dissociazione", + "Edit block title & description": "Modifica titolo e descrizione blocco", + "Add Markdown": "Aggiungi Markdown", + "Must be 1-50 characters in length (excluding @.<>\"'/)": "Deve essere lungo 1-50 caratteri (esclusi @.<>\"'/)", + "Data source permissions": "Permessi origine dati", + "Now": "Adesso", + "Access control": "Controllo accessi", + "Remove": "Rimuovi", + "Docs": "Documenti", + "Enable page header": "Abilita intestazione pagina", + "Display page title": "Visualizza titolo pagina", + "Edit page title": "Modifica titolo pagina", + "Enable page tabs": "Abilita schede pagina", + "Constant": "Costante", + "Select a variable": "Seleziona una variabile", + "Double click to choose entire object": "Doppio clic per scegliere l'intero oggetto", + "True": "Vero", + "False": "Falso", + "Prettify": "Formatta", + "Theme": "Tema", + "Default theme": "Tema predefinito", + "Compact theme": "Tema compatto", + "Download": "Scarica", + "File type is not supported for previewing, please download it to preview.": "Il tipo di file non è supportato per l'anteprima, scaricalo per visualizzarlo.", + "Click or drag file to this area to upload": "Clicca o trascina il file in quest'area per caricarlo", + "Support for a single or bulk upload.": "Supporta il caricamento singolo o in blocco.", + "File size should not exceed {{size}}.": "La dimensione del file non deve superare {{size}}.", + "File size exceeds the limit": "La dimensione del file supera il limite", + "File type is not allowed": "Il tipo di file non è consentito", + "Incomplete uploading files need to be resolved": "I caricamenti incompleti dei file devono essere completati", + "Default title for each record": "Titolo predefinito per ogni record", + "If collection inherits, choose inherited collections as templates": "Se la raccolta eredita, scegli le raccolte ereditate come modelli", + "Select an existing piece of data as the initialization data for the form": "Seleziona un dato esistente come dati di inizializzazione per il modulo", + "Only the selected fields will be used as the initialization data for the form": "Solo i campi selezionati verranno utilizzati come dati di inizializzazione per il modulo", + "Template Data": "Dati modello", + "Data fields": "Campi dati", + "Add template": "Aggiungi modello", + "Enable form data template": "Abilita modello dati modulo", + "Form data templates": "Modelli dati modulo", + "No configuration available.": "Nessuna configurazione disponibile.", + "Reload application": "Ricarica applicazione", + "The application is reloading, please do not close the page.": "L'applicazione si sta ricaricando, non chiudere la pagina.", + "Application reloading": "Ricaricamento applicazione", + "Allows to clear cache, reboot application": "Consente di cancellare la cache, riavviare l'applicazione", + "The will interrupt service, it may take a few seconds to restart. Are you sure to continue?": "Il riavvio interromperà il servizio, potrebbero essere necessari alcuni secondi. Sei sicuro di continuare?", + "Clear cache": "Cancella cache", + "Quick create": "Creazione rapida", + "Dropdown": "Menu a discesa", + "Pop-up": "Popup", + "Direct duplicate": "Duplicazione diretta", + "Copy into the form and continue to fill in": "Copia nel modulo e continua a compilare", + "Failed to load plugin": "Caricamento plugin fallito", + "Date range limit": "Limite intervallo date", + "MinDate": "Data minima", + "MaxDate": "Data massima", + "Please select time or variable": "Seleziona ora o variabile", + "Filter out a single piece or a group of records as a template": "Filtra un singolo dato o un gruppo di record come modello", + "The title field is used to identify the template record": "Il campo titolo è utilizzato per identificare il record modello", + "Template fields": "Campi modello", + "The selected fields will automatically populate the form": "I campi selezionati popoleranno automaticamente il modulo", + "UnSelect all": "Deseleziona tutto", + "Secondary confirmation": "Conferma secondaria", + "Perform the {{title}}": "Esegui {{title}}", + "Are you sure you want to perform the {{title}} action?": "Sei sicuro di voler eseguire l'azione {{title}}?", + "Permission denied": "Permesso negato", + "Allow add new": "Consenti aggiunta", + "Data model": "Modello dati", + "Security": "Sicurezza", + "Action": "Azione", + "System": "Sistema", + "Other": "Altro", + "Allow selection of existing records": "Consenti selezione di record esistenti", + "Data Model": "Modello dati", + "Blocks": "Blocchi", + "Users & permissions": "Utenti e permessi", + "System management": "Gestione sistema", + "System & security": "Sistema e sicurezza", + "Workflow": "Workflow", + "Third party services": "Servizi di terze parti", + "Data model tools": "Strumenti modello dati", + "Data sources": "Origini dati", + "Collections": "Raccolte", + "Collection fields": "Campi raccolta", + "Authentication": "Autenticazione", + "Logging and monitoring": "Registrazione e monitoraggio", + "Main": "Principale", + "Index": "Indice", + "Field values must be unique.": "I valori dei campi devono essere univoci.", + "Alphabet": "Alfabeto", + "Accuracy": "Precisione", + "Millisecond": "Millisecondo", + "Second": "Secondo", + "Unix Timestamp": "Timestamp Unix", + "Field value do not meet the requirements": "Il valore del campo non soddisfa i requisiti", + "Field value size is": "La dimensione del valore del campo è", + "Unit conversion": "Conversione unità", + "Separator": "Separatore", + "Prefix": "Prefisso", + "Suffix": "Suffisso", + "Record unique key": "Chiave univoca record", + "Filter target key": "Chiave target filtro", + "If a collection lacks a primary key, you must configure a unique record key to locate row records within a block, failure to configure this will prevent the creation of data blocks for the collection.": "Se una raccolta non ha una chiave primaria, devi configurare un record come chiave univoca per individuare i record di ogni riga all'interno di un blocco, la mancata configurazione impedirà la creazione di blocchi di dati per la raccolta.", + "Filter data based on the specific field, with the requirement that the field value must be unique.": "Filtra i dati in base a un campo specifico, con il requisito che il valore del campo deve essere univoco.", + "Multiply by": "Moltiplica per", + "Divide by": "Dividi per", + "Scientifix notation": "Notazione scientifica", + "Normal": "Normale", + "Automatically generate default values": "Genera automaticamente valori predefiniti", + "Refresh data on close": "Refresh dei dati alla chiusura", + "Refresh data on action": "Refresh dei dati su azione", + "Unknown field type": "Tipo di campo sconosciuto", + "The following field types are not compatible and do not support output and display": "I seguenti tipi di campo non sono compatibili e non supportano l'output e la visualizzazione", + "Not fixed": "Non fissato", + "Left fixed": "Fissato a sinistra", + "Right fixed": "Fissato a destra", + "Fixed": "Colonna fissa", + "Set block height": "Imposta altezza del blocco", + "Specify height": "Specifica altezza", + "Full height": "Altezza completa", + "Please configure the URL": "Configura l'URL", + "URL": "URL", + "Search parameters": "Parametri di ricerca URL", + "Do not concatenate search params in the URL": "Non concatenare i parametri di ricerca nell'URL", + "Edit link": "Modifica link", + "Add parameter": "Aggiungi parametro", + "Use simple pagination mode": "Usa modalità di paginazione semplice", + "Set Template Engine": "Imposta motore template", + "Template engine": "Motore template", + "The current user only has the UI configuration permission, but don't have view permission for collection \"{{name}}\"": "L'utente corrente ha solo il permesso di configurazione dell'interfaccia utente, ma non ha il permesso di visualizzazione per la raccolta \"{{name}}\"", + "Default value to current time": "Imposta il valore predefinito del campo all'ora corrente", + "Automatically update timestamp on update": "Aggiorna automaticamente il timestamp all'aggiornamento", + "Default value to current server time": "Imposta il valore predefinito del campo all'ora corrente del server", + "Automatically update timestamp to the current server time on update": "Aggiorna automaticamente il timestamp all'ora corrente del server all'aggiornamento", + "Datetime (with time zone)": "Data e ora (con fuso orario)", + "Datetime (without time zone)": "Data e ora (senza fuso orario)", + "DateOnly": "Solo data", + "Content": "Contenuto", + "Perform the Update record": "Esegui aggiornamento record", + "Are you sure you want to perform the Update record action?": "Sei sicuro di voler eseguire l'azione di aggiornamento record?", + "Perform the Custom request": "Esegui richiesta personalizzata", + "Are you sure you want to perform the Custom request action": "Sei sicuro di voler eseguire l'azione di richiesta personalizzata?", + "Perform the Refresh": "Esegui refresh", + "Are you sure you want to perform the Refresh action?": "Sei sicuro di voler eseguire l'azione di refresh?", + "Perform the Submit": "Esegui l'invio", + "Are you sure you want to perform the Submit action?": "Sei sicuro di voler eseguire l'azione di invio?", + "Perform the Trigger workflow": "Esegui il trigger del workflow", + "Are you sure you want to perform the Trigger workflow action?": "Sei sicuro di voler eseguire l'azione di trigger del workflow?", + "Picker": "Selettore", + "Quarter": "Trimestre", + "Switching the picker, the value and default value will be cleared": "Cambiando il selettore, il valore e il valore predefinito verranno cancellati", + "Stay on the current popup or page": "Rimani nel popup o nella pagina corrente", + "Return to the previous popup or page": "Torna al popup o alla pagina precedente", + "Action after successful submission": "Azione dopo l'invio riuscito", + "Allow disassociation": "Consenti la dissociazione", + "Layout": "Layout", + "Vertical": "Verticale", + "Horizontal": "Orizzontale", + "Edit group title": "Modifica titolo del gruppo", + "Title position": "Posizione titolo", + "Dashed": "Tratteggiato", + "Left": "Sinistra", + "Center": "Centro", + "Right": "Destra", + "Divider line color": "Colore linea di divisione", + "Label align": "Allineamento etichetta", + "Label width": "Larghezza etichetta", + "When the Label exceeds the width": "Quando l'etichetta supera la larghezza", + "Line break": "A capo", + "Ellipsis": "Ellipsis", + "Set block layout": "Imposta layout del blocco", + "Add & Update": "Aggiungi e aggiorna", + "Table size": "Dimensione della tabella", + "Plugin": "Plugin", + "Bulk enable": "Abilitazione in blocco", + "Search plugin...": "Cerca plugin...", + "Package name": "Nome pacchetto", + "Associate": "Associa", + "Please add or select record": "Aggiungi o seleziona record", + "No data": "Nessun dato", + "Fields can only be used correctly if they are defined with an interface.": "I campi possono essere utilizzati correttamente solo se sono definiti con un'interfaccia.", + "Unauthenticated. Please sign in to continue.": "Non autenticato. Accedi per continuare.", + "User not found. Please sign in again to continue.": "Impossibile trovare l'utente. Accedi nuovamente per continuare.", + "Your session has expired. Please sign in again.": "La tua sessione è scaduta. Accedi nuovamente.", + "User password changed, please signin again.": "La password dell'utente è stata modificata, accedi di nuovo.", + "Show file name": "Mostra nome del file", + "Outlined": "Contornato", + "Filled": "Riempito", + "Two tone": "Due toni", + "Desktop routes": "Percorsi desktop", + "Route permissions": "Permessi percorso", + "New routes are allowed to be accessed by default": "I nuovi percorsi sono accessibili per impostazione predefinita", + "Route name": "Nome percorso", + "Mobile routes": "Percorsi mobile", + "Show in menu": "Mostra nel menu", + "Hide in menu": "Nascondi nel menu", + "Path": "Percorso", + "Type": "Tipo", + "Access": "Accesso", + "Routes": "Percorsi", + "Add child route": "Aggiungi percorso figlio", + "Delete routes": "Elimina percorsi", + "Delete route": "Elimina percorso", + "Are you sure you want to hide these routes in menu?": "Sei sicuro di voler nascondere questi percorsi nel menu?", + "Are you sure you want to show these routes in menu?": "Sei sicuro di voler mostrare questi percorsi nel menu?", + "Are you sure you want to hide this menu?": "Sei sicuro di voler nascondere questo menu?", + "After hiding, this menu will no longer appear in the menu bar. To show it again, you need to go to the route management page to configure it.": "Dopo averlo nascosto, questo menu non apparirà più nella barra dei menu. Per mostrarlo di nuovo, devi andare alla pagina di gestione dei percorsi per configurarlo.", + "If selected, the page will display Tab pages.": "Se selezionato, la pagina visualizzerà le pagine schede.", + "If selected, the route will be displayed in the menu.": "Se selezionato, il percorso verrà visualizzato nel menu.", + "Are you sure you want to hide this tab?": "Sei sicuro di voler nascondere questa scheda?", + "After hiding, this tab will no longer appear in the tab bar. To show it again, you need to go to the route management page to set it.": "Dopo averla nascosta, questa scheda non apparirà più nella barra delle schede. Per mostrarla di nuovo, devi andare alla pagina di gestione dei percorsi per configurarlo." } diff --git a/packages/plugins/@nocobase/plugin-async-task-manager/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-async-task-manager/src/locale/it-IT.json index 8bb43f77a9..cd1e2c459d 100644 --- a/packages/plugins/@nocobase/plugin-async-task-manager/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-async-task-manager/src/locale/it-IT.json @@ -4,7 +4,7 @@ "Data": "Dati", "Task": "Attività", "Status": "Stato", - "Actions": "Operazioni", + "Actions": "Azioni", "Created at": "Creato alle", "Type": "Tipo", "Waiting": "In attesa", diff --git a/packages/plugins/@nocobase/plugin-backup-restore/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-backup-restore/src/locale/it-IT.json index 452be0fb9e..70f9feb195 100644 --- a/packages/plugins/@nocobase/plugin-backup-restore/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-backup-restore/src/locale/it-IT.json @@ -40,5 +40,11 @@ "custom.description": "Dati di raccolta personalizzati", "skipped.description": "Dati ignorati", "unknown.description": "Dati senza regole di dump configurate", - "third-party.description": "Informazioni sul servizio di terze parti" + "third-party.description": "Informazioni sul servizio di terze parti", + "Select Import data": "Seleziona dati da importare", + "Select Import Plugins": "Seleziona plugin di importazione", + "Select User Collections": "Seleziona raccolte utente", + "Basic Data": "Dati di base", + "Optional Data": "Dati opzionali", + "User Data": "Dati utente" } diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-calendar/src/locale/it-IT.json index a55b42ab8f..a8b4d37ec3 100644 --- a/packages/plugins/@nocobase/plugin-calendar/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/it-IT.json @@ -23,8 +23,8 @@ "Calendar collection": "Raccolta calendario", "Create calendar block": "Crea blocco calendario", "Filter": "Filtro", - "Configure actions": "Configura operazioni", - "Enable actions": "Abilita operazioni", + "Configure actions": "Configura azioni", + "Enable actions": "Abilita azioni", "Turn pages": "Cambia pagina", "Select view": "Seleziona vista", "Add new": "Aggiungi nuovo", diff --git a/packages/plugins/@nocobase/plugin-charts/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-charts/src/locale/it-IT.json index 0e4ab1a53a..9e1a427a21 100644 --- a/packages/plugins/@nocobase/plugin-charts/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-charts/src/locale/it-IT.json @@ -3,7 +3,7 @@ "Delete": "Elimina", "Cancel": "Annulla", "Submit": "Invia", - "Actions": "Operazioni", + "Actions": "Azioni", "Title": "Titolo", "Enable": "Abilita", "Chart": "Grafico", diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-data-visualization/src/locale/it-IT.json index 668ca91534..60090ca498 100644 --- a/packages/plugins/@nocobase/plugin-data-visualization/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-data-visualization/src/locale/it-IT.json @@ -3,7 +3,7 @@ "Delete": "Elimina", "Cancel": "Annulla", "Submit": "Invia", - "Actions": "Operazioni", + "Actions": "Azioni", "Title": "Titolo", "Enable": "Abilita", "Chart": "Grafico", @@ -76,7 +76,7 @@ "Expand": "Espandi", "Current filter": "Filtro corrente", "Add custom field": "Aggiungi campo personalizzato", - "To filter with custom fields, use \"Current filter\" variables in the chart configuration.": "Per filtrare con campi personalizzati, utilizza le variabili \"Current filter\" nella configurazione del grafico.", + "To filter with custom fields, use \"Current filter\" variables in the chart configuration.": "Per filtrare con campi personalizzati, utilizza le variabili \"Filtro corrente\" nella configurazione del grafico.", "Input": "Input", "Date range": "Intervallo date", "Time range": "Intervallo tempo", diff --git a/packages/plugins/@nocobase/plugin-error-handler/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-error-handler/src/locale/it-IT.json index a6c6b06d59..4cc1c90d77 100644 --- a/packages/plugins/@nocobase/plugin-error-handler/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-error-handler/src/locale/it-IT.json @@ -1,6 +1,5 @@ { "unique violation": "{{field}} già esiste", "notNull violation": "{{field}} non può essere vuoto", - "Validation error": "{{field}} errore di convalida", - "notNull Violation": "{{field}} non può essere vuoto" + "Validation error": "{{field}} errore di convalida" } diff --git a/packages/plugins/@nocobase/plugin-field-formula/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-field-formula/src/locale/it-IT.json index 1cc3afb64f..49a9f1cc42 100644 --- a/packages/plugins/@nocobase/plugin-field-formula/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-field-formula/src/locale/it-IT.json @@ -4,5 +4,5 @@ "Expression": "Espressione", "Expression syntax error": "Errore sintassi espressione", "Syntax references": "Riferimenti sintassi", - "Compute a value based on the other fields": "Calcola un valore in base a un altro campo" + "Configure and store the results of calculations between multiple field values in the same record, supporting both Math.js and Excel formula functions.": "Configura e memorizza i risultati dei calcoli tra più valori dei campi nello stesso record, supportando sia funzioni delle formule Math.js che quelli Excel." } diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-file-manager/src/locale/it-IT.json index e1d4a3aacb..778734b98a 100644 --- a/packages/plugins/@nocobase/plugin-file-manager/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-file-manager/src/locale/it-IT.json @@ -1,12 +1,10 @@ { "File manager": "Gestore file", "Attachment": "Allegato", - "MIME type": "Tipo MIME", - "Storage display name": "Nome visualizzato archivio", + "MIME type": "Tipo MIME", "Storage name": "Nome archivio", "Storage type": "Tipo archivio", - "Default storage": "Archivio predefinito", - "Storage base URL": "URL base archivio", + "Default storage": "Archivio predefinito", "Destination": "Destinazione", "Use the built-in static file server": "Usa il server di file statici integrato", "Local storage": "Archivio locale", diff --git a/packages/plugins/@nocobase/plugin-map/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-map/src/locale/it-IT.json index c5483d21e8..bb16275a84 100644 --- a/packages/plugins/@nocobase/plugin-map/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-map/src/locale/it-IT.json @@ -19,7 +19,7 @@ "Enter keywords to search": "Inserisci parole chiave per la ricerca", "The AccessKey is incorrect, please check it": "La chiave di accesso non è corretta, controllala", "Please configure the AMap securityCode or serviceHost correctly": "Configura correttamente AMap securityCode o serviceHost", - "Map Manager": "Gestore Mappe", + "Map manager": "Gestore Mappe", "Configuration": "Configurazione", "Saved successfully": "Salvataggio riuscito", "Saved failed": "Salvataggio fallito", diff --git a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/locale/it-IT.json index 8f0b8d40d1..c062312806 100644 --- a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/locale/it-IT.json @@ -6,7 +6,7 @@ "No more": "Non c'è altro", "Loading failed,": "Caricamento fallito,", "please reload": "ricarica", - "Detail": "Dettaglio", + "Detail": "Dettagli", "Content": "Contenuto", "Datetime": "Data e ora", "Status": "Stato", @@ -14,11 +14,11 @@ "Read": "Letto", "Unread": "Non letto", "In-app message": "Messaggio in-app", - "Receivers": "Destinatari", - "Channel name": "Nome canale", + "Receivers": "Destinatari", "Message group name": "Nome gruppo messaggi", "Message title": "Titolo messaggio", "Message content": "Contenuto messaggio", + "detail URL": "dettagli URL", "Details page for desktop": "Pagina dettagli per desktop", "Support two types of links: internal links and external links. If using an internal link, the link starts with\"/\", for example, \"/admin\". If using an external link, the link starts with \"http\", for example, \"https://example.com\".": "Supporta due tipi di link: link interni e link esterni. Se si utilizza un link interno, il link inizia con \"/\", ad esempio, \"/admin\". Se si utilizza un link esterno, il link inizia con \"http\", ad esempio, \"https://example.com\".", "Mark as read": "Segna come letto", diff --git a/packages/plugins/@nocobase/plugin-notification-manager/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-notification-manager/src/locale/it-IT.json index 326573c179..8810be949d 100644 --- a/packages/plugins/@nocobase/plugin-notification-manager/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-notification-manager/src/locale/it-IT.json @@ -18,9 +18,9 @@ "Channel display name": "Nome visualizzato canale", "Configure": "Configura", "Add new": "Aggiungi nuovo", - "Trigger From": "Attivato da", + "Trigger from": "Attivato da", "Status": "Stato", - "Created At": "Creato il", + "Created at": "Creato il", "Delete record": "Elimina record", "Are you sure you want to delete it?": "Sei sicuro di volerlo eliminare?", "Deleted successfully!": "Eliminato con successo!", @@ -32,7 +32,7 @@ "Select user": "Seleziona utente", "No channel enabled yet": "Nessun canale ancora abilitato", "Success": "Successo", - "Fail": "Fallito", + "Failure": "Fallimento", "Reason": "Motivo", "Failed reason": "Motivo fallimento", "Log detail": "Dettaglio registro", diff --git a/packages/plugins/@nocobase/plugin-snapshot-field/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-snapshot-field/src/locale/it-IT.json index d8046c85b6..49e39c1495 100644 --- a/packages/plugins/@nocobase/plugin-snapshot-field/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-snapshot-field/src/locale/it-IT.json @@ -2,7 +2,7 @@ "Detail": "Dettaglio", "Snapshot": "Snapshot", "Add block": "Aggiungi blocco", - "When adding a new record, create a snapshot for its relational record and save in the current record. The snapshot is not updated when the record is subsequently updated.": "Quando si aggiunge un nuovo record, crea uno snapshot del suo record relazionale e salvalo nel record corrente. Lo snapshot non viene aggiornato quando il record viene successivamente aggiornato.", + "When adding a new record, create a snapshot for its relational record and save in the new record. The snapshot will not be updated when the relational record is updated.": "Quando si aggiunge un nuovo record, crea uno snapshot del suo record relazionale e salvalo nel nuovo record. Quando il record relazionale viene aggiornato lo snapshot non verrà aggiornato .", "View record": "Visualizza record", "Allow linking to multiple records": "Consenti collegamento a più record", "The association field to snapshot": "Campo di associazione per lo snapshot", diff --git a/packages/plugins/@nocobase/plugin-workflow-action-trigger/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-workflow-action-trigger/src/locale/it-IT.json index fccf898cf0..e3e482f32b 100644 --- a/packages/plugins/@nocobase/plugin-workflow-action-trigger/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-workflow-action-trigger/src/locale/it-IT.json @@ -1,9 +1,17 @@ { - "Form event": "Evento modulo", - "Event triggers when submitted a workflow bound form action.": "L'evento si attiva quando viene inviata un'azione di un modulo associato a un workflow.", - "Form data model": "Modello dati modulo", - "Use a collection to match form data.": "Utilizza una raccolta per abbinare i dati del modulo.", + "Post-action event": "Evento post-azione", + "Triggered after the completion of a request initiated through an action button or API, such as after adding or updating data. Suitable for data processing, sending notifications, etc., after actions are completed.": + "Attivato dopo il completamento con esito positivo di una richiesta avviata tramite un pulsante di azione o un'API, ad esempio dopo l'aggiunta o l'aggiornamento di dati. Adatto per l'elaborazione dei dati, l'invio di notifiche, ecc. dopo il completamento delle azioni.", + "Collection": "Raccolta", + "The collection to which the triggered data belongs.": "La raccolta a cui appartengono i dati attivati.", + "Trigger mode": "Modalità di attivazione", + "Local mode, triggered after the completion of actions bound to this workflow": "Modalità locale, attivata dopo il completamento delle azioni associate a questo workflow", + "Global mode, triggered after the completion of the following actions": "Modalità globale, attivata dopo il completamento delle seguenti azioni", + "Select actions": "Seleziona azioni", + "Create record action": "Azione di creazione record", + "Update record action": "Azione di aggiornamento record", "Associations to use": "Associazioni da utilizzare", - "User submitted form": "Modulo inviato dall'utente", - "Role of user submitted form": "Ruolo del modulo inviato dall'utente" + "Trigger data": "Dati attivazione", + "User acted": "Utente che ha agito", + "Role of user acted": "Ruolo dell'utente che ha agito" } diff --git a/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/locale/it-IT.json index de4ad60b2a..11fabc54a9 100644 --- a/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/src/locale/it-IT.json @@ -1,11 +1,12 @@ { - "Dynamic Calculation": "Calcolo dinamico", + "Expression": "Espressione", + "Dynamic expression calculation": "Calcolo dinamico", "Calculate an expression based on a calculation engine and obtain a value as the result. Variables in the upstream nodes can be used in the expression. The expression is dynamic one from an expression collections.": "Calcola un'espressione basata su un motore di calcolo e ottiene un valore come risultato. Nell'espressione è possibile utilizzare variabili dai nodi upstream. L'espressione è ottenuta dinamicamente da una raccolta di espressioni.", "Select dynamic expression": "Seleziona espressione dinamica", "Select the dynamic expression queried from the upstream node. You need to query it from an expression collection.": "Seleziona l'espressione dinamica interrogata dal nodo upstream. È necessario interrogarla da una raccolta di espressioni.", "Variable datasource": "Origine dati variabile", "Dynamic expression": "Espressione dinamica", - "An expression for calculation in each rows": "Un'espressione per il calcolo in ogni riga", + "Used to store expressions for use in workflows so that different expressions can be called for different data.": "Utilizzato per memorizzare espressioni da usare nei workflow in modo che per dati diversi possano essere chiamate espressioni diverse", "Unconfigured": "Non configurato", "Calculation result": "Risultato del calcolo" } diff --git a/packages/plugins/@nocobase/plugin-workflow-loop/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-workflow-loop/src/locale/it-IT.json index cf8c80770d..4fde1d0880 100644 --- a/packages/plugins/@nocobase/plugin-workflow-loop/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-workflow-loop/src/locale/it-IT.json @@ -1,9 +1,22 @@ { "Loop": "Ciclo", "Loop target": "Destinazione ciclo", - "Loop index": "Indice ciclo", + "Loop index (starts from 0)": "Indice del ciclo (inizia da 0)", + "Loop sequence (starts from 1)": "Sequenza del ciclo (inizia da 1)", "Loop length": "Lunghezza ciclo", - "By using a loop node, you can perform the same operation on multiple sets of data. The source of these sets can be either multiple records from a query node or multiple associated records of a single record. Loop node can also be used for iterating a certain number of times or for looping through each character in a string. However, excessive looping may cause performance issues, so use with caution.": "Utilizzando un nodo ciclo, puoi eseguire la stessa operazione su più insiemi di dati. L' origine di questi insiemi può essere costituita da record multipli di un nodo query o da record multipli associati di singolo record. Il nodo ciclo può essere utilizzato anche per iterare un certo numero di volte o per scorrere ogni carattere in una stringa. Tuttavia, un numero eccessivamente elevato di cicli può causare problemi di prestazioni, quindi usalo con cautela.", - "Scope variables": "Variabili ambito", - "A single number will be treated as a loop count, a single string will be treated as an array of characters, and other non-array values will be converted to arrays. The loop node ends when the loop count is reached, or when the array loop is completed. You can also add condition nodes to the loop to terminate it.": "Un singolo numero verrà trattato come conteggio del ciclo, una singola stringa verrà trattata come un array di caratteri e altri valori non-array verranno convertiti in array. Il nodo ciclo termina quando viene raggiunto il conteggio del ciclo o quando il ciclo dell'array è completato. Puoi anche aggiungere nodi condizione al ciclo per terminarlo." + "By using a loop node, you can perform the same operation on multiple sets of data. The source of these sets can be either multiple records from a query node or multiple associated records of a single record. Loop node can also be used for iterating a certain number of times or for looping through each character in a string. However, excessive looping may cause performance issues, so use with caution.": "Utilizzando un nodo ciclo, puoi eseguire la stessa operazione su più insiemi di dati. L' origine di questi insiemi può essere costituita da record multipli di un nodo query o da record multipli associati di singolo record. Il nodo ciclo può essere utilizzato anche per iterare un certo numero di volte o per scorrere ogni carattere in una stringa. Tuttavia, un numero eccessivamente elevato di cicli può causare problemi di prestazioni, quindi usalo con cautela.", + "A single number will be treated as a loop count, a single string will be treated as an array of characters, and other non-array values will be converted to arrays. The loop node ends when the loop count is reached, or when the array loop is completed. You can also add condition nodes to the loop to terminate it.": "Un singolo numero verrà trattato come conteggio del ciclo, una singola stringa verrà trattata come un array di caratteri e altri valori non-array verranno convertiti in array. Il nodo ciclo termina quando viene raggiunto il conteggio del ciclo o quando il ciclo dell'array è completato. Puoi anche aggiungere nodi condizione al ciclo per terminarlo.", + "Enable loop condition": "Abilita condizione del ciclo", + "Loop condition on each item": "Condizione del ciclo su ciascun elemento", + "When to check": "Quando controllare", + "Before each starts": "Prima dell'inizio di ogni ciclo", + "After each ends": "Dopo la fine di ogni ciclo", + "When condition is not met on item": "Quando la condizione non è soddisfatta sull'elemento", + "Exit loop": "Esci dal ciclo", + "Continue on next item": "Continua con l'elemento successivo", + "Condition": "Condizione", + "When node inside loop failed": "Quando il nodo all'interno del ciclo fallisce", + "Continue loop on next item": "Continua il ciclo con l'elemento successivo", + "Exit loop and continue workflow": "Esci dal ciclo e continua il workflow", + "Exit workflow": "Esci dal workflow" } diff --git a/packages/plugins/@nocobase/plugin-workflow-manual/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-workflow-manual/src/locale/it-IT.json index f8edafafc9..fa6734c64b 100644 --- a/packages/plugins/@nocobase/plugin-workflow-manual/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-workflow-manual/src/locale/it-IT.json @@ -7,10 +7,10 @@ "User interface": "Interfaccia utente", "Configure user interface": "Configura interfaccia utente", "View user interface": "Visualizza interfaccia utente", - "Separately": "Separato", - "Each user has own task": "Ogni utente ha il proprio compito", + "Separately": "Separato", + "Each user has own task": "Ogni utente ha la propria attività", "Collaboratively": "Collaborativo", - "Everyone shares one task": "Tutti condividono un compito", + "Everyone shares one task": "Tutti condividono un attività", "Negotiation": "Negoziazione", "All pass": "Tutti passano", "Everyone should pass": "Tutti dovrebbero passare", @@ -25,6 +25,11 @@ "Create record form": "Modulo creazione record", "Update record form": "Modulo aggiornamento record", "Filter settings": "Impostazioni filtro", - "Workflow todos": "'Da fare' del workflow", - "Task": "Compito" + "Workflow todos": "Da fare", + "Task node": "Nodo attività", + "Unprocessed": "Non elaborato", + "Please check one of your update record form, and add at least one filter condition in form settings.": "Verifica uno dei tuoi moduli di aggiornamento record e aggiungi almeno una condizione nel filtro nelle impostazioni del modulo.", + "My manual tasks": "Le mie attività manuali", + "Task title": "Titolo attività", + "Title of each task item. Default to node title.": "Titolo di ogni elemento attività. Predefinito: titolo del nodo." } diff --git a/packages/plugins/@nocobase/plugin-workflow-notification/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-workflow-notification/src/locale/it-IT.json index 5f0df3352a..71dab29fc9 100644 --- a/packages/plugins/@nocobase/plugin-workflow-notification/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-workflow-notification/src/locale/it-IT.json @@ -1,4 +1,4 @@ { - "Send email. You can use the variables in the upstream nodes as receivers, subject and content of the email.": "Invia email chiamando il servizio SMTP. Puoi usare le variabili nei nodi upstream come destinatari, oggetto e contenuto dell'email.", - "Ignore failed sending and continue workflow": "Ignora l'invio fallito e continua il workflow" + "Notification": "Notifiche", + "Send notification. You can use the variables in the upstream nodes as content and ohter config.": "Invia notifica. Puoi usare le variabili nei nodi upstream come contenuto e altre configurazioni" } diff --git a/packages/plugins/@nocobase/plugin-workflow-parallel/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-workflow-parallel/src/locale/it-IT.json index 5ecee1775a..6fcd80285e 100644 --- a/packages/plugins/@nocobase/plugin-workflow-parallel/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-workflow-parallel/src/locale/it-IT.json @@ -2,6 +2,7 @@ "Parallel branch": "Ramo parallelo", "Run multiple branch processes in parallel.": "Esegui più processi del ramo in parallelo.", "Add branch": "Aggiungi ramo", + "Mode": "Modalità di esecuzione", "All succeeded": "Tutti riusciti", "Any succeeded": "Qualsiasi riuscito", "Any succeeded or failed": "Qualsiasi riuscito o fallito", diff --git a/packages/plugins/@nocobase/plugin-workflow-request/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-workflow-request/src/locale/it-IT.json index 8dd08cce30..fc1828e86c 100644 --- a/packages/plugins/@nocobase/plugin-workflow-request/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-workflow-request/src/locale/it-IT.json @@ -9,12 +9,16 @@ "Add parameter": "Aggiungi parametro", "Body": "Corpo", "Use variable": "Usa variabile", + "Add key-value pairs": "Aggiungi coppie chiave-valore", "Format": "Formato", "Insert": "Inserisci", - "Timeout config": "Configurazione timeout", - "ms": "ms", + "Timeout": "Timeout", + "Milliseconds": "ms", "Input request data": "Inserisci dati richiesta", "Only support standard JSON data": "Supporta solo dati JSON standard", - "\"Content-Type\" only support \"application/json\", and no need to specify": "\"Content-Type\" supporta solo \"application/json\", e non è necessario specificarlo", - "Ignore failed request and continue workflow": "Ignora la richiesta fallita e continua il workflow" + "\"Content-Type\" will be ignored from headers.": "\"Content-Type\" sarà ignorato dall'intestazione", + "Ignore failed request and continue workflow": "Ignora la richiesta fallita e continua il workflow", + "Status code": "Codice stato", + "Data": "Dati", + "Response headers": "Intestazioni risposta" } diff --git a/packages/plugins/@nocobase/plugin-workflow-sql/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-workflow-sql/src/locale/it-IT.json index 4aaa8d60fa..b34f90eccf 100644 --- a/packages/plugins/@nocobase/plugin-workflow-sql/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-workflow-sql/src/locale/it-IT.json @@ -1,5 +1,7 @@ { "SQL action": "Azione SQL", - "Execute a SQL statement in database": "Esegui un'istruzione SQL nel database", - "Usage of SQL query result is not supported yet.": "L'utilizzo del risultato della query SQL non è ancora supportato." + "Execute a SQL statement in database.": "Esegui un'istruzione SQL nel database.", + "Select a data source to execute SQL.": "Seleziona un origine dati per eseguire SQL.", + "SQL query result could be used through <1>JSON query node (Commercial plugin).": "Il risultato della query SQL potrebbe essere utilizzato tramite il <1>nodo JSON query(plugin commerciale).", + "Include meta information of this query in result": "Includi meta informazioni di questa query nel risultato" } diff --git a/packages/plugins/@nocobase/plugin-workflow/src/locale/it-IT.json b/packages/plugins/@nocobase/plugin-workflow/src/locale/it-IT.json index b5f141b641..c714b7c4b2 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/locale/it-IT.json +++ b/packages/plugins/@nocobase/plugin-workflow/src/locale/it-IT.json @@ -53,13 +53,8 @@ "By custom date": "Per data personalizzata", "Advanced": "Avanzato", "End": "Fine", - "Node result": "Risultato nodo", - "Constant": "Costante", - "Null": "Null", - "Boolean": "Booleano", - "String": "Stringa", - "Operator": "Operatore", - "Arithmetic calculation": "Calcolo aritmetico", + "Node result": "Risultato nodo", + "Operator": "Operatore", "String operation": "Operazione stringa", "Executed at": "Eseguito alle", "Queueing": "In coda", @@ -73,28 +68,138 @@ "Collection operations": "Operazioni raccolta", "Extended types": "Tipi estesi", "Node type": "Tipo nodo", - "Calculation": "Calcolo", - "Configure calculation": "Configura calcolo", + "Calculation": "Calcolo", "Calculation result": "Risultato calcolo", "True": "Vero", "False": "Falso", "concat": "concatena", "Condition": "Condizione", "Mode": "Modalità", - "Continue when \"Yes\"": "Continua quando \"Yes\"", - "Branch into \"Yes\" and \"No\"": "Dirama in \"Yes\" e \"No\"", - "Conditions": "Condizioni", + "Continue when \"Yes\"": "Continua quando \"Sì\"", + "Branch into \"Yes\" and \"No\"": "Dirama in \"Sì\" e \"No\"", "Create record": "Crea record", "Update record": "Aggiorna record", "Query record": "Interroga record", "Multiple records": "Record multipli", "Please select collection first": "Seleziona prima la raccolta", - "Only update records matching conditions": "Aggiorna solo i record che corrispondono alle condizioni", - "Fields that are not assigned a value will be set to the default value, and those that do not have a default value are set to null.": "I campi a cui non è assegnato un valore verranno impostati sul valore predefinito, e quelli che non hanno un valore predefinito verranno impostati su null.", - "Trigger in executed workflow cannot be modified": "Il trigger nel workflow eseguito non può essere modificato", - "Node in executed workflow cannot be modified": "Il nodo nel workflow eseguito non può essere modificato", + "Only update records matching conditions": "Aggiorna solo i record che corrispondono alle condizioni", "Can not delete": "Impossibile eliminare", "The result of this node has been referenced by other nodes ({{nodes}}), please remove the usage before deleting.": "Il risultato di questo nodo è stato referenziato da altri nodi ({{nodes}}), rimuovi l'utilizzo prima di eliminare.", - "Maximum number of loop calls": "Numero massimo di chiamate ciclo", - "If the number of loop calls is too large, there will be performance issues.": "Se il numero di chiamate ciclo è troppo grande, ci saranno problemi di prestazioni." + "Clear all executions": "Cancella tutte le esecuzioni", + "Clear executions will not reset executed count, and started executions will not be deleted, are you sure you want to delete them all?": "La cancellazione delle esecuzioni non reimposta il conteggio delle esecuzioni e le esecuzioni avviate non verranno eliminate. Sei sicuro di volerle eliminare tutte?", + "Sync": "Sincronizza", + "Sync enabled status of all workflows from database": "Sincronizza lo stato abilitato di tutti i workflow dal database", + "Duplicate to new workflow": "Duplica in un nuovo workflow", + "Delete a main version will cause all other revisions to be deleted too.": "L'eliminazione di una versione principale comporterà l'eliminazione anche di tutte le altre revisioni.", + "Execute manually": "Esegui manualmente", + "The trigger is not configured correctly, please check the trigger configuration.": "Il trigger non è configurato correttamente, controlla la configurazione del trigger.", + "This type of trigger has not been supported to be executed manually.": "Questo tipo di trigger non è supportato per l'esecuzione manuale.", + "Trigger variables need to be filled for executing.": "Le variabili del trigger devono essere compilate per l'esecuzione.", + "A new version will be created automatically after execution if current version is not executed.": "Se la versione corrente non è stata eseguita, verrà creata automaticamente una nuova versione dopo l'esecuzione.", + "This will perform all the actions configured in the workflow. Are you sure you want to continue?": "Verranno eseguite tutte le azioni configurate nel workflow. Sei sicuro di voler continuare?", + "Automatically create a new version after execution": "Crea automaticamente una nuova versione dopo l'esecuzione", + "Workflow executed, the result status is <1>{{statusText}}<2>View the execution": "Workflow eseguito, lo stato del risultato è <1>{{statusText}}<2>Visualizza l'esecuzione", + "Use transaction": "Usa transazione", + "Data operation nodes in workflow will run in a same transaction until any interruption. Any failure will cause data rollback, and will also rollback the history of the execution.": "I nodi di operazione dati nel workflow verranno eseguiti nella stessa transazione fino a qualsiasi interruzione. Qualsiasi errore causerà il rollback dei dati e ripristinerà anche la cronologia dell'esecuzione.", + "Auto delete history when execution is on end status": "Elimina automaticamente la cronologia quando l'esecuzione è in stato finale", + "Maximum number of cycling triggers": "Numero massimo di trigger ciclici", + "The triggers of same workflow by some node (create, update and sub-flow etc.) more than this number will be ignored. Large number may cause performance issues. Please use with caution.": "I trigger dello stesso workflow da un nodo (crea, aggiorna e sub-flow ecc.) superiori a questo numero verranno ignorati. Un numero elevato può causare problemi di prestazioni. Si prega di usare con cautela.", + "Unknown trigger": "Trigger sconosciuto", + "Workflow with unknown type will cause error. Please delete it or check plugin which provide this type.": "Un workflow con tipo sconosciuto causerà un errore. Si prega di eliminarlo o controllare il plugin che fornisce questo tipo.", + "Execute mode": "Modalità di esecuzione", + "Execute workflow asynchronously or synchronously based on trigger type, and could not be changed after created.": "Esegui il workflow in modo asincrono o sincrono in base al tipo di trigger e non può essere modificato dopo la creazione.", + "Asynchronously": "Asincrono", + "Synchronously": "Sincrono", + "Will be executed in the background as a queued task.": "Verrà eseguito in background come attività in coda.", + "For user actions that require immediate feedback. Can not use asynchronous nodes in such mode, and it is not recommended to perform time-consuming operations under synchronous mode.": "Per le azioni dell'utente che richiedono un feedback immediato. Non è possibile utilizzare nodi asincroni in questa modalità e non è consigliabile eseguire operazioni che richiedono tempo in modalità sincrona.", + "Go back": "Torna indietro", + "Bind workflows": "Collega workflow", + "Support pre-action event (local mode), post-action event (local mode), and approval event here.": "Qui sono supportati evento pre-azione (modalità locale), evento post-azione (modalità locale) e evento di approvazione.", + "Workflow will be triggered directly once the button clicked, without data saving. Only supports to be bound with \"Custom action event\".": "Il workflow verrà attivato direttamente una volta cliccato il pulsante, senza salvataggio dei dati. Supporta solo il collegamento con \"evento azione personalizzata\".", + "\"Submit to workflow\" to \"Post-action event\" is deprecated, please use \"Custom action event\" instead.": "\"Invia a workflow\" a \"evento post-azione\" è obsoleto, si prega di utilizzare invece \"evento azione personalizzata\".", + "Workflow will be triggered before deleting succeeded (only supports pre-action event in local mode).": "Il workflow verrà attivato prima dell'eliminazione riuscita (supporta solo l'evento pre-azione in modalità locale).", + "Submit to workflow": "Invia a workflow", + "Add workflow": "Aggiungi workflow", + "Select workflow": "Seleziona workflow", + "Trigger data context": "Contesto dati trigger", + "Full form data": "Dati completi del modulo", + "Select context": "Seleziona contesto", + "Triggered when data changes in the collection, such as after adding, updating, or deleting a record. Unlike \"Post-action event\", Collection event listens for data changes rather than HTTP requests. Unless you understand the exact meaning, it is recommended to use \"Post-action event\".": "Attivato quando i dati cambiano nella raccolta, ad esempio dopo l'aggiunta, l'aggiornamento o l'eliminazione di un record. A differenza dell' \"evento post-azione\", l'evento raccolta ascolta le modifiche dei dati anziché le richieste HTTP. A meno che tu non capisca il significato esatto, si consiglia di utilizzare \"Evento post-azione\".", + "Preload associations": "Precarica associazioni", + "Please select the associated fields that need to be accessed in subsequent nodes. With more than two levels of to-many associations may cause performance issue, please use with caution.": "Seleziona i campi associati a cui è necessario accedere nei nodi successivi. Con più di due livelli di associazioni molti-a-molti possono verificarsi problemi di prestazioni, si prega di usare con cautela.", + "Choose a record or primary key of a record in the collection to trigger.": "Scegli un record o la chiave primaria di un record nella raccolta per attivare.", + "Triggered according to preset time conditions. Suitable for one-time or periodic tasks, such as sending notifications and cleaning data on a schedule.": "Attivato secondo condizioni di tempo preimpostate. Adatto per attività una tantum o periodiche, come l'invio di notifiche e la pulizia dei dati in base a una pianificazione.", + "Execute on": "Esegui su", + "Current time": "Ora corrente", + "Variable key of node": "Chiave variabile del nodo", + "Scope variables": "Variabili di ambito", + "Calculate an expression based on a calculation engine and obtain a value as the result. Variables in the upstream nodes can be used in the expression.": "Calcola un'espressione basata su un motore di calcolo e ottieni un valore come risultato. Le variabili nei nodi upstream possono essere utilizzate nell'espressione.", + "System variables": "Variabili di sistema", + "System time": "Ora di sistema", + "Date variables": "Variabili data", + "Date range": "Intervallo date", + "Resolved": "Risolto", + "Error": "Errore", + "Aborted": "Interrotto", + "Rejected": "Rifiutato", + "Retry needed": "Richiesto nuovo tentativo", + "Completed": "Completato", + "All": "Tutto", + "View result": "Visualizza risultato", + "Triggered but still waiting in queue to execute.": "Attivato ma ancora in attesa in coda per l'esecuzione.", + "Started and executing, maybe waiting for an async callback (manual, delay etc.).": "Avviato ed in esecuzione, forse in attesa di un callback asincrono (manuale, ritardo ecc.).", + "Successfully finished.": "Terminato con successo.", + "Failed to satisfy node configurations.": "Fallito nel soddisfare le configurazioni del nodo.", + "Some node meets error.": "Qualche nodo presenta un errore.", + "Running of some node was aborted by program flow.": "L'esecuzione di qualche nodo è stata interrotta dal flusso del programma.", + "Manually canceled whole execution when waiting.": "L'intera esecuzione è stata cancellata manualmente durante l'attesa.", + "Rejected from a manual node.": "Rifiutato da un nodo manuale.", + "General failed but should do another try.": "Fallimento generico, ma dovrebbe essere fatto un altro tentativo.", + "Cancel the execution": "Annulla l'esecuzione", + "Are you sure you want to cancel the execution?": "Sei sicuro di voler annullare l'esecuzione?", + "Operations": "Operazioni", + "Manual": "Manuale", + "Unknown node": "Nodo sconosciuto", + "Node with unknown type will cause error. Please delete it or check plugin which provide this type.": "Un nodo con tipo sconosciuto causerà un errore. Si prega di eliminarlo o controllare il plugin che fornisce questo tipo.", + "Calculation engine": "Motore di calcolo", + "Basic": "Base", + "Calculation expression": "Espressione di calcolo", + "Expression syntax error": "Errore di sintassi dell'espressione", + "Syntax references: ": "Riferimenti di sintassi:", + "Based on boolean result of the calculation to determine whether to \"continue\" or \"exit\" the process, or continue on different branches of \"yes\" and \"no\".": "Basato sul risultato booleano del calcolo per determinare se \"continuare\" o \"uscire\" dal processo, o continuare su rami diversi di \"sì\" e \"no\".", + "Condition expression": "Espressione di condizione", + "Inside of \"Yes\" branch": "All'interno del ramo \"Sì\"", + "Inside of \"No\" branch": "All'interno del ramo \"No\"", + "Add new record to a collection. You can use variables from upstream nodes to assign values to fields.": "Aggiungi un nuovo record a una raccolta. Puoi usare variabili dai nodi upstream per assegnare valori ai campi.", + "Update records of a collection. You can use variables from upstream nodes as query conditions and field values.": "Aggiorna i record di una raccolta. Puoi usare variabili dai nodi upstream come condizioni di query e valori campo.", + "Update mode": "Modalità di aggiornamento", + "Update in a batch": "Aggiornamento in batch", + "Update one by one": "Aggiornamento uno per uno", + "Update all eligible data at one time, which has better performance when the amount of data is large. But association fields are not supported (unless foreign key in current collection), and the updated data will not trigger other workflows.": "Aggiorna tutti i dati idonei in una volta, il che ha prestazioni migliori quando la quantità di dati è grande. Ma i campi di associazione non sono supportati (a meno che la chiave esterna non sia nella raccolta corrente), e i dati aggiornati non attiveranno altri workflow.", + "The updated data can trigger other workflows, and the audit log will also be recorded. But it is usually only applicable to several or dozens of pieces of data, otherwise there will be performance problems.": "I dati aggiornati possono attivare altri workflow, e il registro eventi sarà anche registrato. Ma di solito è applicabile solo a diverse o decine di dati, altrimenti ci saranno problemi di prestazioni.", + "Query records from a collection. You can use variables from upstream nodes as query conditions.": "Interroga i record da una raccolta. Puoi usare variabili dai nodi upstream come condizioni di query.", + "Allow multiple records as result": "Consenti più record come risultato", + "If checked, when there are multiple records in the query result, an array will be returned as the result, which can be operated on one by one using a loop node. Otherwise, only one record will be returned.": "Se selezionato, quando ci sono più record nel risultato della query, sarà restituito come risultato un array, che può essere operato uno per uno usando un nodo ciclo. Altrimenti, sarà restituito solo un record.", + "Result type": "Tipo risultato", + "Single record": "Record singolo", + "The result will be an object of the first matching record only, or null if no matched record.": "Il risultato sarà un oggetto solo del primo record corrispondente, oppure null se non vi è alcun record corrispondente.", + "The result will be an array containing matched records, or an empty one if no matching records. This can be used to be processed in a loop node.": "Il risultato sarà un array contenente record corrispondenti, o uno vuoto se non ci sono record corrispondenti. Questo può essere usato per essere elaborato in un nodo ciclo.", + "Exit when query result is null": "Esci quando il risultato della query è null", + "Please add at least one condition": "Si prega di aggiungere almeno una condizione", + "Unassigned fields will be set to default values, and those without default values will be set to null.": "I campi non assegnati saranno impostati ai valori predefiniti, e quelli senza valori predefiniti saranno impostati a null.", + "Delete record": "Elimina record", + "Delete records of a collection. Could use variables in workflow context as filter. All records match the filter will be deleted.": "Elimina i record di una raccolta. Potrebbe usare variabili nel contesto del workflow come filtro. Tutti i record che corrispondono al filtro saranno eliminati.", + "Executed workflow cannot be modified. Could be copied to a new version to modify.": "Il workflow eseguito non può essere modificato. Potrebbe essere copiato in una nuova versione per essere modificato.", + "End process": "Termina processo", + "End the process immediately, with set status.": "Termina il processo immediatamente, con stato impostato.", + "End status": "Stato finale", + "Test run": "Test run", + "Test run will do the actual data manipulating or API calling, please use with caution.": "Il test run farà l'effettiva manipolazione dei dati o la chiamata API, si prega di usare con cautela.", + "No variable": "Nessuna variabile", + "Add node": "Aggiungi nodo", + "Move all downstream nodes to": "Sposta tutti i nodi downstream a", + "After end of branches": "Dopo la fine dei rami", + "Inside of branch": "All'interno del ramo", + "Workflow todos": "Da fare", + "New version enabled": "Nuova versione abilitata" } From 92f7f3f390a47dff5ef1a0979d7b1aded0ec702c Mon Sep 17 00:00:00 2001 From: Sheldon Guo Date: Thu, 20 Mar 2025 09:40:58 +0800 Subject: [PATCH 4/9] fix(notification-email): adjust column widths and add description for secure setting (#6501) --- .../plugin-notification-email/src/client/ConfigForm.tsx | 8 +++++--- .../plugin-notification-email/src/locale/zh-CN.json | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-notification-email/src/client/ConfigForm.tsx b/packages/plugins/@nocobase/plugin-notification-email/src/client/ConfigForm.tsx index f1c0a8587f..c4c6c0470c 100644 --- a/packages/plugins/@nocobase/plugin-notification-email/src/client/ConfigForm.tsx +++ b/packages/plugins/@nocobase/plugin-notification-email/src/client/ConfigForm.tsx @@ -42,7 +42,7 @@ export const ChannelConfigForm = () => { type: 'void', 'x-component': 'Grid.Col', 'x-component-props': { - width: 50, + width: 45, }, properties: { host: { @@ -62,7 +62,7 @@ export const ChannelConfigForm = () => { type: 'void', 'x-component': 'Grid.Col', 'x-component-props': { - width: 25, + width: 20, }, properties: { port: { @@ -92,7 +92,7 @@ export const ChannelConfigForm = () => { type: 'void', 'x-component': 'Grid.Col', 'x-component-props': { - width: 25, + width: 35, }, properties: { secure: { @@ -100,6 +100,8 @@ export const ChannelConfigForm = () => { title: '{{t("Secure")}}', 'x-decorator': 'FormItem', 'x-component': 'TextAreaWithGlobalScope', + description: + '{{t("In most cases, if using port 465, set it to true; otherwise, set it to false.")}}', 'x-component-props': { boolean: true, useTypedConstant: [['boolean', { style: { width: '100%' } }]], diff --git a/packages/plugins/@nocobase/plugin-notification-email/src/locale/zh-CN.json b/packages/plugins/@nocobase/plugin-notification-email/src/locale/zh-CN.json index 6a74e27196..e29654a9eb 100644 --- a/packages/plugins/@nocobase/plugin-notification-email/src/locale/zh-CN.json +++ b/packages/plugins/@nocobase/plugin-notification-email/src/locale/zh-CN.json @@ -18,5 +18,6 @@ "SMTP server host": "SMTP 服务器主机", "Content type": "内容格式", "Plain text": "纯文本", - "Transport": "传输方式" + "Transport": "传输方式", + "In most cases, if using port 465, set it to true; otherwise, set it to false.": "通常情况下,如果使用端口 465 ,请设置为 true ;否则,请设置为 false 。" } From 87c1fee42534cf945cca8091899deeb46ad9b373 Mon Sep 17 00:00:00 2001 From: Katherine Date: Thu, 20 Mar 2025 09:50:56 +0800 Subject: [PATCH 5/9] fix: failed required validation for map management secret key fields (#6509) --- .../plugins/@nocobase/plugin-map/package.json | 4 ++-- .../src/client/components/Configuration.tsx | 17 +++++++++++++---- .../@nocobase/plugin-map/src/locale/zh-CN.json | 5 ++++- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-map/package.json b/packages/plugins/@nocobase/plugin-map/package.json index 4e002704cc..05e1f9febd 100644 --- a/packages/plugins/@nocobase/plugin-map/package.json +++ b/packages/plugins/@nocobase/plugin-map/package.json @@ -7,8 +7,8 @@ "description.zh-CN": "地图区块,支持高德地图和 Google 地图,你也可以扩展更多地图类型。", "license": "AGPL-3.0", "main": "./dist/server/index.js", - "homepage": "https://docs.nocobase.com/handbook/map", - "homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/map", + "homepage": "https://docs.nocobase.com/handbook/block-map", + "homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/block-map", "devDependencies": { "@amap/amap-jsapi-loader": "^1.0.1", "@amap/amap-jsapi-types": "^0.0.10", diff --git a/packages/plugins/@nocobase/plugin-map/src/client/components/Configuration.tsx b/packages/plugins/@nocobase/plugin-map/src/client/components/Configuration.tsx index 589ef5185a..9eacc12916 100644 --- a/packages/plugins/@nocobase/plugin-map/src/client/components/Configuration.tsx +++ b/packages/plugins/@nocobase/plugin-map/src/client/components/Configuration.tsx @@ -32,7 +32,8 @@ const BaseConfiguration: React.FC = ({ type, children }) return apiClient.resource(MapConfigurationResourceKey); }, [apiClient]); - const onSubmit = (values) => { + const onSubmit = async (values) => { + await form.validateFields(); resource .set({ ...values, @@ -62,10 +63,18 @@ const AMapConfiguration = () => { const { t } = useMapTranslation(); return ( - + - + @@ -76,7 +85,7 @@ const GoogleMapConfiguration = () => { const { t } = useMapTranslation(); return ( - + diff --git a/packages/plugins/@nocobase/plugin-map/src/locale/zh-CN.json b/packages/plugins/@nocobase/plugin-map/src/locale/zh-CN.json index a55d5e3778..c8debc9810 100644 --- a/packages/plugins/@nocobase/plugin-map/src/locale/zh-CN.json +++ b/packages/plugins/@nocobase/plugin-map/src/locale/zh-CN.json @@ -47,5 +47,8 @@ "Create map block": "创建地图区块", "Start point": "起点", "End point": "终点", - "Concatenation order field": "连接顺序字段" + "Concatenation order field": "连接顺序字段", + "securityJsCode or serviceHost is required": "securityJsCode 或 serviceHost 是必填", + "Access key is required": "访问密钥是必填", + "Api key is required": "Api key 是必填" } From 9c72cba8f51eec49bbbd9a0bf28751fa535c2fda Mon Sep 17 00:00:00 2001 From: Sheldon Guo Date: Thu, 20 Mar 2025 10:50:21 +0800 Subject: [PATCH 6/9] feat(mailer): add description for secure setting and update translations (#6510) --- .../plugin-workflow-mailer/src/client/MailerInstruction.tsx | 3 ++- .../@nocobase/plugin-workflow-mailer/src/locale/en-US.json | 3 ++- .../@nocobase/plugin-workflow-mailer/src/locale/zh-CN.json | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-workflow-mailer/src/client/MailerInstruction.tsx b/packages/plugins/@nocobase/plugin-workflow-mailer/src/client/MailerInstruction.tsx index 08c148521d..4b02a7d641 100644 --- a/packages/plugins/@nocobase/plugin-workflow-mailer/src/client/MailerInstruction.tsx +++ b/packages/plugins/@nocobase/plugin-workflow-mailer/src/client/MailerInstruction.tsx @@ -7,9 +7,9 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import React from 'react'; import { MailOutlined } from '@ant-design/icons'; import { ArrayItems } from '@formily/antd-v5'; +import React from 'react'; import { SchemaComponentContext, css } from '@nocobase/client'; import { @@ -112,6 +112,7 @@ export default class extends Instruction { secure: { type: 'boolean', title: `{{t("Secure", { ns: "${NAMESPACE}" })}}`, + description: `{{t("In most cases, if using port 465, set it to true; otherwise, set it to false.", { ns: "${NAMESPACE}" })}}`, 'x-decorator': 'FormItem', 'x-component': 'WorkflowVariableInput', 'x-component-props': { diff --git a/packages/plugins/@nocobase/plugin-workflow-mailer/src/locale/en-US.json b/packages/plugins/@nocobase/plugin-workflow-mailer/src/locale/en-US.json index acd2ea3219..297e52cb70 100644 --- a/packages/plugins/@nocobase/plugin-workflow-mailer/src/locale/en-US.json +++ b/packages/plugins/@nocobase/plugin-workflow-mailer/src/locale/en-US.json @@ -15,5 +15,6 @@ "Content": "Content", "Content type": "Content type", "Plain text": "Plain text", - "Ignore failed sending and continue workflow": "Ignore failed sending and continue workflow" + "Ignore failed sending and continue workflow": "Ignore failed sending and continue workflow", + "In most cases, if using port 465, set it to true; otherwise, set it to false.": "In most cases, if using port 465, set it to true; otherwise, set it to false." } diff --git a/packages/plugins/@nocobase/plugin-workflow-mailer/src/locale/zh-CN.json b/packages/plugins/@nocobase/plugin-workflow-mailer/src/locale/zh-CN.json index b5b32d5f1b..ed678386b8 100644 --- a/packages/plugins/@nocobase/plugin-workflow-mailer/src/locale/zh-CN.json +++ b/packages/plugins/@nocobase/plugin-workflow-mailer/src/locale/zh-CN.json @@ -15,5 +15,6 @@ "Content": "内容", "Content type": "内容格式", "Plain text": "纯文本", - "Ignore failed sending and continue workflow": "忽略失败的发送并继续工作流" + "Ignore failed sending and continue workflow": "忽略失败的发送并继续工作流", + "In most cases, if using port 465, set it to true; otherwise, set it to false.": "通常情况下,如果使用端口 465 ,请设置为 true ;否则,请设置为 false 。" } From 2c024cc32ea0e8f65c6f3f896718e66901bb1a82 Mon Sep 17 00:00:00 2001 From: Sheldon Guo Date: Thu, 20 Mar 2025 13:13:19 +0800 Subject: [PATCH 7/9] fix: update navigation logic to remove base path from URLs in QR code scanner and in-app-message list (#6508) * fix: update navigation logic to remove base path from URLs in QR code scanner and message list * fix: set test token for API client in DesktopMode demo --- .../components/qrcode-scanner/useScanner.ts | 27 ++++++++++++++----- .../src/client/demos/DesktopMode-basic.tsx | 2 ++ .../src/client/components/MessageList.tsx | 22 ++++++++++----- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-block-workbench/src/client/components/qrcode-scanner/useScanner.ts b/packages/plugins/@nocobase/plugin-block-workbench/src/client/components/qrcode-scanner/useScanner.ts index fc64438964..7e4e5eae0b 100644 --- a/packages/plugins/@nocobase/plugin-block-workbench/src/client/components/qrcode-scanner/useScanner.ts +++ b/packages/plugins/@nocobase/plugin-block-workbench/src/client/components/qrcode-scanner/useScanner.ts @@ -6,14 +6,27 @@ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. * For more information, please refer to: https://www.nocobase.com/agreement. */ - +import { useApp } from '@nocobase/client'; +import MobileManager from '@nocobase/plugin-mobile/client'; import { Html5Qrcode, Html5QrcodeScannerState } from 'html5-qrcode'; -import { useState, useCallback, useMemo, useEffect } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; + +function removeStringIfStartsWith(text: string, prefix: string): string { + if (text.startsWith(prefix)) { + return text.slice(prefix.length); + } + return text; +} export function useScanner({ onScannerSizeChanged, elementId }) { + const app = useApp(); + const mobileManager = app.pm.get(MobileManager); + const basename = mobileManager.mobileRouter.basename.replace(/\/+$/, ''); + const [scanner, setScanner] = useState(); + const navigate = useNavigate(); const { t } = useTranslation('block-workbench'); const viewPoint = useMemo(() => { @@ -37,12 +50,12 @@ export function useScanner({ onScannerSizeChanged, elementId }) { }, }, (text) => { - navigate(text); + navigate(removeStringIfStartsWith(text, basename)); }, undefined, ); }, - [navigate, onScannerSizeChanged, viewPoint], + [navigate, onScannerSizeChanged, viewPoint, basename], ); const stopScanner = useCallback(async (scanner: Html5Qrcode) => { const state = scanner.getState(); @@ -56,13 +69,13 @@ export function useScanner({ onScannerSizeChanged, elementId }) { await stopScanner(scanner); try { const { decodedText } = await scanner.scanFileV2(file, false); - navigate(decodedText); + navigate(removeStringIfStartsWith(decodedText, basename)); } catch (error) { alert(t('QR code recognition failed, please scan again')); startScanCamera(scanner); } }, - [scanner, stopScanner, startScanCamera, t, navigate], + [stopScanner, scanner, navigate, basename, t, startScanCamera], ); useEffect(() => { diff --git a/packages/plugins/@nocobase/plugin-mobile/src/client/demos/DesktopMode-basic.tsx b/packages/plugins/@nocobase/plugin-mobile/src/client/demos/DesktopMode-basic.tsx index 4db6026f42..4e2763269d 100644 --- a/packages/plugins/@nocobase/plugin-mobile/src/client/demos/DesktopMode-basic.tsx +++ b/packages/plugins/@nocobase/plugin-mobile/src/client/demos/DesktopMode-basic.tsx @@ -6,6 +6,8 @@ import React from 'react'; const { apiClient, mockRequest } = mockAPIClient(); +apiClient.auth.setToken('test'); + mockRequest.onGet('/roles:check').reply(() => { return [ 200, diff --git a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/components/MessageList.tsx b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/components/MessageList.tsx index c114023d2b..874c2d51e7 100644 --- a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/components/MessageList.tsx +++ b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/components/MessageList.tsx @@ -7,28 +7,36 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import React, { useState, useCallback } from 'react'; -import { observer } from '@formily/reactive-react'; import { Schema } from '@formily/react'; -import { Card, Descriptions, Button, Spin, Tag, ConfigProvider, Typography, Tooltip, theme } from 'antd'; +import { observer } from '@formily/reactive-react'; import { dayjs } from '@nocobase/utils/client'; +import { Button, Card, ConfigProvider, Descriptions, Spin, Tag, Tooltip, Typography, theme } from 'antd'; +import React, { useCallback, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useLocalTranslation } from '../../locale'; +import { useApp } from '@nocobase/client'; import { - selectedChannelNameObs, channelMapObs, fetchMessages, + inboxVisible, isFecthingMessageObs, + selectedChannelNameObs, selectedMessageListObs, showMsgLoadingMoreObs, updateMessage, - inboxVisible, } from '../observables'; -import { useApp } from '@nocobase/client'; + +function removeStringIfStartsWith(text: string, prefix: string): string { + if (text.startsWith(prefix)) { + return text.slice(prefix.length); + } + return text; +} const MessageList = observer(() => { const app = useApp(); + const basename = app.router.basename.replace(/\/+$/, ''); const { t } = useLocalTranslation(); const navigate = useNavigate(); const { token } = theme.useToken(); @@ -51,7 +59,7 @@ const MessageList = observer(() => { if (message.options?.url) { inboxVisible.value = false; const url = message.options.url; - if (url.startsWith('/')) navigate(url); + if (url.startsWith('/')) navigate(removeStringIfStartsWith(url, basename)); else { window.location.href = url; } From bd51bd545e141e9e64222a4ea651d630dde05d0f Mon Sep 17 00:00:00 2001 From: chenos Date: Thu, 20 Mar 2025 14:56:42 +0800 Subject: [PATCH 8/9] fix: unable to access files stored in COS (#6512) * fix: unable to access files stored in COS * fix: ensureUrlEncoded --- .../plugin-file-manager/src/server/actions/attachments.ts | 2 +- .../plugin-file-manager/src/server/storages/index.ts | 4 ++-- .../plugin-file-manager/src/server/storages/tx-cos.ts | 6 ++++-- .../@nocobase/plugin-file-manager/src/server/utils.ts | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/actions/attachments.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/actions/attachments.ts index 7dd2c025f9..e21544fd43 100644 --- a/packages/plugins/@nocobase/plugin-file-manager/src/server/actions/attachments.ts +++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/actions/attachments.ts @@ -59,7 +59,7 @@ export async function getFileData(ctx: Context) { mimetype: file.mimetype, meta: ctx.request.body, storageId: storage.id, - ...(storageInstance.getFileData ? storageInstance.getFileData(file) : {}), + ...StorageType?.['getFileData']?.(file), }; return data; diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts index 63c283ff16..afd5d2bcf0 100644 --- a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts +++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts @@ -10,7 +10,7 @@ import { isURL } from '@nocobase/utils'; import { StorageEngine } from 'multer'; import urlJoin from 'url-join'; -import { encodeURL } from '../utils'; +import { encodeURL, ensureUrlEncoded } from '../utils'; export interface StorageModel { id?: number; @@ -54,7 +54,7 @@ export abstract class StorageType { const keys = [ this.storage.baseUrl, file.path && encodeURI(file.path), - encodeURIComponent(file.filename), + ensureUrlEncoded(file.filename), preview && this.storage.options.thumbnailRule, ].filter(Boolean); return urlJoin(keys); diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/tx-cos.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/tx-cos.ts index 58b01e915f..463ec3c59a 100644 --- a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/tx-cos.ts +++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/tx-cos.ts @@ -7,11 +7,13 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ +import { isURL } from '@nocobase/utils'; +import path from 'path'; +import urlJoin from 'url-join'; import { promisify } from 'util'; - import { AttachmentModel, StorageType } from '.'; import { STORAGE_TYPE_TX_COS } from '../../constants'; -import { getFilename, getFileKey } from '../utils'; +import { getFileKey, getFilename } from '../utils'; export default class extends StorageType { static defaults() { diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/utils.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/utils.ts index 1bfccecd3a..bdf312992e 100644 --- a/packages/plugins/@nocobase/plugin-file-manager/src/server/utils.ts +++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/utils.ts @@ -30,7 +30,7 @@ export function getFileKey(record) { return [record.path.replace(/^\/|\/$/g, ''), record.filename].filter(Boolean).join('/'); } -function ensureUrlEncoded(value) { +export function ensureUrlEncoded(value) { try { // 如果解码后与原字符串不同,说明已经被转义过 if (decodeURIComponent(value) !== value) { From dad61a2a108c5f6d020bad4c042367f3a4851bf1 Mon Sep 17 00:00:00 2001 From: Katherine Date: Thu, 20 Mar 2025 15:56:25 +0800 Subject: [PATCH 9/9] fix: time field submission error in Chinese locale (invalid input syntax for type time) (#6511) --- .../src/schema-component/antd/time-picker/TimePicker.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/client/src/schema-component/antd/time-picker/TimePicker.tsx b/packages/core/client/src/schema-component/antd/time-picker/TimePicker.tsx index da9652ba29..f270f9838d 100644 --- a/packages/core/client/src/schema-component/antd/time-picker/TimePicker.tsx +++ b/packages/core/client/src/schema-component/antd/time-picker/TimePicker.tsx @@ -27,10 +27,10 @@ export const mapTimeFormat = function () { ...props, format, inputReadOnly: true, - value: dayjsable(props.value, format), + value: dayjsable(props.value, 'HH:mm:ss'), onChange: (value: dayjs.Dayjs | dayjs.Dayjs[]) => { if (onChange) { - onChange(formatDayjsValue(value, format) || null); + onChange(formatDayjsValue(value, 'HH:mm:ss') || null); } }, };