Локализация IPhone: возможно ли переводить файлы nib без необходимости копировать нить для каждого языка?

Я пытаюсь найти управляемый способ перевести каждую видимую строку в приложении iPhone. В официальной документации на Apple говорится, что они используют файлы .strings для программных строк, используя встроенную опцию "добавить локализованный файл" в xcode для локализации файлов nib.

Проблема, которую я вижу в этом, заключается в том, что если пользовательский интерфейс должен измениться после того, как произойдет локализация, нам нужно будет обновить наконечники для каждого языка индивидуально, что будет меньше оптимального. Есть ли более простой способ привязать строки, отображаемые в файлах nib, к соответствующим значениям в файле .strings? или мне придется программно устанавливать эти строки для каждого элемента ui (что немного лучше, но все еще раздражает)?

Ответ 1

Лучшее, что вы можете сделать, - это рекурсивно прокрутить каждый вид, а затем установить текст на них:

static void translateView(NSBundle *bundle, UIView *view)
{
    id idView = view;
    if ([idView respondsToSelector:@selector(text)] && [view respondsToSelector:@selector(setText:)])
        [idView setText:[bundle localizedStringForKey:[idView text] value:nil table:nil]];
    if ([idView respondsToSelector:@selector(title)] && [view respondsToSelector:@selector(setTitle:)])
        [idView setTitle:[bundle localizedStringForKey:[idView title] value:nil table:nil]];
    if ([idView respondsToSelector:@selector(placeholder)] && [view respondsToSelector:@selector(setPlaceholder:)])
        [idView setPlaceholder:[bundle localizedStringForKey:[idView placeholder] value:nil table:nil]];
    if ([idView respondsToSelector:@selector(prompt)] && [view respondsToSelector:@selector(setPrompt:)])
        [idView setPrompt:[bundle localizedStringForKey:[idView prompt] value:nil table:nil]];
    if ([idView respondsToSelector:@selector(titleForState:)] && [view respondsToSelector:@selector(setTitle:forState:)])
        [idView setTitle:[bundle localizedStringForKey:[idView titleForState:UIControlStateNormal] value:nil table:nil] forState:UIControlStateNormal];
    if ([idView isKindOfClass:[UITabBar class]] || [idView isKindOfClass:[UIToolbar class]])
        for (UIBarItem *item in [idView items])
            [item setTitle:[bundle localizedStringForKey:[item title] value:nil table:nil]];
    for (UIView *subview in [view subviews])
        translateView(bundle, subview);
}

Предупреждение: вам может потребоваться проверить другие наборы селекторов, чтобы поймать все. Это не лучшая практика, но, похоже, гораздо меньше работы.

Ответ 2

Встроенная программа командной строки Apple ibtool позволяет это сделать. Вы можете вывести строки из XIB, локализовать их, а затем создать новый XIB на основе существующего XIB, но используя локализованные строки. Таким образом, вы всегда можете иметь базовый набор XIB и воссоздавать их все всякий раз, когда меняются локализованные строки. Подробнее здесь: http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/.

Ответ 3

Я думаю, вы хотите прочитать о инструменте командной строки: ibtool. Это должно упростить то, что вы хотите сделать.

Ответ 5

Возможно, вам нужно обновить каждую строку вручную. Скажем, у вас есть массив или xml файл строк на разных языках, когда пользователь меняет язык, просто переведите строку из массива и затем измените его на пользовательский интерфейс.

Marco

Ответ 6

Я всегда задавал все строки, необходимые для метода viewDidLoad(), имея только заполнители в .xib. Таким образом, я могу легко локализовать любой .xib с обновлением файлов .string