diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 12f91e257..f8cef4d9f 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -38,6 +38,7 @@ "upgrade-to":"Upgrade to", "plan":"Plan", "subscribe-card-plan":"Sign 100 docs using API. Only $0.15/doc after that.", + "user-name-limit-char":"To have a username less than 8 character please subscribe", "tour-content":"Don't show this again", "pro":"PRO", "team":"TEAM", @@ -181,6 +182,13 @@ "next":"Next", "select-folder":"Select Folder", "OpenSign-drive":"OpenSign™ Drive", + "drive-document-status":{ + "Completed":"Completed", + "Declined":"Declined", + "Draft":"Draft", + "Expired":"Expired", + "In Progress":"In Progress" + }, "select-folder-help" :"If you do not select a folder, your signed document will be saved in the Main OpenSign drive folder.", "no-data":"No data found", "save-here":"Save Here", @@ -296,6 +304,7 @@ "enter-otp":"Enter OTP", "verify":"Verify", "resend":"Resend", + "verify-email":"Please verify your email !", "send-otp":" Send OTP", "otp-placeholder":"Enter OTP received over email", @@ -332,9 +341,17 @@ "email-mssg":" Recipients added here will get a copy of the signed document.", "email-error-1":" please provide correct email address", "email-error-2" :"You can only send to ten recipients at a time.", + "Email-verified-alert-1":"Email is verified.", + "Email-verified-alert-2" :"Email is already verified.", "upload-stamp-image":"Upload stamp image", "draw":"Draw", "type":"Type", + "color-type":{ + "red":"red", + "blue":"blue", + "black":"black", + "yellow":"yellow" + }, "my-initials":"My Initials", "upload":"Upload", "initial-teb":"Initials", @@ -516,6 +533,10 @@ "generated-on":"Generated On", "text-field":"Text field", "font-size":"Font size", + "widget-status":{ + "Required":"Required", + "Optional":"Optional" + }, "all-right":"All Rights Reserved", "version":"version", "social-media":{ diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index 7740f4be4..874eb785f 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -39,6 +39,7 @@ "pro":"PRO", "plan":"Plan", "subscribe-card-plan":"Signez 100 documents à l'aide de l'API. Seulement 0,15 $/doc par la suite.", + "user-name-limit-char" :"Pour avoir un nom d'utilisateur de moins de 8 caractères s'il vous plaît s'abonner", "tour-content":"Ne montre plus ça", "team":"ÉQUIPE", "docs":"Documents", @@ -179,6 +180,13 @@ "next":"Suivant", "select-folder" :"Sélectionner le dossier", "OpenSign-drive":"Lecteur OpenSign™", + "drive-document-status":{ + "Completed":"Complété", + "Declined":"Diminué", + "Draft":"Brouillon", + "Expired":"Expiré", + "In Progress":"En cours" + }, "select-folder-help" :"Si vous ne sélectionnez pas de dossier, votre document signé sera enregistré dans le dossier du lecteur principal OpenSign.", "no-data" :"Aucune donnée disponible", "save-here":"Enregistrer ici", @@ -308,7 +316,7 @@ "date":"date", "text":"texte", "text input":"saisie de texte", - "checkbox":"checkbocase à cocher", + "checkbox":"case à cocher", "dropdown":"dérouler", "radio button":"bouton radio", "image": "image", @@ -330,9 +338,17 @@ "email-mssg" :"Les destinataires ajoutés ici recevront une copie du document signé.", "email-error-1" :"veuillez fournir une adresse e-mail correcte", "email-error-2" :"Vous ne pouvez envoyer qu'à dix destinataires à la fois.", + "Email-verified-alert-1" :"L'e-mail est vérifié.", + "Email-verified-alert-2" :"L'e-mail est déjà vérifié.", "upload-stamp-image":"Télécharger l'image du tampon", "draw":"Dessiner", - "type":"Type", + "type":"Taper", + "color-type":{ + "red":"rouge", + "blue":"bleu", + "black":"noir", + "yellow":"jaune" + }, "my-initials" :"Mes initiales", "upload" :"Télécharger", "initial-teb":"Initiales", @@ -455,7 +471,7 @@ "password-update-alert-2" :"Votre mot de passe actuel est manquant ou incorrect.", "password-update-alert-3" :"Votre mot de passe actuel est manquant ou incorrect.", "password-update-alert-4" :"Votre mot de passe et votre mot de passe de confirmation ne correspondent pas.", - "current-password":"Current Password", + "current-password":"mot de passe actuel", "new-password" :"nouveau mot de passe", "confirm-password":"Confirmez le mot de passe", "file-alert-1":"La taille du fichier sélectionné est trop grande. Veuillez sélectionner un fichier inférieur à", @@ -514,6 +530,10 @@ "generated-on" :"Généré le", "text-field" :"Champ de texte", "font-size" :"Taille de police", + "widget-status":{ + "Required":"Requis", + "Optional":"Facultative" + }, "all-right" :"Tous droits réservés", "version" :"version", "social-media":{ @@ -553,7 +573,7 @@ "template-placeholder-4":"Faites glisser l'espace réservé pour un rôle n'importe où sur le document. N'oubliez pas qu'il apparaîtra dans la même couleur que le nom du destinataire pour une référence facile.", "template-placeholder-5":"Cliquer sur 'Suivant' stockera le modèle actuel. Après l'enregistrement, vous serez invité à créer un nouveau document à partir de ce modèle si vous le souhaitez.", "webhook-1":"Mettez à niveau maintenant pour définir le webhook", - "Need your Signature":"En cliquant sur cette carte, vous accéderez à la liste des documents en attente de révision.", + "Need your Signature":"En cliquant sur cette carte, vous accéderez à la liste des documents en attente de révision.", "Out for signatures":"En cliquant sur cette carte, vous accéderez à une liste de documents en attente de signature.", "Recent signature requests": "Voici une liste de documents qui attendent votre signature.", "Recently sent for signatures":"Il s'agit d'une liste de documents que vous avez envoyés à d'autres parties pour signature.", diff --git a/apps/OpenSign/src/components/opensigndrive/DriveBody.js b/apps/OpenSign/src/components/opensigndrive/DriveBody.js index c3e67947d..37f11c55c 100644 --- a/apps/OpenSign/src/components/opensigndrive/DriveBody.js +++ b/apps/OpenSign/src/components/opensigndrive/DriveBody.js @@ -350,7 +350,7 @@ function DriveBody(props) { {createddate} Pdf - {status} + {t(`drive-document-status.${status}`)} { @@ -526,7 +526,9 @@ function DriveBody(props) { {t("report-heading.Status")}:{" "} - {status} + + {t(`drive-document-status.${status}`)} +
{t("report-heading.created-date")}:{" "} diff --git a/apps/OpenSign/src/components/pdf/PrevNext.js b/apps/OpenSign/src/components/pdf/PrevNext.js index d4a6a93d2..0154b1b3f 100644 --- a/apps/OpenSign/src/components/pdf/PrevNext.js +++ b/apps/OpenSign/src/components/pdf/PrevNext.js @@ -19,10 +19,9 @@ function PrevNext({ pageNumber, allPages, changePage }) { disabled={pageNumber <= 1} onClick={previousPage} > - + - {t("prev")} {pageNumber || (allPages ? 1 : "--")} {t("of")} {allPages || "--"} @@ -32,10 +31,9 @@ function PrevNext({ pageNumber, allPages, changePage }) { disabled={pageNumber >= allPages} onClick={nextPage} > - + - {t("next")} ); diff --git a/apps/OpenSign/src/components/pdf/SelectLanguage.js b/apps/OpenSign/src/components/pdf/SelectLanguage.js index 247a5160b..19ddeb5de 100644 --- a/apps/OpenSign/src/components/pdf/SelectLanguage.js +++ b/apps/OpenSign/src/components/pdf/SelectLanguage.js @@ -2,25 +2,34 @@ import i18next from "i18next"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -function SelectLanguage() { +function SelectLanguage(props) { const { i18n } = useTranslation(); const languages = [ { value: "en", text: "English" }, { value: "fr", text: "Français" } ]; const [lang, setLang] = useState(i18next.language || "en"); - // This function put query that helps to - // change the language + // This function put query that helps to change the language const handleChangeLang = (e) => { setLang(e.target.value); i18n.changeLanguage(e.target.value); + props?.updateExtUser && + props.updateExtUser({ + language: e.target.value + }); }; return ( -
+
{ {fontColorArr.map((color, ind) => { return ( ); })} diff --git a/apps/OpenSign/src/i18n.js b/apps/OpenSign/src/i18n.js index e3f72ed27..402079441 100644 --- a/apps/OpenSign/src/i18n.js +++ b/apps/OpenSign/src/i18n.js @@ -11,9 +11,9 @@ i18n fallbackLng: "en", // Fallback to English if no other language is detected detection: { // Order and from where user language should be detected - order: ["navigator", "htmlTag", "path", "subdomain"], + order: ["localStorage", "navigator", "htmlTag", "path", "subdomain"], // Cache user language on - caches: ["localStorage", "cookie"] + caches: ["localStorage"] }, debug: true, interpolation: { diff --git a/apps/OpenSign/src/layout/HomeLayout.js b/apps/OpenSign/src/layout/HomeLayout.js index 3c6bc356b..4e58fa93e 100644 --- a/apps/OpenSign/src/layout/HomeLayout.js +++ b/apps/OpenSign/src/layout/HomeLayout.js @@ -17,7 +17,7 @@ import { showHeader } from "../redux/reducers/showHeader"; import { useTranslation } from "react-i18next"; const HomeLayout = () => { - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); const navigate = useNavigate(); const location = useLocation(); const dispatch = useDispatch(); @@ -34,6 +34,12 @@ const HomeLayout = () => { const [, setCookie] = useCookies(["accesstoken", "main_Domain"]); const tenantId = localStorage.getItem("TenantId"); + + useEffect(() => { + const language = localStorage.getItem("i18nextLng"); + i18n.changeLanguage(language); + }, []); + useEffect(() => { if (!tenantId) { setIsUserValid(false); diff --git a/apps/OpenSign/src/pages/ChangePassword.js b/apps/OpenSign/src/pages/ChangePassword.js index b78918a61..83781c168 100644 --- a/apps/OpenSign/src/pages/ChangePassword.js +++ b/apps/OpenSign/src/pages/ChangePassword.js @@ -72,7 +72,7 @@ function ChangePassword() { value={currentpassword} onChange={(e) => setCurrentPassword(e.target.value)} className="op-input op-input-bordered op-input-sm text-xs w-full" - placeholder="Current Password" + placeholder={t("current-password")} required />
@@ -86,7 +86,7 @@ function ChangePassword() { value={newpassword} onChange={(e) => setnewpassword(e.target.value)} className="op-input op-input-bordered op-input-sm text-xs w-full" - placeholder="New Password" + placeholder={t("new-password")} required />
@@ -100,7 +100,7 @@ function ChangePassword() { className="op-input op-input-bordered op-input-sm text-xs w-full" value={confirmpassword} onChange={(e) => setconfirmpassword(e.target.value)} - placeholder="Confirm Password" + placeholder={t("confirm-password")} required /> diff --git a/apps/OpenSign/src/pages/Dashboard.js b/apps/OpenSign/src/pages/Dashboard.js index 9c9648b4e..79947bd64 100644 --- a/apps/OpenSign/src/pages/Dashboard.js +++ b/apps/OpenSign/src/pages/Dashboard.js @@ -42,7 +42,7 @@ const Dashboard = () => { .map((col) => { return { selector: `[data-tut=${col.widget.data.tourSection}]`, - content: t(`tour-mssg.${col.widget.data.label}`), + content: t(`tour-mssg.${col.widget.label}`), position: "top" // style: { backgroundColor: "#abd4d2" }, }; diff --git a/apps/OpenSign/src/pages/GuestLogin.js b/apps/OpenSign/src/pages/GuestLogin.js index f197f7044..777adef6a 100644 --- a/apps/OpenSign/src/pages/GuestLogin.js +++ b/apps/OpenSign/src/pages/GuestLogin.js @@ -8,6 +8,7 @@ import { appInfo } from "../constant/appinfo"; import Parse from "parse"; import Loader from "../primitives/Loader"; import { useTranslation } from "react-i18next"; +import SelectLanguage from "../components/pdf/SelectLanguage"; function GuestLogin() { const { t } = useTranslation(); @@ -181,153 +182,156 @@ function GuestLogin() { setContact((prev) => ({ ...prev, [e.target.name]: e.target.value })); }; return ( -
- {isLoading ? ( -
- - {isLoading.message} -
- ) : ( -
-
- {appLogo && ( - logo - )} +
+
+ {isLoading ? ( +
+ + {isLoading.message}
- {contactId ? ( - <> - {!EnterOTP ? ( -
-

{t("welcome")}

- - {t("guest-email-alert")} - -
+ ) : ( +
+
+ {appLogo && ( + logo + )} +
+ {contactId ? ( + <> + {!EnterOTP ? ( +
+

{t("welcome")}

+ + {t("guest-email-alert")} + +
+ +
+
+ +
+
+ ) : ( +
+

{t("welcome")}

+ + {t("get-verification-code-2")} + +
+

{t("enter-verification-code")}

+ setOTP(e.target.value)} + /> +
+
+ +
+
+ )} + + ) : ( +
+

{t("welcome")}

+ + {t("provide-your-details")} + +
+
+ + +
+
+
-
- -
-
- ) : ( - -

{t("welcome")}

- - {t("get-verification-code-2")} - -
-

{t("enter-verification-code")}

+ {t("phone")} + setOTP(e.target.value)} + type="text" + name="phone" + value={contact.phone} + onChange={handleInputChange} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + disabled={loading} />
-
+
- )} - - ) : ( -
-

{t("welcome")}

- - {t("provide-your-details")} - -
-
- - -
-
- - -
-
- - -
-
- -
-
-
- )} -
- )} +
+ )} +
+ )} +
+
); } diff --git a/apps/OpenSign/src/pages/Login.js b/apps/OpenSign/src/pages/Login.js index 5c82dcbcf..0fb6fd3c5 100644 --- a/apps/OpenSign/src/pages/Login.js +++ b/apps/OpenSign/src/pages/Login.js @@ -19,7 +19,7 @@ import Loader from "../primitives/Loader"; import { useTranslation } from "react-i18next"; import SelectLanguage from "../components/pdf/SelectLanguage"; function Login() { - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); const navigate = useNavigate(); const location = useLocation(); const dispatch = useDispatch(); @@ -115,8 +115,14 @@ function Login() { `/${menu.pageType}/${menu.pageId}`; let _role = _currentRole.replace("contracts_", ""); localStorage.setItem("_user_role", _role); + const checkLanguage = extUser?.get("Language"); + if (checkLanguage) { + checkLanguage && i18n.changeLanguage(checkLanguage); + } + const results = [extUser]; const extUser_str = JSON.stringify(results); + localStorage.setItem("Extand_Class", extUser_str); const extInfo = JSON.parse(JSON.stringify(extUser)); localStorage.setItem("userEmail", extInfo.Email); diff --git a/apps/OpenSign/src/pages/Opensigndrive.js b/apps/OpenSign/src/pages/Opensigndrive.js index 4fed29604..10def42fc 100644 --- a/apps/OpenSign/src/pages/Opensigndrive.js +++ b/apps/OpenSign/src/pages/Opensigndrive.js @@ -192,7 +192,7 @@ function Opensigndrive() { setTourData(tourConfigs); } if (!docId) { - setFolderName([{ name: "OpenSign™ Drive", objectId: "" }]); + setFolderName([{ name: t("OpenSign-drive"), objectId: "" }]); } } catch (e) { setIsAlert({ diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 01a784497..421a46463 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -208,11 +208,12 @@ function PdfRequestFiles(props) { }); if (resEmail?.message === "Email is verified.") { setIsEmailVerified(true); + alert(t("Email-verified-alert-1")); } else if (resEmail?.message === "Email is already verified.") { setIsEmailVerified(true); + alert(t("Email-verified-alert-2")); } setOtp(""); - alert(resEmail.message); setIsVerifyModal(false); //handleRecipientSign(); } catch (error) { diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index e2c186950..51c9ee4b8 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -912,7 +912,7 @@ function PlaceHolderSign() { if (!signatureExist) { isSignatureExist = false; setIsSendAlert({ - mssg: t("sure"), + mssg: "sure", alert: true }); } @@ -936,7 +936,7 @@ function PlaceHolderSign() { } } else { setIsSendAlert({ - mssg: t("sure"), + mssg: "sure", alert: true }); } diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index 566050160..7fc9f6ec7 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -593,11 +593,12 @@ function SignYourSelf() { }); if (resEmail?.message === "Email is verified.") { setIsEmailVerified(true); + alert(t("Email-verified-alert-1")); } else if (resEmail?.message === "Email is already verified.") { setIsEmailVerified(true); + alert(t("Email-verified-alert-2")); } setOtp(""); - alert(resEmail.message); setIsVerifyModal(false); // handleRecipientSign(); } catch (error) { diff --git a/apps/OpenSign/src/pages/UserProfile.js b/apps/OpenSign/src/pages/UserProfile.js index a69ea8447..d5380b7d5 100644 --- a/apps/OpenSign/src/pages/UserProfile.js +++ b/apps/OpenSign/src/pages/UserProfile.js @@ -17,6 +17,7 @@ import Upgrade from "../primitives/Upgrade"; import ModalUi from "../primitives/ModalUi"; import Loader from "../primitives/Loader"; import { useTranslation } from "react-i18next"; +import SelectLanguage from "../components/pdf/SelectLanguage"; function UserProfile() { const navigate = useNavigate(); @@ -164,38 +165,43 @@ function UserProfile() { // `updateExtUser` is used to update user details in extended class const updateExtUser = async (obj) => { - const extData = JSON.parse(localStorage.getItem("Extand_Class")); - const ExtUserId = extData[0].objectId; - const body = { - Phone: obj?.Phone || "", - Name: obj.Name, - HeaderDocId: isDisableDocId, - JobTitle: jobTitle, - Company: company, - UserName: publicUserName || "", - Tagline: tagLine || "" - }; + try { + const extData = JSON.parse(localStorage.getItem("Extand_Class")); + const ExtUserId = extData[0].objectId; + const body = { + Phone: obj?.Phone || "", + Name: obj.Name, + HeaderDocId: isDisableDocId, + JobTitle: jobTitle, + Company: company, + UserName: publicUserName || "", + Tagline: tagLine || "", + Language: obj?.language || "" + }; - await axios.put( - parseBaseUrl + "classes/contracts_Users/" + ExtUserId, - body, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": parseAppId, - "X-Parse-Session-Token": localStorage.getItem("accesstoken") + await axios.put( + parseBaseUrl + "classes/contracts_Users/" + ExtUserId, + body, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": parseAppId, + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } } - } - ); - const res = await Parse.Cloud.run("getUserDetails", { - email: extData[0].Email - }); + ); + const res = await Parse.Cloud.run("getUserDetails", { + email: extData[0].Email + }); - const json = JSON.parse(JSON.stringify([res])); - const extRes = JSON.stringify(json); - localStorage.setItem("Extand_Class", extRes); - previousPublicUserName.current = publicUserName; - // console.log("updateRes ", updateRes); + const json = JSON.parse(JSON.stringify([res])); + const extRes = JSON.stringify(json); + localStorage.setItem("Extand_Class", extRes); + previousPublicUserName.current = publicUserName; + // console.log("updateRes ", updateRes); + } catch (e) { + console.log("error in save data in contracts_Users class"); + } }; // file upload function const fileUpload = async (file) => { @@ -267,11 +273,12 @@ function UserProfile() { }); if (resEmail?.message === "Email is verified.") { setIsEmailVerified(true); + alert(t("Email-verified-alert-1")); } else if (resEmail?.message === "Email is already verified.") { setIsEmailVerified(true); + alert(t("Email-verified-alert-2")); } setOtp(""); - alert(resEmail.message); setIsVerifyModal(false); } catch (error) { alert(error.message); @@ -359,6 +366,17 @@ function UserProfile() {
    +
  • + {t("language")}:{" "} + +
  • {otpLoader ? ( @@ -600,26 +618,26 @@ function UserProfile() { ) : (
    handleVerifyEmail(e)}>
    - + setOtp(e.target.value)} />
    @@ -639,11 +657,10 @@ function UserProfile() {
    -

    Upgrade to Plan

    -

    - To have a username less than 8 character please - subscribe -

    +

    + {t("upgrade-to")} {t("plan")} +

    +

    {t("user-name-limit-char")}