一种简单的方法,使代码在Xcode中的本地化字符串更具可读性

时间:2014-05-19 11:33:07

标签: ios nslocalizedstring

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


我在构建的应用程序中有很长的本地化字符串列表。我真的很讨厌缺乏可读性,因为我在像

这样的一大堆语句中蠢蠢欲动
[_myUILabelObject setText:NSLocalizedStringFromTable(_myString, applicationLanguage,nil)]

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

[_myUILabelObject translateMe:@"This text");

1 个答案:

答案 0 :(得分:1)

所以这就是我所做的:

我为每个对象创建了一堆类扩展(技术上的类别):UIButton,UILabel,UITextView ......无论我需要什么。

每个人都有一个简单的.h文件,它只是声明扩展名与主类有关。以下是我为UITextField翻译的示例:

@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"];
顺便说一句,#-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文件中。
  4. 我希望我能想到一件事:

    我现在有一长串的.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"
    

    嗯,你去了...来自新手的一些笔记......所有的专家当然都很乐于助人,但每隔一段时间我们就需要一个像这样的笔记让我们超越驼峰! / p>