QPANC são as iniciais de Quasar PostgreSQL ASP NET Core.
- Source
- Introdução
- Parte I - ASP.NET - Inicializando os Projetos
- Parte 2 - PostgreSQL
- Parte 3 - ASP.NET - Registrando Serviços e Lendo Variáveis de Ambiente
- Parte 4 - ASP.NET - Entity Framework e ASP.NET Core Identity
- Parte 5 - ASP.NET - Documentação Interativa com Swagger
- Parte 6 - ASP.NET - Regionalização
- Parte 7 - ASP.NET - Autenticação e Autorização
- Parte 8 - ASP.NET - CORS
- Parte 9 - Quasar - Criação e Configuração do Projeto
- Parte 10 - Quasar - Configurações e Customizações
- Parte 11 - Quasar - Componentes - Diferença entre SPA e SSR
- Parte 12 - Quasar - Serviços
- Parte 13 - Quasar - Regionalização e Stores
- Parte 14 - Quasar - Consumindo a API
- Parte 15 - Quasar - Login
- Parte 16 - Quasar - Áreas Protegidas
- Parte 17 - Quasar - Registro
- Parte 18 - Docker - Maquina Virtual Linux
- Parte 19 - Docker - Registro e Build
- Parte 20 - Docker - Traefik e Publicação
- Demo Online
27 Configuração do i18n
Agora que já configuramos a persistência dos dados relativos ao cliente, podemos configurar os parâmetros de internacionalização.
Para tal, vá até o boot i18n
(ele deve ter sido criado durante a criação do projeto, caso não tenha sido, você deverá adiciona-lo agora):
QPANC.App/src/boot/i18n.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import messages from 'src/i18n'
import { Quasar } from 'quasar'
Vue.use(VueI18n)
export default ({ Vue, app, store }) => {
const fallback = Quasar.lang.isoName
const locale = store.getters['app/locale'] || fallback
Quasar.lang.set(locale)
const i18n = new VueI18n({
locale: locale,
fallbackLocale: fallback,
messages
})
app.i18n = i18n
}
28 Troca de Idioma
Para alternar entre um idioma e outro, é bem simples, basta seta o idioma desejado no i18n
e no lang
do quasar. iremos construir um componente bem simples, que irá permitir que o usuário escolha o idioma desejado.
Como primeiro passo, iremos adicionar à pasta statics
alguns ícones, no caso a bandeira do Brasil e a dos Estados Unidos. você pode conseguir estes arquivos no site Flat Icon
Então crie a pasta locale
em QPANC.App/src/components
e adicione os arquivos index.js
, index.vue
e index.sass
QPANC.App/src/components/locale/index.js
export default {
name: 'LocaleComponent',
data () {
return {
fab: false
}
},
computed: {
locale () {
return this.$store.getters['app/locale']
},
icon () {
return `img:statics/flags/${this.locale}.svg`
}
},
methods: {
async set (locale) {
this.$store.commit('app/localeUser', locale)
this.$i18n.locale = locale
const lang = await import('quasar/lang/' + locale)
this.$q.lang.set(lang)
}
}
}
QPANC.App/src/components/locale/index.sass
.component-locale
.q-btn--fab .q-btn__wrapper
padding: 0
.q-fab__icon-holder,
img
width: 56px
height: 56px
.q-btn--fab-mini .q-btn__wrapper
padding: 0
img
width: 40px
height: 40px
QPANC.App/src/components/locale/index.vue
<template>
<q-page-sticky position="bottom-right" class="component-locale" :offset="[18, 18]">
<q-fab v-model="fab" :label="$t('locale.title')" external-label vertical-actions-align="right" :icon="icon" direction="up" >
<q-fab-action label-position="left" icon="img:statics/flags/pt-br.svg" @click="set('pt-br')" :label="$t('locale.ptbr')" external-label />
<q-fab-action label-position="left" icon="img:statics/flags/en-us.svg" @click="set('en-us')" :label="$t('locale.enus')" external-label />
</q-fab>
</q-page-sticky>
</template>
<script src="./index.js"></script>
<style src="./index.sass" lang="sass"></style>
A troca de idioma é realizada no seguinte trecho de código:
async set (locale) {
this.$store.commit('app/localeUser', locale)
this.$i18n.locale = locale
const lang = await import('quasar/lang/' + locale)
this.$q.lang.set(lang)
}
Como você deve ter percebido, este componente usa alguns textos localizados, então precisamos atualizar os arquivos JSON
utilizados pelo i18n
.
Quasar.App/src/i18n/en-us/index.js
export default {
locale: {
title: 'Idiom',
ptbr: 'Portuguese',
enus: 'English'
}
}
Quasar.App/src/i18n/pt-br/index.js
export default {
locale: {
title: 'Idioma',
ptbr: 'Português',
enus: 'Inglês'
}
}
Agora precisamos registrar este componente, para tal, crie o boot components
quasar new boot components
QPANC.App/quasar.config.js
module.exports = function (ctx) {
return {
boots: [
'components'
]
}
}
QPANC.App/src/boot/components.js
import Vue from 'vue'
Vue.component('locale-switch', () => import('components/locale/index.vue'))
E por fim, adicione este componente aos layouts main
e clean
<template>
<q-layout id="layout-clean" view="lHh Lpr lFf" class="bg-main">
<!-- ... -->
<locale-switch></locale-switch>
</q-layout>
</template>
E então podemos executar a aplicação e realizar alguns testes. Como sugestão, abra a tela de Login, envie um usuário/senha incorretos, troque o idioma e tente novamente. A aplicação deverá alternar entre os dois idiomas, assim como a API
deve retornar os erros no mesmo idioma que a aplicação.
29 Injetando o Global bus, i18n e router na store
Em uma aplicação SSR
, como devemos manter o isolamento os serviços e recursos, não podemos exportar e consequentemente importar recursos de forma global.
Porém, é comum que precisemos acessar as rotas, os textos localizados, ou até mesmo emitir e escutar eventos.
Neste caso, podemos criar um arquivo de boot, e injetar estes recursos direto na store.:
quasar new boot store
E claro, não esqueça de adicionar ele ao quasar.config.js > boots
. Apenas lembre-se que este boot
deve ser colocado após o i18n
.
QPANC.App/quasar.config.js
module.exports = function (ctx) {
return {
boots: [
'i18n',
'store'
]
}
}
E agora, a implementação deste boot.:
QPANC.App/src/boot/store.js
export default async ({ app, store, router }) => {
store.$router = router
Object.defineProperty(store, '$t', {
get () {
return app.i18n.t.bind(app.i18n)
}
})
Object.defineProperty(store, '$route', {
get () {
return router.route
}
})
Object.defineProperty(store, '$root', {
get () {
return router.app.$root
}
})
}
A partir deste ponto, você pode acessar o this.$root
, this.$t
, this.$router
e this.$route
de suas actions
, mutations
e getters
.
Top comments (0)