## Giới thiệu Khi sản phẩm mở rộng ra nhiều thị trường, việc quản lý đa ngôn ngữ trên cả web và mobile trở thành thách thức lớn. Một giải pháp i18n chung giúp giảm trùng lặp mã, đảm bảo nhất quán thuật ngữ và đơn giản hóa quy trình cập nhật bản dịch. ## Các bước chính 1. **Chuẩn hóa kho tài nguyên dịch** - Sử dụng định dạng JSON hoặc YAML cho từng ngôn ngữ (ví dụ: en.json, vi.json). - Lưu trữ trong thư mục `packages/i18n/locales` của monorepo để cả Next.js và Expo đều truy cập được. 2. **Chọn thư viện phù hợp** - Web: `next-i18next` hoặc `i18next` kết hợp với `next-translate`. - Mobile: `i18next` cùng `react-i18next` và `expo-localization` để phát hiện ngôn ngữ thiết bị. 3. **Cấu hình khởi tạo chung** - Tạo file `i18n.ts` export một instance `i18n` đã được init với `resources`, `lng`, `fallbackLng`, `interpolation`. - Import instance này ở `app/_app.tsx` (Next.js) và `App.tsx` (Expo). 4. **Xử lý plural, context và formatting** - Định nghĩa quy tắc plural trong file ngôn ngữ theo chuẩn ICU. - Sử dụng `t('key', { count: 5 })` để tự động chọn dạng số nhiều. - Áp dụng `Intl.DateTimeFormat` và `Intl.NumberFormat` qua helper chung để định dạng ngày, giờ, tiền tệ. 5. **Tích hợp vào quy trình CI/CD** - Thêm script `i18n:check` chạy `i18next-scanner` để phát hiện key thiếu. - Chạy tự động trên pull request; chặn merge nếu có key chưa dịch. 6. **Cập nhật bản dịch liên tục** - Kết nối kho locales với công cụ quản lý dịch như Crowdin, Lokalise hoặc Transifex. - Sử dụng webhook để pull bản dịch mới về monorepo mỗi đêm. ## Lời khuyên thực tế - **Tách biệt namespace**: chia nhỏ theo feature (auth, checkout, profile) để tải lazy khi cần. - **Tránh hard‑code chuỗi**: luôn dùng `t('common.save')` ngay cả cho văn bản tĩnh. - **Test trên thiết bị thật**: ngôn ngữ RTL (Arabic, Hebrew) thường lộ lỗi layout chỉ thấy trên mobile. - **Giám sát hiệu suất**: đo lường kích thước bundle i18n; loại bỏ ngôn ngữ không dùng qua dynamic import. Với cách tiếp cận trên, team có thể duy trì một nguồn sự thật duy nhất cho đa ngôn ngữ, giảm thiểu bug liên quan đến bản dịch và tăng tốc độ phát hành tính năng mới cho cả web lẫn mobile.