Adonis JS - Как вернуть сообщения о проверке в соответствии с языковым стандартом провайдера Antl - PullRequest
8 голосов
/ 16 февраля 2020

Я применяю интернационализацию для своего API, и у меня возникают некоторые проблемы, связанные с Antl и сообщениями проверки.

Со стандартными ответными сообщениями я возвращаюсь в соответствии с языковым стандартом, установленным пользователем. Я создал маршрут для переключения локалей и установил для cook ie и глобальное промежуточное ПО для получения локали от cook ie, а затем просто возвращаю сообщение, хранящееся в ресурсах локали.

Глобальное промежуточное ПО:

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

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

    await next()
  }
}

Маршрут:

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

Но у меня есть два файла с сообщениями проверки: PT - https://github.com/LauraBeatris/xpack-adonis-api/blob/develop/resources/locales/pt/validation.json RU - https://github.com/LauraBeatris/xpack-adonis-api/blob/develop/resources/locales/en/validation.json

И я хочу вернуть сообщения проверки в соответствии с текущей локалью, установленной пользователем, но проблема в том, что метод get класса валидатора не иметь доступ к объекту контекста antl, как и другие промежуточные программы.

Метод сообщений валидатора:

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

Но, когда я изменил локаль с помощью объекта antl, предоставленного контекстом промежуточного программного обеспечения, он не изменяется в глобальном провайдере, поэтому сообщения проверки всегда будут возвращаться с языком по умолчанию, а не заданным пользователем в промежуточном программном обеспечении. Я хочу интегрировать маршрут переключения локалей с этим глобальным провайдером antl, чтобы я мог, например, возвращать португальские проверочные сообщения.

Это репо моего проекта: https://github.com/LauraBeatris/xpack-adonis-api

1 Ответ

3 голосов
/ 23 февраля 2020

Чтобы использовать объект Antl в методе валидатора get messages(), необходимо использовать this.ctx.antl. Например:

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


Adonis не хранит язык, используемый Antl между запросами. Все маршруты должны иметь промежуточное программное обеспечение, которое применяет язык (тот, который вы создали). Пример:

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

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

Если вы хотите, чтобы все маршруты имели это промежуточное программное обеспечение, вы должны добавить его в start/kernel.js. : https://adonisjs.com/docs/4.1/middleware#_global_middleware

Не стесняйтесь, если вам нужна дополнительная информация:)

...