From ae87ffacca55bddcdac74125acbcf5fc73f754f4 Mon Sep 17 00:00:00 2001 From: jiangfeng Date: Tue, 21 Jul 2020 14:48:38 +0800 Subject: [PATCH 1/2] i18n route --- src/pages/Route/Create.tsx | 5 +- src/pages/Route/List.tsx | 32 +++-- .../components/CreateStep4/CreateStep4.tsx | 10 +- .../components/ResultView/ResultView.tsx | 19 ++- .../components/Step1/MatchingRulesView.tsx | 77 +++++----- src/pages/Route/components/Step1/MetaView.tsx | 18 +-- .../components/Step1/RequestConfigView.tsx | 53 +++---- .../Step2/HttpHeaderRewriteView.tsx | 42 +++--- .../components/Step2/RequestRewriteView.tsx | 58 ++++---- src/pages/Route/locales/en-US.ts | 136 ++++++++++++++++++ src/pages/Route/locales/zh-CN.ts | 136 ++++++++++++++++++ 11 files changed, 442 insertions(+), 144 deletions(-) diff --git a/src/pages/Route/Create.tsx b/src/pages/Route/Create.tsx index ee612caa00..b3456e10bd 100644 --- a/src/pages/Route/Create.tsx +++ b/src/pages/Route/Create.tsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from 'react'; import { Card, Steps, Form } from 'antd'; import { PageHeaderWrapper } from '@ant-design/pro-layout'; +import { useIntl } from 'umi'; import ActionBar from '@/components/ActionBar'; import PluginPage from '@/components/PluginPage'; @@ -64,6 +65,8 @@ const Page: React.FC = (props) => { setStep3Data(data.step3Data); }); + const { formatMessage } = useIntl(); + useEffect(() => { if (props.route.path.indexOf('edit') !== -1) { setupRoute(props.match.params.rid); @@ -208,7 +211,7 @@ const Page: React.FC = (props) => { return ( <> - + {stepHeader.map((item) => ( diff --git a/src/pages/Route/List.tsx b/src/pages/Route/List.tsx index b91cdfe84a..ed19a40a7a 100644 --- a/src/pages/Route/List.tsx +++ b/src/pages/Route/List.tsx @@ -5,20 +5,22 @@ import { Button, Popconfirm, notification, Tag, Input } from 'antd'; import { PlusOutlined } from '@ant-design/icons'; import moment from 'moment'; import { history } from 'umi'; +import { useIntl } from 'umi'; import { fetchList, remove } from './service'; const Page: React.FC = () => { const ref = useRef(); const [search, setSearch] = useState(''); + const { formatMessage } = useIntl(); const columns: ProColumns[] = [ { - title: '名称', + title: formatMessage({ id: 'route.list.name' }), dataIndex: 'name', }, { - title: '域名', + title: formatMessage({ id: 'route.list.domain.name' }), dataIndex: 'hosts', render: (_, record) => record.hosts.map((host) => ( @@ -28,7 +30,7 @@ const Page: React.FC = () => { )), }, { - title: '路径', + title: formatMessage({ id: 'route.list.path' }), dataIndex: 'uri', render: (_, record) => record.uris.map((uri) => ( @@ -42,16 +44,16 @@ const Page: React.FC = () => { // dataIndex: 'priority', // }, { - title: '描述', + title: formatMessage({ id: 'route.list.description' }), dataIndex: 'description', }, { - title: '更新时间', + title: formatMessage({ id: 'route.list.edit.time' }), dataIndex: 'update_time', render: (text) => `${moment.unix(Number(text)).format('YYYY-MM-DD HH:mm:ss')}`, }, { - title: '操作', + title: formatMessage({ id: 'route.list.operation' }), valueType: 'option', render: (_, record) => ( <> @@ -60,22 +62,22 @@ const Page: React.FC = () => { onClick={() => history.push(`/routes/${record.id}/edit`)} style={{ marginRight: 10 }} > - 编辑 + {formatMessage({ id: 'route.list.edit' })} { remove(record.id!).then(() => { - notification.success({ message: '删除记录成功' }); + notification.success({ message: formatMessage({ id: 'route.list.delete.success' }) }); /* eslint-disable no-unused-expressions */ ref.current?.reload(); }); }} - okText="确定" - cancelText="取消" + okText={formatMessage({ id: 'route.list.confirm' })} + cancelText={formatMessage({ id: 'route.list.cancel' })} > @@ -84,7 +86,7 @@ const Page: React.FC = () => { ]; return ( - + actionRef={ref} rowKey="name" @@ -93,7 +95,7 @@ const Page: React.FC = () => { request={(params) => fetchList(params, search)} toolBarRender={(action) => [ { setSearch(value); action.setPageInfo({ page: 1 }); @@ -102,7 +104,7 @@ const Page: React.FC = () => { />, , ]} /> diff --git a/src/pages/Route/components/CreateStep4/CreateStep4.tsx b/src/pages/Route/components/CreateStep4/CreateStep4.tsx index 522995abfe..dc3131a8e4 100644 --- a/src/pages/Route/components/CreateStep4/CreateStep4.tsx +++ b/src/pages/Route/components/CreateStep4/CreateStep4.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { FormInstance } from 'antd/lib/form'; +import { useIntl } from 'umi'; import PluginPage from '@/components/PluginPage'; @@ -17,15 +18,18 @@ const style = { }; const CreateStep4: React.FC = ({ form1, form2, redirect, ...rest }) => { + + const { formatMessage } = useIntl(); + return ( <> -

定义 API 请求

+

{formatMessage({ id: 'route.create.define.api.request' })}

{!redirect && ( <> -

定义 API 后端服务

+

{formatMessage({ id: 'route.create.define.api.backend.server' })}

-

插件配置

+

{formatMessage({ id: 'route.create.plugin.configuration' })}

)} diff --git a/src/pages/Route/components/ResultView/ResultView.tsx b/src/pages/Route/components/ResultView/ResultView.tsx index 1283799fb7..f14d1b9033 100644 --- a/src/pages/Route/components/ResultView/ResultView.tsx +++ b/src/pages/Route/components/ResultView/ResultView.tsx @@ -1,24 +1,31 @@ import React from 'react'; import { Result, Button } from 'antd'; import { history } from 'umi'; +import { useIntl } from 'umi'; type Props = { onReset?(): void; }; -const ResultView: React.FC = () => ( - = () => { + + const { formatMessage } = useIntl(); + + return( + history.replace('/routes/list')}> - 返回路由列表 + {formatMessage({ id: 'route.result.return.list' })} , , ]} /> -); + ); + +}; export default ResultView; diff --git a/src/pages/Route/components/Step1/MatchingRulesView.tsx b/src/pages/Route/components/Step1/MatchingRulesView.tsx index 7b85d2c63d..6c6694ed70 100644 --- a/src/pages/Route/components/Step1/MatchingRulesView.tsx +++ b/src/pages/Route/components/Step1/MatchingRulesView.tsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; import { Button, Table, Modal, Form, Select, Input, Space } from 'antd'; +import { useIntl } from 'umi'; import PanelSection from '@/components/PanelSection'; @@ -15,6 +16,8 @@ const MatchingRulesView: React.FC = ({ data, disabled, onChange }) => { const { Option } = Select; + const { formatMessage } = useIntl(); + const onOk = () => { modalForm.validateFields().then((value) => { if (mode === 'EDIT') { @@ -55,16 +58,16 @@ const MatchingRulesView: React.FC = ({ data, disabled, onChange }) => { const columns = [ { - title: '参数位置', + title: formatMessage({ id: 'route.match.parameter.position' }), key: 'position', render: (text: RouteModule.MatchingRule) => { let renderText; switch (text.position) { case 'http': - renderText = 'HTTP 请求头'; + renderText = formatMessage({ id: 'route.match.http.request.header' }); break; case 'arg': - renderText = '请求参数'; + renderText = formatMessage({ id: 'route.match.request.parameter' }); break; case 'cookie': renderText = 'Cookie'; @@ -76,30 +79,30 @@ const MatchingRulesView: React.FC = ({ data, disabled, onChange }) => { }, }, { - title: '参数名称', + title: formatMessage({ id: 'route.match.parameter.name' }), dataIndex: 'name', key: 'name', }, { - title: '运算符', + title: formatMessage({ id: 'route.match.operational.character' }), key: 'operator', render: (text: RouteModule.MatchingRule) => { let renderText; switch (text.operator) { case '==': - renderText = '等于'; + renderText = formatMessage({ id: 'route.match.equal' }); break; case '~=': - renderText = '不等于'; + renderText = formatMessage({ id: 'route.match.unequal' }); break; case '>': - renderText = '大于'; + renderText = formatMessage({ id: 'route.match.greater.than' }); break; case '<': - renderText = '小于'; + renderText = formatMessage({ id: 'route.match.less.than' }); break; case '~~': - renderText = '正则匹配'; + renderText = formatMessage({ id: 'route.match.regex.match' }); break; default: renderText = ''; @@ -108,19 +111,19 @@ const MatchingRulesView: React.FC = ({ data, disabled, onChange }) => { }, }, { - title: '参数值', + title: formatMessage({ id: 'route.match.parameter.value' }), dataIndex: 'value', key: 'value', }, disabled ? {} : { - title: '操作', + title: formatMessage({ id: 'route.match.operation' }), key: 'action', render: (_: any, record: RouteModule.MatchingRule) => ( - handleEdit(record)}>编辑 - handleRemove(record.key)}>删除 + handleEdit(record)}>{formatMessage({ id: 'route.match.edit' })} + handleRemove(record.key)}>{formatMessage({ id: 'route.match.delete' })} ), }, @@ -128,7 +131,7 @@ const MatchingRulesView: React.FC = ({ data, disabled, onChange }) => { const renderModal = () => ( = ({ data, disabled, onChange }) => { setVisible(false); modalForm.resetFields(); }} - okText="确定" - cancelText="取消" + okText={formatMessage({ id: 'route.match.confirm' })} + cancelText={formatMessage({ id: 'route.match.cancel' })} destroyOnClose >
- + @@ -195,7 +198,7 @@ const MatchingRulesView: React.FC = ({ data, disabled, onChange }) => { ); return ( - + {!disabled && ( )} diff --git a/src/pages/Route/components/Step1/MetaView.tsx b/src/pages/Route/components/Step1/MetaView.tsx index d49ea26782..5e5e109195 100644 --- a/src/pages/Route/components/Step1/MetaView.tsx +++ b/src/pages/Route/components/Step1/MetaView.tsx @@ -1,30 +1,32 @@ import React from 'react'; import Form from 'antd/es/form'; import { Input } from 'antd'; +import { useIntl } from 'umi'; import PanelSection from '@/components/PanelSection'; interface Props extends RouteModule.Data {} const MetaView: React.FC = ({ disabled }) => { + const { formatMessage } = useIntl(); return ( - + - + - - + + ); diff --git a/src/pages/Route/components/Step1/RequestConfigView.tsx b/src/pages/Route/components/Step1/RequestConfigView.tsx index 25b076a0cd..f5b8156d80 100644 --- a/src/pages/Route/components/Step1/RequestConfigView.tsx +++ b/src/pages/Route/components/Step1/RequestConfigView.tsx @@ -3,6 +3,7 @@ import Form from 'antd/es/form'; import { Checkbox, Button, Input, Switch, Select, Row, Col } from 'antd'; import { PlusOutlined, MinusCircleOutlined } from '@ant-design/icons'; import { CheckboxValueType } from 'antd/lib/checkbox/Group'; +import { useIntl } from 'umi'; import { HTTP_METHOD_OPTION_LIST, @@ -21,6 +22,7 @@ const RequestConfigView: React.FC = ({ data, disabled, onChange }) => { if (!e.includes('http') && !e.includes('https')) return; onChange({ ...data.step1Data, protocols: e }); }; + const { formatMessage } = useIntl(); const renderHosts = () => ( {(fields, { add, remove }) => { @@ -29,10 +31,10 @@ const RequestConfigView: React.FC = ({ data, disabled, onChange }) => { {fields.map((field, index) => ( = ({ data, disabled, onChange }) => { { required: true, whitespace: true, - message: '请输入域名', + message: formatMessage({ id: 'route.request.config.input.domain.name' }), }, { pattern: new RegExp(/(^\*?[a-zA-Z0-9._-]+$|^\*$)/, 'g'), - message: '仅支持英文、数字、* (*只能是在开头位置),支持单个 *', + message: formatMessage({ id: 'route.request.config.domain.name.rule' }), }, ]} noStyle > - + {!disabled && fields.length > 1 ? ( = ({ data, disabled, onChange }) => { add(); }} > - 新建 + {formatMessage({ id: 'route.request.config.create' })} )} @@ -89,16 +91,15 @@ const RequestConfigView: React.FC = ({ data, disabled, onChange }) => { {fields.map((field, index) => ( - 1. 请求路径,如 "/foo/index.html",支持请求路径前缀 - "/foo/*"; + {formatMessage({ id: 'route.request.config.path.description1' })}
- 2. "/*" 代表所有路径 + {formatMessage({ id: 'route.request.config.path.description2' })} ) : null } @@ -110,17 +111,17 @@ const RequestConfigView: React.FC = ({ data, disabled, onChange }) => { { required: true, whitespace: true, - message: '请输入请求路径', + message: formatMessage({ id: 'route.request.config.input.path' }), }, { pattern: new RegExp(/^\/[a-zA-Z0-9\-._~%!$&'()+,;=:@/]*\*?$/, 'g'), - message: '以/开头,*只能在最后', + message: formatMessage({ id: 'route.request.config.path.rule' }), }, ]} noStyle > @@ -144,7 +145,7 @@ const RequestConfigView: React.FC = ({ data, disabled, onChange }) => { add(); }} > - 新建 + {formatMessage({ id: 'route.request.config.create' })}
)} @@ -155,8 +156,8 @@ const RequestConfigView: React.FC = ({ data, disabled, onChange }) => { ); return ( - - + + = ({ data, disabled, onChange }) => { {renderHosts()} {renderPaths()} - + {step1Data.redirectOption === 'customRedirect' && ( - +
- + diff --git a/src/pages/Route/components/Step2/HttpHeaderRewriteView.tsx b/src/pages/Route/components/Step2/HttpHeaderRewriteView.tsx index 2863bd39e2..dc34a747cc 100644 --- a/src/pages/Route/components/Step2/HttpHeaderRewriteView.tsx +++ b/src/pages/Route/components/Step2/HttpHeaderRewriteView.tsx @@ -1,6 +1,7 @@ import React, { useState } from 'react'; import Form from 'antd/es/form'; import { Button, Table, Space, Modal, Input, Select } from 'antd'; +import { useIntl } from 'umi'; import PanelSection from '@/components/PanelSection'; @@ -12,6 +13,7 @@ const HttpHeaderRewriteView: React.FC = ({ data, disabled, onChange }) => const [modalForm] = Form.useForm(); const [mode, setMode] = useState('CREATE'); const [showModalValue, setShowModalValue] = useState(true); + const { formatMessage } = useIntl(); const handleEdit = (record: RouteModule.UpstreamHeader) => { setMode('EDIT'); @@ -24,27 +26,27 @@ const HttpHeaderRewriteView: React.FC = ({ data, disabled, onChange }) => const columns = [ { - title: '请求头', + title: formatMessage({ id: 'route.http.request.header.name' }), dataIndex: 'header_name', key: 'header_name', }, { - title: '行为', + title: formatMessage({ id: 'route.http.action' }), dataIndex: 'header_action', key: 'header_action', render: (action: 'override' | 'remove') => { - return action === 'override' ? '重写/添加' : '删除'; + return action === 'override' ? formatMessage({ id: 'route.http.override.or.create' }) : formatMessage({ id: 'route.http.delete' }); }, }, { - title: '值', + title: formatMessage({ id: 'route.http.value' }), dataIndex: 'header_value', key: 'header_value', }, disabled ? {} : { - title: '操作', + title: formatMessage({ id: 'route.http.operation' }), key: 'action', render: (_: any, record: RouteModule.UpstreamHeader) => ( @@ -53,14 +55,14 @@ const HttpHeaderRewriteView: React.FC = ({ data, disabled, onChange }) => handleEdit(record); }} > - 编辑 + {formatMessage({ id: 'route.http.edit' })} { handleRemove(record.key); }} > - 删除 + {formatMessage({ id: 'route.http.delete' })} ), @@ -96,7 +98,7 @@ const HttpHeaderRewriteView: React.FC = ({ data, disabled, onChange }) => return ( = ({ data, disabled, onChange }) => setVisible(false); modalForm.resetFields(); }} - okText="确定" - cancelText="取消" + okText={formatMessage({ id: 'route.http.confirm' })} + cancelText={formatMessage({ id: 'route.http.cancel' })} destroyOnClose >
{showModalValue && ( @@ -141,7 +143,7 @@ const HttpHeaderRewriteView: React.FC = ({ data, disabled, onChange }) => }; return ( - + {!disabled && ( )}
diff --git a/src/pages/Route/components/Step2/RequestRewriteView.tsx b/src/pages/Route/components/Step2/RequestRewriteView.tsx index 01c90df321..5a2d10661f 100644 --- a/src/pages/Route/components/Step2/RequestRewriteView.tsx +++ b/src/pages/Route/components/Step2/RequestRewriteView.tsx @@ -3,6 +3,7 @@ import Form, { FormInstance } from 'antd/es/form'; import Radio from 'antd/lib/radio'; import { Input, Row, Col, InputNumber, Button, Select } from 'antd'; import { PlusOutlined, MinusCircleOutlined } from '@ant-design/icons'; +import { useIntl } from 'umi'; import { FORM_ITEM_LAYOUT, FORM_ITEM_WITHOUT_LABEL } from '@/pages/Route/constants'; import PanelSection from '@/components/PanelSection'; @@ -16,11 +17,12 @@ const RequestRewriteView: React.FC = ({ data, form, disabled, onChange }) const { step2Data } = data; const [upstearms, setUpstreams] = useState<{ id: string; name: string }[]>(); const upstreamDisabled = disabled || !!step2Data.upstream_id; + const { formatMessage } = useIntl(); useEffect(() => { // eslint-disable-next-line no-shadow fetchUpstreamList().then(({ data }) => { - setUpstreams([{ name: '手动填写', id: null }, ...data]); + setUpstreams([{ name: formatMessage({ id: 'route.request.override.input' }), id: null }, ...data]); if (step2Data.upstream_id) { onChange({ upstream_id: step2Data.upstream_id }); } @@ -35,8 +37,8 @@ const RequestRewriteView: React.FC = ({ data, form, disabled, onChange }) required key={field.key} {...(index === 0 ? FORM_ITEM_LAYOUT : FORM_ITEM_WITHOUT_LABEL)} - label={index === 0 ? '后端服务域名/IP' : ''} - extra={index === 0 ? '使用域名时,默认解析本地 /etc/resolv.conf' : ''} + label={index === 0 ? formatMessage({ id: 'route.request.override.domain.name.or.ip' }) : ''} + extra={index === 0 ? formatMessage({ id: 'route.request.override.use.domain.name.default.analysis' }) : ''} > @@ -44,27 +46,27 @@ const RequestRewriteView: React.FC = ({ data, form, disabled, onChange }) style={{ marginBottom: 0 }} name={[field.name, 'host']} rules={[ - { required: true, message: '请输入域名/IP' }, + { required: true, message: formatMessage({ id: 'route.request.override.input.domain.or.ip' }) }, { pattern: new RegExp( /(^([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])(\.(25[0-5]|1\d{2}|2[0-4]\d|[1-9]?\d)){3}$|^(?![0-9.]+$)([a-zA-Z0-9_-]+)(\.[a-zA-Z0-9_-]+){0,}$)/, 'g', ), - message: '仅支持数字或者字符 或者 . (.不是必须)', + message: formatMessage({ id: 'route.request.override.domain.or.ip.rules' }), }, ]} > - + = ({ data, form, disabled, onChange }) = ({ data, form, disabled, onChange }) add(); }} > - 新建 + {formatMessage({ id: 'route.request.override.create' })} )} @@ -119,7 +121,7 @@ const RequestRewriteView: React.FC = ({ data, form, disabled, onChange }) const renderTimeUnit = () => ms; return ( - + = ({ data, form, disabled, onChange }) initialValues={step2Data} > { @@ -139,12 +141,12 @@ const RequestRewriteView: React.FC = ({ data, form, disabled, onChange }) name="upstream_protocol" disabled={disabled} > - 保持原样 + {formatMessage({ id: 'route.request.override.stay.same' })} HTTP HTTPS - + { @@ -152,20 +154,20 @@ const RequestRewriteView: React.FC = ({ data, form, disabled, onChange }) }} disabled={disabled} > - 保持原样 - 修改 + {formatMessage({ id: 'route.request.override.stay.same' })} + {formatMessage({ id: 'route.request.override.edit' })} {step2Data.upstreamPath !== undefined && ( - + )} - + {renderUpstreamMeta()} - + {renderTimeUnit()} - + {renderTimeUnit()} - + diff --git a/src/pages/Route/locales/en-US.ts b/src/pages/Route/locales/en-US.ts index 56b25713f2..e7fc86b589 100644 --- a/src/pages/Route/locales/en-US.ts +++ b/src/pages/Route/locales/en-US.ts @@ -3,4 +3,140 @@ export default { 'menu.routes.list': 'Route List', 'menu.routes.create': 'Create a Route', 'menu.routes.edit': 'Edit the Route', + + 'route.create.define.api.request': 'Define API requests', + 'route.create.define.api.backend.server': 'Define API Backend Server', + 'route.create.plugin.configuration': 'Plugin Configuration', + + 'route.result.submit.success': 'Submit Success', + 'route.result.return.list': 'Return Route List', + 'route.result.create': 'Create Route', + + 'route.match.parameter.position': 'Parameter Position', + 'route.match.http.request.header': 'HTTP Request Header', + 'route.match.request.parameter': 'Request Parameter', + 'route.match.parameter.name': 'Parameter Name', + 'route.match.operational.character': 'Operational Character', + 'route.match.equal': 'Equal', + 'route.match.unequal': 'Unequal', + 'route.match.greater.than': 'Greater Than', + 'route.match.less.than': 'Less Than', + 'route.match.regex.match': 'Regex Match', + 'route.match.parameter.value': 'Parameter Value', + 'route.match.operation': 'Operation', + 'route.match.edit': 'Edit', + 'route.match.delete': 'Delete', + 'route.match.edit.rule': 'Edit Rule', + 'route.match.create.rule': 'Create Rule', + 'route.match.confirm': 'Confirm', + 'route.match.cancel': 'Cancel', + 'route.match.select.parameter.position': 'Please choose parameter position', + 'route.match.request.header.example': 'Request header name, for example: HOST', + 'route.match.parameter.name.example': 'Parameter name, for example: id', + 'route.match.input.parameter.name': 'Please input parameter name', + 'route.match.parameter.name.rule': 'Only letters, numbers, - and _ are supported, and can only begin with letters', + 'route.match.rule': 'Only letters and Numbers are supported, and can only begin with letters', + 'route.match.choose.operational.character': 'Please choose operational character', + 'route.match.value': 'Value', + 'route.match.input.parameter.value': 'Please input parameter value', + 'route.match.advanced.match.rule': 'Advanced Routing Matching Conditions', + 'route.match.create': 'Create', + + 'route.meta.name.description':'Name And Description', + 'route.meta.api.name':'API Name', + 'route.meta.input.api.name':'Please input API name', + 'route.meta.api.name.rule':'Maximum length 100, only letters, Numbers, _, and - are supported, and can only begin with letters', + 'rotue.meta.api.rule':'Only letters, numbers, _ and - are supported, and can only begin with letters', + 'route.meta.description':'Description', + 'route.meta.description.rule':'Can not more than 200 characters', + + 'route.request.config.domain.name':'Domain Name', + 'route.request.config.domain.or.ip':'Domain Name or IP, support for generic Domain Name, for example: *.test.com', + 'route.request.config.input.domain.name':'Please input Domain Name', + 'route.request.config.domain.name.rule':'Only letters, numbers and * are supported. * can only be at the beginning, and only single * is supported', + 'route.request.config.create':'Create', + 'route.request.config.path':'Path', + 'route.request.config.path.description1':'1. Request path, for example: /foo/index.html, supports request path prefix /foo/* ;', + 'route.request.config.path.description2':'2. /* represents all paths', + 'route.request.config.input.path':'Please input request path', + 'route.request.config.path.rule':'Begin with / , and * can only at the end', + 'route.request.config.basic.define':'Request Basic Define', + 'route.request.config.protocol':'Protocol', + 'route.request.config.choose.protocol':'Please choose protocols', + 'route.request.config.http.method':'HTTP Method', + 'route.request.config.choose.http.method':'Please choose HTTP methods', + 'route.request.config.redirect':'Redirect', + 'route.request.config.enable.https':'Enable HTTPS', + 'route.request.config.custom':'Custom', + 'route.request.config.forbidden':'Forbidden', + 'route.request.config.redirect.custom':'Custom Redirect', + 'route.request.config.redirect.custom.example':'For examle: /foo/index.html', + 'route.request.config.redirect.301':'301(Permanent Redirect)', + 'route.request.config.redirect.302':'302(Temporary Redirect)', + + 'route.http.request.header.name':'HTTP Request Header Name', + 'route.http.action':'Action', + 'route.http.override.or.create':'Override/Create', + 'route.http.delete':'Delete', + 'route.http.value':'Value', + 'route.http.operation':'Operation', + 'route.http.edit':'Edit', + 'route.http.edit.request.header':'Edit HTTP request header', + 'route.http.operate.request.header':'Operate request header', + 'route.http.confirm':'Confirm', + 'route.http.cancel':'Cancel', + 'route.http.input.request.header.name':'Please input HTTP request header name', + 'route.http.select.actions':'Please select actions', + 'route.http.input.value':'Please input value', + 'route.http.override.request.header':'Override HTTP request header', + + 'route.request.override.input':'Input', + 'route.request.override.domain.name.or.ip':'Domain Name/IP', + 'route.request.override.use.domain.name.default.analysis':'When using Domain Name, it will analysis the local: /etc/resolv.conf by default', + 'route.request.override.input.domain.or.ip':'Please input Domain Name/IP', + 'route.request.override.domain.or.ip.rules':'Only letters, numbers and . are supported', + 'route.request.override.input.port.number':'Please input port number', + 'route.request.override.port.number':'Port Number', + 'route.request.override.input.weight':'Please input weight', + 'route.request.override.weight':'Weight', + 'route.request.override.create':'Create', + 'route.request.override':'Requests Override', + 'route.request.override.protocol':'Protocol', + 'route.request.override.select.protocol':'Please select protocol', + 'route.request.override.stay.same':'Stay The Same', + 'route.request.override.path':'Request Path', + 'route.request.override.edit':'Edit', + 'route.request.override.new.path':'New Path', + 'route.request.override.input.path':'Please input request path', + 'route.request.override.path.example':'For example: /foo/bar/index.html', + 'route.request.override.upstream':'Upstream', + 'route.request.override.connection.timeout':'Connection Timeout', + 'route.request.override.input.connection.timeout':'Please inout connection timeout', + 'route.request.override.send.timeout':'Send Timeout', + 'route.request.override.inout.send.timeout':'Please input send timeout', + 'route.request.override.receive.timeout':'Receive Timeout', + 'route.request.override.inout.receive.timeout':'Please input receive timeout', + + 'route.constants.define.api.request':'Define API Request', + 'route.constants.preview':'Preview', + 'route.constants.define.api.backend.serve':'Define API Backend Server', + 'route.constants.plugin.configuration':'Plugin Configuration', + + 'route.create.management':'Route Management', + + 'route.list.name':'Name', + 'route.list.domain.name':'Domain Name', + 'route.list.path':'Path', + 'route.list.description':'Description', + 'route.list.edit.time':'Edit Time', + 'route.list.operation':'Operation', + 'route.list.edit':'Edit', + 'route.list.delete.confrim':'Are you sure to delete this route?', + 'route.list.delete.success':'Delete Success!', + 'route.list.confirm':'Confirm', + 'route.list.cancel':'Cancel', + 'route.list.delete':'Delete', + 'route.list':'Route List', + 'route.list.input':'Please input', + 'route.list.create':'Create', }; diff --git a/src/pages/Route/locales/zh-CN.ts b/src/pages/Route/locales/zh-CN.ts index a5ee0dd4ce..e8789dceff 100644 --- a/src/pages/Route/locales/zh-CN.ts +++ b/src/pages/Route/locales/zh-CN.ts @@ -3,4 +3,140 @@ export default { 'menu.routes.list': '列表', 'menu.routes.create': '创建', 'menu.routes.edit': '编辑', + + 'route.create.define.api.request': '定义 API 请求', + 'route.create.define.api.backend.server': '定义 API 后端服务', + 'route.create.plugin.configuration': '插件配置', + + 'route.result.submit.success': '提交成功', + 'route.result.return.list': '返回路由列表', + 'route.result.create': '创建路由', + + 'route.match.parameter.position': '参数位置', + 'route.match.http.request.header': 'HTTP 请求头', + 'route.match.request.parameter': '请求参数', + 'route.match.parameter.name': '参数名称', + 'route.match.operational.character': '运算符', + 'route.match.equal': '等于', + 'route.match.unequal': '不等于', + 'route.match.greater.than': '大于', + 'route.match.less.than': '小于', + 'route.match.regex.match': '正则匹配', + 'route.match.parameter.value': '参数值', + 'route.match.operation': '操作', + 'route.match.edit': '编辑', + 'route.match.delete': '删除', + 'route.match.edit.rule': '编辑规则', + 'route.match.create.rule': '创建规则', + 'route.match.confirm': '确定', + 'route.match.cancel': '取消', + 'route.match.select.parameter.position': '请选择参数位置', + 'route.match.request.header.example': '请求头键名,例如:HOST', + 'route.match.parameter.name.example': '参数名称,例如:id', + 'route.match.input.parameter.name': '请输入参数名称', + 'route.match.parameter.name.rule': '仅支持字母、数字、- 和 _ ,且只能以字母开头', + 'route.match.rule': '仅支持字母和数字,且只能以字母开头', + 'route.match.choose.operational.character': '请选择运算符', + 'route.match.value': '值', + 'route.match.input.parameter.value': '请输入参数值', + 'route.match.advanced.match.rule': '高级路由匹配条件', + 'route.match.create': '创建', + + 'route.meta.name.description':'名称及其描述', + 'route.meta.api.name':'API 名称', + 'route.meta.input.api.name':'请输入 API 名称', + 'route.meta.api.name.rule':'最大长度100,仅支持字母、数字、- 和 _,且只能以字母开头', + 'rotue.meta.api.rule':'仅支持字母、数字、- 和 _,且只能以字母开头', + 'route.meta.description':'描述', + 'route.meta.description.rule':'不超过 200 个字符', + + 'route.request.config.domain.name':'域名', + 'route.request.config.domain.or.ip':'域名或IP,支持泛域名,如:*.test.com', + 'route.request.config.input.domain.name':'请输入域名', + 'route.request.config.domain.name.rule':'仅支持字母、数字和 * ,且 * 只能是在开头,支持单个 * ', + 'route.request.config.create':'创建', + 'route.request.config.path':'路径', + 'route.request.config.path.description1':'1. 请求路径,如 /foo/index.html,支持请求路径前缀 /foo/* ;', + 'route.request.config.path.description2':'2. /* 代表所有路径', + 'route.request.config.input.path':'请输入请求路径', + 'route.request.config.path.rule':'以 / 开头,且 * 只能在最后', + 'route.request.config.basic.define':'请求基础定义', + 'route.request.config.protocol':'协议', + 'route.request.config.choose.protocol':'请选择协议', + 'route.request.config.http.method':'HTTP 方法', + 'route.request.config.choose.http.method':'请选择 HTTP 方法', + 'route.request.config.redirect':'重定向', + 'route.request.config.enable.https':'启用 HTTPS', + 'route.request.config.custom':'自定义', + 'route.request.config.forbidden':'禁用', + 'route.request.config.redirect.custom':'自定义重定向', + 'route.request.config.redirect.custom.example':'例如:/foo/index.html', + 'route.request.config.redirect.301':'301(永久重定向)', + 'route.request.config.redirect.302':'302(临时重定向)', + + 'route.http.request.header.name':'HTTP 请求头名称', + 'route.http.action':'行为', + 'route.http.override.or.create':'重写/创建', + 'route.http.delete':'删除', + 'route.http.value':'值', + 'route.http.operation':'操作', + 'route.http.edit':'编辑', + 'route.http.edit.request.header':'编辑请求头', + 'route.http.operate.request.header':'操作请求头', + 'route.http.confirm':'确定', + 'route.http.cancel':'取消', + 'route.http.input.request.header.name':'请输入 HTTP 请求头名称', + 'route.http.select.actions':'请选择行为', + 'route.http.input.value':'请输入值', + 'route.http.override.request.header':'HTTP 请求头改写', + + 'route.request.override.input':'手动填写', + 'route.request.override.domain.name.or.ip':'域名/IP', + 'route.request.override.use.domain.name.default.analysis':'使用域名时,默认解析本地:/etc/resolv.conf', + 'route.request.override.input.domain.or.ip':'请输入域名/IP', + 'route.request.override.domain.or.ip.rules':'仅支持字母、数字和 . ', + 'route.request.override.input.port.number':'请输入端口号', + 'route.request.override.port.number':'端口号', + 'route.request.override.input.weight':'请输入权重', + 'route.request.override.weight':'权重', + 'route.request.override.create':'创建', + 'route.request.override':'请求改写', + 'route.request.override.protocol':'协议', + 'route.request.override.select.protocol':'请选择协议', + 'route.request.override.stay.same':'保持原样', + 'route.request.override.path':'请求路径', + 'route.request.override.edit':'编辑', + 'route.request.override.new.path':'新路径', + 'route.request.override.input.path':'请输入请求路径', + 'route.request.override.path.example':'例如:/foo/bar/index.html', + 'route.request.override.upstream':'上游', + 'route.request.override.connection.timeout':'连接超时', + 'route.request.override.input.connection.timeout':'请输入连接超时时间', + 'route.request.override.send.timeout':'发送超时', + 'route.request.override.inout.send.timeout':'请输入发送超时时间', + 'route.request.override.receive.timeout':'接收超时', + 'route.request.override.inout.receive.timeout':'请输入接收超时时间', + + 'route.constants.define.api.request':'定义 API 请求', + 'route.constants.preview':'预览', + 'route.constants.define.api.backend.serve':'定义 API 后端服务', + 'route.constants.plugin.configuration':'插件配置', + + 'route.create.management':'路由管理', + + 'route.list.name':'名称', + 'route.list.domain.name':'域名', + 'route.list.path':'路径', + 'route.list.description':'描述', + 'route.list.edit.time':'编辑时间', + 'route.list.operation':'操作', + 'route.list.edit':'编辑', + 'route.list.delete.confrim':'确定删除该路由吗?', + 'route.list.delete.success':'删除成功!', + 'route.list.confirm':'确认', + 'route.list.cancel':'取消', + 'route.list.delete':'删除', + 'route.list':'路由列表', + 'route.list.input':'请输入', + 'route.list.create':'创建', }; From 5a747c4ec516c6fe928d1a9ec3630e21a8f288fa Mon Sep 17 00:00:00 2001 From: jiangfeng Date: Mon, 27 Jul 2020 09:53:48 +0800 Subject: [PATCH 2/2] combine import --- src/pages/Route/components/ResultView/ResultView.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/Route/components/ResultView/ResultView.tsx b/src/pages/Route/components/ResultView/ResultView.tsx index f14d1b9033..784ab0c272 100644 --- a/src/pages/Route/components/ResultView/ResultView.tsx +++ b/src/pages/Route/components/ResultView/ResultView.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { Result, Button } from 'antd'; -import { history } from 'umi'; -import { useIntl } from 'umi'; +import { history, useIntl } from 'umi'; type Props = { onReset?(): void;