一:跟隨系統切換語言
細心的朋友可能會發現在English后面寫的是3 Files Localized,這是因為英語是系統默認添加的,而且同時為Main.storyboard和LaunchScreen.storyboard設置了多語言,我在自己添加的時候沒有勾選這兩項.
"showText" = "this is a English Text";
"showText" = "Ini adalah teks bahasa Indonesia";
"showText" = "這是一個簡體中文";
通過showText這個Key來對應“=”后面不同語言的文字
NSLocalizedString的使用,有一個必要的條件,就是:多語言文件名字必須是Localizable,否則到最后顯示的只能是key;者中設置完之后只能讓應用跟隨系統的語言版本進行切換,而用戶不能手動進行切換
label.text =NSLocalizedString("label",nil)
//跟隨系統切換, 多語言文件名必須是LocalizableNSLocalizedString("showText",nil);
//下面三個都可以手動設置多語言
//第一個參數:是多語言中的key
//第二個參數:是多語言文件的名字
//第三個參數:是對key的注釋說明,一般傳nil
NSLocalizedStringFromTable(@"showText", @"STLocalizable",nil);
//指定多語言文件名和bundle
NSLocalizedStringFromTableInBundle(@"showText", @"Localizable", bundle,nil);
//在上面的基礎上增加一個默認值的參數
NSLocalizedStringWithDefaultValue(@"showText", @"Localizable", bundle, @"label",nil);
也可以使用NSLocalizedStringFromTable
label.text =NSLocalizedStringFromTable(@"showText", @"Localizable",nil);
這樣在切換系統語言之后,啟動應用后APP內部的語言也就跟著切換了
二:APP內手動切換語言
1>項目工程Show in Finder后,發現每一種語言都對應一個文件夾,后綴是.lproj,
在APP內切換語言的時候,實際上就是取這些文件夾中的Localizable.strings文件
文件的value值,對應的想要切換語言的話,直接切換pathForResource后面的參數即可
NSString*path = [[NSBundlemainBundle] pathForResource:@"zh-Hans"ofType:@"lproj"];
NSString*labelString = [[NSBundlebundleWithPath:path] localizedStringForKey:@"label"value:niltable:@"STLocalizable"];
NSLog(@"result: %@", labelString);
//輸出:MultiLanguage[1887:72599] result: 標簽
3>在應用內切換語言,用NSUserDefaults存儲當前語言
- (IBAction)changeLanguage:(UIButton*)sender {switch(sender.tag) {
case10: {
//中文
[[NSUserDefaultsstandardUserDefaults] setObject:@"zh-Hans"forKey:appLanguage];? ? ? ?
?}
break;
case11: {
//日文
[[NSUserDefaultsstandardUserDefaults] setObject:@"id"forKey:appLanguage];? ? ? ??
}
break;
case12:?
{
//英文
[[NSUserDefaultsstandardUserDefaults] setObject:@"en"forKey:appLanguage]; ? ? ??
?}
break;
default:
break;? ?
?}
}
//根據NSUserDefaults的key去取多語言類型
NSString*laguageType =[NSStringstringWithFormat:@"%@", [[NSUserDefaultsstandardUserDefaults] objectForKey:@"appLanguage"]];
//在文件目錄中確認多語言類型對應的路徑
NSString*path = [[NSBundlemainBundle] pathForResource:laguageType ofType:@"lproj"];
//在多語言文件中查找label對應的值
NSString*labelText = [[NSBundlebundleWithPath:path] localizedStringForKey:@"label"value:niltable:@"ASLocalized"];self.label.text= labelText;
1>默認設置一種語言,比如英文,在APPDelegate的didFinishLaunchingWithOptions中:
if(![[NSUserDefaultsstandardUserDefaults] objectForKey:appLanguage]) {
//默認設為英文[[NSUserDefaultsstandardUserDefaults] setObject:@"en"forKey:appLanguage];
}
//獲取第一個首選語言NSString *language = [NSLocale preferredLanguages][0];
if(![[NSUserDefaults standardUserDefaults] objectForKey:appLanguage]) {? ?
?NSArray? *languages = [NSLocale preferredLanguages];? ??
NSString *language = [languages objectAtIndex:0];
if([language hasPrefix:@"zh-Hans"]) {? ? ? ??
[[NSUserDefaults standardUserDefaults]setObject:@"zh-Hans"forKey:appLanguage];? ? }elseif([language hasPrefix:@"ja"] ) {? ? ? ?
?[[NSUserDefaults standardUserDefaults]setObject:@"ja"forKey:appLanguage];? ??
}else{? ? ? ??
[[NSUserDefaults standardUserDefaults]setObject:@"en"forKey:appLanguage];? ?
?}
}
#define LanguageKey @"appLanguage"http://獲取當前語言[[NSUserDefaultsstandardUserDefaults] objectForKey:LanguageKey];
//獲取首選語言順序
[NSLocale preferredLanguages];
//獲取首選語言第一語言
[[NSLocale preferredLanguages] objectAtIndex:0];
//獲取系統所有語言[NSLocale availableLocaleIdentifiers];
//獲取當前語言文件路徑NSString*currentLanguage = [[NSUserDefaultsstandardUserDefaults] ;objectForKey:LanguageKey];NSString*path = [[NSBundlemainBundle] pathForResource:currentLanguage ofType:@"lproj"];
//根據key獲取當前語言對應的本地字符串(參數value:如果key是nil或key在表中找不到本地化字符串,則返回的值。)
NSString*value = [[NSBundlebundleWithPath:path] localizedStringForKey:@"label"value:niltable:@"Localizable"];
三 以下是自己理解寫出來的
#import "ViewController.h"
//定義一個宏language是語言類型,key是獲取語言的鍵值,Localizable是項目里面創建的.strings文件名 例如:LocalizableStr(@"en",@"showText");
#define LocalizableStr(language,key) [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] localizedStringForKey:key value:nil table:@"Localizable"];
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *EnglishLabel;
@property (weak, nonatomic) IBOutlet UILabel *chaineseLable;
@property (weak, nonatomic) IBOutlet UILabel *indonesian;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)englishButton:(id)sender {
//通過宏手動設置語言
self.EnglishLabel.text = LocalizableStr(@"en",@"showText");
}
- (IBAction)chineseButton:(id)sender {
//通過宏手動設置語言
self.chaineseLable.text = LocalizableStr(@"zh-Hans",@"showText");
}
- (IBAction)indonesianButton:(id)sender {
//跟隨系統語言
self.indonesian.text = NSLocalizedString(@"showText", nil);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
原創 http://blog.csdn.net/feng2qing/article/details/60479620
手動設置參考 http://www.lxweimin.com/p/0ae9dca9a75d