Как локализовать раскадровку iOS
-
25-10-2019 - |
Вопрос
У меня есть раскадровка для iPhone с некоторыми видами. Например, назван название навигационной позиции News
, что должно быть переведено для других языков.
Когда я добавляю новую локализацию в свою раскадровку, она создала дубликат моей текущей раскадровки для нового языка. Здесь я могу изменить заголовок для элемента навигации, но для меня это не кажется очень полезным. Что если моя раскадровка содержит 100 просмотров, и мне нужно поддерживать 10 языков? Если мне нужно что -то изменить в моей оригинальной раскадровке, я должен внести одинаковые изменения для всех языков. Это кажется очень странным. В каких ситуациях это может быть полезно?
Что я могу сделать вместо этого? Если у меня есть только английская раскадровка и вручную перевести каждый элемент в ViewController, используя NSLocalizedString
?
Решение
Вы можете сделать локализацию, изменив названия элементов пользовательского интерфейса в коде:
self.title = NSLocalizedString("News", nil);
Если вы хотите локализовать свое приложение на голландском языке, у вас будет это в Dutch.lproj/Localizable.strings
:
"News" = "Nieuws";
Затем вы можете сделать это для каждого элемента пользовательского интерфейса и языка.
Другие советы
В iOS 6 есть настройка проекта на вкладке «Информация», в которой говорится «Использовать интернационализацию базовой». Если вы установите флажок, он вытянет все струны из раскадровки и в интернационализированные файлы .strings.
Таким образом, вам не нужно иметь несколько копий раскадровки.
По состоянию на iOS 6 вы можете принять решение использовать базовую интернационализацию: все файлы раскадровки и XIB/NIB существуют только один раз в папке с именем base.lproj. Локализация элементов графического интерфейса помещается в связанные файлы .strings в каждом каталоге локализации.
Например, «mainstoryboard.storyboard» будет размещен в Base.lproj. Связанный файл, называемый «mainstoryboard.strings», помещается в en.lproj и любую локализацию, которую вы применяете.
Это действительно очень красиво, особенно в сочетании с ограничениями макета!
Вы можете найти этот видеоурок здесь полезным:
http://www.youtube.com/watch?v=cf1rf02qvzq
Подход состоит в том, чтобы иметь отдельную раскадровку для локализации каждого языка, а затем позволить сценарию позаботиться о распространении изменений, которые вы вносите в оригинальной раскадровке для всех других языков.
Для приложений с целью развертывания 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";
Вы также можете найти полезную локализацию полиглота. Вместе с вызовом nslocalizedstring () в коде вы можете напрямую указать ключ в своей раскадровке. Вы можете избежать ненужных розетков и уменьшить код шаблона.
Я предлагаю вам узнать командную линию iBtool, это помогает вам локализацию всех ваших раскадровки :) Вот учебное пособие здесь http://www.albertmata.net/articles/introduction-to-internationalization-using-storybards-on-ios-5.html