探索 Xcode String Catalog:现代化 iOS 应用国际化指南

概述

随着应用程序面向全球用户,本地化支持已成为必不可少的基础能力。一款好的全球化应用应当能够在不同的语言和地区无缝运行,这不仅能让您的产品覆盖更广泛的受众,还能为用户提供更原生、更友好的体验,从而全面提升客户满意度。

本地化(Localization)过程简单来说就是

  1. 提取应用中对应的面向用户的字符串文本或图片资源等内容
  2. 交给翻译人员,进行不同语言和地区的适配
  3. 最后将翻译好的内容重新导入应用

但如果你曾经在项目中维护过十几种语言的 .strings 文件,你一定知道那种传统模式下的「痛苦」:文件分散、条目重复、翻译遗漏、协作混乱等等等等......

有幸,苹果官方在 Xcode 15 推出的 String Catalog ,其目的就是为了解决传统模式下的这些痛点。

本文介绍的重点就是 Apple 推出的全新国际化管理机制------String Catalog

了解 String Catalog

String Catalog (字符串目录)是 Apple 在 Xcode 15 中引入的一种全新的、集中化的本地化资源管理方式 ,用于简化项目汇总翻译管理的过程实现轻松本地化。它旨在取代传统的 .strings.stringsdict文件,并且最大的好处在于 Xcode 中提供一个统一的可视化界面来管理所有本地化字符串(包括复数形式和设备特定变体)

核心概念

String Catalog 对应的文件后缀是 .xcstrings。其本质是一个 JSON 文件 ,使其在版本控制系统(如 Git)中进行差异比较时,比旧的 .strings 文件更友好
.xcstrings 文件中包含的内容有:

  • 所有语言的翻译 :无需再为每种语言维护多个独立的 .strings.stringsdict文件
  • 多种字符串类型 :支持常规字符串、复数变体 (如英语中 "1 apple" 和 "2 apples" 的区别)、以及设备特定变体 (如为 iPhone、iPad、Mac 提供不同的翻译)
  • 上下文注释:支持为每个字符串键(Key)添加注释,帮助翻译者理解上下文,从而提供更准确的翻译。

优势与特性

  • Xcode 为xcstrings文件提供的可视化界面
    • 翻译进度显示:以百分比的形式展示每种语言的翻译完成度,用于快速识别未完成或需要更新的语种
    • 智能筛选与排序 :支持根据状态、key、翻译、注释等条件进行快速或组合筛选与排序,用于快速定位所需条目
    • 精细化内容管理 :可以直接修改各语言对应的翻译内容,并支持为每个条目补充注释(Commnet),为翻译人员提供关键上下文,翻译人员能理解具体含义并确保翻译准确性
    • 状态控制 :提供各语言各条目当前状态(STALE、NEW、NEEDS REVIEW、Translated )的查看,并且支持手动设置每个变量的状态(当前仅支持 Don't Translate、NEEDS REVIEW、REVIEWED)
    • 工程双向联动:支持从可视化编辑界面跳转到变量对应代码位置,也支持从代码快捷跳转到可视化界面中,方便代码的查阅与修改
  • 智能自动管理
    • 编译时自动提取 :在编译过程中( syncing localizations ) Xcode 会扫描代关键字,将对应类型的字符串自动提取到 String Catalog 中,无需手动维护条目(设置为 Manually 的条目除外)
    • 无缝语言扩展 :为项目新增一种语言时,Xcode 会自动在 Catalog 中为该语言创建列 (也支持在编辑界面中新增),并将其所有条目初始标记为 "需要翻译"
    • 变量的自动转换 :在代码中使用 String(localized: "Welcome, \(userName)")等包含变量的字符串时,变量(如 (userName))对应的 C 类型的占位符(%@、%lld 等)会自动提取到 String Catalog 中并正确显示,翻译人员只需按目标语言的语序组织字符串即可。
  • 高效协作与集成
    • 集中式管理 :将所有需要国际化的字符串都集中在一个可视化的文件中进行管理,告别了过往分散在多个 .strings.stringsdict 文件中的繁琐
    • 设备异化支持:支持按照设备(iPhoen\iPad\iPod\Mac\Apple Watch\Apple TV\Apple Vision)定义不同的翻译版本,保证在各种设备中均能提供合适的显示文本
    • 复数规则支持:内置对复数形式的处理支持,能够根据不同语言的复数规则(各国家规则不同,需要提前确认规则后再做处理,如英语的 "1 apple" 和 "2 apples")自动选择正确的字符串变体,无需开发者手动实现复杂逻辑
    • 标准化支持:无缝支持 XLIFF 标准格式,方便与专业的本地化服务或翻译工具进行导入导出
    • 快捷迁移 :支持从旧的 .strings.stringsdict文件一键迁移至新的 String Catalog 格式

工作原理与编译机制

flowchart TD A[开发者编辑.xcstrings文件] --> B[Xcode编译项目] B --> C{编译时处理} subgraph C [编译时处理] C1[String Catalog处理器] C2[提取本地化字符串] C3[转换为传统格式] end C --> D[生成对应语言的
.strings和.stringsdict文件] D --> E[打包到App Bundle中] E --> F[用户运行应用] F --> G{运行时处理} subgraph G [运行时处理] G1[系统根据设备语言设置] G2[加载对应的.strings文件] G3[提供本地化文本] end G --> H[界面显示本地化内容]

具体来说:

  1. 字符串提取机制 :在项目的编译过程中存在 syncing localizations 步骤,这个步骤的作用是扫描代码,自动提取以下内容

    • OC 中 :使用指定的宏定义 NSLocalizedSrting,(自定义实际内容为 xxxBundle localizedStringForKey: value: table:
    • Interface Builder或storyboard中,文本默认进行提取,Document 部分有一个localizer Hint,通过这个进行注释,会存在在一个Main(Strings) 的 catalog 中
    • swiftUI ,文本相关的默认都会进行提取,例如Text("Hello")
    • swiftLocalizedStringKeyString.LocalizationValue类型的字符串,例如String(localized: "Welcome")
  2. 编译时处理 : 编译时,会扫描工程中所有的 .xstrings 文件,并根据文件里面的内容生成对应语言的 .stringdict.strings 文件并引入到工程中(所以本质工程还是使用 .strings 实现的多语言)


创建与使用指南

由于本质是.strings 实现的多语言,所以实际使用的无最低部署目标要求,仅对 Xcode 存在要求
在新项目中创建 String Catalog

  1. 在 Xcode 项目中,通过 File > New > File...(或快捷键 Cmd+N)打开新建文件对话框
  2. 选择 Strings Catalog 模板
  3. 输入文件名(默认使用 Localizable),然后点击创建

迁移现有项目

如果已有的项目已经在使用传统的 .strings和 .stringsdict文件,那也可以机器轻松迁移到 Strings Catalog (毕竟还是那句话,String Catalog 的本质还是 .strings和 .stringsdict)

  1. 在 Xcode 项目导航器中, 右键单击 现有的 .strings或 .stringsdict文件
  2. 从上下文菜单中选择 Migrate to String Catalog
  3. Xcode 会自动开始迁移过程。为了完成此过程,您可能需要 构建项目 (Cmd+B),Xcode 会在构建过程中收集项目中的字符串资源到 .xcstrings文件中。

添加新语言支持

在 String Catalog 编辑器中:

  1. 点击编辑器窗口底部的 + 按钮
  2. 从下拉列表中选择您要添加的语言
  3. 添加后,Xcode 会自动为所有字符串创建条目,并标记为"需要翻译"(NEW)。

关于文件命名

  • 如果是应用内使用的文本需要国际化:则默认的命名为 Localizable.xcstrings,如需其他自定义名称,则需要在调用时候传递对应的table

  • 如果是需要实现 info.plist 文件的多语言,则固定命名为 InfoPlist.xcstrings

  • 如果是 .storyboard ,则可以直接右击显示 Migrate to String Catalog 即可自动生成

参考文献

探索字符串目录

苹果官方文档-localizing-and-varying-text-with-a-string-catalog

相关推荐
pop_xiaoli5 小时前
SQLite3语句以及FMDB数据存储初步学习
学习·ios·sqlite·objective-c·cocoa
磊怀9 小时前
iOS 中的引用计数
ios
游戏开发爱好者813 小时前
iOS 崩溃日志分析工具全指南,多工具协同构建稳定性分析体系
android·macos·ios·小程序·uni-app·cocoa·iphone
00后程序员张1 天前
如何提高 IPA 安全性 多工具组合打造可复用的 iOS 加固与反编译防护体系(IPA 安全 iOS 加固 无源码混淆 Ipa Guard 实战)
android·安全·ios·小程序·uni-app·iphone·webview
洞窝技术1 天前
前端开发APP之跨平台开发(ReactNative0.74.5)
android·react native·ios
EricStone1 天前
iOS语音转换SDK相关记录
ios
2501_916007471 天前
Fastlane 结合 开心上架 命令行版本实现跨平台上传发布 iOS App
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张1 天前
iOS 26 内存占用监控 多工具协同下的性能稳定性分析实战
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_915909061 天前
iOS 26 性能监控工具有哪些?多工具协同打造全方位性能分析体系
android·macos·ios·小程序·uni-app·cocoa·iphone