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
相关产品推荐
相关产品推荐

