Skip to content

Commit 6d4c109

Browse files
Enhance localization and translations across multiple components; update blog and home pages with dynamic content; improve styling and metadata handling for better user experience
1 parent 3ab6cfa commit 6d4c109

10 files changed

Lines changed: 64 additions & 91 deletions

File tree

app/[locale]/blog/[slug]/page.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,7 @@ const BlogPost = async ({ params }) => {
107107
</Date>
108108
<SideInfo>
109109
{/* TODO: Renderizar post del mismo tag al hacer click */}
110-
{/* El enlace usa el primer elemento del array */}
111-
<Link href={`/${post.doctype[0]}`}>
110+
<Link href={`/${locale}/${post.doctype[0]}`}>
112111
{/* Renderiza todos los elementos del array como categorías */}
113112
{post.doctype.map((type, index) => (
114113
<SectionType key={index} tag={type}>
@@ -130,7 +129,6 @@ const BlogPost = async ({ params }) => {
130129
},
131130
}}
132131
/>
133-
{/* TODO: Hero Image */}
134132
{!nextPost ||
135133
(!prevPost && (
136134
<div

app/[locale]/blog/page.js

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const BlogPage = async ({ params }) => {
2222
// 1. Obtener idioma
2323
const { locale } = await params;
2424
setRequestLocale(locale);
25+
const t = await getTranslations({ locale, namespace: "HomePage" });
2526
// const blogPosts = getBlogPosts();
2627
const blogPosts = getPostsByType(["blog"], 0, locale);
2728
if (!blogPosts.posts) {
@@ -34,33 +35,8 @@ const BlogPage = async ({ params }) => {
3435
<BackgroundDots numDots={90} />
3536
<MainPageBg>
3637
<ShowPath title={""} />
37-
<TitlePage>¡Bienvenido al Blog!</TitlePage>
38-
{/* TODO: Create the contact functionality (Mail, Form, database, chat gpt) */}
39-
<MdParagraph>
40-
En esta sección encontrarás artículos y reflexiones sobre temas que
41-
me apasionan:
42-
</MdParagraph>
43-
<MdUnorderedList>
44-
<MdListItem>
45-
Inteligencia Artificial: avances, algoritmos y mi experiencia en
46-
el doctorado.
47-
</MdListItem>
48-
<MdListItem>
49-
Matemáticas aplicadas: soluciones a problemas reales y enfoques
50-
innovadores.
51-
</MdListItem>
52-
<MdListItem>
53-
Programación: guías, proyectos y recursos para aprender y mejorar.
54-
</MdListItem>
55-
</MdUnorderedList>
56-
57-
<MdParagraph>
58-
Estoy construyendo este blog poco a poco, así que vuelve pronto para
59-
explorar nuevas publicaciones.
60-
</MdParagraph>
61-
<MdParagraph>
62-
¡Espero que encuentres algo útil e interesante aquí!
63-
</MdParagraph>
38+
<TitlePage>{t("title")}</TitlePage>
39+
<MdParagraph>{t("copy_text")}</MdParagraph>
6440
<HomeBoxes props={blogPosts.posts} locale={locale} />
6541
</MainPageBg>
6642
</PageContainer>

app/[locale]/page.js

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export default async function Home({ params }) {
2121
// 1. Obtener idioma
2222
const { locale } = await params;
2323
setRequestLocale(locale);
24+
const t = await getTranslations({ locale, namespace: "HomePage" });
2425
const allPostsData = getAllPosts([], locale);
2526
return (
2627
<PageContainer>
@@ -29,7 +30,7 @@ export default async function Home({ params }) {
2930
<MainPageBg>
3031
<HomePageCover>
3132
<HomePageCoverText>
32-
{/* <TitlePage>Hola! 👋🏼</TitlePage> */}
33+
<TitlePage>{t("title")} 👋🏼</TitlePage>
3334
{/* <CoverTitle>Eric Lucero González </CoverTitle> */}
3435
</HomePageCoverText>
3536
{/* <TitlePage>Soy</TitlePage> */}
@@ -44,30 +45,7 @@ export default async function Home({ params }) {
4445
{/* <CircleBounce /> */}
4546
{/* </HomePageCoverImage> */}
4647
</HomePageCover>
47-
<MdParagraph>
48-
Este sitio web está en construcción, pero pronto será un lugar donde
49-
compartiré mi trabajo y aprendizaje en áreas como inteligencia
50-
artificial, LaTeX, y algoritmos de optimización. Aquí encontrarás:
51-
</MdParagraph>
52-
<MdUnorderedList>
53-
{/* TODO: Nuevo endpoint /licencias, sin ruta fija o desde footer */}
54-
<MdListItem>
55-
Un blog con reflexiones, tutoriales, y temas técnicos relacionados
56-
con la IA.
57-
</MdListItem>
58-
<MdListItem>
59-
Recursos sobre LaTeX para quienes deseen perfeccionar sus
60-
habilidades en la escritura científica.
61-
</MdListItem>
62-
<MdListItem>
63-
Un portafolio donde documentaré proyectos e ideas relacionadas con
64-
programación y matemáticas aplicadas.
65-
</MdListItem>
66-
</MdUnorderedList>
67-
<MdParagraph>
68-
Gracias por visitar. Te invito a explorar las secciones disponibles y
69-
volver pronto para más contenido. ¡Esto es solo el comienzo!
70-
</MdParagraph>
48+
<MdParagraph>{t("copy_text")}</MdParagraph>
7149
<HomeBoxes props={allPostsData} />
7250
</MainPageBg>
7351
</PageContainer>

app/components/DateDisplay.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ const DateDisplay = ({ isoDate, defaultFormatted, locale }) => {
88
useEffect(() => {
99
const updateDate = () => {
1010
try {
11-
// TODO: Habilitar en internacionalización
12-
// const userLocale = navigator.language || "es";
13-
// setRequestLocale(locale);
1411
const userLocale = locale || "es";
1512
const formatter = new Intl.DateTimeFormat(userLocale, {
1613
day: "numeric",

app/lib/api-two.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ function getPostsByType(types, orderNum = 0) {
153153

154154
return { posts: filteredPosts, previousPost, nextPost };
155155
}
156-
// TODO: Make just una getPost type function with params
157156
module.exports = {
158157
getPostSlugs,
159158
getPostBySlug,

app/ui/CardsElements.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ export const GridContainer = styled(motion.div)`
6868
width: 100%;
6969
z-index: 1;
7070
@media (min-width: 660px) {
71-
/* TODO: Style of blog posts and inner post */
7271
width: 100%;
7372
}
7473
&:hover {

app/ui/ComponentsStyled.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export const MainPageBg = styled.div`
5252
`;
5353

5454
export const HomePageCover = styled.div`
55-
height: 45vh;
55+
height: 15vh;
5656
display: flex;
5757
flex-direction: row;
5858
@media (max-width: 660px) {

app/ui/lugs.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,28 @@ export const SectionType = styled.div`
175175
case "curso":
176176
return "var(--emphasis-fg)";
177177
case "python":
178-
return "var(--link-fg)";
178+
return "var(--emphasis-bg)";
179+
case "ia":
180+
return "var(--primary-border)";
181+
case "IA":
182+
return "var(--primary-border)";
183+
default:
184+
return "var(--subheading)"; // Color por defecto
185+
}
186+
}};
187+
color: ${(props) => {
188+
// Retorna el color basado en la prop "tag"
189+
switch (props.tag) {
190+
case "blog":
191+
return "var(--bg)";
192+
case "javascript":
193+
return "var(--bg)";
194+
case "latex":
195+
return "var(--fg)";
196+
case "curso":
197+
return "var(--accent)";
198+
case "python":
199+
return "var(--fg)";
179200
case "ia":
180201
return "var(--primary-border)";
181202
case "IA":

messages/en.json

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
{
22
"Metadata": {
3-
"defaultTitle": "Eric Lucero | AI | Optimization",
4-
"description": "Blog personal sobre Inteligencia Artificial, Algoritmos y LaTeX.",
5-
"keywords": "IA, Doctorado, LaTeX, Algoritmos, España",
3+
"defaultTitle": "Eric Lucero | AI Research & Optimization",
4+
"description": "Personal research blog by Eric Lucero regarding Artificial Intelligence, Genetic Algorithms, Optimization, and LaTeX tutorials.",
5+
"keywords": "AI, PhD, LaTeX, Algorithms, Optimization, Metaheuristics, Spain, Research, Computer Science, Next.js",
66
"thumbnailImage": "https://res.cloudinary.com/dcvnw6hvt/image/upload/v1765116599/elCronopio/Thumbnails/portada-en_bxq6qz.png"
77
},
88
"HomePage": {
99
"title": "Welcome to my AI Research Blog",
10-
"about": "PhD Student based in Spain"
10+
"copy_text": "This site is under construction. Soon will be a place where I share my work and learning path in AI and optimization.",
11+
"about": "PhD Student based in Spain",
12+
"metaTitle": "Home: My Journey in AI",
13+
"metaDescription": "Welcome to my personal space where I share my research, algorithms, and code."
1114
},
1215
"Navigation": {
1316
"about": "About",
@@ -16,33 +19,33 @@
1619
"papers": "Papers"
1720
},
1821
"Footer": {
19-
"made_with": "Build from scratch with:",
22+
"made_with": "Built from scratch with:",
2023
"contact": "Contact",
2124
"about_page": "About this page and its content",
22-
"licenses": "Licenses"
25+
"licenses": "Legal Terms & Privacy Policy"
2326
},
2427
"About": {
2528
"title": "About Me",
26-
"content": "I am Eric Lucero González, a PhD student specializing in Artificial Intelligence. This blog serves as a platform to share my research, insights, and developments in the field of AI.",
27-
"description": "Personal blog on AI, optimization and LaTeX.",
28-
"keywords": "IA, Doctorado, LaTeX, Algoritmos, España",
29+
"content": "I am Eric Lucero González, a PhD student specializing in Artificial Intelligence. This blog serves as a platform to share my research, insights, and developments in the field of AI. I am currently pursuing a PhD in Artificial Intelligence at the Technical University of Madrid (UPM). My interests include optimization algorithms, metaheuristics, and LaTeX. I enjoy sharing knowledge and learning through writing.",
30+
"description": "Personal blog on AI, optimization, and LaTeX.",
31+
"keywords": "AI, PhD, LaTeX, Algorithms, Spain, Research",
2932
"license_title": "Content License",
3033
"license_terms": "All content on this blog is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0). You are free to share and adapt the material as long as you provide appropriate credit, do not use it for commercial purposes, and indicate if changes were made.",
3134
"page_content_title": "About this Page",
3235
"page_content": "This blog is built using Next.js and Next-Intl for internationalization. It features posts written in both English and Spanish, catering to a diverse audience interested in AI research.",
33-
"metaTitle": "Sobre Mí",
34-
"metaDescription": "Conoce más sobre mi trayectoria académica y profesional.",
36+
"metaTitle": "About Me | Eric Lucero",
37+
"metaDescription": "Learn more about my academic background, professional career, and research interests in AI.",
3538
"thumbnailImage": "https://res.cloudinary.com/dcvnw6hvt/image/upload/v1765116599/elCronopio/Thumbnails/portada-es_thhyg5.png",
3639
"stack_title": "Tech stack",
37-
"stack_Next": "El motor principal del sitio. Aprovecho su capacidad de Static Site Generation (SSG) para compilar todo el blog en archivos HTML estáticos. Esto garantiza una velocidad de carga casi instantánea, máxima seguridad y un despliegue fluido en GitHub Pages sin necesidad de servidores complejos.",
38-
"stack_React": "La librería de interfaz. Me permite pensar en la web como piezas de LEGO (componentes) reutilizables. Desde la barra de navegación hasta las tarjetas de los posts, todo es un componente modular que gestiona su propio estado y lógica.",
39-
"stack_javascript": "El lenguaje que conecta todo. Lo utilizo tanto para la lógica de interfaz como para las simulaciones interactivas (como los algoritmos genéticos) que corren directamente en tu navegador.",
40-
"stack_styled": "CSS en esteroides. Me permite escribir estilos CSS reales dentro de mis componentes de JavaScript. Es la herramienta clave que gestiona el sistema de temas (modo Dark/Light) y asegura que los estilos de un componente no rompan los de otro.",
41-
"stack_i18n": "La capa de internacionalización. Gestiona el enrutamiento dinámico (/es, /en) y la carga optimizada de diccionarios JSON compatible con Server Components. Es lo que permite que este blog sea nativamente bilingüe sin sacrificar el rendimiento estático.",
42-
"stack_fontawesome": "Provee la iconografía vectorial del sitio (redes sociales, indicadores de UI). Al ser SVGs, se ven nítidos en cualquier resolución y tamaño de pantalla sin afectar el rendimiento.",
43-
"stack_MDX": "Mucho más que texto plano. MDX me permite escribir los artículos en Markdown estándar, pero incrustando componentes de React interactivos (gráficas, simuladores) directamente entre los párrafos. Es lo que hace que este blog sea 'vivo' y no solo texto estático.",
44-
"stack_remark": "El cerebro detrás del texto. Es el procesador que lee mis archivos Markdown y construye un 'Árbol de Sintaxis Abstracta' (AST). Básicamente, entiende la estructura de mis apuntes y permite transformarlos en HTML seguro.",
45-
"stack_latex": "El estándar de oro en la escritura académica. Gracias a la integración con Remark, puedo escribir ecuaciones complejas y notación científica (como $\\Sigma$) directamente en el Markdown. El sistema las renderiza como vectores matemáticos perfectos, esenciales para explicar papers y algoritmos."
40+
"stack_Next": "The site's main engine. I leverage its Static Site Generation (SSG) capabilities to compile the entire blog into static HTML files. This guarantees near-instant load speeds, maximum security, and seamless deployment on GitHub Pages without the need for complex servers.",
41+
"stack_React": "The interface library. It allows me to think of the web as reusable LEGO pieces (components). From the navigation bar to the post cards, everything is a modular component managing its own state and logic.",
42+
"stack_javascript": "The language connecting everything. I use it for both interface logic and interactive simulations (like genetic algorithms) that run directly in your browser.",
43+
"stack_styled": "CSS on steroids. It allows me to write real CSS styles inside my JavaScript components. It is the key tool managing the theme system (Dark/Light mode) and ensures that one component's styles do not break another's.",
44+
"stack_i18n": "The internationalization layer. It manages dynamic routing (/es, /en) and optimized JSON dictionary loading compatible with Server Components. It enables this blog to be natively bilingual without sacrificing static performance.",
45+
"stack_fontawesome": "Provides the site's vector iconography (social media, UI indicators). Being SVGs, they look crisp at any resolution and screen size without affecting performance.",
46+
"stack_MDX": "Much more than plain text. MDX allows me to write articles in standard Markdown while embedding interactive React components (charts, simulators) directly between paragraphs. This is what makes this blog 'alive' and not just static text.",
47+
"stack_remark": "The brain behind the text. It is the processor that reads my Markdown files and builds an 'Abstract Syntax Tree' (AST). Basically, it understands the structure of my notes and transforms them into secure HTML.",
48+
"stack_latex": "The gold standard in academic writing. Thanks to the integration with Remark, I can write complex equations and scientific notation (like $\\Sigma$) directly in Markdown. The system renders them as perfect mathematical vectors, essential for explaining papers and algorithms."
4649
},
4750
"Blog": {
4851
"readingTime": "Reading time",
@@ -66,17 +69,17 @@
6669
},
6770
"NotFound": {
6871
"title": "Page Not Found",
69-
"description": "Sorry, the page you are looking for does not exist.",
72+
"description": "Sorry, the page you are looking for does not exist or has been moved.",
7073
"backHome": "Back to Home"
7174
},
7275
"Legal": {
7376
"title": "Legal Notice & Privacy",
7477
"lastUpdated": "Last updated: December 2025",
7578
"sections": {
76-
"intro": "This website is a personal and academic portfolio with no direct commercial purpose. Below is the legal information required by Spanish and European regulations.",
79+
"intro": "This website is a personal and academic portfolio with no direct commercial purpose. My philosophy regarding your privacy is simple: I do not collect unnecessary personal information, I do not track you across the Internet, and I do not sell your data. Below is the legal information required by Spanish and European regulations.",
7780
"owner": {
7881
"title": "1. Site Owner",
79-
"content": "The owner of this website is **Eric Lucero González**. You can contact me regarding this site at: **ericlucerogonzalez@gmail.com**."
82+
"content": "The owner of this website is **Eric Lucero González** (hereinafter, 'the Owner'). You can contact me regarding this site at: **ericlucerogonzalez@gmail.com**."
8083
},
8184
"data": {
8285
"title": "2. Data Protection (GDPR)",
@@ -85,8 +88,9 @@
8588
"hosting": {
8689
"title": "3. Hosting & Third Parties",
8790
"content": "For technical operation, this site uses third-party services that may process technical data (such as IP addresses) to serve content:",
88-
"github": "**GitHub Pages:** Website hosting. Collects standard server logs (IP address, browser) for security and maintenance.",
89-
"cloudinary": "**Cloudinary:** Image optimization and delivery."
91+
"github": "**GitHub Pages:** Website hosting service provided by GitHub, Inc. (USA). When you visit my page, GitHub servers receive your IP address and technical browser data (User-Agent). GitHub uses this data strictly for security purposes (DDoS attack prevention) and service reliability. I do not use these logs to identify you personally. You can consult GitHub's Privacy Policy for more technical details at https://docs.github.com/site-policy/privacy-policies/github-privacy-statement.",
92+
"cloudinary": "**Cloudinary:** Images and videos on this site are served via Cloudinary Ltd., a Content Delivery Network (CDN). When loading these visual resources, your browser makes technical requests to Cloudinary servers. This traffic data is processed to optimize image delivery (e.g., serving the lightest format for your mobile) and ensure security. Cloudinary complies with GDPR and does not use this data to create advertising profiles of my visitors. See their policy at: https://cloudinary.com/privacy",
93+
"base_legal": "The processing of this technical data is based on Legitimate Interest (Art. 6.1.f GDPR) to guarantee network security and the correct technical delivery of the requested content."
9094
},
9195
"cookies": {
9296
"title": "4. Cookie Policy",

messages/es.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
"thumbnailImage": "https://res.cloudinary.com/dcvnw6hvt/image/upload/v1765116599/elCronopio/Thumbnails/portada-es_thhyg5.png"
77
},
88
"HomePage": {
9-
"title": "Bienvenido a mi Blog de Investigación en IA",
10-
"about": "Estudiante de doctorado en España",
9+
"title": "Bienvenido",
10+
"copy_text": "Este sitio web está en construcción, pero pronto será un lugar donde compartiré mi trabajo y aprendizaje en áreas como inteligencia artificial, LaTeX, y algoritmos de optimización.",
11+
"about": "Estudiante de doctorado en IA",
1112
"metaTitle": "Inicio: Mi viaje en la IA",
12-
"metaDescription": "Bienvenido a mi espacio personal donde comparto mis investigaciones."
13+
"metaDescription": "Bienvenido a mi espacio personal donde comparto mis investigaciones, lecturas y demás curiosidades."
1314
},
1415
"Navigation": {
1516
"about": "Acerca de",
@@ -68,7 +69,7 @@
6869
},
6970
"NotFound": {
7071
"title": "Página no encontrada",
71-
"description": "Lo sentimos, la página que buscas no existe o ha sido movida.",
72+
"description": "Lo sentimos, la página que buscas o no existe o ha sido movida o se ha quedado atrapada en un mínimo local.",
7273
"backHome": "Volver al Inicio"
7374
},
7475
"Legal": {

0 commit comments

Comments
 (0)