android平臺修改默認語言的那點事

轉自:https://blog.csdn.net/qinghua0706/article/details/8243858html

 

          最近開始作智能機,用的是展訊6820平臺,第一個需求就是改默認語言,通常碰到不會的東西首先想到的就是上網找下了。網絡確實是個好東西,給咱們的工做和學習帶來了極大的方便,但享受到網絡的方便的同時也體會到了龐大的信息帶給咱們的困惑和迷茫,就一個字,暈!android

        首先說下在網上能找到的答案吧shell

1. 進入android 源代碼build/target/product目錄,在languages_full.mk或languages_small.mk文件中,修改PRODUCT_LOCALES的值,在PRODUCT_LOCALES字段裏,將要選擇的語言放在第一位。網絡

 

  1.  
    假如當前 PRODUCT_LOCALES := en_US zh_CN ... ... (English 簡體中文)
  2.  
    能夠修改成:PRODUCT_LOCALES := zh_CN en_US ... ... (簡體中文 English )


修改完後從新編譯,生成img文件fastboot到手機。

2. 進入adb shell,直接使用setprop 命令設置 persist.sys.language 和 persist.sys.country這兩個屬性值。
例如:學習

  1.  
    setprop persist.sys.language zh
  2.  
    setprop persist.sys.country CN


完成配置後重啓就可以達到你預期的結果的。ui

3.   進入build/target/product目錄,修改文件core.mk的PRODUCT_PROPERTY_OVERRIDES 值,例如,欲修改成默認中文,則增長 
「\ persist.sys.language=zh \ persist.sys.country=CN」,增長後的語句如spa

 

  1.  
    <span style="font-size:18px;"> PRODUCT_PROPERTY_OVERRIDES :=
  2.  
     
  3.  
     ro.config.notification_sound=OnTheHunt.ogg \
  4.  
     
  5.  
     ro.config.alarm_alert=Alarm_Classic.ogg \
  6.  
     
  7.  
    persist.sys.language=zh \
  8.  
     
  9.  
    persist.sys.country=CN </span>

 

4.   若是是本身編譯源碼 編譯的時候,經過指明編譯參數爲簡體中文,這樣編譯傳統就會編譯出來的系統屬性文件,在

系統初始化的時候將會把上面的屬性給進行正確的初始化,例如:

  make PRODUCT-machineID-eng-zh_CN

或者修改build/tools/buildinfo.sh添加
 .net

 
[plain]  view plain  copy
 
  1. <code class="language-html"><span style="font-size:18px;"> echo "persist.sys.language=zh"  
  2.   
  3.  echo "persist.sys.country=CN"  
  4.   
  5.  echo "persist.sys.localevar="  
  6.   
  7.  echo "persist.sys.timezone=Asia/Shanghai"  
  8.   
  9.  echo "ro.product.locale.language=zh"  
  10.   
  11.  echo "ro.product.locale.region=CN"</span></code>  


五、在init.rc或者在其餘的開機初始化文件如:default.prop中加入以下設置系統屬性的代碼:
 code

  1.  
      [persist.sys.language]: [zh]
  2.  
     
  3.  
       [persist.sys.country]: [CN]
  4.  
     
  5.  
       [persist.sys.localevar]: []
  6.  
     
  7.  
       [persist.sys.timezone]: [Asia/Shanghai]
  8.  
     
  9.  
       [ro.product.locale.language]: [zh]
  10.  
     
  11.  
       [ro.product.locale.region]: [CN]

6.   修改system\build.prop  
 xml

ro.product.locale.language=zh
      ro.product.locale.region=CN
      persist.sys.timezone=Asia/Shanghai

 

     看完了是否是以爲很暈,這幾個方法都被轉載了N遍,真的有這麼多種方法嗎?這麼多地方能夠修改,那到底執行的順序是怎麼樣的,好比說在一個地方設置爲中文,另一個地方設置爲英文,確定有一個地方要被覆蓋了。

        首先要說的是上面的答案從某種程度來說確實均可以修改默認語言,要否則也不會有人分享出來,並且都被轉載了N遍,但估計都是以爲改好了就算了,也不想到底合不合理。看到答案,首先就沒有考慮第2條和第6條,這樣子改完了從新編譯工程燒到手機裏面不又還原了嗎,system\build.prop 這個文件時編譯完了以後才生成的。第1條也不適合我,打開代碼中的languages_full.mk和languages_small.mk文件,中文都不是在第一位的,但實際上手機的語言是中文的。第5條答案沒試,不知道init.rc文件在哪裏,搜索了一下發現不少地方都有這個文件,打開來看因爲知識有限也看不懂。

       剩下兩個答案通過試驗都是有效的,但到底加載默認語言的順序是怎樣的,而後在上網找了一下,也知道了爲何改languages_full.mk不行了。首先anguages_full.mk和languages_small.mk這兩個文件第一個都是en_US。

 

PRODUCT_LOCALES := en_US fr_FR it_IT es_ES de_DE nl_NL cs_CZ <span style="font-size:18px;">...</span>

  打開build/core/Makefile文件,裏面有這樣一段代碼

 

  1.  
    define default-locale-language
  2.  
    $(word 2, 2, $(call default-locale, $(1)))
  3.  
    endef
  4.  
    define default-locale-region
  5.  
    $(word 3, 3, $(call default-locale, $(1)))
  6.  
    endef

下面有一段這樣的代碼

 

  1.  
    PRODUCT_DEFAULT_LANGUAGE="$(call default-locale-language,$(PRODUCT_LOCALES))" \
  2.  
    PRODUCT_DEFAULT_REGION="$(call default-locale-region,$(PRODUCT_LOCALES))" \

能夠看出,默認語言確實取出的是PRODUCT_LOCALES字段的第一個,然而在這個以前有這樣一段代碼

 

<span style="font-size:18px;">BUILDINFO_SH := build/tools/buildinfo.sh</span>

說明Makefile會調用build/tools/buildinfo.sh執行腳本,並輸出到build.prop。如今打開buildinfo.sh驚喜地發現個人代碼中

  1.  
    #echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
  2.  
    #echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION"

原來這個被註釋掉了,再下面

 

  1.  
    if [ $TARGET_PRODUCT_CARRIER = "GENERAL" ]; then
  2.  
    echo "ro.product.locale.language=en"
  3.  
    echo "ro.product.locale.region=US"
  4.  
    else
  5.  
    echo "ro.product.locale.language=zh"
  6.  
    echo "ro.product.locale.region=CN"
  7.  
    fi

原來是這樣子來的。還沒結束,接着Makefile中直接把$(TARGET_DEVICE_DIR)/system.prop的內容追加到build.prop中,還會收集ADDITIONAL_BUILD_PROPERTIES中的屬性,追加到build.prop中。

 

  1.  
    ADDITIONAL_BUILD_PROPERTIES := \
  2.  
    $(call collapse-pairs, $(ADDITIONAL_BUILD_PROPERTIES))

也就是到了 build/target/product/core.mk中$(PRODUCT_PROPERTY_OVERRIDES)裏面的值,也能夠在這裏面指定語言。       每套android的代碼都不徹底相同,能夠還有其餘不少方法修改語言的。在吸取互聯網中的知識的時候,但願不要僅僅想着獲得答案,更要多想一想緣由,在傳播知識出去的時候,也要把本身的思惟傳播出去。做爲一個初學者而言,更指望的獲得的是能力而不是知識。

相關文章
相關標籤/搜索