contact language updated
This commit is contained in:
commit
b74bf5ed59
@ -180,3 +180,7 @@ This article provides general information only. Consult qualified immigration co
|
||||
];
|
||||
|
||||
export default blogs;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,48 +1,64 @@
|
||||
import React from "react";
|
||||
import blogs from '../../api/blogs'
|
||||
import blogs from '../../api/blogs';
|
||||
import Link from "next/link";
|
||||
import SectionTitle from "../SectionTitle/SectionTitle";
|
||||
import Image from "next/image";
|
||||
import { useTranslation } from 'next-i18next';
|
||||
import blog from "../../utils/constant.utils";
|
||||
|
||||
|
||||
const ClickHandler = () => {
|
||||
window.scrollTo(10, 0);
|
||||
}
|
||||
const ClickHandler = () => window.scrollTo(10, 0);
|
||||
|
||||
const BlogSection = () => {
|
||||
return (
|
||||
<section className="wpo-blog-section section-padding" id="blog">
|
||||
<div className="container">
|
||||
<SectionTitle subTitle={'Our Blog'} Title={'Latest News & Press'} />
|
||||
<div className="wpo-blog-items">
|
||||
<div className="row">
|
||||
{blogs.map((blog, bl) => (
|
||||
<div className="col col-lg-4 col-md-6 col-12" key={bl}>
|
||||
<div className="wpo-blog-item">
|
||||
<div className="wpo-blog-img">
|
||||
<Image src={blog.screens} alt="" />
|
||||
</div>
|
||||
<div className="wpo-blog-content">
|
||||
{/* <ul>
|
||||
<li><a href="blog-single.html">{blog.create_at}</a></li>
|
||||
<li>by: <Link onClick={ClickHandler} href={'/blog-single/[slug]'} as={`/blog-single/${blog.slug}`}>{blog.authorTitle}</Link></li>
|
||||
</ul> */}
|
||||
<h2><Link onClick={ClickHandler} href={'/blog-single/[slug]'} as={`/blog-single/${blog.slug}`}>{blog.title}</Link></h2>
|
||||
<div className="entry-details">
|
||||
<p>
|
||||
{blog.para}
|
||||
</p>
|
||||
<Link className="more" onClick={ClickHandler} href={'/blog-single/[slug]'} as={`/blog-single/${blog.slug}`}>Know More</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
const { t } = useTranslation('blog');
|
||||
|
||||
export default BlogSection;
|
||||
return (
|
||||
<section className="wpo-blog-section section-padding" id="blog">
|
||||
<div className="container">
|
||||
<SectionTitle
|
||||
subTitle={t('sectionSubTitle')}
|
||||
Title={t('sectionTitle')}
|
||||
/>
|
||||
<div className="wpo-blog-items">
|
||||
<div className="row">
|
||||
{blog.map((blog) => {
|
||||
const blogTexts = t(`posts.${blog.slug}`, { returnObjects: true });
|
||||
return (
|
||||
<div className="col col-lg-4 col-md-6 col-12" key={blog.id}>
|
||||
<div className="wpo-blog-item">
|
||||
<div className="wpo-blog-img">
|
||||
<Image src={blog.screens} alt={blogTexts.title} />
|
||||
</div>
|
||||
<div className="wpo-blog-content">
|
||||
<h2>
|
||||
<Link
|
||||
onClick={ClickHandler}
|
||||
href={'/blog-single/[slug]'}
|
||||
as={`/blog-single/${blog.slug}`}
|
||||
>
|
||||
{blogTexts.title}
|
||||
</Link>
|
||||
</h2>
|
||||
<div className="entry-details">
|
||||
<p>{blogTexts.para}</p>
|
||||
<Link
|
||||
className="more"
|
||||
onClick={ClickHandler}
|
||||
href={'/blog-single/[slug]'}
|
||||
as={`/blog-single/${blog.slug}`}
|
||||
>
|
||||
{t('knowMore')}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default BlogSection;
|
||||
|
||||
@ -1,72 +1,79 @@
|
||||
import React from "react";
|
||||
import Link from 'next/link';
|
||||
import Link from "next/link";
|
||||
import SectionTitle from "../SectionTitle/SectionTitle";
|
||||
import Campaign from '../../api/campaign';
|
||||
import Image from "next/image";
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
const ClickHandler = () => {
|
||||
if (typeof window !== "undefined") {
|
||||
window.scrollTo(10, 0);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const ServicesSection = (props) => {
|
||||
return (
|
||||
<div className={`wpo-campaign-area section-padding ${props.cmClass}`}>
|
||||
<div className="container">
|
||||
<SectionTitle subTitle={'Campaign'} Title={'Our Upcoming Campaign'} />
|
||||
<div className="wpo-campaign-wrap">
|
||||
<div className="row">
|
||||
{Campaign.map((campaign, cam) => (
|
||||
<div className="col-lg-4 col-md-6 col-12" key={cam}>
|
||||
<div className="wpo-campaign-single">
|
||||
<div className="wpo-campaign-item">
|
||||
<div className="wpo-campaign-img">
|
||||
<Image src={campaign.sImgS} alt="" />
|
||||
</div>
|
||||
<div className="wpo-campaign-content">
|
||||
<div className="wpo-campaign-text-top data-theem">
|
||||
{/* <p><i className="fi flaticon-calendar"></i> {campaign.date}</p> */}
|
||||
{/* <h3 style={{
|
||||
whiteSpace: 'nowrap',
|
||||
overflow: 'hidden',
|
||||
textOverflow: 'ellipsis',
|
||||
width: '100%',
|
||||
display: 'block',
|
||||
}}> */}
|
||||
<h3>
|
||||
<Link
|
||||
onClick={ClickHandler}
|
||||
href={`/services/${campaign.slug}`}
|
||||
>
|
||||
{campaign.sTitle}
|
||||
</Link>
|
||||
const { t } = useTranslation("services");
|
||||
|
||||
// campaigns from translations
|
||||
const campaigns = t("campaigns", { returnObjects: true });
|
||||
|
||||
return (
|
||||
<div className={`wpo-campaign-area section-padding ${props.cmClass || ""}`}>
|
||||
<div className="container">
|
||||
{/* Section Title */}
|
||||
<SectionTitle
|
||||
subTitle={t("page.subtitle")}
|
||||
Title={t("page.title")}
|
||||
/>
|
||||
|
||||
</h3>
|
||||
<p>
|
||||
{campaign.description}
|
||||
</p>
|
||||
<div className="services-btn">
|
||||
<Link
|
||||
onClick={ClickHandler}
|
||||
href={`/services/${campaign.slug}`}
|
||||
className="theme-btn full-width-btn"
|
||||
>
|
||||
View Services
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
<div className="wpo-campaign-wrap">
|
||||
<div className="row">
|
||||
{campaigns.map((campaign, cam) => (
|
||||
<div className="col-lg-4 col-md-6 col-12" key={cam}>
|
||||
<div className="wpo-campaign-single">
|
||||
<div className="wpo-campaign-item">
|
||||
<div className="wpo-campaign-img">
|
||||
<Image
|
||||
src={campaign.sImgS}
|
||||
alt={campaign.sTitle}
|
||||
width={400}
|
||||
height={250}
|
||||
unoptimized
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="wpo-campaign-content">
|
||||
<div className="wpo-campaign-text-top data-theem">
|
||||
<h3>
|
||||
<Link
|
||||
onClick={ClickHandler}
|
||||
href={`/services/${campaign.slug}`}
|
||||
>
|
||||
{campaign.sTitle}
|
||||
</Link>
|
||||
</h3>
|
||||
|
||||
<p>{campaign.description}</p>
|
||||
|
||||
<div className="services-btn">
|
||||
<Link
|
||||
onClick={ClickHandler}
|
||||
href={`/services/${campaign.slug}`}
|
||||
className="theme-btn full-width-btn"
|
||||
>
|
||||
{t("page.viewButton")}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default ServicesSection;
|
||||
|
||||
@ -6,7 +6,7 @@ module.exports = {
|
||||
locales: ['en', 'es'],
|
||||
localeDetection: false,
|
||||
},
|
||||
ns: ['common', 'menu', 'homeHero', 'home4Card', '(home)/homeAbout', '(home)/homeFeature', '(home)/testimonial', '(home)/homeCalltoAction', 'ourMission', 'racialJustice', 'contact', 'ourApproach', 'ourStory', 'aboutService', 'aboutMission', 'aboutRacial', 'aboutDonor' ],
|
||||
ns: ['common', 'menu', 'homeHero', 'home4Card'],
|
||||
defaultNS: 'common',
|
||||
// localePath: './public/locales',
|
||||
};
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
// pages/blog/[slug].js
|
||||
import React, { Fragment } from 'react';
|
||||
import { useRouter } from 'next/router';
|
||||
import blogs from '../../api/blogs';
|
||||
import { useTranslation } from 'next-i18next';
|
||||
import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
|
||||
import blogs from '../../api/blogs'; // Static metadata like images, author, etc.
|
||||
import Link from 'next/link';
|
||||
import PageTitle from '../../components/pagetitle/PageTitle';
|
||||
import Navbar2 from '../../components/Navbar2/Navbar2';
|
||||
@ -8,17 +11,25 @@ import Footer from '../../components/footer/Footer';
|
||||
import Scrollbar from '../../components/scrollbar/scrollbar';
|
||||
import Image from 'next/image';
|
||||
|
||||
const BlogSingle = (props) => {
|
||||
const BlogSingle = () => {
|
||||
const router = useRouter();
|
||||
const { slug } = router.query;
|
||||
|
||||
const BlogDetails = blogs.find(blog => blog.slug === slug);
|
||||
const { t } = useTranslation('blog');
|
||||
|
||||
if (!BlogDetails) {
|
||||
if (!slug) return null; // Avoid hydration mismatch on first load
|
||||
|
||||
// Localized content from blog.json
|
||||
const blogContent = t(`posts.${slug}`, { returnObjects: true });
|
||||
|
||||
// Static metadata (images, date, author)
|
||||
const blogMeta = blogs.find(blog => blog.slug === slug);
|
||||
|
||||
if (!blogMeta || !blogContent?.title) {
|
||||
return (
|
||||
<div className="container text-center py-5">
|
||||
<h2>Blog not found!</h2>
|
||||
<Link href="/blog">Back to Blog</Link>
|
||||
<Link href="/blog">← Back to Blog</Link>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -26,37 +37,34 @@ const BlogSingle = (props) => {
|
||||
return (
|
||||
<Fragment>
|
||||
<Navbar2 />
|
||||
<PageTitle pageTitle={BlogDetails.title} pagesub={'Blog'} />
|
||||
<PageTitle pageTitle={blogContent.title} pagesub="Blog" />
|
||||
|
||||
<section className="wpo-blog-single-section section-padding">
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
<div className={`col col-lg-12 col-12 ${props.blRight}`}>
|
||||
<div className="col col-lg-12 col-12">
|
||||
<div className="wpo-blog-content">
|
||||
<div className={`post ${BlogDetails.blClass}`}>
|
||||
<div className={`post ${blogMeta.blClass}`}>
|
||||
<div className="entry-media">
|
||||
<div style={{ width: "100%", height: "400px", position: "relative" }}>
|
||||
<div style={{ width: '100%', height: '400px', position: 'relative' }}>
|
||||
<Image
|
||||
src={BlogDetails.blogSingleImg}
|
||||
alt={BlogDetails.title}
|
||||
src={blogMeta.blogSingleImg}
|
||||
alt={blogContent.title}
|
||||
fill
|
||||
style={{ objectFit: "cover" }}
|
||||
style={{ objectFit: 'cover' }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="entry-meta">
|
||||
<ul>
|
||||
<li><i className="fi flaticon-calendar"></i> {BlogDetails.create_at}</li>
|
||||
<li>
|
||||
<i className="fi ti-user"></i> By{' '}
|
||||
<Link href="/blog">{BlogDetails.authorTitle}</Link>
|
||||
</li>
|
||||
<li><i className="fi flaticon-calendar"></i> {blogMeta.create_at}</li>
|
||||
<li><i className="fi ti-user"></i> By <Link href="/blog">{blogMeta.authorTitle}</Link></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h2>{BlogDetails.title}</h2>
|
||||
<div dangerouslySetInnerHTML={{ __html: BlogDetails.description }}></div>
|
||||
<h2>{blogContent.title}</h2>
|
||||
<div dangerouslySetInnerHTML={{ __html: blogContent.description }} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -70,4 +78,28 @@ const BlogSingle = (props) => {
|
||||
);
|
||||
};
|
||||
|
||||
export async function getStaticPaths() {
|
||||
const locales = ['en', 'es'];
|
||||
|
||||
const paths = locales.flatMap(locale =>
|
||||
blogs.map(blog => ({
|
||||
params: { slug: blog.slug },
|
||||
locale,
|
||||
}))
|
||||
);
|
||||
|
||||
return {
|
||||
paths,
|
||||
fallback: false,
|
||||
};
|
||||
}
|
||||
|
||||
export async function getStaticProps({ locale }) {
|
||||
return {
|
||||
props: {
|
||||
...(await serverSideTranslations(locale, ['common', 'menu', 'blog'])),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export default BlogSingle;
|
||||
|
||||
@ -40,7 +40,7 @@ export default HomePage;
|
||||
export async function getStaticProps({ locale }) {
|
||||
return {
|
||||
props: {
|
||||
...(await serverSideTranslations(locale, ['common', 'menu', 'homeHero', 'home4Card', '(home)/homeAbout', '(home)/homeFeature', '(home)/testimonial', '(home)/homeCalltoAction'])), // Add 'home', 'footer', etc. if needed
|
||||
...(await serverSideTranslations(locale, ['common', 'menu', 'homeHero', 'home4Card', '(home)/homeAbout', '(home)/homeFeature', '(home)/testimonial', '(home)/homeCalltoAction', 'blog'])), // Add 'home', 'footer', etc. if needed
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@ -1,101 +1,126 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import Navbar2 from '../../components/Navbar2/Navbar2';
|
||||
import PageTitle from '../../components/pagetitle/PageTitle';
|
||||
import Scrollbar from '../../components/scrollbar/scrollbar';
|
||||
import { useRouter } from 'next/router';
|
||||
import Campaign from '../../api/campaign';
|
||||
import Footer from '../../components/footer/Footer';
|
||||
import Image from 'next/image';
|
||||
import Link from 'next/link';
|
||||
import services from '/public/images/service/service-details-banner.webp';
|
||||
import React, { Fragment } from "react";
|
||||
import Navbar2 from "../../components/Navbar2/Navbar2";
|
||||
import PageTitle from "../../components/pagetitle/PageTitle";
|
||||
import Scrollbar from "../../components/scrollbar/scrollbar";
|
||||
import Footer from "../../components/footer/Footer";
|
||||
import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
import servicesBanner from "/public/images/service/service-details-banner.webp";
|
||||
import { useTranslation } from "next-i18next";
|
||||
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
|
||||
|
||||
const ServiceDetailsPage = () => {
|
||||
const router = useRouter();
|
||||
const { slug } = router.query;
|
||||
|
||||
const service = Campaign.find(item => item.slug === slug);
|
||||
|
||||
if (!service) {
|
||||
return (
|
||||
<Fragment>
|
||||
<Navbar2 />
|
||||
<div className="container text-center py-5">
|
||||
<h2>Service not found!</h2>
|
||||
<Link href="/">Back to Home</Link>
|
||||
</div>
|
||||
<Footer />
|
||||
<Scrollbar />
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
const ServiceDetailsPage = ({ service }) => {
|
||||
const { t } = useTranslation("services");
|
||||
|
||||
if (!service) {
|
||||
return (
|
||||
<Fragment>
|
||||
<Navbar2 />
|
||||
<PageTitle pageTitle={service.sTitle} backgroundImage={services} pagesub={'Services Details'} />
|
||||
|
||||
<section className="wpo-blog-single-section section-padding">
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
<div className="col-12">
|
||||
<div className="wpo-blog-content">
|
||||
<div className="post format-standard-image">
|
||||
|
||||
<div className="entry-media">
|
||||
<div style={{ width: "100%", height: "650px", position: "relative" }}>
|
||||
<Image
|
||||
src={service.sImgS}
|
||||
alt={service.sTitle}
|
||||
fill
|
||||
style={{ objectFit: "cover" }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div className="entry-meta">
|
||||
<ul>
|
||||
<li>
|
||||
{/* <i className="fi flaticon-user"></i>{' '}
|
||||
<span>{service.author || 'Admin'}</span> */}
|
||||
</li>
|
||||
{/* <li>
|
||||
<i className="fi flaticon-calendar"></i> {service.date}
|
||||
</li> */}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h2>{service.sTitle}</h2>
|
||||
|
||||
<div dangerouslySetInnerHTML={{ __html: service.descriptiondetail }} />
|
||||
|
||||
{service.blockquotes && service.blockquotes.map((quote, idx) => (
|
||||
<blockquote key={idx}>{quote}</blockquote>
|
||||
))}
|
||||
|
||||
{service.gallery && (
|
||||
<div className="gallery">
|
||||
{service.gallery.map((img, i) => (
|
||||
<div key={i}>
|
||||
<Image src={img} alt={`Gallery ${i}`} width={400} height={300} />
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* {service.extraText && <p className="mt-4">{service.extraText}</p>} */}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<Footer />
|
||||
<Scrollbar />
|
||||
</Fragment>
|
||||
<Fragment>
|
||||
<Navbar2 />
|
||||
<div className="container text-center py-5">
|
||||
<h2>{t("page.serviceNotFound", "Service not found!")}</h2>
|
||||
<Link href="/">{t("page.backHome", "Back to Home")}</Link>
|
||||
</div>
|
||||
<Footer />
|
||||
<Scrollbar />
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<Navbar2 />
|
||||
<PageTitle
|
||||
pageTitle={service.sTitle}
|
||||
backgroundImage={servicesBanner}
|
||||
pagesub={t("page.subtitle")}
|
||||
/>
|
||||
|
||||
<section className="wpo-blog-single-section section-padding">
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
<div className="col-12">
|
||||
<div className="wpo-blog-content">
|
||||
<div className="post format-standard-image">
|
||||
{/* Banner Image */}
|
||||
<div className="entry-media">
|
||||
<div style={{ width: "100%", height: "650px", position: "relative" }}>
|
||||
<Image
|
||||
src={service.sImgS}
|
||||
alt={service.sTitle}
|
||||
fill
|
||||
style={{ objectFit: "cover" }}
|
||||
unoptimized
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2>{service.sTitle}</h2>
|
||||
|
||||
<div
|
||||
dangerouslySetInnerHTML={{ __html: service.descriptiondetail }}
|
||||
/>
|
||||
|
||||
{service.blockquotes &&
|
||||
service.blockquotes.map((quote, idx) => (
|
||||
<blockquote key={idx}>{quote}</blockquote>
|
||||
))}
|
||||
|
||||
{service.gallery && (
|
||||
<div className="gallery">
|
||||
{service.gallery.map((img, i) => (
|
||||
<div key={i}>
|
||||
<Image
|
||||
src={img}
|
||||
alt={`Gallery ${i}`}
|
||||
width={400}
|
||||
height={300}
|
||||
unoptimized
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<Footer />
|
||||
<Scrollbar />
|
||||
</Fragment>
|
||||
);
|
||||
};
|
||||
|
||||
export default ServiceDetailsPage;
|
||||
|
||||
export async function getStaticPaths({ locales }) {
|
||||
const services = (await import("../../public/locales/en/services.json")).campaigns;
|
||||
|
||||
const paths = services.flatMap((service) =>
|
||||
locales.map((locale) => ({
|
||||
params: { slug: service.slug },
|
||||
locale,
|
||||
}))
|
||||
);
|
||||
|
||||
return {
|
||||
paths,
|
||||
fallback: false,
|
||||
};
|
||||
}
|
||||
|
||||
export async function getStaticProps({ params, locale }) {
|
||||
const services = (await import(`../../public/locales/${locale}/services.json`))
|
||||
.campaigns;
|
||||
|
||||
const service = services.find((item) => item.slug === params.slug) || null;
|
||||
|
||||
return {
|
||||
props: {
|
||||
service,
|
||||
...(await serverSideTranslations(locale, ["common", "menu", "services"])),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@ -1,24 +1,37 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import Navbar2 from '../../components/Navbar2/Navbar2';
|
||||
import PageTitle from '../../components/pagetitle/PageTitle'
|
||||
import Scrollbar from '../../components/scrollbar/scrollbar'
|
||||
import Donors from '../../components/Donors/Donors';
|
||||
import PartnerSection from '../../components/PartnerSection/PartnerSection';
|
||||
import Footer from '../../components/footer/Footer';
|
||||
import ServicesSection from '../../components/services/ServicesSection';
|
||||
import services from '/public/images/service/service-banner.webp';
|
||||
import React, { Fragment } from "react";
|
||||
import Navbar2 from "../../components/Navbar2/Navbar2";
|
||||
import PageTitle from "../../components/pagetitle/PageTitle";
|
||||
import Scrollbar from "../../components/scrollbar/scrollbar";
|
||||
import Footer from "../../components/footer/Footer";
|
||||
import ServicesSection from "../../components/services/ServicesSection";
|
||||
import services from "/public/images/service/service-banner.webp";
|
||||
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
|
||||
import { useTranslation } from "next-i18next";
|
||||
|
||||
const Services = () => {
|
||||
const { t } = useTranslation("services");
|
||||
|
||||
return (
|
||||
<Fragment>
|
||||
<Navbar2 />
|
||||
<PageTitle pageTitle={'Services'} backgroundImage={services} pagesub={'Services'} />
|
||||
<ServicesSection cmClass={'wpo-campaign-area-s5'}/>
|
||||
{/* <Donors /> */}
|
||||
{/* <PartnerSection/> */}
|
||||
<PageTitle
|
||||
pageTitle={t("page.title")}
|
||||
backgroundImage={services}
|
||||
pagesub={t("page.subtitle")}
|
||||
/>
|
||||
<ServicesSection cmClass={"wpo-campaign-area-s5"} />
|
||||
<Footer />
|
||||
<Scrollbar />
|
||||
</Fragment>
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
export default Services;
|
||||
|
||||
export async function getStaticProps({ locale }) {
|
||||
return {
|
||||
props: {
|
||||
...(await serverSideTranslations(locale, ['common', 'menu', 'services'])), // Add 'home', 'footer', etc.
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
22
public/locales/en/blog.json
Normal file
22
public/locales/en/blog.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"sectionSubTitle": "Our Blog",
|
||||
"sectionTitle": "Latest News & Press",
|
||||
"knowMore": "Know More",
|
||||
"posts": {
|
||||
"new-tps-designations-what-you-need-to-know": {
|
||||
"title": "New TPS Designations: What You Need to Know",
|
||||
"summary": "Recent policy changes affect thousands of immigrants. Learn how temporary protected status updates may impact your case and what actions to take.",
|
||||
"description": "<p>Recent policy changes affect thousands of immigrants. Learn how temporary protected status updates...</p> ... full content here ..."
|
||||
},
|
||||
"h1b-season-2025-preparation-strategies": {
|
||||
"title": "H-1B Season 2025: Preparation Strategies",
|
||||
"summary": "The annual H-1B lottery approaches. Our comprehensive guide helps employers and workers navigate the process.",
|
||||
"description": "<p>The H-1B registration period for the fiscal year 2026 closed recently...</p> ... full content here ..."
|
||||
},
|
||||
"family-immigration-backlogs-alternative-options": {
|
||||
"title": "Family Immigration Backlogs: Alternative Options",
|
||||
"summary": "While family preference categories face delays, discover alternative pathways to reunite with loved ones.",
|
||||
"description": "<p>While family preference categories face delays...</p> ... full content here ..."
|
||||
}
|
||||
}
|
||||
}
|
||||
21
public/locales/en/services.json
Normal file
21
public/locales/en/services.json
Normal file
@ -0,0 +1,21 @@
|
||||
{
|
||||
"page": {
|
||||
"subtitle": "Our Services",
|
||||
"title": "Explore Immigration Services",
|
||||
"viewButton": "View Details",
|
||||
"serviceNotFound": "Service not found!",
|
||||
"backHome": "Back to Home"
|
||||
},
|
||||
"campaigns": [
|
||||
{
|
||||
"id": "1",
|
||||
"sTitle": "Family Immigration Assistance",
|
||||
"slug": "family-immigration-assistance",
|
||||
"description": "We offer expert guidance on family-based US immigration, from petition filing to visa approval",
|
||||
"sImgS": "/public/images/service/category/business/family/family-1.webp",
|
||||
"cSimg": "/public/images/service/category/business/family/family-1.webp",
|
||||
"category": "Family",
|
||||
"descriptiondetail": "<p>Family immigration is one of the most personal and critical areas of US immigration law, touching the lives of millions of individuals who seek to reunite with their loved ones. At Janahan Law, we specialize in assisting US citizens and lawful permanent residents in petitioning for their spouses, children, parents, and siblings. Navigating the immigration system can be complex, but our dedicated team guides clients through each stage with precision and care. From preparing and submitting Form I-130 petitions to managing consular processing, adjustment of status applications, and waivers for inadmissibility, we ensure all documentation is meticulously prepared to prevent delays or denials. Our expertise extends beyond paperwork; we provide strategic advice for interviews, appeals, and other critical steps to maximize approval rates and reduce the emotional stress families may face during the process. By staying up-to-date with USCIS policies, travel restrictions, and legal reforms, we offer our clients reliable guidance every step of the way. </p><blockquote>“Reuniting families is not just our job; it’s our mission. Every petition we handle is a step towards bringing loved ones together.”</blockquote><p>Family immigration cases often involve sensitive and emotional circumstances. We understand the challenges of separating families, especially when it involves minor children, aging parents, or spouses living abroad. Our compassionate approach ensures that each client receives personalized solutions tailored to their unique circumstances. Whether it’s assisting a spouse in joining their partner in the United States, helping minor children immigrate to be with their parents, or supporting parents in obtaining lawful permanent residence, we are committed to making the process as smooth and stress-free as possible. </p><div class='gallery'><div><img src='/images/services/gallery1.jpg' alt='Gallery 1'/></div><div><img src='/images/services/gallery2.jpg' alt='Gallery 2'/></div></div><p>Our services encompass a full spectrum of family immigration support. This includes evaluating eligibility, compiling required documents, filing petitions, liaising with government agencies, preparing clients for interviews, and providing guidance during appeals or requests for reconsideration. We also address complex situations, such as inadmissibility issues, waivers, and special humanitarian cases, ensuring that every possible avenue is explored for a positive outcome. With Janahan Law, clients receive not just legal representation, but a partner who truly understands the human side of immigration. </p><blockquote>\"At the heart of every case we take lies a promise—to help families reconnect, to turn hope into reality, and to make distance disappear one step at a time.\"</blockquote><p>Family immigration is more than legal paperwork—it’s about building futures together. Our goal is to provide comprehensive, empathetic, and effective legal support to help families overcome the bureaucratic hurdles of US immigration. By combining deep legal knowledge with personalized attention, we empower families to reunite and thrive in the United States. </p>"
|
||||
}
|
||||
]
|
||||
}
|
||||
22
public/locales/es/blog.json
Normal file
22
public/locales/es/blog.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"sectionSubTitle": "Nuestro Blog",
|
||||
"sectionTitle": "Últimas Noticias y Comunicados",
|
||||
"knowMore": "Saber Más",
|
||||
"posts": {
|
||||
"new-tps-designations-what-you-need-to-know": {
|
||||
"title": "Nuevas Designaciones de TPS: Lo Que Necesitas Saber",
|
||||
"summary": "Cambios recientes en la política afectan a miles de inmigrantes. Descubre cómo las actualizaciones de TPS pueden impactar tu caso y qué acciones tomar.",
|
||||
"description": "<p>Los cambios recientes en la política afectan a miles de inmigrantes. Aprende cómo las actualizaciones del Estatus de Protección Temporal (TPS) pueden impactar tu caso y qué pasos debes seguir...</p> ... contenido completo aquí ..."
|
||||
},
|
||||
"h1b-season-2025-preparation-strategies": {
|
||||
"title": "Temporada H-1B 2025: Estrategias de Preparación",
|
||||
"summary": "Se acerca la lotería anual de visas H-1B. Nuestra guía integral ayuda a empleadores y trabajadores a navegar el proceso y mejorar sus posibilidades.",
|
||||
"description": "<p>El período de registro para la visa H-1B del año fiscal 2026 se cerró recientemente...</p> ... contenido completo aquí ..."
|
||||
},
|
||||
"family-immigration-backlogs-alternative-options": {
|
||||
"title": "Retrasos en la Inmigración Familiar: Opciones Alternativas",
|
||||
"summary": "Mientras las categorías de preferencia familiar enfrentan demoras, descubre vías alternativas para reunirte con tus seres queridos.",
|
||||
"description": "<p>Mientras las categorías de inmigración familiar enfrentan retrasos significativos...</p> ... contenido completo aquí ..."
|
||||
}
|
||||
}
|
||||
}
|
||||
21
public/locales/es/services.json
Normal file
21
public/locales/es/services.json
Normal file
@ -0,0 +1,21 @@
|
||||
{
|
||||
"page": {
|
||||
"subtitle": "Nuestros Servicios",
|
||||
"title": "Explorar Servicios de Inmigración",
|
||||
"viewButton": "Ver Detalles",
|
||||
"serviceNotFound": "¡Servicio no encontrado!",
|
||||
"backHome": "Volver al Inicio"
|
||||
},
|
||||
"campaigns": [
|
||||
{
|
||||
"id": "1",
|
||||
"sTitle": "Asistencia en Inmigración Familiar",
|
||||
"slug": "family-immigration-assistance",
|
||||
"description": "Ofrecemos orientación experta en inmigración familiar a EE.UU., desde la presentación de la petición hasta la aprobación de la visa",
|
||||
"sImgS": "/public/images/service/category/business/family/family-1.webp",
|
||||
"cSimg": "/public/images/service/category/business/family/family-1.webp",
|
||||
"category": "Familia",
|
||||
"descriptiondetail": "<p>La inmigración familiar es una de las áreas más personales y críticas de la ley de inmigración de EE.UU., que afecta la vida de millones de personas que buscan reunirse con sus seres queridos. En Janahan Law, nos especializamos en ayudar a ciudadanos estadounidenses y residentes permanentes legales a presentar peticiones para sus cónyuges, hijos, padres y hermanos. Navegar por el sistema de inmigración puede ser complejo, pero nuestro equipo dedicado guía a los clientes en cada etapa con precisión y cuidado. Desde la preparación y presentación de las peticiones I-130 hasta la gestión del procesamiento consular, solicitudes de ajuste de estatus y exenciones por inadmisibilidad, aseguramos que toda la documentación esté meticulosamente preparada para evitar retrasos o negaciones. Nuestra experiencia va más allá del papeleo; brindamos asesoramiento estratégico para entrevistas, apelaciones y otros pasos críticos para maximizar las tasas de aprobación y reducir el estrés emocional que las familias pueden enfrentar durante el proceso. Al mantenernos actualizados con las políticas de USCIS, restricciones de viaje y reformas legales, ofrecemos a nuestros clientes orientación confiable en cada paso del camino. </p><blockquote>“Reunir familias no es solo nuestro trabajo; es nuestra misión. Cada petición que manejamos es un paso hacia acercar a los seres queridos.”</blockquote><p>Los casos de inmigración familiar a menudo implican circunstancias delicadas y emocionales. Entendemos los desafíos de separar familias, especialmente cuando involucra a niños pequeños, padres mayores o cónyuges que viven en el extranjero. Nuestro enfoque compasivo garantiza que cada cliente reciba soluciones personalizadas adaptadas a sus circunstancias únicas. Ya sea ayudar a un cónyuge a reunirse con su pareja en Estados Unidos, ayudar a los hijos menores a inmigrar para estar con sus padres o apoyar a los padres en la obtención de la residencia permanente legal, estamos comprometidos a hacer que el proceso sea lo más fluido y libre de estrés posible. </p><div class='gallery'><div><img src='/images/services/gallery1.jpg' alt='Galería 1'/></div><div><img src='/images/services/gallery2.jpg' alt='Galería 2'/></div></div><p>Nuestros servicios abarcan un espectro completo de apoyo en inmigración familiar. Esto incluye evaluar la elegibilidad, compilar los documentos requeridos, presentar peticiones, interactuar con agencias gubernamentales, preparar a los clientes para entrevistas y brindar orientación durante apelaciones o solicitudes de reconsideración. También abordamos situaciones complejas, como problemas de inadmisibilidad, exenciones y casos humanitarios especiales, asegurando que se explore cada posible vía para un resultado positivo. Con Janahan Law, los clientes reciben no solo representación legal, sino un socio que realmente comprende el lado humano de la inmigración. </p><blockquote>\"En el corazón de cada caso que tomamos hay una promesa: ayudar a las familias a reconectarse, convertir la esperanza en realidad y hacer que la distancia desaparezca paso a paso.\"</blockquote><p>La inmigración familiar es más que papeleo legal: se trata de construir futuros juntos. Nuestro objetivo es proporcionar un apoyo legal integral, empático y efectivo para ayudar a las familias a superar los obstáculos burocráticos de la inmigración en EE.UU. Al combinar un profundo conocimiento legal con atención personalizada, empoderamos a las familias para reunirse y prosperar en Estados Unidos. </p>"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -30,6 +30,18 @@ import iconImg1 from '/public/images/home/icons/strategic-planning.webp'
|
||||
import iconImg2 from '/public/images/home/icons/expert-preparation.webp'
|
||||
import iconImg3 from '/public/images/home/icons/ongoing-support.webp'
|
||||
|
||||
import blogImg1 from "/public/images/blog/blog-1.webp";
|
||||
import blogImg2 from "/public/images/blog/blog-2.webp";
|
||||
import blogImg3 from "/public/images/blog/blog-3.webp";
|
||||
|
||||
import blogSingleImg1 from "/public/images/blog/blog-detail-1.webp";
|
||||
import blogSingleImg2 from "/public/images/blog/blog-detail-2.webp";
|
||||
import blogSingleImg3 from "/public/images/blog/blog-detail-3.webp";
|
||||
|
||||
import bannerImg1 from "/public/images/blog/banner-1.webp";
|
||||
import bannerImg2 from "/public/images/blog/banner-2.webp";
|
||||
import bannerImg3 from "/public/images/blog/banner-3.webp";
|
||||
|
||||
export const featuresData = [
|
||||
{
|
||||
img: iconImg1,
|
||||
@ -205,3 +217,43 @@ export const MissionVision = [
|
||||
},
|
||||
]
|
||||
|
||||
const blog = [
|
||||
{
|
||||
id: '1',
|
||||
slug: 'new-tps-designations-what-you-need-to-know',
|
||||
bannerImg: bannerImg1,
|
||||
screens: blogImg1,
|
||||
blogSingleImg: blogSingleImg1,
|
||||
author: 'Anne William',
|
||||
authorTitle: 'Admin',
|
||||
create_at: '25 Sep 2022',
|
||||
comment: '35',
|
||||
blClass: 'format-standard-image'
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
slug: 'h1b-season-2025-preparation-strategies',
|
||||
bannerImg: bannerImg2,
|
||||
screens: blogImg2,
|
||||
blogSingleImg: blogSingleImg2,
|
||||
author: 'Robert Fox',
|
||||
authorTitle: 'Admin',
|
||||
create_at: '12 Jun 2023',
|
||||
comment: '80',
|
||||
blClass: 'format-standard-image'
|
||||
},
|
||||
{
|
||||
id: '3',
|
||||
slug: 'family-immigration-backlogs-alternative-options',
|
||||
bannerImg: bannerImg3,
|
||||
screens: blogImg3,
|
||||
blogSingleImg: blogSingleImg3,
|
||||
author: 'Devon Lane',
|
||||
authorTitle: 'Admin',
|
||||
create_at: '03 Dec 2024',
|
||||
comment: '95',
|
||||
blClass: 'format-video'
|
||||
}
|
||||
];
|
||||
|
||||
export default blog;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user