# Localização baseada em componentes
Em geral, as informações de localidade (por exemplo, locale, messages, etc) são definidas como opção de construtor na instância VueI18n e define a opção i18n como a instância raiz do Vue.
Portanto, você pode realizar traduções globalmente usando os métodos $t ou $tc na instância raiz do Vue e qualquer um dos componentes nela. Mas também é possível especificar dados para localização em cada componente separadamente, o que pode ser mais conveniente devido ao design orientado a componentes.
Um exemplo de localização baseada em componente:
// Definir a localização para raiz na instância Vue
const i18n = new VueI18n({
locale: 'pt',
messages: {
en: {
message: {
hello: 'Hello World',
greeting: 'Good morning'
}
},
pt: {
message: {
hello: 'Olá Mundo',
greeting: 'Bom dia'
}
}
}
})
// Definição no componente
const Component1 = {
template: `
<div class="container">
<p>Component1 locale messages: {{ $t("message.hello") }}</p>
<p>Fallback global locale messages: {{ $t("message.greeting") }}</p>
</div>`,
i18n: {
// opção `i18n` definindo dados de localização para o componente
messages: {
en: { message: { hello: 'hello component1' } },
pt: { message: { hello: 'olá componente1' } }
}
}
}
new Vue({
i18n,
components: {
Component1
}
}).$mount('#app')
Template:
<div id="app">
<p>{{ $t("message.hello") }}</p>
<component1></component1>
</div>
O resultado será o seguinte:
<div id="app">
<p>Olá Mundo</p>
<div class="container">
<p>Component1 locale messages: olá component1</p>
<p>Fallback global locale messages: Bom dia</p>
</div>
</div>
Como no exemplo acima, se o componente não tiver a mensagem de localidade, ele retornará às informações de localização definidas globalmente. O componente usa o idioma definido na instância raiz (no exemplo acima: locale: 'ja').
Observe que, por padrão, ao acessar os dados de localização da raiz, avisos serão gerados no console:
[vue-i18n] Value of key 'message.greeting' is not a string!
[vue-i18n] Fall back to translate the keypath 'message.greeting' with root locale.
Para ocultar esses avisos (deixando aqueles que alertam sobre a falta completa de tradução para a chave fornecida), defina a opção silentFallbackWarn: true ao inicializar a instância do VueI18n.
Se você precisar traduzir com base na localidade do componente, pode fazê-lo usando as opções sync: false e locale na propriedade do i18n.
# Mensagens de localização comuns para componentes
Às vezes, você pode querer importar as mensagens de localidade compartilhadas para determinados componentes, não o fallback de mensagens na localidade global (por exemplo, mensagens comuns de determinado recurso para componentes.
Para fazer isso, você pode usar a opção sharedMessages na propriedade i18n do componente.
Um exemplo de uso de mensagens de localização comuns:
export default {
en: {
buttons: {
save: 'Save'
// ...
}
},
pt: {
buttons: {
save: 'Salvar'
// ...
}
}
}
Componente:
import commonMessage from './locales/common' // importação de mensagens da localidade em comum
export default {
name: 'ServiceModal',
template: `
<div class="modal">
<div class="body">
<p>Este é um bom serviço</p>
</div>
<div class="footer">
<button type="button">
{{ $t('buttons.save') }}
</button>
</div>
</div>
`,
i18n: {
messages: { ... },
sharedMessages: commonMessages
}
}
Se as opções sharedMessages e messages forem especificadas, então suas mensagens serão mescladas em mensagens de localização na instância VueI18n deste componente.
# Localização em componentes funcionais
Ao usar um componente funcional, todos os dados (incluindo props, children, slots, parent, etc.) são passados através do context, que contém todos esses atributos. Além disso, não é possível usar this, então ao usar vue-i18n com componentes funcionais, você deve se referir a $t como parent.$t, assim:
...
<div>
<a href="#" target="_blank" rel="noopener noreferrer">
<img src="./assets/example.jpg" :alt="parent.$t('message.hello')" />
</a>
</div>
...