🧙♂️ [Case Study] Tự Động Kiểm Tra Lỗi Chính Tả Trong File i18n Với CSpell + Glob
- Category: Study
- #web
🧩 Vấn Đề: Dịch Sai Trong i18n
export default {
ja: {
heading: 'X | Your Time, Our Priority',
catchCopy0: 'Until 17:00',
catchCopy1: 'Shortest on order',
...
}
} as const;
Trong dự án sử dụng i18n riêng (không dùng thư viện ngoài), mỗi component đều có file .i18n.ts với cấu trúc tương tự:
Tuy nhiên, team gặp vấn đề:
- Số lượng file
.i18n.tslớn, mỗi file có nhiều key-value. - Dễ dịch sai chính tả hoặc thiếu dấu câu.
- Không thể kiểm tra thủ công từng key.
🚀 Giải Pháp: Viết Script Tự Động Kiểm Tra Với cspell
Chúng tôi đã viết một script Node.js để tự động:
- Tìm tất cả file
.i18n.tsbằngglob. - Parse nội dung phần
ja. - Flatten toàn bộ object thành dạng
path.key: value. - Dùng
cspellđể kiểm tra chính tả từng value. - Ghi log chi tiết vào file.
🛠️ Bước 1: Dò Tất Cả File .i18n.ts
const { glob } = require("glob");
const files = glob.sync("../account-web-us/src/**/*.i18n.ts");
Kết quả: Tìm thấy toàn bộ file i18n trong source code.
🧱 Bước 2: Parse Object ja và Flatten
function extractJaAllKeys(filePath) {
const content = readFileSync(filePath, "utf-8");
const cleaned = content
.replace(/^export default\s*/, "")
.replace(/as const;?\s*$/, "");
const obj = eval("(" + cleaned + ")");
const ja = obj.ja;
const results = [];
flattenObject(ja, ["ja"], results, filePath);
return results;
}
Ý tưởng: Dùng eval cẩn thận để parse object tĩnh, rồi flatten để có mảng { key, value }.
🔍 Bước 3: Kiểm Tra Chính Tả Với cspell
function checkSpell(text) {
const result = execSync(`echo "${text}" | npx cspell stdin`, {
encoding: "utf8",
stdio: ["pipe", "pipe", "pipe"],
});
}
Gợi ý: cspell sẽ trả về các dòng lỗi dạng:
text:1:5 - Unknown word (shippng)
Parse các dòng lỗi này để lấy từ sai.
✨ Output: Ghi Log Chi Tiết
Chúng tôi ghi 2 loại log:
spell-invalid.txt: Những dòng có từ sai chính tả.error.txt: Những file bị lỗi parse hoặc không có objectja.
Mỗi log đều ghi đầy đủ:
❌ File: /path/to/file.i18n.ts
🔸 Key: ja.catchCopy1
🔸 Text: "Shippng now"
🔻 Misspelled: shippng
📦 Full Script: Tích Hợp Hoàn Chỉnh
Toàn bộ logic được đóng gói vào 1 script duy nhất chạy qua lệnh node spellcheck.js.
✅ Có xử lý lỗi
✅ Ghi log rõ ràng
✅ Ignore từ được whitelisted (ví dụ "ABC")
📊 Kết Quả
- Chạy qua hơn 500 file
.i18n.ts - Phát hiện hàng trăm lỗi chính tả nhỏ: thiếu
s, viết saishipment, viết nhầmproductt, v.v. - Giảm được đáng kể lỗi dịch không chính xác gây ảnh hưởng UX
🤝 Tổng Kết
Tự viết một hệ thống kiểm tra i18n như trên:
- Hiệu quả nhanh gọn
- Không phụ thuộc framework
- Có thể extend dễ dàng cho
zh****,en****,vi****,…
Bạn hoàn toàn có thể áp dụng vào bất kỳ dự án nào có quản lý localization riêng, giúp bảo vệ chất lượng nội dung trên giao diện người dùng.