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

SwiftUI中含条件表达式的字符串本地化处理方案咨询

SwiftUI动态拼接文本的本地化解决方案

你的问题在于直接拼接字符串字面量生成的是普通String,而非SwiftUI本地化系统能识别的LocalizedStringKey,因此无法自动导入Strings目录。以下是几种最佳处理方式:

方法一:使用LocalizedStringKey条件判断(推荐)

直接针对不同状态定义完整的本地化文本,让Xcode自动抓取本地化键:

Text(level.isEnded ?
    LocalizedStringKey("Level \(level.id) ended") :
    LocalizedStringKey("Level \(level.id)")
)

Xcode会自动在Localizable.strings中生成对应的键,你只需补充各语言的翻译:

// 中文本地化示例
"Level %lld" = "第%lld关";
"Level %lld ended" = "第%lld关 已结束";

这种方式能保证翻译的自然性(部分语言中状态描述的语序可能和英文不同),且无需手动维护键名。

方法二:拆分基础文本与状态后缀

如果希望复用基础文本,可将状态后缀单独作为本地化键:

let baseText = LocalizedStringKey("Level \(level.id)")
let endedSuffix = LocalizedStringKey(" ended")
Text(level.isEnded ? baseText + endedSuffix : baseText)

对应的本地化条目:

// 中文本地化示例
"Level %lld" = "第%lld关";
" ended" = " 已结束";

方法三:使用NSLocalizedString格式化(灵活适配复杂场景)

对于更复杂的动态文本,可借助NSLocalizedString和字符串格式化:

let baseFormat = NSLocalizedString("Level %d", comment: "基础关卡标题,%d为关卡ID")
let endedFormat = NSLocalizedString("Level %d ended", comment: "已完成的关卡标题,%d为关卡ID")
let localizedText = level.isEnded ?
    String.localizedStringWithFormat(endedFormat, level.id) :
    String.localizedStringWithFormat(baseFormat, level.id)
Text(localizedText)

这种方式需手动在Localizable.strings中添加键和注释,注释能帮助翻译人员理解文本上下文。

核心注意点

  • 避免直接拼接普通String,必须使用LocalizedStringKey或NSLocalizedString让本地化系统识别文本。
  • 尽量为完整句子创建本地化键,而非拆分零散的词汇,确保翻译符合目标语言的表达习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:57:29