
Bản địa hóa giả: Kiểm tra mức độ sẵn sàng cho i18n mà không cần bản dịch thật
Bản dịch thật tốn thời gian và chi phí. Bản địa hóa giả biến đổi chuỗi nguồn thành văn bản vẫn đọc được nhưng rõ ràng là giả để lập tức làm lộ lỗi i18n — chuỗi được mã hóa cứng, lỗi tràn văn bản, lỗi RTL và lỗi nối chuỗi.
Bản địa hóa giả là gì?
Bản địa hóa giả thay các ký tự trong chuỗi nguồn bằng ký tự có dấu hoặc ký tự mở rộng trông tương tự, thêm phần đệm để giãn văn bản và đặt chuỗi trong dấu ngoặc vuông. Lập trình viên vẫn đọc được kết quả nhưng văn bản trông khác hẳn văn bản thật — nhờ đó bạn dễ dàng phát hiện chuỗi chưa được bọc bằng hàm dịch.
// Pseudo-localization transforms your source strings
// to simulate translation without real translators
// Original:
"Welcome to our application"
// Accented (simulates diacritics):
"[Ẁëľčöṁë ţö öüŕ àṗṗľïčàţïöñ]"
// Expanded (simulates text expansion ~30%):
"[Weeelcooomee tooo ouuur aaappliiicaaatiiioon]"
// Mirrored (simulates RTL layout):
"[noitacilppa ruo ot emocleW]"
// Brackets make untranslated strings immediately visibleCách dùng trong dự án
Cài đặt i18n-pseudo rồi chạy công cụ với các tệp locale. Công cụ tự động phát hiện định dạng tệp và tạo phiên bản bản địa hóa giả để bạn nạp làm locale kiểm thử trong ứng dụng.
// 1. Hardcoded strings (not wrapped in t())
// Pseudo strings have brackets/accents, so untranslated
// strings are immediately obvious in the UI
// 2. Text truncation
// Expanded text reveals buttons and labels that break
// when translations are longer than English
// 3. Layout issues
// Accented characters reveal font rendering problems
// RTL mode reveals directional layout bugs
// 4. Concatenation bugs
// "Hello " + name vs t('greeting', { name })
// Pseudo-localization breaks concatenated strings
// 5. Missing i18n wrappers
// Any string not going through the i18n system
// appears as plain English among pseudo text7 chiến lược biến đổi
i18n-pseudo cung cấp 7 chiến lược biến đổi, mỗi chiến lược kiểm tra một khía cạnh khác nhau trong cách bạn triển khai i18n. Dùng riêng từng chiến lược để kiểm thử có mục tiêu hoặc kết hợp qua cấu hình cài sẵn để kiểm tra toàn diện.
// Strategy 1: Accented characters
// Replace ASCII with similar-looking Unicode
// a -> à, e -> ë, o -> ö, etc.
// Preserves readability while testing rendering
// Strategy 2: Text expansion
// Pad strings to simulate longer translations
// German is ~30% longer, Finnish ~40% longer
// Helps catch UI overflow early
// Strategy 3: Brackets/wrappers
// Wrap strings in [brackets] or «guillemets»
// Makes untranslated strings visually obvious
// Strategy 4: Bidi/RTL
// Mirror text for right-to-left testing
// Catches layout issues before Arabic/Hebrew testing
// Strategy 5: Combined
// Apply all strategies simultaneously
// Maximum coverage in one pass5 cấu hình cài sẵn tích hợp
Cấu hình cài sẵn kết hợp nhiều chiến lược thành những cấu hình thường dùng. Dùng cấu hình cài sẵn để kiểm thử nhanh hoặc tạo tổ hợp tùy chỉnh theo nhu cầu cụ thể.
// Using i18n-pseudo CLI
npx i18n-pseudo generate \
--source locales/en.json \
--output locales/pseudo.json \
--preset accented
# Available presets:
# accented - Ḣëľľö Ẁöŕľð (default)
# expanded - Heeellooo Wooorld
# mirrored - dlroW olleH
# brackets - [Hello World]
# maximum - [Ḣëëëľľľöööö Ẁöööŕŕŕľľľðððð]
// i18n-pseudo.config.json
{
"source": "locales/en.json",
"output": "locales/pseudo.json",
"preset": "maximum",
"expansion": 1.4,
"wrapper": ["[", "]"],
"exclude": [
"*.url",
"*.email",
"branding.*"
]
}Tích hợp CI/CD
Chạy bản địa hóa giả trong CI để tự động phát hiện lỗi hồi quy i18n. Tạo các tệp bản địa hóa giả, hiển thị những màn hình chính và so sánh với ảnh chụp màn hình chuẩn. Mọi văn bản chưa biến đổi trong ảnh chụp màn hình đều là lỗi hồi quy — một chuỗi mới được mã hóa cứng đã bỏ qua hàm dịch.
# .github/workflows/pseudo-check.yml
name: Pseudo-Localization Check
on:
pull_request:
paths:
- 'src/**'
jobs:
pseudo-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Generate pseudo locale
run: npx i18n-pseudo generate \
--source locales/en.json \
--output locales/pseudo.json \
--preset maximum
- name: Build with pseudo locale
run: npm run build
env:
NEXT_PUBLIC_LOCALE: pseudo
- name: Run visual regression tests
run: npx playwright test --project=pseudo
env:
LOCALE: pseudoDùng thử i18n Agent ngay
Thả tệp bản dịch của bạn vào đây
JSON, YAML, PO, XML, CSV, Markdown, Properties
hoặc nhấp để duyệt
Ngôn ngữ đích