【问题标题】:How to localize an iOS storyboard如何本地化 iOS 故事板
【发布时间】:2012-01-08 22:06:21
【问题描述】:

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

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

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

【问题讨论】:

标签: objective-c ios nslocalizedstring uistoryboard


【解决方案1】:

在 iOS 6 中,“信息”选项卡下的项目设置显示“使用基本国际化”。如果您选中该框,它会将所有字符串从情节提要中拉出并放入国际化的 .strings 文件中。

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 基础国际化是否适用于 iOS 5 或 4?谢谢!
  • 不幸的是只有 iOS 6 和更好的版本。如果您将 iOS 5 设置为目标,您会收到一条错误消息。
【解决方案3】:

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

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

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

"News" = "Nieuws";

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

【讨论】:

  • 如果您需要调整 UI 的大小(例如当翻译太长而被截断时)?这是在本地化 xib 文件而不是通过 NSLocalizedString 以编程方式替换文本时很容易完成的一件事。但我不知道故事板是否允许这样做(我还没有尝试过故事板)。
  • @Clafou 您可以将大小放在可本地化的字符串中,并在运行时将它们转换为数字。
  • 建议的解决方案不适用于 UITabBar 的延迟加载。 viewDidLoad: 将首先被调用,当您在匹配的选项卡栏项目上进行选项卡时。所以应用程序开始未本地化。
  • 此答案已过时,不应再被接受 - 请参阅下面的 Collin 和 freytag 的答案。
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

    对于部署目标为 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";
    

    【讨论】:

    • 这行得通,但是在我添加以下内容之前删除了标签栏项目图标: [tabBarItems[0] setImage:[UIImage imageNamed:@"tabIcon1.png"]];等等,对于标签栏中的每个项目
    【解决方案6】:

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

    https://github.com/negusoft/Polyglot

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2018-08-17
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多