涉及到如下文件:

    1. frameworks/base/core/java/com/android/internal/app/LocalePickerWithRegion.java
    2. packages/apps/Settings/src/com/android/settings/localepicker/LocaleListEditor.java
    3. libcore\ojluni\src\main\java\java\util\Locale.java
    4. \packages\apps\Settings\src\com\android\settings\localepicker\LocaleDragAndDropAdapter.java
    5. \frameworks\base\core\java\com\android\internal\app\LocaleStore.java
    6. \frameworks\base\core\java\com\android\internal\app\LocalePicker.java
    7. \packages\apps\Settings\src\com\android\settings\localepicker\LocaleListEditor.java
    8. \frameworks\base\core\res\res\values\locale_config.xml

    N0 语言列表分析文档:

    MTK 有一篇《Android N Language》的文档,这里因为一些原因不能上传。

    1、修改 \packages\apps\Settings\res\values\arrays.xml

    1. <!-- START. Add more languages to Language preferences. By ShawnXiaFei, 20170509. -->
    2. <string-array name="preset_language_tags">
    3. <item>"hi-IN"</item> <!-- Hindi (India) -->
    4. <item>"gu-IN"</item> <!-- Gujarati (India) -->
    5. <item>"bn-IN"</item> <!-- Bengali (India) -->
    6. <item>"pa-IN"</item> <!-- Punjabi (Gurmukhi,India) -->
    7. <item>"ur-IN"</item> <!-- Urdu (India) -->
    8. <item>"ar-YE"</item> <!-- Arabic (Yemen) -->
    9. <item>"ta-IN"</item> <!-- Tamil (India) -->
    10. <item>"te-IN"</item> <!-- Telugu (India) -->
    11. <item>"kn-IN"</item> <!-- Kannada (India) -->
    12. <item>"ml-IN"</item> <!-- Malayalam (India) -->
    13. <item>"ne-IN"</item> <!-- Nepali (India) -->
    14. <item>"af-NA"</item> <!-- Afrikaans (Namibia) -->
    15. <item>"fo-DK"</item> <!-- Faroese (Denmark) -->
    16. <item>"fa-AF"</item> <!-- Persian (Afghanistan) -->
    17. <item>"fil-PH"</item> <!-- Filipino (Philippines) -->
    18. <item>"si-LK"</item> <!-- Sinhala (Sri Lanka) -->
    19. </string-array>
    20. <!-- END. Add more languages to Language preferences. By ShawnXiaFei, 20170509. -->

    2、修改 \packages\apps\Settings\src\com\android\settings\Settings.java

    1. public class Settings extends SettingsActivity {
    2. /// START. Add more languages to Language preferences. By ShawnXiaFei, 20170508.
    3. @Override
    4. protected void onCreate(Bundle savedState) {
    5. /// must call super.
    6. super.onCreate(savedState);
    7. /// check first start.
    8. SharedPreferences sp = getPreferences(MODE_PRIVATE);
    9. boolean isFirstStart = sp.getBoolean("isSettingsFirstStart", true);
    10. android.util.Log.e("Shawn", "onCreate, isFirstStart = "+isFirstStart);
    11. if(isFirstStart){
    12. sp.edit().putBoolean("isSettingsFirstStart", false).apply();
    13. presetLanguage(getResources().getStringArray(R.array.preset_language_tags););
    14. }
    15. }
    16. /// preset language list.
    17. private void presetLanguage(String[] languageTags){
    18. // do not need to preset.
    19. if (null == languageTags || 0 == languageTags.length) {
    20. return;
    21. }
    22. // alreday exist in list.
    23. LocaleList localeList = LocalePicker.getLocales();
    24. List<Locale> newList = new ArrayList<>();
    25. for(int i = 0 ; i < localeList.size() ; i++){
    26. Locale locale = localeList.get(i);
    27. String tag = locale.toLanguageTag();
    28. if(!newList.contains(locale)){
    29. newList.add(locale);
    30. }
    31. else{
    32. android.util.Log.e("Shawn", "old exist, tag = "+tag);
    33. }
    34. }
    35. // new list.
    36. for(String tag : languageTags){
    37. Locale locale = Locale.forLanguageTag(tag);
    38. if(!newList.contains(locale)){
    39. newList.add(locale);
    40. }
    41. else{
    42. android.util.Log.e("Shawn", "new exist, tag = "+tag);
    43. }
    44. }
    45. // reset to preference.
    46. localeList = new LocaleList(newList.toArray(new Locale[0]));
    47. LocalePicker.updateLocales(localeList);
    48. }
    49. /// END. Add more languages to Language preferences. By ShawnXiaFei, 20170508.
    50. ......
    51. }