diff --git a/.github/workflows/phoenix-deployment.yml b/.github/workflows/phoenix-deployment.yml new file mode 100644 index 000000000..a23370274 --- /dev/null +++ b/.github/workflows/phoenix-deployment.yml @@ -0,0 +1,53 @@ +name: Pheonix Deployment + +on: + workflow_run: + workflows: ["Build and Upload"] + types: + - completed + +jobs: + deploy: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + + environment: + name: "panther-expressjs" + url: ${{ vars.URL }} + + steps: + - name: Download build artifact + uses: actions/download-artifact@v4 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + name: boilerplate-build + path: . + + - name: Decode ENV secret + run: | + echo "${{ secrets.ENV }}" > encoded_env.txt + base64 -d encoded_env.txt > .env.expressjs + + - name: Copy Artifacts to server + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + source: ".env.expressjs,boilerplate.tar.gz" + target: "/tmp/expressjs" + + - name: Deploy on server + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + script: | + cd hng_boilerplate_nextjs + tar -xzf /tmp/expressjs/boilerplate.tar.gz + mv /tmp/expressjs/.env.expressjs .env + rm -f /tmp/expressjs/boilerplate.tar.gz + cp -r .next/standalone/* . + pm2 restart nextjs_boilerplate --update-env diff --git a/public/images/career/noJob.svg b/public/images/career/noJob.svg new file mode 100644 index 000000000..8e902517d --- /dev/null +++ b/public/images/career/noJob.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/public/messages/en.json b/public/messages/en.json index 9b172d400..2e703f3c0 100644 --- a/public/messages/en.json +++ b/public/messages/en.json @@ -1,190 +1,196 @@ { - "navbar": { - "login": "Log in", - "register": "Get Started" - }, - "navLinks": { - "home": "Home", - "pricing": "Pricing", - "careers": "Careers" - }, - "login": { - "title": "Login", - "welcomeBack": "Welcome back, you've been missed!", - "continueWithGoogle": "Continue with Google", - "emailPlaceholder": "Enter Email Address", - "passwordPlaceholder": "Enter Password", - "rememberMe": "Remember me", - "forgotPassword": "Forgot Password?", - "loginButton": "Login", - "signInWithMagicLink": "Sign in with magic link", - "noAccount": "Don't Have An Account?", - "agree": "By logging in, you agree to the", - "and": "and", - "signUp": "Sign Up", - "termsOfService": "Terms of Service", - "privacyPolicy": "Privacy Policy", - "loggingIn": "Logging in..." - }, - "register": { - "signUp": "Sign Up", - "createAccountDesc": "Create an account to get started with us.", - "continueWithGoogle": "Continue with Google", - "firstName": "First Name", - "firstNamePlaceholder": "Enter your first name", - "lastName": "Last Name", - "lastNamePlaceholder": "Enter your last name", - "email": "Email", - "emailPlaceholder": "Enter Email Address", - "password": "Password", - "passwordPlaceholder": "Enter Password", - "createAccount": "Create Account", - "loggingIn": "Logging in...", - "emailVerification": "Email Verification", - "emailVerificationDesc": "We have sent a code to your email {email}", - "checkSpam": "check your spam if you do not receive the email", - "otpExpiresIn": "OTP expires in: {timeLeft}", - "resendCode": "Didn't receive the code? resend", - "dataProcessing": "We would process your data as set forth in our Terms of Use, Privacy Policy and Data Processing Agreement", - "alreadyHaveAccount": "Already Have An Account? Login" - }, - "HomePage": { - "title": "Hello world!" - }, - "hero": { - "headline": "Focus on What Matters. We've Got the Foundation Covered.", - "description": "Streamline your processes with a boilerplate built for efficiency and optimal productivity.", - "cta": "Get Started" - }, - "userSection": { - "userSectionMoreThan": "More than 200", - "userSectionUsers": "Users", - "userSectionUsage": "make use of our Boilerplate" - }, - "howItWorks": { - "howItWorksTitlePrefix": "How It Works:", - "howItWorksTitleHighlight": "Experience the benefits of using our product with every step.", - "howItWorksDescription": "We designed our product to simplify your life. It offers a comprehensive solution. Here's how it works and how it benefits you at each stage.", - "prebuiltTitle": "Pre-Built Sections", - "prebuiltDescription": "Leverage pre-built sections like \"Features,\" \"Benefits,\" \"Pricing,\" and \"Testimonials\" to showcase your product effectively.", - "scalableTitle": "Scalable Foundation", - "scalableDescription": "Our boilerplate is designed to grow with your product. Easily add new features and functionalities as needed.", - "easyTitle": "Easy Customization", - "easyDescription": "Tailor the experience to your specific needs and preferences for maximum results." - }, - "testimonials": { - "title": "Client Testimonials", - "description": "Don't just take our word for it - see what actual users of our product have to say about their experience.", - "content": "I've been using this web hosting service for over a year and I'm really impressed with the uptime and support. The website has never gone down and the customer service is always quick to help with any issues I have. Highly recommend!" - }, - "perfectFit": { - "title": "Find The Perfect Fit", - "description": "Choose the boilerplate plan that best suits your project needs and budget. All plans include access to our comprehensive library of pre-built sections, drag-and-drop customization.", - "cta": "See Our Pricing Plan" - }, - "footer": { - "newsletterSignUp": "Sign Up For Newsletters", - "subscribe": "Subscribe", - "navigation": "Navigation", - "support": "Support", - "legal": "Legal", - "followUs": "Follow Us", - "privacyPolicy": "Privacy Policy", - "termsOfUse": "Terms of Use", - "enterYourEmail": "Enter your email", - "links": { - "navigation": "Navigation", - "home": "Home", - "aboutUs": "About Us", - "career": "Career", - "features": "Features", - "blog": "Blog", - "status": "Status", - "support": "Support", - "helpCenter": "Help Center", - "faq": "FAQ", - "waitingList": "Waiting List", - "pricingExperience": "Pricing Experience", - "contactUs": "Contact Us", - "legal": "Legal", - "privacyPolicy": "Privacy Policy", - "termsAndConditions": "Terms and Conditions" - }, - "social": { - "facebook": "Facebook", - "instagram": "Instagram", - "linkedin": "LinkedIn", - "youtube": "YouTube" - }, - "footerBottom": { - "privacyPolicy": "Privacy Policy", - "termsOfUse": "Terms of Use", - "copyright": "2024 All Rights Reserved" - } - }, - "pricing": { - "pricingTitle": "Simple and {{Affordable}} Pricing Plan", - "pricingContent": "Our flexible plans are designed to scale with your business. We have a plan for you.", - "monthly": "Monthly", - "annual": "Annual (save 20%)", - "billingPlansNotAvailable": "Billing plans not available", - "features": { - "feature1": "2 Projects", - "feature2": "Up to 100 subscribers", - "feature3": "Basic analytics", - "feature4": "24-hour support response time", - "feature5": "Marketing advisor", - "feature6": "Custom integration", - "continue": "Continue" - }, - "essentials": "The essentials to provide your best work for clients.", - "faqHeader": "Frequently Asked Questions", - "faqSubHeader": "We couldn’t answer your question?", - "contactUs": "Contact us", - "continue": "Continue" - }, - "faq": { - "question1": "What is the purpose of this application?", - "answer1": "This application is designed to help users manage their tasks efficiently by providing tools for scheduling, tracking progress, and setting reminders.", - "question2": "How do I reset my password?", - "answer2": "To reset your password, go to the login page and click on the 'Forgot Password' link. Follow the instructions to receive a password reset email and create a new password.", - "question3": "Can I use this application on multiple devices?", - "answer3": "Yes, the application is accessible from multiple devices including desktops, tablets, and smartphones. Your data will be synced across all devices, ensuring a seamless experience." - }, - "noJobs": { - "noJobsTitle": "No available Jobs at the moment", - "noJobsContent": "Come back later!" - }, - "ourServices": { - "title": "Our Services", - "description": "Trained to Give You The Best", - "details": "Since our founding in, Hng Boilerplate has been dedicated to constantly evolving to stay ahead of the curve. Our agile mindset and relentless pursuit of innovation ensure that you're always equipped with the most effective tools and strategies." - }, - "mission": { - "title": "Our Mission & Vision", - "subtitle": "Leading the Way, Redefining Industries", - "description": "At Hng Boilerplate, we are dedicated to exceeding your expectations. We strive to understand your unique needs and challenges, providing tailored solutions that drive real results and empower your success." - }, - "coreValues": { - "title": "Our Core Values", - "description": "Our Values shape the core of our organization and define the character of our industry.", - "values": { - "integrity": { - "title": "Integrity", - "description": "We uphold the highest ethical standards in everything we do, fostering trust and transparency with our clients, partners, and employees. We believe that honesty and integrity are the foundation of lasting success." - }, - "customerCentricity": { - "title": "Customer Centricity", - "description": "Our customers are at the heart of our business. We strive to understand their needs, exceed their expectations, and build lasting relationships based on trust and mutual respect. We believe that putting our customers first is the key to long-term success." - }, - "innovation": { - "title": "Innovation", - "description": "We embrace a culture of continuous improvement and creativity, constantly seeking new ways to evolve and enhance our products, services, and processes. We encourage experimentation and risk-taking, recognizing that innovation is essential for growth." - }, - "excellence": { - "title": "Excellence", - "description": "We are committed to delivering exceptional quality in everything we do, from our products and services to our customer interactions and internal processes. We strive for continuous improvement and hold ourselves to the highest standards of performance." - } - } + "navbar": { + "login": "Log in", + "register": "Get Started" + }, + "navLinks": { + "home": "Home", + "pricing": "Pricing", + "careers": "Careers" + }, + "login": { + "title": "Login", + "welcomeBack": "Welcome back, you've been missed!", + "continueWithGoogle": "Continue with Google", + "emailPlaceholder": "Enter Email Address", + "passwordPlaceholder": "Enter Password", + "rememberMe": "Remember me", + "forgotPassword": "Forgot Password?", + "loginButton": "Login", + "signInWithMagicLink": "Sign in with magic link", + "noAccount": "Don't Have An Account?", + "agree": "By logging in, you agree to the", + "and": "and", + "signUp": "Sign Up", + "termsOfService": "Terms of Service", + "privacyPolicy": "Privacy Policy", + "loggingIn": "Logging in..." + }, + "register": { + "signUp": "Sign Up", + "createAccountDesc": "Create an account to get started with us.", + "continueWithGoogle": "Continue with Google", + "firstName": "First Name", + "firstNamePlaceholder": "Enter your first name", + "lastName": "Last Name", + "lastNamePlaceholder": "Enter your last name", + "email": "Email", + "emailPlaceholder": "Enter Email Address", + "password": "Password", + "passwordPlaceholder": "Enter Password", + "createAccount": "Create Account", + "loggingIn": "Logging in...", + "emailVerification": "Email Verification", + "emailVerificationDesc": "We have sent a code to your email {email}", + "checkSpam": "check your spam if you do not receive the email", + "otpExpiresIn": "OTP expires in: {timeLeft}", + "resendCode": "Didn't receive the code? resend", + "dataProcessing": "We would process your data as set forth in our Terms of Use, Privacy Policy and Data Processing Agreement", + "alreadyHaveAccount": "Already Have An Account? Login" + }, + "HomePage": { + "title": "Hello world!" + }, + "hero": { + "headline": "Focus on What Matters. We've Got the Foundation Covered.", + "description": "Streamline your processes with a boilerplate built for efficiency and optimal productivity.", + "cta": "Get Started" + }, + "userSection": { + "userSectionMoreThan": "More than 200", + "userSectionUsers": "Users", + "userSectionUsage": "make use of our Boilerplate" + }, + "howItWorks": { + "howItWorksTitlePrefix": "How It Works:", + "howItWorksTitleHighlight": "Experience the benefits of using our product with every step.", + "howItWorksDescription": "We designed our product to simplify your life. It offers a comprehensive solution. Here's how it works and how it benefits you at each stage.", + "prebuiltTitle": "Pre-Built Sections", + "prebuiltDescription": "Leverage pre-built sections like \"Features,\" \"Benefits,\" \"Pricing,\" and \"Testimonials\" to showcase your product effectively.", + "scalableTitle": "Scalable Foundation", + "scalableDescription": "Our boilerplate is designed to grow with your product. Easily add new features and functionalities as needed.", + "easyTitle": "Easy Customization", + "easyDescription": "Tailor the experience to your specific needs and preferences for maximum results." + }, + "testimonials": { + "title": "Client Testimonials", + "description": "Don't just take our word for it - see what actual users of our product have to say about their experience.", + "content": "I've been using this web hosting service for over a year and I'm really impressed with the uptime and support. The website has never gone down and the customer service is always quick to help with any issues I have. Highly recommend!" + }, + "perfectFit": { + "title": "Find The Perfect Fit", + "description": "Choose the boilerplate plan that best suits your project needs and budget. All plans include access to our comprehensive library of pre-built sections, drag-and-drop customization.", + "cta": "See Our Pricing Plan" + }, + "footer": { + "newsletterSignUp": "Sign Up For Newsletters", + "subscribe": "Subscribe", + "navigation": "Navigation", + "support": "Support", + "legal": "Legal", + "followUs": "Follow Us", + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms of Use", + "enterYourEmail": "Enter your email", + "links": { + "navigation": "Navigation", + "home": "Home", + "aboutUs": "About Us", + "career": "Career", + "features": "Features", + "blog": "Blog", + "status": "Status", + "support": "Support", + "helpCenter": "Help Center", + "faq": "FAQ", + "waitingList": "Waiting List", + "pricingExperience": "Pricing Experience", + "contactUs": "Contact Us", + "legal": "Legal", + "privacyPolicy": "Privacy Policy", + "termsAndConditions": "Terms and Conditions" + }, + "social": { + "facebook": "Facebook", + "instagram": "Instagram", + "linkedin": "LinkedIn", + "youtube": "YouTube" + }, + "footerBottom": { + "privacyPolicy": "Privacy Policy", + "termsOfUse": "Terms of Use", + "copyright": "2024 All Rights Reserved" + } + }, + "pricing": { + "pricingTitle": "Simple and {{Affordable}} Pricing Plan", + "pricingContent": "Our flexible plans are designed to scale with your business. We have a plan for you.", + "monthly": "Monthly", + "annual": "Annual (save 20%)", + "billingPlansNotAvailable": "Billing plans not available", + "features": { + "feature1": "2 Projects", + "feature2": "Up to 100 subscribers", + "feature3": "Basic analytics", + "feature4": "24-hour support response time", + "feature5": "Marketing advisor", + "feature6": "Custom integration", + "continue": "Continue" + }, + "essentials": "The essentials to provide your best work for clients.", + "faqHeader": "Frequently Asked Questions", + "faqSubHeader": "We couldn’t answer your question?", + "contactUs": "Contact us", + "continue": "Continue" + }, + "faq": { + "question1": "What is the purpose of this application?", + "answer1": "This application is designed to help users manage their tasks efficiently by providing tools for scheduling, tracking progress, and setting reminders.", + "question2": "How do I reset my password?", + "answer2": "To reset your password, go to the login page and click on the 'Forgot Password' link. Follow the instructions to receive a password reset email and create a new password.", + "question3": "Can I use this application on multiple devices?", + "answer3": "Yes, the application is accessible from multiple devices including desktops, tablets, and smartphones. Your data will be synced across all devices, ensuring a seamless experience." + }, + "noJobs": { + "noJobsTitle": "No available Jobs at the moment", + "noJobsContent": "Sign up for our newsletter to get updates on job postings", + "modalTitle": "Newsletter", + "button": "Sign up for newsletter", + "placeholder": "Enter your email", + "modalButton": "Subscribe", + "error": "Please provide your email", + "subscribed": "Thank you for subscribing" + }, + "ourServices": { + "title": "Our Services", + "description": "Trained to Give You The Best", + "details": "Since our founding in, Hng Boilerplate has been dedicated to constantly evolving to stay ahead of the curve. Our agile mindset and relentless pursuit of innovation ensure that you're always equipped with the most effective tools and strategies." + }, + "mission": { + "title": "Our Mission & Vision", + "subtitle": "Leading the Way, Redefining Industries", + "description": "At Hng Boilerplate, we are dedicated to exceeding your expectations. We strive to understand your unique needs and challenges, providing tailored solutions that drive real results and empower your success." + }, + "coreValues": { + "title": "Our Core Values", + "description": "Our Values shape the core of our organization and define the character of our industry.", + "values": { + "integrity": { + "title": "Integrity", + "description": "We uphold the highest ethical standards in everything we do, fostering trust and transparency with our clients, partners, and employees. We believe that honesty and integrity are the foundation of lasting success." + }, + "customerCentricity": { + "title": "Customer Centricity", + "description": "Our customers are at the heart of our business. We strive to understand their needs, exceed their expectations, and build lasting relationships based on trust and mutual respect. We believe that putting our customers first is the key to long-term success." + }, + "innovation": { + "title": "Innovation", + "description": "We embrace a culture of continuous improvement and creativity, constantly seeking new ways to evolve and enhance our products, services, and processes. We encourage experimentation and risk-taking, recognizing that innovation is essential for growth." + }, + "excellence": { + "title": "Excellence", + "description": "We are committed to delivering exceptional quality in everything we do, from our products and services to our customer interactions and internal processes. We strive for continuous improvement and hold ourselves to the highest standards of performance." + } } -} \ No newline at end of file + } +} diff --git a/public/messages/es.json b/public/messages/es.json index 677278367..4688e87b0 100644 --- a/public/messages/es.json +++ b/public/messages/es.json @@ -1,192 +1,198 @@ { - "navbar": { - "login": "Iniciar sesión", - "register": "Comenzar" - }, - "navLinks": { - "home": "Inicio", - "pricing": "Precios", - "careers": "Carreras" - }, - "login": { - "title": "Iniciar sesión", - "welcomeBack": "¡Bienvenido de nuevo, te hemos extrañado!", - "continueWithGoogle": "Continuar con Google", - "emailPlaceholder": "Ingrese dirección de correo electrónico", - "passwordPlaceholder": "Ingrese contraseña", - "rememberMe": "Recuérdame", - "forgotPassword": "¿Olvidaste tu contraseña?", - "loginButton": "Iniciar sesión", - "signInWithMagicLink": "Iniciar sesión con enlace mágico", - "noAccount": "¿No tienes una cuenta?", - "agree": "Al iniciar sesión, aceptas los", - "and": "y", - "signUp": "Regístrate", - "termsOfService": "Términos del Servicio", - "privacyPolicy": "Política de Privacidad", - "loggingIn": "Iniciando sesión..." - }, - "register": { - "signUp": "Regístrate", - "createAccountDesc": "Crea una cuenta para comenzar con nosotros.", - "continueWithGoogle": "Continuar con Google", - "firstName": "Nombre", - "firstNamePlaceholder": "Ingresa tu nombre", - "lastName": "Apellido", - "lastNamePlaceholder": "Ingresa tu apellido", - "email": "Correo electrónico", - "emailPlaceholder": "Ingresa la dirección de correo", - "password": "Contraseña", - "passwordPlaceholder": "Ingresa la contraseña", - "createAccount": "Crear cuenta", - "loggingIn": "Iniciando sesión...", - "emailVerification": "Verificación de correo electrónico", - "emailVerificationDesc": "Hemos enviado un código a tu correo {email}", - "checkSpam": "verifica tu spam si no recibes el correo", - "otpExpiresIn": "OTP expira en: {timeLeft}", - "resendCode": "¿No recibiste el código? reenviar", - "dataProcessing": "Procesaremos tus datos según lo establecido en nuestros Términos de uso, Política de privacidad y Acuerdo de procesamiento de datos", - "alreadyHaveAccount": "¿Ya tienes una cuenta? Iniciar sesión" - }, - "HomePage": { - "title": "¡Hola, mundo!" - }, - "hero": { - "headline": "Concéntrate en lo importante. Nosotros cubrimos los cimientos.", - "description": "Agiliza tus procesos con una base de código diseñada para la eficiencia y una productividad óptima.", - "cta": "Comenzar" - }, - "userSection": { - "userSectionMoreThan": "Más de 200", - "userSectionUsers": "Usuarios", - "userSectionUsage": "usan nuestro Boilerplate" - }, - "howItWorks": { - "howItWorksTitlePrefix": "Cómo Funciona:", - "howItWorksTitleHighlight": "Experimenta los beneficios de usar nuestro producto en cada paso.", - "howItWorksDescription": "Diseñamos nuestro producto para simplificar tu vida. Ofrece una solución integral. Así es como funciona y cómo te beneficia en cada etapa.", - "prebuiltTitle": "Secciones Preconstruidas", - "prebuiltDescription": "Aprovecha secciones preconstruidas como \"Características\", \"Beneficios\", \"Precios\" y \"Testimonios\" para mostrar tu producto de manera efectiva.", - "scalableTitle": "Fundación Escalable", - "scalableDescription": "Nuestro boilerplate está diseñado para crecer con tu producto. Añade fácilmente nuevas características y funcionalidades según sea necesario.", - "easyTitle": "Personalización Fácil", - "easyDescription": "Personaliza la experiencia según tus necesidades y preferencias específicas para obtener resultados óptimos." - }, - "testimonials": { - "title": "Testimonios de Clientes", - "description": "No te fíes solo de nuestra palabra: descubre lo que los usuarios reales de nuestro producto tienen que decir sobre su experiencia.", - "content": "He estado usando este servicio de alojamiento web durante más de un año y estoy realmente impresionado con el tiempo de actividad y el soporte. El sitio web nunca ha caído y el servicio al cliente siempre es rápido para ayudar con cualquier problema que tenga. ¡Altamente recomendado!" - }, - "perfectFit": { - "title": "Encuentra la Solución Perfecta", - "description": "Elige el plan de plantilla que mejor se adapte a las necesidades y presupuesto de tu proyecto. Todos los planes incluyen acceso a nuestra biblioteca completa de secciones preconstruidas y personalización mediante arrastrar y soltar.", - "cta": "Consulta Nuestro Plan de Precios" - }, - "footer": { - "boilerplate": "Plantilla", - "address": "Detalles del logo y dirección", - "newsletterSignUp": "Suscríbete al Boletín", - "subscribe": "Suscribirse", - "navigation": "Navegación", - "support": "Soporte", - "legal": "Legal", - "followUs": "Síguenos", - "privacyPolicy": "Política de Privacidad", - "termsOfUse": "Términos de Uso", - "enterYourEmail": "Introduce tu correo electrónico", - "links": { - "navigation": "Navegación", - "home": "Inicio", - "aboutUs": "Sobre Nosotros", - "career": "Carrera", - "features": "Características", - "blog": "Blog", - "status": "Estado", - "support": "Soporte", - "helpCenter": "Centro de Ayuda", - "faq": "FAQ", - "waitingList": "Lista de Espera", - "pricingExperience": "Experiencia de Precios", - "contactUs": "Contáctanos", - "legal": "Legal", - "privacyPolicy": "Política de Privacidad", - "termsAndConditions": "Términos y Condiciones" - }, - "social": { - "facebook": "Facebook", - "instagram": "Instagram", - "linkedin": "LinkedIn", - "youtube": "YouTube" - }, - "footerBottom": { - "privacyPolicy": "Política de Privacidad", - "termsOfUse": "Términos de Uso", - "copyright": "2024 Todos los Derechos Reservados" - } - }, - "pricing": { - "pricingTitle": "Plan de Precios Simple y {{Asequible}}", - "pricingContent": "Nuestros planes flexibles están diseñados para adaptarse a su negocio. Tenemos un plan para usted.", - "monthly": "Mensual", - "annual": "Anual (ahorra un 20%)", - "billingPlansNotAvailable": "Planes de facturación no disponibles", - "features": { - "feature1": "2 Proyectos", - "feature2": "Hasta 100 suscriptores", - "feature3": "Análisis básico", - "feature4": "Tiempo de respuesta de soporte de 24 horas", - "feature5": "Asesor de marketing", - "feature6": "Integración personalizada", - "continue": "Continuar" - }, - "essentials": "Los elementos esenciales para ofrecer tu mejor trabajo a los clientes.", - "faqHeader": "Preguntas Frecuentes", - "faqSubHeader": "¿No pudimos responder a su pregunta?", - "contactUs": "Contáctanos", - "continue": "Continuar" - }, - "faq": { - "question1": "¿Cuál es el propósito de esta aplicación?", - "answer1": "Esta aplicación está diseñada para ayudar a los usuarios a gestionar sus tareas de manera eficiente proporcionando herramientas para la programación, el seguimiento del progreso y el establecimiento de recordatorios.", - "question2": "¿Cómo restablezco mi contraseña?", - "answer2": "Para restablecer tu contraseña, ve a la página de inicio de sesión y haz clic en el enlace 'Olvidé mi contraseña'. Sigue las instrucciones para recibir un correo electrónico de restablecimiento de contraseña y crear una nueva contraseña.", - "question3": "¿Puedo usar esta aplicación en varios dispositivos?", - "answer3": "Sí, la aplicación es accesible desde múltiples dispositivos, incluidos escritorios, tabletas y teléfonos inteligentes. Tus datos se sincronizarán en todos los dispositivos, garantizando una experiencia fluida." - }, - "noJobs": { - "noJobsTitle": "No hay trabajos disponibles en este momento", - "noJobsContent": "¡Vuelve más tarde!" - }, - "ourServices": { - "title": "Nuestros Servicios", - "description": "Capacitados para Ofrecerte Lo Mejor", - "details": "Desde nuestra fundación, Hng Boilerplate se ha dedicado a evolucionar constantemente para mantenerse a la vanguardia. Nuestra mentalidad ágil y nuestra búsqueda incesante de innovación garantizan que siempre estés equipado con las herramientas y estrategias más efectivas." - }, - "mission": { - "title": "Nuestra Misión y Visión", - "subtitle": "Liderando el Camino, Redefiniendo Industrias", - "description": "En Hng Boilerplate, estamos dedicados a superar tus expectativas. Nos esforzamos por entender tus necesidades y desafíos únicos, proporcionando soluciones personalizadas que generan resultados reales y potencian tu éxito." - }, - "coreValues": { - "title": "Nuestros Valores Fundamentales", - "description": "Nuestros Valores forman el núcleo de nuestra organización y definen el carácter de nuestra industria.", - "values": { - "integrity": { - "title": "Integridad", - "description": "Mantenemos los más altos estándares éticos en todo lo que hacemos, fomentando la confianza y la transparencia con nuestros clientes, socios y empleados. Creemos que la honestidad y la integridad son la base del éxito duradero." - }, - "customerCentricity": { - "title": "Enfoque en el Cliente", - "description": "Nuestros clientes están en el corazón de nuestro negocio. Nos esforzamos por entender sus necesidades, superar sus expectativas y construir relaciones duraderas basadas en la confianza y el respeto mutuo. Creemos que poner a nuestros clientes en primer lugar es la clave para el éxito a largo plazo." - }, - "innovation": { - "title": "Innovación", - "description": "Adoptamos una cultura de mejora continua y creatividad, buscando constantemente nuevas formas de evolucionar y mejorar nuestros productos, servicios y procesos. Fomentamos la experimentación y la toma de riesgos, reconociendo que la innovación es esencial para el crecimiento." - }, - "excellence": { - "title": "Excelencia", - "description": "Estamos comprometidos a ofrecer una calidad excepcional en todo lo que hacemos, desde nuestros productos y servicios hasta nuestras interacciones con los clientes y procesos internos. Buscamos la mejora continua y nos mantenemos a los más altos estándares de desempeño." - } - } + "navbar": { + "login": "Iniciar sesión", + "register": "Comenzar" + }, + "navLinks": { + "home": "Inicio", + "pricing": "Precios", + "careers": "Carreras" + }, + "login": { + "title": "Iniciar sesión", + "welcomeBack": "¡Bienvenido de nuevo, te hemos extrañado!", + "continueWithGoogle": "Continuar con Google", + "emailPlaceholder": "Ingrese dirección de correo electrónico", + "passwordPlaceholder": "Ingrese contraseña", + "rememberMe": "Recuérdame", + "forgotPassword": "¿Olvidaste tu contraseña?", + "loginButton": "Iniciar sesión", + "signInWithMagicLink": "Iniciar sesión con enlace mágico", + "noAccount": "¿No tienes una cuenta?", + "agree": "Al iniciar sesión, aceptas los", + "and": "y", + "signUp": "Regístrate", + "termsOfService": "Términos del Servicio", + "privacyPolicy": "Política de Privacidad", + "loggingIn": "Iniciando sesión..." + }, + "register": { + "signUp": "Regístrate", + "createAccountDesc": "Crea una cuenta para comenzar con nosotros.", + "continueWithGoogle": "Continuar con Google", + "firstName": "Nombre", + "firstNamePlaceholder": "Ingresa tu nombre", + "lastName": "Apellido", + "lastNamePlaceholder": "Ingresa tu apellido", + "email": "Correo electrónico", + "emailPlaceholder": "Ingresa la dirección de correo", + "password": "Contraseña", + "passwordPlaceholder": "Ingresa la contraseña", + "createAccount": "Crear cuenta", + "loggingIn": "Iniciando sesión...", + "emailVerification": "Verificación de correo electrónico", + "emailVerificationDesc": "Hemos enviado un código a tu correo {email}", + "checkSpam": "verifica tu spam si no recibes el correo", + "otpExpiresIn": "OTP expira en: {timeLeft}", + "resendCode": "¿No recibiste el código? reenviar", + "dataProcessing": "Procesaremos tus datos según lo establecido en nuestros Términos de uso, Política de privacidad y Acuerdo de procesamiento de datos", + "alreadyHaveAccount": "¿Ya tienes una cuenta? Iniciar sesión" + }, + "HomePage": { + "title": "¡Hola, mundo!" + }, + "hero": { + "headline": "Concéntrate en lo importante. Nosotros cubrimos los cimientos.", + "description": "Agiliza tus procesos con una base de código diseñada para la eficiencia y una productividad óptima.", + "cta": "Comenzar" + }, + "userSection": { + "userSectionMoreThan": "Más de 200", + "userSectionUsers": "Usuarios", + "userSectionUsage": "usan nuestro Boilerplate" + }, + "howItWorks": { + "howItWorksTitlePrefix": "Cómo Funciona:", + "howItWorksTitleHighlight": "Experimenta los beneficios de usar nuestro producto en cada paso.", + "howItWorksDescription": "Diseñamos nuestro producto para simplificar tu vida. Ofrece una solución integral. Así es como funciona y cómo te beneficia en cada etapa.", + "prebuiltTitle": "Secciones Preconstruidas", + "prebuiltDescription": "Aprovecha secciones preconstruidas como \"Características\", \"Beneficios\", \"Precios\" y \"Testimonios\" para mostrar tu producto de manera efectiva.", + "scalableTitle": "Fundación Escalable", + "scalableDescription": "Nuestro boilerplate está diseñado para crecer con tu producto. Añade fácilmente nuevas características y funcionalidades según sea necesario.", + "easyTitle": "Personalización Fácil", + "easyDescription": "Personaliza la experiencia según tus necesidades y preferencias específicas para obtener resultados óptimos." + }, + "testimonials": { + "title": "Testimonios de Clientes", + "description": "No te fíes solo de nuestra palabra: descubre lo que los usuarios reales de nuestro producto tienen que decir sobre su experiencia.", + "content": "He estado usando este servicio de alojamiento web durante más de un año y estoy realmente impresionado con el tiempo de actividad y el soporte. El sitio web nunca ha caído y el servicio al cliente siempre es rápido para ayudar con cualquier problema que tenga. ¡Altamente recomendado!" + }, + "perfectFit": { + "title": "Encuentra la Solución Perfecta", + "description": "Elige el plan de plantilla que mejor se adapte a las necesidades y presupuesto de tu proyecto. Todos los planes incluyen acceso a nuestra biblioteca completa de secciones preconstruidas y personalización mediante arrastrar y soltar.", + "cta": "Consulta Nuestro Plan de Precios" + }, + "footer": { + "boilerplate": "Plantilla", + "address": "Detalles del logo y dirección", + "newsletterSignUp": "Suscríbete al Boletín", + "subscribe": "Suscribirse", + "navigation": "Navegación", + "support": "Soporte", + "legal": "Legal", + "followUs": "Síguenos", + "privacyPolicy": "Política de Privacidad", + "termsOfUse": "Términos de Uso", + "enterYourEmail": "Introduce tu correo electrónico", + "links": { + "navigation": "Navegación", + "home": "Inicio", + "aboutUs": "Sobre Nosotros", + "career": "Carrera", + "features": "Características", + "blog": "Blog", + "status": "Estado", + "support": "Soporte", + "helpCenter": "Centro de Ayuda", + "faq": "FAQ", + "waitingList": "Lista de Espera", + "pricingExperience": "Experiencia de Precios", + "contactUs": "Contáctanos", + "legal": "Legal", + "privacyPolicy": "Política de Privacidad", + "termsAndConditions": "Términos y Condiciones" + }, + "social": { + "facebook": "Facebook", + "instagram": "Instagram", + "linkedin": "LinkedIn", + "youtube": "YouTube" + }, + "footerBottom": { + "privacyPolicy": "Política de Privacidad", + "termsOfUse": "Términos de Uso", + "copyright": "2024 Todos los Derechos Reservados" + } + }, + "pricing": { + "pricingTitle": "Plan de Precios Simple y {{Asequible}}", + "pricingContent": "Nuestros planes flexibles están diseñados para adaptarse a su negocio. Tenemos un plan para usted.", + "monthly": "Mensual", + "annual": "Anual (ahorra un 20%)", + "billingPlansNotAvailable": "Planes de facturación no disponibles", + "features": { + "feature1": "2 Proyectos", + "feature2": "Hasta 100 suscriptores", + "feature3": "Análisis básico", + "feature4": "Tiempo de respuesta de soporte de 24 horas", + "feature5": "Asesor de marketing", + "feature6": "Integración personalizada", + "continue": "Continuar" + }, + "essentials": "Los elementos esenciales para ofrecer tu mejor trabajo a los clientes.", + "faqHeader": "Preguntas Frecuentes", + "faqSubHeader": "¿No pudimos responder a su pregunta?", + "contactUs": "Contáctanos", + "continue": "Continuar" + }, + "faq": { + "question1": "¿Cuál es el propósito de esta aplicación?", + "answer1": "Esta aplicación está diseñada para ayudar a los usuarios a gestionar sus tareas de manera eficiente proporcionando herramientas para la programación, el seguimiento del progreso y el establecimiento de recordatorios.", + "question2": "¿Cómo restablezco mi contraseña?", + "answer2": "Para restablecer tu contraseña, ve a la página de inicio de sesión y haz clic en el enlace 'Olvidé mi contraseña'. Sigue las instrucciones para recibir un correo electrónico de restablecimiento de contraseña y crear una nueva contraseña.", + "question3": "¿Puedo usar esta aplicación en varios dispositivos?", + "answer3": "Sí, la aplicación es accesible desde múltiples dispositivos, incluidos escritorios, tabletas y teléfonos inteligentes. Tus datos se sincronizarán en todos los dispositivos, garantizando una experiencia fluida." + }, + "noJobs": { + "noJobsTitle": "No hay trabajos disponibles en este momento", + "noJobsContent": "Regístrate en nuestro boletín para recibir actualizaciones sobre ofertas de trabajo.", + "modalTitle": "Boletín", + "button": "Regístrate en el boletín", + "placeholder": "Por favor, proporciona tu correo electrónico", + "modalButton": "Suscribirse", + "error": "Ingresa tu correo electrónico", + "subscribed": "Gracias por suscribirte" + }, + "ourServices": { + "title": "Nuestros Servicios", + "description": "Capacitados para Ofrecerte Lo Mejor", + "details": "Desde nuestra fundación, Hng Boilerplate se ha dedicado a evolucionar constantemente para mantenerse a la vanguardia. Nuestra mentalidad ágil y nuestra búsqueda incesante de innovación garantizan que siempre estés equipado con las herramientas y estrategias más efectivas." + }, + "mission": { + "title": "Nuestra Misión y Visión", + "subtitle": "Liderando el Camino, Redefiniendo Industrias", + "description": "En Hng Boilerplate, estamos dedicados a superar tus expectativas. Nos esforzamos por entender tus necesidades y desafíos únicos, proporcionando soluciones personalizadas que generan resultados reales y potencian tu éxito." + }, + "coreValues": { + "title": "Nuestros Valores Fundamentales", + "description": "Nuestros Valores forman el núcleo de nuestra organización y definen el carácter de nuestra industria.", + "values": { + "integrity": { + "title": "Integridad", + "description": "Mantenemos los más altos estándares éticos en todo lo que hacemos, fomentando la confianza y la transparencia con nuestros clientes, socios y empleados. Creemos que la honestidad y la integridad son la base del éxito duradero." + }, + "customerCentricity": { + "title": "Enfoque en el Cliente", + "description": "Nuestros clientes están en el corazón de nuestro negocio. Nos esforzamos por entender sus necesidades, superar sus expectativas y construir relaciones duraderas basadas en la confianza y el respeto mutuo. Creemos que poner a nuestros clientes en primer lugar es la clave para el éxito a largo plazo." + }, + "innovation": { + "title": "Innovación", + "description": "Adoptamos una cultura de mejora continua y creatividad, buscando constantemente nuevas formas de evolucionar y mejorar nuestros productos, servicios y procesos. Fomentamos la experimentación y la toma de riesgos, reconociendo que la innovación es esencial para el crecimiento." + }, + "excellence": { + "title": "Excelencia", + "description": "Estamos comprometidos a ofrecer una calidad excepcional en todo lo que hacemos, desde nuestros productos y servicios hasta nuestras interacciones con los clientes y procesos internos. Buscamos la mejora continua y nos mantenemos a los más altos estándares de desempeño." + } } -} \ No newline at end of file + } +} diff --git a/public/messages/fr.json b/public/messages/fr.json index c87c73a6e..559fc7368 100644 --- a/public/messages/fr.json +++ b/public/messages/fr.json @@ -1,192 +1,198 @@ { - "navbar": { - "login": "Se connecter", - "register": "Commencer" - }, - "navLinks": { - "home": "Accueil", - "pricing": "Tarification", - "careers": "Carrières" - }, - "login": { - "title": "Connexion", - "welcomeBack": "Bon retour, tu nous as manqué !", - "continueWithGoogle": "Continuer avec Google", - "emailPlaceholder": "Entrez l'adresse e-mail", - "passwordPlaceholder": "Entrez le mot de passe", - "rememberMe": "Se souvenir de moi", - "forgotPassword": "Mot de passe oublié ?", - "loginButton": "Connexion", - "signInWithMagicLink": "Se connecter avec un lien magique", - "noAccount": "Vous n'avez pas de compte ?", - "agree": "En vous connectant, vous acceptez les", - "and": "et", - "signUp": "S'inscrire", - "termsOfService": "Conditions d'utilisation", - "privacyPolicy": "Politique de confidentialité", - "loggingIn": "Connexion en cours..." - }, - "register": { - "signUp": "S'inscrire", - "createAccountDesc": "Créez un compte pour commencer avec nous.", - "continueWithGoogle": "Continuer avec Google", - "firstName": "Prénom", - "firstNamePlaceholder": "Entrez votre prénom", - "lastName": "Nom", - "lastNamePlaceholder": "Entrez votre nom", - "email": "Email", - "emailPlaceholder": "Entrez l'adresse email", - "password": "Mot de passe", - "passwordPlaceholder": "Entrez le mot de passe", - "createAccount": "Créer un compte", - "loggingIn": "Connexion en cours...", - "emailVerification": "Vérification de l'email", - "emailVerificationDesc": "Nous avons envoyé un code à votre email {email}", - "checkSpam": "vérifiez votre spam si vous ne recevez pas l'email", - "otpExpiresIn": "OTP expire dans : {timeLeft}", - "resendCode": "Vous n'avez pas reçu le code ? renvoyez", - "dataProcessing": "Nous traiterons vos données comme indiqué dans nos Conditions d'utilisation, Politique de confidentialité et Accord de traitement des données", - "alreadyHaveAccount": "Vous avez déjà un compte ? Connexion" - }, - "HomePage": { - "title": "Bonjour le monde !" - }, - "hero": { - "headline": "Concentrez-vous sur l'essentiel. Nous avons la base.", - "description": "Rationalisez vos processus avec une base de code conçue pour l'efficacité et une productivité optimale.", - "cta": "Commencer" - }, - "userSection": { - "userSectionMoreThan": "Plus de 200", - "userSectionUsers": "Utilisateurs", - "userSectionUsage": "utilisent notre Boilerplate" - }, - "howItWorks": { - "howItWorksTitlePrefix": "Comment ça marche :", - "howItWorksTitleHighlight": "Découvrez les avantages de notre produit à chaque étape.", - "howItWorksDescription": "Nous avons conçu notre produit pour simplifier votre vie. Il offre une solution complète. Voici comment il fonctionne et comment il vous profite à chaque étape.", - "prebuiltTitle": "Sections Pré-Construites", - "prebuiltDescription": "Profitez des sections pré-construites comme « Fonctionnalités », « Avantages », « Tarifs » et « Témoignages » pour présenter votre produit efficacement.", - "scalableTitle": "Fondation Évolutive", - "scalableDescription": "Notre modèle est conçu pour évoluer avec votre produit. Ajoutez facilement de nouvelles fonctionnalités selon vos besoins.", - "easyTitle": "Personnalisation Facile", - "easyDescription": "Adaptez l'expérience à vos besoins et préférences spécifiques pour des résultats maximaux." - }, - "testimonials": { - "title": "Témoignages de Clients", - "description": "Ne vous fiez pas seulement à notre parole : découvrez ce que les utilisateurs réels de notre produit ont à dire sur leur expérience.", - "content": "J'utilise ce service d'hébergement web depuis plus d'un an et je suis vraiment impressionné par le temps de disponibilité et le support. Le site web n'est jamais tombé et le service client est toujours rapide pour aider avec les problèmes que j'ai. Je recommande vivement !" - }, - "perfectFit": { - "title": "Trouvez la Solution Parfaite", - "description": "Choisissez le plan de modèle qui correspond le mieux aux besoins et au budget de votre projet. Tous les plans incluent l'accès à notre bibliothèque complète de sections pré-construites et à la personnalisation par glisser-déposer.", - "cta": "Voir Notre Plan Tarifaire" - }, - "footer": { - "boilerplate": "Gabarit", - "address": "Détails du logo et adresse", - "newsletterSignUp": "Inscrivez-vous à la Newsletter", - "subscribe": "S'abonner", - "navigation": "Navigation", - "support": "Support", - "legal": "Légal", - "followUs": "Suivez-nous", - "privacyPolicy": "Politique de Confidentialité", - "termsOfUse": "Conditions d'Utilisation", - "enterYourEmail": "Entrez votre e-mail", - "links": { - "navigation": "Navigation", - "home": "Accueil", - "aboutUs": "À Propos de Nous", - "career": "Carrière", - "features": "Fonctionnalités", - "blog": "Blog", - "status": "Statut", - "support": "Support", - "helpCenter": "Centre d'Aide", - "faq": "FAQ", - "waitingList": "Liste d'Attente", - "pricingExperience": "Expérience Tarifaire", - "contactUs": "Contactez-nous", - "legal": "Légal", - "privacyPolicy": "Politique de Confidentialité", - "termsAndConditions": "Conditions Générales" - }, - "social": { - "facebook": "Facebook", - "instagram": "Instagram", - "linkedin": "LinkedIn", - "youtube": "YouTube" - }, - "footerBottom": { - "privacyPolicy": "Politique de Confidentialité", - "termsOfUse": "Conditions d'Utilisation", - "copyright": "2024 Tous Droits Réservés" - } - }, - "pricing": { - "pricingTitle": "Plan de Tarification Simple et {{Abordable}}", - "pricingContent": "Nos plans flexibles sont conçus pour évoluer avec votre entreprise. Nous avons un plan pour vous.", - "monthly": "Mensuel", - "annual": "Annuel (économisez 20%)", - "billingPlansNotAvailable": "Plans de facturation non disponibles", - "features": { - "feature1": "2 Projets", - "feature2": "Jusqu'à 100 abonnés", - "feature3": "Analyse de base", - "feature4": "Délai de réponse du support de 24 heures", - "feature5": "Conseiller marketing", - "feature6": "Intégration personnalisée", - "continue": "Continuer" - }, - "essentials": "Les éléments essentiels pour fournir votre meilleur travail aux clients.", - "faqHeader": "Questions Fréquemment Posées", - "faqSubHeader": "Nous n'avons pas pu répondre à votre question ?", - "contactUs": "Contactez-nous", - "continue": "Continuer" - }, - "faq": { - "question1": "Quel est le but de cette application ?", - "answer1": "Cette application est conçue pour aider les utilisateurs à gérer leurs tâches efficacement en fournissant des outils pour la planification, le suivi des progrès et la définition de rappels.", - "question2": "Comment réinitialiser mon mot de passe ?", - "answer2": "Pour réinitialiser votre mot de passe, allez sur la page de connexion et cliquez sur le lien 'Mot de passe oublié'. Suivez les instructions pour recevoir un e-mail de réinitialisation de mot de passe et créer un nouveau mot de passe.", - "question3": "Puis-je utiliser cette application sur plusieurs appareils ?", - "answer3": "Oui, l'application est accessible depuis plusieurs appareils, y compris les ordinateurs de bureau, les tablettes et les smartphones. Vos données seront synchronisées sur tous les appareils, garantissant une expérience fluide." - }, - "noJobs": { - "noJobsTitle": "Aucun emploi disponible pour le moment", - "noJobsContent": "Revenez plus tard !" - }, - "ourServices": { - "title": "Nos Services", - "description": "Formés pour Vous Offrir le Meilleur", - "details": "Depuis notre création, Hng Boilerplate est dédié à évoluer constamment pour rester en avance. Notre état d’esprit agile et notre quête incessante d'innovation garantissent que vous disposez toujours des outils et des stratégies les plus efficaces." - }, - "mission": { - "title": "Notre Mission & Vision", - "subtitle": "Ouvrir la Voie, Redéfinir les Industries", - "description": "Chez Hng Boilerplate, nous sommes dédiés à dépasser vos attentes. Nous nous efforçons de comprendre vos besoins et défis uniques, en fournissant des solutions sur mesure qui génèrent des résultats réels et favorisent votre succès." - }, - "coreValues": { - "title": "Nos Valeurs Fondamentales", - "description": "Nos Valeurs forment le cœur de notre organisation et définissent le caractère de notre secteur.", - "values": { - "integrity": { - "title": "Intégrité", - "description": "Nous maintenons les plus hauts standards éthiques dans tout ce que nous faisons, favorisant la confiance et la transparence avec nos clients, partenaires et employés. Nous croyons que l'honnêteté et l'intégrité sont les fondements d'un succès durable." - }, - "customerCentricity": { - "title": "Centricité Client", - "description": "Nos clients sont au cœur de notre activité. Nous nous efforçons de comprendre leurs besoins, de dépasser leurs attentes et de construire des relations durables basées sur la confiance et le respect mutuel. Nous croyons que placer nos clients en premier est la clé du succès à long terme." - }, - "innovation": { - "title": "Innovation", - "description": "Nous adoptons une culture d'amélioration continue et de créativité, cherchant constamment de nouvelles façons d'évoluer et d'améliorer nos produits, services et processus. Nous encourageons l'expérimentation et la prise de risques, reconnaissant que l'innovation est essentielle pour la croissance." - }, - "excellence": { - "title": "Excellence", - "description": "Nous nous engageons à offrir une qualité exceptionnelle dans tout ce que nous faisons, de nos produits et services à nos interactions avec les clients et nos processus internes. Nous visons l'amélioration continue et nous nous tenons aux plus hauts standards de performance." - } - } + "navbar": { + "login": "Se connecter", + "register": "Commencer" + }, + "navLinks": { + "home": "Accueil", + "pricing": "Tarification", + "careers": "Carrières" + }, + "login": { + "title": "Connexion", + "welcomeBack": "Bon retour, tu nous as manqué !", + "continueWithGoogle": "Continuer avec Google", + "emailPlaceholder": "Entrez l'adresse e-mail", + "passwordPlaceholder": "Entrez le mot de passe", + "rememberMe": "Se souvenir de moi", + "forgotPassword": "Mot de passe oublié ?", + "loginButton": "Connexion", + "signInWithMagicLink": "Se connecter avec un lien magique", + "noAccount": "Vous n'avez pas de compte ?", + "agree": "En vous connectant, vous acceptez les", + "and": "et", + "signUp": "S'inscrire", + "termsOfService": "Conditions d'utilisation", + "privacyPolicy": "Politique de confidentialité", + "loggingIn": "Connexion en cours..." + }, + "register": { + "signUp": "S'inscrire", + "createAccountDesc": "Créez un compte pour commencer avec nous.", + "continueWithGoogle": "Continuer avec Google", + "firstName": "Prénom", + "firstNamePlaceholder": "Entrez votre prénom", + "lastName": "Nom", + "lastNamePlaceholder": "Entrez votre nom", + "email": "Email", + "emailPlaceholder": "Entrez l'adresse email", + "password": "Mot de passe", + "passwordPlaceholder": "Entrez le mot de passe", + "createAccount": "Créer un compte", + "loggingIn": "Connexion en cours...", + "emailVerification": "Vérification de l'email", + "emailVerificationDesc": "Nous avons envoyé un code à votre email {email}", + "checkSpam": "vérifiez votre spam si vous ne recevez pas l'email", + "otpExpiresIn": "OTP expire dans : {timeLeft}", + "resendCode": "Vous n'avez pas reçu le code ? renvoyez", + "dataProcessing": "Nous traiterons vos données comme indiqué dans nos Conditions d'utilisation, Politique de confidentialité et Accord de traitement des données", + "alreadyHaveAccount": "Vous avez déjà un compte ? Connexion" + }, + "HomePage": { + "title": "Bonjour le monde !" + }, + "hero": { + "headline": "Concentrez-vous sur l'essentiel. Nous avons la base.", + "description": "Rationalisez vos processus avec une base de code conçue pour l'efficacité et une productivité optimale.", + "cta": "Commencer" + }, + "userSection": { + "userSectionMoreThan": "Plus de 200", + "userSectionUsers": "Utilisateurs", + "userSectionUsage": "utilisent notre Boilerplate" + }, + "howItWorks": { + "howItWorksTitlePrefix": "Comment ça marche :", + "howItWorksTitleHighlight": "Découvrez les avantages de notre produit à chaque étape.", + "howItWorksDescription": "Nous avons conçu notre produit pour simplifier votre vie. Il offre une solution complète. Voici comment il fonctionne et comment il vous profite à chaque étape.", + "prebuiltTitle": "Sections Pré-Construites", + "prebuiltDescription": "Profitez des sections pré-construites comme « Fonctionnalités », « Avantages », « Tarifs » et « Témoignages » pour présenter votre produit efficacement.", + "scalableTitle": "Fondation Évolutive", + "scalableDescription": "Notre modèle est conçu pour évoluer avec votre produit. Ajoutez facilement de nouvelles fonctionnalités selon vos besoins.", + "easyTitle": "Personnalisation Facile", + "easyDescription": "Adaptez l'expérience à vos besoins et préférences spécifiques pour des résultats maximaux." + }, + "testimonials": { + "title": "Témoignages de Clients", + "description": "Ne vous fiez pas seulement à notre parole : découvrez ce que les utilisateurs réels de notre produit ont à dire sur leur expérience.", + "content": "J'utilise ce service d'hébergement web depuis plus d'un an et je suis vraiment impressionné par le temps de disponibilité et le support. Le site web n'est jamais tombé et le service client est toujours rapide pour aider avec les problèmes que j'ai. Je recommande vivement !" + }, + "perfectFit": { + "title": "Trouvez la Solution Parfaite", + "description": "Choisissez le plan de modèle qui correspond le mieux aux besoins et au budget de votre projet. Tous les plans incluent l'accès à notre bibliothèque complète de sections pré-construites et à la personnalisation par glisser-déposer.", + "cta": "Voir Notre Plan Tarifaire" + }, + "footer": { + "boilerplate": "Gabarit", + "address": "Détails du logo et adresse", + "newsletterSignUp": "Inscrivez-vous à la Newsletter", + "subscribe": "S'abonner", + "navigation": "Navigation", + "support": "Support", + "legal": "Légal", + "followUs": "Suivez-nous", + "privacyPolicy": "Politique de Confidentialité", + "termsOfUse": "Conditions d'Utilisation", + "enterYourEmail": "Entrez votre e-mail", + "links": { + "navigation": "Navigation", + "home": "Accueil", + "aboutUs": "À Propos de Nous", + "career": "Carrière", + "features": "Fonctionnalités", + "blog": "Blog", + "status": "Statut", + "support": "Support", + "helpCenter": "Centre d'Aide", + "faq": "FAQ", + "waitingList": "Liste d'Attente", + "pricingExperience": "Expérience Tarifaire", + "contactUs": "Contactez-nous", + "legal": "Légal", + "privacyPolicy": "Politique de Confidentialité", + "termsAndConditions": "Conditions Générales" + }, + "social": { + "facebook": "Facebook", + "instagram": "Instagram", + "linkedin": "LinkedIn", + "youtube": "YouTube" + }, + "footerBottom": { + "privacyPolicy": "Politique de Confidentialité", + "termsOfUse": "Conditions d'Utilisation", + "copyright": "2024 Tous Droits Réservés" + } + }, + "pricing": { + "pricingTitle": "Plan de Tarification Simple et {{Abordable}}", + "pricingContent": "Nos plans flexibles sont conçus pour évoluer avec votre entreprise. Nous avons un plan pour vous.", + "monthly": "Mensuel", + "annual": "Annuel (économisez 20%)", + "billingPlansNotAvailable": "Plans de facturation non disponibles", + "features": { + "feature1": "2 Projets", + "feature2": "Jusqu'à 100 abonnés", + "feature3": "Analyse de base", + "feature4": "Délai de réponse du support de 24 heures", + "feature5": "Conseiller marketing", + "feature6": "Intégration personnalisée", + "continue": "Continuer" + }, + "essentials": "Les éléments essentiels pour fournir votre meilleur travail aux clients.", + "faqHeader": "Questions Fréquemment Posées", + "faqSubHeader": "Nous n'avons pas pu répondre à votre question ?", + "contactUs": "Contactez-nous", + "continue": "Continuer" + }, + "faq": { + "question1": "Quel est le but de cette application ?", + "answer1": "Cette application est conçue pour aider les utilisateurs à gérer leurs tâches efficacement en fournissant des outils pour la planification, le suivi des progrès et la définition de rappels.", + "question2": "Comment réinitialiser mon mot de passe ?", + "answer2": "Pour réinitialiser votre mot de passe, allez sur la page de connexion et cliquez sur le lien 'Mot de passe oublié'. Suivez les instructions pour recevoir un e-mail de réinitialisation de mot de passe et créer un nouveau mot de passe.", + "question3": "Puis-je utiliser cette application sur plusieurs appareils ?", + "answer3": "Oui, l'application est accessible depuis plusieurs appareils, y compris les ordinateurs de bureau, les tablettes et les smartphones. Vos données seront synchronisées sur tous les appareils, garantissant une expérience fluide." + }, + "noJobs": { + "noJobsTitle": "Aucun emploi disponible pour le moment", + "noJobsContent": "Inscrivez-vous à notre newsletter pour recevoir des mises à jour sur les offres d'emploi.", + "modalTitle": "Newsletter", + "button": "Regístrate en el boletín", + "placeholder": "Veuillez fournir votre adresse e-mail", + "modalButton": "S'abonner", + "error": "Veuillez fournir votre adresse e-mail", + "subscribed": "Merci pour votre abonnement" + }, + "ourServices": { + "title": "Nos Services", + "description": "Formés pour Vous Offrir le Meilleur", + "details": "Depuis notre création, Hng Boilerplate est dédié à évoluer constamment pour rester en avance. Notre état d’esprit agile et notre quête incessante d'innovation garantissent que vous disposez toujours des outils et des stratégies les plus efficaces." + }, + "mission": { + "title": "Notre Mission & Vision", + "subtitle": "Ouvrir la Voie, Redéfinir les Industries", + "description": "Chez Hng Boilerplate, nous sommes dédiés à dépasser vos attentes. Nous nous efforçons de comprendre vos besoins et défis uniques, en fournissant des solutions sur mesure qui génèrent des résultats réels et favorisent votre succès." + }, + "coreValues": { + "title": "Nos Valeurs Fondamentales", + "description": "Nos Valeurs forment le cœur de notre organisation et définissent le caractère de notre secteur.", + "values": { + "integrity": { + "title": "Intégrité", + "description": "Nous maintenons les plus hauts standards éthiques dans tout ce que nous faisons, favorisant la confiance et la transparence avec nos clients, partenaires et employés. Nous croyons que l'honnêteté et l'intégrité sont les fondements d'un succès durable." + }, + "customerCentricity": { + "title": "Centricité Client", + "description": "Nos clients sont au cœur de notre activité. Nous nous efforçons de comprendre leurs besoins, de dépasser leurs attentes et de construire des relations durables basées sur la confiance et le respect mutuel. Nous croyons que placer nos clients en premier est la clé du succès à long terme." + }, + "innovation": { + "title": "Innovation", + "description": "Nous adoptons une culture d'amélioration continue et de créativité, cherchant constamment de nouvelles façons d'évoluer et d'améliorer nos produits, services et processus. Nous encourageons l'expérimentation et la prise de risques, reconnaissant que l'innovation est essentielle pour la croissance." + }, + "excellence": { + "title": "Excellence", + "description": "Nous nous engageons à offrir une qualité exceptionnelle dans tout ce que nous faisons, de nos produits et services à nos interactions avec les clients et nos processus internes. Nous visons l'amélioration continue et nous nous tenons aux plus hauts standards de performance." + } } -} \ No newline at end of file + } +} diff --git a/src/actions/roles-and-permissions.ts b/src/actions/roles-and-permissions.ts index df047dcd5..d326e26bf 100644 --- a/src/actions/roles-and-permissions.ts +++ b/src/actions/roles-and-permissions.ts @@ -154,7 +154,7 @@ export const updateRole = async ( try { const response = await axios.put( - `${apiUrl}/organisations/${currentOrgId}/roles/${roleId}`, + `${apiUrl}/api/v1/organisations/${currentOrgId}/roles/${roleId}`, payload, { headers: { diff --git a/src/app/(auth-routes)/login/page.tsx b/src/app/(auth-routes)/login/page.tsx index 553cfd797..269782fdb 100644 --- a/src/app/(auth-routes)/login/page.tsx +++ b/src/app/(auth-routes)/login/page.tsx @@ -283,14 +283,14 @@ const Login = () => { {t("agree")}{" "} {t("termsOfService")} {" "} {t("and")}{" "} {t("privacyPolicy")} diff --git a/src/app/(auth-routes)/register/page.tsx b/src/app/(auth-routes)/register/page.tsx index cb38f779f..fcbf6e79d 100644 --- a/src/app/(auth-routes)/register/page.tsx +++ b/src/app/(auth-routes)/register/page.tsx @@ -305,7 +305,7 @@ const Register = () => { emailRegex.test(email); + const [isOpen, setIsOpen] = useState(false); + + const handleSubmit = async () => { + if (!isValidEmail(email)) { + setError(true); + + toast({ + title: "Error", + description: toastDesc, + variant: "destructive", + }); + return; + } + setLoading(true); + + const apiUrl = await getApiUrl(); + await axios + .post( + `${apiUrl}/api/v1/newsletter-subscription`, + { email }, + { + headers: { + "Content-Type": "application/json", + }, + }, + ) + .then(() => { + toast({ + title: "Thank you for subscribing!", + description: + "You've successfully joined our newsletter. We're excited to keep you updated with our latest news and offers!", + variant: "default", + }); + setIsOpen(false); + setLoading(false); + setEmail(""); + setIsSubscribed(true); + }) + .catch((error) => { + if (error?.response) { + const errorData = error.response.data; + if (errorData.status_code === 400) { + toast({ + title: "You're already subscribed!", + description: + "It looks like you're already on our list. Thank you for being part of our community!", + variant: "default", + }); + } else { + toast({ + title: "Oops! Something went wrong.", + description: + "We encountered an issue while trying to subscribe you to our newsletter. Check your internet connection or contact support if the problem persists.", + variant: "destructive", + }); + setLoading(false); + } + setLoading(false); + return; + } + }) + .finally(() => { + setLoading(false); + }); + }; + return (
- - - - - - - - - - - + No Job

{t("noJobsTitle")}

- {t("noJobsContent")} + {isSubscribed ? t("subscribed") : t("noJobsContent")}

+ + {!isSubscribed && ( + + +
+ +
+
+ + + + {t("modalTitle")} + {t("noJobsContent")} + + +
+
+
+ setEmail(event.target.value)} + value={email} + onBlur={() => + email.length === 0 ? setError(true) : setError(false) + } + /> +
+ + {loading ? ( + + ) : ( + t("modalButton") + )} + +
+ {error && ( + + {t("error")} + + )} +
+
+
+ )}
); } diff --git a/src/app/(landing-routes)/help-center/page.tsx b/src/app/(landing-routes)/help-center/page.tsx index 26ff2313b..768041179 100644 --- a/src/app/(landing-routes)/help-center/page.tsx +++ b/src/app/(landing-routes)/help-center/page.tsx @@ -114,17 +114,6 @@ const HelpCenter = () => { > Frequently Asked Questions - -

- We couldn't answer your question? -

- - - Contact us - diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx index c818f5fa5..4b5a99a26 100644 --- a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/password.tsx @@ -1,64 +1,52 @@ "use client"; +import { zodResolver } from "@hookform/resolvers/zod"; import axios from "axios"; import { useSession } from "next-auth/react"; -import { ChangeEvent, useState } from "react"; +import { useState } from "react"; +import { useForm } from "react-hook-form"; import { getApiUrl } from "~/actions/getApiUrl"; import CustomButton from "~/components/common/common-button/common-button"; -import CustomInput from "~/components/common/input/input"; import PasswordSuccessfulModal from "~/components/common/modals/password-successful"; import { toast } from "~/components/ui/use-toast"; +import { cn } from "~/lib/utils"; +import { passwordSchema, type PasswordFormData } from "./schema"; const Password = () => { const { data } = useSession(); const [open, setOpen] = useState(false); - const [isPending, setIsPending] = useState(false); - const [formData, setFormData] = useState({ - oldPassword: "", - password: "", - confirmPassword: "", + const { + register, + handleSubmit, + reset, + formState: { errors, isValid }, + } = useForm({ + resolver: zodResolver(passwordSchema), + mode: "all", }); - const formDataHandler = ( - event: ChangeEvent, - ) => { - setFormData((previous) => ({ - ...previous, - [event.target.name]: event.target.value, - })); - }; - const submit = async () => { - if (formData.password !== formData.confirmPassword) { - return toast({ - title: "Warning!", - description: "Password does not match", - }); - } + const submitHandler = async (values: PasswordFormData) => { try { setIsPending(true); - const baseUrl = await getApiUrl(); - const API_URL = `${baseUrl}/api/v1/auth/change-password`; - const payload = { - oldPassword: formData.oldPassword, - newPassword: formData.password, + old_password: values.currentPassword, + new_password: values.newPassword, + confirm_new_password: values.confirmPassword, }; + const baseUrl = await getApiUrl(); + const API_URL = `${baseUrl}/api/v1/auth/password`; - await axios.post(API_URL, payload, { + await axios.put(API_URL, payload, { headers: { Authorization: `Bearer ${data?.access_token}`, }, }); setOpen(true); - setFormData({ - oldPassword: "", - password: "", - confirmPassword: "", - }); + reset({ currentPassword: "", newPassword: "", confirmPassword: "" }); } catch (error) { const errorMessage = (error as HttpError)?.response?.data?.message; toast({ @@ -71,9 +59,6 @@ const Password = () => { } }; - const disabled = - !formData.confirmPassword || !formData.oldPassword || !formData.password; - return (
@@ -84,50 +69,96 @@ const Password = () => { Update password for enhanced account security

-
+
- - - +
+
+ +
+ +
+
+ {errors.currentPassword && ( +

+ {errors.currentPassword?.message} +

+ )} +
+
+
+ +
+ +
+
+ {errors.newPassword && ( +

+ {errors.newPassword?.message} +

+ )} +
+
+
+ +
+ +
+
+ {errors.confirmPassword && ( +

+ {errors.confirmPassword?.message} +

+ )} +
- setOpen(false)}> + setOpen(false)} + > Cancel Update Password
-
+ setOpen(!open)} show={open} />
); diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts new file mode 100644 index 000000000..96f806966 --- /dev/null +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/account/_component.tsx/schema.ts @@ -0,0 +1,19 @@ +import * as z from "zod"; + +export const passwordSchema = z + .object({ + currentPassword: z + .string() + .min(8, "Current password must be at least 8 characters long"), + newPassword: z + .string() + .min(8, "New password must be at least 8 characters long"), + confirmPassword: z + .string() + .min(8, "Confirm password must be at least 8 characters long"), + }) + .refine((data) => data.newPassword === data.confirmPassword, { + message: "Passwords do not match", + path: ["confirmPassword"], + }); +export type PasswordFormData = z.infer; diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx index 7c23e7cf6..40383c85b 100644 --- a/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/language-and-region/page.tsx @@ -34,11 +34,8 @@ const formatTimeZone = () => { const sign = offset >= 0 ? "+" : "-"; const formattedOffset = `UTC${sign}${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`; - // Create a simplified value for the timezone (e.g., "utc+0" or "utc-8") - const value = `utc${sign}${hours}`; - return { - value: value, + value: `(${formattedOffset}) ${tz.replace("_", " ")}`, label: `(${formattedOffset}) ${tz.replace("_", " ")}`, }; }); diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/members/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/members/page.tsx index be3a54d02..9fa6ea504 100644 --- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/members/page.tsx +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/members/page.tsx @@ -2,6 +2,7 @@ import { AxiosResponse } from "axios"; import { EllipsisIcon } from "lucide-react"; +import Link from "next/link"; import { useState } from "react"; import CustomButton from "~/components/common/common-button/common-button"; @@ -184,7 +185,11 @@ const Members = () => {

On the Free plan all members in a workspace are administrators. Upgrade to a paid plan to add the ability to assign or remove - administrator roles. Go to Plans + administrator roles.{" "} + + {" "} + Go to Plans +

diff --git a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx index b52da934e..35330829d 100644 --- a/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx +++ b/src/app/dashboard/(admin)/admin/(settings)/settings/organization/roles-and-permissions/create-role/page.tsx @@ -3,12 +3,12 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { ChevronLeftIcon } from "lucide-react"; import Link from "next/link"; +import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { createRole, getPermissions } from "~/actions/roles-and-permissions"; -import CustomButton from "~/components/common/common-button/common-button"; import RolePermissionsCreationModal from "~/components/common/modals/roles-permissions-creation"; import LoadingSpinner from "~/components/miscellaneous/loading-spinner"; import { @@ -122,6 +122,7 @@ const transformPermissions = (apiResponse: APIPermissions[]) => { }; function CreateNewRolePage() { + const router = useRouter(); const [currentOrgId] = useLocalStorage("current_orgid", ""); const [isSaving, setIsSaving] = useState(false); const [permissions, setPermissions] = useState< @@ -136,8 +137,9 @@ function CreateNewRolePage() { handleSubmit, formState: { errors }, setValue, + trigger, } = useForm({ - mode: "onBlur", + mode: "onChange", resolver: zodResolver(roleSchema), }); @@ -164,6 +166,12 @@ function CreateNewRolePage() { } }, [permissions, setValue]); + useEffect(() => { + if (permissionOptions && permissionOptions.length > 0) { + setPermissions(permissionOptions[0].permissions); + } + }, [permissionOptions]); + const onValid = async (values: UseFormInputs) => { setIsSaving(true); try { @@ -176,6 +184,7 @@ function CreateNewRolePage() { "You have successfully created the new role Role Name. You can now assign this role to team members and manage their permissions in the Roles & Permissions section.", variant: "default", }); + router.push(""); } setIsSaving(false); }) @@ -199,6 +208,10 @@ function CreateNewRolePage() { } }; + const handleInputChange = (field: keyof UseFormInputs) => { + trigger(field); + }; + return (
@@ -229,17 +242,28 @@ function CreateNewRolePage() { handleInputChange("name"), + })} + className={`!w-full rounded-md border ${ + errors.name ? "border-red-500" : "border-border" + } bg-transparent px-3 py-2 shadow-sm outline-none focus:border-primary focus:ring-ring md:w-56`} /> + {errors.name && ( +

{errors.name.message}

+ )}
+
{errors.permissions && ( -

Please select valid permissions.

+

+ {errors.permissions.message} +

)}
@@ -271,9 +297,18 @@ function CreateNewRolePage() {