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

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

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

六个六六个六提问于
奥特曼奥特曼弹键盘,敲琴键回答于

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");

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

回答过的其他问题

目前都有哪些值得关注的红包玩法?

奥特曼奥特曼弹键盘,敲琴键
微信的摇一摇红包,支付宝的AR集福红包、微博的让红包飞就不用说了,春晚级别的玩法。 芝士超人和西瓜视频这种有奖问答游戏APP是时下流行的另一种玩法,设置复活卡,奖金达到一定一定金额可提现。类似的还有派派红包app,它增加了你画我猜的问答形式和红包派发领取功能,我将这一类玩法称为现...... 展开详请

为什么人工智能在围棋上能几乎击败全人类?

奥特曼奥特曼弹键盘,敲琴键
深度学习是机器学习的一个分支,机器学习这个概念认为,对于待解问题,无需编写任何专门的程序代码,只需要输入数据,算法会在数据之上建立起它自己的逻辑。深度学习强调的是使用的模型,最流行的是被用在大规模图像识别任务中的卷积神经网络,有了这些神经网络,再加上强大的计算能力,必然能赢过人类...... 展开详请

个人用户如何有效防止DOS攻击?

奥特曼奥特曼弹键盘,敲琴键

用好安全组。为了业务的安全可以用一些防护软件或者cloudflare公司提供的防护服务。

服务器还收取流量费用?

奥特曼奥特曼弹键盘,敲琴键

如何将日期对象转换为TZ格式的日期字符串(Javascript)?

奥特曼奥特曼弹键盘,敲琴键

const dt = '06/01/2018';
var time = "06:25:00";
console.log(new Date(`${dt} ${time}`).toJSON())

如何看待 VAR 技术在世界杯上的使用?

奥特曼奥特曼弹键盘,敲琴键

可能除了韩国队,都觉得挺好的吧。。

关于作者

所属标签

扫码关注云+社区