0

NSLocalizedString を使用して、IOS ではなく Mac の言語を変更したいと考えています。これが私が行った手順です。ただし、アプリを再起動しても、言語は変更されません。

  1. 新しい xib ファイルと NSLocalizedString を追加

ここに画像の説明を入力

  1. NSMenuItems を作成します。

ここに画像の説明を入力

  1. 次に、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. その結果、plist を確認したところ、「AppleLanguages」セクションが新しい言語 (jp -> de) に変更されました。ただし、xib ファイルと文字列はまったく変更されませんでした。修正方法を教えていただけますか?

    ここに画像の説明を入力

ありがとう!!!(私の開発ターゲットは 10.5 で、ベース SDK は OS X 10.7 です)

4

2 に答える 2

0

AppleLanguagesキーは、NSArray文字列ではなく である必要があります。所定の言語だけを含む配列を作成し、文字列の代わりに設定で設定してみてください。

だから、代わりに

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

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

AppleLanguagesまた、バンドル ファイルにキーがあることにも気付きました。何故ですか?そこは必要ないはずです。

アプリが実行されたら、キーNSUserDefaultsを使用して値を再defaults read <app_bundle_id>確認し、AppleLanguagesキーが設定され、配列であることを確認します。それが正しく設定されていれば、アプリの次の起動に影響するはずです

于 2013-06-30T17:11:21.633 に答える