如何在 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.storyboard
和 LaunchScreen.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 中做到这一点的:
- 通过小“+”按钮将“德语 (de)”添加到“本地化”列表。在新的
Choose files and reference language to create German localization
pop-up 中,默认情况下每个故事板文件都应该已经被勾选。这会在左侧的项目导航器中为所有故事板添加 .strings (German)
个本地化文件:
- 在
Main.storyboard
的文件检查器中勾选“本地化”部分的“英语”框(这可能需要一段时间)。这会在项目导航器中添加一个额外的 Main.strings (English)
文件。对每个故事板重复此步骤,包括启动屏幕。
- 要更改“开发语言”,这是应用程序默认使用的语言,而且如果它不支持用户在其设备语言设置中设置的任何语言,请关闭 Xcode,然后用文本编辑器打开项目的
.xcodeproj
文件(我用的是免费的 BBEdit)。应该有一个文件列表,包括 project.pbxproj
。打开它并将 developmentRegion
(= 开发语言)设置为您在步骤 1 中添加的语言的语言代码,因此在我的例子中为“de”。不要使用不同的代码(例如添加“German (de)”但将其设置为“de_CH”),因为这会创建额外的本地化。
- 现在有两种方法可以完成这部分本地化:
- 一个。保持原样。情节提要中的更改不会影响任何
.strings
文件。优点:可以直接编辑文本(无需使用故事板),如果您不是负责翻译的人,这将非常有用。缺点:您无法在故事板中快速查看和测试对翻译的更改,但必须 运行 模拟器或实际设备中的应用程序。
- 乙。使用默认语言作为“基本”语言:取消勾选每个故事板的“德语”,然后点击 pop-up 中的“删除”,这会删除列表中的本地化。这样,故事板的更改会影响默认语言,从而更容易测试更改。
我用的是B版:
重要提示:
这些.strings
文件仅用于故事板!如果您还想在 运行 时使用 NSLocalizedString
设置本地化文本(例如错误对话框),则您必须添加一个额外的 Localizable.strings
文件(更多详细信息 here ):
File
- New
- File
- Strings File
- 称之为 Localizable.strings
- 在其文件检查器中单击“本地化”,然后选择一种您希望在代码中使用的语言。
- 之后,同样在文件检查器中,您可以在“本地化”部分(包括开发语言)勾选其他语言。
奖金信息:
您可以通过方案更改模拟器的应用语言:
Product
- Scheme
- Edit Scheme
- Run
(左侧) - Options
选项卡(右侧) - App Language
您还可以显示当前所选 UIViewController
的预览,并在不启动模拟器的情况下更改其显示语言:
Editor
- Preview
- 在右侧的新预览window中,右下角有一个按钮
免责声明: 我通过测试不同的东西找到了这个解决方案,因为目前没有这方面的教程(使用最新的 Xcode 版本)。如果这不是进行本地化的“正确”方法,请post你自己的答案,我会检查一下。
我写这个问题是因为不幸的是,Whosebug(甚至 Apple 的开发者网站)上关于这个主题的很多信息都已经部分过时了:
我想在我的 Xcode 12.5/Swift 5/iOS 12.3+ 应用程序中支持多种语言:德语作为默认语言,英语作为“后备”。
目前“信息”选项卡列出了两种“本地化”语言:
我的 Main.storyboard
和 LaunchScreen.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 中做到这一点的:
- 通过小“+”按钮将“德语 (de)”添加到“本地化”列表。在新的
Choose files and reference language to create German localization
pop-up 中,默认情况下每个故事板文件都应该已经被勾选。这会在左侧的项目导航器中为所有故事板添加.strings (German)
个本地化文件:
- 在
Main.storyboard
的文件检查器中勾选“本地化”部分的“英语”框(这可能需要一段时间)。这会在项目导航器中添加一个额外的Main.strings (English)
文件。对每个故事板重复此步骤,包括启动屏幕。
- 要更改“开发语言”,这是应用程序默认使用的语言,而且如果它不支持用户在其设备语言设置中设置的任何语言,请关闭 Xcode,然后用文本编辑器打开项目的
.xcodeproj
文件(我用的是免费的 BBEdit)。应该有一个文件列表,包括project.pbxproj
。打开它并将developmentRegion
(= 开发语言)设置为您在步骤 1 中添加的语言的语言代码,因此在我的例子中为“de”。不要使用不同的代码(例如添加“German (de)”但将其设置为“de_CH”),因为这会创建额外的本地化。
- 现在有两种方法可以完成这部分本地化:
- 一个。保持原样。情节提要中的更改不会影响任何
.strings
文件。优点:可以直接编辑文本(无需使用故事板),如果您不是负责翻译的人,这将非常有用。缺点:您无法在故事板中快速查看和测试对翻译的更改,但必须 运行 模拟器或实际设备中的应用程序。
- 乙。使用默认语言作为“基本”语言:取消勾选每个故事板的“德语”,然后点击 pop-up 中的“删除”,这会删除列表中的本地化。这样,故事板的更改会影响默认语言,从而更容易测试更改。
我用的是B版:
重要提示:
这些.strings
文件仅用于故事板!如果您还想在 运行 时使用 NSLocalizedString
设置本地化文本(例如错误对话框),则您必须添加一个额外的 Localizable.strings
文件(更多详细信息 here ):
File
-New
-File
-Strings File
- 称之为Localizable.strings
- 在其文件检查器中单击“本地化”,然后选择一种您希望在代码中使用的语言。
- 之后,同样在文件检查器中,您可以在“本地化”部分(包括开发语言)勾选其他语言。
奖金信息:
您可以通过方案更改模拟器的应用语言:
Product
- Scheme
- Edit Scheme
- Run
(左侧) - Options
选项卡(右侧) - App Language
您还可以显示当前所选 UIViewController
的预览,并在不启动模拟器的情况下更改其显示语言:
Editor
- Preview
- 在右侧的新预览window中,右下角有一个按钮
免责声明: 我通过测试不同的东西找到了这个解决方案,因为目前没有这方面的教程(使用最新的 Xcode 版本)。如果这不是进行本地化的“正确”方法,请post你自己的答案,我会检查一下。