DDevArchive
Đăng nhập

i18n: đưa SaaS ra thế giới — multi-language, multi-currency

App tiếng Việt → 100 triệu người. Thêm tiếng Anh → 2 tỷ. Thêm tiếng Nhật → thị trường SaaS lớn thứ 2 thế giới. i18n (internationalization) không khó — nhưng phải plan từ đầu, refactor sau rất đau.

i18n vs l10n: khác nhau thế nào?

Thuật ngữNghĩaVí dụ
i18n (Internationalization)Code hỗ trợ NHIỀU ngôn ngữTách text ra file, dùng key thay hardcode
l10n (Localization)DỊCH + adapt cho 1 ngôn ngữ/vùng cụ thểDịch sang tiếng Nhật + format ¥1,000

Setup i18n cho Next.js (next-intl)

// File: messages-vi.json
{
  "nav": {
    "home": "Trang chủ",
    "pricing": "Bảng giá",
    "login": "Đăng nhập"
  },
  "hero": {
    "title": "Hoàn thành gấp đôi việc",
    "subtitle": "Không cần OT. Không cần thêm người.",
    "cta": "Bắt đầu miễn phí"
  },
  "pricing": {
    "monthly": "{price}/tháng",
    "annual": "{price}/năm (tiết kiệm {discount}%)"
  }
}
// File: Hero.tsx
import { useTranslations } from 'next-intl'

export function Hero() {
  const t = useTranslations('hero')

  return (
    <section>
      <h1>{t('title')}</h1>
      <p>{t('subtitle')}</p>
      <button>{t('cta')}</button>
    </section>
  )
}

// ❌ KHÔNG: <h1>Hoàn thành gấp đôi việc</h1>
// ✅ CÓ:    <h1>{t('title')}</h1>

Không chỉ dịch text: date, currency, số

Vấn đềVNUSNhậtSolution
Ngày12/08/202608/12/20262026年8月12日Intl.DateTimeFormat
Tiền500.000₫$500.00¥500Intl.NumberFormat + currency code
Số1.000,501,000.501,000.50Intl.NumberFormat
Hướng textLTR →LTR →LTR →dir=“rtl” cho Arabic/Hebrew
// File: format.ts
// Format currency tự động theo locale
function formatCurrency(
  amount: number, currency = 'VND', locale = 'vi-VN'
) {
  return new Intl.NumberFormat(locale, {
    style: 'currency',
    currency,
  }).format(amount)
}

formatCurrency(500000)                    // '500.000 ₫'
formatCurrency(500, 'USD', 'en-US')       // '$500.00'
formatCurrency(50000, 'JPY', 'ja-JP')     // '¥50,000'
💡 Dịch bằng AI, review bằng người

GPT-4 dịch UI text rất tốt. Flow: (1) Export file messages-vi.json, (2) GPT dịch sang messages-en.json, (3) Nhờ 1 native speaker review. Chi phí: gần 0. Thời gian: 2-3 giờ cho toàn bộ app.

❓ Sai lầm lớn nhất khi làm i18n?

  • Setup next-intl hoặc i18next từ đầu project
  • Tách text ra file messages-{locale}.json
  • Format date/currency bằng Intl API
  • Dịch bằng AI + review bằng native speaker