通过 Upwork 认识我? 如果您是通过 Upwork 找到我并希望合作,请通过 Upwork 联系我。Upwork 客户在 Upwork 之外发送的消息将不会得到回复。
本地化笔记🌏 本地化

Flutter 应用越南语本地化:ARB 文件、复数与 VND 格式

为 Flutter 应用添加越南语:gen-l10n 配置、ARB 文件编写、CLDR 复数规则及 VND 整数货币格式,助力进入越南市场。

Dao Huy (Lucas)7分钟8 节
Flutter 应用越南语本地化:ARB 文件、复数与 VND 格式

💡 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(...))。这会强制该子树使用越南语而不更改设备系统语言。发布前记得移除该包裹层。

什么情况下应諻用人工译者而非机器翻译?

当应用程序涉及金融、医疗数据、法律条款或敏感用户信息时,请使用人工翻译。对于一般消费类应用,机翻初稿加越南语母语审校是性价比较高的方案。

参考来源

Dao Huy (Lucas)
Dao Huy (Lucas)
岘港大学外国语大学毕业。每份认证翻译均附签名的准确性声明(USCIS、IRCC)。

作者:Đào Huy(Lucas),越南语译员与本地化专家(英、中、法译越)。 See translation services →

报价WhatsApp