En este artículo aprenderemos a hacer una aplicación multilenguaje con VueJS 3 y la librería vue-i18n.

Traducir aplicación VueJS 3 con i18n

Para comenzar, instalaremos la librería Vue-i18n. Puedes utilizar tanto npm como yarn, te dejo las dos opciones (previamente instalados):

# Yarn 
  yarn add vue-i18n@9 

# npm
  npm install vue-i18n@9

Una vez tengamos instalada la librería, nos dirigimos a la carpeta src de nuestro proyecto y crearemos una carpeta llamada locales.

En esta carpeta crearemos dos JSON en.json y es.json. En estos archivos añadiremos los textos que se mostrarán en nuestra aplicación dependiendo del lenguaje del usuario. en.json:

{
  "home": {
    "title": "Hello Vue App translated",
    "description": "This is a simple Vue app that demonstrates how to use Vue i18n for localization."
  },
  "contact": {
    "title": "Contact Us",
    "description": "Please contact us at 123-456-7890 or email us at"
  }
}

es.json:

{
  "home": {
    "title": "Hola Aplicación Vue traducida",
    "description": "Esta es una simple aplicación Vue que demuestra cómo usar Vue i18n para la localización."
  },
  "contact": {
    "title": "Contáctanos",
    "description": "Por favor, contáctanos al 123-456-7890 o envíanos un correo electrónico a"
  }
}

Podemos crear tantos idiomas como queramos, creando sus respectivos archivos, como hemos hecho con el inglés y el español.

Añadiendo i18n a VueJS

Ahora nos dirigimos al archivo main.js, que se encuentra en la carpeta src de nuestro proyecto VueJS.

main.js:

import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";

import { createI18n } from 'vue-i18n'

import es from "./locales/es.json";
import en from "./locales/en.json";

const i18n = createI18n({
  locale: navigator.language, // Idioma del navegador
  fallbackLocale: "es", // Si no encuentra la traducción en el idioma actual, buscará en español
  messages: { es, en }, // Nuestros archivos de traducción
  legacy: false, // Para que no muestre advertencias en la consola
});

const app = createApp(App);
app.use(i18n);
app.mount("#app");

Añadir traducción a componente VueJS

Para comprobar que todo funciona correctamente, iremos al componente dónde queramos añadir el mensaje que tenemos en el JSON y añadiremos lo siguiente:

<template>
  <h1>{{ t('home.title') }}</h1>
  <p>{{ t('home.description') }}</p>
</template>

<script setup>
import { useI18n } from 'vue-i18n'

const { t,} = useI18n();

</script>

Elegir idioma de la aplicación

También podemos añadir un select con la lista de idiomas disponibles, para que el usuario pueda cambiarlo.

<template>
  <select @change="changeLanguage" v-model="selectedLanguage">
    <option value="en-EN">English</option>
    <option value="es-ES">Español</option>
  </select>

  <h1>{{ t('home.title') }}</h1>
  <p>{{ t('home.description') }}</p>
</template>

<script setup>
import { ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'

const { t, locale } = useI18n();

const selectedLanguage = ref(locale.value)

const changeLanguage = (event) => {
  locale.value = event.target.value;
};

watch(selectedLanguage, (newLocale) => {
  locale.value = newLocale;
});
</script>