NSLocalizedString を使用して、IOS ではなく Mac の言語を変更したいと考えています。これが私が行った手順です。ただし、アプリを再起動しても、言語は変更されません。
- 新しい xib ファイルと NSLocalizedString を追加
- 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]; ... }
- その結果、plist を確認したところ、「AppleLanguages」セクションが新しい言語 (jp -> de) に変更されました。ただし、xib ファイルと文字列はまったく変更されませんでした。修正方法を教えていただけますか?
ありがとう!!!(私の開発ターゲットは 10.5 で、ベース SDK は OS X 10.7 です)