From dab141ad3fc5d253d697c5cd9a4b80049f442470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=A7=80=E7=8E=B2?= <zhangxiuling@zhangxiingdeMBP.lan> Date: Sat, 7 Jul 2018 16:42:35 +0800 Subject: [PATCH] translate settings page --- src/locale/en-US.js | 36 +++++++++++ src/locale/zh-CN.js | 33 ++++++++++ src/pages/Account/Settings/BaseView.js | 70 ++++++++++++++++------ src/pages/Account/Settings/Info.js | 33 ++++++---- src/pages/Account/Settings/SecurityView.js | 50 ++++++++++------ 5 files changed, 174 insertions(+), 48 deletions(-) diff --git a/src/locale/en-US.js b/src/locale/en-US.js index e5d9971d..a73fb32f 100644 --- a/src/locale/en-US.js +++ b/src/locale/en-US.js @@ -72,6 +72,42 @@ export default { 'app.analysis.table.search-keyword': 'Keyword', 'app.analysis.table.users': 'Users', 'app.analysis.table.weekly-range': 'Weekly Range', + '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': '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', // ...enMessages, }, }; diff --git a/src/locale/zh-CN.js b/src/locale/zh-CN.js index 852d2542..c1f7c347 100644 --- a/src/locale/zh-CN.js +++ b/src/locale/zh-CN.js @@ -72,6 +72,39 @@ export default { 'app.analysis.table.search-keyword': 'æœç´¢å…³é”®è¯', 'app.analysis.table.users': '用户数', 'app.analysis.table.weekly-range': '周涨幅', + 'app.settings.menuMap.basic': '基本设置', + 'app.settings.menuMap.security': '安全设置', + 'app.settings.menuMap.binding': 'è´¦å·ç»‘定', + 'app.settings.menuMap.notification': '新消æ¯é€šçŸ¥', + 'app.settings.basic.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.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 设备,绑定åŽï¼Œå¯ä»¥è¿›è¡ŒäºŒæ¬¡ç¡®è®¤', // ...zhMessages, }, }; diff --git a/src/pages/Account/Settings/BaseView.js b/src/pages/Account/Settings/BaseView.js index b6fe2c50..f2dd1cf1 100644 --- a/src/pages/Account/Settings/BaseView.js +++ b/src/pages/Account/Settings/BaseView.js @@ -1,9 +1,11 @@ import React, { Component, Fragment } from 'react'; +import { injectIntl, FormattedMessage } from 'react-intl'; import { Form, Input, Upload, Select, Button } from 'antd'; import { connect } from 'dva'; import styles from './BaseView.less'; import GeographicView from './GeographicView'; import PhoneView from './PhoneView'; +// import { getTimeDistance } from '../../../utils/utils'; const FormItem = Form.Item; const { Option } = Select; @@ -11,13 +13,15 @@ const { Option } = Select; // 头åƒç»„ä»¶ 方便以åŽç‹¬ç«‹ï¼Œå¢žåŠ è£å‰ªä¹‹ç±»çš„功能 const AvatarView = ({ avatar }) => ( <Fragment> - <div className={styles.avatar_title}>头åƒ</div> + <div className={styles.avatar_title}>Avatar</div> <div className={styles.avatar}> <img src={avatar} alt="avatar" /> </div> <Upload fileList={[]}> <div className={styles.button_view}> - <Button icon="upload">æ›´æ¢å¤´åƒ</Button> + <Button icon="upload"> + <FormattedMessage id="app.settings.basic.avatar" defaultMessage="Change avatar" /> + </Button> </div> </Upload> </Fragment> @@ -49,7 +53,29 @@ const validatorPhone = (rule, value, callback) => { currentUser: user.currentUser, })) @Form.create() -export default class BaseView extends Component { +class BaseView extends Component { + constructor(props) { + super(props); + const { intl } = props; + this.formLabelData = { + email: intl.formatMessage({ id: 'app.settings.basic.email' }, {}), + emailMessage: intl.formatMessage({ id: 'app.settings.basic.email-message' }, {}), + nickname: intl.formatMessage({ id: 'app.settings.basic.nickname' }, {}), + nicknameMessage: intl.formatMessage({ id: 'app.settings.basic.nickname-message' }, {}), + profile: intl.formatMessage({ id: 'app.settings.basic.profile' }, {}), + profileMessage: intl.formatMessage({ id: 'app.settings.basic.profile-message' }, {}), + profilePlaceholder: intl.formatMessage({ id: 'app.settings.basic.profile-placeholder' }, {}), + country: intl.formatMessage({ id: 'app.settings.basic.country' }, {}), + countryMessage: intl.formatMessage({ id: 'app.settings.basic.country-message' }, {}), + geographic: intl.formatMessage({ id: 'app.settings.basic.geographic' }, {}), + geographicMessage: intl.formatMessage({ id: 'app.settings.basic.geographic-message' }, {}), + address: intl.formatMessage({ id: 'app.settings.basic.address' }, {}), + addressMessage: intl.formatMessage({ id: 'app.settings.basic.address-message' }, {}), + phone: intl.formatMessage({ id: 'app.settings.basic.phone' }, {}), + phoneMessage: intl.formatMessage({ id: 'app.settings.basic.phone-message' }, {}), + }; + } + componentDidMount() { this.setBaseInfo(); } @@ -84,36 +110,36 @@ export default class BaseView extends Component { <div className={styles.baseView} ref={this.getViewDom}> <div className={styles.left}> <Form layout="vertical" onSubmit={this.handleSubmit} hideRequiredMark> - <FormItem label="邮箱"> + <FormItem label={this.formLabelData.email}> {getFieldDecorator('email', { - rules: [{ required: true, message: 'Please input your email!' }], + rules: [{ required: true, message: this.formLabelData.emailMessage }], })(<Input />)} </FormItem> - <FormItem label="昵称"> + <FormItem label={this.formLabelData.nickname}> {getFieldDecorator('name', { - rules: [{ required: true, message: 'Please input your nick name!' }], + rules: [{ required: true, message: this.formLabelData.nicknameMessage }], })(<Input />)} </FormItem> - <FormItem label="个人简介"> + <FormItem label={this.formLabelData.profile}> {getFieldDecorator('profile', { - rules: [{ required: true, message: 'Please input personal profile!' }], - })(<Input.TextArea placeholder="简å•的介ç»ä¸‹è‡ªå·±" rows={4} />)} + rules: [{ required: true, message: this.formLabelData.profileMessage }], + })(<Input.TextArea placeholder={this.formLabelData.profilePlaceholder} rows={4} />)} </FormItem> - <FormItem label="国家/地区"> + <FormItem label={this.formLabelData.country}> {getFieldDecorator('country', { - rules: [{ required: true, message: 'Please input your country!' }], + rules: [{ required: true, message: this.formLabelData.countryMessage }], })( <Select style={{ maxWidth: 220 }}> <Option value="China">ä¸å›½</Option> </Select> )} </FormItem> - <FormItem label="所在çœå¸‚"> + <FormItem label={this.formLabelData.geographic}> {getFieldDecorator('geographic', { rules: [ { required: true, - message: 'Please input your geographic info!', + message: this.formLabelData.geographicMessage, }, { validator: validatorGeographic, @@ -121,20 +147,25 @@ export default class BaseView extends Component { ], })(<GeographicView />)} </FormItem> - <FormItem label="è¡—é“地å€"> + <FormItem label={this.formLabelData.address}> {getFieldDecorator('address', { - rules: [{ required: true, message: 'Please input your address!' }], + rules: [{ required: true, message: this.formLabelData.addressMessage }], })(<Input />)} </FormItem> - <FormItem label="è”系电è¯"> + <FormItem label={this.formLabelData.phone}> {getFieldDecorator('phone', { rules: [ - { required: true, message: 'Please input your phone!' }, + { required: true, message: this.formLabelData.phoneMessage }, { validator: validatorPhone }, ], })(<PhoneView />)} </FormItem> - <Button type="primary">æ›´æ–°ä¿¡æ¯</Button> + <Button type="primary"> + <FormattedMessage + id="app.settings.basic.update" + defaultMessage="Update Information" + /> + </Button> </Form> </div> <div className={styles.right}> @@ -144,3 +175,4 @@ export default class BaseView extends Component { ); } } +export default injectIntl(BaseView); diff --git a/src/pages/Account/Settings/Info.js b/src/pages/Account/Settings/Info.js index e5966624..d817f1ed 100644 --- a/src/pages/Account/Settings/Info.js +++ b/src/pages/Account/Settings/Info.js @@ -1,19 +1,13 @@ import React, { Component } from 'react'; import { connect } from 'dva'; import { routerRedux } from 'dva/router'; +import { FormattedMessage } from 'react-intl'; import { Menu } from 'antd'; import styles from './Info.less'; import GridContent from '../../layouts/GridContent'; const { Item } = Menu; -const menuMap = { - base: '基本设置', - security: '安全设置', - binding: 'è´¦å·ç»‘定', - notification: '新消æ¯é€šçŸ¥', -}; - @connect(({ user }) => ({ currentUser: user.currentUser, })) @@ -21,11 +15,27 @@ export default class Info extends Component { constructor(props) { super(props); const { match, location } = props; - let key = location.pathname.replace(`${match.path}/`, ''); - key = menuMap[key] ? key : 'base'; + const key = location.pathname.replace(`${match.path}/`, ''); + // let key = location.pathname.replace(`${match.path}/`, ''); + // key = this.state.menuMap[key] ? key : 'base'; this.state = { selectKey: key, mode: 'inline', + menuMap: { + base: <FormattedMessage id="app.settings.menuMap.basic" defaultMessage="Basic Settings" />, + security: ( + <FormattedMessage id="app.settings.menuMap.security" defaultMessage="Security Settings" /> + ), + binding: ( + <FormattedMessage id="app.settings.menuMap.binding" defaultMessage="Account Binding" /> + ), + notification: ( + <FormattedMessage + id="app.settings.menuMap.notification" + defaultMessage="New Message Notification" + /> + ), + }, }; } @@ -41,7 +51,7 @@ export default class Info extends Component { static getDerivedStateFromProps(props, state) { const { match, location } = props; let selectKey = location.pathname.replace(`${match.path}/`, ''); - selectKey = menuMap[selectKey] ? selectKey : 'base'; + selectKey = state.menuMap[selectKey] ? selectKey : 'base'; if (selectKey !== state.selectKey) { return { selectKey }; } @@ -49,11 +59,12 @@ export default class Info extends Component { } getmenu = () => { + const { menuMap } = this.state; return Object.keys(menuMap).map(item => <Item key={item}>{menuMap[item]}</Item>); }; getRightTitle = () => { - const { selectKey } = this.state; + const { selectKey, menuMap } = this.state; return menuMap[selectKey]; }; diff --git a/src/pages/Account/Settings/SecurityView.js b/src/pages/Account/Settings/SecurityView.js index f26f9d6e..62cb6caa 100644 --- a/src/pages/Account/Settings/SecurityView.js +++ b/src/pages/Account/Settings/SecurityView.js @@ -1,39 +1,53 @@ import React, { Component, Fragment } from 'react'; +import { FormattedMessage } from 'react-intl'; import { List } from 'antd'; const passwordStrength = { - strong: <font className="strong">强</font>, - medium: <font className="medium">䏿–‡</font>, - weak: <font className="weak">å¼±</font>, + strong: ( + <font className="strong"> + <FormattedMessage id="app.settings.security.strong" defaultMessage="Strong" /> + </font> + ), + medium: ( + <font className="medium"> + <FormattedMessage id="app.settings.security.medium" defaultMessage="Medium" /> + </font> + ), + weak: ( + <font className="weak"> + <FormattedMessage id="app.settings.security.weak" defaultMessage="Weak" />Weak + </font> + ), }; export default class SecurityView extends Component { getData = () => { return [ { - title: '账户密ç ', - description: <Fragment> 当å‰å¯†ç 强度:{passwordStrength.strong}</Fragment>, - actions: [<a>修改</a>], + title: 'account password', + description: <Fragment> Current password strength:{passwordStrength.strong}</Fragment>, + actions: [<a>Modify</a>], }, { - title: 'å¯†ä¿æ‰‹æœº', - description: '已绑定手机:138****8293', - actions: [<a>修改</a>], + title: 'Security phone', + description: 'Bound phone:138****8293', + actions: [<a>Modify</a>], }, { - title: '密ä¿é—®é¢˜', - description: '未设置密ä¿é—®é¢˜ï¼Œå¯†ä¿é—®é¢˜å¯æœ‰æ•ˆä¿æŠ¤è´¦æˆ·å®‰å…¨', - actions: [<a>设置</a>], + title: 'Security Question', + description: + 'The security question is not set, and the security policy can effectively protect the account security', + actions: [<a>Set</a>], }, { - title: '备用邮箱', - description: '已绑定邮箱:ant***sign.com', - actions: [<a>修改</a>], + title: 'Backup Email', + description: 'Bound Email:ant***sign.com', + actions: [<a>Modify</a>], }, { - title: 'MFA 设备', - description: '未绑定 MFA 设备,绑定åŽï¼Œå¯ä»¥è¿›è¡ŒäºŒæ¬¡ç¡®è®¤', - actions: [<a>绑定</a>], + title: 'MFA Device', + description: 'Unbound MFA device, after binding, can be confirmed twice', + actions: [<a>Bind</a>], }, ]; }; -- GitLab