AdonisJS - 如何 return 根据 Antl Provider 的区域设置验证消息
AdonisJS - How to return validation messages according to the locale of Antl Provider
我正在对我的 API 应用国际化,但我遇到了一些与 Antl 和验证消息相关的问题。
对于标准响应消息,我 return 根据用户设置的语言环境进行响应。我创建了一个路由来切换语言环境并设置为一个 cookie 和一个全局中间件以从 cookie 获取语言环境,然后我只是 return 存储在语言环境资源中的消息。
全局中间件:
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
ZH - https://github.com/LauraBeatris/xpack-adonis-api/blob/develop/resources/locales/en/validation.json
而且我想return根据用户设置的当前区域设置验证消息,但问题是验证器的get方法class无法访问antl 上下文对象与其他中间件一样。
验证器的消息方法:
get messages () {
return Antl.list('validation')
}
但是,当我使用中间件上下文提供的 antl 对象更改区域设置时,它不会在全局提供程序中更改,因此验证消息将始终 return 使用默认区域设置,而不是用户在中间件中设置的那个。
我想将语言环境切换路由与该 antl 全局提供程序集成,这样我就可以 return 葡萄牙语验证消息,例如。
要在验证器的get messages()
方法中使用Antl
对象,需要使用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
如果您需要更多信息,请不要犹豫:)
我正在对我的 API 应用国际化,但我遇到了一些与 Antl 和验证消息相关的问题。
对于标准响应消息,我 return 根据用户设置的语言环境进行响应。我创建了一个路由来切换语言环境并设置为一个 cookie 和一个全局中间件以从 cookie 获取语言环境,然后我只是 return 存储在语言环境资源中的消息。
全局中间件:
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
ZH - https://github.com/LauraBeatris/xpack-adonis-api/blob/develop/resources/locales/en/validation.json
而且我想return根据用户设置的当前区域设置验证消息,但问题是验证器的get方法class无法访问antl 上下文对象与其他中间件一样。
验证器的消息方法:
get messages () {
return Antl.list('validation')
}
但是,当我使用中间件上下文提供的 antl 对象更改区域设置时,它不会在全局提供程序中更改,因此验证消息将始终 return 使用默认区域设置,而不是用户在中间件中设置的那个。 我想将语言环境切换路由与该 antl 全局提供程序集成,这样我就可以 return 葡萄牙语验证消息,例如。
要在验证器的get messages()
方法中使用Antl
对象,需要使用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
如果您需要更多信息,请不要犹豫:)