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

🥳 结语

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

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

相关推荐
Swift社区5 小时前
Excel 列名称转换问题 Swift 解答
开发语言·excel·swift
东坡肘子1 天前
肘子的 Swift 周报 #063|异种肾脏移植取得突破
swiftui·swift·apple
恋猫de小郭2 天前
什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap
flutter·ios·swiftui
威化饼的一隅2 天前
【多模态】swift-3框架使用
人工智能·深度学习·大模型·swift·多模态
靴子学长3 天前
iOS + watchOS Tourism App(含源码可简单复现)
mysql·ios·swiftui
opentogether4 天前
Swift 的动态性
开发语言·ssh·swift
苍墨穹天4 天前
SWIFT基本使用
linux·swift
SchneeDuan5 天前
从源码分析swift GCD_DispatchGroup
ios·swift·源码分析·gcd
请叫我飞哥@6 天前
iOS在项目中设置 Dev、Staging 和 Prod 三个不同的环境
ios·xcode·swift
Cedric_Anik9 天前
iOS渲染概述
ui·ios·swift