【问题标题】:How to set language other than English as the development language and Base localization?如何将非英语语言设置为开发语言和Base本地化?
【发布时间】:2016-03-01 08:59:50
【问题描述】:

新建iOS应用的Xcode项目时,在项目(非目标)设置中我们可以看到默认启用了Use Base internationalization,并且有2个文件本地化为Development Language,即@987654332 @ 默认情况下(一个用于Main.storyboard,一个用于LaunchScreen.storyboard,两者都位于Base.lproj 目录中)。看下面的截图:

(为简单起见,以后我只提Main.storyboard。)

Main.storyboard右侧面板的本地化部分,我们可以看到Base本地化默认选中,还有一个English本地化默认未选中。看下面的截图:

而在目标的Info.plist中,有一个key名为Localization native development region(即CFBundleDevelopmentRegion),其默认值为en。请参阅下面的屏幕截图:

如果我理解正确,使用这些默认设置,开发人员可以在Main.storyboardBase 本地化中写英文,并将English 本地化保留为未选中。如果应用需要适配其他语言,开发者可以在项目本地化设置中添加本地化,​​在弹出的对话框中选择Main.storyboard。看下面的截图:

Chinese (Simplified) 为例,这将导致一个新创建的目录zh-Hans.lproj 里面有一个Main.strings 文件。 (为简单起见,我将其称为Chinese而不是Chinese (Simplified)。)开发者只需要将这个文件里面的英文字符串翻译成中文(zh-Hans.lproj目录下新建的Main.strings默认包含所有从Main.storyboardBase.lproj 中复制的英文文本)。通过这些设置,AppStore 上此应用程序描述中的Language 字段将列出英文(来自Base 本地化,因为英文是development language)和中文(来自Chinese 本地化)。在最终用户的设备上,如果系统语言为英文/中文(或英文/中文是首选语言),应用程序将使用相应的语言资源(对于英语,使用Base本地化;对于中文,使用Chinese 本地化)。对于所有其他语言偏好,英语将作为备用语言,因为CFBundleDevelopmentRegionen,所以使用Base 本地化。

所以我的第一个问题是,上述理解是否正确?总而言之,由于development language 是英语,我们不需要为情节提要文件启用English 本地化。只需使用Base 本地化并直接在情节提要文件中编写英文。我们只需要为英语以外的语言添加本地化。 (其实开启English本地化似乎很麻烦。如果开启English本地化,那么我们需要同时维护Base.lproj/Main.storyboarden.lproj/Main.strings中的文本。)

如果以上理解正确,我的第二个问题是,如何逆向实现国际化?也就是说,如果我想使用Chinese作为development language并在Base本地化中写中文,并且只为Chinese以外的语言添加本地化,​​是否可以以及如何做到这一点码?我找不到更改项目设置中的development language 的方法,以声称项目中的Base 本地化是Chinese 而不是English

【问题讨论】:

  • 这意味着你有基础(英文)和中文。如果要翻译它们,则必须在两种语言字符串中设置文本。如果语言从设置中更改,应用程序将设置翻译字符串。如果您想从您的应用程序(区域设置)设置语言,您可以使用 LocalizationSystem。 github.com/rudensm/LocalizationSystem
  • 请不要在您的应用中设置语言。您只是在寻找错误和维护噩梦。

标签: ios objective-c xcode localization internationalization


【解决方案1】:

您的理解大部分是正确的。一个小的澄清:如果用户使用某种第三种语言(例如俄语)运行,则应用程序不一定会以英语运行。相反,该应用程序将以用户喜欢的它支持的第一种语言运行。从 iOS 8 及更高版本开始,用户可以拥有一个列表首选语言,例如“俄语、法语、中文、英语”。对于这个假设的用户,应用程序实际上会以中文运行,因为它在列表中比英文更早。

要回答您关于更改开发语言的问题,这并不简单,但可以做到。具体来说:

  1. 首先添加您想要作为基本语言的语言。 取消选中 Xcode 为您提供本地化的所有文件。
  2. Info.plist(如您所见)中,将开发区域更改为您希望作为基本语言的语言。请注意,该属性的名称有点错误,因为它的值应该是语言代码(带有可选的国家/地区代码),而不是地区或国家/地区代码。
  3. 在 Xcode 中关闭您的项目。在另一个代码编辑器中,打开 projectname.xcodeproj/project.pbxproj 并搜索 developmentRegion。您应该会看到类似developmentRegion = English; 的行。将其更改为引用您在 Info.plist 文件中输入的相同语言。
  4. 在 Xcode 中重新打开项目。浏览所有可本地化的文件并选中英语旁边的框以生成可本地化的资源。请注意,对于故事板和 xib,Xcode 可能会创建故事板而不是字符串文件。如果发生这种情况,只需将文件类型更改为字符串文件。

这是我使用fr 作为基本语言的结果示例:

【讨论】:

  • 我没有选择取消选中 xcode 提供给我的所有文件。所以我离开了午餐屏幕,完成该过程后,我只想进入午餐屏幕并取消选中右侧菜单中的文件。
  • 您在什么时候添加了您的第二语言(英语),以及您是如何设法在第一个屏幕截图(“本地化”)中去掉“Base”的,即使勾选了“Use Base Internationalization” ?我遵循了这些步骤,但我必须选择其中一个文件,否则 Xcode 没有添加新语言,所以我按照 Idan 的建议离开了“LaunchScreen”。我按照您的描述更改了开发语言,但并没有摆脱“Base”。为情节提要取消勾选它会询问我是否要移动并替换它,然后我收到一个错误(“不包含 UTF-16 编码的有效数据”)。
  • 顺便说一句,更改文件中的“developmentRegion”也会在“Localizations”中创建一个带有“0 Files Localized”的新列表条目。