View in English

  • 打开菜单 关闭菜单
  • Apple Developer
搜索
关闭搜索
  • Apple Developer
  • 新闻
  • 探索
  • 设计
  • 开发
  • 分发
  • 支持
  • 账户
在“”范围内搜索。

快捷链接

5 快捷链接

视频

打开菜单 关闭菜单
  • 专题
  • 相关主题
  • 所有视频
  • 关于

更多视频

  • 简介
  • 概要
  • 转写文稿
  • 代码
  • 跟着视频学编程:使用 Xcode 探索本地化

    探索如何使用 Xcode 将你的 App 本地化为其他语言。我们将逐步介绍创建 String Catalog、翻译文本以及与外部翻译器交换文件的流程。你将了解为翻译器提供必要语境信息的最佳实践,以及 Xcode 如何帮你自动提供这类信息。对于大型项目,我们将还深入探讨使用类型安全的 Swift 代码来管理复杂度并简化字符串管理的实用技巧。

    章节

    • 0:00 - 简介
    • 0:38 - 入门指南
    • 5:33 - 翻译的语境
    • 9:33 - 管理复杂度
    • 20:49 - 后续步骤

    资源

    • Expanding Your App to New Markets
    • Localizing Landmarks
      • 高清视频
      • 标清视频

    相关视频

    WWDC23

    • 探索字符串目录
  • 搜索此视频…

    大家好!我是本地化团队的 Andreas 在这个讲座中 我们将探讨 如何使用 Xcode 进行本地化

    这个讲座不需要提前掌握专门知识 我们将一起探讨 如何设置 App 以进行本地化 然后 我们将讨论如何 为从事 App 翻译工作的人员 提供合适的上下文信息 最后 我们将深入了解 随着项目不断壮大 你可能会遇到的一些复杂情况 并讨论可以帮助你 管理这些情况的新功能 我们这就开始吧!

    这个讲座支持同步编程 也就是说 你可以 将这个视频中的步骤 应用到通过描述中的链接 提供的示例项目中 请下载 Landmarks 项目 然后和我一起开始将它本地化! 我在 Xcode 中打开了这个项目 这个版本的 Landmarks 英文版效果很棒 但还没有翻译成任何其他语言 首先 我们使用“File”菜单 添加一个字符串目录

    可以使用默认名称“Localizable” 但我希望将它放在 Resources 组中 素材目录也在这个位置 现在已经添加了字符串目录 接下来可以构建项目了 当存在字符串目录时 Xcode 会在每次构建后 发现可本地化的字符串 并自动将这些字符串 添加到字符串目录中 我们无需特意执行任何操作 就能让这个目录中的字符串 与代码保持同步 但 Xcode 如何知道 我们要将哪些字符串本地化呢? 大多数 SwiftUI API 都默认 使字符串可本地化 包括文本和按钮等视图 在示例代码的其余部分 String(localized: ) 也使字符串 可用于本地化

    现在 我将使用辅助编辑器 来了解字符串目录 中的字符串是从什么位置提取的

    这一个字符串来自一个确认对话框

    这里有一个字符串用作 LabeledContent 的标题 这个字符串用作导航标题 这个字符串来自 使用插值变量的 Text 函数 如你所见 大多数 SwiftUI API 都可以直接本地化 你可能已经注意到 这个字符串 表示项目数量 占位符 %lld 在运行时 会被替换为地标的数量 我们希望这个字符串 根据具体数字而有所不同 例如 我们希望它显示为 “1 item”和“2 items”

    为此 我们打开上下文菜单 并选择“Vary by Plural”

    现在 我们可以编写适用于一个项目 以及多个项目的短语

    在运行时 系统会选择 与数字相匹配的正确字符串 这个问题很容易解决

    接下来要说的是 本地化的重点在于其他语言 我碰巧会说德语 所以我也可以 直接在字符串目录中 自己编写一些翻译 我们关闭辅助编辑器 为了为这个项目添加语言 我点按底部栏中的加号按钮 然后选择“German (de)” 就这么简单 然后 我要开始添加一些翻译

    请注意 随着我将翻译进行下去 已翻译字符串的状态会从“NEW” 变为右侧的绿色勾号!

    与此同时 边栏中显示的 整体翻译进度 增加到 8%

    不过 我做翻译不如搞开发在行 所以我与一名语言专家开展合作 我希望由对方来完成 剩余的德语翻译

    为了将我到目前为止 做出来的东西发送给对方 我前往 Xcode 中的 “Product”菜单 然后选择 “Export Localizations” 因为我要将 App 翻译成德语版 所以我想只导出德语版

    这项操作会生成 一个本地化目录文件 其中包含了到目前为止 我已经完成的所有德语翻译 以及尚未翻译的英文字符串 这个打包文件包含了 多项翻译服务都能轻松处理的 业界通用 XLIFF 文件 对方完成翻译后 就会发回全部翻译好的本地化目录

    为了将它重新导入到项目中 我再次前往“Product”菜单 然后选择 “Import Localizations” Xcode 需要一点时间来构建项目 但随后所有字符串 都会被标记为已翻译

    德语版的整体翻译进度 也达到了 100% 你也可以这么做! 示例项目包含了 全部翻译好的 de.xcloc 文件 你可以像我一样 将它导入到 Xcode 中 现在 是时候在实际操作中 测试一下了 我想运行德语版 App 打开方案编辑器 编辑方案 选择“Run”然后导航到“Options”

    在这里 我们可以将下一次调试时 App 的语言更改为德语

    现在 我将在 Mac 上 构建并运行这个 App

    这是完全本地化的德语版 我很喜欢这个全新外观!

    设置新 App 以进行本地化 就是这么简单 接下来 我们深入了解一下 如何向翻译人员提供 额外的上下文信息 以确保出色的翻译质量 Xcode 中的 Assistant 编辑器 可以在字符串目录旁边 显示代码 效果非常棒 但翻译人员在进行翻译时 往往看不到我们的代码 或是运行中的 App 我们需要提供额外的上下文信息 来帮助他们编写出色的翻译内容

    这些上下文信息 是以注释形式添加的 可以直接在代码中添加 也可在字符串目录的 注释列中添加 如果没有注释 翻译人员可能会 很难理解字符串的使用方式 例如 “Landmarks”只是一个词 我们指的是 App 的名称 还是地图上的地标? 这个字符串键的内容是 “%@ is contained in %@” 翻译人员如何判断 %@ 占位符代表什么? 这会影响这个字符串的翻译效果! 好的注释可以说明 字符串用于哪个界面元素 比如标签栏、按钮或副标题

    描述周围的用户界面元素 也很有帮助 例如 补充说明第一个字符串 是边栏中的条目 会很有帮助! 第二个字符串是 列表中地标的副标题 所以我们也要补充说明这一点 最后 注释应该说明 每个占位符中 可以出现哪种内容 在这里 第一个占位符 是地标的名称 第二个占位符是这个地标 所属精选集的名称 如果没有注释 就不可能 正确翻译这个字符串 因此 提供准确的注释至关重要!

    去年 我们为字符串目录 添加了一项功能 可以跟踪 字符串是从代码中的 什么位置提取的 今年 我们将利用这些信息来帮助你 Xcode 26 中推出了 自动注释生成功能!

    Xcode 会使用设备端模型 来分析你的代码 现在还可以为你编写注释! 我们来看看它的实际效果! 到目前为止 我们只为代码中的 部分字符串提供了注释 了解注释的重要性之后 我们来改进一下 给翻译人员提供的上下文信息! 这里有一个没有注释的字符串 看起来像是用于按钮的 打开它的上下文菜单 然后选择“Generate Comment” 在分析字符串的使用位置后 Xcode 生成的注释内容是 “The text label on a button to cancel the deletion of a collection.” 非常精准!

    这个字符串也没有注释 所以我 让 Xcode 为我们生成一条注释

    它生成的内容是“A label displayed above the location of a landmark.” 没问题 我想强调的是 我们在这里仍然可以进行编辑 你输入的内容始终会 覆盖生成的注释 我喜欢与模型协同工作 以提供一些额外的信息 所以我要补充说明这个字符串 会显示在检查器中

    我觉得这项功能非常有用 我还希望 Xcode 为它从代码中 提取的所有新字符串生成注释! 为此 我打开“Settings”

    然后导航到“Editing”

    在这里 启用“Automatically generate string catalog comments”这项设置 从现在开始 当 Xcode 检测到 代码中新增了可本地化的字符串时 就会自动生成注释 这样就可以非常轻松地 向翻译人员提供所需的上下文信息

    为了帮助翻译工具的开发者指出 注释由 Xcode 生成的情况 Xcode 导出的 XLIFF 文件会将 这类注释标注为“auto-generated”

    要进一步了解 与其他工具的互操作性 以及字符串目录 可以实现的所有其他功能 请观看“探索字符串目录”

    随着项目不断壮大 并变得越来越复杂 还有其他的 Xcode 功能 和本地化 API 可以帮助你让项目保持井井有条 例如 随着项目规模越来越大 或许会有多名开发者 开始从事这个项目 我们有时会将代码库拆分为 多个扩展、框架和 Swift 软件包 其中每一项都可能包含 一个或多个字符串目录 现在 在这类情况下 我们必须在本地化 API 上 使用另一个参数:bundle 这将告诉系统在运行时 可以在什么位置找到这个字符串 现在 “Bundle.main” 始终指主 App 如果不提供 bundle 参数 则默认使用 .main

    今年新增的功能是 #bundle 宏 你可以使用它来引用 包含当前目标所需资源的 bundle 如果代码在主 App 中运行 那么当前目标就是主 App 如果不是这样 它会自动查找 框架或 Swift 软件包所需的资源 此外 它还能在旧版操作系统上 正常运行 顺利完成任务!

    还有一种字符串整理方法 是将相关的字符串分组到一起 例如把与特定屏幕、功能或用户流程 相关的所有字符串分组到一起 我们将字符串组称为“表” 而每个字符串目录 都代表一个表

    默认情况下 所有字符串都被提取到 名为“Localizable”的表中 这与创建字符串目录时的 默认文件名相一致 当然 我们可以更改这个名称! 可以使用参数 tableName 将字符串 放入我们选择的字符串目录中 例如 使用表名称“Discover” 会自动将字符串放入 “Discover.xcstrings”中

    虽然 Landmarks App 在创建私人地标精选集时效果很棒 但我还想开发一项 可以发现更多内容的功能 这些内容要么来自我关注的好友 要么来自精选内容源 接下来 我们开始 在新框架中开发这项功能

    首先 打开“File”菜单 然后添加一个新目标 搜索“framework”

    这个框架是用来发现新地标的 因此我将它命名为“DiscoverKit”

    我要从零开始创建一个新屏幕 我还想将这个屏幕的所有字符串 放在一个单独的表中 我们向 DiscoverKit 添加一个新文件

    选择“String Catalog” 然后将它命名为“Discover”

    为方便起见 按住 Shift 和 Option 同时点按新的 Swift 文件 从而在右侧编辑器中打开代码

    然后关闭导航器以腾出更多空间

    我将开始使用枚举 在模型层中开发这项功能 我的新枚举定义了 内容是来自好友还是精选内容 它有一个属性 用于公开 自身的本地化标题 我们来实现这个属性 首先使用 String(localized: ) 来公开要本地化的字符串 然后 使用 table 参数 来更好地进行整理 由于我们处于一个框架内 因此我也需要使用 bundle 参数 然后对另一种情况执行相同的操作

    这样 枚举就完成了 现在 我要导入 SwiftUI 并添加一个 视图 从而在屏幕上显示一些内容

    我还没有实施任何业务逻辑 所以 现在显示一个占位符 内容说的是有 42 个新帖子

    键入这些内容就够了 接下来 是时候让 Xcode 干点活了! 我要将方案更改为新框架 然后进行构建

    一旦构建完毕 新字符串 就会出现在我的目录中

    而且它们已经带有注释了!太棒了!

    对于剩余的 UI 工作 我想向大家介绍 Xcode 26 中的一个全新工作流程 字符串目录在面世时 就支持从代码中提取字符串 今年 它们可以通过 为手动添加的字符串生成符号 来帮助你编写代码 我们来通过这个新的工作流程 继续构建视图 我的目标是添加导航标题 和导航副标题 现在 整个视图都处于开发阶段 通过让字符串键 与它们的值分离开来 我无需更新代码 就能对具体措辞进行迭代

    首先 点按字符串目录中的加号按钮 来添加新字符串 更受许多项目青睐的设置 是使用由大写字母组成的键 来说明字符串的语义含义 我在这里也会这么做 键应该是“TITLE” 值应该是“Discover Landmarks” 由于我手动添加了这个字符串 因此我需要自己编写注释

    属性检查器告诉我 如何在代码中使用这个字符串 这对我大有帮助! 我会分毫不差地照做!

    为了在导航栏中显示标题 我要使用视图修饰符 “.navigationTitle”

    对于它的值 键入一个前导圆点 然后开始键入表的名称 Xcode 可以为我自动补全表名称 还会推荐这个表中包含的 所有手动添加的字符串

    真简单! 请注意 这一次我不必 手动键入 bundle 和表名称

    我们再来一遍 不过针对的是导航副标题! 我要向目录添加一个新字符串 并将它命名为“SUBTITLE”

    我想让它总结一下 来自好友的帖子数量 以及属于精选内容的帖子数量 为此 我需要一个占位符 而格式说明符可以做到这一点! 首先键入 % 现在 Xcode 会 推荐几个可供使用的格式说明符 在这里 我想要数字 所以选择整数占位符

    这个占位符代表 来自好友的帖子数量 所以我将它命名为“friendsPosts”

    接下来 为精选帖子 添加另一个占位符

    然后 到了添加注释的时候

    现在 这个字符串 已经可以用在代码里了 这一次 我要使用修饰符 “navigationSubtitle”

    我再次开始键入 “.Discover” 以找到正确的表 自动补全功能会完成剩余的部分

    键入工作量少了很多! 请注意 Xcode 为我推荐了 正确的类型! 这项新功能让手动字符串 变得非常易于使用 现在 我可以依靠自动补全功能 和编译器来载入 这些本地化之后的资源! 现在 如果我稍后想要 更改字符串的值 可以直接在字符串目录中更新 而不必修改代码 你是否遇到过 曾经用多种方式拼写“OK” 后来希望通过一个简单的操作 纠正所有拼写的情况?

    为了生成在 Swift 中 感觉恰到好处的符号名称 Xcode 会使用字符串的键和值 对于不包含占位符的字符串 可以 像访问任何其他静态属性一样访问 如果字符串包含占位符 那么 Xcode 会改为生成一个函数 并使用占位符名称作为参数标签 生成符号是 LocalizedStringResource 类型 上的静态变量或函数 这项功能非常强大 因为这些符号可以用在任何使用 LocalizedStringResource 的位置! 这些位置包括文本 或按钮等 SwiftUI 视图 还有 .navigationSubtitle() 等视图修饰符 如果不使用 SwiftUI 的话 Foundation 的 String(localized: ) 也适用于 LocalizedStringResource 类型

    现在 还可以使用生成符号 来调用那些使用 LocalizedStringResource 的 自定视图和其他声明

    如果使用默认表名称“Localizable” 就可以在 LocalizedStringResource 上 直接访问你的符号 如果使用非默认表名称 那么生成符号会嵌套在 这个表的命名空间中 这意味着 你可以在以表名称 开头的代码中访问你的符号 由 Xcode 26 创建的新项目 默认启用符号生成功能 要在现有项目中使用这项功能 请打开构建设置的 “Generate String Catalog Symbols”

    我们已经看到 Xcode 现在完全支持两种不同的 字符串管理工作流程: 从代码中提取 以及使用类型安全的 API 进行引用 这就引出了一个问题: 我应该使用哪个工作流程? 我们建议你首先依靠字符串提取 你在开发 UI 的位置编写字符串 能让你更快地阅读和理解代码 使用这个工作流程时 你可以利用 Xcode 的注释生成功能 在减少键入工作量的同时 仍然可以向翻译人员提供 有意义的上下文信息 随着项目发展壮大 你可能会发现自己 想要更好地控制对字符串的整理 在这个示例中 我们建议 使用生成符号 这样可以将键 与它们的值分离开来 让你能够在不更改代码的情况下 对文本进行迭代 此外 借助 Xcode 的自动补全功能 你可以轻松引用 各个表中的字符串 最后 生成符号可以 帮助你避免框架和软件包中 出现样板代码

    这两种方法各有优势 我们认为应该由你来自由决定 哪一种方法最适合你的项目 因此 我们添加了强大的重构功能 这样你就可以 在两种方法之间轻松切换 接下来 我们在 DiscoverKit 框架中 试试这个功能! 我认为导航堆栈中的占位符文本 非常适合被符号引用 打开它的上下文菜单 然后选择 “Refactor > Convert Strings to Symbols”

    系统会打开一个预览用户界面 其中显示将会使用符号 来替代字符串的确切位置 点按突出显示的部分 可以将符号与原来的代码 进行比较

    我们将键的名称更改为 “feedTitle”让它更具语义性 还可以为 Argument 1 添加一个好名字! 我要将它命名为“newPosts” 看起来不错! 我要确认重构

    考虑了这两种方法之后 我决定对这个表中的所有字符串 使用生成符号 我们选择其余两个

    选择“Refactor”> “Convert Strings to Symbols”

    我对符号名称很满意 因此我要点按“Convert”

    整个表的重构一下子就完成了 就是这么简单! 强烈建议大家自行探索 Xcode 中的这些本地化功能 首先依靠字符串提取 来进行项目本地化 向翻译人员提供有意义的注释 可以自己编写注释 也可使用 Xcode 的注释生成功能 随着项目的复杂性越来越高 可以考虑使用生成符号 来保持对字符串的精确控制

    最后 如需详细了解字符串目录 请观看我们之前的视频 “探索字符串目录” 谢谢观看 我希望这些新功能可以帮助大家 简化本地化工作流程

    • 1:34 - Localizable strings

      // import SwiftUI
      Text("Featured Landmark", comment: "Big headline in the hero image of featured landmarks.")
      
      Button("Keep") { }
      
      // import Foundation
      String(localized: "New Collection", comment: "Default name for a new user-created collection.")
    • 6:00 - Adding a comment

      Text("Delete",
      comment: "Delete button shown in an alert asking for confirmation to delete the collection.")
      
      String(localized: "Shared by Friends", comment: "Subtitle of post that was shared by friends.")
    • 9:13 - XLIFF file

      // Field for automatically generated comments in the XLIFF
      
      <trans-unit id="Grand Canyon" xml:space="preserve">
      <source>Grand Canyon</source>
      <target state="new">Grand Canyon</target>
      <note from="auto-generated">Suggestion for searching landmarks</note>
      </trans-unit>
    • 9:58 - Localized String in the main app and a Swift Package or Framework

      // Localized String in the main app:
      Text("My Collections", 
      comment: "Section title above user-created collections.")
      
      // Localized String in a Swift Package or Framework
      Text("My Collections", 
      bundle: #bundle, 
      comment: "Section title above user-created collections.")
    • 10:56 - Localized String with a tableName parameter

      // Localized String in the main app:
      Text("My Collections",
      tableName: "Discover",
      comment: "Section title above user-created collections.")
      
      // Localized String in a Swift Package or Framework
      Text("My Collections",
      tableName: "Discover",
      bundle: #bundle, 
      comment: "Section title above user-created collections.")
    • 17:31 - Symbol usage

      // Symbol usage in SwiftUI
      Text(.introductionTitle)
      
      .navigationSubtitle(.subtitle(friendsPosts: 42))
      
      
      // Symbol usage in Foundation
      String(localized: .curatedCollection)
      
      
      // Working with generated symbols in your own types
      struct CollectionDetailEditingView: View {
          let title: LocalizedStringResource
          
          init(title: LocalizedStringResource) {
              self.title = title
          }
      }
      CollectionDetailEditingView(title: .editingTitle)
    • 0:00 - 简介
    • 在这段适合所有技能水平的代码实践过程中,你将学习如何设置 App 以进行本地化、如何与翻译人员协作,以及如何在项目规模不断增长时有效管理其中的复杂性。

    • 0:38 - 入门指南
    • 我们将介绍如何使用 Xcode 对名为“Landmarks”的 SwiftUI App 进行本地化。这一过程从添加字符串目录开始,该目录会在每次构建后自动发现可本地化的字符串。你可以自行对字符串目录进行本地化,也可以通过 XLIFF 文件与专业翻译人员协作完成翻译工作。

    • 5:33 - 翻译的语境
    • 在向翻译人员提供文件时,上下文对于准确翻译至关重要。你可以直接在代码中或在字符串目录中添加注释。Xcode 26 推出了自动注释生成功能,它使用设备端模型来分析你的代码并提供注释建议。

    • 9:33 - 管理复杂度
    • 随着项目规模不断增长,你可能希望将其组织成捆绑包或框架。使用本地化 API 标识字符串时,可以指定捆绑包和表格参数。Xcode 26 还引入了一个新的工作流程,可以自动生成字符串的符号,从而实现字符串键与值的分离。你可以选择并轻松切换两种工作流程:从代码中提取字符串,或者使用生成的符号。

    • 20:49 - 后续步骤
    • 要本地化你的 App,你可以先从代码中提取字符串,随着项目变得日益复杂,再逐步过渡到使用生成的符号,以实现更高效的字符串管理。

Developer Footer

  • 视频
  • WWDC25
  • 跟着视频学编程:使用 Xcode 探索本地化
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习与 AI
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载 (英文)
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    获取 Apple Developer App。
    版权所有 © 2025 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则