Browse Source

feat: add English translation for Login screen (#7535)

* feat: add Indonesian translation

* feat: add Indonesian translation

* style: format code using Prettier

* feat: add English translation for Login screen
pull/7588/head
kevinadhiguna 5 years ago
committed by GitHub
parent
commit
e133575d5e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      src/layouts/UserLayout.tsx
  2. 2
      src/locales/en-US.ts
  3. 24
      src/locales/en-US/pages.ts
  4. 10
      src/pages/user/login/components/Login/LoginItem.tsx
  5. 105
      src/pages/user/login/index.tsx

9
src/layouts/UserLayout.tsx

@ -1,6 +1,6 @@
import { DefaultFooter, MenuDataItem, getMenuData, getPageTitle } from '@ant-design/pro-layout'; import { DefaultFooter, MenuDataItem, getMenuData, getPageTitle } from '@ant-design/pro-layout';
import { Helmet, HelmetProvider } from 'react-helmet-async'; import { Helmet, HelmetProvider } from 'react-helmet-async';
import { Link, SelectLang, useIntl, ConnectProps, connect } from 'umi'; import { Link, SelectLang, useIntl, ConnectProps, connect, FormattedMessage } from 'umi';
import React from 'react'; import React from 'react';
import { ConnectState } from '@/models/connect'; import { ConnectState } from '@/models/connect';
import logo from '../assets/logo.svg'; import logo from '../assets/logo.svg';
@ -52,7 +52,12 @@ const UserLayout: React.FC<UserLayoutProps> = (props) => {
<span className={styles.title}>Ant Design</span> <span className={styles.title}>Ant Design</span>
</Link> </Link>
</div> </div>
<div className={styles.desc}>Ant Design 西 Web </div> <div className={styles.desc}>
<FormattedMessage
id="pages.layouts.userLayout.title"
defaultMessage="Ant Design 是西湖区最具影响力的 Web 设计规范"
/>
</div>
</div> </div>
{children} {children}
</div> </div>

2
src/locales/en-US.ts

@ -4,6 +4,7 @@ import menu from './en-US/menu';
import pwa from './en-US/pwa'; import pwa from './en-US/pwa';
import settingDrawer from './en-US/settingDrawer'; import settingDrawer from './en-US/settingDrawer';
import settings from './en-US/settings'; import settings from './en-US/settings';
import pages from './en-US/pages';
export default { export default {
'navBar.lang': 'Languages', 'navBar.lang': 'Languages',
@ -19,4 +20,5 @@ export default {
...settings, ...settings,
...pwa, ...pwa,
...component, ...component,
...pages,
}; };

24
src/locales/en-US/pages.ts

@ -0,0 +1,24 @@
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.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': 'Submit',
'pages.login.loginWith': 'Login with :',
'pages.login.registerAccount': 'Register Account',
};

10
src/pages/user/login/components/Login/LoginItem.tsx

@ -3,6 +3,7 @@ import React, { useState, useCallback, useEffect } from 'react';
import omit from 'omit.js'; import omit from 'omit.js';
import { FormItemProps } from 'antd/es/form/FormItem'; import { FormItemProps } from 'antd/es/form/FormItem';
import { getFakeCaptcha } from '@/services/login'; import { getFakeCaptcha } from '@/services/login';
import { FormattedMessage } from 'umi';
import ItemMap from './map'; import ItemMap from './map';
import LoginContext, { LoginContextProps } from './LoginContext'; import LoginContext, { LoginContextProps } from './LoginContext';
@ -131,7 +132,14 @@ const LoginItem: React.FC<LoginItemProps> = (props) => {
onGetCaptcha(value); onGetCaptcha(value);
}} }}
> >
{timing ? `${count}` : '获取验证码'} {timing ? (
`${count}`
) : (
<FormattedMessage
id="pages.login.phoneLogin.getVerificationCode"
defaultMessage="获取验证码"
/>
)}
</Button> </Button>
</Col> </Col>
</Row> </Row>

105
src/pages/user/login/index.tsx

@ -1,7 +1,7 @@
import { AlipayCircleOutlined, TaobaoCircleOutlined, WeiboCircleOutlined } from '@ant-design/icons'; import { AlipayCircleOutlined, TaobaoCircleOutlined, WeiboCircleOutlined } from '@ant-design/icons';
import { Alert, Checkbox } from 'antd'; import { Alert, Checkbox } from 'antd';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Link, connect, Dispatch } from 'umi'; import { Link, connect, Dispatch, useIntl, FormattedMessage } from 'umi';
import { StateType } from '@/models/login'; import { StateType } from '@/models/login';
import { LoginParamsType } from '@/services/login'; import { LoginParamsType } from '@/services/login';
import { ConnectState } from '@/models/connect'; import { ConnectState } from '@/models/connect';
@ -34,6 +34,7 @@ const Login: React.FC<LoginProps> = (props) => {
const { status, type: loginType } = userLogin; const { status, type: loginType } = userLogin;
const [autoLogin, setAutoLogin] = useState(true); const [autoLogin, setAutoLogin] = useState(true);
const [type, setType] = useState<string>('account'); const [type, setType] = useState<string>('account');
const intl = useIntl();
const handleSubmit = (values: LoginParamsType) => { const handleSubmit = (values: LoginParamsType) => {
const { dispatch } = props; const { dispatch } = props;
@ -45,84 +46,148 @@ const Login: React.FC<LoginProps> = (props) => {
return ( return (
<div className={styles.main}> <div className={styles.main}>
<LoginForm activeKey={type} onTabChange={setType} onSubmit={handleSubmit}> <LoginForm activeKey={type} onTabChange={setType} onSubmit={handleSubmit}>
<Tab key="account" tab="账户密码登录"> <Tab
key="account"
tab={intl.formatMessage({
id: 'pages.login.accountLogin.tab',
defaultMessage: '账户密码登录',
})}
>
{status === 'error' && loginType === 'account' && !submitting && ( {status === 'error' && loginType === 'account' && !submitting && (
<LoginMessage content="账户或密码错误(admin/ant.design)" /> <LoginMessage
content={intl.formatMessage({
id: 'pages.login.accountLogin.errorMessage',
defaultMessage: '账户或密码错误(admin/ant.design)',
})}
/>
)} )}
<UserName <UserName
name="userName" name="userName"
placeholder="用户名: admin or user" placeholder={intl.formatMessage({
id: 'pages.login.username.placeholder',
defaultMessage: '用户名: admin or user',
})}
rules={[ rules={[
{ {
required: true, required: true,
message: '请输入用户名!', message: (
<FormattedMessage
id="pages.login.username.required"
defaultMessage="请输入用户名!"
/>
),
}, },
]} ]}
/> />
<Password <Password
name="password" name="password"
placeholder="密码: ant.design" placeholder={intl.formatMessage({
id: 'pages.login.password.placeholder',
defaultMessage: '密码: ant.design',
})}
rules={[ rules={[
{ {
required: true, required: true,
message: '请输入密码!', message: (
<FormattedMessage
id="pages.login.password.required"
defaultMessage="请输入密码!"
/>
),
}, },
]} ]}
/> />
</Tab> </Tab>
<Tab key="mobile" tab="手机号登录"> <Tab
key="mobile"
tab={intl.formatMessage({
id: 'pages.login.phoneLogin.tab',
defaultMessage: '手机号登录',
})}
>
{status === 'error' && loginType === 'mobile' && !submitting && ( {status === 'error' && loginType === 'mobile' && !submitting && (
<LoginMessage content="验证码错误" /> <LoginMessage
content={intl.formatMessage({
id: 'pages.login.phoneLogin.errorMessage',
defaultMessage: '验证码错误',
})}
/>
)} )}
<Mobile <Mobile
name="mobile" name="mobile"
placeholder="手机号" placeholder={intl.formatMessage({
id: 'pages.login.phoneNumber.placeholder',
defaultMessage: '手机号',
})}
rules={[ rules={[
{ {
required: true, required: true,
message: '请输入手机号!', message: (
<FormattedMessage
id="pages.login.phoneNumber.required"
defaultMessage="请输入手机号!"
/>
),
}, },
{ {
pattern: /^1\d{10}$/, pattern: /^1\d{10}$/,
message: '手机号格式错误!', message: (
<FormattedMessage
id="pages.login.phoneNumber.invalid"
defaultMessage="手机号格式错误!"
/>
),
}, },
]} ]}
/> />
<Captcha <Captcha
name="captcha" name="captcha"
placeholder="验证码" placeholder={intl.formatMessage({
id: 'pages.login.captcha.placeholder',
defaultMessage: '验证码',
})}
countDown={120} countDown={120}
getCaptchaButtonText="" getCaptchaButtonText=""
getCaptchaSecondText="秒" getCaptchaSecondText={intl.formatMessage({
id: 'pages.getCaptchaSecondText',
defaultMessage: '秒',
})}
rules={[ rules={[
{ {
required: true, required: true,
message: '请输入验证码!', message: (
<FormattedMessage
id="pages.login.captcha.required"
defaultMessage="请输入验证码!"
/>
),
}, },
]} ]}
/> />
</Tab> </Tab>
<div> <div>
<Checkbox checked={autoLogin} onChange={(e) => setAutoLogin(e.target.checked)}> <Checkbox checked={autoLogin} onChange={(e) => setAutoLogin(e.target.checked)}>
<FormattedMessage id="pages.login.rememberMe" defaultMessage="自动登录" />
</Checkbox> </Checkbox>
<a <a
style={{ style={{
float: 'right', float: 'right',
}} }}
> >
<FormattedMessage id="pages.login.forgotPassword" defaultMessage="忘记密码" />
</a> </a>
</div> </div>
<Submit loading={submitting}></Submit> <Submit loading={submitting}>
<FormattedMessage id="pages.login.submit" defaultMessage="登录" />
</Submit>
<div className={styles.other}> <div className={styles.other}>
<FormattedMessage id="pages.login.loginWith" defaultMessage="其他登录方式" />
<AlipayCircleOutlined className={styles.icon} /> <AlipayCircleOutlined className={styles.icon} />
<TaobaoCircleOutlined className={styles.icon} /> <TaobaoCircleOutlined className={styles.icon} />
<WeiboCircleOutlined className={styles.icon} /> <WeiboCircleOutlined className={styles.icon} />
<Link className={styles.register} to="/user/register"> <Link className={styles.register} to="/user/register">
<FormattedMessage id="pages.login.registerAccount" defaultMessage="注册账户" />
</Link> </Link>
</div> </div>
</LoginForm> </LoginForm>

Loading…
Cancel
Save