OSX Automator: не удается локализовать действие Obj-C

У меня есть рабочий процесс OSX Automator, который содержит пользовательское действие Obj-C. Он работает, но я не могу его локализовать. Мое тестовое действие:

- (id)runWithInput:(id)input fromAction:(AMAction *)anAction error:(NSDictionary **)errorInfo
{
    NSArray *contactStrings = (NSArray *)input;
    NSString *name    = contactStrings[0];
    NSString *address = contactStrings[1];
    NSString *comment = NSLocalizedString(@"IMPORTED", nil);
    NSString *output  = [NSString stringWithFormat:@"Name: %@, Address: %@, Comment: %@", name, address, comment];
    return output;
}

У меня есть локализованный файл Localizable.strings с базой и немецкой локализацией.
База (без комментариев):

"IMPORTED" = "Imported from OSX service";  

Немецкий (без комментариев):

"IMPORTED" = "Über OSX-Dienst eingelesen";  

Проблема в том, что при выполнении скрипта Automator строка комментария выводится как IMPORTED, т.е. локализация вообще не работает.
В чем может быть причина?


person Reinhard Männer    schedule 11.05.2014    source источник


Ответы (1)


Я решил проблему:
NSLocalizedString(...) — это макрос, определенный в NSBundle.h как

#define NSLocalizedString(key, comment) \
        [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]  

Это означает, что с помощью этого макроса файлы Localizable.strings ищутся в основном пакете приложения Automator, не в пакете действия Obj-c!!! Это также задокументировано здесь.< br> Связка действия Obj-c получена [self bundle].

Таким образом, я заменил неправильную строку

NSString *comment = NSLocalizedString(@"IMPORTED", nil);

by

NSString *comment = [[self bundle] localizedStringForKey:@"IMPORTED" value:@"" table:nil];  

и все работает.
Надеюсь, это поможет кому-то еще!

person Reinhard Männer    schedule 13.05.2014