S-011 – Desarrollo de aplicaciones Svelte5 multi-idiomas

He solicitado a una IA que me describa las ventajas y los inconvenientes de desarrollar aplicaciones Multi-idiomas.

Es muy importante que tenga esta arquitectura aunque inicialmente sólo tengas un idioma.

Ventajas de desarrollar aplicaciones multi-idioma

1. Accesibilidad global

  • Permite que usuarios de distintas regiones accedan y comprendan la aplicación sin barreras lingüísticas.
  • Aumenta el alcance potencial del producto sin necesidad de rehacer la interfaz.

2. Mejora de la experiencia de usuario

  • El usuario se siente más cómodo y valorado al interactuar en su idioma nativo.
  • Reduce la fricción y mejora la retención.

3. Escalabilidad sin dolor

  • Si se diseña con un sistema de internacionalización (i18n) desde el principio, añadir nuevos idiomas es cuestión de incorporar archivos de traducción, sin tocar el código base.
  • Svelte5, con su enfoque modular, permite que los textos estén desacoplados del componente, facilitando el cambio de idioma sin alterar la lógica.

4. Ventaja competitiva

  • En mercados saturados, ofrecer soporte multilingüe puede ser el factor diferenciador.
  • Mejora la percepción de marca como inclusiva y profesional.

5. Cumplimiento normativo

  • En algunos países, ofrecer contenido en el idioma oficial es obligatorio para ciertos sectores (educación, salud, administración pública).
Inconvenientes (¡pero todos tienen solución!)

1. Mayor esfuerzo inicial

  • Requiere planificación: definir estructura de archivos, claves de traducción, y lógica para cambiar idioma.
  • Pero si se hace bien desde el principio, el esfuerzo se amortiza rápidamente.

2. Gestión de traducciones

  • Necesitas mantener consistencia entre idiomas, revisar calidad lingüística y actualizar textos en paralelo.
  • Solución: usar herramientas como i18next, locize, o incluso sistemas propios con JSONs bien estructurados.

3. Contenido dinámico

  • Los textos generados por usuarios o APIs externas pueden no estar traducidos.
  • Solución: marcar claramente qué contenido es traducible y cuál no, o usar traducción automática como apoyo.

4. SEO multilingüe

  • Si la app es pública, hay que cuidar que los motores de búsqueda indexen correctamente cada idioma.
  • Solución: usar rutas específicas por idioma (/es, /en, etc.) y etiquetas hreflang.
Buen diseño = cambios sin dolor

Si desde el inicio se estructura la app con un sistema de claves de traducción (por ejemplo: t(‘welcome_message’)), cambiar el idioma es tan simple como cargar otro archivo de traducción. No se toca el HTML, ni los componentes, ni la lógica. Solo se cambia el contexto lingüístico.

En Svelte5, esto se puede lograr con:

  • Stores reactivos para el idioma actual.
  • Archivos .json por idioma.
  • Componentes que consumen las traducciones sin acoplarse al idioma específico.

Objetivo

Disponer de una solución ara desarrollos multilingües, con costes muy reducidos y fáciles de entender y de aplicar. Debe contemplar los temas de fechas y edición de números.

DEMO: https://fhumanes.com/svelte-i18n/

Solución Técnica

Para solucionar esta funcionalidad he seleccionado y utilizado la solución «Svelte-i18«.

El ejemplo es muy, muy simple, pero creo que es suficiente para ver la potencia de la solución y sobre todo la facilidad de uso.

Voy a mostrar los 3 ficheros principales que he utilizado, la aplicación y 2 ficheros para mantener las traducciones, Los ficheros de las traducciones los he puesto en el directorio de «locales» y son «es.json» para el inglés y «es.json» para español.

App.svelte
<script>
  import { _, locale, isLoading, date, number } from 'svelte-i18n';

  // Variables de ejemplo para la demostración
  let name = 'Usuario';
  let today = new Date();
  let price = 123456.78; // Un número grande para ver el formato
  
  // Función para cambiar el idioma
  function switchLanguage(lang) {
    locale.set(lang);
  }
</script>

{#if $isLoading}
  <div>Cargando traducciones...</div>
{:else}
  <main>
    <h1>{$_('app.title')}</h1>
    <p>{$_('greeting')}</p>
    
    <p>{$_('app.welcome', { values: { name } })}</p>

    <hr />

    <h3>{$_('titleGroup')}</h3>

    <p>{$_('dateInfo', { values: { date: $date(today, { dateStyle: 'full' }) } })}</p>
    
    <p>
      {$_('priceInfo', { values: {
        price: $number(price, {
          style: 'currency',
          currency: 'EUR',
          currencyDisplay: 'symbol',
          minimumFractionDigits: 2,
          maximumFractionDigits: 2
        })
      }})}
    </p>

    <hr />

    <div>
      <button on:click={() => switchLanguage('en')}>English</button>
      <button on:click={() => switchLanguage('es')}>Español</button>
    </div>
  </main>
{/if}
en.json
{
  "app": {
    "title": "My Svelte App",
    "welcome": "Welcome, {name}!"
  },
  "titleGroup": "Dates & Numbers",
  "greeting": "Hello!",
  "dateInfo": "Today is {date}",
  "priceInfo": "The price is {price}"
}
es.json
{
  "app": {
    "title": "Mi aplicación Svelte",
    "welcome": "¡Bienvenido, {name}!"
  },
  "titleGroup": "Fechas y Números",
  "greeting": "¡Hola!",
  "dateInfo": "Hoy es {date}",
  "priceInfo": "El precio es {price}"
}

Ceo que la solución de agrupar las traducciones por funciones, módulos, etc., es la solución más adecuada. En el ejemplo, se puede ver el grupo «app».

Como siempre, os dejo el fuente para que hagáis las pruebas que requiráis y para cualquier duda, podéis contactar conmigo a través de mi email.

Adjuntos

Archivo Tamaño de archivo Descargas
zip svelte-i18n 22 KB 5

Blog personal para facilitar soporte gratuito a usuarios de React y PHPRunner