@zjlab-fe/data-hub-ui 0.32.6 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/types/components/FileUploader/UploadStoreProvider/UploadStoreProvider.d.ts +4 -1
  2. package/dist/types/components/SDK-modal/document-link.d.ts +1 -3
  3. package/dist/types/components/SDK-modal/index.d.ts +4 -0
  4. package/dist/types/components/SDK-modal/inner-modal.d.ts +9 -0
  5. package/dist/types/components/SDK-modal/types.d.ts +4 -3
  6. package/dist/types/components/apply-perm-modal/index.d.ts +14 -5
  7. package/dist/types/components/confirm-again/index.d.ts +8 -1
  8. package/dist/types/components/copy/index.d.ts +9 -4
  9. package/dist/types/components/limit-credit-modal/index.d.ts +9 -3
  10. package/dist/types/components/tag-group-filter/dataSizeFilter.d.ts +0 -1
  11. package/dist/types/components/tag-group-filter/index.d.ts +4 -1
  12. package/dist/types/index.d.ts +7 -5
  13. package/dist/types/locale/index.d.ts +18 -0
  14. package/dist/types/locale/modalHolder.d.ts +11 -0
  15. package/dist/types/locale/resolveLocale.d.ts +9 -0
  16. package/dist/types/locale/translations.d.ts +808 -0
  17. package/dist/types/locale/types.d.ts +32 -0
  18. package/es/components/FileUploader/Locale/useTranslate.js +34 -11
  19. package/es/components/FileUploader/UploadStoreProvider/UploadStoreProvider.js +5 -3
  20. package/es/components/FileUploader/hooks/useOnMountedResumeUnfinished.js +6 -3
  21. package/es/components/SDK-modal/document-link.js +5 -2
  22. package/es/components/SDK-modal/index.js +29 -2
  23. package/es/components/SDK-modal/inner-modal.js +23 -12
  24. package/es/components/apply-perm-modal/index.js +20 -8
  25. package/es/components/confirm-again/index.js +12 -2
  26. package/es/components/copy/index.js +21 -7
  27. package/es/components/data-table/index.js +15 -4
  28. package/es/components/dataset-batch-action/index.js +48 -25
  29. package/es/components/file-preview/data-table/index.js +4 -3
  30. package/es/components/file-preview/index.js +5 -4
  31. package/es/components/file-uploader/components/uploader-drop-zone.js +4 -2
  32. package/es/components/file-uploader/components/uploader-file-item.js +12 -9
  33. package/es/components/file-uploader/components/uploader-file-list.js +6 -3
  34. package/es/components/file-uploader/components/uploader.js +4 -2
  35. package/es/components/file-uploader/components/uploading-status.js +18 -12
  36. package/es/components/header/index.js +3 -1
  37. package/es/components/input-tag/index.js +5 -2
  38. package/es/components/limit-credit-modal/index.js +38 -19
  39. package/es/components/menu/index.js +5 -2
  40. package/es/components/notion-editor/code-block/languages.js +1 -1
  41. package/es/components/notion-editor/index.js +23 -13
  42. package/es/components/operator-chain/components/AddButton.js +3 -1
  43. package/es/components/operator-chain/components/IOCard.js +4 -1
  44. package/es/components/operator-chain/components/VirtualDropdown.js +6 -3
  45. package/es/components/permission-editor/index.js +1 -0
  46. package/es/components/permission-editor/permissionEditModal/index.js +7 -4
  47. package/es/components/permission-editor/permissionEditor/index.js +40 -75
  48. package/es/components/permission-editor/permissionViewPopover/index.js +5 -2
  49. package/es/components/tag-group-filter/dataSizeFilter.js +6 -3
  50. package/es/components/tag-group-filter/index.js +2 -2
  51. package/es/components/tip-tap/bubble-menu.js +8 -3
  52. package/es/components/tip-tap/editor.js +5 -2
  53. package/es/components/tip-tap/extensions/index.js +1 -1
  54. package/es/components/tip-tap/toolbar/components/color-picker.js +3 -1
  55. package/es/components/tip-tap/toolbar/components/heading-dropdown.js +8 -5
  56. package/es/components/tip-tap/toolbar/components/link-button.js +4 -1
  57. package/es/components/tip-tap/toolbar/components/table-button.js +5 -2
  58. package/es/components/tip-tap/toolbar/index.js +4 -1
  59. package/es/components/uploadDrawer/fileUploadDrawer.js +6 -2
  60. package/es/components/uploadDrawer/fileUploadDrawerList.js +4 -1
  61. package/es/components/uploadDrawer/fileUploadDrawerListProgressButton.js +4 -2
  62. package/es/components/uploadDrawer/hooks/useCancelUpload.js +3 -1
  63. package/es/components/uploadDrawer/hooks/useFilterFiles.js +7 -4
  64. package/es/components/uploadDrawer/hooks/useFormatFiles.js +3 -1
  65. package/es/components/uploadDrawer/hooks/useResumeUnfinishedUploads.js +7 -6
  66. package/es/components/uploadDrawer/index.js +4 -2
  67. package/es/index.js +6 -5
  68. package/es/locale/index.js +64 -0
  69. package/es/locale/modalHolder.js +21 -0
  70. package/es/locale/resolveLocale.js +73 -0
  71. package/es/locale/translations.js +273 -0
  72. package/lib/index.js +1 -1
  73. package/package.json +7 -3
@@ -5,6 +5,7 @@ import { GB } from '../utils/constant.js';
5
5
  import { calcDisplaySize } from '../utils/calcDisplaySize.js';
6
6
  import { UploadStoreContext } from '../UploadStoreProvider.js';
7
7
  import { FileUploadDrawerContext } from '../index.js';
8
+ import { useLocale } from '../../../locale/index.js';
8
9
 
9
10
  /**
10
11
  * useFilterFiles hook用于过滤上传文件
@@ -14,6 +15,8 @@ import { FileUploadDrawerContext } from '../index.js';
14
15
  */
15
16
  function useFilterFiles() {
16
17
  const { message, modal } = App.useApp();
18
+ const { locale, t } = useLocale();
19
+ const texts = locale.UploadDrawer;
17
20
  const uploadStore = useContext(UploadStoreContext);
18
21
  const { identifier, maxSizePerFile = 10 * GB, uploadHistory = [], root, } = useContext(FileUploadDrawerContext);
19
22
  return function filterFiles(files) {
@@ -38,7 +41,7 @@ function useFilterFiles() {
38
41
  const oversizedFiles = files.filter((file) => file.size > maxSizePerFile).map((file) => file.name);
39
42
  if (oversizedFiles.length) {
40
43
  const maxSizeDisplay = calcDisplaySize(maxSizePerFile);
41
- message.warning(`以下文件大小超过${maxSizeDisplay}:${oversizedFiles.join(', ')}`);
44
+ message.warning(t(texts.sizeExceeded, { maxSize: maxSizeDisplay, files: oversizedFiles.join(', ') }));
42
45
  }
43
46
  return oversizedFiles;
44
47
  }
@@ -55,9 +58,9 @@ function useFilterFiles() {
55
58
  // duplicateFiles 现在包含了所有重复的文件或文件夹的名称
56
59
  if (duplicateFiles.length) {
57
60
  const userChoice = yield modal.confirm({
58
- title: '发现同名文件,是否覆盖?',
59
- okText: '覆盖',
60
- cancelText: '取消',
61
+ title: texts.duplicateTitle,
62
+ okText: texts.overwrite,
63
+ cancelText: texts.cancel,
61
64
  });
62
65
  return [userChoice, duplicateFiles];
63
66
  }
@@ -8,9 +8,11 @@ import { useFilterFiles } from './useFilterFiles.js';
8
8
  import { useRemoveFilesInUploadQueue } from './useRemoveFilesInUploadQueue.js';
9
9
  import { UploadStoreDispatchContext } from '../UploadStoreProvider.js';
10
10
  import { FileUploadDrawerContext } from '../index.js';
11
+ import { useLocale } from '../../../locale/index.js';
11
12
 
12
13
  function useFormatFiles() {
13
14
  const { message } = App.useApp();
15
+ const { locale } = useLocale();
14
16
  const { identifier, root, getUploadUrls } = useContext(FileUploadDrawerContext);
15
17
  const uploadsDispatch = useContext(UploadStoreDispatchContext);
16
18
  const filterFiles = useFilterFiles();
@@ -22,7 +24,7 @@ function useFormatFiles() {
22
24
  updateUploadQueue(uploadableFiles);
23
25
  handleAddFilesToDB(identifier, uploadableFiles);
24
26
  if (uploadableFiles.length < filesToUpload.length) {
25
- message.info('部分文件获取上传地址失败');
27
+ message.info(locale.UploadDrawer.getUrlFailed);
26
28
  }
27
29
  });
28
30
  };
@@ -5,9 +5,12 @@ import { UploadStoreDispatchContext } from '../UploadStoreProvider.js';
5
5
  import { FILE_UPLOAD_STATUS } from '../utils/constant.js';
6
6
  import { openDB } from '../utils/fileDB/openDB.js';
7
7
  import { useRetryUpload } from './useRetryUpload.js';
8
+ import { useLocale } from '../../../locale/index.js';
8
9
 
9
10
  function useResumeUnfinishedUploads(identifier) {
10
11
  const { message, modal } = App.useApp();
12
+ const { locale } = useLocale();
13
+ const texts = locale.UploadDrawer;
11
14
  const setUploadStore = useContext(UploadStoreDispatchContext);
12
15
  const retryUpload = useRetryUpload();
13
16
  return useCallback(() => __awaiter(this, void 0, void 0, function* () {
@@ -18,19 +21,17 @@ function useResumeUnfinishedUploads(identifier) {
18
21
  if (unfinishedFiles.length) {
19
22
  // 如果有未完成的文件,显示确认对话框
20
23
  modal.confirm({
21
- title: '提示',
22
- content: '检测到未完成上传任务,是否继续上传?',
24
+ title: texts.notice,
25
+ content: texts.unfinishedContent,
23
26
  onOk() {
24
- // 用户确认继续上传,重试每个未完成的文件
25
27
  unfinishedFiles.forEach(retryUpload);
26
28
  },
27
29
  onCancel() {
28
- // 用户取消,显示提示信息
29
- message.info('点击上传按钮手动继续');
30
+ message.info(texts.resumeManually);
30
31
  },
31
32
  });
32
33
  }
33
- }), [identifier, setUploadStore, retryUpload, modal, message]);
34
+ }), [identifier, setUploadStore, retryUpload, modal, message, texts]);
34
35
  function reloadSaveData(identifier) {
35
36
  return __awaiter(this, void 0, void 0, function* () {
36
37
  // 从数据库获取文件信息
@@ -7,6 +7,7 @@ import { createContext, useContext } from 'react';
7
7
  import { GB } from './utils/constant.js';
8
8
  import useStyle from './index.css.js';
9
9
  import { Drawer, Alert } from 'antd';
10
+ import { useLocale } from '../../locale/index.js';
10
11
 
11
12
  useStyle();
12
13
  const FileUploadDrawerContext = createContext({
@@ -20,10 +21,11 @@ const FileUploadDrawerContext = createContext({
20
21
  * @deprecated This component is deprecated and will be removed in future releases.
21
22
  */
22
23
  function FileUploadDrawer(props) {
23
- // 检测是否在 UploadStoreProvider 内使用
24
24
  const uploadStore = useContext(UploadStoreContext);
25
+ const { locale } = useLocale();
26
+ const texts = locale.UploadDrawer;
25
27
  if (uploadStore === TEMP_STORE) {
26
- return (jsx(Drawer, { open: props.open, onClose: props.onClose, title: "\u6570\u636E\u4E0A\u4F20", children: jsx(Alert, { message: "FileUploadDrawer \u5FC5\u987B\u5728 UploadStoreProvider \u5185\u4F7F\u7528", type: "warning" }) }));
28
+ return (jsx(Drawer, { open: props.open, onClose: props.onClose, title: texts.title, children: jsx(Alert, { message: texts.mustUseProvider, type: "warning" }) }));
27
29
  }
28
30
  const { identifier, maxSizePerFile = 10 * GB, directory = false, root = '', uploadHistory = [], onSuccess, getUploadUrls, onCancelUpload, onOnePartDone, onAllPartDone, onClose, dragAreaDescription, accept, open, footer, title, showFinished, } = props;
29
31
  const contextValue = {
package/es/index.js CHANGED
@@ -13,8 +13,8 @@ export { UploaderProgressBar } from './components/file-uploader/components/uploa
13
13
  export { useUpload } from './components/file-uploader/hooks/use-upload.js';
14
14
  export { UploadStatus } from './components/file-uploader/constants.js';
15
15
  export { default as FilePreview } from './components/file-preview/index.js';
16
- export { default as Copy, copy } from './components/copy/index.js';
17
- export { default as ConfirmAgain } from './components/confirm-again/index.js';
16
+ export { default as Copy, copy, useCopy } from './components/copy/index.js';
17
+ export { default as ConfirmAgain, useConfirmAgain } from './components/confirm-again/index.js';
18
18
  export { default as FloatingLayer } from './components/floating-layer/index.js';
19
19
  export { default as BenchCard } from './components/bench-card/index.js';
20
20
  export { default as AuthTag } from './components/auth-tag/index.js';
@@ -28,16 +28,17 @@ export { default as TipTapReader } from './components/tip-tap/reader.js';
28
28
  export { default as PermissionEditModal } from './components/permission-editor/permissionEditModal/index.js';
29
29
  export { default as PermissionViewPopover } from './components/permission-editor/permissionViewPopover/index.js';
30
30
  export { default as PermissionEditor } from './components/permission-editor/permissionEditor/index.js';
31
- export { default as ApplyPermModal } from './components/apply-perm-modal/index.js';
31
+ export { default as ApplyPermModal, useApplyPermModal } from './components/apply-perm-modal/index.js';
32
32
  export { default as Menu } from './components/menu/index.js';
33
33
  export { default as RadioCard } from './components/radio-card/index.js';
34
34
  export { default as OperatorChain } from './components/operator-chain/index.js';
35
35
  export { default as CorpusCard } from './components/corpus-card/index.js';
36
36
  export { default as ModelCard } from './components/model-card/index.js';
37
37
  export { default as DataTable } from './components/data-table/index.js';
38
- export { default as SDKModal } from './components/SDK-modal/index.js';
38
+ export { default as SDKModal, useSDKModal } from './components/SDK-modal/index.js';
39
39
  export { default as TagView } from './components/tag-view/index.js';
40
40
  export { default as TagGroupFilter } from './components/tag-group-filter/index.js';
41
- export { default as LimitCreditModal } from './components/limit-credit-modal/index.js';
41
+ export { default as LimitCreditModal, useLimitCreditModal } from './components/limit-credit-modal/index.js';
42
42
  export { default as DatasetBatchAction, EDatasetBatchType } from './components/dataset-batch-action/index.js';
43
+ export { DataHubProvider } from './locale/index.js';
43
44
  export { default as UploadDrawerUploadStoreProvider } from './components/uploadDrawer/UploadStoreProvider.js';
@@ -0,0 +1,64 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, useContext, useMemo } from 'react';
3
+ import { ConfigProvider, theme } from 'antd';
4
+ import antdEnUS from 'antd/locale/en_US';
5
+ import antdZhCN from 'antd/locale/zh_CN';
6
+ import { resolveLocaleData, interpolate, resolveIntlInput } from './resolveLocale.js';
7
+ import { DataHubModalProvider } from './modalHolder.js';
8
+
9
+ const LocaleContext = createContext({});
10
+ let warnedMissingMode = false;
11
+ let warnedLocaleMismatch = false;
12
+ function warnProviderConfiguration(message) {
13
+ if (process.env.NODE_ENV !== 'production') {
14
+ console.warn(`[DataHubProvider] ${message}`);
15
+ }
16
+ }
17
+ function resolveInternalTheme(dataHubTheme, antdMode) {
18
+ if (!dataHubTheme && antdMode === 'inherit')
19
+ return undefined;
20
+ const algorithm = (dataHubTheme === null || dataHubTheme === void 0 ? void 0 : dataHubTheme.darkMode) === undefined
21
+ ? undefined
22
+ : dataHubTheme.darkMode
23
+ ? theme.darkAlgorithm
24
+ : theme.defaultAlgorithm;
25
+ return Object.assign(Object.assign({}, (antdMode === 'isolated' ? { inherit: false } : {})), { token: dataHubTheme === null || dataHubTheme === void 0 ? void 0 : dataHubTheme.token, algorithm });
26
+ }
27
+ function DataHubProvider(props) {
28
+ var _a, _b;
29
+ const { intl, theme: dataHubTheme, children } = props;
30
+ const antdMode = (_a = props.antdMode) !== null && _a !== void 0 ? _a : 'inherit';
31
+ const parent = useContext(LocaleContext);
32
+ const outerAntdConfig = useContext(ConfigProvider.ConfigContext);
33
+ const mergedIntl = (_b = resolveIntlInput(intl)) !== null && _b !== void 0 ? _b : parent.intl;
34
+ const locale = useMemo(() => mergedIntl !== null && mergedIntl !== void 0 ? mergedIntl : (antdMode === 'inherit' ? resolveLocaleData(outerAntdConfig.locale) : resolveLocaleData()), [mergedIntl, antdMode, outerAntdConfig.locale]);
35
+ const internalAntdLocale = antdMode === 'isolated' ? (locale.locale === 'en' ? antdEnUS : antdZhCN) : undefined;
36
+ const internalTheme = useMemo(() => resolveInternalTheme(dataHubTheme, antdMode), [dataHubTheme, antdMode]);
37
+ if (process.env.NODE_ENV !== 'production') {
38
+ if (props.antdMode === undefined && !warnedMissingMode) {
39
+ warnedMissingMode = true;
40
+ warnProviderConfiguration('antdMode was not specified and defaults to "inherit". If the host uses another antd instance, such as antd 6, set antdMode="isolated" explicitly.');
41
+ }
42
+ if (antdMode === 'inherit' &&
43
+ locale.locale === 'zh' &&
44
+ !outerAntdConfig.locale &&
45
+ !warnedLocaleMismatch) {
46
+ warnedLocaleMismatch = true;
47
+ warnProviderConfiguration('data-hub-ui resolved locale to "zh", but the inherited antd context has no locale and internal antd components will fall back to English. If the host uses antd 6 or another antd instance, set antdMode="isolated".');
48
+ }
49
+ }
50
+ const value = useMemo(() => ({ intl: mergedIntl }), [mergedIntl]);
51
+ return (jsx(ConfigProvider, { locale: internalAntdLocale, theme: internalTheme, children: jsx(LocaleContext.Provider, { value: value, children: jsx(DataHubModalProvider, { children: children }) }) }));
52
+ }
53
+ function useLocale() {
54
+ const { intl } = useContext(LocaleContext);
55
+ const { locale: antdLocale } = useContext(ConfigProvider.ConfigContext);
56
+ const locale = useMemo(() => {
57
+ if (intl)
58
+ return intl;
59
+ return resolveLocaleData(antdLocale);
60
+ }, [intl, antdLocale]);
61
+ return { locale, t: interpolate };
62
+ }
63
+
64
+ export { DataHubProvider, useLocale };
@@ -0,0 +1,21 @@
1
+ import { jsxs } from 'react/jsx-runtime';
2
+ import { createContext, useMemo, useContext } from 'react';
3
+ import { Modal } from 'antd';
4
+
5
+ const DataHubModalContext = createContext(null);
6
+ function DataHubModalProvider(props) {
7
+ const [modal, contextHolder] = Modal.useModal();
8
+ const api = useMemo(() => ({
9
+ confirm: (config) => modal.confirm(config),
10
+ }), [modal]);
11
+ return (jsxs(DataHubModalContext.Provider, { value: api, children: [contextHolder, props.children] }));
12
+ }
13
+ function useDataHubModal() {
14
+ const modal = useContext(DataHubModalContext);
15
+ if (!modal) {
16
+ throw new Error('[data-hub-ui] Imperative modal hooks must be used within DataHubProvider.');
17
+ }
18
+ return modal;
19
+ }
20
+
21
+ export { DataHubModalProvider, useDataHubModal };
@@ -0,0 +1,73 @@
1
+ import { translations } from './translations.js';
2
+
3
+ function isMessageLeaf(value) {
4
+ if (!value || typeof value !== 'object')
5
+ return false;
6
+ const record = value;
7
+ return typeof record.zh === 'string' && typeof record.en === 'string';
8
+ }
9
+ function pickLang(source, lang) {
10
+ if (isMessageLeaf(source)) {
11
+ return source[lang];
12
+ }
13
+ if (source && typeof source === 'object') {
14
+ const result = {};
15
+ Object.keys(source).forEach((key) => {
16
+ result[key] = pickLang(source[key], lang);
17
+ });
18
+ return result;
19
+ }
20
+ return source;
21
+ }
22
+ function createLocaleData(lang) {
23
+ return Object.assign({ locale: lang }, pickLang(translations, lang));
24
+ }
25
+ const zhCN = createLocaleData('zh');
26
+ const enUS = createLocaleData('en');
27
+ const localeMap = {
28
+ zh: zhCN,
29
+ en: enUS,
30
+ };
31
+ function mapToLang(input) {
32
+ const value = (input || '').toLowerCase().replace(/_/g, '-');
33
+ if (value.startsWith('en'))
34
+ return 'en';
35
+ return 'zh';
36
+ }
37
+ function extractAntdLocaleName(antdLocale) {
38
+ if (!antdLocale)
39
+ return undefined;
40
+ if (typeof antdLocale === 'string')
41
+ return antdLocale;
42
+ if (typeof antdLocale === 'object') {
43
+ const record = antdLocale;
44
+ if (typeof record.locale === 'string')
45
+ return record.locale;
46
+ if (record.default !== undefined && record.default !== antdLocale) {
47
+ return extractAntdLocaleName(record.default);
48
+ }
49
+ }
50
+ return undefined;
51
+ }
52
+ function resolveIntlInput(intl) {
53
+ if (intl == null)
54
+ return undefined;
55
+ return localeMap[mapToLang(intl)];
56
+ }
57
+ function resolveLocaleData(antdLocale) {
58
+ const antdLocaleName = extractAntdLocaleName(antdLocale);
59
+ if (antdLocaleName) {
60
+ return localeMap[mapToLang(antdLocaleName)];
61
+ }
62
+ return zhCN;
63
+ }
64
+ function interpolate(template, params) {
65
+ if (!params)
66
+ return template;
67
+ return template.replace(/\{(\w+)\}/g, (_, key) => {
68
+ const val = params[key];
69
+ return val !== undefined ? String(val) : `{${key}}`;
70
+ });
71
+ }
72
+
73
+ export { createLocaleData, enUS, extractAntdLocaleName, interpolate, mapToLang, resolveIntlInput, resolveLocaleData, zhCN };
@@ -0,0 +1,273 @@
1
+ const translations = {
2
+ Common: {
3
+ confirm: { zh: '确定', en: 'Confirm' },
4
+ cancel: { zh: '取消', en: 'Cancel' },
5
+ },
6
+ Header: {
7
+ login: { zh: '登录', en: 'Login' },
8
+ },
9
+ ApplyPermModal: {
10
+ title: { zh: '提示', en: 'Notice' },
11
+ content: {
12
+ zh: '抱歉,您没有此功能权限,请点击申请',
13
+ en: 'Sorry, you do not have permission to use this function, please click apply',
14
+ },
15
+ apply: { zh: '申请', en: 'Apply' },
16
+ cancel: { zh: '取消', en: 'Cancel' },
17
+ },
18
+ Copy: {
19
+ copied: { zh: '已复制', en: 'Copied' },
20
+ },
21
+ LimitCreditModal: {
22
+ title: { zh: '提示', en: 'Notice' },
23
+ content: { zh: '额度已用尽,请点击申请。', en: 'Quota exhausted. Please click apply.' },
24
+ apply: { zh: '申请', en: 'Apply' },
25
+ cancel: { zh: '取消', en: 'Cancel' },
26
+ },
27
+ SDKModal: {
28
+ confirm: { zh: '知道了', en: 'Got it' },
29
+ documentPrefix: { zh: '详细操作请参考', en: 'For more details, see' },
30
+ documentLinkText: { zh: '使用文档', en: 'Documentation' },
31
+ },
32
+ FilePreview: {
33
+ failedToGetFile: { zh: '获取文件失败', en: 'Failed to get file' },
34
+ notSupported: { zh: '暂不支持', en: 'Not supported' },
35
+ filePreview: { zh: '文件预览', en: 'file preview' },
36
+ downloadFullContent: { zh: '请下载查看完整内容', en: 'Please download to view the full content' },
37
+ },
38
+ DataTable: {
39
+ action: { zh: '操作', en: 'Action' },
40
+ empty: { zh: '暂无数据', en: 'No data' },
41
+ },
42
+ InputTag: {
43
+ placeholder: { zh: '请输入关键字', en: 'Please enter keywords' },
44
+ },
45
+ Menu: {
46
+ collapseNav: { zh: '收起导航', en: 'Collapse navigation' },
47
+ expandNav: { zh: '展开导航', en: 'Expand navigation' },
48
+ },
49
+ TagGroupFilter: {
50
+ dataVolume: { zh: '数据体量', en: 'Data volume' },
51
+ min: { zh: '最小', en: 'Min' },
52
+ max: { zh: '最大', en: 'Max' },
53
+ rangeError: {
54
+ zh: '左侧数值不能大于右侧数值',
55
+ en: 'The left value cannot be greater than the right value',
56
+ },
57
+ },
58
+ PermissionEditor: {
59
+ title: { zh: '编辑权限', en: 'Edit permissions' },
60
+ updateFailed: { zh: '权限更新失败', en: 'Failed to update permissions' },
61
+ save: { zh: '保存', en: 'Save' },
62
+ cancel: { zh: '取消', en: 'Cancel' },
63
+ viewTitle: { zh: '用户权限', en: 'User permissions' },
64
+ selectAll: { zh: '全选', en: 'Select all' },
65
+ unselectAll: { zh: '取消全选', en: 'Deselect all' },
66
+ agentic: { zh: '数据权限', en: 'Data permission' },
67
+ agenticSearch: { zh: '检索智能体', en: 'Search agent' },
68
+ workbench: { zh: '工作台权限', en: 'Workbench permission' },
69
+ corpusProductionService: { zh: '语料生产服务', en: 'Corpus production service' },
70
+ corpusQuality: { zh: '语料质量评估', en: 'Corpus quality evaluation' },
71
+ visualWorkflow: { zh: '可视化工作流', en: 'Visual workflow' },
72
+ documentAnnotation: { zh: '文档标注', en: 'Document annotation' },
73
+ modelTraining: { zh: '模型训练', en: 'Model training' },
74
+ meteringCenter: { zh: '计量中心', en: 'Metering center' },
75
+ modelDeploy: { zh: '模型部署', en: 'Model deployment' },
76
+ modelManage: { zh: '模型管理', en: 'Model management' },
77
+ corpusIndex: { zh: '语料检索权限', en: 'Corpus search permission' },
78
+ literatureSearch: { zh: '文献语料检索', en: 'Literature corpus search' },
79
+ webFilter: { zh: '网页语料筛选', en: 'Web corpus filter' },
80
+ corpusProduct: { zh: '语料生产权限', en: 'Corpus production permission' },
81
+ documentProduction: { zh: '文档语料生产', en: 'Document corpus production' },
82
+ webProduction: { zh: '网页语料生产', en: 'Web corpus production' },
83
+ },
84
+ DatasetBatchAction: {
85
+ ok: { zh: '确定', en: 'OK' },
86
+ cancel: { zh: '取消', en: 'Cancel' },
87
+ enterDatasetId: { zh: '请输入数据集ID', en: 'Please enter dataset IDs' },
88
+ uploadCsv: { zh: '请上传CSV文件', en: 'Please upload a CSV file' },
89
+ uploadCsvOrExcel: { zh: '请上传csv或excel文件', en: 'Please upload a CSV or Excel file' },
90
+ onlyOneFile: {
91
+ zh: '单次任务只能上传1个文件,不支持第二个文件的上传',
92
+ en: 'Only one file can be uploaded per task',
93
+ },
94
+ manualTab: { zh: '手动输入ID', en: 'Enter IDs manually' },
95
+ uploadTab: { zh: '批量任务文件上传', en: 'Batch file upload' },
96
+ dragUpload: {
97
+ zh: '点击浏览文件或将文件拖拽至此(支持csv或excel文件)',
98
+ en: 'Click or drag files here (CSV or Excel)',
99
+ },
100
+ tagAlert: {
101
+ zh: '提示:文件第一列应为 dataset_id,第二列为 tag_ids(多个标签 ID 请用分号分隔)。',
102
+ en: 'Tip: column 1 should be dataset_id, column 2 should be tag_ids (separate multiple IDs with semicolons).',
103
+ },
104
+ zoneAlert: {
105
+ zh: '提示:请上传csv或excel文件,提供数据集id,单次任务只能上传1个文件。文件采用单列布局,首行为"dataset_id",从第二行开始每行为一个具体id。',
106
+ en: 'Tip: upload one CSV or Excel file with a single column. The first row must be "dataset_id", and each following row is one id.',
107
+ },
108
+ fieldId: { zh: '数据集ID', en: 'Dataset ID' },
109
+ fieldName: { zh: '数据集名称', en: 'Dataset name' },
110
+ fieldProvider: { zh: '提供方', en: 'Provider' },
111
+ fieldCreator: { zh: '发布者', en: 'Publisher' },
112
+ fieldFileSize: { zh: '数据量', en: 'Data size' },
113
+ fieldAuthorizationType: { zh: '开放方式', en: 'Access type' },
114
+ fieldSubjects: { zh: '科学领域', en: 'Subject' },
115
+ fieldSource: { zh: '来源名称', en: 'Source name' },
116
+ fieldKeywords: { zh: '关键词', en: 'Keywords' },
117
+ fieldLabel: { zh: '相关标签', en: 'Related tags' },
118
+ fieldLicense: { zh: '使用许可', en: 'License' },
119
+ fieldDataSourceUrl: { zh: '来源链接', en: 'Source URL' },
120
+ fieldPublishTime: { zh: '发布时间', en: 'Publish time' },
121
+ fieldStorageFilePath: { zh: '存储路径', en: 'Storage path' },
122
+ fieldDomain: { zh: '域名标识', en: 'Domain' },
123
+ },
124
+ OperatorChain: {
125
+ allTypes: { zh: '全部类型', en: 'All types' },
126
+ selectType: { zh: '选择类型', en: 'Select type' },
127
+ searchOperator: { zh: '搜索算子', en: 'Search operators' },
128
+ inputDataset: { zh: '输入数据集', en: 'Input dataset' },
129
+ outputDataset: { zh: '输出数据集', en: 'Output dataset' },
130
+ addOperator: { zh: '添加算子', en: 'Add operator' },
131
+ },
132
+ FileUploader: {
133
+ mustUseProvider: {
134
+ zh: 'FileUploader 必须在 UploadStoreProvider 内使用',
135
+ en: 'FileUploader must be used within UploadStoreProvider',
136
+ },
137
+ modalMustUseProvider: {
138
+ zh: 'FileUploadModal 必须在 UploadStoreProvider 内使用',
139
+ en: 'FileUploadModal must be used within UploadStoreProvider',
140
+ },
141
+ title: { zh: '文件上传', en: 'File Upload' },
142
+ confirm: { zh: '确定', en: 'Confirm' },
143
+ waiting: { zh: '等待上传', en: 'Waiting for upload' },
144
+ cancelled: { zh: '已取消', en: 'Cancelled' },
145
+ uploading: { zh: '上传中', en: 'Uploading' },
146
+ failed: { zh: '上传失败', en: 'Upload failed' },
147
+ uploaded: { zh: '已上传', en: 'Uploaded' },
148
+ mergingParts: { zh: '分块合并中', en: 'Merging parts' },
149
+ sizeExceededPrefix: { zh: '以下文件大小超过', en: 'The following files exceed the size' },
150
+ deleted: { zh: '已删除', en: 'Deleted' },
151
+ dropHint: { zh: '点击或拖拽上传文件', en: 'Click or drag to upload files' },
152
+ duplicateTitle: { zh: '发现同名文件,是否覆盖?', en: 'Duplicate file found, overwrite?' },
153
+ overwrite: { zh: '覆盖', en: 'Overwrite' },
154
+ cancel: { zh: '取消', en: 'Cancel' },
155
+ uploadingNow: { zh: '正在上传', en: 'Uploading' },
156
+ cancelFailed: { zh: '取消失败', en: 'Cancel failed' },
157
+ currentUpload: { zh: '当前上传', en: 'Current Upload' },
158
+ paused: { zh: '已暂停', en: 'Paused' },
159
+ success: { zh: '上传成功', en: 'Upload successful' },
160
+ calibrating: { zh: '校验中', en: 'Validating' },
161
+ merging: { zh: '合并中', en: 'Merging' },
162
+ getUrlFailed: { zh: '部分文件获取上传地址失败', en: 'Failed to get upload URL for some files' },
163
+ notice: { zh: '提示', en: 'Notice' },
164
+ unfinishedContent: {
165
+ zh: '检测到未完成上传任务,是否继续上传?',
166
+ en: 'Unfinished uploads detected. Resume?',
167
+ },
168
+ resumeManually: { zh: '点击上传按钮手动继续', en: 'Click the upload button to continue manually' },
169
+ },
170
+ UploadDrawer: {
171
+ title: { zh: '数据上传', en: 'Data upload' },
172
+ mustUseProvider: {
173
+ zh: 'FileUploadDrawer 必须在 UploadStoreProvider 内使用',
174
+ en: 'FileUploadDrawer must be used within UploadStoreProvider',
175
+ },
176
+ empty: { zh: '暂无上传内容', en: 'No uploads yet' },
177
+ prechecking: { zh: '预检上传文件中({count})', en: 'Pre-checking files ({count})' },
178
+ continue: { zh: '继续下载', en: 'Resume' },
179
+ cancelDownload: { zh: '取消下载', en: 'Cancel' },
180
+ remove: { zh: '删除', en: 'Delete' },
181
+ removeDisabled: { zh: '删除-已禁用', en: 'Delete disabled' },
182
+ cancelFailed: { zh: '取消失败', en: 'Cancel failed' },
183
+ getUrlFailed: { zh: '部分文件获取上传地址失败', en: 'Failed to get upload URL for some files' },
184
+ sizeExceeded: {
185
+ zh: '以下文件大小超过{maxSize}:{files}',
186
+ en: 'The following files exceed {maxSize}: {files}',
187
+ },
188
+ duplicateTitle: { zh: '发现同名文件,是否覆盖?', en: 'Duplicate file found, overwrite?' },
189
+ overwrite: { zh: '覆盖', en: 'Overwrite' },
190
+ cancel: { zh: '取消', en: 'Cancel' },
191
+ notice: { zh: '提示', en: 'Notice' },
192
+ unfinishedContent: {
193
+ zh: '检测到未完成上传任务,是否继续上传?',
194
+ en: 'Unfinished uploads detected. Resume?',
195
+ },
196
+ resumeManually: { zh: '点击上传按钮手动继续', en: 'Click the upload button to continue manually' },
197
+ },
198
+ FileUploaderV2: {
199
+ empty: { zh: '暂无文件', en: 'No files' },
200
+ dropHint: { zh: '点击或拖拽上传文件', en: 'Click or drag to upload files' },
201
+ waiting: { zh: '等待上传', en: 'Waiting for upload' },
202
+ preparing: { zh: '准备中', en: 'Preparing' },
203
+ paused: { zh: '已暂停', en: 'Paused' },
204
+ merging: { zh: '合并中', en: 'Merging' },
205
+ success: { zh: '上传成功', en: 'Upload successful' },
206
+ failed: { zh: '上传失败', en: 'Upload failed' },
207
+ cancelled: { zh: '已取消', en: 'Cancelled' },
208
+ pause: { zh: '暂停上传', en: 'Pause upload' },
209
+ resume: { zh: '继续上传', en: 'Resume upload' },
210
+ retry: { zh: '重试上传', en: 'Retry upload' },
211
+ remove: { zh: '移除', en: 'Remove' },
212
+ cancelUpload: { zh: '取消上传', en: 'Cancel upload' },
213
+ currentUpload: { zh: '当前上传', en: 'Current upload' },
214
+ uploading: { zh: '上传中', en: 'Uploading' },
215
+ transferring: { zh: '传输数据中', en: 'Transferring data' },
216
+ processing: { zh: '正在处理', en: 'Processing' },
217
+ uploadingInProgress: { zh: '上传进行中', en: 'Upload in progress' },
218
+ transferringWait: { zh: '传输中,请稍候', en: 'Transferring, please wait' },
219
+ fileUploading: { zh: '文件上传中', en: 'Uploading file' },
220
+ dataTransferring: { zh: '数据传输中', en: 'Transferring data' },
221
+ uploadProcessing: { zh: '上传处理中', en: 'Processing upload' },
222
+ uploadFailedTip: {
223
+ zh: '上传失败多为网络问题,请再次进行上传(同名文件会进行覆盖)',
224
+ en: 'Upload failed due to network issues. Please try again (duplicate files will be overwritten).',
225
+ },
226
+ },
227
+ TipTap: {
228
+ placeholder: { zh: '开始输入内容...', en: 'Start typing...' },
229
+ undo: { zh: '撤销', en: 'Undo' },
230
+ redo: { zh: '重做', en: 'Redo' },
231
+ bold: { zh: '粗体', en: 'Bold' },
232
+ italic: { zh: '斜体', en: 'Italic' },
233
+ underline: { zh: '下划线', en: 'Underline' },
234
+ strike: { zh: '删除线', en: 'Strikethrough' },
235
+ textColor: { zh: '文字颜色', en: 'Text color' },
236
+ highlight: { zh: '背景高亮', en: 'Highlight' },
237
+ highlightShort: { zh: '高亮', en: 'Highlight' },
238
+ alignLeft: { zh: '左对齐', en: 'Align left' },
239
+ alignCenter: { zh: '居中对齐', en: 'Align center' },
240
+ alignRight: { zh: '右对齐', en: 'Align right' },
241
+ bulletList: { zh: '无序列表', en: 'Bullet list' },
242
+ orderedList: { zh: '有序列表', en: 'Ordered list' },
243
+ quote: { zh: '引用', en: 'Quote' },
244
+ codeBlock: { zh: '代码块', en: 'Code block' },
245
+ divider: { zh: '分割线', en: 'Divider' },
246
+ heading1: { zh: '标题 1', en: 'Heading 1' },
247
+ heading2: { zh: '标题 2', en: 'Heading 2' },
248
+ heading3: { zh: '标题 3', en: 'Heading 3' },
249
+ paragraph: { zh: '正文', en: 'Paragraph' },
250
+ image: { zh: '图片', en: 'Image' },
251
+ table: { zh: '表格', en: 'Table' },
252
+ insertTable: { zh: '插入表格', en: 'Insert table' },
253
+ selectTableSize: { zh: '选择表格大小', en: 'Select table size' },
254
+ selectSize: { zh: '选择大小', en: 'Select size' },
255
+ link: { zh: '链接', en: 'Link' },
256
+ linkText: { zh: '输入链接文本...', en: 'Enter link text...' },
257
+ linkUrl: { zh: '输入链接地址...', en: 'Enter URL...' },
258
+ linkPlaceholder: { zh: '输入链接...', en: 'Enter link...' },
259
+ removeColor: { zh: '移除颜色', en: 'Remove color' },
260
+ },
261
+ NotionEditor: {
262
+ unnamedFile: { zh: '未命名文件', en: 'Untitled file' },
263
+ unnamedTitle: { zh: '未命名标题', en: 'Untitled heading' },
264
+ placeholder: { zh: '输入 "/" 快速插入内容', en: 'Type "/" to insert content' },
265
+ expandToc: { zh: '展开目录', en: 'Expand outline' },
266
+ collapseToc: { zh: '收起目录', en: 'Collapse outline' },
267
+ toc: { zh: '文档目录', en: 'Document outline' },
268
+ tocLabel: { zh: '目录', en: 'Outline' },
269
+ plainText: { zh: '纯文本', en: 'Plain text' },
270
+ },
271
+ };
272
+
273
+ export { translations };