diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 5511ae483..f85308bc1 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -7,14 +7,16 @@ "email":"Email", "company":"Company", "job-title":"Job title", + "profile":"Profile", + "log-out":"Log Out", "is-email-verified":"Is Email verified", "public-profile":"Public profile", "tagline":"Tagline ", "has-requested-you-to-sign":"has requested you to sign", "has-requested-you-to-review-and-sign":" has requested you to review and sign", "ascending":"Ascending", - "Action":"Action", - "add":"add", + "action":"Action", + "add":"Add", "add-new-folder":"ajouter un nouveau dossier", "disable-documentId":"Disable DocumentId", "edit":"Edit", @@ -22,14 +24,18 @@ "save":"Save", "cancel":"Cancel", "upgrade-now":"Upgrade now", + "pro":"PRO", + "team":"TEAM", "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.", + "docs":"Docs", + "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...", + "of":"of", "sign-SSO":"Sign in with SSO", "login-page":"Login Page", "or":"OR", @@ -51,7 +57,7 @@ }, "OpenSign™ Drive":"OpenSign™ Drive", "Reports":"Reports", - "Reports-Children" :{ + "Reports-Children" :{ "Need your sign": "Need your sign", "In Progress": "In Progress", "Completed":"Completed", @@ -64,7 +70,9 @@ "Settings-Children":{ "My Signature": "My Signature", "API Token":"API Token", - "Webhook":"Webhook" + "Webhook":"Webhook", + "Teams":"Teams", + "Users":"Users" } }, "dashboard-card":{ @@ -82,19 +90,39 @@ "Recent signature requests":"Recent signature requests", "Drafts":"Drafts", "Contactbook":"Contactbook", - "Templates":"Templates" + "Templates":"Templates", + "Teams":"Teams", + "Users":"Users" }, + "btnLabel":{ + "sign":"sign", + "Resend":"Resend", + "Revoke":"Revoke", + "Delete":"Delete", + "Use":"Use", + "Quick send":"Quick send", + "Edit":"Edit", + "Share with team":"Share with team", + "Share":"Share", + "View":"View", + "option":"option" + }, "report-heading":{ "Sr.No":"Sr.No", "Title":"Title", "Email":"Email", "Phone":"Phone", "File":"File", - "Owner": "Owner", + "Owner": "Owner", "Signers":"Signers", "Note": "Note", "Folder": "Folder", - "Reason": "Reason" + "Reason": "Reason", + "Parent Team":"Parent Team", + "Active":"Active", + "Role":"Role", + "Team":"Team", + "Name":"Name" }, "report-help":{ "Draft Documents": "These are documents you have started but have not finalized for sending.", @@ -121,9 +149,9 @@ "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." + "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", @@ -139,7 +167,7 @@ "create-folder":"Create Folder", "parent-folder":"Parent Folder", "create":"Create", - "Signers":"Signers", + "signers":"Signers", "signers-help":"Begin typing a contact's name to see suggested signers from your saved contacts or add new ones. Arrange the signing order by adding signers in the desired sequence. Use the '+' button to include signers and the 'x' to remove them. Each signer will receive an email prompt to sign the document in the order listed.", "add-signer":"Add Signer", "contact-not-found":"Contact not found", @@ -160,13 +188,82 @@ "generate-token-alert" :"Are you sure you want to regenerate token it will expire old token?", "yes":"Yes", "copied":"Copied", - "wrong-mssg":"Something went wrong.", + "something-went-wrong-mssg":"Something went wrong, please try again later.", "token-generated":"Token generated successfully.", "webhook":"Webhook", "update-webhook":"Update Webhook", "add-webhook":"Add Webhook", "webhook-added" :"Webhook added successfully.", - "document-signature":{ + "team-disabled":"Team disabled", + "Team enabled":"Team enabled", + "are-you-sure": "Are you sure you want to", + "disable":"disable", + "enable":"enable", + "this-team":" this team?", + "edit-team":"Edit Team", + "name-of-team":"Name of Team", + "prev":"Prev", + "no-data-avaliable":"No Data Available", + "add-team":"Add Team", + "page-not-found":"Page Not Found", + "users-from-teams":"users from Teams", + "user-status":"User status", + "activate" :"activate", + "deactivate":"deactivate", + "this-user":" this user", + "delete-user":"Delete User", + "delete":"delete", + "add-user":"Add User", + "password-generateed" :"Password will only be generated once; make sure to copy it.", + "Team status":"Team status", + "user-deactivated":"User deactivated.", + "user-activated":"User activated.", + "public":"Public", + "download":"Download", + "view":"View", + "make-template-public":"Make template public", + "make-template-private":"Make template private", + "make-template-public-alert" :"Are you sure you want to make this template public?", + "make-template-private-alert" :"Are you sure you want to make this template private? This will remove it from your public profile.", + "public-role":"Public role", + "public-url":"Public URL", + "public-url-copy-mssg" :" Here’s your public URL: Copy it or share it with the signer, and you will be able to see all your publicly set templates.", + "add-public-url-alert" :"Please add your public URL, and you will be able to make a public template.", + "share-with-alert":"You cannot share a template if any roles already have contacts assigned. Please remove all contact assignments from the roles before sharing the template.", + "share-with":"Share with", + "team-not-found":"Team not found", + "roles":"Roles", + "delete-document":"Delete Document", + "delete-document-alert" :"Are you sure you want to delete this document?", + "quick-send":"Quick send", + "add-new":"Add new", + "send":"Send" , + "quick-send-alert-1":"All roles in this document are currently linked to contacts. To quick send copies of this template to multiple signers, please ensure that at least one role is not linked to any contact." , + "quick-send-alert-2" :"Please ensure there's at least one signature widget added for all recipients.", + "quick-send-alert-3":"Please add at least one role to this template in order to 'quick send' copies of it to multiple signers.", + "quick-send-alert-4":"Quick send reached limit.", + "copy-link":"Copy link", + "copy":"Copy", + "revoke-document":"Revoke document", + "revoke-document-alert":"Are you sure you want to revoke this document?", + "resend-mail":"Resend Mail", + "resend-mail-help":"You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.", + "subject":"Subject", + "body":"Body", + "add-contact":"Add Contact", + "add-signer-alert":"Contact already exist!", + "record-delete-alert": "Record deleted successfully!", + "record-revoke-alert" : "Record revoked successfully!", + "mail-sent-alert": "Mail sent successfully.", + "document-sent-alert" : "Document sent successfully!", + "template-share-alert" :"Template Shared successfully.", + "template-public-alert-1" :"You have successfully made the template public.", + "template-public-alert-2" :"You have successfully made the template private.", + "template-public-alert-3" :"You need to select a role for the public signers.", + "template-public-alert-4": "Please ensure there's at least one signature widget added for all signers.", + "template-public-alert-5" : "Since this template has send-in-order enabled, the public role must be positioned at the top.", + "template-public-alert-6" :"Please attach signers to all roles except for the public role user.", + "template-public-alert-7" : "Please assign at least one public role to make this template public.", "loader":" This might take some time", "pages":"Pages", "document-signed":"Document signed", @@ -180,18 +277,129 @@ "verify-email":"Please verify your email !", "send-otp":" Send OTP", "otp-placeholder":"Enter OTP received over email", - "loading-doc":"Loading Document.." - } - - - - + "loading-doc":"Loading Document..", + "widgets-name":{ + "signature":"signature", + "stamp":"stamp", + "initials":"initials", + "name":"name", + "job title":"job title", + "company":"company", + "date":"date", + "text":"text", + "text input":"text input", + "checkbox":"checkbox", + "dropdown":"dropdown", + "radio button":"radio button", + "image": "image", + "email":"email" + }, + "fields":"Fields", + "recipients":"Recipients", + "please-add":"Please add a", + "signed-by":"Signed By", + "more":"more", + "sent":"sent", + "print":"Print", + "certificate":"Certificate", + "decline":"Decline", + "finish":"Finish", + "mail":"Mail", + "sign-now":"Sign Now", + "successfully-signed":"Successfully signed!", + "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.", + "upload-stamp-image":"Upload stamp image", + "draw":"Draw", + "type":"Type", + "my-initials":"My Initials", + "upload":"Upload", + "initial-teb":"Initials", + "signature-tab":"Signature", + "your-signature":"Your signature", + "copy-to-all-pages":"Copy to all pages", + "apply":"Apply", + "copy-type":{ + "All pages":"All pages", + "All pages but last":"All pages but last", + "All pages but first":"All pages but first" + }, + "options":"options", + "minimun-check":"Minimun check", + "maximum-check":"Maximum check", + "default-value":"Default value", + "select":"Select", + "read-only":"Is read only", + "hide-labels":"Hide labels", + "checkbox":"Checkbox", + "alert":"Alert", + "zoom-in":"Zoom in", + "zoom-out":"Zoom out", + "document-signed-alert":"Congratulations! 🎉 This document has been successfully signed by you!", + "otp-sent-alert":"OTP sent on your email", + "fields-required":"Fields required", + "signature-widget-alert-1" :"Please ensure there's at least one signature widget added", + "signature-widget-alert-2" : "Please ensure all field is accurately filled and meets all requirements.", + "encrypted-pdf-alert" :"Currently encrypted pdf files are not supported.", + "user-not-exist":"User does not exist", + "template-signature-field":"Please add at least one signature field for all roles.", + "template-role-alert":"Please add roles first", + "create-document":"Create Document", + "template-created-alert":"Do you want to create a document using the template you just created ?", + "signers-alert":"signers alert", + "template-creation-alert-1":"Please select signer for add placeholder!", + "ok":"Ok", + "radio-group":"Radio group", + "dropdown-options":"Dropdown options", + "add-role":"Add Role", + "role-ex":" e.g: Customer, Hr, Director, Manager, Student, etc", + "add/choose-signer":"Add/Choose Signer", + "choose-from-contacts":"Choose from contacts", + "select-signer" :" Please select signer", + "edit-template":"Edit Template", + "widget-info":"Widget info", + "validation":"Validation", + "invalid-default-value":"invalid default value", + "hint":"Hint", + "color":"color", + "role-help":{ + "p1":"What are template roles?", + "p2":"Begin by specifying each role needed for the completion of the document. Think about the parties involved in the signing process and what their responsibilities are. Common roles include HR for internal documents, Customer for agreements or Vendor for business agreements.", + "p3":"Why pre-attach users to some roles?", + "p4":"For roles that consistently involve the same individual (e.g., the CEO's signature on employee offer letters), you can pre-attach a user to a role within the template. This step is optional but recommended for efficiency and consistency across documents.", + "p5":"When do i specify the user attached to each role?", + "p6":"When you create a document from your template, you'll be prompted to attach users to each defined role. If a role already has a user attached, this will be pre-filled, but you can modify it as needed before sending out the document." + }, + "add-recipients":"Add recipients", + "loading-mssg": "This might take some time", + "send-mail": "Send Mail", + "placeholder-alert-1":"Please ensure there's at least one signature widget added for all recipients.", + "placeholder-alert-2":"Please confirm that you have filled the text field.", + "placeholder-alert-3":" Are you sure you want to send out this document for signatures?", + "placeholder-alert-4":"You have successfully sent mails to all recipients!", + "placeholder-alert-5":"Do you want to sign documents right now ?", + "placeholder-alert-6" :"Please setup mail adapter to send mail!", + "placeholder-alert-7" :"Please select signer for add placeholder!", + "email-subject":"email subject", + "email-body":"email body", + "email-placeholder":"add body of email", + "reset-to-default" :"Reset to default", + "cutomize-email":"Cutomize Email", + "upgrade-to-customize-email":"Upgrade to customize Email", + "sign-url":"Sign url", + "Mails Sent":"Mails Sent", + "document-alert":"Document Alert", + "owner-subscription-expired":"Owner's subscription has expired.", + "subscription-expired":"Subscription Expired", + "alert-message":"Alert message", + "document-decline":"Document decline", + "decline-alert-1":"Are you sure want to decline this document ?", + "decline-alert-2":"You have declined this document!", + "decline-alert-3":"You can not sign this document as it has been declined/revoked.", + "sign here":"Sign here", + "guest-email-alert" :"verification code is sent to your email", + "get-otp-alert" :"you will get a OTP via Email" + - - - - - - - } - \ No newline at end of file +} \ No newline at end of file diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index a71bca04d..8405706c7 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -7,29 +7,35 @@ "email":"E-mail", "company":"Entreprise", "job-title":"Titre d'emploi", + "profile":"Profil", "is-email-verified":"L'e-mail est-il vérifié", + "log-out" :"Déconnexion", "public-profile":"Profil public", "tagline":"Slogan", "has-requested-you-to-sign":" vous a demandé de signer", "has-requested-you-to-review-and-sign":"vous a demandé de consulter et de signer", - "Ascending":"Ascendant", - "Action":"Action", + "ascending":"Ascendant", + "action":"Action", "add":"ajouter", - "add-new-folder":"add new folder", + "add-new-folder":"ajouter un nouveau dossier", "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", + "pro":"PRO", + "team":"ÉQUIPE", + "docs":"Documents", "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", + "Login-to-your-account" :"Se connecter à son compte", "password" :"Mot de passe", "forgot-password":"Mot de passe oublié?", "loading":"Chargement...", + "of":"de", "sign-SSO":"Connectez-vous avec SSO", "login-page":"Page de connexion", "or":"OU", @@ -42,7 +48,7 @@ "register" :"Registre", "sidebar": { "Dashboard": "Tableau de bord", - "Sign yourself": "Signez-vous", + "Sign yourself": "signez vous-même", "Request signatures":"Demander des signatures", "Templates":"Modèles", "Templates-Children":{ @@ -51,20 +57,22 @@ }, "OpenSign™ Drive":"Lecteur OpenSign™", "Reports":"Rapports", - "Reports-Children" :{ - "Need your sign": "Besoin de votre signe", + "Reports-Children" :{ + "Need your sign": "Besoin de signer", "In Progress": "En cours", "Completed":"Complété", "Drafts": "Brouillons", - "Declined": "Diminué", + "Declined": "a refusé", "Expired":"Expiré", "Contactbook":"Carnet de contacts" }, "Settings": "Paramètres", "Settings-Children":{ - "My Signature": "Ma signature", + "My Signature": "Ma signature", "API Token":"Jeton API", - "Webhook":"Webhook" + "Webhook":"Webhook", + "Teams":"Équipes", + "Users":"Utilisateurs" } }, "dashboard-card":{ @@ -82,20 +90,40 @@ "Recent signature requests":"Demandes de signature récentes", "Drafts":"Brouillons", "Contactbook":"Carnet de contacts", - "Templates":"Modèles" + "Templates":"Modèles", + "Teams":"Teams", + "Users":"Utilisateurs" }, "report-heading":{ "Sr.No":"Sr. Non", "Title":"Titre", "Email":"E-mail", "Phone":"Téléphone", - "File":"Déposer", + "File":"Fichier", "Owner":"Propriétaire", "Signers":"Signataires", "Note": "Note", "Folder":"Dossier", - "Reason": "Raison" + "Reason": "Raison", + "Parent Team":"Équipe de parents", + "Active":"Actif", + "Role":"Rôle", + "Team":"Équipe", + "Name":"Nom" }, + "btnLabel":{ + "sign":"signe", + "Resend":"Renvoyer", + "Revoke":"Révoquer", + "Delete":"Supprimer", + "Use":"Utiliser", + "Quick send":"Envoi rapide", + "Edit":"Modifier", + "Share with team":"Partager avec l'équipe", + "Share":"Partager", + "View":"Voir", + "option":"option" + }, "report-help":{ "Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.", "Need your sign": "Voici une liste de documents qui attendent votre signature", @@ -107,7 +135,7 @@ "Templates" : "Il s'agit d'une liste de modèles à votre disposition pour créer des documents. Vous pouvez cliquer sur le bouton 'Utiliser' pour créer un nouveau document à l'aide d'un modèle, modifier le document et ajouter des signataires à l'étape suivante." }, "form-name":{ - "Sign Yourself":"Signez-vous", + "Sign Yourself":"signez vous-même", "Request Signatures":"Demander des signatures", "New Template":"Nouveau modèle" }, @@ -132,58 +160,249 @@ "select-folder" :"Sélectionner le dossier", "OpenSign-drive":"Lecteur OpenSign™", "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", + "no-data" :"Aucune donnée disponible", "save-here":"Enregistrer ici", - "back" :"Dos", + "back" :"Retour", "add-folder" :"Ajouter le dossier", "create-folder":"Créer le dossier", "parent-folder" :"Dossier parent", "create":"Créer", - "Signers" :"Signataires", + "signers" :"Signataires", "signers-help" :"Commencez à saisir le nom d'un contact pour voir les signataires suggérés par vos contacts enregistrés ou en ajouter de nouveaux. Organisez l'ordre de signature en ajoutant des signataires dans l'ordre souhaité. Utilisez le bouton « + » pour inclure les signataires et le « x » pour les supprimer. Chaque signataire recevra un e-mail invité à signer le document dans l'ordre indiqué.", "add-signer":"Ajouter un signataire", "contact-not-found" :"Contact introuvable", - "add-yourself" :"Ajoutez-vous", + "add-yourself":"Ajoutez-vous", "submit" :"Soumettre", "reset" :"Réinitialiser", - "my-signature" :"Ma signature", + "my-signature":"Ma signature", "signature":"Signature", "upload-image" :"Télécharger une image", - "clear" :"clair", - "upload-signature/Image" :"Veuillez télécharger la signature/l'image", + "clear" :"Vider", + "upload-signature/Image" :"télécharger-signature/Image", "initials" :"Initiales", "API" :"API", "api-token":"Jeton API", "regenerate-token":"Régénérer le jeton", "generate-token" :"Générer un jeton", "view-docs" :"Afficher les documents" , - "generate-token-alert" :"Êtes-vous sûr de vouloir régénérer le jeton, il expirera à l'ancienne jeton?", + "generate-token-alert":"Êtes-vous sûr de vouloir régénérer le jeton, il expirera à l'ancienne jeton?", "yes" :"Oui", "copied" :"Copié", - "wrong-mssg" :"Quelque chose s'est mal passé.", - "token-generated" :"Jeton généré avec succès.", + "wrong-mssg":"Quelque chose c'est mal passé. Merci d'essayer plus tard.", + "token-generated":"Jeton généré avec succès.", "webhook":"Webhook", "update-webhook" :"Mettre à jour le webhook", "add-webhook" :"Ajouter un webhook", "webhook-added" :"Webhook ajouté avec succès.", + "team-disabled":"Équipe: Désactivée", + "team-enabled":"Équipe activée", + "are-you-sure":"Êtes-vous sûr de vouloir", + "disable":"désactiver", + "enable":"activer", + "this-team":"cette équipe?", + "edit-team" :"Modifier l'équipe", + "name-of-team":"Nom de l'équipe", + "prev" :"précédent", + "no-data-avaliable" :"pas de données disponibles", + "add-team":"Ajouter une équipe", + "page-not-found" :"Page non trouvée", + "users-from-teams" :"utilisateurs de Teams", + "user-status":"Statut de l'utilisateur", + "activate" :"Activer", + "deactivate":"désactiver", + "this-user":"cet utilisateur ", + "delete-user":"Supprimer l'utilisateur", + "delete" :"supprimer", + "add-user":"Ajouter un utilisateur", + "password-generateed" :"Le mot de passe ne sera généré qu'une seule fois ; assurez-vous de le copier.", + "Team status" :"Statut de l'équipe", + "user-deactivated":"Utilisateur désactivé.", + "user-activated":"Activé par l'utilisateur.", + "public" :"Public", + "download" :"Téléchargement", + "view":"voir", + "make-template-public" :"Rendre le modèle public", + "make-template-private" :"Rendre le modèle privé", + "make-template-public-alert" :"Êtes-vous sûr de vouloir rendre ce modèle public ?", + "make-template-private-alert":"Êtes-vous sûr de vouloir rendre ce modèle privé ? Cela le supprimera de votre profil public.", + "public-role" :"Rôle public", + "public-url" :"URL publique", + "public-url-copy-mssg":"Voici votre URL publique : copiez-la ou partagez-le avec le signataire et vous pouvoir voir tous vos paramètres publics modèles.", + "add-public-url-alert":"Veuillez ajouter votre URL publique et vous pourra rendre public modèle.", + "share-with-alert":"Vous ne pouvez pas partager un modèle si des contacts sont déjà attribués à des rôles. Veuillez supprimer toutes les attributions de contacts des rôles avant de partager le modèle.", + "share-with":"Partager avec", + "team-not-found" :"Équipe introuvable", + "roles":"Les rôles", + "delete-document" :"Supprimer un document", + "delete-document-alert" :"Êtes-vous sûr de vouloir supprimer ce document ?", + "quick-send" :"Envoi rapide", + "add-new" :"Ajouter un nouveau", + "send" :"envoyer", + "quick-send-alert-1":"Tous les rôles dans ce document sont actuellement liés à des contacts. Pour envoyer rapidement des copies de ce modèle à plusieurs signataires, veuillez vous assurer qu'au moins un rôle n'est lié à aucun contact.", + "quick-send-alert-2":"Veuillez vous assurer qu'au moins un widget de signature est ajouté pour tous les destinataires.", + "quick-send-alert-3":"Veuillez ajouter au moins un rôle à ce modèle afin d'en « envoyer rapidement » des copies à plusieurs signataires.", + "quick-send-alert-4":"L'envoi rapide a atteint la limite.", + "copy-link" :"Copier le lien", + "copy":"Copier", + "revoke-document":"Révoquer le document", + "revoke-document-alert" :"Êtes-vous sûr de vouloir révoquer ce document ?", + "resend-mail":"Renvoyer le courrier", + "resend-mail-help" :"Vous pouvez utiliser les variables suivantes qui seront remplacées par leurs valeurs réelles : - {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email} }, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.", + "subject":"Sujet", + "body":"Corps", + "add-contact":"Ajouter le contact", + "add-signer-alert":"Le contact existe déjà !", + "record-delete-alert":"Enregistrement supprimé avec succès !", + "record-revoke-alert":" Enregistrement révoqué avec succès ! ", + "mail-sent-alert":"Courriel envoyé avec succès.", + "document-sent-alert":"Document envoyé avec succès !", + "template-share-alert":"Modèle partagé avec succès.", + "template-public-alert-1":"Vous avez rendu le modèle public avec succès.", + "template-public-alert-2":"Vous avez réussi à rendre le modèle privé.", + "template-public-alert-3":"Vous devez sélectionner un rôle pour les signataires publics.", + "template-public-alert-4" :"Veuillez vous assurer qu'au moins un widget de signature est ajouté pour tous les signataires.", + "template-public-alert-5" :"Étant donné que l'envoi dans l'ordre est activé sur ce modèle, le rôle public doit être positionné en haut.", + "template-public-alert-6" :"Veuillez associer des signataires à tous les rôles, à l'exception du rôle d'utilisateur public.", + "template-public-alert-7" :"Veuillez attribuer au moins un rôle public pour rendre ce modèle public.", + "loader":"Cela pourrait prendre un certain temps", + "pages":"Pages", + "document-signed":"Document signé", + "close":"Fermer", + "validation-alert":"Alerte de validation", + "validate-alert-mssg" :"L'entrée ne répond pas aux critères définis par l'expression régulière.", + "otp-verification":"Vérification OTP", + "enter-otp":"Entrez OTP", + "verify":"Vérifier", + "resend":"Renvoyer", + "verify-email":"Veuillez vérifier votre email!", + "send-otp":"envoyer un code à usage unique", + "otp-placeholder":"Saisissez l'OTP reçu par e-mail", + "loading-doc":"Chargement du document..", + "widgets-name":{ + "signature":"signature", + "stamp":"estampiller", + "initials":"initiales", + "name":"nom", + "job title":"titre d'emploi", + "company":"entreprise", + "date":"date", + "text":"texte", + "text input":"saisie de texte", + "checkbox":"checkbocase à cocher", + "dropdown":"dérouler", + "radio button":"bouton radio", + "image": "image", + "email":"e-mail" + }, + "fields" : "Des champs", + "recipients":"Destinataires", + "please-add" :"Veuillez ajouter un", + "signed-by" :"Signé par", + "more":"plus", + "sent":"Envoyé", + "print":"imprimer", + "certificate":"Certificat", + "decline":"refusé", + "finish":"terminé", + "mail":"Mail", + "sign-now":"Signez maintenant", + "successfully-signed" :"Signé avec succès !", + "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.", + "upload-stamp-image":"Télécharger l'image du tampon", + "draw":"Dessiner", + "type":"Type", + "my-initials" :"Mes initiales", + "upload" :"Télécharger", + "initial-teb":"Initiales", + "signature-tab":"Signature", + "your-signature" :"Votre signature", + "copy-to-all-pages" :"Copier sur toutes les pages", + "apply" :"Appliquer", + "copy-type":{ + "All pages":"Toutes les pages", + "All pages but last": "Toutes les pages sauf la dernière", + "All pages but first":"Toutes les pages sauf la première" + }, + "options": "Possibilités", + "minimun-check" :"Vérification minimale", + "maximum-check" :"Contrôle maximum", + "default-value" :"Valeur par défaut", + "select":"Sélectionner", + "read-only" :"Est en lecture seule", + "hide-labels":"Masquer les étiquettes", + "checkbox":"Case à cocher", + "alert":"Alerte", + "zoom-in":"Agrandir", + "zoom-out" :"Dézoomer", + "document-signed-alert" :"Félicitations ! 🎉 Ce document a été signé avec succès par vous !", + "otp-sent-alert" :"OTP envoyé sur votre email", + "fields-required" :"Champs obligatoires", + "signature-widget-alert-1" :"Veuillez vous assurer qu'au moins un widget de signature a été ajouté", + "signature-widget-alert-2" :"Veuillez vous assurer que tous les champs sont remplis avec précision et répondent à toutes les exigences.", + "encrypted-pdf-alert" :"Les fichiers PDF actuellement cryptés ne sont pas pris en charge.", + "user-not-exist" :"L'utilisateur n'existe pas", + "template-signature-field":"Veuillez ajouter au moins un champ de signature pour tous les rôles.", + "template-role-alert":"Veuillez d'abord ajouter des rôles", + "create-document" :"Créer un document", + "template-created-alert":"Voulez-vous créer un document en utilisant le modèle que vous vient de créer ?", + "signers-alert" :"alerte des signataires", + "template-creation-alert-1" :"Veuillez sélectionner le signataire pour ajouter un espace réservé !", + "ok":"D'accord", + "radio-group" :"Groupe de radio", + "dropdown-options":"Options déroulantes", + "add-role" :"Ajouter un rôle", + "role-ex" :"Ex : Client, RH, Directeur, Manager, Étudiant, etc.", + "add/choose-signer":"Ajouter/Choisir un signataire", + "choose-from-contacts":"Choisissez parmi les contacts", + "select-signer":"Veuillez sélectionner le signataire", + "edit-template" :"Modifier le modèle", + "widget-info" :"Informations sur les widgets", + "validation" : "Validation", + "invalid-default-value" :"valeur par défaut invalide", + "hint":"Indice", + "color":"couleur", + "role-help":{ + "p1":"Que sont les rôles modèles ?", + "p2":"Commencez par spécifier chaque rôle nécessaire à la finalisation du document. Pensez aux parties impliquées dans le processus de signature et à leurs responsabilités. Les rôles courants incluent les RH pour les documents internes, le Client pour les accords ou le Fournisseur pour les accords commerciaux.", + "p3":"Pourquoi pré-attacher les utilisateurs à certains rôles ?", + "p4":"Pour les rôles qui impliquent systématiquement la même personne (par exemple, la signature du PDG sur les lettres d'offre des employés), vous pouvez pré-attacher un utilisateur à un rôle dans le modèle. Cette étape est facultative mais recommandée pour des raisons d'efficacité et de cohérence entre les documents.", + "p5":"Quand dois-je spécifier l'utilisateur attaché à chaque rôle ?", + "p6":"Lorsque vous créez un document à partir de votre modèle, vous serez invité à attacher des utilisateurs à chaque rôle défini. Si un rôle est déjà associé à un utilisateur, celui-ci sera pré-rempli, mais vous pourrez le modifier si nécessaire avant d'envoyer le document." + }, + "add-recipients":"Ajouter des destinataires", + "loading-mssg" :"Cela pourrait prendre du temps", + "send-mail" :"Envoyer un mail", + "placeholder-alert-1" :"Veuillez vous assurer qu'au moins un widget de signature est ajouté pour tous les destinataires.", + "placeholder-alert-2" :"Veuillez confirmer que vous avez rempli le champ de texte.", + "placeholder-alert-3" :"Etes-vous sûr de vouloir envoyer ce document pour signature ? ", + "placeholder-alert-4" :"Vous avez envoyé avec succès des mails à tous les", + "placeholder-alert-5" :"Voulez-vous signer des documents maintenant ?", + "placeholder-alert-6" :"Veuillez configurer l'adaptateur de messagerie pour envoyer du courrier !", + "placeholder-alert-7" :"Veuillez sélectionner le signataire pour ajouter un espace réservé !", + "email-subject":"Sujet du courriel", + "email-body":"corps de l'e-mail", + "email-placeholder" :"ajouter le corps de l'e-mail", + "reset-to-default" :"Réinitialiser aux valeurs par défaut", + "cutomize-email":"Personnaliser l'e-mail", + "upgrade-to-customize-email":"Mise à niveau pour personnaliser l'e-mail", + "sign-url" :"Signer l'URL", + "Mails Sent" :"Mails envoyés", + "document-alert" :"Alerte document", + "owner-subscription-expired":"L'abonnement du propriétaire a expiré.", + "subscription-expired" :"Abonnement expiré", + "alert-message" :"Message d'alerte", + "document-decline" :"Document-refus", + "decline-alert-1":"Etes-vous sûr de vouloir refuser ce document ?", + "decline-alert-2": "Vous avez refusé ce document !", + "decline-alert-3": "Vous ne pouvez pas signer ce document car il a été refusé/révoqué.", + "sign here":"Signer ici", + "guest-email-alert" :"le code de vérification a été envoyé sur votre e-mail", + "get-otp-alert":"vous recevrez un mot de passe à usage unique par e-mail" + - "document-signature":{ - "loader":"Cela pourrait prendre un certain temps", - "pages":"Pages", - "document-signed":"Document signé", - "close":"Close", - "validation-alert":"Alerte de validation", - "validate-alert-mssg" :"L'entrée ne répond pas aux critères définis par l'expression régulière.", - "otp-verification":"Vérification OTP", - "enter-otp":"Entrez OTP", - "verify":"Vérifier", - "resend":"Renvoyer", - "verify-email":"Veuillez vérifier votre email!", - "send-otp":"Envoyer OTP", - "otp-placeholder":"Saisissez l'OTP reçu par e-mail", - "loading-doc":"Chargement du document.." - } - + } \ No newline at end of file diff --git a/apps/OpenSign/src/components/AddSigner.js b/apps/OpenSign/src/components/AddSigner.js index 9b85ebb13..4b1e0e9c1 100644 --- a/apps/OpenSign/src/components/AddSigner.js +++ b/apps/OpenSign/src/components/AddSigner.js @@ -169,17 +169,17 @@ const AddSigner = (props) => { } } } else { - alert("Contact already exist!"); + alert(t("add-signer-alert")); setIsLoader(false); } } catch (err) { console.log("err in fetch contact", err); setIsLoader(false); - alert("something went wrong, please try again later"); + alert(t("something-went-wrong-mssg")); } } else { setIsLoader(false); - alert("something went wrong, please try again later"); + alert(t("something-went-wrong-mssg")); } }; diff --git a/apps/OpenSign/src/components/AddTeam.js b/apps/OpenSign/src/components/AddTeam.js index a76ac98f5..088e13edd 100644 --- a/apps/OpenSign/src/components/AddTeam.js +++ b/apps/OpenSign/src/components/AddTeam.js @@ -2,8 +2,10 @@ import React, { useEffect, useState } from "react"; import Parse from "parse"; import Title from "./Title"; import Loader from "../primitives/Loader"; +import { useTranslation } from "react-i18next"; const AddTeam = (props) => { + const { t } = useTranslation(); const [formdata, setFormdata] = useState({ name: "", team: "" @@ -140,7 +142,7 @@ const AddTeam = (props) => { htmlFor="name" className="block text-xs text-gray-700 font-semibold" > - Name + {t("name")} * { htmlFor="phone" className="block text-xs text-gray-700 font-semibold" > - Parent Team + {t("report-heading.Parent Team")} { htmlFor="email" className="block text-xs text-gray-700 font-semibold" > - Email + {t("email")} * { htmlFor="email" className="block text-xs text-gray-700 font-semibold" > - Password + {t("password")}
{formdata?.password}
@@ -304,7 +306,7 @@ const AddUser = (props) => { >
- Password will only be generated once; make sure to copy it. + {t("password-generateed")}
@@ -312,7 +314,7 @@ const AddUser = (props) => { htmlFor="phone" className="block text-xs text-gray-700 font-semibold" > - Phone + {t("phone")} {/* * */} { + const { t } = useTranslation(); const [forms, setForms] = useState([]); const [formId, setFormId] = useState(2); const formRef = useRef(null); @@ -96,7 +98,7 @@ const BulkSendUi = (props) => { setScrollOnNextUpdate(true); } else { // If the limit has been reached, throw an error with the appropriate message - alert("Quick send reached limit."); + alert(t("quick-send-alert-4")); } }; @@ -244,36 +246,32 @@ const BulkSendUi = (props) => { onClick={handleAddForm} className="op-btn op-btn-primary focus:outline-none" > - Add new + {" "} + {t("add-new")}
) : (
- All roles in this document are currently linked to contacts. To - 'quick send' copies of this template to multiple - signers, please ensure that at least one role is not linked to - any contact. + {t("quick-send-alert-1")}
)} ) : (
- Please ensure there's at least one signature widget added for - all recipients. + {t("quick-send-alert-2")}
) ) : (
- Please add at least one role to this template in order to 'quick - send' copies of it to multiple signers. + {t("quick-send-alert-3")}
)} diff --git a/apps/OpenSign/src/components/Header.js b/apps/OpenSign/src/components/Header.js index edfb32b68..31968315b 100644 --- a/apps/OpenSign/src/components/Header.js +++ b/apps/OpenSign/src/components/Header.js @@ -11,8 +11,10 @@ import { openInNewTab } from "../constant/Utils"; import { isEnableSubscription, isStaging } from "../constant/const"; +import { useTranslation } from "react-i18next"; const Header = ({ showSidebar }) => { + const { t } = useTranslation(); const navigate = useNavigate(); const { width } = useWindowSize(); let username = localStorage.getItem("username"); @@ -126,18 +128,18 @@ const Header = ({ showSidebar }) => { className="text-xs md:text-sm shadow op-btn op-btn-outline op-btn-sm md:op-btn-md op-btn-accent" onClick={() => navigate("/subscription")} > - Upgrade Now + {t("upgrade-now")} )} {!isTeam && isPro && (
- PRO + {t("pro")}
)} {isTeam && (
- TEAM + {t("team")}
)}
@@ -182,7 +184,7 @@ const Header = ({ showSidebar }) => { >
  • openInNewTab("https://docs.opensignlabs.com")}> - Docs + {t("docs")}
  • { }} > - Profile + {t("profile")}
  • { }} > - Change Password + {t("change-password")}
  • {
  • - Log Out + {" "} + {t("log-out")}
  • diff --git a/apps/OpenSign/src/components/opensigndrive/DriveBody.js b/apps/OpenSign/src/components/opensigndrive/DriveBody.js index 6d12575a1..68398be9c 100644 --- a/apps/OpenSign/src/components/opensigndrive/DriveBody.js +++ b/apps/OpenSign/src/components/opensigndrive/DriveBody.js @@ -8,8 +8,10 @@ import Table from "react-bootstrap/Table"; import * as HoverCard from "@radix-ui/react-hover-card"; import ModalUi from "../../primitives/ModalUi"; import FolderModal from "../shared/fields/FolderModal"; +import { useTranslation } from "react-i18next"; function DriveBody(props) { + const { t } = useTranslation(); const [rename, setRename] = useState(""); const [renameValue, setRenameValue] = useState(""); const inputRef = useRef(null); @@ -42,7 +44,7 @@ function DriveBody(props) { props.setFolderName((prev) => [...prev, folderData]); props.setIsLoading({ isLoad: true, - message: "This might take some time" + message: t("loading-mssg") }); props.setDocId(data.objectId); props.setPdfData([]); diff --git a/apps/OpenSign/src/components/pdf/AddRoleModal.js b/apps/OpenSign/src/components/pdf/AddRoleModal.js index 1da6f8a98..5edfd2e0e 100644 --- a/apps/OpenSign/src/components/pdf/AddRoleModal.js +++ b/apps/OpenSign/src/components/pdf/AddRoleModal.js @@ -1,10 +1,12 @@ import React from "react"; import ModalUi from "../../primitives/ModalUi"; +import { useTranslation } from "react-i18next"; const AddRoleModal = (props) => { + const { t } = useTranslation(); return ( @@ -21,19 +23,19 @@ const AddRoleModal = (props) => { className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs mt-1" />

    - e.g: Customer, Hr, Director, Manager, Student, etc... + {t("role-ex")}..

    diff --git a/apps/OpenSign/src/components/pdf/DraftDocument.js b/apps/OpenSign/src/components/pdf/DraftDocument.js index 8b4f63b87..461e33a7b 100644 --- a/apps/OpenSign/src/components/pdf/DraftDocument.js +++ b/apps/OpenSign/src/components/pdf/DraftDocument.js @@ -3,16 +3,18 @@ import LoaderWithMsg from "../../primitives/LoaderWithMsg"; import { contractDocument } from "../../constant/Utils"; import HandleError from "../../primitives/HandleError"; import { useLocation, useNavigate } from "react-router-dom"; +import { useTranslation } from "react-i18next"; function useQuery() { return new URLSearchParams(useLocation().search); } function DraftDocument() { + const { t } = useTranslation(); const navigate = useNavigate(); const query = useQuery(); const docId = query.get("docId"); const [isLoading, setIsLoading] = useState({ isLoader: true, - message: "This might take some time" + message: t("loading-mssg") }); useEffect(() => { getDocumentDetails(); diff --git a/apps/OpenSign/src/components/pdf/DropdownWidgetOption.js b/apps/OpenSign/src/components/pdf/DropdownWidgetOption.js index d796f8769..45d9e497c 100644 --- a/apps/OpenSign/src/components/pdf/DropdownWidgetOption.js +++ b/apps/OpenSign/src/components/pdf/DropdownWidgetOption.js @@ -3,7 +3,9 @@ import { isEnableSubscription } from "../../constant/const"; import ModalUi from "../../primitives/ModalUi"; import { radioButtonWidget } from "../../constant/Utils"; import Upgrade from "../../primitives/Upgrade"; +import { useTranslation } from "react-i18next"; function DropdownWidgetOption(props) { + const { t } = useTranslation(); const [dropdownOptionList, setDropdownOptionList] = useState([ "option-1", "option-2" @@ -155,7 +157,8 @@ function DropdownWidgetOption(props) { >
    {dropdownOptionList.map((option, index) => ( @@ -222,7 +225,7 @@ function DropdownWidgetOption(props) { !props.isSubscribe ? "text-[gray]" : "" } text-[13px] font-semibold`} > - Minimun check + {t("minimun-check")} {!props.isSubscribe && isEnableSubscription && ( @@ -245,7 +248,7 @@ function DropdownWidgetOption(props) { !props.isSubscribe ? "text-[gray]" : "" } text-[13px] font-semibold`} > - Maximum check + {t("maximum-check")} {
    {
    { />
    - +
    { checked={formData.SendinOrder === "true"} onChange={handleStrInput} /> -
    Yes
    +
    {t("yes")}
    { checked={formData.SendinOrder === "false"} onChange={handleStrInput} /> -
    No
    +
    {t("no")}
    {isEnableSubscription && ( @@ -140,7 +142,8 @@ const EditTemplate = ({ template, onSuccess }) => { isSubscribe ? "font-semibold" : "font-semibold text-gray-300" } > - Auto reminder{" "} + {t("auto-reminder")} + {" "} {!isSubscribe && isEnableSubscription && }
    )} @@ -222,7 +224,7 @@ function Header({ className="fa-light fa-arrow-down mr-[3px]" aria-hidden="true" > - Download + {t("download")} @@ -249,13 +251,14 @@ function Header({
    {filterPrefill.length === 0 ? ( - Add {signersdata.length - filterPrefill.length}{" "} - recipients signature + {t("add")} {signersdata.length - filterPrefill.length}{" "} + {t("recipients")} {t("widgets-name.signature")} ) : ( - Add {signersdata.length - filterPrefill.length} more - recipients signature + {t("add")} {signersdata.length - filterPrefill.length}{" "} + {t("more")} + {t("recipients")} {t("widgets-name.signature")} )}
    @@ -275,7 +278,7 @@ function Header({ type="button" className="op-btn op-btn-ghost op-btn-sm mr-[3px]" > - Back + {t("back")}
    @@ -303,7 +306,7 @@ function Header({ className="fa-light fa-print py-[3px]" aria-hidden="true" > - Print + {t("print")} {isCompleted && ( )} ) : ( @@ -341,7 +344,7 @@ function Header({ type="button" className="op-btn op-btn-ghost op-btn-sm mr-[3px]" > - Back + {t("back")} {currentSigner && ( <> @@ -349,14 +352,14 @@ function Header({ className="op-btn op-btn-secondary op-btn-sm mr-[3px] shadow" onClick={() => handleDeclinePdfAlert()} > - Decline + {t("decline")} )} @@ -383,7 +386,9 @@ function Header({ className="op-btn op-btn-secondary op-btn-sm gap-0 font-medium text-[12px] mr-[3px] shadow" > - Certificate + + {t("certificate")} + )} ) : isPublicTemplate ? ( @@ -423,7 +428,7 @@ function Header({ embedWidgetsData(); }} > - Sign Now + {t("sign-now")} @@ -434,7 +439,7 @@ function Header({ type="button" className="op-btn op-btn-ghost op-btn-sm mr-[3px]" > - Back + {t("back")} )} diff --git a/apps/OpenSign/src/components/pdf/PdfZoom.js b/apps/OpenSign/src/components/pdf/PdfZoom.js index eaacbbf04..c12868e01 100644 --- a/apps/OpenSign/src/components/pdf/PdfZoom.js +++ b/apps/OpenSign/src/components/pdf/PdfZoom.js @@ -1,6 +1,8 @@ import React from "react"; +import { useTranslation } from "react-i18next"; function PdfZoom(props) { + const { t } = useTranslation(); const onClickZoomIn = () => { props.setScale(props.scale + 0.1 * props.scale); props.setZoomPercent(props.zoomPercent + 10); @@ -25,14 +27,14 @@ function PdfZoom(props) { @@ -42,7 +44,7 @@ function PdfZoom(props) { style={{ cursor: props.zoomPercent > 0 ? "pointer" : "default" }} - title="Zoom out" + title={t("zoom-out")} > diff --git a/apps/OpenSign/src/components/pdf/PlaceholderCopy.js b/apps/OpenSign/src/components/pdf/PlaceholderCopy.js index a7cdf26f8..64c85c413 100644 --- a/apps/OpenSign/src/components/pdf/PlaceholderCopy.js +++ b/apps/OpenSign/src/components/pdf/PlaceholderCopy.js @@ -1,8 +1,10 @@ import React, { useState } from "react"; import ModalUi from "../../primitives/ModalUi"; import { randomId, textWidget } from "../../constant/Utils"; +import { useTranslation } from "react-i18next"; function PlaceholderCopy(props) { + const { t } = useTranslation(); const copyType = ["All pages", "All pages but last", "All pages but first"]; const [selectCopyType, setSelectCopyType] = useState(""); //function for get copy placeholder position @@ -188,7 +190,7 @@ function PlaceholderCopy(props) { return ( handleUniqueId()} >
    @@ -203,8 +205,7 @@ function PlaceholderCopy(props) { onChange={() => setSelectCopyType(data)} checked={selectCopyType === data} /> - - {data} + {t(`copy-type.${data}`)}
    ); @@ -220,14 +221,14 @@ function PlaceholderCopy(props) { disabled={!selectCopyType} className="op-btn op-btn-primary" > - Apply + {t("apply")}
    diff --git a/apps/OpenSign/src/components/pdf/PlaceholderType.js b/apps/OpenSign/src/components/pdf/PlaceholderType.js index 546e83a65..1e1531f18 100644 --- a/apps/OpenSign/src/components/pdf/PlaceholderType.js +++ b/apps/OpenSign/src/components/pdf/PlaceholderType.js @@ -14,12 +14,15 @@ import "react-datepicker/dist/react-datepicker.css"; import "../../styles/signature.css"; import RegexParser from "regex-parser"; import { emailRegex } from "../../constant/const"; +import { useTranslation } from "react-i18next"; const textWidgetCls = "w-full h-full md:min-w-full md:min-h-full z-[999] text-[12px] rounded-[2px] border-[1px] border-[#007bff] overflow-hidden resize-none outline-none text-base-content item-center whitespace-pre-wrap"; const selectWidgetCls = "w-full h-full absolute left-0 top-0 border-[1px] border-[#007bff] rounded-[2px] focus:outline-none text-base-content"; function PlaceholderType(props) { + const { t } = useTranslation(); const type = props?.pos?.type; + const widgetTypeTraslation = t(`widgets-name.${props?.pos?.type}`); const [selectOption, setSelectOption] = useState(""); const [validatePlaceholder, setValidatePlaceholder] = useState(""); const inputRef = useRef(null); @@ -311,7 +314,7 @@ function PlaceholderType(props) { props?.handleUserName( props?.data?.Id, props?.data?.Role, - props?.pos?.type + widgetTypeTraslation )} ); @@ -329,7 +332,7 @@ function PlaceholderType(props) { props?.handleUserName( props?.data?.Id, props?.data?.Role, - props?.pos?.type + widgetTypeTraslation )} ); @@ -424,7 +427,7 @@ function PlaceholderType(props) { overflow: "hidden" }} > - {type} + {widgetTypeTraslation} ); case "dropdown": @@ -461,7 +464,9 @@ function PlaceholderType(props) { ) : (
    - {props.pos?.options?.name ? props.pos.options.name : type} + {props.pos?.options?.name + ? props.pos.options.name + : widgetTypeTraslation}
    ); case "initials": @@ -478,7 +483,7 @@ function PlaceholderType(props) { props?.handleUserName( props?.data?.Id, props?.data?.Role, - props?.pos?.type + widgetTypeTraslation )} ); @@ -524,7 +529,7 @@ function PlaceholderType(props) { overflow: "hidden" }} > - {type} + {widgetTypeTraslation} ); case "company": @@ -568,7 +573,7 @@ function PlaceholderType(props) { fontFamily: "Arial, sans-serif" }} > - {type} + {widgetTypeTraslation} ); case "job title": @@ -612,7 +617,7 @@ function PlaceholderType(props) { overflow: "hidden" }} > - {type} + {widgetTypeTraslation} ); case "date": @@ -699,7 +704,7 @@ function PlaceholderType(props) { props?.handleUserName( props?.data?.Id, props?.data?.Role, - props?.pos?.type + widgetTypeTraslation )} ); @@ -746,7 +751,7 @@ function PlaceholderType(props) { overflow: "hidden" }} > - {type} + {widgetTypeTraslation} ); case radioButtonWidget: diff --git a/apps/OpenSign/src/components/pdf/PrevNext.js b/apps/OpenSign/src/components/pdf/PrevNext.js index a581bcbf1..d4a6a93d2 100644 --- a/apps/OpenSign/src/components/pdf/PrevNext.js +++ b/apps/OpenSign/src/components/pdf/PrevNext.js @@ -1,6 +1,8 @@ import React from "react"; +import { useTranslation } from "react-i18next"; function PrevNext({ pageNumber, allPages, changePage }) { + const { t } = useTranslation(); //for go to previous page function previousPage() { changePage(-1); @@ -20,10 +22,10 @@ function PrevNext({ pageNumber, allPages, changePage }) { - Prev + {t("prev")} - {pageNumber || (allPages ? 1 : "--")} of {allPages || "--"} + {pageNumber || (allPages ? 1 : "--")} {t("of")} {allPages || "--"} ); diff --git a/apps/OpenSign/src/components/pdf/RenderAllPdfPage.js b/apps/OpenSign/src/components/pdf/RenderAllPdfPage.js index 68ac073ed..e637c576c 100644 --- a/apps/OpenSign/src/components/pdf/RenderAllPdfPage.js +++ b/apps/OpenSign/src/components/pdf/RenderAllPdfPage.js @@ -69,14 +69,14 @@ function RenderAllPdfPage({ return (
    - {t("document-signature.pages")} + {t("pages")}
    diff --git a/apps/OpenSign/src/components/pdf/SignPad.js b/apps/OpenSign/src/components/pdf/SignPad.js index 627d7a857..34a524eae 100644 --- a/apps/OpenSign/src/components/pdf/SignPad.js +++ b/apps/OpenSign/src/components/pdf/SignPad.js @@ -1,4 +1,5 @@ import React, { useRef, useState, useEffect } from "react"; +import { useTranslation } from "react-i18next"; import SignatureCanvas from "react-signature-canvas"; function SignPad({ @@ -23,6 +24,7 @@ function SignPad({ currWidgetsDetails, setCurrWidgetsDetails }) { + const { t } = useTranslation(); const [penColor, setPenColor] = useState("blue"); const allColor = ["blue", "red", "black"]; const canvasRef = useRef(null); @@ -82,7 +84,7 @@ function SignPad({ className="op-btn op-btn-ghost mr-1 mt-[2px]" onClick={() => handleClear()} > - Clear + {t("clear")} )}
    ); @@ -301,8 +303,8 @@ function SignPad({ {widgetType === "image" || currWidgetsDetails?.type === "image" - ? "Upload image" - : "Upload stamp image"} + ? t("upload-image") + : t("upload-stamp-image")} ) : ( <> @@ -323,7 +325,7 @@ function SignPad({ : "no-underline" } op-link underline-offset-8 ml-[2px]`} > - Draw + {t("draw")}
    @@ -340,7 +342,7 @@ function SignPad({ : "no-underline" } op-link underline-offset-8 ml-[2px]`} > - Upload Image + {t("upload-image")}
    @@ -358,7 +360,7 @@ function SignPad({ : "no-underline" } op-link underline-offset-8 ml-[2px]`} > - Type + {t("type")}
    {!isInitial && defaultSign ? ( @@ -377,7 +379,7 @@ function SignPad({ : "no-underline" } op-link underline-offset-8 ml-[2px]`} > - My Signature + {t("my-signature")} ) : ( @@ -398,7 +400,7 @@ function SignPad({ : "no-underline" } op-link underline-offset-8 ml-[2px]`} > - My Initials + {t("my-initials")} ) @@ -485,7 +487,7 @@ function SignPad({ hidden /> -
    Upload
    +
    {t("upload")}
    ) : ( @@ -522,7 +524,7 @@ function SignPad({
    - {isInitial ? "Initials" : "Signature"}: + {isInitial ? t("initial-teb") : t("signature-tab")}: { const firstLetter = name.charAt(0); return firstLetter; @@ -9,7 +11,7 @@ function Signedby({ pdfDetails }) { return (
    - Signed By + {t("signed-by")}
    diff --git a/apps/OpenSign/src/components/pdf/SignerListPlace.js b/apps/OpenSign/src/components/pdf/SignerListPlace.js index 149995ae5..33f90fa3e 100644 --- a/apps/OpenSign/src/components/pdf/SignerListPlace.js +++ b/apps/OpenSign/src/components/pdf/SignerListPlace.js @@ -1,8 +1,10 @@ import React from "react"; import RecipientList from "./RecipientList"; import { Tooltip } from "react-tooltip"; +import { useTranslation } from "react-i18next"; function SignerListPlace(props) { + const { t } = useTranslation(); return (
    @@ -18,36 +20,12 @@ function SignerListPlace(props) {
    -

    - What are template roles? -

    -

    - Begin by specifying each role needed for the completion of - the document. Think about the parties involved in the - signing process and what their responsibilities are. - Common roles include HR for internal documents, Customer - for agreements or Vendor for business agreements.{" "} -

    -

    - Why pre-attach users to some roles? -

    -

    - For roles that consistently involve the same individual - (e.g., the CEO's signature on employee offer - letters), you can pre-attach a user to a role within the - template. This step is optional but recommended for - efficiency and consistency across documents. -

    -

    - When do i specify the user attached to each role? -

    -

    - When you create a document from your template, you'll - be prompted to attach users to each defined role. If a - role already has a user attached, this will be pre-filled, - but you can modify it as needed before sending out the - document. -

    +

    {t("role-help.p1")}

    +

    {t("role-help.p2")}

    +

    {t("role-help.p3")}

    +

    {t("role-help.p4")}

    +

    {t("role-help.p5")}

    +

    {t("role-help.p6")}

    @@ -67,7 +45,7 @@ function SignerListPlace(props) { className="op-btn op-btn-accent op-btn-outline w-full mt-[14px]" onClick={() => props.handleAddSigner()} > - Add role + {t("add-role")}
    ) : (
    props.setIsAddSigner(true)} > - Add recipients + {t("add-recipients")}
    )}
    diff --git a/apps/OpenSign/src/components/pdf/VerifyEmail.js b/apps/OpenSign/src/components/pdf/VerifyEmail.js index b001dfa67..08b0401b1 100644 --- a/apps/OpenSign/src/components/pdf/VerifyEmail.js +++ b/apps/OpenSign/src/components/pdf/VerifyEmail.js @@ -8,7 +8,7 @@ function VerifyEmail(props) {

    - {t("document-signature.otp-verification")} + {t("otp-verification")}

    {props.isVerifyModal ? (
    @@ -56,7 +56,7 @@ function VerifyEmail(props) { props.handleVerifyBtn(); }} > - {t("document-signature.send-otp")} + {t("send-otp")}
    diff --git a/apps/OpenSign/src/components/pdf/WidgetComponent.js b/apps/OpenSign/src/components/pdf/WidgetComponent.js index eb5880297..49500bab4 100644 --- a/apps/OpenSign/src/components/pdf/WidgetComponent.js +++ b/apps/OpenSign/src/components/pdf/WidgetComponent.js @@ -9,6 +9,7 @@ import { textWidget, widgets } from "../../constant/Utils"; +import { useTranslation } from "react-i18next"; function WidgetComponent({ dragSignature, signRef, @@ -40,6 +41,7 @@ function WidgetComponent({ setIsAddSigner, uniqueId }) { + const { t } = useTranslation(); const [isSignersModal, setIsSignersModal] = useState(false); const [, dropdown] = useDrag({ type: "BOX", @@ -330,7 +332,7 @@ function WidgetComponent({ } hidden md:block h-full bg-base-100`} >
    - Fields + {t("fields")}
    @@ -375,7 +377,7 @@ function WidgetComponent({
    ) : (
    - Please add a {title ? title : "recipients"} + {t("please-add")} {title ? title : t("recipients")}
    )} diff --git a/apps/OpenSign/src/components/pdf/WidgetList.js b/apps/OpenSign/src/components/pdf/WidgetList.js index a80518b31..2189a0e7d 100644 --- a/apps/OpenSign/src/components/pdf/WidgetList.js +++ b/apps/OpenSign/src/components/pdf/WidgetList.js @@ -1,7 +1,10 @@ import React from "react"; import { getWidgetType } from "../../constant/Utils"; +import { useTranslation } from "react-i18next"; function WidgetList(props) { + const { t } = useTranslation(); + return props.updateWidgets.map((item, ind) => { return (
    @@ -25,7 +28,7 @@ function WidgetList(props) { onMouseDown={() => props?.handleMouseLeave()} onTouchStart={props?.handleDivClick} > - {item.ref && getWidgetType(item)} + {item.ref && getWidgetType(item, t(`widgets-name.${item.type}`))}
    ); diff --git a/apps/OpenSign/src/components/pdf/WidgetNameModal.js b/apps/OpenSign/src/components/pdf/WidgetNameModal.js index 319272f94..db49e061b 100644 --- a/apps/OpenSign/src/components/pdf/WidgetNameModal.js +++ b/apps/OpenSign/src/components/pdf/WidgetNameModal.js @@ -7,8 +7,10 @@ import Upgrade from "../../primitives/Upgrade"; import { isEnableSubscription } from "../../constant/const"; import Tooltip from "../../primitives/Tooltip"; import { fontColorArr, fontsizeArr } from "../../constant/Utils"; +import { useTranslation } from "react-i18next"; const WidgetNameModal = (props) => { + const { t } = useTranslation(); const [formdata, setFormdata] = useState({ name: "", defaultValue: "", @@ -104,7 +106,7 @@ const WidgetNameModal = (props) => {
    { >
    { : "" } text-[13px]`} > - Validation + {t("validation")} { )}
    { className="fa-light fa-exclamation-circle text-[15px]" style={{ color: "#fab005" }} > - invalid default value + {t("invalid-default-value")}
    )}
    @@ -247,7 +249,7 @@ const WidgetNameModal = (props) => { {props.defaultdata?.type === textInputWidget && (
    { })}
    - color: + {t("color")}: import("../components/opensigndrive/DriveBody") @@ -22,6 +23,7 @@ const AppLoader = () => { ); }; function Opensigndrive() { + const { t } = useTranslation(); const navigate = useNavigate(); const scrollRef = useRef(null); const [isList, setIsList] = useState(false); @@ -37,7 +39,7 @@ function Opensigndrive() { const [tourStatusArr, setTourStatusArr] = useState([]); const [isLoading, setIsLoading] = useState({ isLoad: true, - message: "This might take some time" + message: t("loading-mssg") }); const [docId, setDocId] = useState(); const [handleError, setHandleError] = useState(""); @@ -126,7 +128,7 @@ function Opensigndrive() { checkTourStatus(); } if (!disbaleLoading) { - setIsLoading({ isLoad: true, message: "This might take some time" }); + setIsLoading({ isLoad: true, message: t("loading-mssg") }); } try { const driveDetails = await getDrive(docId, skip, limit); diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.js b/apps/OpenSign/src/pages/PdfRequestFiles.js index 9185bbd84..314e33b9f 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.js +++ b/apps/OpenSign/src/pages/PdfRequestFiles.js @@ -46,8 +46,10 @@ import { useSelector } from "react-redux"; import SignerListComponent from "../components/pdf/SignerListComponent"; import VerifyEmail from "../components/pdf/VerifyEmail"; import PdfZoom from "../components/pdf/PdfZoom"; +import { useTranslation } from "react-i18next"; function PdfRequestFiles(props) { + const { t } = useTranslation(); const [pdfDetails, setPdfDetails] = useState([]); const [signedSigners, setSignedSigners] = useState([]); const [unsignedSigners, setUnSignedSigners] = useState([]); @@ -71,7 +73,7 @@ function PdfRequestFiles(props) { const [tourStatus, setTourStatus] = useState([]); const [isLoading, setIsLoading] = useState({ isLoad: true, - message: "This might take some time" + message: t("loading-mssg") }); const [defaultSignImg, setDefaultSignImg] = useState(); const [isDocId, setIsDocId] = useState(false); @@ -1608,13 +1610,13 @@ function PdfRequestFiles(props) { {isSubscriptionExpired ? ( <ModalUi - title={"Subscription Expired"} + title={t("subscription-expired")} isOpen={isSubscriptionExpired} showClose={false} > <div className="flex flex-col justify-center items-center py-4 md:py-5 gap-5"> <p className="text-sm md:text-lg font-normal"> - Owner's subscription has expired. + {t("owner-subscription-expired")} </p> </div> </ModalUi> @@ -1630,7 +1632,7 @@ function PdfRequestFiles(props) { <div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80"> <Loader /> <span className="text-[13px] text-base-content"> - This might take some time + {t("loading-mssg")} </span> </div> )} @@ -1657,7 +1659,7 @@ function PdfRequestFiles(props) { requestSignTourFunction()} <ModalUi isOpen={isAlert.isShow} - title={"Alert message"} + title={t("alert-message")} handleClose={() => { setIsAlert({ isShow: false, @@ -1678,7 +1680,7 @@ function PdfRequestFiles(props) { type="button" className="op-btn op-btn-primary" > - Ok + {t("ok")} </button> </div> </ModalUi> @@ -1697,14 +1699,13 @@ function PdfRequestFiles(props) { {/* this modal is used to show decline alert */} <PdfDeclineModal show={isDecline.isDeclined} - headMsg="Document decline" + headMsg={t("document-decline")} bodyMssg={ isDecline.currnt === "Sure" - ? "Are you sure want to decline this document ?" + ? t("decline-alert-2") : isDecline.currnt === "YouDeclined" - ? "You have declined this document!" - : isDecline.currnt === "another" && - "You can not sign this document as it has been declined/revoked." + ? t("decline-alert-1") + : isDecline.currnt === "another" && t("decline-alert-3") } footerMessage={isDecline.currnt === "Sure"} declineDoc={declineDoc} @@ -1740,9 +1741,7 @@ function PdfRequestFiles(props) { {isOtp ? ( <form onSubmit={VerifyOTP}> <div className="flex flex-col gap-2"> - <span> - You will get a verification code via email - </span> + <span>{t("get-otp-alert")}</span> <label className="op-input op-input-bordered flex items-center gap-2 "> <input type="number" diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.js b/apps/OpenSign/src/pages/PlaceHolderSign.js index 675868847..a7a352a3e 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.js +++ b/apps/OpenSign/src/pages/PlaceHolderSign.js @@ -53,8 +53,10 @@ import Loader from "../primitives/Loader"; import { useSelector } from "react-redux"; import PdfZoom from "../components/pdf/PdfZoom"; import LottieWithLoader from "../primitives/DotLottieReact"; +import { useTranslation } from "react-i18next"; function PlaceHolderSign() { + const { t } = useTranslation(); const editorRef = useRef(); const navigate = useNavigate(); const { state } = useLocation(); @@ -78,7 +80,7 @@ function PlaceHolderSign() { const [fontColor, setFontColor] = useState(); const [isLoading, setIsLoading] = useState({ isLoad: true, - message: "This might take some time" + message: t("loading-mssg") }); const [handleError, setHandleError] = useState(); const [currentId, setCurrentId] = useState(""); @@ -268,7 +270,7 @@ function PlaceHolderSign() { //convert document url in array buffer format to use embed widgets in pdf using pdf-lib const arrayBuffer = await convertPdfArrayBuffer(url); if (arrayBuffer === "Error") { - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); } else { setPdfArrayBuffer(arrayBuffer); } @@ -395,10 +397,10 @@ function PlaceHolderSign() { const loadObj = { isLoad: false }; - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); setIsLoading(loadObj); } else { - setHandleError("No Data Found!"); + setHandleError(t("no-data-avaliable")); const loadObj = { isLoad: false }; @@ -410,7 +412,7 @@ function PlaceHolderSign() { const loadObj = { isLoad: false }; - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); setIsLoading(loadObj); } else if (res.length && res[0]?.objectId) { setActiveMailAdapter(res[0]?.active_mail_adapter); @@ -433,7 +435,7 @@ function PlaceHolderSign() { }; setIsLoading(loadObj); } else if (res.length === 0) { - setHandleError("No Data Found!"); + setHandleError(t("no-data-avaliable")); const loadObj = { isLoad: false }; @@ -1064,7 +1066,7 @@ function PlaceHolderSign() { > {copied && ( <Alert type="success"> - <div className="ml-3">Copied</div> + <div className="ml-3">{t("copied")}</div> </Alert> )} <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis "> @@ -1077,12 +1079,12 @@ function PlaceHolderSign() { className="flex flex-row items-center op-link op-link-primary" > <i className="fa-light fa-link" aria-hidden="true"></i> - <span className=" hidden md:block ml-1 ">Copy link</span> + <span className=" hidden md:block ml-1 ">{t("copy-link")}</span> </button> <RWebShare data={{ url: data.url, - title: "Sign url" + title: t("sign-url") }} > <i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i> @@ -1705,7 +1707,7 @@ function PlaceHolderSign() { <div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80"> <Loader /> <span className="text-[13px] text-base-content"> - This might take some time + {t("loading-mssg")} </span> </div> )} @@ -1757,29 +1759,21 @@ function PlaceHolderSign() { title={ isSendAlert.mssg === "sure" || isSendAlert.mssg === textWidget - ? "Fields required" - : isSendAlert.mssg === "confirm" && "Send Mail" + ? t("fields-required") + : isSendAlert.mssg === "confirm" && t("send-mail") } handleClose={() => setIsSendAlert({})} > <div className="max-h-96 overflow-y-scroll scroll-hide p-[20px] text-base-content"> {isSendAlert.mssg === "sure" ? ( - <span> - Please ensure there's at least one signature - widget added for all recipients. - </span> + <span>{t("placeholder-alert-1")}</span> ) : isSendAlert.mssg === textWidget ? ( - <p> - Please confirm that you have filled the text field. - </p> + <p>{t("placeholder-alert-2")}</p> ) : ( isSendAlert.mssg === "confirm" && ( <> {!isCustomize && ( - <span> - Are you sure you want to send out this document - for signatures? - </span> + <span>{t("placeholder-alert-3")}</span> )} {isCustomize && isSubscribe && ( <> @@ -1797,7 +1791,7 @@ function PlaceHolderSign() { setRequestSubject(defaultSubject); }} > - <span>Reset to default</span> + <span>{t("reset-to-default")}</span> </div> </> )} @@ -1807,14 +1801,14 @@ function PlaceHolderSign() { onClick={() => sendEmailToSigners()} className="op-btn op-btn-primary font-[500] text-sm shadow" > - Send + {t("send")} </button> {isCustomize && ( <button onClick={() => setIsCustomize(false)} className="op-btn op-btn-ghost font-[500] text-sm" > - Close + {t("close")} </button> )} </div> @@ -1823,13 +1817,13 @@ function PlaceHolderSign() { className="op-link op-link-accent text-sm" onClick={() => setIsCustomize(!isCustomize)} > - Cutomize Email + {t("cutomize-email")} </span> )} {!isSubscribe && isEnableSubscription && ( <div className="mt-2"> <Upgrade - message="Upgrade to customize Email" + message={t("upgrade-to-customize-email")} newWindow={true} /> </div> @@ -1842,7 +1836,7 @@ function PlaceHolderSign() { <> <div className="flex justify-center items-center mt-3"> <span className="h-[1px] w-[20%] bg-[#ccc]"></span> - <span className="ml-[5px] mr-[5px]">or</span> + <span className="ml-[5px] mr-[5px]">{t("or")}</span> <span className="h-[1px] w-[20%] bg-[#ccc]"></span> </div> <div className="mt-3 mb-3">{handleShareList()}</div> @@ -1854,7 +1848,7 @@ function PlaceHolderSign() { {/* this modal is used show send mail message and after send mail success message */} <ModalUi isOpen={isSend} - title={"Mails Sent"} + title={t("Mails Sent")} handleClose={() => { setIsSend(false); setSignerPos([]); @@ -1865,15 +1859,11 @@ function PlaceHolderSign() { {mailStatus === "success" ? ( <div className="text-center mb-[10px]"> <LottieWithLoader /> - <p> - You have successfully sent mails to all recipients! - </p> - {isCurrUser && ( - <p>Do you want to sign documents right now ?</p> - )} + <p>{t("placeholder-alert-4")}</p> + {isCurrUser && <p>{t("placeholder-alert-5")}</p>} </div> ) : ( - <p>Please setup mail adapter to send mail!</p> + <p>{t("placeholder-alert-6")}</p> )} {!mailStatus && ( <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> @@ -1893,7 +1883,7 @@ function PlaceHolderSign() { type="button" className="op-btn op-btn-primary mr-1" > - Yes + {t("yes")} </button> )} @@ -1906,20 +1896,20 @@ function PlaceHolderSign() { type="button" className="op-btn op-btn-ghost" > - {isCurrUser ? "No" : "Close"} + {isCurrUser ? t("no") : t("close")} </button> </div> </div> </ModalUi> <ModalUi isOpen={isShowEmail} - title={"signers alert"} + title={t("signers-alert")} handleClose={() => { setIsShowEmail(false); }} > <div className="h-[100%] p-[20px]"> - <p>Please select signer for add placeholder!</p> + <p>{t("placeholder-alert-7")}</p> <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> <button onClick={() => { @@ -1928,7 +1918,7 @@ function PlaceHolderSign() { type="button" className="op-btn op-btn-primary" > - Ok + {t("ok")} </button> </div> </ModalUi> @@ -1948,7 +1938,7 @@ function PlaceHolderSign() { /> <DropdownWidgetOption type={radioButtonWidget} - title="Radio group" + title={t("radio-group")} showDropdown={isRadio} setShowDropdown={setIsRadio} handleSaveWidgetsOptions={handleSaveWidgetsOptions} @@ -1959,7 +1949,7 @@ function PlaceHolderSign() { /> <DropdownWidgetOption type="checkbox" - title="Checkbox" + title={t("checkbox")} showDropdown={isCheckbox} setShowDropdown={setIsCheckbox} handleSaveWidgetsOptions={handleSaveWidgetsOptions} @@ -1970,7 +1960,7 @@ function PlaceHolderSign() { /> <DropdownWidgetOption type="dropdown" - title="Dropdown options" + title={t("dropdown-options")} showDropdown={showDropdown} setShowDropdown={setShowDropdown} handleSaveWidgetsOptions={handleSaveWidgetsOptions} @@ -2137,7 +2127,7 @@ function PlaceHolderSign() { <ModalUi isOpen={isAlreadyPlace.status} - title={"Document Alert"} + title={t("document-alert")} showClose={false} > <div className="h-[100%] p-[20px]"> @@ -2148,7 +2138,7 @@ function PlaceHolderSign() { type="button" className="op-btn op-btn-primary" > - View + {t("view")} </button> </div> </ModalUi> diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.js b/apps/OpenSign/src/pages/SignyourselfPdf.js index a91188bbd..c58708e85 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.js +++ b/apps/OpenSign/src/pages/SignyourselfPdf.js @@ -87,9 +87,9 @@ function SignYourSelf() { const [validateAlert, setValidateAlert] = useState(false); const [isLoading, setIsLoading] = useState({ isLoad: true, - message: "This might take some time" + message: t("loading-mssg") }); - const [handleError, setHandleError] = useState(); + const [handleError, setHandleError] = useState(""); const [isDragging, setIsDragging] = useState(false); const [signTour, setSignTour] = useState(true); const { docId } = useParams(); @@ -219,12 +219,12 @@ function SignYourSelf() { //convert document url in array buffer format to use embed widgets in pdf using pdf-lib const arrayBuffer = await convertPdfArrayBuffer(url); if (arrayBuffer === "Error") { - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); } else { setPdfArrayBuffer(arrayBuffer); } } else { - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); } isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; if (isCompleted) { @@ -236,7 +236,7 @@ function SignYourSelf() { setPdfUrl(documentData[0].SignedUrl); const alreadySign = { status: true, - mssg: "Congratulations! 🎉 This document has been successfully signed by you!" + mssg: t("document-signed-alert") }; if (showComplete) { setShowAlreadySignDoc(alreadySign); @@ -255,10 +255,10 @@ function SignYourSelf() { const loadObj = { isLoad: false }; - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); setIsLoading(loadObj); } else { - setHandleError("No Data Found!"); + setHandleError(t("no-data-avaliable")); const loadObj = { isLoad: false }; @@ -292,7 +292,7 @@ function SignYourSelf() { const loadObj = { isLoad: false }; - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); setIsLoading(loadObj); }); const contractUsersRes = await contractUsers(jsonSender.email); @@ -300,7 +300,7 @@ function SignYourSelf() { const loadObj = { isLoad: false }; - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); setIsLoading(loadObj); } else if (contractUsersRes[0] && contractUsersRes.length > 0) { setActiveMailAdapter(contractUsersRes[0]?.active_mail_adapter); @@ -344,7 +344,7 @@ function SignYourSelf() { setCheckTourStatus(true); } } else { - setHandleError("No Data Found!"); + setHandleError(t("no-data-avaliable")); } const loadObj = { isLoad: false @@ -580,7 +580,7 @@ function SignYourSelf() { setOtpLoader(true); await handleSendOTP(Parse.User.current().getEmail()); setOtpLoader(false); - alert("OTP sent on you email"); + alert(t("otp-sent-alert")); }; //`handleVerifyEmail` function is used to verify email with otp const handleVerifyEmail = async (e) => { @@ -630,7 +630,7 @@ function SignYourSelf() { setIsEmailVerified(isEmailVerified); } } catch (e) { - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); } } if (isEmailVerified) { @@ -668,17 +668,15 @@ function SignYourSelf() { } if (xyPostion.length === 0 || !isSignatureExist) { setIsAlert({ - header: "Fields required", + header: t("fields-required"), isShow: true, - alertMessage: - "Please ensure there's at least one signature widget added" + alertMessage: t("signature-widget-alert-1") }); return; } else if (showAlert) { setIsAlert({ isShow: true, - alertMessage: - "Please ensure all field is accurately filled and meets all requirements." + alertMessage: t("signature-widget-alert-2") }); return; } else { @@ -713,13 +711,13 @@ function SignYourSelf() { if (err && err.message.includes("is encrypted.")) { setIsAlert({ isShow: true, - alertMessage: `Currently encrypted pdf files are not supported.` + alertMessage: t("encrypted-pdf-alert") }); } else { console.log("err in signing", err); setIsAlert({ isShow: true, - alertMessage: `Something went wrong.` + alertMessage: t("something-went-wrong-mssg") }); } } @@ -729,7 +727,7 @@ function SignYourSelf() { setIsUiLoading(false); setIsAlert({ isShow: true, - alertMessage: "something went wrong, please try again later." + alertMessage: t("something-went-wrong-mssg") }); } } @@ -740,7 +738,7 @@ function SignYourSelf() { const getIsSubscribe = await checkIsSubscribed(); const tenantDetails = await getTenantDetails(jsonSender.objectId); if (tenantDetails && tenantDetails === "user does not exist!") { - alert("User does not exist"); + alert(t("user-not-exist")); } else { if ( tenantDetails?.CompletionBody && @@ -771,6 +769,7 @@ function SignYourSelf() { base64Sign = await fetchImageBase64(base64Sign); } catch (e) { console.log("error", e); + alert(t("something-went-wrong-mssg")); } } //change image width and height to 104/44 in png base64 @@ -805,6 +804,7 @@ function SignYourSelf() { }) .catch((err) => { console.log("axois err ", err); + alert(t("something-went-wrong-mssg")); }); }; @@ -1056,6 +1056,7 @@ function SignYourSelf() { }) .catch((err) => { console.log("axois err ", err); + alert(t("something-went-wrong-mssg")); }); } }; @@ -1177,7 +1178,7 @@ function SignYourSelf() { <div className="absolute h-[100vh] w-full z-[999] flex flex-col justify-center items-center bg-[#e6f2f2] bg-opacity-80"> <Loader /> <span style={{ fontSize: "13px", fontWeight: "bold" }}> - {t("document-signature.loader")} + {t("loader")} </span> </div> )} @@ -1235,7 +1236,7 @@ function SignYourSelf() { <div className=" w-full md:w-[95%] "> <ModalUi isOpen={isAlert.isShow} - title={isAlert?.header || "Alert"} + title={isAlert?.header || t("alert")} handleClose={() => { setIsAlert({ isShow: false, @@ -1251,7 +1252,7 @@ function SignYourSelf() { {/* this modal is used show this document is already sign */} <ModalUi isOpen={showAlreadySignDoc.status} - title={t("document-signature.document-signed")} + title={t("document-signed")} handleClose={() => { setShowAlreadySignDoc({ status: false }); }} @@ -1270,7 +1271,7 @@ function SignYourSelf() { </ModalUi> <DropdownWidgetOption type="checkbox" - title="Checkbox" + title={t("checkbox")} showDropdown={isCheckbox} setShowDropdown={setIsCheckbox} handleSaveWidgetsOptions={handleSaveWidgetsOptions} @@ -1425,7 +1426,7 @@ function SignYourSelf() { }} > <div className="p-[20px] h-full"> - <p>{t("document-signature.validate-alert-mssg")}</p> + <p>{t("validate-alert-mssg")}</p> <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> <button diff --git a/apps/OpenSign/src/pages/TeamList.js b/apps/OpenSign/src/pages/TeamList.js index 8fc7e4ae5..e5fd5509c 100644 --- a/apps/OpenSign/src/pages/TeamList.js +++ b/apps/OpenSign/src/pages/TeamList.js @@ -11,6 +11,7 @@ import { isEnableSubscription } from "../constant/const"; import { checkIsSubscribedTeam } from "../constant/Utils"; import SubscribeCard from "../primitives/SubscribeCard"; import Title from "../components/Title"; +import { useTranslation } from "react-i18next"; const heading = ["Sr.No", "Name", "Parent Team", "Active"]; const actions = [ @@ -25,6 +26,7 @@ const actions = [ ]; const TeamList = () => { + const { t } = useTranslation(); const recordperPage = 10; const [teamList, setTeamList] = useState([]); const [isLoader, setIsLoader] = useState(false); @@ -120,7 +122,7 @@ const TeamList = () => { } } catch (err) { console.log("Err in fetch teamlist", err); - setIsAlert({ type: "danger", msg: "Something went wrong." }); + setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") }); } finally { setTimeout(() => { setIsAlert({ type: "success", msg: "" }); @@ -169,10 +171,10 @@ const TeamList = () => { // console.log("teamRes ", teamRes); setIsAlert({ type: !IsActive === false ? "danger" : "success", - msg: !IsActive === false ? "Team disabled." : "Team enabled." + msg: !IsActive === false ? t("team-disabled") : t("team-enabled") }); } catch (err) { - setIsAlert({ type: "danger", msg: "something went wrong." }); + setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") }); console.log("err in disable team", err); } finally { setIsActLoader({}); @@ -200,10 +202,10 @@ const TeamList = () => { const data = { Name: team.Name, TeamId: team.objectId }; await Parse.Cloud.run("updateteam", data); // console.log("updateTeamRes ", updateTeamRes); - setIsAlert({ type: "success", msg: "Team Update successfully." }); + setIsAlert({ type: "success", msg: t("something-went-wrong-mssg") }); } catch (Err) { console.log("Err in update team name"), Err; - setIsAlert({ type: "danger", msg: "Something went wrong." }); + setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") }); } finally { setIsActLoader({}); setTimeout(() => setIsAlert({ type: "success", msg: "" }), 1500); @@ -233,9 +235,9 @@ const TeamList = () => { )} <div className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]"> <div className="font-light"> - Teams{" "} + {t("report-name.Teams")} <span className="text-xs md:text-[13px] font-normal"> - <Tooltip message={"Teams"} /> + <Tooltip message={t("report-heading.Team")} /> </span> </div> <div @@ -251,7 +253,9 @@ const TeamList = () => { <tr className="border-y-[1px]"> {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> ))} </tr> @@ -286,16 +290,16 @@ const TeamList = () => { {isActiveModal[item.objectId] && ( <ModalUi isOpen - title={"Team status"} + title={t("Team status")} handleClose={handleClose} > <div className="m-[20px]"> <div className="text-lg font-normal text-black"> - Are you sure you want to{" "} + {t("are-you-sure")}{" "} {item?.IsActive - ? "disable" - : "enable"}{" "} - this team? + ? t("disable") + : t("enable")}{" "} + {t("this-team")} </div> <hr className="bg-[#ccc] mt-4 " /> <div className="flex items-center mt-3 gap-2 text-white"> @@ -305,13 +309,13 @@ const TeamList = () => { } className="op-btn op-btn-primary" > - Yes + {t("yes")} </button> <button onClick={handleClose} className="op-btn op-btn-secondary" > - No + {t("no")} </button> </div> </div> @@ -341,7 +345,7 @@ const TeamList = () => { {isEditModal[item.objectId] && ( <ModalUi isOpen - title={"Edit Team"} + title={t("edit-team")} handleClose={handleClose} > <form @@ -351,7 +355,7 @@ const TeamList = () => { } > <label className="text-xs font-semibold text-base-content ml-1"> - Name of Team{" "} + {t("name-of-team")}{" "} <span className="text-[red] text-[13px]"> * </span> @@ -368,7 +372,7 @@ const TeamList = () => { type="submit" className="op-btn op-btn-primary mt-3" > - Save + {t("save")} </button> </form> </ModalUi> @@ -389,7 +393,7 @@ const TeamList = () => { onClick={() => paginateBack()} className="op-join-item op-btn op-btn-sm" > - Prev + {t("prev")} </button> )} {pageNumbers.map((x, i) => ( @@ -409,7 +413,7 @@ const TeamList = () => { onClick={() => paginateFront()} className="op-join-item op-btn op-btn-sm" > - Next + {t("next")} </button> )} </div> @@ -426,11 +430,13 @@ const TeamList = () => { alt="img" /> </div> - <div className="text-sm font-semibold">No Data Available</div> + <div className="text-sm font-semibold"> + {t("no-data-avaliable")} + </div> </div> )} <ModalUi - title={"Add Team"} + title={t("add-team")} isOpen={isModal} handleClose={handleFormModal} > @@ -447,7 +453,9 @@ const TeamList = () => { <h1 className="text-[60px] lg:text-[120px] font-semibold"> 404 </h1> - <p className="text-[30px] lg:text-[50px]">Page Not Found</p> + <p className="text-[30px] lg:text-[50px]"> + {t("page-not-found")} + </p> </div> </div> )} diff --git a/apps/OpenSign/src/pages/TemplatePlaceholder.js b/apps/OpenSign/src/pages/TemplatePlaceholder.js index e96cab49d..85500123e 100644 --- a/apps/OpenSign/src/pages/TemplatePlaceholder.js +++ b/apps/OpenSign/src/pages/TemplatePlaceholder.js @@ -40,7 +40,9 @@ import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import Parse from "parse"; import { useSelector } from "react-redux"; import PdfZoom from "../components/pdf/PdfZoom"; +import { useTranslation } from "react-i18next"; const TemplatePlaceholder = () => { + const { t } = useTranslation(); const navigate = useNavigate(); const isHeader = useSelector((state) => state.showHeader); const { templateId } = useParams(); @@ -61,7 +63,7 @@ const TemplatePlaceholder = () => { const [isSubscribe, setIsSubscribe] = useState(false); const [isLoading, setIsLoading] = useState({ isLoad: true, - message: "This might take some time" + message: t("loading-mssg") }); const [handleError, setHandleError] = useState(); const [currentEmail, setCurrentEmail] = useState(); @@ -300,10 +302,10 @@ const TemplatePlaceholder = () => { const loadObj = { isLoad: false }; - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); setIsLoading(loadObj); } else { - setHandleError("No Data Found!"); + setHandleError(t("no-data-avaliable")); const loadObj = { isLoad: false }; @@ -312,9 +314,9 @@ const TemplatePlaceholder = () => { } catch (err) { console.log("err ", err); if (err?.response?.data?.code === 101) { - setHandleError("Error: Template not found!"); + setHandleError(t("no-data-avaliable")); } else { - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); } } const res = await contractUsers(jsonSender.email); @@ -339,10 +341,10 @@ const TemplatePlaceholder = () => { const loadObj = { isLoad: false }; - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); setIsLoading(loadObj); } else if (res.length === 0) { - setHandleError("No Data Found!"); + setHandleError(t("no-data-avaliable")); const loadObj = { isLoad: false }; @@ -730,7 +732,7 @@ const TemplatePlaceholder = () => { if (signersdata?.length) { const loadObj = { isLoad: true, - message: "This might take some time" + message: t("loading-mssg") }; setIsLoading(loadObj); setIsSendAlert(false); @@ -905,7 +907,7 @@ const TemplatePlaceholder = () => { }); setIsCreateDoc(false); } else { - setHandleError("Error: Something went wrong!"); + setHandleError(t("something-went-wrong-mssg")); setIsCreateDoc(false); } }; @@ -1321,35 +1323,30 @@ const TemplatePlaceholder = () => { {/* this modal is used show alert set placeholder for all signers before send mail */} <ModalUi isOpen={isSendAlert} - title={"Fields required"} + title={t("fields-required")} handleClose={() => setIsSendAlert(false)} > <div className="h-full p-[20px]"> - <p> - Please add at least one signature field for all roles. - </p> + <p>{t("template-signature-field")}</p> </div> </ModalUi> <ModalUi isOpen={!IsReceipent} - title={"Roles"} + title={t("roles")} handleClose={() => setIsReceipent(true)} > <div className="h-full p-[20px] text-center font-medium"> - <p>Please add roles first</p> + <p>{t("template-role-alert")}</p> </div> </ModalUi> {/* this modal is used show send mail message and after send mail success message */} <ModalUi isOpen={isCreateDocModal} - title={"Create Document"} + title={t("create-document")} handleClose={() => setIsCreateDocModal(false)} > <div className="h-full p-[20px]"> - <p> - Do you want to create a document using the template you - just created ? - </p> + <p>{t("template-created-alert")}</p> <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> {currentEmail.length > 0 && ( <> @@ -1360,7 +1357,7 @@ const TemplatePlaceholder = () => { type="button" className="op-btn op-btn-primary" > - Yes + {t("yes")} </button> <button onClick={() => { @@ -1370,7 +1367,7 @@ const TemplatePlaceholder = () => { type="button" className="op-btn op-btn-secondary ml-2" > - No + {t("no")} </button> </> )} @@ -1379,13 +1376,13 @@ const TemplatePlaceholder = () => { {isCreateDoc && <LoaderWithMsg isLoading={isLoading} />} <ModalUi isOpen={isShowEmail} - title={"signers alert"} + title={t("signers-alert")} handleClose={() => { setIsShowEmail(false); }} > <div className="h-full p-[20px]"> - <p>Please select signer for add placeholder!</p> + <p>{t("template-creation-alert-1")}</p> <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> <button onClick={() => { @@ -1394,13 +1391,13 @@ const TemplatePlaceholder = () => { type="button" className="op-btn op-btn-primary" > - Ok + {t("ok")} </button> </div> </ModalUi> <DropdownWidgetOption type={radioButtonWidget} - title="Radio group" + title={t("radio-group")} showDropdown={isRadio} setShowDropdown={setIsRadio} handleSaveWidgetsOptions={handleSaveWidgetsOptions} @@ -1411,7 +1408,7 @@ const TemplatePlaceholder = () => { /> <DropdownWidgetOption type="checkbox" - title="Checkbox" + title={t("checkbox")} showDropdown={isCheckbox} setShowDropdown={setIsCheckbox} handleSaveWidgetsOptions={handleSaveWidgetsOptions} @@ -1422,7 +1419,7 @@ const TemplatePlaceholder = () => { /> <DropdownWidgetOption type="dropdown" - title="Dropdown options" + title={t("dropdown-options")} showDropdown={showDropdown} setShowDropdown={setShowDropdown} handleSaveWidgetsOptions={handleSaveWidgetsOptions} @@ -1444,7 +1441,7 @@ const TemplatePlaceholder = () => { /> {/* pdf header which contain funish back button */} <Header - completeBtnTitle={"Next"} + completeBtnTitle={t("next")} isPlaceholder={true} pageNumber={pageNumber} allPages={allPages} @@ -1541,7 +1538,7 @@ const TemplatePlaceholder = () => { handleDeleteUser={handleDeleteUser} handleRoleChange={handleRoleChange} handleOnBlur={handleOnBlur} - title={"Roles"} + title={t("roles")} initial={true} isTemplateFlow={true} sendInOrder={pdfDetails[0].SendinOrder} @@ -1570,7 +1567,7 @@ const TemplatePlaceholder = () => { handleDeleteUser={handleDeleteUser} handleRoleChange={handleRoleChange} handleOnBlur={handleOnBlur} - title={"Roles"} + title={t("roles")} sendInOrder={pdfDetails[0]?.SendinOrder} setSignersData={setSignersData} blockColor={blockColor} @@ -1590,7 +1587,7 @@ const TemplatePlaceholder = () => { isDragStamp={isDragStamp} isSignYourself={false} addPositionOfSignature={addPositionOfSignature} - title={"Roles"} + title={t("roles")} initial={true} isTemplateFlow={true} /> @@ -1601,7 +1598,6 @@ const TemplatePlaceholder = () => { </div> </div> )} - <div data-tut="reactourAddbtn--observe"> <AddRoleModal isModalRole={isModalRole} @@ -1622,7 +1618,7 @@ const TemplatePlaceholder = () => { /> </div> <ModalUi - title={"Edit Template"} + title={t("edit-template")} isOpen={isEditTemplate} handleClose={handleEditTemplateModal} > diff --git a/apps/OpenSign/src/pages/UserList.js b/apps/OpenSign/src/pages/UserList.js index c0351acc3..63696a66b 100644 --- a/apps/OpenSign/src/pages/UserList.js +++ b/apps/OpenSign/src/pages/UserList.js @@ -11,9 +11,11 @@ import SubscribeCard from "../primitives/SubscribeCard"; import { isEnableSubscription } from "../constant/const"; import { checkIsSubscribedTeam } from "../constant/Utils"; import Title from "../components/Title"; +import { useTranslation } from "react-i18next"; const heading = ["Sr.No", "Name", "Email", "Phone", "Role", "Team", "Active"]; // const actions = []; const UserList = () => { + const { t } = useTranslation(); const [userList, setUserList] = useState([]); const [isLoader, setIsLoader] = useState(false); const [isModal, setIsModal] = useState(false); @@ -110,7 +112,7 @@ const UserList = () => { setUserList(_userRes); } catch (err) { console.log("Err in fetch userlist", err); - setIsAlert({ type: "danger", msg: "Something went wrong." }); + setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") }); } finally { setTimeout(() => { setIsAlert({ type: "success", msg: "" }); @@ -166,10 +168,11 @@ const UserList = () => { await extUser.save(); setIsAlert({ type: !IsDisabled === true ? "danger" : "success", - msg: !IsDisabled === true ? "User deactivated." : "User activated." + msg: + !IsDisabled === true ? t("user-deactivated") : t("user-activated") }); } catch (err) { - setIsAlert({ type: "danger", msg: "something went wrong." }); + setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") }); console.log("err in disable team", err); } finally { setIsActLoader({}); @@ -204,9 +207,9 @@ const UserList = () => { )} <div className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]"> <div className="font-light"> - Users{" "} + {t("report-name.Users")} <span className="text-xs md:text-[13px] font-normal"> - <Tooltip message={"users from Teams"} /> + <Tooltip message={t("users-from-teams")} /> </span> </div> <div @@ -222,7 +225,9 @@ const UserList = () => { <tr className="border-y-[1px]"> {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> ))} </tr> @@ -261,16 +266,16 @@ const UserList = () => { {isActiveModal[item.objectId] && ( <ModalUi isOpen - title={"User status"} + title={t("user-status")} handleClose={handleClose} > <div className="m-[20px]"> <div className="text-lg font-normal text-black"> - Are you sure you want to{" "} + {t("are-you-sure")}{" "} {item?.IsDisabled - ? "activate" - : "deactivate"}{" "} - this user? + ? t("activate") + : t("deactivate")}{" "} + {t("this-user")}? </div> <hr className="bg-[#ccc] mt-4 " /> <div className="flex items-center mt-3 gap-2 text-white"> @@ -280,13 +285,13 @@ const UserList = () => { } className="op-btn op-btn-primary" > - Yes + {t("yes")} </button> <button onClick={handleClose} className="op-btn op-btn-secondary" > - No + {t("no")} </button> </div> </div> @@ -311,12 +316,12 @@ const UserList = () => { {isDeleteModal[item.objectId] && ( <ModalUi isOpen - title={"Delete User"} + title={t("delete-user")} handleClose={handleClose} > <div className="m-[20px]"> <div className="text-lg font-normal text-black"> - Are you sure you want to delete this user? + {t( "are-you-sure")} {t("delete")} {t("this-user")}? </div> <hr className="bg-[#ccc] mt-4 " /> <div className="flex items-center mt-3 gap-2 text-white"> @@ -324,13 +329,13 @@ const UserList = () => { onClick={() => handleDelete(item)} className="op-btn op-btn-primary" > - Yes + {t("yes")} </button> <button onClick={handleClose} className="op-btn op-btn-secondary" > - No + {('no)} </button> </div> </div> @@ -350,7 +355,7 @@ const UserList = () => { onClick={() => paginateBack()} className="op-join-item op-btn op-btn-sm" > - Prev + {t("prev")} </button> )} {pageNumbers.map((x, i) => ( @@ -370,7 +375,7 @@ const UserList = () => { onClick={() => paginateFront()} className="op-join-item op-btn op-btn-sm" > - Next + {t("next")} </button> )} </div> @@ -387,11 +392,13 @@ const UserList = () => { alt="img" /> </div> - <div className="text-sm font-semibold">No Data Available</div> + <div className="text-sm font-semibold"> + {t("no-data-avaliable")} + </div> </div> )} <ModalUi - title={"Add User"} + title={t("add-user")} isOpen={isModal} handleClose={handleFormModal} > @@ -408,7 +415,9 @@ const UserList = () => { <h1 className="text-[60px] lg:text-[120px] font-semibold"> 404 </h1> - <p className="text-[30px] lg:text-[50px]">Page Not Found</p> + <p className="text-[30px] lg:text-[50px]"> + {t("page-not-found")} + </p> </div> </div> )} diff --git a/apps/OpenSign/src/pages/Webhook.js b/apps/OpenSign/src/pages/Webhook.js index 3a9cf49e0..b9dc45c3f 100644 --- a/apps/OpenSign/src/pages/Webhook.js +++ b/apps/OpenSign/src/pages/Webhook.js @@ -71,10 +71,10 @@ function Webhook() { setIsAlert({ type: "success", msg: t("webhook-added") }); } else { console.error("Error while generating webhook"); - setIsAlert({ type: "danger", msg: t("wrong-mssg") }); + setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") }); } } catch (error) { - setIsAlert({ type: "danger", msg: t("wrong-mssg") }); + setIsAlert({ type: "danger", msg: t("something-went-wrong-mssg") }); console.log("err while generating webhook", error); } finally { setIsLoader(false); diff --git a/apps/OpenSign/src/primitives/AddContact.js b/apps/OpenSign/src/primitives/AddContact.js index c645b0363..5e5c661e5 100644 --- a/apps/OpenSign/src/primitives/AddContact.js +++ b/apps/OpenSign/src/primitives/AddContact.js @@ -1,7 +1,9 @@ import React, { useState, useEffect } from "react"; import Parse from "parse"; import Loader from "./Loader"; +import { useTranslation } from "react-i18next"; const AddContact = (props) => { + const { t } = useTranslation(); const [name, setName] = useState(""); const [phone, setPhone] = useState(""); const [email, setEmail] = useState(""); @@ -148,7 +150,7 @@ const AddContact = (props) => { } catch (err) { // console.log("err", err); setIsLoader(false); - alert("something went wrong!"); + alert(t("something-went-wrong-mssg")); } }; @@ -175,7 +177,7 @@ const AddContact = (props) => { </div> )} <div className="w-full mx-auto p-[8px]"> - <div className="text-[14px] font-[700]">Add Contact</div> + <div className="text-[14px] font-[700]">{t("add-contact")}</div> {isUserExist && ( <div className="mb-[0.75rem] flex items-center mt-1"> <input @@ -189,14 +191,14 @@ const AddContact = (props) => { htmlFor="addYourself" className="ml-[0.5rem] text-base-content mb-0" > - Add Yourself + {t("add-yourself")} </label> </div> )} <form className="text-base-content" onSubmit={handleSubmit}> <div className="mb-[0.75rem]"> <label htmlFor="name" className="text-[13px]"> - Name + {t("name")} <span className="text-[13px] text-[red]"> *</span> </label> <input @@ -211,7 +213,7 @@ const AddContact = (props) => { </div> <div className="mb-[0.75rem]"> <label htmlFor="email" className="text-[13px]"> - Email + {t("email")} <span className="text-[13px] text-[red]"> *</span> </label> <input @@ -226,7 +228,7 @@ const AddContact = (props) => { </div> <div className="mb-[0.75rem]"> <label htmlFor="phone" className="text-[13px]"> - Phone + {t("phone")} </label> <input type="text" @@ -240,14 +242,14 @@ const AddContact = (props) => { <div className="mt-6 flex justify-start gap-2"> <button type="submit" className="op-btn op-btn-primary"> - Submit + {t("submit")} </button> <button type="button" onClick={() => handleReset()} className="op-btn op-btn-secondary" > - Reset + {t("reset")} </button> </div> </form> diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.js b/apps/OpenSign/src/primitives/GetReportDisplay.js index dde156ee3..98f49e03d 100644 --- a/apps/OpenSign/src/primitives/GetReportDisplay.js +++ b/apps/OpenSign/src/primitives/GetReportDisplay.js @@ -304,7 +304,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, Please try again later!" + message: t("something-went-wrong-mssg") }); setTimeout(() => setIsAlert(false), 1500); setActLoader({}); @@ -316,7 +316,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, Please try again later!" + message: t("something-went-wrong-mssg") }); setTimeout(() => setIsAlert(false), 1500); setActLoader({}); @@ -326,7 +326,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, Please try again later!" + message: t("something-went-wrong-mssg") }); setTimeout(() => setIsAlert(false), 1500); setActLoader({}); @@ -416,7 +416,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "success", - message: "Record deleted successfully!" + message: t("record-delete-alert") }); setTimeout(() => setIsAlert(false), 1500); const upldatedList = props.List.filter( @@ -429,7 +429,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, Please try again later!" + message: t("something-went-wrong-mssg") }); setTimeout(() => setIsAlert(false), 1500); setActLoader({}); @@ -505,7 +505,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "success", - message: "Record revoked successfully!" + message: t("record-revoke-alert") }); setTimeout(() => setIsAlert(false), 1500); const upldatedList = props.List.filter( @@ -520,7 +520,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, Please try again later!" + message: t("something-went-wrong-mssg") }); setTimeout(() => setIsAlert(false), 1500); setActLoader({}); @@ -607,7 +607,7 @@ const ReportTable = (props) => { setActLoader({}); } catch (err) { console.log("err in getsignedurl", err); - alert("something went wrong, please try again later."); + alert(t("something-went-wrong-mssg")); setActLoader({}); } } @@ -740,12 +740,12 @@ const ReportTable = (props) => { const res = await axios.post(url, params, { headers: headers }); if (res?.data?.result?.status === "success") { setIsAlert(true); - setAlertMsg({ type: "success", message: "Mail sent successfully." }); + setAlertMsg({ type: "success", message: t("mail-sent-alert") }); } else { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, please try again later!" + message: t("something-went-wrong-mssg") }); } } catch (err) { @@ -753,7 +753,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, please try again later!" + message: t("something-went-wrong-mssg") }); } finally { setTimeout(() => setIsAlert(false), 1500); @@ -794,20 +794,20 @@ const ReportTable = (props) => { if (count > 1) { setAlertMsg({ type: "success", - message: count + " Document sent successfully!" + message: count + t("document-sent-alert") }); setTimeout(() => setIsAlert(false), 1500); } else { setAlertMsg({ type: "success", - message: count + " Document sent successfully!" + message: count + t("document-sent-alert") }); setTimeout(() => setIsAlert(false), 1500); } } else { setAlertMsg({ type: "danger", - message: "Something went wrong, Please try again later!" + message: t("something-went-wrong-mssg") }); setTimeout(() => setIsAlert(false), 1500); } @@ -844,7 +844,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, Please try again later!" + message: t("something-went-wrong-mssg") }); setTimeout(() => setIsAlert(false), 1500); } @@ -868,7 +868,7 @@ const ReportTable = (props) => { if (props.isPublic[item.objectId]) { setAlertMsg({ type: "success", - message: "You have successfully made the template public." + message: t("template-public-alert-1") }); setIsCelebration(true); setTimeout(() => { @@ -880,7 +880,7 @@ const ReportTable = (props) => { } else { setAlertMsg({ type: "success", - message: "You have successfully made the template private." + message: t("template-public-alert-2") }); setSelectedPublicRole(""); } @@ -897,7 +897,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, Please try again later!" + message: t("something-went-wrong-mssg") }); setTimeout(() => setIsAlert(false), 1500); props.setIsPublic((prevStates) => ({ @@ -909,7 +909,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: "You need to select a role for the public signers." + message: t("template-public-alert-3") }); setTimeout(() => setIsAlert(false), 1500); } @@ -963,8 +963,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: - " Please ensure there's at least one signature widget added for all signers." + message: t("template-public-alert-4") }); setTimeout(() => setIsAlert(false), 5000); } @@ -972,8 +971,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: - "Since this template has send-in-order enabled, the public role must be positioned at the top." + message: t("template-public-alert-5") }); setTimeout(() => setIsAlert(false), 5000); } @@ -981,8 +979,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: - "Please attach signers to all roles except for the public role user." + message: t("template-public-alert-6") }); setTimeout(() => setIsAlert(false), 5000); } @@ -990,8 +987,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "danger", - message: - "Please assign at least one public role to make this template public." + message: t("template-public-alert-7") }); setTimeout(() => setIsAlert(false), 5000); } @@ -1004,7 +1000,7 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "success", - message: "Copied." + message: t("copied") }); setTimeout(() => setIsAlert(false), 1500); }; @@ -1033,14 +1029,14 @@ const ReportTable = (props) => { setIsAlert(true); setAlertMsg({ type: "success", - message: "Template Shared successfully." + message: t("template-share-alert") }); } } catch (err) { setIsAlert(true); setAlertMsg({ type: "danger", - message: "Something went wrong, Please try again later." + message: t("something-went-wrong-mssg") }); } finally { setActLoader({}); @@ -1110,11 +1106,11 @@ const ReportTable = (props) => { </React.Fragment> ))} {props.ReportName === "Templates" && isEnableSubscription && ( - <th className="px-4 py-2">Public</th> + <th className="px-4 py-2">{t("public")}</th> )} {props.actions?.length > 0 && ( <th className="px-4 py-2 text-transparent pointer-events-none"> - Action + {t("action")} </th> )} </tr> @@ -1205,16 +1201,16 @@ const ReportTable = (props) => { )} {props.heading.includes("Folder") && ( <td className="px-4 py-2"> - {item?.Folder?.Name || "OpenSign™ Drive"} + {item?.Folder?.Name || t("OpenSign™ Drive")} </td> )} <td className="px-4 py-2"> <button onClick={() => handleDownload(item)} className="op-link op-link-primary" - title={"Download"} + title={t("download")} > - {item?.URL ? "Download" : "-"} + {item?.URL ? t("download") : "-"} </button> </td> <td className="px-4 py-2"> @@ -1226,7 +1222,7 @@ const ReportTable = (props) => { onClick={() => handleViewSigners(item)} className="op-link op-link-primary" > - View + {t("view")} </button> ) : ( "-" @@ -1260,8 +1256,8 @@ const ReportTable = (props) => { isOpen title={ props.isPublic[item.objectId] - ? "Make template public" - : "Make template private" + ? t("make-template-public") + : t("make-template-private") } handleClose={() => { setIsMakePublicModal({}); @@ -1277,13 +1273,13 @@ const ReportTable = (props) => { <div className="font-normal text-black"> <p className="text-lg"> {props.isPublic[item.objectId] - ? `Are you sure you want to make this template public?` - : `Are you sure you want to make this template private? This will remove it from your public profile.`} + ? t("make-template-public-alert") + : t("make-template-private-alert")} </p> {props.isPublic[item.objectId] && ( <div className="flex mt-2 gap-2 md:items-center"> <p className="text-[15px]"> - Public role :{" "} + {t("public-role")} :{" "} </p> <input @@ -1301,13 +1297,13 @@ const ReportTable = (props) => { } className="op-btn op-btn-primary" > - Submit + {t("submit")} </button> <button onClick={() => handleClose(item)} className="op-btn op-btn-secondary" > - Cancel + {t("cancel")} </button> </div> </div> @@ -1316,7 +1312,7 @@ const ReportTable = (props) => { {isPublicProfile[item.objectId] && ( <ModalUi isOpen - title={"Public URL"} + title={t("public-url")} handleClose={() => { setIsPublicProfile({}); }} @@ -1324,15 +1320,10 @@ const ReportTable = (props) => { <div className="m-[20px]"> {publicUserName ? ( <div className="font-normal text-black"> - <p> - Here’s your public URL: Copy it or - share it with the signer, and you will - be able to see all your publicly set - templates. - </p> + <p>{t("public-url-copy-mssg")}</p> <div className=" flex items-center gap-3 mt-2 p-[2px] "> <span className="font-bold"> - Public URL : + {t("public-url")}: </span> <span onClick={() => copytoProfileLink()} @@ -1342,16 +1333,12 @@ const ReportTable = (props) => { </div> ) : ( <div className="font-normal text-black"> - <p> - Please add your public URL, and you - will be able to make a public - template. - </p> + <p>{t("add-public-url-alert")}</p> <button className="mt-3 op-btn op-btn-primary" onClick={() => navigate("/profile")} > - Add + {t("add")} </button> </div> )} @@ -1376,7 +1363,7 @@ const ReportTable = (props) => { onClick={() => handleActionBtn(act, item) } - title={act.hoverLabel} + title={t(`btnLabel.${act.btnLabel}`)} className={ act.action !== "option" ? `${ @@ -1390,7 +1377,7 @@ const ReportTable = (props) => { <i className={act.btnIcon}></i> {act.btnLabel && ( <span className="uppercase font-medium"> - {act.btnLabel} + {t(`btnLabel.${act.btnLabel}`)} </span> )} {isOption[item.objectId] && @@ -1405,7 +1392,9 @@ const ReportTable = (props) => { item ) } - title={subact.hoverLabel} + title={t( + `btnLabel.${subact.btnLabel}` + )} > <span> <i @@ -1413,7 +1402,9 @@ const ReportTable = (props) => { ></i> {subact.btnLabel && ( <span className="text-[13px] capitalize font-medium"> - {subact.btnLabel} + {t( + `btnLabel.${subact.btnLabel}` + )} </span> )} </span> @@ -1430,7 +1421,7 @@ const ReportTable = (props) => { data-tut={act?.selector} key={index} onClick={() => handleActionBtn(act, item)} - title={act.hoverLabel} + title={t(`btnLabel.${act.hoverLabel}`)} className={ act.action !== "option" ? `${ @@ -1442,7 +1433,7 @@ const ReportTable = (props) => { <i className={act.btnIcon}></i> {act.btnLabel && ( <span className="uppercase font-medium"> - {act.btnLabel} + {t(`btnLabel.${act.btnLabel}`)} </span> )} {isOption[item.objectId] && @@ -1454,7 +1445,9 @@ const ReportTable = (props) => { onClick={() => handleActionBtn(subact, item) } - title={subact.hoverLabel} + title={t( + `btnLabel.${subact.hoverLabel}` + )} > <span> <i @@ -1462,7 +1455,9 @@ const ReportTable = (props) => { ></i> {subact.btnLabel && ( <span className="text-[13px] capitalize font-medium"> - {subact.btnLabel} + {t( + `btnLabel.${subact.btnLabel}` + )} </span> )} </span> @@ -1488,17 +1483,13 @@ const ReportTable = (props) => { ✕ </div> <div className="text-base-content text-base text-center"> - You cannot share a template if any - roles already have contacts assigned. - Please remove all contact assignments - from the roles before sharing the - template. + {t("share-with-alert")} </div> </div> ) : ( <> <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> - Share with + {t("share-with")} </h3> <div className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2 z-40" @@ -1522,7 +1513,7 @@ const ReportTable = (props) => { closeMenuOnSelect required={true} noOptionsMessage={() => - "Team not found" + t("team-not-found") } unstyled classNames={{ @@ -1544,7 +1535,7 @@ const ReportTable = (props) => { }} /> <button className="op-btn op-btn-primary ml-[10px] my-3"> - Submit + {t("submit")} </button> </form> </> @@ -1568,7 +1559,7 @@ const ReportTable = (props) => { {isSubscribe && !isEnableSubscription && ( <> <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> - Share with + {t("share-with")} </h3> <div className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2 z-40" @@ -1585,7 +1576,7 @@ const ReportTable = (props) => { onClick={(e) => handleShareWith(e, item)} className="op-btn op-btn-primary ml-[10px] my-3" > - Submit + {t("submit")} </button> </> )} @@ -1598,7 +1589,7 @@ const ReportTable = (props) => { showHeader={ props.ReportName === "Templates" && true } - title={"Signers"} + title={t("signers")} reduceWidth={"md:max-w-[450px]"} handleClose={() => setIsViewShare({})} > @@ -1615,13 +1606,13 @@ const ReportTable = (props) => { <tr> {props.ReportName === "Templates" && ( <th className="p-2 pl-3 w-[30%]"> - Roles + {t("roles")} </th> )} <th className="pl-3 py-2"> {props.ReportName === "Templates" - ? "Email" - : "Signers"} + ? t("email") + : t("signers")} </th> </tr> </thead> @@ -1647,12 +1638,12 @@ const ReportTable = (props) => { {isDeleteModal[item.objectId] && ( <ModalUi isOpen - title={"Delete Document"} + title={t("delete-document")} handleClose={handleClose} > <div className="m-[20px]"> <div className="text-lg font-normal text-black"> - Are you sure you want to delete this document? + {t("delete-document-alert")} </div> <hr className="bg-[#ccc] mt-4" /> <div className="flex items-center mt-3 gap-2 text-white"> @@ -1660,13 +1651,13 @@ const ReportTable = (props) => { onClick={() => handleDelete(item)} className="op-btn op-btn-primary" > - Yes + {t("yes")} </button> <button onClick={handleClose} className="op-btn op-btn-secondary" > - No + {t("no")} </button> </div> </div> @@ -1675,7 +1666,7 @@ const ReportTable = (props) => { {isBulkSend[item.objectId] && ( <ModalUi isOpen - title={"Quick send"} + title={t("quick-send")} handleClose={() => setIsBulkSend({})} > {isLoader[item.objectId] ? ( @@ -1694,7 +1685,7 @@ const ReportTable = (props) => { {isShare[item.objectId] && ( <ModalUi isOpen - title={"Copy link"} + title={t("copy-link")} handleClose={() => { setIsShare({}); setActLoader({}); @@ -1719,7 +1710,7 @@ const ReportTable = (props) => { > <button className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm "> <i className="fa-light fa-share-from-square"></i>{" "} - Share + {t("btnLabel.Share")} </button> </RWebShare> <button @@ -1728,8 +1719,8 @@ const ReportTable = (props) => { > <i className="fa-light fa-link"></i>{" "} {copied[share.email] - ? "Copied" - : "Copy"} + ? t("copied") + : t("copy")} </button> </div> </div> @@ -1740,12 +1731,12 @@ const ReportTable = (props) => { {isRevoke[item.objectId] && ( <ModalUi isOpen - title={"Revoke document"} + title={t("revoke-document")} handleClose={handleClose} > <div className="m-[20px]"> <div className="text-sm md:text-lg font-normal text-black"> - Are you sure you want to revoke this document? + {t("revoke-document-alert")} </div> <div className="mt-2"> <textarea @@ -1761,13 +1752,13 @@ const ReportTable = (props) => { onClick={() => handleRevoke(item)} className="op-btn op-btn-primary px-6" > - Yes + {t("yes")} </button> <button onClick={handleClose} className="op-btn op-btn-secondary px-6" > - No + {t("no")} </button> </div> </div> @@ -1776,7 +1767,7 @@ const ReportTable = (props) => { {isResendMail[item.objectId] && ( <ModalUi isOpen - title={"Resend Mail"} + title={t("resend-mail")} handleClose={() => { setIsResendMail({}); setIsNextStep({}); @@ -1802,9 +1793,7 @@ const ReportTable = (props) => { <div className="absolute right-5 text-xs z-40"> <Tooltip id={`${user.Id}_help`} - message={ - "You can use following variables which will get replaced with their actual values:- {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email}}, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}." - } + message={t("resend-mail-help")} /> </div> <div> @@ -1812,7 +1801,7 @@ const ReportTable = (props) => { className="text-xs ml-1" htmlFor="mailsubject" > - Subject{" "} + {t("subject")}{" "} </label> <input id="mailsubject" @@ -1832,7 +1821,7 @@ const ReportTable = (props) => { className="text-xs ml-1" htmlFor="mailbody" > - Body{" "} + {t("body")}{" "} </label> <EditorToolbar containerId="toolbar1" /> <ReactQuill @@ -1851,7 +1840,7 @@ const ReportTable = (props) => { type="submit" className="op-btn op-btn-primary" > - Resend + {t("resend")} </button> </form> </div> @@ -1889,7 +1878,7 @@ const ReportTable = (props) => { onClick={() => paginateBack()} className="op-join-item op-btn op-btn-sm" > - Prev + {t("prev")} </button> )} {pageNumbers.map((x, i) => ( @@ -1909,7 +1898,7 @@ const ReportTable = (props) => { onClick={() => paginateFront()} className="op-join-item op-btn op-btn-sm" > - Next + {t("next")} </button> )} </div> @@ -1926,11 +1915,13 @@ const ReportTable = (props) => { alt="img" /> </div> - <div className="text-sm font-semibold">No Data Available</div> + <div className="text-sm font-semibold"> + {t("no-data-avaliable")} + </div> </div> )} <ModalUi - title={"Add Contact"} + title={t("add-contact")} isOpen={isContactform} handleClose={handleContactFormModal} > diff --git a/apps/OpenSign/src/primitives/LinkUserModal.js b/apps/OpenSign/src/primitives/LinkUserModal.js index 552582697..ed3bef0db 100644 --- a/apps/OpenSign/src/primitives/LinkUserModal.js +++ b/apps/OpenSign/src/primitives/LinkUserModal.js @@ -2,11 +2,13 @@ import React from "react"; import SelectSigners from "../components/shared/fields/SelectSigners"; import AddContact from "./AddContact"; import ModalUi from "./ModalUi"; +import { useTranslation } from "react-i18next"; const LinkUserModal = (props) => { + const { t } = useTranslation(); return ( <ModalUi - title={"Add/Choose Signer"} + title={t("add/choose-signer")} isOpen={ props?.isAddSigner || (props?.isAddUser && props?.isAddUser[props?.uniqueId]) @@ -18,7 +20,9 @@ const LinkUserModal = (props) => { closePopup={props.closePopup} signersData={props?.signersData} /> - <div className="op-divider text-base-content mx-[25%] my-1">or</div> + <div className="op-divider text-base-content mx-[25%] my-1"> + {t("or")} + </div> <AddContact details={props.handleAddUser} closePopup={props.closePopup} /> </ModalUi> );