vuex-i18n
We are big fans of the awesome vue, vuex and vue-router libraries and were just
looking for an easy to use internationalization plugin, employing as much of
the "standard library" as possible.
The main difference to other internationalization plugins is the ease of use
and support for locales directly with the application or later from the server.
Requirements
Installation
$ npm install vuex-i18n
Setup
The vuex-i18n plugin is intended to be used for applications that use vuex as
store and require localized messages. Make sure that both vue and vuex have
been loaded beforehand.
The plugin provides a vuex module to store the localization information and
translations and a plugin to allow easy access from components.
The plugin does not make any assumption on how you want to load the localization
information. It can be loaded on start in your application bundle or dynamically
after when the user is switching to a different language.
A corresponding example can be found in the test directory.
import Vue from 'vue';
import Vuex from 'vuex';
import vuexI18n from 'vuex-i18n';
const store = new Vuex.Store();
Vue.use(vuexI18n.plugin, store);
const translationsEn = {
"content": "This is some {type} content"
};
const translationsDe = {
"My nice title": "Ein schöner Titel",
"content": "Dies ist ein toller Inhalt"
};
Vue.i18n.add('en', translationsEn);
Vue.i18n.add('de', translationsDe);
Vue.i18n.set('en');
var app = new Vue({
store,
el: '#app',
template: `
<div>
<h1>{{ 'My nice title' | translate }}</h1>
<p>{{ $t('content', {'type': 'nice'}) }}</p>
</div>
`
});
You can specify a custom module name for vuex (default is 'i18n') or a callback that is triggered
when a key has no translation for the current locale. Please note, that the function
supplied for onTranslationNotFound will be called if the key is not in the actual
locale or a parent locale (ie. en for en-us), however, the key might still be available
in the fallback locale.
If a return value is given, this will be used as translation text for the key
that was not found. It is also possible to return a promise. This will allow you
to dynamically fetch the data from an api. Be aware, that the key will only
be resolved once and then written like any other key into the store. Therefore
subsequent calls of the same key will not trigger the onTranslationNotFound method.
Vue.use(vuexI18n.plugin, store, {
moduleName: 'i18n',
onTranslationNotFound (locale, key) {
console.warn(`i18n :: Key '${key}' not found for locale '${locale}'`);
}}
);
Vue.use(vuexI18n.plugin, store, {
moduleName: 'i18n',
onTranslationNotFound (locale, key) {
switch(key) {
case: '200':
return 'Everything went fine';
break;
default:
return 'There was a problem';
}
}}
);
Vue.use(vuexI18n.plugin, store, {
moduleName: 'i18n',
onTranslationNotFound (locale, key) {
return new Promise((resolve, reject) => {
axios.get('/api/translations/async', {locale: locale, key:key})
.then((result) => {
resolve(result.data);
}).catch() {
reject();
}
})
}}
);
Config
You can pass a config object as the third parameter when use vuex-i18n.
i.e. Vue.use(vuexI18n.plugin, store, config)
At present, the configuration options that are supported are as follows:
moduleName
(default i18n
)identifiers
(default ['{', '}']
)preserveState
(default false
)translateFilterName
(default translate
)translateInFilterName
(default translateIn
)onTranslationNotFound
(default function(){}
)warnings
: default(true
)
const config = {
moduleName: 'myName',
translateFilterName: 't'
}
Vue.use(vuexI18n.plugin, store, config)
Usage
vuex-i18n provides easy access to localized information through the use of
the $t()
method or the translate
filter.
The plugin will try to find the given string as key in the translations of the
currently defined locale and return the respective translation. If the string
is not found, it will return as is. This wil allow you to setup an application
very quickly without having to first define all strings in a separate template.
It is also possible to specify a fallback-locale $i18n.fallback(locale)
. If
the key is not found in current locale, vuex-i18n will look for the key in the
fallback-locale. If the key can not be found in the fallback-locale either,
the key itself will be returned as translation.
<div>
{{ $t('Some localized information')}}
</div>
In larger projects, it is often easier to use a more robust translation key instead
of the default text. Therefore it is also possible to specify the key and
default translation. The default value will only be used, if the key cannot be
found in the current and in the fallback locale.
<div>
{{ $t('non.existing.key', 'Default information text')}}
</div>
Dynamic parameters that can be passed to the translation method in the form of
key/value pairs.
<div>
{{ $t('You have {count} new messages', {count: 5}) }}
</div>
It is possible to specify custom identifiers for variable substitutions. The
respective identifiers - start and stop - must be passed when initializing the
module. Please note that a regular expression is used to match the tags.
Therefore it might be necessary to escape certain characters accordingly.
Vue.use(vuexI18n.plugin, store, {
identifiers: ['{{','}}']
});
Basic pluralization is also supported. Please note, that the singular translation
must be specified first, followed by plural translations denoted by :::
.
Up to six pluralization forms are supported based on configuration taken from vue-gettext.
The second option is used for variable replacements. The third option to define if
the singular or pluralized translation should be used (see below for examples).
<div>
{{ $t('You have {count} new message ::: You have {count} new messages', {count: 5}, 5) }}
{{ $t('mykey', {count: 5}, 5) }}
const translations = {
'mykey': 'You have {count} new message ::: You have {count} new messages'
}
const translations = {
'mykey': [
'You have {count} new message',
'You have {count} new messages'
]
}
</div>
<div>
{{ $t('{count} bērns ::: {count} bērni ::: {count} bērnu', {count: 5}, 5) }}
</div>
The current locale can be set using the $i18n.set()
method. By default, the
translation method will select the pre-specified current locale. However, it is
possible to request a specific locale using the $tlang()
method.
<div>
{{ $tlang('en', 'You have {count} new messages', {count: 5}) }}
</div>
There are also several methods available on the property this.$i18n
or Vue.i18n
$t(), Vue.i18n.translate()
$tlang(), Vue.i18n.translateIn()
$i18n.locale(), Vue.i18n.locale()
$i18n.locales(), Vue.i18n.locales()
$i18n.set(locale), Vue.i18n.set(locale)
$i18n.add(locale, translations), Vue.i18n.add(locale, translations)
$i18n.replace(locale, translations), Vue.i18n.replace(locale, translations)
$i18n.remove(locale), Vue.i18n.remove(locale)
$i18n.fallback(locale), Vue.i18n.fallback(locale)
$i18n.localeExists(locale), Vue.i18n.localeExists(locale)
$i18n.keyExists(key), Vue.i18n.keyExists(key)
$i18n.keyExists(key, 'strict'), $i18n.keyExists(key, 'locale'), $i18n.keyExists(key, 'fallback'),
Third-Party Integration
Thanks to Liip Team Amboss for developing an interactive translation manager for node.js. You can find it at https://github.com/liip-amboss/locale-man.
Contributions
Any comments or suggestions are very welcome.