mirror of
https://github.com/OpenSignLabs/OpenSign.git
synced 2026-08-20 06:35:54 +02:00
feat: appply multi-support language functionality on login,signup-page,sidebar menu
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"create-account": "Create account",
|
||||
"create-account": "Create Account",
|
||||
"login": "Login",
|
||||
"language":"Language",
|
||||
"name":"Name",
|
||||
@@ -15,6 +15,118 @@
|
||||
"ascending":"Ascending",
|
||||
"Action":"Action",
|
||||
"add":"add",
|
||||
"add-new-folder":"ajouter un nouveau dossier"
|
||||
"add-new-folder":"ajouter un nouveau dossier",
|
||||
"disable-documentId":"Disable DocumentId",
|
||||
"edit":"Edit",
|
||||
"change-password":"Change Password",
|
||||
"save":"Save",
|
||||
"cancel":"Cancel",
|
||||
"upgrade-now":"Upgrade now",
|
||||
"user":"User",
|
||||
"public-profile-help": "This is your public URL. Copy or share it with the signer, and you will be able to see all your publicly set templates.",
|
||||
"tagline-help":"This Tagline will appear on your OpenSign public profile for ex. https://opensign.me/alex",
|
||||
"welcome":"Welcome Back!",
|
||||
"Login-to-your-account":"Login to your account",
|
||||
"password":"Password",
|
||||
"forgot-password":"Forgot Password?",
|
||||
"loading":"Loading...",
|
||||
"sign-SSO":"Sign in with SSO",
|
||||
"login-page":"Login Page",
|
||||
"or":"OR",
|
||||
"signup-page":"Signup page",
|
||||
"password-length":"Password should be 8 characters long",
|
||||
"password-case":"Password should contain uppercase letter, lowercase letter, digit",
|
||||
"password-special-char":" Password should contain special character",
|
||||
"agreee":"I agree to the",
|
||||
"term":"Terms of Service",
|
||||
"register":"Register",
|
||||
"sidebar": {
|
||||
"Dashboard": "Dashboard",
|
||||
"Sign yourself": "Sign yourself",
|
||||
"Request signatures":"Request signatures",
|
||||
"Templates":"Templates",
|
||||
"Templates-Children":{
|
||||
"Create template":"Create template",
|
||||
"Manage templates": "Manage templates"
|
||||
},
|
||||
"OpenSign™ Drive":"OpenSign™ Drive",
|
||||
"Reports":"Reports",
|
||||
"Reports-Children" :{
|
||||
"Need your sign": "Need your sign",
|
||||
"In Progress": "In Progress",
|
||||
"Completed":"Completed",
|
||||
"Drafts": "Drafts",
|
||||
"Declined": "Declined",
|
||||
"Expired":"Expired",
|
||||
"Contactbook":"Contactbook"
|
||||
},
|
||||
"Settings": "Settings",
|
||||
"Settings-Children":{
|
||||
"My Signature": "My Signature",
|
||||
"API Token":"API Token",
|
||||
"Webhook":"Webhook"
|
||||
}
|
||||
},
|
||||
"dashboard-card":{
|
||||
"Need your Signature":"Need your Signature",
|
||||
"Out for signatures":"Out for Signatures"
|
||||
},
|
||||
"report-name":{
|
||||
"Draft Documents":"Draft Documents",
|
||||
"Need your sign":"Need your sign",
|
||||
"In-progress documents":"In-progress documents",
|
||||
"Completed Documents":"Completed Documents",
|
||||
"Declined Documents":"Declined Documents",
|
||||
"Expired Documents":"Expired Documents",
|
||||
"Recently sent for signatures":"Recently sent for signatures",
|
||||
"Recent signature requests":"Recent signature requests",
|
||||
"Drafts":"Drafts",
|
||||
"Contactbook":"Contactbook",
|
||||
"Templates":"Templates"
|
||||
},
|
||||
"report-heading":{
|
||||
"Sr.No":"Sr.No",
|
||||
"Title":"Title",
|
||||
"Email":"Email",
|
||||
"Phone":"Phone",
|
||||
"File":"File",
|
||||
"Owner": "Owner",
|
||||
"Signers":"Signers",
|
||||
"Note": "Note",
|
||||
"Folder": "Folder",
|
||||
"Reason": "Reason"
|
||||
|
||||
},
|
||||
"form-name":{
|
||||
"Sign Yourself":"Sign Yourself",
|
||||
"Request Signatures":"Request Signatures",
|
||||
"New Template":"New Template"
|
||||
},
|
||||
"file-type":"pdf, png, jpg, jpeg",
|
||||
"docx":"docx",
|
||||
"file-selected":"file selected",
|
||||
"template-title":"Template Title",
|
||||
"document-title":"Document Title",
|
||||
"description":"Description",
|
||||
"time-to-complete":"Time To Complete (Days)",
|
||||
"send-in-order":"Send In Order",
|
||||
"send-in-order-help":{
|
||||
"p1":"Choose how you want the signing requests to be sent to the document signers:",
|
||||
"p2":" Selecting this option will send the signing request to the first signer initially. Once the first signer completes their part, the next signer in the sequence will receive the request. This process continues until all signers have signed the document. This method ensures that the document is signed in a specific order.",
|
||||
"p3":" Selecting this option will send the signing links to all signers simultaneously. Every signer can sign the document at their convenience, regardless of whether other signers have completed their signatures. This method is faster but does not enforce any signing order among the participants.",
|
||||
"p4":" Select the option that best suits the needs of your document processing."
|
||||
},
|
||||
"no":"No",
|
||||
"auto-reminder":"Auto reminder",
|
||||
"remind-once":" Remind once in every (Days)",
|
||||
"next":"Next"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"create account": "Créer un compte",
|
||||
"create-account": "Créer un compte",
|
||||
"login": "se connecter",
|
||||
"language":"Langue",
|
||||
"name":"Nom",
|
||||
@@ -15,6 +15,111 @@
|
||||
"Ascending":"Ascendant",
|
||||
"Action":"Action",
|
||||
"add":"ajouter",
|
||||
"add-new-folder":"add new folder"
|
||||
}
|
||||
"add-new-folder":"add new folder",
|
||||
"disable-documentId":"Désactiver l'ID de document",
|
||||
"edit":"Modifier",
|
||||
"change-password":"Changer le mot de passe",
|
||||
"save":"Sauvegarder",
|
||||
"cancel":"Annuler",
|
||||
"upgrade-now":"Mettre à jour maintenant",
|
||||
"user":"Utilisateur",
|
||||
"public-profile-help":"Il s'agit de votre URL publique. Copiez-le ou partagez-le avec le signataire et vous pourrez voir tous vos modèles définis publiquement.",
|
||||
"tagline-help":"Ce slogan apparaîtra sur votre profil public OpenSign par exemple. https://opensign.me/alex",
|
||||
"welcome":"Content de te revoir!",
|
||||
"Login-to-your-account" :"Connectez-vous à votre compte",
|
||||
"password" :"Mot de passe",
|
||||
"forgot-password":"Mot de passe oublié?",
|
||||
"loading":"Chargement...",
|
||||
"sign-SSO":"Connectez-vous avec SSO",
|
||||
"login-page":"Page de connexion",
|
||||
"or":"OU",
|
||||
"signup-page":"Page d'inscription",
|
||||
"password-length":"Le mot de passe doit être 8 Longs caractères",
|
||||
"password-case":"Le mot de passe doit contenir lettre majuscule, lettre minuscule, chiffre",
|
||||
"password-special-char":"Le mot de passe doit contenir un caractère spécial",
|
||||
"agreee":"je suis d'accord avec le",
|
||||
"term":"Conditions d'utilisation",
|
||||
"register" :"Registre",
|
||||
"sidebar": {
|
||||
"Dashboard": "Tableau de bord",
|
||||
"Sign yourself": "Signez-vous",
|
||||
"Request signatures":"Demander des signatures",
|
||||
"Templates":"Modèles",
|
||||
"Templates-Children":{
|
||||
"Create template":"Créer un modèle",
|
||||
"Manage templates": "Gérer les modèles"
|
||||
},
|
||||
"OpenSign™ Drive":"Lecteur OpenSign™",
|
||||
"Reports":"Rapports",
|
||||
"Reports-Children" :{
|
||||
"Need your sign": "Besoin de votre signe",
|
||||
"In Progress": "En cours",
|
||||
"Completed":"Complété",
|
||||
"Drafts": "Brouillons",
|
||||
"Declined": "Diminué",
|
||||
"Expired":"Expiré",
|
||||
"Contactbook":"Carnet de contacts"
|
||||
},
|
||||
"Settings": "Paramètres",
|
||||
"Settings-Children":{
|
||||
"My Signature": "Ma signature",
|
||||
"API Token":"Jeton API",
|
||||
"Webhook":"Webhook"
|
||||
}
|
||||
},
|
||||
"dashboard-card":{
|
||||
"Need your Signature":"Besoin de votre signature",
|
||||
"Out for signatures":"En quête de signatures"
|
||||
},
|
||||
"report-name":{
|
||||
"Draft Documents":"Projets de documents",
|
||||
"Need your sign":"Besoin de votre signe",
|
||||
"In-progress documents":"Documents en cours",
|
||||
"Completed Documents":"Documents complétés",
|
||||
"Declined Documents":"Documents refusés",
|
||||
"Expired Documents":"Documents expirés",
|
||||
"Recently sent for signatures":"Récemment envoyé pour signature",
|
||||
"Recent signature requests":"Demandes de signature récentes",
|
||||
"Drafts":"Brouillons",
|
||||
"Contactbook":"Carnet de contacts",
|
||||
"Templates":"Modèles"
|
||||
},
|
||||
"report-heading":{
|
||||
"Sr.No":"Sr. Non",
|
||||
"Title":"Titre",
|
||||
"Email":"E-mail",
|
||||
"Phone":"Téléphone",
|
||||
"File":"Déposer",
|
||||
"Owner":"Propriétaire",
|
||||
"Signers":"Signataires",
|
||||
"Note": "Note",
|
||||
"Folder":"Dossier",
|
||||
"Reason": "Raison"
|
||||
},
|
||||
"form-name":{
|
||||
"Sign Yourself":"Signez-vous",
|
||||
"Request Signatures":"Demander des signatures",
|
||||
"New Template":"Nouveau modèle"
|
||||
},
|
||||
"file-type":"pdf, png, jpg, jpeg",
|
||||
"docx":"docx",
|
||||
"file-selected":"fichier sélectionné",
|
||||
"template-title":"Titre du modèle",
|
||||
"document-title":"Titre du document",
|
||||
"description":"Description",
|
||||
"time-to-complete":"Temps de réalisation (jours)",
|
||||
"send-in-order":"Envoyer dans la commande",
|
||||
"send-in-order-help":{
|
||||
"p1":"Choisissez la manière dont vous souhaitez que les demandes de signature soient envoyées aux signataires du document :",
|
||||
"p2":"La sélection de cette option enverra initialement la demande de signature au premier signataire. Une fois que le premier signataire a terminé sa partie, le prochain signataire de la séquence recevra la demande. Ce processus se poursuit jusqu'à ce que tous les signataires aient signé le document. Cette méthode garantit que le document est signé dans un ordre spécifique.",
|
||||
"p3":"La sélection de cette option enverra les liens de signature à tous les signataires simultanément. Chaque signataire peut signer le document à sa convenance, que d'autres signataires aient ou non complété leur signature. Cette méthode est plus rapide mais n’impose aucun ordre de signature entre les participants.",
|
||||
"p4":"Sélectionnez l'option qui correspond le mieux aux besoins de votre traitement de documents."
|
||||
},
|
||||
"no":"Non",
|
||||
"auto-reminder":"Rappel automatique",
|
||||
"remind-once":"Rappeler une fois tous les (jours)",
|
||||
"next":"suivant"
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import React from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { openInNewTab } from "../../constant/Utils";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
const DashboardButton = (props) => {
|
||||
const navigate = useNavigate();
|
||||
const { t } = useTranslation();
|
||||
|
||||
function openReport() {
|
||||
if (props.Data && props.Data.Redirect_type) {
|
||||
@@ -35,7 +37,9 @@ const DashboardButton = (props) => {
|
||||
} text-[25px] lg:text-[30px]`}
|
||||
></i>
|
||||
</span>
|
||||
<div className=" text-lg ml-3 text-base-content">{props.Label}</div>
|
||||
<div className=" text-lg ml-3 text-base-content">
|
||||
{t(`sidebar.${props.Label}`)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -4,9 +4,11 @@ import Parse from "parse";
|
||||
import getReplacedHashQuery from "../../constant/getReplacedHashQuery";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import Tooltip from "../../primitives/Tooltip";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
const DashboardCard = (props) => {
|
||||
const navigate = useNavigate();
|
||||
const { t } = useTranslation();
|
||||
const [parseBaseUrl] = useState(localStorage.getItem("baseUrl"));
|
||||
const [parseAppId] = useState(localStorage.getItem("parseAppId"));
|
||||
const [response, setresponse] = useState("");
|
||||
@@ -321,6 +323,7 @@ const DashboardCard = (props) => {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div
|
||||
onClick={() => openReport()}
|
||||
@@ -339,7 +342,9 @@ const DashboardCard = (props) => {
|
||||
></i>
|
||||
</span>
|
||||
<div className="font-medium">
|
||||
<div className="text-base lg:text-lg"> {props.Label}</div>
|
||||
<div className="text-base lg:text-lg">
|
||||
{t(`dashboard-card.${props.Label}`)}
|
||||
</div>
|
||||
<div className="text-2xl font-light">
|
||||
{loading ? <div className="loader-01"></div> : setFormat(response)}
|
||||
</div>
|
||||
|
||||
@@ -10,7 +10,7 @@ const buttonList = [
|
||||
icon: "fa-light fa-pen-nib"
|
||||
},
|
||||
{
|
||||
label: "Request signature",
|
||||
label: "Request signatures",
|
||||
redirectId: "8mZzFxbG1z",
|
||||
redirectType: "Form",
|
||||
icon: "fa-light fa-paper-plane"
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import React from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { NavLink } from "react-router-dom";
|
||||
|
||||
const Menu = ({ item, isOpen, closeSidebar }) => {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<li key={item.title} role="none" className="my-0.5">
|
||||
<NavLink
|
||||
@@ -20,7 +22,7 @@ const Menu = ({ item, isOpen, closeSidebar }) => {
|
||||
role="menuitem"
|
||||
>
|
||||
<i className={`${item.icon} text-[18px]`} aria-hidden="true"></i>
|
||||
<span className="ml-3 lg:ml-4">{item.title}</span>
|
||||
<span className="ml-3 lg:ml-4">{t(`sidebar.${item.title}`)}</span>
|
||||
</NavLink>
|
||||
</li>
|
||||
);
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import React from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { NavLink } from "react-router-dom";
|
||||
|
||||
const Submenu = ({ item, closeSidebar, toggleSubmenu, submenuOpen }) => {
|
||||
const { t } = useTranslation();
|
||||
const { title, icon, children } = item;
|
||||
return (
|
||||
<li role="none" className="my-0.5">
|
||||
@@ -14,7 +16,7 @@ const Submenu = ({ item, closeSidebar, toggleSubmenu, submenuOpen }) => {
|
||||
>
|
||||
<i className={`${icon} text-[18px]`}></i>
|
||||
<div className="flex justify-between items-center w-full">
|
||||
<span className="ml-3 lg:ml-4">{title}</span>
|
||||
<span className="ml-3 lg:ml-4">{t(`sidebar.${item.title}`)}</span>
|
||||
<i
|
||||
className={`${
|
||||
submenuOpen[item.title]
|
||||
@@ -48,7 +50,9 @@ const Submenu = ({ item, closeSidebar, toggleSubmenu, submenuOpen }) => {
|
||||
className={`${childItem.icon} text-[18px]`}
|
||||
aria-hidden="true"
|
||||
></i>
|
||||
<span className="ml-3 lg:ml-4">{childItem.title}</span>
|
||||
<span className="ml-3 lg:ml-4">
|
||||
{t(`sidebar.${item.title}-Children.${childItem.title}`)}
|
||||
</span>
|
||||
</NavLink>
|
||||
</li>
|
||||
))}
|
||||
|
||||
@@ -19,6 +19,7 @@ import ModalUi from "../primitives/ModalUi";
|
||||
import { Tooltip } from "react-tooltip";
|
||||
import Upgrade from "../primitives/Upgrade";
|
||||
import Loader from "../primitives/Loader";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
// `Form` render all type of Form on this basis of their provided in path
|
||||
function Form() {
|
||||
@@ -37,6 +38,7 @@ function Form() {
|
||||
}
|
||||
|
||||
const Forms = (props) => {
|
||||
const { t } = useTranslation();
|
||||
const maxFileSize = 20;
|
||||
const abortController = new AbortController();
|
||||
const inputFileRef = useRef(null);
|
||||
@@ -616,7 +618,9 @@ const Forms = (props) => {
|
||||
</form>
|
||||
</ModalUi>
|
||||
<form onSubmit={handleSubmit}>
|
||||
<h1 className="text-[20px] font-semibold mb-4">{props?.title}</h1>
|
||||
<h1 className="text-[20px] font-semibold mb-4">
|
||||
{t(`form-name.${props?.title}`)}
|
||||
</h1>
|
||||
{fileload && (
|
||||
<div className="flex items-center gap-x-2">
|
||||
<div className="h-2 rounded-full w-[200px] md:w-[400px] bg-gray-200">
|
||||
@@ -637,7 +641,7 @@ const Forms = (props) => {
|
||||
)}
|
||||
<div className="text-xs">
|
||||
<label className="block">
|
||||
{`File (pdf, png, jpg, jpeg${
|
||||
{`${t("report-heading.File")} (${t("file-type")} ${
|
||||
isEnableSubscription ? ", docx)" : ")"
|
||||
}`}
|
||||
<span className="text-red-500 text-[13px]">*</span>
|
||||
@@ -646,7 +650,7 @@ const Forms = (props) => {
|
||||
<div className="flex gap-2 justify-center items-center">
|
||||
<div className="flex justify-between items-center op-input op-input-bordered op-input-sm w-full h-full text-[13px]">
|
||||
<div className="break-all">
|
||||
file selected: {getFileName(fileupload)}
|
||||
{t("file-selected")}: {getFileName(fileupload)}
|
||||
</div>
|
||||
<div
|
||||
onClick={() => setFileUpload("")}
|
||||
@@ -688,8 +692,8 @@ const Forms = (props) => {
|
||||
<div className="text-xs mt-2">
|
||||
<label className="block">
|
||||
{props.title === "New Template"
|
||||
? "Template Title"
|
||||
: "Document Title"}
|
||||
? t("template-title")
|
||||
: t("document-title")}
|
||||
<span className="text-red-500 text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -702,7 +706,7 @@ const Forms = (props) => {
|
||||
</div>
|
||||
{props.title === "New Template" && (
|
||||
<div className="text-xs mt-2">
|
||||
<label className="block">Description</label>
|
||||
<label className="block">{t("description")}</label>
|
||||
<input
|
||||
name="Description"
|
||||
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
|
||||
@@ -720,7 +724,8 @@ const Forms = (props) => {
|
||||
)}
|
||||
<div className="text-xs mt-2">
|
||||
<label className="block">
|
||||
Note<span className="text-red-500 text-[13px]">*</span>
|
||||
{t("report-heading.Note")}
|
||||
<span className="text-red-500 text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
name="Note"
|
||||
@@ -740,7 +745,7 @@ const Forms = (props) => {
|
||||
{props.title === "Request Signatures" && (
|
||||
<div className="text-xs mt-2">
|
||||
<label className="block">
|
||||
Time To Complete (Days)
|
||||
{t("time-to-complete")}
|
||||
<span className="text-red-500 text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -757,7 +762,7 @@ const Forms = (props) => {
|
||||
<>
|
||||
<div className="text-xs mt-2">
|
||||
<label className="block">
|
||||
Send In Order
|
||||
{t("send-in-order")}
|
||||
<a data-tooltip-id="sendInOrder-tooltip" className="ml-1">
|
||||
<sup>
|
||||
<i className="fa-light fa-question rounded-full border-[#33bbff] text-[#33bbff] text-[13px] border-[1px] py-[1.5px] px-[4px]"></i>
|
||||
@@ -765,44 +770,21 @@ const Forms = (props) => {
|
||||
</a>
|
||||
<Tooltip id="sendInOrder-tooltip" className="z-50">
|
||||
<div className="max-w-[200px] md:max-w-[450px]">
|
||||
<p className="font-bold">Send in Order</p>
|
||||
<p>
|
||||
Choose how you want the signing requests to be sent to
|
||||
the document signers:
|
||||
</p>
|
||||
<p className="font-bold">{t("send-in-order")}</p>
|
||||
<p>{t("send-in-order-help.p1")}</p>
|
||||
<p className="p-[5px]">
|
||||
<ol className="list-disc">
|
||||
<li>
|
||||
<span className="font-bold">Yes:</span>
|
||||
<span>
|
||||
Selecting this option will send the signing
|
||||
request to the first signer initially. Once the
|
||||
first signer completes their part, the next
|
||||
signer in the sequence will receive the request.
|
||||
This process continues until all signers have
|
||||
signed the document. This method ensures that
|
||||
the document is signed in a specific order.
|
||||
</span>
|
||||
<span>{t("send-in-order-help.p2")}</span>
|
||||
</li>
|
||||
<li>
|
||||
<span className="font-bold">No: </span>
|
||||
<span>
|
||||
Selecting this option will send the signing
|
||||
links to all signers simultaneously. Every
|
||||
signer can sign the document at their
|
||||
convenience, regardless of whether other signers
|
||||
have completed their signatures. This method is
|
||||
faster but does not enforce any signing order
|
||||
among the participants.
|
||||
</span>
|
||||
<span>{t("send-in-order-help.p3")}</span>
|
||||
</li>
|
||||
</ol>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Select the option that best suits the needs of your
|
||||
document processing.
|
||||
</p>
|
||||
<p>{t("send-in-order-help.p4")}</p>
|
||||
</div>
|
||||
</Tooltip>
|
||||
</label>
|
||||
@@ -826,7 +808,7 @@ const Forms = (props) => {
|
||||
checked={formData.SendinOrder === "false"}
|
||||
onChange={handleStrInput}
|
||||
/>
|
||||
<div className="text-center">No</div>
|
||||
<div className="text-center">{t("no")}</div>
|
||||
</div>
|
||||
</div>
|
||||
{isEnableSubscription && (
|
||||
@@ -838,7 +820,8 @@ const Forms = (props) => {
|
||||
: "font-semibold text-gray-300"
|
||||
}
|
||||
>
|
||||
Auto reminder{" "}
|
||||
{t("auto-reminder")}
|
||||
{" "}
|
||||
{!isSubscribe && isEnableSubscription && <Upgrade />}
|
||||
</span>
|
||||
<label
|
||||
@@ -860,7 +843,7 @@ const Forms = (props) => {
|
||||
{formData?.autoreminder === true && (
|
||||
<div className="text-xs mt-2">
|
||||
<label className="block">
|
||||
Remind once in every (Days)
|
||||
{t("remind-once")}
|
||||
<span className="text-red-500 text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -883,13 +866,13 @@ const Forms = (props) => {
|
||||
type="submit"
|
||||
disabled={isSubmit}
|
||||
>
|
||||
Next
|
||||
{t("next")}
|
||||
</button>
|
||||
<div
|
||||
className="op-btn op-btn-ghost"
|
||||
onClick={() => handleCancel()}
|
||||
>
|
||||
Cancel
|
||||
{t("cancel")}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -16,7 +16,9 @@ import { fetchAppInfo } from "../redux/reducers/infoReducer";
|
||||
import { showTenant } from "../redux/reducers/ShowTenant";
|
||||
import { fetchSubscription, getAppLogo, openInNewTab } from "../constant/Utils";
|
||||
import Loader from "../primitives/Loader";
|
||||
import { useTranslation } from "react-i18next";
|
||||
function Login() {
|
||||
const { t } = useTranslation();
|
||||
const navigate = useNavigate();
|
||||
const location = useLocation();
|
||||
const dispatch = useDispatch();
|
||||
@@ -605,7 +607,7 @@ function Login() {
|
||||
};
|
||||
return (
|
||||
<div>
|
||||
<Title title={"Login Page"} />
|
||||
<Title title={t("login-page")} />
|
||||
{state.loading && (
|
||||
<div
|
||||
aria-live="assertive"
|
||||
@@ -634,14 +636,14 @@ function Login() {
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-2">
|
||||
<div>
|
||||
<form onSubmit={handleSubmit} aria-label="Login Form">
|
||||
<h1 className="text-[30px] mt-6">Welcome Back!</h1>
|
||||
<h1 className="text-[30px] mt-6">{t("welcome")}</h1>
|
||||
<fieldset>
|
||||
<legend className="text-[12px] text-[#878787]">
|
||||
Login to your account
|
||||
{t("Login-to-your-account")}
|
||||
</legend>
|
||||
<div className="w-full px-6 py-3 my-1 op-card bg-base-100 shadow-md outline outline-1 outline-slate-300/50">
|
||||
<label className="block text-xs" htmlFor="email">
|
||||
Email
|
||||
{t("email")}
|
||||
</label>
|
||||
<input
|
||||
id="email"
|
||||
@@ -657,7 +659,7 @@ function Login() {
|
||||
{!isLoginSSO && (
|
||||
<>
|
||||
<label className="block text-xs" htmlFor="password">
|
||||
Password
|
||||
{t("password")}
|
||||
</label>
|
||||
<div className="relative">
|
||||
<input
|
||||
@@ -690,7 +692,7 @@ function Login() {
|
||||
to="/forgetpassword"
|
||||
className="text-[13px] op-link op-link-primary underline-offset-1 focus:outline-none ml-1"
|
||||
>
|
||||
Forgot Password?
|
||||
{t("forgot-password")}
|
||||
</NavLink>
|
||||
</div>
|
||||
</div>
|
||||
@@ -701,7 +703,7 @@ function Login() {
|
||||
className="op-btn op-btn-primary"
|
||||
disabled={state.loading}
|
||||
>
|
||||
{state.loading ? "Loading..." : "Login"}
|
||||
{state.loading ? t("loading") : t("login")}
|
||||
</button>
|
||||
{isEnableSubscription && (
|
||||
<button
|
||||
@@ -716,13 +718,13 @@ function Login() {
|
||||
)
|
||||
}
|
||||
>
|
||||
Create Account
|
||||
{t("create-account")}
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</form>
|
||||
{(appInfo.googleClietId || isEnableSubscription) && (
|
||||
<div className="op-divider my-4 text-sm">OR</div>
|
||||
<div className="op-divider my-4 text-sm">{t("or")}</div>
|
||||
)}
|
||||
<div className="flex flex-col justify-center items-center gap-y-3">
|
||||
{/* {appInfo?.fbAppId && (
|
||||
@@ -746,7 +748,7 @@ function Login() {
|
||||
className="cursor-pointer border-[1px] border-gray-300 rounded px-[40px] py-2 font-semibold text-sm hover:border-[#d2e3fc] hover:bg-[#ecf3feb7]"
|
||||
onClick={() => handleSignInWithSSO()}
|
||||
>
|
||||
Sign in with SSO
|
||||
{t("sign-SSO")}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -778,7 +780,8 @@ function Login() {
|
||||
style={{ display: "flex" }}
|
||||
className="block text-xs text-gray-700 font-semibold"
|
||||
>
|
||||
Company <span className="text-[red] text-[13px]">*</span>
|
||||
{t("company")}{" "}
|
||||
<span className="text-[red] text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
@@ -800,7 +803,7 @@ function Login() {
|
||||
style={{ display: "flex" }}
|
||||
className="block text-xs text-gray-700 font-semibold"
|
||||
>
|
||||
Job Title
|
||||
{t("job-title")}
|
||||
<span className="text-[red] text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -823,14 +826,14 @@ function Login() {
|
||||
className="op-btn op-btn-primary"
|
||||
onClick={(e) => handleSubmitbtn(e)}
|
||||
>
|
||||
Login
|
||||
{t("login")}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className="op-btn op-btn-ghost"
|
||||
onClick={logOutUser}
|
||||
>
|
||||
Cancel
|
||||
{t("cancel")}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -13,8 +13,10 @@ import { showTenant } from "../redux/reducers/ShowTenant";
|
||||
import { isEnableSubscription } from "../constant/const";
|
||||
import { getAppLogo, openInNewTab } from "../constant/Utils";
|
||||
import Loader from "../primitives/Loader";
|
||||
import { useTranslation } from "react-i18next";
|
||||
const Signup = () => {
|
||||
const { width } = useWindowSize();
|
||||
const { t } = useTranslation();
|
||||
const navigate = useNavigate();
|
||||
const location = useLocation();
|
||||
const dispatch = useDispatch();
|
||||
@@ -322,7 +324,7 @@ const Signup = () => {
|
||||
<Loader />
|
||||
</div>
|
||||
)}
|
||||
<Title title={"Signup page"} />
|
||||
<Title title={t("signup-page")} />
|
||||
{appInfo && appInfo.applogo ? (
|
||||
<div className="md:p-10 lg:p-16">
|
||||
<div className="md:p-4 lg:p-10 p-4 bg-base-100 text-base-content op-card">
|
||||
@@ -334,11 +336,12 @@ const Signup = () => {
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-2">
|
||||
<div>
|
||||
<form onSubmit={handleSubmit}>
|
||||
<h2 className="text-[30px] mt-6">Create Account !</h2>
|
||||
<h2 className="text-[30px] mt-6">{t("create-account")}!</h2>
|
||||
<div className="w-full my-4 op-card bg-base-100 shadow-md outline outline-1 outline-slate-300/50">
|
||||
<div className="px-6 py-4 text-xs">
|
||||
<label className="block ">
|
||||
Name <span className="text-[red] text-[13px]">*</span>
|
||||
{t("name")}{" "}
|
||||
<span className="text-[red] text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
@@ -349,7 +352,8 @@ const Signup = () => {
|
||||
/>
|
||||
<hr className="my-2 border-none" />
|
||||
<label>
|
||||
Email <span className="text-[red] text-[13px]">*</span>
|
||||
{t("email")}{" "}
|
||||
<span className="text-[red] text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
id="email"
|
||||
@@ -363,7 +367,8 @@ const Signup = () => {
|
||||
/>
|
||||
<hr className="my-2 border-none" />
|
||||
<label>
|
||||
Phone <span className="text-[red] text-[13px]">*</span>
|
||||
{t("phone")}{" "}
|
||||
<span className="text-[red] text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
type="tel"
|
||||
@@ -374,7 +379,7 @@ const Signup = () => {
|
||||
/>
|
||||
<hr className="my-2 border-none" />
|
||||
<label>
|
||||
Company{" "}
|
||||
{t("company")}{" "}
|
||||
<span className="text-[red] text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -386,7 +391,7 @@ const Signup = () => {
|
||||
/>
|
||||
<hr className="my-2 border-none" />
|
||||
<label>
|
||||
Job Title{" "}
|
||||
{t("job-title")}{" "}
|
||||
<span className="text-[red] text-[13px]">*</span>
|
||||
</label>
|
||||
<input
|
||||
@@ -398,7 +403,7 @@ const Signup = () => {
|
||||
/>
|
||||
<hr className="my-2 border-none" />
|
||||
<label>
|
||||
Password{" "}
|
||||
{t("password")}{" "}
|
||||
<span className="text-[red] text-[13px]">*</span>
|
||||
</label>
|
||||
<div className="relative">
|
||||
@@ -428,16 +433,16 @@ const Signup = () => {
|
||||
lengthValid ? "text-green-600" : "text-red-600"
|
||||
}`}
|
||||
>
|
||||
{lengthValid ? "✓" : "✗"} Password should be 8
|
||||
characters long
|
||||
{lengthValid ? "✓" : "✗"}
|
||||
{t("password-length")}
|
||||
</p>
|
||||
<p
|
||||
className={`${
|
||||
caseDigitValid ? "text-green-600" : "text-red-600"
|
||||
}`}
|
||||
>
|
||||
{caseDigitValid ? "✓" : "✗"} Password should contain
|
||||
uppercase letter, lowercase letter, digit
|
||||
{caseDigitValid ? "✓" : "✗"}
|
||||
{t("password-case")}
|
||||
</p>
|
||||
<p
|
||||
className={`${
|
||||
@@ -446,8 +451,8 @@ const Signup = () => {
|
||||
: "text-red-600"
|
||||
}`}
|
||||
>
|
||||
{specialCharValid ? "✓" : "✗"} Password should
|
||||
contain special character
|
||||
{specialCharValid ? "✓" : "✗"}{" "}
|
||||
{t("password-special-char")}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
@@ -464,7 +469,7 @@ const Signup = () => {
|
||||
className="text-xs cursor-pointer ml-1 mb-0"
|
||||
htmlFor="termsandcondition"
|
||||
>
|
||||
I agree to the
|
||||
{t("agreee")}
|
||||
</label>
|
||||
<span
|
||||
className="underline cursor-pointer ml-1"
|
||||
@@ -474,7 +479,7 @@ const Signup = () => {
|
||||
)
|
||||
}
|
||||
>
|
||||
Terms of Service
|
||||
{t("term")}
|
||||
</span>
|
||||
<span>.</span>
|
||||
</div>
|
||||
@@ -486,7 +491,7 @@ const Signup = () => {
|
||||
className="op-btn op-btn-primary"
|
||||
disabled={state.loading}
|
||||
>
|
||||
{state.loading ? "Loading..." : "Register"}
|
||||
{state.loading ? t("loading") : t("register")}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
@@ -496,7 +501,7 @@ const Signup = () => {
|
||||
navigate(location.search ? "/" + location.search : "/")
|
||||
}
|
||||
>
|
||||
Login
|
||||
{t("login")}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -378,7 +378,7 @@ function UserProfile() {
|
||||
<select
|
||||
value={lang}
|
||||
onChange={handleChangeLang}
|
||||
className="select select-bordered w-[30%] border-[1px] max-w-xs"
|
||||
className="select select-bordered w-[30%] border-[1px] rounded-lg p-2 max-w-xs"
|
||||
>
|
||||
<option disabled selected>
|
||||
select
|
||||
@@ -490,7 +490,7 @@ function UserProfile() {
|
||||
{t("public-profile")} :{" "}
|
||||
<Tooltip
|
||||
maxWidth="max-w-[250px]"
|
||||
message={`This is your public URL. Copy or share it with the signer, and you will be able to see all your publicly set templates.`}
|
||||
message={t("public-profile-help")}
|
||||
/>
|
||||
</span>
|
||||
<div className="flex md:flex-row flex-col md:items-center">
|
||||
@@ -526,7 +526,7 @@ function UserProfile() {
|
||||
{t("tagline")} :{" "}
|
||||
<Tooltip
|
||||
maxWidth="max-w-[250px]"
|
||||
message={`This Tagline will appear on your OpenSign public profile for ex. https://opensign.me/alex`}
|
||||
message={t("tagline-help")}
|
||||
/>
|
||||
</span>
|
||||
<div className="flex md:flex-row flex-col md:items-center">
|
||||
@@ -558,7 +558,7 @@ function UserProfile() {
|
||||
isTeam ? "font-semibold" : "font-semibold text-gray-300"
|
||||
}
|
||||
>
|
||||
Disable DocumentId :{" "}
|
||||
{t("disable-documentId")} :{" "}
|
||||
<Tooltip
|
||||
url={
|
||||
"https://docs.opensignlabs.com/docs/help/Settings/disabledocumentid"
|
||||
@@ -605,7 +605,7 @@ function UserProfile() {
|
||||
}}
|
||||
className="op-btn op-btn-primary"
|
||||
>
|
||||
{editmode ? "Save" : "Edit"}
|
||||
{editmode ? t("save") : t("edit")}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
@@ -616,7 +616,7 @@ function UserProfile() {
|
||||
editmode ? "op-btn-ghost" : "op-btn-secondary"
|
||||
}`}
|
||||
>
|
||||
{editmode ? "Cancel" : "Change Password"}
|
||||
{editmode ? t("cancel") : t("change-password")}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -682,7 +682,7 @@ function UserProfile() {
|
||||
onClick={() => navigate("/subscription")}
|
||||
className="op-btn op-btn-accent"
|
||||
>
|
||||
Upgrade Now
|
||||
{t("upgrade-now")}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -27,8 +27,10 @@ import BulkSendUi from "../components/BulkSendUi";
|
||||
import Loader from "./Loader";
|
||||
import Select from "react-select";
|
||||
import SubscribeCard from "./SubscribeCard";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
const ReportTable = (props) => {
|
||||
const { t } = useTranslation();
|
||||
const navigate = useNavigate();
|
||||
const location = useLocation();
|
||||
const isDashboard =
|
||||
@@ -1071,7 +1073,7 @@ const ReportTable = (props) => {
|
||||
)}
|
||||
<div className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]">
|
||||
<div className="font-light">
|
||||
{props.ReportName}{" "}
|
||||
{t(`report-name.${props.ReportName}`)}
|
||||
{props.report_help && (
|
||||
<span className="text-xs md:text-[13px] font-normal">
|
||||
<Tooltip message={props.report_help} />
|
||||
@@ -1104,7 +1106,7 @@ const ReportTable = (props) => {
|
||||
<tr className="border-y-[1px]">
|
||||
{props.heading?.map((item, index) => (
|
||||
<React.Fragment key={index}>
|
||||
<th className="px-4 py-2">{item}</th>
|
||||
<th className="px-4 py-2">{t(`report-heading.${item}`)}</th>
|
||||
</React.Fragment>
|
||||
))}
|
||||
{props.ReportName === "Templates" && isEnableSubscription && (
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import React from "react";
|
||||
import { openInNewTab } from "../constant/Utils";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
function Upgrade({ message }) {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<sup>
|
||||
<span
|
||||
@@ -11,7 +13,7 @@ function Upgrade({ message }) {
|
||||
}}
|
||||
className="op-link op-link-accent text-sm"
|
||||
>
|
||||
{message ? message : "Upgrade now"}
|
||||
{message ? message : t("upgrade-now")}
|
||||
</span>
|
||||
</sup>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user