我正在为欧洲的客户开发一款应用程序。我是美国的英语演讲者。我们的应用程序将支持多种语言,但不支持英语。我的应用程序中的所有字符串都在翻译的Localized.strings文件中,为不同的语言正确设置,并且当设备设置为正确的语言时它们都正常工作(设备的语言是德语= app正确地为德语本地化) 。
如果设备未设置为我们支持的某种语言(例如,设置为英语的手机),则会出现问题。在这种情况下,我们希望手机能够回归德国,但事实并非如此。我们看到的是,手机正在使用Settings.app的国际部分中语言列表中最高的语言。对于我的手机,列表中最高的非英语语言是法语,所以当我运行应用程序时,它是本地化的法语。如果我将手机更改为德语,然后返回英语(这会更改语言列表中的顺序),则应用程序将本地化为德语。
对于不受支持的语言,如何确保应用默认为德语?我使用this tutorial来设置项目的语言环境。这包括删除首次本地化文件时创建的默认“英语”区域设置。在项目文件中,我添加了:
developmentRegion = de;
另外,在Info.plist中,我有
<key>CFBundleDevelopmentRegion</key>
<string>de</string>
没有成功。
任何想法,将不胜感激!
违反特定语言不是你应该努力的。假设一个住在法国并能说一口流利法语的日本用户将他的手机设置为日语。您的应用程序默认为德语,尽管它有法语翻译;我猜这不是你想要的,而且肯定不是用户想要的。
出于这个原因,我建议尊重用户设置的语言优先级。
既然你不想支持英语但是用英语开发了App,那么你最简单的方法就是在编译之后立即摆脱en.lproj
。这将使应用程序只使用您计划支持的语言,iPhone将选择最适合用户的语言,如iPhone的默认设置。
删除特定本地化有一个非常直接的解决方案:
让Xcode使用所有当前本地化构建应用程序,并且在删除代码签名之前删除en.lproj
文件夹,并且该语言的所有本地化文件都消失了。您可以通过向目标添加运行脚本构建阶段来轻松完成此操作,其中包含以下一行代码(它是一个Bash脚本):
rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj"
代码签名总是在所有构建阶段完成后启动,因此只需将构建阶段放在当前阶段的末尾即可。
请注意,这会增加构建时间,因为Xcode会重新创建所有英文文件,因此您可能希望在测试期间禁用此步骤。
我希望这对你来说是一个可行的解决方案。
关于“如果不存在适当的本地化,应用程序必须回退到德语”:
问题是什么是适当的本地化?如果用户的第三个选择是法语(在2种不支持的语言之后),此解决方案将使应用程序回归到法语,这是一个适当的本地化。比手动设置用户的第五选择德语更合适。
应用程序启动时会发生什么变化很简单:操作系统会按照“首选项”中的设置下降用户语言列表,直到找到匹配的本地化并使用此语言。许多应用程序默认使用英语而非德语的原因仅仅是因为英语出现在德语以上的大多数用户语言列表中。系统没有固有的语言偏好。如果删除英文翻译,则只会显示您要支持的语言,并且在这些语言中,将使用用户列表中较高的语言。
我不喜欢发布这个答案,因为它违反了Apples人机界面指南。本地化是用户应该设置的东西,而不是管理层应该决定的东西,因此需要某种默认语言的管理者不会理解任何东西,应该改变业务。
话虽如此,有一种方法可以按特定顺序强制iOS使用某些语言。我主要使用它来调试本地化而不需要将设备语言设置为其他东西,是否可以使用它来解决这个问题中我不知道的不存在的问题。
用户默认值中有一个关键的AppleLanguages
,它决定了要使用的语言顺序,通常设置为用户在iOS首选项中设置的顺序。如果您更改此订单,应用程序将首先尝试按该顺序查找本地化。您可以做的是阅读当前语言首选项并决定默认为德语,如下所示:
NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil];
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"];
请注意,您需要在main.m
之前在UIApplicationMain
中执行此操作,否则您需要重新启动应用程序才能使此更改生效。
我不能说明没有人应该在真实的应用程序中执行此操作,除非您一直执行并实现允许用户手动更改语言的首选项设置。如果您只是默认使用给定语言,则用户无法更改您的选择。
要将默认语言作为特定语言,以下代码的工作方式类似于此页面中已描述的魅力。这是swift版本:( Swift 4.2)
let arr = NSArray(objects: "ja")
UserDefaults.standard.set(arr, forKey: "AppleLanguages")
在didFinishLaunchingWithOptions()函数中尝试这个
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
int retVal = UIApplicationMain(argc, argv, nil, nil);