如何在 Xcode 12(.5) 中设置基本本地化和开发语言?

How to set Base Localization & Development Language in Xcode 12(.5)?

我写这个问题是因为不幸的是,Whosebug(甚至 Apple 的开发者网站)上关于这个主题的很多信息都已经部分过时了:

我想在我的 Xcode 12.5/Swift 5/iOS 12.3+ 应用程序中支持多种语言:德语作为默认语言,英语作为“后备”。

目前“信息”选项卡列出了两种“本地化”语言:

我的 Main.storyboardLaunchScreen.storyboard 文件的文件检查器的“本地化”部分如下所示(默认情况下):

选中“Base”,这就是第一个屏幕截图显示 2 个文件的原因。

Info.plist 中的语言设置如下:

到目前为止,我还没有触及实际的本地化设置,我一直在为每个标签使用相同的语言,...在 XIB 中(可能保存在“Base”中)。

根据 Apple 的旧 Localization Guide, "Base" is the default language that is used, as long as it's included in the user's language settings (so in my case: German). The "Developer Language" is the "fallback" language that is used if the user's language settings don't include the base language (in my case: English). This Q&A page 还说:

If you adopt Base Localization, make sure that the value of CFBundleDevelopmentRegion matches the language used by your content in the Base.lproj folder.

... 并且在 this guide 中,为两个故事板启用“英语 - 开发语言”的基本本地化会向其添加 2 个本地化文件,而实际上并未向列表中添加另一个(“基本”)本地化。正如您在我的第一个屏幕截图中看到的那样,“Base”和“Development”是单独的列表条目,在早期的 Xcode 版本中并非如此。

我的第一个问题是:我是否正确理解了所有这些内容?引用将“基础”和“开发语言”视为同一事物有点令人困惑,即使您当然可以使用不是“后备”语言的默认语言。

我在上面链接的 Q&A 也详细介绍了特定语言的区域版本:

如果我的应用程序支持“德语”(语言代码:“de”)但用户的语言设置仅列出例如奥地利德语 ("de_AT"),则该应用程序仍会将其自己的语言设置为德语。假设我想使用瑞士德语 (de_CH) 作为默认语言,但用户在他的设置中只选择了奥地利德语 ("de_AT"),这仍然以同样的方式工作吗?如果您宁愿将应用程序的默认语言设置为常规的非区域性语言(德语 =“de”),即使标签...使用例如瑞士德语单词?

如何将“基本”语言更改为德语(比方说,“de_CH”)并使其显示在列表中,同时使用英语(“en”)作为“倒退”?我确实发现了一个类似的问题,但不幸的是 中描述的步骤在 Xcode 12.5 中的工作方式不同。不再。

我想达到的目标:

支持英语,但使用德语作为默认语言,如果用户的语言设置不包括英语或德语,也会使用德语。

我是如何在 Xcode 12.5 中做到这一点的:

  1. 通过小“+”按钮将“德语 (de)”添加到“本地化”列表。在新的 Choose files and reference language to create German localization pop-up 中,默认情况下每个故事板文件都应该已经被勾选。这会在左侧的项目导航器中为所有故事板添加 .strings (German) 个本地化文件:

  1. Main.storyboard 的文件检查器中勾选“本地化”部分的“英语”框(这可能需要一段时间)。这会在项目导航器中添加一个额外的 Main.strings (English) 文件。对每个故事板重复此步骤,包括启动屏幕。

  1. 要更改“开发语言”,这是应用程序默认使用的语言,而且如果它不支持用户在其设备语言设置中设置的任何语言,请关闭 Xcode,然后用文本编辑器打开项目的 .xcodeproj 文件(我用的是免费的 BBEdit)。应该有一个文件列表,包括 project.pbxproj。打开它并将 developmentRegion(= 开发语言)设置为您在步骤 1 中添加的语言的语言代码,因此在我的例子中为“de”。不要使用不同的代码(例如添加“German (de)”但将其设置为“de_CH”),因为这会创建额外的本地化。

  1. 现在有两种方法可以完成这部分本地化:
  • 一个。保持原样。情节提要中的更改不会影响任何 .strings 文件。优点:可以直接编辑文本(无需使用故事板),如果您不是负责翻译的人,这将非常有用。缺点:您无法在故事板中快速查看和测试对翻译的更改,但必须 运行 模拟器或实际设备中的应用程序。

  • 乙。使用默认语言作为“基本”语言:取消勾选每个故事板的“德语”,然后点击 pop-up 中的“删除”,这会删除列表中的本地化。这样,故事板的更改会影响默认语言,从而更容易测试更改。

我用的是B版:

重要提示:

这些.strings 文件仅用于故事板!如果您还想在 运行 时使用 NSLocalizedString 设置本地化文本(例如错误对话框),则您必须添加一个额外的 Localizable.strings 文件(更多详细信息 here ):

  1. File - New - File - Strings File - 称之为 Localizable.strings
  2. 在其文件检查器中单击“本地化”,然后选择一种您希望在代码中使用的语言。
  3. 之后,同样在文件检查器中,您可以在“本地化”部分(包括开发语言)勾选其他语言。

奖金信息:

您可以通过方案更改模拟器的应用语言:

Product - Scheme - Edit Scheme - Run(左侧) - Options 选项卡(右侧) - App Language

您还可以显示当前所选 UIViewController 的预览,并在不启动模拟器的情况下更改其显示语言:

Editor - Preview - 在右侧的新预览window中,右下角有一个按钮

免责声明: 我通过测试不同的东西找到了这个解决方案,因为目前没有这方面的教程(使用最新的 Xcode 版本)。如果这不是进行本地化的“正确”方法,请post你自己的答案,我会检查一下。