💡 Để bản địa hóa ứng dụng iOS hoặc Android sang tiếng Việt: thêm locale
vi(vi.lprojtrên iOS,res/values-vi/trên Android), cung cấp cả hai khóa số nhiều CLDR ("one" và "other"), và định dạng VND bằng APIIntlvới localevi-VN. Danh từ tiếng Việt không biến hình theo số lượng nên hai khóa số nhiều thường có nội dung giống nhau.
Ý chính
- iOS: thêm
vivào danh sách Localizations trong Xcode; từ Xcode 15, String Catalog (.xcstrings) tập trung tất cả locale vào một file và hiển thị tiến độ dịch ngay trong IDE. - Android: tạo
res/values-vi/strings.xml; luôn giữ fileres/values/strings.xmlmặc định đầy đủ - thiếu một khóa trong file mặc định sẽ gây crash ứng dụng trên mọi locale không được hỗ trợ. - Số nhiều: CLDR xác định tiếng Việt có hai phạm trù số lượng: "one" (n=0 hoặc n=1) và "other" (n≥2). Cần khai báo cả hai khóa trong
.stringsdicthoặc<plurals>, kể cả khi nội dung giống nhau. - Tham số: bọc mọi chuỗi không dịch được trong
<xliff:g id="count" example="5">%d</xliff:g>để dịch thuật viên biết không được thay đổi phần đó. - Giao diện: chuỗi tiếng Việt với dấu thanh thường rộng hơn tiếng Anh 15-25% - thiết kế container linh hoạt và kiểm tra sớm với chuỗi Việt thực trước khi đóng băng UI.
Thêm locale tiếng Việt vào ứng dụng iOS như thế nào?
Mở project trong Xcode, vào project editor và thêm Vietnamese (vi) trong phần Localizations. Xcode sẽ tạo thư mục vi.lproj/ cho mỗi file tài nguyên (Storyboard, XIB, Info.plist, strings).
Từ Xcode 15, cách tiếp cận được khuyến nghị là String Catalog (.xcstrings) - một file JSON duy nhất thay thế các file Localizable.strings riêng lẻ theo locale. Toàn bộ locale hiển thị song song, tỷ lệ hoàn thành dịch thuật được theo dõi tự động, và Xcode đánh dấu các khóa chưa dịch trước khi tạo archive. Dùng Editor → Export for Localization (XLIFF) để xuất file giao cho dịch thuật viên, sau đó nhập kết quả qua Editor → Import Localizations.
Với số nhiều, dùng định dạng .stringsdict hoặc trình chỉnh sửa biến thể số nhiều trong String Catalog. Khai báo NSStringLocalizedFormatKey cùng các giá trị cho từng phạm trù CLDR mà ngôn ngữ yêu cầu.
Thêm tiếng Việt vào ứng dụng Android như thế nào?
Tạo thư mục res/values-vi/ và thêm file strings.xml vào đó. Qualifier ngôn ngữ là vi; để ghi đè theo vùng cụ thể dùng vi-rVN. Hệ thống resource của Android sẽ tự động tải values-vi/strings.xml khi locale thiết bị là tiếng Việt.
Luôn duy trì file res/values/strings.xml mặc định đầy đủ tất cả các khóa. Nếu một khóa thiếu trong file mặc định, Android sẽ ném lỗi runtime trên mọi locale không có khóa đó.
<!-- res/values/strings.xml (mặc định, tiếng Anh) -->
<string name="items_count">%d items</string>
<!-- res/values-vi/strings.xml (tiếng Việt) -->
<string name="items_count">%d mục</string>
Để bảo vệ văn bản không được dịch như tên người dùng, URL, specifier định dạng, bọc chúng trong thẻ placeholder XLIFF:
<string name="welcome_user">
Xin chào, <xliff:g id="name" example="Minh">%s</xliff:g>!
</string>
Quy tắc số nhiều tiếng Việt trong CLDR là gì?
Tiếng Việt có hai phạm trù số lượng theo CLDR: "one" (khi n=0 hoặc n=1) và "other" (n≥2). Khác với tiếng Anh, phạm trù "one" trong tiếng Việt bao gồm cả 0 và 1, phản ánh việc danh từ tiếng Việt không biến hình theo số lượng.
Danh từ tiếng Việt không thay đổi hình thức giữa số ít và số nhiều. "2 quyển sách" và "1 quyển sách" dùng cùng một danh từ "sách". Danh từ chỉ loại như "quyển" (sách), "cái" (đồ vật), "con" (động vật) cung cấp thêm thông tin nhưng không liên quan đến biến hình số lượng.
Trong thực tế, các entry .stringsdict trên iOS và <plurals> trên Android cho tiếng Việt thường có cả hai giá trị giống nhau:
<plurals name="photo_count">
<item quantity="one">%d ảnh</item>
<item quantity="other">%d ảnh</item>
</plurals>
Hai giá trị giống nhau vì "ảnh" không biến hình. Tuy nhiên cả hai khóa vẫn phải tồn tại, nếu không nền tảng sẽ dùng chuỗi từ locale sai.
Định dạng tiền tệ, ngày tháng và số trong tiếng Việt
Định dạng số theo locale vi-VN: dấu chấm là phân cách hàng nghìn, dấu phẩy là phân cách thập phân (ngược với tiếng Anh). Ký hiệu VND "₫" đặt sau số tiền, không có phần thập phân.
// JavaScript
new Intl.NumberFormat('vi-VN', { style: 'currency', currency: 'VND' })
.format(1500000)
// → "1.500.000 ₫"
new Intl.DateTimeFormat('vi-VN').format(new Date(2026, 10, 5))
// → "5/11/2026" (ngày/tháng/năm)
Ngày tháng theo thứ tự DD/MM/YYYY. Không hardcode chuỗi định dạng - luôn dùng Intl.DateTimeFormat (web hoặc React Native), DateFormat (Android), hoặc Date.formatted(date:locale:) (iOS) với locale vi-VN.
Ba miền tiếng Việt: ứng dụng có cần quan tâm đến phương ngữ không?
Tiếng Việt viết chuẩn (dựa trên phương ngữ miền Bắc) được hiểu trên toàn quốc, và hầu hết ứng dụng dùng một locale vi duy nhất không phân theo vùng. Ba phương ngữ (Hà Nội, Đà Nẵng, Hồ Chí Minh) khác nhau chủ yếu ở phát âm và một số từ thông dụng, không ảnh hưởng đến từ vựng giao diện viết.
Với nội dung marketing, mô tả store listing, hay hội thoại trong game nhắm đến người dùng miền Nam, một lượt review bởi người bản ngữ Hồ Chí Minh có thể phát hiện những từ ngữ mang màu sắc miền Bắc quá rõ. Điều này quan trọng hơn với giọng thương hiệu so với chuỗi UI chức năng.
Phần nào làm được nội bộ, khi nào cần chuyên gia tiếng Việt bản ngữ?
Nhóm kỹ thuật có thể tự xử lý toàn bộ phần scaffold kỹ thuật: thêm locale vi, cấu trúc khóa số nhiều, kết nối Intl.NumberFormat('vi-VN',...), và bảo vệ tham số. Đây là công việc cấu hình, không phải công việc ngôn ngữ.
Machine translation (DeepL, Google Translate) có thể tạo bản nháp cho chuỗi không quan trọng như thông báo lỗi, tooltip, metadata. Nhưng không phù hợp với:
- Nội dung onboarding và marketing - giọng văn và register quan trọng.
- Giao diện fintech hoặc y tế - sai từ Hán-Việt có thể thay đổi nghĩa hoàn toàn.
- Store listing - đội biên tập Google Play đánh dấu mô tả tiếng Việt nghe như được dịch tự động.
Chuyên gia tiếng Việt bản ngữ mang lại register Hán-Việt nhất quán (từ vựng tài chính và pháp lý phần lớn là Hán-Việt), nhận thức về phương ngữ cho thành phố mục tiêu, và khả năng kiểm tra danh từ chỉ loại nghe có tự nhiên không. Với ứng dụng khoảng 2.000 chuỗi, một lượt chỉnh sửa chuyên nghiệp trên các màn hình chính sẽ hoàn vốn qua tỷ lệ giữ chân người dùng Việt tốt hơn.
Nếu ứng dụng của bạn nhắm đến thị trường Việt Nam chuyên nghiệp, dịch vụ bản địa hóa website và ứng dụng tại đây bao gồm lượt review bởi chuyên gia tiếng Việt bản ngữ cho mọi dự án.
Câu hỏi thường gặp
Tiếng Việt có dùng văn bản phải sang trái không?
Không. Tiếng Việt dùng chữ Quốc ngữ Latin theo hướng trái sang phải. Không cần hỗ trợ layout RTL cho locale tiếng Việt.
Nên dùng BCP-47 "vi" hay "vi-VN"?
Dùng vi cho hầu hết trường hợp (thuộc tính lang trong HTML, locale Xcode, qualifier resource Android). Dùng vi-VN khi cần ghi đè theo vùng cụ thể, ví dụ phân biệt định dạng VND so với tiếng Việt của cộng đồng hải ngoại.
Tại sao chuỗi tiếng Việt gây crash ứng dụng Android?
Nguyên nhân phổ biến nhất là thiếu chuỗi trong file res/values/strings.xml mặc định. Android ném lỗi runtime nếu bất kỳ file locale nào tham chiếu đến khóa không có trong file mặc định. Kiểm tra rằng mọi khóa trong res/values-vi/strings.xml cũng tồn tại trong res/values/strings.xml.
Có cần store listing tiếng Việt riêng trên App Store và Play Store không?
Có. Cả App Store và Google Play đều cho phép và khuyến khích store listing bản địa hóa bằng tiếng Việt. Cung cấp tên ứng dụng, subtitle (iOS) hoặc mô tả ngắn (Android), và mô tả đầy đủ bằng vi. Store listing được bản địa hóa cải thiện tỷ lệ chuyển đổi trong kết quả tìm kiếm tiếng Việt.
Chuỗi tiếng Việt dài hơn tiếng Anh bao nhiêu?
Chuỗi tiếng Việt với dấu thanh thường rộng hơn 15-25% so với bản tiếng Anh. Dùng container linh hoạt thay vì label kích thước cố định, và kiểm tra với chuỗi Việt thực trước khi đóng băng UI.
Nguồn
- Android Developer: Bản địa hóa ứng dụng - cấu trúc strings.xml, qualifier locale, placeholder xliff:g. Đã xác minh tháng 11/2026.
- Unicode CLDR: Đặc tả quy tắc số nhiều - phạm trù số lượng tiếng Việt "one" và "other". Đã xác minh tháng 11/2026.
- Google Play: Dịch và bản địa hóa ứng dụng - hỗ trợ ngôn ngữ tiếng Việt. Đã xác minh tháng 11/2026.
- W3C Quốc tế hóa: Thẻ ngôn ngữ - hướng dẫn BCP-47 cho tiếng Việt. Đã xác minh tháng 11/2026.

Bài viết bởi Đào Huy (Lucas), biên dịch viên và chuyên viên bản địa hóa tiếng Việt (Anh, Trung, Pháp sang Việt). See translation services →
