Skip to content

消息函数

Vue I18n 建议在翻译消息时使用基于列表、命名和字面量格式的字符串作为本地化消息。

然而,有时基于字符串的消息格式语法很难解决。

例如,假设您想在法语中处理以下消息:

  • Manger de la soupe
  • Manger une pomme
  • Manger du pain
  • Manger de l’orge

正如您所见,介词后面的名词会根据性别和语音而变化。

Vue I18n 消息格式语法支持的功能可能无法支持这些特定语言的用例。

但在某些情况下,由于复杂的语言语法,您确实需要 JavaScript 的完整编程能力。因此,您可以使用消息函数而不是基于字符串的消息。

注意

使用消息格式语法编写的消息会被 Vue I18n 消息编译器编译成消息函数。消息函数和缓存机制可最大化性能收益。

基本用法

以下是返回简单问候语的消息函数:

js
const messages = {
  en: {
    greeting: (ctx) => 'hello!'
  }
}

消息函数接受消息上下文作为第一个参数,该参数具有多个属性和函数。我们将在接下来的部分中解释如何使用它,现在让我们继续。

使用消息函数非常简单!您只需使用 $tt 指定消息函数的键:

html
<p>{{ $t('greeting') }}</p>

输出如下:

html
<p>hello!</p>

消息函数输出消息函数返回值的字符串

注意

如果您需要使用翻译组件(i18n-t),则不仅需要返回字符串值,还需要返回VNode值。

为了支持翻译组件的使用,使用消息上下文的 type 属性,如下所示:

js
import { createVNode, Text } from 'vue'

const messages = {
  en: {
    greeting: ({ type }) => type === 'vnode'
      ? createVNode(Text, null, 'hello', 0)
      : 'hello'
  }
}

如果您还没有读过,请在深入研究消息函数之前阅读 Vue 渲染函数

命名插值

Vue I18n 支持基于字符串的消息格式的命名插值。Vue I18n 使用 $tt 插入参数值并输出结果。

您可以使用消息上下文的 named 函数来做同样的事情。

以下是问候语的例子:

js
const messages = {
  en: {
    greeting: ({ named }) => `hello, ${named('name')}!`
  }
}

模板:

html
<p>{{ $t('greeting', { name: 'DIO' }) }}</p>

输出如下:

html
<p>hello, DIO!</p>

您需要指定与 $tt 的命名参数指定的值相对应的键。

列表插值

Vue I18n 支持基于字符串的消息格式的列表插值。Vue I18n 使用 $tt 插入参数值并输出结果。

您可以使用消息上下文的 list 函数来做同样的事情。

以下是问候语的例子:

js
const messages = {
  en: {
    greeting: ({ list }) => `hello, ${list(0)}!`
  }
}

模板:

html
<p>{{ $t('greeting', ['DIO']) }}</p>

输出如下:

html
<p>hello, DIO!</p>

您需要指定与 $tt 的列表参数指定的值相对应的索引。

链接消息

Vue I18n 支持基于字符串的消息格式的链接消息。Vue I18n 使用 $tt 插入参数值并输出结果。

您可以使用消息上下文的 linked 函数来做同样的事情。

以下是消息函数的例子:

js
const messages = {
  en: {
    the_world: 'the world',
    dio: 'DIO:',
    linked: ({ linked }) => `${linked('message.dio')} ${linked('message.the_world')} !!!!`
  }
}

模板:

html
<p>{{ $t('linked') }}</p>

输出如下:

html
<p>DIO: the world !!!!</p>

您需要指定与 $tt 指定的值相对应的键。

复数形式

Vue I18n 支持基于字符串的消息格式的复数形式。Vue I18n 使用 $tt 插入参数值并输出结果。

您可以使用消息上下文的 plural 函数来做同样的事情。

以下是消息函数的例子:

js
const messages = {
  en: {
    car: ({ plural }) => plural(['car', 'cars']),
    apple: ({ plural, named }) =>
      plural([
        'no apples',
        'one apple',
        `${named('count')} apples`
      ])
  }
}

模板:

html
<p>{{ $t('car', 1) }}</p>
<p>{{ $t('car', 2) }}</p>

<p>{{ $t('apple', 0) }}</p>
<p>{{ $t('apple', 1) }}</p>
<p>{{ $t('apple', { count: 10 }, 10) }}</p>

输出如下:

html
<p>car</p>
<p>cars</p>

<p>no apples</p>
<p>one apple</p>
<p>10 apples</p>

您需要指定与 $tt 指定的值相对应的键。