iOS App的非英语默认语言?

Jam*_*s J 37 xcode cocoa-touch localization internationalization ios

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

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

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

developmentRegion = de;
Run Code Online (Sandbox Code Playgroud)

另外,在Info.plist中,我有

<key>CFBundleDevelopmentRegion</key>
<string>de</string>
Run Code Online (Sandbox Code Playgroud)

没有成功.

任何想法,将不胜感激!

Pas*_*cal 44

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

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

既然你不想支持英语但是用英语开发了应用程序,那么你最简单的方法就是en.lproj在编译之后立即摆脱它.这将使应用程序只使用您计划支持的语言,iPhone将选择最适合用户的语言,如iPhone的默认设置.


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

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

rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj"
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

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

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

  • @ Jon-Eric:iOS确实没有提供与OS X相同的语言优先级,但是在内部它以这种方式工作.如果您将语言更改为例如日语,则返回例如英语,日语将被视为您的第二选择.试试看看[NSLocale preferredLanguages]的输出.但实际上这对用户来说并不明显,我忘了你不能重新排列,只是在iOS上选择你喜欢的语言. (4认同)
  • 我还在考虑这个答案.虽然这显然是一个经过深思熟虑的回应,但在一天结束时,业务要求仍然是在没有适当的本地化的情况下应用程序必须回归德语; 这与客户无法协商.有趣的是,我在问题的标题中提到的是,如果将English.lproj文件夹保存在项目中,则在没有其他本地化可用时将其用作后备.如果我无法解决任何问题,我会保留该文件夹,并在那里复制"de"资产. (2认同)
  • 不,英语也不是系统默认值.很简单,操作系统有一个本地化列表,在首选项中设置.启动应用程序时,它会查找相应的*.lproj文件夹,并使用与列表中的语言匹配的第一个文件夹.这就是为什么它在没有其他任何东西时使用英语的原因.;)但我知道另一个技巧,将制定一个新的答案...... (2认同)
  • [Apple的文档](http://developer.apple.com/library/ios/#documentation/MacOSX/Conceptual/BPInternational/Articles/InternatSupport.html)听起来像iOS**不支持语言优先级(仅限OS X支持):*由于基于iOS的设备仅支持一个用户,因此一次只能选择一种语言.在Mac OS X中,语言和文本系统首选项面板允许用户指定首选语言和一种或多种后备语言,以防首选语言不可用.* (2认同)

Pas*_*cal 14

我不喜欢发布这个答案,因为它违反了 Apples人机界面指南.本地化是用户应该设置的东西,而不是管理层应该决定的东西,因此需要某种默认语言的管理者不会理解任何东西,应该改变业务.

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

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

NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil];
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"];
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我们有一个现实世界的例子,不会破坏任何HIG或任何.此外,我感谢Pascal的回答(尽管是在一次事故之后).我讨厌当人们回答一个与技术问题无关的建议/咨询/指导时:要么你回答,要么你不回答......无论如何,案件:我们正在开发一个适用于国际市场的应用程序(因此,它在英语)但我们必须为意大利客户提供定制版本.代码库是相同的,我们希望**强制**(根据客户端请求)意大利语的自定义版本.无论用户设置如何(即在我的开发iPad上) (3认同)
  • @zontar:我不同意.没有评论如何打破指导方针会激励人们在不考虑后果的情况下这样做.如果你有充分的理由违反指导方针,那么,它们只是指导方针,你可以根据需要打破它们,而Pascal给你一个详细的答案,让你做到这一点.但如果你没有强有力的理由违反指导方针,那就克制一下吧.建议就在那里,这很好.它不会伤害你,它会阻止很多其他开发人员在不知情的情况下做错事. (3认同)