國內由於版號的問題,致使不少遊戲廠商選擇出海。在國際化的市場要想取得好的成績,就必需要作好深度的本地化,其中最基礎的一塊就是語言。app
爲了給用戶提供更好的遊戲體驗,一般用戶第一次進遊戲的時候,會根據用戶當前設備設置裏所選擇的語言來設置遊戲的默認語言。ui
一般系統返回的是 語言-國家/地區標識,如 ja-jp,日語-日本。en-us,英文-美國。固然還有好比 en-CA,英文-加拿大。每個語言均可能對應不少國家/地區,一個國家/地區也可能有不少種語言。好比香港,可能用繁體中文 zh-HK/zh-Hant-HK 或者 en-HK。這就讓狀況變得比較複雜了,因此咱們須要先了解相應的規範。3d
根據RFC 4646的規範,語言的標籤表示法code
A Language-Tag consists of: langtag ; generated tag -or- private-use ; a private use tag -or- grandfathered ; grandfathered registrations langtag = (language ["-" script] ["-" region] *("-" variant) *("-" extension) ["-" privateuse]) language = "en", "ale", or a registered value ;shortest ISO 639 code script = "Latn", "Cyrl", "Hant" ; ISO 15924 code region = "US", "CS", "FR" ISO 3166 codes "419", "019", or UN M.49 codes;ISO 3166 code variant = "rozaj", "nedis", "1996", multiple subtags can be used in a tag extension = single letter followed by additional subtags; more than one extension may be used in a language tag private-use = "x-" followed by additional subtags, as many as are required Note that these can start a tag or appear at the end (but not in the middle) grandfathered = tags listed in the old registry that are not otherwise redundant (a closed list)
分爲 language["-" script]["-" region]*("-" variant)*("-" extension)["-" privateuse] 六個部分。blog
在安卓和iOS上返回的一般只用到前三項(若是語言沒有變種,則略過script項,返回相似 en-US 這種,其中 US 爲美國),分別是 language – ISO 639,script – ISO 15924, region – ISO 3166。遊戲
其中地區 region 全大寫(如中國CN,美國US),language 全小與(如中文zh,英文en), script 是首字母大寫(語言的變種,如中文分:簡體中文與繁體中文)。ip
示例:zh-Hant-HK 中文 - 繁體中文 - 香港地區。get
language 由 ISO 639 規範進行定義的,將不一樣語種的名稱分爲二個字母的簡稱和三個字母的簡稱,這裏使用最短的(二個字母)的簡稱,好比簡體中文/繁體中文都使用zh表示。同步
詳情可查看維基百科>>博客
ISO 51924 列表>> 簡體中文就是 Hans 繁體中文就是 Hant
最後一個是地區 region,它在 ISO 3166 規範 中定義過了,這裏使用二位字母表示。CN 表示中國、TW表示臺灣、US 表示美國、HK 表示香港,所有爲大寫。
到這裏基本上理清楚了,當咱們看到
zh-Hant-MO 時就知道是繁體中文 - 澳門地區。
更多的示例以下:
zh-Hans 簡體中文
zh-Hans-CN 大陸地區使用的簡體中文
zh-Hans-HK 香港地區使用的簡體中文
zh-Hans-MO 澳門使用的簡體中文
zh-Hans-SG 新加坡使用的簡體中文
zh-Hans-TW 臺灣使用的簡體中文
zh-Hant 繁體中文
zh-Hant-CN 大陸地區使用的繁體中文
zh-Hant-HK 香港地區使用的繁體中文
zh-Hant-MO 澳門使用的繁體中文
zh-Hant-SG 新加坡使用的繁體中文
zh-Hant-TW 臺灣使用的繁體中文
對應獲取設備當前語種標識的代碼。
安卓(注意 getScript 方法須要 API 21+才支持):
Locale locale;
if (Build.VERSION.SDK_INT >= 24) {
locale = LocaleList.getDefault().get(0);
} else {
locale = Locale.getDefault();
}
String strLanguageIden = locale.getLanguage() + "-" + locale.getScript() + "-" + locale.getCountry();
iOS代碼
NSString *pfLanguage = [NSLocale preferredLanguages][0];
preferredLanguage : zh-Hant-HK
若是隻選英文,不選英文(國家/地區)它會將下面的地區帶上。
preferredLanguage : en-CN (這裏的CN就是上面截圖中的地區-中國這一欄)
若是選擇 English(Canada)加拿大地區,則會輸出 en-CA
preferredLanguage : en-CA
根據以上特徵,咱們只須要區分第一位是什麼。特別要注意的是咱們只區分簡體與繁體中文,其它語言若是咱們須要區分變體,可內嵌判斷。
if (strLanguageIden.indexOf("zh-") > -1) {
// 中文
if (strLanguageIden.indexOf("zh-CN") > -1 || strLanguageIden.indexOf("zh-Hans") > -1) {
// 簡體中文
strLanguage = "cn";
} else {
// 繁體中文
strLanguage = "tw";
}
} else if (strLanguageIden.indexOf("en-") > -1) {
// 英語
strLanguage = "en";
} else if (strLanguageIden.indexOf("ja-") > -1) {
// 日語
strLanguage = "jp";
} else if (strLanguageIden.indexOf("ko-") > -1) {
// 韓語
strLanguage = "kr";
} else if (strLanguageIden.indexOf("fr-") > -1) {
// 法語
strLanguage = "fr";
} else if (strLanguageIden.indexOf("de") > -1) {
// 德語
strLanguage = "ge";
} else if (strLanguageIden.indexOf("vi-") > -1) {
// 越南文
strLanguage = "vn";
} else if (strLanguageIden.indexOf("th-") > -1) {
// 泰文
strLanguage = "th";
} else {
// 默認英語
strLanguage = "en";
}
個人博客即將同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2r9474qams6c0