Avatar
0
minhvd Beginner
minhvd Beginner
Hỏi về xử lý multiple language cho website
Em đang làm web hỗ trợ 2 ngôn ngữ là Anh và Việt. Bên trong web có chức năng cho phép user thay đổi ngôn ngữ. Em thấy băn khoăn giữa 3 cách làm sau ở phía web:
  1. Tạo các route riêng biệt /en và /vn để hiển thị các ngôn ngữ khác nhau
  2. Dùng chung route, nhưng truyền khác param: ví dụ: ?lang=vi
  3. Dùng chung route. Biến current language sẽ được lưu ở local storage để lấy ra khi bắt đầu chạy app

Ở phía server, mỗi lần Call api, em định sẽ gửi biến current language lên HTTP header, từ đó server đọc và trả response đúng với ngôn ngữ mà user đang gửi lên. Ví dụ: nếu gửi header lên là en, thì trả về giá trị String hello, còn nếu gửi lên vn, thì trả về giá trị String xin chào. Web chỉ cần hiển thị lên là xong. Cách làm như thế có đúng k, hay phía server nên gửi về một object có đủ multi language( kiểu {en: hello, vi: xin chao} ), từ đó web tự xử lý để hiển thị đúng thông tin vs ngôn ngữ đang chọn

  • Answer
Remain: 5
2 Answers
Avatar
tvd12 Beginner
tvd12 Beginner
The Best Answer
A. Đối với client.
  1. Cách dùng /en, /vn thực tế không tiện, vì thực tế không phải API nào, page nào em cũng cần đa ngôn ngữ (chủ yếu cần đa ngôn ngữ là page tin tức hoặc bài viết), nên khi lập trình ở phía client không thể dùng javascript để auto bổ sung vào path cho href của các thẻ a được. Thêm vào đó ở trên server path nó sẽ ở dạng: /{lang}/api/xxx và cũng vì chỉ một vài API cần đa ngôn ngữ nên không thể nào common được việc lấy ngôn ngữ ra từ path variable. Nó cũng khó để em tạo ra được một file sitemap khi đường dẫn các API hoặc page không có chung định dạng.
  2. Anh cũng đang dùng cách này vì nó tiện hơn, anh có thể dùng javascript để thêm param vào tất cả các thẻ a, và trong trường hợp api không cần có ngôn ngữ thì cũng không sao. Lập trình trên server cũng đơn giản và common được code. Em có thể tham khảo tại đây.
  3. Cách này không phù hợp, vì như vậy thì thẻ a của em sẽ không hoạt động được, vì khi user click vào thẻ a thì nó mặc định nó sẽ không gọi bất kỳ script nào, mà em bắt sự kiện click để xử lý thì nó hơi dị.

B. Đối với server thì trình duyệt sẽ gọi bằng giao thức GET và nó sẽ gọi ngay sau khi user nhập được link trên trình duyệt, nên nó sẽ không bổ sung vào header bất kỳ cái gì cả, như vậy ví dụ user muốn gửi đường dẫn đến một trang đa ngôn ngữ cho một ai đó tham khảo thì sẽ không được, sẽ luôn mở ra website với ngôn ngữ mặc định, sau đó người kia phải chọn ngôn ngữ, như vậy quá bất tiện.

  • 0
  • Reply
Avatar
Khi đến server trên header bạn sử dụng Accept-Language để điền mức độ ưu tiên hiển thị ngôn ngữ nhé :)

Đây là header tiêu chuẩn rồi.

Còn 1 cách nữa dễ hơn nhưng cách này là custom là set cookie theo domain. Khi gửi request thì cookie sẽ tự động được gửi.

Cách 1 là 1 ý tưởng hay nếu UI của bạn phải có sự khác biệt nhiều giữa các quốc gia, nếu chỉ thay đổi text thì không cần dùng.

Cách 2 dùng param, param là một tham số không bắt buộc, nên không khả thi :)

cách 3: không hoạt động khi call get html. ví dụ https://stackask.com/

  • 0
  • Reply