在运行时更改 iOS 模拟器的当前区域设置

2024-01-06

在开发一组用于将数值和日期转换为字符串的日期计算和语言规则时,我正在编写断言字符串格式化方法的结果的测试。一个虚构的断言可能如下所示:

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");

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

Notes:

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

该主题的链接:

  • Ray Lillywhite 撰写的关于 i18n 和 l10n 的好文章 http://engineering.hoteltonight.com/the-nitty-gritty-of-ios-internationalization-and-localization/
  • 关于 NSLocale 的 NSHipster 文章 http://nshipster.com/nslocale/

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

事实证明,解决方案“一样简单”调整方法 https://gist.github.com/epologee/6940612类方法内部使用:

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

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

The ttt_...您在上面看到的方法使用 NSObject、NSLocale 和 NSBundle 上的类别来在运行时检查是否应该使用原始方法或返回其他内容。这种方法在编写测试时可以完美地工作,尽管它在技术上不使用任何私有 API,但我强烈建议仅在您的测试设置中使用它,而不是用于您提交到 App Store 进行审核的任何内容。

在此要点中,您将找到 Objective-C 类别 https://gist.github.com/epologee/6940612我添加到我的应用程序中测试目标实现所需的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在运行时更改 iOS 模拟器的当前区域设置 的相关文章

随机推荐

  • 从数据框中选择和分组双类别数据

    我真的需要关于如何解决问题的帮助 我有一个看起来像这样的数据集 Name Sex Total Anna F 10 Jamie M 2 Jamie F 7 Mike M 13 Sam F 6 Sam M 3 structure list Na
  • Android:在canvas api中使用渐变填充颜色绘制圆弧

    我想使用渐变填充使用画布绘制圆弧 如何才能实现这一点呢 嘿 我从这里偷了这个 在 Android 中使用 SweepGradient 绘制圆弧 https stackoverflow com questions 4786318 draw a
  • glDrawArrays 之间的 glBufferSubData 调用重整数据

    这好像是glBufferSubData正在覆盖或以某种方式破坏我之间的数据glDrawArrays来电 我正在使用 Windows 7 64 位操作系统 并使用适用于我的 Nvidia GeForce GT520M CUDA 1GB 的最新
  • 禁用或删除 apc

    我在 ubuntu 11 04 linux 上安装了 APC 我想进行一些性能基准测试 看看没有 APC 的 PHP 的速度有何改进 但我不知道如何禁用 删除 APC 我尝试清空 apc ini 文件 但没有成功 尽管如此 在我第一次加载页
  • 使用 UIModalPresentationFormSheet 的模态视图出现在屏幕外

    我有一个 UIViewController 实现 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation Return
  • 身份服务器 4 上出现“客户端密钥验证失败”错误

    我正在尝试使用 client credentials 从我的 Identity Server 4 获取访问令牌 我想我几乎通过搜索完成了 Google 页面 但我什么也没找到 所以 请 这是我的 GetClients 方法 My PostM
  • SQL Server:为什么默认情况下禁用 xp_cmdshell?

    默认情况下禁用扩展存储过程 xp cmdshell 的安全原因是什么 您可以在中找到解释PermissionsSQL Server 部分文档 http msdn microsoft com en us library ms175046 as
  • Coldfusion 将 onRequestEnd() 与 Application.cfm 文件结合使用

    我正在使用一个遗留应用程序工作 该应用程序是基于使用Application cfm文件而不是Application cfc files 需要能够在请求处理后运行代码 基本上 我想使用
  • django-storages 获取完整的 S3 url

    我有几个课程使用 django storages 和 Amazon S3 class Cache models Model identifier models TextField blank True null True cache fil
  • python 中的 p5-js map() 函数

    python中有没有像p5 js的map 这样的函数 python 中的 map 根本不一样 据我了解 在 python 中 它对序列中的所有可迭代应用相同的函数 但我需要一些可以完成 p5 js 中的 map 函数功能的东西 感谢您的帮助
  • 如何找到使用 gdb 定义的文件?

    当我打字时list mystruct进入 gdb 我收到用于定义 mystruct 的代码行 我怎样才能要求 gdb 给我它正在读取的文件来打印这些行 从 gdb python 接口获取该文件会更好 越容易解析越好 Thanks 为了显示类
  • 从输入中获取整数值并动态生成输入

    我想在焦点从 移开 时动态获取输入End Date 输入并传递天数到 JQuery 并生成它 我尝试了这段代码但不起作用 从几天中获取价值并生成面板数量 就是这样
  • C#:寻求快速数据结构以将像素添加到分区 HSB 直方图

    在我的应用程序中 我使用快速非托管代码从多个图像读取 RGB 像素值 然后将它们转换为 HSB 颜色 现在我想使用以下分区构建 HSB 直方图 色调 18 个分区 从 0 360 产生 20 个间隔 饱和度 3 个分区 从 0 1 产生 0
  • NHibernate 查询建模

    通常我会将我的 criterias hql 查询放在与实体相关的存储库 dal 类中 但最近我一直在考虑添加另一个表示查询是什么的抽象 这将使我有可能将常见行为添加到基类中的所有查询 例如分页 等 现在这些就是我的组件 与 nhiberna
  • 在常规发布请求中设置标头

    我需要设置一个header in a post请求 授权 request token 我尝试过使用 wslite 和 groovyx net http HTTPBuilder 但我总是得到 401 未授权 这意味着我无法正确设置标头 我也想
  • 在 terraform 中构建输出地图

    我有一个要创建的用户列表 一个 sns 主题列表以及创建策略以向用户授予主题权限 这些都是针对用户的命名空间 Given main tf provider aws region eu west 1 profile terraform mod
  • 将调用命令的输出封装在变量中 - PowerShell

    我有一个在远程计算机 来自 DC 上安装远程桌面服务的脚本 我现在正处于检查 RDS 是否安装在连接代理 服务器 和连接主机 服务器 上的阶段 我想使用调用命令 因为远程 powershell 会话似乎太复杂了 这是我的代码 res Inv
  • 在 Windows 中使用子进程运行 python 脚本。来自 emacswiki 的 Python 代码检查器包装器产生相同的错误

    所以我正在尝试设置 emacs wiki 中建议的 python 代码检查器 但是 我无法在命令 shell 中运行这些脚本 更不用说 emacs 了 该部分可在此处找到 http www emacswiki org emacs Pytho
  • 将字符串存储到c中的数组中

    据我所知 我可以创建一个包含项目的数组 例如 char test1 3 arrtest ao 123 但是我如何将我的输入存储到上面的代码之类的数组中 因为我只能将其编码为 input 10 scanf s input or gets in
  • 在运行时更改 iOS 模拟器的当前区域设置

    在开发一组用于将数值和日期转换为字符串的日期计算和语言规则时 我正在编写断言字符串格式化方法的结果的测试 一个虚构的断言可能如下所示 NSAssert dateString isEqualToString Three days until