...
Para la internacionalización de nuestros servicios FundeWebJS utilizamos la librería i18n. En el proyecto Portal UI ya viene configurado por lo que sólo tendremos que hacer los siguientes pasos.
Para guardar nuestras cadenas de texto, y poder tenerlas en diferentes idiomas, haremos uso de la libreríaVue i18n. Antes de nada, para empezar a usarlo tenemos que descargar el paquete:
| Bloque de código |
|---|
npm install vue-i18n |
Hay diferentes formas de organizar esto en nuestro proyecto, pasamos a verlas.
Para inicializar i18n, crearemos la instancia en elsrc/locales/index.js, de la siguiente manera:
| Bloque de código |
|---|
|
import Vue from "vue";
import VueI18n from "vue-i18n";
Vue.use(VueI18n);
// Importamos locales
import es from "./es.js";
import en from "./en.js";
export const messages = {
es,
en,
};
export default new VueI18n({
locale: process.env.VUE_APP_I18N_LOCALE || "es",
fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || "es",
silentTranslationWarn: true,
messages,
}); |
Además, al crear la instancia de Vue, tendremos que importarlo e incluirlo en elnew Vuedel archivomain.js:
| Bloque de código |
|---|
|
import i18n from '@/locales'
new Vue({
router,
store,
i18n,
render: h => h(App)
}).$mount("#app"); |
...
Podemos definir los mensajes de dos maneras diferentes, o bien en archivosun archivo .js dedicadosjson para nuestro servicio, o dentro de los mismos componentespropios componentes. Lo más recomendable es definirlos en un archivo .json.
En
...
archivo .json
En cada servicio, tendremos una carpeta locales/, en la que añadiremos un arhivo .json para los textos. Este archivo definirá los mensajes tanto en español (es) como en inglés (en). Por ejemploLa forma más intuitiva de gestionar los diferentes locales disponibles, será tener cada uno en un archivo dentro desrc/locales. Si por ejemplo tenemos español e inglés, tendremoses.jsyen.js, respectivamente, y seguirán la siguiente estructura:
| Bloque de código |
|---|
|
{
"es":// es.js
export default {
helloworld: "¡Hola mundo!",
testabrir_resguardo": "Esto es una prueba",
};
// en.js
export default {
helloworld: "Hello world!",
test: "This is a test",
}; |
Por último, tendremos que juntar los diferentes locales en un objeto, ensrc/locales/index.js:
| Bloque de código |
|---|
|
import Vue from "vue";
import VueI18n from "vue-i18n";
Vue.use(VueI18n);
// Importamos locales
import es from "./es.js";
import en from "./en.js";
export const messages = {
es,
en,
};
export default new VueI18n({
locale: process.env.VUE_APP_I18N_LOCALE || "es",
fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || "es",
silentTranslationWarn: true,
messages,
}); |
En los propios componentes
Otra opción, que puede ser útil para, por ejemplo, compartir componentes en el repositorio, es definir los mensajes en los propios archivos .vue de los componentes.
Para esto, es necesario añadir eli18n-loader:
| Bloque de código |
|---|
npm install @kazupon/vue-i18n-loader |
Después, en la raíz del proyecto, debemos crear el archivovue.config.js, que contenga lo siguiente:
| Bloque de código |
|---|
|
module.exports = {
chainWebpack: config => {
config.module
.rule("i18n")
.resourceQuery(/blockType=i18n/)
.type('javascript/auto')
.use("i18n")
.loader("@kazupon/vue-i18n-loader")
.end();
}
} |
Abrir resguardo",
"aqui": " aquí",
"curso_academico": "Curso académico"
},
"en": {
"abrir_resguardo": "Open receipt",
"aqui": " here",
"curso_academico": "Course"
}
} |
Después, para importar estos mensajes en nuestros componentes, tendremos que añadir un bloque <i18n>, indicándole el archivo que los contiene de esta manera:
| Bloque de código |
|---|
|
<i18n src="../locales/localesResguardoMatricula.json"></i18n> |
En los propios componentes
La otra opción es añadir los mensajes en los propios componentes, dentro del bloque <i18n> que hemos añadido.Con esto, nos podemos definir los mensajes en un bloque entre tags<i18n>, por ejemplo:
| Bloque de código |
|---|
|
<i18n>
{
"es": {
"helloworld": "¡Hola mundo!",
"test": "Esto es una prueba"
},
"en": {
"helloworld": "Hello world!",
"test": "This is a test"
}
}
</i18n> |
Para mostrar las cadenas de texto, lo haremos concon $t('nombreCadena') en el template, y en la parte javascript con this.$t('nombreCadena'):
| Bloque de código |
|---|
|
<Column :header="$t('tituloColumna')" />
<span>
{{ $t('texto') }}
</span>
...
unaFuncion() {
...
this.$t('error_descarga')
} |
En Vuex, al estar en otro contexto, no podemos acceder a this, por lo que tendremos que importar i18n y utilizarlo así:
| Bloque de código |
|---|
|
import i18n from '@/locales'
i18n.t("nombreCadena") |
Podemos poner parámetros en los mensajes de declarados en en.js y es.js de forma:
| Bloque de código |
|---|
|
export default {
introduccion: "La descripcion de {nombre} es la siguiente:",
}; |
y usarlos de forma:
| Bloque de código |
|---|
|
$t('introduccion', {nombre: nombreUsuario}) |
En las aplicaciones, lo normal es que queramos cambiar el idioma en la aplicación completa, en todos los compones. Para cambiar el idioma globalmente tendremos que modificar this.$root.$i18n.locale:
| Bloque de código |
|---|
|
onClick() {
if (this.$root.$i18n.locale === "es") this.$root.$i18n.locale = "en";
else this.$root.$i18n.locale = "es";
} |
Con esto es importante tener en cuenta un detalle, por si nos topamos con que no funciona: no se puede acceder al $root en funciones con la sintaxis flecha () => { ... }. Esto se debe a que este tipo de funciones cogen el contexto de dónde se definen, es decir, el del componente, mientras que para acceder a $root se necesita estar en el contexto de la instancia de Vue, lo que se hace con las funciones normales (nombreFuncion(param) / nombreFuncion: function(param)).
Tenemos otra forma de cambiar el idioma, pero en este caso se cambia para el componente actual y sus hijos. Se haría igual, pero Para cambiar el idioma sólo en un componente, lo podemos hacer desde un método de un componente modificando this.$i18n.locale. Por ejemplo:
| Bloque de código |
|---|
|
onClick() {
if (this.$i18n.locale === "es") this.$i18n.locale = "en";
else this.$i18n.locale = "es";
} |
En cambio, para cambiarlo desde la raíz, es decir, para todos, tendríamos que modificar $root.$i18n.locale.
...
Esto se puede utilizar también para cambiar el idioma en toda la aplicación si lo hacemos en el componente inicial, en el App.vue, pero si lo hacemos en otro componente tenemos que tener en cuenta que se perderá al navegar a otro componente y volver. Si por algún caso de uso de nuestras aplicaciones es necesario, se puede utilizar, pero lo más habitual será cambiar el idioma globalmente.
Para consultar la documentación oficial, con todas las opciones disponibleesdisponibles, podemos irnos aquí. Algunas opciones útiles que podemos consultar en la documentación son la pluralización (cadenas en singular o plural), gestión de fechas, o números.