Android創建多語言支持app

原文:http://www.androidhive.info/2014/07/android-building-multi-language-supported-app/

注:

將原文的中印度語改成了中文,並以中文作爲示例;原文使用的Eclipse ,我這裏使用Android Studio。

學到或可繼續瞭解的知識:

1、如何建立對應不同語言的values文件夾

2、規範化,資源全部放資源文件中,不要在佈局頁或後臺代碼中寫死,便於維護

3、如何給一個activity更換漸變背景

4、drawable目錄下除了放圖,還可以放定義的xml文件

5、shape和gradient,其中又涉及到shape的形狀,gradient的方式,及不同方式呈現的效果及注意點

6、沉浸式菜單

7、如果不顯示actionbar

……

Android是最受歡迎的移動操作系統之一,在世界上超過190個國家和地區擁有成千上萬的用戶,並且用戶數量在不斷地增長。如果你想把你的app推向國際市場,讓世界上更多的人使用它,那麼最好的方法就是實現app的本地化。

本地化的時候,你需要根據某個國家或地區的實際情況來考慮使用合適的文字、語音、貨幣形式、數字和圖片等。但是這篇教程只講到本地化文本,支持多樣化語言。想要了解除文本外更多的內容,請訪問Localizing with Resources

我們將在這篇文章裏創建一個支持法語、德語、中文和日文的多語言支持app。

1. 文本本地化如何工作

Android默認使用英語,文本資源一般存放於res ⇒ values ⇒ strings.xml。如果想要讓程序支持其它語言,你需要創建一個"values-ISO語言代碼“文件夾,如中文,就建立叫”values-zh“的文件夾,在該文件夾裏創建一個strings.xml,該xml中放入翻譯好的中文文本。ISO語言代碼在本文第四部分會有介紹。

簡而言之,本地化工作如下:

1. 當用戶通過”設置⇒ 語言和輸入法“來改變設備的默認語言時,Android系統會自動匹配適合的語言資源。如果用戶的設備上默認語言是簡體中文,則系統會自動匹配”values-zh“中的strings.xml。

2. 如果app支持選擇語言,Android系統將會搜索並使用用戶選擇的語言資源。

3. 如果用戶選擇的strings.xml 中沒有某個文本的值,系統將會加載默認strings.xml中的值,如values/strings.xml。

所以默認的strings.xml文件中必須包含app中會用到的所有設置的文本值,否則將會報錯。

建議:

最好只在strings.xml中聲明文本資源,如:

<stringname="note_email">Enter your email address</string>

在 xml中使用 @strings標記,如:

<TextView...  android:text="@string/note_email" />

在java代碼中使用R.string的寫法:

emailNote.setText(R.string.note_email);

不建議:

我不建議在xml或java代碼中將文本寫死,這樣非常不利於維護,如:

<TextView...  android:text="Enter your email address"  />
emailNote.setText("Enter your email address");   

講到這裏也差不多了,那我們開始通過一個例子來加深理解吧!

2. 創建新項目

1. 用Adnroid Studio創建一個新項目:File ⇒ New ⇒ New Project 。

2. 在colors.xml中加入以下代碼,如果沒有找到colors.xml,就在values目錄下新建一個colors.xml並加入以下代碼:

colors.xml
<?xmlversion="1.0"encoding="utf-8"?>
<resources>
    <colorname="white">#ffffff</color>
    <colorname="bg_gradient_start">#b21331</color>
    <colorname="bg_gradient_end">#820d2a</color>
    <colorname="bg_button_login">#380813</color>
</resources>

3. 在drawable文件夾下創建以下幾件文件:bg_button_rounded.xml,bg_form_rounded.xml,bg_gradient.xml 文件內容分別如下:

(這些文件與語言支持無關,只是爲了讓app的外觀更漂亮,有漸變的背景,圓角按鈕,輸入框等,就是樣式。)

bg_button_rounded.xml

bg_button_rounded.xml
<?xmlversion="1.0"encoding="utf-8"?>
<shape
    android:shape="rectangle">
  
    <!-- view background color -->
    <solid
        android:color="@color/bg_button_login">
    </solid>
  
    <!-- If you want to add some padding -->
    <padding
        android:left="5dp"
        android:top="5dp"
        android:right="5dp"
        android:bottom="5dp"   >
    </padding>
  
    <!-- Here is the corner radius -->
    <corners
        android:radius="6dp"  >
    </corners>
  
</shape>

bg_form_rounded.xml

bg_form_rounded.xml
<?xmlversion="1.0"encoding="utf-8"?>
<shape
    android:shape="rectangle">
  
    <!-- view background color -->
    <solid
        android:color="@color/white">
    </solid>
  
    <!-- If you want to add some padding -->
    <padding
        android:left="5dp"
        android:top="5dp"
        android:right="5dp"
        android:bottom="5dp"   >
    </padding>
  
    <!-- Here is the corner radius -->
    <corners
        android:radius="6dp"  >
    </corners>
  
</shape>

bg_gradient.xml

bg_gradient.xml
<?xmlversion="1.0"encoding="UTF-8"?>
    android:shape="rectangle">
 
    <gradient
        android:gradientRadius="750"
        android:endColor="@color/bg_gradient_end"
        android:startColor="@color/bg_gradient_start"
        android:type="radial"/>
</shape>

4. 打開values 目錄下的strings.xml ,並添加以下代碼:(這些是默認英文文本)

strings.xml
<?xmlversion="1.0"encoding="utf-8"?>
<resources>
 
    <stringname="app_name">Multi Language App</string>
    <stringname="action_settings">Settings</string>
     
    <stringname="welcome">Welcome!</string>
    <stringname="email">Email Address</string>
    <stringname="password">Password</string>
    <stringname="login">Login</string>
    <stringname="signup">Don\'t have account? Sign Up</string>
 
</resources>

5. 好,現在到 res 目錄下新建三個文件夾分別命名爲: values-devalues-frvalues-zhvalues-ja ,把默認的strings.xml 分別複製到這三個文件夾。

現在你的項目應該是這樣的:



現在開始翻譯!

德語 values-de/strings.xml

<?xmlversion="1.0"encoding="utf-8"?>
<resources>
     
    <stringname="welcome">Willkommen!</string>
    <stringname="email">Email Addresse</string>
    <stringname="password">passowrd</string>
    <stringname="login">Login</string>
    <stringname="signup">müssen nicht angemeldet? Anmeldung</string>
 
</resources>

法語 values-fr/strings.xml

<?xmlversion="1.0"encoding="utf-8"?>
<resources>
     
    <stringname="welcome">accueil</string>
    <stringname="email">adresse e-mail</string>
    <stringname="password">mot de passe</string>
    <stringname="login">connexion</string>
    <stringname="signup">Ne pas avoir un compte? signer</string>
 
</resources>

中文 values-zh/strings.xml

<?xmlversion="1.0"encoding="utf-8"?>
<resources>
     
    <stringname="welcome">歡迎</string>
    <stringname="email">郵件地址</string>
    <stringname="password">密碼</string>
    <stringname="login">登錄</string>
    <stringname="signup">還沒有賬戶?趕緊註冊!</string>
 
</resources>

日語 values-ja/strings.xml

<?xmlversion="1.0"encoding="utf-8"?>
<resources>
     
    <stringname="welcome">歓迎</string>
    <stringname="email">電子メールアドレス</string>
    <stringname="password">パスワード</string>
    <stringname="login">ログイン</string>
    <stringname="signup">アカウントをお持ちでない場合は?サインアップ</string>
 
</resources>

6. 打開activity_main.xml並添加如下內容來創建一個簡單的佈局,這個佈局包含一個標題和一個登錄區域。

activity_main.xml
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg_gradient"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">
 
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp"
        android:gravity="center"
        android:orientation="vertical">
 
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="40dp"
            android:text="@string/welcome"
            android:textColor="@color/white"
            android:textSize="45dp"
            android:textStyle="bold"/>
 
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/bg_form_rounded"
            android:orientation="vertical">
 
            <EditText
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:background="@null"
                android:hint="@string/email"
                android:padding="5dp"
                android:singleLine="true"/>
 
            <EditText
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:background="@null"
                android:hint="@string/password"
                android:inputType="textPassword"          
                android:padding="5dp"/>
        </LinearLayout>
 
        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="25dp"
            android:background="@drawable/bg_button_rounded"
            android:text="@string/login"
            android:textColor="@color/white"/>
    </LinearLayout>
     
    <TextViewandroid:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/signup"
        android:layout_alignParentBottom="true"
        android:gravity="center_horizontal"
        android:layout_marginBottom="25dp"
        android:textColor="@color/white"/>
 
</RelativeLayout>

7. 打開 MainActivity.java 確保有如下代碼:

MainActivity.java
packageinfo.androidhive.multilanguageapp;
 
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.view.Menu;
 
publicclassMainActivityextendsActivity {
 
    @Override
    protectedvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        getActionBar().hide();
    }
}

(其實我的代碼中除了getActionBar().hide();沒有,其它都有,我不顯示ActionBar的方式如下,這是style.xml:

    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>
不顯示ActionBar主要靠後兩句,colorPrimaryDark就是實現我這裏的沉浸式菜單的方法。

)

好,運行,來看看默認英語的版本:


3. 測試其他語言

打開自己的設備,設置-語言和輸入法,設置成你要測試的語言,其實一般在國內,我們默認的會是簡體中文,所以當你什麼都不設置的時候應該看到的中文版本,改成英文後纔會顯示第二部分最後一張效果圖,那麼 不管怎樣,看看中文顯示效果吧:


由於我的小米手機只有簡體中文、繁體中文和英文設置,所以不能展示更多效果了。

4. Android 本地化語言 ISO 代碼表

語言 默認英語 values/strings.xml
German de values-de/strings.xml
Chinese zh values-zh/strings.xml
Czech cs values-cs/strings.xml
Dutch nl values-nl/strings.xml
French fr values-fr/strings.xml
Italian it values-it/strings.xml
Japanese ja values-ja/strings.xml
Korean ko values-ko/strings.xml
Polish pl values-pl/strings.xml
Russian ru values-ru/strings.xml
Spanish es values-es/strings.xml
Arabic ar values-ar/strings.xml
Bulgarian bg values-bg/strings.xml
Catalan ca values-ca/strings.xml
Croatian hr values-hr/strings.xml
Danish da values-da/strings.xml
Finnish fi values-fi/strings.xml
Greek el values-el/strings.xml
Hebrew iw values-iw/strings.xml
Hindi hi values-hi/strings.xml
Hungarian hu values-hu/strings.xml
Indonesian in values-in/strings.xml
Latvian lv values-lv/strings.xml
Lithuanian lt values-lt/strings.xml
Norwegian nb values-nb/strings.xml
Portuguese pt values-pt/strings.xml
Romanian ro values-ro/strings.xml
Serbian sr values-sr/strings.xml
Slovak sk values-sk/strings.xml
Slovenian sl values-sl/strings.xml
Swedish sv values-sv/strings.xml
Tagalog tl values-tl/strings.xml
Thai th values-th/strings.xml
Turkish tr values-tr/strings.xml
Ukrainian uk values-uk/strings.xml
Vietnamese vi values-vi/strings.xml


附:gradient漸變的三種形式

Constant(常量) Value(值) Description(描述)
linear 0 Linear gradient.(線性漸變,默認的漸變類型)
radial 1 Radial, or circular, gradient.(放射漸變,設置該項時,android:gradientRadius也必須設置
sweep 2 Sweep, or angled or diamond, gradient.(掃描性漸變)


示例代碼,可供下載學習參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章