NSLocale setPreferredLanguage - PullRequest
       9

NSLocale setPreferredLanguage

2 голосов
/ 19 февраля 2012

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

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

@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 arrayWithArrayL: sescriptUrent: [self.ingred]дескрипторы]];

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

Что я делаю не так?

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

1 Ответ

6 голосов
/ 19 февраля 2012

@ 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;
}
...