mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-23 02:35:49 +08:00
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:
parent
96250aa70a
commit
bc1c4d32f0
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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}}>
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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é",
|
||||
|
@ -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",
|
||||
|
@ -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": "確認コードを送信しました",
|
||||
|
@ -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": "인증 코드가 전송되었습니다",
|
||||
|
@ -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",
|
||||
|
@ -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": "Код подтверждения отправлен",
|
||||
|
@ -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",
|
||||
|
@ -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": "验证码已发送",
|
||||
|
Loading…
x
Reference in New Issue
Block a user