Android 多語言介紹及實戰

基本使用

建立多語言文件夾

右鍵res,選擇New Resource Directory,選擇locale,選擇本身想要適配的語言類型html

設置應用內多語言

Android 7.0如下java

/** * 設置多語言 */
    public void setConfiguration(LocaleList locales, Context context) {
        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocales(locales);
        Resources resources = context.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        resources.updateConfiguration(configuration, dm);
    }

複製代碼

Android 7.0及以上android

有單一的目標語言變成了一個語言列表,系統會根據這個列表的優先級去適配語言:git

/** * 設置多語言 */
    @RequiresApi(24)
    public void setConfiguration(LocaleList locales, Context context) {
        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocales(locales);
        Resources resources = context.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        resources.updateConfiguration(configuration, dm);
    }

複製代碼

7.0版本後的語言設置界面: github

img

這樣作的好處是當應用不支持最高優先級的語言,會讓用戶和者開發者有本身的語言顯示替代策略,而不是隻能選擇默認資源文件下的語言。相似的轉變還有font-family,在下文會有說起。數組

獲取系統語言設置

1.Locale.getDefault()bash

2.context.getResources().getConfiguration().locale;微信

3.Resources.getSystem().getConfiguration().locale;工具

1和2返回的是當前 APP 的 Resource 對應的 Locale 設置,也就是的值就是系統的 多語言值,可是但咱們在APP中更新過 Locale ,就再也獲取不到系統語言設置了。佈局

3返回的是系統全局 Resource的 Locale,不會隨APP中的更新而修改,能夠當作系統 Locale 來用。

因此若是想在APP運行期間隨時得到系統的多語言設置,有兩種方法,在APP未更新Locale值前保存;使用第三種方法。這個在配置多語言跟隨系統時頗有用。

實戰

目前Android應用對於多語言的支持度大體分爲如下幾個層次:

  • 不支持多語言:不管系統設置成何種語言,APP只顯示一種語言
  • APP支持多語言,但只能跟隨系統語言,不支持應用內多語言
  • APP既能夠選擇跟隨系統,也支持應用內多語言,但切換後須要重啓
  • APP既能夠選擇跟隨系統,也支持應用內多語言,切換後不須要重啓

無疑第四種狀況是對多語言支持度最全面的,微信、微博等應用均是採用這種方式管理多語言。接下來就講解下這種方式的具體實現過程:

定義須要支持的多語言列表選項,由於須要展現給用戶進行選擇切換,須要在每一個values-xx裏都放置一份:

<string name="language_auto">跟隨系統</string>
    <string name="language_zh_rCN">簡體中文</string>
    <string name="language_zh_rTW">繁體中文(臺灣)</string>
    <string name="language_english">English</string>
複製代碼

相似微信,只須要把跟隨系統翻譯一遍就好了,其餘的每一個語言文件夾下都同樣。

而後固然就要在應用中持久化保存當前多語言設置選項,用SharedPreferences再合適不過了。APP啓動時獲取這個值,再轉換成對應的 Locale值,若是選擇的是跟隨系統,則須要獲取系統的Locale值:

public Locale getSysLocale() {
        Locale locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0有多語言設置獲取頂部的語
            locale = Resources.getSystem().getConfiguration().getLocales().get(0);
        } else {
            locale = Resources.getSystem().getConfiguration().locale;
        }
        return locale;
    }
複製代碼

而後再更新便可。固然更新後界面上的語言不會當即生效,推薦的作法和微信同樣:

Intent intent = new Intent(SetLanguageActivity.this, MainActivity.class);
int flags = Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK;
intent.addFlags(flags);
startActivity(intent);
複製代碼

以清空棧的方式回到主頁,MainActivity也會銷燬重建,這樣就完成了多語言從設置到界面更新的全過程,而不用重啓APP再生效。

RTL

RTL(right to left)佈局,是一種阿拉伯語、波斯語等狀況下從右往左的閱讀方式,和咱們使用的LTR佈局方向對立。當所開發的App等面向海外用戶時須要作這個適配。從Android 4.2( V 17)開始支持原生的RTL模式。這種佈局遵循了Material Design 鏡像view等設計原則:

元素 LTR RTL
文本 句子讀從左到右。 句子讀從右到左。
時間軸 事件進展的說明順序從左到右。 事件進展的說明順序從右到左。
圖像 一個箭頭指向從左到右顯示前進運動:→ 一個箭頭指向右到左表示前進運動:←

1548388034522

是否啓用RTL佈局來自兩個部分,一個是判斷系統語言,還有一個就是須要在AndroidManifest.xml中聲明支持RTL:

android:supportsRtl="true"
複製代碼

在寫佈局文件的時候,就是注意把left和right相關的屬性都替換成start和end對於現有項目,也能夠經過Refactor---->Add RTL support where possible 進行快速替換。不過上面只是作了基礎的適配,那些有關左右方向的圖標也要替換,同時也須要看控件自己是否支持RTL,這裏就再也不具體展開了。

其餘

string-array

在多語言文件夾下也能夠放置字符串數組資源:

<string-array name="language_type">
    <item>跟隨系統</item>
    <item>簡體中文</item>
    <item>English</item>
</string-array>
複製代碼

能夠在strings.xml中,也能夠新建arrays.xml單獨管理字符串數組資源,在代碼中獲取和使用和string差很少

Resources res =getResources();
String[] languageTypes=res.getStringArray(R.array.language_type);
複製代碼

不過我在實際使用中遇到一個問題,獲取到的字符串數組的值只受到全局多語言設置的影響,應用內多語言設置無效。這個還須要再作進一步瞭解。

英語設置不起做用

設置英文語言時在有些手機上不起做用 在某些手機上設置英語語言不生效,這是因爲有些手機廠商的默認英語設置的是英式英語,而咱們只使用了美式英語的緣故,此時處理方式爲:

  1. 設置兩種英語的設置選項,即美式英語(values-en-rUS)和英式英語(values-en-rGB);
  2. 可將res的文件夾命名爲values-en,不區分國家便可;

更改系統全局語言設置

須要聲明系統權限,普通應用沒法使用:

<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
複製代碼

爲多語言適配不一樣字體

多語言文件夾下不只能存放strings.xml,還能配置不一樣風格,因此能夠爲不一樣的語言設置不一樣的字體,不過要注意有些字體有語言顯示上的限制。

android8.0新增了font-family,能夠定義一組字體及其權重

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
   <font
       android:fontStyle="normal"
       android:fontWeight="400"
       android:font="@font/lobster_regular" />
   <font
       android:fontStyle="italic"
       android:fontWeight="400"
       android:font="@font/lobster_italic" />
</font-family>
複製代碼

而後再styles.xml中配置便可:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:fontFamily">@font/arial</item> </style>
</resources>

複製代碼

更多地,能夠爲不一樣語言設置其餘的主題風格,如背景色、轉場動畫等。

輔助工具

若是應用所要支持的語言種類不少,那麼逐條分別輸入文本是很繁瑣的一件事情,推薦幾個能夠加快效率(偷懶)的工具:

Translation-Tools

多語言文本翻譯導入工具,解決多語種項目翻譯逐條導入問題

ECTranslation

Android Studio上的翻譯插件,支持翻譯代碼

AndroidLocalize

批量翻譯並自動生成其餘國家的語言文件夾,支持 104 種語言:

image

結語

好像沒啥可說的了,祝你們新年快樂,整年無BUG!

相關文章
相關標籤/搜索