國際化語種名稱的標識

國內由於版號的問題,致使不少遊戲廠商選擇出海。在國際化的市場要想取得好的成績,就必需要作好深度的本地化,其中最基礎的一塊就是語言。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();

image

 

image

 

iOS代碼

NSString *pfLanguage = [NSLocale preferredLanguages][0];

image

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

相關文章
相關標籤/搜索