0

我想使用 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. 结果是,当我检查 plist 时,“AppleLanguages”部分确实更改为新语言(从 jp -> de)。但是,xib 文件和字符串根本没有改变。你们能告诉我如何解决它吗?

    在此处输入图像描述

谢谢!!!(我的开发目标是 10.5,我的基础 SDK 是 OS X 10.7)

4

2 回答 2

0

以下是解决此问题的两个步骤:

  1. 就像 gaige 说的: [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject: [languages objectAtIndex: [sender tag]]] forKey:@"AppleLanguages"];

  2. 然后将首字母更改为全名,在我的情况下是将“jp”更改为“Japanese”

然后它将起作用。

于 2013-07-02T14:03:53.150 回答
0

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键并查看它是否已设置并且是一个数组。如果设置正确,它应该会影响您的应用程序的下一次启动

于 2013-06-30T17:11:21.633 回答