Định dạng tin nhắn
18ways sử dụng waysParser theo mặc định. Trình phân tích đó cho phép bạn giữ bản gốc dễ đọc
trong khi vẫn xử lý các biến và định dạng theo ngôn ngữ/khu vực.
Các biến
Dùng dấu ngoặc nhọn cho biến. Với <T>, bạn có thể giữ giá trị nội tuyến ngay cạnh thông báo.
const label = await engine.t('Welcome back, {name}', {
vars: { name: 'Ada' },
});Số nhiều
Sử dụng các khối số nhiều kiểu ICU khi câu thực sự thay đổi cấu trúc.
const summary = await engine.t(
'{count, plural, =0{No messages} =1{One message} other{{count} messages}}',
{
vars: { count: 3 },
}
);Ngày tháng và tiền bạc
Nếu bạn truyền vào một đối tượng Date thực sự hoặc một đối tượng giống tiền tệ với amount và currency, 18ways sẽ tự động định dạng
nó ngay cả khi chỉ dùng một placeholder đơn giản như {publishedAt} hoặc {renewalTotal}.
Chỉ sử dụng trình định dạng tường minh khi bạn muốn kiểm soát đầu ra, chẳng hạn như dateStyle:long hoặc một
tỷ lệ chia tiền tùy chỉnh.
const publishedAt = new Date('2026-03-14T09:00:00Z');
const renewalTotal = {
amount: 1900,
currency: 'USD',
};
const updatedLabel = await engine.t('Last updated {publishedAt}', {
vars: { publishedAt },
});
const totalLabel = await engine.t('Renewal total {renewalTotal}', {
vars: { renewalTotal },
});
const detailedDate = await engine.t('Detailed date: {publishedAt, date, dateStyle:long}', {
vars: { publishedAt },
});Theo mặc định, số tiền được xem là đơn vị nhỏ. Nếu bạn đã có đơn vị lớn, hãy dùng trình định dạng tiền tệ
rõ ràng với divisor: 1.
Chọn khối
Dùng select khi nội dung phụ thuộc vào một tập nhỏ các giá trị rời rạc.
const banner = await engine.t(
'{isSignedIn, select, true{Welcome back, {name}} false{Sign in to continue} other{Sign in to continue}}',
{
vars: {
isSignedIn: true,
name: 'Ada',
},
}
);Thành phần cấu tạo
@18ways/core trả về chuỗi. Nếu bạn cần văn bản định dạng phong phú, hãy giữ nguyên cả câu và xử lý markup trong
bộ dựng của riêng bạn.
const cta = await engine.t('Click here to see more');Nếu ứng dụng của bạn cần tự động tổ hợp JSX, hãy chuyển sang @18ways/react hoặc @18ways/next.
Quy tắc thực hành
Nếu câu có thể được viết thành một cụm hoàn chỉnh với vài biến, hãy giữ nó trong một thông điệp. Điều đó làm cho chất lượng bản dịch tốt hơn hẳn so với việc ghép các mảnh lại với nhau trong code.