Цель-C: локализация эффективным способом
Я локализировал свои программы, создавая строковый файл и / или локализованные xib-файлы для каждого языка. Этот процесс очень медленный, так как сложно поддерживать все локализованные файлы XIB и добавлять новые функции в интерфейс.
Чтобы избежать этого, в моих последних проектах я просто делал IBOutlets для каждого элемента интерфейса на интерфейсе и -(void)awakeFromNib
изменил заголовки и строковые значения для всех элементов, используя NSLocalizedString
и файл строк.
Есть ли какой-либо другой, более эффективный способ массового перевода всего пользовательского интерфейса без необходимости создания нескольких XIB-файлов и / или траты времени на "синхронизацию"?
У меня была одна идея, чтобы решить эту проблему, я создал категорию NSObject следующим образом:
@implementation NSObject (Localizable)
-(void)awakeFromNib {
if ([self isKindOfClass:[NSTextField class]]) {
NSTextField *txtField = (NSTextField *)self;
txtField.stringValue = NSLocalizedString(txtField.stringValue, nil);
}
else if ([self isKindOfClass:[NSWindow class]]) {
NSWindow *windowC = (NSWindow *)self;
windowC.title = NSLocalizedString(windowC.title, nil);
}
}
@end
Как вы можете видеть в моей категории, я могу легко изменить значения для всех NSTextField
объекты в моем заявлении, сохранив в качестве заполнителя перевода NSTextField
текст...
Это работает нормально, однако я беспокоюсь о производительности, поскольку она будет работать для всех объектов в моем приложении.
Это плохо делать это? Есть ли лучшие альтернативы?
PS: я сделал категорию NSObject
и не NSTextField
или же NSWindow
потому что таким образом я могу сохранить всю логику локализации в одном месте и просто добавить другое else if
оператор для каждого класса пользовательского интерфейса, который я мог бы захотеть перевести вместо создания новой категории.
1 ответ
Использование ibtool
управлять своими файлами XIB. Он является частью пакета инструментов командной строки, который устанавливается вместе с XCode. Хотя Xcode предлагает графический интерфейс для редактирования строк, ibtool
можно запустить из скриптов.
В целом, у Apple есть некоторые рекомендации и советы по обслуживанию файлов XIB; вы можете найти их документацию здесь. Читая это, вы обнаружите, что ibtool
довольно прост в использовании.
Каким бы впечатляющим ни был ваш подход (я видел несколько действительно ужасных, в которых каждый элемент пользовательского интерфейса был подключен к IBOutlet просто для осуществления локализации!), Он все равно оказывается дополнительным связующим кодом, который необходимо поддерживать. (и поверьте мне, вы будете поддерживать его по мере изменения ваших потребностей).
Поэтому, что касается моих двух валютных единиц, я бы порекомендовал придерживаться локализованных перьев.