Skip to content

Sintaxis del formato del mensaje

Vue I18n puede usar la sintaxis de formato de mensaje para localizar los mensajes que se mostrarán en la interfaz de usuario. Los mensajes de Vue I18n son interpolaciones y mensajes con varias sintaxis de características.

Interpolaciones

Vue I18n admite interpolación usando marcadores de posición {} como "Mustache".

Interpolación con nombre

La interpolación con nombre puede ser interpolada en el marcador de posición usando nombres de variables definidos en JavaScript.

Como ejemplo, el siguiente recurso de mensajes locales:

js
const messages = {
  en: {
    message: {
      hello: '{msg} world'
    }
  }
}

Los mensajes locales son el recurso especificado por la opción messages de createI18n. Se define el idioma en con { message: { hello: '{msg} world' } }.

La interpolación con nombre le permite especificar variables definidas en JavaScript. En el mensaje local anterior, puede localizarlo proporcionando la variable msg definida en JavaScript como un parámetro a la función de traducción.

El nombre de la variable dentro de {} debe comenzar con una letra (a-z, A-Z) o un guión bajo (_), seguido de cualquier combinación de letras, dígitos, guiones bajos (_), guiones (-) o signos de dólar ($).

Ejemplos: {msg}, {_userName}, {user-id}, {total$}

A continuación se muestra un ejemplo del uso de $t en una plantilla:

html
<p>{{ $t('message.hello', { msg: 'hello' }) }}</p>

El primer argumento es message.hello como clave de mensajes locales, y el segundo argumento es un objeto con la propiedad msg como parámetro para $t.

TIP

La clave de recurso de mensaje local para la función de traducción puede ser especificada para un espacio de nombres de recurso específico usando . (punto), tal como un objeto de JavaScript.

TIP

$t tiene algunas sobrecargas. Sobre estas sobrecargas, vea la Referencia de API

Como resultado, el siguiente:

html
<p>hello world</p>

Interpolación de lista

La interpolación de lista puede ser interpolada en el marcador de posición usando una matriz definida en JavaScript.

Como ejemplo, el siguiente recurso de mensajes locales:

js
const messages = {
  en: {
    message: {
      hello: '{0} world'
    }
  }
}

Se define el idioma en con { message: { hello: '{0} world' } }.

La interpolación de lista le permite especificar una matriz definida en JavaScript. En el mensaje local anterior, puede ser localizado proporcionando el elemento del índice 0 de la matriz definida por JavaScript como parámetro a la función de traducción.

A continuación se muestra un ejemplo del uso de $t en una plantilla:

html
<p>{{ $t('message.hello', ['hello']) }}</p>

El primer argumento es message.hello como clave de mensajes locales, y el segundo argumento es una matriz que contiene el ítem 'hello' como parámetro para $t.

Como resultado, el siguiente:

html
<p>hello world</p>

Interpolación literal

La interpolación literal puede ser interpolada en el marcador de posición usando una cadena literal.

Como ejemplo, el siguiente recurso de mensajes locales:

js
const messages = {
  en: {
    address: "{account}{'@'}{domain}"
  }
}

Se define el idioma en con { address: "{account}{'@'}{domain}" }.

La interpolación literal le permite especificar una cadena literal entre comillas simples '. El mensaje especificado con interpolación literal es localizado como una cadena por la función de traducción.

A continuación se muestra un ejemplo del uso de $t en una plantilla:

html
<p>email: {{ $t('address', { account: 'foo', domain: 'domain.com' }) }}</p>

El primer argumento es address como clave de mensajes locales, y el segundo argumento es un objeto con las propiedades account y domain como parámetros para $t.

Como resultado, el siguiente:

html
<p>email: [email protected]</p>

NOTA

La interpolación literal es útil para caracteres especiales en la sintaxis de formato de mensaje, tales como { y }, que no pueden usarse directamente en el mensaje.

Mensajes vinculados

Si hay una clave de mensajes locales que siempre tendrá el mismo texto concreto que otra, simplemente puedes vincularla.

Para vincular a otra clave de mensajes locales, todo lo que tienes que hacer es prefijar su contenido con un signo @:key seguido del nombre completo de la clave de mensajes locales incluyendo el espacio de nombres al que quieres vincular.

Mensajes locales a continuación:

js
const messages = {
  en: {
    message: {
      the_world: 'the world',
      dio: 'DIO:',
      linked: '@:message.dio @:message.the_world !!!!'
    }
  }
}

Es el idioma en que tiene una estructura jerárquica en el objeto.

El message.the_world tiene the world y message.dio. El message.linked tiene @:message.dio @:message.dio @:message.the_world !!!!, y está vinculado a la clave de mensajes locales con message.dio y message.the_world.

A continuación se muestra un ejemplo del uso de $t en una plantilla:

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

El primer argumento es message.linked como clave de mensajes locales como parámetro para $t.

Como resultado, el siguiente:

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

Modificadores integrados

Si el idioma distingue casos de caracteres, puede necesitar controlar el caso de los mensajes locales vinculados. Los mensajes vinculados pueden ser formateados con el modificador @.modifier:key

Los siguientes modificadores están disponibles actualmente integrados.

  • upper: Poner todas las letras del mensaje vinculado en mayúsculas
  • lower: Poner todas las letras del mensaje vinculado en minúsculas
  • capitalize: Capitalizar la primera letra del mensaje vinculado

Mensajes locales a continuación:

js
const messages = {
  en: {
    message: {
      homeAddress: 'Home address',
      missingHomeAddress: 'Please provide @.lower:message.homeAddress'
    }
  }
}

Es el idioma en que tiene una estructura jerárquica en el objeto.

El message.homeAddress tiene Home address. El message.missingHomeAddress tiene Please provide @.lower:message.homeAddress, y está vinculado a la clave de mensajes locales con message.homeAddress.

Ya que el modificador .lower se especifica en el ejemplo anterior, así que la clave vinculada message.homeAddress se resuelve, después se evalúa.

A continuación se muestra un ejemplo del uso de $t en una plantilla:

html
<label>{{ $t('message.homeAddress') }}</label>
<p class="error">{{ $t('message.missingHomeAddress') }}</p>

Como resultado, el siguiente:

html
<label>Home address</label>
<p class="error">Please provide home address</p>

Modificadores personalizados

Si quieres usar modificadores no integrados, puedes usar tus modificadores personalizados.

Para usar modificadores personalizados, debes especificarlos en la opción modifiers de createI18n:

js
const i18n = createI18n({
  locale: 'en',
  messages: {
    // set something locale messages ...
  },
  // set custom modifiers at `modifiers` option
  modifiers: {
    snakeCase: (str) => str.split(' ').join('_')
  }
})

Mensajes locales a continuación:

js
const messages = {
  en: {
    message: {
      snake: 'snake case',
      custom_modifier: "custom modifiers example: @.snakeCase:{'message.snake'}"
    }
  }
}

Es el idioma en que tiene una estructura jerárquica en el objeto.

El message.snake tiene snake case. El message.custom_modifier tiene custom modifiers example: @.snakeCase:{'message.snake'}, y está vinculado a la clave de mensajes locales, que se interpola con literal.

NOTA

Puede usar las interpolaciones (con nombre, de lista y literal) para la clave de mensajes vinculados mostrados a continuación.

Este ejemplo muestra el uso de modificadores (@.lower, @.upper, @.capitalize) combinados con interpolaciones con nombre, de lista y literales.

js
const messages = {
  en: {
    message: {
      greeting: "Hello, @.lower:{'message.name'}! You have {count} new messages.",
      name:"{name}"
    },

    welcome: "Welcome, @.upper:{'name'}! Today is @.capitalize:{'day'}.",
    name: '{0}',
    day: '{1}',

    literalMessage: "This is an email: foo{'@'}@.lower:domain",
    domain: 'SHOUTING'
  }
}

Interpolación con nombre con modificador

En message.greeting, usamos una interpolación con nombre para {count} y vinculamos a message.name, aplicando el modificador .lower.

La clave message.name contiene {name}, que será interpolado con el parámetro name pasado.

El message.greeting está vinculado a la clave de mensaje local message.name.

html
<p>{{ $t('message.greeting', { name: 'Alice', count: 5 }) }}</p>

Como resultado, el siguiente

html
<p>Hello, alice! You have 5 new messages.</p>

Interpolación de lista con modificador

En este caso, los valores para {0} y {1} se pasan como una matriz. Las claves name y day se resuelven mediante interpolación de lista y se transforman con modificadores.

html
<p>{{ $t('welcome', ['bob', 'MONDAY']) }}</p>

Como resultado, el siguiente

html
<p>Welcome, BOB! Today is Monday.</p>

Interpolación literal con modificador

En este ejemplo, usamos una cadena literal dentro del mensaje y aplicamos el modificador .lower.

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

Aquí, el modificador se aplica al contenido dentro de domain, y el @ se preserva como salida literal.

Como resultado, el siguiente

html
<p>This is an email: foo@shouting</p>

Caracteres especiales

Los siguientes caracteres utilizados en la sintaxis de formato de mensaje son procesados por el compilador como caracteres especiales:

  • {
  • }
  • @
  • $
  • |

Si quieres usar estos caracteres, necesitarás usar la Interpolación literal.

Formato Rails i18n

Vue I18n admite el formato de mensaje compatible con Ruby on Rails i18n.

Puedes interpolarte la sintaxis de formato de mensaje con % como prefijo:

IMPORTANTE

A partir de la versión 10, el formato Rails i18n será obsoleto. Recomendamos usar la interpolación con nombre.

Como ejemplo, el siguiente recurso de mensajes locales:

js
const messages = {
  en: {
    message: {
      hello: '%{msg} world'
    }
  }
}

Se define el idioma en con { message: { hello: '%{msg} world' } }.

Al igual que en la Interpolación con nombre, puedes especificar variables definidas en JavaScript. En el mensaje local anterior, es posible localizarlo proporcionando una variable definida en JavaScript msg como parámetro a la función de traducción.

A continuación se muestra un ejemplo del uso de $t en una plantilla:

html
<p>{{ $t('message.hello', { msg: 'hello' }) }}</p>

Como resultado, el siguiente:

html
<p>hello world</p>

Mensaje HTML

Puedes localizarlo con mensajes que contienen HTML.

PELIGRO

⚠️ Localizar dinámicamente HTML arbitrario en tu sitio puede ser muy peligroso porque puede conducir fácilmente a vulnerabilidades XSS. Solo usa interpolación HTML en contenido confiable y nunca en contenido proporcionado por el usuario.

Recomendamos usar la Interpolación de componentes.

AVISO

Si el mensaje contiene HTML, Vue I18n emite una advertencia a la consola en modo de desarrollo (process.env.NODE_ENV !== 'production'), Vue I18n emite una advertencia a la consola.

Puedes controlar la salida de advertencias con las opciones warnHtmlInMessage o warnHtmlMessage en createI18n o useI18n.

Como ejemplo, el siguiente recurso de mensajes locales:

js
const messages = {
  en: {
    message: {
      hello: 'hello <br> world'
    }
  }
}

Se define el idioma en con { message: { hello: 'hello <br> world' } }.

A continuación se muestra un ejemplo del uso de v-html y $t en una plantilla:

html
<p v-html="$t('message.hello')"></p>

Como resultado, el siguiente:

html
<p>hello
<!--<br> existe pero se representa como html y no como una cadena-->
world</p>