Next.js应用越南语本地化:路由与ICU消息配置
💡 将Next.js或React应用本地化为越南语,需要在
app/[lang]/下组织路由,添加用于Accept-Language检测的代理中间件,按locale加载JSON消息文件,并使用vi-VN配置IntlAPI。关键点:越南语在ICU MessageFormat中只有一个复数类别,所有复数消息均可简化为单一other分支。
要点
- 使用
app/[lang]/配合generateStaticParams返回支持的locale(包括vi),实现完全静态的越南语路由。 - next-intl的
defineRouting和createMiddleware开箱即用,处理locale检测、重定向和locale感知导航。 - 越南语(CLDR locale
vi)只有一个复数类别:other。ICU复数块仍然有效,但越南语字符串不需要单独的"one"形式。 - 使用JavaScript
IntlAPI配合localevi-VN:日期格式为DD/MM/YYYY,千位分隔符为句点,VND货币在数字后添加₫且无小数位。 - 预留布局测试时间:越南语字符串通常比英语长10-20%。上线前测试按钮标签、标签页名称和移动端导航。
将Next.js应用本地化为越南语需要做什么?
Next.js应用本地化涵盖三个独立层面:路由层(哪个URL服务哪种语言)、消息加载层(显示哪些字符串)和locale格式化层(日期、数字和货币如何渲染)。在越南语版本投入生产之前,三个层面都必须正确配置。
路由层由Next.js负责。消息层由next-intl、next-i18next或Lingui等库处理。格式化层使用JavaScript Intl API或其高级封装。每个层面都有针对越南语的清晰配置路径,三者相互独立,可以逐步采用。
越南语应用应选择哪个i18n库?
三个库主导Next.js i18n生态系统。正确的选择取决于团队的技术约束和需要控制的i18n范围。
- next-intl:目前社区对App Router的推荐选择。提供
defineRouting、createMiddleware、createNavigation、ICU MessageFormat支持和类型化翻译键。同时支持服务端和客户端组件。推荐用于新的App Router项目。 - next-i18next:在Pages Router时代广泛使用。通过兼容层仍可与App Router配合,但配置更复杂。如果团队已熟悉react-i18next,可考虑此选项。
- Next.js内置字典模式:官方Next.js文档展示了使用
getDictionary()的最简方案,无需第三方库。适合字符串简单的小型应用,但不提供ICU消息格式化或复数处理。
对于越南语,next-intl的ICU支持尤为重要,因为它在运行时按locale处理复数感知,无需额外配置即可正确处理越南语的单一复数类别。
越南语没有复数形式时,ICU消息如何工作?
英语有两个CLDR复数类别:one(单数)和other(其他所有数字)。越南语只有一个:other。越南语中所有数字都映射到other,因为越南语使用量词和语境而非形态变化来表示复数。
实际上,这意味着越南语永远不需要单独的单数消息字符串。一个英语复数消息,例如:
{count, plural, one {# result} other {# results}}
在越南语消息文件中变为:
{count, plural, other {# kết quả}}
越南语说"1 kết quả"(1个结果)、"2 kết quả"(2个结果),使用相同的形式,依靠数字本身表达数量。当需要特定的零状态消息或边界情况时,=0和=1精确匹配选择器仍然可用。
日期和时间格式化在next-intl中使用ICU骨架或预定义样式。对于越南语,传递locale: 'vi'或locale: 'vi-VN'。DateTimeFormat API在越南语locale下为短日期返回DD/MM/YYYY格式。
越南语的日期、数字和货币:如何配置Intl
使用locale vi-VN的JavaScript Intl API无需自定义代码即可正确处理越南语格式。以下是应用中需要配置的模式:
- 日期:
new Intl.DateTimeFormat('vi-VN').format(date)返回DD/MM/YYYY格式。使用{ dateStyle: 'short' }获取仅日期输出。 - 数字:
new Intl.NumberFormat('vi-VN').format(1500000)返回1.500.000。句点为千位分隔符,逗号为小数分隔符。 - 货币(VND):
new Intl.NumberFormat('vi-VN', { style: 'currency', currency: 'VND' }).format(250000)返回250.000 ₫。VND没有小数位。 - 排序:越南语字母顺序与ASCII不同。使用
new Intl.Collator('vi').compare对下拉列表或搜索结果按正确的越南语字母顺序排序。越南语字母表有29个基本字母。
在next-intl中,通过框架的格式化辅助函数传递locale字符串,它们在内部调用正确的Intl构造函数。vi locale所依赖的CLDR数据由Unicode联盟的CLDR项目维护,随每次CLDR发布更新。
越南语字符串更长:布局与字体渲染清单
越南语字符串在自然文本中通常比英语长10-20%。界面标签、导航项和按钮文本最容易溢出。在发布越南语版本之前,请检查以下清单:
- 在移动端宽度(375px和390px视口)测试所有按钮标签和CTA文本。
- 检查导航标签和面包屑:越南语复合名词通常比英语短动词更长。
- 验证字体支持:越南语使用组合变音符(六个声调符号加基本字母上的钩形和短弧修饰)。正确渲染UTF-8的系统字体可以处理此问题,但仅为拉丁字符构建的Web字体子集可能遗漏越南语字形。用ộ、ề、ầ、ẫ、ắ等字符测试。
- 在根
<html>元素上设置lang="vi"。现代浏览器中的断行和连字规则与语言相关。 - 使用
overflow-wrap: break-word作为安全措施:越南语文本在音节词之间的空格处断行,较长的技术术语可能在窄容器中溢出。
自行处理还是聘请专家:越南市场产品的实际分界线
工程工作、路由配置和ICU消息连接完全可以在内部完成。任何开发人员用一天时间即可配置带vi locale的next-intl并连接JSON消息文件。机器翻译加抽查适用于大量结构化UI字符串:表单标签、错误消息和帮助文档。
越南本地专家真正节省成本的地方:营销文案、产品UI语气和领域专业术语。越南语有正式和非正式语域区别,影响产品对用户的专业感。汉越词(源自古汉语的借词)在金融、医疗和法律领域传达专业信号。通用机器翻译引擎默认使用纯越南语对应词,专家认为这不够精确。
进入越南市场的SaaS产品的实际分工:对帮助内容的长尾使用机器翻译,对用户每次会话都会看到的50-100个字符串聘请人工专家。对于采购团队会评估越南语版本的B2B产品,上线前让越南本地人审查完整界面。
如需专业的英越网站和SaaS界面翻译,本站的越南语网站本地化服务同时提供翻译和技术审校,支持英文、法文和中文源语言。
常见问题
可以使用Next.js Pages Router的i18n功能支持越南语吗?
可以。Pages Router在next.config.js中有内置的i18n键,包含locales和defaultLocale。设置locales: ['en', 'vi', 'zh', 'fr']和defaultLocale: 'en',Next.js自动为路由添加locale前缀。App Router等效方案使用手动app/[lang]/目录和代理中间件,对静态导出行为有更多控制权。
越南语需要特殊的Unicode规范化处理吗?
越南语变音符有两种编码方式:预合成形式(NFC,每个带重音字符一个码点)和分解形式(NFD,基本字符加组合标记)。两者在浏览器中显示相同,但字符串相等检查会失败。在消息文件和任何字符串比较中规范化为NFC。在JavaScript中:str.normalize('NFC')。这可以防止两个视觉上相同的越南语字符串不匹配的隐性比较错误。
应该使用'vi'还是'vi-VN'作为locale代码?
使用vi作为主要语言标签。根据W3C BCP 47指南,除非需要区分地区变体,否则保持标签尽可能简短。对大多数产品,vi涵盖所有越南语用户。只有在第三方库需要完整locale代码进行数据查找时,才使用vi-VN。
越南语如何影响Next.js应用中的hreflang设置?
越南语页面的hreflang值为vi。在next-intl中,Link和redirect等导航辅助函数会自动在URL中添加locale前缀。要输出hreflang标签,在generateMetadata()或根布局的head中添加。每个页面应包含自引用alternate和所有其他语言版本的alternate。完整的双向链接要求请参阅Google Search Central。
越南语是从右到左书写的吗?
越南语使用拉丁字母,严格从左到右书写。不需要dir="rtl"或双向CSS。唯一的布局问题是窄容器中的换行,因为越南语文本由空格分隔的音节词组成。使用overflow-wrap: break-word处理边界情况。越南语文本不涉及双向算法。
参考来源
- Next.js文档:国际化 - App Router路由模式、代理中间件配置、locale的generateStaticParams和字典加载。已于2026年9月验证。
- next-intl:App Router i18n路由 - defineRouting、createMiddleware、createNavigation配置和代码示例。已于2026年9月验证。
- Unicode CLDR:语言复数规则 - 越南语的CLDR复数类别(单一"other"类别)。已于2026年9月验证。
- W3C国际化:选择语言标签 - 越南语vi与vi-VN的BCP 47指南。已于2026年9月验证。
Written by Dao Huy (Lucas), Vietnamese translator & localization specialist (EN · ZH · FR → Vietnamese). See translation services →
