Swift动态生成字符串本地化失效问题求助
问题分析
你当前代码无法触发本地化的核心原因是:直接将动态拼接的字符串字面量或硬编码字符串赋值给LocalizedStringResource,系统无法将这些动态生成的字符串匹配到字符串目录中预定义的本地化key。LocalizedStringResource需要明确关联字符串目录里的key,而非直接使用目标语言的原文作为内容。
解决方案
1. 确认字符串目录的key定义
确保你的Localizable.strings(英文)和es.lproj/Localizable.strings(西班牙语)中,正确定义带占位符的key:
- 英文:
"date_display_weekday_week_season" = "%@, Week %d of %@"; "date_display_feria" = "Feria"; // 可根据需求替换为英文对应翻译,比如"Fair" - 西班牙语:
"date_display_weekday_week_season" = "%@, Semana %d de %@"; "date_display_feria" = "Feria";
2. 修改函数代码,正确使用LocalizedStringResource
替换直接赋值字符串字面量的逻辑,通过key关联本地化资源,并传入动态参数:
func displayDateText(date: Date, weekNumber: Int, season: String, keyDates: [KeyDates.KeyDate: Date]) -> String { var dateToDisplay: LocalizedStringResource // 用DateFormatter获取本地化星期字符串,替代自定义方法 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEEE" // 可根据需求调整为"EEE"(缩写星期) dateFormatter.locale = Locale.current let weekday = dateFormatter.string(from: date) if dateUtils.checkIfDateIsSunday(date: date) { if season.contains("season") { if weekNumber > 0 { // 通过key关联本地化字符串,传入占位符参数 dateToDisplay = LocalizedStringResource( "date_display_weekday_week_season", defaultValue: "\(weekday), Week \(weekNumber) of \(season)", arguments: weekday, weekNumber, season ) } else { // 补充weekNumber为0时的默认处理 dateToDisplay = LocalizedStringResource(unicodeScalarLiteral: "") } } else { // 通过key获取"Feria"的本地化内容 dateToDisplay = LocalizedStringResource("date_display_feria") } } else { // 补充非周日的默认显示逻辑 dateToDisplay = LocalizedStringResource(unicodeScalarLiteral: weekday) } return String(localized: dateToDisplay) }
3. 关键注意事项
- 禁止直接拼接字符串作为
LocalizedStringResource的内容,必须通过预定义key关联字符串目录中的条目。 - 确保
weekday的获取是本地化的,依赖DateFormatter并设置locale = Locale.current,避免使用非本地化的自定义方法。 - 如果
season参数本身需要本地化,需确保它是从字符串目录中获取的本地化值,而非硬编码的英文。
内容的提问来源于stack exchange,提问作者kiwidiwi
相关产品推荐
相关产品推荐

