# Sintaxe mensagens locais
# Estrutura
Sintaxe local das mensagens:
// Como definição do Flowtype, a sintaxe das mensagens de tradução é semelhante à anotação BNF
type LocaleMessages = { [key: Locale]: LocaleMessageObject }
type LocaleMessageObject = { [key: Path]: LocaleMessage }
type LocaleMessageArray = LocaleMessage[]
type MessageContext = {
list: (index: number) => mixed,
named: (key: string) => mixed,
linked: (key: string) => TranslateResult,
values: any,
path: string,
formatter: Formatter,
messages: LocaleMessages,
locale: Locale
};
type MessageFunction = (ctx: MessageContext) => string;
type LocaleMessage = string | MessageFunction | LocaleMessageObject | LocaleMessageArray;
type Locale = string
type Path = string
Com base na sintaxe acima, você pode configurar a seguinte estrutura de mensagens locais:
{
// localização 'pt'
"pt": {
"key1": "esta é a mensagem 1", // uso comum
"nested": {
// aninhado
"message1": "esta é a mensagem aninhada 1"
},
"errors": [
// array
"esta é a mensagem de código de erro 0",
{
// um objeto em array
"internal1": "esta é uma mensagem de código de erro interno 1"
},
[
// array em array
"este é o erro de array aninhado 1"
]
]
},
// localização 'en'
"en": {
// ...
}
}
Na estrutura de mensagens locais acima, você pode traduzir usando os caminhos-chave abaixo.
<div id="app">
<!-- uso comum -->
<p>{{ $t('key1') }}</p>
<!-- aninhado -->
<p>{{ $t('nested.message1') }}</p>
<!-- array -->
<p>{{ $t('errors[0]') }}</p>
<!-- um objeto em array -->
<p>{{ $t('errors[1].internal1') }}</p>
<!-- array em array -->
<p>{{ $t('errors[2][0]') }}</p>
</div>
O resultado será o seguinte:
<div id="app">
<!-- uso comum -->
<p>esta é a mensagem 1</p>
<!-- aninhado -->
<p>esta é a mensagem aninhada 1</p>
<!-- array -->
<p>esta é a mensagem de código de erro 0</p>
<!-- um objeto em array -->
<p>esta é uma mensagem de código de erro interno 1</p>
<!-- array em array -->
<p>este é o erro de array aninhado 1</p>
</div>
# Mensagens de localização relacionadas
Se houver uma chave de tradução que sempre terá o mesmo texto concreto igual outra, você pode simplesmente criar um link para essa. Para vincular a outra chave de tradução, tudo que você precisa fazer é prefixar seu conteúdo com um sinal @:
seguido pelo nome completo da chave de tradução incluindo o namespace ao qual deseja vincular.
Mensagens de localização a seguir:
const messages = {
en: {
message: {
the_world: 'the world',
dio: 'DIO:',
linked: '@:message.dio @:message.the_world !!!!'
}
}
}
Template:
<p>{{ $t('message.linked') }}</p>
O resultado será o seguinte:
<p>DIO: the world !!!!</p>
# Formatando mensagens de localização relacionadas
Se o idioma distinguir casos de caracteres, você pode precisar controlar o caso das mensagens de localização relacionadas.
Mensagens relacionadas podem ser formatadas com o modificador @.modifier:key
Mensagens de localização a seguir:
upper
: Letras maiúsculas em todos os caracteres na mensagem vinculada.lower
: Letras minúsculas em todos os caracteres na mensagem vinculada.capitalize
: Primeiro caractere em maiúsculo da mensagem vinculada.
Mensagens de localização:
const messages = {
en: {
message: {
homeAddress: 'Home address',
missingHomeAddress: 'Please provide @.lower:message.homeAddress'
}
},
pt: {
message: {
homeAddress: 'Endereço residencial',
missingHomeAddress: 'Por favor, providencie o @.lower:message.homeAddress'
}
}
}
<label>{{ $t('message.homeAddress') }}</label>
<p class="error">{{ $t('message.missingHomeAddress') }}</p>
O resultado será o seguinte:
<label>Endereço residencial</label>
<p class="error">Por favor, providencie o Endereço residencial</p>
Você pode adicionar modificadores ou sobrescrever os existentes passando as opções de modificadores
para o construtor VueI18n
.
const i18n = new VueI18n({
locale: 'pt',
modifiers: {
// Adicionando um novo modificador
snakeCase: str => str.split(' ').join('-')
},
messages: {
// ...
},
})
# Agrupando com parêntese
Uma chave de tradução de uma mensagem também pode ser especificada com @:(message.foo.bar.baz)
, onde a referência a outra chave de tradução está entre parêntese ()
.
Isso pode ser necessário se um ponto .
for exigido após um link para outra mensagem @:message.something
, que de outra forma seria considerado parte do link.
Mensagens de localização:
const messages = {
en: {
message: {
dio: 'DIO',
linked: "There's a reason, you lost, @:(message.dio)."
}
},
pt: {
message: {
dio: 'DIO',
linked: "Há uma razão pela qual você falhou, @:(message.dio)."
}
}
}
Template:
<p>{{ $t('message.linked') }}</p>
O resultado será o seguinte:
<p>Há uma razão pela qual você falhou, DIO.</p>
# Mensagem com função
vue-i18n recomenda o uso de strings para formatação de lista ou formatação nomeada como mensagem de localização ao traduzir as mensagens.
No entanto, existem situações em que, devido à sintaxe complexa da linguagem, todo o poder do JavaScript é necessário. Nesse caso, em vez de mensagens de string, você pode usar uma mensagem com função.
A função abaixo retorna uma saudação:
const messages = {
en: {
greeting: (ctx) => 'Hello!'
},
pt: {
greeting: (ctx) => 'Olá!'
}
}
Usar a função da mensagem é fácil! Você só precisa especificar a chave usando $t
ou t
:
<p>{{ $t('greeting') }}</p>
O resultado será o seguinte:
<p>Olá!</p>
O resultado de retorno da função é usado para a mensagem.
# Formatação nomeada
vue-i18n suporta formatação nomeada como um formato de mensagem baseado em string. vue-i18n interpola os valores dos parâmetros com $t
ou t
, e os retorna.
O mesmo pode ser feito com a função da mensagem usando o contexto de mensagem:
Aqui está o exemplo de saudação:
const messages = {
en: {
greeting: (ctx) => `Hello, ${ctx.named('name')}!`
},
pt: {
greeting: (ctx) => `Olá, ${ctx.named('name')}!`
}
}
Template:
<p>{{ $t('greeting', { name: 'DIO' }) }}</p>
O resultado será o seguinte:
<p>Olá, DIO!</p>
O contexto da mensagem fornece acesso à função named
. Você deve especificar a chave especificada para $t
ou t
, que resolverá com o valor necessário.
# Formatação de lista
O uso da formatação de lista é semelhante ao formatação nomeada descrito acima.
vue-i18n suporta formatação de lista para mensagens de string. vue-i18n interpola os valores dos parâmetros com $t
ou t
, e os retorna.
O mesmo pode ser feito com a função da mensagem usando o contexto de mensagem:
Aqui está o exemplo de saudação:
const messages = {
en: {
greeting: (ctx) => `Hello, ${ctx.list(0)}!`
},
pt: {
greeting: (ctx) => `Olá, ${ctx.list(0)}!`
}
}
Template:
<p>{{ $t('greeting', ['DIO']) }}</p>
O resultado será o seguinte:
<p>Olá, DIO!</p>
O contexto da mensagem fornece acesso à função list
. Você deve especificar a chave especificada para $t
ou t
, que resolverá com o valor necessário.
# Limitação
Em uma função para mensagem, os seguintes recursos, que estão disponíveis em uma versão de string, não estarão disponíveis por meio do contexto da mensagem:
- Mensagens de localidade vinculadas
- Pluralização