unplugin for Vue I18n
- i18n resource pre-compilation
- i18n custom block
- i18n resource definition
- i18n resource importing
- Locale of i18n resource definition
- Locale of i18n resource definition for global scope
- i18n resource formatting
npm i @intlify/unplugin-vue-i18n
Vite
// vite.config.ts
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
export default defineConfig({
plugins: [
VueI18nPlugin({ /* options */ }),
],
})
Webpack
const VueI18nPlugin = require('@intlify/unplugin-vue-i18n/webpack')
// webpack.config.js
module.exports = {
/* ... */
plugins: [
VueI18nPlugin({ /* options */ })
]
}
Nuxt
// nuxt.config.ts
import { defineNuxtConfig } from 'nuxt'
import VueI18nPlugin from '@intlify/unplugin-vue-i18n'
export default defineNuxtConfig({
vite: {
plugins: [
VueI18nPlugin.vite({ /* options */ }),
],
},
// When using Webpack
// builder: '@nuxt/webpack-builder',
webpack: {
plugins: [
VueI18nPlugin.webpack({ /* options */ }),
]
}
})
Since [email protected]
, the locale messages are handled with message compiler, which converts them to javascript functions after compiling. After compiling, message compiler converts them into javascript functions, which can improve the performance of the application.
However, with the message compiler, the javascript function conversion will not work in some environments (e.g. CSP). For this reason, [email protected]
and later offer a full version that includes compiler and runtime, and a runtime only version.
If you are using the runtime version, you will need to compile before importing locale messages by managing them in a file such as .json
.
The below example that examples/vite/src/App.vue
have i18n
custom block:
<template>
<form>
<label>{{ t('language') }}</label>
<select v-model="locale">
<option value="en">en</option>
<option value="ja">ja</option>
</select>
</form>
<p>{{ t('hello') }}</p>
<Banana />
</template>
<script>
import { useI18n } from 'vue-i18n'
import Banana from './Banana.vue'
export default {
name: 'App',
components: {
Banana
},
setup() {
const { t, locale } = useI18n({
inheritLocale: true,
useScope: 'local'
})
return { t, locale }
}
}
</script>
<i18n>
{
"en": {
"language": "Language",
"hello": "hello, world!"
},
"ja": {
"language": "言語",
"hello": "こんにちは、世界!"
}
}
</i18n>
You can be used by specifying the following format in the lang
attribute:
- json (default)
- yaml
- yml
- json5
example yaml
format:
<i18n lang="yaml">
en:
hello: 'Hello World!'
ja:
hello: 'こんにちは、世界!'
</i18n>
unplugin-vue-i18n allows you to statically bundle i18n resources such as json
or yaml
specified by the include
option of the plugin described below as locale messages with the import
syntax.
In this case, only one i18n resource can be statically bundled at a time with import
syntax, so the these code will be redundant for multiple locales.
import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
/*
* The i18n resources in the path specified in the plugin `include` option can be read
* as vue-i18n optimized locale messages using the import syntax
*/
import en from './src/locales/en.json'
import ja from './src/locales/ja.yaml'
import fr from './src/locales/fr.json5'
const i18n = createI18n({
locale: 'en',
messages: {
en,
ja,
fr
}
})
const app = createApp()
app.use(i18n).mount('#app')
unplugin-vue-i18n can use the bundler virtual mechanism to import all locales at once, using the special identifier @intlify/unplugin-vue-i18n/messages
, as the bellow:
import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
/*
* All i18n resources specified in the plugin `include` option can be loaded
* at once using the import syntax
*/
import messages from '@intlify/unplugin-vue-i18n/messages'
const i18n = createI18n({
locale: 'en',
messages
})
const app = createApp()
app.use(i18n).mount('#app')
Change your vite.config.ts file accordingly to import all the files from locales folder on the root. Change './src/locales/**'
to path of your locales.
// vite.config.ts
import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
import path from 'path'
export default defineConfig({
plugins: [
VueI18nPlugin({
include: [path.resolve(__dirname, './src/locales/**')],
}),
],
})
If you want type definition of @intlify/unplugin-vue-i18n/messages
, add unplugin-vue-i18n/messages
to compilerOptions.types
of your tsconfig:
{
"compilerOptions": {
"types": ["@intlify/unplugin-vue-i18n/messages"]
}
}
As noted here, NPM provides many different builds of Vue I18n.
This plugin will automatically select and bundle Vue I18n build according to the following behavior:
- development:
vue-i18n.esm-bundler.js
- production:
vue-i18n.runtime.esm-bundler.js
About details, See the here
This plugin will automatically select and bundle petite-vue-i18n
build according to the following vite behavior:
- vite dev:
petite-vue-i18n.esm-bundler.js
- vite build:
petite-vue-i18n.runtime.esm-bundler.js
-
Type:
string | string[] | undefined
-
Default:
undefined
A picomatch pattern, or array of patterns, you can specify a path to pre-compile i18n resources files. The extensions of i18n resources to be precompiled are as follows:
- json - json5 - yaml - yml - js - ts
If nothing is specified for this option, i.e.
undefined
, nothing is done to the resource in the above format.⚠️ NOTE:json
resources matches this option, it will be handled before the internal json plugin of bundler, and will not be processed afterwards, else the option doesn't match, the bundler side will handle.⚠️ NOTE:yaml
resources don't support multi documentation with|
, alias with&
and*
, tags with!
,@
, etc. Only simple data structures.⚠️ NOTE:js
andts
resources are set simple export (export default
) as locale messages object, as default.export default { hello: 'Hello, {name}!', // ... }
If you need to use programmatically dynamic resource construction, you would be enable
allowDynamic
option. about details, see the section.⚠️ NOTE: If you use thejs
andts
resources formats, set the paths, so your application code is not targeted. We recommend that resources be isolated from the application code.
-
Type:
boolean
-
Default:
true
Strictly checks that the locale message does not contain html tags.
If html tags are included, an error is thrown.
If you would not the error to be thrown, you can work around it by setting it to
false
, but it means that the locale message might cause security problems with XSS.In that case, we recommend setting the
escapeHtml
option totrue
.
-
Type:
boolean
-
Default:
false
Whether to escape html tags if they are included in the locale message.
If
strictMessage
is disabled byfalse
, we recommend this option be enabled.
-
Type:
boolean
-
Default:
false
Whether or not programmatically dynamic resource construction for
js
orts
resource format.In this case, you need to export the function with
export default
and construct the resource with the function:import resources from './locales/all.json' export default async function loadResource(url) { const res = await import(url).then(r => r.default || r) return { ...resources, ...res } }
If you fetch some resources from the backend, the data must be pre-compiled for production. exmaple is here.
-
Type:
boolean
-
Default:
true
Whether or not to automatically use Vue I18n runtime-only in production build, set
vue-i18n.runtime.esm-bundler.js
in thevue-i18n
field of bundler config, the below:- vite config: `resolve.alias` - webpack config: `resolve.alias`
If
false
is specified, Vue I18n (vue-i18n) package.jsonmodule
field will be used.For more details, See here
-
Type:
boolean
-
Default:
true
Whether to make vue-i18n API only composition API. By default the legacy API is tree-shaken.
For more details, See here
-
Type:
boolean
-
Default:
true
Whether to install the full set of APIs, components, etc. provided by Vue I18n. By default, all of them will be installed.
If
false
is specified, buld-in components and directive will not be installed in vue and will be tree-shaken.For more details, See here
-
Type:
boolean
-
Default:
false
Whether pre-compile number and boolean values as message functions that return the string value.
For example, the following json resources:
{ "trueValue": true, "falseValue": false, "nullValue": null, "numberValue": 1 }
after pre-compiled (development):
export default { "trueValue": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["true"])};fn.source="true";return fn;})(), "falseValue": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["false"])};fn.source="false";return fn;})(), "nullValue": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["null"])};fn.source="null";return fn;})(), "numberValue": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["1"])};fn.source="1";return fn;})() }
-
Type:
string
-
Default:
'json'
Specify the content for all your inlined
i18n
custom blocks on yourSFC
.defaultSFCLang
must have one of the following values:- json - json5 - yaml - yml
On inlined
i18n
custom blocks that have specified thelang
attribute, thedefaultSFCLang
is not applied.For example, with
defaultSFCLang: "yaml"
ordefaultSFCLang: "yml"
, this custom block:<i18n lang="yaml"> en: hello: Hello es: hello: Hola </i18n>
and this another one, are equivalent:
<i18n> en: hello: Hello es: hello: Hola </i18n>
-
Type:
boolean
-
Default:
undefined
Whether to include all
i18n
custom blocks on yourSFC
onglobal
scope.If
true
, it will be applied to all inlinedi18n
orimported
custom blocks.Warning: beware enabling
globalSFCScope: true
, alli18n
custom blocks in all yourSFC
will be onglobal
scope.For example, with
globalSFCScope: true
, this custom block:<i18n lang="yaml" global> en: hello: Hello es: hello: Hola </i18n>
and this another one, are equivalent:
<i18n lang="yaml"> en: hello: Hello es: hello: Hola </i18n>
You can also use
defaultSFCLang: "yaml"
, following with previous example, this another is also equivalent to previous ones:<i18n> en: hello: Hello es: hello: Hola </i18n>
-
Type:
boolean
-
Default:
false
The mode to birdge the i18n custom block to work in both [email protected] and [email protected] environments.
To support in a smooth transition from [email protected] to [email protected], we provide a mode that bundles the i18n custom block to be available in either version.
⚠️ Note that if you setbridge: true
, the bundle size will increase. It is recommended to disable this mode after the migration from [email protected] to [email protected] is completed.
-
Type:
boolean
-
Default:
true
For
bridge
option istrue
, whether to bundle locale resources with ESM. By default ESM, if you need to bundl with commonjs for especialy webpack, you need to setfalse
-
Type:
boolean
-
Default:
false
This option that to use i18n custom blocks in
vue-class-component
.
-
Type:
boolean
-
Default:
false
Whether to use the import name of
petite-vue-i18n
with the same import name as vue-i18n (import { xxx } from 'vue-i18n'
).This option allows a smooth migration from
petite-vue-i18n
tovue-i18n
and allows progressive enhacement.
Details changes for each release are documented in the CHANGELOG.md