如何本地化iOS故事板

时间:2011-11-29 14:59:51

标签: objective-c ios nslocalizedstring uistoryboard

我有一个带有一些观点的iPhone故事板。例如,导航项标题名为News,应翻译为其他语言。

当我在故事板中添加新的本地化时,它创建了我当前新语言故事板的副本。在这里我可以更改导航项的标题,但对我来说它似乎没有用。如果我的故事板包含100个视图并且我需要支持10种语言怎么办?如果我需要在原始故事板中更改某些内容,我必须对所有语言进行相同的更改。这看起来很奇怪。在哪些情况下这可能有用?

我该怎么做?我是否应该只使用英语故事板并使用NSLocalizedString手动翻译ViewController中的每个元素?

7 个答案:

答案 0 :(得分:108)

在iOS 6中,“信息”选项卡下的“项目”设置显示“使用基础国际化”。如果勾选此框,它会将所有字符串从故事板中拉出并转换为国际化的.strings文件。

这样您就不必拥有故事板的多个副本。

enter image description here

答案 1 :(得分:39)

从iOS 6开始,您可以决定使用Base Internationalization:所有storyboard和xib / nib文件只在名为Base.lproj的文件夹中存在一次。 GUI元素的本地化被放置在每个本地化目录中的相关.strings文件中。

例如,“MainStoryboard.storyboard”将放在Base.lproj中。名为“MainStoryboard.strings”的关联文件放在en.lproj中以及您应用的任何本地化。

这真的很帅,特别是与布局限制相结合!

答案 2 :(得分:10)

您可以通过更改代码中UI元素的标题来进行本地化:

self.title = NSLocalizedString("News", nil);

如果你想用荷兰语本地化你的应用程序,你可以在Dutch.lproj/Localizable.strings中找到它:

"News" = "Nieuws";

然后,您可以为每个UI元素和语言执行此操作。

答案 3 :(得分:6)

您可能会发现此视频教程非常有用:

http://www.youtube.com/watch?v=cF1Rf02QvZQ

方法是为每种语言设置一个单独的故事板进行本地化, 然后让脚本负责传播您在原始故事板中所做的更改 所有其他语言。

答案 4 :(得分:3)

对于部署目标为iOS 5和故事板的应用,我使用类似这样的内容来定位我的标签,其中故事板上的第一个ViewController是UITabBarController

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // ...

    if ([self.window.rootViewController isKindOfClass:UITabBarController.class]) {
        UITabBarController *tabBarController = (UITabBarController *) self.window.rootViewController;

        // Localize tab items
        NSArray *tabBarItems = tabBarController.tabBar.items;

        [tabBarItems enumerateObjectsWithOptions:NSEnumerationConcurrent 
                                      usingBlock:^(UITabBarItem *item, NSUInteger tabIndex, BOOL *stop) {
            NSString *keyName = [NSString stringWithFormat:@"tabBarItem%i", tabIndex];
            item.title = NSLocalizedString(keyName, @"TabBarItems");
        }];
    } else {
        // The root view controller is not the UITTabBarController
    }

    // ...
}

在我的Localizable.strings文件中有这样的内容:

// MARK: TabBar
"tabBarItem0" = "My First Tab Label";
"tabBarItem1" = "My Second Tab Label";
"tabBarItem2" = "My Third Tab Label";

答案 5 :(得分:2)

您可能会发现Polyglot Localization也很有用。代替在代码中调用NSLocalizedString(),您可以直接在Storyboard中指定它。您可以避免不必要的插座并减少样板代码。

https://github.com/negusoft/Polyglot

答案 6 :(得分:1)

我建议你学习命令行ibtool它有助于你帮助你本地化你的所有故事板:)这是一个教程http://www.albertmata.net/articles/introduction-to-internationalization-using-storyboards-on-ios-5.html