i18n
Plugin NocoBase quản lý các file đa ngôn ngữ thông qua thư mục src/locale/. Sau khi viết xong file dịch, bạn có thể lấy văn bản đã dịch bằng this.t() trong Plugin, bằng hook useT() trong component, và bằng tExpr() trong định nghĩa FlowModel.
File dịch
Trong src/locale/ của plugin, hãy tạo các file JSON theo từng ngôn ngữ. Key là văn bản gốc tiếng Anh, value là bản dịch của ngôn ngữ tương ứng:
Một số lưu ý:
- key dùng văn bản gốc tiếng Anh, để khi thiếu bản dịch vẫn có thể fallback về tiếng Anh
- biến dùng dấu ngoặc nhọn kép
{{name}}, đồng nhất với cú pháp của i18next - Khi thêm file ngôn ngữ lần đầu, bạn cần khởi động lại ứng dụng để có hiệu lực; sau đó nếu sửa nội dung thì hot reload là đủ
- NocoBase sẽ tự động dùng tên package của plugin làm namespace của bản dịch, nên các bản dịch của các plugin khác nhau sẽ không xung đột
Sử dụng trong Plugin: this.t()
Trong class Plugin, this.t() sẽ tự động inject tên package của plugin hiện tại làm namespace, bạn không cần truyền ns thủ công:
Sử dụng trong Component: useT()
Trong React component, bạn không thể dùng trực tiếp this.t(). Plugin scaffold sẽ tự động sinh ra một file locale.ts, trong đó cung cấp hook useT():
Trong component bạn dùng như sau:
Hàm t được trả về bởi useT() đã bind sẵn namespace của plugin, bạn chỉ cần truyền key trực tiếp.
Sử dụng trong FlowModel: tExpr()
FlowModel.define() và registerFlow() được thực thi khi module được load — lúc đó i18n chưa được khởi tạo nên không thể gọi trực tiếp t(). Trong tình huống này hãy dùng tExpr() — nó sinh ra một chuỗi biểu thức dịch trễ, và sẽ được resolve khi runtime:
Nói đơn giản: this.t() và useT() dùng để dịch khi runtime, còn tExpr() dùng để dịch trễ khi định nghĩa tĩnh.
tExpr có hai nguồn: locale.ts được plugin tự sinh và @nocobase/flow-engine. Khác biệt là tExpr trong locale.ts đã bind sẵn tên package của plugin làm namespace, còn tExpr import trực tiếp từ @nocobase/flow-engine thì không có namespace bind sẵn. Trong code plugin, luôn dùng tExpr được export từ locale.ts, để bản dịch có thể khớp đúng với file ngôn ngữ của chính plugin.
Bảng tra cứu nhanh ba cách dùng
Liên kết liên quan
- Context → Khả năng thường dùng → i18n — Tham chiếu API đầy đủ của ctx.t, ctx.i18n
- Danh sách ngôn ngữ — Danh sách đầy đủ mã ngôn ngữ NocoBase hỗ trợ
- Phát triển Component — Sử dụng useFlowContext trong component
- Tổng quan FlowEngine — Cách dùng tExpr trong FlowModel

