What is vue-i18n?
The vue-i18n package is a Vue.js plugin for internationalization. It integrates seamlessly with Vue.js applications to enable easy localization and translation of text content within the app. It supports a variety of features including pluralization, datetime formatting, number formatting, and allows for the organization of translation messages in different locales.
What are vue-i18n's main functionalities?
Localization
This feature allows you to localize your application's content. You can define translation messages for different locales and use the $t function to display the translated message based on the current locale.
{"template": "<p>{{ $t('message.hello') }}</p>", "i18n": {"messages": {"en": {"message": {"hello": "Hello World!"}}, "fr": {"message": {"hello": "Bonjour le monde!"}}}}}
Pluralization
Pluralization support allows you to handle singular and plural forms of words depending on the count. The $tc function is used to handle this, and it automatically selects the correct form based on the provided count.
{"template": "<p>{{ $tc('message.plural', 1) }}</p><p>{{ $tc('message.plural', 10) }}</p>", "i18n": {"messages": {"en": {"message": {"plural": "{n} apple|{n} apples"}}}}}
DateTime Formatting
DateTime formatting enables you to format dates and times according to the locale's conventions. The $d function is used to format a JavaScript Date object into a readable string.
{"template": "<p>{{ $d(new Date(), 'short') }}</p>", "i18n": {"dateTimeFormats": {"en": {"short": {"year": "numeric", "month": "short", "day": "numeric"}}}}}
Number Formatting
Number formatting allows you to format numbers in a locale-sensitive manner. The $n function is used to format numbers, such as currencies, percentages, or decimal numbers, according to the locale's formatting rules.
{"template": "<p>{{ $n(1234567.89, 'currency') }}</p>", "i18n": {"numberFormats": {"en": {"currency": {"style": "currency", "currency": "USD"}}}}}
Other packages similar to vue-i18n
react-intl
React Intl is similar to vue-i18n but is designed for React applications. It provides a set of React components and an API to format dates, numbers, and strings, including pluralization and handling translations.
i18next
i18next is a full-featured i18n library for JavaScript. It works with various frameworks, including React, Vue, and Angular. It offers features like pluralization, formatting, and supports backend loading of translation resources, making it a versatile alternative to vue-i18n.
polyglot.js
Polyglot.js is a tiny I18n helper library written in JavaScript, influenced by the Ruby library I18n. It doesn't have direct integration with Vue.js but can be used in any JavaScript application for simple translation purposes, with a straightforward API for interpolation and pluralization.
angular-translate
Angular Translate is an AngularJS module for internationalization. It provides services and directives that enable translation support similar to vue-i18n but is specifically tailored for AngularJS applications.
vue-i18n
Internationalization plugin of Vue.js
Compatibility
- Vue.js
1.0.0
+ - Vue.js
2.0.0-beta.1
+
Installation
CDN
jsdelivr
<script src="https://cdn.jsdelivr.net/vue.i18n/4.2.1/vue-i18n.min.js"></script>
NPM
stable version
$ npm install vue-i18n
development version
$ git clone https://github.com/kazupon/vue-i18n node_modules/vue-i18n
$ cd node_modules/vue-i18n
$ npm install
$ npm run build
When used in CommonJS, you must explicitly install the router via Vue.use():
:warning: if you are using vue-router
, you must install with Vue.use()
in advance of instance methods (router#map
, router#start
, ...etc).
var Vue = require('vue')
var VueI18n = require('vue-i18n')
Vue.use(VueI18n)
Vue.config.lang = 'ja'
Vue.locale('ja', { ... })
You don't need to do this when using the standalone build, as it installs itself automatically.
Usage
var Vue = require('vue')
var VueI18n = require('vue-i18n')
var locales = {
en: {
message: {
hello: 'hello world'
}
},
ja: {
message: {
hello: 'こんにちは、世界'
}
}
}
Vue.use(VueI18n)
Vue.config.lang = 'ja'
Object.keys(locales).forEach(function (lang) {
Vue.locale(lang, locales[lang])
})
new Vue({ el: 'body' })
Template the following:
<p>{{ $t("message.hello") }}</p>
Output the following:
<p>こんにちは、世界</p>
Formatting
HTML formatting
In some cases you might want to rendered your translation as an HTML message and not a static string.
var locales = {
en: {
message: {
hello: 'hello <br> world'
}
}
}
Template the following (notice the tripple brackets):
<p>{{{ $t('message.hello') }}}</p>
Output the following (instead of the message pre formatted)
<p>hello
world</p>
Named formatting
Locale the following:
var locales = {
en: {
message: {
hello: '{msg} world'
}
}
}
Template the following:
<p>{{ $t('message.hello', { msg: "hello"}) }}</p>
Output the following:
<p>hello world</p>
List formatting
Locale the following:
var locales = {
en: {
message: {
hello: '{0} world'
}
}
}
Template the following:
<p>{{ $t('message.hello', ["hello"]) }}</p>
Output the following:
<p>hello world</p>
Support ruby on rails i18n format
Locale the following:
var locales = {
en: {
message: {
hello: '%{msg} world'
}
}
}
Template the following:
<p>{{ $t('message.hello', { msg: "hello"}) }}</p>
Output the following:
<p>hello world</p>
Fallback translation
Locale the following:
var locales = {
en: {
message: 'hello world'
},
ja: {
}
}
Vue.config.lang = 'ja'
Template the following:
<p>{{ $t('message') }}</p>
Output the following:
<p>hello world</p>
Component locale
You can translate component based.
The below locale setting example:
var locales = {
en: {
message: {
hello: 'hello world'
}
},
ja: {
message: {
hello: 'こんにちは、世界'
}
}
}
Vue.config.lang = 'ja'
Object.keys(locales).forEach(function (lang) {
Vue.locale(lang, locales[lang])
})
new Vue({
el: '#app',
components: {
component1: {
template: '<p>component1 local: {{ $t("hello") }}</p>'
+ '<p>component1 global: {{ $t("message.hello") }}</p>',
locales: {
en: { hello: 'hello component1' },
ja: { hello: 'こんにちは、component1' }
}
}
}
})
Template the following:
<div id="app">
<p>{{ $t("message.hello") }}</p>
<component1></component1>
</div>
Output the following:
<div id="app">
<p>こんにちは、世界</p>
<p>component1 local: こんにちは、component1</p>
<p>component1 global: こんにちは、世界</p>
</div>
:pencil: If you set the locale of same keypath as global locale (Vue.locale()
), in its component, $t
is translate with component locale.
Dynamic locale
Sometimes, you need to set dynamically the locale from external location. You can set dynamically it with Vue.locale
.
the below the example:
var self = this
var lang = 'ja'
Vue.locale(lang, function () {
self.loading = true
return fetch('/locale/' + lang, {
method: 'get',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
}).then(function (res) {
return res.json()
}).then(function (json) {
self.loading = false
if (Object.keys(json).length === 0) {
return Promise.reject(new Error('locale empty !!'))
} else {
return Promise.resolve(json)
}
}).catch(function (error) {
self.error = error.message
return Promise.reject()
})
}, function () {
Vue.config.lang = lang
})
Dynamic locale interfaces
In dynamic locales, You can use the two type interfaces:
1. function
You need to implement locale setting that return function have function (resolve, reject)
like promise (future). The following, those argument of the function, if successful, you need to use the resolve
according to locale object. if failed, you need to use reject
- successful:
resolve
- failed:
reject
2. promise
As mentioned above, You need to implement locale setting that return a promise. if successful, you need to resolve
according to locale object. if failed, you need to use reject
.
:warning: You must return a ES6 compatible promise.
API References
Global Config
lang
fallbackLang
Global Methods
Vue.locale ( lang, [locale], [cb] )
-
Arguments:
{String} lang
{Object | Function} [locale]
{Function} [cb]
-
Return:
- locale function or object
-
Usage:
Register or retrieve a locale
Vue.locale('en', { message: 'hello' })
Vue.locale('ja', function () {
return fetch('/locales/ja', {
method: 'get',
}).then(function (json) {
return Promise.resolve(json)
}).catch(function (error) {
return Promise.reject()
})
}, function () {
Vue.config.lang = 'ja'
})
Vue.t( keypath, [lang], [arguments] )
Constructor Options
locales
Instance Methods
$t(keypath, [lang], [arguments])
-
Arguments:
{String} keypath
{String} [lang]
{Array | Object [arguments]
-
Return:
Translated string
-
Usage:
Translate the locale of keypath
. Translate in preferentially component locale than global locale. If not specified component locale, translate with global locale. If you specified lang
, translate the locale of lang
. If you specified keypath
of list / named formatting local, you must specify arguments
too. For arguments
more details see Formatting.
Contributing
- Fork it !
- Create your top branch from
dev
: git branch my-new-topic origin/dev
- Commit your changes:
git commit -am 'Add some topic'
- Push to the branch:
git push origin my-new-topic
- Submit a pull request to
dev
branch of kazupon/vue-i18n
repository !
Development Setup
# install deps
npm install
# build dist files
npm run build
# lint
npm run lint
# run unit tests only
npm run unit
# run e2e tests only
npm run e2e
# lint & run all tests
npm test
Changelog
Details changes for each release are documented in the CHANGELOG.md.
License
MIT