Cocoa touch iOS应用程序的非英语默认语言?

Cocoa touch iOS应用程序的非英语默认语言?,cocoa-touch,xcode,localization,internationalization,ios,Cocoa Touch,Xcode,Localization,Internationalization,Ios,我正在为欧洲的一个客户开发一个应用程序。我在美国说英语。我们的应用程序将支持多种语言,但不支持英语。我已将应用程序中的所有字符串翻译成本地化的.strings文件,并针对不同的语言进行了正确设置,当设备设置为正确的语言(设备的语言为德语=应用程序已正确本地化为德语)时,它们都能正常工作 如果设备未设置为我们支持的语言之一,则会出现问题,例如,在设置为英语的手机上。在这种情况下,我们希望手机能回到德国,但这并没有发生。我们看到的是,手机使用的语言在Settings.app的Internationa

我正在为欧洲的一个客户开发一个应用程序。我在美国说英语。我们的应用程序将支持多种语言,但不支持英语。我已将应用程序中的所有字符串翻译成本地化的.strings文件,并针对不同的语言进行了正确设置,当设备设置为正确的语言(设备的语言为德语=应用程序已正确本地化为德语)时,它们都能正常工作

如果设备未设置为我们支持的语言之一,则会出现问题,例如,在设置为英语的手机上。在这种情况下,我们希望手机能回到德国,但这并没有发生。我们看到的是,手机使用的语言在Settings.app的International部分的语言列表中排名最高。对于我的手机来说,列表中最高的非英语语言是法语,所以当我运行应用程序时,它被本地化为法语。如果我把手机换成德语,然后又换回英语(这会改变语言列表中的顺序),那么应用程序就会本地化为德语

对于不受支持的语言,如何确保应用程序默认为德语?我过去常常为项目设置区域设置。这包括删除第一次本地化文件时创建的默认“英语”区域设置。在项目文件中,我添加了:

developmentRegion = de;
另外,在Info.plist中,我有

<key>CFBundleDevelopmentRegion</key>
<string>de</string>
CbundledDevelopmentRegion
判定元件
没有成功


任何想法都将不胜感激

默认使用某一特定语言不是您应该努力的目标。假设一位居住在法国且法语流利的日本用户将手机设置为日语。你的应用程序将默认为德语,尽管它有法语翻译;我想这不是你想要的,也肯定不是用户想要的

因此,我建议尊重用户设定的语言优先级

由于您不想支持英语,但已经用英语开发了应用程序,因此您可以做的最简单的事情就是在编译后立即删除
en.lproj
。这将使应用程序只支持您计划支持的语言,而iPhone将选择最适合用户的语言,如iPhone的默认设置


有一个非常简单的解决方案来删除特定的本地化:

让Xcode使用所有当前本地化来构建应用程序,在代码签名开始之前,删除
en.lproj
文件夹,该语言的所有本地化文件都将消失。您可以通过向目标添加一个运行脚本构建阶段来轻松实现这一点,该阶段包含以下一行代码(这是一个Bash脚本):

代码签名总是在所有构建阶段完成后开始,所以只需将该构建阶段放在当前阶段的末尾即可

注意这会增加构建时间,因为Xcode会重新创建所有英文文件,所以您可能希望在测试期间禁用此步骤

我希望这是一个可行的解决方案


关于“如果不存在适当的本地化,应用程序必须退回到德语”:

问题是什么是适当的本地化?如果用户的第三选择是法语(在两种不受支持的语言之后),此解决方案将使应用程序退回法语,这是一种适当的本地化。比手动设置用户的第五个选项(德语)更合适


应用程序启动时发生的事情很简单:操作系统会按照“首选项”中的设置,从“用户语言”列表中向下搜索,直到找到匹配的本地化并使用此语言。许多应用程序默认为英语而不是德语的原因很简单,因为英语出现在大多数用户语言列表中,高于德语。系统没有固有的语言偏好。如果删除英文翻译,则只有您想要支持的语言存在,并且在这些语言中,用户列表中较高的一种语言被采用。

我不喜欢发布此答案,因为它违背了苹果的人机界面准则。本地化是用户应该设置的,而不是管理层应该决定的,因此需要某种默认语言的管理者什么都不懂,应该改变业务

也就是说,有一种方法可以强制iOS按照一定的顺序使用特定的语言。我主要使用它来调试本地化,而不需要将设备语言设置为其他语言,是否可以使用它来解决这个问题中不存在的问题,我说不上来

用户默认设置中有一个键
AppleLanguages
,指示要使用的语言顺序,通常设置为用户在iOS首选项中设置的顺序。如果您更改此顺序,应用程序将首先尝试按该顺序查找本地化。您可以阅读当前的语言首选项,并决定默认为德语,如下所示:

NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil];
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"];
请注意,您需要在
UIApplicationMain
之前在
main.m
中执行此操作,否则您需要重新启动应用程序才能使此更改生效


我不能说任何人都不应该在真正的应用程序中这样做,除非你千方百计实现一个允许用户手动更改语言的首选项设置。如果您只是默认使用一种给定的语言,则用户没有选择权更改您的选择。

请在didfishlaunchingwithoptions()函数中尝试此操作


为了使默认语言成为一种特殊的语言,下面的代码就像本页中已经描述的符咒一样工作。以下是swift版本:(swift 4.2)


Pascal给出了正确的答案:应用程序将退回到下一个最合理的本地化;这是出于设计,也是iOS和MacOSX上所有应用程序的工作方式。你的应用程序并不特别。我还在考虑这个答案。虽然这显然是一个深思熟虑的回应,但在e
NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil];
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
int retVal = UIApplicationMain(argc, argv, nil, nil);
let arr = NSArray(objects: "ja")
UserDefaults.standard.set(arr, forKey: "AppleLanguages")