Файл iOS Localizable.strings для файлов XIB?
Я переводил проект iOS на португальский язык, и я создал файл pt.lproj/Localizable.strings, и я добавил NSLocalizedString() в исходный код. Все работает! С одной небольшой проблемой - строки в XIB файлах не переводится... Я знаю, что это по дизайну.
Я видел, что команда ibtool может использоваться для копирования строк из XIB файла с именем x и поместить его в файл с именем x.strings... но мой вопрос: есть ли способ вытащить строки из ВСЕ xib файлы и помещаете их в один файл .strings(например, Localizable.strings? Или даже еще один, называемый XIBs.strings, будет в порядке?)
Ответы
Ответ 1
У вас есть два варианта перевода xib файлов. Во-первых, вы подключаете элементы пользовательского интерфейса к выходам и устанавливаете свои строки в методе viewDidLoad с помощью макросов NSLocalizedString
.
Второй вариант - предоставить отдельный xib для каждого языка, поддерживаемого вашим приложением. Вам не нужно создавать их вручную, вы можете использовать команду ibtool
(я предполагаю, что ваш исходный язык - английский, а цель - португальский):
ibtool --strings-file pt.lproj/Example.strings en.lproj/Example.xib –write pt.lproj/Example.xib
Чтобы собрать строки, найденные в вашем проекте, вы можете использовать команду genstrings
- однако я рекомендую использовать этот python script для сбора всех ваших строк - это может быть красиво обрабатывать ситуацию, когда вам нужно добавлять/удалять строки в приложение без необходимости переводить и/или вручную объединять все предыдущие строки
Edit
О, и я нашел статью , что узнал этот трюк из
Ответ 2
Я сделал категорию, чтобы сделать это:
@implementation UIView (Localise)
- (void)localise
{
[self.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
[view localise];
if ([view isKindOfClass:[UILabel class]]) {
UILabel *label = (UILabel *)view;
[label setText:NSLocalizedString(label.text, nil)];
}
}];
}
Затем в ваших представлениях:
- (void)awakeFromNib
{
[super awakeFromNib];
[self localise];
}
Вам нужно будет добавить поддержку других элементов пользовательского интерфейса (textField.placeholder = NSLocal... blah blah), но это сделает трюк для UILabel и детей.
Вероятно, это не очень удобно, но делает работу.
Ответ 3
Это зависит от приложения и количества локализаций, но в целом я предпочитаю отдельные файлы .xib, поскольку макет может измениться. Поместите локализованные файлы в pt.lproj/.