gpt4 book ai didi

ios - 在运行时更改 iOS 模拟器的当前语言环境

转载 作者:技术小花猫 更新时间:2023-10-29 10:21:50 27 4
gpt4 key购买 nike

在开发一组用于将数值和日期转换为字符串的日期计算和语言规则时,我正在编写测试来断言字符串格式化方法的结果。一个假想的断言可能看起来像这样:

NSAssert([dateString isEqualToString:@"Three days, until 6:00 PM"], @"Date string should match expectation");

但是,由于该应用程序针对多种语言进行了本地化,而且我的开发人员同事也来自不同的语言环境,因此您的设备或模拟器设置的语言环境可能与正在测试的语言环境不同写的。在这种情况下,dateString 的内容可能类似于:

@"Drie dagen, tot 18:00" // the assertion fails
@"Drei Tage, bis 18 Uhr" // the assertion also fails

这可能是也可能不是这些语言环境的正确日期表示法,但我的问题是,当底层代码像这样使用 Apple API 时,如何能够对特定语言环境运行测试:

[NSDateFormatter localizedStringFromDate:date 
dateStyle:NSDateFormatterNoStyle
timeStyle:NSDateFormatterShortStyle];

我希望在我的断言中涵盖两种或更多语言,像这样:

[NSSomething actionToSetTheLocaleTo:@"en_US"];
dateString = ...; // the formatting
NSAssert([dateString isEqualToString:@"Three days, until 6:00 PM"], @"match en_US");

[NSSomething actionToSetTheLocaleTo:@"nl_NL"];
dateString = ...; // the formatting
NSAssert([dateString isEqualToString:@"Drie dagen, tot 18:00"], @"match nl_NL");

谁知道如何实现这种效果?

注意事项:

  • 更改首选语言并不能解决问题,它还需要影响 NSDateFormatter 和 NSNumberFormatter 的行为。
  • 因为这仅用于单元测试目的,所以我对使用私有(private) API 感到满意。但是,为了其他人在这篇文章中绊倒的好处,公共(public) API 是首选。
  • 将自定义区域设置传递给每个日期或数字格式化 API 可能是最后的考虑因素,但我发布这个问题是希望避免回到那些极端措施。但是,如果您知道这是唯一的解决方案,请提供一些引用,我不会再浪费时间了

主题链接:

最佳答案

@Desmond 指出了一个可行的解决方案。在他将此信息放入此处的答案之前,让我总结一下我最终用一些代码做了什么。

事实证明,解决方案“和swizzling the methods一样简单”类方法在内部使用:

beforeEach(^{
[NSBundle ttt_overrideLanguage:@"nl"];
[NSLocale ttt_overrideRuntimeLocale:[NSLocale localeWithLocaleIdentifier:@"nl_NL"]];
});

afterEach(^{
[NSLocale ttt_resetRuntimeLocale];
[NSBundle ttt_resetLanguage];
});

您在上面看到的 ttt_... 方法使用 NSObject、NSLocale 和 NSBundle 上的类别来在运行时检查它是否应该使用原始方法或返回其他内容。这种方法在编写测试时完美无缺,虽然它在技术上不使用任何私有(private) API,但我强烈建议只在测试设置中使用它,不要用于提交给 App Store 以供审核的任何内容。

In this gist you'll find the Objective-C categories我添加到我的应用程序的测试目标以实现所需的行为。

关于ios - 在运行时更改 iOS 模拟器的当前语言环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19143808/

27 4 0
文章推荐: css - 允许