feat: user can upload ID card info (#2040)

* feat:user can upload ID card(#1999)

Signed-off-by: baihhh <2542274498@qq.com>

* feat: user can upload ID card, add diff languages

Signed-off-by: baihhh <2542274498@qq.com>

---------

Signed-off-by: baihhh <2542274498@qq.com>
This commit is contained in:
Baihhh 2023-07-06 20:36:32 +08:00 committed by GitHub
parent 96250aa70a
commit bc1c4d32f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 203 additions and 30 deletions

View File

@ -207,7 +207,7 @@ func (c *ApiController) UploadResource() {
}
fullFilePath = object.GetTruncatedPath(provider, fullFilePath, 175)
if tag != "avatar" && tag != "termsOfUse" {
if tag != "avatar" && tag != "termsOfUse" && !strings.HasPrefix(tag, "idCard") {
ext := filepath.Ext(filepath.Base(fullFilePath))
index := len(fullFilePath) - len(ext)
for i := 1; ; i++ {
@ -307,6 +307,25 @@ func (c *ApiController) UploadResource() {
c.ResponseError(err.Error())
return
}
case "idCardFront", "idCardBack", "idCardWithPerson":
user, err := object.GetUserNoCheck(util.GetId(owner, username))
if err != nil {
c.ResponseError(err.Error())
return
}
if user == nil {
c.ResponseError(c.T("resource:User is nil for tag: avatar"))
return
}
user.Properties[tag] = fileUrl
user.Properties["isIdCardVerified"] = "false"
_, err = object.UpdateUser(user.GetId(), user, []string{"properties"}, false)
if err != nil {
c.ResponseError(err.Error())
return
}
}
c.ResponseOk(fileUrl, objectKey)

View File

@ -53,6 +53,8 @@ class UserEditPage extends React.Component {
mode: props.location.mode !== undefined ? props.location.mode : "edit",
loading: true,
returnUrl: null,
idCardInfo: ["ID card front", "ID card back", "ID card with person"],
idCardKey: ["idCardFront", "idCardBack", "idCardWithPerson"],
};
}
@ -269,6 +271,12 @@ class UserEditPage extends React.Component {
}
}
if (accountItem.name === "ID card info" || accountItem.name === "ID card") {
if (this.state.user.properties?.isIdCardVerified === "true") {
disabled = true;
}
}
let isKeysGenerated = false;
if (this.state.user.accessKey !== "" && this.state.user.accessKey !== "") {
isKeysGenerated = true;
@ -365,20 +373,11 @@ class UserEditPage extends React.Component {
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Avatar"), i18next.t("general:Avatar - Tooltip"))} :
</Col>
<Col span={22} >
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:Preview")}:
</Col>
<Col span={22} >
<a target="_blank" rel="noreferrer" href={this.state.user.avatar}>
<img src={this.state.user.avatar} alt={this.state.user.avatar} height={90} style={{marginBottom: "20px"}} />
</a>
</Col>
</Row>
<Row style={{marginTop: "20px"}}>
<CropperDivModal buttonText={`${i18next.t("user:Upload a photo")}...`} title={i18next.t("user:Upload a photo")} user={this.state.user} organization={this.state.organizations.find(organization => organization.name === this.state.organizationName)} />
</Row>
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:Preview")}:
</Col>
<Col>
{this.renderImage(this.state.user.avatar, i18next.t("user:Upload a photo"), i18next.t("user:Set new profile picture"), "avatar", false)}
</Col>
</Row>
);
@ -536,12 +535,33 @@ class UserEditPage extends React.Component {
{Setting.getLabel(i18next.t("user:ID card"), i18next.t("user:ID card - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.user.idCard} onChange={e => {
<Input value={this.state.user.idCard} disabled={disabled} onChange={e => {
this.updateUserField("idCard", e.target.value);
}} />
</Col>
</Row>
);
} else if (accountItem.name === "ID card info") {
return (
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("user:ID card info"), i18next.t("user:ID card info - Tooltip"))} :
</Col>
<Col span={22} >
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{i18next.t("general:Preview")}:
</Col>
{
this.state.idCardInfo.map((key, index) => {
const newKey = this.state.idCardKey[index];
return this.renderImage(this.state.user.properties[newKey] || "", this.getIdCardType(key), this.getIdCardText(key), newKey, disabled);
})
}
</Row>
</Col>
</Row>
);
} else if (accountItem.name === "Homepage") {
return (
<Row style={{marginTop: "20px"}} >
@ -942,6 +962,25 @@ class UserEditPage extends React.Component {
}
}
renderImage(imgUrl, title, set, tag, disabled) {
return (
<Col span={4} style={{textAlign: "center", margin: "auto"}} key={tag}>
{
imgUrl ?
<a target="_blank" rel="noreferrer" href={imgUrl} style={{marginBottom: "10px"}}>
<img src={imgUrl} alt={imgUrl} height={90} style={{marginBottom: "20px"}} />
</a>
:
<Col style={{height: "78%", border: "1px dotted grey", borderRadius: 3, marginBottom: 5}}>
<div style={{fontSize: 30, margin: 10}}>+</div>
<div style={{verticalAlign: "middle", marginBottom: 10}}>{`请上传${title}...`}</div>
</Col>
}
<CropperDivModal disabled={disabled} tag={tag} setTitle={set} buttonText={`${title}...`} title={title} user={this.state.user} organization={this.state.organizations.find(organization => organization.name === this.state.organizationName)} />
</Col>
);
}
renderUser() {
return (
<Card size="small" title={
@ -967,6 +1006,30 @@ class UserEditPage extends React.Component {
);
}
getIdCardType(key) {
if (key === "ID card front") {
return i18next.t("user:ID card front");
} else if (key === "ID card back") {
return i18next.t("user:ID card back");
} else if (key === "ID card with person") {
return i18next.t("user:ID card with person");
} else {
return "Unknown Id card type";
}
}
getIdCardText(key) {
if (key === "ID card front") {
return i18next.t("user:Upload ID card front picture");
} else if (key === "ID card back") {
return i18next.t("user:Upload ID card back picture");
} else if (key === "ID card with person") {
return i18next.t("user:Upload ID card with person picture");
} else {
return "Unknown Id card text";
}
}
submitUserEdit(needExit) {
const user = Setting.deepCopy(this.state.user);
UserBackend.updateUser(this.state.organizationName, this.state.userName, user)

View File

@ -28,6 +28,9 @@ export const CropperDivModal = (props) => {
const [visible, setVisible] = useState(false);
const [confirmLoading, setConfirmLoading] = useState(false);
const {title} = props;
const {setTitle} = props;
const {tag} = props;
const {disabled} = props;
const {user} = props;
const {buttonText} = props;
const {organization} = props;
@ -59,8 +62,8 @@ export const CropperDivModal = (props) => {
}
// Setting.showMessage("success", "uploading...");
const extension = image.substring(image.indexOf("/") + 1, image.indexOf(";base64"));
const fullFilePath = `avatar/${user.owner}/${user.name}.${extension}`;
ResourceBackend.uploadResource(user.owner, user.name, "avatar", "CropperDivModal", fullFilePath, blob)
const fullFilePath = `${tag}/${user.owner}/${user.name}.${extension}`;
ResourceBackend.uploadResource(user.owner, user.name, tag, "CropperDivModal", fullFilePath, blob)
.then((res) => {
if (res.status === "ok") {
window.location.href = window.location.pathname;
@ -139,19 +142,19 @@ export const CropperDivModal = (props) => {
return (
<div>
<Button type="default" onClick={showModal}>
<Button type="default" onClick={showModal} disabled={disabled}>
{buttonText}
</Button>
<Modal
maskClosable={false}
title={title}
open={visible}
okText={i18next.t("user:Upload a photo")}
okText={title}
confirmLoading={confirmLoading}
onCancel={handleCancel}
width={600}
footer={
[<Button block key="submit" type="primary" onClick={handleOk}>{i18next.t("user:Set new profile picture")}</Button>]
[<Button block key="submit" type="primary" onClick={handleOk}>{setTitle}</Button>]
}
>
<Col style={{margin: "0px auto 60px auto", width: 1000, height: 350}}>

View File

@ -904,8 +904,13 @@
"Homepage - Tooltip": "Homepage-URL des Benutzers",
"ID card": "Ausweis",
"ID card - Tooltip": "ID card - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "ID card type",
"ID card type - Tooltip": "ID card type - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "Geben Sie Ihre E-Mail-Adresse ein",
"Input your phone number": "Geben Sie Ihre Telefonnummer ein",
"Is admin": "Ist Admin",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "Zwei von Ihnen eingegebene Passwörter stimmen nicht überein.",
"Unlink": "Link aufheben",
"Upload (.xlsx)": "Hochladen (.xlsx)",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Lade ein Foto hoch",
"Values": "Werte",
"Verification code sent": "Bestätigungscode gesendet",

View File

@ -570,8 +570,8 @@
"pricing": {
"Copy pricing page URL": "Copy pricing page URL",
"Edit Pricing": "Edit Pricing",
"Free": "Free",
"Failed to get plans": "Failed to get plans",
"Free": "Free",
"Getting started": "Getting started",
"New Pricing": "New Pricing",
"Trial duration": "Trial duration",
@ -904,8 +904,13 @@
"Homepage - Tooltip": "Homepage URL of the user",
"ID card": "ID card",
"ID card - Tooltip": "ID card - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "ID card type",
"ID card type - Tooltip": "ID card type - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "Input your email",
"Input your phone number": "Input your phone number",
"Is admin": "Is admin",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "Two passwords you typed do not match.",
"Unlink": "Unlink",
"Upload (.xlsx)": "Upload (.xlsx)",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Upload a photo",
"Values": "Values",
"Verification code sent": "Verification code sent",

View File

@ -570,8 +570,8 @@
"pricing": {
"Copy pricing page URL": "Copiar URL de la página de precios",
"Edit Pricing": "Edit Pricing",
"Free": "Gratis",
"Failed to get plans": "No se pudieron obtener los planes",
"Free": "Gratis",
"Getting started": "Empezar",
"New Pricing": "New Pricing",
"Trial duration": "Duración del período de prueba",
@ -904,8 +904,13 @@
"Homepage - Tooltip": "URL de la página de inicio del usuario",
"ID card": "Tarjeta de identificación",
"ID card - Tooltip": "ID card - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "ID card type",
"ID card type - Tooltip": "ID card type - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "Introduce tu correo electrónico",
"Input your phone number": "Ingrese su número de teléfono",
"Is admin": "Es el administrador",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "Dos contraseñas que has escrito no coinciden.",
"Unlink": "Desvincular",
"Upload (.xlsx)": "Subir (.xlsx)",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Subir una foto",
"Values": "Valores",
"Verification code sent": "Código de verificación enviado",

View File

@ -570,8 +570,8 @@
"pricing": {
"Copy pricing page URL": "Copier l'URL de la page tarifs",
"Edit Pricing": "Edit Pricing",
"Free": "Gratuit",
"Failed to get plans": "Échec de l'obtention des plans",
"Free": "Gratuit",
"Getting started": "Commencer",
"New Pricing": "New Pricing",
"Trial duration": "Durée de l'essai",
@ -904,8 +904,13 @@
"Homepage - Tooltip": "Adresse URL de la page d'accueil de l'utilisateur",
"ID card": "carte d'identité",
"ID card - Tooltip": "ID card - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "ID card type",
"ID card type - Tooltip": "ID card type - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "Entrez votre adresse e-mail",
"Input your phone number": "Saisissez votre numéro de téléphone",
"Is admin": "Est l'administrateur",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "Deux mots de passe que vous avez tapés ne correspondent pas.",
"Unlink": "Détacher",
"Upload (.xlsx)": "Télécharger (.xlsx)",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Télécharger une photo",
"Values": "Valeurs",
"Verification code sent": "Code de vérification envoyé",

View File

@ -570,8 +570,8 @@
"pricing": {
"Copy pricing page URL": "Salin URL halaman harga",
"Edit Pricing": "Edit Pricing",
"Free": "Gratis",
"Failed to get plans": "Gagal mendapatkan rencana",
"Free": "Gratis",
"Getting started": "Mulai",
"New Pricing": "New Pricing",
"Trial duration": "Durasi percobaan",
@ -904,8 +904,13 @@
"Homepage - Tooltip": "URL halaman depan pengguna",
"ID card": "Kartu identitas",
"ID card - Tooltip": "ID card - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "ID card type",
"ID card type - Tooltip": "ID card type - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "Masukkan alamat email Anda",
"Input your phone number": "Masukkan nomor telepon Anda",
"Is admin": "Apakah admin?",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "Dua password yang Anda ketikkan tidak cocok.",
"Unlink": "Membatalkan Tautan",
"Upload (.xlsx)": "Unggah (.xlsx)",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Unggah foto",
"Values": "Nilai-nilai",
"Verification code sent": "Kode verifikasi telah dikirim",

View File

@ -570,8 +570,8 @@
"pricing": {
"Copy pricing page URL": "価格ページのURLをコピー",
"Edit Pricing": "Edit Pricing",
"Free": "無料",
"Failed to get plans": "計画の取得に失敗しました",
"Free": "無料",
"Getting started": "はじめる",
"New Pricing": "New Pricing",
"Trial duration": "トライアル期間の長さ",
@ -904,8 +904,13 @@
"Homepage - Tooltip": "ユーザーのホームページのURL",
"ID card": "IDカード",
"ID card - Tooltip": "ID card - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "ID card type",
"ID card type - Tooltip": "ID card type - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "あなたのメールアドレスを入力してください",
"Input your phone number": "電話番号を入力してください",
"Is admin": "管理者ですか?",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "2つのパスワードが一致しません。",
"Unlink": "アンリンク",
"Upload (.xlsx)": "アップロード(.xlsx",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "写真をアップロードしてください",
"Values": "価値観",
"Verification code sent": "確認コードを送信しました",

View File

@ -570,8 +570,8 @@
"pricing": {
"Copy pricing page URL": "가격 페이지 URL 복사",
"Edit Pricing": "Edit Pricing",
"Free": "무료",
"Failed to get plans": "계획을 가져오지 못했습니다.",
"Free": "무료",
"Getting started": "시작하기",
"New Pricing": "New Pricing",
"Trial duration": "체험 기간",
@ -904,8 +904,13 @@
"Homepage - Tooltip": "사용자의 홈페이지 URL",
"ID card": "ID 카드",
"ID card - Tooltip": "ID card - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "ID card type",
"ID card type - Tooltip": "ID card type - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "이메일을 입력하세요",
"Input your phone number": "전화번호를 입력하세요",
"Is admin": "어드민인가요?",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "두 개의 비밀번호가 일치하지 않습니다.",
"Unlink": "연결 해제하기",
"Upload (.xlsx)": "업로드 (.xlsx)",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "사진을 업로드하세요",
"Values": "가치들",
"Verification code sent": "인증 코드가 전송되었습니다",

View File

@ -570,8 +570,8 @@
"pricing": {
"Copy pricing page URL": "Sao chép URL trang bảng giá",
"Edit Pricing": "Edit Pricing",
"Free": "Miễn phí",
"Failed to get plans": "Falha ao obter planos",
"Free": "Miễn phí",
"Getting started": "Bắt đầu",
"New Pricing": "New Pricing",
"Trial duration": "Thời gian thử nghiệm",
@ -904,8 +904,13 @@
"Homepage - Tooltip": "URL da página inicial do usuário",
"ID card": "Cartão de identidade",
"ID card - Tooltip": "Cartão de identidade - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "Tipo de cartão de identidade",
"ID card type - Tooltip": "Tipo de cartão de identidade - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "Digite seu e-mail",
"Input your phone number": "Digite seu número de telefone",
"Is admin": "É administrador",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "As duas senhas digitadas não coincidem.",
"Unlink": "Desvincular",
"Upload (.xlsx)": "Enviar (.xlsx)",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Enviar uma foto",
"Values": "Valores",
"Verification code sent": "Código de verificação enviado",

View File

@ -570,8 +570,8 @@
"pricing": {
"Copy pricing page URL": "Скопировать URL прайс-листа",
"Edit Pricing": "Edit Pricing",
"Free": "Бесплатно",
"Failed to get plans": "Не удалось получить планы",
"Free": "Бесплатно",
"Getting started": "Выьрать план",
"New Pricing": "New Pricing",
"Trial duration": "Продолжительность пробного периода",
@ -904,8 +904,13 @@
"Homepage - Tooltip": "URL домашней страницы пользователя",
"ID card": "ID-карта",
"ID card - Tooltip": "ID card - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "ID card type",
"ID card type - Tooltip": "ID card type - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "Введите свой адрес электронной почты",
"Input your phone number": "Введите ваш номер телефона",
"Is admin": "Это администратор",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "Два введенных вами пароля не совпадают.",
"Unlink": "Отсоединить",
"Upload (.xlsx)": "Загрузить (.xlsx)",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Загрузить фото",
"Values": "Значения",
"Verification code sent": "Код подтверждения отправлен",

View File

@ -570,8 +570,8 @@
"pricing": {
"Copy pricing page URL": "Sao chép URL trang bảng giá",
"Edit Pricing": "Edit Pricing",
"Free": "Miễn phí",
"Failed to get plans": "Không thể lấy được các kế hoạch",
"Free": "Miễn phí",
"Getting started": "Bắt đầu",
"New Pricing": "New Pricing",
"Trial duration": "Thời gian thử nghiệm",
@ -904,8 +904,13 @@
"Homepage - Tooltip": "Địa chỉ URL của trang chủ của người dùng",
"ID card": "Thẻ căn cước dân sự",
"ID card - Tooltip": "ID card - Tooltip",
"ID card back": "ID card back",
"ID card front": "ID card front",
"ID card info": "ID card info",
"ID card info - Tooltip": "ID card info - Tooltip",
"ID card type": "ID card type",
"ID card type - Tooltip": "ID card type - Tooltip",
"ID card with person": "ID card with person",
"Input your email": "Nhập địa chỉ email của bạn",
"Input your phone number": "Nhập số điện thoại của bạn",
"Is admin": "Là quản trị viên",
@ -961,6 +966,9 @@
"Two passwords you typed do not match.": "Hai mật khẩu mà bạn đã nhập không khớp.",
"Unlink": "Hủy liên kết",
"Upload (.xlsx)": "Tải lên (.xlsx)",
"Upload ID card back picture": "Upload ID card back picture",
"Upload ID card front picture": "Upload ID card front picture",
"Upload ID card with person picture": "Upload ID card with person picture",
"Upload a photo": "Tải lên một bức ảnh",
"Values": "Giá trị",
"Verification code sent": "Mã xác minh đã được gửi",

View File

@ -902,8 +902,13 @@
"Homepage - Tooltip": "个人主页链接",
"ID card": "身份证号",
"ID card - Tooltip": "身份证号 - Tooltip",
"ID card back": "身份证反面",
"ID card front": "身份证正面",
"ID card info": "身份证照片",
"ID card info - Tooltip": "身份证照片用于进行用户身份验证,验证成功后如要修改请联系管理员",
"ID card type": "身份证类型",
"ID card type - Tooltip": "身份证类型 - Tooltip",
"ID card with person": "手持身份证",
"Input your email": "请输入邮箱",
"Input your phone number": "输入手机号",
"Is admin": "是组织管理员",
@ -959,6 +964,9 @@
"Two passwords you typed do not match.": "两次输入的密码不匹配。",
"Unlink": "解绑",
"Upload (.xlsx)": "上传(.xlsx",
"Upload ID card back picture": "上传身份证反面照片",
"Upload ID card front picture": "上传身份证正面照片",
"Upload ID card with person picture": "上传手持身份证照片",
"Upload a photo": "上传头像",
"Values": "值",
"Verification code sent": "验证码已发送",