You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI如何用NSLocalizedString实现带动态值Text的本地化

SwiftUI 带动态值的Text视图本地化正确实现

你之前的写法核心问题是把动态值拼进了本地化key里,导致每次动态值变化key都会变,永远匹配不到预设的本地化字符串,另外占位符和值类型不匹配也是失效的常见原因,按下面两种方式写都可以正常生效:


方案1:SwiftUI 原生写法(推荐,iOS13+全支持)

Text的字符串初始化方法默认就会做本地化处理,不需要手动包NSLocalizedString,直接写带插值的文本,在本地化文件里对应位置写对占位符即可:

// ContentView.swift
Text("\(tomatoes.count) Tomatoes")

// iOS15+ 可以加inflect标记自动适配单复数,不用手动判断count值
Text("^[\(tomatoes.count) Tomatoes](inflect: true)")

对应Localizable.strings里的写法,注意key和Text里的静态内容完全对应,Int类型的count用%lld作为占位符:

// Localizable.strings (英文)
"%lld Tomatoes" = "%lld Tomatoes";

// Localizable.strings (中文)
"%lld Tomatoes" = "%lld 个番茄";

方案2:自定义key + 字符串格式化(适合需要统一管理自定义key的场景)

如果不想把展示文本直接作为本地化key,就不要把动态值拼进NSLocalizedString的key参数里,先取固定key对应的模板字符串,再把动态值通过格式化方法填充进去:

// ContentView.swift
// 先取固定key对应的本地化模板
let tomatoTemplate = NSLocalizedString("text-tomatoes-count", comment: "")
// 再把动态值填入模板,Int类型对应%lld占位符
Text(String(format: tomatoTemplate, tomatoes.count))

对应Localizable.strings配置:

// Localizable.strings (英文)
"text-tomatoes-count" = "%lld Tomatoes";

// Localizable.strings (中文)
"text-tomatoes-count" = "%lld 个番茄";

之前写法的常见错误点

  • 不要把动态变量拼进NSLocalizedString的key参数:比如NSLocalizedString("\(tomatoes.count) text-tomatoes", comment: "")这种写法,count为3时key是3 text-tomatoes,count为5时key是5 text-tomatoes,永远匹配不到你写的固定key。
  • 占位符要和传入值类型匹配:Int、NSInteger这类整数类型用%lld,NSString/String类型用%@,类型不匹配会导致显示异常甚至崩溃。
  • 需要适配多语言单复数规则的场景,不要自己写if判断分支,用系统自带的.stringsdict文件配置复数规则即可,能覆盖所有语言的零数、单数、复数、少数复数等特殊语法规则。

内容的提问来源于stack exchange,提问作者Alexnnd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:31:36