AdonisJS: cómo devolver mensajes de validación de acuerdo con la configuración regional de Antl Provider

8

Estoy aplicando la internacionalización a mi API y tengo algunos problemas relacionados con Antl y mensajes de validación.

Con los mensajes de respuesta estándar, regreso de acuerdo con la configuración regional establecida por el usuario. Creé una ruta para cambiar las configuraciones regionales y establecer una cookie y un middleware global para obtener la configuración regional de la cookie y luego simplemente devuelvo el mensaje almacenado en los recursos de la configuración regional.

Middleware global:

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

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

    await next()
  }
}

Ruta:

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 } })
  }
})

Pero tengo dos archivos con mensajes de validación:
PT - https://github.com/LauraBeatris/xpack-adonis-api/blob/develop/resources/locales/pt/validation.json
ES - https://github.com/ LauraBeatris / xpack-adonis-api / blob / desarrollo / recursos / locales / es / validation.json

Y quiero devolver los mensajes de validación de acuerdo con la configuración regional actual establecida por el usuario, pero el problema es que el método get de la clase de validador no tiene acceso al objeto de contexto antl como los otros middlewares.

Método de mensajes del validador:

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

Pero, cuando cambié la configuración regional con el objeto antl proporcionado por el contexto de middleware, no cambia en el proveedor global, por lo que los mensajes de validación siempre volverán con la configuración regional predeterminada, en lugar del establecido por el usuario en el middleware . Quiero integrar la ruta del conmutador de configuración regional con ese proveedor global antl, por lo que podré devolver mensajes de validación portugueses, por ejemplo.

Ese es el repositorio de mi proyecto: https://github.com/LauraBeatris/xpack-adonis-api

Laura Beatris
fuente

Respuestas:

3

Para usar el Antlobjeto en el get messages()método del validador, debe usarlo this.ctx.antl. Me gusta :

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


Adonis no almacena el idioma utilizado Antlentre consultas. Todas las rutas deben tener el middleware que aplique el idioma (el que usted hizo). Ejemplo:

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

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

Si desea que todas las rutas tengan este middleware, debe agregarlo start/kernel.js. : https://adonisjs.com/docs/4.1/middleware#_global_middleware

No lo dudes si necesitas más información :)

CrBast
fuente
1
¡Gracias! Entonces, ¿tengo acceso a la instancia de ctx en todas las clases de mi aplicación?
Laura Beatris
1
De nada :), en mi experiencia, sí. Pero no estoy 100% seguro
CrBast