为什么语言更改需要应用程序在 Objective C 后重新启动

Why language change required app to restart in Objective C

我是 iOS 的新人,我在语言转换方面遇到问题

对于英语,我使用这样的代码

 [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];
            [[NSUserDefaults standardUserDefaults]synchronize];

            //to set the selected language at runtime (dynamically)
            NSLog(@"Language set=Malay");
            [NSBundle setLanguage:@"en"];
            MenuScreen *menu=[[MenuScreen alloc] initWithNibName:@"MenuScreen" bundle:nil];
            [self.navigationController pushViewController:menu animated:YES];

对于泰语,我使用了这样的代码

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"th-TH", nil] forKey:@"AppleLanguages"];
            [[NSUserDefaults standardUserDefaults]synchronize];

            //to set the selected language at runtime (dynamically)
            NSLog(@"Language set=Malay");
            [NSBundle setLanguage:@"th-TH"];
            MenuScreen *menu=[[MenuScreen alloc] initWithNibName:@"MenuScreen" bundle:nil];
            [self.navigationController pushViewController:menu animated:YES];

但是每次都需要重启应用。是否有任何解决方案或我做错的任何事情。 提前致谢!

您好,ios 我们有用于存储本地化文件的捆绑包.. 当我们使用切换语言时 [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"th-TH", nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults]同步];

它只是更改当前应用程序的语言环境,而不是本地化包。

要更改应用内的语言,您需要为此更改语言包。 要在 App 中更改语言,您需要使用

BundleLocalization

https://github.com/cmaftuleac/BundleLocalization

[BundleLocalization sharedInstance].language = @"de"; NSLog(@"Application language: %@", [BundleLocalization sharedInstance].language);

Muju 我创建了示例项目,并努力为您找到解决方案 question.I 完美地找到了解决方案。

在下面的示例中,我想将“欢迎来到泰国”更改为“ยินดีต้อนรับสู่ประเทศไทย”。我为此使用本地化概念。

在开始之前,我想让你看看我的故事板设计

请按照以下步骤操作。

STEP 1:Click 项目->信息->本地化->点击+

现在显示 Language.From 的下拉列表,我们应该 select Thai

STEP 2:Once 我们从下拉列表中选择或 select 语言,显示如下 window 我们需要点击完成按钮

现在看起来像下面

STEP 3:Create 用于本地化的字符串文件并设置名称。

上面我将字符串文件名设置为LocalizationThai

STEP 4:Click LocalizationThai.strings 也点击文件 Inspector.Click 文件里面的 Localization Inspector.Now 它显示下面的弹出框。

STEP 5:Click Localize.Once 你Localize了,下面显示是这样的

STEP 6:Click 3 个复选框

现在在捆绑包中我们有 3 个文件 LocalizationThai.strings

STEP 7:Write 您需要更改字符串文件中的文本。

i.In LocalizationThai.strings(泰文)文件我写在下面text

ii.In LocalizationThai.strings(英文)文件我写在下面text

iii.In LocalizationThai.strings(Base)文件我写在下面text

STEP 8:Create Header 多语言文件。

第 9 步:设置 Header 名称(我将 header 名称设置为 LocalizationHeader)并在 Header 文件中定义语言,例如以下

LocalizationHeader.h

#ifndef LocalizationHeader_h
#define LocalizationHeader_h


#define ENGLISH 0
#define THAI 1


#endif /* LocalizationHeader_h */

STEP 10:Implement 下面的编码部分

Localization.h

#import <Foundation/Foundation.h>
#import "LocalizationHeader.h"
@interface Localization : NSObject
+(Localization *)sharedInstance;
+(NSString*) strSelectLanguage:(int)curLang;
+(NSString*) languageSelectedStringForKey:(NSString*) key;
@end

Localization.m

#import "Localization.h"
int currentLanguage,selectedrow;
@implementation Localization

+(Localization *)sharedInstance
{
    static Localization *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[Localization alloc] init];
    });
    return sharedInstance;
}


+(NSString*) strSelectLanguage:(int)curLang{
    if(curLang==THAI){
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"th", nil]forKey:@"AppleLanguages"];
    }
    else{
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil]forKey:@"AppleLanguages"];
    }
    [[NSUserDefaults standardUserDefaults] synchronize];
    currentLanguage=curLang;
    NSString *strLangSelect = [[[NSUserDefaults standardUserDefaults]objectForKey:@"AppleLanguages"] objectAtIndex:0];
    return strLangSelect;
}

+(NSString*) languageSelectedStringForKey:(NSString*) key
{
    NSString *path;
    NSString *strSelectedLanguage = [[[NSUserDefaults standardUserDefaults]objectForKey:@"AppleLanguages"] objectAtIndex:0];
    //When we check with iPhone,iPad device it shows "en-US".So we need to change it to "en"
    if([strSelectedLanguage hasPrefix:@"en-"])
        strSelectedLanguage = [strSelectedLanguage stringByReplacingOccurrencesOfString:@"en-US" withString:@"en"];
    if([strSelectedLanguage isEqualToString:[NSString stringWithFormat: @"en"]]){
        currentLanguage=ENGLISH;
        selectedrow=ENGLISH;
        path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
    }
    else{
        currentLanguage=THAI;
        selectedrow=THAI;
        path = [[NSBundle mainBundle] pathForResource:@"th" ofType:@"lproj"];
    }
    NSBundle* languageBundle = [NSBundle bundleWithPath:path];
    NSString* str=[languageBundle localizedStringForKey:key value:@"" table:@"LocalizationThai"];
    return str;
}
@end

ViewController.h

#import <UIKit/UIKit.h>
#import "Localization.h"
@interface ViewController : UIViewController{
    Localization *localization;

}
@property (strong, nonatomic) IBOutlet UILabel *lblWelcome;
- (IBAction)actionChangeLanToThai:(id)sender;
- (IBAction)actionChangeLangToEng:(id)sender;
@end

ViewController.m

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize lblWelcome;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    localization = [Localization sharedInstance];
    lblWelcome.text = [Localization languageSelectedStringForKey:@"Welcome to Thailand"];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)actionChangeLanToThai:(id)sender {
    [Localization strSelectLanguage:THAI];
    lblWelcome.text = [Localization languageSelectedStringForKey:@"Welcome to Thailand"];

}

- (IBAction)actionChangeLangToEng:(id)sender {
    [Localization strSelectLanguage:ENGLISH];
    lblWelcome.text = [Localization languageSelectedStringForKey:@"Welcome to Thailand"];
}
@end

当我先 运行 应用程序时

然后当我将语言从英语更改为泰语时

当我把它改成英文的时候再一次

对于 XIB,您必须遵循相同的步骤

以下为XIB

我创建了 ViewController XIB.ViewController 名称是 RootViewController

现在看设计部分

AppDelegate.h

#import <UIKit/UIKit.h>
#import "RootViewController.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong,nonatomic) RootViewController *viewController;
@end

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.viewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    self.window.rootViewController = navController;
    [navController setNavigationBarHidden:YES];
    [self.window makeKeyAndVisible];
    return YES;     
  }

根目录ViewController.h

 #import <UIKit/UIKit.h>
 #import "Localization.h"
 @interface RootViewController : UIViewController{
    Localization *localization;
 }
 @property (strong, nonatomic) IBOutlet UILabel *lblWelcomeThaiLang;
 - (IBAction)actionChangeLangToThai:(id)sender;
 - (IBAction)actionChangeLangToEng:(id)sender;
 @end

根目录ViewController.m

 #import "RootViewController.h"
 @interface RootViewController ()
 @end
 @implementation RootViewController
 @synthesize lblWelcomeThaiLang;
 - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
 }
 - (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
 }
 - (IBAction)actionChangeLangToThai:(id)sender {
    [Localization strSelectLanguage:THAI];
    lblWelcomeThaiLang.text = [Localization languageSelectedStringForKey:@"Welcome to Thailand"];
 }
 - (IBAction)actionChangeLangToEng:(id)sender {
    [Localization strSelectLanguage:ENGLISH];
    lblWelcomeThaiLang.text = [Localization languageSelectedStringForKey:@"Welcome to Thailand"];
 }
 @end

现在看结果