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 ascending: YES selector: @selector (localizedCaseInsensitiveCompare :)];

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

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

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

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

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


person Neelesh    schedule 19.02.2012    source источник
comment
Во-первых, не стоит связываться с языковыми настройками!   -  person DarkDust    schedule 19.02.2012
comment
Я хочу, чтобы список на шведском был отсортирован по алфавиту. (в алфавитном порядке на шведском языке, а не на английском языке, независимо от языка телефона пользователя). тогда как правильно это сделать?   -  person Neelesh    schedule 19.02.2012
comment
@DarkDust, значит, неправильно заставлять язык приложения?   -  person Neelesh    schedule 19.02.2012


Ответы (1)


@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;
}
person Rob Napier    schedule 19.02.2012
comment
У меня есть только одна сортировка во всем моем приложении, и я хочу, чтобы она была отсортирована на шведском, а не на английском языке. - person Neelesh; 19.02.2012
comment
Правильно, вышеперечисленное должно достичь этого. Изменение языкового стандарта влияет на многие вещи, помимо сортировки. - person Rob Napier; 19.02.2012
comment
Не могли бы вы привести мне пример? - person Neelesh; 19.02.2012
comment
Когда я устанавливаю язык устройства на шведский, он работает отлично. Но если я изменю язык своего устройства на английский, сортировка будет выполняться на английском языке, а шведские символы будут помещены посередине. - person Neelesh; 19.02.2012
comment
Добавлен. Это для приложения командной строки, но должно быть очевидно, как перенести его на iOS. - person Rob Napier; 19.02.2012