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

StackOverflow https://stackoverflow.com/questions/619867

Вопрос

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

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

Это было полезно?

Решение

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

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);
}

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

Другие советы

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

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

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

http://programminghacks.net/2011 / 06/03 / КСН-СИБ-локализация-в-локализуемым-строки /

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

Марко

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top