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

我正在为欧洲的客户开发一个应用程序。 我在美国是个讲英语的人。 我们的应用程序将支持多种语言,但不支持英语。 我在我们的应用程序中翻译了Localized.strings文件中的所有string,为不同的语言正确设置,当设备设置为正确的语言时,它们都可以正常工作(设备的语言是German = app正确的德语本地化) 。

如果设备未设置为我们支持的语言之一,例如在设置为英语的手机上,则会出现问题。 在这种情况下,我们希望电话能够回到德国,但是这并没有发生。 我们所看到的是手机正在使用Settings.app国际部分的语言列表中显示最高的语言。 对于我的手机,列表中最高的非英语语言是法语,所以当我运行该应用程序时,它被本地化为法语。 如果我将手机更改为德语,然后再更改为英语(这会更改“语言”列表中的顺序),然​​后该应用程序将本地化为德语。

我如何确保应用程序默认为德语不支持的语言? 我使用这个教程来设置项目的语言环境。 这包括删除首次本地化文件时创build的默认“英文”语言环境。 在项目文件中,我添加了:

developmentRegion = de; 

另外,在Info.plist中,我有

 <key>CFBundleDevelopmentRegion</key> <string>de</string> 

没有成功。

任何想法将不胜感激!

默认某种语言不是你应该争取的。 假设一个住在法国,stream利地讲法语的日本用户把他的电话设置为日语。 你的应用程序默认为德文,尽pipe它有法文翻译; 我想这不是你想要的,当然不是用户想要的。

出于这个原因,我build议尊重由用户设置的语言优先级。

既然你不想支持英文,但已经开发了英文的应用程序,最简单的事情就是编译后立即摆脱en.lproj 。 这将使应用程序只有您计划支持的语言,iPhone将select最适合用户的语言,如iPhone的默认设置。


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

让Xcode使用所有当前的本地化构build应用程序,并且在代码签名之前删除en.lproj文件夹,并且该语言的所有本地化文件都不存在了。 您可以通过向目标添加一个运行脚本构build阶段,包含这一行代码(这是一个Bash脚本)来轻松完成此操作:

 rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj" 

在所有构build阶段完成之后,代码签名总是会启动,因此只需在当前阶段结束时进行构build阶段即可。

请注意 ,这会增加构build时间,因为Xcode将重新创build所有英文文件,因此您可能希望在testing期间禁用此步骤。

我希望这是一个可行的解决scheme。


关于“在不存在适当的本地化的情况下,应用程序必须回落到德语”

问题是什么是一个适当的本地化 ? 如果用户的第三个select是法语(2种不支持的语言之后),这个解决scheme将使应用程序回落到法语,这一个适当的本地化。 比手动设置用户的第五select德语更合适。

当应用程序启动时会发生什么很简单:操作系统下降用户语言列表,如首选项中设置,直到find匹配的本地化,并使用此语言。 许多应用程序默认为英语而不是德语的原因很简单,因为英语出现在德语以上的大多数用户语言列表中。 系统没有固有的语言偏好。 如果您删除了英文翻译,则只有您想要支持的语言在那里,并且这些语言是在用户列表中更高的语言。

我不喜欢发布这个答案,因为它违背苹果人机界面指南。 本地化是用户应该设置的东西,而不是pipe理层应该决定的事情,所以需要某种默认语言的pipe理者不会理解任何东西,而应该改变业务。

这就是说,有一种方法可以强制iOS按某种顺序使用某些语言。 我主要用它来debugging本地化,而不需要将设备语言设置为其他东西,是否可以用这个来解决这个问题中不存在的问题,我不能说。

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

 NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil]; [[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"]; 

请注意,您需要在UIApplicationMain之前在main.m执行此操作,否则您需要重新启动应用程序才能使此更改生效。

我不能说足够的,任何人都不应该在真正的应用程序中这样做,除非您一路走来实现允许用户手动更改语言的首选项设置。 如果您只是默认给定的语言,则用户无权更改您的select。

在didFinishLaunchingWithOptions()函数中试试这个

 [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; int retVal = UIApplicationMain(argc, argv, nil, nil);