gpt4 book ai didi

ios - 一种使 Xcode 中的 localizedStrings 代码更具可读性的简单方法

转载 作者:行者123 更新时间:2023-11-29 02:57:17 24 4
gpt4 key购买 nike

我主要是为其他新手写这篇文章,并在几年后当我忘记自己做了什么时提醒自己


我正在构建的应用程序中有一长串本地化字符串。我真的很讨厌缺乏可读性,因为我通过一大堆语句像

[_myUILabelObject setText:NSLocalizedStringFromTable(_myString, applicationLanguage,nil)]

然后我需要另一个不同的 UIButtons 和 UITextView 等等。必须有更好的方法。我想要的是类似

[_myUILabelObject translateMe:@"This text");

最佳答案

这就是我所做的:

我为每个对象创建了一堆类扩展(技术上的类别):UIButton、UILabel、UITextView……任何我需要的。

每个都有一个简单的 .h 文件,简单地声明扩展与主类相关。这是我的 UITextField 的 translateMe 示例:

@interface UITextField (translateMe)
- (void) translateMe: (NSString *) usingString;
@end

第一行告诉编译器 translateMe 将成为 UITextField 的扩展。

第二行告诉编译器 translateMe 期望成为 UITextField 的一个方法,它接收一个我称为 usingString 的 NSString。

然后在 .m 实现文件中,我这样做了:

extern NSString *applicationLanguage;

- (void) translateMe: (NSString *) string {
[self setText:NSLocalizedStringFromTable(string, applicationLanguage,nil)];
[self sizeToFit];
}

applicationLanguage 字符串是我根据用户选择的语言在别处设置的字符串,它本质上是 .strings 文件的名称。

此处的其余代码仅包含我希望在 ViewController 代码中避免的所有繁琐编码。

现在这里的神奇之处在于,您可以为 ViewController 中的每个对象创建类似的 .h 和 .m 文件组合。如果您调用了所有方法 translateMe,那么您在编码时就不必担心实际调用的是哪个对象。结果是你得到的东西看起来很简单,如下所示:

[_standardDemoPlanTitle          translateMe:  @"Standard Demo Plan"];
[_linkSampleDemoVideoButton translateMe: @"Link to sample demo"];
[_linkCustomerPresentationButton translateMe: @"Link to customer presentation"];
[_personalNotesTitle translateMe: @"Your Personal Notes"];
[_theSaveButton translateMe: @"Save"];
[_emailPlanButton translateMe: @"Email this plan to a colleague"];

请注意,有些是按钮,有些是标签(标题)这一事实根本不重要。

作为一个额外的捷径,我从另一篇文章中了解到,也可以用简短的方式处理长文本部分。

代替:

[_longTextRequiredByLawyers translateMe: @"blah blah blah blah blah forever..."];

我能做的是为实现文件中的文本放入一个短句柄,并将较长的文本放入 .strings 文件中。这是一个例子:

[longTextRequiredByLawyers translateMe: @"#lawyerText"];

顺便说一下,#-sign 不是必需的,但我在整个 .m 文件中都使用它作为个人提醒,这样我就知道要插入的内容不一定与界面生成器。

然后我的 english.strings 文件包含如下内容:

"#lawyerText" = "When in the course of human events it becomes necessary for one people to dissolve the bonds which have connected them with another and to assume among the powers of the earth the separate and equal station to which the laws of God...";

我的 spanish.strings 文件有翻译:

"#lawyerText" = "En México no hay abogados, entonces el texto es mas corto.";

您可以对阿尔巴尼亚语和克林贡语做同样的事情。

因此,关键技巧(或此处的良好编程思想):

  1. 使用 Cateogries 扩展页面上 UI 对象的类定义。这些类别可以包括使您的主要代码更具可读性所需的一切。
  2. 在每个扩展名中将方法命名为相同的名称,这样当您在 .m 文件中施展魔法时就不必考虑它。
  3. 对长文本字符串使用短句柄,并将较长的内容塞入 .strings 文件。

有一件事我希望我已经弄明白了:

我现在有一长串 .h 文件,我现在必须将这些文件 #include 放在我所有 ViewController .m 文件的顶部。我希望我可以有一个 .h 文件,#includes 所有 translateMe .h 文件...有点像嵌套的 .h。

  • UIButton+translateMe.h
  • UITextView+translateMe.h
  • UILabel+translateMe.h
  • UIButton+translateMe.h
  • 等等

如果有一个 .h 文件不是很好吗,也许 allMyTranslates.h 里面有上面的列表,然后我只在我编写的代码中包含 allMyTranslates.h。

我最终会替换:

#include "UIButton+translateMe.h"
#include "UITextView+translateMe.h"
#include "UILabel+translateMe.h"
#include "UIButton+translateMe.h"
#include and so on

有了这个

#include "allMyTranslateHeaders.h"

好吧,你去吧......新手的一些笔记......当然所有的专家都提供了帮助,但每隔一段时间我们就需要这样的笔记来帮助我们度过难关!

关于ios - 一种使 Xcode 中的 localizedStrings 代码更具可读性的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23736653/

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