# Pluralização
Você pode usar pluralização para mensagens traduzidas. Para fazer isso, precisa definir a localidade e especificar as strings de tradução para os diferentes casos por meio do separador |
.
Seu template precisará usar $tc()
em vez de $t()
.
Mensagens locais abaixo:
const messages = {
en: {
car: 'car | cars',
apple: 'no apples | one apple | {count} apples'
},
pt: {
car: 'carro | carros',
apple: 'sem maçãs | uma maçã | {count} maçãs'
}
}
Template:
<p>{{ $tc('car', 1) }}</p>
<p>{{ $tc('car', 2) }}</p>
<p>{{ $tc('apple', 0) }}</p>
<p>{{ $tc('apple', 1) }}</p>
<p>{{ $tc('apple', 10, { count: 10 }) }}</p>
O resultado será o seguinte:
<p>carro</p>
<p>carros</p>
<p>sem maçãs</p>
<p>uma maçã</p>
<p>10 maçãs</p>
# Acessando o número por meio do argumento predefinido
Não há necessidade de passar explicitamente o número para pluralização. Em mensagens de localização, um número está disponível através dos argumentos nomeados {count}
e/ou {n}
. Você pode substituí-los, se desejar.
Mensagens locais abaixo:
const messages = {
en: {
apple: 'no apples | one apple | {count} apples',
banana: 'no bananas | {n} banana | {n} bananas'
},
pt: {
apple: 'sem maçãs | uma maçã | {count} maçãs'
banana: 'sem bananas | {n} banana | {n} bananas'
}
}
Template:
<p>{{ $tc('apple', 10, { count: 10 }) }}</p>
<p>{{ $tc('apple', 10) }}</p>
<p>{{ $tc('banana', 1, { n: 1 }) }}</p>
<p>{{ $tc('banana', 1) }}</p>
<p>{{ $tc('banana', 100, { n: 'Muitas' }) }}</p>
O resultado será o seguinte:
<p>10 maçãs</p>
<p>10 maçãs</p>
<p>1 banana</p>
<p>1 banana</p>
<p>Muitas bananas</p>
# Pluralização personalizadas
Essa pluralização, entretanto, não se aplica a todas as línguas (as línguas eslavas, por exemplo, têm regras de pluralização diferentes).
Para implementar essas regras, você pode passar um objeto pluralizationRules
opcional para as opções do construtor VueI18n
.
Um exemplo simplificado para idiomas eslavos (russo, ucraniano e outros):
new VueI18n({
// Key - idioma para usar a regra, `'ru'`, neste caso
// Value - função para escolher a forma plural correta
pluralizationRules: {
/**
* @param choice {number} um índice de escolha dado pela entrada de $tc: `$tc('path.to.rule', choiceIndex)`
* @param choicesLength {number} quantidade geral de opções disponíveis
* @returns índice final para selecionar as palavras no plural
*/
'ru': function(choice, choicesLength) {
// this === Instância VueI18n, então a propriedade locale também existe aqui
if (choice === 0) {
return 0;
}
const teen = choice > 10 && choice < 20;
const endsWithOne = choice % 10 === 1;
if (choicesLength < 4) {
return (!teen && endsWithOne) ? 1 : 2;
}
if (!teen && endsWithOne) {
return 1;
}
if (!teen && choice % 10 >= 2 && choice % 10 <= 4) {
return 2;
}
return (choicesLength < 4) ? 2 : 3;
}
}
})
Essa implementação permitirá que você use:
const messages = {
ru: {
car: '0 машин | {n} машина | {n} машины | {n} машин',
banana: 'нет бананов | {n} банан | {n} банана | {n} бананов'
}
}
Onde o formato é 0 coisas | número de itens termina em 1 | o número de coisas que termina em 2-4 | o número de coisas que termina com 5-9, 0 e o número coisas que termina de 11 a 19
.
P.S. A pluralização eslava é complexa, você pode ler mais sobre isso aqui (opens new window).
No template, você ainda precisa usar $tc()
em vez de $t()
:
<p>{{ $tc('car', 1) }}</p>
<p>{{ $tc('car', 2) }}</p>
<p>{{ $tc('car', 4) }}</p>
<p>{{ $tc('car', 12) }}</p>
<p>{{ $tc('car', 21) }}</p>
<p>{{ $tc('banana', 0) }}</p>
<p>{{ $tc('banana', 4) }}</p>
<p>{{ $tc('banana', 11) }}</p>
<p>{{ $tc('banana', 31) }}</p>
O resultado será o seguinte:
<p>1 машина</p>
<p>2 машины</p>
<p>4 машины</p>
<p>12 машин</p>
<p>21 машина</p>
<p>нет бананов</p>
<p>4 банана</p>
<p>11 бананов</p>
<p>31 банан</p>
# Pluralização padrão
Se nenhuma regra de pluralização for fornecida para a localidade em uso, a regra padrão do idioma inglês será usada.