💡 To localize an iOS or Android app into Vietnamese: add
vias a locale (vi.lprojon iOS,res/values-vi/on Android), extract all strings with context comments and guard interpolated tokens with<xliff:g>, supply both CLDR plural keys ("one" and "other"), and format VND currency without decimal places viaIntl.NumberFormat('vi-VN', {style:'currency', currency:'VND'}). Vietnamese nouns do not inflect for number, so your plural strings differ in phrasing, not word form.
Key takeaways
- iOS: add
viin Xcode's Localizations list; Xcode 15+ String Catalogs (.xcstrings) centralize all locales in one file and show untranslated strings at a glance. - Android: create
res/values-vi/strings.xml; always keep a complete defaultres/values/strings.xml- a missing default string crashes the app on any unsupported locale. - Plurals: CLDR assigns Vietnamese two cardinal categories - "one" (n=0 or n=1) and "other" (n≥2). Provide both keys in
.stringsdictor<plurals>, even when the translations are identical in Vietnamese. - Placeholders: wrap every non-translatable token with
<xliff:g id="count" example="5">%d</xliff:g>so the translator knows what to leave untouched. - Layout: Vietnamese diacritic text runs 15-25% wider than English - build flexible containers and test with real Vietnamese strings before UI freeze.
How do you add Vietnamese to an iOS app?
Open your project in Xcode, go to the project editor, and add Vietnamese (vi) under Localizations. For every resource file (Storyboard, XIB, Info.plist, strings), Xcode generates a vi.lproj/ folder containing the Vietnamese resource.
From Xcode 15 onward, the recommended path is a String Catalog (.xcstrings). This single JSON-based file replaces the per-locale Localizable.strings approach. You see all locales side-by-side, translation completeness is tracked automatically, and Xcode flags untranslated keys before archive. Use Editor → Export for Localization (XLIFF) to hand the catalog off to a translator and import the result via Editor → Import Localizations.
For plurals, use the .stringsdict format or the plural variation editor inside a String Catalog. Provide the NSStringLocalizedFormatKey entry plus values for each CLDR plural category your language requires.
How do you add Vietnamese to an Android app?
Create the directory res/values-vi/ and add a strings.xml file there. The language qualifier is vi; for a region-specific override use vi-rVN. Android's resource selection loads values-vi/strings.xml automatically when the device locale is Vietnamese.
Always maintain a complete default res/values/strings.xml with every string key. If a key is missing from the default file, Android throws a runtime error on any locale that lacks that key - this includes devices set to languages you haven't provided, not just Vietnamese.
<!-- res/values/strings.xml (default, English) -->
<string name="items_count">%d items</string>
<!-- res/values-vi/strings.xml (Vietnamese) -->
<string name="items_count">%d mục</string>
To protect non-translatable text - usernames, URLs, format specifiers - wrap them with the XLIFF placeholder element so translators know not to modify them:
<string name="welcome_user">
Xin chào, <xliff:g id="name" example="Minh">%s</xliff:g>!
</string>
What are the Vietnamese plural rules in CLDR?
Vietnamese has two CLDR cardinal plural categories: "one" (applies when n=0 or n=1) and "other" (n≥2). Unlike English, the "one" category in Vietnamese covers both zero and one, reflecting that Vietnamese nouns carry no grammatical inflection for number.
Vietnamese nouns do not change form between singular and plural. "2 quyển sách" and "1 quyển sách" use the same noun "sách". Classifiers like "quyển" (books), "cái" (objects), or "con" (animals) add specificity but do not involve different word forms per count.
In practice, iOS .stringsdict and Android <plurals> entries for Vietnamese often look like:
<plurals name="photo_count">
<item quantity="one">%d ảnh</item>
<item quantity="other">%d ảnh</item>
</plurals>
Both values are identical because "ảnh" (photo) does not inflect. You still need both keys present, or the platform falls back to the wrong locale's string.
Currency, dates, and numbers in Vietnamese
Vietnamese number formatting in the vi-VN locale uses a period as the thousands separator and a comma as the decimal separator - the opposite of English. The VND currency symbol ₫ appears after the amount with no decimal places (Vietnam does not use fractional dong in everyday transactions).
Using JavaScript's Intl API or Kotlin's NumberFormat:
// 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" (day/month/year)
Dates follow DD/MM/YYYY order. Never hardcode format strings - use Intl.DateTimeFormat (web or React Native), DateFormat (Android), or Date.formatted(date:locale:) (iOS) with the vi-VN locale and let the platform format correctly.
North, Central, and South Vietnamese: does your app need regional variants?
Standard written Vietnamese (based on the Northern dialect) is understood nationwide, and apps on the App Store and Play Store use a single vi locale without regional variants. The three regional dialects (Hà Nội, Đà Nẵng, Hồ Chí Minh) differ mainly in pronunciation and some colloquialisms, not in written UI vocabulary.
For marketing copy, store listing descriptions, or in-game dialogue aimed at Southern Vietnamese users, a Southern-register review by a native speaker from Hồ Chí Minh may catch terms that feel stiff or Northern-centric. This matters more for brand voice than for functional UI strings.
What can you handle in-house, and when is a native Vietnamese specialist worth it?
Your engineering team can handle everything up to the technical scaffold: adding the vi locale, structuring plural keys, wiring up Intl.NumberFormat('vi-VN',...), and protecting placeholders. These are configuration tasks, not language tasks.
Machine translation (DeepL, Google Translate) can produce a first draft for high-volume low-stakes strings - error messages, tooltip text, metadata. It is not adequate for:
- Onboarding and marketing copy - tone and register matter.
- Fintech or medical UIs - mistranslated Sino-Vietnamese terms change meaning materially.
- Store listings - Google Play's editorial team flags AI-generated descriptions that read as unnatural Vietnamese.
A native Vietnamese specialist brings consistent Sino-Vietnamese register (financial and legal vocabulary is heavily Sino-Vietnamese), dialect awareness for your target city, and the ability to verify that classifier + noun pairings sound natural. For a typical 2,000-string app, a one-time professional pass on key screens pays back in lower churn from Vietnamese users who find the app feels local rather than "auto-translated".
For ongoing releases, a continuous localization platform (Crowdin, Smartcat, Lokalise) with a Vietnamese linguist reviewer keeps the vi locale current without ad-hoc translation batches.
If your app targets the Vietnamese market professionally, the website and app localization service here includes a native Vietnamese review pass as part of every project.
FAQ
Does Vietnamese use right-to-left text, and do I need RTL layout support?
No. Vietnamese uses a left-to-right Latin script (Quốc ngữ). You do not need RTL layout support for a Vietnamese locale. Standard LTR layouts work without modification.
What BCP-47 locale tag should I use: "vi" or "vi-VN"?
Use vi for most contexts (HTML lang attribute, Xcode locale, Android resource qualifier). Use vi-VN when you need region-specific overrides - for example, to distinguish Vietnam VND formatting from Vietnamese spoken in overseas communities. For App Store and Play Store listings, vi targets the Vietnam store.
Why are my Vietnamese strings crashing the app on Android?
The most common cause is a missing string in the default res/values/strings.xml. Android throws a runtime error if any locale file references a key not in the default file. Check that every key in res/values-vi/strings.xml also exists in res/values/strings.xml.
Do I need separate Vietnamese App Store and Play Store listings?
Yes. Both Apple App Store and Google Play allow and reward localized store listings in Vietnamese. Provide a localized app name, subtitle (iOS) or short description (Android), and full description in vi. The App Store uses vi-VN as the region code for Vietnam. Localized listings improve conversion in Vietnamese search results.
How much longer are Vietnamese strings compared to English?
Vietnamese text with tonal diacritics typically runs 15-25% wider than the English source. Use flexible text views rather than fixed-size labels, and test with actual Vietnamese strings before UI freeze - pseudolocalization tools often miss the diacritic expansion specific to Vietnamese.
Official sources cited
- Android Developer: Localize your app - strings.xml structure, locale qualifiers, xliff:g placeholders, default resource requirements. Verified November 2026.
- Unicode CLDR: Plural Rules specification - Vietnamese cardinal plural categories "one" (n=0 or n=1) and "other" (n≥2). Verified November 2026.
- Google Play: Translate and localize your app - Vietnamese language support on Play Store. Verified November 2026.
- W3C Internationalization: Language tags - BCP-47 lang attribute guidance for Vietnamese (vi, vi-VN). Verified November 2026.

Written by Dao Huy (Lucas), Vietnamese translator and localization specialist (English, Chinese and French into Vietnamese). See translation services →
