58

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

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

我能做些什么呢?我应该只有英文故事板并使用 ViewController 手动翻译每个元素NSLocalizedString吗?

4

7 回答 7

109

在 iOS 6 中,在 Info 选项卡下有一个 Project 设置,上面写着“Use Base Internationalization”。如果您选中该框,它会将所有字符串从情节提要中拉出并放入国际化的 .strings 文件中。

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

在此处输入图像描述

于 2012-10-04T16:18:09.307 回答
39

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

例如“MainStoryboard.storyboard”将被放置在 Base.lproj 中。一个名为“MainStoryboard.strings”的关联文件放置在 en.lproj 和您应用的任何本地化中。

这真的很帅,尤其是结合布局约束!

于 2012-07-21T17:54:50.520 回答
11

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

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

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

"News" = "Nieuws";

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

于 2011-12-06T16:27:24.740 回答
6

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

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

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

于 2012-03-13T00:47:15.300 回答
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";
于 2013-03-27T09:20:09.637 回答
2

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

https://github.com/negusoft/Polyglot

于 2015-10-12T19:36:33.433 回答
1

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

于 2012-08-02T22:59:16.830 回答