大多数浏览器和
Developer App 均支持流媒体播放。
-
探索字符串目录
了解 Xcode 15 如何通过将所有字符串集中管理来轻松本地化你的 App。我们将向你展示如何使用字符串目录在项目中提取、编辑、导出和构建字符串。我们还将分享如何通过选择要迁移的文件,根据自己的进度在现有项目中采用字符串目录。
章节
- 0:00 - Introduction
- 1:29 - Demo
- 4:13 - Extract
- 13:19 - Edit
- 22:48 - Export
- 27:52 - Build
- 28:44 - Migrate
- 31:03 - Wrap-up
资源
相关视频
WWDC23
-
下载
♪ ♪
Marina: 大家好 欢迎观看全球开发者大会 我是 Marina 稍后 我的同事 Matt 将和我一起为各位讲解 我们来自 Apple 的 Localization 团队 今天 很高兴能向你展示 字符串目录 (String Catalogs) 在 Apple 我们非常重视 无障碍性和包容性 将你的 App 本地化可确保内容 能触达全球用户 事实上 我们现在 在超过 40 种语言中 发布我们的操作系统 而且这一数字还在不断扩大 让每个用户都能 用其本地语言使用我们的产品 我们的团队致力于提供 适用于 Xcode 的工具 让实现本地化尽可能简单 今天 我们很高兴能向你介绍 在你的项目中 管理本地化内容的新改进和工作流程 以前 如果想本地化你的 App 你需要维护字符串 和 stringsdict 文件 这需要你手动 将所有字符串与代码保持同步 并且往往可能会错过本地化的内容 这可能会导致用户 看到未本地化的字符串 我们的项目 多年来一直在使用这个过程 但在 Xcode 15 中 我们引入了字符串目录 随着时间的推移 这种新格式 将会在 Xcode 中取代 strings 和 stringsdict 文件 字符串目录可以在 一个地方轻松管理你的所有字符串 并确保在发布前 能完全本地化你的内容 我们来看看它的工作原理吧 在此代码中 我使用 SwiftUI 控件 来构建我的视图和填充内容 这就是一个字符串目录 我们刚才在我的 Swift 代码中 看到的所有字符串 都已由 Xcode 自动提取出来 我不需要自己来添加它们 我想要确保我的巴西朋友 能够使用这个 App 所以 我把它翻译成了葡萄牙语
我有一个视图 其中展示了最近 在这个后院出现的鸟类的信息 在这里 我想确保我们能展示 来过后院的实际的鸟类数量 所以 我会添加一个变量 来表示这个数字 这就是在预览中的数字 现在 我们可以看到鸟类的数量 我将构建项目并返回到目录
这很简单 这个是新字符串 我们可以看到我的翻译进度 已经取得了一定进展 字符串目录 还提供了强大的编辑功能 可以轻松完成复杂的操作 例如 这个字符串中有单词“tap” 但这是一个多平台 App 所以 对于 Mac 设备 我希望能保证使用正确的单词 我们回到我的英语字符串 找到字符串“tap to learn more (点击以进一步了解)” 它在这里 右键单击它 选择“vary by device (根据设备而异)” 选择 Mac 适当地调整文本
这样就完成了 现在 如果我回到我的视图 并将运行目标更改为 Mac……
我们就可以使用预览来检查我的工作 这个操作很简单
字符串目录有很多用途 我们来深入了解一下整个工作流程 先从可以提取字符串的位置开始介绍 探索与字符串目录 交互的 Xcode 原生编辑器 并回顾本地化导出过程 然后 我们将了解 字符串目录的构建方式 以及你如何在现有项目中采用它们 接下来 将由 Matt 为大家介绍可本地化字符串 及其来源 Matt:谢谢你 Marina! 可本地化字符串只是 在运行时向用户呈现的一些文本 因此 需要将其翻译成你的 App 支持的所有语言 可本地化字符串由四个组成部分组成: 密钥是字符串的唯一标识符 通常与字符串本身相同 将在运行时中用这个内容 来查找要显示的适当值 如果需要 可以明确指定默认值 否则 将退回到默认本地化中的密钥 Xcode 14.3 引入了使用项目编辑器 来更改项目的默认本地化的功能 如果源代码中的字符串 不是英语 这个功能会很有帮助 接下来 字符串注释提供了 一种方式 用于给译员提供上下文 以了解字符串 在 UI 中的使用位置和使用方式 我们建议为字符串添加注释 以便帮助解决翻译中的歧义问题 最后 每个可本地化字符串 都属于一个字符串表 对应于一个或多个将存储翻译的文件 默认情况下 来自代码的字符串 被放置在“可本地化”表中 但如果你希望以其他方式组织 你的字符串 可进行自定义设置 我们来更详细地了解一下字符串表 对于使用 .strings 文件的 现有 App 一个单独的字符串表实际上包含 位于每个支持语言的 lproj 目录中的 .strings 文件 和可能的 .stringsdict 文件 这里显示的这些文件组成了 可本地化字符串表 另一方面 字符串目录 包含了一个存储在单个文件中的 完整字符串表 这包括该表中每个本地化字符串的 所有翻译和额外的元数据 如果你想将字符串 组织成多个字符串表 可以创建多个字符串目录 每个目录都包含 属于该表的字符串键 以及你的 App 支持的每种语言翻译 尽管键在其所属表中始终是唯一的 但在表之间没有要求键必须是唯一的 例如 在这里的文件中 “Welcome to WWDC!”字符串存在于两个文件中 因为它可能在 App 的 不同上下文中显示 正如之前 Marina 提到的 Xcode 15 会自动填充 你的字符串目录 并尽力使它们与项目中 找到的本地化字符串保持同步 那么 Xcode 从哪里 找到这些本地化字符串呢? 其实 本地化字符串 可能存放在各种位置 Xcode 可以在源代码、 Interface Builder 文件 甚至 Info.plist 中找到字符串 以包含在你的字符串目录中 如果你已经进行了 一段时间的 App 本地化 那你对其中许多内容应该会感到熟悉 我们来仔细研究一下部分内容 先从 SwiftUI 开始介绍 SwiftUI 可使本地化无缝化 因为每当你在视图中 指定一个字符串文字时 该字符串将自动被视为可本地化 所有这些字符串 都被视为可本地化 并将被提取到 名为 Localizable.xcstrings 的 字符串目录中 (如果存在) 这适用于任何接受 LocalizedStringKey 类型的参数 SwiftUI 字符串 可以使用文本视图来指定注释、 自定义表名 或用于字符串查找的 bundle 你还可以定义自己的自定义视图 其可接受应该为客户端认为 是可本地化的字符串 请注意 我们在这里使用了 LocalizedStringResource 作为字符串类型 当 Xcode 在调用位置 看到一个字符串字面量被用来实例化 LocalizedStringResource 对象时 它会知道这个字符串是可本地化的 LocalizedStringResource 是表示 和传递可本地化字符串的推荐类型 它不仅支持 使用字符串文字进行初始化 还可以提供注释、表名 或甚至是与字符串键不同的默认值 现在 我们来了解一下 更常见的 Swift 代码 这里有一些包含 稍后会呈现的字符串的模型代码 我正在 String 和 AttributedString 上 使用 localized: initializers 来指定我知道 将在运行时向用户显示的字符串 你还可以在导入 Foundation 的任何地方 直接使用 LocalizedStringResource 字符串目录利用 Swift 编译器中的强大技术 来提取可本地化的 Swift 字符串 因此 请确保启用了构建设置 “Use Compiler to Extract Swift Strings” 但字符串目录可以从不仅限于 Swift 代码的地方提取字符串 这个示例使用了 NSLocalizedString 的 Objective-C 代码 任何嵌入在 NSLocalizedString 宏中的 字符串文字 都会自动被视为可本地化 你甚至可以定义自己的类似的宏 其也可以被检测到作为可本地化的宏 相同的概念也可以在使用 CFCopyLocalizedString 的 C 代码中使用 为了在 C 或 Objective-C 中 指定任何自定义的本地化字符串宏 可使用“Localized String Macro Names” 构建设置 现在 我们已经了解了 这在源代码中的工作原理 接下来 我们来探索 Interface Builder 中的可本地化字符串 在 Interface Builder 中指定的字符串 会自动被视为可本地化字符串 使用检查器后 你还可以指定一个注释 来为这些字符串提供 上下文 以便译员了解 它将出现的位置 当一个字符串目录 与 Storyboard 或 xib 配对时 来自 Interface Builder 的 所有可本地化字符串 都将出现在目录中 就像源代码一样 每次构建项目时 Xcode 都会更新目录 这个过程对于 Info plist 文件的工作原理也类似 为此 只需在你的项目中 添加一个 InfoPlist.xcstrings 文件 并将其添加到所需的目标中 每次构建时 Xcode 都会将一组 已知的可本地化 info plist 键添加到目录中 如果需要 还可以手动添加更多 最后 今年的 Xcode 中 包含了一些重大改进 用于本地化 App Shortcut 短语 若要了解更多信息 请务必观看今年的讲座 “用 App 快捷指令突出你的 App” 现在 我们已了解了 Xcode 可以 找到可本地化字符串的各种位置 现在 我来更详细地讲解一下 这些字符串如何进入字符串目录 每次构建时 Xcode 将在当前方案和平台中 发现可本地化字符串 来自源代码的字符串 会作为可本地化字符串的真实来源 字符串目录中的 源字符串会与之保持同步 当在代码中发现新的字符串时 Xcode 会将它们 添加到你的字符串目录 此时 该字符串已准备好进行翻译 正如我们之前讨论的 可本地化字符串在代码中 可能有一个指定的默认源值 在这种情况下 目录将根据代码中的 任何新值进行更新 Xcode 还可发现你何时 已从代码中删除了一个字符串 如果该字符串尚未翻译 Xcode 将为你删除它 但是 如果你已经 为一个字符串提供了翻译 然后将其删除 Xcode 将保留该字符串 并将其标记为“失效” 这表示该字符串在代码中无法找到 如果确认不再需要该字符串 你可以删除它及其翻译 或者 也可以使用 检查器来告诉 Xcode 你想手动管理该特定字符串 手动管理的字符串 在构建后进行本地化同步时 不会被 Xcode 更新或删除 对于在代码中动态构建键 或从数据库中获取的字符串 这个功能非常有帮助 现在 我们已经将 所有字符串提取到字符串中 接下来 我们来更详细地了解 字符串目录编辑器 如何帮助轻松管理翻译 字符串目录支持一级类 用于跟踪状态和翻译进度 帮助你本地化 App 我们已经讨论过 当无法在代码中找到字符串时 Xcode 会将其显示为“失效” 但是 还有其他三种 你应该了解的本地化状态 “未翻译”表示一个字符串尚未 被翻译成所选语言 在代码中添加 新字符串后 你就会看到这种状态 “需审核”表示该字符串 需要本地化人员的关注 因为该值可能需要更改 如果想使用当前值 只需从上下文菜单中 选择“标记为已审核” 你还可以使用此菜单将字符串 标记为需要本地化人员审核 如果收到有关错误翻译的 错误报告 这会很有帮助 最后 已用所选语言翻译的字符串 将显示为绿色的勾号 这表示不需要进一步操作 作为开发者 另一个 常见的本地化挑战是复数形式 例如 这是 Marina 之前在 Backyard Birds 中 添加的用于显示 最近访问者数量的字符串 在英语中 我们需要根据数量是一个 还是其他数量来改变字符串的语法 然而 在乌克兰语等语言中 可能还有更多的情况需要考虑 为了解决这个问题 我们需要一种根据传入的数字的值 来变化字符串的方式 以前 为了解决 大量语言的这个问题 需要使用 stringsdict 文件 这种 plist 格式的文件 在使用上可能会很困难 并给简单任务引入了一个较高门槛 比如 要将字符串转为复数形式 现在 字符串目录编辑器 已包含内置的支持 用于字符串变体工作流程 通过在字符串上显示上下文菜单 我可以选择对字符串进行变化 在默认本地化中 对字符串进行变化时 翻译也会自动变化 这是一个更复杂的示例 其中 一个字符串 需要使用两个变量进行复数变化 在运行时 我们可能会得到几种不同的情况 我们可能会在一个后院有一只鸟、 在一个后院有多只鸟、 在多个后院有多只鸟 或尽管有多个后院 但只有一只鸟 在每种情况下 围绕这些数字的字符串 需有不同的翻译 以保持语法一致 字符串目录编辑器 也能使这个操作变得很容易 这就需要用到替代项 在这里 我们通过复数形式 对字符串的两个参数进行了变化 每个替代项前面都带有 @ 符号 并存储了复数形式和其值的字典 这个示例中 包括一个“birds”的替代项 用于设置鸟的数量格式 此外 还包括一个“yards”的替代项 用于设置后院的数量格式 在运行时 将使用这里显示的顶层字符串 从每个引用的替代项中 替换适当的复数形式 因此 在这个示例中 可以产生这些字符串中的任意一个 从而有效地为每个替代项创建 一种可能的复数形式的排列组合
替代项通常对应于 传入字符串的参数 通常使用字符串插值 在检查器中 Xcode 会显示 关于用于数字的 参数位置 以及传递类型的 C 样式 格式说明符的信息 这里显示的后院替代项 对应于第二个字符串插值 因为它是源代码中 使用的第二个插值 然后 将使用 backyards.count 的值 来确定我们是否使用一种 或另一种情况 来替换这个替代项 这样 字符串目录 为变化的字符串提供了一个简单的 UI 同时仍然支持像这样的高级用例 现在继续由 Marina 介绍 看看如何应用这些技术 Marina:谢谢你 Matt 回到 Backyard Birds App 字符串目录编辑器 让我能轻松找到我正在寻找的字符串 我可以使用过滤器找到 所有包含“learn”的字符串 或按状态排序 以查看最重要的状态 正如 Matt 所介绍的 有些字符串 可能不在代码中 但会在 App 中显示 例如 我知道我的 App 可能会显示 一种特殊类型的鸟 它们来自于云端 可供 App 订阅者使用 在这种情况下 我可以使用这里的 加号按钮来定义一个手动字符串 为它指定一个键 和一个注释
请注意 手动管理的字符串 不会被 Xcode 更新或移除 如果你想让 Xcode 从代码中开始提取字符串 请扩展检查器
并将字符串设置为自动管理 Xcode 还可以 轻松跟踪我的本地化进度 在每个字符串旁边 都可以看到表示翻译状态的徽章 当一个字符串刚从代码添加或手动 添加时 就像我们刚才操作的那样 你会看到它被标记为“未翻译” 表示它尚未被翻译 每当源字符串发生更改时 翻译将被标记为需审核 之前 我把这个英文字符串 修改了一下 因此 已有的翻译 就会被标记为需审核 如果这个字符串没问题 我只需右键点击字符串 然后 选择“标记为已审核” 由于我会讲葡萄牙语 我知道需要更新这个翻译
通过这个改变 可以在侧边栏上看到 本地化的百分比提高了 有一种语言被完全本地化后 在侧边栏上就会显示一个绿色的勾号 这是你第一次可以追踪 在 Xcode 中的本地化进度 并确信你的 App 已完全本地化 然后才提交到 Apple Store 我还想准备好 将这个 App 本地化为乌克兰语 可以直接从字符串目录编辑器中 完成这个操作 方法是点击加号 然后 从列表中选择一种新的语言
这里就是我的乌克兰目录 还没有任何翻译
这是我们之前添加的字符串 它看起来需根据复数形式进行变化 因此 让我们返回到“英语”
我会右键点击这个字符串 然后选择“根据复数变化” 对于英语来说 我知道需要区分 复数和单数 所以让我们修正一下
在葡萄牙语中 复数形式与英语相同 不过 如果我们来看一下乌克兰语 就会发现系统为我添加了 一组不同的复数形式 我的乌克兰语译员 会明确知道如何处理这个
回到我的视图中 我想添加另一个标签 用于表示每个后院中鸟的数量 让我添加一下……
构建中……
然后返回到我的目录
它就在我的目录中了 我还想根据复数形式进行变化 但它包含多个参数 这一次 当我右键点击字符串 并选择“根据复数变化”时 我可以选择想要进行变化的参数 让我们两个都进行变化
接下来 我将设置替换项 以便它们可以在运行时进行复数变化 将需要和参数一致的单词移出来 所以 将“birds” 放入“birds”替换项 将“backyards” 放入“yards”替换项
为提升可读性 我想重新命名我的替换项 好让我能知道变量对应的参数
这样就更易于理解 现在 Matt 将向我们展示 如何导出字符串 以便进行乌克兰语翻译 Matt:谢谢你 Marina 大家已经看到 通过 Xcode 可以轻松在字符串目录中 直接提供和编辑翻译 但通常来说 你需与译员一起合作 在 Xcode 之外 本地化 App 的字符串 为此 Xcode 提供了 “导出本地化”选项 这将为每种语言生成一个本地化目录 可以用于发送给译员进行翻译 Xcode 10 首先引入了本地化目录 它是一种软件包格式 其中包含项目或工作区中的 所有可本地化内容 现在 我们来了解一下 内部 XLIFF 文件 它包含了 所有可本地化字符串及其翻译 XLIFF 是一种行业标准的格式 用于存储和传输本地化内容 如果你或你维护的工具 直接使用 XLIFF 文件 就需要注意一些变化 这些变化 涉及使用字符串目录的项目中 不同字符串的表示方式 这个示例 XLIFF 以 .stringsdict 文件中 最初定义的复数字符串来表示 这里显示的 trans unit 标识符作为 字符串字典 plist 格式中的路径 当变化字符串来自字符串目录时 它们将是这个样子 其中会包含字符串键、 分隔符序列 以及以点分隔的配置字符串 这个配置字符串 可以是一个简单的复数指示符、 设备指示符、 多个条件的链 或是替换项中的复数形式的路径 这些键不仅应易于自动化工具读取 而且它们的设计还易于用户 一目了然地阅读和理解 翻译工具也能够 通过使用所需的变化结构 在 XLIFF 中替换翻译单位 根据需要来变化之前未变化的字符串 例如 这个字符串当前没有变化 但在葡萄牙语中 我希望 在 Apple Watch 上 提供一个更短的字符串 通过在 XLIFF 中替换该单位 为 device.applewatch 和 device.other 变体 我们就可以影响下一次导入时 该语言将存在的变化结构
为确保在导出本地化时 XLIFF 默认使用 字符串目录格式 请务必将 “首选字符串目录进行本地化” 设置为“是” 从译员那里 收到翻译后的本地化目录后 你可以将其导入到项目中 对于来自字符串目录的字符串 导入的文件中 指定的翻译将会自动添加到 相应的字符串目录中 让我们在 Backyard Birds 中试一下 Marina:我会讲葡萄牙语 所以 我已经翻译好了 App 的葡萄牙语翻译 但我需要发送 乌克兰语本地化目录给译员 来获取本地化翻译 先点击这里的“产品菜单” 选择“导出本地化” 然后 选择要导出的语言 在本例中 只选择乌克兰语 现在 我可以点击“导出”
他们将翻译返回来后 我就可以将译文导入到我的 App 中 看 译文在这里 现在 翻译准备好了 我将返回我的 App 点击“产品菜单” 这次 选择“导入本地化” 选择乌克兰语本地化目录
好的 让我们看看一切的效果如何
很好 我的乌克兰语翻译已经就位 现在 我的 App 完全支持两种语言 让我们看看葡萄牙语的效果 我会点击方案选择器 并选择“编辑方案” 在选项下 我可以将 App 的语言从系统更改为葡萄牙语
然后 我会运行 App
太棒了 这里有一些 我们处理过的字符串
现在 我们完成了翻译 接下来 由 Matt 继续介绍 Matt:现在 App 的内容已完全翻译好了 我们来简要讨论一下 构建过程中发生的情况 字符串目录专门 用于在 Xcode 项目中进行交互 作为底层的 JSON 文件 它们在源代码控制中也应易于比较 然后 在构建过程中 这些文件会编译为 .strings 和 .stringsdict 文件 由于我们的操作系统 多年来一直支持这些文件格式 我很高兴地宣布 你可以立即开始使用字符串目录 无需更新最低部署目标 值得注意的是 从代码中提取的源字符串 不会包含在最终构建中 这样可以节省磁盘空间 而不影响运行时 显示的字符串 现在 我们已经看到了 这些优势的实际效果 Marina 将向你展示如何在现有项目中 使用字符串目录 Marina: Xcode 可让你轻松迁移现有项目 以便使用字符串目录 你可以按自己的进度进行迁移 无论你是否已准备就绪 你都可以选择 要迁移的字符串文件和目标 这个名为“餐车”的现有 App 我们在去年对其进行了本地化 可以在这里看到它有一个 字符串以及字符串字典文件 字符串目录可以与旧格式共存 因此 我可以在 准备就绪时选择迁移可本地化表 我们现在就开始吧 我会右键单击文件 然后选择“迁移到字符串目录” Xcode 包含一个内置的迁移助手 会列出我的项目中 所有可迁移的文件 在这里 可以看到 属于“餐车”目标的可本地化表 我将继续进行迁移
很好!迁移完成后 Xcode 将构建我的项目 以提取字符串 我们来看看 构建后的目录是什么样子 在这里 可以看到 所有来自我的字符串文件 以及字符串字典文件的 字符串都已迁移 所有的阿拉伯语翻译 都已就位 但我们可以看到 法语的翻译进度不是 100% 字符串目录已经帮我 在项目中找到未本地化的字符串 “餐车”App 还有一个尚未本地化的 Swift 包:FoodTruckKit 使用字符串目录 来开始本地化新的软件包 或项目非常简单 我将从软件包清单中 添加默认本地化 并确保使用 5.9 版本的 Swift Tools
然后 我将向软件包中 添加一个新的字符串目录 默认表名为 “Localizable (可本地化)”
构建项目后 可以看到 整个软件包中的所有字符串 开始本地化 新的项目或软件包就是如此简单 字符串目录是 Xcode 中本地化的新基础 简化了项目中翻译管理的过程 我们希望你 今天就开始迁移现有的字符串 如果你以前从未对 App 进行过本地化 我们希望这种简单操作 能够激励你踏出第一步 感谢你今天的观看 祝你有一个愉快的观鸟体验! ♪ ♪
-
-
4:30 - Localizable string
String(localized: "Welcome to WWDC!")
-
4:42 - Localizable string with default value
String(localized: "WWDC_NOTIFICATION_TITLE", defaultValue: "Welcome to WWDC!")
-
5:05 - Localizable string with comment
String(localized: "Welcome to WWDC!", comment: "Notification banner title")
-
5:22 - Localizable string with table and comment
String(localized: "Welcome to WWDC!", table: "WWDCNotifications", comment: "Notification banner title")
-
7:36 - Localizable strings in SwiftUI
// Localizable strings in SwiftUI struct ContentView: View { var body: some View { VStack { Label("Thanks for shopping with us!", systemImage: "bag") .font(.title) HStack { Button("Clear Cart") { } Button("Checkout") { } } } } }
-
8:01 - Localizable strings in SwiftUI with LocalizedStringKey
// Localizable strings in SwiftUI struct ContentView: View { var body: some View { VStack { // init(_ titleKey: LocalizedStringKey, systemImage name: String) Label("Thanks for shopping with us!", systemImage: "bag") .font(.title) HStack { Button("Clear Cart") { } Button("Checkout") { } } } } }
-
8:08 - Localizable strings in SwiftUI text view
// Localizable strings in SwiftUI struct ContentView: View { var body: some View { VStack { Label { Text("Thanks for shopping with us!", comment: "Label above checkout button") } icon: { Image(systemName: "bag") } .font(.title) HStack { Button("Clear Cart") { } Button("Checkout") { } } } } }
-
8:16 - Localizable strings in SwiftUI custom view
// Localizable strings in SwiftUI struct CardView: View { let title: LocalizedStringResource let subtitle: LocalizedStringResource var body: some View { ZStack { RoundedRectangle(cornerRadius: 10.0) VStack { Text(title) Text(subtitle) } .padding() } } } CardView(title: "Recent Purchases", subtitle: "Items you’ve ordered in the past week.")
-
9:03 - Localizable strings in Swift displayed at runtime
// Localizable strings in Swift import Foundation func stringsToPresent() -> (String, AttributedString) { let deferredString = LocalizedStringResource("Title") … return ( String(localized: deferredString), AttributedString(localized: "**Attributed** _Subtitle_") ) }
-
9:44 - Localizable strings in Objective-C
// Localizable strings in Objective-C #import <Foundation/Foundation.h> - (NSString *)stringForDisplay { return NSLocalizedString(@"Recent Purchases", @"Button Title"); } #define MyLocalizedString(key, comment) \ [myBundle localizedStringForKey:key value:nil table:nil]
-
10:04 - Localizable strings in C
// Localizable strings in C #include <CoreFoundation/CoreFoundation.h> CFStringRef stringForDisplay(void) { return CFCopyLocalizedString(CFSTR("Recent Purchases"), CFSTR("Button Title")); } #define MyLocalizedString(key, comment) \ CFBundleCopyLocalizedString(myBundle, key, NULL, NULL)
-
11:23 - App Shortcut phrases
// App Shortcut phrases struct FoodTruckShortcuts: AppShortcutsProvider { static var appShortcuts: [AppShortcut] { AppShortcut( intent: ShowTopDonutsIntent(), phrases: [ "\(.applicationName) Trends for \(\.$timeframe)", "Show trending donuts for \(\.$timeframe) in \(.applicationName)", "Give me trends for \(\.$timeframe) in \(.applicationName)" ] ) } }
-
23:53 - Stringsdict in XLIFF
// Stringsdict in XLIFF <trans-unit id="/%lld Recent Visitors:dict/NSStringLocalizedFormatKey:dict/:string"> <source>%#@recentVisitors@</source> <target>%#@recentVisitors@</target> </trans-unit> <trans-unit id="/%lld Recent Visitors:dict/recentVisitors:dict/one:dict/:string"> <source>%lld Recent Visitor</source> <target>%lld Visitante Recente</target> </trans-unit> <trans-unit id="/%lld Recent Visitors:dict/recentVisitors:dict/other:dict/:string"> <source>%lld Recent Visitors</source> <target>%lld Visitantes Recentes</target> </trans-unit>
-
24:08 - String Catalog in XLIFF
// String Catalog in XLIFF <trans-unit id="%lld Recent Visitors|==|plural.one"> <source>%lld Recent Visitor</source> <target>%lld Visitante Recente</target> </trans-unit> <trans-unit id="%lld Recent Visitors|==|plural.other"> <source>%lld Recent Visitors</source> <target>%lld Visitantes Recentes</target> </trans-unit>
-
24:58 - String Catalog variations in XLIFF
// Overriding variation in XLIFF <trans-unit id="Bird Food Shop|==|device.applewatch"> <source>Bird Food Shop</source> <target>Loja de Comida</target> </trans-unit> <trans-unit id="Bird Food Shop|==|device.other"> <source>Bird Food Shop</source> <target>Loja de Comida de Passarinho</target> </trans-unit>
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。