Подтвердить что ты не робот

Как локализовать раскадровку iOS

У меня есть раскадровка iPhone с некоторыми взглядами. Например, заголовок элемента навигации называется " News, и его следует переводить на другие языки.

Когда я добавляю новую локализацию в свою раскадровку, она создает копию моей текущей раскадровки для нового языка. Здесь я могу изменить название для элемента навигации, но для меня это не кажется очень полезным. Что если моя раскадровка содержит 100 просмотров и мне нужно поддерживать 10 языков? Если мне нужно что-то изменить в моей исходной раскадровке, я должен сделать одинаковые изменения для всех языков. Это кажется очень странным. В каких ситуациях это может быть полезно?

Что я могу сделать вместо этого? Должен ли я иметь только английскую раскадровку и вручную переводить каждый элемент в ViewController с помощью NSLocalizedString?

4b9b3361

Ответ 1

Вы можете выполнить локализацию, изменив заголовки элементов интерфейса в коде:

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

Если вы хотите локализовать свое приложение на голландском языке, например, вы должны иметь это в Dutch.lproj/Localizable.strings:

"News" = "Nieuws";

Затем вы можете сделать это для каждого элемента и языка пользовательского интерфейса.

Ответ 2

В iOS 6 на вкладке "Информация" есть параметр "Использование базовой интернационализации". Если вы установите флажок, он вытащит все строки из раскадровки и в интернационализированные файлы .strings.

Таким образом, вам не нужно иметь несколько копий раскадровки.

enter image description here

Ответ 3

Как и в iOS 6, вы можете использовать Base Internationalization: все файлы раскадровки и xib/nib существуют только один раз в папке с именем Base.lproj. Локализация элементов GUI помещается в связанные файлы .strings в каждом каталоге локализации.

Например, "MainStoryboard.storyboard" будет помещен в Base.lproj. Связанный файл, называемый "MainStoryboard.strings", помещается в en.lproj и любую локализацию, которую вы применяете.

Это действительно очень красиво, особенно в сочетании с ограничениями макета!

Ответ 4

Возможно, вы найдете здесь этот видеоролик:

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

Подход состоит в том, чтобы иметь отдельную раскадровку для локализации каждого языка, то пусть a script позаботится о распространении изменений, внесенных вами в исходную раскадровку для всех других языков.

Ответ 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";

Ответ 6

Вы также можете найти Локализацию Polyglot. Вместо вызова NSLocalizedString() в коде вы можете напрямую указать ключ в своей раскадровке. Вы можете избежать ненужных выходов и уменьшить код шаблона.

https://github.com/negusoft/Polyglot