原文: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中聲明文本資源,如:
< string name = "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並加入以下代碼:
<? 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 > |
3. 在drawable文件夾下創建以下幾件文件:bg_button_rounded.xml,bg_form_rounded.xml,bg_gradient.xml 文件內容分別如下:
(這些文件與語言支持無關,只是爲了讓app的外觀更漂亮,有漸變的背景,圓角按鈕,輸入框等,就是樣式。)
bg_button_rounded.xml
<? xml version = "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
<? xml version = "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
<? xml version = "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 ,並添加以下代碼:(這些是默認英文文本)
<? 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 > |
5. 好,現在到 res 目錄下新建三個文件夾分別命名爲: values-de, values-fr, values-zh, values-ja ,把默認的strings.xml 分別複製到這三個文件夾。
現在你的項目應該是這樣的:
現在開始翻譯!
德語 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-zh/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 > |
6. 打開activity_main.xml並添加如下內容來創建一個簡單的佈局,這個佈局包含一個標題和一個登錄區域。
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:text = "@string/signup" android:layout_alignParentBottom = "true" android:gravity = "center_horizontal" android:layout_marginBottom = "25dp" android:textColor = "@color/white" /> </ RelativeLayout > |
7. 打開 MainActivity.java 確保有如下代碼:
package info.androidhive.multilanguageapp; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity
{ @Override protected void onCreate(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.(掃描性漸變) |