Локализация IPhone: возможно ли легко перевести файлы пера, не копируя их для каждого языка? - PullRequest
10 голосов
/ 06 марта 2009

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

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

Ответы [ 6 ]

15 голосов
/ 25 марта 2009

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

3 голосов
/ 08 марта 2009

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

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 голосов
/ 06 марта 2009

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

1 голос
/ 03 июня 2011

Вы можете автоматически локализовать свои кончики, не дублируя их, следуя этому простому руководству:

http://programminghacks.net/2011/06/03/ios-nib-localization-in-localizable-strings/

0 голосов
/ 20 сентября 2012

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

0 голосов
/ 08 марта 2009

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

Marco

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...