gpt4 book ai didi

ios - 为什么我的 iOS 应用程序只能在首次运行时正确检测到当前语言?

转载 作者:IT王子 更新时间:2023-10-29 07:56:17 24 4
gpt4 key购买 nike

我正在本地化我的 iOS 应用程序,并且在模拟器中它每次都以我选择的语言正确运行。

在我的 iPhone 5 上进行测试时,它只会在应用程序首次运行时正确检测到语言。每次我在设备上重新编译和运行我的应用程序时,它都会检测到“en”作为语言,即使我正在测试时选择了 Español(“es”)。

我使用以下方法检测语言:

[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]

我还用过:

[[NSLocale preferredLanguages] objectAtIndex:0]

同样的结果。

如果我在第一次运行后终止应用程序,并在设备上重新启动它,它会继续正确检测语言。

但如果我终止该应用程序,然后在初始运行后通过 Xcode 重新编译/重新启动,它将加载并检测到“en”(英语)。

在那之后,除非我完全删除该应用程序,然后通过 Xcode 重新编译/重新安装/运行该应用程序,否则终止并重新启动该应用程序会持续检测为英语。然后循环重复...随后重建/重新启动而不先从设备中删除应用程序会导致误检测。

我设备上的所有其他应用程序始终以西类牙语显示。整个 UI 以西类牙语显示。

更新:我现在已经在同样运行 iOS 6 的 iPad(第 3 代)上进行了测试,并且遇到了相同的行为。

更新 2:

在 didFinishLaunchingWithOptions 中,我有这段代码来检测语言:(语言是一个 NSString*):

language = [[NSLocale preferredLanguages] objectAtIndex:0];

在这个调试语句之后,比较我得到的值,以及检测它的稍微不同的方式,只是为了调试:

NSLog(@"Detected language: %@/%@", language, [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0]);

当应用程序在西类牙语模式下正常运行时,输出显示为“检测到的语言:es/es”,否则显示为“检测到的语言:en/en”。仍然不知道为什么它有时决定加载为英语...

更新 4: 感谢大家的回答,我已经尝试了各种建议。不幸的是,我无法授予 +100 赏金,因为似乎没有任何建议可以解决问题。如果有人最终找到适合我的解决方案,我会在那个时候再奖励他们 +50。

更新 5: 我已经从 Xcode 4.5 更新到 4.5.2,并且遇到了同样的问题。

更新 6: 我现在已经从头开始创建了一个新的测试项目,它运行得非常好!显然,我的项目布局方式或其中一个数据文件中一定有问题。我想我的下一个旅程将是从头开始重新创建项目,一个一个地复制文件数据......

更新 7(几个月后): 可悲的是,在通过煞费苦心地重新创建我的项目暂时(看似)解决了这个问题之后,我再次面临这个问题。在第一次加载时,语言被正确呈现,但在随后的加载中,它恢复为英语。

已解决 查看我的最终解决方案 below .感谢大家的帮助。我可能会分发一些赏金,因为无论如何它都会被浪费掉。

最佳答案

几个月后我终于解决了这个问题!感谢所有人的帮助(我还通过开发 channel 与 Apple 开发人员进行了一些交流)。

TL;DR:我不小心在设备之间同步语言首选项(以及许多其他意想不到的事情),使用我的应用程序的 iCloud 键值存储(通过 MKiCloudSync)!继续阅读...

我正在使用名为 MKiCloudSync 的第三方类,它有助于将 [NSUserDefaults standardUserDefaults] 同步到我的应用程序的 iCloud 键值存储。当我开始使用它时,我的意图是让它在后台处理一些用户收藏夹同步。

但是,不了解standardUserDefaults 是如何工作的,我没有意识到除了我自己的自定义之外,还有很多其他的东西被写入standardUserDefaults应用程序设置!

所以发生的事情是这样的:

  1. 首次启动应用程序。新鲜的 standardUserDefaults 就位,并且存储语言偏好排序列表的内部“AppleLanguages”键根据当前设备选择是正确的。

  2. 应用以指定语言正确显示。

  3. 在后台,MKiCloudSync 将所有 standardUserDefaults 同步到 iCloud。相反,如果您在别处运行此应用程序,例如使用英语设置设备,该设备也会将其语言设置同步到 iCloud。所以现在这个当前正在运行的应用程序实际上已经覆盖了它的语言首选项。

  4. BOOM ... 下次运行该应用程序时,无论您在设备上选择了什么,都会使用从 iCloud 下载的任何语言作为默认语言!

我打算如何解决下一次应用更新的问题:

  1. 使用 forked version of MKiCloudSync允许仅同步列入白名单的 key 名称。

  2. 添加将执行一次性清理的代码,首先清理我的应用程序的 iCloud keystore ,然后 ( based on this SO answer ),调用此代码重置用户默认值:

    NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

到目前为止,在我的测试中,这种方法解决了这个问题......不幸的是,用户必须重新启动应用程序才能启动语言修复。但是,我的猜测是大多数用户没有遇到这个问题,因为他们不太可能使用具有不同默认语言的多种设备。

关于ios - 为什么我的 iOS 应用程序只能在首次运行时正确检测到当前语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13579623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com