iT邦幫忙

DAY 14
4

Android 學習手札系列 第 14

Day 14 - Android - 語言

  • 分享至 

  • xImage
  •  

Chocobo:「Choco..Choco..」
Moogle:「...誰能夠來翻譯一下...」
這種場景…相信對很多人來說都很不陌生…我是說我啦汗
尤其是遇到外國人的時候,管他什麼語系的,只要聽不懂,在腦海裡接收到的聲音跟音調都一樣啦翻桌

在行動裝置上面,我們可以很輕鬆的透過設定去調整在地化語系就好了,可是有時候會發現怎麼調都還是一樣,有些APP就是只有那麼唯一的一種語系,其原因當然沒有第二個理由,就是他被開發時,開發者就只有用那麼唯一的設設語系。

而在語系的部份要看哪裡呢!還記得之前曾經要各位到專案目錄中的「res > values > string.xml」那邊輸入一些資料嗎?是的!就是那裡~所以,去增加其他語系就好啦!報告完畢!拍手

謎之音:「眾多邦友在你背後,他們都很火…」

驚

...

汗

當然還有啦~
語系的設定呢,當然沒有這麼簡單,大家在該目錄裡看到的其實就是"預設"的語系目錄,若是沒有被特別設定的語系目錄,不論我們如何設定系統,他就是會幫我們從該目錄去取出各種顯示!

那在正式開始前,我們一樣再延用昨天的專案來進行,請將之用「加入既有專案為專案」之設定,專案名為「Day14_Location」,在昨天的專案裡,我們的下拉選單"Spinner"是另外寫在程式碼的字串陣列,今天我們要將之移到"string.xml"裡面,最快的方式是,我們打開string.xml檔案,將介面從「Resources」改成「strings.xml」,而我們要新增的不是單一個字串,而是一個字串陣列,格式如下:

<string-array name="Signal">
    <item >壹</item>
    <item >貮</item>
    <item >參</item>
    <item >肆</item>
    <item >伍</item>
    <item >陸</item>
    <item >柒</item>
    <item >捌</item>
    <item >玖</item>
    <item >拾</item>
</string-array>

一般的字串宣告是用<string name="string_name">string value</string>的格式,而字串陣列就是如各位看到上面的格式一般。當然,這時的 Spinner 的設定有略有不同

//這是新的寫法
ArrayAdapter<CharSequence> adapterSignal =     ArrayAdapter.createFromResource(
    this,                                 //Context
    R.array.Signal,                       //被宣告的字串陣列
    android.R.layout.simple_spinner_item  //Spinner 要呈現的樣子
);


/* -----這是原本的寫法,列出來供各位比較----- */
ArrayAdapter<String> adapterSignal = new ArrayAdapter<String>(
    this,                                 //Context
    android.R.layout.simple_spinner_item, //選單格式
    mSingals	                          //選單內容
);

將這樣的程式內容改掉原本 MoogleActivity.java 以及 ChocoboActivity.java 裡的 Spinner 之設定即可。
再來就要進入我們今天的正題嘍!
對身為勇者(開發者)的我們來說,語系的呈現是要去增加哪裡呢,剛剛有提到,在「res > values」的這個目錄是系統指名的預設目錄,所以,就是對他對手腳啦,怎麼改,就是增加一個不同語系的目錄,而目錄格式亦不難,就是像「values-zh-rTW」、「values-en-rUS」或是「values-jp」這樣的格式,那為什麼用「-」格開者有兩段也有三段的,相信聰明的您一定看得出來,在第二區段所表示的就是主要語系別,第三區段指的就是該語系的地區別,以「values-en-rUS」為例,en所指的所有英文語系,倘若沒有第三區段的設定時,今天只要系列語系是設定到英美系統下,那自然就是直接取出該目錄的語系,但若是相要再針對地區,以此例來說,就是針對「美國」地區了!

接下來,我們要如何增加之,其實最快的方式就是在「res」目錄處點下右鍵,直接增一個新的「values-en-rUS」這樣的目錄即可,但其實還有一個比較正規的做法,請點下圖示工具列「debug」(在run圖示的左邊那隻可愛的小蟲)圖示的左邊「Opens a wizard...」的圖示,可以看到下面這個視窗

將「Resource Type:」調成「Values」,在「Files:」輸入「strings.xml」,然後下一步就可以看到下面這個畫面

然後將兩個選項:「Language」以及「Region」從左邊選至「->」右邊,依序選擇位置位邊「Chosen Qualifiers」的Language,在其右邊的「Language」輸入「en」,而「Region」呢,我們就輸入「US」,如此一來就能在「res」目錄下看到一個被新增的「values-en-rUS」目錄,而且裡面還有一個strings.xml的檔案

接著,我們就在res/values-en-rUS/strings.xml裡面修改如下

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="Signal">
        <item >One</item>
        <item >Two</item>
        <item >Three</item>
        <item >Four</item>
        <item >Five</item>
        <item >Six</item>
        <item >Seven</item>
        <item >Eight</item>
        <item >Nine</item>
        <item >Ten</item>
    </string-array>
</resources>

再來,我們就特別將 ChocoboActivity.java 的程式碼加入下面這段

//取得系統資源
Resources resource = getResources();
//取得資源設定
Configuration conf = resource.getConfiguration();
//切換這個Activity的語系
conf.locale = Locale.TAIWAN;
//取得設定的參數內容
DisplayMetrics dm =resource.getDisplayMetrics();
//更新
resource.updateConfiguration(conf, dm);

說明一下,切換語系的語法為"Locale.地區",這裡之所以用"TAIWAN"的原因在於,因為在下的模擬器,並沒有去調整過系統預設的語系設定值,所以其預設還是維持在美國,而我們又已在上面的說明過程中,加入美國區域的英文語系了,因此,在剛啟動的 Moogle 之下拉選單文字會是"英文",因而故意將 Chocobo 這個 Activity 設定為臺灣區域的中文語系。

最後,既然已經介紹到這邊了,我們再來看一個問題。不曉得大家有沒有留意到,在我們設定介面的文字時,只要在「text」欄位一輸入完文字,就會跑出一個驚示圖示,這時移上去時,可以看到像下圖這樣的警告文字

這個意思是說,請將該字串不要以寫死(hardcoded)的方式寫在這裡,這樣會不利於[I18N]也就是多國語系的設定,所以,再來為大家介紹如何去更改之。

請看到如上圖的右下角處,該處為我們設定好的"Text"欄位,已有"呈現"二字,請點下其右邊的「...」按鈕,會看到位在左邊的「Resource Chooser」視窗,再點下「New String...」會看到如下的「Create New Android String」視窗

接下來就依序的留意看"String"欄位是否有預代入我們選擇的「呈現」,在"New R.string."欄位自行鍵入想要帶入的字串變數名,看到中間"Resource file:"欄位,他是設定在「預設的語系檔案」,當然我們可以將該下拉選單點開,選擇我們想要放入的語系檔案中。其餘的部份就請各位自行增加嘍,這樣做完就可以陸續看到上述的警訊不見了,相信應該都有一種清爽感吧哈哈

程式碼請自行從 Mosil's GitHub 下載哦

《Day 13 - Android - 限制選擇 Day 15 - Android - 選擇


上一篇
Day 13 - Android - 限制選擇
下一篇
Day 15 - Android - 選擇
系列文
Android 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
ted99tw
iT邦高手 1 級 ‧ 2012-10-08 23:05:45

沙發

Andriod / iOS 一家親,雖然我是iOS大內無上眼高手低,所以看到安卓也是要說個Hi~~

0
海綿寶寶
iT邦大神 1 級 ‧ 2012-10-08 23:42:24

mosil提到:
「Create New Android String」

這個功能很方便

想請教一下
Eclipse 有沒有提供「批次」轉換?
就是
自動偵測程式中所有的字串常數
將其定義於 strings.xml
並修改程式,由原指定字串常數改為抓 strings.xml
謝謝

mosil iT邦新手 4 級 ‧ 2012-10-09 08:37:29 檢舉

這部份就要讓您失望了,目前在個人的認知裡是沒有這個功能的,看看有沒有其他大大知道
但是您可以透過開發介面下方的"problems"看到有哪些問題跟錯誤列表
直接從那邊去看有哪裡沒有被修改到

mosil提到:
這部份就要讓您失望了

這倒是不會啦
寫程式的人本來就該自己注意L10N中resource file的使用

我只是想起以前JBuilder (Page3,Page4)的功能
讓程式設計人員可以偷懶一點
先隨便寫一寫
最後再一次轉成 resource file
偷笑


離開 Borland 之後
JBuilder 都不 JBuilder 了
嘆氣

我要留言

立即登入留言