first commit
This commit is contained in:
17
src/access.ts
Normal file
17
src/access.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { checkRole, matchPermission } from './utils/permission';
|
||||
|
||||
|
||||
export default function access(initialState: { currentUser: any } | undefined) {
|
||||
const { currentUser } = initialState ?? {};
|
||||
const hasPerms = (perm: string) => {
|
||||
return matchPermission(initialState?.perms, perm);
|
||||
};
|
||||
const roleFiler = (route: { authority: string[] }) => {
|
||||
return checkRole(initialState?.currentUser?.roles, route.authority);
|
||||
};
|
||||
return {
|
||||
canAdmin: currentUser && currentUser.access === 'admin',
|
||||
hasPerms,
|
||||
roleFiler,
|
||||
};
|
||||
}
|
||||
177
src/app.tsx
Normal file
177
src/app.tsx
Normal file
@@ -0,0 +1,177 @@
|
||||
import { AvatarDropdown, AvatarName, Footer, Question, SelectLang, FilesManager } from '@/components';
|
||||
import { LinkOutlined } from '@ant-design/icons';
|
||||
import type { Settings as LayoutSettings } from '@ant-design/pro-components';
|
||||
import { SettingDrawer } from '@ant-design/pro-components';
|
||||
import type { RequestConfig, RunTimeLayoutConfig } from '@umijs/max';
|
||||
import { history, Link } from '@umijs/max';
|
||||
import defaultSettings from '../config/defaultSettings';
|
||||
import { errorConfig } from './requestErrorConfig';
|
||||
import { currentUser as queryCurrentUser } from './services/user/index';
|
||||
import { roleMenuTreeSelect } from './services/user/menu'
|
||||
import { childrenRemove } from '@/utils/menu';
|
||||
|
||||
import { useAccess } from '@umijs/max';
|
||||
|
||||
import routes from '../config/routes';
|
||||
|
||||
const isDev = process.env.NODE_ENV === 'development';
|
||||
const loginPath = '/user/login';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @see https://umijs.org/zh-CN/plugins/plugin-initial-state
|
||||
* */
|
||||
export async function getInitialState(): Promise<{
|
||||
settings?: Partial<LayoutSettings>;
|
||||
currentUser?: {
|
||||
avatar: "",
|
||||
username: ""
|
||||
};
|
||||
routeIfo?: [];
|
||||
loading?: boolean;
|
||||
perms?: [];
|
||||
fetchUserInfo?: () => Promise<{} | undefined>;
|
||||
}> {
|
||||
const fetchUserInfo = async () => {
|
||||
try {
|
||||
const msg = await queryCurrentUser({
|
||||
skipErrorHandler: true,
|
||||
});
|
||||
|
||||
return msg.data;
|
||||
} catch (error) {
|
||||
history.push(loginPath);
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
// 如果不是登录页面,执行
|
||||
const { location } = history;
|
||||
if (![loginPath, '/user/register', '/user/register-result'].includes(location.pathname)) {
|
||||
const currentUser = await fetchUserInfo();
|
||||
currentUser.routeIfo.map((item, index) => {
|
||||
item.menuName = item.name
|
||||
})
|
||||
|
||||
|
||||
return {
|
||||
fetchUserInfo,
|
||||
currentUser: currentUser.user,
|
||||
routeIfo: currentUser.routeIfo,
|
||||
settings: defaultSettings as Partial<LayoutSettings>,
|
||||
perms: currentUser.perms
|
||||
};
|
||||
}
|
||||
return {
|
||||
fetchUserInfo,
|
||||
settings: defaultSettings as Partial<LayoutSettings>,
|
||||
};
|
||||
}
|
||||
|
||||
// ProLayout 支持的api https://procomponents.ant.design/components/layout
|
||||
export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
|
||||
const access = useAccess();
|
||||
|
||||
|
||||
return {
|
||||
// , <Question key="doc" />, <SelectLang key="SelectLang" />
|
||||
actionsRender: () => [<FilesManager mode={'text'} hidden={!access.hasPerms('sys:upload')} />],
|
||||
avatarProps: {
|
||||
src: initialState?.currentUser?.avatar || '@/assets/images/avatar.png',
|
||||
title: <AvatarName />,
|
||||
render: (_, avatarChildren) => {
|
||||
return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
|
||||
},
|
||||
},
|
||||
waterMarkProps: {
|
||||
content: initialState?.currentUser?.username,
|
||||
},
|
||||
footerRender: () => <Footer />,
|
||||
onPageChange: () => {
|
||||
const { location } = history;
|
||||
// 如果没有登录,重定向到 login
|
||||
if (!initialState?.currentUser && location.pathname !== loginPath) {
|
||||
history.push(loginPath);
|
||||
}
|
||||
},
|
||||
bgLayoutImgList: [
|
||||
{
|
||||
src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
|
||||
left: 85,
|
||||
bottom: 100,
|
||||
height: '303px',
|
||||
},
|
||||
{
|
||||
src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
|
||||
bottom: -68,
|
||||
right: -45,
|
||||
height: '303px',
|
||||
},
|
||||
{
|
||||
src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
|
||||
bottom: 0,
|
||||
left: 0,
|
||||
width: '331px',
|
||||
},
|
||||
],
|
||||
links: isDev
|
||||
? []
|
||||
: [],
|
||||
// [
|
||||
// <Link key="openapi" to="/umi/plugin/openapi" target="_blank">
|
||||
// <LinkOutlined />
|
||||
// <span>OpenAPI 文档</span>
|
||||
// </Link>,
|
||||
// ]
|
||||
// menu: {
|
||||
// locale: false,
|
||||
// request: async (params, defaultMenuData) => {
|
||||
// var listMenu: any[] = childrenRemove(initialState?.routeIfo) || [];
|
||||
// return [...defaultMenuData, ...listMenu];
|
||||
// }
|
||||
// },
|
||||
menuDataRender: (menuData) => {
|
||||
let list = initialState?.routeIfo ? childrenRemove([...initialState?.routeIfo]) : []
|
||||
return [...routes, ...list];
|
||||
},
|
||||
menuHeaderRender: undefined,
|
||||
// 自定义 403 页面
|
||||
// unAccessible: <div>unAccessible</div>,
|
||||
// 增加一个 loading 的状态
|
||||
childrenRender: (children) => {
|
||||
// if (initialState?.loading) return <PageLoading />;
|
||||
return (
|
||||
<>
|
||||
{children}
|
||||
{isDev && (
|
||||
<SettingDrawer
|
||||
disableUrlParams
|
||||
enableDarkTheme
|
||||
settings={initialState?.settings}
|
||||
onSettingChange={(settings) => {
|
||||
setInitialState((preInitialState) => ({
|
||||
...preInitialState,
|
||||
settings,
|
||||
}));
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
},
|
||||
...initialState?.settings,
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* @name request 配置,可以配置错误处理
|
||||
* 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
|
||||
* @doc https://umijs.org/docs/max/request#配置
|
||||
*/
|
||||
export const request: RequestConfig = {
|
||||
// baseURL: 'https://proapi.azurewebsites.net',
|
||||
// baseURL: 'http://192.168.0.32:6001',
|
||||
...errorConfig,
|
||||
};
|
||||
BIN
src/assets/images/avatar.png
Normal file
BIN
src/assets/images/avatar.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.1 KiB |
4202
src/assets/json/font_3604052_9dbp3ego1cl.json
Normal file
4202
src/assets/json/font_3604052_9dbp3ego1cl.json
Normal file
File diff suppressed because it is too large
Load Diff
4940
src/assets/json/quanguoshixianweizhi.json
Normal file
4940
src/assets/json/quanguoshixianweizhi.json
Normal file
File diff suppressed because it is too large
Load Diff
20
src/components/Authority/index.js
Normal file
20
src/components/Authority/index.js
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* @Note:
|
||||
* @Author: 2058827620@qq.com
|
||||
* @Date: 2022-04-03 10:53:25
|
||||
*/
|
||||
import { useModel } from 'umi';
|
||||
|
||||
export const AuthConsumer = (props) => {
|
||||
const { initialState, loading, error, refresh, setInitialState } = useModel('@@initialState');
|
||||
|
||||
const auth = initialState?.authPermissionAction;
|
||||
|
||||
if (!auth) {
|
||||
return <span>{props.children}</span>;
|
||||
}
|
||||
const res = auth.indexOf(props.action);
|
||||
return res >= 0 ? <span>{props.children}</span> : <></>;
|
||||
};
|
||||
|
||||
export default AuthConsumer;
|
||||
115
src/components/DictTag/index.tsx
Normal file
115
src/components/DictTag/index.tsx
Normal file
@@ -0,0 +1,115 @@
|
||||
import React from 'react';
|
||||
import { Tag } from 'antd';
|
||||
import { ProSchemaValueEnumType } from '@ant-design/pro-components';
|
||||
import { DefaultOptionType } from 'antd/es/select';
|
||||
|
||||
/* *
|
||||
*
|
||||
* @author whiteshader@163.com
|
||||
* @datetime 2023/02/10
|
||||
*
|
||||
* */
|
||||
|
||||
export interface DictValueEnumType extends ProSchemaValueEnumType {
|
||||
id?: string | number;
|
||||
key?: string | number;
|
||||
value: string | number;
|
||||
label: string;
|
||||
listClass?: string;
|
||||
}
|
||||
|
||||
export interface DictOptionType extends DefaultOptionType {
|
||||
id?: string | number;
|
||||
key?: string | number;
|
||||
text: string;
|
||||
listClass?: string;
|
||||
}
|
||||
|
||||
|
||||
export type DictValueEnumObj = Record<string | number, DictValueEnumType>;
|
||||
|
||||
export type DictTagProps = {
|
||||
key?: string;
|
||||
value?: string | number;
|
||||
enums?: DictValueEnumObj;
|
||||
options?: DictOptionType[];
|
||||
};
|
||||
|
||||
const DictTag: React.FC<DictTagProps> = (props) => {
|
||||
function getDictColor(type?: string) {
|
||||
switch (type) {
|
||||
case 'primary':
|
||||
return 'blue';
|
||||
case 'success':
|
||||
return 'success';
|
||||
case 'info':
|
||||
return 'green';
|
||||
case 'warning':
|
||||
return 'warning';
|
||||
case 'danger':
|
||||
return 'error';
|
||||
case 'default':
|
||||
default:
|
||||
return 'default';
|
||||
}
|
||||
}
|
||||
|
||||
function getDictLabelByValue(value: string | number | undefined): string {
|
||||
if (value === undefined) {
|
||||
return '';
|
||||
}
|
||||
if (props.enums) {
|
||||
const item = props.enums[value];
|
||||
return item.label;
|
||||
}
|
||||
if (props.options) {
|
||||
if (!Array.isArray(props.options)) {
|
||||
console.log('DictTag options is no array!')
|
||||
return '';
|
||||
}
|
||||
for (const item of props.options) {
|
||||
if (item.value === value) {
|
||||
return item.text;
|
||||
}
|
||||
}
|
||||
}
|
||||
return String(props.value);
|
||||
}
|
||||
|
||||
function getDictListClassByValue(value: string | number | undefined): string {
|
||||
if (value === undefined) {
|
||||
return 'default';
|
||||
}
|
||||
if (props.enums) {
|
||||
const item = props.enums[value];
|
||||
return item.listClass || 'default';
|
||||
}
|
||||
if (props.options) {
|
||||
if (!Array.isArray(props.options)) {
|
||||
console.log('DictTag options is no array!')
|
||||
return 'default';
|
||||
}
|
||||
for (const item of props.options) {
|
||||
if (item.value === value) {
|
||||
return item.listClass || 'default';
|
||||
}
|
||||
}
|
||||
}
|
||||
return String(props.value);
|
||||
}
|
||||
|
||||
const getTagColor = () => {
|
||||
return getDictColor(getDictListClassByValue(props.value).toLowerCase());
|
||||
};
|
||||
|
||||
const getTagText = (): string => {
|
||||
return getDictLabelByValue(props.value);
|
||||
};
|
||||
|
||||
return (
|
||||
<Tag color={getTagColor()}>{getTagText()}</Tag>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
export default DictTag;
|
||||
47
src/components/FilesManage/FilesCategory/CreateFormModal.tsx
Normal file
47
src/components/FilesManage/FilesCategory/CreateFormModal.tsx
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* @Note:
|
||||
* @Author: 2058827620@qq.com
|
||||
* @Date: 2022-04-03 17:02:15
|
||||
*/
|
||||
|
||||
import { ProForm, ModalForm, ProFormText } from '@ant-design/pro-components';
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
|
||||
export default ({ values, modalOpenState, onModalOpenState, onSubmit }) => {
|
||||
const restFormRef = useRef();
|
||||
useEffect(() => {
|
||||
restFormRef.current?.setFieldsValue(values);
|
||||
}, [values]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<ModalForm
|
||||
title="文件分类-添加"
|
||||
formRef={restFormRef}
|
||||
submitter={{
|
||||
searchConfig: {
|
||||
resetText: '重置',
|
||||
},
|
||||
resetButtonProps: {
|
||||
onClick: () => {
|
||||
restFormRef.current?.resetFields();
|
||||
},
|
||||
},
|
||||
}}
|
||||
initialValues={values}
|
||||
onFinish={onSubmit}
|
||||
open={modalOpenState}
|
||||
onOpenChange={onModalOpenState}
|
||||
>
|
||||
<ProFormText hidden={true} width="md" name="id" />
|
||||
<ProFormText
|
||||
rules={[{ required: true, message: '请输入名称!' }]}
|
||||
width="md"
|
||||
name="name"
|
||||
label="名称"
|
||||
placeholder="请输入名称"
|
||||
/>
|
||||
</ModalForm>
|
||||
</>
|
||||
);
|
||||
};
|
||||
47
src/components/FilesManage/FilesCategory/UpdateFormModal.tsx
Normal file
47
src/components/FilesManage/FilesCategory/UpdateFormModal.tsx
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* @Note:
|
||||
* @Author: 2058827620@qq.com
|
||||
* @Date: 2022-04-03 17:02:15
|
||||
*/
|
||||
|
||||
import { ProForm, ModalForm, ProFormText } from '@ant-design/pro-components';
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
|
||||
export default ({ values, modalOpenState, onModalOpenState, onSubmit }) => {
|
||||
const restFormRef = useRef();
|
||||
useEffect(() => {
|
||||
restFormRef.current?.setFieldsValue(values);
|
||||
}, [values]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<ModalForm
|
||||
title="文件分类-编辑"
|
||||
formRef={restFormRef}
|
||||
submitter={{
|
||||
searchConfig: {
|
||||
resetText: '重置',
|
||||
},
|
||||
resetButtonProps: {
|
||||
onClick: () => {
|
||||
restFormRef.current?.resetFields();
|
||||
},
|
||||
},
|
||||
}}
|
||||
initialValues={values}
|
||||
onFinish={onSubmit}
|
||||
open={modalOpenState}
|
||||
onOpenChange={onModalOpenState}
|
||||
>
|
||||
<ProFormText hidden={true} width="md" name="id" />
|
||||
<ProFormText
|
||||
rules={[{ required: true, message: '请输入名称!' }]}
|
||||
width="md"
|
||||
name="name"
|
||||
label="名称"
|
||||
placeholder="请输入名称"
|
||||
/>
|
||||
</ModalForm>
|
||||
</>
|
||||
);
|
||||
};
|
||||
169
src/components/FilesManage/FilesCategory/index.tsx
Normal file
169
src/components/FilesManage/FilesCategory/index.tsx
Normal file
@@ -0,0 +1,169 @@
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import {
|
||||
Dropdown, Button, Space
|
||||
} from 'antd';
|
||||
import { MenuOutlined, PlusOutlined } from '@ant-design/icons';
|
||||
|
||||
import AuthConsumer from '@/components/Authority';
|
||||
import CreateFormModal from './CreateFormModal';
|
||||
import UpdateFormModal from './UpdateFormModal';
|
||||
|
||||
|
||||
import { categoryList, categoryAdd, categoryDelete } from '@/services/files/index';
|
||||
|
||||
// import services from '@/services/admin';
|
||||
|
||||
// const {
|
||||
// filesCategoryItems, filesCategoryItem, filesCategoryCreate,
|
||||
// filesCategoryDelete, filesCategoryUpdate
|
||||
// } = services.FilesCategoryController;
|
||||
|
||||
export default ({ cid, setCid, setFilesCategoryItems }) => {
|
||||
const [filesCategoryItemsData, setFilesCategoryItemsData] = useState([]);
|
||||
|
||||
const [createFormModal, setCreateFormModal] = useState(false);
|
||||
const [updateFormModal, setUpdateFormModal] = useState(false);
|
||||
|
||||
const initRow = {
|
||||
id: '',
|
||||
name: ''
|
||||
}
|
||||
const [row, setRow] = useState(initRow);
|
||||
|
||||
useEffect(() => {
|
||||
getFilesCategoryItems();
|
||||
}, []);
|
||||
|
||||
const getFilesCategoryItems = () => {
|
||||
categoryList().then(({ data }) => {
|
||||
setFilesCategoryItemsData(data);
|
||||
setFilesCategoryItems(data);
|
||||
});
|
||||
}
|
||||
|
||||
const handleCreate = async (fields) => {
|
||||
setRow(fields);
|
||||
|
||||
const { success } = await categoryAdd({ ...fields });
|
||||
|
||||
if (success) {
|
||||
setRow(initRow);
|
||||
setCreateFormModal(false);
|
||||
getFilesCategoryItems();
|
||||
}
|
||||
}
|
||||
const handleUpdate = async (fields) => {
|
||||
setRow(fields);
|
||||
|
||||
const { success } = await categoryDelete({ ...fields });
|
||||
|
||||
if (success) {
|
||||
setRow(initRow);
|
||||
setUpdateFormModal(false);
|
||||
getFilesCategoryItems();
|
||||
}
|
||||
}
|
||||
|
||||
const handleAction = async (item) => {
|
||||
switch (item.key) {
|
||||
case 'create':
|
||||
|
||||
setCreateFormModal(true);
|
||||
break;
|
||||
|
||||
case 'update':
|
||||
setRow(item);
|
||||
setUpdateFormModal(true);
|
||||
break;
|
||||
|
||||
case 'delete':
|
||||
// eslint-disable-next-line no-case-declarations
|
||||
const { success } = await filesCategoryDelete(item);
|
||||
if (success) {
|
||||
getFilesCategoryItems();
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<UpdateFormModal
|
||||
values={row}
|
||||
modalOpenState={updateFormModal}
|
||||
onModalOpenState={setUpdateFormModal}
|
||||
onSubmit={handleUpdate}
|
||||
/>
|
||||
<CreateFormModal
|
||||
values={row}
|
||||
modalOpenState={createFormModal}
|
||||
onModalOpenState={setCreateFormModal}
|
||||
onSubmit={handleCreate}
|
||||
/>
|
||||
<Space
|
||||
direction="vertical"
|
||||
className={`w-28`}
|
||||
>
|
||||
<div
|
||||
className={`flex justify-between`}
|
||||
>
|
||||
<div
|
||||
className={`${!cid ? 'text-blue-500' : ''} cursor-pointer hover:text-blue-500`}
|
||||
onClick={() => {
|
||||
setCid(null)
|
||||
}}
|
||||
key={null}
|
||||
>全部文件</div>
|
||||
<div
|
||||
className={`cursor-pointer`}
|
||||
>
|
||||
<PlusOutlined onClick={() => {
|
||||
handleAction({ key: 'create', ...initRow })
|
||||
}} />
|
||||
</div>
|
||||
</div>
|
||||
{
|
||||
filesCategoryItemsData?.map(item =>
|
||||
<div
|
||||
key={item.id}
|
||||
className={`flex justify-between`}
|
||||
>
|
||||
<div
|
||||
className={`${cid === item.id ? 'text-blue-500' : ''} cursor-pointer hover:text-blue-500`}
|
||||
onClick={() => {
|
||||
setCid(item.id)
|
||||
}}
|
||||
key={null}
|
||||
>{item.name}</div>
|
||||
<div
|
||||
className={`cursor-pointer`}
|
||||
>
|
||||
<Dropdown menu={{
|
||||
items: [
|
||||
{
|
||||
label: '编辑分类',
|
||||
key: 'update',
|
||||
},
|
||||
{
|
||||
label: '删除分类',
|
||||
key: 'delete',
|
||||
},
|
||||
],
|
||||
onClick: ({ key }) => {
|
||||
handleAction({ key, ...item })
|
||||
}
|
||||
}}>
|
||||
<MenuOutlined />
|
||||
</Dropdown>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
</Space>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
432
src/components/FilesManage/index.tsx
Normal file
432
src/components/FilesManage/index.tsx
Normal file
@@ -0,0 +1,432 @@
|
||||
/*
|
||||
* @Note:
|
||||
* @Author: 2058827620@qq.com
|
||||
* @Date: 2021-12-29 16:19:02
|
||||
*/
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import {
|
||||
Divider, Image, Modal, Badge, Button, Space, Upload,
|
||||
Pagination, Popconfirm, message, Select, Popover, Tooltip, Input
|
||||
} from 'antd';
|
||||
import { UploadOutlined, FileUnknownOutlined, CloseOutlined } from '@ant-design/icons';
|
||||
import {
|
||||
ProForm,
|
||||
ProFormText,
|
||||
} from '@ant-design/pro-components';
|
||||
// import Iconfont from '../IconSelect/iconfont';
|
||||
|
||||
import FilesCategory from './FilesCategory'
|
||||
import { deepCopy, copy } from '@/utils/func';
|
||||
|
||||
import { filesPage, filesMove, filesDelete, filesAdd, getOssUploadParams } from '@/services/files/index';
|
||||
|
||||
// const {
|
||||
// filesItems, filesItem, filesCreate,
|
||||
// filesDelete, filesUpdate
|
||||
// } = services.FilesController;
|
||||
// const {
|
||||
// ossUptoken
|
||||
// } = services.ComController;
|
||||
|
||||
export const FilesManager = ({ fileType, count, defaultValue, mode, imagesShow = true, ...restProps }) => {
|
||||
const [filesItemsData, setFilesItemsData] = useState([]);
|
||||
const [checkedFilesItems, setCheckedFilesItems] = useState([]);
|
||||
const [checkedFilesIds, setCheckedFilesIds] = useState([]);
|
||||
const [checkedFilesKey, setCheckedFilesKey] = useState([]);
|
||||
|
||||
const [filesCategoryItems, setFilesCategoryItems] = useState([]);
|
||||
const [OSSData, setOSSData] = useState();
|
||||
const [fileList, setFileList] = useState([]);
|
||||
|
||||
const [modalOpenState, setModalOpenState] = useState(false);
|
||||
|
||||
const [cid, setCid] = useState(null);
|
||||
const [page, setPage] = useState(1);
|
||||
|
||||
const { onChange } = restProps;
|
||||
|
||||
const inputChange = (e) => {
|
||||
onChange(e.target.value);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (!localStorage.getItem('token')) {
|
||||
return
|
||||
}
|
||||
getOssUploadParams().then(({ data }) => {
|
||||
setOSSData(data);
|
||||
});
|
||||
}, []);
|
||||
useEffect(() => {
|
||||
getFilesItems();
|
||||
}, [cid, page]);
|
||||
|
||||
const getFilesItems = () => {
|
||||
// if(!localStorage.getItem('token')){
|
||||
// return
|
||||
// }
|
||||
filesPage({
|
||||
categoryId: cid || '',
|
||||
current: page,
|
||||
fileType: fileType,
|
||||
pageSize: 20
|
||||
}).then(({ data }) => {
|
||||
setFilesItemsData(data);
|
||||
});
|
||||
};
|
||||
|
||||
const onCheckedFile = (item) => {
|
||||
console.log(item.fileType);
|
||||
console.log(fileType);
|
||||
|
||||
if(fileType && !item.fileType.includes(fileType)){
|
||||
message.error(`请选择正确的格式`);
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
const current = checkedFilesIds.indexOf(item.id);
|
||||
//不存在添加
|
||||
if (current === -1) {
|
||||
setCheckedFilesIds((prev) => prev.concat(item.id));
|
||||
setCheckedFilesItems((prev) => prev.concat(item));
|
||||
//超出数量,删除第一个
|
||||
if (checkedFilesIds.length >= count) {
|
||||
setCheckedFilesIds((prev) => prev.filter((row, idx) => idx !== 0));
|
||||
setCheckedFilesItems((prev) => prev.filter((row, idx) => idx !== 0));
|
||||
}
|
||||
|
||||
} else {
|
||||
//存在删除
|
||||
setCheckedFilesIds((prev) => prev.filter(row => row !== item.id));
|
||||
setCheckedFilesItems((prev) => prev.filter(row => row.id !== item.id));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
const handleDelete = async () => {
|
||||
const { success } = await filesDelete(checkedFilesIds);
|
||||
if (success) {
|
||||
setCheckedFilesIds([]);
|
||||
setCheckedFilesItems([]);
|
||||
getFilesItems();
|
||||
}
|
||||
};
|
||||
const handleUpdate = async (cid) => {
|
||||
// console.log(checkedFilesIds);
|
||||
// return
|
||||
const { success } = await filesMove({
|
||||
batchMoveParams: checkedFilesIds.map((i) => {
|
||||
return {
|
||||
id: i,
|
||||
categoryId: cid
|
||||
}
|
||||
})
|
||||
});
|
||||
if (success) {
|
||||
setCheckedFilesIds([]);
|
||||
setCheckedFilesItems([]);
|
||||
getFilesItems();
|
||||
}
|
||||
};
|
||||
|
||||
const handleUse = () => {
|
||||
//key用于提交接口
|
||||
const key = checkedFilesKey;
|
||||
//ids用于删除、移动分类
|
||||
checkedFilesItems.map((item) => {
|
||||
key.push(item.fullPath);
|
||||
});
|
||||
|
||||
console.log(checkedFilesItems, 'checkedFilesItems');
|
||||
|
||||
|
||||
//form 表单值
|
||||
if (count <= 1) {
|
||||
onChange(key.slice(-1)[0]);
|
||||
setCheckedFilesKey([key.slice(-1)[0]]);
|
||||
} else {
|
||||
onChange(key);
|
||||
setCheckedFilesKey(key);
|
||||
}
|
||||
setCheckedFilesIds([]);
|
||||
setCheckedFilesItems([]);
|
||||
setModalOpenState(false);
|
||||
};
|
||||
const deleteCheckedFilesKey = (key) => {
|
||||
|
||||
if (typeof checkedFilesKey === 'string') {
|
||||
setCheckedFilesKey('');
|
||||
} else {
|
||||
setCheckedFilesKey(checkedFilesKey.splice(key, 1));
|
||||
}
|
||||
setCheckedFilesKey(checkedFilesKey.splice(key, 1));
|
||||
|
||||
//form 表单值
|
||||
if (checkedFilesKey.length >= 1) {
|
||||
onChange(checkedFilesKey);
|
||||
} else {
|
||||
onChange('');
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
if (defaultValue && defaultValue.length) {
|
||||
if (typeof defaultValue === 'string') {
|
||||
setCheckedFilesKey([defaultValue]);
|
||||
} else {
|
||||
setCheckedFilesKey(defaultValue);
|
||||
}
|
||||
} else {
|
||||
setCheckedFilesKey([]);
|
||||
}
|
||||
}, [defaultValue]);
|
||||
|
||||
const uploadProps = {
|
||||
name: 'file',
|
||||
action: OSSData?.host,
|
||||
//maxCount: 1,
|
||||
multiple: true,
|
||||
fileList: fileList,
|
||||
data: (file) => {
|
||||
//
|
||||
const data = {
|
||||
key: OSSData?.dir + file.name,
|
||||
OSSAccessKeyId: OSSData?.accessId,
|
||||
Policy: OSSData?.policy,
|
||||
'success_action_status': '200',
|
||||
Signature: OSSData?.signature,
|
||||
};
|
||||
return data
|
||||
},
|
||||
|
||||
progress: {
|
||||
strokeColor: {
|
||||
'0%': '#108ee9',
|
||||
'100%': '#87d068',
|
||||
},
|
||||
size: 3,
|
||||
format: (percent) => `${parseFloat(percent.toFixed(2))}%`,
|
||||
},
|
||||
beforeUpload: (file) => {
|
||||
|
||||
}
|
||||
};
|
||||
const onChangeUpload = (info) => {
|
||||
setFileList(info.fileList);
|
||||
if (info.file.status !== 'uploading') {
|
||||
}
|
||||
if (info.file.status === 'done') {
|
||||
console.log(info)
|
||||
filesAdd({
|
||||
path: OSSData?.dir + info.file.name,
|
||||
categoryId: cid,
|
||||
fileType: 'images',
|
||||
name: info.file.name
|
||||
}).then(() => {
|
||||
setFileList(null);
|
||||
getFilesItems();
|
||||
});
|
||||
} else if (info.file.status === 'error') {
|
||||
message.error(`${info.file.name} 上传失败`);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className='Itemaaa'>
|
||||
<ProForm.Item {...restProps}>
|
||||
<ProFormText
|
||||
hidden={true}
|
||||
onChange={inputChange}
|
||||
placeholder={restProps.placeholder}
|
||||
{...restProps.fieldProps}
|
||||
/>
|
||||
{
|
||||
mode === 'text' ? <Button size="small" type="link" onClick={() => {
|
||||
setModalOpenState(true);
|
||||
}}>文件管理</Button> :
|
||||
<Space>
|
||||
{checkedFilesKey.map((item) => {
|
||||
return (
|
||||
imagesShow && <a key={item} className='w-20'>
|
||||
{
|
||||
fileType === 'image' ? <Image width="100px" height="100px" src={item} /> : <video style={{ width: 100, height: 100 }} src={item} ></video>
|
||||
}
|
||||
<Popover content={
|
||||
<div style={{ width: 500 }}>
|
||||
<video src={item} controls width={500} />
|
||||
<Input defaultValue={item} />
|
||||
</div>
|
||||
}
|
||||
title="">
|
||||
{
|
||||
// fileType === 'video' ? <Iconfont type='icon-video' className='text-7xl' /> : ''
|
||||
''
|
||||
}
|
||||
</Popover>
|
||||
|
||||
|
||||
<Badge
|
||||
offset={[-4, -60]}
|
||||
onClick={() => {
|
||||
deleteCheckedFilesKey(item);
|
||||
}}
|
||||
count={<CloseOutlined />}
|
||||
>
|
||||
</Badge>
|
||||
</a>
|
||||
);
|
||||
})}
|
||||
|
||||
<Button
|
||||
onClick={() => {
|
||||
setModalOpenState(true);
|
||||
}}
|
||||
type="primary"
|
||||
icon={<UploadOutlined />}
|
||||
/>
|
||||
|
||||
</Space>
|
||||
}
|
||||
</ProForm.Item>
|
||||
<Modal
|
||||
title="文件管理"
|
||||
open={modalOpenState}
|
||||
onCancel={() => {
|
||||
setModalOpenState(false);
|
||||
}}
|
||||
onOk={() => {
|
||||
setModalOpenState(false);
|
||||
}}
|
||||
footer={null}
|
||||
width={'70%'}
|
||||
styles={{ body: { padding: 0 } }}
|
||||
>
|
||||
<div
|
||||
className={`flex`}
|
||||
>
|
||||
<FilesCategory cid={cid} setCid={setCid} setFilesCategoryItems={setFilesCategoryItems} />
|
||||
<div
|
||||
className={`w-2`}
|
||||
>
|
||||
<Divider></Divider>
|
||||
</div>
|
||||
<div>
|
||||
<div>
|
||||
<Space>
|
||||
<Button
|
||||
type="primary"
|
||||
disabled={!checkedFilesIds.length || mode === 'text'}
|
||||
onClick={handleUse}
|
||||
>使用</Button>
|
||||
<Upload
|
||||
onChange={onChangeUpload} {...uploadProps}
|
||||
showUploadList={false}
|
||||
>
|
||||
<Button
|
||||
type="primary"
|
||||
>上传文件</Button>
|
||||
</Upload>
|
||||
|
||||
<Popconfirm
|
||||
title="确认删除?"
|
||||
disabled={!checkedFilesIds.length}
|
||||
onConfirm={() => { handleDelete() }}
|
||||
>
|
||||
<Button
|
||||
disabled={!checkedFilesIds.length}
|
||||
danger
|
||||
>删除</Button>
|
||||
</Popconfirm>
|
||||
|
||||
<Select
|
||||
className={`w-52`}
|
||||
placeholder="移动"
|
||||
disabled={!checkedFilesIds.length}
|
||||
onChange={(e) => {
|
||||
handleUpdate(e);
|
||||
}}
|
||||
fieldNames={{
|
||||
label: "name",
|
||||
value: "id",
|
||||
}}
|
||||
options={filesCategoryItems}
|
||||
/>
|
||||
|
||||
</Space>
|
||||
</div>
|
||||
<div className={`h-2`}></div>
|
||||
<div
|
||||
className={`max-w-[712px]`}
|
||||
>
|
||||
<Space wrap>
|
||||
|
||||
{
|
||||
filesItemsData?.records?.map(item =>
|
||||
|
||||
<Badge
|
||||
key={item.id}
|
||||
count={checkedFilesIds.indexOf(item.id) + 1}
|
||||
offset={[-16, 16]}
|
||||
>
|
||||
{item.fileType == 'images' ? <Image
|
||||
width={112}
|
||||
height={100}
|
||||
preview={false}
|
||||
src={item.fullPath}
|
||||
onClick={() => {
|
||||
onCheckedFile(item)
|
||||
}}
|
||||
/> : <video style={{ width: 112, height: 100 }} src={item.fullPath} onClick={() => {
|
||||
onCheckedFile(item)
|
||||
}}></video>}
|
||||
<div className={`flex justify-between h-6 leading-6`}>
|
||||
<Tooltip title={item.name}>
|
||||
<div className={`w-20 truncate`}>{item.name}</div>
|
||||
</Tooltip>
|
||||
<a
|
||||
onClick={() => copy(item.fullPath)}
|
||||
>复制</a>
|
||||
</div>
|
||||
</Badge>
|
||||
)
|
||||
}
|
||||
</Space>
|
||||
</div>
|
||||
<div className={`h-2`}></div>
|
||||
<div>
|
||||
<Pagination
|
||||
onChange={
|
||||
(page, pageSize) => {
|
||||
setPage(page);
|
||||
}
|
||||
}
|
||||
showQuickJumper
|
||||
showTotal={total => `共 ${filesItemsData.total} 条`}
|
||||
defaultCurrent={1}
|
||||
defaultPageSize={18}
|
||||
total={filesItemsData.total}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Modal>
|
||||
<style>{`
|
||||
.Itemaaa .ant-form-item {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
`}</style>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
export default FilesManager;
|
||||
36
src/components/Footer/index.tsx
Normal file
36
src/components/Footer/index.tsx
Normal file
@@ -0,0 +1,36 @@
|
||||
import { GithubOutlined } from '@ant-design/icons';
|
||||
import { DefaultFooter } from '@ant-design/pro-components';
|
||||
import React from 'react';
|
||||
|
||||
const Footer: React.FC = () => {
|
||||
return (
|
||||
<DefaultFooter
|
||||
style={{
|
||||
background: 'none',
|
||||
}}
|
||||
copyright="云充电管理后台"
|
||||
links={[
|
||||
{
|
||||
key: 'yunchongdian',
|
||||
title: '云充电管理后台',
|
||||
href: '',
|
||||
blankTarget: true,
|
||||
},
|
||||
// {
|
||||
// key: 'github',
|
||||
// title: <GithubOutlined />,
|
||||
// href: 'https://github.com/ant-design/ant-design-pro',
|
||||
// blankTarget: true,
|
||||
// },
|
||||
// {
|
||||
// key: 'Ant Design',
|
||||
// title: 'Ant Design',
|
||||
// href: 'https://ant.design',
|
||||
// blankTarget: true,
|
||||
// },
|
||||
]}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default Footer;
|
||||
27
src/components/HeaderDropdown/index.tsx
Normal file
27
src/components/HeaderDropdown/index.tsx
Normal file
@@ -0,0 +1,27 @@
|
||||
import { Dropdown } from 'antd';
|
||||
import { createStyles } from 'antd-style';
|
||||
import type { DropDownProps } from 'antd/es/dropdown';
|
||||
import classNames from 'classnames';
|
||||
import React from 'react';
|
||||
|
||||
const useStyles = createStyles(({ token }) => {
|
||||
return {
|
||||
dropdown: {
|
||||
[`@media screen and (max-width: ${token.screenXS}px)`]: {
|
||||
width: '100%',
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
export type HeaderDropdownProps = {
|
||||
overlayClassName?: string;
|
||||
placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topCenter' | 'topRight' | 'bottomCenter';
|
||||
} & Omit<DropDownProps, 'overlay'>;
|
||||
|
||||
const HeaderDropdown: React.FC<HeaderDropdownProps> = ({ overlayClassName: cls, ...restProps }) => {
|
||||
const { styles } = useStyles();
|
||||
return <Dropdown overlayClassName={classNames(styles.dropdown, cls)} {...restProps} />;
|
||||
};
|
||||
|
||||
export default HeaderDropdown;
|
||||
60
src/components/IconSelector/Category.tsx
Normal file
60
src/components/IconSelector/Category.tsx
Normal file
@@ -0,0 +1,60 @@
|
||||
import * as React from 'react';
|
||||
import CopyableIcon from './CopyableIcon';
|
||||
import type { ThemeType } from './index';
|
||||
import type { CategoriesKeys } from './fields';
|
||||
import { useIntl } from '@umijs/max';
|
||||
import styles from './style.less';
|
||||
|
||||
interface CategoryProps {
|
||||
title: CategoriesKeys;
|
||||
icons: string[];
|
||||
theme: ThemeType;
|
||||
newIcons: string[];
|
||||
onSelect: (type: string, name: string) => any;
|
||||
}
|
||||
|
||||
const Category: React.FC<CategoryProps> = props => {
|
||||
|
||||
const { icons, title, newIcons, theme } = props;
|
||||
const intl = useIntl();
|
||||
const [justCopied, setJustCopied] = React.useState<string | null>(null);
|
||||
const copyId = React.useRef<NodeJS.Timeout | null>(null);
|
||||
const onSelect = React.useCallback((type: string, text: string) => {
|
||||
const { onSelect } = props;
|
||||
if (onSelect) {
|
||||
onSelect(type, text);
|
||||
}
|
||||
setJustCopied(type);
|
||||
copyId.current = setTimeout(() => {
|
||||
setJustCopied(null);
|
||||
}, 2000);
|
||||
}, []);
|
||||
React.useEffect(
|
||||
() => () => {
|
||||
if (copyId.current) {
|
||||
clearTimeout(copyId.current);
|
||||
}
|
||||
},
|
||||
[],
|
||||
);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h4>icon</h4>
|
||||
<ul className={styles.anticonsList}>
|
||||
{icons.map(name => (
|
||||
<CopyableIcon
|
||||
key={name}
|
||||
name={name}
|
||||
theme={theme}
|
||||
isNew={newIcons.includes(name)}
|
||||
justCopied={justCopied}
|
||||
onSelect={onSelect}
|
||||
/>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Category;
|
||||
47
src/components/IconSelector/CopyableIcon.tsx
Normal file
47
src/components/IconSelector/CopyableIcon.tsx
Normal file
@@ -0,0 +1,47 @@
|
||||
import * as React from 'react';
|
||||
import { Tooltip } from 'antd';
|
||||
import classNames from 'classnames';
|
||||
import * as AntdIcons from '@ant-design/icons';
|
||||
import type { ThemeType } from './index';
|
||||
import styles from './style.less';
|
||||
|
||||
const allIcons: {
|
||||
[key: string]: any;
|
||||
} = AntdIcons;
|
||||
|
||||
export interface CopyableIconProps {
|
||||
name: string;
|
||||
isNew: boolean;
|
||||
theme: ThemeType;
|
||||
justCopied: string | null;
|
||||
onSelect: (type: string, text: string) => any;
|
||||
}
|
||||
|
||||
const CopyableIcon: React.FC<CopyableIconProps> = ({
|
||||
name,
|
||||
justCopied,
|
||||
onSelect,
|
||||
theme,
|
||||
}) => {
|
||||
const className = classNames({
|
||||
copied: justCopied === name,
|
||||
[theme]: !!theme,
|
||||
});
|
||||
return (
|
||||
<li className={className}
|
||||
onClick={() => {
|
||||
if (onSelect) {
|
||||
onSelect(theme, name);
|
||||
}
|
||||
}}>
|
||||
<Tooltip title={name}>
|
||||
{React.createElement(allIcons[name], { className: styles.anticon })}
|
||||
</Tooltip>
|
||||
{/* <span className={styles.anticonClass}>
|
||||
<Badge dot={isNew}>{name}</Badge>
|
||||
</span> */}
|
||||
</li>
|
||||
);
|
||||
};
|
||||
|
||||
export default CopyableIcon;
|
||||
140
src/components/IconSelector/IconPicSearcher.tsx
Normal file
140
src/components/IconSelector/IconPicSearcher.tsx
Normal file
@@ -0,0 +1,140 @@
|
||||
import React, { useCallback, useEffect, useState } from 'react';
|
||||
import { Upload, Tooltip, Popover, Modal, Progress, Spin, Result } from 'antd';
|
||||
import * as AntdIcons from '@ant-design/icons';
|
||||
import { useIntl } from '@umijs/max';
|
||||
import './style.less';
|
||||
|
||||
const allIcons: { [key: string]: any } = AntdIcons;
|
||||
|
||||
const { Dragger } = Upload;
|
||||
interface AntdIconClassifier {
|
||||
load: () => void;
|
||||
predict: (imgEl: HTMLImageElement) => void;
|
||||
}
|
||||
declare global {
|
||||
interface Window {
|
||||
antdIconClassifier: AntdIconClassifier;
|
||||
}
|
||||
}
|
||||
|
||||
interface PicSearcherState {
|
||||
loading: boolean;
|
||||
modalOpen: boolean;
|
||||
popoverVisible: boolean;
|
||||
icons: iconObject[];
|
||||
fileList: any[];
|
||||
error: boolean;
|
||||
modelLoaded: boolean;
|
||||
}
|
||||
|
||||
interface iconObject {
|
||||
type: string;
|
||||
score: number;
|
||||
}
|
||||
|
||||
const PicSearcher: React.FC = () => {
|
||||
const intl = useIntl();
|
||||
const {formatMessage} = intl;
|
||||
const [state, setState] = useState<PicSearcherState>({
|
||||
loading: false,
|
||||
modalOpen: false,
|
||||
popoverVisible: false,
|
||||
icons: [],
|
||||
fileList: [],
|
||||
error: false,
|
||||
modelLoaded: false,
|
||||
});
|
||||
const predict = (imgEl: HTMLImageElement) => {
|
||||
try {
|
||||
let icons: any[] = window.antdIconClassifier.predict(imgEl);
|
||||
if (gtag && icons.length) {
|
||||
gtag('event', 'icon', {
|
||||
event_category: 'search-by-image',
|
||||
event_label: icons[0].className,
|
||||
});
|
||||
}
|
||||
icons = icons.map(i => ({ score: i.score, type: i.className.replace(/\s/g, '-') }));
|
||||
setState(prev => ({ ...prev, loading: false, error: false, icons }));
|
||||
} catch {
|
||||
setState(prev => ({ ...prev, loading: false, error: true }));
|
||||
}
|
||||
};
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
const toImage = (url: string) =>
|
||||
new Promise(resolve => {
|
||||
const img = new Image();
|
||||
img.setAttribute('crossOrigin', 'anonymous');
|
||||
img.src = url;
|
||||
img.onload = () => {
|
||||
resolve(img);
|
||||
};
|
||||
});
|
||||
|
||||
const uploadFile = useCallback((file: File) => {
|
||||
setState(prev => ({ ...prev, loading: true }));
|
||||
const reader = new FileReader();
|
||||
reader.onload = () => {
|
||||
toImage(reader.result as string).then(predict);
|
||||
setState(prev => ({
|
||||
...prev,
|
||||
fileList: [{ uid: 1, name: file.name, status: 'done', url: reader.result }],
|
||||
}));
|
||||
};
|
||||
reader.readAsDataURL(file);
|
||||
}, []);
|
||||
|
||||
const onPaste = useCallback((event: ClipboardEvent) => {
|
||||
const items = event.clipboardData && event.clipboardData.items;
|
||||
let file = null;
|
||||
if (items && items.length) {
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
if (items[i].type.includes('image')) {
|
||||
file = items[i].getAsFile();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (file) {
|
||||
uploadFile(file);
|
||||
}
|
||||
}, []);
|
||||
const toggleModal = useCallback(() => {
|
||||
setState(prev => ({
|
||||
...prev,
|
||||
modalOpen: !prev.modalOpen,
|
||||
popoverVisible: false,
|
||||
fileList: [],
|
||||
icons: [],
|
||||
}));
|
||||
if (!localStorage.getItem('disableIconTip')) {
|
||||
localStorage.setItem('disableIconTip', 'true');
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const script = document.createElement('script');
|
||||
script.onload = async () => {
|
||||
await window.antdIconClassifier.load();
|
||||
setState(prev => ({ ...prev, modelLoaded: true }));
|
||||
document.addEventListener('paste', onPaste);
|
||||
};
|
||||
script.src = 'https://cdn.jsdelivr.net/gh/lewis617/antd-icon-classifier@0.0/dist/main.js';
|
||||
document.head.appendChild(script);
|
||||
setState(prev => ({ ...prev, popoverVisible: !localStorage.getItem('disableIconTip') }));
|
||||
return () => {
|
||||
document.removeEventListener('paste', onPaste);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className="iconPicSearcher">
|
||||
<Popover
|
||||
open={state.popoverVisible}
|
||||
>
|
||||
<AntdIcons.CameraOutlined className="icon-pic-btn" onClick={toggleModal} />
|
||||
</Popover>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default PicSearcher;
|
||||
223
src/components/IconSelector/fields.ts
Normal file
223
src/components/IconSelector/fields.ts
Normal file
@@ -0,0 +1,223 @@
|
||||
import * as AntdIcons from '@ant-design/icons/lib/icons';
|
||||
|
||||
const all = Object.keys(AntdIcons)
|
||||
.map(n => n.replace(/(Outlined|Filled|TwoTone)$/, ''))
|
||||
.filter((n, i, arr) => arr.indexOf(n) === i);
|
||||
|
||||
const direction = [
|
||||
'StepBackward',
|
||||
'StepForward',
|
||||
'FastBackward',
|
||||
'FastForward',
|
||||
'Shrink',
|
||||
'ArrowsAlt',
|
||||
'Down',
|
||||
'Up',
|
||||
'Left',
|
||||
'Right',
|
||||
'CaretUp',
|
||||
'CaretDown',
|
||||
'CaretLeft',
|
||||
'CaretRight',
|
||||
'UpCircle',
|
||||
'DownCircle',
|
||||
'LeftCircle',
|
||||
'RightCircle',
|
||||
'DoubleRight',
|
||||
'DoubleLeft',
|
||||
'VerticalLeft',
|
||||
'VerticalRight',
|
||||
'VerticalAlignTop',
|
||||
'VerticalAlignMiddle',
|
||||
'VerticalAlignBottom',
|
||||
'Forward',
|
||||
'Backward',
|
||||
'Rollback',
|
||||
'Enter',
|
||||
'Retweet',
|
||||
'Swap',
|
||||
'SwapLeft',
|
||||
'SwapRight',
|
||||
'ArrowUp',
|
||||
'ArrowDown',
|
||||
'ArrowLeft',
|
||||
'ArrowRight',
|
||||
'PlayCircle',
|
||||
'UpSquare',
|
||||
'DownSquare',
|
||||
'LeftSquare',
|
||||
'RightSquare',
|
||||
'Login',
|
||||
'Logout',
|
||||
'MenuFold',
|
||||
'MenuUnfold',
|
||||
'BorderBottom',
|
||||
'BorderHorizontal',
|
||||
'BorderInner',
|
||||
'BorderOuter',
|
||||
'BorderLeft',
|
||||
'BorderRight',
|
||||
'BorderTop',
|
||||
'BorderVerticle',
|
||||
'PicCenter',
|
||||
'PicLeft',
|
||||
'PicRight',
|
||||
'RadiusBottomleft',
|
||||
'RadiusBottomright',
|
||||
'RadiusUpleft',
|
||||
'RadiusUpright',
|
||||
'Fullscreen',
|
||||
'FullscreenExit',
|
||||
];
|
||||
|
||||
const suggestion = [
|
||||
'Question',
|
||||
'QuestionCircle',
|
||||
'Plus',
|
||||
'PlusCircle',
|
||||
'Pause',
|
||||
'PauseCircle',
|
||||
'Minus',
|
||||
'MinusCircle',
|
||||
'PlusSquare',
|
||||
'MinusSquare',
|
||||
'Info',
|
||||
'InfoCircle',
|
||||
'Exclamation',
|
||||
'ExclamationCircle',
|
||||
'Close',
|
||||
'CloseCircle',
|
||||
'CloseSquare',
|
||||
'Check',
|
||||
'CheckCircle',
|
||||
'CheckSquare',
|
||||
'ClockCircle',
|
||||
'Warning',
|
||||
'IssuesClose',
|
||||
'Stop',
|
||||
];
|
||||
|
||||
const editor = [
|
||||
'Edit',
|
||||
'Form',
|
||||
'Copy',
|
||||
'Scissor',
|
||||
'Delete',
|
||||
'Snippets',
|
||||
'Diff',
|
||||
'Highlight',
|
||||
'AlignCenter',
|
||||
'AlignLeft',
|
||||
'AlignRight',
|
||||
'BgColors',
|
||||
'Bold',
|
||||
'Italic',
|
||||
'Underline',
|
||||
'Strikethrough',
|
||||
'Redo',
|
||||
'Undo',
|
||||
'ZoomIn',
|
||||
'ZoomOut',
|
||||
'FontColors',
|
||||
'FontSize',
|
||||
'LineHeight',
|
||||
'Dash',
|
||||
'SmallDash',
|
||||
'SortAscending',
|
||||
'SortDescending',
|
||||
'Drag',
|
||||
'OrderedList',
|
||||
'UnorderedList',
|
||||
'RadiusSetting',
|
||||
'ColumnWidth',
|
||||
'ColumnHeight',
|
||||
];
|
||||
|
||||
const data = [
|
||||
'AreaChart',
|
||||
'PieChart',
|
||||
'BarChart',
|
||||
'DotChart',
|
||||
'LineChart',
|
||||
'RadarChart',
|
||||
'HeatMap',
|
||||
'Fall',
|
||||
'Rise',
|
||||
'Stock',
|
||||
'BoxPlot',
|
||||
'Fund',
|
||||
'Sliders',
|
||||
];
|
||||
|
||||
const logo = [
|
||||
'Android',
|
||||
'Apple',
|
||||
'Windows',
|
||||
'Ie',
|
||||
'Chrome',
|
||||
'Github',
|
||||
'Aliwangwang',
|
||||
'Dingding',
|
||||
'WeiboSquare',
|
||||
'WeiboCircle',
|
||||
'TaobaoCircle',
|
||||
'Html5',
|
||||
'Weibo',
|
||||
'Twitter',
|
||||
'Wechat',
|
||||
'Youtube',
|
||||
'AlipayCircle',
|
||||
'Taobao',
|
||||
'Skype',
|
||||
'Qq',
|
||||
'MediumWorkmark',
|
||||
'Gitlab',
|
||||
'Medium',
|
||||
'Linkedin',
|
||||
'GooglePlus',
|
||||
'Dropbox',
|
||||
'Facebook',
|
||||
'Codepen',
|
||||
'CodeSandbox',
|
||||
'CodeSandboxCircle',
|
||||
'Amazon',
|
||||
'Google',
|
||||
'CodepenCircle',
|
||||
'Alipay',
|
||||
'AntDesign',
|
||||
'AntCloud',
|
||||
'Aliyun',
|
||||
'Zhihu',
|
||||
'Slack',
|
||||
'SlackSquare',
|
||||
'Behance',
|
||||
'BehanceSquare',
|
||||
'Dribbble',
|
||||
'DribbbleSquare',
|
||||
'Instagram',
|
||||
'Yuque',
|
||||
'Alibaba',
|
||||
'Yahoo',
|
||||
'Reddit',
|
||||
'Sketch',
|
||||
'WhatsApp',
|
||||
'Dingtalk',
|
||||
];
|
||||
|
||||
const datum = [...direction, ...suggestion, ...editor, ...data, ...logo];
|
||||
|
||||
const other = all.filter(n => !datum.includes(n));
|
||||
|
||||
export const categories = {
|
||||
direction,
|
||||
suggestion,
|
||||
editor,
|
||||
data,
|
||||
logo,
|
||||
other,
|
||||
};
|
||||
|
||||
export default categories;
|
||||
|
||||
export type Categories = typeof categories;
|
||||
export type CategoriesKeys = keyof Categories;
|
||||
142
src/components/IconSelector/index.tsx
Normal file
142
src/components/IconSelector/index.tsx
Normal file
@@ -0,0 +1,142 @@
|
||||
import * as React from 'react';
|
||||
import Icon, * as AntdIcons from '@ant-design/icons';
|
||||
import { Radio, Input, Empty } from 'antd';
|
||||
import type { RadioChangeEvent } from 'antd/es/radio/interface';
|
||||
import debounce from 'lodash/debounce';
|
||||
import Category from './Category';
|
||||
import IconPicSearcher from './IconPicSearcher';
|
||||
import { FilledIcon, OutlinedIcon, TwoToneIcon } from './themeIcons';
|
||||
import type { CategoriesKeys } from './fields';
|
||||
import { categories } from './fields';
|
||||
// import { useIntl } from '@umijs/max';
|
||||
|
||||
export enum ThemeType {
|
||||
Filled = 'Filled',
|
||||
Outlined = 'Outlined',
|
||||
TwoTone = 'TwoTone',
|
||||
}
|
||||
|
||||
const allIcons: { [key: string]: any } = AntdIcons;
|
||||
|
||||
interface IconSelectorProps {
|
||||
//intl: any;
|
||||
onSelect: any;
|
||||
}
|
||||
|
||||
interface IconSelectorState {
|
||||
theme: ThemeType;
|
||||
searchKey: string;
|
||||
}
|
||||
|
||||
const IconSelector: React.FC<IconSelectorProps> = (props) => {
|
||||
// const intl = useIntl();
|
||||
// const { messages } = intl;
|
||||
const { onSelect } = props;
|
||||
const [displayState, setDisplayState] = React.useState<IconSelectorState>({
|
||||
theme: ThemeType.Outlined,
|
||||
searchKey: '',
|
||||
});
|
||||
|
||||
const newIconNames: string[] = [];
|
||||
|
||||
const handleSearchIcon = React.useCallback(
|
||||
debounce((searchKey: string) => {
|
||||
setDisplayState(prevState => ({ ...prevState, searchKey }));
|
||||
}),
|
||||
[],
|
||||
);
|
||||
|
||||
const handleChangeTheme = React.useCallback((e: RadioChangeEvent) => {
|
||||
setDisplayState(prevState => ({ ...prevState, theme: e.target.value as ThemeType }));
|
||||
}, []);
|
||||
|
||||
const renderCategories = React.useMemo<React.ReactNode | React.ReactNode[]>(() => {
|
||||
const { searchKey = '', theme } = displayState;
|
||||
|
||||
const categoriesResult = Object.keys(categories)
|
||||
.map((key: CategoriesKeys) => {
|
||||
let iconList = categories[key];
|
||||
if (searchKey) {
|
||||
const matchKey = searchKey
|
||||
// eslint-disable-next-line prefer-regex-literals
|
||||
.replace(new RegExp(`^<([a-zA-Z]*)\\s/>$`, 'gi'), (_, name) => name)
|
||||
.replace(/(Filled|Outlined|TwoTone)$/, '')
|
||||
.toLowerCase();
|
||||
iconList = iconList.filter((iconName:string) => iconName.toLowerCase().includes(matchKey));
|
||||
}
|
||||
|
||||
// CopyrightCircle is same as Copyright, don't show it
|
||||
iconList = iconList.filter((icon:string) => icon !== 'CopyrightCircle');
|
||||
|
||||
return {
|
||||
category: key,
|
||||
icons: iconList.map((iconName:string) => iconName + theme).filter((iconName:string) => allIcons[iconName]),
|
||||
};
|
||||
})
|
||||
.filter(({ icons }) => !!icons.length)
|
||||
.map(({ category, icons }) => (
|
||||
<Category
|
||||
key={category}
|
||||
title={category as CategoriesKeys}
|
||||
theme={theme}
|
||||
icons={icons}
|
||||
newIcons={newIconNames}
|
||||
onSelect={(type, name) => {
|
||||
if (onSelect) {
|
||||
onSelect(name, allIcons[name]);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
));
|
||||
return categoriesResult.length === 0 ? <Empty style={{ margin: '2em 0' }} /> : categoriesResult;
|
||||
}, [displayState.searchKey, displayState.theme]);
|
||||
return (
|
||||
<>
|
||||
<div style={{ display: 'flex', justifyContent: 'space-between' }}>
|
||||
<Radio.Group
|
||||
value={displayState.theme}
|
||||
onChange={handleChangeTheme}
|
||||
size="large"
|
||||
optionType="button"
|
||||
buttonStyle="solid"
|
||||
options={[
|
||||
{
|
||||
label: <Icon component={OutlinedIcon} />,
|
||||
value: ThemeType.Outlined
|
||||
},
|
||||
{
|
||||
label: <Icon component={FilledIcon} />,
|
||||
value: ThemeType.Filled
|
||||
},
|
||||
{
|
||||
label: <Icon component={TwoToneIcon} />,
|
||||
value: ThemeType.TwoTone
|
||||
},
|
||||
]}
|
||||
>
|
||||
{/* <Radio.Button value={ThemeType.Outlined}>
|
||||
<Icon component={OutlinedIcon} /> {messages['app.docs.components.icon.outlined']}
|
||||
</Radio.Button>
|
||||
<Radio.Button value={ThemeType.Filled}>
|
||||
<Icon component={FilledIcon} /> {messages['app.docs.components.icon.filled']}
|
||||
</Radio.Button>
|
||||
<Radio.Button value={ThemeType.TwoTone}>
|
||||
<Icon component={TwoToneIcon} /> {messages['app.docs.components.icon.two-tone']}
|
||||
</Radio.Button> */}
|
||||
</Radio.Group>
|
||||
<Input.Search
|
||||
// placeholder={messages['app.docs.components.icon.search.placeholder']}
|
||||
style={{ margin: '0 10px', flex: 1 }}
|
||||
allowClear
|
||||
onChange={e => handleSearchIcon(e.currentTarget.value)}
|
||||
size="large"
|
||||
autoFocus
|
||||
suffix={<IconPicSearcher />}
|
||||
/>
|
||||
</div>
|
||||
{renderCategories}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default IconSelector
|
||||
137
src/components/IconSelector/style.less
Normal file
137
src/components/IconSelector/style.less
Normal file
@@ -0,0 +1,137 @@
|
||||
.iconPicSearcher {
|
||||
display: inline-block;
|
||||
margin: 0 8px;
|
||||
|
||||
.icon-pic-btn {
|
||||
color: @text-color-secondary;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
|
||||
&:hover {
|
||||
color: @input-icon-hover-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.icon-pic-preview {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin-top: 10px;
|
||||
padding: 8px;
|
||||
text-align: center;
|
||||
border: 1px solid @border-color-base;
|
||||
border-radius: 4px;
|
||||
|
||||
> img {
|
||||
max-width: 50px;
|
||||
max-height: 50px;
|
||||
}
|
||||
}
|
||||
|
||||
.icon-pic-search-result {
|
||||
min-height: 50px;
|
||||
padding: 0 10px;
|
||||
|
||||
> .result-tip {
|
||||
padding: 10px 0;
|
||||
color: @text-color-secondary;
|
||||
}
|
||||
|
||||
> table {
|
||||
width: 100%;
|
||||
|
||||
.col-icon {
|
||||
width: 80px;
|
||||
padding: 10px 0;
|
||||
|
||||
> .anticon {
|
||||
font-size: 30px;
|
||||
|
||||
:hover {
|
||||
color: @link-hover-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ul.anticonsList {
|
||||
margin: 2px 0;
|
||||
overflow: hidden;
|
||||
direction: ltr;
|
||||
list-style: none;
|
||||
|
||||
li {
|
||||
position: relative;
|
||||
float: left;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
margin: 3px 0;
|
||||
padding: 2px 0 0;
|
||||
overflow: hidden;
|
||||
color: #555;
|
||||
text-align: center;
|
||||
list-style: none;
|
||||
background-color: inherit;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: color 0.3s ease-in-out, background-color 0.3s ease-in-out;
|
||||
|
||||
.rtl & {
|
||||
margin: 3px 0;
|
||||
padding: 2px 0 0;
|
||||
}
|
||||
|
||||
.anticon {
|
||||
margin: 4px 0 2px;
|
||||
font-size: 24px;
|
||||
transition: transform 0.3s ease-in-out;
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
.anticonClass {
|
||||
display: block;
|
||||
font-family: 'Lucida Console', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
transform: scale(0.83);
|
||||
|
||||
.ant-badge {
|
||||
transition: color 0.3s ease-in-out;
|
||||
}
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: #fff;
|
||||
background-color: @primary-color;
|
||||
|
||||
.anticon {
|
||||
transform: scale(1.4);
|
||||
}
|
||||
|
||||
.ant-badge {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
&.TwoTone:hover {
|
||||
background-color: #8ecafe;
|
||||
}
|
||||
|
||||
&.copied:hover {
|
||||
color: rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
&.copied::after {
|
||||
top: -2px;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.copied-code {
|
||||
padding: 2px 4px;
|
||||
font-size: 12px;
|
||||
background: #f5f5f5;
|
||||
border-radius: 2px;
|
||||
}
|
||||
41
src/components/IconSelector/themeIcons.tsx
Normal file
41
src/components/IconSelector/themeIcons.tsx
Normal file
@@ -0,0 +1,41 @@
|
||||
import * as React from 'react';
|
||||
|
||||
|
||||
export const FilledIcon: React.FC = props => {
|
||||
const path =
|
||||
'M864 64H160C107 64 64 107 64 160v' +
|
||||
'704c0 53 43 96 96 96h704c53 0 96-43 96-96V16' +
|
||||
'0c0-53-43-96-96-96z';
|
||||
return (
|
||||
<svg {...props} viewBox="0 0 1024 1024">
|
||||
<path d={path} />
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export const OutlinedIcon: React.FC = props => {
|
||||
const path =
|
||||
'M864 64H160C107 64 64 107 64 160v7' +
|
||||
'04c0 53 43 96 96 96h704c53 0 96-43 96-96V160c' +
|
||||
'0-53-43-96-96-96z m-12 800H172c-6.6 0-12-5.4-' +
|
||||
'12-12V172c0-6.6 5.4-12 12-12h680c6.6 0 12 5.4' +
|
||||
' 12 12v680c0 6.6-5.4 12-12 12z';
|
||||
return (
|
||||
<svg {...props} viewBox="0 0 1024 1024">
|
||||
<path d={path} />
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export const TwoToneIcon: React.FC = props => {
|
||||
const path =
|
||||
'M16 512c0 273.932 222.066 496 496 49' +
|
||||
'6s496-222.068 496-496S785.932 16 512 16 16 238.' +
|
||||
'066 16 512z m496 368V144c203.41 0 368 164.622 3' +
|
||||
'68 368 0 203.41-164.622 368-368 368z';
|
||||
return (
|
||||
<svg {...props} viewBox="0 0 1024 1024">
|
||||
<path d={path} />
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
196
src/components/QQMap/index copy.js
Normal file
196
src/components/QQMap/index copy.js
Normal file
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
* @Note:
|
||||
* @Author: 2058827620@qq.com
|
||||
* @Date: 2022-04-03 10:53:25
|
||||
*/
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { useModel } from 'umi';
|
||||
import {
|
||||
Modal,
|
||||
Space,
|
||||
Button,
|
||||
Select,
|
||||
Input
|
||||
} from 'antd';
|
||||
|
||||
import {
|
||||
ProFormText,
|
||||
ProFormTextArea
|
||||
} from '@ant-design/pro-components';
|
||||
|
||||
|
||||
|
||||
// const { wemapSuggestion, wemapGeocoder } = services.WemapController;
|
||||
let geocoder, map, marker = null;
|
||||
|
||||
export const QQMap = ({ ...restProps }) => {
|
||||
|
||||
const { onChange, value } = restProps;
|
||||
|
||||
|
||||
const [option, setOption] = useState([]);
|
||||
|
||||
const [location, setLocation] = useState(value);
|
||||
|
||||
const [modalOpenState, setModalOpenState] = useState(false);
|
||||
const [sign, setSign] = useState(false);
|
||||
|
||||
|
||||
const inputChange = (data) => {
|
||||
onChange(data);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
//初始化地图
|
||||
if (sign) {
|
||||
console.log(123456);
|
||||
|
||||
|
||||
map = new TMap.Map('container', {
|
||||
center: new TMap.LatLng(34.789049, 113.684792), //设置地图中心点坐标
|
||||
});
|
||||
|
||||
marker = new TMap.MultiMarker({
|
||||
map: map, //指定点标记图层所覆盖的地图容器
|
||||
// 设置点标记数据
|
||||
geometries: [{
|
||||
id: 'this',//指定点标记id
|
||||
position: new TMap.LatLng(34.789049, 113.684792)// 标记位置(经度,纬度,高度)
|
||||
}
|
||||
],
|
||||
});
|
||||
|
||||
map?.on("click", function (evt) {
|
||||
const lat = evt.latLng.getLat().toFixed(6);
|
||||
const lng = evt.latLng.getLng().toFixed(6);
|
||||
marker.remove('this');
|
||||
marker.add({
|
||||
id: 'this',//指定点标记id
|
||||
position: new TMap.LatLng(lat, lng)
|
||||
});
|
||||
|
||||
|
||||
setLocation({
|
||||
stationLat: lat,
|
||||
stationLon: lng
|
||||
})
|
||||
console.log(`${lat},${lng}`);
|
||||
// getWemapGeocoder(`${lat},${lng}`);
|
||||
});
|
||||
// wemapGeocoder({
|
||||
// location: '34.789049,113.684792'
|
||||
// }).then(({ data }) => {
|
||||
|
||||
// setLocation(data);
|
||||
// });
|
||||
}
|
||||
}, [sign]);
|
||||
|
||||
|
||||
const search = (value) => {
|
||||
// wemapSuggestion({
|
||||
// keyword: value
|
||||
// }).then(({ data }) => {
|
||||
// const arr = [];
|
||||
// data?.map((item) => {
|
||||
// item.fullname = `${item.title} ${item.address}`;
|
||||
// arr.push(item);
|
||||
// });
|
||||
// setOption(arr);
|
||||
// });
|
||||
|
||||
}
|
||||
|
||||
|
||||
const getWemapGeocoder = async (location) => {
|
||||
const { success, data } = await wemapGeocoder({
|
||||
location: location
|
||||
});
|
||||
|
||||
setLocation(data);
|
||||
};
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<ProFormText
|
||||
hidden={true}
|
||||
{...restProps.fieldProps}
|
||||
/>
|
||||
<Space.Compact style={{ width: "100%" }}>
|
||||
<Input
|
||||
disabled
|
||||
style={{ width: "100%" }}
|
||||
hidden={false}
|
||||
value={location?.stationLat ? `${location?.stationLat},${location?.stationLon}` : ''}
|
||||
placeholder={restProps.placeholder}
|
||||
/>
|
||||
<Button onClick={() => {
|
||||
setSign(true);
|
||||
setModalOpenState(true);
|
||||
}}>地图选点</Button>
|
||||
</Space.Compact>
|
||||
<Modal width="800px" title="地图选点" open={modalOpenState} onOk={() => {
|
||||
inputChange(location);
|
||||
setModalOpenState(false);
|
||||
}} onCancel={() => {
|
||||
setModalOpenState(false)
|
||||
}}>
|
||||
<>
|
||||
<div
|
||||
className={`text-red-500`}
|
||||
style={{
|
||||
position: "absolute",
|
||||
backgroundColor: "#ffffff",
|
||||
color: "#222222",
|
||||
top: "100px",
|
||||
left: "30px",
|
||||
zIndex: "10000",
|
||||
padding: "10px"
|
||||
}}
|
||||
>
|
||||
<div>坐标:{location?.stationLat ? `${location?.stationLat},${location?.stationLon}` : ''}</div>
|
||||
</div>
|
||||
<div>
|
||||
<Space.Compact style={{ width: "100%" }}>
|
||||
{/* <Select
|
||||
placeholder="请输入地点"
|
||||
showSearch
|
||||
style={{ width: "100%" }}
|
||||
filterOption={false}
|
||||
onSearch={
|
||||
(e) => {
|
||||
if (!e) {
|
||||
return;
|
||||
}
|
||||
search(e);
|
||||
}
|
||||
}
|
||||
fieldNames={{
|
||||
label: "fullname",
|
||||
value: "id"
|
||||
}}
|
||||
options={option}
|
||||
onSelect={(e, option) => {
|
||||
map.setCenter(new TMap.LatLng(option?.location?.lat, option?.location?.lng));
|
||||
marker.remove('this');
|
||||
marker.add({
|
||||
id: 'this',//指定点标记id
|
||||
position: new TMap.LatLng(option?.location?.lat, option?.location?.lng)
|
||||
});
|
||||
getWemapGeocoder(`${option?.location?.lat},${option?.location?.lng}`);
|
||||
}}
|
||||
/> */}
|
||||
|
||||
</Space.Compact>
|
||||
</div>
|
||||
<div id="container">
|
||||
|
||||
</div>
|
||||
</>
|
||||
</Modal >
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default QQMap;
|
||||
197
src/components/QQMap/index.js
Normal file
197
src/components/QQMap/index.js
Normal file
@@ -0,0 +1,197 @@
|
||||
/*
|
||||
* @Note:
|
||||
* @Author: 2058827620@qq.com
|
||||
* @Date: 2022-04-03 10:53:25
|
||||
*/
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { useModel } from 'umi';
|
||||
import {
|
||||
Modal,
|
||||
Space,
|
||||
Button,
|
||||
Select,
|
||||
Input
|
||||
} from 'antd';
|
||||
|
||||
import {
|
||||
ProFormText,
|
||||
ProFormTextArea
|
||||
} from '@ant-design/pro-components';
|
||||
|
||||
|
||||
|
||||
|
||||
import { wemapSuggestion, wemapGeocoder } from '@/services/config/map.ts';
|
||||
|
||||
// const { wemapSuggestion, wemapGeocoder } = services.WemapController;
|
||||
let geocoder, map, marker = null;
|
||||
|
||||
export const QQMap = ({ ...restProps }) => {
|
||||
|
||||
const { onChange, value } = restProps;
|
||||
|
||||
|
||||
const [option, setOption] = useState([]);
|
||||
|
||||
const [location, setLocation] = useState(value);
|
||||
|
||||
const [modalOpenState, setModalOpenState] = useState(false);
|
||||
const [sign, setSign] = useState(false);
|
||||
|
||||
|
||||
const inputChange = (data) => {
|
||||
onChange(data);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
//初始化地图
|
||||
if (sign && !map) {
|
||||
map = new TMap.Map('container', {
|
||||
center: new TMap.LatLng(34.789049, 113.684792), //设置地图中心点坐标
|
||||
});
|
||||
|
||||
marker = new TMap.MultiMarker({
|
||||
map: map, //指定点标记图层所覆盖的地图容器
|
||||
// 设置点标记数据
|
||||
geometries: [{
|
||||
id: 'this',//指定点标记id
|
||||
position: new TMap.LatLng(34.789049, 113.684792)// 标记位置(经度,纬度,高度)
|
||||
}
|
||||
],
|
||||
});
|
||||
|
||||
map?.on("click", function (evt) {
|
||||
const lat = evt.latLng.getLat().toFixed(6);
|
||||
const lng = evt.latLng.getLng().toFixed(6);
|
||||
|
||||
marker.remove('this');
|
||||
marker.add({
|
||||
id: 'this',//指定点标记id
|
||||
position: new TMap.LatLng(lat, lng)
|
||||
});
|
||||
|
||||
getWemapGeocoder(`${lat},${lng}`);
|
||||
});
|
||||
wemapGeocoder({
|
||||
location: '34.789049,113.684792'
|
||||
}).then(({ data }) => {
|
||||
|
||||
setLocation(data.result.ad_info);
|
||||
});
|
||||
}
|
||||
}, [sign]);
|
||||
|
||||
|
||||
const search = (value) => {
|
||||
wemapSuggestion({
|
||||
keyword: value
|
||||
}).then(({ data }) => {
|
||||
const arr = [];
|
||||
data.data?.map((item) => {
|
||||
item.fullname = `${item.title} ${item.address}`;
|
||||
arr.push(item);
|
||||
});
|
||||
setOption(arr);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
const getWemapGeocoder = async (location) => {
|
||||
const { success, data } = await wemapGeocoder({
|
||||
location: location
|
||||
});
|
||||
|
||||
console.log(data.result.ad_info,'data.result.ad_info');
|
||||
|
||||
setLocation(data.result.ad_info);
|
||||
};
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<ProFormText
|
||||
hidden={true}
|
||||
{...restProps.fieldProps}
|
||||
/>
|
||||
<Space.Compact style={{ width: "100%" }}>
|
||||
<Input
|
||||
disabled
|
||||
style={{ width: "100%" }}
|
||||
hidden={false}
|
||||
value={location?.location ? `${location?.location?.lat},${location?.location?.lng}` : ''}
|
||||
// value={location?.name}
|
||||
placeholder={restProps.placeholder}
|
||||
/>
|
||||
<Button onClick={() => {
|
||||
setSign(true);
|
||||
setModalOpenState(true);
|
||||
}}>地图选点</Button>
|
||||
</Space.Compact>
|
||||
<Modal width="800px" title="地图选点" open={modalOpenState} onOk={() => {
|
||||
inputChange(location);
|
||||
setModalOpenState(false);
|
||||
}} onCancel={() => {
|
||||
setModalOpenState(false)
|
||||
}}>
|
||||
<>
|
||||
<div
|
||||
className={`text-red-500`}
|
||||
style={{
|
||||
position: "absolute",
|
||||
backgroundColor: "#ffffff",
|
||||
color: "#222222",
|
||||
top: "100px",
|
||||
left: "30px",
|
||||
zIndex: "10000",
|
||||
padding: "10px"
|
||||
}}
|
||||
>
|
||||
<div>坐标:{`${location?.location?.lat},${location?.location?.lng}`}</div>
|
||||
<div>地址:{`${location?.name}`}</div>
|
||||
</div>
|
||||
<div>
|
||||
<Space.Compact style={{ width: "100%" }}>
|
||||
<Select
|
||||
placeholder="请输入地点"
|
||||
showSearch
|
||||
style={{ width: "100%" }}
|
||||
filterOption={false}
|
||||
onSearch={
|
||||
(e) => {
|
||||
if (!e) {
|
||||
return;
|
||||
}
|
||||
search(e);
|
||||
}
|
||||
}
|
||||
fieldNames={{
|
||||
label: "fullname",
|
||||
value: "id"
|
||||
}}
|
||||
options={option}
|
||||
onSelect={(e, option) => {
|
||||
map.setCenter(new TMap.LatLng(option?.location?.lat, option?.location?.lng));
|
||||
marker.remove('this');
|
||||
marker.add({
|
||||
id: 'this',//指定点标记id
|
||||
position: new TMap.LatLng(option?.location?.lat, option?.location?.lng)
|
||||
});
|
||||
getWemapGeocoder(`${option?.location?.lat},${option?.location?.lng}`);
|
||||
|
||||
}}
|
||||
/>
|
||||
|
||||
</Space.Compact>
|
||||
</div>
|
||||
<div id="container">
|
||||
|
||||
</div>
|
||||
</>
|
||||
</Modal >
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default QQMap;
|
||||
138
src/components/RightContent/AvatarDropdown.tsx
Normal file
138
src/components/RightContent/AvatarDropdown.tsx
Normal file
@@ -0,0 +1,138 @@
|
||||
import { outLogin } from '@/services/user/index';
|
||||
import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';
|
||||
import { history, useModel } from '@umijs/max';
|
||||
import { Spin } from 'antd';
|
||||
import { createStyles } from 'antd-style';
|
||||
import { stringify } from 'querystring';
|
||||
import React, { useCallback } from 'react';
|
||||
import { flushSync } from 'react-dom';
|
||||
import HeaderDropdown from '../HeaderDropdown';
|
||||
|
||||
export type GlobalHeaderRightProps = {
|
||||
menu?: boolean;
|
||||
children?: React.ReactNode;
|
||||
};
|
||||
|
||||
export const AvatarName = () => {
|
||||
const { initialState } = useModel('@@initialState');
|
||||
const { currentUser } = initialState || {};
|
||||
return <span className="anticon">{currentUser?.username}</span>;
|
||||
};
|
||||
|
||||
const useStyles = createStyles(({ token }) => {
|
||||
return {
|
||||
action: {
|
||||
display: 'flex',
|
||||
height: '48px',
|
||||
marginLeft: 'auto',
|
||||
overflow: 'hidden',
|
||||
alignItems: 'center',
|
||||
padding: '0 8px',
|
||||
cursor: 'pointer',
|
||||
borderRadius: token.borderRadius,
|
||||
'&:hover': {
|
||||
backgroundColor: token.colorBgTextHover,
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu, children }) => {
|
||||
/**
|
||||
* 退出登录,并且将当前的 url 保存
|
||||
*/
|
||||
const loginOut = async () => {
|
||||
await outLogin();
|
||||
const { search, pathname } = window.location;
|
||||
const urlParams = new URL(window.location.href).searchParams;
|
||||
/** 此方法会跳转到 redirect 参数所在的位置 */
|
||||
const redirect = urlParams.get('redirect');
|
||||
// Note: There may be security issues, please note
|
||||
localStorage.removeItem('token')
|
||||
if (window.location.pathname !== '/user/login' && !redirect) {
|
||||
history.replace({
|
||||
pathname: '/user/login',
|
||||
search: stringify({
|
||||
redirect: pathname + search,
|
||||
}),
|
||||
});
|
||||
}
|
||||
};
|
||||
const { styles } = useStyles();
|
||||
|
||||
const { initialState, setInitialState } = useModel('@@initialState');
|
||||
|
||||
const onMenuClick = useCallback(
|
||||
(event: any) => {
|
||||
const { key } = event;
|
||||
if (key === 'logout') {
|
||||
flushSync(() => {
|
||||
setInitialState((s) => ({ ...s, currentUser: undefined }));
|
||||
});
|
||||
loginOut();
|
||||
return;
|
||||
}
|
||||
history.push(`/account/${key}`);
|
||||
},
|
||||
[setInitialState],
|
||||
);
|
||||
|
||||
const loading = (
|
||||
<span className={styles.action}>
|
||||
<Spin
|
||||
size="small"
|
||||
style={{
|
||||
marginLeft: 8,
|
||||
marginRight: 8,
|
||||
}}
|
||||
/>
|
||||
</span>
|
||||
);
|
||||
|
||||
if (!initialState) {
|
||||
return loading;
|
||||
}
|
||||
|
||||
const { currentUser } = initialState;
|
||||
|
||||
if (!currentUser || !currentUser.username) {
|
||||
return loading;
|
||||
}
|
||||
|
||||
const menuItems = [
|
||||
...(menu
|
||||
? [
|
||||
{
|
||||
key: 'center',
|
||||
icon: <UserOutlined />,
|
||||
label: '个人中心',
|
||||
},
|
||||
{
|
||||
key: 'settings',
|
||||
icon: <SettingOutlined />,
|
||||
label: '个人设置',
|
||||
},
|
||||
{
|
||||
type: 'divider' as const,
|
||||
},
|
||||
]
|
||||
: []),
|
||||
{
|
||||
key: 'logout',
|
||||
icon: <LogoutOutlined />,
|
||||
label: '退出登录',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<HeaderDropdown
|
||||
menu={{
|
||||
selectedKeys: [],
|
||||
onClick: onMenuClick,
|
||||
items: menuItems,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</HeaderDropdown>
|
||||
);
|
||||
};
|
||||
24
src/components/RightContent/index.tsx
Normal file
24
src/components/RightContent/index.tsx
Normal file
@@ -0,0 +1,24 @@
|
||||
import { QuestionCircleOutlined } from '@ant-design/icons';
|
||||
import { SelectLang as UmiSelectLang } from '@umijs/max';
|
||||
|
||||
export type SiderTheme = 'light' | 'dark';
|
||||
|
||||
export const SelectLang = () => {
|
||||
return <UmiSelectLang />;
|
||||
};
|
||||
|
||||
export const Question = () => {
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
display: 'flex',
|
||||
height: 26,
|
||||
}}
|
||||
onClick={() => {
|
||||
window.open('https://pro.ant.design/docs/getting-started');
|
||||
}}
|
||||
>
|
||||
<QuestionCircleOutlined />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
16
src/components/index.ts
Normal file
16
src/components/index.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
* 这个文件作为组件的目录
|
||||
* 目的是统一管理对外输出的组件,方便分类
|
||||
*/
|
||||
/**
|
||||
* 布局组件
|
||||
*/
|
||||
import Footer from './Footer';
|
||||
import FilesManager from './FilesManage/index';
|
||||
import { Question, SelectLang } from './RightContent';
|
||||
import { AvatarDropdown, AvatarName } from './RightContent/AvatarDropdown';
|
||||
|
||||
|
||||
|
||||
|
||||
export { Footer, Question, SelectLang, AvatarDropdown, AvatarName, FilesManager };
|
||||
31
src/enums/httpEnum.ts
Normal file
31
src/enums/httpEnum.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* @description: Request result set
|
||||
*/
|
||||
export enum HttpResult {
|
||||
SUCCESS = 200,
|
||||
ERROR = -1,
|
||||
TIMEOUT = 401,
|
||||
TYPE = 'success',
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: request method
|
||||
*/
|
||||
export enum RequestMethod {
|
||||
GET = 'GET',
|
||||
POST = 'POST',
|
||||
PUT = 'PUT',
|
||||
DELETE = 'DELETE',
|
||||
}
|
||||
|
||||
/**
|
||||
* @description: contentType
|
||||
*/
|
||||
export enum ContentType {
|
||||
// json
|
||||
JSON = 'application/json;charset=UTF-8',
|
||||
// form-data qs
|
||||
FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
|
||||
// form-data upload
|
||||
FORM_DATA = 'multipart/form-data;charset=UTF-8',
|
||||
}
|
||||
4
src/enums/pagesEnums.ts
Normal file
4
src/enums/pagesEnums.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
export enum PageEnum {
|
||||
LOGIN = '/user/login'
|
||||
}
|
||||
42
src/global.less
Normal file
42
src/global.less
Normal file
@@ -0,0 +1,42 @@
|
||||
.colorWeak {
|
||||
filter: invert(80%);
|
||||
}
|
||||
|
||||
.ant-layout {
|
||||
min-height: 100vh;
|
||||
}
|
||||
.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed {
|
||||
left: unset;
|
||||
}
|
||||
|
||||
canvas {
|
||||
display: block;
|
||||
}
|
||||
|
||||
body {
|
||||
text-rendering: optimizeLegibility;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
ul,
|
||||
ol {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.ant-table {
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
&-thead > tr,
|
||||
&-tbody > tr {
|
||||
> th,
|
||||
> td {
|
||||
white-space: pre;
|
||||
> span {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
42
src/global.style.ts
Normal file
42
src/global.style.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
import { createStyles } from 'antd-style';
|
||||
|
||||
const useStyles = createStyles(({}) => {
|
||||
return {
|
||||
colorWeak: {
|
||||
filter: 'invert(80%)',
|
||||
},
|
||||
'ant-layout': {
|
||||
minHeight: '100vh',
|
||||
},
|
||||
'ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed': {
|
||||
left: 'unset',
|
||||
},
|
||||
canvas: {
|
||||
display: 'block',
|
||||
},
|
||||
body: {
|
||||
textRendering: 'optimizeLegibility',
|
||||
WebkitFontSmoothing: 'antialiased',
|
||||
MozOsxFontSmoothing: 'grayscale',
|
||||
},
|
||||
'ul,ol': {
|
||||
listStyle: 'none',
|
||||
},
|
||||
'@media(max-width: 768px)': {
|
||||
'ant-table': {
|
||||
width: '100%',
|
||||
overflowX: 'auto',
|
||||
'&-thead > tr, &-tbody > tr': {
|
||||
'> th, > td': {
|
||||
whiteSpace: 'pre',
|
||||
'> span': {
|
||||
display: 'block',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
export default useStyles;
|
||||
91
src/global.tsx
Normal file
91
src/global.tsx
Normal file
@@ -0,0 +1,91 @@
|
||||
import { useIntl } from '@umijs/max';
|
||||
import { Button, message, notification } from 'antd';
|
||||
import defaultSettings from '../config/defaultSettings';
|
||||
|
||||
const { pwa } = defaultSettings;
|
||||
const isHttps = document.location.protocol === 'https:';
|
||||
|
||||
const clearCache = () => {
|
||||
// remove all caches
|
||||
if (window.caches) {
|
||||
caches
|
||||
.keys()
|
||||
.then((keys) => {
|
||||
keys.forEach((key) => {
|
||||
caches.delete(key);
|
||||
});
|
||||
})
|
||||
.catch((e) => console.log(e));
|
||||
}
|
||||
};
|
||||
|
||||
// if pwa is true
|
||||
if (pwa) {
|
||||
// Notify user if offline now
|
||||
window.addEventListener('sw.offline', () => {
|
||||
message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' }));
|
||||
});
|
||||
|
||||
// Pop up a prompt on the page asking the user if they want to use the latest version
|
||||
window.addEventListener('sw.updated', (event: Event) => {
|
||||
const e = event as CustomEvent;
|
||||
const reloadSW = async () => {
|
||||
// Check if there is sw whose state is waiting in ServiceWorkerRegistration
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
|
||||
const worker = e.detail && e.detail.waiting;
|
||||
if (!worker) {
|
||||
return true;
|
||||
}
|
||||
// Send skip-waiting event to waiting SW with MessageChannel
|
||||
await new Promise((resolve, reject) => {
|
||||
const channel = new MessageChannel();
|
||||
channel.port1.onmessage = (msgEvent) => {
|
||||
if (msgEvent.data.error) {
|
||||
reject(msgEvent.data.error);
|
||||
} else {
|
||||
resolve(msgEvent.data);
|
||||
}
|
||||
};
|
||||
worker.postMessage({ type: 'skip-waiting' }, [channel.port2]);
|
||||
});
|
||||
|
||||
clearCache();
|
||||
window.location.reload();
|
||||
return true;
|
||||
};
|
||||
const key = `open${Date.now()}`;
|
||||
const btn = (
|
||||
<Button
|
||||
type="primary"
|
||||
onClick={() => {
|
||||
notification.destroy(key);
|
||||
reloadSW();
|
||||
}}
|
||||
>
|
||||
{useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })}
|
||||
</Button>
|
||||
);
|
||||
notification.open({
|
||||
message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }),
|
||||
description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }),
|
||||
btn,
|
||||
key,
|
||||
onClose: async () => null,
|
||||
});
|
||||
});
|
||||
} else if ('serviceWorker' in navigator && isHttps) {
|
||||
// unregister service worker
|
||||
const { serviceWorker } = navigator;
|
||||
if (serviceWorker.getRegistrations) {
|
||||
serviceWorker.getRegistrations().then((sws) => {
|
||||
sws.forEach((sw) => {
|
||||
sw.unregister();
|
||||
});
|
||||
});
|
||||
}
|
||||
serviceWorker.getRegistration().then((sw) => {
|
||||
if (sw) sw.unregister();
|
||||
});
|
||||
|
||||
clearCache();
|
||||
}
|
||||
25
src/locales/bn-BD.ts
Normal file
25
src/locales/bn-BD.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import component from './bn-BD/component';
|
||||
import globalHeader from './bn-BD/globalHeader';
|
||||
import menu from './bn-BD/menu';
|
||||
import pages from './bn-BD/pages';
|
||||
import pwa from './bn-BD/pwa';
|
||||
import settingDrawer from './bn-BD/settingDrawer';
|
||||
import settings from './bn-BD/settings';
|
||||
|
||||
export default {
|
||||
'navBar.lang': 'ভাষা',
|
||||
'layout.user.link.help': 'সহায়তা',
|
||||
'layout.user.link.privacy': 'গোপনীয়তা',
|
||||
'layout.user.link.terms': 'শর্তাদি',
|
||||
'app.preview.down.block': 'আপনার স্থানীয় প্রকল্পে এই পৃষ্ঠাটি ডাউনলোড করুন',
|
||||
'app.welcome.link.fetch-blocks': 'সমস্ত ব্লক পান',
|
||||
'app.welcome.link.block-list':
|
||||
'`block` ডেভেলপমেন্ট এর উপর ভিত্তি করে দ্রুত স্ট্যান্ডার্ড, পৃষ্ঠাসমূহ তৈরি করুন।',
|
||||
...globalHeader,
|
||||
...menu,
|
||||
...settingDrawer,
|
||||
...settings,
|
||||
...pwa,
|
||||
...component,
|
||||
...pages,
|
||||
};
|
||||
5
src/locales/bn-BD/component.ts
Normal file
5
src/locales/bn-BD/component.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
'component.tagSelect.expand': 'বিস্তৃত',
|
||||
'component.tagSelect.collapse': 'সঙ্কুচিত',
|
||||
'component.tagSelect.all': 'সব',
|
||||
};
|
||||
17
src/locales/bn-BD/globalHeader.ts
Normal file
17
src/locales/bn-BD/globalHeader.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export default {
|
||||
'component.globalHeader.search': 'অনুসন্ধান করুন',
|
||||
'component.globalHeader.search.example1': 'অনুসন্ধান উদাহরণ ১',
|
||||
'component.globalHeader.search.example2': 'অনুসন্ধান উদাহরণ ২',
|
||||
'component.globalHeader.search.example3': 'অনুসন্ধান উদাহরণ ৩',
|
||||
'component.globalHeader.help': 'সহায়তা',
|
||||
'component.globalHeader.notification': 'বিজ্ঞপ্তি',
|
||||
'component.globalHeader.notification.empty': 'আপনি সমস্ত বিজ্ঞপ্তি দেখেছেন।',
|
||||
'component.globalHeader.message': 'বার্তা',
|
||||
'component.globalHeader.message.empty': 'আপনি সমস্ত বার্তা দেখেছেন।',
|
||||
'component.globalHeader.event': 'ঘটনা',
|
||||
'component.globalHeader.event.empty': 'আপনি সমস্ত ইভেন্ট দেখেছেন।',
|
||||
'component.noticeIcon.clear': 'সাফ',
|
||||
'component.noticeIcon.cleared': 'সাফ করা হয়েছে',
|
||||
'component.noticeIcon.empty': 'বিজ্ঞপ্তি নেই',
|
||||
'component.noticeIcon.view-more': 'আরো দেখুন',
|
||||
};
|
||||
52
src/locales/bn-BD/menu.ts
Normal file
52
src/locales/bn-BD/menu.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
export default {
|
||||
'menu.welcome': 'স্বাগতম',
|
||||
'menu.more-blocks': 'আরও ব্লক',
|
||||
'menu.home': 'নীড়',
|
||||
'menu.admin': 'অ্যাডমিন',
|
||||
'menu.admin.sub-page': 'উপ-পৃষ্ঠা',
|
||||
'menu.login': 'প্রবেশ',
|
||||
'menu.register': 'নিবন্ধন',
|
||||
'menu.register-result': 'নিবন্ধনে ফলাফল',
|
||||
'menu.dashboard': 'ড্যাশবোর্ড',
|
||||
'menu.dashboard.analysis': 'বিশ্লেষণ',
|
||||
'menu.dashboard.monitor': 'নিরীক্ষণ',
|
||||
'menu.dashboard.workplace': 'কর্মক্ষেত্র',
|
||||
'menu.exception.403': '403',
|
||||
'menu.exception.404': '404',
|
||||
'menu.exception.500': '500',
|
||||
'menu.form': 'ফর্ম',
|
||||
'menu.form.basic-form': 'বেসিক ফর্ম',
|
||||
'menu.form.step-form': 'পদক্ষেপ ফর্ম',
|
||||
'menu.form.step-form.info': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য লিখুন)',
|
||||
'menu.form.step-form.confirm': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য নিশ্চিত করুন)',
|
||||
'menu.form.step-form.result': 'পদক্ষেপ ফর্ম (সমাপ্ত)',
|
||||
'menu.form.advanced-form': 'উন্নত ফর্ম',
|
||||
'menu.list': 'তালিকা',
|
||||
'menu.list.table-list': 'অনুসন্ধানের টেবিল',
|
||||
'menu.list.basic-list': 'বেসিক তালিকা',
|
||||
'menu.list.card-list': 'কার্ডের তালিকা',
|
||||
'menu.list.search-list': 'অনুসন্ধানের তালিকা',
|
||||
'menu.list.search-list.articles': 'অনুসন্ধানের তালিকা (নিবন্ধসমূহ)',
|
||||
'menu.list.search-list.projects': 'অনুসন্ধানের তালিকা (প্রকল্পগুলি)',
|
||||
'menu.list.search-list.applications': 'অনুসন্ধানের তালিকা (অ্যাপ্লিকেশন)',
|
||||
'menu.profile': 'প্রোফাইল',
|
||||
'menu.profile.basic': 'বেসিক প্রোফাইল',
|
||||
'menu.profile.advanced': 'উন্নত প্রোফাইল',
|
||||
'menu.result': 'ফলাফল',
|
||||
'menu.result.success': 'সাফল্য',
|
||||
'menu.result.fail': 'ব্যর্থ',
|
||||
'menu.exception': 'ব্যতিক্রম',
|
||||
'menu.exception.not-permission': '403',
|
||||
'menu.exception.not-find': '404',
|
||||
'menu.exception.server-error': '500',
|
||||
'menu.exception.trigger': 'ট্রিগার',
|
||||
'menu.account': 'হিসাব',
|
||||
'menu.account.center': 'অ্যাকাউন্ট কেন্দ্র',
|
||||
'menu.account.settings': 'অ্যাকাউন্ট সেটিংস',
|
||||
'menu.account.trigger': 'ট্রিগার ত্রুটি',
|
||||
'menu.account.logout': 'প্রস্থান',
|
||||
'menu.editor': 'গ্রাফিক সম্পাদক',
|
||||
'menu.editor.flow': 'ফ্লো এডিটর',
|
||||
'menu.editor.mind': 'মাইন্ড এডিটর',
|
||||
'menu.editor.koni': 'কোনি সম্পাদক',
|
||||
};
|
||||
70
src/locales/bn-BD/pages.ts
Normal file
70
src/locales/bn-BD/pages.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
export default {
|
||||
'pages.layouts.userLayout.title':
|
||||
'পিঁপড়া ডিজাইন হচ্ছে সিহু জেলার সবচেয়ে প্রভাবশালী ওয়েব ডিজাইনের স্পেসিফিকেশন',
|
||||
'pages.login.accountLogin.tab': 'অ্যাকাউন্টে লগইন',
|
||||
'pages.login.accountLogin.errorMessage': 'ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড(admin/ant.design)',
|
||||
'pages.login.failure': 'লগইন ব্যর্থ হয়েছে। আবার চেষ্টা করুন!',
|
||||
'pages.login.success': 'সফল লগইন!',
|
||||
'pages.login.username.placeholder': 'ব্যবহারকারীর নাম: admin or user',
|
||||
'pages.login.username.required': 'আপনার ব্যবহারকারীর নাম ইনপুট করুন!',
|
||||
'pages.login.password.placeholder': 'পাসওয়ার্ড: ant.design',
|
||||
'pages.login.password.required': 'আপনার পাসওয়ার্ড ইনপুট করুন!',
|
||||
'pages.login.phoneLogin.tab': 'ফোন লগইন',
|
||||
'pages.login.phoneLogin.errorMessage': 'যাচাইকরণ কোড ত্রুটি',
|
||||
'pages.login.phoneNumber.placeholder': 'ফোন নম্বর',
|
||||
'pages.login.phoneNumber.required': 'আপনার ফোন নম্বর ইনপুট করুন!',
|
||||
'pages.login.phoneNumber.invalid': 'ফোন নম্বরটি সঠিক নয়!',
|
||||
'pages.login.captcha.placeholder': 'যাচাইকরণের কোড',
|
||||
'pages.login.captcha.required': 'দয়া করে ভেরিফিকেশন কোডটি ইনপুট করুন!',
|
||||
'pages.login.phoneLogin.getVerificationCode': 'কোড পান',
|
||||
'pages.getCaptchaSecondText': 'সেকেন্ড',
|
||||
'pages.login.rememberMe': 'আমাকে মনে রাখুন',
|
||||
'pages.login.forgotPassword': 'পাসওয়ার্ড ভুলে গেছেন?',
|
||||
'pages.login.submit': 'প্রবেশ করুন',
|
||||
'pages.login.loginWith': 'লগইন করতে পারেন:',
|
||||
'pages.login.registerAccount': 'অ্যাকাউন্ট নিবন্ধন করুন',
|
||||
'pages.welcome.link': 'স্বাগতম',
|
||||
'pages.welcome.alertMessage': 'দ্রুত এবং শক্তিশালী ভারী শুল্ক উপাদান প্রকাশ করা হয়েছে।',
|
||||
'pages.404.subTitle': 'দুঃখিত, আপনি যে পৃষ্ঠাটি দেখতে চান তা বিদ্যমান নেই।',
|
||||
'pages.404.buttonText': 'প্রধান পাতায় ফিরে যান',
|
||||
'pages.admin.subPage.title': 'এই পৃষ্ঠাটি কেবল অ্যাডমিন দ্বারা দেখা যাবে',
|
||||
'pages.admin.subPage.alertMessage':
|
||||
'UMI UI এখন প্রকাশিত হয়েছে, অভিজ্ঞতা শুরু করতে npm run ui ব্যবহার করতে স্বাগতম।',
|
||||
'pages.searchTable.createForm.newRule': 'নতুন বিধি',
|
||||
'pages.searchTable.updateForm.ruleConfig': 'বিধি কনফিগারেশন',
|
||||
'pages.searchTable.updateForm.basicConfig': 'মৌলিক তথ্য',
|
||||
'pages.searchTable.updateForm.ruleName.nameLabel': 'বিধি নাম',
|
||||
'pages.searchTable.updateForm.ruleName.nameRules': 'বিধির নাম লিখুন!',
|
||||
'pages.searchTable.updateForm.ruleDesc.descLabel': 'বিধির বিবরণ',
|
||||
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'কমপক্ষে পাঁচটি অক্ষর লিখুন',
|
||||
'pages.searchTable.updateForm.ruleDesc.descRules':
|
||||
'কমপক্ষে পাঁচটি অক্ষরের একটি বিধান বিবরণ লিখুন!',
|
||||
'pages.searchTable.updateForm.ruleProps.title': 'বৈশিষ্ট্য কনফিগার করুন',
|
||||
'pages.searchTable.updateForm.object': 'নিরীক্ষণ অবজেক্ট',
|
||||
'pages.searchTable.updateForm.ruleProps.templateLabel': 'বিধি টেম্পলেট',
|
||||
'pages.searchTable.updateForm.ruleProps.typeLabel': 'বিধি প্রকার',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.title': 'সময়সূচী নির্ধারণ করুন',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'শুরুর সময়',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'একটি শুরুর সময় চয়ন করুন!',
|
||||
'pages.searchTable.titleDesc': 'বর্ণনা',
|
||||
'pages.searchTable.ruleName': 'বিধি নাম প্রয়োজন',
|
||||
'pages.searchTable.titleCallNo': 'পরিষেবা কল সংখ্যা',
|
||||
'pages.searchTable.titleStatus': 'অবস্থা',
|
||||
'pages.searchTable.nameStatus.default': 'ডিফল্ট',
|
||||
'pages.searchTable.nameStatus.running': 'চলমান',
|
||||
'pages.searchTable.nameStatus.online': 'অনলাইন',
|
||||
'pages.searchTable.nameStatus.abnormal': 'অস্বাভাবিক',
|
||||
'pages.searchTable.titleUpdatedAt': 'সর্বশেষ নির্ধারিত',
|
||||
'pages.searchTable.exception': 'ব্যতিক্রম জন্য কারণ লিখুন!',
|
||||
'pages.searchTable.titleOption': 'অপশন',
|
||||
'pages.searchTable.config': 'কনফিগারেশন',
|
||||
'pages.searchTable.subscribeAlert': 'সতর্কতা সাবস্ক্রাইব করুন',
|
||||
'pages.searchTable.title': 'ইনকয়েরি ফরম',
|
||||
'pages.searchTable.new': 'নতুন',
|
||||
'pages.searchTable.chosen': 'নির্বাচিত',
|
||||
'pages.searchTable.item': 'আইটেম',
|
||||
'pages.searchTable.totalServiceCalls': 'পরিষেবা কলগুলির মোট সংখ্যা',
|
||||
'pages.searchTable.tenThousand': '000',
|
||||
'pages.searchTable.batchDeletion': 'একসাখে ডিলিট',
|
||||
'pages.searchTable.batchApproval': 'একসাখে অনুমোদন',
|
||||
};
|
||||
7
src/locales/bn-BD/pwa.ts
Normal file
7
src/locales/bn-BD/pwa.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'app.pwa.offline': 'আপনি এখন অফলাইন',
|
||||
'app.pwa.serviceworker.updated': 'নতুন সামগ্রী উপলব্ধ',
|
||||
'app.pwa.serviceworker.updated.hint':
|
||||
'বর্তমান পৃষ্ঠাটি পুনরায় লোড করতে দয়া করে "রিফ্রেশ" বোতাম টিপুন',
|
||||
'app.pwa.serviceworker.updated.ok': 'রিফ্রেশ',
|
||||
};
|
||||
31
src/locales/bn-BD/settingDrawer.ts
Normal file
31
src/locales/bn-BD/settingDrawer.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
export default {
|
||||
'app.setting.pagestyle': 'পৃষ্ঠা স্টাইল সেটিং',
|
||||
'app.setting.pagestyle.dark': 'ডার্ক স্টাইল',
|
||||
'app.setting.pagestyle.light': 'লাইট স্টাইল',
|
||||
'app.setting.content-width': 'সামগ্রীর প্রস্থ',
|
||||
'app.setting.content-width.fixed': 'স্থির',
|
||||
'app.setting.content-width.fluid': 'প্রবাহী',
|
||||
'app.setting.themecolor': 'থিম রঙ',
|
||||
'app.setting.themecolor.dust': 'ডাস্ট রেড',
|
||||
'app.setting.themecolor.volcano': 'আগ্নেয়গিরি',
|
||||
'app.setting.themecolor.sunset': 'সানসেট কমলা',
|
||||
'app.setting.themecolor.cyan': 'সবুজাভ নীল',
|
||||
'app.setting.themecolor.green': 'পোলার সবুজ',
|
||||
'app.setting.themecolor.daybreak': 'দিবস ব্রেক ব্লু (ডিফল্ট)',
|
||||
'app.setting.themecolor.geekblue': 'গিক আঠালো',
|
||||
'app.setting.themecolor.purple': 'গোল্ডেন বেগুনি',
|
||||
'app.setting.navigationmode': 'নেভিগেশন মোড',
|
||||
'app.setting.sidemenu': 'সাইড মেনু লেআউট',
|
||||
'app.setting.topmenu': 'টপ মেনু লেআউট',
|
||||
'app.setting.fixedheader': 'স্থির হেডার',
|
||||
'app.setting.fixedsidebar': 'স্থির সাইডবার',
|
||||
'app.setting.fixedsidebar.hint': 'সাইড মেনু বিন্যাসে কাজ করে',
|
||||
'app.setting.hideheader': 'স্ক্রোল করার সময় হেডার লুকানো',
|
||||
'app.setting.hideheader.hint': 'লুকানো হেডার সক্ষম থাকলে কাজ করে',
|
||||
'app.setting.othersettings': 'অন্যান্য সেটিংস্',
|
||||
'app.setting.weakmode': 'দুর্বল মোড',
|
||||
'app.setting.copy': 'সেটিং কপি করুন',
|
||||
'app.setting.copyinfo': 'সাফল্যের অনুলিপি করুন - প্রতিস্থাপন করুন: src/models/setting.js',
|
||||
'app.setting.production.hint':
|
||||
'কেবল বিকাশের পরিবেশে প্যানেল শো সেট করা হচ্ছে, দয়া করে ম্যানুয়ালি সংশোধন করুন',
|
||||
};
|
||||
59
src/locales/bn-BD/settings.ts
Normal file
59
src/locales/bn-BD/settings.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
export default {
|
||||
'app.settings.menuMap.basic': 'মৌলিক বৈশিষ্ট্যসহ',
|
||||
'app.settings.menuMap.security': 'নিরাপত্তা বিন্যাস',
|
||||
'app.settings.menuMap.binding': 'অ্যাকাউন্ট বাঁধাই',
|
||||
'app.settings.menuMap.notification': 'নতুন বার্তা বিজ্ঞপ্তি',
|
||||
'app.settings.basic.avatar': 'অবতার',
|
||||
'app.settings.basic.change-avatar': 'অবতার পরিবর্তন করুন',
|
||||
'app.settings.basic.email': 'ইমেইল',
|
||||
'app.settings.basic.email-message': 'আপনার ইমেইল ইনপুট করুন!',
|
||||
'app.settings.basic.nickname': 'ডাক নাম',
|
||||
'app.settings.basic.nickname-message': 'আপনার ডাকনামটি ইনপুট করুন!',
|
||||
'app.settings.basic.profile': 'ব্যক্তিগত প্রোফাইল',
|
||||
'app.settings.basic.profile-message': 'আপনার ব্যক্তিগত প্রোফাইল ইনপুট করুন!',
|
||||
'app.settings.basic.profile-placeholder': 'নিজের সাথে সংক্ষিপ্ত পরিচয়',
|
||||
'app.settings.basic.country': 'দেশ/অঞ্চল',
|
||||
'app.settings.basic.country-message': 'আপনার দেশ ইনপুট করুন!',
|
||||
'app.settings.basic.geographic': 'প্রদেশ বা শহর',
|
||||
'app.settings.basic.geographic-message': 'আপনার ভৌগলিক তথ্য ইনপুট করুন!',
|
||||
'app.settings.basic.address': 'রাস্তার ঠিকানা',
|
||||
'app.settings.basic.address-message': 'দয়া করে আপনার ঠিকানা ইনপুট করুন!',
|
||||
'app.settings.basic.phone': 'ফোন নম্বর',
|
||||
'app.settings.basic.phone-message': 'আপনার ফোন ইনপুট করুন!',
|
||||
'app.settings.basic.update': 'তথ্য হালনাগাদ',
|
||||
'app.settings.security.strong': 'শক্তিশালী',
|
||||
'app.settings.security.medium': 'মধ্যম',
|
||||
'app.settings.security.weak': 'দুর্বল',
|
||||
'app.settings.security.password': 'অ্যাকাউন্টের পাসওয়ার্ড',
|
||||
'app.settings.security.password-description': 'বর্তমান পাসওয়ার্ড শক্তি',
|
||||
'app.settings.security.phone': 'সুরক্ষা ফোন',
|
||||
'app.settings.security.phone-description': 'আবদ্ধ ফোন',
|
||||
'app.settings.security.question': 'নিরাপত্তা প্রশ্ন',
|
||||
'app.settings.security.question-description':
|
||||
'সুরক্ষা প্রশ্ন সেট করা নেই, এবং সুরক্ষা নীতি কার্যকরভাবে অ্যাকাউন্ট সুরক্ষা রক্ষা করতে পারে',
|
||||
'app.settings.security.email': 'ব্যাকআপ ইমেইল',
|
||||
'app.settings.security.email-description': 'বাউন্ড ইমেইল',
|
||||
'app.settings.security.mfa': 'MFA ডিভাইস',
|
||||
'app.settings.security.mfa-description':
|
||||
"আনবাউন্ড এমএফএ ডিভাইস, বাঁধাইয়ের পরে, দু'বার নিশ্চিত করা যায়",
|
||||
'app.settings.security.modify': 'পরিবর্তন করুন',
|
||||
'app.settings.security.set': 'সেট',
|
||||
'app.settings.security.bind': 'বাঁধাই',
|
||||
'app.settings.binding.taobao': 'বাঁধাই তাওবাও',
|
||||
'app.settings.binding.taobao-description': 'বর্তমানে আনবাউন্ড তাওবাও অ্যাকাউন্ট',
|
||||
'app.settings.binding.alipay': 'বাইন্ডিং আলিপে',
|
||||
'app.settings.binding.alipay-description': 'বর্তমানে আনবাউন্ড আলিপে অ্যাকাউন্ট',
|
||||
'app.settings.binding.dingding': 'বাঁধাই ডিঙ্গটালক',
|
||||
'app.settings.binding.dingding-description': 'বর্তমানে আনবাউন্ড ডিঙ্গটাল অ্যাকাউন্ট',
|
||||
'app.settings.binding.bind': 'বাঁধাই',
|
||||
'app.settings.notification.password': 'অ্যাকাউন্টের পাসওয়ার্ড',
|
||||
'app.settings.notification.password-description':
|
||||
'অন্যান্য ব্যবহারকারীর বার্তাগুলি স্টেশন চিঠি আকারে জানানো হবে',
|
||||
'app.settings.notification.messages': 'সিস্টেম বার্তা',
|
||||
'app.settings.notification.messages-description':
|
||||
'সিস্টেম বার্তাগুলি স্টেশন চিঠির আকারে জানানো হবে',
|
||||
'app.settings.notification.todo': 'করণীয় বিজ্ঞপ্তি',
|
||||
'app.settings.notification.todo-description': 'করণীয় তালিকাটি স্টেশন থেকে চিঠি আকারে জানানো হবে',
|
||||
'app.settings.open': 'খোলা',
|
||||
'app.settings.close': 'বন্ধ',
|
||||
};
|
||||
24
src/locales/en-US.ts
Normal file
24
src/locales/en-US.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import component from './en-US/component';
|
||||
import globalHeader from './en-US/globalHeader';
|
||||
import menu from './en-US/menu';
|
||||
import pages from './en-US/pages';
|
||||
import pwa from './en-US/pwa';
|
||||
import settingDrawer from './en-US/settingDrawer';
|
||||
import settings from './en-US/settings';
|
||||
|
||||
export default {
|
||||
'navBar.lang': 'Languages',
|
||||
'layout.user.link.help': 'Help',
|
||||
'layout.user.link.privacy': 'Privacy',
|
||||
'layout.user.link.terms': 'Terms',
|
||||
'app.preview.down.block': 'Download this page to your local project',
|
||||
'app.welcome.link.fetch-blocks': 'Get all block',
|
||||
'app.welcome.link.block-list': 'Quickly build standard, pages based on `block` development',
|
||||
...globalHeader,
|
||||
...menu,
|
||||
...settingDrawer,
|
||||
...settings,
|
||||
...pwa,
|
||||
...component,
|
||||
...pages,
|
||||
};
|
||||
5
src/locales/en-US/component.ts
Normal file
5
src/locales/en-US/component.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
'component.tagSelect.expand': 'Expand',
|
||||
'component.tagSelect.collapse': 'Collapse',
|
||||
'component.tagSelect.all': 'All',
|
||||
};
|
||||
17
src/locales/en-US/globalHeader.ts
Normal file
17
src/locales/en-US/globalHeader.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export default {
|
||||
'component.globalHeader.search': 'Search',
|
||||
'component.globalHeader.search.example1': 'Search example 1',
|
||||
'component.globalHeader.search.example2': 'Search example 2',
|
||||
'component.globalHeader.search.example3': 'Search example 3',
|
||||
'component.globalHeader.help': 'Help',
|
||||
'component.globalHeader.notification': 'Notification',
|
||||
'component.globalHeader.notification.empty': 'You have viewed all notifications.',
|
||||
'component.globalHeader.message': 'Message',
|
||||
'component.globalHeader.message.empty': 'You have viewed all messsages.',
|
||||
'component.globalHeader.event': 'Event',
|
||||
'component.globalHeader.event.empty': 'You have viewed all events.',
|
||||
'component.noticeIcon.clear': 'Clear',
|
||||
'component.noticeIcon.cleared': 'Cleared',
|
||||
'component.noticeIcon.empty': 'No notifications',
|
||||
'component.noticeIcon.view-more': 'View more',
|
||||
};
|
||||
52
src/locales/en-US/menu.ts
Normal file
52
src/locales/en-US/menu.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
export default {
|
||||
'menu.welcome': 'Welcome',
|
||||
'menu.more-blocks': 'More Blocks',
|
||||
'menu.home': 'Home',
|
||||
'menu.admin': 'Admin',
|
||||
'menu.admin.sub-page': 'Sub-Page',
|
||||
'menu.login': 'Login',
|
||||
'menu.register': 'Register',
|
||||
'menu.register-result': 'Register Result',
|
||||
'menu.dashboard': 'Dashboard',
|
||||
'menu.dashboard.analysis': 'Analysis',
|
||||
'menu.dashboard.monitor': 'Monitor',
|
||||
'menu.dashboard.workplace': 'Workplace',
|
||||
'menu.exception.403': '403',
|
||||
'menu.exception.404': '404',
|
||||
'menu.exception.500': '500',
|
||||
'menu.form': 'Form',
|
||||
'menu.form.basic-form': 'Basic Form',
|
||||
'menu.form.step-form': 'Step Form',
|
||||
'menu.form.step-form.info': 'Step Form(write transfer information)',
|
||||
'menu.form.step-form.confirm': 'Step Form(confirm transfer information)',
|
||||
'menu.form.step-form.result': 'Step Form(finished)',
|
||||
'menu.form.advanced-form': 'Advanced Form',
|
||||
'menu.list': 'List',
|
||||
'menu.list.table-list': 'Search Table',
|
||||
'menu.list.basic-list': 'Basic List',
|
||||
'menu.list.card-list': 'Card List',
|
||||
'menu.list.search-list': 'Search List',
|
||||
'menu.list.search-list.articles': 'Search List(articles)',
|
||||
'menu.list.search-list.projects': 'Search List(projects)',
|
||||
'menu.list.search-list.applications': 'Search List(applications)',
|
||||
'menu.profile': 'Profile',
|
||||
'menu.profile.basic': 'Basic Profile',
|
||||
'menu.profile.advanced': 'Advanced Profile',
|
||||
'menu.result': 'Result',
|
||||
'menu.result.success': 'Success',
|
||||
'menu.result.fail': 'Fail',
|
||||
'menu.exception': 'Exception',
|
||||
'menu.exception.not-permission': '403',
|
||||
'menu.exception.not-find': '404',
|
||||
'menu.exception.server-error': '500',
|
||||
'menu.exception.trigger': 'Trigger',
|
||||
'menu.account': 'Account',
|
||||
'menu.account.center': 'Account Center',
|
||||
'menu.account.settings': 'Account Settings',
|
||||
'menu.account.trigger': 'Trigger Error',
|
||||
'menu.account.logout': 'Logout',
|
||||
'menu.editor': 'Graphic Editor',
|
||||
'menu.editor.flow': 'Flow Editor',
|
||||
'menu.editor.mind': 'Mind Editor',
|
||||
'menu.editor.koni': 'Koni Editor',
|
||||
};
|
||||
70
src/locales/en-US/pages.ts
Normal file
70
src/locales/en-US/pages.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
export default {
|
||||
'pages.layouts.userLayout.title':
|
||||
'Ant Design is the most influential web design specification in Xihu district',
|
||||
'pages.login.accountLogin.tab': 'Account Login',
|
||||
'pages.login.accountLogin.errorMessage': 'Incorrect username/password(admin/ant.design)',
|
||||
'pages.login.failure': 'Login failed, please try again!',
|
||||
'pages.login.success': 'Login successful!',
|
||||
'pages.login.username.placeholder': 'Username: admin or user',
|
||||
'pages.login.username.required': 'Please input your username!',
|
||||
'pages.login.password.placeholder': 'Password: ant.design',
|
||||
'pages.login.password.required': 'Please input your password!',
|
||||
'pages.login.phoneLogin.tab': 'Phone Login',
|
||||
'pages.login.phoneLogin.errorMessage': 'Verification Code Error',
|
||||
'pages.login.phoneNumber.placeholder': 'Phone Number',
|
||||
'pages.login.phoneNumber.required': 'Please input your phone number!',
|
||||
'pages.login.phoneNumber.invalid': 'Phone number is invalid!',
|
||||
'pages.login.captcha.placeholder': 'Verification Code',
|
||||
'pages.login.captcha.required': 'Please input verification code!',
|
||||
'pages.login.phoneLogin.getVerificationCode': 'Get Code',
|
||||
'pages.getCaptchaSecondText': 'sec(s)',
|
||||
'pages.login.rememberMe': 'Remember me',
|
||||
'pages.login.forgotPassword': 'Forgot Password ?',
|
||||
'pages.login.submit': 'Login',
|
||||
'pages.login.loginWith': 'Login with :',
|
||||
'pages.login.registerAccount': 'Register Account',
|
||||
'pages.welcome.link': 'Welcome',
|
||||
'pages.welcome.alertMessage': 'Faster and stronger heavy-duty components have been released.',
|
||||
'pages.404.subTitle': 'Sorry, the page you visited does not exist.',
|
||||
'pages.404.buttonText': 'Back Home',
|
||||
'pages.admin.subPage.title': 'This page can only be viewed by Admin',
|
||||
'pages.admin.subPage.alertMessage':
|
||||
'Umi ui is now released, welcome to use npm run ui to start the experience.',
|
||||
'pages.searchTable.createForm.newRule': 'New Rule',
|
||||
'pages.searchTable.updateForm.ruleConfig': 'Rule configuration',
|
||||
'pages.searchTable.updateForm.basicConfig': 'Basic Information',
|
||||
'pages.searchTable.updateForm.ruleName.nameLabel': 'Rule Name',
|
||||
'pages.searchTable.updateForm.ruleName.nameRules': 'Please enter the rule name!',
|
||||
'pages.searchTable.updateForm.ruleDesc.descLabel': 'Rule Description',
|
||||
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'Please enter at least five characters',
|
||||
'pages.searchTable.updateForm.ruleDesc.descRules':
|
||||
'Please enter a rule description of at least five characters!',
|
||||
'pages.searchTable.updateForm.ruleProps.title': 'Configure Properties',
|
||||
'pages.searchTable.updateForm.object': 'Monitoring Object',
|
||||
'pages.searchTable.updateForm.ruleProps.templateLabel': 'Rule Template',
|
||||
'pages.searchTable.updateForm.ruleProps.typeLabel': 'Rule Type',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.title': 'Set Scheduling Period',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Starting Time',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Please choose a start time!',
|
||||
'pages.searchTable.titleDesc': 'Description',
|
||||
'pages.searchTable.ruleName': 'Rule name is required',
|
||||
'pages.searchTable.titleCallNo': 'Number of Service Calls',
|
||||
'pages.searchTable.titleStatus': 'Status',
|
||||
'pages.searchTable.nameStatus.default': 'default',
|
||||
'pages.searchTable.nameStatus.running': 'running',
|
||||
'pages.searchTable.nameStatus.online': 'online',
|
||||
'pages.searchTable.nameStatus.abnormal': 'abnormal',
|
||||
'pages.searchTable.titleUpdatedAt': 'Last Scheduled at',
|
||||
'pages.searchTable.exception': 'Please enter the reason for the exception!',
|
||||
'pages.searchTable.titleOption': 'Option',
|
||||
'pages.searchTable.config': 'Configuration',
|
||||
'pages.searchTable.subscribeAlert': 'Subscribe to alerts',
|
||||
'pages.searchTable.title': 'Enquiry Form',
|
||||
'pages.searchTable.new': 'New',
|
||||
'pages.searchTable.chosen': 'chosen',
|
||||
'pages.searchTable.item': 'item',
|
||||
'pages.searchTable.totalServiceCalls': 'Total Number of Service Calls',
|
||||
'pages.searchTable.tenThousand': '0000',
|
||||
'pages.searchTable.batchDeletion': 'batch deletion',
|
||||
'pages.searchTable.batchApproval': 'batch approval',
|
||||
};
|
||||
6
src/locales/en-US/pwa.ts
Normal file
6
src/locales/en-US/pwa.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export default {
|
||||
'app.pwa.offline': 'You are offline now',
|
||||
'app.pwa.serviceworker.updated': 'New content is available',
|
||||
'app.pwa.serviceworker.updated.hint': 'Please press the "Refresh" button to reload current page',
|
||||
'app.pwa.serviceworker.updated.ok': 'Refresh',
|
||||
};
|
||||
31
src/locales/en-US/settingDrawer.ts
Normal file
31
src/locales/en-US/settingDrawer.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
export default {
|
||||
'app.setting.pagestyle': 'Page style setting',
|
||||
'app.setting.pagestyle.dark': 'Dark style',
|
||||
'app.setting.pagestyle.light': 'Light style',
|
||||
'app.setting.content-width': 'Content Width',
|
||||
'app.setting.content-width.fixed': 'Fixed',
|
||||
'app.setting.content-width.fluid': 'Fluid',
|
||||
'app.setting.themecolor': 'Theme Color',
|
||||
'app.setting.themecolor.dust': 'Dust Red',
|
||||
'app.setting.themecolor.volcano': 'Volcano',
|
||||
'app.setting.themecolor.sunset': 'Sunset Orange',
|
||||
'app.setting.themecolor.cyan': 'Cyan',
|
||||
'app.setting.themecolor.green': 'Polar Green',
|
||||
'app.setting.themecolor.daybreak': 'Daybreak Blue (default)',
|
||||
'app.setting.themecolor.geekblue': 'Geek Glue',
|
||||
'app.setting.themecolor.purple': 'Golden Purple',
|
||||
'app.setting.navigationmode': 'Navigation Mode',
|
||||
'app.setting.sidemenu': 'Side Menu Layout',
|
||||
'app.setting.topmenu': 'Top Menu Layout',
|
||||
'app.setting.fixedheader': 'Fixed Header',
|
||||
'app.setting.fixedsidebar': 'Fixed Sidebar',
|
||||
'app.setting.fixedsidebar.hint': 'Works on Side Menu Layout',
|
||||
'app.setting.hideheader': 'Hidden Header when scrolling',
|
||||
'app.setting.hideheader.hint': 'Works when Hidden Header is enabled',
|
||||
'app.setting.othersettings': 'Other Settings',
|
||||
'app.setting.weakmode': 'Color Blind Friendly Mode',
|
||||
'app.setting.copy': 'Copy Setting',
|
||||
'app.setting.copyinfo': 'copy success, please replace defaultSettings in src/models/setting.js',
|
||||
'app.setting.production.hint':
|
||||
'Setting panel shows in development environment only, please manually modify',
|
||||
};
|
||||
60
src/locales/en-US/settings.ts
Normal file
60
src/locales/en-US/settings.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
export default {
|
||||
'app.settings.menuMap.basic': 'Basic Settings',
|
||||
'app.settings.menuMap.security': 'Security Settings',
|
||||
'app.settings.menuMap.binding': 'Account Binding',
|
||||
'app.settings.menuMap.notification': 'New Message Notification',
|
||||
'app.settings.basic.avatar': 'Avatar',
|
||||
'app.settings.basic.change-avatar': 'Change avatar',
|
||||
'app.settings.basic.email': 'Email',
|
||||
'app.settings.basic.email-message': 'Please input your email!',
|
||||
'app.settings.basic.nickname': 'Nickname',
|
||||
'app.settings.basic.nickname-message': 'Please input your Nickname!',
|
||||
'app.settings.basic.profile': 'Personal profile',
|
||||
'app.settings.basic.profile-message': 'Please input your personal profile!',
|
||||
'app.settings.basic.profile-placeholder': 'Brief introduction to yourself',
|
||||
'app.settings.basic.country': 'Country/Region',
|
||||
'app.settings.basic.country-message': 'Please input your country!',
|
||||
'app.settings.basic.geographic': 'Province or city',
|
||||
'app.settings.basic.geographic-message': 'Please input your geographic info!',
|
||||
'app.settings.basic.address': 'Street Address',
|
||||
'app.settings.basic.address-message': 'Please input your address!',
|
||||
'app.settings.basic.phone': 'Phone Number',
|
||||
'app.settings.basic.phone-message': 'Please input your phone!',
|
||||
'app.settings.basic.update': 'Update Information',
|
||||
'app.settings.security.strong': 'Strong',
|
||||
'app.settings.security.medium': 'Medium',
|
||||
'app.settings.security.weak': 'Weak',
|
||||
'app.settings.security.password': 'Account Password',
|
||||
'app.settings.security.password-description': 'Current password strength',
|
||||
'app.settings.security.phone': 'Security Phone',
|
||||
'app.settings.security.phone-description': 'Bound phone',
|
||||
'app.settings.security.question': 'Security Question',
|
||||
'app.settings.security.question-description':
|
||||
'The security question is not set, and the security policy can effectively protect the account security',
|
||||
'app.settings.security.email': 'Backup Email',
|
||||
'app.settings.security.email-description': 'Bound Email',
|
||||
'app.settings.security.mfa': 'MFA Device',
|
||||
'app.settings.security.mfa-description':
|
||||
'Unbound MFA device, after binding, can be confirmed twice',
|
||||
'app.settings.security.modify': 'Modify',
|
||||
'app.settings.security.set': 'Set',
|
||||
'app.settings.security.bind': 'Bind',
|
||||
'app.settings.binding.taobao': 'Binding Taobao',
|
||||
'app.settings.binding.taobao-description': 'Currently unbound Taobao account',
|
||||
'app.settings.binding.alipay': 'Binding Alipay',
|
||||
'app.settings.binding.alipay-description': 'Currently unbound Alipay account',
|
||||
'app.settings.binding.dingding': 'Binding DingTalk',
|
||||
'app.settings.binding.dingding-description': 'Currently unbound DingTalk account',
|
||||
'app.settings.binding.bind': 'Bind',
|
||||
'app.settings.notification.password': 'Account Password',
|
||||
'app.settings.notification.password-description':
|
||||
'Messages from other users will be notified in the form of a station letter',
|
||||
'app.settings.notification.messages': 'System Messages',
|
||||
'app.settings.notification.messages-description':
|
||||
'System messages will be notified in the form of a station letter',
|
||||
'app.settings.notification.todo': 'To-do Notification',
|
||||
'app.settings.notification.todo-description':
|
||||
'The to-do list will be notified in the form of a letter from the station',
|
||||
'app.settings.open': 'Open',
|
||||
'app.settings.close': 'Close',
|
||||
};
|
||||
24
src/locales/fa-IR.ts
Normal file
24
src/locales/fa-IR.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import component from './fa-IR/component';
|
||||
import globalHeader from './fa-IR/globalHeader';
|
||||
import menu from './fa-IR/menu';
|
||||
import pages from './fa-IR/pages';
|
||||
import pwa from './fa-IR/pwa';
|
||||
import settingDrawer from './fa-IR/settingDrawer';
|
||||
import settings from './fa-IR/settings';
|
||||
|
||||
export default {
|
||||
'navBar.lang': 'زبان ها ',
|
||||
'layout.user.link.help': 'کمک',
|
||||
'layout.user.link.privacy': 'حریم خصوصی',
|
||||
'layout.user.link.terms': 'مقررات',
|
||||
'app.preview.down.block': 'این صفحه را در پروژه محلی خود بارگیری کنید',
|
||||
'app.welcome.link.fetch-blocks': 'دریافت تمام بلوک',
|
||||
'app.welcome.link.block-list': 'به سرعت صفحات استاندارد مبتنی بر توسعه "بلوک" را بسازید',
|
||||
...globalHeader,
|
||||
...menu,
|
||||
...settingDrawer,
|
||||
...settings,
|
||||
...pwa,
|
||||
...component,
|
||||
...pages,
|
||||
};
|
||||
5
src/locales/fa-IR/component.ts
Normal file
5
src/locales/fa-IR/component.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
'component.tagSelect.expand': 'باز',
|
||||
'component.tagSelect.collapse': 'بسته ',
|
||||
'component.tagSelect.all': 'همه',
|
||||
};
|
||||
17
src/locales/fa-IR/globalHeader.ts
Normal file
17
src/locales/fa-IR/globalHeader.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export default {
|
||||
'component.globalHeader.search': 'جستجو ',
|
||||
'component.globalHeader.search.example1': 'مثال 1 را جستجو کنید',
|
||||
'component.globalHeader.search.example2': 'مثال 2 را جستجو کنید',
|
||||
'component.globalHeader.search.example3': 'مثال 3 را جستجو کنید',
|
||||
'component.globalHeader.help': 'کمک',
|
||||
'component.globalHeader.notification': 'اعلان',
|
||||
'component.globalHeader.notification.empty': 'شما همه اعلان ها را مشاهده کرده اید.',
|
||||
'component.globalHeader.message': 'پیام',
|
||||
'component.globalHeader.message.empty': 'شما همه پیام ها را مشاهده کرده اید.',
|
||||
'component.globalHeader.event': 'رویداد',
|
||||
'component.globalHeader.event.empty': 'شما همه رویدادها را مشاهده کرده اید.',
|
||||
'component.noticeIcon.clear': 'پاک کردن',
|
||||
'component.noticeIcon.cleared': 'پاک شد',
|
||||
'component.noticeIcon.empty': 'بدون اعلان',
|
||||
'component.noticeIcon.view-more': 'نمایش بیشتر',
|
||||
};
|
||||
52
src/locales/fa-IR/menu.ts
Normal file
52
src/locales/fa-IR/menu.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
export default {
|
||||
'menu.welcome': 'خوش آمدید',
|
||||
'menu.more-blocks': 'بلوک های بیشتر',
|
||||
'menu.home': 'خانه',
|
||||
'menu.admin': 'مدیر',
|
||||
'menu.admin.sub-page': 'زیر صفحه',
|
||||
'menu.login': 'ورود',
|
||||
'menu.register': 'ثبت نام',
|
||||
'menu.register-result': 'ثبت نام نتیجه',
|
||||
'menu.dashboard': 'داشبورد',
|
||||
'menu.dashboard.analysis': 'تحلیل و بررسی',
|
||||
'menu.dashboard.monitor': 'نظارت',
|
||||
'menu.dashboard.workplace': 'محل کار',
|
||||
'menu.exception.403': '403',
|
||||
'menu.exception.404': '404',
|
||||
'menu.exception.500': '500',
|
||||
'menu.form': 'فرم',
|
||||
'menu.form.basic-form': 'فرم اساسی',
|
||||
'menu.form.step-form': 'فرم مرحله',
|
||||
'menu.form.step-form.info': 'فرم مرحله (نوشتن اطلاعات انتقال)',
|
||||
'menu.form.step-form.confirm': 'فرم مرحله (تأیید اطلاعات انتقال)',
|
||||
'menu.form.step-form.result': 'فرم مرحله (تمام شده)',
|
||||
'menu.form.advanced-form': 'فرم پیشرفته',
|
||||
'menu.list': 'لیست',
|
||||
'menu.list.table-list': 'جدول جستجو',
|
||||
'menu.list.basic-list': 'لیست اصلی',
|
||||
'menu.list.card-list': 'لیست کارت',
|
||||
'menu.list.search-list': 'لیست جستجو',
|
||||
'menu.list.search-list.articles': 'لیست جستجو (مقالات)',
|
||||
'menu.list.search-list.projects': 'لیست جستجو (پروژه ها)',
|
||||
'menu.list.search-list.applications': 'لیست جستجو (برنامه ها)',
|
||||
'menu.profile': 'مشخصات',
|
||||
'menu.profile.basic': 'مشخصات عمومی',
|
||||
'menu.profile.advanced': 'مشخصات پیشرفته',
|
||||
'menu.result': 'نتیجه',
|
||||
'menu.result.success': 'موفق',
|
||||
'menu.result.fail': 'ناموفق',
|
||||
'menu.exception': 'استثنا',
|
||||
'menu.exception.not-permission': '403',
|
||||
'menu.exception.not-find': '404',
|
||||
'menu.exception.server-error': '500',
|
||||
'menu.exception.trigger': 'راه اندازی',
|
||||
'menu.account': 'حساب',
|
||||
'menu.account.center': 'مرکز حساب',
|
||||
'menu.account.settings': 'تنظیمات حساب',
|
||||
'menu.account.trigger': 'خطای راه اندازی',
|
||||
'menu.account.logout': 'خروج',
|
||||
'menu.editor': 'ویرایشگر گرافیک',
|
||||
'menu.editor.flow': 'ویرایشگر جریان',
|
||||
'menu.editor.mind': 'ویرایشگر ذهن',
|
||||
'menu.editor.koni': 'ویرایشگر Koni',
|
||||
};
|
||||
69
src/locales/fa-IR/pages.ts
Normal file
69
src/locales/fa-IR/pages.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
export default {
|
||||
'pages.layouts.userLayout.title': 'طراحی مورچه تأثیرگذارترین مشخصات طراحی وب در منطقه Xihu است',
|
||||
'pages.login.accountLogin.tab': 'ورود به حساب کاربری',
|
||||
'pages.login.accountLogin.errorMessage': 'نام کاربری / رمزعبور نادرست (مدیر / ant.design)',
|
||||
'pages.login.failure': 'ورود به سیستم با شکست مواجه شد، لطفا دوباره سعی کنید!',
|
||||
'pages.login.success': 'ورود موفق!',
|
||||
'pages.login.username.placeholder': 'نام کاربری: مدیر یا کاربر',
|
||||
'pages.login.username.required': 'لطفا نام کاربری خود را وارد کنید!',
|
||||
'pages.login.password.placeholder': 'رمز عبور: ant.design',
|
||||
'pages.login.password.required': 'لطفاً رمز ورود خود را وارد کنید!',
|
||||
'pages.login.phoneLogin.tab': 'ورود به سیستم تلفن',
|
||||
'pages.login.phoneLogin.errorMessage': 'خطای کد تأیید',
|
||||
'pages.login.phoneNumber.placeholder': 'شماره تلفن',
|
||||
'pages.login.phoneNumber.required': 'لطفاً شماره تلفن خود را وارد کنید!',
|
||||
'pages.login.phoneNumber.invalid': 'شماره تلفن نامعتبر است!',
|
||||
'pages.login.captcha.placeholder': 'کد تایید',
|
||||
'pages.login.captcha.required': 'لطفا کد تأیید را وارد کنید!',
|
||||
'pages.login.phoneLogin.getVerificationCode': 'دریافت کد',
|
||||
'pages.getCaptchaSecondText': 'ثانیه',
|
||||
'pages.login.rememberMe': 'مرا به خاطر بسپار',
|
||||
'pages.login.forgotPassword': 'رمز عبور را فراموش کرده اید ?',
|
||||
'pages.login.submit': 'ارسال',
|
||||
'pages.login.loginWith': 'وارد شوید با :',
|
||||
'pages.login.registerAccount': 'ثبت نام',
|
||||
'pages.welcome.link': 'خوش آمدید',
|
||||
'pages.welcome.alertMessage': 'اجزای سنگین تر سریعتر و قوی تر آزاد شده اند.',
|
||||
'pages.404.subTitle': 'ببخشيد، صفحه اي که ديديد وجود نداره',
|
||||
'pages.404.buttonText': 'بازگشت به صفحه اصلی',
|
||||
'pages.admin.subPage.title': 'این صفحه فقط توسط مدیر قابل مشاهده است',
|
||||
'pages.admin.subPage.alertMessage':
|
||||
'رابط کاربری Umi اکنون منتشر شده است ، برای شروع تجربه استفاده از npm run ui خوش آمدید.',
|
||||
'pages.searchTable.createForm.newRule': 'قانون جدید',
|
||||
'pages.searchTable.updateForm.ruleConfig': 'پیکربندی قانون',
|
||||
'pages.searchTable.updateForm.basicConfig': 'اطلاعات اولیه',
|
||||
'pages.searchTable.updateForm.ruleName.nameLabel': ' نام قانون',
|
||||
'pages.searchTable.updateForm.ruleName.nameRules': 'لطفاً نام قانون را وارد کنید!',
|
||||
'pages.searchTable.updateForm.ruleDesc.descLabel': 'شرح قانون',
|
||||
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'لطفاً حداقل پنج حرف وارد کنید',
|
||||
'pages.searchTable.updateForm.ruleDesc.descRules':
|
||||
'لطفاً حداقل یک قانون حاوی پنج کاراکتر شرح دهید!',
|
||||
'pages.searchTable.updateForm.ruleProps.title': 'پیکربندی خصوصیات',
|
||||
'pages.searchTable.updateForm.object': 'نظارت بر شی',
|
||||
'pages.searchTable.updateForm.ruleProps.templateLabel': 'الگوی قانون',
|
||||
'pages.searchTable.updateForm.ruleProps.typeLabel': 'نوع قانون',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.title': 'تنظیم دوره زمان بندی',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'زمان شروع',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'لطفاً زمان شروع را انتخاب کنید!',
|
||||
'pages.searchTable.titleDesc': 'شرح',
|
||||
'pages.searchTable.ruleName': 'نام قانون لازم است',
|
||||
'pages.searchTable.titleCallNo': 'تعداد تماس های خدماتی',
|
||||
'pages.searchTable.titleStatus': 'وضعیت',
|
||||
'pages.searchTable.nameStatus.default': 'پیش فرض',
|
||||
'pages.searchTable.nameStatus.running': 'در حال دویدن',
|
||||
'pages.searchTable.nameStatus.online': 'برخط',
|
||||
'pages.searchTable.nameStatus.abnormal': 'غیرطبیعی',
|
||||
'pages.searchTable.titleUpdatedAt': 'آخرین برنامه ریزی در',
|
||||
'pages.searchTable.exception': 'لطفا دلیل استثنا را وارد کنید!',
|
||||
'pages.searchTable.titleOption': 'گزینه',
|
||||
'pages.searchTable.config': 'پیکربندی',
|
||||
'pages.searchTable.subscribeAlert': 'مشترک شدن در هشدارها',
|
||||
'pages.searchTable.title': 'فرم درخواست',
|
||||
'pages.searchTable.new': 'جدید',
|
||||
'pages.searchTable.chosen': 'انتخاب شده',
|
||||
'pages.searchTable.item': 'مورد',
|
||||
'pages.searchTable.totalServiceCalls': 'تعداد کل تماس های خدماتی',
|
||||
'pages.searchTable.tenThousand': '0000',
|
||||
'pages.searchTable.batchDeletion': 'حذف دسته ای',
|
||||
'pages.searchTable.batchApproval': 'تصویب دسته ای',
|
||||
};
|
||||
7
src/locales/fa-IR/pwa.ts
Normal file
7
src/locales/fa-IR/pwa.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'app.pwa.offline': 'شما اکنون آفلاین هستید',
|
||||
'app.pwa.serviceworker.updated': 'مطالب جدید در دسترس است',
|
||||
'app.pwa.serviceworker.updated.hint':
|
||||
'لطفاً برای بارگیری مجدد صفحه فعلی ، دکمه "تازه سازی" را فشار دهید',
|
||||
'app.pwa.serviceworker.updated.ok': 'تازه سازی',
|
||||
};
|
||||
32
src/locales/fa-IR/settingDrawer.ts
Normal file
32
src/locales/fa-IR/settingDrawer.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
export default {
|
||||
'app.setting.pagestyle': 'تنظیم نوع صفحه',
|
||||
'app.setting.pagestyle.dark': 'سبک تیره',
|
||||
'app.setting.pagestyle.light': 'سبک سبک',
|
||||
'app.setting.content-width': 'عرض محتوا',
|
||||
'app.setting.content-width.fixed': 'ثابت',
|
||||
'app.setting.content-width.fluid': 'شناور',
|
||||
'app.setting.themecolor': 'رنگ تم',
|
||||
'app.setting.themecolor.dust': 'گرد و غبار قرمز',
|
||||
'app.setting.themecolor.volcano': 'آتشفشان',
|
||||
'app.setting.themecolor.sunset': 'غروب نارنجی',
|
||||
'app.setting.themecolor.cyan': 'فیروزه ای',
|
||||
'app.setting.themecolor.green': 'سبز قطبی',
|
||||
'app.setting.themecolor.daybreak': 'آبی روشن(پیشفرض)',
|
||||
'app.setting.themecolor.geekblue': 'چسب گیک',
|
||||
'app.setting.themecolor.purple': 'بنفش طلایی',
|
||||
'app.setting.navigationmode': 'حالت پیمایش',
|
||||
'app.setting.sidemenu': 'طرح منوی کناری',
|
||||
'app.setting.topmenu': 'طرح منوی بالایی',
|
||||
'app.setting.fixedheader': 'سرصفحه ثابت',
|
||||
'app.setting.fixedsidebar': 'نوار کناری ثابت',
|
||||
'app.setting.fixedsidebar.hint': 'کار بر روی منوی کناری',
|
||||
'app.setting.hideheader': 'هدر پنهان هنگام پیمایش',
|
||||
'app.setting.hideheader.hint': 'وقتی Hidden Header فعال باشد کار می کند',
|
||||
'app.setting.othersettings': 'تنظیمات دیگر',
|
||||
'app.setting.weakmode': 'حالت ضعیف',
|
||||
'app.setting.copy': 'تنظیمات کپی',
|
||||
'app.setting.copyinfo':
|
||||
'موفقیت در کپی کردن , لطفا defaultSettings را در src / models / setting.js جایگزین کنید',
|
||||
'app.setting.production.hint':
|
||||
'صفحه تنظیم فقط در محیط توسعه نمایش داده می شود ، لطفاً دستی تغییر دهید',
|
||||
};
|
||||
60
src/locales/fa-IR/settings.ts
Normal file
60
src/locales/fa-IR/settings.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
export default {
|
||||
'app.settings.menuMap.basic': 'تنظیمات پایه ',
|
||||
'app.settings.menuMap.security': 'تنظیمات امنیتی',
|
||||
'app.settings.menuMap.binding': 'صحافی حساب',
|
||||
'app.settings.menuMap.notification': 'اعلان پیام جدید',
|
||||
'app.settings.basic.avatar': 'آواتار',
|
||||
'app.settings.basic.change-avatar': 'آواتار را تغییر دهید',
|
||||
'app.settings.basic.email': 'ایمیل',
|
||||
'app.settings.basic.email-message': 'لطفا ایمیل خود را وارد کنید!',
|
||||
'app.settings.basic.nickname': 'نام مستعار',
|
||||
'app.settings.basic.nickname-message': 'لطفاً نام مستعار خود را وارد کنید!',
|
||||
'app.settings.basic.profile': 'پروفایل شخصی',
|
||||
'app.settings.basic.profile-message': 'لطفاً مشخصات شخصی خود را وارد کنید!',
|
||||
'app.settings.basic.profile-placeholder': 'معرفی مختصر خودتان',
|
||||
'app.settings.basic.country': 'کشور / منطقه',
|
||||
'app.settings.basic.country-message': 'لطفاً کشور خود را وارد کنید!',
|
||||
'app.settings.basic.geographic': 'استان یا شهر',
|
||||
'app.settings.basic.geographic-message': 'لطفاً اطلاعات جغرافیایی خود را وارد کنید!',
|
||||
'app.settings.basic.address': 'آدرس خیابان',
|
||||
'app.settings.basic.address-message': 'لطفا آدرس خود را وارد کنید!',
|
||||
'app.settings.basic.phone': 'شماره تلفن',
|
||||
'app.settings.basic.phone-message': 'لطفاً تلفن خود را وارد کنید!',
|
||||
'app.settings.basic.update': 'به روز رسانی اطلاعات',
|
||||
'app.settings.security.strong': 'قوی',
|
||||
'app.settings.security.medium': 'متوسط',
|
||||
'app.settings.security.weak': 'ضعیف',
|
||||
'app.settings.security.password': 'رمز عبور حساب کاربری',
|
||||
'app.settings.security.password-description': 'قدرت رمز عبور فعلی',
|
||||
'app.settings.security.phone': 'تلفن امنیتی',
|
||||
'app.settings.security.phone-description': 'تلفن مقید',
|
||||
'app.settings.security.question': 'سوال امنیتی',
|
||||
'app.settings.security.question-description':
|
||||
'سوال امنیتی تنظیم نشده است و سیاست امنیتی می تواند به طور موثر از امنیت حساب محافظت کند',
|
||||
'app.settings.security.email': 'ایمیل پشتیبان',
|
||||
'app.settings.security.email-description': 'ایمیل مقید',
|
||||
'app.settings.security.mfa': 'دستگاه MFA',
|
||||
'app.settings.security.mfa-description':
|
||||
'دستگاه MFA بسته نشده ، پس از اتصال ، می تواند دو بار تأیید شود',
|
||||
'app.settings.security.modify': 'تغییر',
|
||||
'app.settings.security.set': 'تنظیم',
|
||||
'app.settings.security.bind': 'بستن',
|
||||
'app.settings.binding.taobao': 'اتصال Taobao',
|
||||
'app.settings.binding.taobao-description': 'حساب Taobao در حال حاضر بسته نشده است',
|
||||
'app.settings.binding.alipay': 'اتصال Alipay',
|
||||
'app.settings.binding.alipay-description': 'حساب Alipay در حال حاضر بسته نشده است',
|
||||
'app.settings.binding.dingding': 'اتصال DingTalk',
|
||||
'app.settings.binding.dingding-description': 'حساب DingTalk در حال حاضر محدود نشده است',
|
||||
'app.settings.binding.bind': 'بستن',
|
||||
'app.settings.notification.password': 'رمز عبور حساب کاربری',
|
||||
'app.settings.notification.password-description':
|
||||
'پیام های سایر کاربران در قالب یک نامه ایستگاهی اعلام خواهد شد',
|
||||
'app.settings.notification.messages': 'پیام های سیستم',
|
||||
'app.settings.notification.messages-description':
|
||||
'پیام های سیستم به صورت نامه ایستگاه مطلع می شوند',
|
||||
'app.settings.notification.todo': 'اعلان کارها',
|
||||
'app.settings.notification.todo-description':
|
||||
'لیست کارها به صورت نامه ای از ایستگاه اطلاع داده می شود',
|
||||
'app.settings.open': 'باز کن',
|
||||
'app.settings.close': 'بستن',
|
||||
};
|
||||
25
src/locales/id-ID.ts
Normal file
25
src/locales/id-ID.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import component from './id-ID/component';
|
||||
import globalHeader from './id-ID/globalHeader';
|
||||
import menu from './id-ID/menu';
|
||||
import pages from './id-ID/pages';
|
||||
import pwa from './id-ID/pwa';
|
||||
import settingDrawer from './id-ID/settingDrawer';
|
||||
import settings from './id-ID/settings';
|
||||
|
||||
export default {
|
||||
'navbar.lang': 'Bahasa',
|
||||
'layout.user.link.help': 'Bantuan',
|
||||
'layout.user.link.privacy': 'Privasi',
|
||||
'layout.user.link.terms': 'Ketentuan',
|
||||
'app.preview.down.block': 'Unduh halaman ini dalam projek lokal anda',
|
||||
'app.welcome.link.fetch-blocks': 'Dapatkan semua blok',
|
||||
'app.welcome.link.block-list':
|
||||
'Buat standar dengan cepat, halaman-halaman berdasarkan pengembangan `block`',
|
||||
...globalHeader,
|
||||
...menu,
|
||||
...settingDrawer,
|
||||
...settings,
|
||||
...pwa,
|
||||
...component,
|
||||
...pages,
|
||||
};
|
||||
5
src/locales/id-ID/component.ts
Normal file
5
src/locales/id-ID/component.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
'component.tagSelect.expand': 'Perluas',
|
||||
'component.tagSelect.collapse': 'Lipat',
|
||||
'component.tagSelect.all': 'Semua',
|
||||
};
|
||||
17
src/locales/id-ID/globalHeader.ts
Normal file
17
src/locales/id-ID/globalHeader.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export default {
|
||||
'component.globalHeader.search': 'Pencarian',
|
||||
'component.globalHeader.search.example1': 'Contoh 1 Pencarian',
|
||||
'component.globalHeader.search.example2': 'Contoh 2 Pencarian',
|
||||
'component.globalHeader.search.example3': 'Contoh 3 Pencarian',
|
||||
'component.globalHeader.help': 'Bantuan',
|
||||
'component.globalHeader.notification': 'Notifikasi',
|
||||
'component.globalHeader.notification.empty': 'Anda telah membaca semua notifikasi',
|
||||
'component.globalHeader.message': 'Pesan',
|
||||
'component.globalHeader.message.empty': 'Anda telah membaca semua pesan.',
|
||||
'component.globalHeader.event': 'Acara',
|
||||
'component.globalHeader.event.empty': 'Anda telah melihat semua acara.',
|
||||
'component.noticeIcon.clear': 'Kosongkan',
|
||||
'component.noticeIcon.cleared': 'Berhasil dikosongkan',
|
||||
'component.noticeIcon.empty': 'Tidak ada pemberitahuan',
|
||||
'component.noticeIcon.view-more': 'Melihat lebih',
|
||||
};
|
||||
52
src/locales/id-ID/menu.ts
Normal file
52
src/locales/id-ID/menu.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
export default {
|
||||
'menu.welcome': 'Selamat Datang',
|
||||
'menu.more-blocks': 'Blocks Lainnya',
|
||||
'menu.home': 'Halaman Awal',
|
||||
'menu.admin': 'Admin',
|
||||
'menu.admin.sub-page': 'Sub-Halaman',
|
||||
'menu.login': 'Masuk',
|
||||
'menu.register': 'Pendaftaran',
|
||||
'menu.register-result': 'Hasil Pendaftaran',
|
||||
'menu.dashboard': 'Dasbor',
|
||||
'menu.dashboard.analysis': 'Analisis',
|
||||
'menu.dashboard.monitor': 'Monitor',
|
||||
'menu.dashboard.workplace': 'Workplace',
|
||||
'menu.exception.403': '403',
|
||||
'menu.exception.404': '404',
|
||||
'menu.exception.500': '500',
|
||||
'menu.form': 'Form',
|
||||
'menu.form.basic-form': 'Form Dasar',
|
||||
'menu.form.step-form': 'Form Bertahap',
|
||||
'menu.form.step-form.info': 'Form Bertahap(menulis informasi yang dibagikan)',
|
||||
'menu.form.step-form.confirm': 'Form Bertahap(konfirmasi informasi yang dibagikan)',
|
||||
'menu.form.step-form.result': 'Form Bertahap(selesai)',
|
||||
'menu.form.advanced-form': 'Form Lanjutan',
|
||||
'menu.list': 'Daftar',
|
||||
'menu.list.table-list': 'Tabel Pencarian',
|
||||
'menu.list.basic-list': 'Daftar Dasar',
|
||||
'menu.list.card-list': 'Daftar Kartu',
|
||||
'menu.list.search-list': 'Daftar Pencarian',
|
||||
'menu.list.search-list.articles': 'Daftar Pencarian(artikel)',
|
||||
'menu.list.search-list.projects': 'Daftar Pencarian(projek)',
|
||||
'menu.list.search-list.applications': 'Daftar Pencarian(aplikasi)',
|
||||
'menu.profile': 'Profil',
|
||||
'menu.profile.basic': 'Profil Dasar',
|
||||
'menu.profile.advanced': 'Profile Lanjutan',
|
||||
'menu.result': 'Hasil',
|
||||
'menu.result.success': 'Sukses',
|
||||
'menu.result.fail': 'Gagal',
|
||||
'menu.exception': 'Pengecualian',
|
||||
'menu.exception.not-permission': '403',
|
||||
'menu.exception.not-find': '404',
|
||||
'menu.exception.server-error': '500',
|
||||
'menu.exception.trigger': 'Jalankan',
|
||||
'menu.account': 'Akun',
|
||||
'menu.account.center': 'Detail Akun',
|
||||
'menu.account.settings': 'Pengaturan Akun',
|
||||
'menu.account.trigger': 'Mengaktivasi Error',
|
||||
'menu.account.logout': 'Keluar',
|
||||
'menu.editor': 'Penyusun Grafis',
|
||||
'menu.editor.flow': 'Penyusun Alur',
|
||||
'menu.editor.mind': 'Penyusun Mind',
|
||||
'menu.editor.koni': 'Penyusun Koni',
|
||||
};
|
||||
72
src/locales/id-ID/pages.ts
Normal file
72
src/locales/id-ID/pages.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
export default {
|
||||
'pages.layouts.userLayout.title':
|
||||
'Ant Design adalah spesifikasi desain Web yang paling berpengaruh di Kabupaten Xihu',
|
||||
'pages.login.accountLogin.tab': 'Login dengan akun',
|
||||
'pages.login.accountLogin.errorMessage': 'Nama pengguna dan kata sandi salah(admin/ant.design)',
|
||||
'pages.login.failure': 'Log masuk gagal, silakan coba lagi!',
|
||||
'pages.login.success': 'Login berhasil!',
|
||||
'pages.login.username.placeholder': 'nama pengguna: admin atau user',
|
||||
'pages.login.username.required': 'Nama pengguna harus diisi!',
|
||||
'pages.login.password.placeholder': 'kata sandi: ant.design',
|
||||
'pages.login.password.required': 'Kata sandi harus diisi!',
|
||||
'pages.login.phoneLogin.tab': 'Login dengan ponsel',
|
||||
'pages.login.phoneLogin.errorMessage': 'Kesalahan kode verifikasi',
|
||||
'pages.login.phoneNumber.placeholder': 'masukkan nomor telepon',
|
||||
'pages.login.phoneNumber.required': 'Nomor ponsel harus diisi!',
|
||||
'pages.login.phoneNumber.invalid': 'Nomor ponsel tidak valid!',
|
||||
'pages.login.captcha.placeholder': 'kode verifikasi',
|
||||
'pages.login.captcha.required': 'Kode verifikasi diperlukan!',
|
||||
'pages.login.phoneLogin.getVerificationCode': 'Dapatkan kode',
|
||||
'pages.getCaptchaSecondText': 'detik tersisa',
|
||||
'pages.login.rememberMe': 'Ingat saya',
|
||||
'pages.login.forgotPassword': 'Lupa Kata Sandi?',
|
||||
'pages.login.submit': 'Masuk',
|
||||
'pages.login.loginWith': 'Masuk dengan :',
|
||||
'pages.login.registerAccount': 'Daftar Akun',
|
||||
'pages.welcome.link': 'Selamat datang',
|
||||
'pages.welcome.alertMessage':
|
||||
'Komponen heavy-duty yang lebih cepat dan lebih kuat telah dirilis.',
|
||||
'pages.404.subTitle': 'Maaf, halaman yang Anda kunjungi tidak ada. ',
|
||||
'pages.404.buttonText': 'Kembali ke halaman utama',
|
||||
'pages.admin.subPage.title': 'Halaman ini hanya dapat dilihat oleh admin',
|
||||
'pages.admin.subPage.alertMessage':
|
||||
'umi ui telah dirilis, silahkan gunakan npm run ui untuk memulai pengalaman.',
|
||||
'pages.searchTable.createForm.newRule': 'Aturan baru',
|
||||
'pages.searchTable.updateForm.ruleConfig': 'Konfigurasi aturan',
|
||||
'pages.searchTable.updateForm.basicConfig': 'Informasi dasar',
|
||||
'pages.searchTable.updateForm.ruleName.nameLabel': 'Nama aturan',
|
||||
'pages.searchTable.updateForm.ruleName.nameRules': 'Harap masukkan nama aturan!',
|
||||
'pages.searchTable.updateForm.ruleDesc.descLabel': 'Deskripsi aturan',
|
||||
'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
|
||||
'Harap masukkan setidaknya lima karakter',
|
||||
'pages.searchTable.updateForm.ruleDesc.descRules':
|
||||
'Harap masukkan deskripsi aturan setidaknya lima karakter!',
|
||||
'pages.searchTable.updateForm.ruleProps.title': 'Properti aturan',
|
||||
'pages.searchTable.updateForm.object': 'Objek pemantauan',
|
||||
'pages.searchTable.updateForm.ruleProps.templateLabel': 'Template aturan',
|
||||
'pages.searchTable.updateForm.ruleProps.typeLabel': 'Jenis aturan',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.title': 'Periode penjadwalan',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Waktu mulai',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Pilih waktu mulai!',
|
||||
'pages.searchTable.titleDesc': 'deskripsi',
|
||||
'pages.searchTable.ruleName': 'Nama aturan wajib diisi',
|
||||
'pages.searchTable.titleCallNo': 'Jumlah panggilan',
|
||||
'pages.searchTable.titleStatus': 'Status',
|
||||
'pages.searchTable.nameStatus.default': 'default',
|
||||
'pages.searchTable.nameStatus.running': 'menyala',
|
||||
'pages.searchTable.nameStatus.online': 'online',
|
||||
'pages.searchTable.nameStatus.abnormal': 'abnormal',
|
||||
'pages.searchTable.titleUpdatedAt': 'Waktu terjadwal',
|
||||
'pages.searchTable.exception': 'Harap masukkan alasan pengecualian!',
|
||||
'pages.searchTable.titleOption': 'Pengoperasian',
|
||||
'pages.searchTable.config': 'Konfigurasi',
|
||||
'pages.searchTable.subscribeAlert': 'Berlangganan notifikasi',
|
||||
'pages.searchTable.title': 'Formulir pertanyaan',
|
||||
'pages.searchTable.new': 'Baru',
|
||||
'pages.searchTable.chosen': 'Terpilih',
|
||||
'pages.searchTable.item': 'item',
|
||||
'pages.searchTable.totalServiceCalls': 'Jumlah total panggilan layanan',
|
||||
'pages.searchTable.tenThousand': '0000',
|
||||
'pages.searchTable.batchDeletion': 'Penghapusan batch',
|
||||
'pages.searchTable.batchApproval': 'Persetujuan batch',
|
||||
};
|
||||
7
src/locales/id-ID/pwa.ts
Normal file
7
src/locales/id-ID/pwa.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'app.pwa.offline': 'Koneksi anda terputus',
|
||||
'app.pwa.serviceworker.updated': 'Konten baru sudah tersedia',
|
||||
'app.pwa.serviceworker.updated.hint':
|
||||
'Silahkan klik tombol "Refresh" untuk memuat ulang halaman ini',
|
||||
'app.pwa.serviceworker.updated.ok': 'Memuat ulang',
|
||||
};
|
||||
32
src/locales/id-ID/settingDrawer.ts
Normal file
32
src/locales/id-ID/settingDrawer.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
export default {
|
||||
'app.setting.pagestyle': 'Pengaturan style Halaman',
|
||||
'app.setting.pagestyle.dark': 'Style Gelap',
|
||||
'app.setting.pagestyle.light': 'Style Cerah',
|
||||
'app.setting.content-width': 'Lebar Konten',
|
||||
'app.setting.content-width.fixed': 'Tetap',
|
||||
'app.setting.content-width.fluid': 'Fluid',
|
||||
'app.setting.themecolor': 'Theme Color',
|
||||
'app.setting.themecolor.dust': 'Dust Red',
|
||||
'app.setting.themecolor.volcano': 'Volcano',
|
||||
'app.setting.themecolor.sunset': 'Sunset Orange',
|
||||
'app.setting.themecolor.cyan': 'Cyan',
|
||||
'app.setting.themecolor.green': 'Polar Green',
|
||||
'app.setting.themecolor.daybreak': 'Daybreak Blue (bawaan)',
|
||||
'app.setting.themecolor.geekblue': 'Geek Glue',
|
||||
'app.setting.themecolor.purple': 'Golden Purple',
|
||||
'app.setting.navigationmode': 'Mode Navigasi',
|
||||
'app.setting.sidemenu': 'Susunan Menu Samping',
|
||||
'app.setting.topmenu': 'Susunan Menu Atas',
|
||||
'app.setting.fixedheader': 'Header Tetap',
|
||||
'app.setting.fixedsidebar': 'Sidebar Tetap',
|
||||
'app.setting.fixedsidebar.hint': 'Berjalan pada Susunan Menu Samping',
|
||||
'app.setting.hideheader': 'Sembunyikan Header ketika gulir ke bawah',
|
||||
'app.setting.hideheader.hint': 'Bekerja ketika Header tersembunyi dimunculkan',
|
||||
'app.setting.othersettings': 'Pengaturan Lainnya',
|
||||
'app.setting.weakmode': 'Mode Lemah',
|
||||
'app.setting.copy': 'Salin Pengaturan',
|
||||
'app.setting.copyinfo':
|
||||
'Berhasil disalin, tolong ubah defaultSettings pada src/models/setting.js',
|
||||
'app.setting.production.hint':
|
||||
'Panel pengaturan hanya muncul pada lingkungan pengembangan, silahkan modifikasi secara menual',
|
||||
};
|
||||
60
src/locales/id-ID/settings.ts
Normal file
60
src/locales/id-ID/settings.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
export default {
|
||||
'app.settings.menuMap.basic': 'Pengaturan Dasar',
|
||||
'app.settings.menuMap.security': 'Pengaturan Keamanan',
|
||||
'app.settings.menuMap.binding': 'Pengikatan Akun',
|
||||
'app.settings.menuMap.notification': 'Notifikasi Pesan Baru',
|
||||
'app.settings.basic.avatar': 'Avatar',
|
||||
'app.settings.basic.change-avatar': 'Ubah avatar',
|
||||
'app.settings.basic.email': 'Email',
|
||||
'app.settings.basic.email-message': 'Tolong masukkan email!',
|
||||
'app.settings.basic.nickname': 'Nickname',
|
||||
'app.settings.basic.nickname-message': 'Tolong masukkan Nickname!',
|
||||
'app.settings.basic.profile': 'Profil Personal',
|
||||
'app.settings.basic.profile-message': 'Tolong masukkan profil personal!',
|
||||
'app.settings.basic.profile-placeholder': 'Perkenalan Singkat tentang Diri Anda',
|
||||
'app.settings.basic.country': 'Negara/Wilayah',
|
||||
'app.settings.basic.country-message': 'Tolong masukkan negara anda!',
|
||||
'app.settings.basic.geographic': 'Provinsi atau kota',
|
||||
'app.settings.basic.geographic-message': 'Tolong masukkan info geografis anda!',
|
||||
'app.settings.basic.address': 'Alamat Jalan',
|
||||
'app.settings.basic.address-message': 'Tolong masukkan Alamat Jalan anda!',
|
||||
'app.settings.basic.phone': 'Nomor Ponsel',
|
||||
'app.settings.basic.phone-message': 'Tolong masukkan Nomor Ponsel anda!',
|
||||
'app.settings.basic.update': 'Perbarui Informasi',
|
||||
'app.settings.security.strong': 'Kuat',
|
||||
'app.settings.security.medium': 'Sedang',
|
||||
'app.settings.security.weak': 'Lemah',
|
||||
'app.settings.security.password': 'Kata Sandi Akun',
|
||||
'app.settings.security.password-description': 'Kekuatan Kata Sandi saat ini',
|
||||
'app.settings.security.phone': 'Keamanan Ponsel',
|
||||
'app.settings.security.phone-description': 'Mengikat Ponsel',
|
||||
'app.settings.security.question': 'Pertanyaan Keamanan',
|
||||
'app.settings.security.question-description':
|
||||
'Pertanyaan Keamanan belum diatur, dan kebijakan keamanan dapat melindungi akun secara efektif',
|
||||
'app.settings.security.email': 'Email Cadangan',
|
||||
'app.settings.security.email-description': 'Mengikat Email',
|
||||
'app.settings.security.mfa': 'Perangka MFA',
|
||||
'app.settings.security.mfa-description':
|
||||
'Tidak mengikat Perangkat MFA, setelah diikat, dapat dikonfirmasi dua kali',
|
||||
'app.settings.security.modify': 'Modifikasi',
|
||||
'app.settings.security.set': 'Setel',
|
||||
'app.settings.security.bind': 'Ikat',
|
||||
'app.settings.binding.taobao': 'Mengikat Taobao',
|
||||
'app.settings.binding.taobao-description': 'Tidak mengikat akun Taobao saat ini',
|
||||
'app.settings.binding.alipay': 'Mengikat Alipay',
|
||||
'app.settings.binding.alipay-description': 'Tidak mengikat akun Alipay saat ini',
|
||||
'app.settings.binding.dingding': 'Mengikat DingTalk',
|
||||
'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk',
|
||||
'app.settings.binding.bind': 'Ikat',
|
||||
'app.settings.notification.password': 'Kata Sandi Akun',
|
||||
'app.settings.notification.password-description':
|
||||
'Pesan dari pengguna lain akan diberitahu dalam bentuk surat',
|
||||
'app.settings.notification.messages': 'Pesan Sistem',
|
||||
'app.settings.notification.messages-description':
|
||||
'Pesan sistem akan diberitahu dalam bentuk surat',
|
||||
'app.settings.notification.todo': 'Notifikasi daftar To-do',
|
||||
'app.settings.notification.todo-description':
|
||||
'Daftar to-do akan diberitahukan dalam bentuk surat dari stasiun',
|
||||
'app.settings.open': 'Buka',
|
||||
'app.settings.close': 'Tutup',
|
||||
};
|
||||
24
src/locales/ja-JP.ts
Normal file
24
src/locales/ja-JP.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import component from './ja-JP/component';
|
||||
import globalHeader from './ja-JP/globalHeader';
|
||||
import menu from './ja-JP/menu';
|
||||
import pages from './ja-JP/pages';
|
||||
import pwa from './ja-JP/pwa';
|
||||
import settingDrawer from './ja-JP/settingDrawer';
|
||||
import settings from './ja-JP/settings';
|
||||
|
||||
export default {
|
||||
'navBar.lang': '言語',
|
||||
'layout.user.link.help': 'ヘルプ',
|
||||
'layout.user.link.privacy': 'プライバシー',
|
||||
'layout.user.link.terms': '利用規約',
|
||||
'app.preview.down.block': 'このページをローカルプロジェクトにダウンロードしてください',
|
||||
'app.welcome.link.fetch-blocks': '',
|
||||
'app.welcome.link.block-list': '',
|
||||
...globalHeader,
|
||||
...menu,
|
||||
...settingDrawer,
|
||||
...settings,
|
||||
...pwa,
|
||||
...component,
|
||||
...pages,
|
||||
};
|
||||
5
src/locales/ja-JP/component.ts
Normal file
5
src/locales/ja-JP/component.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
'component.tagSelect.expand': '展開',
|
||||
'component.tagSelect.collapse': '折りたたむ',
|
||||
'component.tagSelect.all': 'すべて',
|
||||
};
|
||||
17
src/locales/ja-JP/globalHeader.ts
Normal file
17
src/locales/ja-JP/globalHeader.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export default {
|
||||
'component.globalHeader.search': '検索',
|
||||
'component.globalHeader.search.example1': '検索例1',
|
||||
'component.globalHeader.search.example2': '検索例2',
|
||||
'component.globalHeader.search.example3': '検索例3',
|
||||
'component.globalHeader.help': 'ヘルプ',
|
||||
'component.globalHeader.notification': '通知',
|
||||
'component.globalHeader.notification.empty': 'すべての通知を表示しました。',
|
||||
'component.globalHeader.message': 'メッセージ',
|
||||
'component.globalHeader.message.empty': 'すべてのメッセージを表示しました。',
|
||||
'component.globalHeader.event': 'イベント',
|
||||
'component.globalHeader.event.empty': 'すべてのイベントを表示しました。',
|
||||
'component.noticeIcon.clear': 'クリア',
|
||||
'component.noticeIcon.cleared': 'クリア済み',
|
||||
'component.noticeIcon.empty': '通知なし',
|
||||
'component.noticeIcon.view-more': 'もっと見る',
|
||||
};
|
||||
52
src/locales/ja-JP/menu.ts
Normal file
52
src/locales/ja-JP/menu.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
export default {
|
||||
'menu.welcome': 'ようこそ',
|
||||
'menu.more-blocks': 'その他のブロック',
|
||||
'menu.home': 'ホーム',
|
||||
'menu.admin': '管理者',
|
||||
'menu.admin.sub-page': 'サブページ',
|
||||
'menu.login': 'ログイン',
|
||||
'menu.register': '登録',
|
||||
'menu.register-result': '登録結果',
|
||||
'menu.dashboard': 'ダッシュボード',
|
||||
'menu.dashboard.analysis': '分析',
|
||||
'menu.dashboard.monitor': 'モニター',
|
||||
'menu.dashboard.workplace': '職場',
|
||||
'menu.exception.403': '403',
|
||||
'menu.exception.404': '404',
|
||||
'menu.exception.500': '500',
|
||||
'menu.form': 'フォーム',
|
||||
'menu.form.basic-form': '基本フォーム',
|
||||
'menu.form.step-form': 'ステップフォーム',
|
||||
'menu.form.step-form.info': 'ステップフォーム(転送情報の書き込み)',
|
||||
'menu.form.step-form.confirm': 'ステップフォーム(転送情報の確認)',
|
||||
'menu.form.step-form.result': 'ステップフォーム(完成)',
|
||||
'menu.form.advanced-form': '高度なフォーム',
|
||||
'menu.list': 'リスト',
|
||||
'menu.list.table-list': '検索テーブル',
|
||||
'menu.list.basic-list': '基本リスト',
|
||||
'menu.list.card-list': 'カードリスト',
|
||||
'menu.list.search-list': '検索リスト',
|
||||
'menu.list.search-list.articles': '検索リスト(記事)',
|
||||
'menu.list.search-list.projects': '検索リスト(プロジェクト)',
|
||||
'menu.list.search-list.applications': '検索リスト(アプリ)',
|
||||
'menu.profile': 'プロフィール',
|
||||
'menu.profile.basic': '基本プロフィール',
|
||||
'menu.profile.advanced': '高度なプロフィール',
|
||||
'menu.result': '結果',
|
||||
'menu.result.success': '成功',
|
||||
'menu.result.fail': '失敗',
|
||||
'menu.exception': '例外',
|
||||
'menu.exception.not-permission': '403',
|
||||
'menu.exception.not-find': '404',
|
||||
'menu.exception.server-error': '500',
|
||||
'menu.exception.trigger': 'トリガー',
|
||||
'menu.account': 'アカウント',
|
||||
'menu.account.center': 'アカウントセンター',
|
||||
'menu.account.settings': 'アカウント設定',
|
||||
'menu.account.trigger': 'トリガーエラー',
|
||||
'menu.account.logout': 'ログアウト',
|
||||
'menu.editor': 'グラフィックエディタ',
|
||||
'menu.editor.flow': 'フローエディタ',
|
||||
'menu.editor.mind': 'マインドエディター',
|
||||
'menu.editor.koni': 'コニエディター',
|
||||
};
|
||||
69
src/locales/ja-JP/pages.ts
Normal file
69
src/locales/ja-JP/pages.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
export default {
|
||||
'pages.layouts.userLayout.title': 'Ant Designは、西湖区で最も影響力のあるWebデザイン仕様です。',
|
||||
'pages.login.accountLogin.tab': 'アカウントログイン',
|
||||
'pages.login.accountLogin.errorMessage':
|
||||
'ユーザー名/パスワードが正しくありません(admin/ant.design)',
|
||||
'pages.login.failure': 'ログインに失敗したら、もう一度試してください!',
|
||||
'pages.login.success': 'ログイン成功!',
|
||||
'pages.login.username.placeholder': 'ユーザー名:adminまたはuser',
|
||||
'pages.login.username.required': 'ユーザー名を入力してください!',
|
||||
'pages.login.password.placeholder': 'パスワード:ant.design',
|
||||
'pages.login.password.required': 'パスワードを入力してください!',
|
||||
'pages.login.phoneLogin.tab': '電話ログイン',
|
||||
'pages.login.phoneLogin.errorMessage': '検証コードエラー',
|
||||
'pages.login.phoneNumber.placeholder': '電話番号',
|
||||
'pages.login.phoneNumber.required': '電話番号を入力してください!',
|
||||
'pages.login.phoneNumber.invalid': '電話番号が無効です!',
|
||||
'pages.login.captcha.placeholder': '確認コード',
|
||||
'pages.login.captcha.required': '確認コードを入力してください!',
|
||||
'pages.login.phoneLogin.getVerificationCode': '確認コードを取得',
|
||||
'pages.getCaptchaSecondText': '秒',
|
||||
'pages.login.rememberMe': 'Remember me',
|
||||
'pages.login.forgotPassword': 'パスワードをお忘れですか?',
|
||||
'pages.login.submit': 'ログイン',
|
||||
'pages.login.loginWith': 'その他のログイン方法:',
|
||||
'pages.login.registerAccount': 'アカウント登録',
|
||||
'pages.welcome.link': 'ようこそ',
|
||||
'pages.welcome.alertMessage': 'より高速で強力な頑丈なコンポーネントがリリースされました。',
|
||||
'pages.404.subTitle': '申し訳ありませんが、アクセスしたページは存在しません。',
|
||||
'pages.404.buttonText': 'ホームに戻る',
|
||||
'pages.admin.subPage.title': 'このページは管理者のみが表示できます',
|
||||
'pages.admin.subPage.alertMessage':
|
||||
'Umi uiがリリースされました。npm run uiを使用して体験してください。',
|
||||
'pages.searchTable.createForm.newRule': '新しいルール',
|
||||
'pages.searchTable.updateForm.ruleConfig': 'ルール構成',
|
||||
'pages.searchTable.updateForm.basicConfig': '基本情報',
|
||||
'pages.searchTable.updateForm.ruleName.nameLabel': 'ルール名',
|
||||
'pages.searchTable.updateForm.ruleName.nameRules': 'ルール名を入力してください!',
|
||||
'pages.searchTable.updateForm.ruleDesc.descLabel': 'ルールの説明',
|
||||
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '5文字以上入力してください',
|
||||
'pages.searchTable.updateForm.ruleDesc.descRules': '5文字以上のルールの説明を入力してください!',
|
||||
'pages.searchTable.updateForm.ruleProps.title': 'プロパティの構成',
|
||||
'pages.searchTable.updateForm.object': '監視対象',
|
||||
'pages.searchTable.updateForm.ruleProps.templateLabel': 'ルールテンプレート',
|
||||
'pages.searchTable.updateForm.ruleProps.typeLabel': 'ルールタイプ',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.title': 'スケジュール期間の設定',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeRules': '開始時間を選択してください!',
|
||||
'pages.searchTable.titleDesc': '説明',
|
||||
'pages.searchTable.ruleName': 'ルール名が必要です',
|
||||
'pages.searchTable.titleCallNo': 'サービスコール数',
|
||||
'pages.searchTable.titleStatus': 'ステータス',
|
||||
'pages.searchTable.nameStatus.default': 'デフォルト',
|
||||
'pages.searchTable.nameStatus.running': '起動中',
|
||||
'pages.searchTable.nameStatus.online': 'オンライン',
|
||||
'pages.searchTable.nameStatus.abnormal': '異常',
|
||||
'pages.searchTable.titleUpdatedAt': '最終スケジュール',
|
||||
'pages.searchTable.exception': '例外の理由を入力してください!',
|
||||
'pages.searchTable.titleOption': 'オプション',
|
||||
'pages.searchTable.config': '構成',
|
||||
'pages.searchTable.subscribeAlert': 'アラートを購読する',
|
||||
'pages.searchTable.title': 'お問い合わせフォーム',
|
||||
'pages.searchTable.new': '新しい',
|
||||
'pages.searchTable.chosen': '選んだ項目',
|
||||
'pages.searchTable.item': '項目',
|
||||
'pages.searchTable.totalServiceCalls': 'サービスコールの総数',
|
||||
'pages.searchTable.tenThousand': '万',
|
||||
'pages.searchTable.batchDeletion': 'バッチ削除',
|
||||
'pages.searchTable.batchApproval': 'バッチ承認',
|
||||
};
|
||||
7
src/locales/ja-JP/pwa.ts
Normal file
7
src/locales/ja-JP/pwa.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'app.pwa.offline': 'あなたは今オフラインです',
|
||||
'app.pwa.serviceworker.updated': '新しいコンテンツが利用可能です',
|
||||
'app.pwa.serviceworker.updated.hint':
|
||||
'現在のページをリロードするには、「更新」ボタンを押してください',
|
||||
'app.pwa.serviceworker.updated.ok': 'リフレッシュ',
|
||||
};
|
||||
31
src/locales/ja-JP/settingDrawer.ts
Normal file
31
src/locales/ja-JP/settingDrawer.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
export default {
|
||||
'app.setting.pagestyle': 'ページスタイル設定',
|
||||
'app.setting.pagestyle.dark': 'ダークスタイル',
|
||||
'app.setting.pagestyle.light': 'ライトスタイル',
|
||||
'app.setting.content-width': 'コンテンツの幅',
|
||||
'app.setting.content-width.fixed': '固定',
|
||||
'app.setting.content-width.fluid': '流体',
|
||||
'app.setting.themecolor': 'テーマカラー',
|
||||
'app.setting.themecolor.dust': 'ダストレッド',
|
||||
'app.setting.themecolor.volcano': 'ボルケ-ノ',
|
||||
'app.setting.themecolor.sunset': 'サンセットオレンジ',
|
||||
'app.setting.themecolor.cyan': 'シアン',
|
||||
'app.setting.themecolor.green': 'ポーラーグリーン',
|
||||
'app.setting.themecolor.daybreak': '夜明けの青(デフォルト)',
|
||||
'app.setting.themecolor.geekblue': 'ギーク ブルー',
|
||||
'app.setting.themecolor.purple': 'ゴールデンパープル',
|
||||
'app.setting.navigationmode': 'ナビゲーションモード',
|
||||
'app.setting.sidemenu': 'サイドメニューのレイアウト',
|
||||
'app.setting.topmenu': 'トップメニューのレイアウト',
|
||||
'app.setting.fixedheader': '固定ヘッダー',
|
||||
'app.setting.fixedsidebar': '固定サイドバー',
|
||||
'app.setting.fixedsidebar.hint': 'サイドメニューのレイアウトで動作します',
|
||||
'app.setting.hideheader': 'スクロール時の非表示ヘッダー',
|
||||
'app.setting.hideheader.hint': '非表示ヘッダーが有効になっている場合に機能します',
|
||||
'app.setting.othersettings': 'その他の設定',
|
||||
'app.setting.weakmode': 'ウィークモード',
|
||||
'app.setting.copy': 'コピー設定',
|
||||
'app.setting.copyinfo':
|
||||
'コピーが成功しました。src/models/setting.jsのdefaultSettingsを置き換えてください',
|
||||
'app.setting.production.hint': '設定パネルは開発環境でのみ表示されます。手動で変更してください',
|
||||
};
|
||||
59
src/locales/ja-JP/settings.ts
Normal file
59
src/locales/ja-JP/settings.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
export default {
|
||||
'app.settings.menuMap.basic': '基本設定',
|
||||
'app.settings.menuMap.security': 'セキュリティ設定',
|
||||
'app.settings.menuMap.binding': 'アカウントのバインド',
|
||||
'app.settings.menuMap.notification': '新しいメッセージの通知',
|
||||
'app.settings.basic.avatar': 'アバター',
|
||||
'app.settings.basic.change-avatar': 'アバターを変更する',
|
||||
'app.settings.basic.email': 'メール',
|
||||
'app.settings.basic.email-message': 'メールアドレスを入力してください!',
|
||||
'app.settings.basic.nickname': 'ニックネーム',
|
||||
'app.settings.basic.nickname-message': 'ニックネームを入力してください!',
|
||||
'app.settings.basic.profile': '個人プロフィール',
|
||||
'app.settings.basic.profile-message': '個人プロフィールを入力してください!',
|
||||
'app.settings.basic.profile-placeholder': '自己紹介',
|
||||
'app.settings.basic.country': '国/地域',
|
||||
'app.settings.basic.country-message': 'あなたの国を入力してください!',
|
||||
'app.settings.basic.geographic': '州または市',
|
||||
'app.settings.basic.geographic-message': '地理情報を入力してください!',
|
||||
'app.settings.basic.address': '住所',
|
||||
'app.settings.basic.address-message': '住所を入力してください!',
|
||||
'app.settings.basic.phone': '電話番号',
|
||||
'app.settings.basic.phone-message': '電話番号を入力してください!',
|
||||
'app.settings.basic.update': '更新情報',
|
||||
'app.settings.security.strong': '強い',
|
||||
'app.settings.security.medium': 'ミディアム',
|
||||
'app.settings.security.weak': '弱い',
|
||||
'app.settings.security.password': 'アカウントパスワード',
|
||||
'app.settings.security.password-description': '現在のパスワードの強度',
|
||||
'app.settings.security.phone': 'セキュリティ電話番号',
|
||||
'app.settings.security.phone-description': 'バインドされた電話番号',
|
||||
'app.settings.security.question': '秘密の質問',
|
||||
'app.settings.security.question-description':
|
||||
'セキュリティの質問が設定されてません。セキュリティポリシーはアカウントのセキュリティを効果的に保護できます',
|
||||
'app.settings.security.email': 'バックアップメール',
|
||||
'app.settings.security.email-description': 'バインドされたメール',
|
||||
'app.settings.security.mfa': '多要素認証デバイス',
|
||||
'app.settings.security.mfa-description':
|
||||
'バインドされていない多要素認証デバイスは、バインド後、2回確認できます',
|
||||
'app.settings.security.modify': '変更する',
|
||||
'app.settings.security.set': 'セットする',
|
||||
'app.settings.security.bind': 'バインド',
|
||||
'app.settings.binding.taobao': 'タオバオをバインドする',
|
||||
'app.settings.binding.taobao-description': '現在バインドされていないタオバオアカウント',
|
||||
'app.settings.binding.alipay': 'アリペイをバインドする',
|
||||
'app.settings.binding.alipay-description': '現在バインドされていないアリペイアカウント',
|
||||
'app.settings.binding.dingding': 'ディントークをバインドする',
|
||||
'app.settings.binding.dingding-description': '現在バインドされていないディントークアカウント',
|
||||
'app.settings.binding.bind': 'バインド',
|
||||
'app.settings.notification.password': 'アカウントパスワード',
|
||||
'app.settings.notification.password-description':
|
||||
'他のユーザーからのメッセージは、ステーションレターの形式で通知されます',
|
||||
'app.settings.notification.messages': 'システムメッセージ',
|
||||
'app.settings.notification.messages-description':
|
||||
'システムメッセージは、ステーションレターの形式で通知されます',
|
||||
'app.settings.notification.todo': 'To Do(用事) 通知',
|
||||
'app.settings.notification.todo-description': 'To Doタスクは、内部レターの形式で通知されます',
|
||||
'app.settings.open': '開く',
|
||||
'app.settings.close': '閉じる',
|
||||
};
|
||||
22
src/locales/pt-BR.ts
Normal file
22
src/locales/pt-BR.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import component from './pt-BR/component';
|
||||
import globalHeader from './pt-BR/globalHeader';
|
||||
import menu from './pt-BR/menu';
|
||||
import pages from './pt-BR/pages';
|
||||
import pwa from './pt-BR/pwa';
|
||||
import settingDrawer from './pt-BR/settingDrawer';
|
||||
import settings from './pt-BR/settings';
|
||||
|
||||
export default {
|
||||
'navBar.lang': 'Idiomas',
|
||||
'layout.user.link.help': 'ajuda',
|
||||
'layout.user.link.privacy': 'política de privacidade',
|
||||
'layout.user.link.terms': 'termos de serviços',
|
||||
'app.preview.down.block': 'Download this page to your local project',
|
||||
...globalHeader,
|
||||
...menu,
|
||||
...settingDrawer,
|
||||
...settings,
|
||||
...pwa,
|
||||
...component,
|
||||
...pages,
|
||||
};
|
||||
5
src/locales/pt-BR/component.ts
Normal file
5
src/locales/pt-BR/component.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
'component.tagSelect.expand': 'Expandir',
|
||||
'component.tagSelect.collapse': 'Diminuir',
|
||||
'component.tagSelect.all': 'Todas',
|
||||
};
|
||||
17
src/locales/pt-BR/globalHeader.ts
Normal file
17
src/locales/pt-BR/globalHeader.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export default {
|
||||
'component.globalHeader.search': 'Busca',
|
||||
'component.globalHeader.search.example1': 'Exemplo de busca 1',
|
||||
'component.globalHeader.search.example2': 'Exemplo de busca 2',
|
||||
'component.globalHeader.search.example3': 'Exemplo de busca 3',
|
||||
'component.globalHeader.help': 'Ajuda',
|
||||
'component.globalHeader.notification': 'Notificação',
|
||||
'component.globalHeader.notification.empty': 'Você visualizou todas as notificações.',
|
||||
'component.globalHeader.message': 'Mensagem',
|
||||
'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.',
|
||||
'component.globalHeader.event': 'Evento',
|
||||
'component.globalHeader.event.empty': 'Você visualizou todos os eventos.',
|
||||
'component.noticeIcon.clear': 'Limpar',
|
||||
'component.noticeIcon.cleared': 'Limpo',
|
||||
'component.noticeIcon.empty': 'Sem notificações',
|
||||
'component.noticeIcon.view-more': 'Veja mais',
|
||||
};
|
||||
52
src/locales/pt-BR/menu.ts
Normal file
52
src/locales/pt-BR/menu.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
export default {
|
||||
'menu.welcome': 'Welcome',
|
||||
'menu.more-blocks': 'More Blocks',
|
||||
'menu.home': 'Início',
|
||||
'menu.admin': 'Admin',
|
||||
'menu.admin.sub-page': 'Sub-Page',
|
||||
'menu.login': 'Login',
|
||||
'menu.register': 'Registro',
|
||||
'menu.register-result': 'Resultado de registro',
|
||||
'menu.dashboard': 'Dashboard',
|
||||
'menu.dashboard.analysis': 'Análise',
|
||||
'menu.dashboard.monitor': 'Monitor',
|
||||
'menu.dashboard.workplace': 'Ambiente de Trabalho',
|
||||
'menu.exception.403': '403',
|
||||
'menu.exception.404': '404',
|
||||
'menu.exception.500': '500',
|
||||
'menu.form': 'Formulário',
|
||||
'menu.form.basic-form': 'Formulário Básico',
|
||||
'menu.form.step-form': 'Formulário Assistido',
|
||||
'menu.form.step-form.info': 'Formulário Assistido(gravar informações de transferência)',
|
||||
'menu.form.step-form.confirm': 'Formulário Assistido(confirmar informações de transferência)',
|
||||
'menu.form.step-form.result': 'Formulário Assistido(finalizado)',
|
||||
'menu.form.advanced-form': 'Formulário Avançado',
|
||||
'menu.list': 'Lista',
|
||||
'menu.list.table-list': 'Tabela de Busca',
|
||||
'menu.list.basic-list': 'Lista Básica',
|
||||
'menu.list.card-list': 'Lista de Card',
|
||||
'menu.list.search-list': 'Lista de Busca',
|
||||
'menu.list.search-list.articles': 'Lista de Busca(artigos)',
|
||||
'menu.list.search-list.projects': 'Lista de Busca(projetos)',
|
||||
'menu.list.search-list.applications': 'Lista de Busca(aplicações)',
|
||||
'menu.profile': 'Perfil',
|
||||
'menu.profile.basic': 'Perfil Básico',
|
||||
'menu.profile.advanced': 'Perfil Avançado',
|
||||
'menu.result': 'Resultado',
|
||||
'menu.result.success': 'Sucesso',
|
||||
'menu.result.fail': 'Falha',
|
||||
'menu.exception': 'Exceção',
|
||||
'menu.exception.not-permission': '403',
|
||||
'menu.exception.not-find': '404',
|
||||
'menu.exception.server-error': '500',
|
||||
'menu.exception.trigger': 'Disparar',
|
||||
'menu.account': 'Conta',
|
||||
'menu.account.center': 'Central da Conta',
|
||||
'menu.account.settings': 'Configurar Conta',
|
||||
'menu.account.trigger': 'Disparar Erro',
|
||||
'menu.account.logout': 'Sair',
|
||||
'menu.editor': 'Graphic Editor',
|
||||
'menu.editor.flow': 'Flow Editor',
|
||||
'menu.editor.mind': 'Mind Editor',
|
||||
'menu.editor.koni': 'Koni Editor',
|
||||
};
|
||||
72
src/locales/pt-BR/pages.ts
Normal file
72
src/locales/pt-BR/pages.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
export default {
|
||||
'pages.layouts.userLayout.title':
|
||||
'Ant Design é a especificação de web design mais influente no distrito de Xihu',
|
||||
'pages.login.accountLogin.tab': 'Login da conta',
|
||||
'pages.login.accountLogin.errorMessage': 'usuário/senha incorreto(admin/ant.design)',
|
||||
'pages.login.failure': 'Login falhou, por favor tente novamente!',
|
||||
'pages.login.success': 'Login efetuado com sucesso!',
|
||||
'pages.login.username.placeholder': 'Usuário: admin or user',
|
||||
'pages.login.username.required': 'Por favor insira seu usuário!',
|
||||
'pages.login.password.placeholder': 'Senha: ant.design',
|
||||
'pages.login.password.required': 'Por favor insira sua senha!',
|
||||
'pages.login.phoneLogin.tab': 'Login com Telefone',
|
||||
'pages.login.phoneLogin.errorMessage': 'Erro de Código de Verificação',
|
||||
'pages.login.phoneNumber.placeholder': 'Telefone',
|
||||
'pages.login.phoneNumber.required': 'Por favor entre com seu telefone!',
|
||||
'pages.login.phoneNumber.invalid': 'Telefone é inválido!',
|
||||
'pages.login.captcha.placeholder': 'Código de Verificação',
|
||||
'pages.login.captcha.required': 'Por favor entre com o código de verificação!',
|
||||
'pages.login.phoneLogin.getVerificationCode': 'Obter Código',
|
||||
'pages.getCaptchaSecondText': 'seg(s)',
|
||||
'pages.login.rememberMe': 'Lembre-me',
|
||||
'pages.login.forgotPassword': 'Perdeu a Senha ?',
|
||||
'pages.login.submit': 'Enviar',
|
||||
'pages.login.loginWith': 'Login com :',
|
||||
'pages.login.registerAccount': 'Registra Conta',
|
||||
'pages.welcome.link': 'Bem-vindo',
|
||||
'pages.welcome.alertMessage': 'Componentes pesados mais rápidos e mais fortes foram lançados.',
|
||||
'pages.404.subTitle': 'Desculpe, a página que você visitou não existe. ',
|
||||
'pages.404.buttonText': 'Voltar à página inicial',
|
||||
'pages.admin.subPage.title': 'Esta página só pode ser vista pelo Admin',
|
||||
'pages.admin.subPage.alertMessage':
|
||||
'O Umi ui foi lançado, bem-vindo ao usar o npm run ui para iniciar a experiência.',
|
||||
'pages.searchTable.createForm.newRule': 'Neva Regra',
|
||||
'pages.searchTable.updateForm.ruleConfig': 'Configuração de Regra',
|
||||
'pages.searchTable.updateForm.basicConfig': 'Informação básica',
|
||||
'pages.searchTable.updateForm.ruleName.nameLabel': 'Nome da Regra',
|
||||
'pages.searchTable.updateForm.ruleName.nameRules': 'Por favor entre com o nome da regra!',
|
||||
'pages.searchTable.updateForm.ruleDesc.descLabel': 'Descrição da Regra',
|
||||
'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
|
||||
'Por favor insira ao menos cinco caracteres',
|
||||
'pages.searchTable.updateForm.ruleDesc.descRules':
|
||||
'Insira uma descrição de regra de pelo menos cinco caracteres!',
|
||||
'pages.searchTable.updateForm.ruleProps.title': 'Configurar Propriedades',
|
||||
'pages.searchTable.updateForm.object': 'Objeto de Monitoramento',
|
||||
'pages.searchTable.updateForm.ruleProps.templateLabel': 'Modelo de Regra',
|
||||
'pages.searchTable.updateForm.ruleProps.typeLabel': 'Tipo de Regra',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.title': 'Definir Período de Agendamento',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Hora de Início',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeRules':
|
||||
'Por favor selecione um horáriod e início!',
|
||||
'pages.searchTable.titleDesc': 'Descrição',
|
||||
'pages.searchTable.ruleName': 'O nome da regra é obrigatório',
|
||||
'pages.searchTable.titleCallNo': 'Número de chamadas de serviço',
|
||||
'pages.searchTable.titleStatus': 'Status',
|
||||
'pages.searchTable.nameStatus.default': 'padrão',
|
||||
'pages.searchTable.nameStatus.running': 'executando',
|
||||
'pages.searchTable.nameStatus.online': 'online',
|
||||
'pages.searchTable.nameStatus.abnormal': 'anormal',
|
||||
'pages.searchTable.titleUpdatedAt': 'Última programação em',
|
||||
'pages.searchTable.exception': 'Por favor, indique o motivo da exceção!',
|
||||
'pages.searchTable.titleOption': 'Opção',
|
||||
'pages.searchTable.config': 'Configuração',
|
||||
'pages.searchTable.subscribeAlert': 'Inscreva-se para receber alertas',
|
||||
'pages.searchTable.title': 'Formulário de Consulta',
|
||||
'pages.searchTable.new': 'Novo',
|
||||
'pages.searchTable.chosen': 'selecionado',
|
||||
'pages.searchTable.item': 'item',
|
||||
'pages.searchTable.totalServiceCalls': 'Número total de chamadas de serviço',
|
||||
'pages.searchTable.tenThousand': '0000',
|
||||
'pages.searchTable.batchDeletion': 'deleção em lote',
|
||||
'pages.searchTable.batchApproval': 'aprovação em lote',
|
||||
};
|
||||
7
src/locales/pt-BR/pwa.ts
Normal file
7
src/locales/pt-BR/pwa.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
export default {
|
||||
'app.pwa.offline': 'Você está offline agora',
|
||||
'app.pwa.serviceworker.updated': 'Novo conteúdo está disponível',
|
||||
'app.pwa.serviceworker.updated.hint':
|
||||
'Por favor, pressione o botão "Atualizar" para recarregar a página atual',
|
||||
'app.pwa.serviceworker.updated.ok': 'Atualizar',
|
||||
};
|
||||
32
src/locales/pt-BR/settingDrawer.ts
Normal file
32
src/locales/pt-BR/settingDrawer.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
export default {
|
||||
'app.setting.pagestyle': 'Configuração de estilo da página',
|
||||
'app.setting.pagestyle.dark': 'Dark style',
|
||||
'app.setting.pagestyle.light': 'Light style',
|
||||
'app.setting.content-width': 'Largura do conteúdo',
|
||||
'app.setting.content-width.fixed': 'Fixo',
|
||||
'app.setting.content-width.fluid': 'Fluido',
|
||||
'app.setting.themecolor': 'Cor do Tema',
|
||||
'app.setting.themecolor.dust': 'Dust Red',
|
||||
'app.setting.themecolor.volcano': 'Volcano',
|
||||
'app.setting.themecolor.sunset': 'Sunset Orange',
|
||||
'app.setting.themecolor.cyan': 'Cyan',
|
||||
'app.setting.themecolor.green': 'Polar Green',
|
||||
'app.setting.themecolor.daybreak': 'Daybreak Blue (default)',
|
||||
'app.setting.themecolor.geekblue': 'Geek Glue',
|
||||
'app.setting.themecolor.purple': 'Golden Purple',
|
||||
'app.setting.navigationmode': 'Modo de Navegação',
|
||||
'app.setting.sidemenu': 'Layout do Menu Lateral',
|
||||
'app.setting.topmenu': 'Layout do Menu Superior',
|
||||
'app.setting.fixedheader': 'Cabeçalho fixo',
|
||||
'app.setting.fixedsidebar': 'Barra lateral fixa',
|
||||
'app.setting.fixedsidebar.hint': 'Funciona no layout do menu lateral',
|
||||
'app.setting.hideheader': 'Esconder o cabeçalho quando rolar',
|
||||
'app.setting.hideheader.hint': 'Funciona quando o esconder cabeçalho está abilitado',
|
||||
'app.setting.othersettings': 'Outras configurações',
|
||||
'app.setting.weakmode': 'Weak Mode',
|
||||
'app.setting.copy': 'Copiar Configuração',
|
||||
'app.setting.copyinfo':
|
||||
'copiado com sucesso, por favor trocar o defaultSettings em src/models/setting.js',
|
||||
'app.setting.production.hint':
|
||||
'O painel de configuração apenas é exibido no ambiente de desenvolvimento, por favor modifique manualmente o',
|
||||
};
|
||||
60
src/locales/pt-BR/settings.ts
Normal file
60
src/locales/pt-BR/settings.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
export default {
|
||||
'app.settings.menuMap.basic': 'Configurações Básicas',
|
||||
'app.settings.menuMap.security': 'Configurações de Segurança',
|
||||
'app.settings.menuMap.binding': 'Vinculação de Conta',
|
||||
'app.settings.menuMap.notification': 'Mensagens de Notificação',
|
||||
'app.settings.basic.avatar': 'Avatar',
|
||||
'app.settings.basic.change-avatar': 'Alterar avatar',
|
||||
'app.settings.basic.email': 'Email',
|
||||
'app.settings.basic.email-message': 'Por favor insira seu email!',
|
||||
'app.settings.basic.nickname': 'Nome de usuário',
|
||||
'app.settings.basic.nickname-message': 'Por favor insira seu nome de usuário!',
|
||||
'app.settings.basic.profile': 'Perfil pessoal',
|
||||
'app.settings.basic.profile-message': 'Por favor insira seu perfil pessoal!',
|
||||
'app.settings.basic.profile-placeholder': 'Breve introdução sua',
|
||||
'app.settings.basic.country': 'País/Região',
|
||||
'app.settings.basic.country-message': 'Por favor insira país!',
|
||||
'app.settings.basic.geographic': 'Província, estado ou cidade',
|
||||
'app.settings.basic.geographic-message': 'Por favor insira suas informações geográficas!',
|
||||
'app.settings.basic.address': 'Endereço',
|
||||
'app.settings.basic.address-message': 'Por favor insira seu endereço!',
|
||||
'app.settings.basic.phone': 'Número de telefone',
|
||||
'app.settings.basic.phone-message': 'Por favor insira seu número de telefone!',
|
||||
'app.settings.basic.update': 'Atualizar Informações',
|
||||
'app.settings.security.strong': 'Forte',
|
||||
'app.settings.security.medium': 'Média',
|
||||
'app.settings.security.weak': 'Fraca',
|
||||
'app.settings.security.password': 'Senha da Conta',
|
||||
'app.settings.security.password-description': 'Força da senha',
|
||||
'app.settings.security.phone': 'Telefone de Seguraça',
|
||||
'app.settings.security.phone-description': 'Telefone vinculado',
|
||||
'app.settings.security.question': 'Pergunta de Segurança',
|
||||
'app.settings.security.question-description':
|
||||
'A pergunta de segurança não está definida e a política de segurança pode proteger efetivamente a segurança da conta',
|
||||
'app.settings.security.email': 'Email de Backup',
|
||||
'app.settings.security.email-description': 'Email vinculado',
|
||||
'app.settings.security.mfa': 'Dispositivo MFA',
|
||||
'app.settings.security.mfa-description':
|
||||
'O dispositivo MFA não vinculado, após a vinculação, pode ser confirmado duas vezes',
|
||||
'app.settings.security.modify': 'Modificar',
|
||||
'app.settings.security.set': 'Atribuir',
|
||||
'app.settings.security.bind': 'Vincular',
|
||||
'app.settings.binding.taobao': 'Vincular Taobao',
|
||||
'app.settings.binding.taobao-description': 'Atualmente não vinculado à conta Taobao',
|
||||
'app.settings.binding.alipay': 'Vincular Alipay',
|
||||
'app.settings.binding.alipay-description': 'Atualmente não vinculado à conta Alipay',
|
||||
'app.settings.binding.dingding': 'Vincular DingTalk',
|
||||
'app.settings.binding.dingding-description': 'Atualmente não vinculado à conta DingTalk',
|
||||
'app.settings.binding.bind': 'Vincular',
|
||||
'app.settings.notification.password': 'Senha da Conta',
|
||||
'app.settings.notification.password-description':
|
||||
'Mensagens de outros usuários serão notificadas na forma de uma estação de letra',
|
||||
'app.settings.notification.messages': 'Mensagens de Sistema',
|
||||
'app.settings.notification.messages-description':
|
||||
'Mensagens de sistema serão notificadas na forma de uma estação de letra',
|
||||
'app.settings.notification.todo': 'Notificação de To-do',
|
||||
'app.settings.notification.todo-description':
|
||||
'A lista de to-do será notificada na forma de uma estação de letra',
|
||||
'app.settings.open': 'Aberto',
|
||||
'app.settings.close': 'Fechado',
|
||||
};
|
||||
24
src/locales/zh-CN.ts
Normal file
24
src/locales/zh-CN.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import component from './zh-CN/component';
|
||||
import globalHeader from './zh-CN/globalHeader';
|
||||
import menu from './zh-CN/menu';
|
||||
import pages from './zh-CN/pages';
|
||||
import pwa from './zh-CN/pwa';
|
||||
import settingDrawer from './zh-CN/settingDrawer';
|
||||
import settings from './zh-CN/settings';
|
||||
|
||||
export default {
|
||||
'navBar.lang': '语言',
|
||||
'layout.user.link.help': '帮助',
|
||||
'layout.user.link.privacy': '隐私',
|
||||
'layout.user.link.terms': '条款',
|
||||
'app.preview.down.block': '下载此页面到本地项目',
|
||||
'app.welcome.link.fetch-blocks': '获取全部区块',
|
||||
'app.welcome.link.block-list': '基于 block 开发,快速构建标准页面',
|
||||
...pages,
|
||||
...globalHeader,
|
||||
...menu,
|
||||
...settingDrawer,
|
||||
...settings,
|
||||
...pwa,
|
||||
...component,
|
||||
};
|
||||
5
src/locales/zh-CN/component.ts
Normal file
5
src/locales/zh-CN/component.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
'component.tagSelect.expand': '展开',
|
||||
'component.tagSelect.collapse': '收起',
|
||||
'component.tagSelect.all': '全部',
|
||||
};
|
||||
17
src/locales/zh-CN/globalHeader.ts
Normal file
17
src/locales/zh-CN/globalHeader.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export default {
|
||||
'component.globalHeader.search': '站内搜索',
|
||||
'component.globalHeader.search.example1': '搜索提示一',
|
||||
'component.globalHeader.search.example2': '搜索提示二',
|
||||
'component.globalHeader.search.example3': '搜索提示三',
|
||||
'component.globalHeader.help': '使用文档',
|
||||
'component.globalHeader.notification': '通知',
|
||||
'component.globalHeader.notification.empty': '你已查看所有通知',
|
||||
'component.globalHeader.message': '消息',
|
||||
'component.globalHeader.message.empty': '您已读完所有消息',
|
||||
'component.globalHeader.event': '待办',
|
||||
'component.globalHeader.event.empty': '你已完成所有待办',
|
||||
'component.noticeIcon.clear': '清空',
|
||||
'component.noticeIcon.cleared': '清空了',
|
||||
'component.noticeIcon.empty': '暂无数据',
|
||||
'component.noticeIcon.view-more': '查看更多',
|
||||
};
|
||||
53
src/locales/zh-CN/menu.ts
Normal file
53
src/locales/zh-CN/menu.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
export default {
|
||||
'menu.welcome': '欢迎',
|
||||
'menu.menu': '菜单',
|
||||
'menu.more-blocks': '更多区块',
|
||||
'menu.home': '首页',
|
||||
'menu.admin': '管理页',
|
||||
'menu.admin.sub-page': '二级管理页',
|
||||
'menu.login': '登录',
|
||||
'menu.register': '注册',
|
||||
'menu.register-result': '注册结果',
|
||||
'menu.dashboard': 'Dashboard',
|
||||
'menu.dashboard.analysis': '分析页',
|
||||
'menu.dashboard.monitor': '监控页',
|
||||
'menu.dashboard.workplace': '工作台',
|
||||
'menu.exception.403': '403',
|
||||
'menu.exception.404': '404',
|
||||
'menu.exception.500': '500',
|
||||
'menu.form': '表单页',
|
||||
'menu.form.basic-form': '基础表单',
|
||||
'menu.form.step-form': '分步表单',
|
||||
'menu.form.step-form.info': '分步表单(填写转账信息)',
|
||||
'menu.form.step-form.confirm': '分步表单(确认转账信息)',
|
||||
'menu.form.step-form.result': '分步表单(完成)',
|
||||
'menu.form.advanced-form': '高级表单',
|
||||
'menu.list': '列表页',
|
||||
'menu.list.table-list': '查询表格',
|
||||
'menu.list.basic-list': '标准列表',
|
||||
'menu.list.card-list': '卡片列表',
|
||||
'menu.list.search-list': '搜索列表',
|
||||
'menu.list.search-list.articles': '搜索列表(文章)',
|
||||
'menu.list.search-list.projects': '搜索列表(项目)',
|
||||
'menu.list.search-list.applications': '搜索列表(应用)',
|
||||
'menu.profile': '详情页',
|
||||
'menu.profile.basic': '基础详情页',
|
||||
'menu.profile.advanced': '高级详情页',
|
||||
'menu.result': '结果页',
|
||||
'menu.result.success': '成功页',
|
||||
'menu.result.fail': '失败页',
|
||||
'menu.exception': '异常页',
|
||||
'menu.exception.not-permission': '403',
|
||||
'menu.exception.not-find': '404',
|
||||
'menu.exception.server-error': '500',
|
||||
'menu.exception.trigger': '触发错误',
|
||||
'menu.account': '个人页',
|
||||
'menu.account.center': '个人中心',
|
||||
'menu.account.settings': '个人设置',
|
||||
'menu.account.trigger': '触发报错',
|
||||
'menu.account.logout': '退出登录',
|
||||
'menu.editor': '图形编辑器',
|
||||
'menu.editor.flow': '流程编辑器',
|
||||
'menu.editor.mind': '脑图编辑器',
|
||||
'menu.editor.koni': '拓扑编辑器',
|
||||
};
|
||||
67
src/locales/zh-CN/pages.ts
Normal file
67
src/locales/zh-CN/pages.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
export default {
|
||||
'pages.layouts.userLayout.title': 'Ant Design 是西湖区最具影响力的 Web 设计规范',
|
||||
'pages.login.accountLogin.tab': '账户密码登录',
|
||||
'pages.login.accountLogin.errorMessage': '错误的用户名和密码(admin/ant.design)',
|
||||
'pages.login.failure': '登录失败,请重试!',
|
||||
'pages.login.success': '登录成功!',
|
||||
'pages.login.username.placeholder': '用户名: admin or user',
|
||||
'pages.login.username.required': '用户名是必填项!',
|
||||
'pages.login.password.placeholder': '密码: ant.design',
|
||||
'pages.login.password.required': '密码是必填项!',
|
||||
'pages.login.phoneLogin.tab': '手机号登录',
|
||||
'pages.login.phoneLogin.errorMessage': '验证码错误',
|
||||
'pages.login.phoneNumber.placeholder': '请输入手机号!',
|
||||
'pages.login.phoneNumber.required': '手机号是必填项!',
|
||||
'pages.login.phoneNumber.invalid': '不合法的手机号!',
|
||||
'pages.login.captcha.placeholder': '请输入验证码!',
|
||||
'pages.login.captcha.required': '验证码是必填项!',
|
||||
'pages.login.phoneLogin.getVerificationCode': '获取验证码',
|
||||
'pages.getCaptchaSecondText': '秒后重新获取',
|
||||
'pages.login.rememberMe': '自动登录',
|
||||
'pages.login.forgotPassword': '忘记密码 ?',
|
||||
'pages.login.submit': '登录',
|
||||
'pages.login.loginWith': '其他登录方式 :',
|
||||
'pages.login.registerAccount': '注册账户',
|
||||
'pages.welcome.link': '欢迎使用',
|
||||
'pages.welcome.alertMessage': '更快更强的重型组件,已经发布。',
|
||||
'pages.404.subTitle': '抱歉,您访问的页面不存在。',
|
||||
'pages.404.buttonText': '返回首页',
|
||||
'pages.admin.subPage.title': ' 这个页面只有 admin 权限才能查看',
|
||||
'pages.admin.subPage.alertMessage': 'umi ui 现已发布,欢迎使用 npm run ui 启动体验。',
|
||||
'pages.searchTable.createForm.newRule': '新建规则',
|
||||
'pages.searchTable.updateForm.ruleConfig': '规则配置',
|
||||
'pages.searchTable.updateForm.basicConfig': '基本信息',
|
||||
'pages.searchTable.updateForm.ruleName.nameLabel': '规则名称',
|
||||
'pages.searchTable.updateForm.ruleName.nameRules': '请输入规则名称!',
|
||||
'pages.searchTable.updateForm.ruleDesc.descLabel': '规则描述',
|
||||
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '请输入至少五个字符',
|
||||
'pages.searchTable.updateForm.ruleDesc.descRules': '请输入至少五个字符的规则描述!',
|
||||
'pages.searchTable.updateForm.ruleProps.title': '配置规则属性',
|
||||
'pages.searchTable.updateForm.object': '监控对象',
|
||||
'pages.searchTable.updateForm.ruleProps.templateLabel': '规则模板',
|
||||
'pages.searchTable.updateForm.ruleProps.typeLabel': '规则类型',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.title': '设定调度周期',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '开始时间',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeRules': '请选择开始时间!',
|
||||
'pages.searchTable.titleDesc': '描述',
|
||||
'pages.searchTable.ruleName': '规则名称为必填项',
|
||||
'pages.searchTable.titleCallNo': '服务调用次数',
|
||||
'pages.searchTable.titleStatus': '状态',
|
||||
'pages.searchTable.nameStatus.default': '关闭',
|
||||
'pages.searchTable.nameStatus.running': '运行中',
|
||||
'pages.searchTable.nameStatus.online': '已上线',
|
||||
'pages.searchTable.nameStatus.abnormal': '异常',
|
||||
'pages.searchTable.titleUpdatedAt': '上次调度时间',
|
||||
'pages.searchTable.exception': '请输入异常原因!',
|
||||
'pages.searchTable.titleOption': '操作',
|
||||
'pages.searchTable.config': '配置',
|
||||
'pages.searchTable.subscribeAlert': '订阅警报',
|
||||
'pages.searchTable.title': '查询表格',
|
||||
'pages.searchTable.new': '新建',
|
||||
'pages.searchTable.chosen': '已选择',
|
||||
'pages.searchTable.item': '项',
|
||||
'pages.searchTable.totalServiceCalls': '服务调用次数总计',
|
||||
'pages.searchTable.tenThousand': '万',
|
||||
'pages.searchTable.batchDeletion': '批量删除',
|
||||
'pages.searchTable.batchApproval': '批量审批',
|
||||
};
|
||||
6
src/locales/zh-CN/pwa.ts
Normal file
6
src/locales/zh-CN/pwa.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export default {
|
||||
'app.pwa.offline': '当前处于离线状态',
|
||||
'app.pwa.serviceworker.updated': '有新内容',
|
||||
'app.pwa.serviceworker.updated.hint': '请点击“刷新”按钮或者手动刷新页面',
|
||||
'app.pwa.serviceworker.updated.ok': '刷新',
|
||||
};
|
||||
31
src/locales/zh-CN/settingDrawer.ts
Normal file
31
src/locales/zh-CN/settingDrawer.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
export default {
|
||||
'app.setting.pagestyle': '整体风格设置',
|
||||
'app.setting.pagestyle.dark': '暗色菜单风格',
|
||||
'app.setting.pagestyle.light': '亮色菜单风格',
|
||||
'app.setting.content-width': '内容区域宽度',
|
||||
'app.setting.content-width.fixed': '定宽',
|
||||
'app.setting.content-width.fluid': '流式',
|
||||
'app.setting.themecolor': '主题色',
|
||||
'app.setting.themecolor.dust': '薄暮',
|
||||
'app.setting.themecolor.volcano': '火山',
|
||||
'app.setting.themecolor.sunset': '日暮',
|
||||
'app.setting.themecolor.cyan': '明青',
|
||||
'app.setting.themecolor.green': '极光绿',
|
||||
'app.setting.themecolor.daybreak': '拂晓蓝(默认)',
|
||||
'app.setting.themecolor.geekblue': '极客蓝',
|
||||
'app.setting.themecolor.purple': '酱紫',
|
||||
'app.setting.navigationmode': '导航模式',
|
||||
'app.setting.sidemenu': '侧边菜单布局',
|
||||
'app.setting.topmenu': '顶部菜单布局',
|
||||
'app.setting.fixedheader': '固定 Header',
|
||||
'app.setting.fixedsidebar': '固定侧边菜单',
|
||||
'app.setting.fixedsidebar.hint': '侧边菜单布局时可配置',
|
||||
'app.setting.hideheader': '下滑时隐藏 Header',
|
||||
'app.setting.hideheader.hint': '固定 Header 时可配置',
|
||||
'app.setting.othersettings': '其他设置',
|
||||
'app.setting.weakmode': '色弱模式',
|
||||
'app.setting.copy': '拷贝设置',
|
||||
'app.setting.copyinfo': '拷贝成功,请到 config/defaultSettings.js 中替换默认配置',
|
||||
'app.setting.production.hint':
|
||||
'配置栏只在开发环境用于预览,生产环境不会展现,请拷贝后手动修改配置文件',
|
||||
};
|
||||
55
src/locales/zh-CN/settings.ts
Normal file
55
src/locales/zh-CN/settings.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
export default {
|
||||
'app.settings.menuMap.basic': '基本设置',
|
||||
'app.settings.menuMap.security': '安全设置',
|
||||
'app.settings.menuMap.binding': '账号绑定',
|
||||
'app.settings.menuMap.notification': '新消息通知',
|
||||
'app.settings.basic.avatar': '头像',
|
||||
'app.settings.basic.change-avatar': '更换头像',
|
||||
'app.settings.basic.email': '邮箱',
|
||||
'app.settings.basic.email-message': '请输入您的邮箱!',
|
||||
'app.settings.basic.nickname': '昵称',
|
||||
'app.settings.basic.nickname-message': '请输入您的昵称!',
|
||||
'app.settings.basic.profile': '个人简介',
|
||||
'app.settings.basic.profile-message': '请输入个人简介!',
|
||||
'app.settings.basic.profile-placeholder': '个人简介',
|
||||
'app.settings.basic.country': '国家/地区',
|
||||
'app.settings.basic.country-message': '请输入您的国家或地区!',
|
||||
'app.settings.basic.geographic': '所在省市',
|
||||
'app.settings.basic.geographic-message': '请输入您的所在省市!',
|
||||
'app.settings.basic.address': '街道地址',
|
||||
'app.settings.basic.address-message': '请输入您的街道地址!',
|
||||
'app.settings.basic.phone': '联系电话',
|
||||
'app.settings.basic.phone-message': '请输入您的联系电话!',
|
||||
'app.settings.basic.update': '更新基本信息',
|
||||
'app.settings.security.strong': '强',
|
||||
'app.settings.security.medium': '中',
|
||||
'app.settings.security.weak': '弱',
|
||||
'app.settings.security.password': '账户密码',
|
||||
'app.settings.security.password-description': '当前密码强度',
|
||||
'app.settings.security.phone': '密保手机',
|
||||
'app.settings.security.phone-description': '已绑定手机',
|
||||
'app.settings.security.question': '密保问题',
|
||||
'app.settings.security.question-description': '未设置密保问题,密保问题可有效保护账户安全',
|
||||
'app.settings.security.email': '备用邮箱',
|
||||
'app.settings.security.email-description': '已绑定邮箱',
|
||||
'app.settings.security.mfa': 'MFA 设备',
|
||||
'app.settings.security.mfa-description': '未绑定 MFA 设备,绑定后,可以进行二次确认',
|
||||
'app.settings.security.modify': '修改',
|
||||
'app.settings.security.set': '设置',
|
||||
'app.settings.security.bind': '绑定',
|
||||
'app.settings.binding.taobao': '绑定淘宝',
|
||||
'app.settings.binding.taobao-description': '当前未绑定淘宝账号',
|
||||
'app.settings.binding.alipay': '绑定支付宝',
|
||||
'app.settings.binding.alipay-description': '当前未绑定支付宝账号',
|
||||
'app.settings.binding.dingding': '绑定钉钉',
|
||||
'app.settings.binding.dingding-description': '当前未绑定钉钉账号',
|
||||
'app.settings.binding.bind': '绑定',
|
||||
'app.settings.notification.password': '账户密码',
|
||||
'app.settings.notification.password-description': '其他用户的消息将以站内信的形式通知',
|
||||
'app.settings.notification.messages': '系统消息',
|
||||
'app.settings.notification.messages-description': '系统消息将以站内信的形式通知',
|
||||
'app.settings.notification.todo': '待办任务',
|
||||
'app.settings.notification.todo-description': '待办任务将以站内信的形式通知',
|
||||
'app.settings.open': '开',
|
||||
'app.settings.close': '关',
|
||||
};
|
||||
20
src/locales/zh-TW.ts
Normal file
20
src/locales/zh-TW.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import component from './zh-TW/component';
|
||||
import globalHeader from './zh-TW/globalHeader';
|
||||
import menu from './zh-TW/menu';
|
||||
import pwa from './zh-TW/pwa';
|
||||
import settingDrawer from './zh-TW/settingDrawer';
|
||||
import settings from './zh-TW/settings';
|
||||
|
||||
export default {
|
||||
'navBar.lang': '語言',
|
||||
'layout.user.link.help': '幫助',
|
||||
'layout.user.link.privacy': '隱私',
|
||||
'layout.user.link.terms': '條款',
|
||||
'app.preview.down.block': '下載此頁面到本地項目',
|
||||
...globalHeader,
|
||||
...menu,
|
||||
...settingDrawer,
|
||||
...settings,
|
||||
...pwa,
|
||||
...component,
|
||||
};
|
||||
5
src/locales/zh-TW/component.ts
Normal file
5
src/locales/zh-TW/component.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
'component.tagSelect.expand': '展開',
|
||||
'component.tagSelect.collapse': '收起',
|
||||
'component.tagSelect.all': '全部',
|
||||
};
|
||||
17
src/locales/zh-TW/globalHeader.ts
Normal file
17
src/locales/zh-TW/globalHeader.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
export default {
|
||||
'component.globalHeader.search': '站內搜索',
|
||||
'component.globalHeader.search.example1': '搜索提示壹',
|
||||
'component.globalHeader.search.example2': '搜索提示二',
|
||||
'component.globalHeader.search.example3': '搜索提示三',
|
||||
'component.globalHeader.help': '使用手冊',
|
||||
'component.globalHeader.notification': '通知',
|
||||
'component.globalHeader.notification.empty': '妳已查看所有通知',
|
||||
'component.globalHeader.message': '消息',
|
||||
'component.globalHeader.message.empty': '您已讀完所有消息',
|
||||
'component.globalHeader.event': '待辦',
|
||||
'component.globalHeader.event.empty': '妳已完成所有待辦',
|
||||
'component.noticeIcon.clear': '清空',
|
||||
'component.noticeIcon.cleared': '清空了',
|
||||
'component.noticeIcon.empty': '暫無資料',
|
||||
'component.noticeIcon.view-more': '查看更多',
|
||||
};
|
||||
52
src/locales/zh-TW/menu.ts
Normal file
52
src/locales/zh-TW/menu.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
export default {
|
||||
'menu.welcome': '歡迎',
|
||||
'menu.more-blocks': '更多區塊',
|
||||
'menu.home': '首頁',
|
||||
'menu.admin': '权限',
|
||||
'menu.admin.sub-page': '二级管理页',
|
||||
'menu.login': '登錄',
|
||||
'menu.register': '註冊',
|
||||
'menu.register-result': '註冊結果',
|
||||
'menu.dashboard': 'Dashboard',
|
||||
'menu.dashboard.analysis': '分析頁',
|
||||
'menu.dashboard.monitor': '監控頁',
|
||||
'menu.dashboard.workplace': '工作臺',
|
||||
'menu.exception.403': '403',
|
||||
'menu.exception.404': '404',
|
||||
'menu.exception.500': '500',
|
||||
'menu.form': '表單頁',
|
||||
'menu.form.basic-form': '基礎表單',
|
||||
'menu.form.step-form': '分步表單',
|
||||
'menu.form.step-form.info': '分步表單(填寫轉賬信息)',
|
||||
'menu.form.step-form.confirm': '分步表單(確認轉賬信息)',
|
||||
'menu.form.step-form.result': '分步表單(完成)',
|
||||
'menu.form.advanced-form': '高級表單',
|
||||
'menu.list': '列表頁',
|
||||
'menu.list.table-list': '查詢表格',
|
||||
'menu.list.basic-list': '標淮列表',
|
||||
'menu.list.card-list': '卡片列表',
|
||||
'menu.list.search-list': '搜索列表',
|
||||
'menu.list.search-list.articles': '搜索列表(文章)',
|
||||
'menu.list.search-list.projects': '搜索列表(項目)',
|
||||
'menu.list.search-list.applications': '搜索列表(應用)',
|
||||
'menu.profile': '詳情頁',
|
||||
'menu.profile.basic': '基礎詳情頁',
|
||||
'menu.profile.advanced': '高級詳情頁',
|
||||
'menu.result': '結果頁',
|
||||
'menu.result.success': '成功頁',
|
||||
'menu.result.fail': '失敗頁',
|
||||
'menu.exception': '异常页',
|
||||
'menu.exception.not-permission': '403',
|
||||
'menu.exception.not-find': '404',
|
||||
'menu.exception.server-error': '500',
|
||||
'menu.exception.trigger': '触发错误',
|
||||
'menu.account': '個人頁',
|
||||
'menu.account.center': '個人中心',
|
||||
'menu.account.settings': '個人設置',
|
||||
'menu.account.trigger': '觸發報錯',
|
||||
'menu.account.logout': '退出登錄',
|
||||
'menu.editor': '圖形編輯器',
|
||||
'menu.editor.flow': '流程編輯器',
|
||||
'menu.editor.mind': '腦圖編輯器',
|
||||
'menu.editor.koni': '拓撲編輯器',
|
||||
};
|
||||
67
src/locales/zh-TW/pages.ts
Normal file
67
src/locales/zh-TW/pages.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
export default {
|
||||
'pages.layouts.userLayout.title': 'Ant Design 是西湖區最具影響力的 Web 設計規範',
|
||||
'pages.login.accountLogin.tab': '賬戶密碼登錄',
|
||||
'pages.login.accountLogin.errorMessage': '錯誤的用戶名和密碼(admin/ant.design)',
|
||||
'pages.login.failure': '登錄失敗,請重試!',
|
||||
'pages.login.success': '登錄成功!',
|
||||
'pages.login.username.placeholder': '用戶名: admin or user',
|
||||
'pages.login.username.required': '用戶名是必填項!',
|
||||
'pages.login.password.placeholder': '密碼: ant.design',
|
||||
'pages.login.password.required': '密碼是必填項!',
|
||||
'pages.login.phoneLogin.tab': '手機號登錄',
|
||||
'pages.login.phoneLogin.errorMessage': '驗證碼錯誤',
|
||||
'pages.login.phoneNumber.placeholder': '請輸入手機號!',
|
||||
'pages.login.phoneNumber.required': '手機號是必填項!',
|
||||
'pages.login.phoneNumber.invalid': '不合法的手機號!',
|
||||
'pages.login.captcha.placeholder': '請輸入驗證碼!',
|
||||
'pages.login.captcha.required': '驗證碼是必填項!',
|
||||
'pages.login.phoneLogin.getVerificationCode': '獲取驗證碼',
|
||||
'pages.getCaptchaSecondText': '秒後重新獲取',
|
||||
'pages.login.rememberMe': '自動登錄',
|
||||
'pages.login.forgotPassword': '忘記密碼 ?',
|
||||
'pages.login.submit': '登錄',
|
||||
'pages.login.loginWith': '其他登錄方式 :',
|
||||
'pages.login.registerAccount': '註冊賬戶',
|
||||
'pages.welcome.link': '歡迎使用',
|
||||
'pages.welcome.alertMessage': '更快更強的重型組件,已經發布。',
|
||||
'pages.404.subTitle': '抱歉,您訪問的頁面不存在。',
|
||||
'pages.404.buttonText': '返回首頁',
|
||||
'pages.admin.subPage.title': '這個頁面只有 admin 權限才能查看',
|
||||
'pages.admin.subPage.alertMessage': 'umi ui 現已發佈,歡迎使用 npm run ui 啓動體驗。',
|
||||
'pages.searchTable.createForm.newRule': '新建規則',
|
||||
'pages.searchTable.updateForm.ruleConfig': '規則配置',
|
||||
'pages.searchTable.updateForm.basicConfig': '基本信息',
|
||||
'pages.searchTable.updateForm.ruleName.nameLabel': '規則名稱',
|
||||
'pages.searchTable.updateForm.ruleName.nameRules': '請輸入規則名稱!',
|
||||
'pages.searchTable.updateForm.ruleDesc.descLabel': '規則描述',
|
||||
'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '請輸入至少五個字符',
|
||||
'pages.searchTable.updateForm.ruleDesc.descRules': '請輸入至少五個字符的規則描述!',
|
||||
'pages.searchTable.updateForm.ruleProps.title': '配置規則屬性',
|
||||
'pages.searchTable.updateForm.object': '監控對象',
|
||||
'pages.searchTable.updateForm.ruleProps.templateLabel': '規則模板',
|
||||
'pages.searchTable.updateForm.ruleProps.typeLabel': '規則類型',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.title': '設定調度週期',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間',
|
||||
'pages.searchTable.updateForm.schedulingPeriod.timeRules': '請選擇開始時間!',
|
||||
'pages.searchTable.titleDesc': '描述',
|
||||
'pages.searchTable.ruleName': '規則名稱爲必填項',
|
||||
'pages.searchTable.titleCallNo': '服務調用次數',
|
||||
'pages.searchTable.titleStatus': '狀態',
|
||||
'pages.searchTable.nameStatus.default': '關閉',
|
||||
'pages.searchTable.nameStatus.running': '運行中',
|
||||
'pages.searchTable.nameStatus.online': '已上線',
|
||||
'pages.searchTable.nameStatus.abnormal': '異常',
|
||||
'pages.searchTable.titleUpdatedAt': '上次調度時間',
|
||||
'pages.searchTable.exception': '請輸入異常原因!',
|
||||
'pages.searchTable.titleOption': '操作',
|
||||
'pages.searchTable.config': '配置',
|
||||
'pages.searchTable.subscribeAlert': '訂閱警報',
|
||||
'pages.searchTable.title': '查詢表格',
|
||||
'pages.searchTable.new': '新建',
|
||||
'pages.searchTable.chosen': '已選擇',
|
||||
'pages.searchTable.item': '項',
|
||||
'pages.searchTable.totalServiceCalls': '服務調用次數總計',
|
||||
'pages.searchTable.tenThousand': '萬',
|
||||
'pages.searchTable.batchDeletion': '批量刪除',
|
||||
'pages.searchTable.batchApproval': '批量審批',
|
||||
};
|
||||
6
src/locales/zh-TW/pwa.ts
Normal file
6
src/locales/zh-TW/pwa.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export default {
|
||||
'app.pwa.offline': '當前處於離線狀態',
|
||||
'app.pwa.serviceworker.updated': '有新內容',
|
||||
'app.pwa.serviceworker.updated.hint': '請點擊“刷新”按鈕或者手動刷新頁面',
|
||||
'app.pwa.serviceworker.updated.ok': '刷新',
|
||||
};
|
||||
31
src/locales/zh-TW/settingDrawer.ts
Normal file
31
src/locales/zh-TW/settingDrawer.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
export default {
|
||||
'app.setting.pagestyle': '整體風格設置',
|
||||
'app.setting.pagestyle.dark': '暗色菜單風格',
|
||||
'app.setting.pagestyle.light': '亮色菜單風格',
|
||||
'app.setting.content-width': '內容區域寬度',
|
||||
'app.setting.content-width.fixed': '定寬',
|
||||
'app.setting.content-width.fluid': '流式',
|
||||
'app.setting.themecolor': '主題色',
|
||||
'app.setting.themecolor.dust': '薄暮',
|
||||
'app.setting.themecolor.volcano': '火山',
|
||||
'app.setting.themecolor.sunset': '日暮',
|
||||
'app.setting.themecolor.cyan': '明青',
|
||||
'app.setting.themecolor.green': '極光綠',
|
||||
'app.setting.themecolor.daybreak': '拂曉藍(默認)',
|
||||
'app.setting.themecolor.geekblue': '極客藍',
|
||||
'app.setting.themecolor.purple': '醬紫',
|
||||
'app.setting.navigationmode': '導航模式',
|
||||
'app.setting.sidemenu': '側邊菜單布局',
|
||||
'app.setting.topmenu': '頂部菜單布局',
|
||||
'app.setting.fixedheader': '固定 Header',
|
||||
'app.setting.fixedsidebar': '固定側邊菜單',
|
||||
'app.setting.fixedsidebar.hint': '側邊菜單布局時可配置',
|
||||
'app.setting.hideheader': '下滑時隱藏 Header',
|
||||
'app.setting.hideheader.hint': '固定 Header 時可配置',
|
||||
'app.setting.othersettings': '其他設置',
|
||||
'app.setting.weakmode': '色弱模式',
|
||||
'app.setting.copy': '拷貝設置',
|
||||
'app.setting.copyinfo': '拷貝成功,請到 config/defaultSettings.js 中替換默認配置',
|
||||
'app.setting.production.hint':
|
||||
'配置欄只在開發環境用於預覽,生產環境不會展現,請拷貝後手動修改配置文件',
|
||||
};
|
||||
55
src/locales/zh-TW/settings.ts
Normal file
55
src/locales/zh-TW/settings.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
export default {
|
||||
'app.settings.menuMap.basic': '基本設置',
|
||||
'app.settings.menuMap.security': '安全設置',
|
||||
'app.settings.menuMap.binding': '賬號綁定',
|
||||
'app.settings.menuMap.notification': '新消息通知',
|
||||
'app.settings.basic.avatar': '頭像',
|
||||
'app.settings.basic.change-avatar': '更換頭像',
|
||||
'app.settings.basic.email': '郵箱',
|
||||
'app.settings.basic.email-message': '請輸入您的郵箱!',
|
||||
'app.settings.basic.nickname': '昵稱',
|
||||
'app.settings.basic.nickname-message': '請輸入您的昵稱!',
|
||||
'app.settings.basic.profile': '個人簡介',
|
||||
'app.settings.basic.profile-message': '請輸入個人簡介!',
|
||||
'app.settings.basic.profile-placeholder': '個人簡介',
|
||||
'app.settings.basic.country': '國家/地區',
|
||||
'app.settings.basic.country-message': '請輸入您的國家或地區!',
|
||||
'app.settings.basic.geographic': '所在省市',
|
||||
'app.settings.basic.geographic-message': '請輸入您的所在省市!',
|
||||
'app.settings.basic.address': '街道地址',
|
||||
'app.settings.basic.address-message': '請輸入您的街道地址!',
|
||||
'app.settings.basic.phone': '聯系電話',
|
||||
'app.settings.basic.phone-message': '請輸入您的聯系電話!',
|
||||
'app.settings.basic.update': '更新基本信息',
|
||||
'app.settings.security.strong': '強',
|
||||
'app.settings.security.medium': '中',
|
||||
'app.settings.security.weak': '弱',
|
||||
'app.settings.security.password': '賬戶密碼',
|
||||
'app.settings.security.password-description': '當前密碼強度',
|
||||
'app.settings.security.phone': '密保手機',
|
||||
'app.settings.security.phone-description': '已綁定手機',
|
||||
'app.settings.security.question': '密保問題',
|
||||
'app.settings.security.question-description': '未設置密保問題,密保問題可有效保護賬戶安全',
|
||||
'app.settings.security.email': '備用郵箱',
|
||||
'app.settings.security.email-description': '已綁定郵箱',
|
||||
'app.settings.security.mfa': 'MFA 設備',
|
||||
'app.settings.security.mfa-description': '未綁定 MFA 設備,綁定後,可以進行二次確認',
|
||||
'app.settings.security.modify': '修改',
|
||||
'app.settings.security.set': '設置',
|
||||
'app.settings.security.bind': '綁定',
|
||||
'app.settings.binding.taobao': '綁定淘寶',
|
||||
'app.settings.binding.taobao-description': '當前未綁定淘寶賬號',
|
||||
'app.settings.binding.alipay': '綁定支付寶',
|
||||
'app.settings.binding.alipay-description': '當前未綁定支付寶賬號',
|
||||
'app.settings.binding.dingding': '綁定釘釘',
|
||||
'app.settings.binding.dingding-description': '當前未綁定釘釘賬號',
|
||||
'app.settings.binding.bind': '綁定',
|
||||
'app.settings.notification.password': '賬戶密碼',
|
||||
'app.settings.notification.password-description': '其他用戶的消息將以站內信的形式通知',
|
||||
'app.settings.notification.messages': '系統消息',
|
||||
'app.settings.notification.messages-description': '系統消息將以站內信的形式通知',
|
||||
'app.settings.notification.todo': '待辦任務',
|
||||
'app.settings.notification.todo-description': '待辦任務將以站內信的形式通知',
|
||||
'app.settings.open': '開',
|
||||
'app.settings.close': '關',
|
||||
};
|
||||
22
src/manifest.json
Normal file
22
src/manifest.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "Ant Design Pro",
|
||||
"short_name": "Ant Design Pro",
|
||||
"display": "standalone",
|
||||
"start_url": "./?utm_source=homescreen",
|
||||
"theme_color": "#002140",
|
||||
"background_color": "#001529",
|
||||
"icons": [
|
||||
{
|
||||
"src": "icons/icon-192x192.png",
|
||||
"sizes": "192x192"
|
||||
},
|
||||
{
|
||||
"src": "icons/icon-128x128.png",
|
||||
"sizes": "128x128"
|
||||
},
|
||||
{
|
||||
"src": "icons/icon-512x512.png",
|
||||
"sizes": "512x512"
|
||||
}
|
||||
]
|
||||
}
|
||||
18
src/pages/404.tsx
Normal file
18
src/pages/404.tsx
Normal file
@@ -0,0 +1,18 @@
|
||||
import { history, useIntl } from '@umijs/max';
|
||||
import { Button, Result } from 'antd';
|
||||
import React from 'react';
|
||||
|
||||
const NoFoundPage: React.FC = () => (
|
||||
<Result
|
||||
status="404"
|
||||
title="404"
|
||||
subTitle={useIntl().formatMessage({ id: 'pages.404.subTitle' })}
|
||||
extra={
|
||||
<Button type="primary" onClick={() => history.push('/')}>
|
||||
{useIntl().formatMessage({ id: 'pages.404.buttonText' })}
|
||||
</Button>
|
||||
}
|
||||
/>
|
||||
);
|
||||
|
||||
export default NoFoundPage;
|
||||
45
src/pages/Admin.tsx
Normal file
45
src/pages/Admin.tsx
Normal file
@@ -0,0 +1,45 @@
|
||||
import { HeartTwoTone, SmileTwoTone } from '@ant-design/icons';
|
||||
import { PageContainer } from '@ant-design/pro-components';
|
||||
import { useIntl } from '@umijs/max';
|
||||
import { Alert, Card, Typography } from 'antd';
|
||||
import React from 'react';
|
||||
|
||||
const Admin: React.FC = () => {
|
||||
const intl = useIntl();
|
||||
return (
|
||||
<PageContainer
|
||||
content={intl.formatMessage({
|
||||
id: 'pages.admin.subPage.title',
|
||||
defaultMessage: 'This page can only be viewed by admin',
|
||||
})}
|
||||
>
|
||||
<Card>
|
||||
<Alert
|
||||
message={intl.formatMessage({
|
||||
id: 'pages.welcome.alertMessage',
|
||||
defaultMessage: 'Faster and stronger heavy-duty components have been released.',
|
||||
})}
|
||||
type="success"
|
||||
showIcon
|
||||
banner
|
||||
style={{
|
||||
margin: -12,
|
||||
marginBottom: 48,
|
||||
}}
|
||||
/>
|
||||
<Typography.Title level={2} style={{ textAlign: 'center' }}>
|
||||
<SmileTwoTone /> Ant Design Pro <HeartTwoTone twoToneColor="#eb2f96" /> You
|
||||
</Typography.Title>
|
||||
</Card>
|
||||
<p style={{ textAlign: 'center', marginTop: 24 }}>
|
||||
Want to add more pages? Please refer to{' '}
|
||||
<a href="https://pro.ant.design/docs/block-cn" target="_blank" rel="noopener noreferrer">
|
||||
use block
|
||||
</a>
|
||||
。
|
||||
</p>
|
||||
</PageContainer>
|
||||
);
|
||||
};
|
||||
|
||||
export default Admin;
|
||||
164
src/pages/Welcome.tsx
Normal file
164
src/pages/Welcome.tsx
Normal file
@@ -0,0 +1,164 @@
|
||||
import { PageContainer } from '@ant-design/pro-components';
|
||||
import { useModel } from '@umijs/max';
|
||||
import { Card, theme } from 'antd';
|
||||
import React from 'react';
|
||||
|
||||
/**
|
||||
* 每个单独的卡片,为了复用样式抽成了组件
|
||||
* @param param0
|
||||
* @returns
|
||||
*/
|
||||
const InfoCard: React.FC<{
|
||||
title: string;
|
||||
index: number;
|
||||
desc: string;
|
||||
href: string;
|
||||
}> = ({ title, href, index, desc }) => {
|
||||
const { useToken } = theme;
|
||||
|
||||
const { token } = useToken();
|
||||
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
backgroundColor: token.colorBgContainer,
|
||||
boxShadow: token.boxShadow,
|
||||
borderRadius: '8px',
|
||||
fontSize: '14px',
|
||||
color: token.colorTextSecondary,
|
||||
lineHeight: '22px',
|
||||
padding: '16px 19px',
|
||||
minWidth: '220px',
|
||||
flex: 1,
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
display: 'flex',
|
||||
gap: '4px',
|
||||
alignItems: 'center',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
width: 48,
|
||||
height: 48,
|
||||
lineHeight: '22px',
|
||||
backgroundSize: '100%',
|
||||
textAlign: 'center',
|
||||
padding: '8px 16px 16px 12px',
|
||||
color: '#FFF',
|
||||
fontWeight: 'bold',
|
||||
backgroundImage:
|
||||
"url('https://gw.alipayobjects.com/zos/bmw-prod/daaf8d50-8e6d-4251-905d-676a24ddfa12.svg')",
|
||||
}}
|
||||
>
|
||||
{index}
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
fontSize: '16px',
|
||||
color: token.colorText,
|
||||
paddingBottom: 8,
|
||||
}}
|
||||
>
|
||||
{title}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
fontSize: '14px',
|
||||
color: token.colorTextSecondary,
|
||||
textAlign: 'justify',
|
||||
lineHeight: '22px',
|
||||
marginBottom: 8,
|
||||
}}
|
||||
>
|
||||
{desc}
|
||||
</div>
|
||||
<a href={href} target="_blank" rel="noreferrer">
|
||||
了解更多 {'>'}
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const Welcome: React.FC = () => {
|
||||
const { token } = theme.useToken();
|
||||
const { initialState } = useModel('@@initialState');
|
||||
return (
|
||||
<PageContainer>
|
||||
<Card
|
||||
style={{
|
||||
borderRadius: 8,
|
||||
}}
|
||||
bodyStyle={{
|
||||
backgroundImage:
|
||||
initialState?.settings?.navTheme === 'realDark'
|
||||
? 'background-image: linear-gradient(75deg, #1A1B1F 0%, #191C1F 100%)'
|
||||
: 'background-image: linear-gradient(75deg, #FBFDFF 0%, #F5F7FF 100%)',
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
backgroundPosition: '100% -30%',
|
||||
backgroundRepeat: 'no-repeat',
|
||||
backgroundSize: '274px auto',
|
||||
backgroundImage:
|
||||
"url('https://gw.alipayobjects.com/mdn/rms_a9745b/afts/img/A*BuFmQqsB2iAAAAAAAAAAAAAAARQnAQ')",
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
fontSize: '20px',
|
||||
color: token.colorTextHeading,
|
||||
}}
|
||||
>
|
||||
欢迎使用 Ant Design Pro
|
||||
</div>
|
||||
<p
|
||||
style={{
|
||||
fontSize: '14px',
|
||||
color: token.colorTextSecondary,
|
||||
lineHeight: '22px',
|
||||
marginTop: 16,
|
||||
marginBottom: 32,
|
||||
width: '65%',
|
||||
}}
|
||||
>
|
||||
Ant Design Pro 是一个整合了 umi,Ant Design 和 ProComponents
|
||||
的脚手架方案。致力于在设计规范和基础组件的基础上,继续向上构建,提炼出典型模板/业务组件/配套设计资源,进一步提升企业级中后台产品设计研发过程中的『用户』和『设计者』的体验。
|
||||
</p>
|
||||
<div
|
||||
style={{
|
||||
display: 'flex',
|
||||
flexWrap: 'wrap',
|
||||
gap: 16,
|
||||
}}
|
||||
>
|
||||
<InfoCard
|
||||
index={1}
|
||||
href="https://umijs.org/docs/introduce/introduce"
|
||||
title="了解 umi"
|
||||
desc="umi 是一个可扩展的企业级前端应用框架,umi 以路由为基础的,同时支持配置式路由和约定式路由,保证路由的功能完备,并以此进行功能扩展。"
|
||||
/>
|
||||
<InfoCard
|
||||
index={2}
|
||||
title="了解 ant design"
|
||||
href="https://ant.design"
|
||||
desc="antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。"
|
||||
/>
|
||||
<InfoCard
|
||||
index={3}
|
||||
title="了解 Pro Components"
|
||||
href="https://procomponents.ant.design"
|
||||
desc="ProComponents 是一个基于 Ant Design 做了更高抽象的模板组件,以 一个组件就是一个页面为开发理念,为中后台开发带来更好的体验。"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
</PageContainer>
|
||||
);
|
||||
};
|
||||
|
||||
export default Welcome;
|
||||
134
src/pages/config/agreement/edit.tsx
Normal file
134
src/pages/config/agreement/edit.tsx
Normal file
@@ -0,0 +1,134 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import {
|
||||
ProForm,
|
||||
ProFormDigit,
|
||||
ProFormText
|
||||
} from '@ant-design/pro-components';
|
||||
import { Form, Modal } from 'antd';
|
||||
import { useIntl } from '@umijs/max';
|
||||
|
||||
import FilesManager from '@/components/FilesManage/index';
|
||||
import { ContentUtils } from 'braft-utils'
|
||||
// 引入编辑器组件
|
||||
import BraftEditor from 'braft-editor'
|
||||
// 引入编辑器样式
|
||||
import 'braft-editor/dist/index.css'
|
||||
|
||||
const agreementForm: React.FC = (props: any) => {
|
||||
|
||||
const [editorState, setEditorState] = useState(BraftEditor.createEditorState(''))
|
||||
|
||||
const [form] = Form.useForm();
|
||||
|
||||
const { values } = props;
|
||||
|
||||
useEffect(() => {
|
||||
setEditorState(BraftEditor.createEditorState(values.protocolContent ? values.protocolContent : ''))
|
||||
form.resetFields();
|
||||
form.setFieldsValue(values);
|
||||
}, [form, props]);
|
||||
|
||||
const handleOk = () => {
|
||||
form.submit();
|
||||
};
|
||||
const handleCancel = () => {
|
||||
props.onCancel();
|
||||
};
|
||||
const handleFinish = async (values: any) => {
|
||||
let data = JSON.parse(JSON.stringify(values))
|
||||
data.protocolContent = editorState.toHTML()
|
||||
props.onSubmit(data);
|
||||
};
|
||||
|
||||
|
||||
const controls = [
|
||||
'undo', 'redo', 'separator',
|
||||
'font-size', 'line-height', 'letter-spacing', 'separator',
|
||||
'text-color', 'bold', 'italic', 'underline', 'strike-through', 'separator',
|
||||
'superscript', 'subscript', 'remove-styles', 'emoji', 'separator', 'text-indent', 'text-align', 'separator',
|
||||
'headings', 'list-ul', 'list-ol', 'blockquote', 'code', 'separator',
|
||||
'link', 'separator', 'hr', 'separator',
|
||||
'clear'
|
||||
]
|
||||
|
||||
const onChange = async (e) => {
|
||||
const videoExtensions = ['.mp4', '.mkv', '.avi', '.mov', '.wmv', '.flv', '.webm', '.m4v', '.3gp', '.3g2'];
|
||||
// 将URL转换为小写,以便进行不区分大小写的比较
|
||||
const lowerCaseUrl = e.toLowerCase();
|
||||
// 检查链接是否以任何一个视频扩展名结尾
|
||||
if (videoExtensions.some(e => lowerCaseUrl.endsWith(e))) {
|
||||
setEditorState(ContentUtils.insertMedias(editorState, [{
|
||||
type: 'VIDEO',
|
||||
url: e
|
||||
}]));
|
||||
} else {
|
||||
setEditorState(ContentUtils.insertMedias(editorState, [{ type: 'IMAGE', url: e, },]))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const extendControls = [
|
||||
'separator',
|
||||
{
|
||||
key: 'FilesManagerImage', // 控件唯一标识,必传
|
||||
title: '上传图片/视频', // 指定鼠标悬停提示文案
|
||||
html: null, // 指定在按钮中渲染的html字符串
|
||||
text: <FilesManager
|
||||
fileType="image"
|
||||
mode=""
|
||||
imagesShow={false}
|
||||
onChange={onChange}
|
||||
count={1}
|
||||
/>, // 指定按钮文字,此处可传入jsx,若已指定html,则text不会显示
|
||||
onClick: () => {
|
||||
console.log('Hello World!');
|
||||
},
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
return (
|
||||
<Modal
|
||||
width={1200}
|
||||
title={'协议内容'}
|
||||
open={props.open}
|
||||
forceRender
|
||||
destroyOnClose
|
||||
onOk={handleOk}
|
||||
onCancel={handleCancel}
|
||||
>
|
||||
<ProForm
|
||||
form={form}
|
||||
submitter={false}
|
||||
layout="horizontal"
|
||||
onFinish={handleFinish}>
|
||||
<ProFormDigit
|
||||
name="id"
|
||||
label={'ID'}
|
||||
disabled
|
||||
hidden={true}
|
||||
/>
|
||||
<ProFormText
|
||||
width={300}
|
||||
name="protocolName"
|
||||
label="协议名称"
|
||||
placeholder="协议名称"
|
||||
rules={[{ required: true, message: '请输入' }]}
|
||||
/>
|
||||
<ProForm.Group>
|
||||
<ProForm.Item
|
||||
name="protocolContent"
|
||||
>
|
||||
<div className="border-solid border-2 border-indigo-600">
|
||||
<BraftEditor value={editorState} controls={controls} extendControls={extendControls} onChange={(val) => {
|
||||
setEditorState(val)
|
||||
}} />
|
||||
</div>
|
||||
</ProForm.Item>
|
||||
</ProForm.Group>
|
||||
</ProForm>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
export default agreementForm;
|
||||
215
src/pages/config/agreement/index.tsx
Normal file
215
src/pages/config/agreement/index.tsx
Normal file
@@ -0,0 +1,215 @@
|
||||
import { protocolUpdate, protocolPage, protocolAdd, protocolDelete, protocolInfo } from '@/services/config/agreement';
|
||||
|
||||
|
||||
import React, { useState, useRef, useEffect } from 'react';
|
||||
import { useIntl, FormattedMessage, useAccess } from '@umijs/max';
|
||||
import { Button, message, Modal, Image } from 'antd';
|
||||
import { ActionType, FooterToolbar, PageContainer, ProColumns, ProTable } from '@ant-design/pro-components';
|
||||
import { PlusOutlined, DeleteOutlined, ExclamationCircleOutlined } from '@ant-design/icons';
|
||||
import UpdateForm from './edit';
|
||||
import { DataNode } from 'antd/es/tree';
|
||||
|
||||
/**
|
||||
* 添加节点
|
||||
*
|
||||
* @param fields
|
||||
*/
|
||||
const handleAdd = async (fields) => {
|
||||
const hide = message.loading('正在添加');
|
||||
try {
|
||||
await protocolAdd({ ...fields });
|
||||
hide();
|
||||
message.success('添加成功');
|
||||
return true;
|
||||
} catch (error) {
|
||||
hide();
|
||||
message.error('添加失败请重试!');
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 更新节点
|
||||
*
|
||||
* @param fields
|
||||
*/
|
||||
const handleUpdate = async (fields: API.System.Menu) => {
|
||||
const hide = message.loading('正在修改');
|
||||
try {
|
||||
await protocolUpdate(fields);
|
||||
hide();
|
||||
message.success('修改成功');
|
||||
return true;
|
||||
} catch (error) {
|
||||
hide();
|
||||
message.error('修改失败请重试!');
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
const handleRemoveOne = async (selectedRow: API.System.Menu) => {
|
||||
const hide = message.loading('正在删除');
|
||||
if (!selectedRow) return true;
|
||||
try {
|
||||
const params = [selectedRow.id];
|
||||
await protocolDelete(params);
|
||||
hide();
|
||||
message.success('删除成功');
|
||||
return true;
|
||||
} catch (error) {
|
||||
hide();
|
||||
message.error('删除失败,请重试');
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const MenuTableList: React.FC = () => {
|
||||
|
||||
const [modalVisible, setModalVisible] = useState<boolean>(false);
|
||||
|
||||
|
||||
const actionRef = useRef<ActionType>();
|
||||
const [currentRow, setCurrentRow] = useState();
|
||||
const access = useAccess();
|
||||
|
||||
/** 国际化配置 */
|
||||
const intl = useIntl();
|
||||
|
||||
useEffect(() => {
|
||||
}, []);
|
||||
|
||||
const columns = [
|
||||
{
|
||||
title: 'ID',
|
||||
dataIndex: 'id',
|
||||
valueType: 'text',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
title: '协议名称',
|
||||
dataIndex: 'protocolName',
|
||||
valueType: 'text',
|
||||
search: true,
|
||||
},
|
||||
{
|
||||
title: '修改时间',
|
||||
dataIndex: 'updateTime',
|
||||
valueType: 'text',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
dataIndex: 'createTime',
|
||||
valueType: 'text',
|
||||
search: false,
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
dataIndex: 'option',
|
||||
width: '220px',
|
||||
valueType: 'option',
|
||||
render: (_, record) => [
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
// hidden={!access.hasPerms('/api/protocol/update')}
|
||||
onClick={async () => {
|
||||
let { data } = await protocolInfo({ id: record.id })
|
||||
setCurrentRow(data);
|
||||
setModalVisible(true);
|
||||
}}
|
||||
>
|
||||
编辑
|
||||
</Button>,
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
danger
|
||||
// hidden={!access.hasPerms('/api/protocol/deleteBatchByIds')}
|
||||
onClick={async () => {
|
||||
Modal.confirm({
|
||||
title: '删除',
|
||||
content: '确定删除该项吗?',
|
||||
okText: '确认',
|
||||
cancelText: '取消',
|
||||
onOk: async () => {
|
||||
const success = await handleRemoveOne(record);
|
||||
if (success) {
|
||||
if (actionRef.current) {
|
||||
actionRef.current.reload();
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
}}
|
||||
>
|
||||
删除
|
||||
</Button>,
|
||||
],
|
||||
},
|
||||
|
||||
];
|
||||
|
||||
return (
|
||||
<PageContainer>
|
||||
<div style={{ width: '100%', float: 'right' }}>
|
||||
<ProTable<API.System.Menu>
|
||||
headerTitle={'菜单管理'}
|
||||
actionRef={actionRef}
|
||||
rowKey="id"
|
||||
key="menuList"
|
||||
search={{
|
||||
labelWidth: 120,
|
||||
}}
|
||||
toolBarRender={() => [
|
||||
<Button
|
||||
type="primary"
|
||||
key="add"
|
||||
// hidden={!access.hasPerms('/api/protocol/add')}
|
||||
onClick={async () => {
|
||||
setCurrentRow(undefined);
|
||||
setModalVisible(true);
|
||||
}}
|
||||
>
|
||||
<PlusOutlined /> 新建
|
||||
</Button>
|
||||
]}
|
||||
request={async (params, sorter, filter) => {
|
||||
let { data } = await protocolPage(params)
|
||||
return {
|
||||
data: data?.records || [],
|
||||
total: data?.total,
|
||||
};
|
||||
}}
|
||||
columns={columns}
|
||||
/>
|
||||
</div>
|
||||
<UpdateForm
|
||||
onSubmit={async (values) => {
|
||||
let success = false;
|
||||
if (values.id) {
|
||||
success = await handleUpdate({ ...values });
|
||||
} else {
|
||||
success = await handleAdd({ ...values });
|
||||
}
|
||||
if (success) {
|
||||
setModalVisible(false);
|
||||
setCurrentRow(undefined);
|
||||
if (actionRef.current) {
|
||||
actionRef.current.reload();
|
||||
}
|
||||
}
|
||||
}}
|
||||
onCancel={() => {
|
||||
setModalVisible(false);
|
||||
setCurrentRow(undefined);
|
||||
}}
|
||||
open={modalVisible}
|
||||
values={currentRow || {}}
|
||||
/>
|
||||
</PageContainer>
|
||||
);
|
||||
};
|
||||
|
||||
export default MenuTableList;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user