我想在不重新启动的情况下更改应用内的应用语言。
这两种语言都有Localizable.strings文件。我的所有XIB和主要故事板也都是。
以下代码只能在重新启动应用程序后更改语言
的main.m:
int main(int argc, char *argv[])
{
NSString *currLang = [[NSUserDefaults standardUserDefaults] stringForKey:@"Lang"];
if (!currLang) {
NSString *languageCode = [[NSLocale preferredLanguages] objectAtIndex:0];
if ([languageCode isEqualToString:@"ru"]) {
[[NSUserDefaults standardUserDefaults] setValue:languageCode forKey:@"Lang"];
}
else [[NSUserDefaults standardUserDefaults] setValue:@"en" forKey:@"Lang"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
currLang = nil;
currLang = [[NSUserDefaults standardUserDefaults] stringForKey:@"Lang"];
if ([currLang isEqualToString:@"ru"]) {
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"ru", @"en", nil]
forKey:@"AppleLanguages"];
}
else
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"ru", nil]
forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
方法有2个按钮(Eng& Ru):
- (IBAction)changeLang:(UIButton *)sender
{
if ([sender isEqual:btnSetRuLang]) {
if ([[userDefaults stringForKey:@"Lang"] isEqualToString:@"ru"]) {
return;
}
[userDefaults setValue:@"ru" forKey:@"Lang"];
[userDefaults synchronize];
}
else {
if ([[userDefaults stringForKey:@"Lang"] isEqualToString:@"en"]) {
return;
}
[userDefaults setValue:@"en" forKey:@"Lang"];
[userDefaults synchronize];
}
NSString *currLang = [userDefaults stringForKey:@"Lang"];
NSString *alertBody;
if ([currLang isEqualToString:@"ru"]) {
[userDefaults setObject:[NSArray arrayWithObjects:@"ru", @"en", nil]
forKey:@"AppleLanguages"];
alertBody = @"Перезапустите приложение для смены языка";
}
else {
[userDefaults setObject:[NSArray arrayWithObjects:@"en", @"ru", nil]
forKey:@"AppleLanguages"];
alertBody = @"Restart application for change language";
}
[userDefaults synchronize];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hom" message:alertBody delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alertView show];
}
那么,如何在不重新启动应用程序的情况下更改lang?
谢谢。
答案 0 :(得分:1)
我在我的一个应用程序中做了同样的事情,当用户更改语言时,我做了同样的操作并通过调用setNeedsDisplay重新加载导航堆栈中的所有View控制器,这使用新的语言设置再次呈现视图。
修改强>
对于视图控制器调用[self setNeedsDisplay]
的每个实例,或者您可以通过视图控制器的实例替换self。
答案 1 :(得分:1)
我建议你使用
NSLocalizedStringFromTable(key, tbl, comment)
而不是NSLocalizedString(key, comment)
这样你需要做的就是维护一个表名变量。使用 en.strings 和 ru.strings 文件而不是Localizable.strings,当语言更改时将表名称传递为 en 或 RU 强>
同样@Parser建议,你必须刷新你的观点。