天天看點

Android 多語言支援 下載下傳 Demo

本文内容

  • 字元串本地化原理
  • 環境
  • 建立項目
  • 測試其他語言
  • Android 本地化語言 ISO 編碼
  • 參考資料

使用 Android 的人越來越多,每天都在增加。是以,當你想把你的應用成功地全球化時,通常的方法就是使應用程式本地化。

雖然本地化,你可以考慮使用依靠區域和國家适當的文字,音頻,貨币,數字和圖形。但是,本文隻涉及本地化的字元串,例如支援多國語言(multiple languages)。Localizing with Resources 說明了,當本地化應用程式時,應該考慮的其他事情。

本文我們建立一個支援 French、Deutsch(German)、Hindi 和 Japanese 語言的 app。

下載下傳 Demo

預設情況下,Android 把英語作為主要語言,并從 res⇒values⇒strings.xml 中加載字元串資源。當你想添加支援其他語言時,你需要建立相應的檔案夾(通過追加一個連字元和 ISO 語言代碼)。例如,如果你想添加支援法語,你應該建立一個名為“values-fr”的檔案夾,并保持 strings.xml 中的所有字元串都翻譯成法文。

簡單來說,本地化的原理如下:

  • 1. 當使用者通過“設定 ⇒ 語言和輸入”改變裝置語言時,android 作業系統自己會檢查應用程式中相應的語言資源。假設使用者選擇了 French——法語。
  • 2. 如果 app 支援選擇的語言,android 會在項目中的“values-(ISO 語言編碼)”檔案夾内查找字元串資源。對于法語,會從 values-fr/string.xml 中加載。
  • 3. 如果支援的語言 strings.xml 字元串有缺失,android 總是從預設的 values/strings.xml 中加載缺失的字元串。

是以,預設的 stings.xml 檔案應包含應用程式使用的所有字元串的值,這是強制性的。否則,app 會強制關閉錯誤而崩潰。

可以按如下方式:

當你想要 app 支援多語言時,最好采用下面方式定義字元串。總是在 strings.xml  聲明字元串。

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

當在布局 XML 檔案中引用時,使用 @strings 注解:

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

在背景,可以使用 R.string:

emailNote.setText(R.string.note_email);      

但不能:

Never hard code the string in xml or in java code which make the translation difficult.

<TextView ...   android:text="Enter your email address"  />      

以及

emailNote.setText("Enter your email address");        
下面建立一個項目,示範讓android 支援多語言。

  • Windows 2008 R2 64 位
  • Eclipse ADT V22.6.2,Android 4.4.2(API 19)
  • SAMSUNG GT-8618,Android OS 4.1.2

Android 多語言支援 下載下傳 Demo

圖 1 項目結構

  • 1. 在 values 檔案夾下建立  colors.xml。

colors.xml

<?xml version="1.0" encoding="utf-8"?>      
<resources>      
<color name="white">#ffffff</color>      
<color name="bg_gradient_start">#b21331</color>      
<color name="bg_gradient_end">#820d2a</color>      
<color name="bg_button_login">#380813</color>      
</resources>      
  • 2. 在 drawable 檔案下建立三個名為 bg_button_rounded.xml、bg_form_rounded.xml、bg_gradient.xml 檔案。這些檔案與支援多語言無關,隻是給出了漂亮的漸變背景和圓角按鈕,輸入框。

bg_button_rounded.xml

<?xml version="1.0" encoding="utf-8"?>      
<shape      
xmlns:android="http://schemas.android.com/apk/res/android"      
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

<?xml version="1.0" encoding="utf-8"?>      
<shape      
xmlns:android="http://schemas.android.com/apk/res/android"      
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

<?xml version="1.0" encoding="UTF-8"?>      
<shape xmlns:android="http://schemas.android.com/apk/res/android"      
android:shape="rectangle" >      
<gradient      
android:gradientRadius="750"      
android:endColor="@color/bg_gradient_end"      
android:startColor="@color/bg_gradient_start"      
android:type="radial" />      
</shape>      
  • 3. 在 values/strings.xml 添加如下字元串。這是預設英文的字元串。

strings.xml

<?xml version="1.0" encoding="utf-8"?>      
<resources>      
<string name="app_name">Multi Language App</string>      
<string name="action_settings">Settings</string>      
<string name="welcome">Welcome!</string>      
<string name="email">Email Address</string>      
<string name="password">Password</string>      
<string name="login">Login</string>      
<string name="signup">Don\'t have account? Sign Up</string>      
</resources>      
  • 4. 在 res 檔案夾下建立四個名為 values-de、values-fr、values-hi、values-ja 的檔案夾,以及在每個檔案夾中建立相應的 strings.xml 檔案。建立完成後,大概如下所示:
Android 多語言支援 下載下傳 Demo

現在,把字元串翻譯成相關的語言,并放到相應的 strings.xml 檔案中。

另外,針對我的真機,支援三種語言:中文,英文和韓語,是以,再增加一個韓語。翻譯是用 google 翻譯的,對不對我也不知道。

values-de/strings.xml

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

values-fr/strings.xml

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

values-hi/strings.xml

<?xml version="1.0" encoding="utf-8"?>      
<resources>      
<string name="welcome">स्वागतम</string>      
<string name="email">ईमेल पता</string>      
<string name="password">पासवर्ड</string>      
<string name="login">लॉगिन</string>      
<string name="signup">खाता नहीं है? साइन अप करें</string>      
</resources>      

values-ja/strings.xml

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

values-ko/strings.xml

<?xml version="1.0" encoding="utf-8"?>      
<resources>      
<string name="welcome">환영</string>      
<string name="email">이메일</string>      
<string name="password">암호</string>      
<string name="login">로그인</string>      
<string name="signup">가입</string>      
</resources>      
  • 5. 建立布局 activity_main.xml,包含一個 title 和登入框。

activity_main.xml

<RelativeLayout xmlns: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>      
<TextView      
android:layout_width="fill_parent"      
android:layout_height="wrap_content"      
android:layout_alignParentBottom="true"      
android:layout_marginBottom="25dp"      
android:gravity="center_horizontal"      
android:text="@string/signup"      
android:textColor="@color/white" />      
</RelativeLayout>      
  • 6. 建立 MainActivity.java。

MainActivity.java

public class MainActivity extends Activity {      
@Override      
protected void onCreate(Bundle savedInstanceState) {      
super.onCreate(savedInstanceState);      
setContentView(R.layout.activity_main);      
getActionBar().hide();      
}      
@Override      
public boolean onCreateOptionsMenu(Menu menu) {      
// Inflate the menu; this adds items to the action bar if it is present.      
getMenuInflater().inflate(R.menu.main, menu);      
return true;      
}      
}      
Android 多語言支援 下載下傳 Demo

圖 2 Android 多語言——英文

按下面步驟測試一下app對其他語言的支援:

1. 在裝置上進入“設定 ⇒ 語言和輸入”

2. 選擇你裝置支援的語言。

Android 多語言支援 下載下傳 Demo

圖 3 SAMSUNG GT-8618 語言和輸入

Android 多語言支援 下載下傳 Demo

圖 4 Android 多語言——韓語

下表給出 Android 支援的 ISO 語言編碼。

表 1 Android 支援的 ISO 語言編碼

Language    Locale    values/strings.xml
German        de
Chinese     zh   values-zh/strings.xml
Czech        cs values-cs/strings.xml
Dutch        nl values-nl/strings.xml
French        fr
Italian        it values-it/strings.xml
Japanese        ja
Korean        ko
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
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

  • Android Building Multi-Language Supported App