feat(i18n): translate hardcoded article page strings to 5 locales
Deploy to VPS / deploy (push) Has been cancelled

- Add ArticlePage namespace (backToNewsHub, backToNews, mediaGallery,
  joinLinkedIn, internalRelease) to all 5 locale message files
  (en, it, es, de, vec)
- Replace 5 hardcoded English strings in news/[slug]/page.tsx with
  getTranslations() calls

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-06 18:14:46 -05:00
parent cb7458cded
commit c45a5be99e
6 changed files with 47 additions and 11 deletions
+7
View File
@@ -184,6 +184,13 @@
"page": "Seite", "page": "Seite",
"of": "von" "of": "von"
}, },
"ArticlePage": {
"backToNewsHub": "Zurück zum News Hub",
"backToNews": "Zurück zu Nachrichten",
"mediaGallery": "Mediengalerie",
"joinLinkedIn": "Diskussion auf LinkedIn beitreten",
"internalRelease": "Interne Unternehmensmitteilung"
},
"AuthModal": { "AuthModal": {
"b2bPortal": "B2B-Portal", "b2bPortal": "B2B-Portal",
"signIn": "Anmelden", "signIn": "Anmelden",
+7
View File
@@ -184,6 +184,13 @@
"page": "Page", "page": "Page",
"of": "of" "of": "of"
}, },
"ArticlePage": {
"backToNewsHub": "Back to News Hub",
"backToNews": "Back to News",
"mediaGallery": "Media Gallery",
"joinLinkedIn": "Join the conversation on LinkedIn",
"internalRelease": "Internal Corporate Release"
},
"AuthModal": { "AuthModal": {
"b2bPortal": "B2B Portal", "b2bPortal": "B2B Portal",
"signIn": "Sign In", "signIn": "Sign In",
+7
View File
@@ -184,6 +184,13 @@
"page": "Página", "page": "Página",
"of": "de" "of": "de"
}, },
"ArticlePage": {
"backToNewsHub": "Volver al News Hub",
"backToNews": "Volver a Noticias",
"mediaGallery": "Galería de Medios",
"joinLinkedIn": "Únete a la conversación en LinkedIn",
"internalRelease": "Comunicado Corporativo Interno"
},
"AuthModal": { "AuthModal": {
"b2bPortal": "Portal B2B", "b2bPortal": "Portal B2B",
"signIn": "Iniciar Sesión", "signIn": "Iniciar Sesión",
+7
View File
@@ -184,6 +184,13 @@
"page": "Pagina", "page": "Pagina",
"of": "di" "of": "di"
}, },
"ArticlePage": {
"backToNewsHub": "Torna al News Hub",
"backToNews": "Torna alle Notizie",
"mediaGallery": "Galleria Media",
"joinLinkedIn": "Partecipa alla conversazione su LinkedIn",
"internalRelease": "Comunicato Aziendale Interno"
},
"AuthModal": { "AuthModal": {
"b2bPortal": "Portale B2B", "b2bPortal": "Portale B2B",
"signIn": "Accedi", "signIn": "Accedi",
+7
View File
@@ -184,6 +184,13 @@
"page": "Pagina", "page": "Pagina",
"of": "de" "of": "de"
}, },
"ArticlePage": {
"backToNewsHub": "Torna al News Hub",
"backToNews": "Torna a łe Notissie",
"mediaGallery": "Gałeria Media",
"joinLinkedIn": "Parteçipa a ła conversassion su LinkedIn",
"internalRelease": "Comunicato Aziendałe Interno"
},
"AuthModal": { "AuthModal": {
"b2bPortal": "Portal par ditte", "b2bPortal": "Portal par ditte",
"signIn": "Entra chive", "signIn": "Entra chive",
+12 -11
View File
@@ -8,7 +8,7 @@ import { prisma } from "@/lib/prisma";
import { ArrowLeft, Calendar, Tag, Linkedin } from "lucide-react"; import { ArrowLeft, Calendar, Tag, Linkedin } from "lucide-react";
import BreathingField from "@/components/visuals/BreathingField"; import BreathingField from "@/components/visuals/BreathingField";
import { setRequestLocale } from "next-intl/server"; import { getTranslations, setRequestLocale } from "next-intl/server";
import { getLocalizedData } from "@/lib/i18nHelper"; import { getLocalizedData } from "@/lib/i18nHelper";
import Breadcrumbs from "@/components/seo/Breadcrumbs"; import Breadcrumbs from "@/components/seo/Breadcrumbs";
import { import {
@@ -228,6 +228,7 @@ export default async function ArticlePage({ params }: { params: Promise<{ slug:
const resolvedParams = await params; const resolvedParams = await params;
const { slug, locale } = resolvedParams; const { slug, locale } = resolvedParams;
setRequestLocale(locale); setRequestLocale(locale);
const t = await getTranslations({ locale, namespace: "ArticlePage" });
let rawArticle: any = null; let rawArticle: any = null;
try { try {
@@ -293,7 +294,7 @@ export default async function ArticlePage({ params }: { params: Promise<{ slug:
<div className="fixed top-24 left-6 z-50 hidden md:block"> <div className="fixed top-24 left-6 z-50 hidden md:block">
{/* EL BOTÓN DE VOLVER AHORA RESPETA EL IDIOMA */} {/* EL BOTÓN DE VOLVER AHORA RESPETA EL IDIOMA */}
<Link href={`/${locale}/news`} className="inline-flex items-center gap-2 text-sm font-medium text-[#86868B] hover:text-[#0066CC] dark:hover:text-[#4DA6FF] transition-colors py-2 px-4 bg-white/50 dark:bg-black/50 backdrop-blur-md rounded-full group shadow-sm border border-black/5 dark:border-white/10"> <Link href={`/${locale}/news`} className="inline-flex items-center gap-2 text-sm font-medium text-[#86868B] hover:text-[#0066CC] dark:hover:text-[#4DA6FF] transition-colors py-2 px-4 bg-white/50 dark:bg-black/50 backdrop-blur-md rounded-full group shadow-sm border border-black/5 dark:border-white/10">
<ArrowLeft size={16} className="group-hover:-translate-x-1 transition-transform" /> Back to News Hub <ArrowLeft size={16} className="group-hover:-translate-x-1 transition-transform" /> {t("backToNewsHub")}
</Link> </Link>
</div> </div>
@@ -329,7 +330,7 @@ export default async function ArticlePage({ params }: { params: Promise<{ slug:
{gallery.length > 0 && ( {gallery.length > 0 && (
<div className="mt-16 pt-16 border-t border-black/5 dark:border-white/5"> <div className="mt-16 pt-16 border-t border-black/5 dark:border-white/5">
<h3 className="text-xl font-medium mb-8 text-[#1D1D1F] dark:text-white">Media Gallery</h3> <h3 className="text-xl font-medium mb-8 text-[#1D1D1F] dark:text-white">{t("mediaGallery")}</h3>
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4"> <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
{gallery.map((imgSrc: string, idx: number) => ( {gallery.map((imgSrc: string, idx: number) => (
<div key={idx} className={`relative rounded-3xl overflow-hidden bg-[#1D1D1F] border border-black/10 dark:border-white/10 ${idx === 0 && gallery.length % 2 !== 0 ? 'sm:col-span-2 h-64 md:h-96' : 'h-48 md:h-64'}`}> <div key={idx} className={`relative rounded-3xl overflow-hidden bg-[#1D1D1F] border border-black/10 dark:border-white/10 ${idx === 0 && gallery.length % 2 !== 0 ? 'sm:col-span-2 h-64 md:h-96' : 'h-48 md:h-64'}`}>
@@ -342,21 +343,21 @@ export default async function ArticlePage({ params }: { params: Promise<{ slug:
<div className="mt-16 pt-8 border-t border-black/10 dark:border-white/10 flex justify-between items-center"> <div className="mt-16 pt-8 border-t border-black/10 dark:border-white/10 flex justify-between items-center">
<Link href={`/${locale}/news`} className="text-[#0066CC] dark:text-[#4DA6FF] font-medium flex items-center gap-2 hover:underline md:hidden"> <Link href={`/${locale}/news`} className="text-[#0066CC] dark:text-[#4DA6FF] font-medium flex items-center gap-2 hover:underline md:hidden">
<ArrowLeft size={16} /> Back to News <ArrowLeft size={16} /> {t("backToNews")}
</Link> </Link>
{article.linkedinUrl ? ( {article.linkedinUrl ? (
<a <a
href={article.linkedinUrl} href={article.linkedinUrl}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="flex items-center gap-2 text-sm font-semibold text-white bg-[#0A66C2] px-6 py-3 rounded-full hover:bg-[#004182] transition-all shadow-lg shadow-[#0A66C2]/20 ml-auto md:ml-0" className="flex items-center gap-2 text-sm font-semibold text-white bg-[#0A66C2] px-6 py-3 rounded-full hover:bg-[#004182] transition-all shadow-lg shadow-[#0A66C2]/20 ml-auto md:ml-0"
> >
<Linkedin size={16} /> Join the conversation on LinkedIn <Linkedin size={16} /> {t("joinLinkedIn")}
</a> </a>
) : ( ) : (
<div className="text-xs text-[#86868B] italic hidden md:block"> <div className="text-xs text-[#86868B] italic hidden md:block">
Internal Corporate Release {t("internalRelease")}
</div> </div>
)} )}
</div> </div>