独立开发之 App 国际化全步骤(八):App 内语言细节适配

关于我:大厂摸鱼 + 业余独立开发,之后会输出深度技术文章 + 独立开发技巧

我的往期技术文章合集:RickeyBoy - Gitbub

我的独立开发 App:iColors - 设计灵感 配色助手

上一篇:

独立开发之 App 国际化全步骤(一):为什么要做国际化

独立开发之 App 国际化全步骤(二):App 数据翻译

独立开发之 App 国际化全步骤(三):Core Data 模型升级

独立开发之 App 国际化全步骤(四):Core Data 模型解析

独立开发之 App 国际化全步骤(五):提取 App 中文本文案

独立开发之 App 国际化全步骤(六):替换代码中使用的文本

独立开发之 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 ""
    }
}

🥳 结语

到这里,本篇终于完结了。一方面完成如此大工程的一个项目,我也想尽量将我的成果记录下来;另一方面,也希望这些内容能对读者有所帮助。

感谢大家的阅读,如果有任何问题,可以给我留言,我会尽量解答。

相关推荐
今天啥也没干1 天前
使用 Sparkle 实现 macOS 应用自定义更新弹窗
前端·javascript·swift
yngsqq1 天前
037集——JoinEntities连接多段线polyline和圆弧arc(CAD—C#二次开发入门)
开发语言·c#·swift
_黎明1 天前
【Swift】字符串和字符
开发语言·ios·swift
RickeyBoy2 天前
基于 Swift 从零到一开发贪吃蛇游戏(四)
swift
Swift社区4 天前
LeetCode - #138 随机链表的复制
leetcode·ios·swift
iOS阿玮5 天前
Appstore的产品突然被下架,还是4.3(a)?
swift·apple
yujunlong39195 天前
flutter pigeon gomobile 插件中使用go工具类
flutter·golang·kotlin·swift
多彩电脑6 天前
Swift的可选绑定(Optional binding)
开发语言·ios·swift
hxx2216 天前
ios swift开发--ios远程推送通知配置
ios·swift
#摩斯先生6 天前
Swift从0开始学习 函数和闭包 day2
ios·xcode·swift