Skip to content

content: descripciones full-stack de Fast Byte y GMN (web + detalle)#75

Merged
GMNAPI merged 9 commits into
masterfrom
feature/fastbyte-gmn-descriptions
Jun 30, 2026
Merged

content: descripciones full-stack de Fast Byte y GMN (web + detalle)#75
GMNAPI merged 9 commits into
masterfrom
feature/fastbyte-gmn-descriptions

Conversation

@GMNAPI

@GMNAPI GMNAPI commented Jun 30, 2026

Copy link
Copy Markdown
Owner

Refina las descripciones de Fast Byte y GMN / GestionoMiNegocio en el portfolio, con enfoque full-stack y honesto.

Cambios

  • Tarjetas (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.
  • Stack corregido (honestidad): se eliminan tecnologías que no están en los repos. Fast Byte: fuera Kubernetes, GitLab CI, Microservices, API Gateway, Message Queues. GMN: fuera API Platform, PostgreSQL, React, TypeScript.
  • Timeline visible (about.career.experiences, ES/EN): actualizada para Fast Byte y GMN. (El antiguo experience.ts resultó ser código muerto; no se usa en el render — se dejó intacto.)
  • Páginas de detalle ricas: nuevo projects.details (5 secciones + 4 métricas) para ambos slugs, con selector puro getProjectDetail y render condicional en [slug]/page.tsx (detail ? ficha : stub). Los proyectos sin details mantienen 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).
  • JSON válido y paridad ES↔EN verificada (5 secciones / 4 métricas por proyecto).

Pendiente

  • ⚠️ Los 3 tests Vitest de getProjectDetail no se ejecutaron en CI local (el node_modules de este entorno es de Windows y falta el binario Linux de rollup). Lógica verificada con smoke-test; conviene correr pnpm --filter portfolio test:run src/features/projects/utils/projectDetail.test.ts.
  • Nota: los commits f05fd7e + 05b7f4b son un edit a experience.ts y su revert (efecto neto nulo).

🤖 Generated with Claude Code

@vercel

vercel Bot commented Jun 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
desenvolupadormaster Ready Ready Preview, Comment Jun 30, 2026 10:42pm
dev-portfolio-lab Ready Ready Preview, Comment Jun 30, 2026 10:42pm

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +43 to +44
const details = t.raw('details') as Record<string, ProjectDetailContent> | undefined;
const detail = getProjectDetail(details, slug);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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, ' ');

Comment on lines 57 to 59
<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>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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.

Suggested change
<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>

Comment on lines +102 to +123
) : (
<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>
)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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>
        )}

@github-actions

Copy link
Copy Markdown

CI Pipeline passed! All checks completed successfully.

@GMNAPI GMNAPI merged commit 627f387 into master Jun 30, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant