Цель c: изменить языки с помощью NSLocalizedString для Mac

Я хочу использовать NSLocalizedString для смены языков для Mac, а не для IOS. Вот шаги, которые я сделал. Однако, когда я перезапускаю приложение, язык по-прежнему не меняется.

  1. Добавьте новые файлы xib, а также NSLocalizedString.

введите здесь описание изображения

  1. Создайте NSMenuItems.

введите здесь описание изображения

  1. Затем я создал один IBAction и соединился со всеми NSMenuItems с помощью этой функции.

    -(IBAction)languageDidSelect: (id)sender
    {   
      [[NSUserDefaults standardUserDefaults] setObject:[languages objectAtIndex: [sender tag]] forKey:@"AppleLanguages"];
    
      [[NSUserDefaults standardUserDefaults] synchronize];
    
      [sender setState: NSOnState];
    
      [self relaunch];
     }
    
     -(void)relaunch
     {
        isRelaunch = true; //boolean variable
        [[NSApplication sharedApplication]terminate:nil];
        exit(0);
     }
    
     - (void)applicationWillTerminate:(NSNotification *)notification 
     {
        //relaunch the app via NSTask
        if (isRelaunch) {
           NSString *appPath = [[NSBundle mainBundle] bundlePath];
           NSTask *task = [NSTask new];
           [task setLaunchPath:@"/usr/bin/open"];
           [task setArguments:[NSArray arrayWithObjects:appPath, nil]];
           [task launch];
    
           //After finished relaunch, run the following function
           [self finishedRelaunch];
          }
     }
    
     -(void)finishedRelaunch
     {
         NSArray* langs = [[NSUserDefaults standardUserDefaults] objectForKey: @"AppleLanguages"];
    
         //setLanguage function is using to change the NSMenuItem state
        if ([langs count] > 0) [self setLanguage: [langs objectAtIndex: 0]];
        else [self setLanguage: nil];
     }
    
      //Use to set NSMenuItem state
      - (void)setLanguage:(NSString *)name
     {
        NSString* ident = [NSLocale canonicalLocaleIdentifierFromString: name];
    
        [[[languageMenu submenu] itemWithTag: 0] setState: (nil == name) ? NSOnState : NSOffState];
        [[[languageMenu submenu] itemWithTag: 1] setState: ([ident isEqual: @"en"]) ? NSOnState : NSOffState];
        [[[languageMenu submenu] itemWithTag: 2] setState: ([ident isEqual: @"de"]) ? NSOnState : NSOffState];
            ...
     }
    
    1. The result is, when I checked the plist, “AppleLanguages” section did changed to new language (from jp -> de). However, the xib files and string did not change at all. Could you guys tell me how to fix it?

    введите здесь описание изображения

Спасибо!!! (Моя цель разработки — 10.5, а мой базовый SDK — OS X 10.7)


person YU FENG    schedule 30.06.2013    source источник
comment
Что произойдет, если вы выйдете из системы и войдете снова после внесения изменений? Что говорят значения по умолчанию?   -  person uchuugaka    schedule 30.06.2013
comment
На самом деле, имя в -(void)setLanguage:(NSString*)name возвращает мне инициал того, что я выбрал в NSmenuItems, например de. Но это выдаст мне сообщение об ошибке - [__NSCFConstantString count]: нераспознанный селектор отправлен экземпляру 0x100021c58, и галочка на NSMenuItems также не будет изменена.   -  person YU FENG    schedule 30.06.2013
comment
Загружаются ли локализованные перья, если вы используете стандартный способ изменения предпочтительного языкового приоритета в Системных настройках, а затем перезапускаете приложение?   -  person uchuugaka    schedule 01.07.2013
comment
Нет почему? Я уже добавил эти перья для разных языков. :(   -  person YU FENG    schedule 01.07.2013
comment
Ну, это помогает узнать, действительно ли ваши перья загружаются правильно со стандартными пользовательскими настройками.   -  person uchuugaka    schedule 01.07.2013
comment
Да, я понимаю это и пытался изменить предпочитаемый язык в системе, но мое приложение по-прежнему загружается неправильно. Что я должен делать? Спасибо   -  person YU FENG    schedule 01.07.2013


Ответы (2)


Ключ AppleLanguages должен быть NSArray, а не строкой. Попробуйте создать массив только с вашим предписанным языком и установите его в настройках вместо строки.

Итак, вместо

[[NSUserDefaults standardUserDefaults] 
    setObject:[languages objectAtIndex: [sender tag]] forKey:@"AppleLanguages"];

[[NSUserDefaults standardUserDefaults] 
    setObject:[NSArray arrayWithObject: 
        [languages objectAtIndex: [sender tag]]] forKey:@"AppleLanguages"];

Я также заметил, что у вас есть ключ AppleLanguages в файле Bundle. Почему это? Тебе это там не нужно.

Как только ваше приложение запустится, дважды проверьте значение вашего NSUserDefaults с помощью defaults read <app_bundle_id> и проверьте ключ AppleLanguages и убедитесь, что он установлен и является массивом. Если это установлено правильно, это должно повлиять на следующий запуск вашего приложения.

person gaige    schedule 30.06.2013
comment
Это помогает мне исправить ошибку - [__NSCFConstantString count]: нераспознанный селектор отправлен в экземпляр 0x100021c58, но я не увидел никаких изменений. Это потому, что я использовал неправильный способ перезапустить приложение? - person YU FENG; 30.06.2013

Вот два шага, чтобы выяснить эту проблему:

  1. Как сказал Гейдж: [[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObject: [языки objectAtIndex: [тег отправителя]]] forKey: @"AppleLanguages"];

  2. Затем измените начальное имя на полное, в моем случае измените «jp» на «Japanese».

Тогда это сработает.

person YU FENG    schedule 02.07.2013