You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ju...@apache.org on 2020/07/24 06:17:16 UTC

[incubator-apisix-dashboard] branch master updated: i18n upstream (#334)

This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-apisix-dashboard.git


The following commit(s) were added to refs/heads/master by this push:
     new c1408e6  i18n upstream (#334)
c1408e6 is described below

commit c1408e664d8d084ca6b50130d74f1cb718b38bd3
Author: TikWind <65...@users.noreply.github.com>
AuthorDate: Fri Jul 24 14:17:08 2020 +0800

    i18n upstream (#334)
---
 src/pages/Upstream/Create.tsx           | 10 ++++---
 src/pages/Upstream/List.tsx             | 32 ++++++++++++-----------
 src/pages/Upstream/components/Step1.tsx | 46 ++++++++++++++++++---------------
 src/pages/Upstream/locales/en-US.ts     | 44 +++++++++++++++++++++++++++++++
 src/pages/Upstream/locales/zh-CN.ts     | 44 +++++++++++++++++++++++++++++++
 5 files changed, 136 insertions(+), 40 deletions(-)

diff --git a/src/pages/Upstream/Create.tsx b/src/pages/Upstream/Create.tsx
index 6a5b634..53f8435 100644
--- a/src/pages/Upstream/Create.tsx
+++ b/src/pages/Upstream/Create.tsx
@@ -4,6 +4,7 @@ import { Card, Steps, notification, Form } from 'antd';
 
 import ActionBar from '@/components/ActionBar';
 import { history } from 'umi';
+import { useIntl } from 'umi';
 
 import Step1 from './components/Step1';
 import Preview from './components/Preview';
@@ -13,6 +14,7 @@ import { transformCreate, transformFetch } from './transform';
 const Page: React.FC = (props) => {
   const [step, setStep] = useState(1);
   const [form1] = Form.useForm();
+  const { formatMessage } = useIntl();
 
   useEffect(() => {
     const { id } = (props as any).match.params;
@@ -28,7 +30,7 @@ const Page: React.FC = (props) => {
     const data = transformCreate({ ...form1.getFieldsValue() } as UpstreamModule.Body);
     const { id } = (props as any).match.params;
     (id ? update(id, data) : create(data)).then(() => {
-      notification.success({ message: `${id ? '更新' : '创建'} 上游成功` });
+      notification.success({ message: `${id ? formatMessage({ id: 'upstream.create.edit' }) : formatMessage({ id: 'upstream.create.create' })} ` + formatMessage({ id: 'upstream.create.upstream.successfully' }) });
       history.replace('/upstream/list');
     });
   };
@@ -47,11 +49,11 @@ const Page: React.FC = (props) => {
 
   return (
     <>
-      <PageContainer title="创建上游">
+      <PageContainer title={formatMessage({ id: 'upstream.create.create' })}>
         <Card bordered={false}>
           <Steps current={step - 1} style={{ marginBottom: 30 }}>
-            <Steps.Step title="基础信息" />
-            <Steps.Step title="预览" />
+            <Steps.Step title={formatMessage({ id: 'upstream.create.basic.info' })} />
+            <Steps.Step title={formatMessage({ id: 'upstream.create.preview' })} />
           </Steps>
 
           {step === 1 && <Step1 form={form1} />}
diff --git a/src/pages/Upstream/List.tsx b/src/pages/Upstream/List.tsx
index 9b75899..44878cb 100644
--- a/src/pages/Upstream/List.tsx
+++ b/src/pages/Upstream/List.tsx
@@ -4,6 +4,7 @@ import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table';
 import { PlusOutlined } from '@ant-design/icons';
 import { Popconfirm, Button, notification, Input } from 'antd';
 import { history } from 'umi';
+import { useIntl } from 'umi';
 import moment from 'moment';
 
 import { fetchList, remove } from './service';
@@ -12,27 +13,28 @@ const Page: React.FC = () => {
   const ref = useRef<ActionType>();
 
   const [search, setSearch] = useState('');
+  const { formatMessage } = useIntl();
 
   const columns: ProColumns<UpstreamModule.ResEntity>[] = [
     {
-      title: '名称',
+      title: formatMessage({ id: 'upstream.list.name' }),
       dataIndex: 'name',
     },
     {
-      title: '类型',
+      title: formatMessage({ id: 'upstream.list.type' }),
       dataIndex: 'type',
     },
     {
-      title: '描述',
+      title: formatMessage({ id: 'upstream.list.description' }),
       dataIndex: 'description',
     },
     {
-      title: '更新时间',
+      title: formatMessage({ id: 'upstream.list.edit.time' }),
       dataIndex: 'update_time',
       render: (text) => `${moment.unix(Number(text)).format('YYYY-MM-DD HH:mm:ss')}`,
     },
     {
-      title: '操作',
+      title: formatMessage({ id: 'upstream.list.operation' }),
       valueType: 'option',
       render: (_, record) => (
         <>
@@ -41,16 +43,16 @@ const Page: React.FC = () => {
             style={{ marginRight: 10 }}
             onClick={() => history.push(`/upstream/${record.id}/edit`)}
           >
-            编辑
+            {formatMessage({ id: 'upstream.list.edit' })}
           </Button>
           <Popconfirm
-            title="确定删除该条记录吗?"
-            okText="确定"
-            cancelText="取消"
+            title={formatMessage({ id: 'upstream.list.confirm.delete' })}
+            okText={formatMessage({ id: 'upstream.list.confirm' })}
+            cancelText={formatMessage({ id: 'upstream.list.cancel' })}
             onConfirm={() => {
               remove(record.id!).then(() => {
                 notification.success({
-                  message: '删除记录成功',
+                  message: formatMessage({ id: 'upstream.list.delete.successfully' }),
                 });
                 /* eslint-disable no-unused-expressions */
                 ref.current?.reload();
@@ -58,7 +60,7 @@ const Page: React.FC = () => {
             }}
           >
             <Button type="primary" danger>
-              删除
+              {formatMessage({ id: 'upstream.list.delete' })}
             </Button>
           </Popconfirm>
         </>
@@ -67,7 +69,7 @@ const Page: React.FC = () => {
   ];
 
   return (
-    <PageContainer title="上游列表">
+    <PageContainer title={formatMessage({ id: 'upstream.list' })}>
       <ProTable<UpstreamModule.ResEntity>
         actionRef={ref}
         columns={columns}
@@ -76,7 +78,7 @@ const Page: React.FC = () => {
         request={(params) => fetchList(params, search)}
         toolBarRender={(action) => [
           <Input.Search
-            placeholder="请输入"
+            placeholder={formatMessage({ id: 'upstream.list.input' })}
             onSearch={(value) => {
               setSearch(value);
               action.setPageInfo({ page: 1 });
@@ -85,8 +87,8 @@ const Page: React.FC = () => {
           />,
           <Button type="primary" onClick={() => history.push('/upstream/create')}>
             <PlusOutlined />
-            创建
-          </Button>,
+            {formatMessage({ id: 'upstream.list.create' })}
+          </Button>
         ]}
       />
     </PageContainer>
diff --git a/src/pages/Upstream/components/Step1.tsx b/src/pages/Upstream/components/Step1.tsx
index 2c70b8b..54f30c8 100644
--- a/src/pages/Upstream/components/Step1.tsx
+++ b/src/pages/Upstream/components/Step1.tsx
@@ -1,6 +1,7 @@
 import React from 'react';
 import { Form, Input, Row, Col, InputNumber, Select } from 'antd';
 import { FormInstance } from 'antd/lib/form';
+import { useIntl } from 'umi';
 
 import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons';
 import Button from 'antd/es/button';
@@ -24,6 +25,9 @@ const initialValues = {
 };
 
 const Step1: React.FC<Props> = ({ form, disabled }) => {
+
+  const { formatMessage } = useIntl();
+
   const renderUpstreamMeta = () => (
     <Form.List name="upstreamHostList">
       {(fields, { add, remove }) => (
@@ -33,10 +37,10 @@ const Step1: React.FC<Props> = ({ form, disabled }) => {
               required
               key={field.key}
               {...(index === 0 ? FORM_ITEM_LAYOUT : FORM_ITEM_WITHOUT_LABEL)}
-              label={index === 0 ? '后端服务域名/IP' : ''}
+              label={index === 0 ? formatMessage({ id: 'upstream.step.backend.server.domain.or.ip' }) : ''}
               extra={
                 index === 0
-                  ? '使用域名时,默认解析本地 /etc/resolv.conf;权重为0则熔断该节点。'
+                  ? formatMessage({ id: 'upstream.step.domain.name.default.analysis' })
                   : ''
               }
             >
@@ -46,35 +50,35 @@ const Step1: React.FC<Props> = ({ form, disabled }) => {
                     style={{ marginBottom: 0 }}
                     name={[field.name, 'host']}
                     rules={[
-                      { required: true, message: '请输入域名/IP' },
+                      { required: true, message: formatMessage({ id: 'upstream.step.input.domain.name.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: 'upstream.step.domain.name.or.ip.rule' }),
                       },
                     ]}
                   >
-                    <Input placeholder="域名/IP" disabled={disabled} />
+                    <Input placeholder={formatMessage({ id: 'upstream.step.domain.name.or.ip' })} disabled={disabled} />
                   </Form.Item>
                 </Col>
                 <Col span={3}>
                   <Form.Item
                     style={{ marginBottom: 0 }}
                     name={[field.name, 'port']}
-                    rules={[{ required: true, message: '请输入端口' }]}
+                    rules={[{ required: true, message: formatMessage({ id: 'upstream.step.input.port' }) }]}
                   >
-                    <InputNumber placeholder="端口号" disabled={disabled} min={1} max={65535} />
+                    <InputNumber placeholder={formatMessage({ id: 'upstream.step.port' })} disabled={disabled} min={1} max={65535} />
                   </Form.Item>
                 </Col>
                 <Col span={3}>
                   <Form.Item
                     style={{ marginBottom: 0 }}
                     name={[field.name, 'weight']}
-                    rules={[{ required: true, message: '请输入权重' }]}
+                    rules={[{ required: true, message: formatMessage({ id: 'upstream.step.input.weight' }) }]}
                   >
-                    <InputNumber placeholder="权重" disabled={disabled} min={0} max={1000} />
+                    <InputNumber placeholder={formatMessage({ id: 'upstream.step.weight' })} disabled={disabled} min={0} max={1000} />
                   </Form.Item>
                 </Col>
                 <Col
@@ -105,7 +109,7 @@ const Step1: React.FC<Props> = ({ form, disabled }) => {
                   add();
                 }}
               >
-                <PlusOutlined /> 新建
+                <PlusOutlined />{formatMessage({ id: 'upstream.step.create' })}
               </Button>
             </Form.Item>
           )}
@@ -118,44 +122,44 @@ const Step1: React.FC<Props> = ({ form, disabled }) => {
 
   return (
     <Form {...FORM_ITEM_LAYOUT} form={form} initialValues={initialValues}>
-      <Form.Item label="名称" name="name" rules={[{ required: true }]} extra="名称需全局唯一">
-        <Input placeholder="请输入上游名称" disabled={disabled} />
+      <Form.Item label={formatMessage({ id: 'upstream.step.name' })} name="name" rules={[{ required: true }]} extra={formatMessage({ id: 'upstream.step.name.should.unique' })}>
+        <Input placeholder={formatMessage({ id: 'upstream.step.input.upstream.name' })} disabled={disabled} />
       </Form.Item>
-      <Form.Item label="描述" name="description">
-        <Input.TextArea placeholder="请输入描述" disabled={disabled} />
+      <Form.Item label={formatMessage({ id: 'upstream.step.description' })} name="description">
+        <Input.TextArea placeholder={formatMessage({ id: 'upstream.step.input.description' })} disabled={disabled} />
       </Form.Item>
-      <Form.Item label="类型" name="type" rules={[{ required: true }]}>
+      <Form.Item label={formatMessage({ id: 'upstream.step.type' })} name="type" rules={[{ required: true }]}>
         <Select disabled={disabled}>
           <Select.Option value="roundrobin">roundrobin</Select.Option>
           {/* TODO: chash */}
         </Select>
       </Form.Item>
       {renderUpstreamMeta()}
-      <Form.Item label="连接超时" required>
+      <Form.Item label={formatMessage({ id: 'upstream.step.connect.timeout' })} required>
         <Form.Item
           name={['timeout', 'connect']}
           noStyle
-          rules={[{ required: true, message: '请输入连接超时时间' }]}
+          rules={[{ required: true, message: formatMessage({ id: 'upstream.step.input.connect.timeout' }) }]}
         >
           <InputNumber disabled={disabled} />
         </Form.Item>
         {renderTimeUnit()}
       </Form.Item>
-      <Form.Item label="发送超时" required>
+      <Form.Item label={formatMessage({ id: 'upstream.step.send.timeout' })} required>
         <Form.Item
           name={['timeout', 'send']}
           noStyle
-          rules={[{ required: true, message: '请输入发送超时时间' }]}
+          rules={[{ required: true, message: formatMessage({ id: 'upstream.step.input.send.timeout' }) }]}
         >
           <InputNumber disabled={disabled} />
         </Form.Item>
         {renderTimeUnit()}
       </Form.Item>
-      <Form.Item label="接收超时" required>
+      <Form.Item label={formatMessage({ id: 'upstream.step.receive.timeout' })} required>
         <Form.Item
           name={['timeout', 'read']}
           noStyle
-          rules={[{ required: true, message: '请输入接收超时时间' }]}
+          rules={[{ required: true, message: formatMessage({ id: 'upstream.step.input.receive.timeout' }) }]}
         >
           <InputNumber disabled={disabled} />
         </Form.Item>
diff --git a/src/pages/Upstream/locales/en-US.ts b/src/pages/Upstream/locales/en-US.ts
index a67cda7..ed53449 100644
--- a/src/pages/Upstream/locales/en-US.ts
+++ b/src/pages/Upstream/locales/en-US.ts
@@ -3,4 +3,48 @@ export default {
   'menu.upstream.list': 'List',
   'menu.upstream.create': 'Create a Upstream',
   'menu.upstream.edit': 'Edit the Upstream',
+
+  'upstream.step.backend.server.domain.or.ip':'Backend Server Domain Name/IP',
+  'upstream.step.domain.name.default.analysis':'When using domain name, it will analysis local: /etc/resolv.conf by default, if weight is 0, then fusing this node',
+  'upstream.step.input.domain.name.or.ip':'Please input domain name/IP',
+  'upstream.step.domain.name.or.ip.rule':'Only letters, numbers and . are supported',
+  'upstream.step.domain.name.or.ip':'Domain Name/IP',
+  'upstream.step.input.port':'Please input port number',
+  'upstream.step.port':'Port Number',
+  'upstream.step.input.weight':'Please input weight',
+  'upstream.step.weight':'Weight',
+  'upstream.step.create':'Create',
+  'upstream.step.name':'Name',
+  'upstream.step.name.should.unique':'Name should be unique',
+  'upstream.step.input.upstream.name':'Please input upstream name',
+  'upstream.step.description':'Description',
+  'upstream.step.input.description':'Please input description',
+  'upstream.step.type':'Type',
+  'upstream.step.connect.timeout':'Connect Timeout',
+  'upstream.step.input.connect.timeout':'Please input connect timeout',
+  'upstream.step.send.timeout':'Send Timeout',
+  'upstream.step.input.send.timeout':'Please input send timeout',
+  'upstream.step.receive.timeout':'Receive Timeout',
+  'upstream.step.input.receive.timeout':'Please input receive timeout',
+
+  'upstream.create.edit':'Edit',
+  'upstream.create.create':'Create',
+  'upstream.create.upstream.successfully':'upstream successfully',
+  'upstream.create.basic.info':'Basic Information',
+  'upstream.create.preview':'Preview',
+
+  'upstream.list.name':'Name',
+  'upstream.list.type':'Type',
+  'upstream.list.description':'Description',
+  'upstream.list.edit.time':'Edit Time',
+  'upstream.list.operation':'Operation',
+  'upstream.list.edit':'Edit',
+  'upstream.list.confirm.delete':'Are you sure to delete ?',
+  'upstream.list.confirm':'Confirm',
+  'upstream.list.cancel':'Cancel',
+  'upstream.list.delete.successfully':'Delete successfully',
+  'upstream.list.delete':'Delete',
+  'upstream.list':'Upstream List',
+  'upstream.list.input':'Please input',
+  'upstream.list.create':'Create',
 };
diff --git a/src/pages/Upstream/locales/zh-CN.ts b/src/pages/Upstream/locales/zh-CN.ts
index cdad686..694799e 100644
--- a/src/pages/Upstream/locales/zh-CN.ts
+++ b/src/pages/Upstream/locales/zh-CN.ts
@@ -3,4 +3,48 @@ export default {
   'menu.upstream.list': '列表',
   'menu.upstream.create': '创建上游',
   'menu.upstream.edit': '编辑上游',
+
+  'upstream.step.backend.server.domain.or.ip':'后端服务域名/IP',
+  'upstream.step.domain.name.default.analysis':'使用域名时,默认解析本地 /etc/resolv.conf;权重为0则熔断该节点',
+  'upstream.step.input.domain.name.or.ip':'请输入域名/IP',
+  'upstream.step.domain.name.or.ip.rule':'仅支持字母、数字和 . ',
+  'upstream.step.domain.name.or.ip':'域名/IP',
+  'upstream.step.input.port':'请输入端口号',
+  'upstream.step.port':'端口号',
+  'upstream.step.input.weight':'请输入权重',
+  'upstream.step.weight':'权重',
+  'upstream.step.create':'创建',
+  'upstream.step.name':'名称',
+  'upstream.step.name.should.unique':'名称需全局唯一',
+  'upstream.step.input.upstream.name':'请输入上游名称',
+  'upstream.step.description':'描述',
+  'upstream.step.input.description':'请输入描述',
+  'upstream.step.type':'类型',
+  'upstream.step.connect.timeout':'连接超时',
+  'upstream.step.input.connect.timeout':'请输入连接超时时间',
+  'upstream.step.send.timeout':'发送超时',
+  'upstream.step.input.send.timeout':'请输入发送超时时间',
+  'upstream.step.receive.timeout':'接收超时',
+  'upstream.step.input.receive.timeout':'请输入接收超时时间',
+
+  'upstream.create.edit':'编辑',
+  'upstream.create.create':'创建',
+  'upstream.create.upstream.successfully':'上游成功',
+  'upstream.create.basic.info':'基础信息',
+  'upstream.create.preview':'预览',
+
+  'upstream.list.name':'名称',
+  'upstream.list.type':'类型',
+  'upstream.list.description':'描述',
+  'upstream.list.edit.time':'编辑时间',
+  'upstream.list.operation':'操作',
+  'upstream.list.edit':'编辑',
+  'upstream.list.confirm.delete':'确定删除该条记录吗?',
+  'upstream.list.confirm':'确定',
+  'upstream.list.cancel':'取消',
+  'upstream.list.delete.successfully':'删除记录成功',
+  'upstream.list.delete':'删除',
+  'upstream.list':'上游列表',
+  'upstream.list.input':'请输入',
+  'upstream.list.create':'创建',
 };