在仍然使用Android资源的情况下,是否可以通过编程方式更改应用程序的语言?

如果没有,是否可以以特定语言请求资源?

我想让用户改变应用程序的语言从应用程序。

嗝屁嗝屁提问于
goodbad从精力旺盛的种马过渡到精光内蕴的骏马。回答于

Locale Helper class:

import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.preference.PreferenceManager;

import java.util.Locale;

/**
 * This class is used to change your application locale and persist this change for the next time
 * that your app is going to be used.
 * <p/>
 * You can also change the locale of your application on the fly by using the setLocale method.
 * <p/>
 * Created by gunhansancar on 07/10/15.
 */
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;
    }
}

你需要覆盖attachBaseContext并调用LocaleHelper。onAttach()来初始化应用程序中的区域设置。

import android.app.Application;
import android.content.Context;

import com.gunhansancar.changelanguageexample.helper.LocaleHelper;

public class MainApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleHelper.onAttach(base, "en"));
    }
}

你要做的就是添加

LocaleHelper.onCreate(this, "en");

无论你想要改变什么地方。

回答过的其他问题

大叔变软萌女声,实时语音趣味变声是如何实现与应用的?

goodbad从精力旺盛的种马过渡到精光内蕴的骏马。
实现方式和优势都有在以下体现: 游戏场景定制针对游戏场景对音视频编解码器进行深度优化,使其在码率、延时、系统资源消耗等关键技术指标达到业界领先顶级基础设施自建万兆云机房,配备 20 线 BGP 顶级网络,800+ 节点让玩家畅享稳定而极速的体验专业网络接入复用 QQ 接入部署和...... 展开详请

如何解决在Java中绘制虚线时的性能问题?

goodbad从精力旺盛的种马过渡到精光内蕴的骏马。
这是使用区域交叉的解决方案。为了确保不会最终绘制剪辑区域的一部分,我根据当前笔划的大小填充剪辑区域,假设它是一个BasicStroke。 private void drawLimited(Shape primitive, Graphics2D canvas) { Rec...... 展开详请

为什么可变字符串比不可变字符串慢?

goodbad从精力旺盛的种马过渡到精光内蕴的骏马。
已采纳
在假设的语言中提供可变的和不可变的,或者等价的字符串类型(我不能真正想到一个 - 例如,Python和Java都只有不可变的字符串,以及通过突变来增加间接性的其他方法因此当然可以减慢一些事情;-),没有任何性能差异的真正原因 - 例如,在C ++中,可互换地使用a std::s...... 展开详请

如何将图像添加到表格单元格并从ssrs中的数据库字段读取图像的url值?

goodbad从精力旺盛的种马过渡到精光内蕴的骏马。

选择外部 - 然后在“使用此图像”的下拉列表中选择包含其中URL的数据字段。

在运行时,它将从数据库中提取URL并显示图像。

标志和视频导航栏应该响应

goodbad从精力旺盛的种马过渡到精光内蕴的骏马。
#background { width: 100%; } .main { position: relative; text-align: center; } .centered { position: absolute; top: 50%; lef...... 展开详请

Angular2延迟加载服务被实例化两次

goodbad从精力旺盛的种马过渡到精光内蕴的骏马。
已采纳
如果该服务确实是一个单例(一个创建一个),请不要将它添加到任何将作为延迟加载模块的一部分的模块中(例如在SharedModule中)。 原因是延迟加载的模块获得自己的服务实例。 如果您希望服务真正是一个单独的服务,那么只需将它添加到AppModule,或者只将其导入到AppMo...... 展开详请

关于作者

goodbad

从精力旺盛的种马过渡到精光内蕴的骏马。

所属标签

扫码关注云+社区