Ngôn ngữ giao diện
Chữ có sẵn trong component (nút Đóng, nhãn cho trình đọc màn hình, trạng thái trống…) mặc định là tiếng Anh. YugenProvider đổi toàn bộ sang tiếng Việt, hoặc sang ngôn ngữ khác, bằng một prop messages.
Chuyển sang tiếng Việt
Mặc định là tiếng Anh. messagesVi chứa bản tiếng Việt của mọi chuỗi có sẵn; locale đổi định dạng ngày, giờ và số.
import { Toaster, YugenProvider, messagesVi } from "yugen-ui";
export function App({ children }: { children: React.ReactNode }) {
return (
<YugenProvider applyToDocument messages={messagesVi} locale="vi-VN">
<Toaster />
{children}
</YugenProvider>
);
}Chuỗi có sẵn là chữ component tự hiển thị hoặc đọc cho trình đọc màn hình mà bạn không truyền vào: nhãn nút X, “Đang tải…”, “Không tìm thấy kết quả”, mô tả biểu đồ, thông báo aria-live. Nội dung bạn truyền vào (tiêu đề, children, label của Field) không bị đổi.
messagesVi là một object thường; bundler chỉ đưa nó vào bản build khi bạn import, ứng dụng chỉ dùng tiếng Anh không tốn thêm byte nào. messagesEn (bản tiếng Anh, giống mặc định) vẫn có, dùng làm gốc cho ngôn ngữ khác.
Đổi vài chuỗi
messages nhận một phần: theo namespace của component, chỉ những chuỗi cần đổi.
// Chỉ đổi chuỗi cần đổi, phần còn lại giữ mặc định
<YugenProvider messages={{ dialog: { close: "Close dialog" } }}>…</YugenProvider>
// Provider lồng kế thừa messages và locale của provider ngoài, rồi ghi đè tiếp
<YugenProvider messages={messagesVi} locale="vi-VN">
<YugenProvider messages={{ toast: { dismiss: "Ẩn" } }}>…</YugenProvider>
</YugenProvider>
// Prop nhãn riêng của component vẫn thắng messages
<SearchBox dismissLabel="Xoá từ khoá" />Thứ tự ưu tiên: prop nhãn của chính component (vd. dismissLabel của SearchBox), rồi messages của provider gần nhất, rồi provider ngoài, cuối cùng là mặc định tiếng Anh. Tên namespace và từng khoá có gợi ý kiểu trong editor; mục Messages ở cuối mỗi trang component liệt kê đủ khoá, mặc định tiếng Anh và bản tiếng Việt.
Ngày, giờ và số
locale của YugenProvider là locale Intl mặc định cho component.
Biểu đồ, DatePicker, TimePicker, NotificationCenter và Rating định dạng số và ngày giờ theo locale của provider (mặc định "en-US"). Prop locale của từng component vẫn ưu tiên hơn. Calendar dùng locale của react-day-picker, nằm trong messages.calendar.locale; messagesVi đã đặt sẵn tiếng Việt.
Hướng chữ là việc riêng của prop dir, xem Hướng chữ RTL.
Ngôn ngữ khác
Viết một object YugenMessages đầy đủ, thường bắt đầu từ messagesEn.
import { messagesEn, type YugenMessages } from "yugen-ui";
// Kiểu YugenMessages đầy đủ: thiếu namespace nào là typecheck báo lỗi
export const messagesJa: YugenMessages = {
...messagesEn,
dialog: { close: "閉じる" },
toast: { region: "通知", regionHotkey: "通知 ({hotkey})", dismiss: "通知を閉じる" },
// …
};
<YugenProvider messages={messagesJa} locale="ja-JP">…</YugenProvider>Chuỗi có giá trị thay đổi (số bước, số thông báo, tên tệp) là hàm, nên tự xử lý được số nhiều và thứ tự từ của từng ngôn ngữ. Khi nâng cấp mà component có chuỗi mới, typecheck chỉ ra chỗ còn thiếu.
Khi copy source
Mỗi component có file messages.ts cạnh file component.
// Source copy bằng CLI / shadcn: mỗi component có messages.ts riêng, mặc định tiếng Anh
import { dialogMessagesVi } from "@/components/ui/Dialog/Dialog";
import { toastMessagesVi } from "@/components/ui/Toast/Toast";
const messages = { dialog: dialogMessagesVi, toast: toastMessagesVi };
<YugenProvider messages={messages} locale="vi-VN">…</YugenProvider>messagesVi chỉ có trong gói npm. Với source copy bằng @yugen-ui/cli hoặc shadcn, ghép các …MessagesVi của những component bạn có; kiểu YugenMessages cũng chỉ gồm các component đó. Muốn đổi hẳn mặc định thì sửa trực tiếp messages.ts.
- Đặt messages và locale một lần ở YugenProvider gốc.
- Dùng prop nhãn của component khi một chỗ cần chữ khác phần còn lại của ứng dụng.
- Tạo object messages mới trong mỗi lần render: khai báo ngoài component hoặc dùng useMemo.
- Dịch nội dung của bạn bằng messages; nó chỉ dành cho chữ có sẵn của component.