1. 程式人生 > >Android 國際化適配之中英文模式切換

Android 國際化適配之中英文模式切換

前言

最近在做一個app,要求有中文模式與英文模式,其實就是國際化適配了,這個不難但是感覺非常麻煩呀,先看下我寫的簡單例子,這樣比較直觀點:

效果圖

接下來我介紹下如何去實現它:

  • 佈局檔案中的Textview的文字需要去引用values中的strings.xml中的字串
  • strings.xml預設的是中文,適配英文的話就需要再建立一個values-en的資料夾,並且其中也是strings.xml檔案
    效果圖

對比一下values和values-en中的strings.xml

<resources>
    <string name="app_name"
>
語言切換</string> <!--content--> <string name="title">這是標題</string> <string name="settings">設定</string> <!--dialog--> <string name="dialog_title">語言切換</string> <string name="dialog_msg">請選擇你要切換的語言</string> <string
name="dialog_positive">
中文</string> <string name="dialog_negative">英文</string> <string name="toast_set_ch">設定成中文</string> <string name="toast_set_en">設定成英文</string> </resources> <-----------------------分割線------------------------------->
<resources> <string name="app_name">languageMore</string> <!--content--> <string name="title">title</string> <string name="settings">settings</string> <!--dialog--> <string name="dialog_title">language switch</string> <string name="dialog_msg">choose your language,please</string> <string name="dialog_positive">Chinese</string> <string name="dialog_negative">English</string> <string name="toast_set_en">has change to English</string> <string name="toast_set_ch">has change to Chinese</string> </resources>

可以看出來name的名稱都是一樣的,只是內容中文與英文的區別

  • 接下來就是程式碼中的實現了,其實一個方法就可以切換了,資源字串檔案配置好了,就可以自動去適配了。設定語言切換的程式碼如下:
/**
 * 設定語言
 *
 * @param lauType 
 */
private void set(String lauType) {
    // 本地語言設定
    Locale myLocale = new Locale(lauType);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
}

傳人的lauType的值可以為”zh_CN”, “en”, “ja”, “de” ,分別表示中文、英文、日語、德語的意思。比如點選彈出框確認切換成英文,則呼叫set(“en”);即可 。下面展示MainActivity的全部程式碼:

public class MainActivity extends AppCompatActivity {

    private Button mButton;

    private Context mContext = this;

    // 中文 英文 日語 德語
    private static final String[] language = {"zh_CN", "en", "ja", "de"};

    public static final String CHINESE = language[0];
    public static final String ENGLISH = language[1];

    private String type;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = findViewById(R.id.btn_setting);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                AlertDialog dialog = new AlertDialog.Builder(mContext)
                        .setTitle(getString(R.string.title))
                        .setMessage(getResources().getString(R.string.dialog_title))
                        .setNegativeButton(getResources().getString(R.string.dialog_negative), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                type = ENGLISH;
                                set(type);
                                Toast.makeText(mContext, getResources().getString(R.string.toast_set_en), Toast.LENGTH_SHORT).show();
                                recreate();
                            }
                        })
                        .setPositiveButton(getResources().getString(R.string.dialog_positive), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                type = CHINESE;
                                set(type);
                                Toast.makeText(mContext, getResources().getString(R.string.toast_set_ch), Toast.LENGTH_SHORT).show();
                                recreate();
                            }
                        })
                        .create();
                dialog.show();

            }
        });
    }

    /**
     * 設定語言
     *
     * @param lauType
     */
    private void set(String lauType) {
        // 本地語言設定
        Locale myLocale = new Locale(lauType);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
    }

}

這只是個簡單例子,真實開發中最好把這個切換語言的狀態儲存在Shareprefences中,並且通過廣播等的方式去通知其他頁面語言改變,這個最好封裝在基類Activity中來處理

相關推薦

Android 國際化之中英文模式切換

前言 最近在做一個app,要求有中文模式與英文模式,其實就是國際化適配了,這個不難但是感覺非常麻煩呀,先看下我寫的簡單例子,這樣比較直觀點: 接下來我介紹下如何去實現它: 佈局檔案中的Textview的文字需要去引用values中的s

Android 國際化踩坑記錄

最近專案需要接入國際化開發,照著網上的方法很順利的集成了國際化,前兩天產品經理讓打個國際化的包,然後發現整合的國際化突然失效了???神馬問題,搗鼓了一天,檢視文件,搜尋都沒解決了我的問題。今天早早到公司來加班,我就隨便想看看日語,韓語的表達是什麼?執行下面的語句: Str

Android開發中的機型國際化的實現;

關於Android螢幕的一些基本概念知識,自行充電。。在此只介紹實際開發過程中的使用   1、說到Android的螢幕適配,首當其衝的就是圖片的適配     圖片適配遵循兩個原則: ①儘量使用9.path圖來自動適應螢幕 ②儘量使用最少的圖片資源     關於第一點使用9.path圖片:比如topBar、底

語言國際化(中英文之外的第三方語言--預設載入英文)

       大家都知道,iOS9以後App預設語言為英文,但有時使用者切換到指定配置的國際化語言環境之外的第三種語言時(比如某島語言:一般(我們)專案中,國際化只做了中英文,但如果您法語、德語......‘能想到的語’都做國際化了的話,那下面的對您就沒用了),可能會出現載

Android基礎——安卓6.0新權限系統

jsb 安全 認同 相對 選項 blank tar 也會 返回 在安卓6.0版本以後,新的權限系統出現了,為了更好的保護用戶的安全,新的權限系統需要開發者在代碼中手動申請,所以為了適配6.0權限系統,我們不得不學習權限系統 安卓6.0新權限系統分類有兩種 普通權限(nor

Android 開發:(九)Android螢幕經驗談

1.名詞解釋 螢幕尺寸: 也就是我們平時所說的某某手機是幾寸屏, 比如HTC one V這款手機是3.7寸的, 這裡的寸說的是英寸(inch),國際上習慣使用的單位,1inch = 2.54cm,3.7寸指的是螢幕的對角線的長度。 螢幕解析度:

Android 螢幕之 dimens

相信做手機端的 App 的小夥伴,只要是產品稍微大一點,就會面臨螢幕適配的問題,對於適配這個問題,網上眾說紛紜,以前雖然有零零散散的看過,但是沒有實踐過,也是在最近遇到這個需求的情況下才研究了一下,現在做個記錄。 1 參考連結 http://blog.csdn.net/qq_341

android解析度

轉載請註明出處:https://blog.csdn.net/u011038298/article/details/83269208 解析度 高度 寬度 寬高比(寬/高) 1920x1080 19

Android APP全面屏手機的技術要點

關於全面屏 全面屏是手機業界對於超高屏佔比手機設計的一個寬泛的定義。從字面上解釋就是,手機的正面全部都是螢幕,四個邊框位置都是採用無邊框設計,追求接近100%的屏佔比。但受限於目前的技術,還不能做到手機正面屏佔比100%的手機。現在業內所說的全面屏手機是指真實屏佔比可以達到80%以上,擁有超窄邊

Android螢幕詳解

本篇文章將解釋什麼是螢幕適配,為什麼要螢幕適配,螢幕適配的本質,和如何解決螢幕適配上的問題。(小白也能看懂哦) 什麼是螢幕適配?     螢幕適配就是讓某一個元素或者是APP中的UI介面在不同解析度、不同尺寸的螢幕上展示出同樣的顯示效果,這就是螢幕適配。 為什麼要

Android螢幕使用dimens

關於Android螢幕適配中使用多個dimens的遇到的問題 我相信大家在android開發中,肯定會遇到一個問題,那就是螢幕適配問題,通常我們做app只需要適配各種型別的手機就OK了,最近公司要求把pad上的app適配到手機上,這個有點麻煩,所以著重研究了一下。 基本概念:dp、sp、px

Android-螢幕全攻略(絕對詳細)(二)

Android-螢幕適配全攻略(絕對詳細)(二) 關鍵字:非密度制約畫素(dp、sp) 螢幕適配最佳實踐 前言:這篇文章接著 上一篇 繼續講,上篇講到了螢幕適配的核心概念與單位和一種解決方案:解決方案-支援各種螢幕尺寸。本篇繼續講剩餘的其他兩種解

Android-螢幕全攻略(絕對詳細)

(一) 關鍵字:螢幕適配 px dp dpi sp large限定符 .9.png 2012年到2014年支援Android裝置的種類從3997增長到18796。同時各大廠商定製的螢幕尺寸也非常多。這將非常

Android螢幕實踐總結

##名詞解釋 ####px (pixels) 最為熟悉的畫素,設計圖以此為單位標註; ####dp或dip (device independent pixels) 裝置獨立畫素,與裝置螢幕有關,Android的UI標註以此為單位可最大限度適配不同解析度; ####sp (scaled p

Android AutoLayout問題解決方案

本文在鴻洋的AutoLayout上做了修改,原文地址https://blog.csdn.net/lmj623565791/article/details/49990941。 AutoLayout原本的使用方法和思想沒有發生變化,主要針對適配中出現的問題進行修改。如果你遇到了下邊的一些問題,可

國際化問題句號變成逗號

  中英文環境正常,西語環境會閃退 奔潰 報錯日誌java.lang.NumberFormatException: Invalid float: ",00" 原始碼如下 public void setEnergy(float energy) { Deci

android螢幕問題分析及各種解決方案優缺點分析

序 從事android開發已有5年之久,專案中遇到的螢幕適配的問題也有n次了,可是有一個很奇怪也很讓人頭疼的現象讓從事多年開發的我很不爽。什麼問題呢,就是“適配虐我千萬遍,我見適配如初見”,真是想說一句fuck,這次我終於堅決的征服掉了她,下面就來具體講解征服她的全過程,一定要

Android螢幕之dp分包法

  前言 網上關於螢幕適配的文章已經鋪天蓋地了,為什麼我還要講?因為網上現在基本都是使用px適配,即每種螢幕解析度的裝置需要定義一套dimens.xml檔案。再加上有些手機還有虛擬按鍵(例如華為),這樣就還需要每個有虛擬按鍵的裝置加多一套dimens.xml檔案,再加上平板那些你會

Android 螢幕之weight的使用

1. 要點:必須在LinearLayout的佈局內使用才有效果 2. 計算公式: 控制元件寬度=控制元件原始寬度+權重比例xLinearLayout剩餘寬度。 3. 實踐: <?xml version="1.0" encoding="utf-8"?> <LinearLa

Android螢幕方案

目錄介紹 1.螢幕適配定義 2.相關重要的概念 2.1 螢幕尺寸[物理尺寸] 2.2 螢幕解析度[px] 2.3 螢幕畫素密度[dpi] 2.4 dp、dip、dpi、sp、px 2.5 mdpi、hdpi、xdpi、xxdpi 2.6 獲取螢幕解析度[寬