Пользовательская директива
ПРИМЕЧАНИЕ
Директива v-t будет устаревшей в версии 11 и удалена в версии 12. Этот раздел предназначен для пользователей, которые все еще работают с версией 10.
Помимо использования $t, вы также можете использовать пользовательскую директиву v-t для переводов.
Синтаксис строки
Вы можете передать путь ключа локализованных сообщений, используя синтаксис строки.
JavaScript:
js
import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
locale: 'en',
messages: {
en: { hello: 'hi there!' },
ja: { hello: 'こんにちは!' }
}
})
const app = createApp({
data: () => ({ path: 'hello' })
})
app.use(i18n)
app.mount('#app')Шаблон:
html
<div id="string-syntax">
<!-- Использование строкового литерала -->
<p v-t="'hello'"></p>
<!-- Привязка пути ключа через данные -->
<p v-t="path"></p>
</div>Вывод:
html
<div id="string-syntax">
<p>hi there!</p>
<p>hi there!</p>
</div>Синтаксис объекта
В качестве альтернативы вы можете использовать синтаксис объекта.
JavaScript:
js
import { createApp } from 'vue'
import { createI18n } from 'vue-i18n'
const i18n = createI18n({
locale: 'ja',
messages: {
en: {
message: {
hi: 'Hi, {name}!'
bye: 'Goodbye!',
apple: 'no apples | one apple | {count} apples'
}
},
ja: {
message: {
hi: 'こんにちは、{name}!',
bye: 'さようなら!',
apple: 'リンゴはありません | 一つのりんご | {count} りんご'
}
}
}
})
const app = createApp({
data() {
return {
byePath: 'message.bye',
appleCount: 7,
}
}
})
app.use(i18n)
app.mount('#object-syntax')Шаблон:
html
<div id="object-syntax">
<!-- Использование объекта с аргументами -->
<p v-t="{ path: 'message.hi', args: { name: 'kazupon' } }"></p>
<!-- Привязка пути ключа через данные -->
<p v-t="{ path: byePath, locale: 'en' }"></p>
<!-- Множественное число -->
<p v-t="{ path: 'message.apple', plural: appleCount }"></p>
</div>Вывод:
html
<div id="object-syntax">
<p>こんにちは、kazupon!</p>
<p>Goodbye!</p>
<p>7 りんご</p>
</div>Область видимости
Как объяснено в разделе области видимости, vue-i18n поддерживает как глобальную, так и локальную области видимости.
Поведение v-t зависит от области видимости, в которой она используется:
- Локальная область: Применяется при использовании опции i18n в стиле Legacy API или установке
useScope: 'local'вuseI18n. - Глобальная область: Используется во всех остальных случаях.
$t против v-t
$t
t - это функция экземпляра VueI18n со следующими преимуществами и недостатками:
Преимущества:
- Позволяет гибкое использование в шаблонах, включая синтаксис фигурных скобок
{}. - Поддерживает вычисляемые свойства и методы внутри компонентов Vue.
Недостатки:
$tвыполняется при каждом перерендере, что может добавить накладные расходы на перевод.
v-t
v-t - это пользовательская директива со своими преимуществами и недостатками:
Преимущества:
- Предоставляет лучшую производительность по сравнению с
$t, поскольку переводы могут быть предварительно обработаны модулем компилятора Vue, предоставленным vue-i18n-extensions. - Позволяет оптимизировать производительность, снижая накладные расходы на перевод во время выполнения.
Недостатки:
- Менее гибкая по сравнению с
$t; её использование более сложное. - Вставляет переведенный контент непосредственно в
textContentэлемента, что означает, что она не может использоваться внутри встроенных HTML-структур или комбинироваться с другими динамическими выражениями шаблона. - При использовании серверного рендеринга (SSR) вы должны настроить пользовательское преобразование, установив параметр
directiveTransformsв функцииcompileиз@vue/compiler-ssr.