2010-04-15 2 views
1

Рассмотрим следующую ситуацию:iPhone интернационализация: падение обратно на язык по умолчанию

  • У нас есть два Localizable.string файлов, один в en.lproj и один в it.lproj
  • Когда пользователь переключается на английский или итальянский, собственно локализуется строка загружается с помощью NSLocalizedString (@ «ключевое слово», ноль)
  • Если один из файлов отсутствует ключевое слово, строка не извлекается

есть ли ш ay, чтобы этот макрос загружал строку с определенного языка, если это ключевое слово не найдено в локалинге Localizable.string текущего локали?

ответ

1

NSLocalizedStringWithDefaultValue функция, вероятно, то, что вам нужно - с ее помощью вы можете указать значение по умолчанию для случая, если локализация не найдена для заданного ключа.

+0

Действительно я могу. Единственными аргументами являются: 1) Значение по умолчанию не может быть unicode из того, что говорят документы, и 2) у меня тогда были бы все мои «другие» локали, прекрасно разделенные в локализованных файлах, а один «по умолчанию» язык распространен как сумасшедший по всему коду , Я надеялся на более элегантное решение –

+0

Это не идеальный, но все же работоспособный. Я буду считать его принятым. –

0

Поставляя второй параметр функции NSLocalizedString, вы можете указать строку, которая будет использоваться, если ключевое слово не было найдено в Localizable.string.

Это то, что вы хотели?

+0

Этот второй параметр является комментарием, и он используется в качестве подсказки для переводчиков. –

+0

MihaiD вы думаете об одном из макросов LocalizedString. Второй параметр метода ACTUAL LocalizedString _is_ значение по умолчанию для отображения, если ключевое слово не найдено http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/ Reference/Reference.html # // apple_ref/occ/instm/NSBundle/localizedStringForKey: value: table: – Conceptdev

+1

Я думал о макросе. Вот что сказал ответ. –

1

Я столкнулся с той же проблемой. Я хотел бы использовать строку из файла строк языка разработки, если он не может найти локализованную строку на языке пользователя, но, видимо, нет.

В результате я создал свою собственную функцию для получения локализованной строки.

@interface Localization : NSObject { 
    NSBundle* fallbackBundle; 
} 

- (NSString*) localizedStringForKey:(NSString*)key; 

@end 


@implementation Localization 

- (id)init { 
    if (self = [super init]) { 
     NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]; 
     fallbackBundle = [[NSBundle bundleWithPath:path] retain]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [fallbackBundle release]; 
    [super dealloc]; 
} 

- (NSString*) localizedStringForKey:(NSString*)key { 
    NSString* result = [[NSBundle mainBundle] localizedStringForKey:key value:@"!#€NOTFOUND%&/" table:nil]; 
    if (result == nil || [result isEqualToString:@"!#€NOTFOUND%&/"]) { 
     result = [fallbackBundle localizedStringForKey:key value:nil table:nil]; 
    } 
    if (result == nil) { 
     result = key; 
    } 
    return result; 
} 

@end 

Вы можете сделать синглтон этого и есть макросы, подобные NSLocalizedString, которые требуют localizedStringForKey, или что-то вдоль этих линий, если вы будете.

+0

Это хорошее решение, именно то, что я собирался реализовать. Спасибо за код! –

Смежные вопросы