Last reviewed: 4 October 2026
Short answer
There is no single reliable expansion percentage that makes every Vietnamese translation fit a software interface. A label may become shorter, longer or unchanged, and its character count does not predict its exact rendered width. Measure approved strings by their role, then test the actual font, container, device and product state. Treat a small illustrative sample as a demonstration of the method, not a benchmark for an entire language or application.
Key takeaways
- Measure your own approved translations rather than borrowing a universal ratio.
- Separate grapheme counts, storage length and rendered dimensions.
- Group buttons, labels, messages and long content independently.
- Test substituted variable values as well as empty templates.
- Allow meaningful reflow before shortening essential information.
- Record the environment and repeat measurements when content or fonts change.

Why is one fixed percentage unreliable?
A single multiplier hides differences between string types and meanings. “Save” can become “Lưu”, while “Next” can become “Tiếp theo”; neither relationship tells you how an error paragraph will behave. Alternative translations can also have different lengths while remaining acceptable in their own contexts. Approve the meaning first, otherwise a compact mistranslation may look like a successful layout decision.
W3C's discussion of text size in translation recommends flexible layout and explains why short text and tightly constrained areas require attention [1]. Its examples are not a Vietnamese product benchmark. Do not take a historical table for another language group and label it as a tested Vietnamese expansion allowance.
The source wording matters. An English abbreviation may need an explanatory Vietnamese phrase. A source label that already spells out the action may become a shorter natural expression. Paragraphs can introduce a different problem: additional lines change card height and shift neighboring actions, even if each individual line fits horizontally.
What exactly should a team measure?
Use a metric that matches the question. Grapheme clusters approximate user-perceived text units and are addressed by Unicode segmentation guidance [2]. They are useful for comparing selected strings, but they do not measure font width or database bytes. Keep these distinctions visible in the report.
- Grapheme count: a text-length comparison, including or excluding spaces according to a declared rule.
- Rendered width and height: the dimensions in the actual component after font loading and layout.
- Line count and overflow: whether the message wraps, is clipped or overlaps another control.
- Storage size: bytes or the database's defined length unit, checked separately.
- Task consequence: whether truncation removes a condition, action or important distinction.
Record a source count and target count for each pair. Define the ratio as target divided by source, and the change as target minus source. A ratio above one means this metric increased; it does not prove the UI needs the same increase in pixels. Handle an empty source explicitly rather than dividing by zero.
What do the illustrative string measurements show?
The following original sample contains twelve approved-for-this-example translation pairs. It was measured with Node.js v24.18.0, ICU 78.3 and Unicode data version 17.0 on 4 October 2026. The metric is NFC-normalized grapheme clusters, including spaces and punctuation. Ratios are rounded to two decimals. No browser widths or production defect rates were measured.
| English sample | Vietnamese sample | EN count | VI count | VI minus EN | VI / EN |
|---|---|---|---|---|---|
| Save | Lưu | 4 | 3 | -1 | 0.75 |
| Cancel | Hủy | 6 | 3 | -3 | 0.50 |
| Account | Tài khoản | 7 | 9 | 2 | 1.29 |
| Retry | Thử lại | 5 | 7 | 2 | 1.40 |
| Download | Tải xuống | 8 | 9 | 1 | 1.13 |
| Next | Tiếp theo | 4 | 9 | 5 | 2.25 |
| Settings | Cài đặt | 8 | 7 | -1 | 0.88 |
| Save changes | Lưu thay đổi | 12 | 12 | 0 | 1.00 |
| Create project | Tạo dự án | 14 | 9 | -5 | 0.64 |
| Password | Mật khẩu | 8 | 8 | 0 | 1.00 |
| Sign out | Đăng xuất | 8 | 9 | 1 | 1.13 |
| Your session has expired. Sign in to continue. | Phiên đăng nhập đã hết hạn. Đăng nhập lại để tiếp tục. | 46 | 54 | 8 | 1.17 |
These rows deliberately show increases, decreases and unchanged counts. Their selection is illustrative rather than representative. Do not average them into a language-wide budget. “Next” also demonstrates why a small source denominator can make a ratio look large while the absolute difference remains five grapheme clusters.
How can the measurements be reproduced?
Use the same string pairs, normalization and segmentation rule, and record the runtime. The sample below uses the standard Intl.Segmenter interface described by ECMA-402 [3]. It was executed in the environment stated above and produced the counts used in the table. Run it against your exported strings after reviewing the translations.
const segmenter = new Intl.Segmenter('vi', {
granularity: 'grapheme'
});
const count = text =>
[...segmenter.segment(text.normalize('NFC'))].length;
function compare(source, target) {
const sourceCount = count(source);
const targetCount = count(target);
return {
sourceCount,
targetCount,
change: targetCount - sourceCount,
ratio: sourceCount === 0 ? null :
Number((targetCount / sourceCount).toFixed(2))
};
}
console.log(compare('Next', 'Tiếp theo'));
// sourceCount: 4; targetCount: 9; change: 5; ratio: 2.25
Do not substitute JavaScript's ordinary string length and call the result a grapheme count. Keep the count definition the same across exports. A normalization policy also needs to coexist with your application's storage requirements; this illustrative measurement does not authorize destructive changes to customer data.
Next, attach a component identifier to each row. Group results by buttons, navigation, labels, tooltips, validation messages and longer content. Review both absolute change and ratio, then identify the actual constrained components. A large ratio in a roomy paragraph may be less urgent than a small increase in a tightly fixed table heading.
How should variable values be included?
Measure complete rendered messages with representative values, not only the braces in a template. A filename, organization name, quantity or date can change both line breaks and message height. Define cases such as an empty value, a short normal value, a long supported value and a boundary value. Use non-sensitive test data.
Keep placeholder identifiers unchanged when translating. Treat the surrounding sentence as a complete message where the string system allows it, rather than stitching independently translated fragments together. Verify whether variables can move to a natural Vietnamese position. A report on the template alone should clearly state that real variable values were not yet included.
Which layout changes are worth testing first?
Start with flexible components and the actual translated content. Review minimum and maximum width, wrapping, spacing, alignment and neighboring controls. Allow buttons or cards to grow where the design supports it. Check whether a longer label creates a taller row that obscures another action, not merely whether the text stays inside its own border.
Avoid making the font smaller as the automatic response to overflow. The issue may be a rigid container or unnecessary source verbosity. Shortening the translation can be appropriate after linguistic review, but it should preserve the action and required conditions. A shorter alternative is not an improvement if it makes cancellation look like deletion or loses the currency code.
| Test case | What to inspect | Acceptance evidence |
|---|---|---|
| Narrow supported viewport | Buttons and labels with the actual font | No clipped action meaning |
| Font still loading or unavailable | Fallback layout and later font replacement | No hidden control after reflow |
| Long supported filename | Upload and confirmation message | Filename handling remains understandable |
| Increased text size | Form hints, errors and neighboring actions | Essential instructions remain usable |
| Several simultaneous errors | Error summary and individual fields | All correction steps stay available |
| Dense table headers | Wrapping, column widths and navigation | Headings retain their distinctions |
| Empty and full data states | Card height and content alignment | Actions stay attached to the right item |
This is a proposed acceptance matrix, not a statement that any particular product has passed it. Decide the supported environments and pass conditions with your design and engineering teams before testing.

How should findings become release decisions?
Record the string key, approved translation, component, environment, screenshot and defect. Separate a language issue from a font, container or variable-handling issue. Assign an owner and note whether the correction changes other screens. Recheck the affected state after the fix, including related notifications or exported content.
A useful report presents results by component and severity, not only one average number. Note which strings were measured, which were tested in context and which remain untested. If you summarize a larger dataset, state the corpus, grouping and calculation so someone else can reproduce it. Update the report when translations, fonts or supported breakpoints change.
LocalizeZone recommendation
For software localization, provide a string export, component constraints and screenshots of key flows. LocalizeZone recommends approving terminology before measuring length and then reviewing constrained components with engineering. Ask for a scope that separates translation, linguistic layout review and implementation fixes. This gives the team a concrete list of risks rather than an unsupported universal expansion allowance.
FAQ
Does Vietnamese always expand from English?
No. The sample includes shorter and equal counts. The final wording and context determine the result.
Can a grapheme ratio predict button width?
No. Rendered width depends on the font, shaping, size and component. Test the actual button.
Should the twelve sample rows determine our design budget?
No. They demonstrate a method and are not representative of your application or Vietnamese as a whole.
Is ordinary JavaScript string length sufficient?
Only for the metric it actually represents. It is not the grapheme count used in this article.
Should translators shorten every overflowing string?
Review meaning and layout together. Some overflows require a component fix rather than a shorter translation.
When should measurements be repeated?
Repeat when approved copy, variables, fonts, component constraints or supported environments change.
Sources and methodology
Primary documents were checked on 4 October 2026. Twelve original pairs were measured locally with the specified runtime; the complete values and counting rule are stated above. Layout recommendations and the acceptance matrix are proposed review procedures. No browser-width results, representative Vietnamese benchmark, customer study or measured business improvement are claimed.
References
[1] W3C Internationalization. Text size in translation.
[2] Unicode Consortium. Unicode Standard Annex #29: Unicode Text Segmentation.
[3] Ecma International / TC39. ECMA-402: Segmenter Objects.
Related guides
- Vietnamese UX Writing Guide for Buttons, Forms and Error Messages
- Vietnamese Typography, Unicode and Punctuation for Digital Products
- Vietnam Website Localization Checklist: 50 Pre-Launch Checks
- Vietnamese Localization Style Guide for Software and SaaS
- Vietnamese Date, Time, Number and Currency Formatting Guide
- Vietnamese Address Format: A Guide for Forms, Ecommerce and Databases
