content: descripciones full-stack de Fast Byte y GMN (web + detalle)#75
Conversation
…ge stack" This reverts commit f05fd7e.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Code Review
This pull request introduces dynamic project detail rendering on the project detail page by fetching localized content (metrics, sections, and tech stacks) from translation files, supported by a new utility and unit tests. It also updates career experience details in both English and Spanish translation files. The review feedback correctly highlights several internationalization issues in the page component, specifically the use of hardcoded Spanish strings and manual string manipulation for category names instead of utilizing translated keys.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| const details = t.raw('details') as Record<string, ProjectDetailContent> | undefined; | ||
| const detail = getProjectDetail(details, slug); |
There was a problem hiding this comment.
Para mejorar la internacionalización (i18n) y evitar mostrar identificadores técnicos o no traducidos (como gestion-servicios o facturacion-compliance formateados con espacios), es mejor recuperar el nombre traducido de la categoría desde el archivo de traducciones (categories).
const details = t.raw('details') as Record<string, ProjectDetailContent> | undefined;
const detail = getProjectDetail(details, slug);
const categories = t.raw('categories') as { id: string; name: string }[] | undefined;
const categoryName = categories?.find((c) => c.id === project.categoryId)?.name ?? project.categoryId.replace(/-/g, ' ');
| <p className="text-sm uppercase tracking-[0.3em] text-accent/80"> | ||
| Detalle en preparación | ||
| {detail ? project.categoryId.replace(/-/g, ' ') : 'Detalle en preparación'} | ||
| </p> |
There was a problem hiding this comment.
Se está utilizando una cadena de texto en español directamente en el código ('Detalle en preparación') y el identificador de categoría sin traducir (project.categoryId.replace(/-/g, ' ')). Esto romperá la localización cuando el usuario cambie de idioma (por ejemplo, a inglés). Se recomienda usar la variable categoryName (traducida) y una clave de traducción para el estado de preparación (por ejemplo, t('labels.inPreparation')), asegurándote de añadir dicha clave en los archivos en.json y es.json.
| <p className="text-sm uppercase tracking-[0.3em] text-accent/80"> | |
| Detalle en preparación | |
| {detail ? project.categoryId.replace(/-/g, ' ') : 'Detalle en preparación'} | |
| </p> | |
| <p className="text-sm uppercase tracking-[0.3em] text-accent/80"> | |
| {detail ? categoryName : t('labels.inPreparation')} | |
| </p> |
| ) : ( | ||
| <article className="space-y-6 rounded-xl border border-border bg-background-secondary/40 p-6 shadow-sm"> | ||
| <p className="text-sm text-foreground-secondary"> | ||
| Estamos preparando una ficha completa con arquitectura, capturas y métricas clave de | ||
| este proyecto. Mientras tanto, puedes solicitar una demo privada o más información | ||
| directa. | ||
| </p> | ||
| <div className="flex flex-wrap gap-3 text-sm text-foreground-secondary/90"> | ||
| <span className="rounded-full border border-border bg-background px-3 py-1 font-mono text-xs uppercase tracking-wide"> | ||
| {project.categoryId.replace(/-/g, ' ')} | ||
| </span> | ||
| ))} | ||
| </div> | ||
| </article> | ||
| {project.tech.map((tech) => ( | ||
| <span | ||
| key={tech} | ||
| className="rounded-full border border-border px-3 py-1 text-xs font-mono text-foreground-secondary" | ||
| > | ||
| {tech} | ||
| </span> | ||
| ))} | ||
| </div> | ||
| </article> | ||
| )} |
There was a problem hiding this comment.
Al igual que en el encabezado, el texto descriptivo del estado de preparación está en español de forma estática, y la categoría se muestra sin traducir. Se recomienda extraer este texto a una clave de traducción (por ejemplo, t('labels.inPreparationDescription')) y usar categoryName para mantener la consistencia multilingüe.
) : (
<article className="space-y-6 rounded-xl border border-border bg-background-secondary/40 p-6 shadow-sm">
<p className="text-sm text-foreground-secondary">
{t('labels.inPreparationDescription')}
</p>
<div className="flex flex-wrap gap-3 text-sm text-foreground-secondary/90">
<span className="rounded-full border border-border bg-background px-3 py-1 font-mono text-xs uppercase tracking-wide">
{categoryName}
</span>
{project.tech.map((tech) => (
<span
key={tech}
className="rounded-full border border-border px-3 py-1 text-xs font-mono text-foreground-secondary"
>
{tech}
</span>
))}
</div>
</article>
)}
|
✅ CI Pipeline passed! All checks completed successfully. |
Refina las descripciones de Fast Byte y GMN / GestionoMiNegocio en el portfolio, con enfoque full-stack y honesto.
Cambios
projects.items, ES/EN): Fast Byte como modernización/migración de ERP; GMN como SaaS multi-tenant de facturación electrónica Veri*factu/AEAT.Kubernetes, GitLab CI, Microservices, API Gateway, Message Queues. GMN: fueraAPI Platform, PostgreSQL, React, TypeScript.about.career.experiences, ES/EN): actualizada para Fast Byte y GMN. (El antiguoexperience.tsresultó ser código muerto; no se usa en el render — se dejó intacto.)projects.details(5 secciones + 4 métricas) para ambos slugs, con selector purogetProjectDetaily render condicional en[slug]/page.tsx(detail ? ficha : stub). Los proyectos sindetailsmantienen el stub "Detalle en preparación".Verificación
next build: EXIT 0, 16/16 páginas estáticas (incluye/es,/en/projects/{fastbyte-api-servicios,gestiono-mi-negocio-facturacion}).tsc --noEmit: limpio.next lint: EXIT 0 (solo warnings<img>preexistentes).Pendiente
getProjectDetailno se ejecutaron en CI local (elnode_modulesde este entorno es de Windows y falta el binario Linux de rollup). Lógica verificada con smoke-test; conviene correrpnpm --filter portfolio test:run src/features/projects/utils/projectDetail.test.ts.f05fd7e+05b7f4bson un edit aexperience.tsy su revert (efecto neto nulo).🤖 Generated with Claude Code