代码之家  ›  专栏  ›  技术社区  ›  Kevlar

IPhone本地化:是否可以轻松翻译nib文件,而不必复制每种语言的nib?

  •  10
  • Kevlar  · 技术社区  · 15 年前

    我试图找到一种易于管理的方法来翻译iPhone应用程序中的每个可见字符串。苹果的官方文档说,使用.strings文件作为编程字符串,同时使用xcode中内置的“添加本地化文件”选项来本地化nib文件。

    我看到的问题是,如果在本地化发生后UI需要更改,那么我们需要分别更新每种语言的NIB,这不是最佳的。是否有更简单的方法将nib文件中显示的字符串与.strings文件中的相关值联系起来?或者我必须以编程方式为每个ui元素设置这些字符串(这稍微好一点,但仍然很烦人)?

    6 回复  |  直到 15 年前
        1
  •  15
  •   bdunagan    15 年前

    苹果公司的内置命令行程序ibtool可以让你做到这一点。您可以从XIB中转储字符串,将其本地化,然后基于现有XIB创建新的XIB,但使用本地化字符串。因此,您可以始终拥有一组基本的XIB,并在本地化字符串更改时重新创建它们。更多信息请点击此处: http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/ .

        2
  •  3
  •   rpetrich    14 年前

    您所能做的最好是递归地循环遍历每个视图,然后在其上设置文本:

    static void translateView(NSBundle *bundle, UIView *view)
    {
        id idView = view;
        if ([idView respondsToSelector:@selector(text)] && [view respondsToSelector:@selector(setText:)])
            [idView setText:[bundle localizedStringForKey:[idView text] value:nil table:nil]];
        if ([idView respondsToSelector:@selector(title)] && [view respondsToSelector:@selector(setTitle:)])
            [idView setTitle:[bundle localizedStringForKey:[idView title] value:nil table:nil]];
        if ([idView respondsToSelector:@selector(placeholder)] && [view respondsToSelector:@selector(setPlaceholder:)])
            [idView setPlaceholder:[bundle localizedStringForKey:[idView placeholder] value:nil table:nil]];
        if ([idView respondsToSelector:@selector(prompt)] && [view respondsToSelector:@selector(setPrompt:)])
            [idView setPrompt:[bundle localizedStringForKey:[idView prompt] value:nil table:nil]];
        if ([idView respondsToSelector:@selector(titleForState:)] && [view respondsToSelector:@selector(setTitle:forState:)])
            [idView setTitle:[bundle localizedStringForKey:[idView titleForState:UIControlStateNormal] value:nil table:nil] forState:UIControlStateNormal];
        if ([idView isKindOfClass:[UITabBar class]] || [idView isKindOfClass:[UIToolbar class]])
            for (UIBarItem *item in [idView items])
                [item setTitle:[bundle localizedStringForKey:[item title] value:nil table:nil]];
        for (UIView *subview in [view subviews])
            translateView(bundle, subview);
    }
    

    警告:您可能必须检查其他选择器集才能捕获所有内容。这不是一个最佳实践,但似乎工作量要小得多

        3
  •  2
  •   Lyndsey Ferguson    15 年前

    我想您想了解一下命令行工具:ibtool。它可以简化你想要做的事情。

        4
  •  1
  •   Ricibald    13 年前

    您可以按照以下简单指南自动定位笔尖,而无需复制笔尖:

    http://programminghacks.net/2011/06/03/ios-nib-localization-in-localizable-strings/

        5
  •  0
  •   Marco    15 年前

    也许您应该手动更新每个字符串。假设您有一个不同语言的字符串数组或xml文件,当用户更改语言时,只需从数组中获取翻译后的字符串,然后将其更改为UI。

    马可

        6
  •  0
  •   pre    12 年前

    我总是设置viewDidLoad()方法中所需的所有字符串,其中.xib中只有占位符。这样,我只需更新.string文件就可以轻松地本地化任何.xib