1. 程式人生 > >客製化語言與時區問題

客製化語言與時區問題

客製化語言與時區問題

正常改預設語言路徑:
L之前:
修改預設語言
operator_SFR_MEO/mediatek/config/up40_h405f_meo/ProjectConfig.mk
MTK_PRODUCT_LOCALES=en_US pt_PT fr_FR es_ES iw_IL
修改預設時區:
/media/Disk2/projects/kk/operator_SFR_MEO/mediatek/config/up40_h405f_meo/system.prop
persist.sys.timezone=Europe/London

L及以後:
72l/ALPS.L1.MP6.V1_SR6572_WET_L/sagereal/mk/UP19_H3504_LP/full_sr6572_wet_l.mk

set locales & aapt config.

PRODUCT_LOCALES :=fr_FR en_US ar_EG

修改預設時區:
72l/ALPS.L1.MP6.V1_SR6572_WET_L/sagereal/mk/UP19_H3504_LP/ProjectConfig.mk
config_timezone = Europe/Brussels

因為整合在clone_integration.sh指令碼中定義:
if [ $config_timezone ]; then
config_timezone_change=echo $config_timezone | sed 's/\//\\\\\//g'


sed -i "/persist.sys.timezone/s/=.*/= c o n f i g t i
m e z o n e c h a n g e / " . . / a l p s / d e v i c e / s a g e t e l / config_timezone_change/" ../alps/device/sagetel/
base_project/system.prop
echo "config_timezone= c o n f i g t i m e z o n e " e l s e s e d i " / p e r s i s t . s y s . t i m e z o n e / d " . . / a l p s / d e v i c e / s a g e t e l / config_timezone" else sed -i "/persist.sys.timezone/d" ../alps/device/sagetel/ base_project/system.prop
fi

客戶的需求是當插入MEO卡的時候顯示葡萄牙語,當插入odo卡的時候顯示西班牙語,插入其他卡或者不插卡的時候顯示英語.
/media/Disk2/projects/kk/operator_SFR_MEO/frameworks/opt/telephony/src/java/com/android/internal/telephony/MccTable.java
static class MccEntry implements Comparable
{
int mMcc;
String mIso;
int mSmallestDigitsMnc;
String mLanguage;

    MccEntry(int mnc, String iso, int smallestDigitsMCC) {
        this(mnc, iso, smallestDigitsMCC, null);
    }

    MccEntry(int mnc, String iso, int smallestDigitsMCC, String language) {
        mMcc = mnc;
        mIso = iso;
        mSmallestDigitsMnc = smallestDigitsMCC;
        mLanguage = language;
    }

我直接在這個類裡面修改了
static {
sTable = new ArrayList(240);

    /*
     * The table below is built from two resources:
     *
     * 1) ITU "Mobile Network Code (MNC) for the international
     *   identification plan for mobile terminals and mobile users"
     *   which is available as an annex to the ITU operational bulletin
     *   available here: http://www.itu.int/itu-t/bulletin/annex.html
     *
     * 2) The ISO 3166 country codes list, available here:
     *    http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/index.html
     *
     * This table has not been verified.
     *
     */

	sTable.add(new MccEntry(202,"gr",2));	//Greece
	sTable.add(new MccEntry(204,"nl",2,"nl"));	//Netherlands (Kingdom of the)
	sTable.add(new MccEntry(206,"be",2));	//Belgium
	//gaoyaning
	sTable.add(new MccEntry(208,"fr",2,"en"));	//France
	修改之前
	sTable.add(new MccEntry(370,"do",2));	//Dominican Republic
	錯誤修改
	//gaoyaning 
	sTable.add(new MccEntry(370,"es",2,"es"));	//Dominican Republic
	正確修改:
	sTable.add(new MccEntry(370,"do",2,"es"));	//Dominican Republic
修改的時候沒有注意第二個引數代表的意思,直接將第二個引數改為es,以為第二個引數也是表示語言,所以直接修改,修改完之後驗證語言ok,所以就直接提交了.
由於沒有國外的網路,所以無法驗證時區是否ok,軟體發給客戶之後,客戶反饋時區顯示有問題.從log中看出來時區變為GMT+2,最後發現是修改了iso這個引數導致時區發生變化.

 
普及一下:ISO 國際標準化組織(International Organization for Standardization,ISO)簡稱ISO,是一個全球性的非政府組織,是國際標準化領域中一個十分重要的組織。。ISO一來源於希臘語“ISOS”,即“EQUAL”——平等之意。ISO國際標準組織成立於1946年,中國是ISO的正式成員,代表中國參加ISO的國家機構是中國國家技術監督局(CSBTS)
其宗旨是:在世界範圍內促進標準化工作的發展,以利於國際物資交流和互助,並擴大知識、科學、技術和經濟方面的合作。其主要任務是:制定國際標準,協調世界範圍內的標準化工作,與其他國際性組織合作研究有關標準化問題。

frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java

private String[][] mTimeZoneIdOfCapitalCity = {{"au", "Australia/Sydney"},
                                               {"br", "America/Sao_Paulo"},
                                               {"ca", "America/Toronto"},
                                               {"cl", "America/Santiago"},
                                               {"es", "Europe/Madrid"},
                                               {"fm", "Pacific/Ponape"},
                                               {"gl", "America/Godthab"},
                                               {"id", "Asia/Jakarta"},
                                               {"kz", "Asia/Almaty"},
                                               {"mn", "Asia/Ulaanbaatar"},
                                               {"mx", "America/Mexico_City"},
                                               {"pf", "Pacific/Tahiti"},
                                               {"pt", "Europe/Lisbon"},
                                               {"ru", "Europe/Moscow"},
                                               {"us", "America/New_York"}
                                              };
 private TimeZone getTimeZonesWithCapitalCity(String iso) {
    TimeZone tz = null;

    //[ALPS01666276]-Start: don't udpate with capital city when we has received nitz before
    if ((mZoneOffset == 0) && (mZoneDst == false)) {
        for (int i = 0; i < mTimeZoneIdOfCapitalCity.length; i++) {
            if (iso.equals(mTimeZoneIdOfCapitalCity[i][0])) {
                tz = TimeZone.getTimeZone(mTimeZoneIdOfCapitalCity[i][1]);
                log("uses TimeZone of Capital City:" + mTimeZoneIdOfCapitalCity[i][1]);
                break;
            }
        }
    } else {
        log("don't udpate with capital city, cause we have received nitz");
    }
    //[ALPS01666276]-End
    return tz;
}
	由於第二個引數改成了es,所以時區匹配到了Europe/Madrid
<!-- SPAIN, 1:00 -->

<timezone code="es">Europe/Madrid</timezone>

frameworks/base/core/res/res/xml/time_zones_by_country.xml
然而客戶需要的時區是GMT-4即對應的時區應該是:

America/Santo_Domingo

如何避免:
修改時不要我以為,應該仔細分析一下程式碼,弄懂必要的引數代表什麼.
修改到跟國外網路有關的問題時,可以用國內的卡驗證一下,比如聯通,移動.
以後iso還是不要亂動,容易出錯.當然最重要的是多分析一下.