Изменить язык приложения программно в Android

Непослушный способ сделать это - пересечь представления UIImagePickerViewController и выбрать выбранное изображение в обратном вызове делегата.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

  id thumbnailView = [[[[[[[[[[picker.view subviews] 
                  objectAtIndex:0] subviews]
                  objectAtIndex:0] subviews]
                objectAtIndex:0] subviews]
                objectAtIndex:0] subviews]
              objectAtIndex:0];

  NSString *fullSizePath = [[[thumbnailView selectedPhoto] fileGroup] pathForFullSizeImage];
  NSString *thumbnailPath = [[[thumbnailView selectedPhoto] fileGroup] pathForThumbnailFile];

  NSLog(@"%@ and %@", fullSizePath, thumbnailPath);

}

Это даст вам путь к полноразмерному изображению, которое вы затем можно открыть библиотеку EXIF ​​по вашему выбору.

Но это вызывает частный API, и эти имена методов будут обнаружены Apple, если вы отправляете это приложение. Так что не делайте этого, ОК?

392
задан Mathieu K. 4 February 2018 в 21:52
поделиться

3 ответа

Это возможно. Вы можете установить локаль. Однако я бы не рекомендовал этого делать. Мы пробовали это на ранних стадиях, это, по сути, борьба с системой.

У нас было такое же требование по изменению языка, но мы решили остановиться на том, что пользовательский интерфейс должен быть таким же, как у телефона. Это работало через установку локали, но было слишком глючным. И вы должны устанавливать его каждый раз, когда вы входите в активность (каждую активность), из моего опыта. Вот код, если вам все еще нужно это (опять же, я не рекомендую это делать)

Resources res = context.getResources();
// Change locale settings in the app.
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration conf = res.getConfiguration();
conf.setLocale(new Locale(language_code.toLowerCase())); // API 17+ only.
// Use conf.locale = new Locale(...) if targeting lower versions
res.updateConfiguration(conf, dm);

Если у вас есть контент, специфичный для языка - вы можете изменить его на основе настройки.

347
ответ дан 3 November 2019 в 23:05
поделиться

Добавьте класс

public class LocaleHelper{ 
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context) {
    String lang = getPersistedData(context, Locale.getDefault().getLanguage());
    return setLocale(context, lang);
}

public static Context onAttach(Context context, String defaultLanguage) {
    String lang = getPersistedData(context, defaultLanguage);
    return setLocale(context, lang);
}

public static String getLanguage(Context context) {
    return getPersistedData(context, Locale.getDefault().getLanguage());
}
public static Context setLocale(Context context, String language) {
    persist(context, language);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return updateResources(context, language);
    }

    return updateResourcesLegacy(context, language);
}

private static String getPersistedData(Context context, String defaultLanguage) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
}

private static void persist(Context context, String language) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = preferences.edit();

    editor.putString(SELECTED_LANGUAGE, language);
    editor.apply();
}

@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(locale);
    configuration.setLayoutDirection(locale);

    return context.createConfigurationContext(configuration);
}

@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources resources = context.getResources();

    Configuration configuration = resources.getConfiguration();
    configuration.locale = locale;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        configuration.setLayoutDirection(locale);
    }

    resources.updateConfiguration(configuration, resources.getDisplayMetrics());

    return context;
}
}

LocaleHelper В Действии или Фрагменте

Context context = LocaleHelper.setLocale(this, App.getSharedPre().getLanguage());
Resource resources = context.getResources();

Теперь SetText на каждом тексте

TextView tv = findViewById(R.id.tv);
tv.setText(resources.getString(R.string.tv));
0
ответ дан 3 November 2019 в 23:05
поделиться

Если вы пропишите

android:configChanges="locale"

В каждой активности (в файле манифеста), то не нужно будет устанавливать его каждый раз при входе в Activity.

8
ответ дан 3 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: