# Формат сообщений локализации
# Именованный формат
Сообщения локализации:
const messages = {
en: {
message: {
hello: '{msg} world'
}
},
ru: {
message: {
hello: '{msg} мир'
}
}
}
Шаблон:
<p>{{ $t('message.hello', { msg: 'привет' }) }}</p>
Результат:
<p>привет мир</p>
# Формат списков
Сообщения локализации:
const messages = {
en: {
message: {
hello: '{0} world'
}
},
ru: {
message: {
hello: '{0} мир'
}
}
}
Шаблон:
<p>{{ $t('message.hello', ['привееет']) }}</p>
Результат:
<p>привееет мир</p>
Форматирование списков также принимает объекты, соответствующие по структуре массиву:
<p>{{ $t('message.hello', {'0': 'привееет'}) }}</p>
Результат:
<p>привееет мир</p>
# HTML формат
Обратите внимание
⚠️ Динамическая локализация произвольного HTML на вебсайте очень опасна, потому что легко может привести к XSS-уязвимостям. Используйте HTML-интерполяцию только для доверенного контента и никогда для пользовательского.
Рекомендуем в таких случаях использовать возможности интерполяции компонента.
Обратите внимание
🆕 Добавлено в версии 8.11+
Можно управлять использованием HTML форматирования. Для подробностей см. опцию конструктора warnHtmlInMessage
и свойства API.
Иногда требуется отобразить сообщение локализации HTML-кодом, а не статической строкой.
const messages = {
en: {
message: {
hello: 'hello <br> world'
}
},
ru: {
message: {
hello: 'привет <br> мир'
}
}
}
Шаблон:
<p v-html="$t('message.hello')"></p>
Результат (вместо отформатированного сообщения)
<p>
привет
<!-- <br> существует, но отрисован как html, а не строкой -->
мир
</p>
# Формат ruby on rails i18n
Сообщения локализации:
const messages = {
en: {
message: {
hello: '%{msg} world'
}
},
ru: {
message: {
hello: '%{msg} мир'
}
}
}
Шаблон:
<p>{{ $t('message.hello', { msg: 'привет' }) }}</p>
Результат:
<p>привет мир</p>
# Пользовательский формат
Иногда может потребоваться реализовать локализацию для собственного формата сообщений (например, использовать синтаксиса сообщений ICU (opens new window)).
Реализовать это можно с помощью специального пользовательского метода форматирования, который должен реализовать интерфейс Formatter (opens new window).
Пример пользовательского метода форматирования с синтаксисом класса ES2015:
// Реализация пользовательского Formatter
class CustomFormatter {
constructor(options) {
// ...
}
//
// interpolate
//
// @param {string} message
// строка или список или именованный формат
// напр.
// - именованный формат: 'Hi {name}'
// - формат списка: 'Hi {0}'
//
// @param {Object | Array} values
// значения интерполяции `message`.
// переданные значения с `$t`, `$tc` и функциональным компонентом `i18n`.
// напр.
// - $t('hello', { name: 'Alex' }) -> переданные значения: Object `{ name: 'Alex' }`
// - $t('hello', ['Alex']) -> переданные значения: Array `['Alex']`
// - функциональный компонент `i18n` (интерполяция в компоненте)
// <i18n path="hello">
// <p>Alex</p>
// <p>how are you?</p>
// </i18n>
// -> переданные значения: Array (included VNode):
// `[VNode{ tag: 'p', text: 'Alex', ...}, VNode{ tag: 'p', text: 'how are you?', ...}]`
//
// @return {Array<any>}
// интерполированные значения. Они необходимы чтобы вернуть следующее:
// - массив строк, когда используется `$t` или `$tc`.
// - массив, включая объект VNode, когда используется функциональный компонент `i18n`.
//
interpolate(message, values) {
// реализация логики интерполяции
// ...
// возвращаем интерполированный массив
return ['resolved message string']
}
}
// Регистрация через опцию `formatter`
const i18n = new VueI18n({
locale: 'en-US',
formatter: new CustomFormatter(/* опции конструктора */),
messages: {
'en-US': {
// ...
},
'ru-RU': {
// ...
}
// ...
}
})
// Запускаем приложение!
new Vue({ i18n }).$mount('#app')
Также посмотрите официальный пример пользовательского метода форматирования (opens new window).