iOS应用的非英语默认语言是什么?

40

我正在为一个欧洲客户开发一款应用程序,我是美国的英语用户。我们的应用程序将支持多种语言,但不包括英语。我已经将所有字符串放在本地化字符串文件中,并针对不同语言正确设置,当设备设置为正确的语言时(设备的语言为德语=应用程序正确地本地化为德语),它们都可以正常工作。

但是如果设备没有设置为我们支持的语言之一,例如我的手机设置为英语,就会出现问题。我们希望在这种情况下,手机会回退到德语,但这并没有发生。我们看到的是,手机使用的语言是在“设置”应用程序的“国际”部分的语言列表中排名最高的语言。对于我的手机,在列表中最高的非英语语言是法语,因此当我运行应用程序时,它被本地化为法语。如果我将我的手机更改为德语,然后再改回英语(这会改变语言列表中的顺序),那么应用程序会本地化为德语。

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

developmentRegion = de;

此外,在 Info.plist 文件中,我有以下内容:

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

没有成功。

欢迎任何想法!

4个回答

46

将默认语言设为特定语言并非你应该追求的目标。假设一个在法国居住并流利说法语的日本用户将手机设置为日语,你的应用会默认使用德语,尽管它已有法语翻译;我猜这不是你想要的,也肯定不是用户想要的。

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

如果你不想支持英语但已经用英语开发了应用程序,最简单的方法就是在编译后立即删除 en.lproj。这样做会让应用只剩下你计划支持的语言,并且iPhone会选择最适合用户设置的语言作为显示语言。


有一个相当直接的解决方案可以删除特定的本地化文件

让Xcode构建包含所有本地化的应用程序,在代码签名前删除en.lproj文件夹,所有该语言的本地化文件都会被删除。你可以通过将这一行代码(它是一个Bash脚本)添加到目标的运行脚本构建阶段中轻松完成:

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

代码签名总是在所有构建阶段完成后启动,因此只需将该构建阶段放在当前阶段的末尾。

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

我希望这对您是可行的解决方案。


关于“如果没有适当的本地化,则应用程序必须回退到德语”

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

应用程序启动时会发生什么很简单:操作系统按照首选项中设置的用户语言列表向下匹配,直到找到匹配的本地化,并使用此语言。 许多应用程序默认使用英语而不是德语的原因只是因为英语出现在大多数用户语言列表中比德语更靠前。 系统没有固定的语言偏好。 如果删除英语翻译,则只使用您要支持的语言,其中用户列表中排名更高的语言将被采用。


2
我还在考虑这个答案。虽然这显然是一个经过深思熟虑的回答,但归根结底,业务要求仍然是如果不存在适当的本地化,则应用程序必须回落到德语;这对客户来说是不可谈判的。有趣的是,正如我在问题标题中所暗示的那样,如果在项目中保留了 English.lproj 文件夹,则它将被用作回退,当没有其他本地化可用时。如果我想不出其他办法,我就继续保留那个文件夹,并将 "de" 资产复制到其中。 - James J
2
不,英语也不是系统默认语言。简单来说,操作系统有一个本地化列表,可以在偏好设置中进行设置。启动应用程序时,它会查找相应的*.lproj文件夹,并使用与列表中语言匹配的第一个文件夹。这就是为什么当没有其他语言可用时,它会使用英语。;) 但我知道另一个诀窍,将制定新答案... - Pascal
2
苹果的文档使人们认为iOS不支持语言优先级(仅在OS X中支持):因为基于iOS的设备仅支持一个用户,因此一次只能选择一种语言。在Mac OS X中,“语言和文本”系统首选项面板允许用户指定首选语言和一个或多个备用语言,以防首选语言不可用。 - Jon-Eric
4
@Jon-Eric:确实,iOS不像OS X一样提供相同的语言优先级设置,但在内部它是这样工作的。如果你将语言更改为例如日语,然后再改回例如英语,日语将被视为您的第二选择。试试并查看[NSLocale preferredLanguages]的输出。但确实这对用户来说并不明显,我忘了在iOS上你不能重新排列语言,只能选择你的首选语言。 - Pascal
聪明的回答 :) 我已经编辑了路径以适应iOS 6。 - user1071136
显示剩余2条评论

14

我并不喜欢发表这个答案,因为它违反了苹果的人机界面指南。本地化是用户应该设置的内容,而不是管理层应该决定的事情,因此要求特定默认语言的管理者并不理解这一点,应该改变业务。

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

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

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

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

我无法强调这一点:除非您全力以赴地实现允许用户手动更改语言的偏好设置,否则在真正的应用程序中没有人应该这样做。如果您仅默认为给定语言,则用户无法更改您的选择。


4
我们有一个现实世界的例子,不违反任何HIG或其他规定。此外,我感谢Pascal回答了问题(虽然是在找借口之后)。我讨厌那些回答与技术问题无关的建议/忠告/指导的人:你要么回答,要么不回答... 无论如何,这个案例是:我们正在开发一个国际市场的应用程序(因此是英语),但我们必须为意大利客户提供定制版本。代码库相同,我们希望根据客户的要求强制使用意大利语的定制版本。无论用户设置如何(例如,在我的开发iPad上)。 - zontar
1
这很有用,但是如果我在启动闪屏中使用国际化,它不会显示正确的图片,即使我将代码放在main.m文件中,你知道我该如何修复吗?谢谢。 - JERC
HIG 是一组指南(而不是规则),有其原因。在我的情况下,该应用程序是一个销售点企业应用程序,并且需要以商店所在地的货币进行交易。从服务器数据库检索到的价格为欧元、美元、日元或其他货币。如果用户将语言环境设置为其他内容,则会发生糟糕的事情。不幸的是,在 main.m 之后,我的应用程序无法获取商店(即服务器)的语言环境。除了比较设备的语言环境与商店要求的语言环境并显示警报之外,我还有其他选择吗? - Kevin OMara
@KevinOMara 由于商店需要特定的货币,我甚至不会费心使用本地化,而是直接使用商店要求你使用的货币。 - Pascal
1
@zontar 只是现在看到了你的评论。按照我接受的答案,编写一个构建脚本来删除除意大利语以外的所有语言会更好。问题解决了。 - Pascal
4
@zontar:我不同意。不对这种违反准则的行为进行评论会激励人们在不考虑后果的情况下去做。如果你有充足的理由去违反准则,那么好吧,它们只是准则,如果必要,你可以违反它们,并且Pascal已经给了你一个详细的答案让你这样做。但是,如果你没有充分的理由去违反准则,就请避免这样做。这些建议很好。它不会伤害你,而且它将防止很多其他开发人员在不知情的情况下犯错。 - KPM

-1

为了将默认语言设置为特定语言,以下代码非常有效,已在此页面中进行了描述。这是Swift版本:(Swift 4.2)

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

-1
尝试在你的didFinishLaunchingWithOptions()函数中加入以下代码
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
int retVal = UIApplicationMain(argc, argv, nil, nil);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接