一、如何建立 Localized.strings 文件
可以參考這篇文章,比較詳細(xì)
二枷恕、使用 genstrings 自動生成 key-value
genstrings [-a] [-q] [-o <outputDir>] sourcefile
其中參數(shù):
-a 在存在的文件后面追加內(nèi)容
-q 關(guān)閉多個鍵/值對的警告
-o 指定輸出目錄
因此如果我們想輸出到en.lproj目錄,則代碼如下:
genstrings -o en.lproj *.m
遍歷 子目錄:
find ./ -name *.m -print0 | xargs -0 genstrings -o (en.lproj目錄)
find ./ -name '*.m' -print0 -o -name '*.h' -print0 | xargs -0 genstrings -o en.lproj
(基本都說genstrings -o en.lproj *.m就可以生成Localizable.strings,但是這個命令只能生成當(dāng)前目錄的计寇,并沒有遍歷子目錄,所以基本沒用)
這樣系統(tǒng)就會把子目錄用到NSLocalizedString函數(shù)的key值都寫到文件里脂倦。
需要注意的是番宁,NSLocalizedString(key,comment),用這個函數(shù)時赖阻,key不能是宏定義或者一些動態(tài)字符串蝶押,否則用上面的命令會報錯。
三火欧、系統(tǒng)如何選擇
- 在iOS7及之前版本棋电,系統(tǒng)只能設(shè)置一種語言,如果APP不支持系統(tǒng)設(shè)置的語言苇侵,選用備選語言的規(guī)則是:
如果APP支持英文赶盔,直接選擇英文
如果APP不支持英文,隨機(jī)挑選一個榆浓,不清楚這里挑選的規(guī)則于未。文檔上說會選用CFBundleDevelopmentRegion設(shè)置的語言,但我測試后發(fā)現(xiàn)并沒有陡鹃,系統(tǒng)直接忽略了這個字段烘浦。
舉個例子,APP支持中文跟英文杉适,當(dāng)系統(tǒng)語言是不是中文或英文時谎倔,都會選擇英文。若APP支持中文跟日文猿推,系統(tǒng)語言不是中文或日文片习,將會隨機(jī)挑選一個。
- 從iOS8開始蹬叭,系統(tǒng)語言可以設(shè)置一個語言列表藕咏,會根據(jù)這個語言列表的排序選用備選語言,規(guī)則就變了:
如果APP支持的語言在系統(tǒng)語言列表里有秽五,優(yōu)先選擇列表上排序靠前的語言孽查。
如果APP支持的語言沒在系統(tǒng)語言列表上,按CFBundleDevelopmentRegion的值選擇坦喘,無論APP是否支持英文盲再,英文不再是默認(rèn)的備選語言西设。
舉個例子,APP支持中文跟英文答朋,CFBundleDevelopmentRegion的值是中文贷揽,當(dāng)系統(tǒng)語言列表是[日文]或[日文,中文]時,會選擇中文梦碗,系統(tǒng)語言列表是[日文,英文]時禽绪,會選擇英文。
二洪规、 "AppleLanguages" 返回值 變化
ios8以后
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSArray* languages = [def objectForKey:@"AppleLanguages"];
返回多了 區(qū)域信息印屁,類似于:
iOS 7: @"en",@"zh-Hans",@"zh-Hant"
iOS 8: @"en-US",@"zh-Hans-CN",@"zh-Hant-TW"
三、代碼實(shí)現(xiàn)
下面代碼 實(shí)現(xiàn) 了 應(yīng)用內(nèi) 設(shè)置語言斩例,繁體中文 雄人,簡體中文 都用簡體中文,其他用英文:
頭文件:
#import <Foundation/Foundation.h>
// 國際化
#define DDLocalizedString(key, comment) [[LocalizedUtil bundle] localizedStringForKey:(key) value:@"" table:nil]
typedef NS_ENUM(NSUInteger, DDLocalizedType) {
DDLocalizedType_FollowSystem,
DDLocalizedType_SimpleChinese,
DDLocalizedType_English
};
@interface LocalizedUtil : NSObject
+ (NSBundle *)bundle;
+ (NSString *)userLanguage;
+ (void)setLocalizedType:(DDLocalizedType)type;
+ (DDLocalizedType)localizedType;
.m 文件:
#import "LocalizedUtil.h"
static NSString *LocalizedLanguage = nil;
static NSBundle *LocalizedBundle = nil;
@implementation LocalizedUtil
+ ( NSBundle * )bundle {
if (!LocalizedBundle) {
NSString *language = [self userLanguage];
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];
LocalizedBundle = [NSBundle bundleWithPath:path];
if (!LocalizedBundle) { // 不存在樱拴,說明 設(shè)置了 不支持的語言柠衍,默認(rèn)改為英語洋满。
LocalizedBundle = [self enBundle];
}
}
return LocalizedBundle;
}
+ (NSBundle *)enBundle
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj" ];
NSBundle *bundle = [NSBundle bundleWithPath:path];
return bundle;
}
+(NSString *)userLanguage {
if (LocalizedLanguage) {
return LocalizedLanguage;
}
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *language = [def valueForKey:@"userLanguage"];
if (language.length > 0) {
LocalizedLanguage = language;
} else {
NSArray* languages = [def objectForKey:@"AppleLanguages"];
NSString *l = [languages objectAtIndex:0];
NSDictionary *components = [NSLocale componentsFromLocaleIdentifier:l];
if (components[NSLocaleCountryCode]) {
// 返回了 地區(qū)信息
LocalizedLanguage = components[NSLocaleLanguageCode];
} else {
LocalizedLanguage = l;
}
if ([LocalizedLanguage hasPrefix:@"zh-Hant"]) { // 繁體 中文
LocalizedLanguage = @"zh-Hans"; // 改為 簡體中文
}
}
return LocalizedLanguage;
}
+(void)setUserlanguage:(NSString *)language
{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
// 1.第一步改變bundle的值
if (language.length == 0) {
LocalizedBundle = [NSBundle mainBundle];
} else {
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];
LocalizedBundle = [NSBundle bundleWithPath:path];
if (!LocalizedBundle) { // 不存在晶乔,說明 設(shè)置了 不支持的語言,默認(rèn)改為英語牺勾。
LocalizedBundle = [self enBundle];
}
}
//2.持久化
[def setValue:language forKey:@"userLanguage"];
[def synchronize];
LocalizedLanguage = language;
}
+ (void)setLocalizedType:(DDLocalizedType)type
{
NSString *language = nil;
switch (type) {
case DDLocalizedType_FollowSystem:
language = nil;
break;
case DDLocalizedType_SimpleChinese:
language = @"zh-Hans";
break;
case DDLocalizedType_English:
language = @"en";
break;
default:
break;
}
[self setUserlanguage:language];
}
+ (DDLocalizedType)localizedType
{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *language = [def valueForKey:@"userLanguage"];
if ([language isEqualToString:@"zh-Hans"]) {
return DDLocalizedType_SimpleChinese;
} else if ([language isEqualToString:@"en"]) {
return DDLocalizedType_English;
} else {
return DDLocalizedType_FollowSystem;
}
}
@end