2

Я, кажется, собираюсь в кругах вокруг этой проблемы, и сейчас я не веду.NSLocale setPreferredLanguage

Я пытаюсь принудить язык моего приложения (к шведскому), как показано ниже.

@autoreleasepool { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"sv", nil] forKey:@"AppleLanguages"]; 
    [[NSUserDefaults standardUserDefaults]synchronize]; 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
} 

Я сделал это в основном методе, так что предпочтение задается, как только приложение запускается.

Тогда, когда я хочу отсортировать массив в алфавитном порядке, я использую NSSortDescriptor с селектором localizedCaseInsensitiveCompare:.

NSSortDescriptor * valueDescriptor = [[NSSortDescriptor Alloc] initWithKey: @ "iName" по возрастанию: ДА селектор: @selector (localizedCaseInsensitiveCompare :)];

NSArray * дескрипторы = [NSArray arrayWithObject: valueDescriptor];

self.ingredientsList = [NSMutableArray arrayWithArray: [self.ingredientsList sortedArrayUsingDescriptors: дескрипторы]];

Но моя проблема в том, что сортировка с моим местным языком происходит не в первый раз. Но если я перезапущу приложение, сортировка выполняется в соответствии с языком (шведский). Почему это не происходит в первый раз?

Что я делаю неправильно?

Помощь/предложения будут оценены. Thanks

+1

Вы не должны возиться с настройками языка в первую очередь! – DarkDust

+0

Я хочу, чтобы список в шведский был отсортирован в алфавитном порядке. (в алфавитном порядке на шведском языке, а не на английском языке, независимо от языка телефона пользователя). каков же правильный способ сделать это? – Neelesh

+0

@ DarkDust не так ли принудительно использовать язык приложения? – Neelesh

ответ

6

@DarkDust правильный. Вы не должны пытаться изменить сам язык. Это не под вашим контролем, и, как вы видите, это работает не очень хорошо. Самое главное, если вы просто хотите изменить операцию сортировки, это очень большой молот, чтобы сделать это ... Вы могли бы сыграть с различными локализациями Info.plist записей (в частности, CFBundleLocalizations), чтобы заставить это работать правильно, но не только для сортировки одного списка.

Что вы хотите использовать, это compare:options:range:locale:, что позволяет вам передать определенный язык. Этот метод можно использовать внутри sortedArrayUsingSelector: или sortedArrayUsingComparator:.

В качестве альтернативы вы можете использовать категорию, чтобы добавить пользовательский swedishCaseInsensitiveCompare: в NSString. Затем вы можете использовать NSSortDescriptor так же, как и вы.


Пример. ä сортируется после a на английском языке, но после того, как z на шведском языке:

@interface NSString (SwedishSorting) 
- (NSComparisonResult)caseInsensitiveSwedishCompare:(id)other; 
@end 

@implementation NSString (SwedishSorting) 
- (NSComparisonResult)caseInsensitiveSwedishCompare:(id)other; 
{ 
    return [self compare:other options:NSCaseInsensitiveSearch range:NSMakeRange(0, self.length) locale:[[NSLocale alloc] initWithLocaleIdentifier:@"sv"]]; 
} 

@end 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
    NSArray *array = [@"Jag är en test av sortering" componentsSeparatedByString:@" "]; 
    NSArray *englishSort = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(caseInsensitiveCompare:)]]]; 
    NSLog(@"English = %@", englishSort); 

    NSArray *swedishSort = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(caseInsensitiveSwedishCompare:)]]]; 

    NSLog(@"Swedish = %@", swedishSort);                 
    } 
    return 0; 
} 
+0

У меня только одна сортировка во всем моем приложении, и я хочу, чтобы это было отсортировано по-шведски, а не по-английски. – Neelesh

+0

Правильно, вышеприведенное должно достичь этого. Изменение локали влияет на многие вещи, кроме сортировки. –

+0

Не могли бы вы привести мне пример. – Neelesh