一、語言本地化功能釋義
語言本地化<語言國際化>是指根據用戶設備系統的語言設置,自動將應用程序的語言設置為和用戶設備系統語言設置一致的語言文本。
1.語言本地化意義
此功能的目的是:能夠讓講不同語言的用戶正常的使用App功能,讓每個用戶都能在App內讀懂自己熟悉的語言文字信息。
2.語言本地化應用場景
- 應用程序需要提供給多個國家的人群使用。
- 同一個國家多個地域有多種語言的情況。
3.語言本地化兩大需求
對于本地化的功能有很多種需求,往往多數應用的需求區別在于是否能在App內進行語言文字切換功能,由此分為兩種方案:
一、應用語言隨系統語言設置而變化。
二、應用可內切換語言。
一、應用語言隨系統語言設置而變化
普及一個知識點:
想要切換模擬器的語言設置,無需在模擬器中設置App進行設置,只需要在Xcode中進行如下設置:
Edit->Scheme->Run->Arguments Passed On Launch ->AppleLanguages (語言代碼)。
語言本地化前提工程配置步驟:
1.選中工程的“Project” -> “Info”路徑,在“Localizations”欄中點擊"+"按鈕,添加需要國際化/本地化的語言選項。
備注:
“zh-Hans”和“zh-Hant”分別是“簡體中文”和“繁體中文”的縮寫,H可大寫也可小寫。
"en"是英語的縮寫,ko是韓語的縮寫,fr是法語的縮寫。
其他語言可查詢對應文檔或是網絡查詢
2.在彈出的對話框中,直接點擊Finish按鈕,完成添加。
第一點:App名稱的本地化實現
App名稱本地化是指同一個App的名稱隨設備語言設置來顯示不同的名稱。比如,微信在語言設置為簡體中文的設備中App名稱顯示為“微信”,在語言設置為英語的設備中App名稱顯示為“weChat”。實現App名稱本地化的步驟:
1.選中工程的“Project” -> “Info”路徑,在“Localizations”欄中點擊"+"按鈕,添加需要國際化/本地化(前提工程配置中必要步驟,此處僅為再次)
2.在Xcode的工程左側文件欄中,新建文件選擇Strings File(iOS->Resource->Strings File)創建InfoPlist.string文件。
3.選擇剛剛創建InfoPlist.string文件,在右側的File inspection選項卡中點擊Localize功能按鈕,并在該選項欄中勾選需要的本地化語言。
4.展開InfoPlist.string文件,在每個本地化語言中添加“CFBundleDisplayName = "WeChat";”這行代碼
至此已經完成了App名稱的本地化,運行代碼,修改設備系統的語言設置,在設備的桌面就能查看到本地化文件中設置的App的名稱。
第二點:App內的字符串的本地化
App內字符串的本地化是指在不同的語言環境下顯示不同的內容。比如tabbar上的第一個標簽"主頁"這個標題字符串,在語言設置為簡體中文的設備中顯示為“主頁”,在語言設置為英語的設備中顯示為“Home”。
App內字符串的本地化的步驟和App名稱本地化過程是一致的,只需要創建特定文件名(Localizable.strings)的文件即可。
根據設備系統語言設置實現App內的文案本地化具體步驟如下:
1.在Xcode的工程左側文件欄中,新建文件選擇Strings File(iOS->Resource->Strings File)創建Localizable.string文件。
2.選擇剛剛創建Localizable.string文件,在右側的File inspection選項卡中點擊Localize功能按鈕,并在該選項欄中勾選需要的本地化語言。
3.展開Localizable.string文件,在每個本地化語言中添加需要本地化的鍵值對代碼,具體格式為:"key"="value";
4.在代碼中使用系統的宏定義NSLocalizedString(key, comment)來取對應的值進行展示
注意:此方案是根據設備系統的語言設置來自動變化App內文案顯示的方案!
不同的步驟:
使用方法:
二、應用可內切換語言
在需求搬運工的搬運下,如果遇到App內切換語言的需求,僅使用上面所述的方案是不能實現此功能的,我們需要做一些修改才能達到目的。
兩種方案:
第一種方案:在系統的國際化的基礎上,使用NSUserDefault強制修改本地的語言設置來達到App內切換語言的目的
第二種方案:僅使用系統國際化的文件,不使用系統的NSLocalizedString(key, comment)讀取方法,改用自定義的類來讀取本地化內容
注意:如果使用以上兩種方案,在切換語言的時候需要發送一則通知,通知已經顯示的文本控件,進行重新獲取本地化內容并重新賦值顯示。
第一種方案
需要在第一種方案的基礎上,使用NSUserDefault強制修改本地的語言設置來達到目的,具體實現如下:
代碼片段:
//切換語言
NSArray *lans = @[@"en"]; //想切換成英文版設置此種語言代碼
[[NSUserDefaults standardUserDefaults] setObject:lans forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
可將此段代碼在切換語言的時候添加到對應位置,并設置成對應的語言碼。
第二種方案
如果不想使用NSUserDefault強制修改本地的語言設置,又想達到App內語言切換的功能怎么處理呢?初步思路是為每種語言都創建一個Localizable.string文件,并自己從對應的Localizable.string文件讀取對應的內容!
方案思路具體實現:
第一步:為每種語言創建一個本地化語言文件(Localizable.strings)
第二步:為語言包創建目錄(藍色文件夾:en.lproj),并存放在包的根目錄中
第三步:將本地化語言的鍵值對都添加到對應的語言文件中
第四步:創建一個用來獲取包中的本地化語言內容的類
創建的讀取本地化內容的類代碼如下:
//
// LocalizedUtils.h
// LocalizationsDemo
//
// Created by Shixiong on 2017/11/15.
// Copyright ? 2017年 Shixiong. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface LocalizedUtils : NSObject
/**
* 使用代碼強制使用某一種語言處理
* [Language setLanguage:@"de"];
**/
+ (void)setLanguage:(NSString *)language;
/**
* 獲取國際化語言內容
**/
+ (NSString *)get:(NSString *)key;
/**
* 獲取國際化語言內容
**/
+ (NSString *)get:(NSString *)key alter:(NSString *)alternate;
@end
//
// LocalizedUtils.m
// Altopay
//
// Created by Shixiong on 2017/11/9.
// Copyright ? 2017年 Shixiong. All rights reserved.
//
#import "LocalizedUtils.h"
static NSBundle *bundle = nil;
@implementation LocalizedUtils
+ (void)initialize
{
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defs objectForKey:@"AppleLanguages"];
NSString *current = [languages firstObject];
if (![current hasPrefix:@"id"]) {
[self setLanguage:@"en"]; //默認使用英語
} else {
[self setLanguage:current]; //指定當前語言
}
}
+ (void)setLanguage:(NSString *)language
{
NSBundle *tmpBundle = [NSBundle mainBundle];
NSString *path = [tmpBundle pathForResource:language ofType:@"lproj"];
bundle = [NSBundle bundleWithPath:path];
}
+ (NSString *)get:(NSString *)key
{
return [[self class] get:key alter:@""];
}
+ (NSString *)get:(NSString *)key alter:(NSString *)alternate
{
return [bundle localizedStringForKey:key value:alternate table:nil];
}
@end
創建結果如下:
使用自定義本地化的功能代碼:
至此已經完成了App內字符串的本地化功能以及App內本地化語言切換功能,修改代碼中的語言設置,在App中就能查看到本地化文件中的內容了。