feat: real Bangla/English toggle for the home page (Hero through Footer)

The BN/EN button already worked (state + persistence), but almost nothing
on the page actually responded to it — Hero showed both languages stacked
at once, the home service cards' Bangla name was hardcoded on regardless
of language, and everything else (About, Skills, Testimonials, own-products
showcase, Timeline, Nav chrome, Footer) had zero language awareness at all.

Wired `lang` through to every home-page section, added ~15 new *Bn content
fields to data.jsx (service kind/description/highlights, testimonials,
own-products, experience, metrics), and fixed the two literal stacking
bugs (Hero tagline, home service card names). Also fixed the language
toggle button being hidden below 640px — mobile had no way to reach it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
khondokartowsif171
2026-08-20 11:00:07 +06:00
parent 5533784e0a
commit 46c85f7864
7 changed files with 315 additions and 119 deletions
+19 -19
View File
@@ -166,7 +166,7 @@ function App() {
if (route.startsWith('services/')) {
const id = route.slice('services/'.length);
const svc = (PORTFOLIO_DATA.services || []).find(s => s.id === id);
if (svc) return <T.ServiceDetailPage svc={svc} />;
if (svc) return <T.ServiceDetailPage svc={svc} lang={lang} />;
window.location.hash = '#/services';
return null;
}
@@ -175,34 +175,34 @@ function App() {
case 'services':
return <T.ServicesPage lang={lang} />;
case 'stack':
return <T.StackPage />;
return <T.StackPage lang={lang} />;
case 'agents':
return <T.AgentsPage />;
return <T.AgentsPage lang={lang} />;
case 'timeline':
return <T.TimelinePage />;
return <T.TimelinePage lang={lang} />;
case 'contact':
return <T.ContactPage lang={lang} />;
case 'pricing':
return <T.PricingPage />;
return <T.PricingPage lang={lang} />;
case 'blog':
return <T.BlogPage />;
return <T.BlogPage lang={lang} />;
case 'case-studies':
return <T.CaseStudiesPage />;
return <T.CaseStudiesPage lang={lang} />;
case 'privacy':
return <T.PrivacyPage />;
return <T.PrivacyPage lang={lang} />;
case 'terms':
return <T.TermsPage />;
return <T.TermsPage lang={lang} />;
default:
return (
<main style={density === "compact" ? { fontSize: 14.5 } : undefined}>
<T.Hero headlinePrefix={tweaks.heroHeadlinePrefix} headlineSuffix={tweaks.heroHeadlineSuffix} lang={lang} />
<T.About />
<T.Skills />
<T.Projects />
<T.FlagshipProduct />
<T.AgentShowcase />
<T.Testimonials />
<T.Timeline />
<T.About lang={lang} />
<T.Skills lang={lang} />
<T.Projects lang={lang} />
<T.FlagshipProduct lang={lang} />
<T.AgentShowcase lang={lang} />
<T.Testimonials lang={lang} />
<T.Timeline lang={lang} />
<T.Contact lang={lang} />
</main>
);
@@ -213,9 +213,9 @@ function App() {
<>
<T.Nav {...navProps} />
{renderPage()}
<T.Footer />
<T.CommandPalette open={paletteOpen} onClose={() => setPaletteOpen(false)} />
<T.ChatboxWidget />
<T.Footer lang={lang} />
<T.CommandPalette open={paletteOpen} onClose={() => setPaletteOpen(false)} lang={lang} />
<T.ChatboxWidget lang={lang} />
<window.TweaksPanel title="Tweaks">
<window.TweakSection label="Theme" />