关于我:大厂摸鱼 + 业余独立开发,之后会输出深度技术文章 + 独立开发技巧
我的往期技术文章合集:RickeyBoy - Gitbub
我的独立开发 App:iColors - 设计灵感 配色助手
上一篇:
独立开发之 App 国际化全步骤(三):Core Data 模型升级
独立开发之 App 国际化全步骤(四):Core Data 模型解析
独立开发之 App 国际化全步骤(五):提取 App 中文本文案
🔦 App 内语言细节适配
我们做完了前文所说的一切,目前整个 App 应该绝大部分内容都已经适配多语言了。大的框架已经完成,剩余的是一些细节优化与调整,有部分特殊的场景需要额外的进行适配。
系统权限文案的适配
除了 App 本身内容支持多语言之外,类似于这样的权限内容也需要支持多语言。那我们怎么去设置呢?其实原理和 Localizable.strings 的原理是一致的,只不过此时我们需要一个新的文件,叫做 InfoPlist.strings,用来专门为 InfoPlist 中的内容做多语言的适配。
支持简体中文和英文的,完整 Localizable 文件应该如上图所示。接下来我们只需要使用 InfoPlist 中的 key 作为key,Xcode 会自动为我们匹配对应的翻译文案,实现上图所示多语言效果。比如,我们要使用保存图片的权限,这个权限在 InfoPlist 中对应的 key 是 NSPhotoLibraryAddUsageDescription:
那么我们进行如下的配置,就大功告成了!
swift
// InfoPlist (Chinese, Simplified)
"NSPhotoLibraryAddUsageDescription" = "我们需要此权限用于保存您喜欢的内容";
// InfoPlist (English)
"NSPhotoLibraryAddUsageDescription" = "Allow photo library access to save your favorite color palettes";
小组件文案适配
除了主 App 本身的文案,还有一部分是小组件中使用的文案。适配这部分的文案非常简单,不需要做额外的处理,把翻译文案同样放到 Localizable.strings 中即可。
不过这里涉及到一个新的问题,就是如何将主 App 中的语言选择,同步到 Widget 小组件中?我选用的是通过 AppGroupUserDefaults 的方案。相信之前实现了小组件功能的情况下,大概率已经实现通过 AppGroup 进行数据互通了,这里我就不再赘述具体的实现方法。
需要注意的是,我们如果在 App 中选择了新语言,更改了语言环境之后需要通知小组件进行刷新:
swift
WidgetCenter.shared.reloadTimelines(ofKind: "CodeModulesWidget")
自动换算时间信息
当我使用脚本检查未翻译的内容时,发现漏网之鱼:在 iColors App 中,有部分场景使用到了时间信息,包括月份和星期,如下图所示。
这部分内容如果要按照之前的方法,在 Localizable.strings 中实现对应的翻译也是不难的,不过稍显繁琐。那么有没有更好的办法呢?
其实 Locale 本身内置了根据多语言,返回对应日期的方法,我们这里以月份为例,用这样的方式可以获取到当前月份的正确表达。
swift
func currentMonth(for locale: Locale) -> String {
let calendar = Calendar.current
let month = calendar.component(.month, from: self)
let dateFormatter = DateFormatter()
dateFormatter.locale = locale
if let monthSymbols = dateFormatter.standaloneMonthSymbols {
let monthSymbol = monthSymbols[month - 1]
return monthSymbol
} else {
return ""
}
}
🥳 结语
到这里,本篇终于完结了。一方面完成如此大工程的一个项目,我也想尽量将我的成果记录下来;另一方面,也希望这些内容能对读者有所帮助。
感谢大家的阅读,如果有任何问题,可以给我留言,我会尽量解答。