Made ForgetPassword and ResetPassword multilingual. Also added en and fr translations for the same.

This commit is contained in:
K
2025-06-20 23:28:44 +05:30
parent 9e170a91ef
commit 36693ba21b
4 changed files with 134 additions and 87 deletions
+17
View File
@@ -35,6 +35,23 @@
"signup_journey_heading": "Start your Journey", "signup_journey_heading": "Start your Journey",
"signup_with": "with", "signup_with": "with",
"forget_password_heading": "Forget Password?",
"forget_password_subtitle": "No worries, we'll send you reset instructions.",
"forget_password_email_placeholder": "Enter your email",
"forget_password_send_email": "Send Email",
"forget_password_email_sent": "Email Sent to your Mail",
"forget_password_back_to_login": "Back to Login Page",
"reset_password_heading": "Create New Password",
"reset_password_subtitle": "Create your new, unique and secure password here.",
"reset_password_new_label": "New Password :",
"reset_password_new_placeholder": "Enter your New Password",
"reset_password_confirm_label": "Confirm Password :",
"reset_password_confirm_placeholder": "Enter your Confirm Password",
"reset_password_error": "Password and confirm password do not match. Please enter the same password in both fields.",
"reset_password_button": "Reset Password",
"reset_password_back_to_login": "Back to Login Page",
"hero_one_stop_solution": "One stop solution for every farmer's need.", "hero_one_stop_solution": "One stop solution for every farmer's need.",
"hero_plant_alt": "plant", "hero_plant_alt": "plant",
+17
View File
@@ -35,6 +35,23 @@
"signup_journey_heading": "Commencez votre aventure", "signup_journey_heading": "Commencez votre aventure",
"signup_with": "avec", "signup_with": "avec",
"forget_password_heading": "Mot de passe oublié ?",
"forget_password_subtitle": "Pas d'inquiétude, nous vous enverrons des instructions de réinitialisation.",
"forget_password_email_placeholder": "Entrez votre e-mail",
"forget_password_send_email": "Envoyer l'e-mail",
"forget_password_email_sent": "E-mail envoyé à votre adresse",
"forget_password_back_to_login": "Retour à la page de connexion",
"reset_password_heading": "Créer un nouveau mot de passe",
"reset_password_subtitle": "Créez ici votre nouveau mot de passe unique et sécurisé.",
"reset_password_new_label": "Nouveau mot de passe :",
"reset_password_new_placeholder": "Entrez votre nouveau mot de passe",
"reset_password_confirm_label": "Confirmer le mot de passe :",
"reset_password_confirm_placeholder": "Entrez à nouveau votre mot de passe",
"reset_password_error": "Le mot de passe et sa confirmation ne correspondent pas. Veuillez saisir le même mot de passe dans les deux champs.",
"reset_password_button": "Réinitialiser le mot de passe",
"reset_password_back_to_login": "Retour à la page de connexion",
"hero_one_stop_solution": "Une solution unique pour tous les besoins des agriculteurs.", "hero_one_stop_solution": "Une solution unique pour tous les besoins des agriculteurs.",
"hero_plant_alt": "plante", "hero_plant_alt": "plante",
+21 -9
View File
@@ -1,12 +1,17 @@
import React, { useRef, useState } from "react"; import React, { useRef, useState } from "react";
import { IoIosKey } from "react-icons/io"; import { IoIosKey } from "react-icons/io";
import { Link } from "react-router-dom"; import { Link, useOutletContext } from "react-router-dom";
import { FaArrowLeft } from "react-icons/fa6"; import { FaArrowLeft } from "react-icons/fa6";
import { BACKEND_URL } from "../../constants"; import { BACKEND_URL } from "../../constants";
import { t } from "../../service/translation";
const ForgetPassword = (props) => {
// Get language from context or props, default to 'en'
const outletContext = useOutletContext?.();
const language =
(outletContext && outletContext.language) || props.language || "en";
const ForgetPassword = () => {
const emailElement = useRef(); const emailElement = useRef();
const [status, setStatus] = useState(false); const [status, setStatus] = useState(false);
const handleForgetPassword = async (event) => { const handleForgetPassword = async (event) => {
@@ -29,15 +34,18 @@ const ForgetPassword = () => {
setStatus(true); setStatus(true);
} }
}; };
return ( return (
<div className="w-full h-[78vh] flex justify-center items-center"> <div className="w-full h-[78vh] flex justify-center items-center">
<div className=""> <div>
<div className="flex flex-col items-center gap-12"> <div className="flex flex-col items-center gap-12">
<div className="flex flex-col items-center gap-3"> <div className="flex flex-col items-center gap-3">
<IoIosKey className="text-5xl bg-purple-200 p-2 rounded-full text-purple-500" /> <IoIosKey className="text-5xl bg-purple-200 p-2 rounded-full text-purple-500" />
<h2 className="text-3xl font-bold font-sans">Forget Password?</h2> <h2 className="text-3xl font-bold font-sans">
{t("forget_password_heading", language)}
</h2>
<p className="text-gray-500"> <p className="text-gray-500">
No worries, we'll send you resent instructions. {t("forget_password_subtitle", language)}
</p> </p>
</div> </div>
<form <form
@@ -49,7 +57,7 @@ const ForgetPassword = () => {
<input <input
type="email" type="email"
id="email" id="email"
placeholder="Enter your email" placeholder={t("forget_password_email_placeholder", language)}
className="w-full rounded-md border-gray-400 border-2" className="w-full rounded-md border-gray-400 border-2"
ref={emailElement} ref={emailElement}
/> />
@@ -58,14 +66,17 @@ const ForgetPassword = () => {
type="submit" type="submit"
className="focus:outline-none text-white bg-purple-700 hover:bg-purple-800 focus:ring-4 focus:ring-purple-300 font-medium rounded-lg text-base px-5 py-2.5 mb-2 dark:bg-purple-600 dark:hover:bg-purple-700 dark:focus:ring-purple-900" className="focus:outline-none text-white bg-purple-700 hover:bg-purple-800 focus:ring-4 focus:ring-purple-300 font-medium rounded-lg text-base px-5 py-2.5 mb-2 dark:bg-purple-600 dark:hover:bg-purple-700 dark:focus:ring-purple-900"
> >
{status === false ? "Send Email" : "Email Sent to your Mail"} {status === false
? t("forget_password_send_email", language)
: t("forget_password_email_sent", language)}
</button> </button>
<Link <Link
to={"/user/login"} to={"/user/login"}
className="text-center text-gray-600 inline-flex items-center justify-center gap-2" className="text-center text-gray-600 inline-flex items-center justify-center gap-2"
> >
<FaArrowLeft className="text-lg" /> Back to Login Page <FaArrowLeft className="text-lg" />{" "}
{t("forget_password_back_to_login", language)}
</Link> </Link>
</form> </form>
</div> </div>
@@ -75,3 +86,4 @@ const ForgetPassword = () => {
}; };
export default ForgetPassword; export default ForgetPassword;
+20 -19
View File
@@ -1,20 +1,23 @@
import React, { useRef, useState } from "react"; import React, { useRef, useState } from "react";
import { RiLockPasswordFill } from "react-icons/ri"; import { RiLockPasswordFill } from "react-icons/ri";
import { Link, useNavigate, useParams } from "react-router-dom"; import { Link, useNavigate, useParams, useOutletContext } from "react-router-dom";
import { FaArrowLeft } from "react-icons/fa6"; import { FaArrowLeft } from "react-icons/fa6";
import { BACKEND_URL } from "../../constants"; import { BACKEND_URL } from "../../constants";
import { t } from "../../service/translation";
const ResetPassword = () => { const ResetPassword = (props) => {
const [secure, setSecure] = useState(true); const [secure, setSecure] = useState(true);
const newPassworElement = useRef(); const newPassworElement = useRef();
const confirmPassworElement = useRef(); const confirmPassworElement = useRef();
const navigate = useNavigate(); const navigate = useNavigate();
const { token } = useParams(); const { token } = useParams();
// Get language from context or props, default to 'en'
const outletContext = useOutletContext?.();
const language =
(outletContext && outletContext.language) || props.language || "en";
const handleResetPassword = async (event) => { const handleResetPassword = async (event) => {
event.preventDefault(); event.preventDefault();
@@ -41,8 +44,6 @@ const ResetPassword = () => {
const data = await responce.json(); const data = await responce.json();
if (data.success === true) { if (data.success === true) {
navigate("/user/login"); navigate("/user/login");
} }
@@ -50,17 +51,16 @@ const ResetPassword = () => {
}; };
return ( return (
<>
<div className="w-full h-[78vh] flex justify-center items-center"> <div className="w-full h-[78vh] flex justify-center items-center">
<div className=""> <div>
<div className="flex flex-col items-center gap-10"> <div className="flex flex-col items-center gap-10">
<div className="flex flex-col items-center gap-3"> <div className="flex flex-col items-center gap-3">
<RiLockPasswordFill className="text-5xl bg-purple-200 p-2 rounded-full text-purple-500" /> <RiLockPasswordFill className="text-5xl bg-purple-200 p-2 rounded-full text-purple-500" />
<h2 className="text-3xl font-bold font-sans"> <h2 className="text-3xl font-bold font-sans">
Create New Password {t("reset_password_heading", language)}
</h2> </h2>
<p className="text-gray-500"> <p className="text-gray-500">
Create your new, unique and secure password here. {t("reset_password_subtitle", language)}
</p> </p>
</div> </div>
<form <form
@@ -72,13 +72,13 @@ const ResetPassword = () => {
htmlFor="passwordNew" htmlFor="passwordNew"
className="text-gray-500 font-semibold" className="text-gray-500 font-semibold"
> >
New Password : {t("reset_password_new_label", language)}
</label> </label>
<input <input
type="password" type="password"
id="passwordNew" id="passwordNew"
ref={newPassworElement} ref={newPassworElement}
placeholder="Enter your New Password" placeholder={t("reset_password_new_placeholder", language)}
className="w-full rounded-md border-gray-400 border-2" className="w-full rounded-md border-gray-400 border-2"
/> />
</div> </div>
@@ -87,13 +87,13 @@ const ResetPassword = () => {
htmlFor="passwordConfirm" htmlFor="passwordConfirm"
className="text-gray-500 font-semibold" className="text-gray-500 font-semibold"
> >
Confirm Password : {t("reset_password_confirm_label", language)}
</label> </label>
<input <input
type="password" type="password"
id="passwordConfirm" id="passwordConfirm"
ref={confirmPassworElement} ref={confirmPassworElement}
placeholder="Enter your Confirm Password" placeholder={t("reset_password_confirm_placeholder", language)}
className="w-full rounded-md border-gray-400 border-2" className="w-full rounded-md border-gray-400 border-2"
/> />
</div> </div>
@@ -103,28 +103,29 @@ const ResetPassword = () => {
secure && "hidden" secure && "hidden"
} `} } `}
> >
Password and confirm Password is not same.Please Enter new {t("reset_password_error", language)}
password and confirm Password same
</p> </p>
<button <button
type="submit" type="submit"
className="focus:outline-none text-white bg-purple-700 hover:bg-purple-800 focus:ring-4 focus:ring-purple-300 font-medium rounded-lg text-base px-5 py-2.5 mb-2 dark:bg-purple-600 dark:hover:bg-purple-700 dark:focus:ring-purple-900" className="focus:outline-none text-white bg-purple-700 hover:bg-purple-800 focus:ring-4 focus:ring-purple-300 font-medium rounded-lg text-base px-5 py-2.5 mb-2 dark:bg-purple-600 dark:hover:bg-purple-700 dark:focus:ring-purple-900"
> >
Reset Password {t("reset_password_button", language)}
</button> </button>
<Link <Link
to={"/user/login"} to={"/user/login"}
className="text-center text-gray-600 inline-flex items-center justify-center gap-2" className="text-center text-gray-600 inline-flex items-center justify-center gap-2"
> >
<FaArrowLeft className="text-lg" /> Back to Login Page <FaArrowLeft className="text-lg" />{" "}
{t("reset_password_back_to_login", language)}
</Link> </Link>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
</>
); );
}; };
export default ResetPassword; export default ResetPassword;