Android 獲取系統語言(相容7.0)

来源:http://www.cnblogs.com/zhaoyanjun/archive/2017/05/16/6861307.html
-Advertisement-
Play Games

轉載連接:http://likfe.com/2017/05/10/android sys language/ 前言 獲取系統當前語言是一個比較常用的功能,在 Android 7.0 系統上舊函數獲取到的當前系統語言並不正確,或者說從 Android 7.0 起,Android 系統語言的規則變了。 ...


轉載連接:http://likfe.com/2017/05/10/android-sys-language/

前言

獲取系統當前語言是一個比較常用的功能,在 Android 7.0 系統上舊函數獲取到的當前系統語言並不正確,或者說從 Android 7.0 起,Android 系統語言的規則變了。

下麵是未適配 Android 7.0 的代碼:

//獲取 Locale 的方式有二

//方式一
Locale locale = getResources().getConfiguration().locale;

//方式二
Locale locale = Locale.getDefault();

//獲取當前系統語言
locale.getLanguage();

由於僅僅根據 getLanguage() 無法全面的瞭解當前的系統語言信息,比如簡體中文和繁體中文的 Language 都是 zh,所以還需要 getCountry() 方法獲取地區信息,我們就能得到 zh-CN 和 zh-HK/zh-TW 。

總結一下就是:

//獲取 Locale 的方式有二

//方式一
Locale locale = getResources().getConfiguration().locale;

//方式二
Locale locale = Locale.getDefault();

// 獲取當前系統語言
String lang = locale.getLanguage() + "-" + locale.getCountry();

但是,在 Android 7.0 上:getResources().getConfiguration().locale 被標記為 deprecated 了,所以初步適配後是:

//獲取 Locale  對象的正確姿勢:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = getResources().getConfiguration().getLocales().get(0);
} else {
    locale = getResources().getConfiguration().locale;
}

//獲取語言的正確姿勢:

String lang = locale.getLanguage() + "-" + locale.getCountry();

從 Android 7.0 起使用的getResources().getConfiguration().getLocales() 返回的是一個 LocaleList 對象,它包含 >=1 個 Locale,內容項可由用戶增刪,順序可由用戶調整。但是,此介面返回的語言順序和用戶定義的順序不一定一致!

測試語言順序
測試核心代碼:

Locale locale = Locale.getDefault();
MLog.e(locale.getLanguage() + "-" + locale.getCountry());

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    LocaleList localeList = getResources().getConfiguration().getLocales();
    for (int i = 0; i < localeList.size(); i++) {
        MLog.e(i + " >1> " + localeList.get(i).getLanguage() + "-" + localeList.get(i).getCountry());
    }

    LocaleList localeList2 = LocaleList.getAdjustedDefault();
    for (int i = 0; i < localeList2.size(); i++) {
        MLog.e(i + " >2> " + localeList2.get(i).getLanguage() + "-" + localeList2.get(i).getCountry());
    }

    LocaleList localeList3 = LocaleList.getDefault();
    for (int i = 0; i < localeList3.size(); i++) {
        MLog.e(i + " >3> " + localeList3.get(i).getLanguage() + "-" + localeList3.get(i).getCountry());
    }

    LocaleList localeList4 = LocaleList.getEmptyLocaleList();
    for (int i = 0; i < localeList4.size(); i++) {
        MLog.e(i + " >4> " + localeList4.get(i).getLanguage() + "-" + localeList4.get(i).getCountry());
    }
}

第一次測試

測試手機:Nubia Z9 mini,Android 7.1,Mokee Rom

手機系統語言順序:hi-IN,zh-CN,en-US,zh-HK

App 國際化:values,values-zh (values 里的 string 為英文,values-zh 里的 string 為中文)

結果是:

zh-CN

0 >1> zh-CN
1 >1> hi-IN
2 >1> en-US
3 >1> zh-HK

0 >2> zh-CN
1 >2> hi-IN
2 >2> en-US
3 >2> zh-HK

0 >3> hi-IN
1 >3> zh-CN
2 >3> en-US
3 >3> zh-HK

並且 App 當前顯示的文字是中文。

第二次測試

測試手機:Nubia Z9 mini,Android 7.1,Mokee Rom

手機系統語言順序:hi-IN,en-US,zh-CN,zh-HK

App 國際化:values,values-zh

結果是:

en-US

0 >1> en-US
1 >1> hi-IN
2 >1> zh-CN
3 >1> zh-HK

0 >2> en-US
1 >2> hi-IN
2 >2> zh-CN
3 >2> zh-HK

0 >3> hi-IN
1 >3> en-US
2 >3> zh-CN
3 >3> zh-HK

並且 App 當前顯示的文字是英文。

結論

從 Android 7.0 開始,系統語言支持多個,可手動排序,系統根據 App 本身支持的語言和手機出廠設置的語言等因素來調整 App 本身的預設語言。

要獲取系統為 App 調整後的預設語言:

Locale locale = Locale.getDefault();
//Locale.getDefault() 和 LocaleList.getAdjustedDefault().get(0) 同等效果,還不需要考慮版本問題,推薦直接使用
String language = locale.getLanguage() + "-" + locale.getCountry();

要獲取系統真實首選語言:

Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale = LocaleList.getDefault().get(0);
} else {
    locale = Locale.getDefault();
}
String language = locale.getLanguage() + "-" + locale.getCountry();

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • dropzone.js預設是Ajax上傳圖片給伺服器,那麼如何獲取到圖片名呢?其實我們是可以通過dropzone的success函數獲取到伺服器返回的數據 dropzone.js在HTML的配置如下; ...
  • ———————————————————————————————————————————— 實驗7.4:RS232串口應用實例 設計要求: 通過串口發送接收數據(串口工作方式1) 實現思路: 定時器設置 串口設置 工作方式 波特率 開啟定時/計數器 串口執行 接收數據 發送數據 串口設置 工作方式 波 ...
  • 路由配置 路由組 允許共用路由屬性,例如中間件和命名空間等,我們沒有必要為每個路由單獨設置共有屬性,共有屬性會以數組的形式放到 Route::group 方法的第一個參數中。 中間件('middleware' => 'auth'),驗證用戶是否登錄。 命名空間 ('namespace' => 'Ad ...
  • spring mvc Spring框架(框架即:編程註解+xml配置的方式)MVC是Spring框架的一大特征,Spring框架有三大特征(IOC(依賴註入),AOP(面向切麵),MVC(建模M-視圖V-控制器C)。框架一般用於團隊開發,使用分層的方式使每個人完成不同的模塊,然後再組合在一起,使完成 ...
  • 變數 在程式設計中,變數(英語:Variable,scalar)是指一個包含部分已知或未知數值或資訊(即一個值)之儲存位址,以及相對應之符號名稱(識別字)。通常使用變數名稱參照儲存值;將名稱和內容分開能讓被使用的名稱獨立於所表示的精確訊息之外。電腦原始碼中的識別字能在執行期間綁扎一個值,且該變數的值 ...
  • 一、場景 之前做的電商平臺,用戶在收到貨之後,大部分都不會主動的點擊確認收貨,導致給商家結款的時候,商家各種投訴,於是就根據需求,要做一個訂單在發貨之後的x天自動確認收貨。所謂的訂單自動確認收貨,就是在在特定的時間,執行一條update語句,改變訂單的狀態。 二、思路 最笨重的做法,通過linux後 ...
  • XML 使用DTD(document type definition)文檔類型來標記數據和定義數據,格式統一且跨平臺和語言,已成為業界公認的標準。 目前 XML 描述數據龍頭老大的地位漸漸受到 Json 威脅。經手項目中,模塊/系統之間交互數據方式有 XML 也有 Json,說不上孰好孰壞。 XML ...
  • 題目描述 以下皆為真實的故事。 洛谷2的團隊功能是其他任何oj和工具難以達到的。藉助洛谷強大的伺服器資源,任何學校都可以在洛谷上零成本的搭建oj並高效率的完成訓練計劃。 為什麼說是搭建oj呢?為什麼高效呢? 因為,你可以上傳私有題目,團隊外別人是無法看到的。我們還能幫你們評測! 你可以創建作業,給組 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...