How to change language in android google maps v2 p

2019-06-04 10:47发布

I have an app where you can change the locale from the settings (the purpose is to be able to have a locale inside the app that is different from the system locale) and I would like to be able to set the map's language as well. I could only find answers like "set the system language of your phone", which is not what I am looking for. Is there a way to set the map's language programmatically or from xml?

public class LocalizedActivity extends FragmentActivity {
    private GoogleMap map;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // you need to call this ASAP:
        setLocaleResources("iw");
        // after this most parts of the UI are localized, but not the map

        setContentView(R.layout.main);

        android.support.v4.app.FragmentManager sfm = getSupportFragmentManager();
        final Fragment f = sfm.findFragmentById(R.id.map);
        final SupportMapFragment mf = (SupportMapFragment) f;
        map = mf.getMap();
    }

    static void setLocaleResources(final String languageCode) {
        final Context context = RedAlert.getContext();
        Resources res = context.getResources();
        // Change locale settings in the app.
        DisplayMetrics dm = res.getDisplayMetrics();
        android.content.res.Configuration conf = res.getConfiguration();
        conf.locale = new Locale(languageCode);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            conf.setLayoutDirection(conf.locale);
        }
        res.updateConfiguration(conf, dm);
    }

main.xml:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/map"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      class="com.google.android.gms.maps.SupportMapFragment"/>

1条回答
Evening l夕情丶
2楼-- · 2019-06-04 11:41
public class MapActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        settings.setLocaleResources(getContext());
    }
}

public class Settings {
    final static String PREF_LOCALE = "locale";
    final Static String DEFAULT_LOCALE_STRING = "en_US";

    void setLocaleResources(final Context context) {
        String localeString = PreferenceManager
            .getDefaultSharedPreferences(context)
            .getString(PREF_LOCALE, DEFAULT_LOCALE_STRING);
        Resources res = context.getResources();
        // Change locale settings in the app.
        DisplayMetrics dm = res.getDisplayMetrics();
        Locale locale = getLocale(localeString);
        Locale.setDefault(locale); // this is needed to change even the map's language
        Configuration conf = res.getConfiguration();
        conf.locale = locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            conf.setLayoutDirection(conf.locale);
        }
        res.updateConfiguration(conf, dm);
        return res;
    }

    private static Locale getLocale(final String language2_COUNTRY2) {
        Locale locale;
        if (null == language2_COUNTRY2 || language2_COUNTRY2.isEmpty() || DEFAULT_LOCALE_STRING.equals(language2_COUNTRY2)) {
            locale = MyApp.getSystemLocale();
        } else {
            final String language = language2_COUNTRY2.substring(0, 2).toLowerCase(Locale.ENGLISH);
            final String country = language2_COUNTRY2.substring(3, 5).toUpperCase(Locale.ENGLISH);
            if (null == country || country.length() != 2) {
                locale = locales.get(language);
                if (null == locale) {
                    locale = new Locale(language);
                    locales.put(language, locale);
                }
            } else {
                locale = locales.get(language + '_' + country);
                if (null == locale) {
                    locale = new Locale(language, country);
                    locales.put(language + '_' + country, locale);
                }
            }
        }
        return locale;
    }
}

public class MyApp extends Application {
    @Override
    public void onCreate() {
        defaultSystemLocale = Locale.getDefault();
        Settings.setLocaleResources(getContext());
    }

    public static Locale getSystemLocale() {
        return defaultSystemLocale;
    }
}
查看更多
登录 后发表回答