Как локализовать раскадровку iOS
У меня есть раскадровка iPhone с некоторыми взглядами. Например, заголовок элемента навигации называется " News
, и его следует переводить на другие языки.
Когда я добавляю новую локализацию в свою раскадровку, она создает копию моей текущей раскадровки для нового языка. Здесь я могу изменить название для элемента навигации, но для меня это не кажется очень полезным. Что если моя раскадровка содержит 100 просмотров и мне нужно поддерживать 10 языков? Если мне нужно что-то изменить в моей исходной раскадровке, я должен сделать одинаковые изменения для всех языков. Это кажется очень странным. В каких ситуациях это может быть полезно?
Что я могу сделать вместо этого? Должен ли я иметь только английскую раскадровку и вручную переводить каждый элемент в ViewController с помощью NSLocalizedString
?
Ответы
Ответ 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
Ответ 7
Я предлагаю вам изучить командную строку ibtool, которая помогает вам локализовать все ваши раскадровки:) Вот учебник здесь http://www.albertmata.net/articles/introduction-to-internationalization-using-storyboards-on-ios-5.html