IPhone本地化:是否可以轻松翻译nib文件而无需复制每种语言的笔尖?

Kev*_*lar 10 iphone localization internationalization

我正在尝试找到一种可管理的方式来翻译iPhone应用程序中的每个可见字符串.官方苹果文档说使用.strings文件编写程序字符串,同时使用xcode中内置的"添加本地化文件"选项来本地化nib文件.

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

bdu*_*gan 15

Apple的内置命令行程序ibtool可以让你这样做.您可以从XIB转储字符串,对它们进行本地化,然后基于现有的XIB创建新的XIB,但使用本地化的字符串.因此,您可以随时拥有一组XIB,并在本地化字符串更改时重新创建它们.更多信息:http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/.


rpe*_*ich 3

您能做的最好的事情就是递归循环每个视图,然后在它们上设置文本:

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);
}
Run Code Online (Sandbox Code Playgroud)

警告:您可能必须检查其他选择器集才能捕获所有内容。这不是最佳实践,但看起来工作量少得多