當涉及到多語言國際化的項目時,首次加載頁面時則需根據用戶當前的系統語言或瀏覽器語言 進行相應的展示。
一、navigator對象
Navigator 對象包含有關瀏覽器的信息。根據MDN Navigator的介紹,Navigator參數可兼容各大瀏覽器。
其中,navigator.language和navigator.languages 兩個屬性中 包含了瀏覽器的相關語言信息:
我們一般采用language屬性,如果是“zh-CN”,則代表當前的瀏覽器是中文的環境。
注:navigator.language僅可代表瀏覽器語言,並不能代表當前系統語言.。
有時會存在這種情況,在windows中的chrome或者Firefox瀏覽器在系統語言為英文的環境中,navigator.language仍舊是“zh-CN”,即通過js只能夠獲取瀏覽器的屬性系統,而獲取不到系統的語言類型。
驗證:1、在chrome瀏覽器中設置語言環境,選擇 使用英語顯示界面,此時 英語自動被移動置為第一位語言 ,這時查看屬性發現navigator.language獲取到了第一個語言含有“en”字段的了。
原因:
綜上可知:navigator.language 代表的不是瀏覽器的語言,而是用戶更偏好的語言。
二、如何獲取系統語言呢?
國際化項目中一般都有一個 用戶可以自行切換語言的按鈕,當 用戶的chrome語言設置為中文,而在使用的項目中 選擇把頁面切換為英語界面時,此時 如果想獲取 語言 就需要 同時判斷 瀏覽器語言和當前操作語言了。
這時 一般會把項目當前語言存入 本地緩存或cookie中,下述代碼為 如何從cookie中獲取語言:
//獲取cookie中的默認語言 export const getCookieLang = function() { let strcookie = document.cookie; //獲取cookie字符串 let arrcookie = strcookie.split(";"); //分割 let cookieLang = ""; for (let i = 0; i < arrcookie.length; i++) { let arr = arrcookie[i].split("="); //當cookie語言相關的鍵名為:org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE if ( arr && arr[0].trim() == "org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE" ) { cookieLang = arr[1]; break; } } return cookieLang; };
獲取瀏覽器語言:
// 獲取瀏覽器默認語言 export const getBrowserLang = function() { let browserLang = navigator.language ? navigator.language : navigator.browserLanguage; let defaultBrowserLang = ""; if ( browserLang.toLowerCase() === "us" || browserLang.toLowerCase() === "en" || browserLang.toLowerCase() === "en_us" ) { defaultBrowserLang = "en_US"; } else { defaultBrowserLang = "zh_CN"; } return defaultBrowserLang; };
此時,當前系統語言 通過 cookie存儲的語言和瀏覽器語言同時判斷:
// 獲取當前系統語言(首先從cookie里獲取,默認為瀏覽器當前的語言) let cookieLang = getCookieLang(); cookieLang = cookieLang === "en" || cookieLang === "us" ? "en_US" : cookieLang; const lang = cookieLang || getBrowserLang(); console.log(lang) //這里的lang代表當前項目使用的語言