Monday, January 7, 2013

[Android] 應用程序的國際化與本地化

一般用語言_地區的形式表示一種語言,如zh_CN,則ZH_TW。
各國語言縮寫http://www.loc.gov/standards/iso639-2/php/code_list.php
國家和地區簡寫http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html
在Android工程的res目錄下,通過定義特殊的文件夾名稱就可以實現多語言支持。比如我們的程序兼容簡體中文、日文、英文、法文和德文,在values​​文件夾中建立默認strings.xml,再建立values​​-zh-rCN(zh表示中文rCN表示簡體,類似還有美式英語,奧式英語)、values​​-ja、values​​、values​​-fr和values​​-de文件夾。 (可以用開發工具:見http://www.cnblogs.com/wuyunan/archive/2009/09/16/1567960.html
Android應用程序的國際化與本地化機制是比較完善的,操作起來也比較方便。我們可以把要用到的所有字符串放在res/values​​​​目錄下的strings.xml文件中,在程序中以R.string.xx的形式來引用它們。把其他語言的字符串放在形如res/values​​​​-zh-rCN、res/values​​​​-zh-rTW目錄下的strings.xml文件中,應用程序會根據手機語言的設置情況自動選擇合適的語言。不只是字符串,程序中所用到的圖片、音頻、佈局​​​​等資源文件都可以通過這種形式來實現國際化與本地化。以下示例程序實現了字符串和圖片文件的國際化與本地化。在代碼中切換語言: 
Resources resources = getResources();//獲得res資源對象
Configuration config = resources.getConfiguration();//獲得設置對象
DisplayMetrics dm = resources .getDisplayMetrics();//獲得屏幕參數:主要是分辨率,像素等。
config.locale = Locale.SIMPLIFIED_CHINESE; //簡體中文
resources.updateConfiguration(config, dm);

 
補:




添加列表裡的,Region和Language,Region值填寫兩位地區代碼(美國為US,中國為ZH,台灣(繁體)為TW),Language填寫兩位語言代碼(英語en,中文cn)。有一點要注意,簡繁體中文並不是由Language識別的,不管是簡體還是繁體,Language都填cn,如果要顯示繁體,Region填為TW就可以了



英文values​​-en 中文簡體drawable-zh-rCN 中文繁體layout-zh-rTW















Android應用程序的國際化與本地化機制是比較完善的,操作起來也比較方便。我們可以把要用到的所有字符串放在res/values​​目錄下的strings.xml文件中,在程序中以R.string.xx的形式來引用它們。把其他語言的字符串放在形如res/values​​-zh-rCN、res/values​​-zh-rTW目錄下的strings.xml文件中,應用程序會根據手機語言的設置情況自動選擇合適的語言。不只是字符串,程序中所用到的圖片、音頻、佈局​​等資源文件都可以通過這種形式來實現國際化與本地化。以下示例程序實現了字符串和圖片文件的國際化與本地化。
程序目錄如下:


mulu


res/layout/main.xml文件:

  1. xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:orientation="vertical"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     > <TextView android:layout_width="fill_parent"  
  6.     android:layout_height="wrap_content"  
  7.     android:gravity="center_horizontal"  
  8.     android:text="@string/text_a"  
  9.     /> <TextView android:layout_width="fill_parent"  
  10.     android:layout_height="wrap_content"  
  11.     android:gravity="center_horizontal"  
  12.     android:text="@string/text_b"  
  13.     /> <Button android:id="@+id/flag_button"  
  14.     android:layout_width="wrap_content"  
  15.     android:layout_height="wrap_content"  
  16.     android:layout_gravity="center"  
  17.     /> </LinearLayout>  
 


src/playboy/test/HelloL10N.java文件:

  1. package playboy.test;  
  2. import android.app.Activity;  
  3. import android.app.AlertDialog;  
  4. import android.content.DialogInterface;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8. public class HelloL10N extends Activity {  
  9.     /** Called when the activity is first created. */  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.      // assign flag.png to the button, loading correct flag image for current locale  
  15.         Button b;  
  16.         (b = (Button)findViewById(R.id.flag_button)).setBackgroundDrawable(this.getResources().getDrawable(R.drawable.flag));  
  17.         // build dialog box to display when user clicks the flag  
  18.         AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  19.         builder.setMessage(R.string.dialog_text)  
  20.         .setCancelable(false)  
  21.         .setTitle(R.string.dialog_title)  
  22.         .setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() {  
  23.             public void onClick(DialogInterface dialog, int id) {  
  24.                 dialog.dismiss();  
  25.                 }  
  26.             });  
  27.         final AlertDialog alert = builder.create();  
  28.         // set click listener on the flag to show the dialog box  
  29.         b.setOnClickListener(new View.OnClickListener() {  
  30.             public void onClick(View v) {  
  31.                 alert.show();  
  32.                 }  
  33.             });  
  34.     }  
  35. }  
 

res/values/strings.xml文件:

  1. xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string name="app_name">Hello, L10N</string>  
  4.     <string name="text_a">Jay Chou</string>  
  5.     <string name="text_b">Andy Lau</string>  
  6.     <string name="dialog_ok">Done</string>  
  7.     <string name="dialog_title">Already Localisation</string>  
  8.     <string name="dialog_text">Support multi-languages.</string>  
  9. </resources>  
 

res/values-zh-rCN/strings.xml文件:

  1. xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3. <string name="app_name">Hello, L10N</string>  
  4.     <string name="text_a">周杰伦</string>  
  5.     <string name="text_b">刘德华</string>  
  6.     <string name="dialog_ok">确定</string>  
  7.     <string name="dialog_title">已经国际化</string>  
  8.     <string name="dialog_text">支持多语言</string>  
  9. </resources>  
 

res/values-zh-rTW/strings.xml文件:

  1. xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3. <string name="app_name">Hello, L10N</string>  
  4.     <string name="text_a">周傑倫</string>  
  5.     <string name="text_b">劉德華</string>  
  6.     <string name="dialog_ok">確定</string>  
  7.     <string name="dialog_title">已經國際化</string>  
  8.     <string name="dialog_text">支持多語言</string>  
  9. </resources>  
 
 drawable實現圖片資源的國際化,values​​實現字符串的國際化。 zh-rCN表示的是中文-中國內地,zh-rTW表示的是中文-台灣。 hdpi、mdpi、ldpi表示的是不同分辨率的圖片,本例中的drawable實現了語言、地區與分辨率的各種組合。
再來看一看程序的執行情況,分別將模擬器的語言設置成English(United kingdom)、中文(簡體)、中
文(繁體)以及朝鮮語,程序運行結果如圖所示。
English(United kingdom) 
中文(简体)
中文(繁體) 
朝鲜语
當把模擬器設置為英語和朝鮮語時,由於程序沒有實現英語和朝鮮語的本地化,所以會使用默認的語言,程序使用的是res/values​​/strings.xml文件中的字符串和res/ drawable-mdpi目錄中的圖片(根據模擬器分辨率的具體設置情況,也可能調用res/drawable-zh-rCN-hdpi或者res/drawable-zh-rCN-ldpi目錄下的圖片)。

No comments:

Post a Comment