【Android】讓你的安卓app國際化、支持語言自動切換


碎碎念

我在寫app的時候,無論是布局上的字符串還是代碼中的,我都喜歡直接敲上去,無視那個善意提醒的波浪線。

對於小項目來說,我覺得無可厚非,雖然不規范但方便直觀,不需要苦於給字符串起名字。

如果你在項目初期就想着要將應用推向國際市場,就要注意字符串一定要養成習慣全部寫在string.xml里,不然后期再加真的很崩潰。

創建多語言的string.xml

我們的目標是,應用跟隨系統語言改變而改變。

首先是創建對應的語言的string.xml文件。

選中res/values文件夾,右鍵新建一個資源文件。

 

 然后選擇Locale類別,添加進來,名稱就叫string.xml

 

 然后選擇對應的語言,地區選擇全部

 

 這樣你就得到了兩份string.xml文件,一份是原版的即中文,另一份是英文的對照版本。

在中文的中創建一個字符串,會有相應的提示需要在英文對照版本中創建一份翻譯的版本。

 

 

 

 如何使用

在布局中可以直接使用@string形式來加載,在代碼中使用:

 /**
     * 加載字符串
     * @param id 字符串id
     * */
    public static String getStaticString(Context context,int id){
        return context.getResources().getString(id);
    }

自動切換

為了實現自動切換功能,我們需要封裝一個LanguageUtil(參考自 簡書

import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Build;
import android.util.DisplayMetrics;

import com.google.gson.Gson;

import java.util.Locale;

public class LanguageUtil {
    private static final String LOCALE_SP = "LOCALE_SP";
    private static final String LOCALE_SP_KEY = "LOCALE_SP_KEY";




    public static Locale getLocale(Context context) {
        SharedPreferences spLocale = context.getSharedPreferences(LOCALE_SP, Context.MODE_PRIVATE);
        String localeJson = spLocale.getString(LOCALE_SP_KEY, "");
        Gson gson = new Gson();
        return gson.fromJson(localeJson, Locale.class);
    }


    private static void setLocale(Context pContext, Locale pUserLocale) {
        SharedPreferences spLocal = pContext.getSharedPreferences(LOCALE_SP, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = spLocal.edit();
        String json = new Gson().toJson(pUserLocale);
        edit.putString(LOCALE_SP_KEY, json);
        edit.apply();
    }


    public static boolean updateLocale(Context context, Locale locale) {
        if (needUpdateLocale(context, locale)) {
            Configuration configuration = context.getResources().getConfiguration();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                configuration.setLocale(locale);
            } else {
                configuration.locale = locale;
            }
            DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
            context.getResources().updateConfiguration(configuration, displayMetrics);
            setLocale(context, locale);
            return true;
        }
        return false;
    }

    public static boolean needUpdateLocale(Context pContext, Locale newUserLocale) {
        return newUserLocale != null && !getCurrentLocale(pContext).equals(newUserLocale);
    }
    public static Locale getCurrentLocale(Context context) {
        Locale locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //7.0有多語言設置獲取頂部的語言
            locale = context.getResources().getConfiguration().getLocales().get(0);
        } else {
            locale = context.getResources().getConfiguration().locale;
        }
        return locale;
    }
}

緊接着我們創建一個Application來自動加載

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        languageWork();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        languageWork();
    }

    private void languageWork() {
        Locale locale = LanguageUtil.getLocale(this);
        LanguageUtil.updateLocale(this, locale);
    }
}

在AndroidManifest.xml中配置一下:

 android:name=".MyApplication"

如圖所示:

 

 愉快的去使用吧~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM