最近被安排處理一下舊項目的國際化處理数焊。寫篇文章記錄下心得乍惊,也希望能為遇到問題的你提供點思路蔫耽。開始進入正題撩炊。
國際化處理分為兩種設(shè)置形式:
一: 國際化處理是使應用程序本身在不同的語言系統(tǒng)下展現(xiàn)出不同的語言狀態(tài)外永。例如機主設(shè)備為中文狀態(tài),那么我們的APP內(nèi)部涉及到的信息展示和提示都是用中文提示拧咳。
二:APP內(nèi)部提供設(shè)置界面伯顶,用戶手動來設(shè)置自己需要的語言模式。
設(shè)置步驟
- 添加語言支持(系統(tǒng)默認支持英文環(huán)境)
2.創(chuàng)建語言支持文件
創(chuàng)建新文件骆膝,InfoPlist.strings和Localizable.strings文件
我們先來解釋下這兩個.strings文件分別是什么作用祭衩。
infoPlist.strings是用來設(shè)置APP的應用名稱的相關(guān)信息的
我們在這里配置應用APP在不同語言系統(tǒng)下展示的名稱。
文件配置
如圖我們可以讓自己的app在安裝后展示的名稱根據(jù)系統(tǒng)語言來自動顯示阅签。這些信息就是在infoPlist.strings文件中配置的掐暮。或許你會發(fā)現(xiàn)我的圖片中的兩個.strings文件會有一個下拉小三角政钟,這是因為你還需要一步配置路克。
選中你的.strings 文件(InfoPlist.strings和Localizable.strings的處理方式一致),如上圖點擊箭頭指向的 Localize...按鈕养交,會有彈窗提示精算。
我選擇右側(cè)的按鈕就行了 Localize
此時剛才的位置會出現(xiàn)如下選項
我們分別選擇我們的目標語言就行了 勾選完之后對應的.strings文件下就會生成對應的文件。
此時我們的基本文件配置已經(jīng)完成碎连。(這里需要提示一點:InfoPlist.stirngs文件的命名必須嚴格按照格式字母命名殖妇。Localizable.strings的命名也建議使用(Localizable)因為接下來回用到,如果你沒有按照這個命名規(guī)格破花,那么在使用的時候就要注意一個參數(shù)的設(shè)置了谦趣。接下來回提示到。)
代碼實現(xiàn)
我們先來簡單了解小國際化實現(xiàn)的 內(nèi)部邏輯座每。我們上述配置的文件生成之后 系統(tǒng)會自動生成對應語言的.lproj文件前鹅。
它內(nèi)部就是對應的.strings文件,當我們設(shè)置指定的語言系統(tǒng)之后峭梳,需要通過系統(tǒng)方法指定到對應的文件中來獲取我們的關(guān)鍵字所對應的信息舰绘。我們先來看一下.strings的配置項
如圖我們在獲取相同的關(guān)鍵字時在不同語言系統(tǒng)下對應的值 是不同的。系統(tǒng)就是通過這種方式實現(xiàn)多系統(tǒng)的對應顯示葱椭。
核心代碼實現(xiàn)
.h文件
xxx.h
// ----- 多語言設(shè)置
#define CHINESE @"zh-Hans"
#define ENGLISH @"en"
#define GDLocalizedString(key) [[GDLocalizableController bundle] localizedStringForKey:(key) value:@"" table:nil]
#import <Foundation/Foundation.h>
@interface GDLocalizableController : NSObject
+(NSBundle *)bundle;//獲取當前資源文件
+(void)initUserLanguage;//初始化語言文件
+(NSString *)userLanguage;//獲取應用當前語言
+(void)setUserlanguage:(NSString *)language;//設(shè)置當前語言
@end
.m文件
xxx.m文件
@implementation GDLocalizableController
static NSBundle *bundle = nil;
+(NSBundle *)bundle{
return bundle;
}
+(void)initUserLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *string = [def valueForKey:@"userLanguage"];
if(string.length == 0){
//獲取系統(tǒng)當前語言版本
NSArray* languages = [def objectForKey:@"AppleLanguages"];
NSString *current = [languages objectAtIndex:0];
if ([current containsString:@"zh-Hans"] == YES) {
current = @"zh-Hans";
}else{
current = @"en";
}
string = current;
[def setValue:current forKey:@"userLanguage"];
[def synchronize];//持久化捂寿,不加的話不會保存
}
//獲取文件路徑
NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];//生成bundle
}
+(NSString *)userLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *language = [def valueForKey:@"userLanguage"];
return language;
}
+(void)setUserlanguage:(NSString *)language{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
//1.第一步改變bundle的值
NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];
bundle = [NSBundle bundleWithPath:path];
//2.持久化
[def setValue:language forKey:@"userLanguage"];
[def synchronize];
}
@end
注意點
如果你在創(chuàng)建文件的時候沒有按照上述標準命名那么你在使用這個宏定義的時候。
GDLocalizedString(key) [[GDLocalizableController bundle] localizedStringForKey:(key) value:@"" table:nil]
里面table的參數(shù)就是你的文件名稱孵运。如果你的命名是Localizable.strings那么這里的table參數(shù)就可以是nil
使用說明
self.btnChange.newText = GDLocalizedString(@"切換語言");
self.lblTwo.newText = GDLocalizedString(@"測試二");
self.lblOne.newText = GDLocalizedString(@"我是測試顯示");
使用這種方式賦值 會根據(jù)系統(tǒng)當前的語言系統(tǒng)來返回對應的值秦陋。
上述代碼用到一個按鈕的分類(UILable同理實現(xiàn))
#import "UIButton+Localizable.h"
@implementation UIButton(Localizable)
-(void)setNewText:(NSString *)newText{
[self setTitle:GDLocalizedString(newText) forState:0];
}
@end
當你處理切換語言事件后 去改變用戶設(shè)置就行了
if ([[GDLocalizableController userLanguage] isEqualToString:@"en"]) {
[GDLocalizableController setUserlanguage:CHINESE];
}else{
[GDLocalizableController setUserlanguage:ENGLISH];
}
基本使用 就是這些了,希望能為你提供思路