iOS支持多語(yǔ)言

這篇文章介紹的多語(yǔ)言方案非常簡(jiǎn)單,就是使用string資源文件來實(shí)現(xiàn)多語(yǔ)言的支持。

string資源文件的創(chuàng)建和使用

第一步,在Xcode項(xiàng)目中添加你要支持的語(yǔ)言:

添加需要支持的語(yǔ)言

當(dāng)前我使用的是Xcode11,默認(rèn)支持的語(yǔ)言是English。此外還有一個(gè)Base,這篇文章不做討論。
假設(shè)app要支持簡(jiǎn)體中文和英文,那么你的配置應(yīng)該是這樣的:
支持中文和英文

第二步,創(chuàng)建string資源文件:
創(chuàng)建string資源文件

隨便起個(gè)名字,例如"abc"。創(chuàng)建好后是這樣的:
string資源文件

第三步,國(guó)際化string資源文件:
國(guó)際化string資源文件

由于我們前面已經(jīng)配置好支持簡(jiǎn)體中文和英文,所以我們可以把string資源文件國(guó)際化為簡(jiǎn)體中文和英文兩種版本:
string資源文件

第四步,在string資源文件中添加我們的內(nèi)容。string資源文件中的內(nèi)容是鍵值對(duì)的形式,每一個(gè)鍵值對(duì)以分號(hào)結(jié)束:
簡(jiǎn)體中文string資源文件

英文string資源文件

這樣“你好”(英文是“hello”)這個(gè)內(nèi)容就創(chuàng)建好了,注意他們需要使用一樣的鍵hello_key,后面是要通過hello_key這個(gè)鍵來獲取“你好”(“hello”)這個(gè)字符串的。
第五步,使用string資源文件。經(jīng)過上面的步驟,string資源文件已經(jīng)創(chuàng)建完成。這時(shí)候查看我們的項(xiàng)目目錄,就能看到相關(guān)的資源文件:
項(xiàng)目目錄

需要使用NSBundle來獲取string資源文件里的內(nèi)容。根據(jù)上面的目錄,我們知道簡(jiǎn)體中文資源的目錄是zh-Hans.lproj,所以獲取簡(jiǎn)體中文資源內(nèi)容的方法是:

      // 獲取中文資源的路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"zh-Hans" ofType:@"lproj"];
    // 獲取中文資源的bundle
    NSBundle *bundle = [NSBundle bundleWithPath:path];
    // 根據(jù)鍵值獲取對(duì)應(yīng)的內(nèi)容
    NSString *hello = [bundle localizedStringForKey:@"hello_key" value:nil table:@"abc"];
    // hello字符串是“你好”。根據(jù)你的需要使用內(nèi)容。例如:
    // someLabel.text = hello;

同理獲取英文資源內(nèi)容的方法是:

    // 獲取英文資源的路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
    // 獲取英文資源的bundle
    NSBundle *bundle = [NSBundle bundleWithPath:path];
    // 根據(jù)鍵值獲取對(duì)應(yīng)的內(nèi)容
    NSString *hello = [bundle localizedStringForKey:@"hello_key" value:nil table:@"abc"];
    // hello字符串內(nèi)容是“hello”。根據(jù)你的需要使用內(nèi)容。例如:
    // someLabel.text = hello;

需要特別注意的是,使用NSBundlelocalizedStringForKey: value: table:方法獲取字符串時(shí),table參數(shù)要寫你的string資源文件的名字。本例子是abc

初始化app的語(yǔ)言

有了string資源文件后,我們就能隨心所欲地獲取各種語(yǔ)言內(nèi)容了。那么,用戶第一次打開app時(shí),應(yīng)該顯示什么語(yǔ)言呢?

我們首先獲取用戶當(dāng)前手機(jī)的語(yǔ)言:

    NSArray *langs = [NSLocale preferredLanguages];
    NSLog(@"%@", langs);

如果用戶當(dāng)前手機(jī)的語(yǔ)言設(shè)置是這樣的:


手機(jī)語(yǔ)言設(shè)置

那么上述代碼就會(huì)打?。?/p>

(
    "zh-Hans-US",
    en,
    "zh-Hant-US"
)

這樣我們就能知道當(dāng)前用戶使用的語(yǔ)言是中文,那么就可以把a(bǔ)pp的語(yǔ)言初始化為中文。

一般用NSUseDefaults來記錄當(dāng)前的語(yǔ)言:

[[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans-US" forKey:@"your_key"];

需要特別注意的是iOS的語(yǔ)言代碼,例如英文他會(huì)分為加拿大英文、印度英文等等,雖然都是英文,但是代碼不一樣:

(
    "en-CA"
    "en-IN",
)

但是他們的前綴都是en,我們也不必分這么細(xì),只要是en開頭我們就可以知道這是英文。

切換語(yǔ)言

一般是在app內(nèi)提供切換語(yǔ)言的功能,切換后app可以馬上更換到新的語(yǔ)言。要實(shí)現(xiàn)這樣的功能,就需要使用新設(shè)置的語(yǔ)言刷新目前已經(jīng)加載的所有頁(yè)面,常見的做法,就是直接替換當(dāng)前windowrootViewController,實(shí)現(xiàn)刷新全部頁(yè)面的效果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容