如何强制应用程序在iOS / Objective-C中更改语言?

我正在使应用程序更改语言马上就像这个应用程序的问题 。

我发现了很多类似这样的问题。

但不幸的是,这些问题的相关答案不适用于我。 当我点击一个单元格时,我需要立即更改语言。

有任何想法吗? 预先感谢。

我认为这会解决你的问题。

1个月前我有同样的问题。

你可以按照这个教程。

例:

在你的.strings文件中,你把翻译: "hello" = "HOLA MUNDO";

 #import "LocalizationSystem.h" LocalizationSetLanguage(@"Spanish"); CCLabel* label = [CCLabel labelWithString:AMLocalizedString(@"hello",@"Hello World") fontName:@"Marker Felt" fontSize:32]; 

编辑 :这是用户在评论中要求的附加信息:
如果你想翻译你的语言选项被改变的整个视图,我build议你在每次改变语言时都会调用这个方法:

 -(void)translateOnChoose { self.label.text = AMLocalizedString(@"hello",@"Hello World"); } 

我的解决scheme

首先你需要创buildstring文件

 Go to Project Right Click. New File->iOS Under iOS you can see the Resource Click Resource and you can see the String File among the group of files. Click that give name whatever you want. 

现在你可以在lihis下创buildstring文件

 "Date"="Date"; "Time"="Time"; "Done"="Done"; "Back"="Back"; 

在appDelegate.h中

 -(NSString*) languageSelectedStringForKey:(NSString*) key { NSString *path; AppDelegate *app=(AppDelegate *)[[UIApplication sharedApplication]delegate]; if(app.currentLanguage==ENGLISH) path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]; else if(app.currentLanguage==TAMIL) path = [[NSBundle mainBundle] pathForResource:@"ta-IN" ofType:@"lproj"]; else if(app.currentLanguage==SPANISH) path = [[NSBundle mainBundle] pathForResource:@"es" ofType:@"lproj"]; else if(app.currentLanguage==FRENCH) path = [[NSBundle mainBundle] pathForResource:@"fr" ofType:@"lproj"]; else if(app.currentLanguage==JAPANESE) path = [[NSBundle mainBundle] pathForResource:@"ja" ofType:@"lproj"]; else if(app.currentLanguage==GERMAN) path = [[NSBundle mainBundle] pathForResource:@"de" ofType:@"lproj"]; else if(app.currentLanguage==KOREAN) path = [[NSBundle mainBundle] pathForResource:@"ko" ofType:@"lproj"]; else if(app.currentLanguage==RUSSIAN) path = [[NSBundle mainBundle] pathForResource:@"ru" ofType:@"lproj"]; else if(app.currentLanguage==HINDI) path = [[NSBundle mainBundle] pathForResource:@"hi" ofType:@"lproj"]; else if(app.currentLanguage==CHINESE) path = [[NSBundle mainBundle] pathForResource:@"zh-Hans" ofType:@"lproj"]; else if(app.currentLanguage==ITALIAN) path = [[NSBundle mainBundle] pathForResource:@"it" ofType:@"lproj"]; else if(app.currentLanguage==PORTUGUESE) path = [[NSBundle mainBundle] pathForResource:@"pt" ofType:@"lproj"]; else if(app.currentLanguage==THAI) path = [[NSBundle mainBundle] pathForResource:@"th" ofType:@"lproj"]; else if(app.currentLanguage==MALAY) path = [[NSBundle mainBundle] pathForResource:@"ms" ofType:@"lproj"]; else if(app.currentLanguage==INDONESIAN) path = [[NSBundle mainBundle] pathForResource:@"id" ofType:@"lproj"]; else if(app.currentLanguage==CHINESE1) path = [[NSBundle mainBundle] pathForResource:@"zh-Hant" ofType:@"lproj"]; else { path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]; } NSBundle* languageBundle = [NSBundle bundleWithPath:path]; NSString* str=[languageBundle localizedStringForKey:key value:@"" table:@"LocalizeSTRING"]; return str; } 

在appDelegate.m的didFinishLaunchingWithOptions中调用上面的方法

 NSString *str=[[[NSUserDefaults standardUserDefaults]objectForKey:@"AppleLanguages"] objectAtIndex:0]; if([str isEqualToString:[NSString stringWithFormat: @"en"]]) { currentLanguage=ENGLISH; selectedrow=ENGLISH; } else if([str isEqualToString:[NSString stringWithFormat: @"ta-IN"]]) { currentLanguage=TAMIL; selectedrow=TAMIL; } else if([str isEqualToString:[NSString stringWithFormat: @"es"]]) { currentLanguage=SPANISH; selectedrow=SPANISH; } else if([str isEqualToString:[NSString stringWithFormat: @"fr"]]) { currentLanguage=FRENCH; selectedrow=FRENCH; } else if([str isEqualToString:[NSString stringWithFormat: @"ja"]]) { currentLanguage=JAPANESE; selectedrow=JAPANESE; } else if([str isEqualToString:[NSString stringWithFormat: @"de"]]) { currentLanguage=GERMAN; selectedrow=GERMAN; } else if([str isEqualToString:[NSString stringWithFormat: @"ko"]]) { currentLanguage=KOREAN; selectedrow=KOREAN; } else if([str isEqualToString:[NSString stringWithFormat: @"ru"]]) { currentLanguage=RUSSIAN; selectedrow=RUSSIAN; } else if([str isEqualToString:[NSString stringWithFormat: @"hi"]]) { currentLanguage=HINDI; selectedrow=HINDI; } else if([str isEqualToString:[NSString stringWithFormat: @"zh-Hans"]]) { currentLanguage=CHINESE; selectedrow=CHINESE; } else if([str isEqualToString:[NSString stringWithFormat: @"it"]]) { currentLanguage=ITALIAN; selectedrow=ITALIAN; } else if([str isEqualToString:[NSString stringWithFormat: @"pt"]]) { currentLanguage=PORTUGUESE; selectedrow=PORTUGUESE; } else if([str isEqualToString:[NSString stringWithFormat: @"th"]]) { currentLanguage=THAI; selectedrow=THAI; } else if([str isEqualToString:[NSString stringWithFormat: @"ms"]]) { currentLanguage=MALAY; selectedrow=MALAY; } else if([str isEqualToString:[NSString stringWithFormat: @"id"]]) { currentLanguage=INDONESIAN; selectedrow=INDONESIAN; } else if([str isEqualToString:[NSString stringWithFormat: @"zh-Hant"]]) { currentLanguage=CHINESE1; selectedrow=CHINESE1; } [self languageSelectedStringForKey:str]; 

然后在你需要的视图控制器

 -(NSString*) languageSelectedStringForKey:(NSString*) key { app=(AppDelegate *)[[UIApplication sharedApplication]delegate]; if(app.currentLanguage==ENGLISH) path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]; else if(app.currentLanguage==TAMIL) path = [[NSBundle mainBundle] pathForResource:@"ta-IN" ofType:@"lproj"]; else if(app.currentLanguage==SPANISH) path = [[NSBundle mainBundle] pathForResource:@"es" ofType:@"lproj"]; else if(app.currentLanguage==FRENCH) path = [[NSBundle mainBundle] pathForResource:@"fr" ofType:@"lproj"]; else if(app.currentLanguage==JAPANESE) path = [[NSBundle mainBundle] pathForResource:@"ja" ofType:@"lproj"]; else if(app.currentLanguage==GERMAN) path = [[NSBundle mainBundle] pathForResource:@"de" ofType:@"lproj"]; else if(app.currentLanguage==KOREAN) path = [[NSBundle mainBundle] pathForResource:@"ko" ofType:@"lproj"]; else if(app.currentLanguage==RUSSIAN) path = [[NSBundle mainBundle] pathForResource:@"ru" ofType:@"lproj"]; else if(app.currentLanguage==HINDI) path = [[NSBundle mainBundle] pathForResource:@"hi" ofType:@"lproj"]; else if(app.currentLanguage==CHINESE) path = [[NSBundle mainBundle] pathForResource:@"zh-Hans" ofType:@"lproj"]; else if(app.currentLanguage==ITALIAN) path = [[NSBundle mainBundle] pathForResource:@"it" ofType:@"lproj"]; else if(app.currentLanguage==PORTUGUESE) path = [[NSBundle mainBundle] pathForResource:@"pt" ofType:@"lproj"]; else if(app.currentLanguage==THAI) path = [[NSBundle mainBundle] pathForResource:@"th" ofType:@"lproj"]; else if(app.currentLanguage==MALAY) path = [[NSBundle mainBundle] pathForResource:@"ms" ofType:@"lproj"]; else if(app.currentLanguage==INDONESIAN) path = [[NSBundle mainBundle] pathForResource:@"id" ofType:@"lproj"]; else if(app.currentLanguage==CHINESE1) path = [[NSBundle mainBundle] pathForResource:@"zh-Hant" ofType:@"lproj"]; else { path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]; } NSBundle* languageBundle = [NSBundle bundleWithPath:path]; NSString* str=[languageBundle localizedStringForKey:key value:@"" table:@"LocalizeSTRING"]; return str; } 

在你的viewDidLoad和viewWillAppear方法中调用上面的方法,或者调用你想调用的那个方法

 - (void)viewWillAppear:(BOOL)animated { //If you want to set language in label,TextFiled localizeBackLabel.text=[self languageSelectedStringForKey:@"Back"]; localizeDoneLabel.text=[self languageSelectedStringForKey:@"Done"]; localizeTimeLabel.text=[self languageSelectedStringForKey:@"Time"]; localizeDateLabel.text=[self languageSelectedStringForKey:@"Date"]; //If you want to set language in button [yourButton setTitle:[self languageSelectedStringForKey:@"Back"]; forState:UIControlStateNormal]; [yourButton setTitle:[self languageSelectedStringForKey:@"Done"]; forState:UIControlStateNormal]; //If you want to set the Language in cell cell.labelHomeList.text=[self languageSelectedStringForKey:@"Date"]; cell.labelHomeList.text=[self languageSelectedStringForKey:@"Time"]; } 

最后,如果您想将语言更改为其他语言。例如在(设置)表中,您有两种语言。如果要将其更改为其他语言,请按照以下编码

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { AppDelegate *app=(AppDelegate *)[[UIApplication sharedApplication]delegate]; app.selectedrow=indexPath.row; if (indexPath.row==0) { app.currentLanguage=ENGLISH; [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", nil]forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; NSLog(@"%d", [[NSUserDefaults standardUserDefaults] synchronize]); } else { app.currentLanguage=CHINESE1; [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"zh-Hant", nil]forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; } } 

它完美的作品。

使用reloadData

 [YourUITableView reloadData]; 

不要忘记把你的语言保存在一个NSUserDefaults

  [[NSUserDefaults standardUserDefaults] setValue:lang forKey:LANG]; [[NSUserDefaults standardUserDefaults] synchronize]; 

所以你可以相应地加载你的视图和故事板,因为当你的tableView被重新加载时,你可以添加你的语言检查,以在cellForRowAtIndexPath method显示正确的视图。

编辑…..

如果你想使用NSNotification,注册你的观察者在你的viewDidLoad,这样

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateLanguage:) name:@"updateLanguageObserver" object:nil]; 

并在您didSelectRowAtIndexPath添加侦听器

 [[NSNotificationCenter defaultCenter] postNotificationName:@"updateLanguageObserver" object:self userInfo:nil]; 

这将调用你的方法updateLanguage你可以处理你的本地化和tableView重新加载。

并且不要忘记在viewController中添加监听器来移除观察者

  - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } 

你应该看一下这个: 这里