AdonisJS-Antlプロバイダーのロケールに従って検証メッセージを返す方法


8

APIに国際化を適用していて、Antlと検証メッセージに関連するいくつかの問題があります。

標準の応答メッセージでは、ユーザーが設定したロケールに従って返されます。ロケールを切り替えるルートを作成し、Cookieとグローバルミドルウェアに設定して、Cookieからロケールを取得した後、ロケールリソースに格納されているメッセージを返すだけです。

グローバルミドルウェア:

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

しかし、検証メッセージを含む2つのファイルがあります:
PT- https : //github.com/LauraBeatris/xpack-adonis-api/blob/develop/resources/locales/pt/validation.json
EN- 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

回答:


3

バリデーターAntlget 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

さらに情報が必要な場合は、お気軽にご連絡ください:)


1
ありがとう!では、アプリのすべてのクラスでctxインスタンスにアクセスできますか?
Laura Beatris

1
どういたしまして:)、私の経験では、はい。しかし、100%確実ではありません
CrBast
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.