故事板/ XIB和本地化最佳实践

Mor*_*ess 20 xcode localization xib

正式推荐的方法进行XIB /故事板的定位是创造的.xib和.storyboard文件内xx.lproj(其中xx是两个字母的语言ID)为您想支持的每个本地化.

这会产生一个问题,因为您有多个文件在很多情况下共享相同的UI,这些文件很容易发生变化.如果您想为一个视图重新设计UI,则必须多次执行(更糟糕的是,如果您在xib中输入了可本地化的字符串值).这与DRY原则背道而驰.

NSLocalizedString()在您需要的地方打电话似乎更有效率,只需使用一个XIB或Storyboard进行一次基本本地化.

那么,为什么(不)我创建本地化的XIB/Storyboard文件?

Les*_*ary 40

您可以在UILabel,UIButton等上创建一个类别,如下所示:

#import "UILabel+Localization.h"

@implementation UILabel (Localization)

- (void)setLocalizeKey:(NSString*)key
{
    self.text = NSLocalizedString(key, nil);
}

@end
Run Code Online (Sandbox Code Playgroud)

然后在你的xib文件上使用用户定义的运行时属性将UILabel(或UIButton等)链接到Localizable.strings文件中保存的密钥

用户定义的运行时属性

这样,您可以将所有字符串放在一个文件中,而不必为每种语言创建单独的xib.

  • 根据这个答案,我写了一个关于如何做的更大的教程.https://medium.com/p/easy-xib-and-storyboard-localization-b2794c69c9db (6认同)
  • 这个答案值得更多推荐! (2认同)

Fla*_*lax 27

对于仅更改文本标签,我做了类似的事情

+(void) replaceTextWithLocalizedTextInSubviewsForView:(UIView*)view
{
    for (UIView* v in view.subviews)
    {
        if (v.subviews.count > 0)
        {
            [self replaceTextWithLocalizedTextInSubviewsForView:v];
        }

        if ([v isKindOfClass:[UILabel class]])
        {
            UILabel* l = (UILabel*)v;
            l.text = NSLocalizedString(l.text, nil);
            [l sizeToFit];
        }        

        if ([v isKindOfClass:[UIButton class]])
        {
            UIButton* b = (UIButton*)v;
            [b setTitle:NSLocalizedString(b.titleLabel.text, nil) forState:UIControlStateNormal];
        }        
    }    
}
Run Code Online (Sandbox Code Playgroud)

viewDidLoad: 这样调用此函数:

[[self class] replaceTextWithLocalizedTextInSubviewsForView:self.view];

当你想要的只是本地化标签时,它为我节省了许多声明和连接IBOutlets的工作.

  • 我发现的最好的方法!我添加了*[l sizeToFit];*用于UILabel案例并替换了*b.titleLabel.text = NSLocalizedString(b.titleLabel.text,nil);*with*[b setTitle:NSLocalizedString(b.titleLabel.text,nil) forState:UIControlStateNormal];*用于UIButton案例 - 以避免大小问题.将这个按钮放在一些全局的Utils类中也是有意义的,不要污染每个视图控制器 (2认同)