iOS本地化:最佳实践

10
您在 iOS 本地化方面有哪些最佳实践?
我一直在处理本地化,但感觉还不够好且不易扩展。需要有更好的方法。
这是我的当前方法:
使用.strings文件+NSLocalizedString - 这很有效,特别是将字符串文件分成较小的文件。但如果文件太多,添加另一种语言可能会很繁琐。 使用.stringsdict来处理零、一、多等字符串 - 这也很有效,缺点是对于一个单词,需要相当多的代码。
使用.storyboard文件的.strings文件 - 这是最棘手的部分。从storyboard生成.string文件本身并不难。但由于某种原因,无法更新字符串。所以,如果您在storyboard文件中添加了更多的字符串,则无法将新字符串加入旧字符串中而不重新生成。这意味着所有旧的翻译都将丢失。 - 我已经阅读并测试了FileMerge。(工作得还好,但似乎还有很长的路要走) - 我已经阅读并测试了一些Python脚本。(完全不起作用)
我尝试从Xcode创建xliff文件,但从未成功过。 始终无法导出文件。
错误消息: 无法读取./..../Localizable.strings/字符串文件。数据无法读取,因为它不符合正确的格式。
那么,您如何处理iOS中的本地化字符串?尤其是,您在本地化storyboard文件方面的做法是什么?我看过有些人将所有的本地化字符串都设置在代码中。但这样做似乎是一个不必要的步骤,需要为此创建大量的IBOutlets。
3个回答

2

我所做的事情起初可能会有些困难,但从长远来看是值得的。我将所有的翻译放在一个 Excel 文件中,然后将 Excel 文档另存为 CSV 文件。接着,我编写了一个小解析器,可以将 CSV 文件转换成字符串文件格式。如果你有一个 Android 项目,这个方法可以保持字符串对齐。


Excel在这方面几乎是最糟糕的解决方案,因为它需要手动操作,并且对许多语言的支持非常差。 - lensovet

2

.strings.stringsdict的确运作良好。我不喜欢任何故事板翻译方法,因为在我看来它们太容易出问题了,如果你在故事板中添加/删除/修改任何内容,就必须重新完成整个周期。

我采用以下方法取得了很好的效果:

  1. 在您的故事板实体的标题/副标题/占位符/文本中使用.strings本地化键。
  2. 在您的UIViewController基类(或类别)中定义一个帮助函数,遍历您的UI并使用故事板中的键设置支持小部件的本地化。

我在我的viewDidLoad中调用帮助函数。这是一个示例:

static void translateLocalizableStringsInView( UIView* v )
{
    NSBundle* mainBundle = [NSBundle mainBundle];
    UIView* view = v;

    if ( [view isKindOfClass:UILabel.class] )
    {
        UILabel* label = (UILabel*)view;
        if ( label.text.length )
        {
            NSString* localizedString = [mainBundle localizedStringForKey:label.text value:nil table:nil];
            if ( localizedString.length )
            {
                label.text = localizedString;
            }
        }
    }
    else if ( [view isKindOfClass:UITextField.class] )
    {
        UITextField* textField = (UITextField*)view;
        if ( textField.text.length )
        {
            NSString* localizedString = [mainBundle localizedStringForKey:textField.text value:nil table:nil];
            if ( localizedString.length )
            {
                textField.text = localizedString;
            }
        }
        if ( textField.placeholder.length )
        {
            NSString* localizedString = [mainBundle localizedStringForKey:textField.placeholder value:nil table:nil];
            if ( localizedString.length )
            {
                textField.placeholder = localizedString;
            }
        }
    }
    else if ( [view isKindOfClass:UIButton.class] )
    {
        UIButton* button = (UIButton*)view;
        NSString* title = [button titleForState:UIControlStateNormal];
        if ( title.length )
        {
            NSString* localizedString = [mainBundle localizedStringForKey:title value:nil table:nil];
            if ( localizedString.length )
            {
                [button setTitle:localizedString forState:UIControlStateNormal];
            }
        }
    }
    else if ( [view isKindOfClass:UISegmentedControl.class] )
    {
        UISegmentedControl* sc = (UISegmentedControl*)view;
        for ( NSUInteger i = 0; i < sc.numberOfSegments; ++i )
        {
            NSString* title = [sc titleForSegmentAtIndex:i];
            if ( title.length )
            {
                NSString* localizedString = [mainBundle localizedStringForKey:title value:nil table:nil];
                if ( localizedString.length )
                {
                    [sc setTitle:localizedString forSegmentAtIndex:i];
                }
            }
        }
    }
}



@implementation UIViewController (LocalizableStrings)

-(void)LT_translateLocalizableStringsInView
{
    [self.view LT_iterateThroughAllSubviewsRecursively:YES usingBlock:^(UIView * _Nonnull view, BOOL * _Nonnull stop) {
        translateLocalizableStringsInView( view );
    }];

    if ( self.navigationItem.titleView )
    {
        translateLocalizableStringsInView( self.navigationItem.titleView );
    }
}

1
使用自Xcode 6版本以来提供的导出/导入XLIFF功能。这是大多数翻译工具已知的通用文件格式,而且Xcode会为您处理所有同步问题。此外,WWDC 2014还有一些详细介绍的会议。
确保你的故事板在Base.lproj(这是新项目的默认设置)中,并且你正在使用本地化友好的约束自动布局(这是必要的,以便布局可以根据不同长度的翻译正确调整)。

好的建议,但如上所述。尝试导出xliff文件时总会出现一些错误。 无法读取字符串文件./..../Localizable.strings/,因为数据不在正确的格式中。 - user023
您无需手动创建字符串文件,只需在代码中使用NSLocalizedString调用即可自动生成。如果仍然存在问题,请在bugreport.apple.com上提交带有重现问题的示例项目,并在此处回复bug编号。谢谢! - lensovet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接