國際化
1. 記得我在《我的第一個 Android 程序,基于 Intent 的組件交互機制 》在分析 R 文件和文章最后,有透露過這種機制的原理和好處。
很大程度上,為什么我們能如此方便的實現(xiàn)國際化、分辨率匹配等?
主要就是得益于 Android 中這種獨特的資源管理方式。程序員的代碼可以不直接和資源發(fā)生關(guān)系。Android中,我們通常通過 R 文件提供的索引來間接的引用某一個資源。而如何維護資源索引和真正的資源之間的關(guān)系,這個活,卻是 Android 系統(tǒng)來做的。
這里面就可以大作文章了不是么?
我說過,最了解用戶手機的,不是用戶也不是程序員,而是操作系統(tǒng),是 Android。它最了解用戶當前使用的是什么語言,最了解用戶當前手機的分辨率是多少,了解電量,了解內(nèi)存情況...等等。
既然你自個的情況這么了解,為什么不自己把所有能完成的事情都做了?不麻煩程序員了好吧?好的,所以Android 在這方面做得非常優(yōu)秀。
基于這個角度,我們要轉(zhuǎn)換的觀念為:有可能,R 文件中的索引,并非是和資源一對一的。例如我們以前認為它就一定是對應(yīng)了一張圖片,對應(yīng)了一個字符串,對應(yīng)了一個布局文件。
而很可能,Android 其實會根據(jù)用戶當前使用的環(huán)境對應(yīng)幾套方案:例如本文所講的主題,從國際化角度,可能對應(yīng)中文環(huán)境方案,英文環(huán)境方案?那么,這時候 R 文件對應(yīng)的這個資源便不確定起來,當我們通過 R 文件調(diào)用一個圖片資源顯示在窗口上時,Android 操作系統(tǒng)會自動根據(jù)用戶當前的環(huán)境,而選用最合適的圖片(這個挑選過程卻是透明的)。
程序員可以干預(yù)的是:英文環(huán)境到底對應(yīng)哪套方案?中文環(huán)境對應(yīng)到底哪套方案?
OK。這就簡單了。
2. Android 中要實現(xiàn)國際化比較簡單。
字符串國際化:只要在 res 文件夾下新建對應(yīng)語言的 values 文件夾就好了,
如,英語環(huán)境下的,文件夾命名為:values-en
美國英文環(huán)境:values-en-rUS
中文環(huán)境為:values-zh
大陸地區(qū)中文環(huán)境:
在 eclipse 下新建 Android 項目時,會在 res 目錄下自動創(chuàng)建一個默認語言環(huán)境的文件夾 : values
當某一個資源沒有在語言環(huán)境的對應(yīng)的資源集合中找到時,就會使用 values 下的資源。
若某一個語言環(huán)境沒有在項目中定義語言環(huán)境,那么也會使用 values 下的資源。
3. 圖片國際化
同理。
在 res 下新建 drawable-zh 文件夾,存放中文環(huán)境下的圖片
新建 drawable-en 作為英語環(huán)境下的圖片
在 eclipse 下新建 Android 項目時,會在 res 目錄下自動創(chuàng)建三個默認語言環(huán)境的文件夾:
drawable-hdpi
drawable-ldpi
drawable-mdpi
分別用于存放高、中。低分辨率的圖片。Android 系統(tǒng)會根據(jù)手機的分辨率,而自動從不同的對應(yīng)的某一個文件夾下去加載圖片。
同樣,它們也可以國際化,命名規(guī)則如:
drawable-zh-hdpi
drawable-en-ldpi
drawable-en-rUS-mdpi
使用,在 XML 中需要使用到圖片的地方用表達式: @drawable/icon
代碼中使用:R.drawable.icon。因為圖片資源同樣也會在 R 文件中生成一個索引。