💡 Flutter 添加越南语支持只需两小时:在 pubspec.yaml 中添加 flutter_localizations 和 intl: any,创建 lib/l10n/app_vi.arb,声明 Locale('vi'),运行 flutter gen-l10n。越南语名词无数量变态,大多数字符串只需一个 other{...} 分支。VND 币符设置 decimalDigits: 0,日期格式为 dd/MM/yyyy。
要点
- 在 pubspec.yaml 中添加 flutter_localizations 和 intl: any;开启 generate: true 并创建 l10n.yaml。
- 创建 lib/l10n/app_vi.arb,使用与英语模板相同的 ICU 消息键,仅更改字符串内容。
- 越南语有两个 CLDR 复数类别(one 表示 n=0 或 n=1,other 表示 n≥2),但名词不变形:=0{...} 加 other{...} 通常足够。
- VND 货币:使用 NumberFormat.currency(locale: 'vi_VN', symbol: '₫', decimalDigits: 0),无小数位,点号为千位分隔符。
- 日期格式为日-月-年:DateFormat('dd/MM/yyyy', 'vi_VN')。提交应用商店前在设备上测试越南语界面。
如何将越南语接入 Flutter 的 gen-l10n 流程?
Flutter 官方 i18n 解决方案使用 ARB(应用程序资源包)文件,由 gen-l10n 工具处理。配置分三个步骤:更新依赖、创建配置文件、在 MaterialApp 中声明语言区域。
在 pubspec.yaml 中添加 Flutter SDK 的 flutter_localizations 和 intl: any,并在 flutter: 键下设置 generate: true。然后在项目根目录创建 l10n.yaml:
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
在 MaterialApp 中,将 AppLocalizations.delegate 和 ...GlobalMaterialLocalizations.delegates 添加到 localizationsDelegates,并在 supportedLocales 中加入 Locale('vi')。运行 flutter gen-l10n 生成类型化的 Dart 类。
app_vi.arb 文件长什么样?
ARB 文件是 JSON 格式,每个键对应一个 ICU 消息字符串。越南语版本的键与英语模板完全相同,只有值不同。以下是最简示例:
{
"appTitle": "Ứng dụng của tôi",
"greeting": "Xin chào, {name}!",
"@greeting": {
"placeholders": {
"name": { "type": "String" }
}
},
"itemCount": "{count, plural, =0{Không có mục nào} other{{count} mục}}"
}
来自英语模板的 @key 元数据在翻译 ARB 中是可选的。只有在需要定义新占位符或添加语言区域特定注释时才需要包含 @key 对象。
ARB 文件以 UTF-8(无 BOM)存储。越南语附加符必须是真实 Unicode 码点,而非转义序列。如果 CI 流程在 Windows 上运行并触及这些文件,请检查编码。
越南语的复数规则如何运作?
Unicode CLDR 复数规则为越南语定义了两个类别:one(n=0 或 n=1 时)和 other(n≥2 时)。越南语名词不因数量变形,”1 cuốn sách”和”5 cuốn sách”中的”sách(书)”完全相同。这与中文类似,自然无复数变形。
实际上,大多数 UI 字符串只需一个 other{...} 分支加一个空载状态的 =0{...}:
"cartItems": "{count, plural, =0{Giỏ hàng trống} other{{count} sản phẩm}}"
不需要像英语那样单独写“1 item” vs “2 items”。这让越南语 ARB 维护量比英语少约三分之一。
越南语量词(cái、con、chiếc、cuốn、tờ)因名词类别而异。机器翻译经常用错量词,越南语母语者能立即发现这种错误。
越南语的数字、货币与日期格式
越南盾(₫,ISO 代码 VND)无辅助单位。所有价格均为整数。显示“1.250.000,00 ₫”是错误的,会让越南用户感到困惑。
越南语数字格式以点号(.)分隔千位,逗号(,)为小数点,与美式英语相反。使用 Dart 的 intl 包:
import 'package:intl/intl.dart';
final vndFormat = NumberFormat.currency(
locale: 'vi_VN',
symbol: '₫',
decimalDigits: 0,
);
print(vndFormat.format(1250000)); // "1.250.000 ₫"
越南语日期顺序为日-月-年。“10/11/2026”表示 2026 年 11 月 10 日,而非 10 月 11 日。使用 DateFormat('dd/MM/yyyy', 'vi_VN')。越南语商业场合使用 24 小时制:用 DateFormat('HH:mm', 'vi_VN') 而非 jm。
越南语字符串为何比英文更长?
越南语使用叠加附加符:”ộ”(o + 帽形符 + 下点)在大多数字体中渲染宽度远大于普通 ASCII 字母。越南语字符串通常比英语原文宽 20-30%。“Add to cart” (11 字符) 变成 “Thêm vào giỏ hàng” (18 字符 加附加符)。
界面布局应使用灵活约束。按钮、标签和底部导航栏使用 Expanded、FittedBox 或百分比宽度,而非硬编码像素值。添加 flutter_localizations 后, Material 组件的越南语内置字符串将自动生效。
DataReportal 2025 越南数字报告显示,越南拥有 1.27 亿移动网络连接,远超其 1.01 亿的总人口。正确的本地化界面在首次启动时就建立用户信任。
哪些工作可内部完成,何时需要越南语本地化专家?
技术 pipeline(ARB 文件、gen-l10n、数字和日期格式)完全属于开发者的能力范围,通常只需几小时配置。所得字符串将在语法和结构上正确。
非母语者翻译容易出现的问题:
- 语体不符:B2B 软件使用汉越词汇,消费类应用程序使用日常越南语。机器翻译常将两者混杂。
- 量词错误:越南语量词(cái、con、chiếc)因名词类别而异。机翻经常选错,母语者能立即察觉。
- UI 边界场景用语:错误提示、空载界面和确认对话框需要自然的越南语。语气生硒会在最关键时刻损伤用户信任。
经机翻初稿后,一次 越南语本地化专家审校 就能发现大部分问题。金融、医疗或法律类应用请在翻译前制定术语表,以保证所有界面的语言一致性。
常见问题
Flutter 是否自带 Material 组件的越南语翻译?
是的。将 GlobalMaterialLocalizations.delegate 和 GlobalCupertinoLocalizations.delegate 添加到 localizationsDelegates 后,日期选择器、返回按鈕和对话框按鈕等标准组件将显示越南语文本。应用程序自身的字符串仍需通过 ARB 文件提供。
英语和越南语字符串相同时,可以使用同一个 ARB 键吗?
可以。如果品牌名或技术术语在两种语言中完全相同,可以从 app_vi.arb 中省略该键, Flutter 会回退到模板语言的字符串。建议在英语 @key 描述中注明这是有意不翻译的。
Flutter 中越南语附加符最适合哪种字体?
Noto Sans 是最可靠的选择,覆盖越南语所有 134 种附加符组合。通过 google_fonts 包添加:GoogleFonts.notoSans()。如果打包自定义字体,请测试所有附加符组合:ắ ặ ể ị ộ ụ ướ ự。
如何在模拟器中测试越南语的 UI?
在开发期间,用 Localizations.override 包裹 MaterialApp:Localizations.override(context: context, locale: const Locale('vi'), child: MaterialApp(...))。这会强制该子树使用越南语而不更改设备系统语言。发布前记得移除该包裹层。
什么情况下应諻用人工译者而非机器翻译?
当应用程序涉及金融、医疗数据、法律条款或敏感用户信息时,请使用人工翻译。对于一般消费类应用,机翻初稿加越南语母语审校是性价比较高的方案。
参考来源
- Flutter 国际化官方文档 - gen-l10n 流程、ARB 格式、supportedLocales 配置。已于 2026 年 11 月核实。
- Unicode CLDR 复数规则 - 越南语复数类别(one/other)。已于 2026 年 11 月核实。
- DataReportal 越南 2025 数字报告 - 1.27 亿移动网络连接,7980 万互联网用户。已于 2026 年 11 月核实。
作者:Đào Huy(Lucas),越南语译员与本地化专家(英、中、法译越)。 See translation services →

