我主要是为其他新手编写此书,并在几年后忘记自己所做的事情时提醒自己



我正在构建的应用程序中有一串本地化字符串。我非常讨厌缺乏可读性,因为我在诸如

[_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的代码中避免的所有费力的代码。

现在,这里的神奇之处在于,您可以为ViewControllers中的每个对象创建.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"];


顺便说一句,不需要#号,但是我在整个.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.";


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

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


使用类别可以扩展页面上具有的UI对象的类定义。这些类别可以包括使主代码更具可读性所需的所有内容。
在每个扩展名中为该方法命名相同,以便在.m文件中执行魔术操作时不必考虑它。
使用短句柄处理较长的文本字符串,并将较长的内容塞入.strings文件中。


我希望知道的一件事:

我现在有一堆.h文件,现在我必须#include在所有ViewController .m文件的顶部。我希望我可以拥有一个.h文件,其中包含所有的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"


好了,您去了...新手的一些笔记...当然,所有专家都提供了帮助,但是有时我们需要像这样的笔记来帮助我们克服困难!

07-26 09:38