Файл iOS Localizable.strings для файлов XIB? - PullRequest
12 голосов
/ 01 декабря 2011

Я перевожу проект iOS на португальский язык, создал файл pt.lproj / Localizable.strings и добавил NSLocalizedString () в исходный код. Все работает! С одной небольшой проблемой - строки в файлах XIB не переводятся ... Хотя я знаю, что это специально.

Я видел, что команду ibtool можно использовать для копирования строк из файла XIB с именем x и помещения его в файл с именем x.strings ... но мой вопрос в том, есть ли способ извлечь строки из ВСЕ файлы xib и поместите их в один файл .strings (например, Localizable.strings? Или даже в другой файл с именем XIBs.strings, все будет в порядке?)

Ответы [ 3 ]

10 голосов
/ 01 декабря 2011

У вас есть два варианта перевода файлов XIB. Во-первых, вы подключаете элементы пользовательского интерфейса к розеткам и задаете свои строки в методе viewDidLoad, используя макросы NSLocalizedString.

Второй вариант - предоставить отдельный xib для каждого языка, поддерживаемого вашим приложением. Вам не нужно создавать их вручную, вы можете использовать команду ibtool (я предполагаю, что ваш исходный язык - английский, а цель - португальский):

ibtool --strings-file pt.lproj/Example.strings en.lproj/Example.xib –write pt.lproj/Example.xib

Чтобы собрать строки, найденные в вашем проекте, вы можете использовать команду genstrings - однако я рекомендую использовать этот скрипт Python , чтобы собрать все ваши строки - он может хорошо справиться с ситуацией, когда вам нужно добавить / удалить строк в ваше приложение без необходимости переводить и / или вручную объединять все предыдущие строки

Редактировать

О, и я нашел статью , о которой я узнал этот трюк из

3 голосов
/ 19 ноября 2013

Я создал категорию для этого:

@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 ... бла-бла), но это подойдет для UILabel и детей.

Вероятно, не с большой производительностью, но выполняет свою работу.

0 голосов
/ 01 декабря 2011

Это будет зависеть от приложения и количества локализаций, но в целом я предпочитаю отдельные файлы .xib, потому что макет может измениться. Поместите локализованные файлы в pt.lproj /.

...