AdonisJS - Como retornar mensagens de validação de acordo com o código de idioma do Antl Provider

8

Estou aplicando internacionalização à minha API e estou tendo alguns problemas relacionados ao Antl e às mensagens de validação.

Com as mensagens de resposta padrão, estou retornando de acordo com o código de idioma definido pelo usuário. Criei uma rota para alternar localidades e defini-la como um cookie e um middleware global para obter a localidade do cookie e, em seguida, retorno a mensagem armazenada nos recursos de localidade.

Middleware global:

class Locale {
  async handle ({ request, antl }, next) {
    const lang = request.cookie('lang')

    if (lang) {
      antl.switchLocale(lang)
    }

    await next()
  }
}

Rota:

Route.get('/switch/:lang', ({ params, antl, request, response }) => {
  // Getting the current available locales
  const locales = antl.availableLocales()

  try {
    // Saving into cookies
    if (locales.indexOf(params.lang) > -1) {
      response.cookie('lang', params.lang, { path: '/' })
    }

    return response.status(200).send({ message: 'Locale changed succesfully' })
  } catch (err) {
    return response.status(err.status).send({ error: 'Something went wrong while trying to switch locales', data: { message: err.message || 'Error message not found', name: err.name } })
  }
})

Mas eu tenho dois arquivos com mensagens de validação:
PT - https://github.com/LauraBeatris/xpack-adonis-api/blob/develop/resources/locales/pt/validation.json
PT - https://github.com/ LauraBeatris / xpack-adonis-api / blob / develop / resources / locales / pt / validation.json

E quero retornar as mensagens de validação de acordo com o código de idioma atual definido pelo usuário, mas o problema é que o método get da classe validator não tem acesso ao objeto de contexto antl como os outros middlewares.

Método de mensagens do validador:

    get messages () {
    return Antl.list('validation')
  }

Porém, quando alterei o código do idioma com o objeto antl fornecido pelo contexto do middleware, ele não muda no provedor global, portanto, as mensagens de validação sempre retornam com o código do idioma padrão, em vez do definido pelo usuário no middleware . Quero integrar a rota do comutador de localidade com esse provedor global antl, para poder retornar mensagens de validação em português, por exemplo.

Esse é o repo do meu projeto: https://github.com/LauraBeatris/xpack-adonis-api

Laura Beatris
fonte

Respostas:

3

Para usar o Antlobjeto no get messages()método do validador, você precisa usar this.ctx.antl. Gostar :

var antl = this.ctx.antl;
...
antl.formatMessage(...)


O Adonis não armazena o idioma usado Antlentre as consultas. Todas as rotas devem ter o middleware que aplica o idioma (aquele que você criou). Exemplo:

Route.get('/user', 'UserController.Get').middleware(['Locale']); // Use cookie language

Route.get('/user', 'UserController.Get'); // Use default language

Se você deseja que todas as rotas tenham esse middleware, é necessário adicioná-lo start/kernel.js. : https://adonisjs.com/docs/4.1/middleware#_global_middleware

Não hesite se precisar de mais informações :)

CrBast
fonte
1
Obrigado! Então, eu tenho acesso à instância ctx em todas as classes do meu aplicativo?
Laura Beatris 23/02
1
De nada :), na minha experiência, sim. Mas não tenho 100% de certeza
CrBast 23/02