cocoa-touch - iOS App 的非英语默认语言?

标签 cocoa-touch xcode localization internationalization ios

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

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

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

developmentRegion = de;

此外,在 Info.plist 中,我有

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

没有成功。

如有任何想法,我们将不胜感激!

最佳答案

默认使用特定语言不是您应该追求的目标。假设一位居住在法国并且会说流利法语的日本用户将他的手机设置为日语。您的应用程序将默认为德语,尽管它有法语翻译;我想这不是您想要的,当然也不是用户想要的。

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

既然你不想支持英文,而是用英文开发的应用程序,你能做的最简单的事情就是在编译后立即去掉 en.lproj。这将使应用程序只保留您计划支持的语言,而 iPhone 将选择最适合用户的语言,如 iPhone 的默认设置。


删除特定本地化内容有一个非常简单的解决方案:

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

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

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

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

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


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

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

应用程序启动时发生的事情很简单:操作系统按偏好中设置的用户语言列表向下排序,直到找到匹配的本地化并使用该语言。许多应用程序默认为英语而不是德语的原因很简单,因为英语出现在大多数用户语言列表中高于德语。系统没有固有的语言偏好。如果您删除英文翻译,则只有您想要支持的语言存在,并且在这些语言中,用户列表中排名靠前的语言将被采用。

关于cocoa-touch - iOS App 的非英语默认语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4072349/

相关文章:

objective-c - 是否可以访问App Bundle的en.lproj?

objective-c - 如何将 NSDate 格式化为 NSString?

iphone - 保存时出现核心数据 Unresolved 错误

objective-c - 计算消息计数 objective-c

swift - 如何在 MacOS 中显示 NSSavePanel?

xcode - 添加资源文件到xcode

ios - 如何通过iphone通过zebra RW420打印word文档或html文档?

ios - 如何从 Date() 中提取今天、昨天并使其像工作日和月份一样本地化?

iphone - 第一个和最后一个 UITableViewCell 在滚动时不断变化

Android Studio 翻译编辑器 - 查找用法