AdonisJS - Cách trả lại tin nhắn xác thực theo ngôn ngữ của Nhà cung cấp Antl


8

Tôi đang áp dụng quốc tế hóa cho API của mình và tôi đang gặp một số vấn đề liên quan đến Antl và thông báo xác thực.

Với các thông báo phản hồi tiêu chuẩn, tôi sẽ trở lại theo ngôn ngữ được đặt bởi người dùng. Tôi đã tạo một tuyến đường để chuyển địa điểm và đặt thành cookie và phần mềm trung gian toàn cầu để lấy miền địa phương từ cookie và sau đó tôi chỉ cần trả lại tin nhắn được lưu trữ trong tài nguyên miền địa phương.

Middleware toàn cầu:

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

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

    await next()
  }
}

Tuyến đường:

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

Nhưng tôi có hai tệp có thông báo xác thực:
PT - https://github.com/LauraBeatris/xpack-adonis-api/blob/develop/resource/locales/pt/validation.json
EN - https://github.com/ LauraBeatris / xpack-adonis-api / blob / Develop / resource / loc / en / verify.json

Và tôi muốn trả về các thông báo xác thực theo ngôn ngữ hiện tại do người dùng đặt, nhưng vấn đề là phương thức get của lớp trình xác nhận không có quyền truy cập vào đối tượng bối cảnh antl như các phần mềm trung gian khác.

Phương thức tin nhắn của trình xác nhận:

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

Nhưng, khi tôi thay đổi ngôn ngữ với đối tượng antl được cung cấp bởi bối cảnh phần mềm trung gian, nó không thay đổi trong nhà cung cấp toàn cầu, vì vậy các thông báo xác thực sẽ luôn trả về với ngôn ngữ mặc định, thay vì một địa điểm do người dùng đặt trong phần mềm trung gian . Tôi muốn tích hợp tuyến chuyển đổi ngôn ngữ địa phương với nhà cung cấp toàn cầu antl đó, vì vậy tôi sẽ có thể trả lại tin nhắn xác thực tiếng Bồ Đào Nha chẳng hạn.

Đó là repo của dự án của tôi: https://github.com/LauraBeatris/xpack-adonis-api

Câu trả lời:


3

Để sử dụng Antlđối tượng trong get messages()phương thức trình xác nhận, bạn cần sử dụng this.ctx.antl. Giống :

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


Adonis không lưu trữ ngôn ngữ được sử dụng bởi Antlgiữa các truy vấn. Tất cả các tuyến phải có phần mềm trung gian áp dụng ngôn ngữ (ngôn ngữ bạn đã thực hiện). Thí dụ :

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

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

Nếu bạn muốn tất cả các tuyến đường có phần mềm trung gian này, bạn phải thêm nó vào start/kernel.js. : https://adonisjs.com/docs/4.1/middleware#_global_middleware

Đừng ngần ngại nếu bạn cần thêm thông tin :)


1
Cảm ơn! Vì vậy, tôi có quyền truy cập vào ví dụ ctx trong tất cả các lớp của ứng dụng của mình không?
Laura Beatris

1
Bạn được chào đón :), theo kinh nghiệm của tôi, vâng. Nhưng tôi không chắc chắn 100%
CrBast
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.