iOS修改App默認語言

現(xiàn)在越來越多的“螺絲”廠商加入了地球村,走上了國際大舞臺,國際化的道路是越走越寬、越走越遠,App也要國際化以避免不必要的使用障礙,方能更好地服務(wù)于地球村,所以我們就先來說一說如何國際化(本地化)App。
在App開發(fā)過程中可Localize...本地化的文件很多,其中包括.string.xib(.nib).plist、.json、.storyboard(故事板)、.bundle、.xcassets(Image/Color Set)等等都是可以做本地化配置。

.strings
.xib
.plist
.json
.storyboard
.bundle
.xcassets/Image
.xcassets/Color
在實際開發(fā)過程中不難發(fā)現(xiàn)以上文件會有一些共同之處,一般在文件屬性配置區(qū)都能看到Localize...按鈕或者文件下拉列表區(qū)能看到xx.lproj文件夾,不同的是在多語言本地配置的方式上有所區(qū)別。下面我們就以.json文件為例,來實操一下如何將.json本地化(國際化),在不同的系統(tǒng)語言與地區(qū)下,展現(xiàn)不同的json數(shù)據(jù)。
第一步:創(chuàng)建一個Localizable.json文件,并將文件添加進項目中。Xcode沒有直接Command+N創(chuàng)建.json文件的選項,我們可以使用終端命令行touch Localizable.json創(chuàng)建一個.json文件內(nèi)容如下:

[
    {
        "country":"中國",
        "telCode":"+86"
    },
    {
        "country":"俄羅斯",
        "telCode":"+7"
    },
    {
        "country":"朝鮮",
        "telCode":"+850"
    },
    {
        "country":"巴基斯坦",
        "telCode":"+92"
    },
    {
        "country":"塞爾維亞",
        "telCode":"+381"
    }
]

第二步:開啟Localizable.json文件本地化能力,新增需要支持的國家語言配置。在App開發(fā)過程中默認的開發(fā)語言是English - Development Localization,根據(jù)第一步創(chuàng)建的文件內(nèi)容,我們需要新增中國俄羅斯、朝鮮、巴基斯坦、塞爾維亞五國語言。

開啟本地化能力
添加多國語言
完成以上步驟后,現(xiàn)在的Localizable.json是這樣的:
Localizable.json

第三步:分別將本地化后生成的Localizable.json文件內(nèi)容進行相應(yīng)翻譯,這里使用的百度在線翻譯有道在線翻譯。

中文(簡體)
[
    {
        "country":"中國",
        "telCode":"+86"
    },
    {
        "country":"俄羅斯",
        "telCode":"+7"
    },
    {
        "country":"朝鮮",
        "telCode":"+850"
    },
    {
        "country":"巴基斯坦",
        "telCode":"+92"
    },
    {
        "country":"塞爾維亞",
        "telCode":"+381"
    }
]
俄語
[
    {
        "country":"Китай",
        "telCode":"+86"
    },
    {
        "country":"Россия",
        "telCode":"+7"
    },
    {
        "country":"Северн кор",
        "telCode":"+850"
    },
    {
        "country":"Пакистан",
        "telCode":"+92"
    },
    {
        "country":"сербия",
        "telCode":"+381"
    }
]
朝鮮語
[
    {
        "country":"??",
        "telCode":"+86"
    },
    {
        "country":"???",
        "telCode":"+7"
    },
    {
        "country":"??",
        "telCode":"+850"
    },
    {
        "country":"????",
        "telCode":"+92"
    },
    {
        "country":"????",
        "telCode":"+381"
    }
]
烏爾都語(巴基斯坦)
[
    {
        "country":"???",
        "telCode":"+86"
    },
    {
        "country":"???",
        "telCode":"+7"
    },
    {
        "country":"???? ?????",
        "telCode":"+850"
    },
    {
        "country":"???????",
        "telCode":"+92"
    },
    {
        "country":"????",
        "telCode":"+381"
    }
]
塞爾維亞語
[
    {
        "country":"Кина",
        "telCode":"+86"
    },
    {
        "country":"Руси?а",
        "telCode":"+7"
    },
    {
        "country":"Северна Коре?а",
        "telCode":"+850"
    },
    {
        "country":"Пакистан",
        "telCode":"+92"
    },
    {
        "country":"Срби?а",
        "telCode":"+381"
    }
]
英語
[
    {
        "country":"China",
        "telCode":"+86"
    },
    {
        "country":"Russia",
        "telCode":"+7"
    },
    {
        "country":"North Korea",
        "telCode":"+850"
    },
    {
        "country":"Pakistan",
        "telCode":"+92"
    },
    {
        "country":"Serbia",
        "telCode":"+381"
    }
]

第四步:編譯運行App,修改手機系統(tǒng)設(shè)置語言與地區(qū)項,切換以上五國官方語言(不含英語)分別查看App內(nèi)展示內(nèi)容。

不同語言展示內(nèi)容
不出意外的話,應(yīng)該都會得到上述的結(jié)果,如果你覺得這樣就OK了,甚至腦子里開始浮現(xiàn)老外用戶各種開心的樣子時,其實隱藏的坑正躺在那里,你的老外用戶隨時都有可能踩破那個坑。

坑!??!

當你覺得應(yīng)該、已經(jīng)沒有坑的時候,我們應(yīng)該千方百計去制造可能的坑。正如上述過于簡單的過程和輕易得到的結(jié)果,后面一定隱藏著出人意料的大坑,所以我們的項目(實操)還沒有結(jié)束,下面我們將手機系統(tǒng)設(shè)置語言與地區(qū)項設(shè)置成五國語言以外的語言比如日語,再來看看App內(nèi)會展示什么內(nèi)容。

日語下的App
你會發(fā)現(xiàn)雖然手機系統(tǒng)語言已切換成日語,但App內(nèi)卻顯示的是中文,你肯定又開始疑惑了為什么不是English,畢竟上述我們提到默認語言是English,所以你依舊很是不甘,覺得至少應(yīng)該也要顯示的是English內(nèi)容,如果是這樣,那這個坑你是踩定了!

修改App默認語言

由這個坑引出本篇文章的主題《修改App默認語言》,上段我們說到日語環(huán)境下App內(nèi)顯示的是中文內(nèi)容,很顯然此時的App默認語言應(yīng)該還是中文(簡體),那么如何修改App默認語言呢?比如我想把默認語言設(shè)置成English,在五國以外的語言統(tǒng)統(tǒng)顯示為English,那肯定有人支招了:
第一招:修改Info.plist屬性配置,添加Localization native development region或者Development localization屬性值為en或者English。

屬性1
屬性2
不知道是不是由于姿勢不對,還是因為Xcode照的是大中國的月亮,然并卵,可能還要加一個Localized resources can be mixed屬性配置,值設(shè)置為YES
屬性3
本以為可以出現(xiàn)奇跡,結(jié)果又很意外,可能真的是因為大中國的月亮沒外國的圓、美、亮還大,最終還是宣告失敗。
第二招:打開Xcode導(dǎo)航欄菜單Product>Scheme>Edit Scheme>App Language選擇要設(shè)置的默認語言。
設(shè)置默認語言
設(shè)置默認語言
這一招操作起來簡單,而且暫時可以滿足預(yù)期的效果,而且無論App Language設(shè)置成五國以外的其他什么語言,App內(nèi)這回都會顯示English內(nèi)容,但是,問題來了,比如下圖的操作:
Localizable.json勾掉BaseEnglish本地配置時[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"]會找不到Localizable.json的文件路徑,說白點以下調(diào)用會直接導(dǎo)致App報錯退出

NSString *filePath =[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

因為filePath沒有值,進而data也為nil,最后導(dǎo)致Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil',結(jié)果就是App閃退,只有勾上BaseEnglish其中任一項,App會以其作為默認語言并做對應(yīng)的內(nèi)容展示,當兩項同時勾上時,會優(yōu)先選擇English作為App的默認語言,所以在使用第二招時,要確保BaseEnglish至少有一項是勾選上的,否則就有可能出現(xiàn)上述的情況。
第三招:使用KVC機制修改App默認語言,但是這種方式,只有在App再次啟動時才會生效,也就是說,一旦采用KVC去修改App語言環(huán)境,就應(yīng)該給用戶附加一個彈窗交互,提示用戶完全關(guān)閉kill掉整個App的進程,重新啟動App。

[[NSUserDefaults standardUserDefaults] setValue:@[@"語言代號"] forKey:@"AppleLanguages"];

其中語言代號可以在首選語言列表中去選擇:[NSLocale preferredLanguages];當你隨意填寫一個語言代號去KVC一個默認App語言,那么恭喜你[NSLocale preferredLanguages]后面會以這個隨意的語言代號為唯一元素的NSarray作為返回值,即使是重啟App,但App會以English作為默認語言展示內(nèi)容。
最后總結(jié)一下,以上三個辦法,第二招是最方便、最簡單、最實用的,其次是第二招,而第一招是徒勞,所以你以為這樣就完了嗎,13不答應(yīng)!

13重磅出擊,支持App獨立語言設(shè)置

在說13支持App獨立語言設(shè)置之前,先來溫故下App同步系統(tǒng)語言之首選語言順序的那些事。還是以上述實操例子中的五國語言為例,首先我們在設(shè)置iPhone語言時,當所選擇的語言為五國語言之一時,App會按照所選的語言做對應(yīng)的內(nèi)容展示,就像這樣

不同語言展示對應(yīng)內(nèi)容
如果將iPhone語言設(shè)置為五國語言之外時,App會按照首選語言順序從上往下的順序查找所支持的語言,當查到所支持的語言時,App會以此語言作為App語言來做對應(yīng)的內(nèi)容展示
優(yōu)先選擇支持語言
優(yōu)先選擇支持語言
優(yōu)先選擇支持語言

再來說13支持App獨立語言設(shè)置:打開設(shè)置>LocalizationsDemo(App名稱)>語言,選擇語言。
設(shè)置App獨立語言
不難最開始的時候,App首選語言(建議語言)列表和手機系統(tǒng)的首選語言順序列表并不是一致的
首選語言
一旦App設(shè)置了獨立語言,無論手機系統(tǒng)語言切換成什么語言,App內(nèi)部均會以設(shè)置的獨立語言來展示App內(nèi)的內(nèi)容。
設(shè)置App獨立語言

最后說一個很奇怪的現(xiàn)象,當將手機設(shè)置>語言與地區(qū)>首選語言列表中的語言刪減至只有一條時,在手機設(shè)置主頁會發(fā)現(xiàn)我們的App會從底部的應(yīng)用列表中移除,但當你重新添加一條首選語言后,手機設(shè)置主頁底部的應(yīng)用列表中又會出現(xiàn)我們的App

.END

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

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

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