Internacionalizacion (i18n)
Sección titulada «Internacionalizacion (i18n)»TalentBricksAI usa un sistema de internacionalizacion custom basado en TypeScript puro — sin librerias externas. Soporta español (fuente) e inglés (default, generado por IA).
Arquitectura
Sección titulada «Arquitectura»Archivos de locale
Sección titulada «Archivos de locale»Los archivos de locale estan organizados por dominio bajo app/src/shared/content/locales/:
locales/├── es/ # Español (fuente de verdad, editado manualmente)│ ├── brand.ts│ ├── nav.ts│ ├── auth.ts│ ├── landing.ts│ ├── courses.ts│ ├── pricing.ts│ ├── account.ts│ ├── common.ts│ ├── footer.ts│ ├── errors.ts│ ├── admin.ts│ ├── certificate.ts│ └── index.ts # Re-exporta todo como `es` + tipo `LocaleContent`├── en/ # inglés (generado por IA)│ ├── brand.ts│ ├── ... (misma estructura)│ └── index.ts # Tipado como `LocaleContent` desde es/Cada módulo de dominio exporta un objeto const con asercion as const:
export const nav = { home: "inicio", courses: "Cursos", pricing: "Precios", login: "Iniciar sesión", logout: "Cerrar sesión", // ...} as const;Runtime (i18n.tsx)
Sección titulada «Runtime (i18n.tsx)»El archivo app/src/shared/i18n.tsx contiene:
I18nProvider: React Context que envuelve la app enApp.tsxuseTranslation(): Hook que retorna{ locale, setLocale, t }t(key): función que navega por paths con punto (ej:t("courses.detail.title"))
Cadena de fallback
Sección titulada «Cadena de fallback»- Locale actual (ej:
en) - Español (
es) - El key como string +
console.warnen desarrollo
Persistencia
Sección titulada «Persistencia»El locale se guarda en localStorage bajo la key talentbricks-locale. Default: "en".
Uso en componentes
Sección titulada «Uso en componentes»Componentes React
Sección titulada «Componentes React»import { useTranslation } from "../shared/i18n";
export function MyComponent() { const { t } = useTranslation();
return ( <div> <h1>{t("courses.catalog.title")}</h1> <p>{t("courses.catalog.subtitle")}</p> </div> );}Archivos de constantes (no-componentes)
Sección titulada «Archivos de constantes (no-componentes)»Para archivos que exportan constantes a nivel de módulo, usar funciones factory:
// Antes (no reactivo al cambio de idioma):export const items = [{ name: es.nav.courses, to: "/courses" }];
// Después (reactivo):export function getItems(t: (key: string) => any) { return [{ name: t("nav.courses"), to: "/courses" }];}Acceder a objetos y arrays
Sección titulada «Acceder a objetos y arrays»t() retorna any — puede devolver strings, arrays u objetos:
// Acceder a un objeto de dificultadconst difficulties = t("courses.detail.difficulty") as Record<string, string>;const label = difficulties[course.difficulty]; // "Principiante"
// Acceder a un arrayconst features = t("courses.detail.includesList") as string[];LanguageSwitcher
Sección titulada «LanguageSwitcher»El componente LanguageSwitcher está en app/src/client/components/LanguageSwitcher.tsx. Es un
toggle EN/ES que se muestra en el NavBar (desktop y mobile).
Agregar nuevas cadenas traducibles
Sección titulada «Agregar nuevas cadenas traducibles»- Agregar la key en el archivo de dominio correspondiente bajo
locales/es/ - Agregar la traduccion equivalente en
locales/en/ - Usar
t("dominio.key.path")en el componente - Nunca hardcodear strings traducibles en componentes
Agregar un nuevo dominio
Sección titulada «Agregar un nuevo dominio»- Crear
locales/es/nuevo-dominio.tsconexport const nuevoDominio = { ... } as const; - Crear
locales/en/nuevo-dominio.tscon la misma estructura - Importar y re-exportar en ambos
index.ts - El tipo
LocaleContentse actualizara automaticamente
Notas importantes
Sección titulada «Notas importantes»- El español (
es/) es la fuente de verdad — se edita manualmente - El inglés (
en/) se genera por IA pero puede editarse manualmente - Los terminos tecnicos se mantienen en inglés en ambos idiomas: Data Engineering, MLOps, Databricks, etc.
- Los placeholders con
{variable}deben preservarse exactamente entre idiomas