【问题标题】:iOS: Is there any way to fake the user's locale?iOS:有没有办法伪造用户的语言环境?
【发布时间】:2013-03-13 21:14:28
【问题描述】:

我有兴趣让我的用户选择我的应用程序显示给他们的语言/区域设置。我已经知道如何加载正确的包,选择正确的字符串文件等。但是,我仍然有一些系统项目似乎无法控制。例如,切换控件。

我有什么方法可以告诉系统这个应用现在应该以特定语言运行,而不是用户当前的系统设置?

【问题讨论】:

  • 哇-哇。 method_setImplementation(class_getInstanceMethod([NSLocale class], @selector(currentLocale)), (IMP)spoofedImpl);?
  • 有什么方法可以做到不打搅?
  • 您是否尝试过为 NSLocale 创建一个类别以返回您为类方法选择的语言环境?
  • @MarcusAdams 这比方法调配更糟糕,因为类别上的覆盖方法具有未定义的行为
  • @Mike 成为 Apple 从事 UIKit 工作的软件开发人员,创建一个允许您执行此操作的秘密/私有方法,并将其放入 iOS 的下一个版本中。

标签: ios localization nsbundle


【解决方案1】:

最简单的方法是通过NSUserDefaults:区域设置由AppleLocale(区域设置ID 作为字符串)确定,语言由AppleLanguages(语言ID 数组)中的第一个匹配项确定;您的应用可以仅为您的应用覆盖这些默认值。要检查它是否被您的应用程序覆盖,您可以使用 [defaults persistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]] objectForKey:@"AppleLocale"] 之类的东西。要删除覆盖,请使用-removeObjectForKey:。

无论您采用哪种方式,在更改语言时您可能都必须relaunch the app; OS X 和 iOS 应用根本不是为了在运行时更改语言而设计的(在 OS X 上,只有新启动的应用才能看到语言更改;在 iOS 上,系统会终止所有应用以更改语言)。

我添加了此功能以使切换语言更容易进行开发/测试;我不知道这是否会通过 App Store 审核流程。

【讨论】:

  • 谢谢@tc。听起来这可能是远离的事情,但我很欣赏详细的选择。
猜你喜欢
  • 2021-10-29
  • 2017-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多