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

Файл iOS Localizable.strings для файлов XIB?

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

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

4b9b3361

Ответ 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/.