Как поменять язык в android google maps v2 программно

1

У меня есть приложение, в котором вы можете изменить языковой стандарт из настроек (цель состоит в том, чтобы иметь локаль внутри приложения, отличную от локали системы), и я хотел бы иметь возможность устанавливать язык карты также. Я мог найти ответы только как "установить системный язык вашего телефона", чего я не ищу. Есть ли способ установить язык карты программно или из 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"/>
  • 0
    очень плохая идея Google рекомендует не менять язык, а использовать язык, выбранный пользователем.
  • 1
    @ Мартин, на самом деле это очень хорошая идея. «Вы МОЖЕТЕ изменить язык из настроек», но не нужно менять язык по умолчанию (системный). Есть несколько причин, по которым можно это сделать. Например, языком по умолчанию для моего телефона является en_US, но это приложение намного «лучше», когда оно на иврите, потому что некоторые отображаемые в реальном времени данные не переводятся на английский язык и из-за текстового направления ltr vs rtl перепутанный в предложениях очень трудно читать, если приложение на английском языке, однако я не хочу навязывать иврит кому-либо.
Показать ещё 2 комментария
Теги:
locale
google-maps-android-api-2

1 ответ

0
Лучший ответ
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 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;
    }
}
  • 0
    это меняет язык приложения, но не карты

Ещё вопросы

Сообщество Overcoder
Наверх
Меню