iOS App的非英语默认语言?

时间:2010-11-01 19:24:03

标签: cocoa-touch xcode localization internationalization ios

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

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

对于不受支持的语言,如何确保应用默认为德语?我使用this tutorial来设置项目的语言环境。这包括删除首次本地化文件时创建的默认“英语”区域设置。在项目文件中,我添加了:

developmentRegion = de;

另外,在Info.plist中,我有

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

没有成功。

任何想法都将不胜感激!

4 个答案:

答案 0 :(得分:44)

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

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

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


删除特定的本地化有一个非常直接的解决方案:

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

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

代码签名总是在所有构建阶段完成后开始,所以只需将构建阶段放在当前阶段结束时。

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

我希望这对你来说是一个可行的解决方案。


关于“如果不存在适当的本地化,应用必须回归德语”

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

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

答案 1 :(得分:14)

我不喜欢发布这个答案,因为它运行反对 Apples人机界面指南。本地化是用户应该设置的东西,而不是管理层应该决定的东西,因此需要某种默认语言的管理者什么都不懂,应该改变业务。

话虽如此,有一种方法可以按特定顺序强制iOS使用某些语言。我主要使用它来调试本地化而不需要将设备语言设置为其他东西,是否可以使用它来解决这个我不知道的问题中不存在的问题。

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

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

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

我无法说明没有人应该在真实的应用程序中执行此操作,除非您一直执行并实现允许用户手动更改语言的首选项设置。如果您只是默认使用某种语言,则用户无法更改您的选项。

答案 2 :(得分:0)

要使默认语言成为一种特定的语言,此下面的代码就像在本页中已描述的超级按钮一样工作。这是Swift版本:(Swift 4.2)

let arr = NSArray(objects: "ja")
UserDefaults.standard.set(arr, forKey: "AppleLanguages")

答案 3 :(得分:-1)

在didFinishLaunchingWithOptions()函数

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