Локализация iPhone:Можно ли легко переводить файлы с наконечником без необходимости копировать наконечник для каждого языка?
-
03-07-2019 - |
Вопрос
Я пытаюсь найти управляемый способ перевести каждую видимую строку в приложении для 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