Componentes con bifurcación

Cómo usar componentes con bifurcación para contenido condicional dentro de traducciones

Los componentes con bifurcación permiten renderizar contenido condicional dentro de los componentes <T>. Manejan lógica dinámica como if/else y reglas de pluralización, y garantizan que todas las variaciones de contenido puedan traducirse correctamente.

Componentes disponibles

  • <Branch>: Contenido condicional basado en valores o estados
  • <Plural>: Pluralización automática según las reglas específicas del locale

Guía rápida

Los componentes de ramificación funcionan dentro de <T> para gestionar lógica condicional:

import { T, Branch, Plural, Num, Var } from 'gt-react';

function NotificationPanel({ user, messageCount }) {
  return (
    <T>
      <Branch 
        branch={user.status}
        online={<p><Var>{user.name}</Var> está conectado</p>}
        away={<p><Var>{user.name}</Var> está ausente</p>}
      >
        <p>Estado de <Var>{user.name}</Var> desconocido</p>
      </Branch>
      
      <Plural
        n={messageCount}
        one={<p>Tienes <Num>{messageCount}</Num> mensaje</p>}
        other={<p>Tienes <Num>{messageCount}</Num> mensajes</p>}
      />
    </T>
  );
}

Cómo funcionan los componentes de ramificación

Los componentes de ramificación resuelven el renderizado condicional dentro de las traducciones mediante:

  1. Reemplazar operadores ternarios y lógica condicional dentro de <T>
  2. Proporcionar contenido de respaldo predeterminado cuando las condiciones no coinciden con los valores esperados
  3. Permitir la traducción de todas las posibles variaciones de contenido
  4. Seguir las reglas de locale para la pluralización automáticamente
// ❌ Esto falla - lógica condicional en <T>
<T><p>{isActive ? 'El usuario está activo' : 'El usuario está inactivo'}</p></T>

// ✅ Esto funciona - lógica condicional con ramificación
<T>
  <Branch 
    branch={isActive} 
    true={<p>El usuario está activo</p>}
    false={<p>El usuario está inactivo</p>}
  />
</T>

Guía de componentes

<Branch> - Contenido condicional

Usa <Branch> para cualquier renderizado condicional basado en valores o estados:

// Visualización del estado del usuario
<T>
  <Branch 
    branch={user.role}
    admin={<p>Panel de Administrador</p>}
    user={<p>Panel de Usuario</p>}
    guest={<p>Acceso de Invitado</p>}
  >
    <p>Nivel de acceso desconocido</p>
  </Branch>
</T>

// Condiciones booleanas
<T>
  <Branch 
    branch={isLoggedIn}
    true={<p>¡Bienvenido de nuevo!</p>}
    false={<p>Por favor, inicia sesión</p>}
  />
</T>

// Niveles de suscripción
<T>
  <Branch
    branch={subscription.tier}
    free={<p>Actualiza para desbloquear funciones premium</p>}
    premium={<p>Disfruta tu experiencia premium</p>}
    enterprise={<p>Contacta soporte para soluciones empresariales</p>}
  >
    <p>Estado de suscripción no disponible</p>
  </Branch>
</T>

<Plural> - Pluralización inteligente

Usa <Plural> para contenido que cambia según la cantidad:

// Pluralización básica
<T>
  <Plural
    n={itemCount}
    one={<p><Num>{itemCount}</Num> artículo en el carrito</p>}
    other={<p><Num>{itemCount}</Num> artículos en el carrito</p>}
  />
</T>

// Manejo de cero
<T>
  <Plural
    n={notifications}
    zero={<p>No hay notificaciones nuevas</p>}
    one={<p><Num>{notifications}</Num> notificación</p>}
    other={<p><Num>{notifications}</Num> notificaciones</p>}
  />
</T>

// Pluralización compleja (sigue las reglas Unicode CLDR)
<T>
  <Plural
    n={days}
    zero={<p>Vence hoy</p>}
    one={<p>Vence en <Num>{days}</Num> día</p>}
    few={<p>Vence en <Num>{days}</Num> días</p>}
    many={<p>Vence en <Num>{days}</Num> días</p>}
    other={<p>Vence en <Num>{days}</Num> días</p>}
  />
</T>

Combinación con componentes Variable

Los componentes de ramificación y Variable funcionan juntos sin problemas:

<T>
  <Branch
    branch={order.status}
    pending={
      <p>
        El pedido <Var>{order.id}</Var> está pendiente. 
        Total: <Currency currency="USD">{order.total}</Currency>
      </p>
    }
    shipped={
      <p>
        El pedido <Var>{order.id}</Var> fue enviado el <DateTime>{order.shippedDate}</DateTime>
      </p>
    }
    delivered={
      <p>El pedido <Var>{order.id}</Var> fue entregado exitosamente</p>
    }
  >
    <p>Estado del pedido desconocido</p>
  </Branch>
</T>

Cuándo usar componentes con bifurcaciones

Sustituir operadores ternarios

Convierte la lógica condicional para usarla dentro de <T>:

// ❌ No se puede usar operador ternario en <T>
<T>{isActive ? <p>Usuario activo</p> : <p>Usuario inactivo</p>}</T>

// ✅ Usar Branch en su lugar
<T>
  <Branch 
    branch={isActive}
    true={<p>Usuario activo</p>}
    false={<p>Usuario inactivo</p>}
  />
</T>

Gestionar múltiples condiciones

Reemplaza las sentencias switch o múltiples condiciones if/else:

// ❌ Lógica condicional compleja
<T>
  {status === 'loading' ? <p>Cargando...</p> : 
   status === 'error' ? <p>Ocurrió un error</p> : 
   status === 'success' ? <p>¡Éxito!</p> : 
   <p>Estado desconocido</p>}
</T>

// ✅ Lógica de ramificación limpia
<T>
  <Branch
    branch={status}
    loading={<p>Cargando...</p>}
    error={<p>Ocurrió un error</p>}
    success={<p>¡Éxito!</p>}
  >
    <p>Estado desconocido</p>
  </Branch>
</T>

Reglas de pluralización

Sustituye el manejo manual de plurales:

// ❌ Pluralización manual
<T>{count === 1 ? <p>1 elemento</p> : <p>{count} elementos</p>}</T>

// ✅ Pluralización automática
<T>
  <Plural
    n={count}
    one={<p><Num>{count}</Num> elemento</p>}
    other={<p><Num>{count}</Num> elementos</p>}
  />
</T>

Uso independiente

Los componentes de bifurcación pueden usarse fuera de <T> para lógica pura sin traducción:

// Renderizado condicional puro
<Branch
  branch={theme}
  dark={<DarkModeIcon />}
  light={<LightModeIcon />}
>
  <DefaultIcon />
</Branch>

// Pluralización pura
<Plural
  n={count}
  one={<SingleItemComponent />}
  other={<MultipleItemsComponent />}
/>

Problemas comunes

Claves de rama ausentes

Proporciona siempre contenido de respaldo predeterminado para los valores que no coincidan:

// ❌ Sin fallback para valores inesperados
<Branch
  branch={userRole}
  admin={<AdminPanel />}
  user={<UserPanel />}
  // ¿Qué pasa si userRole es "moderator"?
/>

// ✅ Siempre incluir fallback
<Branch
  branch={userRole}
  admin={<AdminPanel />}
  user={<UserPanel />}
>
  <DefaultPanel /> {/* Fallback para cualquier otro valor */}
</Branch>

Formas plurales incompletas

Proporciona las formas plurales necesarias para tu locale por defecto:

// ❌ Falta la forma "other"
<Plural
  n={count}
  one={<p>1 elemento</p>}
  // ¿Qué pasa con 0, 2, 3, etc.?
/>

// ✅ Incluir las formas requeridas
<Plural
  n={count}
  zero={<p>Sin elementos</p>}
  one={<p>1 elemento</p>}
  other={<p>{count} elementos</p>}
/>

Lógica compleja anidada

Aunque esto funciona, recomendamos mantener la lógica de bifurcación simple y evitar anidar en exceso:

// ❌ Ramificación anidada compleja
<Branch branch={status}>
  <Branch branch={subStatus}>
    {/* Difícil de leer y mantener */}
  </Branch>
</Branch>

// ✅ Simplificar la lógica o usar múltiples componentes
<Branch
  branch={`${status}-${subStatus}`}
  active-online={<ActiveOnline />}
  active-offline={<ActiveOffline />}
  inactive-online={<InactiveOnline />}
>
  <DefaultState />
</Branch>

Obtén más información sobre las reglas de pluralización en la documentación de Unicode CLDR.

Próximos pasos

¿Qué te ha parecido esta guía?

Componentes con bifurcación