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

IPhone本地化:是否可以轻松翻译nib文件,而不必复制每种语言的nib?,iphone,localization,internationalization,Iphone,Localization,Internationalization,我试图找到一种易于管理的方法来翻译iPhone应用程序中的每个可见字符串。苹果的官方文档说,使用.strings文件作为编程字符串,同时使用xcode中内置的“添加本地化文件”选项来本地化nib文件 我看到的问题是,如果在本地化发生后UI需要更改,那么我们需要分别更新每种语言的NIB,这不是最佳的。是否有更简单的方法将nib文件中显示的字符串与.strings文件中的相关值联系起来?或者我必须以编程方式为每个ui元素设置这些字符串(这稍微好一点,但仍然很烦人)?我想您应该了解一下命令行工具:ib

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


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

我想您应该了解一下命令行工具:ibtool。它应该简化您要执行的操作。

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


Marco

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

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);
}

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

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

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


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

,虽然它确实有助于翻译过程本身,但它仍然会导致最后有一个单独的nib文件,这是我希望避免的。不过谢谢你的指针。我以前没有用过它,因为我们没有内部本地化。我的印象是,您可以使用它将文件“提取”为可以本地化的内容,然后重新插入nib文件。nib文件当然有助于GUI,..ibtool应该能够将字符串重新集成到已更改的主nib文件中,以便吐出同时具有新字符串和新nib更改的新nib文件。参见有趣方法中的“执行增量本地化更新”;当我们的应用程序进展得更好时,我会尝试一下。我尝试了这个,结果出现了堆栈溢出(即无限循环)。对不起,最后一行有一个输入错误。它应该是translateView(bundle,subview);而不是translateView(捆绑、视图);属于course@Harkonian:我同意。这样做肯定不是正确的方法,但正确的方法很麻烦,而且在当时有点破损(可能不再是这种情况)不,现在仍然是这样——至少是麻烦的部分。我已经对这种方法进行了进一步的思考,我发现它比苹果规定的方法有一些优势。首先,您可以有一组字符串文件,而不是每个xib都有一组。另一方面,对strings文件的更改不必通过ibtool重新集成到xib中。因此,首先不必从xib生成字符串文件。不过,我对性能和内存方面的考虑很好奇+我对这一答案表示怀疑。