有没有办法在运行时更改应用程序语言?
因此,在更改后NSLocalizedString
会立即返回新语言的字符串。
我现在正在做的是使用以下代码更改语言:
- (void)onChangeLanguage: (id)sender
{
NSArray *lang = [NSArray arrayWithObjects:((InfoWhatever *)sender).language, nil];
[[NSUserDefaults standardUserDefaults] setObject:lang forKey:@"AppleLanguages"];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
NSLog(@"Current language: %@", currentLanguage);
}
只有在重新启动应用程序后,语言才会更改。
答案 0 :(得分:11)
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
[languages insertObject:@"de" atIndex:0]; // ISO639-1
[[NSUserDefaults standardUserDefaults] synchronize];
答案 1 :(得分:7)
通过从应用程序中选择使用特定语言的技巧是强制NSLocalizedString根据所选语言使用特定的包,
这是我为此http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html
撰写的帖子以下是一个示例应用https://github.com/object2dot0/Advance-Localization-in-ios-apps
的代码答案 2 :(得分:7)
你可以做到。这是方法 http://aggressive-mediocrity.blogspot.com/2010/03/custom-localization-system-for-your.html
简介下载并向项目中添加2个文件
http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.h
http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.m
2
#import "LocalizationSystem.h"
3
- (IBAction)btnEnglishClicked:(id)sender {
LocalizationSetLanguage(@"en");
}
4设置上述语言后
AMLocalizedString(@"Key", nil)
多数民众赞成。
答案 3 :(得分:5)
我怀疑你能做到这一点,即使设置应用程序也无法做到这一点。
(当您在“设置”应用中更改语言时,屏幕变黑,并显示“设置语言...”和进度轮。经过漫长的等待,您又回到了Springboard。它几乎看起来像手机重新启动。)
答案 4 :(得分:3)
我想出了一个允许你使用NSLocalizedString
的解决方案。我创建了一个NSBundle
来电NSBundle+RunTimeLanguage
类别。界面就是这样。
// NSBundle+RunTimeLanguage.h
#import <Foundation/Foundation.h>
@interface NSBundle (RunTimeLanguage)
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] runTimeLocalizedStringForKey:(key) value:@"" table:nil]
- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName;
@end
实施就是这样。
// NSBundle+RunTimeLanguage.m
#import "NSBundle+RunTimeLanguage.h"
#import "AppDelegate.h"
@implementation NSBundle (RunTimeLanguage)
- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSString *path= [[NSBundle mainBundle] pathForResource:[appDelegate languageCode] ofType:@"lproj"];
NSBundle *languageBundle = [NSBundle bundleWithPath:path];
NSString *localizedString=[languageBundle localizedStringForKey:key value:key table:nil];
return localizedString;
}
@end
只需将导入NSBundle+RunTimeLanguage.h
添加到使用NSLocalizedString
的文件中即可。
如您所见,我将languageCode存储在AppDelegate
的属性中。这可以存储在您喜欢的任何地方。
我唯一不喜欢的事情是NSLocalizedString
marco重新定义的警告。也许有人可以帮我解决这个问题。
答案 5 :(得分:1)
只需添加以下行:
<ExcludeFoldersFromDeployment>Content;Scripts;Views</ExcludeFoldersFromDeployment>
答案 6 :(得分:-1)
试试这个: object_setClass([NSBundle mainBundle],[MyBundle class]);
https://github.com/maximbilan/ios_language_manager/blob/master/README.md