独立开发之 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 天前
Rust移动开发:Rust在iOS端集成使用介绍
后端·程序人生·ios·rust·objective-c·swift
KeithTsui2 天前
ZFC in LEAN 之 前集的等价关系(Equivalence on Pre-set)详解
开发语言·其他·算法·binder·swift
袁代码2 天前
Swift 开发教程系列 - 第4章:函数与闭包
ios·swift·ios开发
今天也想MK代码2 天前
在Swift开发中简化应用程序发布与权限管理的解决方案——SparkleEasy
前端·javascript·chrome·macos·electron·swiftui
安泽13143 天前
高德地图美食
开发语言·swift·美食
袁代码3 天前
Swift 开发教程系列 - 第2章:Swift 基础语法
swift·ios开发·基础教程
袁代码3 天前
Swift 开发教程系列 - 第1章:Swift 简介与开发环境配置
swift·ios开发·基础教程
孚亭4 天前
一些swift问题
swift
莫问alicia4 天前
echarts 实现3D饼状图 加 label标签显示
前端·3d·echarts·swift
uiop_uiop_uiop6 天前
iOS Swift5算法恢复——HMAC
ios·iphone·swift